use borsh::{BorshDeserialize, BorshSerialize};
use shank::ShankInstruction;
use solana_program::program_error::ProgramError;
#[rustfmt::skip]
#[derive(Debug, BorshSerialize, BorshDeserialize, ShankInstruction)]
pub enum VaultInstruction {
#[account(0, writable, name = "config")]
#[account(1, writable, signer, name = "admin")]
#[account(2, name = "restaking_program")]
#[account(3, name = "program_fee_wallet")]
#[account(4, name = "system_program")]
InitializeConfig {
program_fee_bps: u16,
},
#[account(0, writable, name = "config")]
#[account(1, writable, name = "vault")]
#[account(2, writable, signer, name = "vrt_mint")]
#[account(3, name = "st_mint")]
#[account(4, writable, name = "admin_st_token_account")]
#[account(5, writable, name = "vault_st_token_account")]
#[account(6, name = "burn_vault")]
#[account(7, writable, name = "burn_vault_vrt_token_account")]
#[account(8, writable, signer, name = "admin")]
#[account(9, signer, name = "base")]
#[account(10, name = "system_program")]
#[account(11, name = "token_program")]
#[account(12, name = "associated_token_program")]
InitializeVault {
deposit_fee_bps: u16,
withdrawal_fee_bps: u16,
reward_fee_bps: u16,
decimals: u8,
initialize_token_amount: u64,
},
InitializeVaultWithMint,
#[account(0, name = "config")]
#[account(1, writable, name = "vault")]
#[account(2, writable, name = "operator")]
#[account(3, name = "operator_vault_ticket")]
#[account(4, writable, name = "vault_operator_delegation")]
#[account(5, signer, name = "admin")]
#[account(6, writable, signer, name = "payer")]
#[account(7, name = "system_program")]
InitializeVaultOperatorDelegation,
#[account(0, name = "config")]
#[account(1, writable, name = "vault")]
#[account(2, name = "ncn")]
#[account(3, name = "ncn_vault_ticket")]
#[account(4, writable, name = "vault_ncn_ticket")]
#[account(5, signer, name = "admin")]
#[account(6, writable, signer, name = "payer")]
#[account(7, name = "system_program")]
InitializeVaultNcnTicket,
#[account(0, name = "config")]
#[account(1, name = "vault")]
#[account(2, name = "ncn")]
#[account(3, name = "slasher")]
#[account(4, name = "operator")]
#[account(5, name = "vault_ncn_slasher_ticket")]
#[account(6, writable, name = "vault_ncn_slasher_operator_ticket")]
#[account(7, writable, signer, name = "payer")]
#[account(8, name = "system_program")]
InitializeVaultNcnSlasherOperatorTicket,
#[account(0, name = "config")]
#[account(1, name = "vault")]
#[account(2, name = "ncn")]
#[account(3, name = "slasher")]
#[account(4, name = "ncn_slasher_ticket")]
#[account(5, writable, name = "vault_slasher_ticket")]
#[account(6, signer, name = "admin")]
#[account(7, signer, writable, name = "payer")]
#[account(8, name = "system_program")]
InitializeVaultNcnSlasherTicket,
#[account(0, name = "config")]
#[account(1, writable, name = "vault")]
#[account(2, name = "ncn")]
#[account(3, writable, name = "vault_ncn_ticket")]
#[account(4, signer, name = "admin")]
WarmupVaultNcnTicket,
#[account(0, name = "config")]
#[account(1, name = "vault")]
#[account(2, name = "ncn")]
#[account(3, writable, name = "vault_ncn_ticket")]
#[account(4, signer, name = "admin")]
CooldownVaultNcnTicket,
#[account(0, name = "config")]
#[account(1, name = "vault")]
#[account(2, name = "ncn")]
#[account(3, name = "slasher")]
#[account(4, writable, name = "vault_slasher_ticket")]
#[account(5, signer, name = "admin")]
WarmupVaultNcnSlasherTicket,
#[account(0, name = "config")]
#[account(1, name = "vault")]
#[account(2, name = "ncn")]
#[account(3, name = "slasher")]
#[account(4, writable, name = "vault_ncn_slasher_ticket")]
#[account(5, signer, name = "admin")]
CooldownVaultNcnSlasherTicket,
#[account(0, name = "config")]
#[account(1, writable, name = "vault")]
#[account(2, writable, name = "vrt_mint")]
#[account(3, writable, signer, name = "depositor")]
#[account(4, writable, name = "depositor_token_account")]
#[account(5, writable, name = "vault_token_account")]
#[account(6, writable, name = "depositor_vrt_token_account")]
#[account(7, writable, name = "vault_fee_token_account")]
#[account(8, name = "token_program")]
#[account(9, signer, optional, name = "mint_signer", description = "Signer for minting")]
MintTo {
amount_in: u64,
min_amount_out: u64,
},
#[account(0, name = "config")]
#[account(1, writable, name = "vault")]
#[account(2, writable, name = "vault_staker_withdrawal_ticket")]
#[account(3, writable, name = "vault_staker_withdrawal_ticket_token_account")]
#[account(4, writable, signer, name = "staker")]
#[account(5, writable, name = "staker_vrt_token_account")]
#[account(6, signer, name = "base")]
#[account(7, name = "token_program")]
#[account(8, name = "system_program")]
#[account(9, signer, optional, name = "burn_signer", description = "Signer for burning")]
EnqueueWithdrawal {
amount: u64,
},
#[account(0, name = "config")]
#[account(1, name = "vault")]
#[account(2, writable, name = "vault_staker_withdrawal_ticket")]
#[account(3, signer, name = "old_owner")]
#[account(4, name = "new_owner")]
ChangeWithdrawalTicketOwner,
#[account(0, name = "config")]
#[account(1, writable, name = "vault")]
#[account(2, writable, name = "vault_token_account")]
#[account(3, writable, name = "vrt_mint")]
#[account(4, writable, name = "staker")]
#[account(5, writable, name = "staker_token_account")]
#[account(6, writable, name = "vault_staker_withdrawal_ticket")]
#[account(7, writable, name = "vault_staker_withdrawal_ticket_token_account")]
#[account(8, writable, name = "vault_fee_token_account")]
#[account(9, writable, name = "program_fee_token_account")]
#[account(10, name = "token_program")]
#[account(11, name = "system_program")]
#[account(12, signer, optional, name = "burn_signer", description = "Signer for burning")]
BurnWithdrawalTicket,
#[account(0, name = "config")]
#[account(1, writable, name = "vault")]
#[account(2, signer, name = "admin")]
SetDepositCapacity {
amount: u64
},
#[account(0, name = "config")]
#[account(1, writable, name = "vault")]
#[account(2, signer, name = "admin")]
SetFees {
deposit_fee_bps: Option<u16>,
withdrawal_fee_bps: Option<u16>,
reward_fee_bps: Option<u16>,
},
#[account(0, writable, name = "config")]
#[account(1, signer, name = "admin")]
SetProgramFee {
new_fee_bps: u16
},
#[account(0, writable, name = "config")]
#[account(1, signer, name = "program_fee_admin")]
#[account(2, name = "new_fee_wallet")]
SetProgramFeeWallet,
#[account(0, name = "config")]
#[account(1, writable, name = "vault")]
#[account(2, signer, name = "admin")]
SetIsPaused {
is_paused: bool,
},
#[account(0, name = "config")]
#[account(1, name = "vault")]
#[account(2, signer, name = "delegate_asset_admin")]
#[account(3, name = "token_mint")]
#[account(4, writable, name = "token_account")]
#[account(5, name = "delegate")]
#[account(6, name = "token_program")]
DelegateTokenAccount,
#[account(0, name = "config")]
#[account(1, writable, name = "vault")]
#[account(2, signer, name = "old_admin")]
#[account(3, signer, name = "new_admin")]
SetAdmin,
#[account(0, name = "config")]
#[account(1, writable, name = "vault")]
#[account(2, signer, name = "admin")]
#[account(3, name = "new_admin")]
SetSecondaryAdmin(VaultAdminRole),
#[account(0, name = "config")]
#[account(1, writable, name = "vault")]
#[account(2, name = "operator")]
#[account(3, writable, name = "vault_operator_delegation")]
#[account(4, signer, name = "admin")]
AddDelegation {
amount: u64,
},
#[account(0, name = "config")]
#[account(1, writable, name = "vault")]
#[account(2, name = "operator")]
#[account(3, writable, name = "vault_operator_delegation")]
#[account(4, signer, name = "admin")]
CooldownDelegation {
amount: u64,
},
#[account(0, name = "config")]
#[account(1, writable, name = "vault")]
#[account(2, name = "vault_token_account")]
#[account(3, writable, name = "vrt_mint")]
#[account(4, writable, name = "vault_fee_token_account")]
#[account(5, name = "token_program")]
UpdateVaultBalance,
#[account(0, name = "config")]
#[account(1, writable, name = "vault")]
#[account(2, writable, name = "vault_update_state_tracker")]
#[account(3, writable, name = "payer")]
#[account(4, name = "system_program")]
InitializeVaultUpdateStateTracker { withdrawal_allocation_method: WithdrawalAllocationMethod },
#[account(0, name = "config")]
#[account(1, writable, name = "vault")]
#[account(2, name = "operator")]
#[account(3, writable, name = "vault_operator_delegation")]
#[account(4, writable, name = "vault_update_state_tracker")]
CrankVaultUpdateStateTracker,
#[account(0, name = "config")]
#[account(1, writable, name = "vault")]
#[account(2, writable, name = "vault_update_state_tracker")]
#[account(3, writable, signer, name = "payer")]
CloseVaultUpdateStateTracker {
ncn_epoch: u64
},
#[account(0, name = "vault")]
#[account(1, signer, name = "admin")]
#[account(2, name = "vrt_mint")]
#[account(3, writable, signer, name = "payer")]
#[account(4, writable, name = "metadata")]
#[account(5, name = "mpl_token_metadata_program")]
#[account(6, name = "system_program")]
CreateTokenMetadata {
name: String,
symbol: String,
uri: String,
},
#[account(0, name = "vault")]
#[account(1, signer, name = "admin")]
#[account(2, name = "vrt_mint")]
#[account(3, writable, name = "metadata")]
#[account(4, name = "mpl_token_metadata_program")]
UpdateTokenMetadata {
name: String,
symbol: String,
uri: String,
},
#[account(0, writable, name = "config")]
#[account(1, signer, name = "old_admin")]
#[account(2, name = "new_admin")]
SetConfigAdmin,
}
#[derive(Debug, BorshSerialize, BorshDeserialize)]
pub enum VaultAdminRole {
DelegationAdmin,
OperatorAdmin,
NcnAdmin,
SlasherAdmin,
CapacityAdmin,
FeeWallet,
MintBurnAdmin,
DelegateAssetAdmin,
FeeAdmin,
MetadataAdmin,
}
#[derive(Debug, BorshSerialize, BorshDeserialize)]
#[repr(u8)]
pub enum WithdrawalAllocationMethod {
Greedy,
}
impl TryFrom<u8> for WithdrawalAllocationMethod {
type Error = ProgramError;
fn try_from(value: u8) -> Result<Self, Self::Error> {
match value {
0 => Ok(Self::Greedy),
_ => Err(ProgramError::InvalidArgument),
}
}
}