From 972d230725be9eb845a266f142770a93f4eac2a0 Mon Sep 17 00:00:00 2001 From: Jack Lee <280147597@qq.com> Date: Tue, 16 Jul 2024 16:42:02 +0800 Subject: [PATCH] Refs #654 -- Add content about using Pyth oracle to retrieve price (#656) * added randomNumbers to espace/tutorials/oracle/Pyth/ * updated Pyth/priceFeed * update priceFeed.md * update priceFeed.md * add _category_.json to scaffoldCfx * update _cateorgy_.json in pyth * Update docs/espace/tutorials/oracle/_category_.json Co-authored-by: darwintree <17946284+darwintree@users.noreply.github.com> --------- Co-authored-by: darwintree <17946284+darwintree@users.noreply.github.com> --- .../tutorials/img/get-cfx-price-success.png | Bin 0 -> 46858 bytes .../tutorials/oracle/Pyth/_category_.json | 9 + .../espace/tutorials/oracle/Pyth/priceFeed.md | 208 ++++++++++++++++++ docs/espace/tutorials/oracle/_category_.json | 9 + .../tutorials/scaffoldCfx/_category_.json | 3 +- 5 files changed, 227 insertions(+), 2 deletions(-) create mode 100644 docs/espace/tutorials/img/get-cfx-price-success.png create mode 100644 docs/espace/tutorials/oracle/Pyth/_category_.json create mode 100644 docs/espace/tutorials/oracle/Pyth/priceFeed.md create mode 100644 docs/espace/tutorials/oracle/_category_.json diff --git a/docs/espace/tutorials/img/get-cfx-price-success.png b/docs/espace/tutorials/img/get-cfx-price-success.png new file mode 100644 index 0000000000000000000000000000000000000000..97e44e9fa6c9a6c0b81273767f24e18951b1bae2 GIT binary patch literal 46858 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 literal 0 HcmV?d00001 diff --git a/docs/espace/tutorials/oracle/Pyth/_category_.json b/docs/espace/tutorials/oracle/Pyth/_category_.json new file mode 100644 index 0000000000..9637eee61f --- /dev/null +++ b/docs/espace/tutorials/oracle/Pyth/_category_.json @@ -0,0 +1,9 @@ +{ + "label": "Pyth", + "position": 1, + "link": { + "type": "generated-index", + "description": "Tutorial on how to use a Pyth oracle on Conflux eSpace" + } + } + \ No newline at end of file diff --git a/docs/espace/tutorials/oracle/Pyth/priceFeed.md b/docs/espace/tutorials/oracle/Pyth/priceFeed.md new file mode 100644 index 0000000000..f9454f10b3 --- /dev/null +++ b/docs/espace/tutorials/oracle/Pyth/priceFeed.md @@ -0,0 +1,208 @@ +--- +sidebar_position: 1 +title: Retrieve Price +description: Learn how to Use Pyth Oracle on Conflux eSpace to Retrieve CFX Price +keywords: + - Hardhat + - Smart Contracts + - Oracle + - Pyth + - CFX Price +displayed_sidebar: eSpaceSidebar +--- + +# Retrieve Price + +This tutorial will guide you through building a project on Conflux eSpace using Hardhat and retrieving the CFX price through the Pyth oracle. + +## Prerequisites + +Before starting, ensure you have the following software installed: + +1. Node.js and npm +2. Hardhat +3. Conflux wallet extension + +## Step 1: Create a Hardhat Project + +First, create a new Hardhat project: + +```bash +mkdir conflux-pyth-cfx-price +cd conflux-pyth-cfx-price +npx hardhat +``` + +Follow the prompts to create a basic JavaScript project. + +## Step 2: Install Necessary Dependencies + +Install the Pyth SDK and other required dependencies: + +```bash +npm install @pythnetwork/pyth-sdk-solidity @pythnetwork/pyth-evm-js dotenv +``` + +## Step 3: Configure Hardhat + +Update `hardhat.config.js` to include the Conflux eSpace Testnet: + +```javascript +require("@nomicfoundation/hardhat-toolbox"); + +/** @type import('hardhat/config').HardhatUserConfig */ +module.exports = { + solidity: "0.8.24", + networks: { + confluxTestnet: { + url: "https://evmtestnet.confluxrpc.com", + accounts: [process.env.PRIVATE_KEY], // Your private key here + }, + }, +}; +``` + +Make sure to set your private key as an environment variable for security. + +## Step 4: Write the Smart Contract + +Create `CFXPrice.sol` in the `contracts` directory: + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.18; + +import "@pythnetwork/pyth-sdk-solidity/IPyth.sol"; +import "@pythnetwork/pyth-sdk-solidity/PythStructs.sol"; + +contract CFXPrice { + IPyth pyth; + bytes32 constant CFX_USD_PRICE_ID = 0x8879170230c9603342f3837cf9a8e76c61791198fb1271bb2552c9af7b33c933; + + constructor(address pythContract) { + pyth = IPyth(pythContract); + } + + function getCFXPrice(bytes[] calldata priceUpdateData) public payable returns (int64, uint) { + uint fee = pyth.getUpdateFee(priceUpdateData); + pyth.updatePriceFeeds{value: fee}(priceUpdateData); + + PythStructs.Price memory price = pyth.getPrice(CFX_USD_PRICE_ID); + return (price.price, price.conf); + } +} +``` + +## Step 5: Deploy the Smart Contract + +Create `deploy.js` in the `scripts` directory: + +```javascript +const hre = require("hardhat"); + +async function main() { + const pythContractAddress = "0xDd24F84d36BF92C65F92307595335bdFab5Bbd21"; // Pyth contract address on Conflux eSpace Testnet + + const CFXPrice = await hre.ethers.getContractFactory("CFXPrice"); + const cfxPrice = await CFXPrice.deploy(pythContractAddress); + + await cfxPrice.waitForDeployment(); + + console.log("CFXPrice deployed to:", await cfxPrice.getAddress()); +} + +main().catch((error) => { + console.error(error); + process.exit(1); +}); +``` + +## Step 6: Run the Deployment Script + +Deploy the contract using: + +```bash +npx hardhat run scripts/deploy.js --network confluxTestnet +``` + +## Step 7: Interact with the Contract + +Create `interact.js` in the `scripts` directory: + +```javascript +const hre = require("hardhat"); +const { EvmPriceServiceConnection } = require("@pythnetwork/pyth-evm-js"); + +async function main() { + const CFXPrice = await hre.ethers.getContractFactory("CFXPrice"); + const cfxPrice = await CFXPrice.attach("YOUR_DEPLOYED_CONTRACT_ADDRESS"); // Replace with your actual deployed address + + const connection = new EvmPriceServiceConnection( + "https://hermes.pyth.network" // Use Hermes price service + ); + + const priceIds = [ + "0x8879170230c9603342f3837cf9a8e76c61791198fb1271bb2552c9af7b33c933", // CFX/USD price feed ID + ]; + + try { + const priceUpdateData = await connection.getPriceFeedsUpdateData(priceIds); + + // Estimate gas + const gasEstimate = await cfxPrice.getCFXPrice.estimateGas(priceUpdateData, { + value: hre.ethers.parseEther("0.01"), // Send some CFX to pay for the update fee, adjust as needed + }); + + console.log("Estimated gas:", gasEstimate.toString()); + + // Call getCFXPrice function + const tx = await cfxPrice.getCFXPrice(priceUpdateData, { + value: hre.ethers.parseEther("0.01"), // Send some CFX to pay for the update fee, adjust as needed + }); + + console.log("Transaction sent:", tx.hash); + + // Wait for transaction confirmation + const receipt = await tx.wait(); + + console.log("Transaction confirmed in block:", receipt.blockNumber); + + // Get the price directly using staticCall + const [price, confidence] = await cfxPrice.getCFXPrice.staticCall(priceUpdateData, { + value: hre.ethers.parseEther("0.01"), + }); + + console.log("CFX/USD Price:", hre.ethers.formatUnits(price, 8)); // Pyth prices are usually in 8 decimals + console.log("Confidence:", hre.ethers.formatUnits(confidence, 8)); + + } catch (error) { + console.error("Error occurred:", error); + } +} + +main().catch((error) => { + console.error(error); + process.exit(1); +}); +``` + +Run the interaction script: + +```bash +npx hardhat run scripts/interact.js --network confluxTestnet +``` + +![Get CFX Price Success](../../img/get-cfx-price-success.png) + +## Summary + +This tutorial demonstrates how to deploy a smart contract on Conflux eSpace Testnet that fetches the CFX/USD price using Pyth Network. Key points: + +1. We use the correct CFX/USD price feed ID for Pyth. +2. The contract is deployed on Conflux eSpace Testnet. +3. We use the Hermes price service for fetching update data. +4. The interaction script estimates gas, sends a transaction to update the price, and then retrieves the latest price. + +Remember to always use testnet tokens and addresses when testing. For production use, you'd switch to mainnet addresses and endpoints. + +For more information, refer to the [Pyth Network documentation](https://docs.pyth.network/) \ No newline at end of file diff --git a/docs/espace/tutorials/oracle/_category_.json b/docs/espace/tutorials/oracle/_category_.json new file mode 100644 index 0000000000..0b338ea57b --- /dev/null +++ b/docs/espace/tutorials/oracle/_category_.json @@ -0,0 +1,9 @@ +{ + "label": "How to use Oracle", + "position": 1, + "link": { + "type": "generated-index", + "description": "Tutorial on how to use Oracle on Conflux eSpace" + } + } + \ No newline at end of file diff --git a/docs/espace/tutorials/scaffoldCfx/_category_.json b/docs/espace/tutorials/scaffoldCfx/_category_.json index 5096298146..8be90385b8 100644 --- a/docs/espace/tutorials/scaffoldCfx/_category_.json +++ b/docs/espace/tutorials/scaffoldCfx/_category_.json @@ -5,5 +5,4 @@ "type": "generated-index", "description": "Tutorial on how to use a Scaffold for Developing Conflux Apps and Testing Contracts" } - } - \ No newline at end of file + } \ No newline at end of file