diff --git a/public/assets/chains/bsquared.svg b/public/assets/chains/bsquared.svg new file mode 100644 index 00000000000..b179e765666 --- /dev/null +++ b/public/assets/chains/bsquared.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/public/assets/chains/shibarium.svg b/public/assets/chains/shibarium.svg new file mode 100644 index 00000000000..5186bfff4fa --- /dev/null +++ b/public/assets/chains/shibarium.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/public/changelog.json b/public/changelog.json index 903c22444eb..475bc53e835 100644 --- a/public/changelog.json +++ b/public/changelog.json @@ -1,4 +1,38 @@ [ + { + "category": "release", + "changes": [], + "date": "2024-12-17", + "description": "Onchain Verifier Programs are now available on Solana, providing both onchain and offchain integration approaches while maintaining strong security guarantees.\n\nVerifier Program IDs for both Devnet and Mainnet environments are available on the [Stream Addresses](https://docs.chain.link/data-streams/crypto-streams) page.", + "relatedNetworks": ["solana"], + "relatedTokens": [], + "title": "Data Streams Verifier Programs on Solana", + "topic": "data", + "subTopic": "data-streams", + "urls": [] + }, + { + "category": "integration", + "changes": [], + "date": "2024-12-17", + "description": "Chainlink CCIP is publicly available on Shibarium mainnet and Shibarium Puppynet. Check the [mainnet CCIP Directory](https://docs.chain.link/ccip/directory/mainnet/chain/shibarium-mainnet) and [testnet CCIP Directory](https://docs.chain.link/ccip/directory/testnet/chain/shibarium-testnet-puppynet) for more information.", + "relatedNetworks": ["shibarium"], + "relatedTokens": [], + "title": "CCIP on Shibarium", + "topic": "ccip", + "urls": [] + }, + { + "category": "integration", + "changes": [], + "date": "2024-12-17", + "description": "Chainlink CCIP is publicly available on Bsquared mainnet and Bsquared testnet. Check the [mainnet CCIP Directory](https://docs.chain.link/ccip/directory/mainnet/chain/bitcoin-mainnet-bsquared-1) and [testnet CCIP Directory](https://docs.chain.link/ccip/directory/testnet/chain/bitcoin-testnet-bsquared-1) for more information.", + "relatedNetworks": ["bsquared"], + "relatedTokens": [], + "title": "CCIP on Bsquared", + "topic": "ccip", + "urls": [] + }, { "category": "integration", "changes": [], diff --git a/public/images/tutorial-icons/solanaLogoMark.svg b/public/images/tutorial-icons/solanaLogoMark.svg new file mode 100644 index 00000000000..ed6f34d95f7 --- /dev/null +++ b/public/images/tutorial-icons/solanaLogoMark.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/public/images/tutorial-icons/solidity_logo.svg b/public/images/tutorial-icons/solidity_logo.svg new file mode 100644 index 00000000000..86b9f4995b2 --- /dev/null +++ b/public/images/tutorial-icons/solidity_logo.svg @@ -0,0 +1,27 @@ + + + + +Vector 1 +Created with Sketch. + + + + + + + + + + + + + diff --git a/src/components/PageTabs.astro b/src/components/PageTabs.astro index 12088dbe17e..546fa402330 100644 --- a/src/components/PageTabs.astro +++ b/src/components/PageTabs.astro @@ -1,107 +1,337 @@ --- +/** + * PageTabs Component + * + * A dropdown-based navigation component that allows users to switch between different versions + * or variations of a page. + * + * @component + * + * @example + * ```mdx + * import { PageTabs } from "@components" + * + * + * ``` + * + * @typedef {Object} Page + * @property {string} name - The display name for the page/version + * @property {string} url - The URL path for the page/version + * @property {string} [icon] - Optional path to an icon image (SVG or PNG recommended) + * + * Props: + * @property {Page[]} pages - Array of page objects containing name, url, and optional icon + * @property {boolean} [showHeader=true] - Whether to show the header section + * @property {string} [headerTitle] - Custom title for the header. Defaults to "Guide Versions" + * @property {string} [headerDescription] - Custom description. Defaults to "This guide is available in multiple versions. Choose the one that matches your needs." + * + * Features: + * - Responsive dropdown interface + * - Optional icons for each page/version (SVG or PNG recommended) + * - Customizable header section (can be hidden) + * - Active state indication + * - Keyboard accessible + * - Click-outside to close + * + * Styling: + * - Responsive design with mobile breakpoints + * + * Default Values: + * - showHeader = true + * - headerTitle = "Guide Versions" + * - headerDescription = "This guide is available in multiple versions. Choose the one that matches your needs." + */ + export interface Props { pages: Array<{ name: string url: string - icon?: string // optional - width?: string // optional + icon?: string }> - tabWidth?: string // optional + showHeader?: boolean + headerTitle?: string + headerDescription?: string } -const { pages, tabWidth } = Astro.props as Props +const { pages, showHeader = true } = Astro.props as Props +const { + headerTitle = "Guide Versions", + headerDescription = "This guide is available in multiple versions. Choose the one that matches your needs.", +} = Astro.props as Props const currentPath = Astro.url.pathname -const normalizeUrl = (url: string) => { - return url.trim().replace(/\/$/, "") -} - -const isActive = (pageUrl: string) => { - const normalizedCurrentPath = normalizeUrl(currentPath) - const normalizedPageUrl = normalizeUrl(pageUrl) - return normalizedCurrentPath === normalizedPageUrl -} +const normalizeUrl = (url: string) => url.trim().replace(/\/$/, "") +const isActive = (pageUrl: string) => normalizeUrl(currentPath) === normalizeUrl(pageUrl) -const pageDetails = pages.filter( - (page): page is { name: string; url: string; icon?: string; width?: string } => page.url !== undefined -) +// Add current page info for mobile dropdown +const currentPage = pages.find((page) => isActive(page.url)) || pages[0] --- -
+
{ - pageDetails.map((page) => ( - - {page.icon && {`${page.name}} -
{page.name}
-
- )) + showHeader && ( +
+

{headerTitle}

+

{headerDescription}

+
+ ) } + +
- .page-column { - width: 100% !important; /* Override any inline widths */ - padding: 9px 10px; - flex-direction: column; - } + diff --git a/src/components/QuickLinks/data/productChainLinks.ts b/src/components/QuickLinks/data/productChainLinks.ts index 1dbcc9ac9db..1489f6ca08c 100644 --- a/src/components/QuickLinks/data/productChainLinks.ts +++ b/src/components/QuickLinks/data/productChainLinks.ts @@ -42,6 +42,8 @@ export const productChainLinks: ProductChainLinks = { soneium: "/ccip/directory/testnet/chain/ethereum-testnet-sepolia-soneium-1", zircuit: "/ccip/directory/mainnet/chain/ethereum-mainnet-zircuit-1", ronin: "/ccip/directory/mainnet/chain/ronin-mainnet", + bsquared: "/ccip/directory/mainnet/chain/bitcoin-mainnet-bsquared-1", + shibarium: "/ccip/directory/mainnet/chain/shibarium-mainnet", }, }, "Data Feeds": { @@ -157,6 +159,8 @@ export const productChainLinks: ProductChainLinks = { zksync: "/resources/link-token-contracts#zksync", zircuit: "/resources/link-token-contracts#zircuit", ronin: "/resources/link-token-contracts#ronin", + bsquared: "/resources/link-token-contracts#bsquared", + shibarium: "/resources/link-token-contracts#shibarium", }, } @@ -192,4 +196,6 @@ export const chainNames: Record = { blast: "Blast", zircuit: "Zircuit", ronin: "Ronin", + bsquared: "B²", + shibarium: "Shibarium", } 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 7f29b67d5cd..ca902a530c8 100644 --- a/src/config/data/ccip/v1_2_0/mainnet/chains.json +++ b/src/config/data/ccip/v1_2_0/mainnet/chains.json @@ -19,6 +19,26 @@ "version": "1.5.0" } }, + "bitcoin-mainnet-bsquared-1": { + "armProxy": { + "address": "0x1C6Faa5762860261014a355a9efF2bEea2255851", + "version": "1.5.0" + }, + "chainSelector": "5406759801798337480", + "feeTokens": ["LINK", "WBTC"], + "registryModule": { + "address": "0x790b7770D12AdBa4d3F920d7A994E7a4f275037c", + "version": "1.5.0" + }, + "router": { + "address": "0x9C34e9A192d7a4c2cf054668C1122C028C43026c", + "version": "1.2.0" + }, + "tokenAdminRegistry": { + "address": "0x2e1543255119CfB9D3501E32d7f5B244E59A06F4", + "version": "1.5.0" + } + }, "bsc-mainnet": { "armProxy": { "address": "0x9e09697842194f77d315E0907F1Bda77922e8f84", @@ -379,6 +399,26 @@ "version": "1.5.0" } }, + "shibarium-mainnet": { + "armProxy": { + "address": "0xD2bdb98dA1Ff575d091CA5b76412C23Cba88CA02", + "version": "1.5.0" + }, + "chainSelector": "3993510008929295315", + "feeTokens": ["LINK", "WBONE"], + "registryModule": { + "address": "0xB6e8B0158CDD1AaF280f53604b80686787BB9199", + "version": "1.5.0" + }, + "router": { + "address": "0xc2CA5d5C17911e4B838194b51585DdF8fe5116C1", + "version": "1.2.0" + }, + "tokenAdminRegistry": { + "address": "0x995d2Aa233aBeaCA2a64Edf898AE9F4e01bE15B9", + "version": "1.5.0" + } + }, "wemix-mainnet": { "armProxy": { "address": "0x2375959c6571AC7a83c164C6FCcbd09E7782773d", 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 63126e80878..e3534e2859e 100644 --- a/src/config/data/ccip/v1_2_0/mainnet/lanes.json +++ b/src/config/data/ccip/v1_2_0/mainnet/lanes.json @@ -29,28 +29,28 @@ "SolvBTC": { "rateLimiterConfig": { "in": { - "capacity": "5000000000000000000", + "capacity": "2500000000000000000", "isEnabled": true, - "rate": "57800000000000" + "rate": "115740000000000" }, "out": { - "capacity": "5000000000000000000", + "capacity": "2500000000000000000", "isEnabled": true, - "rate": "57800000000000" + "rate": "115740000000000" } } }, "SolvBTC.BBN": { "rateLimiterConfig": { "in": { - "capacity": "5000000000000000000", + "capacity": "2500000000000000000", "isEnabled": true, - "rate": "57800000000000" + "rate": "115740000000000" }, "out": { - "capacity": "5000000000000000000", + "capacity": "2500000000000000000", "isEnabled": true, - "rate": "57800000000000" + "rate": "115740000000000" } } } @@ -99,28 +99,28 @@ "SolvBTC": { "rateLimiterConfig": { "in": { - "capacity": "5000000000000000000", + "capacity": "2500000000000000000", "isEnabled": true, - "rate": "57800000000000" + "rate": "115740000000000" }, "out": { - "capacity": "5000000000000000000", + "capacity": "2500000000000000000", "isEnabled": true, - "rate": "57800000000000" + "rate": "115740000000000" } } }, "SolvBTC.BBN": { "rateLimiterConfig": { "in": { - "capacity": "5000000000000000000", + "capacity": "2500000000000000000", "isEnabled": true, - "rate": "57800000000000" + "rate": "115740000000000" }, "out": { - "capacity": "5000000000000000000", + "capacity": "2500000000000000000", "isEnabled": true, - "rate": "57800000000000" + "rate": "115740000000000" } } }, @@ -169,28 +169,28 @@ "SolvBTC": { "rateLimiterConfig": { "in": { - "capacity": "5000000000000000000", + "capacity": "2500000000000000000", "isEnabled": true, - "rate": "57800000000000" + "rate": "115740000000000" }, "out": { - "capacity": "5000000000000000000", + "capacity": "2500000000000000000", "isEnabled": true, - "rate": "57800000000000" + "rate": "115740000000000" } } }, "SolvBTC.BBN": { "rateLimiterConfig": { "in": { - "capacity": "5000000000000000000", + "capacity": "2500000000000000000", "isEnabled": true, - "rate": "57800000000000" + "rate": "115740000000000" }, "out": { - "capacity": "5000000000000000000", + "capacity": "2500000000000000000", "isEnabled": true, - "rate": "57800000000000" + "rate": "115740000000000" } } }, @@ -295,28 +295,28 @@ "SolvBTC": { "rateLimiterConfig": { "in": { - "capacity": "5000000000000000000", + "capacity": "2500000000000000000", "isEnabled": true, - "rate": "57800000000000" + "rate": "115740000000000" }, "out": { - "capacity": "5000000000000000000", + "capacity": "2500000000000000000", "isEnabled": true, - "rate": "57800000000000" + "rate": "115740000000000" } } }, "SolvBTC.BBN": { "rateLimiterConfig": { "in": { - "capacity": "5000000000000000000", + "capacity": "2500000000000000000", "isEnabled": true, - "rate": "57800000000000" + "rate": "115740000000000" }, "out": { - "capacity": "5000000000000000000", + "capacity": "2500000000000000000", "isEnabled": true, - "rate": "57800000000000" + "rate": "115740000000000" } } }, @@ -433,6 +433,20 @@ "rmnPermeable": false } }, + "bitcoin-mainnet-bsquared-1": { + "mainnet": { + "offRamp": { + "address": "0xaa8bA928903C08417f2F4FC21D1378d90A960BDe", + "version": "1.5.0" + }, + "onRamp": { + "address": "0xB1C908A7CF6f5FB1ed18a73aD60ffF9CC8276eC1", + "enforceOutOfOrder": false, + "version": "1.5.0" + }, + "rmnPermeable": false + } + }, "bsc-mainnet": { "avalanche-mainnet": { "offRamp": { @@ -463,28 +477,28 @@ "SolvBTC": { "rateLimiterConfig": { "in": { - "capacity": "5000000000000000000", + "capacity": "2500000000000000000", "isEnabled": true, - "rate": "57800000000000" + "rate": "115740000000000" }, "out": { - "capacity": "5000000000000000000", + "capacity": "2500000000000000000", "isEnabled": true, - "rate": "57800000000000" + "rate": "115740000000000" } } }, "SolvBTC.BBN": { "rateLimiterConfig": { "in": { - "capacity": "5000000000000000000", + "capacity": "2500000000000000000", "isEnabled": true, - "rate": "57800000000000" + "rate": "115740000000000" }, "out": { - "capacity": "5000000000000000000", + "capacity": "2500000000000000000", "isEnabled": true, - "rate": "57800000000000" + "rate": "115740000000000" } } } @@ -547,14 +561,14 @@ "mBTC": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" } } }, @@ -589,28 +603,28 @@ "SolvBTC": { "rateLimiterConfig": { "in": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" }, "out": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" } } }, "SolvBTC.BBN": { "rateLimiterConfig": { "in": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" }, "out": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" } } }, @@ -757,28 +771,28 @@ "SolvBTC": { "rateLimiterConfig": { "in": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" }, "out": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" } } }, "SolvBTC.BBN": { "rateLimiterConfig": { "in": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" }, "out": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" } } }, @@ -923,14 +937,14 @@ "mBTC": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" } } }, @@ -965,28 +979,28 @@ "SolvBTC": { "rateLimiterConfig": { "in": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" }, "out": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" } } }, "SolvBTC.BBN": { "rateLimiterConfig": { "in": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" }, "out": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" } } }, @@ -1417,28 +1431,28 @@ "SolvBTC": { "rateLimiterConfig": { "in": { - "capacity": "5000000000000000000", + "capacity": "2500000000000000000", "isEnabled": true, - "rate": "57800000000000" + "rate": "115740000000000" }, "out": { - "capacity": "5000000000000000000", + "capacity": "2500000000000000000", "isEnabled": true, - "rate": "57800000000000" + "rate": "115740000000000" } } }, "SolvBTC.BBN": { "rateLimiterConfig": { "in": { - "capacity": "5000000000000000000", + "capacity": "2500000000000000000", "isEnabled": true, - "rate": "57800000000000" + "rate": "115740000000000" }, "out": { - "capacity": "5000000000000000000", + "capacity": "2500000000000000000", "isEnabled": true, - "rate": "57800000000000" + "rate": "115740000000000" } } }, @@ -1515,14 +1529,14 @@ "mBTC": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" } } }, @@ -1557,28 +1571,28 @@ "SolvBTC": { "rateLimiterConfig": { "in": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" }, "out": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" } } }, "SolvBTC.BBN": { "rateLimiterConfig": { "in": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" }, "out": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" } } }, @@ -1750,20 +1764,6 @@ } } }, - "DLCBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - }, - "out": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - } - } - }, "DPI": { "rateLimiterConfig": { "in": { @@ -1865,42 +1865,42 @@ "sINV": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" } } }, "SolvBTC": { "rateLimiterConfig": { "in": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" }, "out": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" } } }, "SolvBTC.BBN": { "rateLimiterConfig": { "in": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" }, "out": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" } } }, @@ -2005,14 +2005,14 @@ "VRTX": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" } } }, @@ -2131,14 +2131,14 @@ "VRTX": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" } } } @@ -2184,20 +2184,6 @@ }, "rmnPermeable": false, "supportedTokens": { - "DLCBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - }, - "out": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - } - } - }, "MILO": { "rateLimiterConfig": { "in": { @@ -2392,20 +2378,6 @@ } } }, - "DLCBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - }, - "out": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - } - } - }, "DPI": { "rateLimiterConfig": { "in": { @@ -2479,14 +2451,14 @@ "GHO": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "300000000000000000000000", + "isEnabled": true, + "rate": "60000000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "300000000000000000000000", + "isEnabled": true, + "rate": "60000000000000000000" } } }, @@ -2521,14 +2493,14 @@ "mBTC": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" } } }, @@ -2675,42 +2647,42 @@ "sINV": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" } } }, "SolvBTC": { "rateLimiterConfig": { "in": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" }, "out": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" } } }, "SolvBTC.BBN": { "rateLimiterConfig": { "in": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" }, "out": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" } } }, @@ -2871,14 +2843,14 @@ "WETH": { "rateLimiterConfig": { "in": { - "capacity": "114000000000000000000", + "capacity": "264250000000000000000", "isEnabled": true, - "rate": "32000000000000000" + "rate": "3058000000000000" }, "out": { - "capacity": "114000000000000000000", + "capacity": "264250000000000000000", "isEnabled": true, - "rate": "32000000000000000" + "rate": "3058000000000000" } } }, @@ -3039,14 +3011,14 @@ "EARNM": { "rateLimiterConfig": { "in": { - "capacity": "625000000000000000000000", + "capacity": "100000000000000000000000000", "isEnabled": true, - "rate": "173600000000000000000" + "rate": "27778000000000000000000" }, "out": { - "capacity": "625000000000000000000000", + "capacity": "100000000000000000000000000", "isEnabled": true, - "rate": "173600000000000000000" + "rate": "27778000000000000000000" } } }, @@ -3193,28 +3165,28 @@ "SolvBTC": { "rateLimiterConfig": { "in": { - "capacity": "5000000000000000000", + "capacity": "2500000000000000000", "isEnabled": true, - "rate": "57800000000000" + "rate": "115740000000000" }, "out": { - "capacity": "5000000000000000000", + "capacity": "2500000000000000000", "isEnabled": true, - "rate": "57800000000000" + "rate": "115740000000000" } } }, "SolvBTC.BBN": { "rateLimiterConfig": { "in": { - "capacity": "5000000000000000000", + "capacity": "2500000000000000000", "isEnabled": true, - "rate": "57800000000000" + "rate": "115740000000000" }, "out": { - "capacity": "5000000000000000000", + "capacity": "2500000000000000000", "isEnabled": true, - "rate": "57800000000000" + "rate": "115740000000000" } } }, @@ -3277,28 +3249,28 @@ "SolvBTC": { "rateLimiterConfig": { "in": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" }, "out": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" } } }, "SolvBTC.BBN": { "rateLimiterConfig": { "in": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" }, "out": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" } } }, @@ -3372,20 +3344,6 @@ } } }, - "DLCBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - }, - "out": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - } - } - }, "DPI": { "rateLimiterConfig": { "in": { @@ -3487,42 +3445,42 @@ "sINV": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" } } }, "SolvBTC": { "rateLimiterConfig": { "in": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" }, "out": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" } } }, "SolvBTC.BBN": { "rateLimiterConfig": { "in": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" }, "out": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" } } }, @@ -3627,14 +3585,14 @@ "VRTX": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" } } }, @@ -3767,14 +3725,14 @@ "VRTX": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" } } } @@ -3848,31 +3806,17 @@ }, "rmnPermeable": false, "supportedTokens": { - "DLCBTC": { + "sINV": { "rateLimiterConfig": { "in": { - "capacity": "450000000", + "capacity": "10000000000000000000000", "isEnabled": true, - "rate": "83300" + "rate": "110000000000000000" }, "out": { - "capacity": "450000000", + "capacity": "10000000000000000000000", "isEnabled": true, - "rate": "83300" - } - } - }, - "sINV": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "rate": "110000000000000000" } } }, @@ -4030,20 +3974,6 @@ } } }, - "DLCBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - }, - "out": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - } - } - }, "DPI": { "rateLimiterConfig": { "in": { @@ -4173,42 +4103,42 @@ "sINV": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" } } }, "SolvBTC": { "rateLimiterConfig": { "in": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" }, "out": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" } } }, "SolvBTC.BBN": { "rateLimiterConfig": { "in": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" }, "out": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" } } }, @@ -4313,9 +4243,9 @@ "USDM": { "rateLimiterConfig": { "in": { - "capacity": "1000000000000000000000000", + "capacity": "100000000000000000000000", "isEnabled": true, - "rate": "11600000000000000000" + "rate": "1157400000000000000" }, "out": { "capacity": "1000000000000000000000000", @@ -4467,14 +4397,14 @@ "EARNM": { "rateLimiterConfig": { "in": { - "capacity": "625000000000000000000000", + "capacity": "100000000000000000000000000", "isEnabled": true, - "rate": "173600000000000000000" + "rate": "27778000000000000000000" }, "out": { - "capacity": "625000000000000000000000", + "capacity": "100000000000000000000000000", "isEnabled": true, - "rate": "173600000000000000000" + "rate": "27778000000000000000000" } } }, @@ -4500,9 +4430,9 @@ "rate": "11600000000000000000" }, "out": { - "capacity": "1000000000000000000000000", + "capacity": "100000000000000000000000", "isEnabled": true, - "rate": "11600000000000000000" + "rate": "1157400000000000000" } } } @@ -4567,14 +4497,14 @@ "VRTX": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" } } } @@ -4609,14 +4539,14 @@ "VRTX": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "5000000000000000000000000", + "isEnabled": true, + "rate": "57870000000000000000" } } } @@ -5002,20 +4932,6 @@ }, "rmnPermeable": false, "supportedTokens": { - "DLCBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - }, - "out": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - } - } - }, "MILO": { "rateLimiterConfig": { "in": { @@ -5170,31 +5086,17 @@ }, "rmnPermeable": false, "supportedTokens": { - "DLCBTC": { + "sINV": { "rateLimiterConfig": { "in": { - "capacity": "450000000", + "capacity": "10000000000000000000000", "isEnabled": true, - "rate": "83300" + "rate": "110000000000000000" }, "out": { - "capacity": "450000000", + "capacity": "10000000000000000000000", "isEnabled": true, - "rate": "83300" - } - } - }, - "sINV": { - "rateLimiterConfig": { - "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" - }, - "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "rate": "110000000000000000" } } }, @@ -5352,20 +5254,6 @@ }, "rmnPermeable": false, "supportedTokens": { - "DLCBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - }, - "out": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - } - } - }, "ETHx": { "rateLimiterConfig": { "in": { @@ -5397,14 +5285,14 @@ "sINV": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" } } }, @@ -5745,28 +5633,28 @@ "SolvBTC": { "rateLimiterConfig": { "in": { - "capacity": "5000000000000000000", + "capacity": "2500000000000000000", "isEnabled": true, - "rate": "57800000000000" + "rate": "115740000000000" }, "out": { - "capacity": "5000000000000000000", + "capacity": "2500000000000000000", "isEnabled": true, - "rate": "57800000000000" + "rate": "115740000000000" } } }, "SolvBTC.BBN": { "rateLimiterConfig": { "in": { - "capacity": "5000000000000000000", + "capacity": "2500000000000000000", "isEnabled": true, - "rate": "57800000000000" + "rate": "115740000000000" }, "out": { - "capacity": "5000000000000000000", + "capacity": "2500000000000000000", "isEnabled": true, - "rate": "57800000000000" + "rate": "115740000000000" } } }, @@ -5786,6 +5674,18 @@ } } }, + "bitcoin-mainnet-bsquared-1": { + "offRamp": { + "address": "0xF3AC96642F9BA5De3BBc864d609E3F534dD3b7F9", + "version": "1.5.0" + }, + "onRamp": { + "address": "0xddF4b4aF7A9603869C90189EFa8826683D0D234b", + "enforceOutOfOrder": false, + "version": "1.5.0" + }, + "rmnPermeable": true + }, "bsc-mainnet": { "offRamp": { "address": "0x66d84fedED0e51aeB47ceD1BB2fc0221Ae8D7C12", @@ -5815,14 +5715,14 @@ "mBTC": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" } } }, @@ -5857,28 +5757,28 @@ "SolvBTC": { "rateLimiterConfig": { "in": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" }, "out": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" } } }, "SolvBTC.BBN": { "rateLimiterConfig": { "in": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" }, "out": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" } } }, @@ -6120,20 +6020,6 @@ } } }, - "DLCBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - }, - "out": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - } - } - }, "DPI": { "rateLimiterConfig": { "in": { @@ -6207,14 +6093,14 @@ "GHO": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "300000000000000000000000", + "isEnabled": true, + "rate": "60000000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "300000000000000000000000", + "isEnabled": true, + "rate": "60000000000000000000" } } }, @@ -6249,14 +6135,14 @@ "mBTC": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "400000000", + "isEnabled": true, + "rate": "18518" } } }, @@ -6403,42 +6289,42 @@ "sINV": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" } } }, "SolvBTC": { "rateLimiterConfig": { "in": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" }, "out": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" } } }, "SolvBTC.BBN": { "rateLimiterConfig": { "in": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" }, "out": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" } } }, @@ -6599,14 +6485,14 @@ "WETH": { "rateLimiterConfig": { "in": { - "capacity": "114000000000000000000", + "capacity": "264250000000000000000", "isEnabled": true, - "rate": "32000000000000000" + "rate": "3058000000000000" }, "out": { - "capacity": "114000000000000000000", + "capacity": "264250000000000000000", "isEnabled": true, - "rate": "32000000000000000" + "rate": "3058000000000000" } } }, @@ -6764,20 +6650,6 @@ } } }, - "DLCBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - }, - "out": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - } - } - }, "DPI": { "rateLimiterConfig": { "in": { @@ -6907,42 +6779,42 @@ "sINV": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" } } }, "SolvBTC": { "rateLimiterConfig": { "in": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" }, "out": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" } } }, "SolvBTC.BBN": { "rateLimiterConfig": { "in": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" }, "out": { - "capacity": "500000000000000000000", + "capacity": "15000000000000000000", "isEnabled": true, - "rate": "23140000000000000" + "rate": "694440000000000" } } }, @@ -7292,20 +7164,6 @@ }, "rmnPermeable": false, "supportedTokens": { - "DLCBTC": { - "rateLimiterConfig": { - "in": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - }, - "out": { - "capacity": "450000000", - "isEnabled": true, - "rate": "83300" - } - } - }, "ETHx": { "rateLimiterConfig": { "in": { @@ -7337,14 +7195,14 @@ "sINV": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "10000000000000000000000", + "isEnabled": true, + "rate": "110000000000000000" } } }, @@ -7585,14 +7443,14 @@ "EARNM": { "rateLimiterConfig": { "in": { - "capacity": "625000000000000000000000", + "capacity": "50000000000000000000000000", "isEnabled": true, - "rate": "173600000000000000000" + "rate": "13889000000000000000000" }, "out": { - "capacity": "625000000000000000000000", + "capacity": "50000000000000000000000000", "isEnabled": true, - "rate": "173600000000000000000" + "rate": "13889000000000000000000" } } }, @@ -7722,6 +7580,18 @@ } } }, + "shibarium-mainnet": { + "offRamp": { + "address": "0x8B3eEed4948684c3ec1bb60967820f40285018B8", + "version": "1.5.0" + }, + "onRamp": { + "address": "0x3Ac0D8fe5b4e8d0a95C507CCd83F6A8d73A8c6b1", + "enforceOutOfOrder": false, + "version": "1.5.0" + }, + "rmnPermeable": true + }, "wemix-mainnet": { "offRamp": { "address": "0xc1EcCE580B2C96f4fd202fB7c2a259ECe19a1bF2", @@ -8005,14 +7875,14 @@ "EARNM": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27778000000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000000", + "isEnabled": true, + "rate": "27778000000000000000000" } } }, @@ -8117,14 +7987,14 @@ "EARNM": { "rateLimiterConfig": { "in": { - "capacity": "625000000000000000000000", + "capacity": "100000000000000000000000000", "isEnabled": true, - "rate": "173600000000000000000" + "rate": "27778000000000000000000" }, "out": { - "capacity": "625000000000000000000000", + "capacity": "100000000000000000000000000", "isEnabled": true, - "rate": "173600000000000000000" + "rate": "27778000000000000000000" } } }, @@ -8150,9 +8020,9 @@ "rate": "11600000000000000000" }, "out": { - "capacity": "1000000000000000000000000", + "capacity": "100000000000000000000000", "isEnabled": true, - "rate": "11600000000000000000" + "rate": "1157400000000000000" } } } @@ -8271,14 +8141,14 @@ "EARNM": { "rateLimiterConfig": { "in": { - "capacity": "625000000000000000000000", + "capacity": "50000000000000000000000000", "isEnabled": true, - "rate": "173600000000000000000" + "rate": "13889000000000000000000" }, "out": { - "capacity": "625000000000000000000000", + "capacity": "50000000000000000000000000", "isEnabled": true, - "rate": "173600000000000000000" + "rate": "13889000000000000000000" } } }, @@ -8487,6 +8357,20 @@ } } }, + "shibarium-mainnet": { + "mainnet": { + "offRamp": { + "address": "0x7422809f8625Ec2b98a1DDd39db4C99F75EE118F", + "version": "1.5.0" + }, + "onRamp": { + "address": "0x750BFfccf99D1Ad1C38b5FE4Ad83010bbb82E7DF", + "enforceOutOfOrder": false, + "version": "1.5.0" + }, + "rmnPermeable": false + } + }, "wemix-mainnet": { "avalanche-mainnet": { "offRamp": { 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 1cbbbfb3aa8..ae18d76d89b 100644 --- a/src/config/data/ccip/v1_2_0/mainnet/tokens.json +++ b/src/config/data/ccip/v1_2_0/mainnet/tokens.json @@ -223,44 +223,6 @@ "tokenAddress": "0xc719d010B63E5bbF2C0551872CD5316ED26AcD83" } }, - "DLCBTC": { - "ethereum-mainnet-arbitrum-1": { - "allowListEnabled": false, - "decimals": 8, - "name": "dlcBTC", - "poolAddress": "0xCBeD22C12b9CBFaBa8E352D1EC6279885Df8725F", - "poolType": "burnMint", - "symbol": "dlcBTC", - "tokenAddress": "0x050C24dBf1eEc17babE5fc585F06116A259CC77A" - }, - "ethereum-mainnet-base-1": { - "allowListEnabled": false, - "decimals": 8, - "name": "dlcBTC", - "poolAddress": "0x206E9A22B384d3863b606C41030Ec2A19D3CBb95", - "poolType": "burnMint", - "symbol": "dlcBTC", - "tokenAddress": "0x12418783e860997eb99e8aCf682DF952F721cF62" - }, - "ethereum-mainnet-optimism-1": { - "allowListEnabled": false, - "decimals": 8, - "name": "dlcBTC", - "poolAddress": "0xb6f8e9604BAFD1482631740931783998e9E736A7", - "poolType": "burnMint", - "symbol": "DLCBTC", - "tokenAddress": "0x2bAa7E92F3F14883264BfA63058cC223Ad719438" - }, - "mainnet": { - "allowListEnabled": false, - "decimals": 8, - "name": "dlcBTC", - "poolAddress": "0x08B4058F16D243C977ea1fe91B20Af31057b5aBb", - "poolType": "burnMint", - "symbol": "DLCBTC", - "tokenAddress": "0x20157DBAbb84e3BBFE68C349d0d44E48AE7B5AD2" - } - }, "DPI": { "ethereum-mainnet-arbitrum-1": { "allowListEnabled": false, @@ -523,6 +485,14 @@ "symbol": "LINK.e", "tokenAddress": "0x5947BB275c521040051D82396192181b413227A3" }, + "bitcoin-mainnet-bsquared-1": { + "allowListEnabled": false, + "decimals": 18, + "name": "ChainLink Token", + "poolType": "feeTokenOnly", + "symbol": "LINK", + "tokenAddress": "0x709229D9587886a1eDFeE6b5cE636E1D70d1cE39" + }, "bsc-mainnet": { "allowListEnabled": false, "decimals": 18, @@ -678,6 +648,14 @@ "symbol": "LINK", "tokenAddress": "0x3902228D6A3d2Dc44731fD9d45FeE6a61c722D0b" }, + "shibarium-mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "ChainLink Token", + "poolType": "feeTokenOnly", + "symbol": "LINK", + "tokenAddress": "0x71052BAe71C25C78E37fD12E5ff1101A71d9018F" + }, "wemix-mainnet": { "allowListEnabled": false, "decimals": 18, @@ -1837,6 +1815,26 @@ "tokenAddress": "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c" } }, + "WBONE": { + "shibarium-mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "Shibarium Wrapped BONE", + "poolType": "feeTokenOnly", + "symbol": "WBONE", + "tokenAddress": "0xC76F4c819D820369Fb2d7C1531aB3Bb18e6fE8d8" + } + }, + "WBTC": { + "bitcoin-mainnet-bsquared-1": { + "allowListEnabled": false, + "decimals": 18, + "name": "Wrapped BTC", + "poolType": "feeTokenOnly", + "symbol": "WBTC", + "tokenAddress": "0x4200000000000000000000000000000000000006" + } + }, "WCELO": { "celo-mainnet": { "allowListEnabled": false, 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 1feb9d6d8b3..eed34387cc3 100644 --- a/src/config/data/ccip/v1_2_0/testnet/chains.json +++ b/src/config/data/ccip/v1_2_0/testnet/chains.json @@ -19,6 +19,26 @@ "version": "1.5.0" } }, + "bitcoin-testnet-bsquared-1": { + "armProxy": { + "address": "0x2ce782d1B03CF45F003685614AFaD6495FAf70D4", + "version": "1.5.0" + }, + "chainSelector": "1948510578179542068", + "feeTokens": ["LINK", "WBTC"], + "registryModule": { + "address": "0x9a3F1b6Fb4007413078352c5b25C2814aD5732BC", + "version": "1.5.0" + }, + "router": { + "address": "0x34A49Eb641daF64d61be00Aa7F759f8225351101", + "version": "1.2.0" + }, + "tokenAdminRegistry": { + "address": "0xfCaaFD5157aae3cAE886318a0D104D0B19fEEaA1", + "version": "1.5.0" + } + }, "bsc-testnet": { "armProxy": { "address": "0xA8C0c11bf64AF62CDCA6f93D3769B88BdD7cb93D", @@ -419,6 +439,26 @@ "version": "1.5.0" } }, + "shibarium-testnet-puppynet": { + "armProxy": { + "address": "0x8d677784DA3707e57aC0306464552560E05dBCD7", + "version": "1.5.0" + }, + "chainSelector": "17833296867764334567", + "feeTokens": ["LINK", "WBONE"], + "registryModule": { + "address": "0xf6B25A05333C4B8Eb108758d306f28B99324A1bf", + "version": "1.5.0" + }, + "router": { + "address": "0x449E234FEDF3F907b9E9Dd6BAf1ddc36664097E5", + "version": "1.2.0" + }, + "tokenAdminRegistry": { + "address": "0x5B3BA3d2Dbe9565c2905fbB81776E332a59b6F05", + "version": "1.5.0" + } + }, "wemix-testnet": { "armProxy": { "address": "0xA930c1E0fF1E1005E8Ef569Aa81e6EEbf466b1c3", 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 aa46cd1206f..7e569919664 100644 --- a/src/config/data/ccip/v1_2_0/testnet/lanes.json +++ b/src/config/data/ccip/v1_2_0/testnet/lanes.json @@ -193,6 +193,20 @@ "rate": "167000000000000000000" } } + }, + "USDC": { + "rateLimiterConfig": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "167000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "167000000" + } + } } } }, @@ -393,6 +407,36 @@ } } }, + "bitcoin-testnet-bsquared-1": { + "ethereum-testnet-sepolia": { + "offRamp": { + "address": "0x00bC9e9966f2E217cb9d1f441Fa066588bcAeD0C", + "version": "1.5.0" + }, + "onRamp": { + "address": "0xaCA465B84F0325DF66A0bf0814C7bfc38c171e87", + "enforceOutOfOrder": false, + "version": "1.5.0" + }, + "rmnPermeable": false, + "supportedTokens": { + "CCIP-BnM": { + "rateLimiterConfig": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + } + }, "bsc-testnet": { "avalanche-fuji-testnet": { "offRamp": { @@ -858,6 +902,34 @@ } } }, + "bitcoin-testnet-bsquared-1": { + "offRamp": { + "address": "0x2A35B76Da2e37fd73B7b01A655c77A370106f34f", + "version": "1.5.0" + }, + "onRamp": { + "address": "0x1fDc4DAe777dCac0EDE2A0967511842A8fADc8B4", + "enforceOutOfOrder": false, + "version": "1.5.0" + }, + "rmnPermeable": true, + "supportedTokens": { + "CCIP-BnM": { + "rateLimiterConfig": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, "bsc-testnet": { "offRamp": { "address": "0x04305BD9D9CA6730517f79c3D9c6828BC2D25Ecb", @@ -1079,6 +1151,20 @@ "rate": "167000000000000000000" } } + }, + "USDC": { + "rateLimiterConfig": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "167000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "167000000" + } + } } } }, @@ -1361,6 +1447,16 @@ "rmnPermeable": true }, "ethereum-testnet-sepolia-zircuit-1": { + "offRamp": { + "address": "0xf79585C84B752E636B7Db62C81E075E707aa44B7", + "version": "1.5.0" + }, + "onRamp": { + "address": "0x33629E0d4247bABb9e367FbBb18b9cE29A7f29C8", + "enforceOutOfOrder": true, + "version": "1.5.0" + }, + "rmnPermeable": false, "supportedTokens": { "CCIP-BnM": { "rateLimiterConfig": { @@ -1574,6 +1670,34 @@ } } }, + "shibarium-testnet-puppynet": { + "offRamp": { + "address": "0x9f54330D70859726c39772b6157b03A6dB17F254", + "version": "1.5.0" + }, + "onRamp": { + "address": "0x46588E7EFab168f94cccAF1a5B19cC22Cdc144e5", + "enforceOutOfOrder": false, + "version": "1.5.0" + }, + "rmnPermeable": true, + "supportedTokens": { + "CCIP-BnM": { + "rateLimiterConfig": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + }, "wemix-testnet": { "offRamp": { "address": "0x445F41C6aa7e910021786e860d7cfe3E7fcC6640", @@ -2065,28 +2189,42 @@ "CCIP-BnM": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" } } }, "CCIP-LnM": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "USDC": { + "rateLimiterConfig": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "167000000" + }, + "out": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "167000000" } } } @@ -2107,28 +2245,28 @@ "CCIP-BnM": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" } } }, "CCIP-LnM": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" } } } @@ -2161,28 +2299,42 @@ "CCIP-BnM": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" } } }, "CCIP-LnM": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + }, + "USDC": { + "rateLimiterConfig": { + "in": { + "capacity": "100000000000", + "isEnabled": true, + "rate": "167000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000", + "isEnabled": true, + "rate": "167000000" } } } @@ -2203,28 +2355,28 @@ "CCIP-BnM": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" } } }, "CCIP-LnM": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" } } }, @@ -2259,28 +2411,28 @@ "CCIP-BnM": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" } } }, "CCIP-LnM": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" } } } @@ -2301,28 +2453,28 @@ "CCIP-BnM": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" } } }, "CCIP-LnM": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" } } }, @@ -2369,28 +2521,28 @@ "CCIP-BnM": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" } } }, "CCIP-LnM": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" } } } @@ -2625,28 +2777,28 @@ "CCIP-BnM": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "2770000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "2770000000000000000" } } }, "CCIP-LnM": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" } } } @@ -2667,28 +2819,28 @@ "CCIP-BnM": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "2770000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "2770000000000000000" } } }, "CCIP-LnM": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" } } } @@ -3157,6 +3309,16 @@ "rmnPermeable": false }, "ethereum-testnet-sepolia": { + "offRamp": { + "address": "0x9D9bB877AD1dB505Bb54584dC185Af7a5Dd0C773", + "version": "1.5.0" + }, + "onRamp": { + "address": "0xd120de1F5067F967ef49Cc09c8Ca9864aB4215df", + "enforceOutOfOrder": false, + "version": "1.5.0" + }, + "rmnPermeable": false, "supportedTokens": { "CCIP-LnM": { "rateLimiterConfig": { @@ -3235,28 +3397,28 @@ "CCIP-BnM": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "167000000000000000000", + "isEnabled": true, + "rate": "100000000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "167000000000000000000", + "isEnabled": true, + "rate": "100000000000000000000" } } }, "CCIP-LnM": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "167000000000000000000", + "isEnabled": true, + "rate": "100000000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "167000000000000000000", + "isEnabled": true, + "rate": "100000000000000000000" } } } @@ -3291,28 +3453,28 @@ "CCIP-BnM": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" } } }, "CCIP-LnM": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" } } }, @@ -3347,28 +3509,28 @@ "CCIP-BnM": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" } } }, "CCIP-LnM": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" } } } @@ -3389,28 +3551,28 @@ "CCIP-BnM": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" } } }, "CCIP-LnM": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" } } }, @@ -3445,28 +3607,28 @@ "CCIP-BnM": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" } } }, "CCIP-LnM": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" } } }, @@ -3501,28 +3663,28 @@ "CCIP-BnM": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" } } }, "CCIP-LnM": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" } } } @@ -3543,28 +3705,28 @@ "CCIP-BnM": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" } } }, "CCIP-LnM": { "rateLimiterConfig": { "in": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" }, "out": { - "capacity": "0", - "isEnabled": false, - "rate": "0" + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" } } } @@ -3627,6 +3789,36 @@ "rmnPermeable": false } }, + "shibarium-testnet-puppynet": { + "ethereum-testnet-sepolia": { + "offRamp": { + "address": "0x153f275d90D29BEC1a47684859c86186a7DE0151", + "version": "1.5.0" + }, + "onRamp": { + "address": "0x69fb9813d3843e26A49ecFe167b359f867556cA4", + "enforceOutOfOrder": false, + "version": "1.5.0" + }, + "rmnPermeable": false, + "supportedTokens": { + "CCIP-BnM": { + "rateLimiterConfig": { + "in": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + }, + "out": { + "capacity": "100000000000000000000000", + "isEnabled": true, + "rate": "167000000000000000000" + } + } + } + } + } + }, "wemix-testnet": { "avalanche-fuji-testnet": { "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 2b5877a050e..4410d4f86af 100644 --- a/src/config/data/ccip/v1_2_0/testnet/tokens.json +++ b/src/config/data/ccip/v1_2_0/testnet/tokens.json @@ -9,6 +9,15 @@ "symbol": "CCIP-BnM", "tokenAddress": "0xD21341536c5cF5EB1bcb58f6723cE26e8D8E90e4" }, + "bitcoin-testnet-bsquared-1": { + "allowListEnabled": false, + "decimals": 18, + "name": "CCIP-BnM", + "poolAddress": "0x02ee9Bddc5819eeF4b55f82ae9D4035C07Fd08A6", + "poolType": "burnMint", + "symbol": "CCIP-BnM", + "tokenAddress": "0x0643fD73C261eC4B369C3a8C5c0eC8c57485E32d" + }, "bsc-testnet": { "allowListEnabled": false, "decimals": 18, @@ -162,6 +171,15 @@ "symbol": "CCIP-BnM", "tokenAddress": "0x88DD2416699Bad3AeC58f535BC66F7f62DE2B2EC" }, + "shibarium-testnet-puppynet": { + "allowListEnabled": false, + "decimals": 18, + "name": "CCIP-BnM", + "poolAddress": "0x694f112E941472c8806b853Db714c29387396FBb", + "poolType": "burnMint", + "symbol": "CCIP-BnM", + "tokenAddress": "0x81249b4bD91A8706eE67a2f422DB82258D4947ad" + }, "wemix-testnet": { "allowListEnabled": false, "decimals": 18, @@ -411,6 +429,14 @@ "symbol": "LINK", "tokenAddress": "0x0b9d5D9136855f6FEc3c0993feE6E9CE8a297846" }, + "bitcoin-testnet-bsquared-1": { + "allowListEnabled": false, + "decimals": 18, + "name": "ChainLink Token", + "poolType": "feeTokenOnly", + "symbol": "LINK", + "tokenAddress": "0x436a1907D9e6a65E6db73015F08f9C66F6B63E45" + }, "bsc-testnet": { "allowListEnabled": false, "decimals": 18, @@ -571,6 +597,14 @@ "symbol": "LINK", "tokenAddress": "0x5bB50A6888ee6a67E22afFDFD9513be7740F1c15" }, + "shibarium-testnet-puppynet": { + "allowListEnabled": false, + "decimals": 18, + "name": "ChainLink Token", + "poolType": "feeTokenOnly", + "symbol": "LINK", + "tokenAddress": "0x44637eEfD71A090990f89faEC7022fc74B2969aD" + }, "wemix-testnet": { "allowListEnabled": false, "decimals": 18, @@ -674,6 +708,26 @@ "tokenAddress": "0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd" } }, + "WBONE": { + "shibarium-testnet-puppynet": { + "allowListEnabled": false, + "decimals": 18, + "name": "Shibarium Wrapped BONE", + "poolType": "feeTokenOnly", + "symbol": "WBONE", + "tokenAddress": "0x41c3F37587EBcD46C0F85eF43E38BcfE1E70Ab56" + } + }, + "WBTC": { + "bitcoin-testnet-bsquared-1": { + "allowListEnabled": false, + "decimals": 18, + "name": "Wrapped Ether", + "poolType": "feeTokenOnly", + "symbol": "WETH", + "tokenAddress": "0x4200000000000000000000000000000000000006" + } + }, "WCELO": { "celo-testnet-alfajores": { "allowListEnabled": false, diff --git a/src/config/data/chain-to-technology.json b/src/config/data/chain-to-technology.json index 21eb28d14b2..b330138e118 100644 --- a/src/config/data/chain-to-technology.json +++ b/src/config/data/chain-to-technology.json @@ -48,5 +48,9 @@ "MANTLE_MAINNET": "MANTLE", "MANTLE_SEPOLIA": "MANTLE", "RONIN_MAINNET": "RONIN", - "RONIN_SAIGON": "RONIN" + "RONIN_SAIGON": "RONIN", + "BSQUARED_MAINNET": "BSQUARED", + "BSQUARED_TESTNET": "BSQUARED", + "SHIBARIUM_MAINNET": "SHIBARIUM", + "SHIBARIUM_PUPPYNET": "SHIBARIUM" } diff --git a/src/config/data/chains.json b/src/config/data/chains.json index bc246aac269..f1986ce7842 100644 --- a/src/config/data/chains.json +++ b/src/config/data/chains.json @@ -636,5 +636,41 @@ "nativeCurrency": { "name": "RON", "symbol": "RON", "decimals": 18 } } } + }, + "BSQUARED": { + "title": "B²", + "icon": "/assets/chains/bsquared.svg", + "chains": { + "BSQUARED_MAINNET": { + "chainId": 223, + "title": "B²", + "explorer": "https://explorer.bsquared.network", + "nativeCurrency": { "name": "Bitcoin", "symbol": "BTC", "decimals": 18 } + }, + "BSQUARED_TESTNET": { + "chainId": 1123, + "title": "B² Testnet", + "explorer": "https://testnet-explorer.bsquared.network", + "nativeCurrency": { "name": "Bitcoin", "symbol": "BTC", "decimals": 18 } + } + } + }, + "SHIBARIUM": { + "title": "Shibarium", + "icon": "/assets/chains/shibarium.svg", + "chains": { + "SHIBARIUM_MAINNET": { + "chainId": 109, + "title": "Shibarium", + "explorer": "https://www.shibariumscan.io", + "nativeCurrency": { "name": "BONE Shibarium", "symbol": "BONE", "decimals": 18 } + }, + "SHIBARIUM_PUPPYNET": { + "chainId": 157, + "title": "Shibarium Puppynet", + "explorer": "https://puppyscan.shib.io", + "nativeCurrency": { "name": "BONE", "symbol": "BONE", "decimals": 18 } + } + } } } diff --git a/src/config/sidebar.ts b/src/config/sidebar.ts index 3329eca2e17..6fe50e21596 100644 --- a/src/config/sidebar.ts +++ b/src/config/sidebar.ts @@ -284,7 +284,7 @@ export const SIDEBAR: Partial> = { ], }, { - title: "Streams Direct SDK", + title: "Streams Direct", url: "data-streams/tutorials/streams-direct/", children: [ { @@ -298,8 +298,12 @@ export const SIDEBAR: Partial> = { highlightAsCurrent: ["data-streams/tutorials/streams-direct/streams-direct-ws-rwa"], }, { - title: "Verify report data onchain", - url: "data-streams/tutorials/streams-direct/streams-direct-onchain-verification", + title: "Verify report data", + url: "data-streams/tutorials/streams-direct/evm-onchain-report-verification", + highlightAsCurrent: [ + "data-streams/tutorials/streams-direct/solana-onchain-report-verification", + "data-streams/tutorials/streams-direct/solana-offchain-report-verification", + ], }, ], }, @@ -347,7 +351,7 @@ export const SIDEBAR: Partial> = { url: "data-streams/reference/streams-direct/streams-direct-go-sdk", }, { - title: "Onchain report data verification", + title: "Onchain report data verification (EVM chains)", url: "data-streams/reference/streams-direct/streams-direct-onchain-verification", }, ], diff --git a/src/config/types.ts b/src/config/types.ts index 0232097c9bc..1e4defa675b 100644 --- a/src/config/types.ts +++ b/src/config/types.ts @@ -76,6 +76,10 @@ export type SupportedChain = | "MANTLE_SEPOLIA" | "RONIN_MAINNET" | "RONIN_SAIGON" + | "BSQUARED_MAINNET" + | "BSQUARED_TESTNET" + | "SHIBARIUM_MAINNET" + | "SHIBARIUM_PUPPYNET" export type Chains = Record< SupportedTechnology, diff --git a/src/config/web3Providers.ts b/src/config/web3Providers.ts index b39ae63d14f..28249e5ddd3 100644 --- a/src/config/web3Providers.ts +++ b/src/config/web3Providers.ts @@ -54,6 +54,10 @@ export const chainToProvider: Record providers.Provider> = MANTLE_SEPOLIA: () => new providers.JsonRpcProvider("https://rpc.sepolia.mantle.xyz"), RONIN_MAINNET: () => new providers.JsonRpcProvider("https://ronin.lgns.net/rpc"), RONIN_SAIGON: () => new providers.JsonRpcProvider("https://saigon-testnet.roninchain.com/rpc"), + BSQUARED_MAINNET: () => new providers.JsonRpcProvider("https://rpc.ankr.com/b2"), + BSQUARED_TESTNET: () => new providers.JsonRpcProvider("https://rpc.ankr.com/b2_testnet"), + SHIBARIUM_MAINNET: () => new providers.JsonRpcProvider("https://www.shibrpc.com"), + SHIBARIUM_PUPPYNET: () => new providers.JsonRpcProvider("https://puppynet.shibrpc.com"), } export const getRpcUrlForChain = (chain: SupportedChain): string => { diff --git a/src/content/ccip/concepts/ccip-execution-latency.mdx b/src/content/ccip/concepts/ccip-execution-latency.mdx index e00ab9d431d..89acb52336f 100644 --- a/src/content/ccip/concepts/ccip-execution-latency.mdx +++ b/src/content/ccip/concepts/ccip-execution-latency.mdx @@ -127,6 +127,7 @@ This section provides an overview of the finality methods CCIP uses to determine | Base | Finality tag | 18 minutes | | Blast | Finality tag | 20 minutes | | BNB | Finality tag | 5 seconds | +| B² | Finality tag | 20 minutes | | Celo | Finality tag | < 1 second | | Ethereum | Finality tag | 15 minutes | | Gnosis | Finality tag | 3 minutes | @@ -139,5 +140,7 @@ This section provides an overview of the finality methods CCIP uses to determine | Polygon | Finality tag | 2 minutes | | Ronin | Finality tag | 10 seconds | | Scroll | Finality tag | 1 hour | +| Shibarium | Finality tag | 1 minute | | Wemix | Finality tag | < 1 second | +| Zircuit | Finality tag | 21 minutes | | ZKsync | [Block depth](#block-depth) (1200 blocks) | 20 minutes | diff --git a/src/content/ccip/tutorials/cross-chain-tokens/register-from-eoa-burn-mint-foundry.mdx b/src/content/ccip/tutorials/cross-chain-tokens/register-from-eoa-burn-mint-foundry.mdx index fef0b97acec..ca7f9862f46 100644 --- a/src/content/ccip/tutorials/cross-chain-tokens/register-from-eoa-burn-mint-foundry.mdx +++ b/src/content/ccip/tutorials/cross-chain-tokens/register-from-eoa-burn-mint-foundry.mdx @@ -13,13 +13,11 @@ import CcipCommon from "@features/ccip/CcipCommon.astro" name: "Hardhat (Burn & Mint)", url: "/ccip/tutorials/cross-chain-tokens/register-from-eoa-burn-mint-hardhat", icon: "/images/tutorial-icons/hardhat-icn.png", - width: "270px", }, { name: "Foundry (Burn & Mint)", url: "/ccip/tutorials/cross-chain-tokens/register-from-eoa-burn-mint-foundry", icon: "/images/tutorial-icons/foundry-icn.png", - width: "270px", }, ]} /> diff --git a/src/content/ccip/tutorials/cross-chain-tokens/register-from-eoa-burn-mint-hardhat.mdx b/src/content/ccip/tutorials/cross-chain-tokens/register-from-eoa-burn-mint-hardhat.mdx index 793999a2494..8cf273944d5 100644 --- a/src/content/ccip/tutorials/cross-chain-tokens/register-from-eoa-burn-mint-hardhat.mdx +++ b/src/content/ccip/tutorials/cross-chain-tokens/register-from-eoa-burn-mint-hardhat.mdx @@ -13,13 +13,11 @@ import CcipCommon from "@features/ccip/CcipCommon.astro" name: "Hardhat (Burn & Mint)", url: "/ccip/tutorials/cross-chain-tokens/register-from-eoa-burn-mint-hardhat", icon: "/images/tutorial-icons/hardhat-icn.png", - width: "270px", }, { name: "Foundry (Burn & Mint)", url: "/ccip/tutorials/cross-chain-tokens/register-from-eoa-burn-mint-foundry", icon: "/images/tutorial-icons/foundry-icn.png", - width: "270px", }, ]} /> diff --git a/src/content/ccip/tutorials/cross-chain-tokens/register-from-eoa-lock-mint-foundry.mdx b/src/content/ccip/tutorials/cross-chain-tokens/register-from-eoa-lock-mint-foundry.mdx index 418b8110ada..0cd78b6a064 100644 --- a/src/content/ccip/tutorials/cross-chain-tokens/register-from-eoa-lock-mint-foundry.mdx +++ b/src/content/ccip/tutorials/cross-chain-tokens/register-from-eoa-lock-mint-foundry.mdx @@ -13,13 +13,11 @@ import CcipCommon from "@features/ccip/CcipCommon.astro" name: "Hardhat (Lock & Mint)", url: "/ccip/tutorials/cross-chain-tokens/register-from-eoa-lock-mint-hardhat", icon: "/images/tutorial-icons/hardhat-icn.png", - width: "270px", }, { name: "Foundry (Lock & Mint)", url: "/ccip/tutorials/cross-chain-tokens/register-from-eoa-lock-mint-foundry", icon: "/images/tutorial-icons/foundry-icn.png", - width: "270px", }, ]} /> diff --git a/src/content/ccip/tutorials/cross-chain-tokens/register-from-eoa-lock-mint-hardhat.mdx b/src/content/ccip/tutorials/cross-chain-tokens/register-from-eoa-lock-mint-hardhat.mdx index 937bea196dd..dd244726d3c 100644 --- a/src/content/ccip/tutorials/cross-chain-tokens/register-from-eoa-lock-mint-hardhat.mdx +++ b/src/content/ccip/tutorials/cross-chain-tokens/register-from-eoa-lock-mint-hardhat.mdx @@ -13,13 +13,11 @@ import CcipCommon from "@features/ccip/CcipCommon.astro" name: "Hardhat (Lock & Mint)", url: "/ccip/tutorials/cross-chain-tokens/register-from-eoa-lock-mint-hardhat", icon: "/images/tutorial-icons/hardhat-icn.png", - width: "270px", }, { name: "Foundry (Lock & Mint)", url: "/ccip/tutorials/cross-chain-tokens/register-from-eoa-lock-mint-foundry", icon: "/images/tutorial-icons/foundry-icn.png", - width: "270px", }, ]} /> diff --git a/src/content/ccip/tutorials/cross-chain-tokens/update-rate-limiters-foundry.mdx b/src/content/ccip/tutorials/cross-chain-tokens/update-rate-limiters-foundry.mdx index bf0ac20c111..f59b09bb730 100644 --- a/src/content/ccip/tutorials/cross-chain-tokens/update-rate-limiters-foundry.mdx +++ b/src/content/ccip/tutorials/cross-chain-tokens/update-rate-limiters-foundry.mdx @@ -13,13 +13,11 @@ import CcipCommon from "@features/ccip/CcipCommon.astro" name: "Hardhat", url: "/ccip/tutorials/cross-chain-tokens/update-rate-limiters-hardhat", icon: "/images/tutorial-icons/hardhat-icn.png", - width: "270px", }, { name: "Foundry", url: "/ccip/tutorials/cross-chain-tokens/update-rate-limiters-foundry", icon: "/images/tutorial-icons/foundry-icn.png", - width: "270px", }, ]} /> diff --git a/src/content/ccip/tutorials/cross-chain-tokens/update-rate-limiters-hardhat.mdx b/src/content/ccip/tutorials/cross-chain-tokens/update-rate-limiters-hardhat.mdx index 1e46d7ca540..ab805f9c788 100644 --- a/src/content/ccip/tutorials/cross-chain-tokens/update-rate-limiters-hardhat.mdx +++ b/src/content/ccip/tutorials/cross-chain-tokens/update-rate-limiters-hardhat.mdx @@ -13,13 +13,11 @@ import CcipCommon from "@features/ccip/CcipCommon.astro" name: "Hardhat", url: "/ccip/tutorials/cross-chain-tokens/update-rate-limiters-hardhat", icon: "/images/tutorial-icons/hardhat-icn.png", - width: "270px", }, { name: "Foundry", url: "/ccip/tutorials/cross-chain-tokens/update-rate-limiters-foundry", icon: "/images/tutorial-icons/foundry-icn.png", - width: "270px", }, ]} /> diff --git a/src/content/data-streams/reference/report-schema-v4.mdx b/src/content/data-streams/reference/report-schema-v4.mdx index 61b2a6bd9ab..2488ad8ff98 100644 --- a/src/content/data-streams/reference/report-schema-v4.mdx +++ b/src/content/data-streams/reference/report-schema-v4.mdx @@ -14,14 +14,14 @@ import { PageTabs } from "@components" { name: "Crypto Schema (v3)", url: "/data-streams/reference/report-schema", - width: "230px", }, { name: "Real World Asset (RWA) Schema (v4)", url: "/data-streams/reference/report-schema-v4", - width: "350px", }, ]} + headerTitle="Available Schemas" + headerDescription="Choose the schema version you want to explore." /> Real World Asset (RWA) streams adhere to the report schema outlined below: @@ -34,7 +34,7 @@ Real World Asset (RWA) streams adhere to the report schema outlined below: | `nativeFee` | `uint192` | The cost to verify this report onchain when paying with the blockchain's native token | | `linkFee` | `uint192` | The cost to verify this report onchain when paying with LINK | | `expiresAt` | `uint32` | The expiration date of this report | -| `benchmarkPrice` | `int192` | The DON's consensus median price for this report carried to 18 decimal places | +| `price` | `int192` | The DON's consensus median price for this report carried to 18 decimal places | | `marketStatus` | `uint32` | The DON's consensus on whether the market is currently open. Possible values: `0` (`Unknown`), `1` (`Closed`), `2` (`Open`). | **Notes**: diff --git a/src/content/data-streams/reference/report-schema.mdx b/src/content/data-streams/reference/report-schema.mdx index 156169281f1..351d0abf017 100644 --- a/src/content/data-streams/reference/report-schema.mdx +++ b/src/content/data-streams/reference/report-schema.mdx @@ -14,14 +14,14 @@ import { PageTabs } from "@components" { name: "Crypto Schema (v3)", url: "/data-streams/reference/report-schema", - width: "230px", }, { name: "Real World Asset (RWA) Schema (v4)", url: "/data-streams/reference/report-schema-v4", - width: "350px", }, ]} + headerTitle="Available Schemas" + headerDescription="Choose the schema version you want to explore." /> Crypto streams adhere to the report schema outlined below: diff --git a/src/content/data-streams/reference/streams-direct/streams-direct-onchain-verification.mdx b/src/content/data-streams/reference/streams-direct/streams-direct-onchain-verification.mdx index fb013b79051..8a1f61a750d 100644 --- a/src/content/data-streams/reference/streams-direct/streams-direct-onchain-verification.mdx +++ b/src/content/data-streams/reference/streams-direct/streams-direct-onchain-verification.mdx @@ -17,7 +17,7 @@ import DataStreams from "@features/data-streams/common/DataStreams.astro" ## Verify reports onchain -To verify data onchain, Streams Direct requires several interfaces. +To verify data onchain on EVM chains, Streams Direct requires several Solidity interfaces. The primary onchain interaction occurs between the `IVerifierProxy` interface and your protocol's client contract. Find the Verifier proxy address for each stream on the [Stream Addresses](/data-streams/crypto-streams) page. diff --git a/src/content/data-streams/tutorials/streams-direct/streams-direct-onchain-verification.mdx b/src/content/data-streams/tutorials/streams-direct/evm-onchain-report-verification.mdx similarity index 90% rename from src/content/data-streams/tutorials/streams-direct/streams-direct-onchain-verification.mdx rename to src/content/data-streams/tutorials/streams-direct/evm-onchain-report-verification.mdx index d55d27a771e..0d8ce5147f1 100644 --- a/src/content/data-streams/tutorials/streams-direct/streams-direct-onchain-verification.mdx +++ b/src/content/data-streams/tutorials/streams-direct/evm-onchain-report-verification.mdx @@ -5,13 +5,33 @@ title: "Verify report data onchain" whatsnext: { "Find the list of available Stream IDs": "/data-streams/crypto-streams" } --- -import { CodeSample, CopyText, ClickToZoom } from "@components" +import { CodeSample, CopyText, ClickToZoom, PageTabs } from "@components" import { Tabs } from "@components/Tabs" import DataStreams from "@features/data-streams/common/DataStreams.astro" + + -In this tutorial, you'll learn how to verify onchain the integrity of reports by confirming their authenticity as signed by the Decentralized Oracle Network (DON). You'll use a verifier contract to verify the data onchain and pay the verification fee in LINK tokens. +In this guide, you'll learn how to verify onchain the integrity of reports by confirming their authenticity as signed by the Decentralized Oracle Network (DON). You'll use a verifier contract to verify the data onchain and pay the verification fee in LINK tokens. diff --git a/src/content/data-streams/tutorials/streams-direct/solana-offchain-report-verification.mdx b/src/content/data-streams/tutorials/streams-direct/solana-offchain-report-verification.mdx new file mode 100644 index 00000000000..f171ecce2a9 --- /dev/null +++ b/src/content/data-streams/tutorials/streams-direct/solana-offchain-report-verification.mdx @@ -0,0 +1,340 @@ +--- +section: dataStreams +date: Last Modified +title: "Verify report data - Offchain integration (Solana)" +whatsnext: + { + "Find the list of available Stream IDs": "/data-streams/crypto-streams", + "Learn how to verify reports on Solana onchain": "/data-streams/tutorials/streams-direct/solana-onchain-report-verification", + } +--- + +import { CodeSample, CopyText, ClickToZoom, PageTabs, Aside } from "@components" +import { Tabs } from "@components/Tabs" +import DataStreams from "@features/data-streams/common/DataStreams.astro" + + + + + +To verify a Data Streams report, you must confirm the report integrity signed by the Decentralized Oracle Network (DON). + +You have two options to verify Data Streams reports on Solana: + +1. **Onchain integration**: Verify reports directly within your Solana program using [Cross-Program Invocation (CPI)](https://solana.com/docs/core/cpi) to the verifier program. Learn more about this method in the [onchain verification guide](/data-streams/tutorials/streams-direct/solana-onchain-report-verification). + +1. **Offchain integration**: Verify reports client-side using an SDK. You'll learn how to implement this method in this guide. + +Both methods use the same underlying verification logic and security guarantees, differing only in where the verification occurs. + +## Offchain integration + +The offchain integration allows you to verify the authenticity of Data Streams reports from your client-side application. While this method requires sending a transaction to the verifier program, the verification logic and processing of results happens in your client application rather than in a Solana program. + +In this guide, you'll learn how to: + +- Set up an Anchor project +- Configure the necessary dependencies +- Create a command-line tool to verify reports +- Process and display the verified report data + + + +### Prerequisites + +Before you begin, you should have: + +- Familiarity with [Rust](https://www.rust-lang.org/learn) programming +- Understanding of [Solana](https://solana.com/docs) concepts: + - [RPC Clients](https://solana.com/docs/rpc) and network interaction + - [Transactions](https://solana.com/docs/core/transactions) and signing + - [Keypairs](https://solana.com/docs/intro/wallets#keypair) and account management +- An allowlisted account in the Data Streams Access Controller ([contact us](https://chainlinkcommunity.typeform.com/datastreams?typeform-source=docs.chain.link#ref_id=docs) to get started with Early Access) + +### Requirements + +To complete this guide, you'll need: + +- **Rust and Cargo**: Install the latest version using [rustup](https://rustup.rs/). Run to verify your installation. + +- **Solana CLI tools**: Install the latest version following the [official guide](https://docs.solana.com/cli/install-solana-cli-tools). Run to verify your installation. + +- **Anchor Framework**: Follow the [official installation guide](https://www.anchor-lang.com/docs/installation). Run to verify your installation. + +- **Devnet SOL**: You'll need devnet SOL for transaction fees. Use the [Solana CLI](https://docs.solana.com/cli/transfer-tokens#airdrop-some-tokens-to-get-started) or the [Solana Faucet](https://faucet.solana.com/) to get devnet SOL. Check your balance with . + +- **Allowlisted Account**: Your account must be allowlisted in the Data Streams Access Controller. + +> **Note**: While this guide uses the Anchor framework for project structure, you can integrate the verification using any Rust-based Solana project setup. The verifier SDK and client libraries are written in Rust, but you can integrate them into your preferred Rust project structure. + +### Implementation guide + +#### 1. Create a new Anchor project + +1. Create a new Anchor project: + + ```bash + anchor init example_verify + cd example_verify + ``` + +1. Create a binary target for the verification tool: + ```bash + mkdir -p programs/example_verify/src/bin + touch programs/example_verify/src/bin/main.rs + ``` + +#### 2. Configure your project's dependencies + +Update your program's manifest file (`programs/example_verify/Cargo.toml`): + +```toml +[package] +name = "example_verify" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] + +[[bin]] +name = "example_verify" +path = "src/bin/main.rs" + +[features] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +cpi = ["no-entrypoint"] +default = [] + +[dependencies] +data-streams-report = { git = "https://github.com/smartcontractkit/data-streams-sdk.git" } +sdk-off-chain = { git = "https://github.com/smartcontractkit/smart-contract-examples.git", branch = "data-streams-solana-integration", package = "sdk-off-chain"} + +solana-program = "2.1.6" +solana-sdk = "2.1.6" +solana-client = "2.1.6" +hex = "0.4.3" +borsh = "0.10.3" +``` + +#### 3. Implement the verification library + +Create `programs/example_verify/src/lib.rs` with the verification function: + +```rust +use data_streams_report::report::v3::ReportDataV3; +use sdk_off_chain::VerificationClient; +use solana_client::rpc_client::RpcClient; +use solana_sdk::{ + commitment_config::CommitmentConfig, + pubkey::Pubkey, + signature::read_keypair_file, + signer::Signer, +}; +use std::{ path::PathBuf, str::FromStr }; + +pub fn default_keypair_path() -> String { + let mut path = PathBuf::from(std::env::var("HOME").unwrap_or_else(|_| ".".to_string())); + path.push(".config/solana/id.json"); + path.to_str().unwrap().to_string() +} + +pub fn verify_report( + signed_report: &[u8], + program_id: &str, + access_controller: &str +) -> Result> { + // Initialize RPC client with confirmed commitment level + let rpc_client = RpcClient::new_with_commitment( + "https://api.devnet.solana.com", + CommitmentConfig::confirmed() + ); + + // Load the keypair that will pay for and sign verification transactions + let payer = read_keypair_file(default_keypair_path())?; + println!("Using keypair: {}", payer.pubkey()); + + // Convert to Pubkey + let program_pubkey = Pubkey::from_str(program_id)?; + let access_controller_pubkey = Pubkey::from_str(access_controller)?; + println!("Program ID: {}", program_pubkey); + println!("Access Controller: {}", access_controller_pubkey); + + // Create a verification client instance + let client = VerificationClient::new( + program_pubkey, + access_controller_pubkey, + rpc_client, + payer + ); + + // Verify the report + println!("Verifying report of {} bytes...", signed_report.len()); + let result = client.verify(signed_report.to_vec()).map_err(|e| { + println!("Verification error: {:?}", e); + e + })?; + + // Decode the returned data into a ReportDataV3 struct + let return_data = result.return_data.ok_or("No return data")?; + let report = ReportDataV3::decode(&return_data)?; + Ok(report) +} +``` + +> This example uses the [V3 schema](/data-streams/reference/report-schema) for [crypto streams](/data-streams/crypto-streams) to decode the report. If you verify reports for [RWA streams](/data-streams/rwa-streams), import and use the [V4 schema](/data-streams/reference/report-schema-v4) from the [report crate](https://github.com/smartcontractkit/data-streams-sdk/tree/main/rust/crates/report) instead. + +#### 4. Create the command-line interface + +Create `programs/example_verify/src/bin/main.rs`: + +```rust +use example_verify::verify_report; +use std::env; +use std::str::FromStr; +use hex; +use solana_sdk::pubkey::Pubkey; + +fn main() { + let args: Vec = env::args().collect(); + if args.len() != 4 { + eprintln!( + "Usage: {} ", + args[0] + ); + std::process::exit(1); + } + + let program_id_str = &args[1]; + let access_controller_str = &args[2]; + let hex_report = &args[3]; + + // Validate program_id and access_controller + if Pubkey::from_str(program_id_str).is_err() { + eprintln!("Invalid program ID provided"); + std::process::exit(1); + } + if Pubkey::from_str(access_controller_str).is_err() { + eprintln!("Invalid access controller address provided"); + std::process::exit(1); + } + + // Decode the hex string for the signed report + let signed_report = match hex::decode(hex_report) { + Ok(bytes) => bytes, + Err(e) => { + eprintln!("Failed to decode hex string: {}", e); + std::process::exit(1); + } + }; + + // Perform verification off-chain + match verify_report(&signed_report, program_id_str, access_controller_str) { + Ok(report) => { + println!("\nVerified Report Data:"); + println!("Feed ID: {}", report.feed_id); + println!("Valid from timestamp: {}", report.valid_from_timestamp); + println!("Observations timestamp: {}", report.observations_timestamp); + println!("Native fee: {}", report.native_fee); + println!("Link fee: {}", report.link_fee); + println!("Expires at: {}", report.expires_at); + println!("Benchmark price: {}", report.benchmark_price); + println!("Bid: {}", report.bid); + println!("Ask: {}", report.ask); + } + Err(e) => { + eprintln!("Verification failed: {}", e); + std::process::exit(1); + } + } +} +``` + +#### 5. Build and run the verifier + +1. Build the project: + + ```bash + cargo build + ``` + +1. Make sure you are connected to Devnet with . + +1. Run the verifier with your report: + + ```bash + cargo run -- + ``` + + Replace the placeholders with: + + - ``: The Verifier Program ID (find it on the [Stream Addresses](/data-streams/crypto-streams) page) + - ``: The Access Controller Account (find it on the [Stream Addresses](/data-streams/crypto-streams) page) + - ``: Your hex-encoded signed report (without the '0x' prefix) + + Example: + + ```bash + cargo run -- Gt9S41PtjR58CbG9JhJ3J6vxesqrNAswbWYbLNTMZA3c 2k3DsgwBoqrnvXKVvd7jX7aptNxdcRBdcd5HkYsGgbrb 0006f9b553e393ced311551efd30d1decedb63d76ad41737462e2cdbbdff1578000000000000000000000000000000000000000000000000000000004f56930f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000028001010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000120000359843a543ee2fe414dc14c7e7920ef10f4372990b79d6361cdc0dd1ba78200000000000000000000000000000000000000000000000000000000675ca37000000000000000000000000000000000000000000000000000000000675ca3700000000000000000000000000000000000000000000000000000174be1bd8758000000000000000000000000000000000000000000000000000cb326ce8c3ea800000000000000000000000000000000000000000000000000000000675df4f00000000000000000000000000000000000000000000000d3a30bcc15e207c0000000000000000000000000000000000000000000000000d3a1557b5e634060200000000000000000000000000000000000000000000000d3ab99a974ff10f400000000000000000000000000000000000000000000000000000000000000000292bdd75612560e46ed9b0c2437898f81eb0e18b6b902a161b9708e9177175cf3b8ef2b279f230f766fb29306250ee90856516ee349ca42b2d7fb141deb006745000000000000000000000000000000000000000000000000000000000000000221c156e80276827e1bfeb6542ab064dfa958f5be955f516fb62b1c93437472c31cc65fcaba68c9d661701190bc32025a0690af0eefe027ac218fd15c588dd4d5 + ``` + + Expect the output to be similar to the following: + + ```bash + Using keypair: + Program ID: Gt9S41PtjR58CbG9JhJ3J6vxesqrNAswbWYbLNTMZA3c + Access Controller: 2k3DsgwBoqrnvXKVvd7jX7aptNxdcRBdcd5HkYsGgbrb + Verifying report of 736 bytes... + FeedId: 0x000359843a543ee2fe414dc14c7e7920ef10f4372990b79d6361cdc0dd1ba782 + Valid from timestamp: 1734124400 + Observations timestamp: 1734124400 + Native fee: 25614677280600 + Link fee: 3574678975954600 + Expires at: 1734210800 + Price: 3904011708000000000000 + Bid: 3903888333211164500000 + Ask: 3904628100124598400000 + ``` + +### Best practices + +When implementing verification in production: + +1. **Error Handling**: + + - Implement robust error handling for network issues + - Add proper logging and monitoring + - Handle report expiration gracefully + +1. **Security**: + + - Securely manage keypairs and never expose them + - Validate all input parameters + - Implement rate limiting for verification requests + +1. **Performance**: + + - Cache verified reports when appropriate + - Implement retry mechanisms with backoff + - Use connection pooling for RPC clients diff --git a/src/content/data-streams/tutorials/streams-direct/solana-onchain-report-verification.mdx b/src/content/data-streams/tutorials/streams-direct/solana-onchain-report-verification.mdx new file mode 100644 index 00000000000..6af253889c1 --- /dev/null +++ b/src/content/data-streams/tutorials/streams-direct/solana-onchain-report-verification.mdx @@ -0,0 +1,511 @@ +--- +section: dataStreams +date: Last Modified +title: "Verify report data - Onchain integration (Solana)" +whatsnext: + { + "Find the list of available Stream IDs": "/data-streams/crypto-streams", + "Learn how to verify reports on Solana offchain": "/data-streams/tutorials/streams-direct/solana-offchain-report-verification", + } +--- + +import { CodeSample, CopyText, ClickToZoom, PageTabs, Aside } from "@components" +import { Tabs } from "@components/Tabs" +import DataStreams from "@features/data-streams/common/DataStreams.astro" + + + + + +To verify a Data Streams report, you must confirm the report integrity signed by the Decentralized Oracle Network (DON). + +You have two options to verify Data Streams reports on Solana: + +1. **Onchain integration**: Verify reports directly within your Solana program using [Cross-Program Invocation (CPI)](https://solana.com/docs/core/cpi) to the Verifier program. You'll learn how to implement this method in this guide. + +1. **Offchain integration**: Verify reports client-side using an SDK. Learn more about this method in the [offchain verification guide](/data-streams/tutorials/streams-direct/solana-offchain-report-verification). + +Both methods use the same underlying verification logic and security guarantees, differing only in where the verification occurs. + +## Onchain integration + +You can verify Data Streams reports directly within your Solana program using this integration. This method ensures atomic verification and processing of report data. + +In this guide, you'll learn how to: + +- Integrate with the Chainlink Data Streams Verifier program +- Create and invoke the verification instruction +- Retrieve the verified report data + + + +### Prerequisites + +Before you begin, you should have: + +- Familiarity with [Rust](https://www.rust-lang.org/learn) programming +- Understanding of [Solana](https://solana.com/docs) concepts: + - [Accounts](https://solana.com/docs/core/accounts) + - [Instructions](https://solana.com/docs/core/transactions#instruction) + - [Program Derived Addresses (PDAs)](https://solana.com/docs/core/pda) +- Knowledge of the [Anchor](https://www.anchor-lang.com/) framework +- An allowlisted account in the Data Streams Access Controller. ([Contact us](https://chainlinkcommunity.typeform.com/datastreams?typeform-source=docs.chain.link#ref_id=docs) to get started with Early Access). + +### Requirements + +To complete this guide, you'll need: + +- **Rust and Cargo**: Install the latest version using [rustup](https://rustup.rs/). Run to verify your installation. + +- **Solana CLI tools**: Install the latest version following the [official guide](https://docs.solana.com/cli/install-solana-cli-tools). Run to verify your installation. + +- **Anchor Framework**: Follow the [official installation guide](https://www.anchor-lang.com/docs/installation). Run to verify your installation. + +- **Node.js and npm**: [Install Node.js 20 or later](https://nodejs.org/). Verify your installation with . + +- **ts-node**: Install globally using npm: . Verify your installation with . + +- **Devnet SOL**: You'll need devnet SOL for deployment and testing. Use the [Solana CLI](https://docs.solana.com/cli/transfer-tokens#airdrop-some-tokens-to-get-started) or the [Solana Faucet](https://faucet.solana.com/) to get devnet SOL. + +> **Note**: While this guide uses the Anchor framework for project structure, you can integrate the verification using any Rust-based Solana program framework. The verifier SDK is written in Rust, but you can integrate it into your preferred Rust program structure. + +### Implementation guide + +#### 1. Create a new Anchor project + +1. Open your terminal and run the following command to create a new Anchor project: + + ```bash + anchor init example_verify + ``` + + This command creates a new directory named `example_verify` with the basic structure of an Anchor project. + +1. Navigate to the project directory: + + ```bash + cd example_verify + ``` + +#### 2. Configure your project for devnet + +Open your `Anchor.toml` file at the root of your project and update it to use devnet: + +```toml +[features] +seeds = false +skip-lint = false + +[programs.devnet] +# Replace with your program ID +example_verify = "" + +[registry] +url = "https://api.apr.dev" + +[provider] +cluster = "devnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "yarn run ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +``` + +Replace `` with your program ID. You can run to get your program ID. + +#### 3. Set up your program's dependencies + +In your program's manifest file (`programs/example_verify/Cargo.toml`), add the Chainlink Data Streams client and the report crate as dependencies: + +```toml +[dependencies] +chainlink_solana_data_streams = { git = "https://github.com/smartcontractkit/chainlink-solana", branch = "develop", subdir = "contracts/crates/chainlink-solana-data-streams" } +data-streams-report = { git = "https://github.com/smartcontractkit/data-streams-sdk.git", subdir = "rust/crates/report" } + +# Additional required dependencies +anchor-lang = "0.29.0" +``` + +#### 4. Write the program + +Navigate to your program main file (`programs/example_verify/src/lib.rs`). This is where you'll write your program logic. Replace the contents of `lib.rs` with the following example code: + +```rust +// Import required dependencies for Anchor, Solana, and Data Streams +use anchor_lang::prelude::*; +use anchor_lang::solana_program::{ + program::{get_return_data, invoke}, + pubkey::Pubkey, + instruction::Instruction, +}; +use data_streams_report::report::v3::ReportDataV3; +use chainlink_solana_data_streams::VerifierInstructions; + + +declare_id!(""); + +#[program] +pub mod example_verify { + use super::*; + + /// Verifies a Data Streams report using Cross-Program Invocation to the Verifier program + /// Returns the decoded report data if verification succeeds + pub fn verify(ctx: Context, signed_report: Vec) -> Result<()> { + let program_id = ctx.accounts.verifier_program_id.key(); + let verifier_account = ctx.accounts.verifier_account.key(); + let access_controller = ctx.accounts.access_controller.key(); + let user = ctx.accounts.user.key(); + let config_account = ctx.accounts.config_account.key(); + + // Create verification instruction + let chainlink_ix: Instruction = VerifierInstructions::verify( + &program_id, + &verifier_account, + &access_controller, + &user, + &config_account, + signed_report, + ); + + // Invoke the Verifier program + invoke( + &chainlink_ix, + &[ + ctx.accounts.verifier_account.to_account_info(), + ctx.accounts.access_controller.to_account_info(), + ctx.accounts.user.to_account_info(), + ctx.accounts.config_account.to_account_info(), + ], + )?; + + // Decode and log the verified report data + if let Some((_program_id, return_data)) = get_return_data() { + msg!("Report data found"); + let report = ReportDataV3::decode(&return_data) + .map_err(|_| error!(CustomError::InvalidReportData))?; + + // Log report fields + msg!("FeedId: {}", report.feed_id); + msg!("Valid from timestamp: {}", report.valid_from_timestamp); + msg!("Observations Timestamp: {}", report.observations_timestamp); + msg!("Native Fee: {}", report.native_fee); + msg!("Link Fee: {}", report.link_fee); + msg!("Expires At: {}", report.expires_at); + msg!("Benchmark Price: {}", report.benchmark_price); + msg!("Bid: {}", report.bid); + msg!("Ask: {}", report.ask); + } else { + msg!("No report data found"); + return Err(error!(CustomError::NoReportData)); + } + + Ok(()) + } +} + +#[error_code] +pub enum CustomError { + #[msg("No valid report data found")] + NoReportData, + #[msg("Invalid report data format")] + InvalidReportData, +} + +#[derive(Accounts)] +pub struct ExampleProgramContext<'info> { + /// The Verifier Account stores the DON's public keys and other verification parameters. + /// This account must match the PDA derived from the verifier program. + /// CHECK: The account is validated by the verifier program. + pub verifier_account: AccountInfo<'info>, + /// The Access Controller Account + /// CHECK: The account structure is validated by the verifier program. + pub access_controller: AccountInfo<'info>, + /// The account that signs the transaction. + pub user: Signer<'info>, + /// The Config Account is a PDA derived from a signed report + /// CHECK: The account is validated by the verifier program. + pub config_account: UncheckedAccount<'info>, + /// The Verifier Program ID specifies the target Chainlink Data Streams Verifier Program. + /// CHECK: The program ID is validated by the verifier program. + pub verifier_program_id: AccountInfo<'info>, +} +``` + +Replace `` with your program ID in the `declare_id!` macro. You can run to get your program ID. + +Note how the `VerifierInstructions::verify` helper method automatically handles the PDA computations internally. Refer to the [Program Derived Addresses (PDAs)](#program-derived-addresses-pdas) section for more information. + +> This example uses the [V3 schema](/data-streams/reference/report-schema) for [crypto streams](/data-streams/crypto-streams) to decode the report. If you verify reports for [RWA streams](/data-streams/rwa-streams), import and use the [V4 schema](/data-streams/reference/report-schema-v4) from the [report crate](https://github.com/smartcontractkit/data-streams-sdk/tree/main/rust/crates/report) instead. + +#### 5. Deploy your program + +1. Run the following command to build your program: + + ```bash + anchor build + ``` + + **Note**: If you run into this error, set the `version` field at the top of your `cargo.lock` file to `3`. + + ```bash + warning: virtual workspace defaulting to `resolver = "1"` despite one or more workspace members being on edition 2021 which implies `resolver = "2"` + note: to keep the current resolver, specify `workspace.resolver = "1"` in the workspace root's manifest + note: to use the edition 2021 resolver, specify `workspace.resolver = "2"` in the workspace root's manifest + note: for more details see https://doc.rust-lang.org/cargo/reference/resolver.html#resolver-versions + warning: .../example_verify/programs/example_verify/Cargo.toml: unused manifest key: dependencies.data-streams-report.subdir + error: failed to parse lock file at: .../example_verify/Cargo.lock + + Caused by: + lock file version 4 requires `-Znext-lockfile-bump` + ``` + +1. Deploy your program to a Solana cluster (devnet in this example) using: + + ```bash + anchor deploy + ``` + + Expect an output similar to the following: + + ```bash + Deploying cluster: https://api.devnet.solana.com + Upgrade authority: ~/.config/solana/id.json + Deploying program "example_verify"... + Program path: ~/example_verify/target/deploy/example_verify.so... + Program Id: 8XcUbDgY2UaUYNHkirKsWqXJtzPXezBSyj5Yh87dXums + + Signature: 3ky6VkpebDGq7x1n8JB32daybmjvbRBsD4yR2uCCussSWhokaEESTXuSa5s8NMvKTz2NZjoq9aoQ9pvuw9bYoibt + + Deploy success + ``` + +#### 6. Interact with the Verifier Program + +In this section, you'll write a client script to interact with your deployed program, which will use [Cross-Program Invocation (CPI)](https://solana.com/docs/core/cpi) to verify reports through the Chainlink Data Streams Verifier Program. + +1. In the `tests` directory, create a new file to interact with your deployed program. + +1. Populate your `verify_tests.ts` file with the example client script below. + + - Replace `` with your program ID. + - This example provides a report payload. To use your own report payload, update the `hexString` variable. + + ```typescript + import * as anchor from "@coral-xyz/anchor" + import { Program } from "@coral-xyz/anchor" + import { PublicKey } from "@solana/web3.js" + import { ExampleVerify } from "../target/types/example_verify" + import * as snappy from "snappy" + + // Data Streams Verifier Program ID on Devnet + const VERIFIER_PROGRAM_ID = new PublicKey("Gt9S41PtjR58CbG9JhJ3J6vxesqrNAswbWYbLNTMZA3c") + + async function main() { + // Setup connection and provider + const provider = anchor.AnchorProvider.env() + anchor.setProvider(provider) + + // Initialize your program using the IDL and your program ID + const program = new Program( + require("../target/idl/example_verify.json"), + "", + provider + ) + + // Convert the hex string to a Uint8Array + // This is an example report payload for a crypto stream + const hexString = + "0x00064f2cd1be62b7496ad4897b984db99243e0921906f66ded15149d993ef42c000000000000000000000000000000000000000000000000000000000103c90c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200003684ea93c43ed7bd00ab3bb189bb62f880436589f1ca58b599cd97d6007fb0000000000000000000000000000000000000000000000000000000067570fa40000000000000000000000000000000000000000000000000000000067570fa400000000000000000000000000000000000000000000000000004c6ac85bf854000000000000000000000000000000000000000000000000002e1bf13b772a9c0000000000000000000000000000000000000000000000000000000067586124000000000000000000000000000000000000000000000000002bb4cf7662949c000000000000000000000000000000000000000000000000002bae04e2661000000000000000000000000000000000000000000000000000002bb6a26c3fbeb80000000000000000000000000000000000000000000000000000000000000002af5e1b45dd8c84b12b4b58651ff4173ad7ca3f5d7f5374f077f71cce020fca787124749ce727634833d6ca67724fd912535c5da0f42fa525f46942492458f2c2000000000000000000000000000000000000000000000000000000000000000204e0bfa6e82373ae7dff01a305b72f1debe0b1f942a3af01bad18e0dc78a599f10bc40c2474b4059d43a591b75bdfdd80aafeffddfd66d0395cca2fdeba1673d" + + // Remove the '0x' prefix if present + const cleanHexString = hexString.startsWith("0x") ? hexString.slice(2) : hexString + + // Validate hex string format + if (!/^[0-9a-fA-F]+$/.test(cleanHexString)) { + throw new Error("Invalid hex string format") + } + + // Convert hex to Uint8Array + const signedReport = new Uint8Array(cleanHexString.match(/.{1,2}/g).map((byte) => parseInt(byte, 16))) + + // Compress the report using Snappy + const compressedReport = await snappy.compress(Buffer.from(signedReport)) + + // Derive necessary PDAs using the SDK's helper functions + const verifierAccount = await PublicKey.findProgramAddressSync([Buffer.from("verifier")], VERIFIER_PROGRAM_ID) + + const configAccount = await PublicKey.findProgramAddressSync([signedReport.slice(0, 32)], VERIFIER_PROGRAM_ID) + + // The Data Streams access controller on devnet + const accessController = new PublicKey("2k3DsgwBoqrnvXKVvd7jX7aptNxdcRBdcd5HkYsGgbrb") + + try { + console.log("\n📝 Transaction Details") + console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━") + console.log("🔑 Signer:", provider.wallet.publicKey.toString()) + + const tx = await program.methods + .verify(compressedReport) + .accounts({ + verifierAccount: verifierAccount[0], + accessController: accessController, + user: provider.wallet.publicKey, + configAccount: configAccount[0], + verifierProgramId: VERIFIER_PROGRAM_ID, + }) + .rpc({ commitment: "confirmed" }) + + console.log("✅ Transaction successful!") + console.log("🔗 Signature:", tx) + + // Fetch and display logs + const txDetails = await provider.connection.getTransaction(tx, { + commitment: "confirmed", + maxSupportedTransactionVersion: 0, + }) + + console.log("\n📋 Program Logs") + console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━") + + let indentLevel = 0 + let currentProgramId = "" + txDetails.meta.logMessages.forEach((log) => { + // Handle indentation for inner program calls + if (log.includes("Program invoke")) { + const programIdMatch = log.match(/Program (.*?) invoke/) + if (programIdMatch) { + currentProgramId = programIdMatch[1] + // Remove "Unknown Program" prefix if present + currentProgramId = currentProgramId.replace("Unknown Program ", "") + // Remove parentheses if present + currentProgramId = currentProgramId.replace(/[()]/g, "") + } + console.log(" ".repeat(indentLevel) + "🔄", log.trim()) + indentLevel++ + return + } + if (log.includes("Program return") || log.includes("Program consumed")) { + indentLevel = Math.max(0, indentLevel - 1) + } + + // Add indentation to all logs + const indent = " ".repeat(indentLevel) + + if (log.includes("Program log:")) { + const logMessage = log.replace("Program log:", "").trim() + if (log.includes("Program log:")) { + console.log(indent + "📍", logMessage) + } else if (log.includes("Program data:")) { + console.log(indent + "📊", log.replace("Program data:", "").trim()) + } + } + }) + console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n") + } catch (error) { + console.log("\n❌ Transaction Failed") + console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━") + console.error("Error:", error) + console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n") + } + } + + main() + ``` + + **Note**: The Program IDs and Access Controller Accounts are available on the [Stream Addresses](/data-streams/crypto-streams) page. + +1. Add the `snappy` dependency to your project: + + ```bash + yarn add snappy + ``` + + `snappy` is a compression library that is used to compress the report data. + +1. Execute the test script to interact with your program: + + ```bash + ANCHOR_PROVIDER_URL="https://api.devnet.solana.com" ANCHOR_WALLET="~/.config/solana/id.json" ts-node tests/verify_test.ts + ``` + + Replace `~/.config/solana/id.json` with the path to your Solana wallet (e.g., `/Users/username/.config/solana/id.json`). + +1. Verify the output logs to ensure the report data is processed correctly. Expect to see the decoded report fields logged to the console: + + ```bash + 📝 Transaction Details + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + 🔑 Signer: 1BZZU8cJsrMSBaQQGUxTE4LQYX2SU2jjs97pkrz7rHD + ✅ Transaction successful! + 🔗 Signature: 2CTZ7kgAxTogvMgb7QFDJUAq9xFBUVTEvyjf7UuhoVrHDhYKtHpQmd8hEy9XvLhfgWMdVTpCRvdf18r1ixgtncUc + + 📋 Program Logs + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + 📍 Instruction: Verify + 📍 Instruction: Verify + 📍 Report data found + 📍 FeedId: 0x0003684ea93c43ed7bd00ab3bb189bb62f880436589f1ca58b599cd97d6007fb + 📍 valid from timestamp: 1733758884 + 📍 Observations Timestamp: 1733758884 + 📍 Native Fee: 84021511714900 + 📍 Link Fee: 12978571827423900 + 📍 Expires At: 1733845284 + 📍 Benchmark Price: 12302227135960220 + 📍 Bid: 12294760000000000 + 📍 Ask: 12304232715632312 + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + ``` + +### Learn more + +#### Program Derived Addresses (PDAs) + +The verification process relies on two important PDAs that are handled automatically by the [Chainlink Data Streams Solana SDK](https://github.com/smartcontractkit/chainlink-solana/tree/develop/contracts/crates/chainlink-solana-data-streams): + +- **Verifier config account PDA**: + + - Derived using the verifier program ID as a seed + - Stores verification-specific configuration + - Used to ensure consistent verification parameters across all reports + +- **Report config account PDA**: + - Derived using the feed ID (first 32 bytes of the uncompressed signed report) as a seed + - Contains feed-specific configuration and constraints + - Ensures that each feed's verification follows its designated rules + +The SDK's `VerifierInstructions::verify` helper method performs these steps: + +1. Extracts the necessary seeds +2. Computes the PDAs using `Pubkey::find_program_derived_address` +3. Includes these derived addresses in the instruction data + +#### Best practices + +This guide provides a basic example on how to verify reports. When you implement reports verification, consider the following best practices: + +- Implement robust error handling: + - Handle verification failures and invalid reports comprehensively + - Implement proper error reporting and logging for debugging + - Add custom error types for different failure scenarios +- Add appropriate validations: + - Price threshold checks to prevent processing extreme values + - Timestamp validations to ensure data freshness + - Custom feed-specific validations based on your use case diff --git a/src/content/data-streams/tutorials/streams-direct/streams-direct-api-rwa.mdx b/src/content/data-streams/tutorials/streams-direct/streams-direct-api-rwa.mdx index c583c55e721..b0a1f3c1b6f 100644 --- a/src/content/data-streams/tutorials/streams-direct/streams-direct-api-rwa.mdx +++ b/src/content/data-streams/tutorials/streams-direct/streams-direct-api-rwa.mdx @@ -16,14 +16,13 @@ import DataStreams from "@features/data-streams/common/DataStreams.astro" | +| Name | Chainlink Token | +| Symbol | LINK | +| Decimals | 18 | +| Network status | [explorer.bsquared.network](https://explorer.bsquared.network/) | + +### Bsquared testnet + +Testnet BTC is used to pay for transactions on Bsquared Testnet. + +Testnet BTC and LINK are available at [faucets.chain.link/bsquared-testnet](https://faucet.chain.link/bsquared-testnet). + +| Parameter | Value | +| :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `1123` | +| Address |
| +| Name | Chainlink Token | +| Symbol | LINK | +| Decimals | 18 | +| Network status | [testnet-explorer.bsquared.network](https://testnet-explorer.bsquared.network/) | + ## Celo ### Celo mainnet @@ -580,6 +610,36 @@ Testnet ETH is used to pay for transactions on Linea Sepolia. Testnet ETH and LI | Decimals | 18 | | Network status | [linea.statuspage.io](https://linea.statuspage.io/) | +## Shibarium + +### Shibarium mainnet + +BONE is used to pay for transactions on Shibarium Mainnet. + +| Parameter | Value | +| :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `109` | +| Address |
| +| Name | Chainlink Token | +| Symbol | LINK | +| Decimals | 18 | +| Network status | [explorer.shibariumscan.io](https://explorer.shibariumscan.io/) | + +### Shibarium Puppynet + +Testnet BONE is used to pay for transactions on Shibarium Puppynet. + +Testnet BONE and LINK are available at [faucets.chain.link/shibarium-puppynet](https://faucet.chain.link/shibarium-puppynet). + +| Parameter | Value | +| :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Chain ID | `157` | +| Address |
| +| Name | Chainlink Token | +| Symbol | LINK | +| Decimals | 18 | +| Network status | [puppyscan.shib.io](https://puppyscan.shib.io/) | + ## ZKsync ### ZKsync Era mainnet diff --git a/src/features/feeds/components/FeedList.tsx b/src/features/feeds/components/FeedList.tsx index 55185e174d0..feb8afd63dc 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 } from "preact/hooks" -import { MainnetTable, TestnetTable, StreamsVerifierProxyTable } from "./Tables" +import { MainnetTable, TestnetTable, StreamsNetworkAddressesTable } from "./Tables" import feedList from "./FeedList.module.css" import tableStyles from "./Tables.module.css" import { clsx } from "~/lib" @@ -129,8 +129,8 @@ export const FeedList = ({ return ( <> - - + + diff --git a/src/features/feeds/components/Tables.module.css b/src/features/feeds/components/Tables.module.css index 8b72af8b9b0..b88cc445ffe 100644 --- a/src/features/feeds/components/Tables.module.css +++ b/src/features/feeds/components/Tables.module.css @@ -145,3 +145,95 @@ width: 100%; } } + +.networksContainer { + display: flex; + flex-direction: column; + gap: 0.5rem; + width: 100%; + max-width: 1200px; + margin: 0 auto; +} + +.networkCard { + border: 1px solid var(--border-color); + border-radius: 8px; + overflow: hidden; +} + +.networkHeader { + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; + padding: 1rem; + background: var(--background-color); + border: none; + cursor: pointer; + transition: background-color 0.2s ease; +} + +.networkHeader:hover { + background-color: rgba(0, 0, 0, 0.05); +} + +.networkHeader.active { + background: var(--active-background); +} + +.networkInfo { + display: flex; + align-items: center; + gap: 1rem; +} + +.networkInfo img { + border-radius: 50%; +} + +.expandIcon { + font-size: 1.5rem; + font-weight: bold; +} + +.networkDetails { + background-color: #f5f8ff; + padding: 1rem; + border-radius: 0 0 8px 8px; + transition: background-color 0.2s ease; +} + +.networkEnvironment { + margin-bottom: 1.5rem; +} + +.networkEnvironment h4 { + margin-bottom: 0.75rem; + color: var(--heading-color); +} + +.addressContainer { + display: flex; + align-items: center; + gap: 0.5rem; + font-family: monospace; + background: var(--code-background); + padding: 0.5rem; + border-radius: 4px; + margin-top: 0.25rem; +} + +.networkStatus { + margin-top: 1rem; + padding-top: 1rem; + border-top: 1px solid var(--border-color); +} + +.networkStatus a { + color: var(--link-color); + text-decoration: none; +} + +.networkStatus a:hover { + text-decoration: underline; +} diff --git a/src/features/feeds/components/Tables.tsx b/src/features/feeds/components/Tables.tsx index 4aada8bff7e..849b322172e 100644 --- a/src/features/feeds/components/Tables.tsx +++ b/src/features/feeds/components/Tables.tsx @@ -1,4 +1,5 @@ /** @jsxImportSource preact */ +import { useState } from "preact/hooks" import feedList from "./FeedList.module.css" import { clsx } from "../../../lib" import { ChainNetwork } from "~/features/data/chains" @@ -431,118 +432,204 @@ const StreamsNetworksData = [ { network: "Solana", logoUrl: "/assets/chains/solana.svg", - contactUs: true, - message: "to talk to an expert about integrating Chainlink Data Streams on Solana.", + networkStatus: "https://status.solana.com/", + isSolana: true, + mainnet: { + label: "Solana Mainnet", + verifierProgramId: "Gt9S41PtjR58CbG9JhJ3J6vxesqrNAswbWYbLNTMZA3c", + accessController: "7mSn5MoBjyRLKoJShgkep8J17ueGG8rYioVAiSg5YWMF", + explorerUrl: "https://explorer.solana.com/address/%s", + }, + testnet: { + label: "Solana Devnet", + verifierProgramId: "Gt9S41PtjR58CbG9JhJ3J6vxesqrNAswbWYbLNTMZA3c", + accessController: "2k3DsgwBoqrnvXKVvd7jX7aptNxdcRBdcd5HkYsGgbrb", + explorerUrl: "https://explorer.solana.com/address/%s?cluster=devnet", + }, }, ] -export const StreamsVerifierProxyTable = () => { +type NetworkDetails = { + verifierProxy?: string + verifierProgramId?: string + accessController?: string + explorerUrl: string + label: string +} + +type NetworkData = { + network: string + logoUrl: string + networkStatus?: string + mainnet?: NetworkDetails + testnet?: NetworkDetails + message?: string + isSolana?: boolean +} + +export const StreamsNetworkAddressesTable = () => { + const [activeNetwork, setActiveNetwork] = useState(null) + + const toggleNetwork = (network: string) => { + setActiveNetwork(activeNetwork === network ? null : network) + } + return ( - - - - - - - - - {StreamsNetworksData.map((network) => ( - - - - - ))} - -
NetworkVerifier proxy address
- {`${network.network} -
{network.network}
-
- {network.contactUs ? ( -
- - Contact us - {" "} - {network.message} -
- ) : ( - <> - {network.mainnet && ( -
- {network.mainnet.label}: - - {network.mainnet.verifierProxy} - - -
- )} - - {network.testnet && ( -
- {network.testnet.label}: - - {network.testnet.verifierProxy} - - -
- )} - - {network.networkStatus && ( -
- - Track the status of this network at{" "} - - {network.networkStatus} - - -
- )} - - )} -
+
+ {StreamsNetworksData.map((network: NetworkData) => ( +
+ + + {activeNetwork === network.network && ( +
+ <> + {network.mainnet && ( +
+

{network.mainnet.label}

+ {network.isSolana ? ( + <> +
+ Verifier Program ID: + +
+
+ Access Controller Account: + +
+ + ) : ( +
+ Verifier Proxy Address: + +
+ )} +
+ )} + + {network.testnet && ( +
+

{network.testnet.label}

+ {network.isSolana ? ( + <> +
+ Verifier Program ID: + +
+
+ Access Controller Account: + +
+ + ) : ( +
+ Verifier Proxy Address: + +
+ )} +
+ )} + + {network.networkStatus && ( + + )} + +
+ )} +
+ ))} +
+ ) +} + +const CopyableAddress = ({ + address, + explorerUrl, + network, + environment, + type, +}: { + address?: string + explorerUrl: string + network: NetworkData + environment: string + type: string +}) => { + if (!address) return null + + return ( +
+ + {address} + + +
) } diff --git a/src/features/redirects/redirects.json b/src/features/redirects/redirects.json index ae1770cdaaa..baf4779fb36 100644 --- a/src/features/redirects/redirects.json +++ b/src/features/redirects/redirects.json @@ -1984,6 +1984,11 @@ "source": "data-feeds/proof-of-reserve/addresses", "destination": "data-feeds/smartdata/addresses", "statuscode": 301 + }, + { + "source": "data-streams/tutorials/streams-direct/streams-direct-onchain-verification", + "destination": "data-streams/tutorials/streams-direct/evm-onchain-report-verification", + "statuscode": 301 } ] } diff --git a/src/features/utils/index.ts b/src/features/utils/index.ts index 3383d352831..8d9ab8d29ad 100644 --- a/src/features/utils/index.ts +++ b/src/features/utils/index.ts @@ -197,6 +197,14 @@ export const directoryToSupportedChain = (chainInRdd: string): SupportedChain => return "RONIN_MAINNET" case "ronin-testnet-saigon": return "RONIN_SAIGON" + case "bitcoin-mainnet-bsquared-1": + return "BSQUARED_MAINNET" + case "bitcoin-testnet-bsquared-1": + return "BSQUARED_TESTNET" + case "shibarium-mainnet": + return "SHIBARIUM_MAINNET" + case "shibarium-testnet-puppynet": + return "SHIBARIUM_PUPPYNET" default: throw Error(`Chain not found ${chainInRdd}`) } @@ -292,6 +300,14 @@ export const supportedChainToChainInRdd = (supportedChain: SupportedChain): stri return "ronin-mainnet" case "RONIN_SAIGON": return "ronin-testnet-saigon" + case "BSQUARED_MAINNET": + return "bitcoin-mainnet-bsquared-1" + case "BSQUARED_TESTNET": + return "bitcoin-testnet-bsquared-1" + case "SHIBARIUM_MAINNET": + return "shibarium-mainnet" + case "SHIBARIUM_PUPPYNET": + return "shibarium-testnet-puppynet" default: throw Error(`Chain not found ${supportedChain}`) } diff --git a/src/scripts/reference/chains.json b/src/scripts/reference/chains.json index a7dcaf3a56e..00c020667f1 100644 --- a/src/scripts/reference/chains.json +++ b/src/scripts/reference/chains.json @@ -168,6 +168,19 @@ { "name": "dexguru", "url": "https://gnosis.dex.guru", "icon": "dexguru", "standard": "EIP3091" } ] }, + { + "name": "Shibarium", + "chain": "Shibarium", + "icon": "shibarium", + "rpc": ["https://www.shibrpc.com", "https://rpc.shibrpc.com", "https://shib.nownodes.io"], + "faucets": [], + "nativeCurrency": { "name": "BONE Shibarium", "symbol": "BONE", "decimals": 18 }, + "infoURL": "https://shibariumecosystem.com", + "shortName": "shibariumecosystem", + "chainId": 109, + "networkId": 109, + "explorers": [{ "name": "shibariumscan", "url": "https://www.shibariumscan.io", "standard": "none" }] + }, { "name": "Polygon Mainnet", "chain": "Polygon", @@ -198,6 +211,39 @@ { "name": "dexguru", "url": "https://polygon.dex.guru", "icon": "dexguru", "standard": "EIP3091" } ] }, + { + "name": "Puppynet", + "chain": "Puppynet", + "icon": "shibarium", + "rpc": ["https://puppynet.shibrpc.com"], + "faucets": ["https://shibarium.shib.io/faucet"], + "nativeCurrency": { "name": "BONE", "symbol": "BONE", "decimals": 18 }, + "infoURL": "https://shibariumecosystem.com", + "shortName": "puppynet", + "chainId": 157, + "networkId": 157, + "explorers": [{ "name": "puppyscan", "url": "https://puppyscan.shib.io", "standard": "none" }] + }, + { + "name": "B2 Hub Mainnet", + "chain": "B2", + "rpc": ["https://hub-rpc.bsquared.network"], + "faucets": [], + "nativeCurrency": { "name": "BSquared Token", "symbol": "B2", "decimals": 18 }, + "infoURL": "https://www.bsquared.network", + "shortName": "B2Hub-mainnet", + "chainId": 213, + "networkId": 213, + "icon": "bsquare", + "explorers": [ + { + "name": "B2 Hub Mainnet Explorer", + "url": "https://hub-explorer.bsquared.network", + "icon": "bsquare", + "standard": "EIP3091" + } + ] + }, { "name": "Fantom Opera", "chain": "FTM", @@ -371,6 +417,32 @@ { "name": "WEMIX Testnet Microscope", "url": "https://microscope.test.wemix.com", "standard": "EIP3091" } ] }, + { + "name": "B2 Testnet", + "title": "B2 Testnet", + "chain": "Habitat", + "rpc": [ + "https://b2-testnet.alt.technology", + "https://rpc.ankr.com/b2_testnet", + "https://testnet-rpc.bsquared.network" + ], + "faucets": [], + "nativeCurrency": { "name": "Bitcoin", "symbol": "BTC", "decimals": 18 }, + "infoURL": "https://www.bsquared.network", + "shortName": "B2-testnet", + "chainId": 1123, + "networkId": 1123, + "icon": "bsquare", + "explorers": [ + { + "name": "blockscout", + "url": "https://testnet-explorer.bsquared.network", + "icon": "bsquare", + "standard": "EIP3091" + } + ], + "parent": { "type": "L2", "chain": "eip155-1113" } + }, { "name": "Moonbeam", "chain": "MOON", @@ -1014,7 +1086,8 @@ "wss://ethereum-sepolia-rpc.publicnode.com", "https://sepolia.drpc.org", "wss://sepolia.drpc.org", - "https://rpc-sepolia.rockx.com" + "https://rpc-sepolia.rockx.com", + "https://eth-sepolia.g.alchemy.com/v2/WddzdzI2o9S3COdT73d5w6AIogbKq4X-" ], "faucets": ["http://fauceth.komputing.org?chain=11155111&address=${ADDRESS}"], "nativeCurrency": { "name": "Sepolia Ether", "symbol": "ETH", "decimals": 18 }, diff --git a/src/scripts/reference/linkNameSymbol.json b/src/scripts/reference/linkNameSymbol.json index e26b11052d0..f9a87b02735 100644 --- a/src/scripts/reference/linkNameSymbol.json +++ b/src/scripts/reference/linkNameSymbol.json @@ -203,5 +203,21 @@ "2021": { "name": "ChainLink Token", "symbol": "LINK" + }, + "213": { + "name": "ChainLink Token", + "symbol": "LINK" + }, + "1123": { + "name": "ChainLink Token", + "symbol": "LINK" + }, + "109": { + "name": "ChainLink Token", + "symbol": "LINK" + }, + "157": { + "name": "ChainLink Token", + "symbol": "LINK" } } diff --git a/vercel.json b/vercel.json index 2be4a76acf6..a2620fb0e30 100644 --- a/vercel.json +++ b/vercel.json @@ -431,6 +431,11 @@ "source": "data-feeds/proof-of-reserve/addresses", "destination": "data-feeds/smartdata/addresses", "statusCode": 301 + }, + { + "source": "data-streams/tutorials/streams-direct/streams-direct-onchain-verification", + "destination": "data-streams/tutorials/streams-direct/evm-onchain-report-verification", + "statusCode": 301 } ] } \ No newline at end of file