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