diff --git a/Cargo.lock b/Cargo.lock index e676c906..ebd5bb01 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1566,6 +1566,8 @@ name = "inf1-ctl-jiminy" version = "0.1.0" dependencies = [ "inf1-ctl-core", + "inf1-pp-core", + "inf1-svc-core", "jiminy-cpi", "jiminy-log", "jiminy-pda", diff --git a/controller/jiminy/Cargo.toml b/controller/jiminy/Cargo.toml index b450fec4..221c8c7d 100644 --- a/controller/jiminy/Cargo.toml +++ b/controller/jiminy/Cargo.toml @@ -6,6 +6,8 @@ version.workspace = true [dependencies] inf1-ctl-core = { workspace = true } +inf1-svc-core = { workspace = true } +inf1-pp-core = { workspace = true } jiminy-cpi = { workspace = true } jiminy-log = { workspace = true } jiminy-pda = { workspace = true } diff --git a/controller/jiminy/src/cpi.rs b/controller/jiminy/src/cpi.rs index 8ab1a7f5..7f56275c 100644 --- a/controller/jiminy/src/cpi.rs +++ b/controller/jiminy/src/cpi.rs @@ -1,8 +1,78 @@ +use core::ops::RangeInclusive; + use inf1_ctl_core::instructions::sync_sol_value::SyncSolValueIxPreAccs; +use inf1_pp_core::{ + instructions::price::{exact_in::PriceExactInIxArgs, exact_out::PriceExactOutIxArgs}, + traits::main::{PriceExactIn, PriceExactOut}, +}; +use inf1_svc_core::traits::SolValCalc; use jiminy_cpi::account::AccountHandle; +use jiminy_program_error::ProgramError; /// `S: AsRef<[AccountHandle]>` /// -> use [`IxAccountHandles::seq`] with [`jiminy_cpi::Cpi::invoke_fwd`] pub type SyncSolValueIxPreAccountHandles<'account> = SyncSolValueIxPreAccs>; // TODO: make invoke() helpers for client programs + +/// Wrapper for the return value from CPI call to `sol-val-calc` program +/// +/// This is then used to implement the `SolValCalc` trait +/// so as to have re-use the same `quote_*` functions +#[repr(transparent)] +pub struct LstToSolRetVal(pub RangeInclusive); + +/// Wrapper for the return value from CPI call to `sol-val-calc` program +/// +/// This is then used to implement the `SolValCalc` trait +/// so as to have re-use the same `quote_*` functions +#[repr(transparent)] +pub struct SolToLstRetVal(pub RangeInclusive); + +impl SolValCalc for LstToSolRetVal { + type Error = ProgramError; + + fn lst_to_sol(&self, _lst_amount: u64) -> Result, Self::Error> { + Ok(self.0.clone()) + } + + /// **NOTE:** This function should not be called with LstToSolRetVal + fn sol_to_lst(&self, _lamports_amount: u64) -> Result, Self::Error> { + unreachable!() + } +} + +impl SolValCalc for SolToLstRetVal { + type Error = ProgramError; + + fn lst_to_sol(&self, _lst_amount: u64) -> Result, Self::Error> { + unreachable!() + } + + fn sol_to_lst(&self, _lamports_amount: u64) -> Result, Self::Error> { + Ok(self.0.clone()) + } +} + +/// Wrapper for the return value from CPI call to `pricing` program +/// +/// This is used to implement the `PriceExactIn` and `PriceExactOut` traits +/// so as to have reuse the same `quote_*` functions +#[repr(transparent)] +pub struct PricingRetVal(pub u64); + +impl PriceExactIn for PricingRetVal { + type Error = ProgramError; + + fn price_exact_in(&self, _input: PriceExactInIxArgs) -> Result { + Ok(self.0) + } +} + +impl PriceExactOut for PricingRetVal { + type Error = ProgramError; + + fn price_exact_out(&self, _output: PriceExactOutIxArgs) -> Result { + Ok(self.0) + } +}