phoenix/program/
instruction.rs

1use num_enum::TryFromPrimitive;
2use shank::ShankInstruction;
3
4#[repr(u8)]
5#[derive(TryFromPrimitive, Debug, Copy, Clone, ShankInstruction, PartialEq, Eq)]
6#[rustfmt::skip]
7pub enum PhoenixInstruction {
8    // Market instructions
9    /// Send a swap (no limit orders allowed) order
10    #[account(0, name = "phoenix_program", desc = "Phoenix program")]
11    #[account(1, name = "log_authority", desc = "Phoenix log authority")]
12    #[account(2, writable, name = "market", desc = "This account holds the market state")]
13    #[account(3, signer, name = "trader")]
14    #[account(4, writable, name = "base_account", desc = "Trader base token account")]
15    #[account(5, writable, name = "quote_account", desc = "Trader quote token account")]
16    #[account(6, writable, name = "base_vault", desc = "Base vault PDA, seeds are [b'vault', market_address, base_mint_address]")]
17    #[account(7, writable, name = "quote_vault", desc = "Quote vault PDA, seeds are [b'vault', market_address, quote_mint_address]")]
18    #[account(8, name = "token_program", desc = "Token program")]
19    Swap = 0,
20
21    /// Send a swap (no limit orders allowed) order using only deposited funds
22    #[account(0, name = "phoenix_program", desc = "Phoenix program")]
23    #[account(1, name = "log_authority", desc = "Phoenix log authority")]
24    #[account(2, writable, name = "market", desc = "This account holds the market state")]
25    #[account(3, signer, name = "trader")]
26    #[account(4, name = "seat")]
27    SwapWithFreeFunds = 1,
28
29    /// Place a limit order on the book. The order can cross if the supplied order type is Limit
30    #[account(0, name = "phoenix_program", desc = "Phoenix program")]
31    #[account(1, name = "log_authority", desc = "Phoenix log authority")]
32    #[account(2, writable, name = "market", desc = "This account holds the market state")]
33    #[account(3, signer, name = "trader")]
34    #[account(4, name = "seat")]
35    #[account(5, writable, name = "base_account", desc = "Trader base token account")]
36    #[account(6, writable, name = "quote_account", desc = "Trader quote token account")]
37    #[account(7, writable, name = "base_vault", desc = "Base vault PDA, seeds are [b'vault', market_address, base_mint_address]")]
38    #[account(8, writable, name = "quote_vault", desc = "Quote vault PDA, seeds are [b'vault', market_address, quote_mint_address]")]
39    #[account(9, name = "token_program", desc = "Token program")]
40    PlaceLimitOrder = 2,
41
42    /// Place a limit order on the book using only deposited funds.
43    #[account(0, name = "phoenix_program", desc = "Phoenix program")]
44    #[account(1, name = "log_authority", desc = "Phoenix log authority")]
45    #[account(2, writable, name = "market", desc = "This account holds the market state")]
46    #[account(3, signer, name = "trader")]
47    #[account(4, name = "seat")]
48    PlaceLimitOrderWithFreeFunds = 3,
49
50    /// Reduce the size of an existing order on the book 
51    #[account(0, name = "phoenix_program", desc = "Phoenix program")]
52    #[account(1, name = "log_authority", desc = "Phoenix log authority")]
53    #[account(2, writable, name = "market", desc = "This account holds the market state")]
54    #[account(3, signer, name = "trader")]
55    #[account(4, writable, name = "base_account", desc = "Trader base token account")]
56    #[account(5, writable, name = "quote_account", desc = "Trader quote token account")]
57    #[account(6, writable, name = "base_vault", desc = "Base vault PDA, seeds are [b'vault', market_address, base_mint_address]")]
58    #[account(7, writable, name = "quote_vault", desc = "Quote vault PDA, seeds are [b'vault', market_address, quote_mint_address]")]
59    #[account(8, name = "token_program", desc = "Token program")]
60    ReduceOrder = 4,
61
62    /// Reduce the size of an existing order on the book 
63    #[account(0, name = "phoenix_program", desc = "Phoenix program")]
64    #[account(1, name = "log_authority", desc = "Phoenix log authority")]
65    #[account(2, writable, name = "market", desc = "This account holds the market state")]
66    #[account(3, writable, signer, name = "trader")]
67    ReduceOrderWithFreeFunds = 5,
68
69
70    /// Cancel all orders 
71    #[account(0, name = "phoenix_program", desc = "Phoenix program")]
72    #[account(1, name = "log_authority", desc = "Phoenix log authority")]
73    #[account(2, writable, name = "market", desc = "This account holds the market state")]
74    #[account(3, signer, name = "trader")]
75    #[account(4, writable, name = "base_account", desc = "Trader base token account")]
76    #[account(5, writable, name = "quote_account", desc = "Trader quote token account")]
77    #[account(6, writable, name = "base_vault", desc = "Base vault PDA, seeds are [b'vault', market_address, base_mint_address]")]
78    #[account(7, writable, name = "quote_vault", desc = "Quote vault PDA, seeds are [b'vault', market_address, quote_mint_address]")]
79    #[account(8, name = "token_program", desc = "Token program")]
80    CancelAllOrders = 6,
81
82    /// Cancel all orders (no token transfers) 
83    #[account(0, name = "phoenix_program", desc = "Phoenix program")]
84    #[account(1, name = "log_authority", desc = "Phoenix log authority")]
85    #[account(2, writable, name = "market", desc = "This account holds the market state")]
86    #[account(3, signer, name = "trader")]
87    CancelAllOrdersWithFreeFunds = 7,
88
89    /// Cancel all orders more aggressive than a specified price
90    #[account(0, name = "phoenix_program", desc = "Phoenix program")]
91    #[account(1, name = "log_authority", desc = "Phoenix log authority")]
92    #[account(2, writable, name = "market", desc = "This account holds the market state")]
93    #[account(3, signer, name = "trader")]
94    #[account(4, writable, name = "base_account", desc = "Trader base token account")]
95    #[account(5, writable, name = "quote_account", desc = "Trader quote token account")]
96    #[account(6, writable, name = "base_vault", desc = "Base vault PDA, seeds are [b'vault', market_address, base_mint_address]")]
97    #[account(7, writable, name = "quote_vault", desc = "Quote vault PDA, seeds are [b'vault', market_address, quote_mint_address]")]
98    #[account(8, name = "token_program", desc = "Token program")]
99    CancelUpTo = 8,
100
101
102    /// Cancel all orders more aggressive than a specified price (no token transfers) 
103    #[account(0, name = "phoenix_program", desc = "Phoenix program")]
104    #[account(1, name = "log_authority", desc = "Phoenix log authority")]
105    #[account(2, writable, name = "market", desc = "This account holds the market state")]
106    #[account(3, signer, name = "trader")]
107    CancelUpToWithFreeFunds = 9,
108
109    /// Cancel multiple orders by ID 
110    #[account(0, name = "phoenix_program", desc = "Phoenix program")]
111    #[account(1, name = "log_authority", desc = "Phoenix log authority")]
112    #[account(2, writable, name = "market", desc = "This account holds the market state")]
113    #[account(3, signer, name = "trader")]
114    #[account(4, writable, name = "base_account", desc = "Trader base token account")]
115    #[account(5, writable, name = "quote_account", desc = "Trader quote token account")]
116    #[account(6, writable, name = "base_vault", desc = "Base vault PDA, seeds are [b'vault', market_address, base_mint_address]")]
117    #[account(7, writable, name = "quote_vault", desc = "Quote vault PDA, seeds are [b'vault', market_address, quote_mint_address]")]
118    #[account(8, name = "token_program", desc = "Token program")]
119    CancelMultipleOrdersById = 10,
120
121    /// Cancel multiple orders by ID (no token transfers) 
122    #[account(0, name = "phoenix_program", desc = "Phoenix program")]
123    #[account(1, name = "log_authority", desc = "Phoenix log authority")]
124    #[account(2, writable, name = "market", desc = "This account holds the market state")]
125    #[account(3, signer, name = "trader")]
126    CancelMultipleOrdersByIdWithFreeFunds = 11,
127
128    #[account(0, name = "phoenix_program", desc = "Phoenix program")]
129    #[account(1, name = "log_authority", desc = "Phoenix log authority")]
130    #[account(2, writable, name = "market", desc = "This account holds the market state")]
131    #[account(3, signer, name = "trader")]
132    #[account(4, writable, name = "base_account", desc = "Trader base token account")]
133    #[account(5, writable, name = "quote_account", desc = "Trader quote token account")]
134    #[account(6, writable, name = "base_vault", desc = "Base vault PDA, seeds are [b'vault', market_address, base_mint_address]")]
135    #[account(7, writable, name = "quote_vault", desc = "Quote vault PDA, seeds are [b'vault', market_address, quote_mint_address]")]
136    #[account(8, name = "token_program", desc = "Token program")]
137    WithdrawFunds = 12,
138
139    #[account(0, name = "phoenix_program", desc = "Phoenix program")]
140    #[account(1, name = "log_authority", desc = "Phoenix log authority")]
141    #[account(2, writable, name = "market", desc = "This account holds the market state")]
142    #[account(3, signer, name = "trader")]
143    #[account(4, name = "seat")]
144    #[account(5, writable, name = "base_account", desc = "Trader base token account")]
145    #[account(6, writable, name = "quote_account", desc = "Trader quote token account")]
146    #[account(7, writable, name = "base_vault", desc = "Base vault PDA, seeds are [b'vault', market_address, base_mint_address]")]
147    #[account(8, writable, name = "quote_vault", desc = "Quote vault PDA, seeds are [b'vault', market_address, quote_mint_address]")]
148    #[account(9, name = "token_program", desc = "Token program")]
149    DepositFunds = 13,
150
151    #[account(0, name = "phoenix_program", desc = "Phoenix program")]
152    #[account(1, name = "log_authority", desc = "Phoenix log authority")]
153    #[account(2, writable, name = "market", desc = "This account holds the market state")]
154    #[account(3, writable, signer, name = "payer")]
155    #[account(4, writable, name = "seat")]
156    #[account(5, name = "system_program", desc = "System program")]
157    RequestSeat = 14,
158
159    #[account(0, signer, name = "log_authority", desc = "Log authority")]
160    Log = 15,
161
162    /// Place multiple post only orders on the book.
163    /// Similar to single post only orders, these can either be set to be rejected or amended to top of book if they cross.
164    #[account(0, name = "phoenix_program", desc = "Phoenix program")]
165    #[account(1, name = "log_authority", desc = "Phoenix log authority")]
166    #[account(2, writable, name = "market", desc = "This account holds the market state")]
167    #[account(3, signer, name = "trader")]
168    #[account(4, name = "seat")]
169    #[account(5, writable, name = "base_account", desc = "Trader base token account")]
170    #[account(6, writable, name = "quote_account", desc = "Trader quote token account")]
171    #[account(7, writable, name = "base_vault", desc = "Base vault PDA, seeds are [b'vault', market_address, base_mint_address]")]
172    #[account(8, writable, name = "quote_vault", desc = "Quote vault PDA, seeds are [b'vault', market_address, quote_mint_address]")]
173    #[account(9, name = "token_program", desc = "Token program")]
174    PlaceMultiplePostOnlyOrders = 16,
175        
176    /// Place multiple post only orders on the book using only deposited funds.
177    /// Similar to single post only orders, these can either be set to be rejected or amended to top of book if they cross.
178    #[account(0, name = "phoenix_program", desc = "Phoenix program")]
179    #[account(1, name = "log_authority", desc = "Phoenix log authority")]
180    #[account(2, writable, name = "market", desc = "This account holds the market state")]
181    #[account(3, signer, name = "trader")]
182    #[account(4, name = "seat")]
183    PlaceMultiplePostOnlyOrdersWithFreeFunds = 17,
184
185
186    // Admin instructions
187    /// Create a market 
188    #[account(0, name = "phoenix_program", desc = "Phoenix program")]
189    #[account(1, name = "log_authority", desc = "Phoenix log authority")]
190    #[account(2, writable, name = "market", desc = "This account holds the market state")]
191    #[account(3, writable, signer, name = "market_creator", desc = "The market_creator account must sign for the creation of new vaults")]
192    #[account(4, name = "base_mint", desc = "Base mint account")]
193    #[account(5, name = "quote_mint", desc = "Quote mint account")]
194    #[account(6, writable, name = "base_vault", desc = "Base vault PDA, seeds are [b'vault', market_address, base_mint_address]")]
195    #[account(7, writable, name = "quote_vault", desc = "Quote vault PDA, seeds are [b'vault', market_address, quote_mint_address]")]
196    #[account(8, name = "system_program", desc = "System program")]
197    #[account(9, name = "token_program", desc = "Token program")]
198    InitializeMarket = 100,
199
200    #[account(0, name = "phoenix_program", desc = "Phoenix program")]
201    #[account(1, name = "log_authority", desc = "Phoenix log authority")]
202    #[account(2, writable, name = "market", desc = "This account holds the market state")]
203    #[account(3, signer, name = "successor", desc = "The successor account must sign to claim authority")]
204    ClaimAuthority = 101,
205
206    #[account(0, name = "phoenix_program", desc = "Phoenix program")]
207    #[account(1, name = "log_authority", desc = "Phoenix log authority")]
208    #[account(2, writable, name = "market", desc = "This account holds the market state")]
209    #[account(3, signer, name = "market_authority", desc = "The market_authority account must sign to name successor")]
210    NameSuccessor = 102,
211
212    #[account(0, name = "phoenix_program", desc = "Phoenix program")]
213    #[account(1, name = "log_authority", desc = "Phoenix log authority")]
214    #[account(2, writable, name = "market", desc = "This account holds the market state")]
215    #[account(3, signer, name = "market_authority", desc = "The market_authority account must sign to change market status")]
216    ChangeMarketStatus = 103,
217
218    #[account(0, name = "phoenix_program", desc = "Phoenix program")]
219    #[account(1, name = "log_authority", desc = "Phoenix log authority")]
220    #[account(2, writable, name = "market", desc = "This account holds the market state")]
221    #[account(3, signer, name = "market_authority", desc = "The market_authority account must sign to change seat status")]
222    #[account(4, writable, name = "seat")]
223    ChangeSeatStatus = 104,
224
225    #[account(0, name = "phoenix_program", desc = "Phoenix program")]
226    #[account(1, name = "log_authority", desc = "Phoenix log authority")]
227    #[account(2, writable, name = "market", desc = "This account holds the market state")]
228    #[account(3, signer, name = "market_authority", desc = "The market_authority account must sign to request a seat on behalf of a trader")]
229    #[account(4, writable, signer, name = "payer")]
230    #[account(5, name = "trader")]
231    #[account(6, writable, name = "seat")]
232    #[account(7, name = "system_program", desc = "System program")]
233    RequestSeatAuthorized = 105,
234
235    #[account(0, name = "phoenix_program", desc = "Phoenix program")]
236    #[account(1, name = "log_authority", desc = "Phoenix log authority")]
237    #[account(2, writable, name = "market", desc = "This account holds the market state")]
238    #[account(3, signer, name = "market_authority", desc = "The market_authority account must sign to evict a seat")]
239    #[account(4, name = "trader")]
240    #[account(5, name = "seat", desc = "The trader's PDA seat account, seeds are [b'seat', market_address, trader_address]")]
241    #[account(6, writable, name = "base_account")]
242    #[account(7, writable, name = "quote_account")]
243    #[account(8, writable, name = "base_vault")]
244    #[account(9, writable, name = "quote_vault")]
245    #[account(10, name = "token_program", desc = "Token program")]
246    EvictSeat = 106,
247
248    #[account(0, name = "phoenix_program", desc = "Phoenix program")]
249    #[account(1, name = "log_authority", desc = "Phoenix log authority")]
250    #[account(2, writable, name = "market", desc = "This account holds the market state")]
251    #[account(3, signer, name = "market_authority", desc = "The market_authority account must sign to claim authority")]
252    #[account(4, name = "trader")]
253    #[account(5, name = "seat", desc = "The trader's PDA seat account, seeds are [b'seat', market_address, trader_address]")]
254    #[account(6, writable, name = "base_account", desc = "Trader base token account")]
255    #[account(7, writable, name = "quote_account", desc = "Trader quote token account")]
256    #[account(8, writable, name = "base_vault", desc = "Base vault PDA, seeds are [b'vault', market_address, base_mint_address]")]
257    #[account(9, writable, name = "quote_vault", desc = "Quote vault PDA, seeds are [b'vault', market_address, quote_mint_address]")]
258    #[account(10, name = "token_program", desc = "Token program")]
259    ForceCancelOrders = 107,
260
261    #[account(0, name = "phoenix_program", desc = "Phoenix program")]
262    #[account(1, name = "log_authority", desc = "Phoenix log authority")]
263    #[account(2, writable, name = "market", desc = "This account holds the market state")]
264    #[account(3, signer, name = "sweeper", desc = "Signer of collect fees instruction")]
265    #[account(4, writable, name = "fee_recipient", desc = "Fee collector quote token account")]
266    #[account(5, writable, name = "quote_vault", desc = "Quote vault PDA, seeds are [b'vault', market_address, quote_mint_address]")]
267    #[account(6, name = "token_program", desc = "Token program")]
268    CollectFees = 108,
269
270    #[account(0, name = "phoenix_program", desc = "Phoenix program")]
271    #[account(1, name = "log_authority", desc = "Phoenix log authority")]
272    #[account(2, writable, name = "market", desc = "This account holds the market state")]
273    #[account(3, signer, name = "market_authority", desc = "The market_authority account must sign to change the free recipient")]
274    #[account(4, name = "new_fee_recipient", desc = "New fee recipient")]
275    ChangeFeeRecipient = 109,
276}
277
278impl PhoenixInstruction {
279    pub fn to_vec(&self) -> Vec<u8> {
280        vec![*self as u8]
281    }
282}
283
284#[test]
285fn test_instruction_serialization() {
286    for i in 0..=108 {
287        let instruction = match PhoenixInstruction::try_from(i) {
288            Ok(j) => j,
289            Err(_) => {
290                assert!(i < 100);
291                // This needs to be changed if new instructions are added
292                assert!(i > 17);
293                continue;
294            }
295        };
296        assert_eq!(instruction as u8, i);
297    }
298}