pyth-crosschain/target_chains/solana
guibescos 7e65fd6597
[solana] reclaim rent (#1266)
* Checkpoint

* Checkpoint

* Cleanup

* Checkpoint, debug

* Go

* Checkpoint

* Fix

* Add new error and test

* Cleanup

* Add another test

* Keep adding errors

* Another test

* Add comment

* More

* Do it

* Again

* Nice

* Ship it
2024-02-01 15:51:24 +00:00
..
cli [solana] Solana tests 2 (#1255) 2024-01-30 13:55:23 +00:00
migrations [solana] Start to implement the solana receiver contract (#557) 2023-02-15 15:43:51 +00:00
program_simulator [Solana] More tests (#1263) 2024-01-31 16:53:48 +00:00
programs/pyth-solana-receiver [solana] reclaim rent (#1266) 2024-02-01 15:51:24 +00:00
.gitignore [solana] Start to implement the solana receiver contract (#557) 2023-02-15 15:43:51 +00:00
.prettierignore [solana] Start to implement the solana receiver contract (#557) 2023-02-15 15:43:51 +00:00
Anchor.toml [solana-reciever] update docs (#1192) 2023-12-18 21:56:02 +07:00
Cargo.lock [solana] Add wrong vaa tests (#1262) 2024-01-31 14:16:43 +00:00
Cargo.toml [rust] Remove serde_wormhole patch (#1249) 2024-01-25 20:05:07 +00:00
README.md [Solana] readme update (#1217) 2024-01-09 12:10:33 +00:00
rust-toolchain.toml Solana receiver decode vaa accumulator (#1145) 2023-11-30 16:04:41 -05:00

README.md

Pyth Solana Receiver

This folder contains:

  • A Pyth receiver program to receive Pythnet price feeds on Solana in programs/pyth-solana-receiver
  • A Cli that acts as a simple client to interact with the Pyth receiver program in cli/

Overview of the design

Receiving a price update from Pythnet 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 price update from Pythnet onto Solana:

  • post_updates 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_updates_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_updates 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.

Devnet deployment

The program is currently deployed on Devnet 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}