Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions clients/js/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,13 @@
"prepublishOnly": "pnpm build"
},
"dependencies": {
"@solana-program/system": "^0.15.0"
"@solana-program/system": "^0.16.0"
},
"devDependencies": {
"@solana-config/oxc": "^0.1.1",
"@solana/kit": "^8.3.0",
"@solana/kit-plugin-litesvm": "^0.18.0",
"@solana/kit-plugin-signer": "^0.18.0",
"@solana/kit": "^8.5.0",
"@solana/kit-plugin-litesvm": "^0.19.0",
"@solana/kit-plugin-signer": "^0.19.0",
"@solana/sysvars": "^8.0.0",
"@types/node": "^25.9.1",
"oxfmt": "^0.55.0",
Expand All @@ -63,7 +63,7 @@
"vitest": "^4.0.15"
},
"peerDependencies": {
"@solana/kit": "^8.3.0"
"@solana/kit": "^8.5.0"
},
"devEngines": {
"runtime": {
Expand Down
1,588 changes: 794 additions & 794 deletions clients/js/pnpm-lock.yaml

Large diffs are not rendered by default.

19 changes: 11 additions & 8 deletions clients/js/src/createRecord.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {
ClientWithGetMinimumBalance,
createAddressWithSeed,
getUtf8Decoder,
HasAddress,
InstructionPlan,
Lamports,
ReadonlyUint8Array,
Expand All @@ -20,7 +21,7 @@ export interface CreateRecordInstructionPlanInput {
/** New record account to create. Must be a fresh, unused keypair. */
newRecord: TransactionSigner;
/** The authority that will own the created record account. */
authority: Address;
authority: Address | HasAddress;
/** The number of bytes of record payload to allocate (excluding the header). */
dataLength: number | bigint;
/**
Expand All @@ -32,9 +33,9 @@ export interface CreateRecordInstructionPlanInput {

export interface CreateRecordInstructionPlanConfig {
/** Override the System program address. */
systemProgram?: Address;
systemProgram?: Address | HasAddress;
/** Override the Record program address. */
recordProgram?: Address;
recordProgram?: Address | HasAddress;
}

/**
Expand Down Expand Up @@ -77,7 +78,7 @@ export interface CreateRecordWithSeedInstructionPlanInput {
/** Funding account that pays for the new record account's rent. */
payer: TransactionSigner;
/** The authority that will own the created record account. */
authority: Address;
authority: Address | HasAddress;
/** The number of bytes of record payload to allocate (excluding the header). */
dataLength: number | bigint;
/** The seed used to derive the record account address. */
Expand Down Expand Up @@ -146,14 +147,16 @@ export async function getCreateRecordWithSeedInstructionPlan(
* the on-chain program derives from the seed string.
*/
export async function getRecordAddressWithSeed(input: {
baseAddress: Address;
baseAddress: Address | HasAddress;
seed: ReadonlyUint8Array | string;
recordProgram?: Address;
recordProgram?: Address | HasAddress;
}): Promise<Address> {
const baseAddress = typeof input.baseAddress === 'string' ? input.baseAddress : input.baseAddress.address;
const recordProgram = input.recordProgram ?? RECORD_PROGRAM_ADDRESS;
return await createAddressWithSeed({
baseAddress: input.baseAddress,
baseAddress,
seed: normalizeSeed(input.seed),
programAddress: input.recordProgram ?? RECORD_PROGRAM_ADDRESS,
programAddress: typeof recordProgram === 'string' ? recordProgram : recordProgram.address,
});
}

Expand Down
23 changes: 16 additions & 7 deletions clients/js/src/generated/accounts/recordData.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import {
type Encoder,
type FetchAccountConfig,
type FetchAccountsConfig,
type HasAddress,
type MaybeAccount,
type MaybeEncodedAccount,
type ReadonlyUint8Array,
Expand All @@ -43,7 +44,7 @@ export function getRecordDataVersionBytes(): ReadonlyUint8Array {

export type RecordData = { version: number; authority: Address; payload: ReadonlyUint8Array };

export type RecordDataArgs = { version?: number; authority: Address; payload: ReadonlyUint8Array };
export type RecordDataArgs = { version?: number; authority: Address | HasAddress; payload: ReadonlyUint8Array };

/** Gets the encoder for {@link RecordDataArgs} account data. */
export function getRecordDataEncoder(): Encoder<RecordDataArgs> {
Expand Down Expand Up @@ -85,7 +86,7 @@ export function decodeRecordData<TAddress extends string = string>(

export async function fetchRecordData<TAddress extends string = string>(
rpc: Parameters<typeof fetchEncodedAccount>[0],
address: Address<TAddress>,
address: Address<TAddress> | HasAddress<TAddress>,
config?: FetchAccountConfig,
): Promise<Account<RecordData, TAddress>> {
const maybeAccount = await fetchMaybeRecordData(rpc, address, config);
Expand All @@ -95,16 +96,20 @@ export async function fetchRecordData<TAddress extends string = string>(

export async function fetchMaybeRecordData<TAddress extends string = string>(
rpc: Parameters<typeof fetchEncodedAccount>[0],
address: Address<TAddress>,
address: Address<TAddress> | HasAddress<TAddress>,
config?: FetchAccountConfig,
): Promise<MaybeAccount<RecordData, TAddress>> {
const maybeAccount = await fetchEncodedAccount(rpc, address, config);
const maybeAccount = await fetchEncodedAccount(
rpc,
typeof address === 'string' ? address : address.address,
config,
);
return decodeRecordData(maybeAccount);
}

export async function fetchAllRecordData(
rpc: Parameters<typeof fetchEncodedAccounts>[0],
addresses: Array<Address>,
addresses: Array<Address | HasAddress>,
config?: FetchAccountsConfig,
): Promise<Account<RecordData>[]> {
const maybeAccounts = await fetchAllMaybeRecordData(rpc, addresses, config);
Expand All @@ -114,9 +119,13 @@ export async function fetchAllRecordData(

export async function fetchAllMaybeRecordData(
rpc: Parameters<typeof fetchEncodedAccounts>[0],
addresses: Array<Address>,
addresses: Array<Address | HasAddress>,
config?: FetchAccountsConfig,
): Promise<MaybeAccount<RecordData>[]> {
const maybeAccounts = await fetchEncodedAccounts(rpc, addresses, config);
const maybeAccounts = await fetchEncodedAccounts(
rpc,
addresses.map(a => (typeof a === 'string' ? a : a.address)),
config,
);
return maybeAccounts.map(maybeAccount => decodeRecordData(maybeAccount));
}
6 changes: 5 additions & 1 deletion clients/js/src/generated/errors/record.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import {
isProgramError,
type Address,
type HasAddress,
type SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM,
type SolanaError,
} from '@solana/kit';
Expand Down Expand Up @@ -39,7 +40,10 @@ export function isRecordError<TProgramErrorCode extends RecordError>(
error: unknown,
transactionMessage: { instructions: Record<number, { programAddress: Address }> },
code?: TProgramErrorCode,
config: { programAddress?: Address | HasAddress } = {},
): error is SolanaError<typeof SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM> &
Readonly<{ context: Readonly<{ code: TProgramErrorCode }> }> {
return isProgramError<TProgramErrorCode>(error, transactionMessage, RECORD_PROGRAM_ADDRESS, code);
const programAddressInput = config.programAddress ?? RECORD_PROGRAM_ADDRESS;
const programAddress = typeof programAddressInput === 'string' ? programAddressInput : programAddressInput.address;
return isProgramError<TProgramErrorCode>(error, transactionMessage, programAddress, code);
}
5 changes: 3 additions & 2 deletions clients/js/src/generated/instructions/closeAccount.ts
Original file line number Diff line number Diff line change
Expand Up @@ -102,15 +102,16 @@ export function getCloseAccountInstruction<
TProgramAddress extends Address = typeof RECORD_PROGRAM_ADDRESS,
>(
input: CloseAccountInput<TAccountRecordAccount, TAccountAuthority, TAccountReceiver>,
config?: { programAddress?: TProgramAddress },
config?: { programAddress?: TProgramAddress | { readonly address: TProgramAddress } },
): CloseAccountInstruction<
TProgramAddress,
ResolvedInstructionAccountMeta<TAccountRecordAccount, InstructionAccountInputAddress<TAccountRecordAccount>>,
ResolvedInstructionAccountMeta<TAccountAuthority, InstructionAccountInputAddress<TAccountAuthority>>,
ResolvedInstructionAccountMeta<TAccountReceiver, InstructionAccountInputAddress<TAccountReceiver>>
> {
// Program address.
const programAddress = config?.programAddress ?? RECORD_PROGRAM_ADDRESS;
const programAddressInput = config?.programAddress ?? RECORD_PROGRAM_ADDRESS;
const programAddress = typeof programAddressInput === 'string' ? programAddressInput : programAddressInput.address;

// Account meta helper.
const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');
Expand Down
5 changes: 3 additions & 2 deletions clients/js/src/generated/instructions/initialize.ts
Original file line number Diff line number Diff line change
Expand Up @@ -93,14 +93,15 @@ export function getInitializeInstruction<
TProgramAddress extends Address = typeof RECORD_PROGRAM_ADDRESS,
>(
input: InitializeInput<TAccountRecordAccount, TAccountAuthority>,
config?: { programAddress?: TProgramAddress },
config?: { programAddress?: TProgramAddress | { readonly address: TProgramAddress } },
): InitializeInstruction<
TProgramAddress,
ResolvedInstructionAccountMeta<TAccountRecordAccount, InstructionAccountInputAddress<TAccountRecordAccount>>,
ResolvedInstructionAccountMeta<TAccountAuthority, InstructionAccountInputAddress<TAccountAuthority>>
> {
// Program address.
const programAddress = config?.programAddress ?? RECORD_PROGRAM_ADDRESS;
const programAddressInput = config?.programAddress ?? RECORD_PROGRAM_ADDRESS;
const programAddress = typeof programAddressInput === 'string' ? programAddressInput : programAddressInput.address;

// Account meta helper.
const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');
Expand Down
5 changes: 3 additions & 2 deletions clients/js/src/generated/instructions/reallocate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -106,14 +106,15 @@ export function getReallocateInstruction<
TProgramAddress extends Address = typeof RECORD_PROGRAM_ADDRESS,
>(
input: ReallocateInput<TAccountRecordAccount, TAccountAuthority>,
config?: { programAddress?: TProgramAddress },
config?: { programAddress?: TProgramAddress | { readonly address: TProgramAddress } },
): ReallocateInstruction<
TProgramAddress,
ResolvedInstructionAccountMeta<TAccountRecordAccount, InstructionAccountInputAddress<TAccountRecordAccount>>,
ResolvedInstructionAccountMeta<TAccountAuthority, InstructionAccountInputAddress<TAccountAuthority>>
> {
// Program address.
const programAddress = config?.programAddress ?? RECORD_PROGRAM_ADDRESS;
const programAddressInput = config?.programAddress ?? RECORD_PROGRAM_ADDRESS;
const programAddress = typeof programAddressInput === 'string' ? programAddressInput : programAddressInput.address;

// Account meta helper.
const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');
Expand Down
5 changes: 3 additions & 2 deletions clients/js/src/generated/instructions/setAuthority.ts
Original file line number Diff line number Diff line change
Expand Up @@ -103,15 +103,16 @@ export function getSetAuthorityInstruction<
TProgramAddress extends Address = typeof RECORD_PROGRAM_ADDRESS,
>(
input: SetAuthorityInput<TAccountRecordAccount, TAccountAuthority, TAccountNewAuthority>,
config?: { programAddress?: TProgramAddress },
config?: { programAddress?: TProgramAddress | { readonly address: TProgramAddress } },
): SetAuthorityInstruction<
TProgramAddress,
ResolvedInstructionAccountMeta<TAccountRecordAccount, InstructionAccountInputAddress<TAccountRecordAccount>>,
ResolvedInstructionAccountMeta<TAccountAuthority, InstructionAccountInputAddress<TAccountAuthority>>,
ResolvedInstructionAccountMeta<TAccountNewAuthority, InstructionAccountInputAddress<TAccountNewAuthority>>
> {
// Program address.
const programAddress = config?.programAddress ?? RECORD_PROGRAM_ADDRESS;
const programAddressInput = config?.programAddress ?? RECORD_PROGRAM_ADDRESS;
const programAddress = typeof programAddressInput === 'string' ? programAddressInput : programAddressInput.address;

// Account meta helper.
const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');
Expand Down
5 changes: 3 additions & 2 deletions clients/js/src/generated/instructions/write.ts
Original file line number Diff line number Diff line change
Expand Up @@ -112,14 +112,15 @@ export function getWriteInstruction<
TProgramAddress extends Address = typeof RECORD_PROGRAM_ADDRESS,
>(
input: WriteInput<TAccountRecordAccount, TAccountAuthority>,
config?: { programAddress?: TProgramAddress },
config?: { programAddress?: TProgramAddress | { readonly address: TProgramAddress } },
): WriteInstruction<
TProgramAddress,
ResolvedInstructionAccountMeta<TAccountRecordAccount, InstructionAccountInputAddress<TAccountRecordAccount>>,
ResolvedInstructionAccountMeta<TAccountAuthority, InstructionAccountInputAddress<TAccountAuthority>>
> {
// Program address.
const programAddress = config?.programAddress ?? RECORD_PROGRAM_ADDRESS;
const programAddressInput = config?.programAddress ?? RECORD_PROGRAM_ADDRESS;
const programAddress = typeof programAddressInput === 'string' ? programAddressInput : programAddressInput.address;

// Account meta helper.
const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');
Expand Down
60 changes: 51 additions & 9 deletions clients/js/src/generated/programs/record.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import {
type ExtendedClient,
type GetAccountInfoApi,
type GetMultipleAccountsApi,
type HasAddress,
type Instruction,
type InstructionWithData,
type ReadonlyUint8Array,
Expand Down Expand Up @@ -160,32 +161,73 @@ export type RecordPluginAccounts = {
};

export type RecordPluginInstructions = {
initialize: (input: InitializeInput) => ReturnType<typeof getInitializeInstruction> & SelfPlanAndSendFunctions;
write: (input: WriteInput) => ReturnType<typeof getWriteInstruction> & SelfPlanAndSendFunctions;
initialize: (
input: InitializeInput,
config?: { programAddress?: Address | HasAddress },
) => ReturnType<typeof getInitializeInstruction> & SelfPlanAndSendFunctions;
write: (
input: WriteInput,
config?: { programAddress?: Address | HasAddress },
) => ReturnType<typeof getWriteInstruction> & SelfPlanAndSendFunctions;
setAuthority: (
input: SetAuthorityInput,
config?: { programAddress?: Address | HasAddress },
) => ReturnType<typeof getSetAuthorityInstruction> & SelfPlanAndSendFunctions;
closeAccount: (
input: CloseAccountInput,
config?: { programAddress?: Address | HasAddress },
) => ReturnType<typeof getCloseAccountInstruction> & SelfPlanAndSendFunctions;
reallocate: (input: ReallocateInput) => ReturnType<typeof getReallocateInstruction> & SelfPlanAndSendFunctions;
reallocate: (
input: ReallocateInput,
config?: { programAddress?: Address | HasAddress },
) => ReturnType<typeof getReallocateInstruction> & SelfPlanAndSendFunctions;
};

export type RecordPluginRequirements = ClientWithRpc<GetAccountInfoApi & GetMultipleAccountsApi> &
ClientWithTransactionPlanning &
ClientWithTransactionSending;

export function recordProgram() {
export function recordProgram(config: { programAddress?: Address | HasAddress } = {}) {
return <T extends RecordPluginRequirements>(client: T): ExtendedClient<T, { record: RecordPlugin }> => {
return extendClient(client, {
record: <RecordPlugin>{
accounts: { recordData: addSelfFetchFunctions(client, getRecordDataCodec()) },
instructions: {
initialize: input => addSelfPlanAndSendFunctions(client, getInitializeInstruction(input)),
write: input => addSelfPlanAndSendFunctions(client, getWriteInstruction(input)),
setAuthority: input => addSelfPlanAndSendFunctions(client, getSetAuthorityInstruction(input)),
closeAccount: input => addSelfPlanAndSendFunctions(client, getCloseAccountInstruction(input)),
reallocate: input => addSelfPlanAndSendFunctions(client, getReallocateInstruction(input)),
initialize: (input, instructionConfig) =>
addSelfPlanAndSendFunctions(
client,
getInitializeInstruction(input, {
programAddress: instructionConfig?.programAddress ?? config.programAddress,
}),
),
write: (input, instructionConfig) =>
addSelfPlanAndSendFunctions(
client,
getWriteInstruction(input, {
programAddress: instructionConfig?.programAddress ?? config.programAddress,
}),
),
setAuthority: (input, instructionConfig) =>
addSelfPlanAndSendFunctions(
client,
getSetAuthorityInstruction(input, {
programAddress: instructionConfig?.programAddress ?? config.programAddress,
}),
),
closeAccount: (input, instructionConfig) =>
addSelfPlanAndSendFunctions(
client,
getCloseAccountInstruction(input, {
programAddress: instructionConfig?.programAddress ?? config.programAddress,
}),
),
reallocate: (input, instructionConfig) =>
addSelfPlanAndSendFunctions(
client,
getReallocateInstruction(input, {
programAddress: instructionConfig?.programAddress ?? config.programAddress,
}),
),
},
identifyAccount: identifyRecordAccount,
identifyInstruction: identifyRecordInstruction,
Expand Down
Loading
Loading