-
Notifications
You must be signed in to change notification settings - Fork 213
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat(target_chains/fuel): update fuel toolchains to the latest version #1911
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -36,91 +36,8 @@ To use Pyth prices on chain, | |
they must be fetched from a Hermes instance. The `HermesClient` class from Pyth's `hermes-client` library can be used to interact with Hermes, | ||
providing a way to fetch these prices directly in your code. | ||
In order to use Pyth prices in your protocol you need to submit the price update data to Pyth contract in your target | ||
chain. The following example shows how to obtain | ||
Pyth prices and submit them to a Fuel network: | ||
chain. | ||
|
||
```typescript | ||
import { HermesClient, PriceUpdate } from "@pythnetwork/hermes-client"; | ||
import { | ||
PYTH_CONTRACT_ADDRESS_SEPOLIA, | ||
PYTH_CONTRACT_ABI, | ||
FUEL_ETH_ASSET_ID, | ||
} from "../index"; | ||
import { Provider, Wallet, Contract, hexlify, arrayify } from "fuels"; | ||
|
||
async function main() { | ||
// Create a provider for interacting with Fuel RPC | ||
const provider = await Provider.create( | ||
"https://testnet.fuel.network/v1/graphql" | ||
); | ||
const privateKey = process.env.ACCOUNT_PRIVATE_KEY; | ||
if (privateKey === undefined) { | ||
throw new Error("Missing ACCOUNT_PRIVATE_KEY env var"); | ||
} | ||
const wallet = Wallet.fromPrivateKey(privateKey, provider); | ||
|
||
// Create a `Contract` instance to interact with the Pyth contract on Fuel | ||
const contract = new Contract( | ||
PYTH_CONTRACT_ADDRESS_SEPOLIA, | ||
PYTH_CONTRACT_ABI, | ||
wallet | ||
); | ||
|
||
const priceFeedSymbol = "Crypto.ETH/USD"; | ||
const priceFeedId = | ||
"0xff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace"; // Pyth ETH/USD price feed id | ||
const previousPrice = ( | ||
await contract.functions.price_unsafe(priceFeedId).get() | ||
).value; | ||
console.log( | ||
`Previous price: ${ | ||
previousPrice.price.toNumber() * 10 ** -previousPrice.exponent | ||
}` | ||
); | ||
|
||
// Create a client for pulling price updates from Hermes. | ||
const hermesClient = new HermesClient("https://hermes.pyth.network"); | ||
|
||
console.log(`Querying latest Pyth price update for ${priceFeedSymbol}`); | ||
// Get the latest values of the price feeds as json objects. | ||
const priceUpdates: PriceUpdate = await hermesClient.getLatestPriceUpdates([ | ||
priceFeedId, | ||
]); | ||
console.log( | ||
`Current price from Hermes: ${ | ||
Number(priceUpdates.parsed?.[0].price.price) * | ||
10 ** Number(priceUpdates.parsed?.[0].price.expo) | ||
}` | ||
); | ||
|
||
const priceFeedUpdateData = arrayify( | ||
Buffer.from(priceUpdates.binary.data[0], "hex") | ||
); | ||
|
||
// Query the amount of update fee required | ||
console.log(`Querying update fee...`); | ||
const updateFee: number = ( | ||
await contract.functions.update_fee([priceFeedUpdateData]).get() | ||
).value; | ||
console.log(`Update fee: ${updateFee}`); | ||
|
||
const tx = await contract.functions | ||
.update_price_feeds([priceFeedUpdateData]) | ||
.callParams({ | ||
forward: [updateFee, hexlify(FUEL_ETH_ASSET_ID)], | ||
}) | ||
.call(); | ||
console.log(`Transaction confirmed: ${tx.transactionId}`); | ||
|
||
const newPrice = ( | ||
await contract.functions.price_no_older_than(60, priceFeedId).get() | ||
).value; | ||
console.log( | ||
`New price: ${newPrice.price.toNumber() * 10 ** -newPrice.exponent}` | ||
); | ||
} | ||
|
||
main(); | ||
``` | ||
Comment on lines
-42
to
-124
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. refactored this into |
||
For a complete example of how to obtain Pyth prices and submit them to a Fuel network, check out the [usage example](src/examples/usage.ts) in the `src/examples` directory. | ||
|
||
We strongly recommend reading our guide which explains [how to work with Pyth price feeds](https://docs.pyth.network/documentation/pythnet-price-feeds/best-practices). |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,81 @@ | ||
import { HermesClient, PriceUpdate } from "@pythnetwork/hermes-client"; | ||
import { | ||
PYTH_CONTRACT_ADDRESS_SEPOLIA, | ||
PYTH_CONTRACT_ABI, | ||
FUEL_ETH_ASSET_ID, | ||
} from "../index"; | ||
import { Provider, Wallet, Contract, hexlify, arrayify } from "fuels"; | ||
|
||
async function main() { | ||
// Create a provider for interacting with Fuel RPC | ||
const provider = await Provider.create( | ||
"https://testnet.fuel.network/v1/graphql" | ||
); | ||
const privateKey = process.env.ACCOUNT_PRIVATE_KEY; | ||
if (privateKey === undefined) { | ||
throw new Error("Missing ACCOUNT_PRIVATE_KEY env var"); | ||
} | ||
const wallet = Wallet.fromPrivateKey(privateKey, provider); | ||
|
||
// Create a `Contract` instance to interact with the Pyth contract on Fuel | ||
const contract = new Contract( | ||
PYTH_CONTRACT_ADDRESS_SEPOLIA, | ||
PYTH_CONTRACT_ABI, | ||
wallet | ||
); | ||
|
||
const priceFeedSymbol = "Crypto.ETH/USD"; | ||
const priceFeedId = | ||
"0xff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace"; // Pyth ETH/USD price feed id | ||
const previousPrice = ( | ||
await contract.functions.price_unsafe(priceFeedId).get() | ||
).value; | ||
console.log( | ||
`Previous price: ${ | ||
previousPrice.price.toNumber() * 10 ** -previousPrice.exponent | ||
}` | ||
); | ||
|
||
// Create a client for pulling price updates from Hermes. | ||
const hermesClient = new HermesClient("https://hermes.pyth.network"); | ||
|
||
console.log(`Querying latest Pyth price update for ${priceFeedSymbol}`); | ||
// Get the latest values of the price feeds as json objects. | ||
const priceUpdates: PriceUpdate = await hermesClient.getLatestPriceUpdates([ | ||
priceFeedId, | ||
]); | ||
console.log( | ||
`Current price from Hermes: ${ | ||
Number(priceUpdates.parsed?.[0].price.price) * | ||
10 ** Number(priceUpdates.parsed?.[0].price.expo) | ||
}` | ||
); | ||
|
||
const priceFeedUpdateData = arrayify( | ||
Buffer.from(priceUpdates.binary.data[0], "hex") | ||
); | ||
|
||
// Query the amount of update fee required | ||
console.log(`Querying update fee...`); | ||
const updateFee: number = ( | ||
await contract.functions.update_fee([priceFeedUpdateData]).get() | ||
).value; | ||
console.log(`Update fee: ${updateFee}`); | ||
|
||
const tx = await contract.functions | ||
.update_price_feeds([priceFeedUpdateData]) | ||
.callParams({ | ||
forward: [updateFee, hexlify(FUEL_ETH_ASSET_ID)], | ||
}) | ||
.call(); | ||
console.log(`Transaction confirmed: ${tx.transactionId}`); | ||
|
||
const newPrice = ( | ||
await contract.functions.price_no_older_than(60, priceFeedId).get() | ||
).value; | ||
console.log( | ||
`New price: ${newPrice.price.toNumber() * 10 ** -newPrice.exponent}` | ||
); | ||
} | ||
|
||
main(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
there is a compiler issue with fuel where it fails to compile with
Too many arguments, cannot handle.: Immediate12TooLarge
error and the solution was to make the contract functions call internal functions, more context here: FuelLabs/sway#6542