pyth_sui_sdk/
read.rs

1//! JSON-RPC methods for querying Pyth on-chain data.
2use af_ptbuilder::ptb;
3use af_sui_types::{Address as SuiAddress, ObjectArg, TransactionKind, encode_base64_default};
4use sui_framework_sdk::object::ID;
5use sui_jsonrpc::api::WriteApiClient;
6
7pub type Result<T> = std::result::Result<T, Error>;
8
9#[derive(thiserror::Error, Debug)]
10pub enum Error {
11    #[error(transparent)]
12    JsonRpcClient(#[from] sui_jsonrpc::error::JsonRpcClientError),
13    #[error("In ProgrammableTransactionBuilder: {0}")]
14    PtBuilder(#[from] af_ptbuilder::Error),
15    #[error(transparent)]
16    FromHex(#[from] hex::FromHexError),
17    #[error("Serializing to BCS: {0}")]
18    Bcs(#[from] bcs::Error),
19    #[error("DevInspectResults.results is None")]
20    DevInspectResults,
21}
22
23/// Performs a dev-inspect with a client implementation to return the object ID for an off-chain
24/// price identifier.
25///
26/// Price identifiers can be found in <https://www.pyth.network/developers/price-feed-ids>
27pub async fn get_price_info_object_id_from_pyth_state<C>(
28    client: &C,
29    package: SuiAddress,
30    price_identifier_hex: String,
31    pyth_state: ObjectArg,
32) -> Result<SuiAddress>
33where
34    C: WriteApiClient + Sync,
35{
36    let price_identifier_bytes = &hex::decode(price_identifier_hex.replace("0x", ""))?;
37
38    let inspect_tx = ptb!(
39        package pyth: package;
40
41        input obj pyth_state;
42        input pure price_identifier_bytes;
43
44        pyth::state::get_price_info_object_id(pyth_state, price_identifier_bytes);
45    );
46
47    let mut results = {
48        let tx_bytes = encode_base64_default(bcs::to_bytes(
49            &TransactionKind::ProgrammableTransaction(inspect_tx),
50        )?);
51        let resp = client
52            .dev_inspect_transaction_block(
53                SuiAddress::ZERO, // doesn't matter
54                tx_bytes,
55                None,
56                None,
57                None,
58            )
59            .await?;
60        resp.results.ok_or(Error::DevInspectResults)?
61    };
62    let sui_exec_result = results.swap_remove(0);
63    let mut return_values = sui_exec_result.return_values;
64    let (bytes, _sui_type_tag) = return_values.swap_remove(0);
65    let id: ID = bcs::from_bytes(&bytes)?;
66    Ok(id.bytes)
67}