benduran ab0cf6f7d8 chore: updated gitignore to excluse the built dist/ folder преди 3 седмици
..
abis cfa52f58d5 fix: run turbo fix (#2803) преди 5 месеца
.gitignore ab0cf6f7d8 chore: updated gitignore to excluse the built dist/ folder преди 3 седмици
AbstractPyth.sol 660717e2ae removed slots strict function преди 5 месеца
IPyth.sol eb12812b45 fixed parsePriceFeedUpdates natspec преди 4 месеца
IPythEvents.sol c842b9def5 chore: rename downSlotRatio to downSlotsRatio преди 7 месеца
Math.sol cfa52f58d5 fix: run turbo fix (#2803) преди 5 месеца
MockPyth.sol 02fe8404f7 updating version, reverting preincrement, renaming slots strict to with config in test functions преди 5 месеца
PythAggregatorV3.sol f01d4bd4bc feat(target_chains/ethereum/pyth): strict minimal updateData parsing (#2637) преди 6 месеца
PythErrors.sol 285465d82d Chore(evm) add combine pricefeed (#2665) преди 5 месеца
PythStructs.sol fd94f73ec1 refactor: change startTime and endTime types to uint64 in MockPyth and related ABIs преди 7 месеца
PythUtils.sol cfa52f58d5 fix: run turbo fix (#2803) преди 5 месеца
README.md 7642a395b9 fix(pulse-scheduler): validate atomic subscription updates using slots instead of timestamps (#2590) преди 7 месеца
package.json fe92275443 chore: migrated all package.json and tsconfig files to a single, modern standard преди 3 седмици
prettier.config.js b1dc4c27f5 chore: move prettier to individual packages & upgrade prettier преди 8 месеца
turbo.json 8a05757929 chore: update turbo config преди 8 месеца

README.md

Pyth Solidity SDK

This package provides utilities for consuming prices from the Pyth Network Oracle using Solidity. Also, it contains the Pyth Interface ABI that you can use in your libraries to communicate with the Pyth contract.

It is strongly recommended to follow the consumer best practices when consuming Pyth data.

Installation

Truffle/Hardhat

If you are using Truffle or Hardhat, simply install the NPM package:

npm install @pythnetwork/pyth-sdk-solidity

Foundry

If you are using Foundry, you will need to create an NPM project if you don't already have one. From the root directory of your project, run:

npm init -y
npm install @pythnetwork/pyth-sdk-solidity

Then add the following line to your remappings.txt file:

@pythnetwork/pyth-sdk-solidity/=node_modules/@pythnetwork/pyth-sdk-solidity

Example Usage

To consume prices you should use the IPyth interface. Please make sure to read the documentation of this interface in order to use the prices safely.

For example, to read the latest price, call getPriceNoOlderThan with the Price ID of the price feed you're interested in. The price feeds available on each chain are listed below.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@pythnetwork/pyth-sdk-solidity/IPyth.sol";
import "@pythnetwork/pyth-sdk-solidity/PythStructs.sol";

contract ExampleContract {
  IPyth pyth;

  constructor(address pythContract) {
    pyth = IPyth(pythContract);
  }

  function getBtcUsdPrice(
    bytes[] calldata priceUpdateData
  ) public payable returns (PythStructs.Price memory) {
    // Update the prices to the latest available values and pay the required fee for it. The `priceUpdateData` data
    // should be retrieved from our off-chain Price Service API using the `hermes-client` package.
    // See section "How Pyth Works on EVM Chains" below for more information.
    uint fee = pyth.getUpdateFee(priceUpdateData);
    pyth.updatePriceFeeds{ value: fee }(priceUpdateData);

    bytes32 priceID = 0xf9c0172ba10dfa4d19088d94f5bf61d3b54d5bd7483a322a982e1373ee8ea31b;
    // Read the current value of priceID, aborting the transaction if the price has not been updated in the last 10
    // seconds.
    return pyth.getPriceNoOlderThan(priceID, 10);
  }
}

How Pyth Works on EVM Chains

Pyth prices are published on Pythnet, and relayed to EVM chains using the Wormhole Network as a cross-chain message passing bridge. The Wormhole Network observes when Pyth prices on Pythnet have changed and publishes an off-chain signed message attesting to this fact. This is explained in more detail here.

This signed message can then be submitted to the Pyth contract on the EVM networks along the required update fee for it, which will verify the Wormhole message and update the Pyth contract with the new price.

Please refer to Pyth On-Demand Updates page for more information.

Solidity Target Chains

This document contains list of the EVM networks that Pyth is available on.

You can find a list of available price feeds here.

Mocking Pyth

MockPyth is a mock contract that you can use and deploy locally to mock Pyth contract behaviour. To set and update price feeds you should call updatePriceFeeds and provide an array of encoded price feeds (the struct defined in PythStructs) as its argument. You can create encoded price feeds either by using web3.js or ethers ABI utilities or calling createPriceFeedUpdateData function in the mock contract.

Development

ABIs

When making changes to a contract interface, please make sure to update the ABI files too. You can update it using pnpm turbo run build:abis and it will update the ABI files in abis directory.

Releases

We use Semantic Versioning for our releases. In order to release a new version of this package and publish it to npm, follow these steps:

  1. Run npm version <new version number> --no-git-tag-version. This command will update the version of the package. Then push your changes to github.
  2. Once your change is merged into main, create a release with tag v<new version number> like v1.5.2, and a github action will automatically publish the new version of this package to npm.