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, id: u64, mint_b: Pubkey, amount: u64) -> Instruction {
78    let order_address = order_pda(authority, id).0;
79    let vault_b = get_associated_token_address(&order_address, &mint_b);
80    let receipt_address = receipt_pda(authority, order_address).0;
81    let sender = get_associated_token_address(&authority, &mint_b);
82    Instruction {
83        program_id: crate::ID,
84        accounts: vec![
85            AccountMeta::new(authority, true),
86            AccountMeta::new(order_address, false),
87            AccountMeta::new(receipt_address, false),
88            AccountMeta::new(sender, false),
89            AccountMeta::new(vault_b, false),
90            AccountMeta::new_readonly(system_program::ID, false),
91            AccountMeta::new_readonly(spl_token::ID, false),
92        ],
93        data: Fill {
94            amount: amount.to_le_bytes(),
95        }
96        .to_bytes(),
97    }
98}
99
100// 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] =
101
102pub fn open(
103    authority: Pubkey,
104    amount_a: u64,
105    amount_b: u64,
106    expires_at: i64,
107    fee: u64,
108    fee_collector: Pubkey,
109    id: u64,
110    mint_a: Pubkey,
111    mint_b: Pubkey,
112) -> Instruction {
113    let sender = get_associated_token_address(&authority, &mint_a);
114    let order_address = order_pda(authority, id).0;
115    let vault_a = get_associated_token_address(&order_address, &mint_a);
116    let vault_b = get_associated_token_address(&order_address, &mint_b);
117    Instruction {
118        program_id: crate::ID,
119        accounts: vec![
120            AccountMeta::new(authority, true),
121            AccountMeta::new(fee_collector, false),
122            AccountMeta::new(mint_a, false),
123            AccountMeta::new(mint_b, false),
124            AccountMeta::new(order_address, false),
125            AccountMeta::new(sender, false),
126            AccountMeta::new(vault_a, false),
127            AccountMeta::new(vault_b, false),
128            AccountMeta::new_readonly(system_program::ID, false),
129            AccountMeta::new_readonly(spl_token::ID, false),
130            AccountMeta::new_readonly(spl_associated_token_account::ID, false),
131        ],
132        data: Open {
133            amount_a: amount_a.to_le_bytes(),
134            amount_b: amount_b.to_le_bytes(),
135            expires_at: expires_at.to_le_bytes(),
136            fee: fee.to_le_bytes(),
137            id: id.to_le_bytes(),
138        }
139        .to_bytes(),
140    }
141}
142
143// let [signer_info, beneficiary_info, mint_info, order_info, receipt_info, vault_info, system_program, token_program, associated_token_program] =
144
145pub fn redeem(authority: Pubkey, beneficiary: Pubkey, id: u64, mint: Pubkey) -> Instruction {
146    let order_address = order_pda(authority, id).0;
147    let receipt_address = receipt_pda(authority, order_address).0;
148    let vault = get_associated_token_address(&order_address, &mint);
149    Instruction {
150        program_id: crate::ID,
151        accounts: vec![
152            AccountMeta::new(authority, true),
153            AccountMeta::new(beneficiary, false),
154            AccountMeta::new(mint, false),
155            AccountMeta::new(order_address, false),
156            AccountMeta::new(receipt_address, false),
157            AccountMeta::new(vault, false),
158            AccountMeta::new_readonly(system_program::ID, false),
159            AccountMeta::new_readonly(spl_token::ID, false),
160            AccountMeta::new_readonly(spl_associated_token_account::ID, false),
161        ],
162        data: Redeem {}.to_bytes(),
163    }
164}