gmsol/exchange/
treasury.rs

1use 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/// Claim fees builder.
11// TODO: implement this.
12#[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    /// Create a new builder.
23    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    /// Set hint.
39    pub fn set_hint(&mut self, token: Pubkey) -> &mut Self {
40        self.hint_token = Some(token);
41        self
42    }
43
44    /// Build.
45    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        // FIXME: read program id from the market.
60        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}