From 2bd58f475d41e29ae3324975401f22c953a3c416 Mon Sep 17 00:00:00 2001 From: Christian Krueger Date: Thu, 23 Jan 2025 20:52:06 -0700 Subject: [PATCH 1/2] revoke function added --- .../instructions/addDelegation.ts | 2 +- .../closeVaultUpdateStateTracker.ts | 2 +- .../instructions/cooldownDelegation.ts | 2 +- .../crankVaultUpdateStateTracker.ts | 2 +- .../instructions/createTokenMetadata.ts | 2 +- clients/js/vault_client/instructions/index.ts | 1 + .../initializeVaultUpdateStateTracker.ts | 2 +- .../revokeDelegateTokenAccount.ts | 261 +++++++++ .../js/vault_client/instructions/setAdmin.ts | 2 +- .../instructions/setConfigAdmin.ts | 2 +- .../instructions/setSecondaryAdmin.ts | 2 +- .../instructions/updateTokenMetadata.ts | 2 +- .../instructions/updateVaultBalance.ts | 2 +- clients/js/vault_client/programs/jitoVault.ts | 28 +- .../generated/instructions/add_delegation.rs | 2 +- .../close_vault_update_state_tracker.rs | 2 +- .../instructions/cooldown_delegation.rs | 2 +- .../crank_vault_update_state_tracker.rs | 2 +- .../instructions/create_token_metadata.rs | 2 +- .../initialize_vault_update_state_tracker.rs | 2 +- .../src/generated/instructions/mod.rs | 9 +- .../revoke_delegate_token_account.rs | 523 ++++++++++++++++++ .../src/generated/instructions/set_admin.rs | 2 +- .../instructions/set_config_admin.rs | 2 +- .../instructions/set_secondary_admin.rs | 2 +- .../instructions/update_token_metadata.rs | 2 +- .../instructions/update_vault_balance.rs | 2 +- idl/jito_vault.json | 67 ++- .../tests/fixtures/vault_client.rs | 29 + integration_tests/tests/vault/mod.rs | 1 + .../vault/revoke_delegate_token_account.rs | 257 +++++++++ vault_program/src/lib.rs | 6 + .../src/revoke_delegate_token_account.rs | 84 +++ vault_sdk/src/instruction.rs | 10 + vault_sdk/src/sdk.rs | 29 + 35 files changed, 1302 insertions(+), 47 deletions(-) create mode 100644 clients/js/vault_client/instructions/revokeDelegateTokenAccount.ts create mode 100644 clients/rust/vault_client/src/generated/instructions/revoke_delegate_token_account.rs create mode 100644 integration_tests/tests/vault/revoke_delegate_token_account.rs create mode 100644 vault_program/src/revoke_delegate_token_account.rs diff --git a/clients/js/vault_client/instructions/addDelegation.ts b/clients/js/vault_client/instructions/addDelegation.ts index f1b321ac..c38d7d70 100644 --- a/clients/js/vault_client/instructions/addDelegation.ts +++ b/clients/js/vault_client/instructions/addDelegation.ts @@ -32,7 +32,7 @@ import { import { JITO_VAULT_PROGRAM_ADDRESS } from '../programs'; import { getAccountMetaFactory, type ResolvedAccount } from '../shared'; -export const ADD_DELEGATION_DISCRIMINATOR = 23; +export const ADD_DELEGATION_DISCRIMINATOR = 24; export function getAddDelegationDiscriminatorBytes() { return getU8Encoder().encode(ADD_DELEGATION_DISCRIMINATOR); diff --git a/clients/js/vault_client/instructions/closeVaultUpdateStateTracker.ts b/clients/js/vault_client/instructions/closeVaultUpdateStateTracker.ts index 329f0cf7..13767732 100644 --- a/clients/js/vault_client/instructions/closeVaultUpdateStateTracker.ts +++ b/clients/js/vault_client/instructions/closeVaultUpdateStateTracker.ts @@ -32,7 +32,7 @@ import { import { JITO_VAULT_PROGRAM_ADDRESS } from '../programs'; import { getAccountMetaFactory, type ResolvedAccount } from '../shared'; -export const CLOSE_VAULT_UPDATE_STATE_TRACKER_DISCRIMINATOR = 28; +export const CLOSE_VAULT_UPDATE_STATE_TRACKER_DISCRIMINATOR = 29; export function getCloseVaultUpdateStateTrackerDiscriminatorBytes() { return getU8Encoder().encode(CLOSE_VAULT_UPDATE_STATE_TRACKER_DISCRIMINATOR); diff --git a/clients/js/vault_client/instructions/cooldownDelegation.ts b/clients/js/vault_client/instructions/cooldownDelegation.ts index 9ceb0b07..5a6b5c9e 100644 --- a/clients/js/vault_client/instructions/cooldownDelegation.ts +++ b/clients/js/vault_client/instructions/cooldownDelegation.ts @@ -32,7 +32,7 @@ import { import { JITO_VAULT_PROGRAM_ADDRESS } from '../programs'; import { getAccountMetaFactory, type ResolvedAccount } from '../shared'; -export const COOLDOWN_DELEGATION_DISCRIMINATOR = 24; +export const COOLDOWN_DELEGATION_DISCRIMINATOR = 25; export function getCooldownDelegationDiscriminatorBytes() { return getU8Encoder().encode(COOLDOWN_DELEGATION_DISCRIMINATOR); diff --git a/clients/js/vault_client/instructions/crankVaultUpdateStateTracker.ts b/clients/js/vault_client/instructions/crankVaultUpdateStateTracker.ts index 6d969829..86abd26a 100644 --- a/clients/js/vault_client/instructions/crankVaultUpdateStateTracker.ts +++ b/clients/js/vault_client/instructions/crankVaultUpdateStateTracker.ts @@ -27,7 +27,7 @@ import { import { JITO_VAULT_PROGRAM_ADDRESS } from '../programs'; import { getAccountMetaFactory, type ResolvedAccount } from '../shared'; -export const CRANK_VAULT_UPDATE_STATE_TRACKER_DISCRIMINATOR = 27; +export const CRANK_VAULT_UPDATE_STATE_TRACKER_DISCRIMINATOR = 28; export function getCrankVaultUpdateStateTrackerDiscriminatorBytes() { return getU8Encoder().encode(CRANK_VAULT_UPDATE_STATE_TRACKER_DISCRIMINATOR); diff --git a/clients/js/vault_client/instructions/createTokenMetadata.ts b/clients/js/vault_client/instructions/createTokenMetadata.ts index 7495c9a2..6b33c0e4 100644 --- a/clients/js/vault_client/instructions/createTokenMetadata.ts +++ b/clients/js/vault_client/instructions/createTokenMetadata.ts @@ -37,7 +37,7 @@ import { import { JITO_VAULT_PROGRAM_ADDRESS } from '../programs'; import { getAccountMetaFactory, type ResolvedAccount } from '../shared'; -export const CREATE_TOKEN_METADATA_DISCRIMINATOR = 29; +export const CREATE_TOKEN_METADATA_DISCRIMINATOR = 30; export function getCreateTokenMetadataDiscriminatorBytes() { return getU8Encoder().encode(CREATE_TOKEN_METADATA_DISCRIMINATOR); diff --git a/clients/js/vault_client/instructions/index.ts b/clients/js/vault_client/instructions/index.ts index 7bc28cbe..9624cbd2 100644 --- a/clients/js/vault_client/instructions/index.ts +++ b/clients/js/vault_client/instructions/index.ts @@ -26,6 +26,7 @@ export * from './initializeVaultOperatorDelegation'; export * from './initializeVaultUpdateStateTracker'; export * from './initializeVaultWithMint'; export * from './mintTo'; +export * from './revokeDelegateTokenAccount'; export * from './setAdmin'; export * from './setConfigAdmin'; export * from './setDepositCapacity'; diff --git a/clients/js/vault_client/instructions/initializeVaultUpdateStateTracker.ts b/clients/js/vault_client/instructions/initializeVaultUpdateStateTracker.ts index 30a11f3c..722e41a7 100644 --- a/clients/js/vault_client/instructions/initializeVaultUpdateStateTracker.ts +++ b/clients/js/vault_client/instructions/initializeVaultUpdateStateTracker.ts @@ -33,7 +33,7 @@ import { type WithdrawalAllocationMethodArgs, } from '../types'; -export const INITIALIZE_VAULT_UPDATE_STATE_TRACKER_DISCRIMINATOR = 26; +export const INITIALIZE_VAULT_UPDATE_STATE_TRACKER_DISCRIMINATOR = 27; export function getInitializeVaultUpdateStateTrackerDiscriminatorBytes() { return getU8Encoder().encode( diff --git a/clients/js/vault_client/instructions/revokeDelegateTokenAccount.ts b/clients/js/vault_client/instructions/revokeDelegateTokenAccount.ts new file mode 100644 index 00000000..6bbaa9f1 --- /dev/null +++ b/clients/js/vault_client/instructions/revokeDelegateTokenAccount.ts @@ -0,0 +1,261 @@ +/** + * This code was AUTOGENERATED using the kinobi library. + * Please DO NOT EDIT THIS FILE, instead use visitors + * to add features, then rerun kinobi to update it. + * + * @see https://github.com/kinobi-so/kinobi + */ + +import { + combineCodec, + getStructDecoder, + getStructEncoder, + getU8Decoder, + getU8Encoder, + transformEncoder, + type Address, + type Codec, + type Decoder, + type Encoder, + type IAccountMeta, + type IAccountSignerMeta, + type IInstruction, + type IInstructionWithAccounts, + type IInstructionWithData, + type ReadonlyAccount, + type ReadonlySignerAccount, + type TransactionSigner, + type WritableAccount, +} from '@solana/web3.js'; +import { JITO_VAULT_PROGRAM_ADDRESS } from '../programs'; +import { getAccountMetaFactory, type ResolvedAccount } from '../shared'; + +export const REVOKE_DELEGATE_TOKEN_ACCOUNT_DISCRIMINATOR = 21; + +export function getRevokeDelegateTokenAccountDiscriminatorBytes() { + return getU8Encoder().encode(REVOKE_DELEGATE_TOKEN_ACCOUNT_DISCRIMINATOR); +} + +export type RevokeDelegateTokenAccountInstruction< + TProgram extends string = typeof JITO_VAULT_PROGRAM_ADDRESS, + TAccountConfig extends string | IAccountMeta = string, + TAccountVault extends string | IAccountMeta = string, + TAccountDelegateAssetAdmin extends string | IAccountMeta = string, + TAccountTokenMint extends string | IAccountMeta = string, + TAccountTokenAccount extends string | IAccountMeta = string, + TAccountDelegate extends string | IAccountMeta = string, + TAccountTokenProgram extends + | string + | IAccountMeta = 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA', + TRemainingAccounts extends readonly IAccountMeta[] = [], +> = IInstruction & + IInstructionWithData & + IInstructionWithAccounts< + [ + TAccountConfig extends string + ? ReadonlyAccount + : TAccountConfig, + TAccountVault extends string + ? ReadonlyAccount + : TAccountVault, + TAccountDelegateAssetAdmin extends string + ? ReadonlySignerAccount & + IAccountSignerMeta + : TAccountDelegateAssetAdmin, + TAccountTokenMint extends string + ? ReadonlyAccount + : TAccountTokenMint, + TAccountTokenAccount extends string + ? WritableAccount + : TAccountTokenAccount, + TAccountDelegate extends string + ? ReadonlyAccount + : TAccountDelegate, + TAccountTokenProgram extends string + ? ReadonlyAccount + : TAccountTokenProgram, + ...TRemainingAccounts, + ] + >; + +export type RevokeDelegateTokenAccountInstructionData = { + discriminator: number; +}; + +export type RevokeDelegateTokenAccountInstructionDataArgs = {}; + +export function getRevokeDelegateTokenAccountInstructionDataEncoder(): Encoder { + return transformEncoder( + getStructEncoder([['discriminator', getU8Encoder()]]), + (value) => ({ + ...value, + discriminator: REVOKE_DELEGATE_TOKEN_ACCOUNT_DISCRIMINATOR, + }) + ); +} + +export function getRevokeDelegateTokenAccountInstructionDataDecoder(): Decoder { + return getStructDecoder([['discriminator', getU8Decoder()]]); +} + +export function getRevokeDelegateTokenAccountInstructionDataCodec(): Codec< + RevokeDelegateTokenAccountInstructionDataArgs, + RevokeDelegateTokenAccountInstructionData +> { + return combineCodec( + getRevokeDelegateTokenAccountInstructionDataEncoder(), + getRevokeDelegateTokenAccountInstructionDataDecoder() + ); +} + +export type RevokeDelegateTokenAccountInput< + TAccountConfig extends string = string, + TAccountVault extends string = string, + TAccountDelegateAssetAdmin extends string = string, + TAccountTokenMint extends string = string, + TAccountTokenAccount extends string = string, + TAccountDelegate extends string = string, + TAccountTokenProgram extends string = string, +> = { + config: Address; + vault: Address; + delegateAssetAdmin: TransactionSigner; + tokenMint: Address; + tokenAccount: Address; + delegate: Address; + tokenProgram?: Address; +}; + +export function getRevokeDelegateTokenAccountInstruction< + TAccountConfig extends string, + TAccountVault extends string, + TAccountDelegateAssetAdmin extends string, + TAccountTokenMint extends string, + TAccountTokenAccount extends string, + TAccountDelegate extends string, + TAccountTokenProgram extends string, +>( + input: RevokeDelegateTokenAccountInput< + TAccountConfig, + TAccountVault, + TAccountDelegateAssetAdmin, + TAccountTokenMint, + TAccountTokenAccount, + TAccountDelegate, + TAccountTokenProgram + > +): RevokeDelegateTokenAccountInstruction< + typeof JITO_VAULT_PROGRAM_ADDRESS, + TAccountConfig, + TAccountVault, + TAccountDelegateAssetAdmin, + TAccountTokenMint, + TAccountTokenAccount, + TAccountDelegate, + TAccountTokenProgram +> { + // Program address. + const programAddress = JITO_VAULT_PROGRAM_ADDRESS; + + // Original accounts. + const originalAccounts = { + config: { value: input.config ?? null, isWritable: false }, + vault: { value: input.vault ?? null, isWritable: false }, + delegateAssetAdmin: { + value: input.delegateAssetAdmin ?? null, + isWritable: false, + }, + tokenMint: { value: input.tokenMint ?? null, isWritable: false }, + tokenAccount: { value: input.tokenAccount ?? null, isWritable: true }, + delegate: { value: input.delegate ?? null, isWritable: false }, + tokenProgram: { value: input.tokenProgram ?? null, isWritable: false }, + }; + const accounts = originalAccounts as Record< + keyof typeof originalAccounts, + ResolvedAccount + >; + + // Resolve default values. + if (!accounts.tokenProgram.value) { + accounts.tokenProgram.value = + 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA' as Address<'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'>; + } + + const getAccountMeta = getAccountMetaFactory(programAddress, 'programId'); + const instruction = { + accounts: [ + getAccountMeta(accounts.config), + getAccountMeta(accounts.vault), + getAccountMeta(accounts.delegateAssetAdmin), + getAccountMeta(accounts.tokenMint), + getAccountMeta(accounts.tokenAccount), + getAccountMeta(accounts.delegate), + getAccountMeta(accounts.tokenProgram), + ], + programAddress, + data: getRevokeDelegateTokenAccountInstructionDataEncoder().encode({}), + } as RevokeDelegateTokenAccountInstruction< + typeof JITO_VAULT_PROGRAM_ADDRESS, + TAccountConfig, + TAccountVault, + TAccountDelegateAssetAdmin, + TAccountTokenMint, + TAccountTokenAccount, + TAccountDelegate, + TAccountTokenProgram + >; + + return instruction; +} + +export type ParsedRevokeDelegateTokenAccountInstruction< + TProgram extends string = typeof JITO_VAULT_PROGRAM_ADDRESS, + TAccountMetas extends readonly IAccountMeta[] = readonly IAccountMeta[], +> = { + programAddress: Address; + accounts: { + config: TAccountMetas[0]; + vault: TAccountMetas[1]; + delegateAssetAdmin: TAccountMetas[2]; + tokenMint: TAccountMetas[3]; + tokenAccount: TAccountMetas[4]; + delegate: TAccountMetas[5]; + tokenProgram: TAccountMetas[6]; + }; + data: RevokeDelegateTokenAccountInstructionData; +}; + +export function parseRevokeDelegateTokenAccountInstruction< + TProgram extends string, + TAccountMetas extends readonly IAccountMeta[], +>( + instruction: IInstruction & + IInstructionWithAccounts & + IInstructionWithData +): ParsedRevokeDelegateTokenAccountInstruction { + if (instruction.accounts.length < 7) { + // TODO: Coded error. + throw new Error('Not enough accounts'); + } + let accountIndex = 0; + const getNextAccount = () => { + const accountMeta = instruction.accounts![accountIndex]!; + accountIndex += 1; + return accountMeta; + }; + return { + programAddress: instruction.programAddress, + accounts: { + config: getNextAccount(), + vault: getNextAccount(), + delegateAssetAdmin: getNextAccount(), + tokenMint: getNextAccount(), + tokenAccount: getNextAccount(), + delegate: getNextAccount(), + tokenProgram: getNextAccount(), + }, + data: getRevokeDelegateTokenAccountInstructionDataDecoder().decode( + instruction.data + ), + }; +} diff --git a/clients/js/vault_client/instructions/setAdmin.ts b/clients/js/vault_client/instructions/setAdmin.ts index e988be46..49764be2 100644 --- a/clients/js/vault_client/instructions/setAdmin.ts +++ b/clients/js/vault_client/instructions/setAdmin.ts @@ -30,7 +30,7 @@ import { import { JITO_VAULT_PROGRAM_ADDRESS } from '../programs'; import { getAccountMetaFactory, type ResolvedAccount } from '../shared'; -export const SET_ADMIN_DISCRIMINATOR = 21; +export const SET_ADMIN_DISCRIMINATOR = 22; export function getSetAdminDiscriminatorBytes() { return getU8Encoder().encode(SET_ADMIN_DISCRIMINATOR); diff --git a/clients/js/vault_client/instructions/setConfigAdmin.ts b/clients/js/vault_client/instructions/setConfigAdmin.ts index 86a43fc6..75b982d0 100644 --- a/clients/js/vault_client/instructions/setConfigAdmin.ts +++ b/clients/js/vault_client/instructions/setConfigAdmin.ts @@ -30,7 +30,7 @@ import { import { JITO_VAULT_PROGRAM_ADDRESS } from '../programs'; import { getAccountMetaFactory, type ResolvedAccount } from '../shared'; -export const SET_CONFIG_ADMIN_DISCRIMINATOR = 31; +export const SET_CONFIG_ADMIN_DISCRIMINATOR = 32; export function getSetConfigAdminDiscriminatorBytes() { return getU8Encoder().encode(SET_CONFIG_ADMIN_DISCRIMINATOR); diff --git a/clients/js/vault_client/instructions/setSecondaryAdmin.ts b/clients/js/vault_client/instructions/setSecondaryAdmin.ts index 513a4568..00435be7 100644 --- a/clients/js/vault_client/instructions/setSecondaryAdmin.ts +++ b/clients/js/vault_client/instructions/setSecondaryAdmin.ts @@ -36,7 +36,7 @@ import { type VaultAdminRoleArgs, } from '../types'; -export const SET_SECONDARY_ADMIN_DISCRIMINATOR = 22; +export const SET_SECONDARY_ADMIN_DISCRIMINATOR = 23; export function getSetSecondaryAdminDiscriminatorBytes() { return getU8Encoder().encode(SET_SECONDARY_ADMIN_DISCRIMINATOR); diff --git a/clients/js/vault_client/instructions/updateTokenMetadata.ts b/clients/js/vault_client/instructions/updateTokenMetadata.ts index 4a05ba5b..64699d85 100644 --- a/clients/js/vault_client/instructions/updateTokenMetadata.ts +++ b/clients/js/vault_client/instructions/updateTokenMetadata.ts @@ -36,7 +36,7 @@ import { import { JITO_VAULT_PROGRAM_ADDRESS } from '../programs'; import { getAccountMetaFactory, type ResolvedAccount } from '../shared'; -export const UPDATE_TOKEN_METADATA_DISCRIMINATOR = 30; +export const UPDATE_TOKEN_METADATA_DISCRIMINATOR = 31; export function getUpdateTokenMetadataDiscriminatorBytes() { return getU8Encoder().encode(UPDATE_TOKEN_METADATA_DISCRIMINATOR); diff --git a/clients/js/vault_client/instructions/updateVaultBalance.ts b/clients/js/vault_client/instructions/updateVaultBalance.ts index 55b0f28e..ccdbcac1 100644 --- a/clients/js/vault_client/instructions/updateVaultBalance.ts +++ b/clients/js/vault_client/instructions/updateVaultBalance.ts @@ -27,7 +27,7 @@ import { import { JITO_VAULT_PROGRAM_ADDRESS } from '../programs'; import { getAccountMetaFactory, type ResolvedAccount } from '../shared'; -export const UPDATE_VAULT_BALANCE_DISCRIMINATOR = 25; +export const UPDATE_VAULT_BALANCE_DISCRIMINATOR = 26; export function getUpdateVaultBalanceDiscriminatorBytes() { return getU8Encoder().encode(UPDATE_VAULT_BALANCE_DISCRIMINATOR); diff --git a/clients/js/vault_client/programs/jitoVault.ts b/clients/js/vault_client/programs/jitoVault.ts index 83cd3290..290256fa 100644 --- a/clients/js/vault_client/programs/jitoVault.ts +++ b/clients/js/vault_client/programs/jitoVault.ts @@ -33,6 +33,7 @@ import { type ParsedInitializeVaultUpdateStateTrackerInstruction, type ParsedInitializeVaultWithMintInstruction, type ParsedMintToInstruction, + type ParsedRevokeDelegateTokenAccountInstruction, type ParsedSetAdminInstruction, type ParsedSetConfigAdminInstruction, type ParsedSetDepositCapacityInstruction, @@ -83,6 +84,7 @@ export enum JitoVaultInstruction { SetProgramFeeWallet, SetIsPaused, DelegateTokenAccount, + RevokeDelegateTokenAccount, SetAdmin, SetSecondaryAdmin, AddDelegation, @@ -164,36 +166,39 @@ export function identifyJitoVaultInstruction( return JitoVaultInstruction.DelegateTokenAccount; } if (containsBytes(data, getU8Encoder().encode(21), 0)) { - return JitoVaultInstruction.SetAdmin; + return JitoVaultInstruction.RevokeDelegateTokenAccount; } if (containsBytes(data, getU8Encoder().encode(22), 0)) { - return JitoVaultInstruction.SetSecondaryAdmin; + return JitoVaultInstruction.SetAdmin; } if (containsBytes(data, getU8Encoder().encode(23), 0)) { - return JitoVaultInstruction.AddDelegation; + return JitoVaultInstruction.SetSecondaryAdmin; } if (containsBytes(data, getU8Encoder().encode(24), 0)) { - return JitoVaultInstruction.CooldownDelegation; + return JitoVaultInstruction.AddDelegation; } if (containsBytes(data, getU8Encoder().encode(25), 0)) { - return JitoVaultInstruction.UpdateVaultBalance; + return JitoVaultInstruction.CooldownDelegation; } if (containsBytes(data, getU8Encoder().encode(26), 0)) { - return JitoVaultInstruction.InitializeVaultUpdateStateTracker; + return JitoVaultInstruction.UpdateVaultBalance; } if (containsBytes(data, getU8Encoder().encode(27), 0)) { - return JitoVaultInstruction.CrankVaultUpdateStateTracker; + return JitoVaultInstruction.InitializeVaultUpdateStateTracker; } if (containsBytes(data, getU8Encoder().encode(28), 0)) { - return JitoVaultInstruction.CloseVaultUpdateStateTracker; + return JitoVaultInstruction.CrankVaultUpdateStateTracker; } if (containsBytes(data, getU8Encoder().encode(29), 0)) { - return JitoVaultInstruction.CreateTokenMetadata; + return JitoVaultInstruction.CloseVaultUpdateStateTracker; } if (containsBytes(data, getU8Encoder().encode(30), 0)) { - return JitoVaultInstruction.UpdateTokenMetadata; + return JitoVaultInstruction.CreateTokenMetadata; } if (containsBytes(data, getU8Encoder().encode(31), 0)) { + return JitoVaultInstruction.UpdateTokenMetadata; + } + if (containsBytes(data, getU8Encoder().encode(32), 0)) { return JitoVaultInstruction.SetConfigAdmin; } throw new Error( @@ -267,6 +272,9 @@ export type ParsedJitoVaultInstruction< | ({ instructionType: JitoVaultInstruction.DelegateTokenAccount; } & ParsedDelegateTokenAccountInstruction) + | ({ + instructionType: JitoVaultInstruction.RevokeDelegateTokenAccount; + } & ParsedRevokeDelegateTokenAccountInstruction) | ({ instructionType: JitoVaultInstruction.SetAdmin; } & ParsedSetAdminInstruction) diff --git a/clients/rust/vault_client/src/generated/instructions/add_delegation.rs b/clients/rust/vault_client/src/generated/instructions/add_delegation.rs index 5ae082b9..32631ae4 100644 --- a/clients/rust/vault_client/src/generated/instructions/add_delegation.rs +++ b/clients/rust/vault_client/src/generated/instructions/add_delegation.rs @@ -71,7 +71,7 @@ pub struct AddDelegationInstructionData { impl AddDelegationInstructionData { pub fn new() -> Self { - Self { discriminator: 23 } + Self { discriminator: 24 } } } diff --git a/clients/rust/vault_client/src/generated/instructions/close_vault_update_state_tracker.rs b/clients/rust/vault_client/src/generated/instructions/close_vault_update_state_tracker.rs index 4d11b865..39ec10ea 100644 --- a/clients/rust/vault_client/src/generated/instructions/close_vault_update_state_tracker.rs +++ b/clients/rust/vault_client/src/generated/instructions/close_vault_update_state_tracker.rs @@ -67,7 +67,7 @@ pub struct CloseVaultUpdateStateTrackerInstructionData { impl CloseVaultUpdateStateTrackerInstructionData { pub fn new() -> Self { - Self { discriminator: 28 } + Self { discriminator: 29 } } } diff --git a/clients/rust/vault_client/src/generated/instructions/cooldown_delegation.rs b/clients/rust/vault_client/src/generated/instructions/cooldown_delegation.rs index a7056e0f..21c76f56 100644 --- a/clients/rust/vault_client/src/generated/instructions/cooldown_delegation.rs +++ b/clients/rust/vault_client/src/generated/instructions/cooldown_delegation.rs @@ -73,7 +73,7 @@ pub struct CooldownDelegationInstructionData { impl CooldownDelegationInstructionData { pub fn new() -> Self { - Self { discriminator: 24 } + Self { discriminator: 25 } } } diff --git a/clients/rust/vault_client/src/generated/instructions/crank_vault_update_state_tracker.rs b/clients/rust/vault_client/src/generated/instructions/crank_vault_update_state_tracker.rs index 0d67d09f..67a96855 100644 --- a/clients/rust/vault_client/src/generated/instructions/crank_vault_update_state_tracker.rs +++ b/clients/rust/vault_client/src/generated/instructions/crank_vault_update_state_tracker.rs @@ -68,7 +68,7 @@ pub struct CrankVaultUpdateStateTrackerInstructionData { impl CrankVaultUpdateStateTrackerInstructionData { pub fn new() -> Self { - Self { discriminator: 27 } + Self { discriminator: 28 } } } diff --git a/clients/rust/vault_client/src/generated/instructions/create_token_metadata.rs b/clients/rust/vault_client/src/generated/instructions/create_token_metadata.rs index 1a7bf2f2..5cd1d46b 100644 --- a/clients/rust/vault_client/src/generated/instructions/create_token_metadata.rs +++ b/clients/rust/vault_client/src/generated/instructions/create_token_metadata.rs @@ -84,7 +84,7 @@ pub struct CreateTokenMetadataInstructionData { impl CreateTokenMetadataInstructionData { pub fn new() -> Self { - Self { discriminator: 29 } + Self { discriminator: 30 } } } diff --git a/clients/rust/vault_client/src/generated/instructions/initialize_vault_update_state_tracker.rs b/clients/rust/vault_client/src/generated/instructions/initialize_vault_update_state_tracker.rs index 2f7c2aa4..ddc9c4bd 100644 --- a/clients/rust/vault_client/src/generated/instructions/initialize_vault_update_state_tracker.rs +++ b/clients/rust/vault_client/src/generated/instructions/initialize_vault_update_state_tracker.rs @@ -75,7 +75,7 @@ pub struct InitializeVaultUpdateStateTrackerInstructionData { impl InitializeVaultUpdateStateTrackerInstructionData { pub fn new() -> Self { - Self { discriminator: 26 } + Self { discriminator: 27 } } } diff --git a/clients/rust/vault_client/src/generated/instructions/mod.rs b/clients/rust/vault_client/src/generated/instructions/mod.rs index 5e426226..aafc25c3 100644 --- a/clients/rust/vault_client/src/generated/instructions/mod.rs +++ b/clients/rust/vault_client/src/generated/instructions/mod.rs @@ -24,6 +24,7 @@ pub(crate) mod r#initialize_vault_operator_delegation; pub(crate) mod r#initialize_vault_update_state_tracker; pub(crate) mod r#initialize_vault_with_mint; pub(crate) mod r#mint_to; +pub(crate) mod r#revoke_delegate_token_account; pub(crate) mod r#set_admin; pub(crate) mod r#set_config_admin; pub(crate) mod r#set_deposit_capacity; @@ -46,8 +47,8 @@ pub use self::{ r#initialize_vault_ncn_slasher_operator_ticket::*, r#initialize_vault_ncn_slasher_ticket::*, r#initialize_vault_ncn_ticket::*, r#initialize_vault_operator_delegation::*, r#initialize_vault_update_state_tracker::*, r#initialize_vault_with_mint::*, r#mint_to::*, - r#set_admin::*, r#set_config_admin::*, r#set_deposit_capacity::*, r#set_fees::*, - r#set_is_paused::*, r#set_program_fee::*, r#set_program_fee_wallet::*, - r#set_secondary_admin::*, r#update_token_metadata::*, r#update_vault_balance::*, - r#warmup_vault_ncn_slasher_ticket::*, r#warmup_vault_ncn_ticket::*, + r#revoke_delegate_token_account::*, r#set_admin::*, r#set_config_admin::*, + r#set_deposit_capacity::*, r#set_fees::*, r#set_is_paused::*, r#set_program_fee::*, + r#set_program_fee_wallet::*, r#set_secondary_admin::*, r#update_token_metadata::*, + r#update_vault_balance::*, r#warmup_vault_ncn_slasher_ticket::*, r#warmup_vault_ncn_ticket::*, }; diff --git a/clients/rust/vault_client/src/generated/instructions/revoke_delegate_token_account.rs b/clients/rust/vault_client/src/generated/instructions/revoke_delegate_token_account.rs new file mode 100644 index 00000000..060b9e11 --- /dev/null +++ b/clients/rust/vault_client/src/generated/instructions/revoke_delegate_token_account.rs @@ -0,0 +1,523 @@ +//! This code was AUTOGENERATED using the kinobi library. +//! Please DO NOT EDIT THIS FILE, instead use visitors +//! to add features, then rerun kinobi to update it. +//! +//! + +use borsh::{BorshDeserialize, BorshSerialize}; + +/// Accounts. +pub struct RevokeDelegateTokenAccount { + pub config: solana_program::pubkey::Pubkey, + + pub vault: solana_program::pubkey::Pubkey, + + pub delegate_asset_admin: solana_program::pubkey::Pubkey, + + pub token_mint: solana_program::pubkey::Pubkey, + + pub token_account: solana_program::pubkey::Pubkey, + + pub delegate: solana_program::pubkey::Pubkey, + + pub token_program: solana_program::pubkey::Pubkey, +} + +impl RevokeDelegateTokenAccount { + pub fn instruction(&self) -> solana_program::instruction::Instruction { + self.instruction_with_remaining_accounts(&[]) + } + #[allow(clippy::vec_init_then_push)] + pub fn instruction_with_remaining_accounts( + &self, + remaining_accounts: &[solana_program::instruction::AccountMeta], + ) -> solana_program::instruction::Instruction { + let mut accounts = Vec::with_capacity(7 + remaining_accounts.len()); + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + self.config, + false, + )); + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + self.vault, false, + )); + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + self.delegate_asset_admin, + true, + )); + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + self.token_mint, + false, + )); + accounts.push(solana_program::instruction::AccountMeta::new( + self.token_account, + false, + )); + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + self.delegate, + false, + )); + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + self.token_program, + false, + )); + accounts.extend_from_slice(remaining_accounts); + let data = RevokeDelegateTokenAccountInstructionData::new() + .try_to_vec() + .unwrap(); + + solana_program::instruction::Instruction { + program_id: crate::JITO_VAULT_ID, + accounts, + data, + } + } +} + +#[derive(BorshDeserialize, BorshSerialize)] +pub struct RevokeDelegateTokenAccountInstructionData { + discriminator: u8, +} + +impl RevokeDelegateTokenAccountInstructionData { + pub fn new() -> Self { + Self { discriminator: 21 } + } +} + +impl Default for RevokeDelegateTokenAccountInstructionData { + fn default() -> Self { + Self::new() + } +} + +/// Instruction builder for `RevokeDelegateTokenAccount`. +/// +/// ### Accounts: +/// +/// 0. `[]` config +/// 1. `[]` vault +/// 2. `[signer]` delegate_asset_admin +/// 3. `[]` token_mint +/// 4. `[writable]` token_account +/// 5. `[]` delegate +/// 6. `[optional]` token_program (default to `TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA`) +#[derive(Clone, Debug, Default)] +pub struct RevokeDelegateTokenAccountBuilder { + config: Option, + vault: Option, + delegate_asset_admin: Option, + token_mint: Option, + token_account: Option, + delegate: Option, + token_program: Option, + __remaining_accounts: Vec, +} + +impl RevokeDelegateTokenAccountBuilder { + pub fn new() -> Self { + Self::default() + } + #[inline(always)] + pub fn config(&mut self, config: solana_program::pubkey::Pubkey) -> &mut Self { + self.config = Some(config); + self + } + #[inline(always)] + pub fn vault(&mut self, vault: solana_program::pubkey::Pubkey) -> &mut Self { + self.vault = Some(vault); + self + } + #[inline(always)] + pub fn delegate_asset_admin( + &mut self, + delegate_asset_admin: solana_program::pubkey::Pubkey, + ) -> &mut Self { + self.delegate_asset_admin = Some(delegate_asset_admin); + self + } + #[inline(always)] + pub fn token_mint(&mut self, token_mint: solana_program::pubkey::Pubkey) -> &mut Self { + self.token_mint = Some(token_mint); + self + } + #[inline(always)] + pub fn token_account(&mut self, token_account: solana_program::pubkey::Pubkey) -> &mut Self { + self.token_account = Some(token_account); + self + } + #[inline(always)] + pub fn delegate(&mut self, delegate: solana_program::pubkey::Pubkey) -> &mut Self { + self.delegate = Some(delegate); + self + } + /// `[optional account, default to 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA']` + #[inline(always)] + pub fn token_program(&mut self, token_program: solana_program::pubkey::Pubkey) -> &mut Self { + self.token_program = Some(token_program); + self + } + /// Add an aditional account to the instruction. + #[inline(always)] + pub fn add_remaining_account( + &mut self, + account: solana_program::instruction::AccountMeta, + ) -> &mut Self { + self.__remaining_accounts.push(account); + self + } + /// Add additional accounts to the instruction. + #[inline(always)] + pub fn add_remaining_accounts( + &mut self, + accounts: &[solana_program::instruction::AccountMeta], + ) -> &mut Self { + self.__remaining_accounts.extend_from_slice(accounts); + self + } + #[allow(clippy::clone_on_copy)] + pub fn instruction(&self) -> solana_program::instruction::Instruction { + let accounts = RevokeDelegateTokenAccount { + config: self.config.expect("config is not set"), + vault: self.vault.expect("vault is not set"), + delegate_asset_admin: self + .delegate_asset_admin + .expect("delegate_asset_admin is not set"), + token_mint: self.token_mint.expect("token_mint is not set"), + token_account: self.token_account.expect("token_account is not set"), + delegate: self.delegate.expect("delegate is not set"), + token_program: self.token_program.unwrap_or(solana_program::pubkey!( + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + )), + }; + + accounts.instruction_with_remaining_accounts(&self.__remaining_accounts) + } +} + +/// `revoke_delegate_token_account` CPI accounts. +pub struct RevokeDelegateTokenAccountCpiAccounts<'a, 'b> { + pub config: &'b solana_program::account_info::AccountInfo<'a>, + + pub vault: &'b solana_program::account_info::AccountInfo<'a>, + + pub delegate_asset_admin: &'b solana_program::account_info::AccountInfo<'a>, + + pub token_mint: &'b solana_program::account_info::AccountInfo<'a>, + + pub token_account: &'b solana_program::account_info::AccountInfo<'a>, + + pub delegate: &'b solana_program::account_info::AccountInfo<'a>, + + pub token_program: &'b solana_program::account_info::AccountInfo<'a>, +} + +/// `revoke_delegate_token_account` CPI instruction. +pub struct RevokeDelegateTokenAccountCpi<'a, 'b> { + /// The program to invoke. + pub __program: &'b solana_program::account_info::AccountInfo<'a>, + + pub config: &'b solana_program::account_info::AccountInfo<'a>, + + pub vault: &'b solana_program::account_info::AccountInfo<'a>, + + pub delegate_asset_admin: &'b solana_program::account_info::AccountInfo<'a>, + + pub token_mint: &'b solana_program::account_info::AccountInfo<'a>, + + pub token_account: &'b solana_program::account_info::AccountInfo<'a>, + + pub delegate: &'b solana_program::account_info::AccountInfo<'a>, + + pub token_program: &'b solana_program::account_info::AccountInfo<'a>, +} + +impl<'a, 'b> RevokeDelegateTokenAccountCpi<'a, 'b> { + pub fn new( + program: &'b solana_program::account_info::AccountInfo<'a>, + accounts: RevokeDelegateTokenAccountCpiAccounts<'a, 'b>, + ) -> Self { + Self { + __program: program, + config: accounts.config, + vault: accounts.vault, + delegate_asset_admin: accounts.delegate_asset_admin, + token_mint: accounts.token_mint, + token_account: accounts.token_account, + delegate: accounts.delegate, + token_program: accounts.token_program, + } + } + #[inline(always)] + pub fn invoke(&self) -> solana_program::entrypoint::ProgramResult { + self.invoke_signed_with_remaining_accounts(&[], &[]) + } + #[inline(always)] + pub fn invoke_with_remaining_accounts( + &self, + remaining_accounts: &[( + &'b solana_program::account_info::AccountInfo<'a>, + bool, + bool, + )], + ) -> solana_program::entrypoint::ProgramResult { + self.invoke_signed_with_remaining_accounts(&[], remaining_accounts) + } + #[inline(always)] + pub fn invoke_signed( + &self, + signers_seeds: &[&[&[u8]]], + ) -> solana_program::entrypoint::ProgramResult { + self.invoke_signed_with_remaining_accounts(signers_seeds, &[]) + } + #[allow(clippy::clone_on_copy)] + #[allow(clippy::vec_init_then_push)] + pub fn invoke_signed_with_remaining_accounts( + &self, + signers_seeds: &[&[&[u8]]], + remaining_accounts: &[( + &'b solana_program::account_info::AccountInfo<'a>, + bool, + bool, + )], + ) -> solana_program::entrypoint::ProgramResult { + let mut accounts = Vec::with_capacity(7 + remaining_accounts.len()); + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + *self.config.key, + false, + )); + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + *self.vault.key, + false, + )); + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + *self.delegate_asset_admin.key, + true, + )); + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + *self.token_mint.key, + false, + )); + accounts.push(solana_program::instruction::AccountMeta::new( + *self.token_account.key, + false, + )); + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + *self.delegate.key, + false, + )); + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + *self.token_program.key, + false, + )); + remaining_accounts.iter().for_each(|remaining_account| { + accounts.push(solana_program::instruction::AccountMeta { + pubkey: *remaining_account.0.key, + is_signer: remaining_account.1, + is_writable: remaining_account.2, + }) + }); + let data = RevokeDelegateTokenAccountInstructionData::new() + .try_to_vec() + .unwrap(); + + let instruction = solana_program::instruction::Instruction { + program_id: crate::JITO_VAULT_ID, + accounts, + data, + }; + let mut account_infos = Vec::with_capacity(7 + 1 + remaining_accounts.len()); + account_infos.push(self.__program.clone()); + account_infos.push(self.config.clone()); + account_infos.push(self.vault.clone()); + account_infos.push(self.delegate_asset_admin.clone()); + account_infos.push(self.token_mint.clone()); + account_infos.push(self.token_account.clone()); + account_infos.push(self.delegate.clone()); + account_infos.push(self.token_program.clone()); + remaining_accounts + .iter() + .for_each(|remaining_account| account_infos.push(remaining_account.0.clone())); + + if signers_seeds.is_empty() { + solana_program::program::invoke(&instruction, &account_infos) + } else { + solana_program::program::invoke_signed(&instruction, &account_infos, signers_seeds) + } + } +} + +/// Instruction builder for `RevokeDelegateTokenAccount` via CPI. +/// +/// ### Accounts: +/// +/// 0. `[]` config +/// 1. `[]` vault +/// 2. `[signer]` delegate_asset_admin +/// 3. `[]` token_mint +/// 4. `[writable]` token_account +/// 5. `[]` delegate +/// 6. `[]` token_program +#[derive(Clone, Debug)] +pub struct RevokeDelegateTokenAccountCpiBuilder<'a, 'b> { + instruction: Box>, +} + +impl<'a, 'b> RevokeDelegateTokenAccountCpiBuilder<'a, 'b> { + pub fn new(program: &'b solana_program::account_info::AccountInfo<'a>) -> Self { + let instruction = Box::new(RevokeDelegateTokenAccountCpiBuilderInstruction { + __program: program, + config: None, + vault: None, + delegate_asset_admin: None, + token_mint: None, + token_account: None, + delegate: None, + token_program: None, + __remaining_accounts: Vec::new(), + }); + Self { instruction } + } + #[inline(always)] + pub fn config( + &mut self, + config: &'b solana_program::account_info::AccountInfo<'a>, + ) -> &mut Self { + self.instruction.config = Some(config); + self + } + #[inline(always)] + pub fn vault(&mut self, vault: &'b solana_program::account_info::AccountInfo<'a>) -> &mut Self { + self.instruction.vault = Some(vault); + self + } + #[inline(always)] + pub fn delegate_asset_admin( + &mut self, + delegate_asset_admin: &'b solana_program::account_info::AccountInfo<'a>, + ) -> &mut Self { + self.instruction.delegate_asset_admin = Some(delegate_asset_admin); + self + } + #[inline(always)] + pub fn token_mint( + &mut self, + token_mint: &'b solana_program::account_info::AccountInfo<'a>, + ) -> &mut Self { + self.instruction.token_mint = Some(token_mint); + self + } + #[inline(always)] + pub fn token_account( + &mut self, + token_account: &'b solana_program::account_info::AccountInfo<'a>, + ) -> &mut Self { + self.instruction.token_account = Some(token_account); + self + } + #[inline(always)] + pub fn delegate( + &mut self, + delegate: &'b solana_program::account_info::AccountInfo<'a>, + ) -> &mut Self { + self.instruction.delegate = Some(delegate); + self + } + #[inline(always)] + pub fn token_program( + &mut self, + token_program: &'b solana_program::account_info::AccountInfo<'a>, + ) -> &mut Self { + self.instruction.token_program = Some(token_program); + self + } + /// Add an additional account to the instruction. + #[inline(always)] + pub fn add_remaining_account( + &mut self, + account: &'b solana_program::account_info::AccountInfo<'a>, + is_writable: bool, + is_signer: bool, + ) -> &mut Self { + self.instruction + .__remaining_accounts + .push((account, is_writable, is_signer)); + self + } + /// Add additional accounts to the instruction. + /// + /// Each account is represented by a tuple of the `AccountInfo`, a `bool` indicating whether the account is writable or not, + /// and a `bool` indicating whether the account is a signer or not. + #[inline(always)] + pub fn add_remaining_accounts( + &mut self, + accounts: &[( + &'b solana_program::account_info::AccountInfo<'a>, + bool, + bool, + )], + ) -> &mut Self { + self.instruction + .__remaining_accounts + .extend_from_slice(accounts); + self + } + #[inline(always)] + pub fn invoke(&self) -> solana_program::entrypoint::ProgramResult { + self.invoke_signed(&[]) + } + #[allow(clippy::clone_on_copy)] + #[allow(clippy::vec_init_then_push)] + pub fn invoke_signed( + &self, + signers_seeds: &[&[&[u8]]], + ) -> solana_program::entrypoint::ProgramResult { + let instruction = RevokeDelegateTokenAccountCpi { + __program: self.instruction.__program, + + config: self.instruction.config.expect("config is not set"), + + vault: self.instruction.vault.expect("vault is not set"), + + delegate_asset_admin: self + .instruction + .delegate_asset_admin + .expect("delegate_asset_admin is not set"), + + token_mint: self.instruction.token_mint.expect("token_mint is not set"), + + token_account: self + .instruction + .token_account + .expect("token_account is not set"), + + delegate: self.instruction.delegate.expect("delegate is not set"), + + token_program: self + .instruction + .token_program + .expect("token_program is not set"), + }; + instruction.invoke_signed_with_remaining_accounts( + signers_seeds, + &self.instruction.__remaining_accounts, + ) + } +} + +#[derive(Clone, Debug)] +struct RevokeDelegateTokenAccountCpiBuilderInstruction<'a, 'b> { + __program: &'b solana_program::account_info::AccountInfo<'a>, + config: Option<&'b solana_program::account_info::AccountInfo<'a>>, + vault: Option<&'b solana_program::account_info::AccountInfo<'a>>, + delegate_asset_admin: Option<&'b solana_program::account_info::AccountInfo<'a>>, + token_mint: Option<&'b solana_program::account_info::AccountInfo<'a>>, + token_account: Option<&'b solana_program::account_info::AccountInfo<'a>>, + delegate: Option<&'b solana_program::account_info::AccountInfo<'a>>, + token_program: Option<&'b solana_program::account_info::AccountInfo<'a>>, + /// Additional instruction accounts `(AccountInfo, is_writable, is_signer)`. + __remaining_accounts: Vec<( + &'b solana_program::account_info::AccountInfo<'a>, + bool, + bool, + )>, +} diff --git a/clients/rust/vault_client/src/generated/instructions/set_admin.rs b/clients/rust/vault_client/src/generated/instructions/set_admin.rs index 89d2c08e..e39fe75c 100644 --- a/clients/rust/vault_client/src/generated/instructions/set_admin.rs +++ b/clients/rust/vault_client/src/generated/instructions/set_admin.rs @@ -60,7 +60,7 @@ pub struct SetAdminInstructionData { impl SetAdminInstructionData { pub fn new() -> Self { - Self { discriminator: 21 } + Self { discriminator: 22 } } } diff --git a/clients/rust/vault_client/src/generated/instructions/set_config_admin.rs b/clients/rust/vault_client/src/generated/instructions/set_config_admin.rs index eb82822b..fa67f9ee 100644 --- a/clients/rust/vault_client/src/generated/instructions/set_config_admin.rs +++ b/clients/rust/vault_client/src/generated/instructions/set_config_admin.rs @@ -55,7 +55,7 @@ pub struct SetConfigAdminInstructionData { impl SetConfigAdminInstructionData { pub fn new() -> Self { - Self { discriminator: 31 } + Self { discriminator: 32 } } } diff --git a/clients/rust/vault_client/src/generated/instructions/set_secondary_admin.rs b/clients/rust/vault_client/src/generated/instructions/set_secondary_admin.rs index bed9a83f..df3dd1ad 100644 --- a/clients/rust/vault_client/src/generated/instructions/set_secondary_admin.rs +++ b/clients/rust/vault_client/src/generated/instructions/set_secondary_admin.rs @@ -69,7 +69,7 @@ pub struct SetSecondaryAdminInstructionData { impl SetSecondaryAdminInstructionData { pub fn new() -> Self { - Self { discriminator: 22 } + Self { discriminator: 23 } } } diff --git a/clients/rust/vault_client/src/generated/instructions/update_token_metadata.rs b/clients/rust/vault_client/src/generated/instructions/update_token_metadata.rs index a7da1035..cd19c506 100644 --- a/clients/rust/vault_client/src/generated/instructions/update_token_metadata.rs +++ b/clients/rust/vault_client/src/generated/instructions/update_token_metadata.rs @@ -73,7 +73,7 @@ pub struct UpdateTokenMetadataInstructionData { impl UpdateTokenMetadataInstructionData { pub fn new() -> Self { - Self { discriminator: 30 } + Self { discriminator: 31 } } } diff --git a/clients/rust/vault_client/src/generated/instructions/update_vault_balance.rs b/clients/rust/vault_client/src/generated/instructions/update_vault_balance.rs index bfb724d7..57afd3e1 100644 --- a/clients/rust/vault_client/src/generated/instructions/update_vault_balance.rs +++ b/clients/rust/vault_client/src/generated/instructions/update_vault_balance.rs @@ -74,7 +74,7 @@ pub struct UpdateVaultBalanceInstructionData { impl UpdateVaultBalanceInstructionData { pub fn new() -> Self { - Self { discriminator: 25 } + Self { discriminator: 26 } } } diff --git a/idl/jito_vault.json b/idl/jito_vault.json index 00e1c9bf..e130fa4f 100644 --- a/idl/jito_vault.json +++ b/idl/jito_vault.json @@ -962,6 +962,51 @@ "value": 20 } }, + { + "name": "RevokeDelegateTokenAccount", + "accounts": [ + { + "name": "config", + "isMut": false, + "isSigner": false + }, + { + "name": "vault", + "isMut": false, + "isSigner": false + }, + { + "name": "delegateAssetAdmin", + "isMut": false, + "isSigner": true + }, + { + "name": "tokenMint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "delegate", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [], + "discriminant": { + "type": "u8", + "value": 21 + } + }, { "name": "SetAdmin", "accounts": [ @@ -989,7 +1034,7 @@ "args": [], "discriminant": { "type": "u8", - "value": 21 + "value": 22 } }, { @@ -1026,7 +1071,7 @@ ], "discriminant": { "type": "u8", - "value": 22 + "value": 23 } }, { @@ -1066,7 +1111,7 @@ ], "discriminant": { "type": "u8", - "value": 23 + "value": 24 } }, { @@ -1106,7 +1151,7 @@ ], "discriminant": { "type": "u8", - "value": 24 + "value": 25 } }, { @@ -1146,7 +1191,7 @@ "args": [], "discriminant": { "type": "u8", - "value": 25 + "value": 26 } }, { @@ -1188,7 +1233,7 @@ ], "discriminant": { "type": "u8", - "value": 26 + "value": 27 } }, { @@ -1223,7 +1268,7 @@ "args": [], "discriminant": { "type": "u8", - "value": 27 + "value": 28 } }, { @@ -1258,7 +1303,7 @@ ], "discriminant": { "type": "u8", - "value": 28 + "value": 29 } }, { @@ -1316,7 +1361,7 @@ ], "discriminant": { "type": "u8", - "value": 29 + "value": 30 } }, { @@ -1364,7 +1409,7 @@ ], "discriminant": { "type": "u8", - "value": 30 + "value": 31 } }, { @@ -1389,7 +1434,7 @@ "args": [], "discriminant": { "type": "u8", - "value": 31 + "value": 32 } } ], diff --git a/integration_tests/tests/fixtures/vault_client.rs b/integration_tests/tests/fixtures/vault_client.rs index f8683331..a1ac83af 100644 --- a/integration_tests/tests/fixtures/vault_client.rs +++ b/integration_tests/tests/fixtures/vault_client.rs @@ -844,6 +844,35 @@ impl VaultProgramClient { .await } + pub async fn revoke_delegate_token_account( + &mut self, + config: &Pubkey, + vault: &Pubkey, + delegate_asset_admin: &Keypair, + token_mint: &Pubkey, + token_account: &Pubkey, + delegate: &Pubkey, + token_program_id: &Pubkey, + ) -> Result<(), TestError> { + let blockhash = self.banks_client.get_latest_blockhash().await?; + self._process_transaction(&Transaction::new_signed_with_payer( + &[jito_vault_sdk::sdk::revoke_delegate_token_account( + &jito_vault_program::id(), + config, + vault, + &delegate_asset_admin.pubkey(), + token_mint, + token_account, + delegate, + token_program_id, + )], + Some(&self.payer.pubkey()), + &[&self.payer, delegate_asset_admin], + blockhash, + )) + .await + } + pub async fn set_admin( &mut self, config: &Pubkey, diff --git a/integration_tests/tests/vault/mod.rs b/integration_tests/tests/vault/mod.rs index 86a02b09..1d091368 100644 --- a/integration_tests/tests/vault/mod.rs +++ b/integration_tests/tests/vault/mod.rs @@ -14,6 +14,7 @@ mod initialize_vault_ncn_slasher_ticket; mod initialize_vault_ncn_ticket; mod initialize_vault_operator_delegation; mod initialize_vault_update_state_tracker; +mod revoke_delegate_token_account; mod reward_fee; mod set_admin; mod set_capacity; diff --git a/integration_tests/tests/vault/revoke_delegate_token_account.rs b/integration_tests/tests/vault/revoke_delegate_token_account.rs new file mode 100644 index 00000000..ac4a5882 --- /dev/null +++ b/integration_tests/tests/vault/revoke_delegate_token_account.rs @@ -0,0 +1,257 @@ +#[cfg(test)] +mod tests { + use jito_vault_core::config::Config; + use jito_vault_sdk::error::VaultError; + use solana_program::{program_option::COption, pubkey::Pubkey}; + use solana_sdk::signature::{Keypair, Signer}; + use spl_associated_token_account::get_associated_token_address; + use test_case::test_case; + + use crate::fixtures::{ + fixture::TestBuilder, + vault_client::{assert_vault_error, VaultRoot}, + }; + + const MINT_AMOUNT: u64 = 100_000; + + async fn setup(token_program_id: &Pubkey) -> (TestBuilder, Pubkey, Keypair, Keypair, Keypair) { + let mut fixture = TestBuilder::new().await; + + let mut vault_program_client = fixture.vault_program_client(); + + let ( + _config_admin, + VaultRoot { + vault_pubkey, + vault_admin, + }, + ) = vault_program_client + .setup_config_and_vault(99, 100, 101) + .await + .unwrap(); + + let random_mint = Keypair::new(); + vault_program_client + .create_token_mint(&random_mint, token_program_id) + .await + .unwrap(); + + let vault_token_account = Keypair::new(); + if token_program_id.eq(&spl_token::id()) { + fixture + .mint_spl_to( + &random_mint.pubkey(), + &vault_pubkey, + MINT_AMOUNT, + token_program_id, + ) + .await + .unwrap(); + } else { + fixture + .create_token_account( + token_program_id, + &vault_token_account, + &random_mint.pubkey(), + &vault_pubkey, + &[], + ) + .await + .unwrap(); + fixture + .mint_spl_to( + &random_mint.pubkey(), + &vault_token_account.pubkey(), + MINT_AMOUNT, + token_program_id, + ) + .await + .unwrap(); + } + + ( + fixture, + vault_pubkey, + vault_admin, + random_mint, + vault_token_account, + ) + } + + #[test_case(spl_token::id(); "token")] + // #[test_case(spl_token_2022::id(); "token-2022")] + #[tokio::test] + async fn test_delegate_token_account_ok(token_program_id: Pubkey) { + let (mut fixture, vault_pubkey, vault_admin, random_mint, vault_token_account) = + setup(&token_program_id).await; + let mut vault_program_client = fixture.vault_program_client(); + let config_pubkey = Config::find_program_address(&jito_vault_program::id()).0; + + let bob = Pubkey::new_unique(); + if token_program_id.eq(&spl_token::id()) { + // Delegate + vault_program_client + .delegate_token_account( + &config_pubkey, + &vault_pubkey, + &vault_admin, + &random_mint.pubkey(), + &get_associated_token_address(&vault_pubkey, &random_mint.pubkey()), + &bob, + &token_program_id, + ) + .await + .unwrap(); + let ata = get_associated_token_address(&vault_pubkey, &random_mint.pubkey()); + let token_account_acc = fixture.get_token_account(&ata).await.unwrap(); + + assert_eq!(token_account_acc.delegate, COption::Some(bob)); + assert_eq!(token_account_acc.delegated_amount, u64::MAX); + + // Revoke + vault_program_client + .revoke_delegate_token_account( + &config_pubkey, + &vault_pubkey, + &vault_admin, + &random_mint.pubkey(), + &get_associated_token_address(&vault_pubkey, &random_mint.pubkey()), + &bob, + &token_program_id, + ) + .await + .unwrap(); + let ata = get_associated_token_address(&vault_pubkey, &random_mint.pubkey()); + let token_account_acc = fixture.get_token_account(&ata).await.unwrap(); + + assert_eq!(token_account_acc.delegate, COption::None); + assert_eq!(token_account_acc.delegated_amount, 0); + } else { + vault_program_client + .delegate_token_account( + &config_pubkey, + &vault_pubkey, + &vault_admin, + &random_mint.pubkey(), + &vault_token_account.pubkey(), + &bob, + &token_program_id, + ) + .await + .unwrap(); + + let vault_token_acc = fixture + .get_token_account(&vault_token_account.pubkey()) + .await + .unwrap(); + + assert_eq!(vault_token_acc.delegate, COption::Some(bob)); + assert_eq!(vault_token_acc.delegated_amount, u64::MAX); + + // Revoke + vault_program_client + .delegate_token_account( + &config_pubkey, + &vault_pubkey, + &vault_admin, + &random_mint.pubkey(), + &vault_token_account.pubkey(), + &bob, + &token_program_id, + ) + .await + .unwrap(); + + let vault_token_acc = fixture + .get_token_account(&vault_token_account.pubkey()) + .await + .unwrap(); + + assert_eq!(vault_token_acc.delegate, COption::None); + assert_eq!(vault_token_acc.delegated_amount, 0); + } + } + + #[test_case(spl_token::id(); "token")] + // #[test_case(spl_token_2022::id(); "token-2022")] + #[tokio::test] + async fn test_delegate_vault_wrong_delegate_asset_admin_fails(token_program_id: Pubkey) { + let (mut fixture, vault_pubkey, vault_admin, random_mint, vault_token_account) = + setup(&token_program_id).await; + let mut vault_program_client = fixture.vault_program_client(); + let config_pubkey = Config::find_program_address(&jito_vault_program::id()).0; + + let wrong_delegate_asset_admin = Keypair::new(); + let bob = Pubkey::new_unique(); + if token_program_id.eq(&spl_token::id()) { + // Delegate + vault_program_client + .delegate_token_account( + &config_pubkey, + &vault_pubkey, + &vault_admin, + &random_mint.pubkey(), + &get_associated_token_address(&vault_pubkey, &random_mint.pubkey()), + &bob, + &token_program_id, + ) + .await + .unwrap(); + let ata = get_associated_token_address(&vault_pubkey, &random_mint.pubkey()); + let token_account_acc = fixture.get_token_account(&ata).await.unwrap(); + + assert_eq!(token_account_acc.delegate, COption::Some(bob)); + assert_eq!(token_account_acc.delegated_amount, u64::MAX); + + // Revoke + let response = vault_program_client + .revoke_delegate_token_account( + &config_pubkey, + &vault_pubkey, + &wrong_delegate_asset_admin, + &random_mint.pubkey(), + &get_associated_token_address(&vault_pubkey, &random_mint.pubkey()), + &bob, + &token_program_id, + ) + .await; + + assert_vault_error(response, VaultError::VaultDelegateAssetAdminInvalid); + } else { + vault_program_client + .delegate_token_account( + &config_pubkey, + &vault_pubkey, + &vault_admin, + &random_mint.pubkey(), + &vault_token_account.pubkey(), + &bob, + &token_program_id, + ) + .await + .unwrap(); + + let vault_token_acc = fixture + .get_token_account(&vault_token_account.pubkey()) + .await + .unwrap(); + + assert_eq!(vault_token_acc.delegate, COption::Some(bob)); + assert_eq!(vault_token_acc.delegated_amount, u64::MAX); + + let response = vault_program_client + .revoke_delegate_token_account( + &config_pubkey, + &vault_pubkey, + &wrong_delegate_asset_admin, + &random_mint.pubkey(), + &vault_token_account.pubkey(), + &bob, + &token_program_id, + ) + .await; + + assert_vault_error(response, VaultError::VaultDelegateAssetAdminInvalid); + } + } +} diff --git a/vault_program/src/lib.rs b/vault_program/src/lib.rs index 4c48f7d9..98888b13 100644 --- a/vault_program/src/lib.rs +++ b/vault_program/src/lib.rs @@ -18,6 +18,7 @@ mod initialize_vault_operator_delegation; mod initialize_vault_update_state_tracker; mod initialize_vault_with_mint; mod mint_to; +mod revoke_delegate_token_account; mod set_admin; mod set_capacity; mod set_config_admin; @@ -60,6 +61,7 @@ use crate::{ initialize_vault_operator_delegation::process_initialize_vault_operator_delegation, initialize_vault_update_state_tracker::process_initialize_vault_update_state_tracker, initialize_vault_with_mint::process_initialize_vault_with_mint, mint_to::process_mint, + revoke_delegate_token_account::process_revoke_delegate_token_account, set_admin::process_set_admin, set_capacity::process_set_deposit_capacity, set_config_admin::process_set_config_admin, set_fees::process_set_fees, set_is_paused::process_set_is_paused, set_program_fee_wallet::process_set_program_fee_wallet, @@ -163,6 +165,10 @@ pub fn process_instruction( msg!("Instruction: DelegateTokenAccount"); process_delegate_token_account(program_id, accounts) } + VaultInstruction::RevokeDelegateTokenAccount => { + msg!("Instruction: RevokeDelegateTokenAccount"); + process_revoke_delegate_token_account(program_id, accounts) + } VaultInstruction::SetFees { deposit_fee_bps, withdrawal_fee_bps, diff --git a/vault_program/src/revoke_delegate_token_account.rs b/vault_program/src/revoke_delegate_token_account.rs new file mode 100644 index 00000000..84b06d58 --- /dev/null +++ b/vault_program/src/revoke_delegate_token_account.rs @@ -0,0 +1,84 @@ +use jito_bytemuck::AccountDeserialize; +use jito_jsm_core::loader::{load_signer, load_token_account, load_token_mint, load_token_program}; +use jito_vault_core::{config::Config, vault::Vault}; +use solana_program::{ + account_info::AccountInfo, entrypoint::ProgramResult, msg, program::invoke_signed, + program_error::ProgramError, pubkey::Pubkey, +}; + +/// Processes the revoke delegate token account instruction: [`crate::VaultInstruction::RevokeDelegateTokenAccount`] +/// +/// This instruction handles the revoke delegation of a delegate set by the [`crate::VaultInstruction::DelegateTokenAccount`] instruction. +/// +/// # Arguments +/// * `program_id` - The public key of the program to ensure the correct program is being executed. +/// * `accounts` - A slice of `AccountInfo` representing the accounts required for this instruction. +/// +/// # Returns +/// * `ProgramResult` - Returns `Ok(())` if the delegation is successful, otherwise returns an appropriate `ProgramError`. +pub fn process_revoke_delegate_token_account( + program_id: &Pubkey, + accounts: &[AccountInfo], +) -> ProgramResult { + let [config, vault_info, delegate_asset_admin, token_mint, token_account, delegate, token_program_info] = + accounts + else { + return Err(ProgramError::NotEnoughAccountKeys); + }; + + Config::load(program_id, config, false)?; + Vault::load(program_id, vault_info, false)?; + load_signer(delegate_asset_admin, false)?; + load_token_mint(token_mint)?; + load_token_account( + token_account, + vault_info.key, + token_mint.key, + token_program_info, + )?; + // Only the original spl token program is allowed + load_token_program(token_program_info)?; + + // The owner of token mint and token account must match + if token_mint.owner.ne(token_account.owner) { + return Err(ProgramError::InvalidAccountData); + } + + let vault_data = vault_info.data.borrow(); + let vault = Vault::try_from_slice_unchecked(&vault_data)?; + if vault.supported_mint.eq(token_mint.key) { + msg!("Cannot delegate away the supported mint for a vault!"); + return Err(ProgramError::InvalidAccountData); + } + + // The Vault delegate_asset_admin shall be the signer of the transaction + vault.check_delegate_asset_admin(delegate_asset_admin.key)?; + + let vault_seeds = vault.signing_seeds(); + + drop(vault_data); + + let ix = spl_token_2022::instruction::revoke( + token_program_info.key, + token_account.key, + vault_info.key, + &[], + )?; + + invoke_signed( + &ix, + &[ + token_program_info.clone(), + token_account.clone(), + delegate.clone(), + vault_info.clone(), + ], + &[vault_seeds + .iter() + .map(|seed| seed.as_slice()) + .collect::>() + .as_slice()], + )?; + + Ok(()) +} diff --git a/vault_sdk/src/instruction.rs b/vault_sdk/src/instruction.rs index e29892d6..441177f2 100644 --- a/vault_sdk/src/instruction.rs +++ b/vault_sdk/src/instruction.rs @@ -223,6 +223,16 @@ pub enum VaultInstruction { #[account(6, name = "token_program")] DelegateTokenAccount, + /// Revoke Delegate of the token account + #[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")] + RevokeDelegateTokenAccount, + /// Changes the signer for vault admin #[account(0, name = "config")] #[account(1, writable, name = "vault")] diff --git a/vault_sdk/src/sdk.rs b/vault_sdk/src/sdk.rs index c4faaea6..e8b895c9 100644 --- a/vault_sdk/src/sdk.rs +++ b/vault_sdk/src/sdk.rs @@ -302,6 +302,35 @@ pub fn delegate_token_account( } } +#[allow(clippy::too_many_arguments)] +pub fn revoke_delegate_token_account( + program_id: &Pubkey, + config: &Pubkey, + vault: &Pubkey, + delegate_asset_admin: &Pubkey, + token_mint: &Pubkey, + token_account: &Pubkey, + delegate: &Pubkey, + token_program_id: &Pubkey, +) -> Instruction { + let accounts = vec![ + AccountMeta::new_readonly(*config, false), + AccountMeta::new_readonly(*vault, false), + AccountMeta::new_readonly(*delegate_asset_admin, true), + AccountMeta::new_readonly(*token_mint, false), + AccountMeta::new(*token_account, false), + AccountMeta::new_readonly(*delegate, false), + AccountMeta::new_readonly(*token_program_id, false), + ]; + Instruction { + program_id: *program_id, + accounts, + data: VaultInstruction::RevokeDelegateTokenAccount + .try_to_vec() + .unwrap(), + } +} + pub fn set_admin( program_id: &Pubkey, config: &Pubkey, From 92ae8468e12d67f5c795212bd3466076a47f4ffd Mon Sep 17 00:00:00 2001 From: Christian Krueger Date: Fri, 24 Jan 2025 13:40:06 -0700 Subject: [PATCH 2/2] addressed --- .../instructions/addDelegation.ts | 2 +- .../closeVaultUpdateStateTracker.ts | 2 +- .../instructions/cooldownDelegation.ts | 2 +- .../crankVaultUpdateStateTracker.ts | 2 +- .../instructions/createTokenMetadata.ts | 2 +- .../initializeVaultUpdateStateTracker.ts | 2 +- .../revokeDelegateTokenAccount.ts | 20 +--- .../js/vault_client/instructions/setAdmin.ts | 2 +- .../instructions/setConfigAdmin.ts | 2 +- .../instructions/setSecondaryAdmin.ts | 2 +- .../instructions/updateTokenMetadata.ts | 2 +- .../instructions/updateVaultBalance.ts | 2 +- clients/js/vault_client/programs/jitoVault.ts | 34 +++--- .../generated/instructions/add_delegation.rs | 2 +- .../close_vault_update_state_tracker.rs | 2 +- .../instructions/cooldown_delegation.rs | 2 +- .../crank_vault_update_state_tracker.rs | 2 +- .../instructions/create_token_metadata.rs | 2 +- .../initialize_vault_update_state_tracker.rs | 2 +- .../revoke_delegate_token_account.rs | 49 +------- .../src/generated/instructions/set_admin.rs | 2 +- .../instructions/set_config_admin.rs | 2 +- .../instructions/set_secondary_admin.rs | 2 +- .../instructions/update_token_metadata.rs | 2 +- .../instructions/update_vault_balance.rs | 2 +- idl/jito_vault.json | 105 +++++++++--------- .../tests/fixtures/vault_client.rs | 2 - .../vault/revoke_delegate_token_account.rs | 3 - .../src/revoke_delegate_token_account.rs | 4 +- vault_sdk/src/instruction.rs | 18 ++- vault_sdk/src/sdk.rs | 2 - 31 files changed, 108 insertions(+), 173 deletions(-) diff --git a/clients/js/vault_client/instructions/addDelegation.ts b/clients/js/vault_client/instructions/addDelegation.ts index c38d7d70..f1b321ac 100644 --- a/clients/js/vault_client/instructions/addDelegation.ts +++ b/clients/js/vault_client/instructions/addDelegation.ts @@ -32,7 +32,7 @@ import { import { JITO_VAULT_PROGRAM_ADDRESS } from '../programs'; import { getAccountMetaFactory, type ResolvedAccount } from '../shared'; -export const ADD_DELEGATION_DISCRIMINATOR = 24; +export const ADD_DELEGATION_DISCRIMINATOR = 23; export function getAddDelegationDiscriminatorBytes() { return getU8Encoder().encode(ADD_DELEGATION_DISCRIMINATOR); diff --git a/clients/js/vault_client/instructions/closeVaultUpdateStateTracker.ts b/clients/js/vault_client/instructions/closeVaultUpdateStateTracker.ts index 13767732..329f0cf7 100644 --- a/clients/js/vault_client/instructions/closeVaultUpdateStateTracker.ts +++ b/clients/js/vault_client/instructions/closeVaultUpdateStateTracker.ts @@ -32,7 +32,7 @@ import { import { JITO_VAULT_PROGRAM_ADDRESS } from '../programs'; import { getAccountMetaFactory, type ResolvedAccount } from '../shared'; -export const CLOSE_VAULT_UPDATE_STATE_TRACKER_DISCRIMINATOR = 29; +export const CLOSE_VAULT_UPDATE_STATE_TRACKER_DISCRIMINATOR = 28; export function getCloseVaultUpdateStateTrackerDiscriminatorBytes() { return getU8Encoder().encode(CLOSE_VAULT_UPDATE_STATE_TRACKER_DISCRIMINATOR); diff --git a/clients/js/vault_client/instructions/cooldownDelegation.ts b/clients/js/vault_client/instructions/cooldownDelegation.ts index 5a6b5c9e..9ceb0b07 100644 --- a/clients/js/vault_client/instructions/cooldownDelegation.ts +++ b/clients/js/vault_client/instructions/cooldownDelegation.ts @@ -32,7 +32,7 @@ import { import { JITO_VAULT_PROGRAM_ADDRESS } from '../programs'; import { getAccountMetaFactory, type ResolvedAccount } from '../shared'; -export const COOLDOWN_DELEGATION_DISCRIMINATOR = 25; +export const COOLDOWN_DELEGATION_DISCRIMINATOR = 24; export function getCooldownDelegationDiscriminatorBytes() { return getU8Encoder().encode(COOLDOWN_DELEGATION_DISCRIMINATOR); diff --git a/clients/js/vault_client/instructions/crankVaultUpdateStateTracker.ts b/clients/js/vault_client/instructions/crankVaultUpdateStateTracker.ts index 86abd26a..6d969829 100644 --- a/clients/js/vault_client/instructions/crankVaultUpdateStateTracker.ts +++ b/clients/js/vault_client/instructions/crankVaultUpdateStateTracker.ts @@ -27,7 +27,7 @@ import { import { JITO_VAULT_PROGRAM_ADDRESS } from '../programs'; import { getAccountMetaFactory, type ResolvedAccount } from '../shared'; -export const CRANK_VAULT_UPDATE_STATE_TRACKER_DISCRIMINATOR = 28; +export const CRANK_VAULT_UPDATE_STATE_TRACKER_DISCRIMINATOR = 27; export function getCrankVaultUpdateStateTrackerDiscriminatorBytes() { return getU8Encoder().encode(CRANK_VAULT_UPDATE_STATE_TRACKER_DISCRIMINATOR); diff --git a/clients/js/vault_client/instructions/createTokenMetadata.ts b/clients/js/vault_client/instructions/createTokenMetadata.ts index 6b33c0e4..7495c9a2 100644 --- a/clients/js/vault_client/instructions/createTokenMetadata.ts +++ b/clients/js/vault_client/instructions/createTokenMetadata.ts @@ -37,7 +37,7 @@ import { import { JITO_VAULT_PROGRAM_ADDRESS } from '../programs'; import { getAccountMetaFactory, type ResolvedAccount } from '../shared'; -export const CREATE_TOKEN_METADATA_DISCRIMINATOR = 30; +export const CREATE_TOKEN_METADATA_DISCRIMINATOR = 29; export function getCreateTokenMetadataDiscriminatorBytes() { return getU8Encoder().encode(CREATE_TOKEN_METADATA_DISCRIMINATOR); diff --git a/clients/js/vault_client/instructions/initializeVaultUpdateStateTracker.ts b/clients/js/vault_client/instructions/initializeVaultUpdateStateTracker.ts index 722e41a7..30a11f3c 100644 --- a/clients/js/vault_client/instructions/initializeVaultUpdateStateTracker.ts +++ b/clients/js/vault_client/instructions/initializeVaultUpdateStateTracker.ts @@ -33,7 +33,7 @@ import { type WithdrawalAllocationMethodArgs, } from '../types'; -export const INITIALIZE_VAULT_UPDATE_STATE_TRACKER_DISCRIMINATOR = 27; +export const INITIALIZE_VAULT_UPDATE_STATE_TRACKER_DISCRIMINATOR = 26; export function getInitializeVaultUpdateStateTrackerDiscriminatorBytes() { return getU8Encoder().encode( diff --git a/clients/js/vault_client/instructions/revokeDelegateTokenAccount.ts b/clients/js/vault_client/instructions/revokeDelegateTokenAccount.ts index 6bbaa9f1..f3263b6e 100644 --- a/clients/js/vault_client/instructions/revokeDelegateTokenAccount.ts +++ b/clients/js/vault_client/instructions/revokeDelegateTokenAccount.ts @@ -30,7 +30,7 @@ import { import { JITO_VAULT_PROGRAM_ADDRESS } from '../programs'; import { getAccountMetaFactory, type ResolvedAccount } from '../shared'; -export const REVOKE_DELEGATE_TOKEN_ACCOUNT_DISCRIMINATOR = 21; +export const REVOKE_DELEGATE_TOKEN_ACCOUNT_DISCRIMINATOR = 32; export function getRevokeDelegateTokenAccountDiscriminatorBytes() { return getU8Encoder().encode(REVOKE_DELEGATE_TOKEN_ACCOUNT_DISCRIMINATOR); @@ -43,7 +43,6 @@ export type RevokeDelegateTokenAccountInstruction< TAccountDelegateAssetAdmin extends string | IAccountMeta = string, TAccountTokenMint extends string | IAccountMeta = string, TAccountTokenAccount extends string | IAccountMeta = string, - TAccountDelegate extends string | IAccountMeta = string, TAccountTokenProgram extends | string | IAccountMeta = 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA', @@ -68,9 +67,6 @@ export type RevokeDelegateTokenAccountInstruction< TAccountTokenAccount extends string ? WritableAccount : TAccountTokenAccount, - TAccountDelegate extends string - ? ReadonlyAccount - : TAccountDelegate, TAccountTokenProgram extends string ? ReadonlyAccount : TAccountTokenProgram, @@ -114,7 +110,6 @@ export type RevokeDelegateTokenAccountInput< TAccountDelegateAssetAdmin extends string = string, TAccountTokenMint extends string = string, TAccountTokenAccount extends string = string, - TAccountDelegate extends string = string, TAccountTokenProgram extends string = string, > = { config: Address; @@ -122,7 +117,6 @@ export type RevokeDelegateTokenAccountInput< delegateAssetAdmin: TransactionSigner; tokenMint: Address; tokenAccount: Address; - delegate: Address; tokenProgram?: Address; }; @@ -132,7 +126,6 @@ export function getRevokeDelegateTokenAccountInstruction< TAccountDelegateAssetAdmin extends string, TAccountTokenMint extends string, TAccountTokenAccount extends string, - TAccountDelegate extends string, TAccountTokenProgram extends string, >( input: RevokeDelegateTokenAccountInput< @@ -141,7 +134,6 @@ export function getRevokeDelegateTokenAccountInstruction< TAccountDelegateAssetAdmin, TAccountTokenMint, TAccountTokenAccount, - TAccountDelegate, TAccountTokenProgram > ): RevokeDelegateTokenAccountInstruction< @@ -151,7 +143,6 @@ export function getRevokeDelegateTokenAccountInstruction< TAccountDelegateAssetAdmin, TAccountTokenMint, TAccountTokenAccount, - TAccountDelegate, TAccountTokenProgram > { // Program address. @@ -167,7 +158,6 @@ export function getRevokeDelegateTokenAccountInstruction< }, tokenMint: { value: input.tokenMint ?? null, isWritable: false }, tokenAccount: { value: input.tokenAccount ?? null, isWritable: true }, - delegate: { value: input.delegate ?? null, isWritable: false }, tokenProgram: { value: input.tokenProgram ?? null, isWritable: false }, }; const accounts = originalAccounts as Record< @@ -189,7 +179,6 @@ export function getRevokeDelegateTokenAccountInstruction< getAccountMeta(accounts.delegateAssetAdmin), getAccountMeta(accounts.tokenMint), getAccountMeta(accounts.tokenAccount), - getAccountMeta(accounts.delegate), getAccountMeta(accounts.tokenProgram), ], programAddress, @@ -201,7 +190,6 @@ export function getRevokeDelegateTokenAccountInstruction< TAccountDelegateAssetAdmin, TAccountTokenMint, TAccountTokenAccount, - TAccountDelegate, TAccountTokenProgram >; @@ -219,8 +207,7 @@ export type ParsedRevokeDelegateTokenAccountInstruction< delegateAssetAdmin: TAccountMetas[2]; tokenMint: TAccountMetas[3]; tokenAccount: TAccountMetas[4]; - delegate: TAccountMetas[5]; - tokenProgram: TAccountMetas[6]; + tokenProgram: TAccountMetas[5]; }; data: RevokeDelegateTokenAccountInstructionData; }; @@ -233,7 +220,7 @@ export function parseRevokeDelegateTokenAccountInstruction< IInstructionWithAccounts & IInstructionWithData ): ParsedRevokeDelegateTokenAccountInstruction { - if (instruction.accounts.length < 7) { + if (instruction.accounts.length < 6) { // TODO: Coded error. throw new Error('Not enough accounts'); } @@ -251,7 +238,6 @@ export function parseRevokeDelegateTokenAccountInstruction< delegateAssetAdmin: getNextAccount(), tokenMint: getNextAccount(), tokenAccount: getNextAccount(), - delegate: getNextAccount(), tokenProgram: getNextAccount(), }, data: getRevokeDelegateTokenAccountInstructionDataDecoder().decode( diff --git a/clients/js/vault_client/instructions/setAdmin.ts b/clients/js/vault_client/instructions/setAdmin.ts index 49764be2..e988be46 100644 --- a/clients/js/vault_client/instructions/setAdmin.ts +++ b/clients/js/vault_client/instructions/setAdmin.ts @@ -30,7 +30,7 @@ import { import { JITO_VAULT_PROGRAM_ADDRESS } from '../programs'; import { getAccountMetaFactory, type ResolvedAccount } from '../shared'; -export const SET_ADMIN_DISCRIMINATOR = 22; +export const SET_ADMIN_DISCRIMINATOR = 21; export function getSetAdminDiscriminatorBytes() { return getU8Encoder().encode(SET_ADMIN_DISCRIMINATOR); diff --git a/clients/js/vault_client/instructions/setConfigAdmin.ts b/clients/js/vault_client/instructions/setConfigAdmin.ts index 75b982d0..86a43fc6 100644 --- a/clients/js/vault_client/instructions/setConfigAdmin.ts +++ b/clients/js/vault_client/instructions/setConfigAdmin.ts @@ -30,7 +30,7 @@ import { import { JITO_VAULT_PROGRAM_ADDRESS } from '../programs'; import { getAccountMetaFactory, type ResolvedAccount } from '../shared'; -export const SET_CONFIG_ADMIN_DISCRIMINATOR = 32; +export const SET_CONFIG_ADMIN_DISCRIMINATOR = 31; export function getSetConfigAdminDiscriminatorBytes() { return getU8Encoder().encode(SET_CONFIG_ADMIN_DISCRIMINATOR); diff --git a/clients/js/vault_client/instructions/setSecondaryAdmin.ts b/clients/js/vault_client/instructions/setSecondaryAdmin.ts index 00435be7..513a4568 100644 --- a/clients/js/vault_client/instructions/setSecondaryAdmin.ts +++ b/clients/js/vault_client/instructions/setSecondaryAdmin.ts @@ -36,7 +36,7 @@ import { type VaultAdminRoleArgs, } from '../types'; -export const SET_SECONDARY_ADMIN_DISCRIMINATOR = 23; +export const SET_SECONDARY_ADMIN_DISCRIMINATOR = 22; export function getSetSecondaryAdminDiscriminatorBytes() { return getU8Encoder().encode(SET_SECONDARY_ADMIN_DISCRIMINATOR); diff --git a/clients/js/vault_client/instructions/updateTokenMetadata.ts b/clients/js/vault_client/instructions/updateTokenMetadata.ts index 64699d85..4a05ba5b 100644 --- a/clients/js/vault_client/instructions/updateTokenMetadata.ts +++ b/clients/js/vault_client/instructions/updateTokenMetadata.ts @@ -36,7 +36,7 @@ import { import { JITO_VAULT_PROGRAM_ADDRESS } from '../programs'; import { getAccountMetaFactory, type ResolvedAccount } from '../shared'; -export const UPDATE_TOKEN_METADATA_DISCRIMINATOR = 31; +export const UPDATE_TOKEN_METADATA_DISCRIMINATOR = 30; export function getUpdateTokenMetadataDiscriminatorBytes() { return getU8Encoder().encode(UPDATE_TOKEN_METADATA_DISCRIMINATOR); diff --git a/clients/js/vault_client/instructions/updateVaultBalance.ts b/clients/js/vault_client/instructions/updateVaultBalance.ts index ccdbcac1..55b0f28e 100644 --- a/clients/js/vault_client/instructions/updateVaultBalance.ts +++ b/clients/js/vault_client/instructions/updateVaultBalance.ts @@ -27,7 +27,7 @@ import { import { JITO_VAULT_PROGRAM_ADDRESS } from '../programs'; import { getAccountMetaFactory, type ResolvedAccount } from '../shared'; -export const UPDATE_VAULT_BALANCE_DISCRIMINATOR = 26; +export const UPDATE_VAULT_BALANCE_DISCRIMINATOR = 25; export function getUpdateVaultBalanceDiscriminatorBytes() { return getU8Encoder().encode(UPDATE_VAULT_BALANCE_DISCRIMINATOR); diff --git a/clients/js/vault_client/programs/jitoVault.ts b/clients/js/vault_client/programs/jitoVault.ts index 290256fa..05e811c4 100644 --- a/clients/js/vault_client/programs/jitoVault.ts +++ b/clients/js/vault_client/programs/jitoVault.ts @@ -84,7 +84,6 @@ export enum JitoVaultInstruction { SetProgramFeeWallet, SetIsPaused, DelegateTokenAccount, - RevokeDelegateTokenAccount, SetAdmin, SetSecondaryAdmin, AddDelegation, @@ -96,6 +95,7 @@ export enum JitoVaultInstruction { CreateTokenMetadata, UpdateTokenMetadata, SetConfigAdmin, + RevokeDelegateTokenAccount, } export function identifyJitoVaultInstruction( @@ -166,40 +166,40 @@ export function identifyJitoVaultInstruction( return JitoVaultInstruction.DelegateTokenAccount; } if (containsBytes(data, getU8Encoder().encode(21), 0)) { - return JitoVaultInstruction.RevokeDelegateTokenAccount; + return JitoVaultInstruction.SetAdmin; } if (containsBytes(data, getU8Encoder().encode(22), 0)) { - return JitoVaultInstruction.SetAdmin; + return JitoVaultInstruction.SetSecondaryAdmin; } if (containsBytes(data, getU8Encoder().encode(23), 0)) { - return JitoVaultInstruction.SetSecondaryAdmin; + return JitoVaultInstruction.AddDelegation; } if (containsBytes(data, getU8Encoder().encode(24), 0)) { - return JitoVaultInstruction.AddDelegation; + return JitoVaultInstruction.CooldownDelegation; } if (containsBytes(data, getU8Encoder().encode(25), 0)) { - return JitoVaultInstruction.CooldownDelegation; + return JitoVaultInstruction.UpdateVaultBalance; } if (containsBytes(data, getU8Encoder().encode(26), 0)) { - return JitoVaultInstruction.UpdateVaultBalance; + return JitoVaultInstruction.InitializeVaultUpdateStateTracker; } if (containsBytes(data, getU8Encoder().encode(27), 0)) { - return JitoVaultInstruction.InitializeVaultUpdateStateTracker; + return JitoVaultInstruction.CrankVaultUpdateStateTracker; } if (containsBytes(data, getU8Encoder().encode(28), 0)) { - return JitoVaultInstruction.CrankVaultUpdateStateTracker; + return JitoVaultInstruction.CloseVaultUpdateStateTracker; } if (containsBytes(data, getU8Encoder().encode(29), 0)) { - return JitoVaultInstruction.CloseVaultUpdateStateTracker; + return JitoVaultInstruction.CreateTokenMetadata; } if (containsBytes(data, getU8Encoder().encode(30), 0)) { - return JitoVaultInstruction.CreateTokenMetadata; + return JitoVaultInstruction.UpdateTokenMetadata; } if (containsBytes(data, getU8Encoder().encode(31), 0)) { - return JitoVaultInstruction.UpdateTokenMetadata; + return JitoVaultInstruction.SetConfigAdmin; } if (containsBytes(data, getU8Encoder().encode(32), 0)) { - return JitoVaultInstruction.SetConfigAdmin; + return JitoVaultInstruction.RevokeDelegateTokenAccount; } throw new Error( 'The provided instruction could not be identified as a jitoVault instruction.' @@ -272,9 +272,6 @@ export type ParsedJitoVaultInstruction< | ({ instructionType: JitoVaultInstruction.DelegateTokenAccount; } & ParsedDelegateTokenAccountInstruction) - | ({ - instructionType: JitoVaultInstruction.RevokeDelegateTokenAccount; - } & ParsedRevokeDelegateTokenAccountInstruction) | ({ instructionType: JitoVaultInstruction.SetAdmin; } & ParsedSetAdminInstruction) @@ -307,4 +304,7 @@ export type ParsedJitoVaultInstruction< } & ParsedUpdateTokenMetadataInstruction) | ({ instructionType: JitoVaultInstruction.SetConfigAdmin; - } & ParsedSetConfigAdminInstruction); + } & ParsedSetConfigAdminInstruction) + | ({ + instructionType: JitoVaultInstruction.RevokeDelegateTokenAccount; + } & ParsedRevokeDelegateTokenAccountInstruction); diff --git a/clients/rust/vault_client/src/generated/instructions/add_delegation.rs b/clients/rust/vault_client/src/generated/instructions/add_delegation.rs index 32631ae4..5ae082b9 100644 --- a/clients/rust/vault_client/src/generated/instructions/add_delegation.rs +++ b/clients/rust/vault_client/src/generated/instructions/add_delegation.rs @@ -71,7 +71,7 @@ pub struct AddDelegationInstructionData { impl AddDelegationInstructionData { pub fn new() -> Self { - Self { discriminator: 24 } + Self { discriminator: 23 } } } diff --git a/clients/rust/vault_client/src/generated/instructions/close_vault_update_state_tracker.rs b/clients/rust/vault_client/src/generated/instructions/close_vault_update_state_tracker.rs index 39ec10ea..4d11b865 100644 --- a/clients/rust/vault_client/src/generated/instructions/close_vault_update_state_tracker.rs +++ b/clients/rust/vault_client/src/generated/instructions/close_vault_update_state_tracker.rs @@ -67,7 +67,7 @@ pub struct CloseVaultUpdateStateTrackerInstructionData { impl CloseVaultUpdateStateTrackerInstructionData { pub fn new() -> Self { - Self { discriminator: 29 } + Self { discriminator: 28 } } } diff --git a/clients/rust/vault_client/src/generated/instructions/cooldown_delegation.rs b/clients/rust/vault_client/src/generated/instructions/cooldown_delegation.rs index 21c76f56..a7056e0f 100644 --- a/clients/rust/vault_client/src/generated/instructions/cooldown_delegation.rs +++ b/clients/rust/vault_client/src/generated/instructions/cooldown_delegation.rs @@ -73,7 +73,7 @@ pub struct CooldownDelegationInstructionData { impl CooldownDelegationInstructionData { pub fn new() -> Self { - Self { discriminator: 25 } + Self { discriminator: 24 } } } diff --git a/clients/rust/vault_client/src/generated/instructions/crank_vault_update_state_tracker.rs b/clients/rust/vault_client/src/generated/instructions/crank_vault_update_state_tracker.rs index 67a96855..0d67d09f 100644 --- a/clients/rust/vault_client/src/generated/instructions/crank_vault_update_state_tracker.rs +++ b/clients/rust/vault_client/src/generated/instructions/crank_vault_update_state_tracker.rs @@ -68,7 +68,7 @@ pub struct CrankVaultUpdateStateTrackerInstructionData { impl CrankVaultUpdateStateTrackerInstructionData { pub fn new() -> Self { - Self { discriminator: 28 } + Self { discriminator: 27 } } } diff --git a/clients/rust/vault_client/src/generated/instructions/create_token_metadata.rs b/clients/rust/vault_client/src/generated/instructions/create_token_metadata.rs index 5cd1d46b..1a7bf2f2 100644 --- a/clients/rust/vault_client/src/generated/instructions/create_token_metadata.rs +++ b/clients/rust/vault_client/src/generated/instructions/create_token_metadata.rs @@ -84,7 +84,7 @@ pub struct CreateTokenMetadataInstructionData { impl CreateTokenMetadataInstructionData { pub fn new() -> Self { - Self { discriminator: 30 } + Self { discriminator: 29 } } } diff --git a/clients/rust/vault_client/src/generated/instructions/initialize_vault_update_state_tracker.rs b/clients/rust/vault_client/src/generated/instructions/initialize_vault_update_state_tracker.rs index ddc9c4bd..2f7c2aa4 100644 --- a/clients/rust/vault_client/src/generated/instructions/initialize_vault_update_state_tracker.rs +++ b/clients/rust/vault_client/src/generated/instructions/initialize_vault_update_state_tracker.rs @@ -75,7 +75,7 @@ pub struct InitializeVaultUpdateStateTrackerInstructionData { impl InitializeVaultUpdateStateTrackerInstructionData { pub fn new() -> Self { - Self { discriminator: 27 } + Self { discriminator: 26 } } } diff --git a/clients/rust/vault_client/src/generated/instructions/revoke_delegate_token_account.rs b/clients/rust/vault_client/src/generated/instructions/revoke_delegate_token_account.rs index 060b9e11..7ec74562 100644 --- a/clients/rust/vault_client/src/generated/instructions/revoke_delegate_token_account.rs +++ b/clients/rust/vault_client/src/generated/instructions/revoke_delegate_token_account.rs @@ -18,8 +18,6 @@ pub struct RevokeDelegateTokenAccount { pub token_account: solana_program::pubkey::Pubkey, - pub delegate: solana_program::pubkey::Pubkey, - pub token_program: solana_program::pubkey::Pubkey, } @@ -32,7 +30,7 @@ impl RevokeDelegateTokenAccount { &self, remaining_accounts: &[solana_program::instruction::AccountMeta], ) -> solana_program::instruction::Instruction { - let mut accounts = Vec::with_capacity(7 + remaining_accounts.len()); + let mut accounts = Vec::with_capacity(6 + remaining_accounts.len()); accounts.push(solana_program::instruction::AccountMeta::new_readonly( self.config, false, @@ -52,10 +50,6 @@ impl RevokeDelegateTokenAccount { self.token_account, false, )); - accounts.push(solana_program::instruction::AccountMeta::new_readonly( - self.delegate, - false, - )); accounts.push(solana_program::instruction::AccountMeta::new_readonly( self.token_program, false, @@ -80,7 +74,7 @@ pub struct RevokeDelegateTokenAccountInstructionData { impl RevokeDelegateTokenAccountInstructionData { pub fn new() -> Self { - Self { discriminator: 21 } + Self { discriminator: 32 } } } @@ -99,8 +93,7 @@ impl Default for RevokeDelegateTokenAccountInstructionData { /// 2. `[signer]` delegate_asset_admin /// 3. `[]` token_mint /// 4. `[writable]` token_account -/// 5. `[]` delegate -/// 6. `[optional]` token_program (default to `TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA`) +/// 5. `[optional]` token_program (default to `TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA`) #[derive(Clone, Debug, Default)] pub struct RevokeDelegateTokenAccountBuilder { config: Option, @@ -108,7 +101,6 @@ pub struct RevokeDelegateTokenAccountBuilder { delegate_asset_admin: Option, token_mint: Option, token_account: Option, - delegate: Option, token_program: Option, __remaining_accounts: Vec, } @@ -145,11 +137,6 @@ impl RevokeDelegateTokenAccountBuilder { self.token_account = Some(token_account); self } - #[inline(always)] - pub fn delegate(&mut self, delegate: solana_program::pubkey::Pubkey) -> &mut Self { - self.delegate = Some(delegate); - self - } /// `[optional account, default to 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA']` #[inline(always)] pub fn token_program(&mut self, token_program: solana_program::pubkey::Pubkey) -> &mut Self { @@ -184,7 +171,6 @@ impl RevokeDelegateTokenAccountBuilder { .expect("delegate_asset_admin is not set"), token_mint: self.token_mint.expect("token_mint is not set"), token_account: self.token_account.expect("token_account is not set"), - delegate: self.delegate.expect("delegate is not set"), token_program: self.token_program.unwrap_or(solana_program::pubkey!( "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" )), @@ -206,8 +192,6 @@ pub struct RevokeDelegateTokenAccountCpiAccounts<'a, 'b> { pub token_account: &'b solana_program::account_info::AccountInfo<'a>, - pub delegate: &'b solana_program::account_info::AccountInfo<'a>, - pub token_program: &'b solana_program::account_info::AccountInfo<'a>, } @@ -226,8 +210,6 @@ pub struct RevokeDelegateTokenAccountCpi<'a, 'b> { pub token_account: &'b solana_program::account_info::AccountInfo<'a>, - pub delegate: &'b solana_program::account_info::AccountInfo<'a>, - pub token_program: &'b solana_program::account_info::AccountInfo<'a>, } @@ -243,7 +225,6 @@ impl<'a, 'b> RevokeDelegateTokenAccountCpi<'a, 'b> { delegate_asset_admin: accounts.delegate_asset_admin, token_mint: accounts.token_mint, token_account: accounts.token_account, - delegate: accounts.delegate, token_program: accounts.token_program, } } @@ -280,7 +261,7 @@ impl<'a, 'b> RevokeDelegateTokenAccountCpi<'a, 'b> { bool, )], ) -> solana_program::entrypoint::ProgramResult { - let mut accounts = Vec::with_capacity(7 + remaining_accounts.len()); + let mut accounts = Vec::with_capacity(6 + remaining_accounts.len()); accounts.push(solana_program::instruction::AccountMeta::new_readonly( *self.config.key, false, @@ -301,10 +282,6 @@ impl<'a, 'b> RevokeDelegateTokenAccountCpi<'a, 'b> { *self.token_account.key, false, )); - accounts.push(solana_program::instruction::AccountMeta::new_readonly( - *self.delegate.key, - false, - )); accounts.push(solana_program::instruction::AccountMeta::new_readonly( *self.token_program.key, false, @@ -325,14 +302,13 @@ impl<'a, 'b> RevokeDelegateTokenAccountCpi<'a, 'b> { accounts, data, }; - let mut account_infos = Vec::with_capacity(7 + 1 + remaining_accounts.len()); + let mut account_infos = Vec::with_capacity(6 + 1 + remaining_accounts.len()); account_infos.push(self.__program.clone()); account_infos.push(self.config.clone()); account_infos.push(self.vault.clone()); account_infos.push(self.delegate_asset_admin.clone()); account_infos.push(self.token_mint.clone()); account_infos.push(self.token_account.clone()); - account_infos.push(self.delegate.clone()); account_infos.push(self.token_program.clone()); remaining_accounts .iter() @@ -355,8 +331,7 @@ impl<'a, 'b> RevokeDelegateTokenAccountCpi<'a, 'b> { /// 2. `[signer]` delegate_asset_admin /// 3. `[]` token_mint /// 4. `[writable]` token_account -/// 5. `[]` delegate -/// 6. `[]` token_program +/// 5. `[]` token_program #[derive(Clone, Debug)] pub struct RevokeDelegateTokenAccountCpiBuilder<'a, 'b> { instruction: Box>, @@ -371,7 +346,6 @@ impl<'a, 'b> RevokeDelegateTokenAccountCpiBuilder<'a, 'b> { delegate_asset_admin: None, token_mint: None, token_account: None, - delegate: None, token_program: None, __remaining_accounts: Vec::new(), }); @@ -415,14 +389,6 @@ impl<'a, 'b> RevokeDelegateTokenAccountCpiBuilder<'a, 'b> { self } #[inline(always)] - pub fn delegate( - &mut self, - delegate: &'b solana_program::account_info::AccountInfo<'a>, - ) -> &mut Self { - self.instruction.delegate = Some(delegate); - self - } - #[inline(always)] pub fn token_program( &mut self, token_program: &'b solana_program::account_info::AccountInfo<'a>, @@ -490,8 +456,6 @@ impl<'a, 'b> RevokeDelegateTokenAccountCpiBuilder<'a, 'b> { .token_account .expect("token_account is not set"), - delegate: self.instruction.delegate.expect("delegate is not set"), - token_program: self .instruction .token_program @@ -512,7 +476,6 @@ struct RevokeDelegateTokenAccountCpiBuilderInstruction<'a, 'b> { delegate_asset_admin: Option<&'b solana_program::account_info::AccountInfo<'a>>, token_mint: Option<&'b solana_program::account_info::AccountInfo<'a>>, token_account: Option<&'b solana_program::account_info::AccountInfo<'a>>, - delegate: Option<&'b solana_program::account_info::AccountInfo<'a>>, token_program: Option<&'b solana_program::account_info::AccountInfo<'a>>, /// Additional instruction accounts `(AccountInfo, is_writable, is_signer)`. __remaining_accounts: Vec<( diff --git a/clients/rust/vault_client/src/generated/instructions/set_admin.rs b/clients/rust/vault_client/src/generated/instructions/set_admin.rs index e39fe75c..89d2c08e 100644 --- a/clients/rust/vault_client/src/generated/instructions/set_admin.rs +++ b/clients/rust/vault_client/src/generated/instructions/set_admin.rs @@ -60,7 +60,7 @@ pub struct SetAdminInstructionData { impl SetAdminInstructionData { pub fn new() -> Self { - Self { discriminator: 22 } + Self { discriminator: 21 } } } diff --git a/clients/rust/vault_client/src/generated/instructions/set_config_admin.rs b/clients/rust/vault_client/src/generated/instructions/set_config_admin.rs index fa67f9ee..eb82822b 100644 --- a/clients/rust/vault_client/src/generated/instructions/set_config_admin.rs +++ b/clients/rust/vault_client/src/generated/instructions/set_config_admin.rs @@ -55,7 +55,7 @@ pub struct SetConfigAdminInstructionData { impl SetConfigAdminInstructionData { pub fn new() -> Self { - Self { discriminator: 32 } + Self { discriminator: 31 } } } diff --git a/clients/rust/vault_client/src/generated/instructions/set_secondary_admin.rs b/clients/rust/vault_client/src/generated/instructions/set_secondary_admin.rs index df3dd1ad..bed9a83f 100644 --- a/clients/rust/vault_client/src/generated/instructions/set_secondary_admin.rs +++ b/clients/rust/vault_client/src/generated/instructions/set_secondary_admin.rs @@ -69,7 +69,7 @@ pub struct SetSecondaryAdminInstructionData { impl SetSecondaryAdminInstructionData { pub fn new() -> Self { - Self { discriminator: 23 } + Self { discriminator: 22 } } } diff --git a/clients/rust/vault_client/src/generated/instructions/update_token_metadata.rs b/clients/rust/vault_client/src/generated/instructions/update_token_metadata.rs index cd19c506..a7da1035 100644 --- a/clients/rust/vault_client/src/generated/instructions/update_token_metadata.rs +++ b/clients/rust/vault_client/src/generated/instructions/update_token_metadata.rs @@ -73,7 +73,7 @@ pub struct UpdateTokenMetadataInstructionData { impl UpdateTokenMetadataInstructionData { pub fn new() -> Self { - Self { discriminator: 31 } + Self { discriminator: 30 } } } diff --git a/clients/rust/vault_client/src/generated/instructions/update_vault_balance.rs b/clients/rust/vault_client/src/generated/instructions/update_vault_balance.rs index 57afd3e1..bfb724d7 100644 --- a/clients/rust/vault_client/src/generated/instructions/update_vault_balance.rs +++ b/clients/rust/vault_client/src/generated/instructions/update_vault_balance.rs @@ -74,7 +74,7 @@ pub struct UpdateVaultBalanceInstructionData { impl UpdateVaultBalanceInstructionData { pub fn new() -> Self { - Self { discriminator: 26 } + Self { discriminator: 25 } } } diff --git a/idl/jito_vault.json b/idl/jito_vault.json index e130fa4f..ce734b6b 100644 --- a/idl/jito_vault.json +++ b/idl/jito_vault.json @@ -962,51 +962,6 @@ "value": 20 } }, - { - "name": "RevokeDelegateTokenAccount", - "accounts": [ - { - "name": "config", - "isMut": false, - "isSigner": false - }, - { - "name": "vault", - "isMut": false, - "isSigner": false - }, - { - "name": "delegateAssetAdmin", - "isMut": false, - "isSigner": true - }, - { - "name": "tokenMint", - "isMut": false, - "isSigner": false - }, - { - "name": "tokenAccount", - "isMut": true, - "isSigner": false - }, - { - "name": "delegate", - "isMut": false, - "isSigner": false - }, - { - "name": "tokenProgram", - "isMut": false, - "isSigner": false - } - ], - "args": [], - "discriminant": { - "type": "u8", - "value": 21 - } - }, { "name": "SetAdmin", "accounts": [ @@ -1034,7 +989,7 @@ "args": [], "discriminant": { "type": "u8", - "value": 22 + "value": 21 } }, { @@ -1071,7 +1026,7 @@ ], "discriminant": { "type": "u8", - "value": 23 + "value": 22 } }, { @@ -1111,7 +1066,7 @@ ], "discriminant": { "type": "u8", - "value": 24 + "value": 23 } }, { @@ -1151,7 +1106,7 @@ ], "discriminant": { "type": "u8", - "value": 25 + "value": 24 } }, { @@ -1191,7 +1146,7 @@ "args": [], "discriminant": { "type": "u8", - "value": 26 + "value": 25 } }, { @@ -1233,7 +1188,7 @@ ], "discriminant": { "type": "u8", - "value": 27 + "value": 26 } }, { @@ -1268,7 +1223,7 @@ "args": [], "discriminant": { "type": "u8", - "value": 28 + "value": 27 } }, { @@ -1303,7 +1258,7 @@ ], "discriminant": { "type": "u8", - "value": 29 + "value": 28 } }, { @@ -1361,7 +1316,7 @@ ], "discriminant": { "type": "u8", - "value": 30 + "value": 29 } }, { @@ -1409,7 +1364,7 @@ ], "discriminant": { "type": "u8", - "value": 31 + "value": 30 } }, { @@ -1432,6 +1387,46 @@ } ], "args": [], + "discriminant": { + "type": "u8", + "value": 31 + } + }, + { + "name": "RevokeDelegateTokenAccount", + "accounts": [ + { + "name": "config", + "isMut": false, + "isSigner": false + }, + { + "name": "vault", + "isMut": false, + "isSigner": false + }, + { + "name": "delegateAssetAdmin", + "isMut": false, + "isSigner": true + }, + { + "name": "tokenMint", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [], "discriminant": { "type": "u8", "value": 32 diff --git a/integration_tests/tests/fixtures/vault_client.rs b/integration_tests/tests/fixtures/vault_client.rs index a1ac83af..1251c9a4 100644 --- a/integration_tests/tests/fixtures/vault_client.rs +++ b/integration_tests/tests/fixtures/vault_client.rs @@ -851,7 +851,6 @@ impl VaultProgramClient { delegate_asset_admin: &Keypair, token_mint: &Pubkey, token_account: &Pubkey, - delegate: &Pubkey, token_program_id: &Pubkey, ) -> Result<(), TestError> { let blockhash = self.banks_client.get_latest_blockhash().await?; @@ -863,7 +862,6 @@ impl VaultProgramClient { &delegate_asset_admin.pubkey(), token_mint, token_account, - delegate, token_program_id, )], Some(&self.payer.pubkey()), diff --git a/integration_tests/tests/vault/revoke_delegate_token_account.rs b/integration_tests/tests/vault/revoke_delegate_token_account.rs index ac4a5882..82c4ff54 100644 --- a/integration_tests/tests/vault/revoke_delegate_token_account.rs +++ b/integration_tests/tests/vault/revoke_delegate_token_account.rs @@ -116,7 +116,6 @@ mod tests { &vault_admin, &random_mint.pubkey(), &get_associated_token_address(&vault_pubkey, &random_mint.pubkey()), - &bob, &token_program_id, ) .await @@ -211,7 +210,6 @@ mod tests { &wrong_delegate_asset_admin, &random_mint.pubkey(), &get_associated_token_address(&vault_pubkey, &random_mint.pubkey()), - &bob, &token_program_id, ) .await; @@ -246,7 +244,6 @@ mod tests { &wrong_delegate_asset_admin, &random_mint.pubkey(), &vault_token_account.pubkey(), - &bob, &token_program_id, ) .await; diff --git a/vault_program/src/revoke_delegate_token_account.rs b/vault_program/src/revoke_delegate_token_account.rs index 84b06d58..8003ee2b 100644 --- a/vault_program/src/revoke_delegate_token_account.rs +++ b/vault_program/src/revoke_delegate_token_account.rs @@ -20,7 +20,7 @@ pub fn process_revoke_delegate_token_account( program_id: &Pubkey, accounts: &[AccountInfo], ) -> ProgramResult { - let [config, vault_info, delegate_asset_admin, token_mint, token_account, delegate, token_program_info] = + let [config, vault_info, delegate_asset_admin, token_mint, token_account, token_program_info] = accounts else { return Err(ProgramError::NotEnoughAccountKeys); @@ -58,6 +58,7 @@ pub fn process_revoke_delegate_token_account( drop(vault_data); + // This is compatible with the spl-token and spl-token-2022 programs let ix = spl_token_2022::instruction::revoke( token_program_info.key, token_account.key, @@ -70,7 +71,6 @@ pub fn process_revoke_delegate_token_account( &[ token_program_info.clone(), token_account.clone(), - delegate.clone(), vault_info.clone(), ], &[vault_seeds diff --git a/vault_sdk/src/instruction.rs b/vault_sdk/src/instruction.rs index 441177f2..5a4e1d65 100644 --- a/vault_sdk/src/instruction.rs +++ b/vault_sdk/src/instruction.rs @@ -223,16 +223,6 @@ pub enum VaultInstruction { #[account(6, name = "token_program")] DelegateTokenAccount, - /// Revoke Delegate of the token account - #[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")] - RevokeDelegateTokenAccount, - /// Changes the signer for vault admin #[account(0, name = "config")] #[account(1, writable, name = "vault")] @@ -330,6 +320,14 @@ pub enum VaultInstruction { #[account(2, name = "new_admin")] SetConfigAdmin, + /// Revoke Delegate of the token account + #[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 = "token_program")] + RevokeDelegateTokenAccount, } #[derive(Debug, BorshSerialize, BorshDeserialize)] diff --git a/vault_sdk/src/sdk.rs b/vault_sdk/src/sdk.rs index e8b895c9..69d201df 100644 --- a/vault_sdk/src/sdk.rs +++ b/vault_sdk/src/sdk.rs @@ -310,7 +310,6 @@ pub fn revoke_delegate_token_account( delegate_asset_admin: &Pubkey, token_mint: &Pubkey, token_account: &Pubkey, - delegate: &Pubkey, token_program_id: &Pubkey, ) -> Instruction { let accounts = vec![ @@ -319,7 +318,6 @@ pub fn revoke_delegate_token_account( AccountMeta::new_readonly(*delegate_asset_admin, true), AccountMeta::new_readonly(*token_mint, false), AccountMeta::new(*token_account, false), - AccountMeta::new_readonly(*delegate, false), AccountMeta::new_readonly(*token_program_id, false), ]; Instruction {