riptide_amm/generated/accounts/
market.rs1use crate::generated::types::AccountDiscriminator;
8use borsh::{BorshDeserialize, BorshSerialize};
9use solana_pubkey::Pubkey;
10
11#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)]
12#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13pub struct Market {
14 pub discriminator: AccountDiscriminator,
15 pub bump: [u8; 1],
16 pub cu_penalty_multiplier: u8,
17 pub max_inventory_imbalance_guard_per_cent: u8,
18 pub id: u32,
19 #[cfg_attr(
20 feature = "serde",
21 serde(with = "serde_with::As::<serde_with::DisplayFromStr>")
22 )]
23 pub authority: Pubkey,
24 #[cfg_attr(
25 feature = "serde",
26 serde(with = "serde_with::As::<serde_with::DisplayFromStr>")
27 )]
28 pub updater: Pubkey,
29 #[cfg_attr(
30 feature = "serde",
31 serde(with = "serde_with::As::<serde_with::DisplayFromStr>")
32 )]
33 pub mint_a: Pubkey,
34 #[cfg_attr(
35 feature = "serde",
36 serde(with = "serde_with::As::<serde_with::DisplayFromStr>")
37 )]
38 pub mint_b: Pubkey,
39 pub sequence: u64,
40 pub valid_until: u64,
41 #[cfg_attr(feature = "serde", serde(with = "serde_with::As::<serde_with::Bytes>"))]
42 pub oracle: [u8; 512],
43 pub min_spread_guard_per_m: i32,
44 pub arb_penalty_per_m: u32,
45 pub jitodontfront_penalty_per_m: u32,
46 pub padding1: [u8; 12],
47 pub min_oracle_price_guard: u128,
48 pub max_oracle_price_guard: u128,
49 #[cfg_attr(feature = "serde", serde(with = "serde_with::As::<serde_with::Bytes>"))]
50 pub padding2: [u8; 304],
51}
52
53pub const MARKET_DISCRIMINATOR: AccountDiscriminator = AccountDiscriminator::Market;
54
55impl Market {
56 pub const LEN: usize = 1024;
57
58 #[inline(always)]
59 pub fn from_bytes(data: &[u8]) -> Result<Self, std::io::Error> {
60 let mut data = data;
61 Self::deserialize(&mut data)
62 }
63}
64
65impl<'a> TryFrom<&solana_account_info::AccountInfo<'a>> for Market {
66 type Error = std::io::Error;
67
68 fn try_from(account_info: &solana_account_info::AccountInfo<'a>) -> Result<Self, Self::Error> {
69 let mut data: &[u8] = &(*account_info.data).borrow();
70 Self::deserialize(&mut data)
71 }
72}
73
74#[cfg(feature = "fetch")]
75pub fn fetch_market(
76 rpc: &solana_client::rpc_client::RpcClient,
77 address: &solana_pubkey::Pubkey,
78) -> Result<crate::shared::DecodedAccount<Market>, std::io::Error> {
79 let accounts = fetch_all_market(rpc, &[*address])?;
80 Ok(accounts[0].clone())
81}
82
83#[cfg(feature = "fetch")]
84pub fn fetch_all_market(
85 rpc: &solana_client::rpc_client::RpcClient,
86 addresses: &[solana_pubkey::Pubkey],
87) -> Result<Vec<crate::shared::DecodedAccount<Market>>, std::io::Error> {
88 let accounts = rpc
89 .get_multiple_accounts(addresses)
90 .map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e.to_string()))?;
91 let mut decoded_accounts: Vec<crate::shared::DecodedAccount<Market>> = Vec::new();
92 for i in 0..addresses.len() {
93 let address = addresses[i];
94 let account = accounts[i].as_ref().ok_or(std::io::Error::new(
95 std::io::ErrorKind::Other,
96 format!("Account not found: {}", address),
97 ))?;
98 let data = Market::from_bytes(&account.data)?;
99 decoded_accounts.push(crate::shared::DecodedAccount {
100 address,
101 account: account.clone(),
102 data,
103 });
104 }
105 Ok(decoded_accounts)
106}
107
108#[cfg(feature = "fetch")]
109pub fn fetch_maybe_market(
110 rpc: &solana_client::rpc_client::RpcClient,
111 address: &solana_pubkey::Pubkey,
112) -> Result<crate::shared::MaybeAccount<Market>, std::io::Error> {
113 let accounts = fetch_all_maybe_market(rpc, &[*address])?;
114 Ok(accounts[0].clone())
115}
116
117#[cfg(feature = "fetch")]
118pub fn fetch_all_maybe_market(
119 rpc: &solana_client::rpc_client::RpcClient,
120 addresses: &[solana_pubkey::Pubkey],
121) -> Result<Vec<crate::shared::MaybeAccount<Market>>, std::io::Error> {
122 let accounts = rpc
123 .get_multiple_accounts(addresses)
124 .map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e.to_string()))?;
125 let mut decoded_accounts: Vec<crate::shared::MaybeAccount<Market>> = Vec::new();
126 for i in 0..addresses.len() {
127 let address = addresses[i];
128 if let Some(account) = accounts[i].as_ref() {
129 let data = Market::from_bytes(&account.data)?;
130 decoded_accounts.push(crate::shared::MaybeAccount::Exists(
131 crate::shared::DecodedAccount {
132 address,
133 account: account.clone(),
134 data,
135 },
136 ));
137 } else {
138 decoded_accounts.push(crate::shared::MaybeAccount::NotFound(address));
139 }
140 }
141 Ok(decoded_accounts)
142}
143
144#[cfg(feature = "anchor")]
145impl anchor_lang::AccountDeserialize for Market {
146 fn try_deserialize_unchecked(buf: &mut &[u8]) -> anchor_lang::Result<Self> {
147 Ok(Self::deserialize(buf)?)
148 }
149}
150
151#[cfg(feature = "anchor")]
152impl anchor_lang::AccountSerialize for Market {}
153
154#[cfg(feature = "anchor")]
155impl anchor_lang::Owner for Market {
156 fn owner() -> Pubkey {
157 crate::RIPTIDE_ID
158 }
159}
160
161#[cfg(feature = "anchor-idl-build")]
162impl anchor_lang::IdlBuild for Market {}
163
164#[cfg(feature = "anchor-idl-build")]
165impl anchor_lang::Discriminator for Market {
166 const DISCRIMINATOR: &[u8] = &[0; 8];
167}