1use 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
23pub 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, 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}