1use spl_associated_token_account::get_associated_token_address;
2use steel::*;
3
4use crate::prelude::*;
5
6pub 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
19pub 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
45pub 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
72pub 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
96pub 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
139pub 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}