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(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
66pub 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#[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
132pub 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}