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(authority: Pubkey, beneficiary: Pubkey, order: Pubkey, mint: Pubkey) -> Instruction {
48    let vault = get_associated_token_address(&order, &mint);
49    Instruction {
50        program_id: crate::ID,
51        accounts: vec![
52            AccountMeta::new(authority, true),
53            AccountMeta::new(beneficiary, false),
54            AccountMeta::new(Pubkey::default(), false),
55            AccountMeta::new(mint, false),
56            AccountMeta::new(order, false),
57            AccountMeta::new(vault, false),
58            AccountMeta::new_readonly(system_program::ID, false),
59            AccountMeta::new_readonly(spl_token::ID, false),
60            AccountMeta::new_readonly(spl_associated_token_account::ID, false),
61        ],
62        data: Collect {}.to_bytes(),
63    }
64}
65
66// let [signer_info, order_info, receipt_info, sender_info, vault_b_info, system_program, token_program] =
67
68pub fn fill(authority: Pubkey, order: Pubkey, mint_b: Pubkey, amount: u64) -> Instruction {
69    let vault_b = get_associated_token_address(&order, &mint_b);
70    let receipt_address = receipt_pda(authority, order).0;
71    let sender = get_associated_token_address(&authority, &mint_b);
72    Instruction {
73        program_id: crate::ID,
74        accounts: vec![
75            AccountMeta::new(authority, true),
76            AccountMeta::new(order, false),
77            AccountMeta::new(receipt_address, false),
78            AccountMeta::new(sender, false),
79            AccountMeta::new(vault_b, false),
80            AccountMeta::new_readonly(system_program::ID, false),
81            AccountMeta::new_readonly(spl_token::ID, false),
82        ],
83        data: Fill {
84            amount: amount.to_le_bytes(),
85        }
86        .to_bytes(),
87    }
88}
89
90// 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] =
91
92#[allow(deprecated)]
93pub fn open(
94    authority: Pubkey,
95    amount_a: u64,
96    amount_b: u64,
97    expires_at: i64,
98    id: u64,
99    mint_a: Pubkey,
100    mint_b: Pubkey,
101) -> Instruction {
102    let sender = get_associated_token_address(&authority, &mint_a);
103    let order_address = order_pda(authority, id).0;
104    let vault_a = get_associated_token_address(&order_address, &mint_a);
105    let vault_b = get_associated_token_address(&order_address, &mint_b);
106    Instruction {
107        program_id: crate::ID,
108        accounts: vec![
109            AccountMeta::new(authority, true),
110            AccountMeta::new(Pubkey::default(), false),
111            AccountMeta::new(mint_a, false),
112            AccountMeta::new(mint_b, false),
113            AccountMeta::new(order_address, false),
114            AccountMeta::new(sender, false),
115            AccountMeta::new(vault_a, false),
116            AccountMeta::new(vault_b, false),
117            AccountMeta::new_readonly(system_program::ID, false),
118            AccountMeta::new_readonly(spl_token::ID, false),
119            AccountMeta::new_readonly(spl_associated_token_account::ID, false),
120        ],
121        data: Open {
122            amount_a: amount_a.to_le_bytes(),
123            amount_b: amount_b.to_le_bytes(),
124            expires_at: expires_at.to_le_bytes(),
125            fee: 0u64.to_le_bytes(),
126            id: id.to_le_bytes(),
127        }
128        .to_bytes(),
129    }
130}
131
132// let [signer_info, beneficiary_info, mint_info, order_info, receipt_info, vault_info, system_program, token_program, associated_token_program] =
133
134pub fn redeem(authority: Pubkey, beneficiary: Pubkey, order: Pubkey, mint: Pubkey) -> Instruction {
135    let receipt_address = receipt_pda(authority, order).0;
136    let vault = get_associated_token_address(&order, &mint);
137    Instruction {
138        program_id: crate::ID,
139        accounts: vec![
140            AccountMeta::new(authority, true),
141            AccountMeta::new(beneficiary, false),
142            AccountMeta::new(mint, false),
143            AccountMeta::new(order, false),
144            AccountMeta::new(receipt_address, false),
145            AccountMeta::new(vault, false),
146            AccountMeta::new_readonly(system_program::ID, false),
147            AccountMeta::new_readonly(spl_token::ID, false),
148            AccountMeta::new_readonly(spl_associated_token_account::ID, false),
149        ],
150        data: Redeem {}.to_bytes(),
151    }
152}