gmsol/exchange/
treasury.rs1use std::ops::Deref;
2
3use anchor_client::solana_sdk::{pubkey::Pubkey, signer::Signer};
4use anchor_spl::associated_token::get_associated_token_address_with_program_id;
5use gmsol_solana_utils::transaction_builder::TransactionBuilder;
6use gmsol_store::{accounts, instruction};
7
8use crate::store::token::TokenAccountOps;
9
10#[allow(dead_code)]
13pub struct ClaimFeesBuilder<'a, C> {
14 client: &'a crate::Client<C>,
15 store: Pubkey,
16 market_token: Pubkey,
17 is_long_token: bool,
18 hint_token: Option<Pubkey>,
19}
20
21impl<'a, C: Deref<Target = impl Signer> + Clone> ClaimFeesBuilder<'a, C> {
22 pub fn new(
24 client: &'a crate::Client<C>,
25 store: &Pubkey,
26 market_token: &Pubkey,
27 is_long_token: bool,
28 ) -> Self {
29 Self {
30 client,
31 store: *store,
32 market_token: *market_token,
33 is_long_token,
34 hint_token: None,
35 }
36 }
37
38 pub fn set_hint(&mut self, token: Pubkey) -> &mut Self {
40 self.hint_token = Some(token);
41 self
42 }
43
44 pub async fn build(&self) -> crate::Result<TransactionBuilder<'a, C>> {
46 let market = self
47 .client
48 .find_market_address(&self.store, &self.market_token);
49 let token = match self.hint_token {
50 Some(token) => token,
51 None => {
52 let market = self.client.market(&market).await?;
53 market.meta().pnl_token(self.is_long_token)
54 }
55 };
56
57 let authority = self.client.payer();
58 let vault = self.client.find_market_vault_address(&self.store, &token);
59 let token_program = anchor_spl::token::ID;
61 let target =
62 get_associated_token_address_with_program_id(&authority, &token, &token_program);
63
64 let prepare = self
65 .client
66 .prepare_associated_token_account(&token, &token_program, None);
67
68 let rpc = self
69 .client
70 .store_transaction()
71 .anchor_accounts(accounts::ClaimFeesFromMarket {
72 authority,
73 store: self.store,
74 market,
75 token_mint: token,
76 vault,
77 target,
78 token_program,
79 event_authority: self.client.store_event_authority(),
80 program: *self.client.store_program_id(),
81 })
82 .anchor_args(instruction::ClaimFeesFromMarket {});
83
84 Ok(prepare.merge(rpc))
85 }
86}