From 00317d1f1f6c425597535e119ea4a7d5f656564b Mon Sep 17 00:00:00 2001 From: Steven Luscher Date: Tue, 3 Dec 2024 18:33:39 +0000 Subject: [PATCH] Patch the instruction discriminant to be 4 bytes --- clients/js/src/generated/instructions/deploy.ts | 10 +++++----- clients/js/src/generated/instructions/finalize.ts | 10 +++++----- clients/js/src/generated/instructions/retract.ts | 10 +++++----- .../generated/instructions/transferAuthority.ts | 10 +++++----- clients/js/src/generated/instructions/truncate.ts | 8 +++----- clients/js/src/generated/instructions/write.ts | 8 +++----- clients/js/src/generated/programs/loaderV4.ts | 14 +++++++------- clients/rust/src/generated/instructions/deploy.rs | 2 +- .../rust/src/generated/instructions/finalize.rs | 2 +- clients/rust/src/generated/instructions/retract.rs | 2 +- .../generated/instructions/transfer_authority.rs | 2 +- .../rust/src/generated/instructions/truncate.rs | 2 +- clients/rust/src/generated/instructions/write.rs | 2 +- program/idl.json | 12 ++++++------ scripts/generate-idls.mjs | 10 ++++++++++ 15 files changed, 55 insertions(+), 49 deletions(-) diff --git a/clients/js/src/generated/instructions/deploy.ts b/clients/js/src/generated/instructions/deploy.ts index d825304..932e829 100644 --- a/clients/js/src/generated/instructions/deploy.ts +++ b/clients/js/src/generated/instructions/deploy.ts @@ -10,8 +10,8 @@ import { combineCodec, getStructDecoder, getStructEncoder, - getU8Decoder, - getU8Encoder, + getU32Decoder, + getU32Encoder, transformEncoder, type Address, type Codec, @@ -32,7 +32,7 @@ import { getAccountMetaFactory, type ResolvedAccount } from '../shared'; export const DEPLOY_DISCRIMINATOR = 2; export function getDeployDiscriminatorBytes() { - return getU8Encoder().encode(DEPLOY_DISCRIMINATOR); + return getU32Encoder().encode(DEPLOY_DISCRIMINATOR); } export type DeployInstruction< @@ -65,13 +65,13 @@ export type DeployInstructionDataArgs = {}; export function getDeployInstructionDataEncoder(): Encoder { return transformEncoder( - getStructEncoder([['discriminator', getU8Encoder()]]), + getStructEncoder([['discriminator', getU32Encoder()]]), (value) => ({ ...value, discriminator: DEPLOY_DISCRIMINATOR }) ); } export function getDeployInstructionDataDecoder(): Decoder { - return getStructDecoder([['discriminator', getU8Decoder()]]); + return getStructDecoder([['discriminator', getU32Decoder()]]); } export function getDeployInstructionDataCodec(): Codec< diff --git a/clients/js/src/generated/instructions/finalize.ts b/clients/js/src/generated/instructions/finalize.ts index dc4a3a0..f9b7796 100644 --- a/clients/js/src/generated/instructions/finalize.ts +++ b/clients/js/src/generated/instructions/finalize.ts @@ -10,8 +10,8 @@ import { combineCodec, getStructDecoder, getStructEncoder, - getU8Decoder, - getU8Encoder, + getU32Decoder, + getU32Encoder, transformEncoder, type Address, type Codec, @@ -33,7 +33,7 @@ import { getAccountMetaFactory, type ResolvedAccount } from '../shared'; export const FINALIZE_DISCRIMINATOR = 5; export function getFinalizeDiscriminatorBytes() { - return getU8Encoder().encode(FINALIZE_DISCRIMINATOR); + return getU32Encoder().encode(FINALIZE_DISCRIMINATOR); } export type FinalizeInstruction< @@ -66,13 +66,13 @@ export type FinalizeInstructionDataArgs = {}; export function getFinalizeInstructionDataEncoder(): Encoder { return transformEncoder( - getStructEncoder([['discriminator', getU8Encoder()]]), + getStructEncoder([['discriminator', getU32Encoder()]]), (value) => ({ ...value, discriminator: FINALIZE_DISCRIMINATOR }) ); } export function getFinalizeInstructionDataDecoder(): Decoder { - return getStructDecoder([['discriminator', getU8Decoder()]]); + return getStructDecoder([['discriminator', getU32Decoder()]]); } export function getFinalizeInstructionDataCodec(): Codec< diff --git a/clients/js/src/generated/instructions/retract.ts b/clients/js/src/generated/instructions/retract.ts index cf36e71..efd31d0 100644 --- a/clients/js/src/generated/instructions/retract.ts +++ b/clients/js/src/generated/instructions/retract.ts @@ -10,8 +10,8 @@ import { combineCodec, getStructDecoder, getStructEncoder, - getU8Decoder, - getU8Encoder, + getU32Decoder, + getU32Encoder, transformEncoder, type Address, type Codec, @@ -32,7 +32,7 @@ import { getAccountMetaFactory, type ResolvedAccount } from '../shared'; export const RETRACT_DISCRIMINATOR = 3; export function getRetractDiscriminatorBytes() { - return getU8Encoder().encode(RETRACT_DISCRIMINATOR); + return getU32Encoder().encode(RETRACT_DISCRIMINATOR); } export type RetractInstruction< @@ -61,13 +61,13 @@ export type RetractInstructionDataArgs = {}; export function getRetractInstructionDataEncoder(): Encoder { return transformEncoder( - getStructEncoder([['discriminator', getU8Encoder()]]), + getStructEncoder([['discriminator', getU32Encoder()]]), (value) => ({ ...value, discriminator: RETRACT_DISCRIMINATOR }) ); } export function getRetractInstructionDataDecoder(): Decoder { - return getStructDecoder([['discriminator', getU8Decoder()]]); + return getStructDecoder([['discriminator', getU32Decoder()]]); } export function getRetractInstructionDataCodec(): Codec< diff --git a/clients/js/src/generated/instructions/transferAuthority.ts b/clients/js/src/generated/instructions/transferAuthority.ts index aa46e53..7f7455a 100644 --- a/clients/js/src/generated/instructions/transferAuthority.ts +++ b/clients/js/src/generated/instructions/transferAuthority.ts @@ -10,8 +10,8 @@ import { combineCodec, getStructDecoder, getStructEncoder, - getU8Decoder, - getU8Encoder, + getU32Decoder, + getU32Encoder, transformEncoder, type Address, type Codec, @@ -32,7 +32,7 @@ import { getAccountMetaFactory, type ResolvedAccount } from '../shared'; export const TRANSFER_AUTHORITY_DISCRIMINATOR = 4; export function getTransferAuthorityDiscriminatorBytes() { - return getU8Encoder().encode(TRANSFER_AUTHORITY_DISCRIMINATOR); + return getU32Encoder().encode(TRANSFER_AUTHORITY_DISCRIMINATOR); } export type TransferAuthorityInstruction< @@ -66,13 +66,13 @@ export type TransferAuthorityInstructionDataArgs = {}; export function getTransferAuthorityInstructionDataEncoder(): Encoder { return transformEncoder( - getStructEncoder([['discriminator', getU8Encoder()]]), + getStructEncoder([['discriminator', getU32Encoder()]]), (value) => ({ ...value, discriminator: TRANSFER_AUTHORITY_DISCRIMINATOR }) ); } export function getTransferAuthorityInstructionDataDecoder(): Decoder { - return getStructDecoder([['discriminator', getU8Decoder()]]); + return getStructDecoder([['discriminator', getU32Decoder()]]); } export function getTransferAuthorityInstructionDataCodec(): Codec< diff --git a/clients/js/src/generated/instructions/truncate.ts b/clients/js/src/generated/instructions/truncate.ts index f9542bb..fe6d634 100644 --- a/clients/js/src/generated/instructions/truncate.ts +++ b/clients/js/src/generated/instructions/truncate.ts @@ -12,8 +12,6 @@ import { getStructEncoder, getU32Decoder, getU32Encoder, - getU8Decoder, - getU8Encoder, transformEncoder, type Address, type Codec, @@ -35,7 +33,7 @@ import { getAccountMetaFactory, type ResolvedAccount } from '../shared'; export const TRUNCATE_DISCRIMINATOR = 1; export function getTruncateDiscriminatorBytes() { - return getU8Encoder().encode(TRUNCATE_DISCRIMINATOR); + return getU32Encoder().encode(TRUNCATE_DISCRIMINATOR); } export type TruncateInstruction< @@ -73,7 +71,7 @@ export type TruncateInstructionDataArgs = { newSize: number }; export function getTruncateInstructionDataEncoder(): Encoder { return transformEncoder( getStructEncoder([ - ['discriminator', getU8Encoder()], + ['discriminator', getU32Encoder()], ['newSize', getU32Encoder()], ]), (value) => ({ ...value, discriminator: TRUNCATE_DISCRIMINATOR }) @@ -82,7 +80,7 @@ export function getTruncateInstructionDataEncoder(): Encoder { return getStructDecoder([ - ['discriminator', getU8Decoder()], + ['discriminator', getU32Decoder()], ['newSize', getU32Decoder()], ]); } diff --git a/clients/js/src/generated/instructions/write.ts b/clients/js/src/generated/instructions/write.ts index 9177aac..c7298b8 100644 --- a/clients/js/src/generated/instructions/write.ts +++ b/clients/js/src/generated/instructions/write.ts @@ -16,8 +16,6 @@ import { getStructEncoder, getU32Decoder, getU32Encoder, - getU8Decoder, - getU8Encoder, transformEncoder, type Address, type Codec, @@ -39,7 +37,7 @@ import { getAccountMetaFactory, type ResolvedAccount } from '../shared'; export const WRITE_DISCRIMINATOR = 0; export function getWriteDiscriminatorBytes() { - return getU8Encoder().encode(WRITE_DISCRIMINATOR); + return getU32Encoder().encode(WRITE_DISCRIMINATOR); } export type WriteInstruction< @@ -76,7 +74,7 @@ export type WriteInstructionDataArgs = { export function getWriteInstructionDataEncoder(): Encoder { return transformEncoder( getStructEncoder([ - ['discriminator', getU8Encoder()], + ['discriminator', getU32Encoder()], ['offset', getU32Encoder()], ['bytes', addEncoderSizePrefix(getBytesEncoder(), getU32Encoder())], ]), @@ -86,7 +84,7 @@ export function getWriteInstructionDataEncoder(): Encoder { return getStructDecoder([ - ['discriminator', getU8Decoder()], + ['discriminator', getU32Decoder()], ['offset', getU32Decoder()], ['bytes', addDecoderSizePrefix(getBytesDecoder(), getU32Decoder())], ]); diff --git a/clients/js/src/generated/programs/loaderV4.ts b/clients/js/src/generated/programs/loaderV4.ts index 4532e90..b059902 100644 --- a/clients/js/src/generated/programs/loaderV4.ts +++ b/clients/js/src/generated/programs/loaderV4.ts @@ -8,7 +8,7 @@ import { containsBytes, - getU8Encoder, + getU32Encoder, type Address, type ReadonlyUint8Array, } from '@solana/web3.js'; @@ -37,22 +37,22 @@ export function identifyLoaderV4Instruction( instruction: { data: ReadonlyUint8Array } | ReadonlyUint8Array ): LoaderV4Instruction { const data = 'data' in instruction ? instruction.data : instruction; - if (containsBytes(data, getU8Encoder().encode(0), 0)) { + if (containsBytes(data, getU32Encoder().encode(0), 0)) { return LoaderV4Instruction.Write; } - if (containsBytes(data, getU8Encoder().encode(1), 0)) { + if (containsBytes(data, getU32Encoder().encode(1), 0)) { return LoaderV4Instruction.Truncate; } - if (containsBytes(data, getU8Encoder().encode(2), 0)) { + if (containsBytes(data, getU32Encoder().encode(2), 0)) { return LoaderV4Instruction.Deploy; } - if (containsBytes(data, getU8Encoder().encode(3), 0)) { + if (containsBytes(data, getU32Encoder().encode(3), 0)) { return LoaderV4Instruction.Retract; } - if (containsBytes(data, getU8Encoder().encode(4), 0)) { + if (containsBytes(data, getU32Encoder().encode(4), 0)) { return LoaderV4Instruction.TransferAuthority; } - if (containsBytes(data, getU8Encoder().encode(5), 0)) { + if (containsBytes(data, getU32Encoder().encode(5), 0)) { return LoaderV4Instruction.Finalize; } throw new Error( diff --git a/clients/rust/src/generated/instructions/deploy.rs b/clients/rust/src/generated/instructions/deploy.rs index 08aa333..32f010c 100644 --- a/clients/rust/src/generated/instructions/deploy.rs +++ b/clients/rust/src/generated/instructions/deploy.rs @@ -56,7 +56,7 @@ impl Deploy { #[derive(BorshDeserialize, BorshSerialize)] pub struct DeployInstructionData { - discriminator: u8, + discriminator: u32, } impl DeployInstructionData { diff --git a/clients/rust/src/generated/instructions/finalize.rs b/clients/rust/src/generated/instructions/finalize.rs index f0ff137..5f2cd33 100644 --- a/clients/rust/src/generated/instructions/finalize.rs +++ b/clients/rust/src/generated/instructions/finalize.rs @@ -51,7 +51,7 @@ impl Finalize { #[derive(BorshDeserialize, BorshSerialize)] pub struct FinalizeInstructionData { - discriminator: u8, + discriminator: u32, } impl FinalizeInstructionData { diff --git a/clients/rust/src/generated/instructions/retract.rs b/clients/rust/src/generated/instructions/retract.rs index 35d3ef8..34ee426 100644 --- a/clients/rust/src/generated/instructions/retract.rs +++ b/clients/rust/src/generated/instructions/retract.rs @@ -45,7 +45,7 @@ impl Retract { #[derive(BorshDeserialize, BorshSerialize)] pub struct RetractInstructionData { - discriminator: u8, + discriminator: u32, } impl RetractInstructionData { diff --git a/clients/rust/src/generated/instructions/transfer_authority.rs b/clients/rust/src/generated/instructions/transfer_authority.rs index bdc8011..d25a199 100644 --- a/clients/rust/src/generated/instructions/transfer_authority.rs +++ b/clients/rust/src/generated/instructions/transfer_authority.rs @@ -53,7 +53,7 @@ impl TransferAuthority { #[derive(BorshDeserialize, BorshSerialize)] pub struct TransferAuthorityInstructionData { - discriminator: u8, + discriminator: u32, } impl TransferAuthorityInstructionData { diff --git a/clients/rust/src/generated/instructions/truncate.rs b/clients/rust/src/generated/instructions/truncate.rs index 8585c68..c4ac321 100644 --- a/clients/rust/src/generated/instructions/truncate.rs +++ b/clients/rust/src/generated/instructions/truncate.rs @@ -64,7 +64,7 @@ impl Truncate { #[derive(BorshDeserialize, BorshSerialize)] pub struct TruncateInstructionData { - discriminator: u8, + discriminator: u32, } impl TruncateInstructionData { diff --git a/clients/rust/src/generated/instructions/write.rs b/clients/rust/src/generated/instructions/write.rs index 780fa49..dfd5003 100644 --- a/clients/rust/src/generated/instructions/write.rs +++ b/clients/rust/src/generated/instructions/write.rs @@ -51,7 +51,7 @@ impl Write { #[derive(BorshDeserialize, BorshSerialize)] pub struct WriteInstructionData { - discriminator: u8, + discriminator: u32, } impl WriteInstructionData { diff --git a/program/idl.json b/program/idl.json index 496d206..fa81490 100644 --- a/program/idl.json +++ b/program/idl.json @@ -33,7 +33,7 @@ } ], "discriminant": { - "type": "u8", + "type": "u32", "value": 0 } }, @@ -73,7 +73,7 @@ } ], "discriminant": { - "type": "u8", + "type": "u32", "value": 1 } }, @@ -108,7 +108,7 @@ ], "args": [], "discriminant": { - "type": "u8", + "type": "u32", "value": 2 } }, @@ -134,7 +134,7 @@ ], "args": [], "discriminant": { - "type": "u8", + "type": "u32", "value": 3 } }, @@ -168,7 +168,7 @@ ], "args": [], "discriminant": { - "type": "u8", + "type": "u32", "value": 4 } }, @@ -202,7 +202,7 @@ ], "args": [], "discriminant": { - "type": "u8", + "type": "u32", "value": 5 } } diff --git a/scripts/generate-idls.mjs b/scripts/generate-idls.mjs index faf2db8..5986e67 100644 --- a/scripts/generate-idls.mjs +++ b/scripts/generate-idls.mjs @@ -15,6 +15,16 @@ getProgramFolders().forEach((folder) => { programName: cargo.package.name.replace(/-/g, '_'), programId: cargo.package.metadata.solana['program-id'], idlDir: programDir, + idlHook: (idl) => ({ + ...idl, + instructions: idl.instructions.map((instruction) => ({ + ...instruction, + discriminant: { + ...instruction.discriminant, + type: "u32", // The legacy native program only accepts 4-byte instruction discriminants. + }, + })), + }), idlName: 'idl', programDir, binaryInstallDir,