use af_ptbuilder::{Argument, ProgrammableTransactionBuilder, ptbuilder};
use af_sui_pkg_sdk::Address;
use af_sui_pkg_sdk::af_sui_types::ObjectArg;
pub struct UpdateAfOracleArguments {
pub pyth_state: Argument,
pub pyth_wrapper: Argument,
pub pfs_to_source: Vec<(Argument, Argument)>,
}
#[extension_traits::extension(pub trait ProgrammableTransactionBuilderExt)]
impl ProgrammableTransactionBuilder {
fn update_af_oracle_pyth_feed_args(
&mut self,
pyth_state: ObjectArg,
pyth_wrapper: ObjectArg,
pfs_to_source: Vec<(ObjectArg, ObjectArg)>,
) -> Result<UpdateAfOracleArguments, af_ptbuilder::Error> {
ptbuilder!(self {
input obj pyth_state;
input obj pyth_wrapper;
});
let mut vars = UpdateAfOracleArguments {
pfs_to_source: vec![],
pyth_state,
pyth_wrapper,
};
for (pfs, pio) in pfs_to_source {
ptbuilder!(self {
input obj pfs;
input obj pio;
});
vars.pfs_to_source.push((pfs, pio));
}
Ok(vars)
}
fn update_af_oracle_pyth_feed(
&mut self,
pyth_wrapper_pkg: Address,
arguments: UpdateAfOracleArguments,
) -> Result<(), af_ptbuilder::Error> {
let UpdateAfOracleArguments {
pfs_to_source,
pyth_wrapper,
pyth_state,
} = arguments;
ptbuilder!(self {
package pyth_wrapper_pkg;
input obj clock: ObjectArg::CLOCK_IMM;
});
for (price_feed_storage, price_info_object) in pfs_to_source {
ptbuilder!(self {
pyth_wrapper_pkg::wrapper::update_price_feed(
price_feed_storage,
pyth_wrapper,
pyth_state,
price_info_object,
clock,
);
});
}
Ok(())
}
}