swimricky 9ddc7fdc7d Ethereum/parse price feed updates accumulators (#855) 2 anni fa
..
contracts 9ddc7fdc7d Ethereum/parse price feed updates accumulators (#855) 2 anni fa
deploy bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
forge-test 9ddc7fdc7d Ethereum/parse price feed updates accumulators (#855) 2 anni fa
lib bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
migrations bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
networks bdc3fede24 [eth] Deploy to Kava (#859) 2 anni fa
scripts 085f08055a [eth] Add zksync mainnet (#682) 2 anni fa
test bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
.dockerignore bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
.env.cluster.mainnet bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
.env.cluster.testnet bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
.env.prod.arbitrum bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
.env.prod.arbitrum_testnet bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
.env.prod.aurora bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
.env.prod.aurora_testnet bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
.env.prod.avalanche bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
.env.prod.base_goerli 70c006176b Add base goerli config (#668) 2 anni fa
.env.prod.bnb bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
.env.prod.bnb_testnet bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
.env.prod.canto 85b9c80e2a [eth] Add Canto mainnet (#751) 2 anni fa
.env.prod.canto_testnet 38a8c2831a [evm] Deploy on Canto Testnet (#725) 2 anni fa
.env.prod.celo bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
.env.prod.celo_alfajores_testnet bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
.env.prod.chiado 1771a8a98a [eth] Add new testnets (#669) 2 anni fa
.env.prod.conflux_espace 71da520647 [eth] Deploy to Conflux eSpace (#748) 2 anni fa
.env.prod.conflux_espace_testnet 71da520647 [eth] Deploy to Conflux eSpace (#748) 2 anni fa
.env.prod.cronos bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
.env.prod.cronos_testnet bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
.env.prod.development bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
.env.prod.ethereum bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
.env.prod.evmos de0096efd4 [eth] add evmos mainnet (#686) 2 anni fa
.env.prod.evmos_testnet 533181cc80 [eth] add evmos testnet (#683) 2 anni fa
.env.prod.fantom bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
.env.prod.fantom_testnet bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
.env.prod.fuji bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
.env.prod.goerli bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
.env.prod.kava bdc3fede24 [eth] Deploy to Kava (#859) 2 anni fa
.env.prod.kava_testnet bdc3fede24 [eth] Deploy to Kava (#859) 2 anni fa
.env.prod.kcc bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
.env.prod.kcc_testnet bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
.env.prod.mantle_testnet 2db5a26752 [eth] Deploy to testnet Mantle (#742) 2 anni fa
.env.prod.meter 111b0fa09f [eth] Deploy to meter (#731) 2 anni fa
.env.prod.meter_testnet 111b0fa09f [eth] Deploy to meter (#731) 2 anni fa
.env.prod.mumbai bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
.env.prod.neon 11cb14ca76 Deploy neon (#854) 2 anni fa
.env.prod.neon_devnet 156fb23f24 [evm] deploy neon devnet (#693) 2 anni fa
.env.prod.optimism bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
.env.prod.optimism_goerli bdc3fede24 [eth] Deploy to Kava (#859) 2 anni fa
.env.prod.polygon bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
.env.prod.polygon_zkevm 7dad38ea89 [evm] Deploy on Polygon ZkEVM mainnet (#723) 2 anni fa
.env.prod.polygon_zkevm_testnet c45664c951 [evm] Polygon ZKEVM deployment (#711) 2 anni fa
.env.prod.shimmer_testnet 1771a8a98a [eth] Add new testnets (#669) 2 anni fa
.env.prod.zksync bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
.env.prod.zksync_goerli bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
.env.template bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
.env.test bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
.gitignore 085f08055a [eth] Add zksync mainnet (#682) 2 anni fa
Deploying.md 85b9c80e2a [eth] Add Canto mainnet (#751) 2 anni fa
README.md 533181cc80 [eth] add evmos testnet (#683) 2 anni fa
VERIFY.md d06c10502d [evm] Verifying shimmer_testnet and neon_devnet with hardhat (#703) 2 anni fa
canto-deployment-patch.diff 85b9c80e2a [eth] Add Canto mainnet (#751) 2 anni fa
deploy.sh bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
foundry.toml 1d59e9052b [tilt] Fix issues (#801) 2 anni fa
hardhat.config.ts 11cb14ca76 Deploy neon (#854) 2 anni fa
mine.js bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
package.json f94dceb1bc [eth] Add Pyth Accumulator (#776) 2 anni fa
remappings.txt bbe10ba553 [sdk] Move JS sdks into this repo (#611) 2 anni fa
truffle-config.js bdc3fede24 [eth] Deploy to Kava (#859) 2 anni fa

README.md

Pyth Ethereum Contract

This directory contains The Pyth contract on Ethereum and utilities to deploy it in EVM chains.

Installation

Run the following command on the repo root to install required dependencies for the contract:

npm ci
npx lerna run build --scope="@pythnetwork/pyth-evm-contract" --include-dependencies

Deployment

Please refer to Deploying.md for more information.

Foundry

Foundry can be installed by the official installer, or by running our helper script which will automatically pull the correct installation script individually for Foundry and the Solidity compiler for your current OS. This may work better if you are running into networking/firewall issues using Foundry's Solidity installer. To use helper script, run the command below from this directory:

pyth-crosschain/target_chains/ethereum/contracts $ bash ../../../scripts/install-foundry.sh

You need to install npm dependencies as described in Installation. Also, you need to run the following command in the contracts directory to install forge dependencies:

npm run install-forge-deps

After installing the dependencies. Run forge build to build the contracts and forge test to test the contracts using tests in forge-test directory.

Gas Benchmark

You can use foundry to run benchmark tests written in forge-test/GasBenchmark.t.sol. To run the tests with gas report you can run forge test --gas-report --match-contract GasBenchmark. However, as there are multiple benchmarks, this might not be useful. You can run a specific benchmark test by passing the test name using --match-test. A full command to run testBenchmarkUpdatePriceFeedsFresh benchmark test is like this:

forge test --gas-report --match-contract GasBenchmark --match-test testBenchmarkUpdatePriceFeedsFresh

A gas report should have a couple of tables like this:

โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚ node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol:ERC1967Proxy contract โ”†                 โ”†        โ”†        โ”†         โ”†         โ”‚
โ•žโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ก
โ”‚ Deployment Cost                                                                           โ”† Deployment Size โ”†        โ”†        โ”†         โ”†         โ”‚
โ”œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ค
โ”‚ 164236                                                                                    โ”† 2050            โ”†        โ”†        โ”†         โ”†         โ”‚
โ”œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ค
โ”‚ Function Name                                                                             โ”† min             โ”† avg    โ”† median โ”† max     โ”† # calls โ”‚
โ”œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ค
โ”‚ .............                                                                             โ”† .....           โ”† .....  โ”† .....  โ”† .....   โ”† ..      โ”‚
โ”œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ค
โ”‚ updatePriceFeeds                                                                          โ”† 383169          โ”† 724277 โ”† 187385 โ”† 1065385 โ”† 2       โ”‚
โ”œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ผโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ•Œโ”ค
โ”‚ .............                                                                             โ”† .....           โ”† .....  โ”† .....  โ”† .....   โ”† ...     โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ

For most of the methods, the minimum gas usage is an indication of our desired gas usage. Because the calls that store something in the storage for the first time in setUp use significantly more gas. For example, in the above table, there are two calls to updatePriceFeeds. The first call has happend in the setUp method and costed over a million gas and is not intended for our Benchmark. So our desired value is the minimum value which is around 380k gas.

If you like to optimize the contract and measure the gas optimization you can get gas snapshots using forge snapshot and evaluate your optimization with it. For more information, please refer to Gas Snapshots documentation. Once you optimized the code, please share the snapshot difference (generated using forge snapshot --diff <old-snapshot>) in the PR too. This snapshot gas value also includes an initial transaction cost as well as reading from the contract storage itself. You can get the most accurate result by looking at the gas report or the gas shown in the call trace with -vvvv argument to forge test.