1use spl_associated_token_account::get_associated_token_address;
2use steel::*;
3
4use crate::prelude::*;
5
6pub 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
20pub 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
47pub 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
75pub 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
100pub 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
143pub 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}