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