From 8051f372c45b57c8ea83c69299e2d8657804e5f6 Mon Sep 17 00:00:00 2001 From: "Amine E." Date: Tue, 15 Oct 2024 15:18:39 +0200 Subject: [PATCH 01/87] update rmn disclaimer (#2124) * update disclaimer * update * update --- src/content/ccip/architecture.mdx | 2 +- src/content/ccip/concepts/index.mdx | 11 ++--------- src/features/ccip/RMNCaution.mdx | 11 +++++------ 3 files changed, 8 insertions(+), 16 deletions(-) diff --git a/src/content/ccip/architecture.mdx b/src/content/ccip/architecture.mdx index afb09430420..e47ea60b525 100644 --- a/src/content/ccip/architecture.mdx +++ b/src/content/ccip/architecture.mdx @@ -213,4 +213,4 @@ Any proposal must either (1) be proposed by a dedicated ManyChainMultiSig (MCMS) Any onchain update that passes the timelock review period without a veto becomes executable by anyone, which can be done by running a [timelock-worker](https://github.com/smartcontractkit/timelock-worker) to process executable upgrades. -[Documentation](https://github.com/smartcontractkit/ccip-owner-contracts/blob/main/README.md) and [source code](https://github.com/smartcontractkit/ccip-owner-contracts/blob/440fb434c617fa95dc2fe21adb32adb3a47aba8d/src/ManyChainMultiSig.sol) relating to the CCIP owner contracts can be read on GitHub. The proposer multisig on Ethereum can be found on [Etherscan](https://etherscan.io/address/0xE53289F32c8E690b7173aA33affE9B6B0CB0012F#readContract), where configuration details can also be read. +[Documentation](https://github.com/smartcontractkit/ccip-owner-contracts/blob/main/README.md) and [source code](https://github.com/smartcontractkit/ccip-owner-contracts/blob/main/src/ManyChainMultiSig.sol) relating to the CCIP owner contracts can be read on GitHub. The proposer multisig on Ethereum can be found on [Etherscan](https://etherscan.io/address/0xE53289F32c8E690b7173aA33affE9B6B0CB0012F#readContract), where configuration details can also be read. diff --git a/src/content/ccip/concepts/index.mdx b/src/content/ccip/concepts/index.mdx index 3716e31f593..f95b179d27e 100644 --- a/src/content/ccip/concepts/index.mdx +++ b/src/content/ccip/concepts/index.mdx @@ -54,15 +54,10 @@ Chainlink Decentralized Oracle Networks, or **DONs**, run [Chainlink OCR2](/arch -The Risk Management Network is built using offchain and onchain components: - -- **[Offchain](#offchain-risk-management-node):** Several Risk Management nodes continually monitor all supported chains against abnormal activities -- **[onchain](#onchain-risk-management-contract):** One Risk Management contract per supported CCIP chain +The Risk Management Network is built using offchain and onchain components. ### Offchain Risk Management node - - The Risk Management Network is a secondary validation service parallel to the primary CCIP system. It doesn't run the same codebase as the [DON](#decentralized-oracle-network-don) to mitigate against security vulnerabilities that might affect the DON's codebase. The Risk Management Network has two main modes of operation: @@ -76,8 +71,6 @@ The Risk Management Network has two main modes of operation: ### Onchain Risk Management contract - - There is one Risk Management contract for each supported destination chain. The Risk Management contract maintains a group of nodes authorized to participate in the Risk Management blessing/cursing. Each Risk Management node has five components: @@ -93,4 +86,4 @@ The contract also maintains two thresholds to determine the quorum for blessing - **Blessing voting procedure:** every time a Risk Management node blesses a Merkle root, the Risk Management contract adds the blessing weight for that node. If the sum of the weights of votes to bless exceeds the blessing threshold, the Risk Management contract considers the contract _blessed_. - **Cursing voting procedure:** a Risk Management node that sends a vote to curse assigns the vote a random 32-byte ID. The node may have multiple active votes to curse at any time. However, if there is at least one active cursing vote, the Risk Management contract considers the node to have voted to curse. The Risk Management contract adds the cursing weight for that node. If the sum of the weights of votes to curse exceeds the curse threshold, the Risk Management contract considers the contract _cursed_. -If the Risk Management contract is cursed, then the owner of the original contract must resolve any underlying issues the original contract might have. If the owner is satisfied that these issues have been resolved, they can revoke the cursing on behalf of Risk Management nodes. +When the RMN contract is cursed, only the [CCIP owner](https://github.com/smartcontractkit/ccip-owner-contracts/blob/main/src/ManyChainMultiSig.sol) of the RMN contract can interact with it. Once the root cause of the curse has been identified and the issue addressed, this owner has the ability to unvote the curse on behalf of the RMN nodes. Once enough active votes to curse are inactivated the curse is lifted; in this case the sum of weights of RMN nodes with active votes to curse must drop below the curse threshold. diff --git a/src/features/ccip/RMNCaution.mdx b/src/features/ccip/RMNCaution.mdx index 9450d9ea38b..2bec9000a54 100644 --- a/src/features/ccip/RMNCaution.mdx +++ b/src/features/ccip/RMNCaution.mdx @@ -1,10 +1,9 @@ import { Aside } from "@components" From 623bc4127f07eedde4b45253df0243c4b4632829 Mon Sep 17 00:00:00 2001 From: Simone Cuomo Date: Tue, 15 Oct 2024 14:24:45 +0100 Subject: [PATCH 02/87] Header transparency (#2125) - [x] Change opacity to 80% in both navbar - [x] Add transparency to Docs Navbar - [x] Add blur to both navbar Co-authored-by: Karim H. <98668332+khadni@users.noreply.github.com> --- .../DocsNavigationDesktop/docsNavigationDesktop.module.css | 4 +++- .../DocsNavigationMobile/docsNavigationMobile.module.css | 4 +++- src/components/Header/Nav/navBar.module.css | 6 +++--- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/components/DocsNavigation/DocsNavigationDesktop/docsNavigationDesktop.module.css b/src/components/DocsNavigation/DocsNavigationDesktop/docsNavigationDesktop.module.css index 1f3b48d1f38..316af69e1a8 100644 --- a/src/components/DocsNavigation/DocsNavigationDesktop/docsNavigationDesktop.module.css +++ b/src/components/DocsNavigation/DocsNavigationDesktop/docsNavigationDesktop.module.css @@ -2,13 +2,15 @@ display: none; position: sticky; top: var(--space-16x); - background-color: var(--gray-100); + background: rgba(250, 250, 251, 0.8); padding-top: var(--space-4x); padding-bottom: var(--space-4x); box-shadow: var(--space-0x) var(--space-1x) var(--space-3x) var(--space-0x) #0000000f; border-bottom: 1px solid #ecedef; z-index: 5; transition: top 0.5s ease; + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); } .hidden { diff --git a/src/components/DocsNavigation/DocsNavigationMobile/docsNavigationMobile.module.css b/src/components/DocsNavigation/DocsNavigationMobile/docsNavigationMobile.module.css index 4f06bd9e597..fb7e4e13ac6 100644 --- a/src/components/DocsNavigation/DocsNavigationMobile/docsNavigationMobile.module.css +++ b/src/components/DocsNavigation/DocsNavigationMobile/docsNavigationMobile.module.css @@ -1,13 +1,15 @@ .nav { position: sticky; top: var(--space-16x); - background-color: var(--gray-100); + background: rgba(250, 250, 251, 0.8); padding-top: var(--space-4x); padding-bottom: var(--space-4x); box-shadow: var(--space-0x) var(--space-1x) var(--space-3x) var(--space-0x) #0000000f; border-bottom: 1px solid #ecedef; z-index: 8; transition: top 0.5s ease; + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); } .hidden { diff --git a/src/components/Header/Nav/navBar.module.css b/src/components/Header/Nav/navBar.module.css index 7301fa35570..ac628ba30ab 100644 --- a/src/components/Header/Nav/navBar.module.css +++ b/src/components/Header/Nav/navBar.module.css @@ -8,11 +8,11 @@ .navBar { position: fixed; width: 100%; - background: rgba(255, 255, 255, 0.65); + background: rgba(255, 255, 255, 0.8); box-shadow: 0px 4px 12px 0px rgba(0, 0, 0, 0.06); border-bottom: 1px solid #ecedef; - backdrop-filter: blur(8px); - -webkit-backdrop-filter: blur(8px); + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); transition: transform 0.3s ease-in-out; } From bf1ce576ed2989dc691b3f8b36c2527c9e2dc89f Mon Sep 17 00:00:00 2001 From: Simone Cuomo Date: Wed, 16 Oct 2024 08:45:48 +0100 Subject: [PATCH 03/87] Add search on mobile (#2126) * Add search on mobile * Add Language selector * Fix build error --- src/components/Header/Nav/navBar.module.css | 7 +------ src/components/Header/aiSearch/Search.tsx | 4 ++-- .../Header/aiSearch/SearchButton.tsx | 21 ++++++++++--------- .../Header/aiSearch/searchButton.module.css | 6 ++++-- 4 files changed, 18 insertions(+), 20 deletions(-) diff --git a/src/components/Header/Nav/navBar.module.css b/src/components/Header/Nav/navBar.module.css index ac628ba30ab..a6d43dba0f5 100644 --- a/src/components/Header/Nav/navBar.module.css +++ b/src/components/Header/Nav/navBar.module.css @@ -54,8 +54,8 @@ } .rightSection { - flex-direction: row-reverse; gap: var(--space-2x); + flex-direction: row; } :is(.button, .iconButton) { @@ -241,7 +241,6 @@ } .rightSection { - flex-direction: row; justify-content: flex-end; } @@ -301,10 +300,6 @@ justify-content: flex-end; } - .searchTrigger { - display: none; - } - .weglotContainer { margin-right: 0; } diff --git a/src/components/Header/aiSearch/Search.tsx b/src/components/Header/aiSearch/Search.tsx index f17c6fd2d68..6fc49bbe298 100644 --- a/src/components/Header/aiSearch/Search.tsx +++ b/src/components/Header/aiSearch/Search.tsx @@ -1,10 +1,10 @@ import { SearchButton } from "./SearchButton" import { SearchModal } from "./SearchModal" -export const Search = ({ variant = "default" }: { variant?: "default" | "mobile" }) => { +export const Search = () => { return ( <> - + ) diff --git a/src/components/Header/aiSearch/SearchButton.tsx b/src/components/Header/aiSearch/SearchButton.tsx index e78cf180321..295854828fc 100644 --- a/src/components/Header/aiSearch/SearchButton.tsx +++ b/src/components/Header/aiSearch/SearchButton.tsx @@ -3,21 +3,22 @@ import styles from "./searchButton.module.css" import { useEffect, useState } from "react" import SearchIcon from "../../QuickLinks/assets/search-icon.svg" -export const SearchButton = ({ variant }: { variant: "default" | "mobile" }) => { +export const SearchButton = () => { const [isMac, setIsMac] = useState(false) useEffect(() => { const checkIsMac = typeof navigator !== "undefined" ? navigator.userAgent.toUpperCase().indexOf("MAC") >= 0 : false setIsMac(checkIsMac) }, []) - return variant === "default" ? ( - - ) : ( - + return ( + <> + + + ) } diff --git a/src/components/Header/aiSearch/searchButton.module.css b/src/components/Header/aiSearch/searchButton.module.css index a433d7436d6..996bbd530ee 100644 --- a/src/components/Header/aiSearch/searchButton.module.css +++ b/src/components/Header/aiSearch/searchButton.module.css @@ -1,8 +1,7 @@ .default { - display: flex; + display: none; align-items: center; padding: var(--space-2x); - border: 1px solid rgba(255, 255, 255, 0); border-radius: var(--space-1x); overflow: hidden; @@ -27,6 +26,9 @@ .mobile { display: none; } + .default { + display: flex; + } } @media screen and (min-width: 996px) { From 30f50ce8ce506def6f723badf5fa8ebef5e1f69e Mon Sep 17 00:00:00 2001 From: "Amine E." Date: Wed, 16 Oct 2024 16:10:47 +0200 Subject: [PATCH 04/87] clarify note (#2128) Co-authored-by: Karim H. <98668332+khadni@users.noreply.github.com> --- src/content/ccip/concepts/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/ccip/concepts/index.mdx b/src/content/ccip/concepts/index.mdx index f95b179d27e..394d1916228 100644 --- a/src/content/ccip/concepts/index.mdx +++ b/src/content/ccip/concepts/index.mdx @@ -63,7 +63,7 @@ The Risk Management Network has two main modes of operation: - **Blessing:** Each Risk Management node monitors all Merkle roots of messages committed on each destination chain. The Committing DON commits these Merkle roots. (More information on Merkle roots can be found on the [architecture page](/ccip/architecture)). The Risk Management node independently reconstructs the Merkle tree by fetching all messages on the source chain. Then, it checks for a match between the Merkle root committed by the Committing DON and the root of the reconstructed Merkle tree. If both Merkle roots match, the Risk Management node blesses the root to the Risk Management contract on the destination chain. The Risk Management contract tracks the votes. When a quorum is met, the Risk Management contract dubs the Merkle root **blessed**. -- **Cursing:** If a Risk Management node detects an anomaly, the Risk Management node will curse the CCIP system. After a quorum of votes has been met, the Risk Management contract dubs the CCIP system **cursed**. CCIP will automatically pause on that chain and wait until the contract owner assesses the situation before potentially lifting the curse. There are two cases where Risk Management nodes pause CCIP: +- **Cursing:** If a Risk Management node detects an anomaly, the Risk Management node will curse the CCIP system. Cursing is blockchain-specific and will only affect lanes going to and from the relevant blockchain. After a quorum of votes has been met, the Risk Management contract dubs the CCIP system **cursed**. CCIP will automatically pause on that chain and wait until the contract owner assesses the situation before potentially lifting the curse. There are two cases where Risk Management nodes pause CCIP: - **Finality violation:** A deep reorganization which violates the safety parameters set by the Risk Management configuration occurs on a CCIP chain. From 2d540dfe448fd485aac21b7c9fdf7a263b06f1ff Mon Sep 17 00:00:00 2001 From: Simone Cuomo Date: Fri, 18 Oct 2024 16:16:01 +0100 Subject: [PATCH 05/87] Add General icons (#2127) * Add General * Update General Icon * Update links as requested by Nav --------- Co-authored-by: Amine E. --- astro.config.ts | 4 +++ src/assets/product-logos/default-logo.svg | 11 +++++++ src/assets/product-logos/general-logo.svg | 13 ++------ src/assets/product-logos/node-logo.svg | 20 ++----------- src/assets/product-logos/quickstart-logo.svg | 12 ++------ .../DocsPickerDesktop.tsx | 3 +- .../DocsNavigationMobile/DocsPickerMobile.tsx | 3 +- src/components/Header/getNavigationProps.ts | 30 +++++++++++++------ src/pages/index.astro | 3 +- 9 files changed, 50 insertions(+), 49 deletions(-) create mode 100644 src/assets/product-logos/default-logo.svg diff --git a/astro.config.ts b/astro.config.ts index 6474b38b55b..aefe05cd456 100644 --- a/astro.config.ts +++ b/astro.config.ts @@ -11,6 +11,10 @@ import { RehypePlugins } from "@astrojs/markdown-remark" // https://astro.build/config export default defineConfig({ site: "https://docs.chain.link", + redirects: { + "/getting-started": "/getting-started/conceptual-overview", + "/resources": "/resources/link-token-contracts", + }, integrations: [ preact({ include: ["**/preact/*"], diff --git a/src/assets/product-logos/default-logo.svg b/src/assets/product-logos/default-logo.svg new file mode 100644 index 00000000000..1f7710d095b --- /dev/null +++ b/src/assets/product-logos/default-logo.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/product-logos/general-logo.svg b/src/assets/product-logos/general-logo.svg index 5e9aff345dd..aedcbb7bed2 100644 --- a/src/assets/product-logos/general-logo.svg +++ b/src/assets/product-logos/general-logo.svg @@ -1,11 +1,4 @@ - - - - - - - - - - + + + diff --git a/src/assets/product-logos/node-logo.svg b/src/assets/product-logos/node-logo.svg index 615d88095db..2ada527e5d4 100644 --- a/src/assets/product-logos/node-logo.svg +++ b/src/assets/product-logos/node-logo.svg @@ -1,19 +1,5 @@ - - - - - - - - - - - - - - - - - + + + diff --git a/src/assets/product-logos/quickstart-logo.svg b/src/assets/product-logos/quickstart-logo.svg index 67160818a5f..fdd10054c89 100644 --- a/src/assets/product-logos/quickstart-logo.svg +++ b/src/assets/product-logos/quickstart-logo.svg @@ -1,12 +1,4 @@ - - - - - - - - - - + + diff --git a/src/components/DocsNavigation/DocsNavigationDesktop/DocsPickerDesktop.tsx b/src/components/DocsNavigation/DocsNavigationDesktop/DocsPickerDesktop.tsx index 2fcc546e8c6..0723ea62325 100644 --- a/src/components/DocsNavigation/DocsNavigationDesktop/DocsPickerDesktop.tsx +++ b/src/components/DocsNavigation/DocsNavigationDesktop/DocsPickerDesktop.tsx @@ -3,6 +3,7 @@ import { isMatchedPath } from "../../Header/Nav/isMatchedPath" import { getNavigationProps } from "../../Header/getNavigationProps" import styles from "./docsPickerDesktop.module.css" import { clsx } from "../../Header/Nav/utils" +import defaultLogo from "../../../assets/product-logos/default-logo.svg" function DocsPickerDesktop({ pathname }: { pathname: string }) { const [productMenuOpen, setProductMenuOpen] = useState(false) @@ -10,7 +11,7 @@ function DocsPickerDesktop({ pathname }: { pathname: string }) { const subProductTrigger = subProductsNav?.find(({ href }) => isMatchedPath(pathname, href)) const label = subProductTrigger?.label || "Resources" - const icon = subProductTrigger?.label ? subProductTrigger.icon : undefined + const icon = subProductTrigger?.label ? subProductTrigger.icon : defaultLogo.src return (
isMatchedPath(path, href)) const label = subProductTrigger?.label || "Resources" - const icon = subProductTrigger?.label ? subProductTrigger.icon : undefined + const icon = subProductTrigger?.label ? subProductTrigger.icon : defaultLogo.src useEffect(() => { const foundSubProduct = productsNav.categories.find((category) => diff --git a/src/components/Header/getNavigationProps.ts b/src/components/Header/getNavigationProps.ts index 47f5fbb032b..4c3b660b7ba 100644 --- a/src/components/Header/getNavigationProps.ts +++ b/src/components/Header/getNavigationProps.ts @@ -97,13 +97,25 @@ const desktopSubProductsNav = [ icon: quickstartLogo.src, col: 2, }, - { label: "Documentation", href: "/", hideFromDropdown: true, col: 2, }, + { + label: "General", + href: "/getting-started", + icon: generalLogo.src, + col: 2, + }, + { + label: "General", + href: "/resources", + icon: generalLogo.src, + col: 2, + hideFromDropdown: true, + }, ] const docsSections = [ @@ -147,6 +159,12 @@ const docsSections = [ icon: automationLogo.src, subProducts: getSubProducts(sidebar.automation), }, + { + label: "Chainlink Local", + href: "/chainlink-local", + icon: chainlinkLocal.src, + subProducts: getSubProducts(sidebar.chainlinkLocal), + }, { label: "Nodes", href: "/chainlink-nodes", @@ -154,10 +172,9 @@ const docsSections = [ subProducts: getSubProducts(sidebar.nodeOperator), }, { - label: "Chainlink Local", - href: "/chainlink-local", + label: "Quickstarts", + href: "/quickstarts", icon: quickstartLogo.src, - subProducts: getSubProducts(sidebar.chainlinkLocal), }, { label: "General", @@ -165,11 +182,6 @@ const docsSections = [ icon: generalLogo.src, subProducts: getSubProducts(sidebar.global), }, - { - label: "Quickstarts", - href: "/quickstarts", - icon: quickstartLogo.src, - }, ], }, ] diff --git a/src/pages/index.astro b/src/pages/index.astro index 5a31cb17375..2a27d71c557 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -22,7 +22,8 @@ const formattedContentTitle = `${CONFIG.PAGE.titleFallback} | ${CONFIG.SITE.titl

Recommended reading

We think you'd love to explore

- LINK Token Contracts + General + Link Token Contracts Getting Started with CCIP CCIP Supported Networks Data Feed Addresses From 3ae3de6c7924e59f8917020c9c56636bec967e84 Mon Sep 17 00:00:00 2001 From: "Amine E." Date: Mon, 21 Oct 2024 14:20:52 +0200 Subject: [PATCH 06/87] update (#2129) --- .../data/ccip/v1_2_0/testnet/tokens.json | 36 +++++++------------ 1 file changed, 12 insertions(+), 24 deletions(-) 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 87c3ca0a332..02bb4dae09c 100644 --- a/src/config/data/ccip/v1_2_0/testnet/tokens.json +++ b/src/config/data/ccip/v1_2_0/testnet/tokens.json @@ -343,8 +343,7 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolAddress": "0x8a710bBd77661D168D5A6725bD2E514ba1bFf59d", - "poolType": "lockRelease", + "poolType": "feeTokenOnly", "symbol": "LINK", "tokenAddress": "0x84b9B910527Ad5C03A9Ca831909E21e236EA7b06" }, @@ -368,8 +367,7 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolAddress": "0x56Af7744a6807E57dfF179C38f4a4D51Ef3F8ba5", - "poolType": "burnMint", + "poolType": "feeTokenOnly", "symbol": "LINK", "tokenAddress": "0x9870D6a0e05F867EAAe696e106741843F7fD116D" }, @@ -385,8 +383,7 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolAddress": "0x4bd0699744E296de9Ce6763731421C66a51c4e62", - "poolType": "burnMint", + "poolType": "feeTokenOnly", "symbol": "LINK", "tokenAddress": "0xE4aB69C077896252FAFBD49EFD26B5D171A32410" }, @@ -394,8 +391,7 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolAddress": "0x77f2881b29145337B328263Cf673F4C340515e3f", - "poolType": "burnMint", + "poolType": "feeTokenOnly", "symbol": "LINK", "tokenAddress": "0x02c359ebf98fc8BF793F970F9B8302bb373BdF32" }, @@ -403,8 +399,7 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolAddress": "0xd83437e1085C5410B9a95018599738875C581F67", - "poolType": "burnMint", + "poolType": "feeTokenOnly", "symbol": "LINK", "tokenAddress": "0xa75cCA5b404ec6F4BB6EC4853D177FE7057085c8" }, @@ -420,8 +415,7 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolAddress": "0xcf2d724591CD42Ba79463152309667f3DBc1cEfB", - "poolType": "burnMint", + "poolType": "feeTokenOnly", "symbol": "LINK", "tokenAddress": "0x925a4bfE64AE2bFAC8a02b35F78e60C29743755d" }, @@ -429,8 +423,7 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolAddress": "0xBe582Db704Bd387222C70CA2E5A027E5E2c06fB7", - "poolType": "burnMint", + "poolType": "feeTokenOnly", "symbol": "LINK", "tokenAddress": "0xE4aB69C077896252FAFBD49EFD26B5D171A32410" }, @@ -462,8 +455,7 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolAddress": "0x86d1fED29fD3276B2413b2bE5f074581B0176b8a", - "poolType": "burnMint", + "poolType": "feeTokenOnly", "symbol": "LINK", "tokenAddress": "0x3580c7A817cCD41f7e02143BFa411D4EeAE78093" }, @@ -471,8 +463,7 @@ "allowListEnabled": false, "decimals": 18, "name": "ChainLink Token", - "poolAddress": "0x8c234b05c20Df23be8Df66aed3dC78d890717a1a", - "poolType": "burnMint", + "poolType": "feeTokenOnly", "symbol": "LINK", "tokenAddress": "0xDCA67FD8324990792C0bfaE95903B8A64097754F" } @@ -578,8 +569,7 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolAddress": "0x9B377f172a5D033534592e5F854B69F0811953C4", - "poolType": "lockRelease", + "poolType": "feeTokenOnly", "symbol": "WETH", "tokenAddress": "0x097D90c9d3E0B50Ca60e1ae45F6A81010f9FB534" }, @@ -587,8 +577,7 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolAddress": "0xc49ec0eB4beb48B8Da4cceC51AA9A5bD0D0A4c43", - "poolType": "lockRelease", + "poolType": "feeTokenOnly", "symbol": "WETH", "tokenAddress": "0xE591bf0A0CF924A0674d7792db046B23CEbF5f34" }, @@ -636,8 +625,7 @@ "allowListEnabled": false, "decimals": 18, "name": "Wrapped Ether", - "poolAddress": "0xaC33433c624CbDEE4d0dC3ee2Bb5C62463625827", - "poolType": "lockRelease", + "poolType": "feeTokenOnly", "symbol": "WETH", "tokenAddress": "0x4200000000000000000000000000000000000006" }, From aa0bc2aaea5d612937b93919c75a6c55c51ddce3 Mon Sep 17 00:00:00 2001 From: "Amine E." Date: Tue, 22 Oct 2024 14:25:43 +0200 Subject: [PATCH 07/87] ccip usdm (#2132) * update * update --- .../data/ccip/v1_2_0/mainnet/lanes.json | 280 ++++++++++++++++++ .../data/ccip/v1_2_0/mainnet/tokens.json | 47 +++ 2 files changed, 327 insertions(+) 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 458d39e07c0..b5ce9df5ab4 100644 --- a/src/config/data/ccip/v1_2_0/mainnet/lanes.json +++ b/src/config/data/ccip/v1_2_0/mainnet/lanes.json @@ -2074,6 +2074,20 @@ } } }, + "USDM": { + "rateLimiterConfig": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, "WETH": { "rateLimiterConfig": { "in": { @@ -2308,6 +2322,20 @@ } } }, + "USDM": { + "rateLimiterConfig": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, "WETH": { "rateLimiterConfig": { "in": { @@ -2874,6 +2902,20 @@ } } }, + "USDM": { + "rateLimiterConfig": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, "WECO": { "rateLimiterConfig": { "in": { @@ -3088,6 +3130,20 @@ } } }, + "USDM": { + "rateLimiterConfig": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, "WECO": { "rateLimiterConfig": { "in": { @@ -3612,6 +3668,20 @@ } } }, + "USDM": { + "rateLimiterConfig": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, "WETH": { "rateLimiterConfig": { "in": { @@ -3862,6 +3932,20 @@ } } }, + "USDM": { + "rateLimiterConfig": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, "WETH": { "rateLimiterConfig": { "in": { @@ -4258,6 +4342,20 @@ } } }, + "USDM": { + "rateLimiterConfig": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, "WETH": { "rateLimiterConfig": { "in": { @@ -4415,6 +4513,20 @@ "rate": "0" } } + }, + "USDM": { + "rateLimiterConfig": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } } } }, @@ -4981,6 +5093,20 @@ } } }, + "USDM": { + "rateLimiterConfig": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, "WETH": { "rateLimiterConfig": { "in": { @@ -5111,6 +5237,20 @@ } } }, + "USDM": { + "rateLimiterConfig": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, "WETH": { "rateLimiterConfig": { "in": { @@ -5315,6 +5455,20 @@ } } }, + "USDM": { + "rateLimiterConfig": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, "WETH": { "rateLimiterConfig": { "in": { @@ -5416,6 +5570,20 @@ "rate": "0" } } + }, + "USDM": { + "rateLimiterConfig": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } } } }, @@ -6459,6 +6627,20 @@ } } }, + "USDM": { + "rateLimiterConfig": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, "WETH": { "rateLimiterConfig": { "in": { @@ -6911,6 +7093,20 @@ } } }, + "USDM": { + "rateLimiterConfig": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, "WETH": { "rateLimiterConfig": { "in": { @@ -7234,6 +7430,20 @@ } } }, + "USDM": { + "rateLimiterConfig": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, "WETH": { "rateLimiterConfig": { "in": { @@ -7492,6 +7702,20 @@ } } }, + "USDM": { + "rateLimiterConfig": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, "WECO": { "rateLimiterConfig": { "in": { @@ -7864,6 +8088,20 @@ } } }, + "USDM": { + "rateLimiterConfig": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, "WECO": { "rateLimiterConfig": { "in": { @@ -7937,6 +8175,20 @@ "rate": "0" } } + }, + "USDM": { + "rateLimiterConfig": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } } } }, @@ -7969,6 +8221,20 @@ "rate": "0" } } + }, + "USDM": { + "rateLimiterConfig": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } } } }, @@ -8114,6 +8380,20 @@ } } }, + "USDM": { + "rateLimiterConfig": { + "in": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + }, + "out": { + "capacity": "1000000000000000000000000", + "isEnabled": true, + "rate": "11600000000000000000" + } + } + }, "WECO": { "rateLimiterConfig": { "in": { diff --git a/src/config/data/ccip/v1_2_0/mainnet/tokens.json b/src/config/data/ccip/v1_2_0/mainnet/tokens.json index 537760f881e..09cf6c72276 100644 --- a/src/config/data/ccip/v1_2_0/mainnet/tokens.json +++ b/src/config/data/ccip/v1_2_0/mainnet/tokens.json @@ -1728,6 +1728,53 @@ "tokenAddress": "0xa7a0B3Fe94121E366D774d60D075F6386F750884" } }, + "USDM": { + "ethereum-mainnet-arbitrum-1": { + "allowListEnabled": false, + "decimals": 18, + "name": "Mountain Protocol USD", + "poolAddress": "0xc40De73D8F4C53d1788E3e584e87f326BFAF367e", + "poolType": "burnMint", + "symbol": "USDM", + "tokenAddress": "0x59D9356E565Ab3A36dD77763Fc0d87fEaf85508C" + }, + "ethereum-mainnet-base-1": { + "allowListEnabled": false, + "decimals": 18, + "name": "Mountain Protocol USD", + "poolAddress": "0x20dD6B66E0453b5f3C7cB2Fd008370cAc24041a7", + "poolType": "burnMint", + "symbol": "USDM", + "tokenAddress": "0x59D9356E565Ab3A36dD77763Fc0d87fEaf85508C" + }, + "ethereum-mainnet-optimism-1": { + "allowListEnabled": false, + "decimals": 18, + "name": "Mountain Protocol USD", + "poolAddress": "0x00c8af57A18eb97Df446fA12E051C63274025010", + "poolType": "burnMint", + "symbol": "USDM", + "tokenAddress": "0x59D9356E565Ab3A36dD77763Fc0d87fEaf85508C" + }, + "mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "Mountain Protocol USD", + "poolAddress": "0x66D40E0D2819a2264B2a61f5DD578573B9dedCEc", + "poolType": "burnMint", + "symbol": "USDM", + "tokenAddress": "0x59D9356E565Ab3A36dD77763Fc0d87fEaf85508C" + }, + "matic-mainnet": { + "allowListEnabled": false, + "decimals": 18, + "name": "Mountain Protocol USD", + "poolAddress": "0x4d364f63c044A646BFbFB204Fa37a813105096E7", + "poolType": "burnMint", + "symbol": "USDM", + "tokenAddress": "0x59D9356E565Ab3A36dD77763Fc0d87fEaf85508C" + } + }, "WAVAX": { "avalanche-mainnet": { "allowListEnabled": false, From 779fa1899e0eb62653380c8f69e807723a95e919 Mon Sep 17 00:00:00 2001 From: Crystal Gomes Date: Tue, 22 Oct 2024 08:51:24 -0400 Subject: [PATCH 08/87] EOA clarification (#2130) --- src/content/vrf/v2-5/overview/direct-funding.mdx | 14 +++++++++----- src/content/vrf/v2-5/overview/subscription.mdx | 15 ++++++++------- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/content/vrf/v2-5/overview/direct-funding.mdx b/src/content/vrf/v2-5/overview/direct-funding.mdx index 1944707a577..327c3a8a82c 100644 --- a/src/content/vrf/v2-5/overview/direct-funding.mdx +++ b/src/content/vrf/v2-5/overview/direct-funding.mdx @@ -31,17 +31,21 @@ Requests to Chainlink VRF v2.5 follow the request and receive data cycle similar -Two types of accounts exist in the Ethereum ecosystem, and both are used in VRF: - -- EOA (Externally Owned Account): An externally owned account that has a private key and can control a smart contract. Transactions can be initiated only by EOAs. -- Smart contract: A smart contract that does not have a private key and executes what it has been designed for as a decentralized application. - The Chainlink VRF v2.5 solution uses both offchain and onchain components: - [VRF v2.5 Wrapper (onchain component)](https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.8/vrf/dev/VRFV2PlusWrapper.sol): A wrapper for the VRF Coordinator that provides an interface for consuming contracts. - [VRF v2.5 Coordinator (onchain component)](https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.8/vrf/dev/VRFCoordinatorV2_5.sol): A contract designed to interact with the VRF service. It emits an event when a request for randomness is made, and then verifies the random number and proof of how it was generated by the VRF service. - VRF service (offchain component): Listens for requests by subscribing to the VRF Coordinator event logs and calculates a random number based on the block hash and nonce. The VRF service then sends a transaction to the `VRFCoordinator` including the random number and a proof of how it was generated. +### Account types used in VRF + +Two types of accounts exist in the Ethereum ecosystem, and both are used in VRF: + +- EOA (Externally Owned Account): An externally owned account that has a private key and can control a smart contract. Transactions can be initiated only by EOAs. +- Smart contract: A smart contract that does not have a private key and executes what it has been designed for as a decentralized application. + +While only EOAs can initiate transactions, do not attempt to use EOAs to send VRF requests directly. Instead, your EOA should interact with your consuming contract: the smart contract that is consuming the random values you request from VRF. Your EOA initiates the transaction, and then your consuming contract interacts with the VRF Wrapper contract, which sends the VRF request. + ### Set up your contract and request Set up your consuming contract: diff --git a/src/content/vrf/v2-5/overview/subscription.mdx b/src/content/vrf/v2-5/overview/subscription.mdx index 31b8dc41537..43b2ca5a8b4 100644 --- a/src/content/vrf/v2-5/overview/subscription.mdx +++ b/src/content/vrf/v2-5/overview/subscription.mdx @@ -54,18 +54,19 @@ Requests to Chainlink VRF v2.5 follow the request and receive data cycle similar - - -VRF v2.5 uses both offchain and onchain components: - -- [VRF v2.5 Coordinator (onchain component)](https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.8/vrf/dev/VRFCoordinatorV2_5.sol): A contract designed to interact with the VRF service. It emits an event when a request for randomness is made, and then verifies the random number and proof of how it was generated by the VRF service. -- VRF service (offchain component): Listens for requests by subscribing to the VRF Coordinator event logs and calculates a random number based on the block hash and nonce. The VRF service then sends a transaction to the `VRFCoordinator` including the random number and a proof of how it was generated. +While only EOAs can initiate transactions, do **not** attempt to use EOAs to send VRF requests directly. Instead, your EOA should interact with your consuming contract: the smart contract that is consuming the random values you request from VRF. Your EOA initiates the transaction, and then your consuming contract sends the VRF request. ### Set up your contract and request From 33f39960cede944d04e8ff96b3e76ecb8f620cac Mon Sep 17 00:00:00 2001 From: "Amine E." Date: Tue, 22 Oct 2024 19:31:54 +0200 Subject: [PATCH 09/87] soneium minato (#2133) * Merge doc main (#237) * Fix shadow on navigation (#2100) * Fix shadow on navigation * Align inner page with new navigation width --------- Co-authored-by: Crystal Gomes Co-authored-by: Karim H. <98668332+khadni@users.noreply.github.com> * Adjust VRF Sepolia lane and CLA deprecation notice (#2103) * CCIP 1.5 (#2104) * rel2 update * rel2 update * rel2 update * fix * OoO * fix * nit * nit * update page * update page * update page * update page * update * update * update * update * update * update * update * Fund amounts & nit changes --------- Co-authored-by: Karim <98668332+khadni@users.noreply.github.com> * Add gas spikes note (#2105) * Add gas spikes note * Remove printscreen * Add shorter inline explanation and adjust gas spike insert --------- Co-authored-by: Crystal Gomes * update (#2110) * update (#2108) * new integration (#2111) * linea testnet * linea testnet * linea * linea * linea * linea * linea * scroll (#2114) * update * update * update * remove kroma testnet * put kroma * update * update * empty * add Scroll ccip to QL (#2115) * nit (#2116) * nit (#2117) * rmn status (#2118) * rmn status * rmn status * rmn status * update * update * add issuer por field (#2119) --------- Co-authored-by: Simone Cuomo Co-authored-by: Crystal Gomes Co-authored-by: Amine E. * Revert "Merge doc main (#237)" This reverts commit 8a9db7a7ee1dec4be9ecb61a8053aea446daa033. * update (#2129) (#244) * Soneium Minato - Streams * Changelog - Streams * Add VRF 2.5 * update release date * add base, soneium VRF to quicklinks * CCIP Soneium Minato * add rpc provider * Add Functions; release notes for VRF and Functions * functions quicklink * Typo fix * Adjustment on VRF table --------- Co-authored-by: Karim H. <98668332+khadni@users.noreply.github.com> Co-authored-by: Simone Cuomo Co-authored-by: Crystal Gomes --- public/changelog.json | 45 +++++++++++ .../QuickLinks/data/productChainLinks.ts | 4 + .../data/ccip/v1_2_0/testnet/chains.json | 20 +++++ .../data/ccip/v1_2_0/testnet/lanes.json | 26 +++++++ .../data/ccip/v1_2_0/testnet/tokens.json | 16 ++++ src/config/data/chain-to-technology.json | 2 +- src/config/data/chains.json | 4 +- src/config/types.ts | 2 + src/config/web3Providers.ts | 1 + .../supported-networks.mdx | 23 ++++++ src/content/vrf/v2-5/supported-networks.mdx | 39 ++++++++++ src/features/feeds/components/Tables.tsx | 74 +++++++++++-------- src/features/utils/index.ts | 4 + 13 files changed, 227 insertions(+), 33 deletions(-) diff --git a/public/changelog.json b/public/changelog.json index 18992787fb5..7385fa4098e 100644 --- a/public/changelog.json +++ b/public/changelog.json @@ -1,4 +1,49 @@ [ + { + "category": "integration", + "changes": [], + "date": "2024-10-22", + "description": "Chainlink Functions is available on Soneium Minato testnet. Visit the [Supported Networks](https://docs.chain.link/chainlink-functions/supported-networks#soneium-minato-testnet) page for more information.", + "relatedNetworks": ["soneium"], + "relatedTokens": [], + "title": "Functions on Soneium Minato", + "topic": "functions", + "urls": [] + }, + { + "category": "integration", + "changes": [], + "date": "2024-10-22", + "description": "Chainlink VRF 2.5 is available on Soneium Minato testnet. Visit the [Supported Networks](https://docs.chain.link/vrf/v2-5/supported-networks#soneium-minato-testnet) page for more information.", + "relatedNetworks": ["soneium"], + "relatedTokens": [], + "title": "VRF 2.5 on Soneium Minato", + "topic": "vrf", + "urls": [] + }, + { + "category": "integration", + "changes": [], + "date": "2024-10-22", + "description": "Chainlink CCIP is available on Soneium Minato testnet. Visit the [Supported Networks](https://docs.chain.link/ccip/supported-networks/v1_2_0/testnet) page for more information.", + "relatedNetworks": ["soneium"], + "relatedTokens": [], + "title": "CCIP on Soneium Minato", + "topic": "ccip", + "urls": [] + }, + { + "category": "integration", + "changes": [], + "date": "2024-10-22", + "description": "Chainlink Data Streams is available in Early Access on Soneium Minato. The verifier proxy address and feed IDs are available on the [Data Streams Feed IDs](https://docs.chain.link/data-streams/stream-ids) page.", + "relatedNetworks": ["soneium"], + "relatedTokens": [], + "title": "Data Streams on Soneium Minato", + "topic": "data", + "subTopic": "data-streams", + "urls": [] + }, { "category": "release", "changes": [], diff --git a/src/components/QuickLinks/data/productChainLinks.ts b/src/components/QuickLinks/data/productChainLinks.ts index 28b02399234..8d7b61aaaa8 100644 --- a/src/components/QuickLinks/data/productChainLinks.ts +++ b/src/components/QuickLinks/data/productChainLinks.ts @@ -37,6 +37,7 @@ export const productChainLinks: ProductChainLinks = { zksync: "/ccip/supported-networks/v1_2_0/mainnet#zksync-mainnet", linea: "/ccip/supported-networks/v1_2_0/mainnet#linea-mainnet", scroll: "/ccip/supported-networks/v1_2_0/mainnet#scroll-mainnet", + soneium: "/ccip/supported-networks/v1_2_0/testnet#soneium-minato-ethereum-sepolia", }, }, "Data Feeds": { @@ -84,6 +85,7 @@ export const productChainLinks: ProductChainLinks = { ethereum: "/chainlink-functions/supported-networks#ethereum", optimism: "/chainlink-functions/supported-networks#optimism", polygon: "/chainlink-functions/supported-networks#polygon", + soneium: "/chainlink-functions/supported-networks#soneium", }, }, Automation: { @@ -111,6 +113,8 @@ export const productChainLinks: ProductChainLinks = { ethereum: "/vrf/v2-5/supported-networks#ethereum-mainnet", fantom: "/vrf/v2/subscription/supported-networks#fantom-mainnet", polygon: "/vrf/v2-5/supported-networks#polygon-mainnet", + base: "/vrf/v2-5/supported-networks#base-mainnet", + soneium: "/vrf/v2-5/supported-networks#soneium-minato-testnet", }, }, linkTokenContracts: { 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 cdedfd98af9..34e465c49b7 100644 --- a/src/config/data/ccip/v1_2_0/testnet/chains.json +++ b/src/config/data/ccip/v1_2_0/testnet/chains.json @@ -259,6 +259,26 @@ "version": "1.5.0" } }, + "ethereum-testnet-sepolia-soneium-1": { + "armProxy": { + "address": "0x6172F4f60eEE3876cF83318DEe4477BfAf15Ffd3", + "version": "1.5.0" + }, + "chainSelector": "686603546605904534", + "feeTokens": ["LINK", "WETH"], + "registryModule": { + "address": "0xe06fE3AEfef3a27b8BF0edd5ae834B006EdE3aa1", + "version": "1.5.0" + }, + "router": { + "address": "0x443a1bce545d56E2c3f20ED32eA588395FFce0f4", + "version": "1.2.0" + }, + "tokenAdminRegistry": { + "address": "0xD2334a6f4f79CE462193EAcB89eB2c29Ae552750", + "version": "1.5.0" + } + }, "ethereum-testnet-sepolia-zksync-1": { "armProxy": { "address": "0x3DA20FD3D8a8f8c1f1A5fD03648147143608C467", 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 562b743dea9..8fce522f8a3 100644 --- a/src/config/data/ccip/v1_2_0/testnet/lanes.json +++ b/src/config/data/ccip/v1_2_0/testnet/lanes.json @@ -1236,6 +1236,18 @@ } } }, + "ethereum-testnet-sepolia-soneium-1": { + "offRamp": { + "address": "0x2F55dE157D54bD22b1BcDC10Ce4EFC16d83DB57e", + "version": "1.5.0" + }, + "onRamp": { + "address": "0xb60d22A482a01482A8E3AFE35c99E99286B2F830", + "enforceOutOfOrder": false, + "version": "1.5.0" + }, + "rmnPermeable": false + }, "ethereum-testnet-sepolia-zksync-1": { "offRamp": { "address": "0x9f5dC467A5c97068A1c2987486B8b768275627eD", @@ -2789,6 +2801,20 @@ } } }, + "ethereum-testnet-sepolia-soneium-1": { + "ethereum-testnet-sepolia": { + "offRamp": { + "address": "0xBa01c99248b785307FDD23DB18FA4D25dA249DE2", + "version": "1.5.0" + }, + "onRamp": { + "address": "0xAD4d2015c1AD8bFe8B81Ca9Ff1Ba701141E3e2CC", + "enforceOutOfOrder": false, + "version": "1.5.0" + }, + "rmnPermeable": false + } + }, "ethereum-testnet-sepolia-zksync-1": { "ethereum-testnet-sepolia": { "offRamp": { diff --git a/src/config/data/ccip/v1_2_0/testnet/tokens.json b/src/config/data/ccip/v1_2_0/testnet/tokens.json index 02bb4dae09c..bc5c25e3910 100644 --- a/src/config/data/ccip/v1_2_0/testnet/tokens.json +++ b/src/config/data/ccip/v1_2_0/testnet/tokens.json @@ -435,6 +435,14 @@ "symbol": "LINK", "tokenAddress": "0x231d45b53C905c3d6201318156BDC725c9c3B9B1" }, + "ethereum-testnet-sepolia-soneium-1": { + "allowListEnabled": false, + "decimals": 18, + "name": "ChainLink Token", + "poolType": "feeTokenOnly", + "symbol": "LINK", + "tokenAddress": "0x7ea13478Ea3961A0e8b538cb05a9DF0477c79Cd2" + }, "ethereum-testnet-sepolia-zksync-1": { "allowListEnabled": false, "decimals": 18, @@ -637,6 +645,14 @@ "symbol": "WETH", "tokenAddress": "0x5300000000000000000000000000000000000004" }, + "ethereum-testnet-sepolia-soneium-1": { + "allowListEnabled": false, + "decimals": 18, + "name": "Wrapped Ether", + "poolType": "feeTokenOnly", + "symbol": "WETH", + "tokenAddress": "0x4200000000000000000000000000000000000006" + }, "ethereum-testnet-sepolia-zksync-1": { "allowListEnabled": false, "decimals": 18, diff --git a/src/config/data/chain-to-technology.json b/src/config/data/chain-to-technology.json index deb3999455f..998992e0788 100644 --- a/src/config/data/chain-to-technology.json +++ b/src/config/data/chain-to-technology.json @@ -39,5 +39,5 @@ "MODE_SEPOLIA": "MODE", "BLAST_MAINNET": "BLAST", "BLAST_SEPOLIA": "BLAST", - "SONEIUM_SEPOLIA": "SONEIUM" + "SONEIUM_MINATO": "SONEIUM" } diff --git a/src/config/data/chains.json b/src/config/data/chains.json index 30deda8c655..1806ed49a84 100644 --- a/src/config/data/chains.json +++ b/src/config/data/chains.json @@ -531,10 +531,10 @@ "title": "Soneium", "icon": "/assets/chains/soneium.svg", "chains": { - "SONEIUM_SEPOLIA": { + "SONEIUM_MINATO": { "chainId": 1946, "title": "Soneium Minato testnet", - "explorer": "https://explorer-testnet.soneium.org/", + "explorer": "https://explorer-testnet.soneium.org", "nativeCurrency": { "name": "Ether", "symbol": "ETH", diff --git a/src/config/types.ts b/src/config/types.ts index d10f3569f19..e96f291360e 100644 --- a/src/config/types.ts +++ b/src/config/types.ts @@ -20,6 +20,7 @@ export type SupportedTechnology = | "KROMA" | "MODE" | "ZKSYNC" + | "SONEIUM" export type SupportedChain = | "ETHEREUM_MAINNET" @@ -62,6 +63,7 @@ export type SupportedChain = | "KROMA_SEPOLIA" | "MODE_MAINNET" | "MODE_SEPOLIA" + | "SONEIUM_MINATO" export type Chains = Record< SupportedTechnology, diff --git a/src/config/web3Providers.ts b/src/config/web3Providers.ts index c7609f6c78b..f83ee6a0ad3 100644 --- a/src/config/web3Providers.ts +++ b/src/config/web3Providers.ts @@ -44,4 +44,5 @@ export const chainToProvider: Record providers.Provider> = MODE_SEPOLIA: () => new providers.JsonRpcProvider("https://sepolia.mode.network"), BLAST_MAINNET: () => new providers.JsonRpcProvider("https://rpc.blast.io"), BLAST_SEPOLIA: () => new providers.JsonRpcProvider("https://sepolia.blast.io"), + SONEIUM_MINATO: () => new providers.JsonRpcProvider(" https://rpc.minato.soneium.org/"), } diff --git a/src/content/chainlink-functions/supported-networks.mdx b/src/content/chainlink-functions/supported-networks.mdx index e1881cfec7c..eca3df72b8b 100644 --- a/src/content/chainlink-functions/supported-networks.mdx +++ b/src/content/chainlink-functions/supported-networks.mdx @@ -224,3 +224,26 @@ Read the [LINK Token Contracts](/resources/link-token-contracts) page to learn w | Request threshold (withdrawing funds) | 10 requests | | Cancellation fees (withdrawing funds) | 2 LINK | | Minimum balance for uploading encrypted secrets | 2 LINK | + +## Soneium + + + +### Soneium Minato testnet + +| Item | Value | +| ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Functions router |
| +| | / | +| Encrypted secrets upload endpoints |
| + +| Billing Item | Value | +| ------------------------------------------------ | ------------- | +| Premium fees (converted to LINK at request time) | 320 cents USD | +| Request threshold (withdrawing funds) | 10 requests | +| Cancellation fees (withdrawing funds) | 2 LINK | +| Minimum balance for uploading encrypted secrets | 2 LINK | diff --git a/src/content/vrf/v2-5/supported-networks.mdx b/src/content/vrf/v2-5/supported-networks.mdx index be0fb61a1d2..8208628488c 100644 --- a/src/content/vrf/v2-5/supported-networks.mdx +++ b/src/content/vrf/v2-5/supported-networks.mdx @@ -545,3 +545,42 @@ VRF v2.5 coordinators for subscription funding are available on several networks | Coordinator Gas Overhead per Word | 435 | + +### Soneium Minato testnet + +{/* prettier-ignore */} + +Subscription +Direct funding + +| Item | Value | +| --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| LINK Token |
| +| | +| VRF Coordinator |
| +| 30 gwei Key Hash | | +| Premium percentage
(paying with testnet ETH) | 60 | +| Premium percentage
(paying with LINK) | 50 | +| Max Gas Limit | 2,500,000 | +| Minimum Confirmations | 0 | +| Maximum Confirmations | 200 | +| Maximum Random Values | 500 | + + +| Item | Value | +| -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| LINK Token |
| +| VRF Wrapper |
| +| VRF Coordinator |
| +| 30 gwei Key Hash | | +| Premium percentage
(paying with testnet ETH) | 60 | +| Premium percentage
(paying with LINK) | 50 | +| Minimum Confirmations | 0 | +| Maximum Confirmations | 200 | +| Maximum Random Values | 10 | +| Wrapper Gas overhead | 13400 | +| Coordinator Gas Overhead (Native) | 128500 | +| Coordinator Gas Overhead (LINK) | 150400 | +| Coordinator Gas Overhead per Word | 435 | + + diff --git a/src/features/feeds/components/Tables.tsx b/src/features/feeds/components/Tables.tsx index 2bd7b81d7e3..4223896a2f3 100644 --- a/src/features/feeds/components/Tables.tsx +++ b/src/features/feeds/components/Tables.tsx @@ -372,6 +372,15 @@ const StreamsNetworksData = [ explorerUrl: "https://sepolia.basescan.org/address/%s", }, }, + { + network: "Soneium", + logoUrl: "/assets/chains/soneium.svg", + testnet: { + label: "Soneium Minato Testnet", + verifierProxy: "0x26603bAC5CE09DAE5604700B384658AcA13AD6ae", + explorerUrl: "https://explorer-testnet.soneium.org/address/%s", + }, + }, ] export const StreamsVerifierProxyTable = () => { @@ -391,31 +400,34 @@ export const StreamsVerifierProxyTable = () => {
{network.network}
-
- {network.mainnet.label}: - - {network.mainnet.verifierProxy} - - -
+ {network.mainnet && ( +
+ {network.mainnet.label}: + + {network.mainnet.verifierProxy} + + +
+ )} +
{network.testnet.label}: { Copy to clipboard
- + {network.networkStatus && ( +
+ + Track the status of this network at {network.networkStatus} + +
+ )} ))} diff --git a/src/features/utils/index.ts b/src/features/utils/index.ts index bcba0fe5421..aa2b5eff37e 100644 --- a/src/features/utils/index.ts +++ b/src/features/utils/index.ts @@ -178,6 +178,8 @@ export const directoryToSupportedChain = (chainInRdd: string): SupportedChain => return "SCROLL_MAINNET" case "ethereum-testnet-sepolia-scroll-1": return "SCROLL_SEPOLIA" + case "ethereum-testnet-sepolia-soneium-1": + return "SONEIUM_MINATO" default: throw Error(`Chain not found ${chainInRdd}`) } @@ -253,6 +255,8 @@ export const supportedChainToChainInRdd = (supportedChain: SupportedChain): stri return "ethereum-mainnet-scroll-1" case "SCROLL_SEPOLIA": return "ethereum-testnet-sepolia-scroll-1" + case "SONEIUM_MINATO": + return "ethereum-testnet-sepolia-soneium-1" default: throw Error(`Chain not found ${supportedChain}`) } From a216e5749b17f7987d823f9650e9e7ecf708478a Mon Sep 17 00:00:00 2001 From: Crystal Gomes Date: Wed, 23 Oct 2024 14:08:56 -0400 Subject: [PATCH 10/87] Forwarder for time-based upkeep (#2134) * Forwarder for time-based upkeep * tabs and notice * Adjustments * Apply suggestions from code review Co-authored-by: Karim H. <98668332+khadni@users.noreply.github.com> * Clarification Co-authored-by: Karim H. <98668332+khadni@users.noreply.github.com> --------- Co-authored-by: Karim H. <98668332+khadni@users.noreply.github.com> --- .../images/automation/cron-upkeep-address.png | Bin 0 -> 41425 bytes .../automation/forwarder-address-ui.png | Bin 0 -> 65711 bytes .../chainlink-automation/guides/forwarder.mdx | 45 +++++++++++++++--- 3 files changed, 39 insertions(+), 6 deletions(-) create mode 100644 public/images/automation/cron-upkeep-address.png create mode 100644 public/images/automation/forwarder-address-ui.png diff --git a/public/images/automation/cron-upkeep-address.png b/public/images/automation/cron-upkeep-address.png new file mode 100644 index 0000000000000000000000000000000000000000..528ca23fe9e0bf83eeb5c18abe585c9f95454f6a GIT binary patch literal 41425 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 literal 0 HcmV?d00001 diff --git a/public/images/automation/forwarder-address-ui.png b/public/images/automation/forwarder-address-ui.png new file mode 100644 index 0000000000000000000000000000000000000000..d9aedb21c9a83d7b85006ab1b25850d51c807985 GIT binary patch literal 65711 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

;izuza>!w?L&{JMm8L_)++>kGZRt&{lJ@#&_t|e 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 O2s~Z=T-G@yGywqH?XT|u literal 0 HcmV?d00001 diff --git a/src/content/chainlink-automation/guides/forwarder.mdx b/src/content/chainlink-automation/guides/forwarder.mdx index 98d8d39e527..9b07c16fdd8 100644 --- a/src/content/chainlink-automation/guides/forwarder.mdx +++ b/src/content/chainlink-automation/guides/forwarder.mdx @@ -10,25 +10,58 @@ whatsnext: } --- -import { Aside, CodeSample } from "@components" +import { Aside, ClickToZoom, CodeSample } from "@components" +import { TabsContent } from "@components/Tabs" This tutorial explains how to use the `Forwarder` to add additional security to your Automation upkeeps. To learn how other Chainlink Automation contracts work, click [here](/chainlink-automation/reference/automation-contracts). ## What is a Forwarder? When is it used? -Each registered upkeep under the Chainlink Automation network has its own unique `Forwarder` contract. The `Forwarder` address will only be known after registration, as we deploy a new forwarder for each upkeep. The `Forwarder` contract is the intermediary between the Automation Registry and your Upkeep contract. The `Forwarder` is always the `msg.Sender` for your upkeep. +Each registered upkeep under the Chainlink Automation network has its own unique `Forwarder` contract. The `Forwarder` address becomes available only after upkeep registration, as we deploy a new forwarder for each upkeep. The `Forwarder` contract is the intermediary between the Automation Registry and your Upkeep contract, so you make it the `msg.Sender` for your upkeep. -If your `performUpkeep` function is open and callable by anyone without risk of accepting unintentional external data, you don't need to use the `Forwarder`. +If you don't use the forwarder address, your contract's `performUpkeep` function is open and callable by anyone. If your contract is without risk of accepting unintentional external data, you don't need to use the forwarder address. ## Securing your upkeep -If your upkeep's perform function needs to be permissioned, please consider adding `msg.sender = forwarder` at the top of your `performUpkeep` function. +If your upkeep's perform function needs to be permissioned, please consider setting `msg.sender` as your forwarder address at the top of your `performUpkeep` function. To make this work you will need to: - Create `forwarder` as a mutable address variable on your contract that only _you_ can update. `forwarder` is a unique value that cannot change for your upkeep. -- Create `setForwarder` function so you can update the `forwarder` address. -- After registration run `setForwarder` with the forwarder address in your UI, or programmatically fetch it using `registry.getForwarder(upkeepID)` using the Registry interface. +- Create a `setForwarder` function in your contract so you can update the `forwarder` address. +- Register your upkeep and then retrieve its forwarder address from the Chainlink Automation App or programmatically. +- Call the `setForwarder` function, passing the forwarder address as an input argument. + +

+ +### Finding the forwarder address + +After you register an upkeep, its forwarder address is available in the Chainlink Automation App. Alternatively, you can fetch it programmatically using `registry.getForwarder(upkeepID)` from the Registry interface. + +{/* prettier-ignore */} + +Time-based upkeeps +Custom or log trigger upkeeps + +For time-based upkeeps, do **not** use the listed forwarder address. Instead, use the **Upkeep address** shown in the Chainlink Automation App: + + +The **Upkeep address** is shown in the middle card of the **Details** section for your upkeep. + + + +For custom upkeeps or log trigger upkeeps, use the **Forwarder address** listed in the Chainlink Automation App: + + +The **Forwarder address** is shown in the left card of the **Details** section for your upkeep. + + + ## Code example From 5678551055ff3a6ebb54e59af25ac611cc930d79 Mon Sep 17 00:00:00 2001 From: Crystal Gomes Date: Wed, 23 Oct 2024 14:42:24 -0400 Subject: [PATCH 11/87] Move log trigger limits to dedicated service limits page (#2131) * Move log trigger limits to dedicated service limits page * Update internal link --- src/config/sidebar.ts | 4 +++ .../concepts/automation-concepts.mdx | 19 -------------- .../guides/log-trigger.mdx | 2 +- .../overview/service-limits.mdx | 26 +++++++++++++++++++ 4 files changed, 31 insertions(+), 20 deletions(-) create mode 100644 src/content/chainlink-automation/overview/service-limits.mdx diff --git a/src/config/sidebar.ts b/src/config/sidebar.ts index 204919ef825..7772b1d6b54 100644 --- a/src/config/sidebar.ts +++ b/src/config/sidebar.ts @@ -421,6 +421,10 @@ export const SIDEBAR: Partial> = { title: "Best Practices", url: "chainlink-automation/concepts/best-practice", }, + { + title: "Service Limits", + url: "chainlink-automation/overview/service-limits", + }, { title: "Release Notes", url: "chainlink-automation/overview/automation-release-notes", diff --git a/src/content/chainlink-automation/concepts/automation-concepts.mdx b/src/content/chainlink-automation/concepts/automation-concepts.mdx index 67e24704a5c..045e6763104 100644 --- a/src/content/chainlink-automation/concepts/automation-concepts.mdx +++ b/src/content/chainlink-automation/concepts/automation-concepts.mdx @@ -29,22 +29,3 @@ These are the jobs or tasks that you execute onchain. For example, you can call ## Automation nodes Automation Nodes in the Chainlink Automation Network provide service to upkeeps that are funded and registered in the Automation registry. Automation Nodes use the same Node Operators as Chainlink Data Feeds. - -### Maximum logs processed for log trigger upkeeps - -Chainlink Automation nodes look back over a limited range of the latest blocks on any particular chain. During this process, the nodes process a limited number of logs per block per upkeep, using a minimum dequeue method to ensure that the latest logs are processed first. After this, the nodes may process additional remaining logs on a best effort basis, but this is not guaranteed. If you need all the remaining logs to be processed, configure a manual trigger as backup. - -Expect the following numbers of logs to be processed: - -| Chain | Logs per block per upkeep | -| --------- | ------------------------------------------ | -| Ethereum | 20 | -| BSC (BNB) | 4 | -| Polygon | 4 | -| Avalanche | 4 | -| Gnosis | 1 | -| Optimism | 4 | -| BASE | 4 | -| Arbitrum | 1 log every 2 blocks, or 2 logs per second | - -Note: Log triggers are not supported on Fantom. diff --git a/src/content/chainlink-automation/guides/log-trigger.mdx b/src/content/chainlink-automation/guides/log-trigger.mdx index 575ce437a8e..fbed06e1099 100644 --- a/src/content/chainlink-automation/guides/log-trigger.mdx +++ b/src/content/chainlink-automation/guides/log-trigger.mdx @@ -22,7 +22,7 @@ Create powerful smart contracts that use log data as both trigger and input. Thi ## Understanding maximum logs processed -Chainlink Automation processes a limited number of logs per block per upkeep. See the [Concepts](/chainlink-automation/concepts/automation-concepts#maximum-logs-processed-for-log-trigger-upkeeps) page to learn about how logs are processed and how many logs you can expect to be processed per block on the chain you're using. +Chainlink Automation processes a limited number of logs per block per upkeep. See the [Service Limits](/chainlink-automation/overview/service-limits) page to learn about how logs are processed and how many logs you can expect to be processed per block on the chain you're using. ## Emit a log diff --git a/src/content/chainlink-automation/overview/service-limits.mdx b/src/content/chainlink-automation/overview/service-limits.mdx new file mode 100644 index 00000000000..6e47fe5bfda --- /dev/null +++ b/src/content/chainlink-automation/overview/service-limits.mdx @@ -0,0 +1,26 @@ +--- +section: automation +date: Last Modified +title: "Chainlink Automation Service Limits" +isMdx: true +whatsnext: { "Register Log Trigger Upkeeps": "/chainlink-automation/guides/log-trigger/" } +--- + +## Maximum logs processed for log trigger upkeeps + +Chainlink Automation nodes look back over a limited range of the latest blocks on any particular chain. During this process, the nodes process a limited number of logs per block per upkeep, using a minimum dequeue method to ensure that the latest logs are processed first. After this, the nodes may process additional remaining logs on a best effort basis, but this is not guaranteed. If you need all the remaining logs to be processed, configure a manual trigger as backup. + +Expect the following numbers of logs to be processed: + +| Chain | Logs per block per upkeep | +| --------- | ------------------------------------------ | +| Ethereum | 20 | +| BSC (BNB) | 4 | +| Polygon | 4 | +| Avalanche | 4 | +| Gnosis | 1 | +| Optimism | 4 | +| BASE | 4 | +| Arbitrum | 1 log every 2 blocks, or 2 logs per second | + +Note: Log triggers are not supported on Fantom. From baa2cfd492f81e42aa88cd4bd2d2fd8c2608e7a0 Mon Sep 17 00:00:00 2001 From: "Karim H." <98668332+khadni@users.noreply.github.com> Date: Thu, 24 Oct 2024 15:07:38 +0200 Subject: [PATCH 12/87] Add Streams Trade implementation notes (#2135) * Automation availability note * QL Streams Soneium --- src/components/QuickLinks/data/productChainLinks.ts | 1 + src/content/data-streams/architecture.mdx | 2 ++ src/content/data-streams/index.mdx | 2 ++ .../data-streams/reference/streams-trade-interface.mdx | 2 ++ src/content/data-streams/tutorials/streams-trade/index.mdx | 2 ++ .../streams-trade/streams-trade-lookup-error-handler.mdx | 4 ---- 6 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/components/QuickLinks/data/productChainLinks.ts b/src/components/QuickLinks/data/productChainLinks.ts index 8d7b61aaaa8..a55d0c6d595 100644 --- a/src/components/QuickLinks/data/productChainLinks.ts +++ b/src/components/QuickLinks/data/productChainLinks.ts @@ -73,6 +73,7 @@ export const productChainLinks: ProductChainLinks = { arbitrum: "/data-streams/stream-ids", avalanche: "/data-streams/stream-ids", base: "/data-streams/stream-ids", + soneium: "/data-streams/stream-ids", }, }, Functions: { diff --git a/src/content/data-streams/architecture.mdx b/src/content/data-streams/architecture.mdx index 7bdc1e70fe2..0b2650c2555 100644 --- a/src/content/data-streams/architecture.mdx +++ b/src/content/data-streams/architecture.mdx @@ -53,6 +53,8 @@ This is one example of how you can combine Data Streams and Automation, but the Read the [Getting Started](/data-streams/getting-started) guide to learn how to build your own smart contract that retrieves reports from Data Streams using the Streams Trade implementation. +**Note**: Before implementing Streams Trade, ensure that Chainlink Automation is available on your desired network by checking the [Automation Supported Networks page](/chainlink-automation/overview/supported-networks). + ## Streams Direct Architecture diff --git a/src/content/data-streams/index.mdx b/src/content/data-streams/index.mdx index b2818d3125b..61ec9fc8086 100644 --- a/src/content/data-streams/index.mdx +++ b/src/content/data-streams/index.mdx @@ -60,6 +60,8 @@ When combined with [Chainlink Automation](/chainlink-automation/introduction), C Read more about the [Streams Trade Architecture](/data-streams/architecture#streams-trade-architecture) and an [example trading flow](/data-streams/architecture#example-trading-flow-using-streams-trade), or learn how to [get started](/data-streams/getting-started) with Streams Trade. +**Note**: Before implementing Streams Trade, ensure that Chainlink Automation is available on your desired network by checking the [Automation Supported Networks page](/chainlink-automation/overview/supported-networks). + ### Streams Direct: Using Data Streams with your own bot Streams Direct offers a direct approach to integrating low-latency and high-frequency data into your applications. You can use the [Data Streams SDK](/data-streams/reference/streams-direct/streams-direct-go-sdk) to fetch reports (REST API) or to subscribe to report updates (WebSocket connection) from the Data Streams Aggregation Network, and an onchain smart contract to [verify reports](/data-streams/reference/streams-direct/streams-direct-onchain-verification). diff --git a/src/content/data-streams/reference/streams-trade-interface.mdx b/src/content/data-streams/reference/streams-trade-interface.mdx index 02472a4a7ca..45cb5012b9d 100644 --- a/src/content/data-streams/reference/streams-trade-interface.mdx +++ b/src/content/data-streams/reference/streams-trade-interface.mdx @@ -11,6 +11,8 @@ import DataStreams from "@features/data-streams/common/DataStreams.astro" To retrieve and verify reports, Streams Trade requires several interfaces. +**Note**: Before implementing Streams Trade, ensure that Chainlink Automation is available on your desired network by checking the [Automation Supported Networks page](/chainlink-automation/overview/supported-networks). + ## Automation interfaces - [StreamsLookupCompatibleInterface](/chainlink-automation/reference/automation-interfaces#streamslookupcompatibleinterface) diff --git a/src/content/data-streams/tutorials/streams-trade/index.mdx b/src/content/data-streams/tutorials/streams-trade/index.mdx index 05546677555..99b35f6f751 100644 --- a/src/content/data-streams/tutorials/streams-trade/index.mdx +++ b/src/content/data-streams/tutorials/streams-trade/index.mdx @@ -9,3 +9,5 @@ Explore several guides to learn how to use the [Streams Trade](/data-streams#str - [Getting Started](/data-streams/getting-started): Learn how to read data from a Data Streams feed, verify the answer onchain, and store it. - [Handle StreamsLookup errors](/data-streams/tutorials/streams-trade/streams-trade-lookup-error-handler): Learn how to handle potential errors or edge cases in StreamsLookup upkeeps. + +**Note**: Before implementing Streams Trade, ensure that Chainlink Automation is available on your desired network by checking the [Automation Supported Networks page](/chainlink-automation/overview/supported-networks). diff --git a/src/content/data-streams/tutorials/streams-trade/streams-trade-lookup-error-handler.mdx b/src/content/data-streams/tutorials/streams-trade/streams-trade-lookup-error-handler.mdx index b9556df1fc5..952c893d6a4 100644 --- a/src/content/data-streams/tutorials/streams-trade/streams-trade-lookup-error-handler.mdx +++ b/src/content/data-streams/tutorials/streams-trade/streams-trade-lookup-error-handler.mdx @@ -14,10 +14,6 @@ whatsnext: { import { Aside } from "@components" import DataStreams from "@features/data-streams/common/DataStreams.astro" - -