1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
use std::path::PathBuf;
use clap::{command, Subcommand};
use solana_program::pubkey::Pubkey;
#[derive(Subcommand)]
pub enum VaultCommands {
Config {
#[command(subcommand)]
action: ConfigActions,
},
Vault {
#[command(subcommand)]
action: VaultActions,
},
}
#[derive(Subcommand)]
pub enum ConfigActions {
/// Creates global config (can only be done once)
Initialize {
/// The program fee in basis points
program_fee_bps: u16,
/// The program fee wallet pubkey
program_fee_wallet: Pubkey,
},
/// Fetches global config
Get,
/// Set the config admin
SetAdmin {
/// The new admin's pubkey
new_admin: Pubkey,
},
/// Set the program fee
SetProgramFee {
/// The program fee
new_fee_bps: u16,
},
/// Set the program fee wallet
SetProgramFeeWallet {
/// The program fee wallet
program_fee_wallet: Pubkey,
},
}
/// Vault commands
#[derive(Subcommand)]
pub enum VaultActions {
/// Creates a new vault
Initialize {
/// The token which is allowed to be deposited into the vault
token_mint: String,
/// The deposit fee in bips
deposit_fee_bps: u16,
/// The withdrawal fee in bips
withdrawal_fee_bps: u16,
/// The reward fee in bips
reward_fee_bps: u16,
/// The decimals of the token
decimals: u8,
/// The amount of tokens to initialize the vault with ( in the smallest unit )
initialize_token_amount: u64,
/// The file path of VRT mint address
vrt_mint_address_file_path: Option<PathBuf>,
},
/// Creates token metadata for the vault's LRT token
CreateTokenMetadata {
/// The vault pubkey
vault: String,
/// The name of the token
name: String,
/// The symbol of the token
symbol: String,
/// The URI for the token metadata
uri: String,
},
UpdateTokenMetadata {
/// The vault pubkey
vault: String,
/// The name of the token
name: String,
/// The symbol of the token
symbol: String,
/// The URI for the token metadata
uri: String,
},
/// Starts the vault update cycle
InitializeVaultUpdateStateTracker {
/// Vault account
vault: String,
},
/// Cranks the vault update state tracker, needs to be run per operator
CrankVaultUpdateStateTracker {
/// Vault account
vault: String,
/// Operator account
operator: String,
},
/// Ends the vault update cycle
CloseVaultUpdateStateTracker {
/// Vault account
vault: String,
/// Optional NCN epoch to close
ncn_epoch: Option<u64>,
},
/// Mints VRT tokens
MintVRT {
/// Vault account
vault: String,
/// Amount to deposit
amount_in: u64,
/// Minimum amount of VRT to mint
min_amount_out: u64,
},
/// Sets up the delegations for an operator
InitializeOperatorDelegation {
/// Vault account
vault: String,
/// Operator account
operator: String,
},
/// Delegates tokens to an operator
DelegateToOperator {
/// Vault account
vault: String,
/// Operator account
operator: String,
/// Amount to delegate
amount: u64,
},
/// Cooldown delegation for an operator
CooldownOperatorDelegation {
/// Vault account
vault: String,
/// Operator account
operator: String,
/// Amount to cooldown
amount: u64,
},
/// Initialize Vault NCN Ticket
InitializeVaultNcnTicket {
/// Vault account
vault: String,
/// NCN account
ncn: String,
},
/// Warmup Vault NCN Ticket
WarmupVaultNcnTicket {
/// Vault account
vault: String,
/// NCN account
ncn: String,
},
/// Cooldown Vault NCN Ticket
CooldownVaultNcnTicket {
/// Vault account
vault: String,
/// NCN account
ncn: String,
},
/// Starts the withdrawal process
EnqueueWithdrawal {
/// Vault account
vault: String,
/// Amount to withdraw
amount: u64,
},
/// Change withdrawal ticket owner
ChangeWithdrawalTicketOwner {
/// The vault pubkey
vault: Pubkey,
/// The old ticket owner keypair
#[arg(long)]
old_ticket_owner_keypair: String,
/// The new ticket owner pubkey
new_ticket_owner: Pubkey,
},
/// Burns the withdrawal ticket, ending the withdrawal process
BurnWithdrawalTicket {
/// Vault account
vault: String,
},
/// Gets the update state tracker for a vault
GetVaultUpdateStateTracker {
/// Vault account
vault: String,
},
/// Gets the operator delegations for a vault
GetOperatorDelegations {
/// Vault account
vault: String,
},
/// Gets the operator delegation for a vault
GetOperatorDelegation {
/// Vault account
vault: String,
/// Operator account
operator: String,
},
GetWithdrawalTicket {
/// Vault account
vault: String,
/// Staker account
staker: Option<String>,
},
/// Gets a vault
Get {
/// The vault pubkey
pubkey: String,
},
/// List all vaults
List,
/// Set Admin
SetAdmin {
/// The Vault pubkey
vault: Pubkey,
/// Filepath or URL to a keypair of old admin
#[arg(long)]
old_admin_keypair: String,
/// Filepath or URL to a keypair of new admin
#[arg(long)]
new_admin_keypair: String,
},
/// Sets the deposit capacity in the vault
SetCapacity {
/// The vault pubkey
vault: String,
/// The new capacity
amount: u64,
},
/// Sets the fees in the vault
SetFees {
/// The vault pubkey
vault: Pubkey,
/// The deposit fee BPS
#[arg(long)]
deposit_fee_bps: Option<u16>,
/// The withdrawal fee BPS
#[arg(long)]
withdrawal_fee_bps: Option<u16>,
/// The reward fee BPS
#[arg(long)]
reward_fee_bps: Option<u16>,
},
/// Sets the vault's pause state
SetIsPaused {
/// The vault pubkey
vault: Pubkey,
/// Set pause
#[arg(long)]
set_pause: bool,
},
/// Set Secondary Admin
SetSecondaryAdmin {
/// The vault pubkey
vault: Pubkey,
/// The new admin pubkey
new_admin: Pubkey,
/// Set delegation_admin
#[arg(long)]
set_delegation_admin: bool,
/// Set operator_admin
#[arg(long)]
set_operator_admin: bool,
/// Set ncn_admin
#[arg(long)]
set_ncn_admin: bool,
/// Set slasher_admin
#[arg(long)]
set_slasher_admin: bool,
/// Set capacity_admin
#[arg(long)]
set_capacity_admin: bool,
/// Set fee_wallet
#[arg(long)]
set_fee_wallet: bool,
/// Set mint_burn_admin
#[arg(long)]
set_mint_burn_admin: bool,
/// Set delegate_asset_admin
#[arg(long)]
set_delegate_asset_admin: bool,
/// Set fee_admin
#[arg(long)]
set_fee_admin: bool,
/// Set metadata_admin
#[arg(long)]
set_metadata_admin: bool,
},
/// Update Vault Balance
UpdateVaultBalance {
/// The vault pubkey
vault: Pubkey,
},
/// Delegate a token account
DelegateTokenAccount {
/// The vault pubkey
vault: String,
/// The delegate account
delegate: String,
/// The token mint
token_mint: String,
/// The token account
token_account: String,
},
/// Transfer a token account
DelegatedTokenTransfer {
/// The token account
token_account: String,
/// The recipient pubkey
recipient_pubkey: String,
/// The amount to transfer
amount: u64,
},
}