protobook_api/
sdk.rs

1use spl_associated_token_account::get_associated_token_address;
2use steel::*;
3
4use crate::prelude::*;
5
6// let [signer_info, order_info] = accounts else {
7
8pub fn cancel(authority: Pubkey, id: u64) -> Instruction {
9    let order_address = order_pda(authority, id).0;
10    Instruction {
11        program_id: crate::ID,
12        accounts: vec![
13            AccountMeta::new(authority, true),
14            AccountMeta::new(order_address, false),
15        ],
16        data: Cancel {}.to_bytes(),
17    }
18}
19
20// let [signer_info, beneficiary_a_info, beneficiary_b_info, mint_a_info, mint_b_info, order_info, vault_a_info, vault_b_info, system_program, token_program, associated_token_program] =
21
22pub fn close(authority: Pubkey, id: u64, mint_a: Pubkey, mint_b: Pubkey) -> Instruction {
23    let order_address = order_pda(authority, id).0;
24    let beneficiary_a = get_associated_token_address(&authority, &mint_a);
25    let beneficiary_b = get_associated_token_address(&authority, &mint_b);
26    let vault_a = get_associated_token_address(&order_address, &mint_a);
27    let vault_b = get_associated_token_address(&order_address, &mint_b);
28    Instruction {
29        program_id: crate::ID,
30        accounts: vec![
31            AccountMeta::new(authority, true),
32            AccountMeta::new(beneficiary_a, false),
33            AccountMeta::new(beneficiary_b, false),
34            AccountMeta::new(mint_a, false),
35            AccountMeta::new(mint_b, false),
36            AccountMeta::new(order_address, false),
37            AccountMeta::new(vault_a, false),
38            AccountMeta::new(vault_b, false),
39            AccountMeta::new_readonly(system_program::ID, false),
40            AccountMeta::new_readonly(spl_token::ID, false),
41            AccountMeta::new_readonly(spl_associated_token_account::ID, false),
42        ],
43        data: Close {}.to_bytes(),
44    }
45}
46
47// let [signer_info, beneficiary_info, fee_collector_info, mint_info, order_info, vault_info, system_program, token_program, associated_token_program] =
48
49pub fn collect(
50    authority: Pubkey,
51    beneficiary: Pubkey,
52    fee_collector: Pubkey,
53    id: u64,
54    mint: Pubkey,
55) -> Instruction {
56    let order_address = order_pda(authority, id).0;
57    let vault = get_associated_token_address(&order_address, &mint);
58    Instruction {
59        program_id: crate::ID,
60        accounts: vec![
61            AccountMeta::new(authority, true),
62            AccountMeta::new(beneficiary, false),
63            AccountMeta::new(fee_collector, false),
64            AccountMeta::new(mint, false),
65            AccountMeta::new(order_address, false),
66            AccountMeta::new(vault, false),
67            AccountMeta::new_readonly(system_program::ID, false),
68            AccountMeta::new_readonly(spl_token::ID, false),
69            AccountMeta::new_readonly(spl_associated_token_account::ID, false),
70        ],
71        data: Collect {}.to_bytes(),
72    }
73}
74
75// let [signer_info, order_info, receipt_info, sender_info, vault_b_info, system_program, token_program] =
76
77pub fn fill(authority: Pubkey, order: Pubkey, mint_b: Pubkey, amount: u64) -> Instruction {
78    let vault_b = get_associated_token_address(&order, &mint_b);
79    let receipt_address = receipt_pda(authority, order).0;
80    let sender = get_associated_token_address(&authority, &mint_b);
81    Instruction {
82        program_id: crate::ID,
83        accounts: vec![
84            AccountMeta::new(authority, true),
85            AccountMeta::new(order, false),
86            AccountMeta::new(receipt_address, false),
87            AccountMeta::new(sender, false),
88            AccountMeta::new(vault_b, false),
89            AccountMeta::new_readonly(system_program::ID, false),
90            AccountMeta::new_readonly(spl_token::ID, false),
91        ],
92        data: Fill {
93            amount: amount.to_le_bytes(),
94        }
95        .to_bytes(),
96    }
97}
98
99// let [signer_info, fee_collector_info, mint_a_info, mint_b_info, order_info, sender_info, vault_a_info, vault_b_info, system_program, token_program, associated_token_program] =
100
101pub fn open(
102    authority: Pubkey,
103    amount_a: u64,
104    amount_b: u64,
105    expires_at: i64,
106    fee: u64,
107    fee_collector: Pubkey,
108    id: u64,
109    mint_a: Pubkey,
110    mint_b: Pubkey,
111) -> Instruction {
112    let sender = get_associated_token_address(&authority, &mint_a);
113    let order_address = order_pda(authority, id).0;
114    let vault_a = get_associated_token_address(&order_address, &mint_a);
115    let vault_b = get_associated_token_address(&order_address, &mint_b);
116    Instruction {
117        program_id: crate::ID,
118        accounts: vec![
119            AccountMeta::new(authority, true),
120            AccountMeta::new(fee_collector, false),
121            AccountMeta::new(mint_a, false),
122            AccountMeta::new(mint_b, false),
123            AccountMeta::new(order_address, false),
124            AccountMeta::new(sender, false),
125            AccountMeta::new(vault_a, false),
126            AccountMeta::new(vault_b, false),
127            AccountMeta::new_readonly(system_program::ID, false),
128            AccountMeta::new_readonly(spl_token::ID, false),
129            AccountMeta::new_readonly(spl_associated_token_account::ID, false),
130        ],
131        data: Open {
132            amount_a: amount_a.to_le_bytes(),
133            amount_b: amount_b.to_le_bytes(),
134            expires_at: expires_at.to_le_bytes(),
135            fee: fee.to_le_bytes(),
136            id: id.to_le_bytes(),
137        }
138        .to_bytes(),
139    }
140}
141
142// let [signer_info, beneficiary_info, mint_info, order_info, receipt_info, vault_info, system_program, token_program, associated_token_program] =
143
144pub fn redeem(authority: Pubkey, beneficiary: Pubkey, id: u64, mint: Pubkey) -> Instruction {
145    let order_address = order_pda(authority, id).0;
146    let receipt_address = receipt_pda(authority, order_address).0;
147    let vault = get_associated_token_address(&order_address, &mint);
148    Instruction {
149        program_id: crate::ID,
150        accounts: vec![
151            AccountMeta::new(authority, true),
152            AccountMeta::new(beneficiary, false),
153            AccountMeta::new(mint, false),
154            AccountMeta::new(order_address, false),
155            AccountMeta::new(receipt_address, false),
156            AccountMeta::new(vault, false),
157            AccountMeta::new_readonly(system_program::ID, false),
158            AccountMeta::new_readonly(spl_token::ID, false),
159            AccountMeta::new_readonly(spl_associated_token_account::ID, false),
160        ],
161        data: Redeem {}.to_bytes(),
162    }
163}