Ali Behjati 258e5ead87 fix: exclude publisher package from the workspace 1 год назад
..
cli c7c3527bfe fix: initialize guardian expiration to the right value (#1485) 1 год назад
common_test_utils 9230bae9c8 feat(solana): move as many things as possible to the sdk (#1602) 1 год назад
migrations 16caff1b04 [solana] Start to implement the solana receiver contract (#557) 2 лет назад
program_simulator 1e5df8537a feat: add posted slot (#1372) 1 год назад
programs b91ba09f40 feat(target_chains/solana): initial price publisher program 1 год назад
pyth_solana_receiver_sdk a3147fe8ca changed anchor serailze/deserailize to borsh (#1765) 1 год назад
scripts 5a676978db feat: add pyth_push_oracle to dockerfile (#1470) 1 год назад
sdk 71d0323b7a Go (#1835) 1 год назад
target 8f62566dbb [solana] Fix idl (#1279) 1 год назад
.gitignore f2d5bdc842 chore(target_chains/solana): add verifiable build script (#1378) 1 год назад
.prettierignore 16caff1b04 [solana] Start to implement the solana receiver contract (#557) 2 лет назад
Anchor.toml f3249d9cba feat(apps/hermes): new client package for hermes (#1653) 1 год назад
Cargo.lock 02d0adc460 feat: publisher-caps-program (#1812) 1 год назад
Cargo.toml 258e5ead87 fix: exclude publisher package from the workspace 1 год назад
Dockerfile 5a676978db feat: add pyth_push_oracle to dockerfile (#1470) 1 год назад
README.md f31ef9e812 docs: update solana readme, add rust sdk readme (#1387) 1 год назад
rust-toolchain.toml 5ef1ff097a Bump toolchain: (#1382) 1 год назад

README.md

Pyth Solana Receiver

This folder contains:

Overview of the design

Posting a Pyth price update involves two steps:

  • First, verifying the VAA i.e. verifying the Wormhole guardians' signatures on the accumulator root that contains all the price updates for a given Pythnet slot.
  • Second, verifying the price update by providing an inclusion proof that proves the price update is part of the accumulator root that was verified in the first step.

Implementation

This contract offers two ways to post a Pyth price update onto Solana:

  • post_update allows you to do it in 2 transactions and checks all the Wormhole guardian signatures (the quorum is currently 13 signatures). It relies on the Wormhole contract to verify the signatures.
  • post_update_atomic allows you to do it in 1 transaction but only partially checks the Wormhole guardian signatures (5 signatures seems like the best it can currently do). Therefore it is less secure. It relies on a guardian set account from the Wormhole contract to check the signatures against the guardian keys.

post_update is also a more efficient way to post updates if you're looking to post data for many different price feeds at a single point in time. This is because it persists a verified encoded VAA, so guardian signatures will only get checked once. Then that single posted VAA can be used to prove the price update for all price feeds for that given point in time.

Program addresses

The program is currently deployed on Solana (Mainnet, Devnet) and Eclipse Testnet with addresses:

  • HDwcJBJXjL9FpJ7UBsYBtaDjsBUhuLCUYoz3zr8SWWaQ for the Wormhole receiver
  • rec5EKMGg6MxZYaMdyBfgwp4d5rB9T1VQH5pJv5LtFJ for the Pyth receiver

Example flow

The cli folder contains some useful client code to interact with both the Wormhole receiver and the Pyth receiver.

To run the full flow of posting a price update (on devnet) please follow the following steps:

Get a Hermes update from Hermes stable:

curl  "https://hermes.pyth.network/api/latest_vaas?ids[]=0xff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace"

Post it to devnet:

cargo run --package pyth-solana-receiver-cli -- --url https://api.devnet.solana.com --keypair ${PATH_TO_KEYPAIR} --wormhole HDwcJBJXjL9FpJ7UBsYBtaDjsBUhuLCUYoz3zr8SWWaQ post-price-update-atomic -p ${HERMES_UPDATE_IN_BASE_64}

or

cargo run --package pyth-solana-receiver-cli -- --url https://api.devnet.solana.com --keypair ${PATH_TO_KEYPAIR} --wormhole HDwcJBJXjL9FpJ7UBsYBtaDjsBUhuLCUYoz3zr8SWWaQ post-price-update -p ${HERMES_UPDATE_IN_BASE_64}