Skip to content

Commit

Permalink
AUDIT: Inconsistent NCN Vault Count (#52)
Browse files Browse the repository at this point in the history
We just need to know if NcnVaultTicket exists to register the ticket. 
When we take vault operator delegation, we check the state of both
NcnVaultTicket and VaultNcnTicket
  • Loading branch information
coachchucksol authored Jan 16, 2025
1 parent e41732d commit d1c3534
Show file tree
Hide file tree
Showing 10 changed files with 93 additions and 239 deletions.
12 changes: 4 additions & 8 deletions cli/src/instructions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -273,25 +273,21 @@ pub async fn register_vault(handler: &CliHandler, vault: &Pubkey) -> Result<()>
let ncn = *handler.ncn()?;
let vault = *vault;

let (tip_router_config, _, _) =
TipRouterConfig::find_program_address(&handler.tip_router_program_id, &ncn);

let (vault_registry, _, _) =
VaultRegistry::find_program_address(&handler.tip_router_program_id, &ncn);

let (restaking_config, _, _) =
RestakingConfig::find_program_address(&handler.restaking_program_id);

let (ncn_vault_ticket, _, _) =
NcnVaultTicket::find_program_address(&handler.restaking_program_id, &ncn, &vault);

let (vault_ncn_ticket, _, _) =
VaultNcnTicket::find_program_address(&handler.vault_program_id, &vault, &ncn);

let register_vault_ix = RegisterVaultBuilder::new()
.config(tip_router_config)
.vault_registry(vault_registry)
.vault(vault)
.ncn(ncn)
.ncn_vault_ticket(ncn_vault_ticket)
.restaking_config(restaking_config)
.vault_ncn_ticket(vault_ncn_ticket)
.vault_registry(vault_registry)
.instruction();

Expand Down
49 changes: 16 additions & 33 deletions clients/js/jito_tip_router/instructions/registerVault.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,30 +35,26 @@ export function getRegisterVaultDiscriminatorBytes() {

export type RegisterVaultInstruction<
TProgram extends string = typeof JITO_TIP_ROUTER_PROGRAM_ADDRESS,
TAccountRestakingConfig extends string | IAccountMeta<string> = string,
TAccountConfig extends string | IAccountMeta<string> = string,
TAccountVaultRegistry extends string | IAccountMeta<string> = string,
TAccountNcn extends string | IAccountMeta<string> = string,
TAccountVault extends string | IAccountMeta<string> = string,
TAccountVaultNcnTicket extends string | IAccountMeta<string> = string,
TAccountNcnVaultTicket extends string | IAccountMeta<string> = string,
TRemainingAccounts extends readonly IAccountMeta<string>[] = [],
> = IInstruction<TProgram> &
IInstructionWithData<Uint8Array> &
IInstructionWithAccounts<
[
TAccountRestakingConfig extends string
? ReadonlyAccount<TAccountRestakingConfig>
: TAccountRestakingConfig,
TAccountConfig extends string
? ReadonlyAccount<TAccountConfig>
: TAccountConfig,
TAccountVaultRegistry extends string
? WritableAccount<TAccountVaultRegistry>
: TAccountVaultRegistry,
TAccountNcn extends string ? ReadonlyAccount<TAccountNcn> : TAccountNcn,
TAccountVault extends string
? ReadonlyAccount<TAccountVault>
: TAccountVault,
TAccountVaultNcnTicket extends string
? ReadonlyAccount<TAccountVaultNcnTicket>
: TAccountVaultNcnTicket,
TAccountNcnVaultTicket extends string
? ReadonlyAccount<TAccountNcnVaultTicket>
: TAccountNcnVaultTicket,
Expand Down Expand Up @@ -92,46 +88,41 @@ export function getRegisterVaultInstructionDataCodec(): Codec<
}

export type RegisterVaultInput<
TAccountRestakingConfig extends string = string,
TAccountConfig extends string = string,
TAccountVaultRegistry extends string = string,
TAccountNcn extends string = string,
TAccountVault extends string = string,
TAccountVaultNcnTicket extends string = string,
TAccountNcnVaultTicket extends string = string,
> = {
restakingConfig: Address<TAccountRestakingConfig>;
config: Address<TAccountConfig>;
vaultRegistry: Address<TAccountVaultRegistry>;
ncn: Address<TAccountNcn>;
vault: Address<TAccountVault>;
vaultNcnTicket: Address<TAccountVaultNcnTicket>;
ncnVaultTicket: Address<TAccountNcnVaultTicket>;
};

export function getRegisterVaultInstruction<
TAccountRestakingConfig extends string,
TAccountConfig extends string,
TAccountVaultRegistry extends string,
TAccountNcn extends string,
TAccountVault extends string,
TAccountVaultNcnTicket extends string,
TAccountNcnVaultTicket extends string,
TProgramAddress extends Address = typeof JITO_TIP_ROUTER_PROGRAM_ADDRESS,
>(
input: RegisterVaultInput<
TAccountRestakingConfig,
TAccountConfig,
TAccountVaultRegistry,
TAccountNcn,
TAccountVault,
TAccountVaultNcnTicket,
TAccountNcnVaultTicket
>,
config?: { programAddress?: TProgramAddress }
): RegisterVaultInstruction<
TProgramAddress,
TAccountRestakingConfig,
TAccountConfig,
TAccountVaultRegistry,
TAccountNcn,
TAccountVault,
TAccountVaultNcnTicket,
TAccountNcnVaultTicket
> {
// Program address.
Expand All @@ -140,14 +131,10 @@ export function getRegisterVaultInstruction<

// Original accounts.
const originalAccounts = {
restakingConfig: {
value: input.restakingConfig ?? null,
isWritable: false,
},
config: { value: input.config ?? null, isWritable: false },
vaultRegistry: { value: input.vaultRegistry ?? null, isWritable: true },
ncn: { value: input.ncn ?? null, isWritable: false },
vault: { value: input.vault ?? null, isWritable: false },
vaultNcnTicket: { value: input.vaultNcnTicket ?? null, isWritable: false },
ncnVaultTicket: { value: input.ncnVaultTicket ?? null, isWritable: false },
};
const accounts = originalAccounts as Record<
Expand All @@ -158,22 +145,20 @@ export function getRegisterVaultInstruction<
const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');
const instruction = {
accounts: [
getAccountMeta(accounts.restakingConfig),
getAccountMeta(accounts.config),
getAccountMeta(accounts.vaultRegistry),
getAccountMeta(accounts.ncn),
getAccountMeta(accounts.vault),
getAccountMeta(accounts.vaultNcnTicket),
getAccountMeta(accounts.ncnVaultTicket),
],
programAddress,
data: getRegisterVaultInstructionDataEncoder().encode({}),
} as RegisterVaultInstruction<
TProgramAddress,
TAccountRestakingConfig,
TAccountConfig,
TAccountVaultRegistry,
TAccountNcn,
TAccountVault,
TAccountVaultNcnTicket,
TAccountNcnVaultTicket
>;

Expand All @@ -186,12 +171,11 @@ export type ParsedRegisterVaultInstruction<
> = {
programAddress: Address<TProgram>;
accounts: {
restakingConfig: TAccountMetas[0];
config: TAccountMetas[0];
vaultRegistry: TAccountMetas[1];
ncn: TAccountMetas[2];
vault: TAccountMetas[3];
vaultNcnTicket: TAccountMetas[4];
ncnVaultTicket: TAccountMetas[5];
ncnVaultTicket: TAccountMetas[4];
};
data: RegisterVaultInstructionData;
};
Expand All @@ -204,7 +188,7 @@ export function parseRegisterVaultInstruction<
IInstructionWithAccounts<TAccountMetas> &
IInstructionWithData<Uint8Array>
): ParsedRegisterVaultInstruction<TProgram, TAccountMetas> {
if (instruction.accounts.length < 6) {
if (instruction.accounts.length < 5) {
// TODO: Coded error.
throw new Error('Not enough accounts');
}
Expand All @@ -217,11 +201,10 @@ export function parseRegisterVaultInstruction<
return {
programAddress: instruction.programAddress,
accounts: {
restakingConfig: getNextAccount(),
config: getNextAccount(),
vaultRegistry: getNextAccount(),
ncn: getNextAccount(),
vault: getNextAccount(),
vaultNcnTicket: getNextAccount(),
ncnVaultTicket: getNextAccount(),
},
data: getRegisterVaultInstructionDataDecoder().decode(instruction.data),
Expand Down
Loading

0 comments on commit d1c3534

Please sign in to comment.