Skip to content
Open
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
5 changes: 5 additions & 0 deletions .changeset/kit-v6-upgrade.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@solana/client": patch
---

Bump `@solana/kit` dependency in `@solana/client`. Minor updates to `BaseTransactionMessage` usage with `TransactionMessage` and updates transaction plan execution to use the new context-aware executor flow.
2 changes: 1 addition & 1 deletion examples/nextjs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
},
"dependencies": {
"@solana/client": "workspace:*",
"@solana/kit": "^5.0.0",
"@solana/kit": "^6.0.1",
"@solana/react-hooks": "workspace:*",
"@solana/connector": "^0.2.3",
"next": "^16.0.9",
Expand Down
2 changes: 1 addition & 1 deletion examples/vite-react/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
"@radix-ui/react-slot": "^1.1.0",
"@solana-program/system": "^0.10.0",
"@solana/client": "workspace:*",
"@solana/kit": "^5.0.0",
"@solana/kit": "^6.0.1",
"@solana/react-hooks": "workspace:*",
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.1",
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
"@changesets/changelog-github": "^0.5.1",
"@changesets/cli": "^2.29.7",
"@size-limit/preset-small-lib": "^12.0.0",
"@solana/codecs-strings": "^5.0.0",
"@solana/codecs-strings": "^6.0.1",
"@testing-library/jest-dom": "^6.6.3",
"@testing-library/react": "^16.1.0",
"@testing-library/user-event": "^14.5.2",
Expand Down
2 changes: 2 additions & 0 deletions packages/client/src/features/sol.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ const setTransactionMessageLifetimeUsingBlockhashMock = vi.hoisted(() =>
const signTransactionMessageWithSignersMock = vi.hoisted(() => vi.fn(async () => ({ signed: true })));
const signAndSendTransactionMessageWithSignersMock = vi.hoisted(() => vi.fn(async () => new Uint8Array([1, 2, 3])));
const getBase64EncodedWireTransactionMock = vi.hoisted(() => vi.fn(() => 'wire-data'));
const getSignatureFromTransactionMock = vi.hoisted(() => vi.fn(() => 'test-signature'));
const signatureMock = vi.hoisted(() => vi.fn((value: unknown) => `signature:${String(value)}`));
const pipeMock = vi.hoisted(() =>
vi.fn((initial: unknown, ...fns: Array<(value: unknown) => unknown>) => fns.reduce((acc, fn) => fn(acc), initial)),
Expand Down Expand Up @@ -71,6 +72,7 @@ vi.mock('@solana/kit', () => ({
createTransactionMessage: createTransactionMessageMock,
createTransactionPlanExecutor: createTransactionPlanExecutorMock,
getBase64EncodedWireTransaction: getBase64EncodedWireTransactionMock,
getSignatureFromTransaction: getSignatureFromTransactionMock,
isTransactionSendingSigner: isTransactionSendingSignerGuardMock,
pipe: pipeMock,
setTransactionMessageFeePayer: setTransactionMessageFeePayerMock,
Expand Down
7 changes: 5 additions & 2 deletions packages/client/src/features/sol.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
createTransactionMessage,
createTransactionPlanExecutor,
getBase64EncodedWireTransaction,
getSignatureFromTransaction,
isTransactionSendingSigner,
pipe,
type Slot,
Expand Down Expand Up @@ -275,11 +276,13 @@ export function createSolTransferHelper(runtime: SolanaClientRuntime): SolTransf
: BigInt(options.maxRetries);
let latestSignature: ReturnType<typeof signature> | null = null;
const executor = createTransactionPlanExecutor({
async executeTransactionMessage(message, config = {}) {
async executeTransactionMessage(context, message, config = {}) {
const signed = await signTransactionMessageWithSigners(message as SignableSolTransactionMessage, {
abortSignal: config.abortSignal ?? options.abortSignal,
minContextSlot: options.minContextSlot,
});
context.transaction = signed;
context.signature = getSignatureFromTransaction(signed);
const wire = getBase64EncodedWireTransaction(signed);
const response = await runtime.rpc
.sendTransaction(wire, {
Expand All @@ -290,7 +293,7 @@ export function createSolTransferHelper(runtime: SolanaClientRuntime): SolTransf
})
.send({ abortSignal: config.abortSignal ?? options.abortSignal });
latestSignature = signature(response);
return { transaction: signed };
return signed;
},
});
await executor(prepared.plan ?? singleTransactionPlan(prepared.message), { abortSignal: options.abortSignal });
Expand Down
7 changes: 5 additions & 2 deletions packages/client/src/features/spl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
createTransactionMessage,
createTransactionPlanExecutor,
getBase64EncodedWireTransaction,
getSignatureFromTransaction,
isSolanaError,
isTransactionSendingSigner,
pipe,
Expand Down Expand Up @@ -502,11 +503,13 @@ export function createSplTokenHelper(runtime: SolanaClientRuntime, config: SplTo
: BigInt(options.maxRetries);
let latestSignature: ReturnType<typeof signature> | null = null;
const executor = createTransactionPlanExecutor({
async executeTransactionMessage(message, config = {}) {
async executeTransactionMessage(context, message, config = {}) {
const signed = await signTransactionMessageWithSigners(message as SignableSplTransactionMessage, {
abortSignal: config.abortSignal ?? options.abortSignal,
minContextSlot: options.minContextSlot,
});
context.transaction = signed;
context.signature = getSignatureFromTransaction(signed);
const wire = getBase64EncodedWireTransaction(signed);
const response = await runtime.rpc
.sendTransaction(wire, {
Expand All @@ -517,7 +520,7 @@ export function createSplTokenHelper(runtime: SolanaClientRuntime, config: SplTo
})
.send({ abortSignal: config.abortSignal ?? options.abortSignal });
latestSignature = signature(response);
return { transaction: signed };
return signed;
},
});
await executor(prepared.plan ?? singleTransactionPlan(prepared.message), { abortSignal: options.abortSignal });
Expand Down
19 changes: 13 additions & 6 deletions packages/client/src/features/stake.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
createTransactionPlanExecutor,
generateKeyPairSigner,
getBase64EncodedWireTransaction,
getSignatureFromTransaction,
isTransactionSendingSigner,
pipe,
type Slot,
Expand Down Expand Up @@ -493,11 +494,13 @@ export function createStakeHelper(runtime: SolanaClientRuntime): StakeHelper {
: BigInt(options.maxRetries);
let latestSignature: ReturnType<typeof signature> | null = null;
const executor = createTransactionPlanExecutor({
async executeTransactionMessage(message, config = {}) {
async executeTransactionMessage(context, message, config = {}) {
const signed = await signTransactionMessageWithSigners(message as SignableStakeTransactionMessage, {
abortSignal: config.abortSignal ?? options.abortSignal,
minContextSlot: options.minContextSlot,
});
context.transaction = signed;
context.signature = getSignatureFromTransaction(signed);
const wire = getBase64EncodedWireTransaction(signed);
const response = await runtime.rpc
.sendTransaction(wire, {
Expand All @@ -508,7 +511,7 @@ export function createStakeHelper(runtime: SolanaClientRuntime): StakeHelper {
})
.send({ abortSignal: config.abortSignal ?? options.abortSignal });
latestSignature = signature(response);
return { transaction: signed };
return signed;
},
});
await executor(prepared.plan ?? singleTransactionPlan(prepared.message), { abortSignal: options.abortSignal });
Expand Down Expand Up @@ -577,11 +580,13 @@ export function createStakeHelper(runtime: SolanaClientRuntime): StakeHelper {
: BigInt(options.maxRetries);
let latestSignature: ReturnType<typeof signature> | null = null;
const executor = createTransactionPlanExecutor({
async executeTransactionMessage(message, config = {}) {
async executeTransactionMessage(context, message, config = {}) {
const signed = await signTransactionMessageWithSigners(message as SignableStakeTransactionMessage, {
abortSignal: config.abortSignal ?? options.abortSignal,
minContextSlot: options.minContextSlot,
});
context.transaction = signed;
context.signature = getSignatureFromTransaction(signed);
const wire = getBase64EncodedWireTransaction(signed);
const response = await runtime.rpc
.sendTransaction(wire, {
Expand All @@ -592,7 +597,7 @@ export function createStakeHelper(runtime: SolanaClientRuntime): StakeHelper {
})
.send({ abortSignal: config.abortSignal ?? options.abortSignal });
latestSignature = signature(response);
return { transaction: signed };
return signed;
},
});
await executor(prepared.plan);
Expand Down Expand Up @@ -666,11 +671,13 @@ export function createStakeHelper(runtime: SolanaClientRuntime): StakeHelper {
: BigInt(options.maxRetries);
let latestSignature: ReturnType<typeof signature> | null = null;
const executor = createTransactionPlanExecutor({
async executeTransactionMessage(message, config = {}) {
async executeTransactionMessage(context, message, config = {}) {
const signed = await signTransactionMessageWithSigners(message as SignableStakeTransactionMessage, {
abortSignal: config.abortSignal ?? options.abortSignal,
minContextSlot: options.minContextSlot,
});
context.transaction = signed;
context.signature = getSignatureFromTransaction(signed);
const wire = getBase64EncodedWireTransaction(signed);
const response = await runtime.rpc
.sendTransaction(wire, {
Expand All @@ -681,7 +688,7 @@ export function createStakeHelper(runtime: SolanaClientRuntime): StakeHelper {
})
.send({ abortSignal: config.abortSignal ?? options.abortSignal });
latestSignature = signature(response);
return { transaction: signed };
return signed;
},
});
await executor(prepared.plan);
Expand Down
2 changes: 2 additions & 0 deletions packages/client/src/features/transactions.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ const setTransactionMessageLifetimeUsingBlockhashMock = vi.hoisted(() =>
const signTransactionMessageWithSignersMock = vi.hoisted(() => vi.fn(async (message: unknown) => ({ message })));
const signAndSendTransactionMessageWithSignersMock = vi.hoisted(() => vi.fn(async () => new Uint8Array([1, 2, 3])));
const getBase64EncodedWireTransactionMock = vi.hoisted(() => vi.fn(() => 'wire-data'));
const getSignatureFromTransactionMock = vi.hoisted(() => vi.fn(() => 'test-signature'));
const signatureMock = vi.hoisted(() => vi.fn((value: unknown) => `signature:${String(value)}`));
const pipeMock = vi.hoisted(() =>
vi.fn((initial: unknown, ...fns: Array<(value: unknown) => unknown>) => fns.reduce((acc, fn) => fn(acc), initial)),
Expand Down Expand Up @@ -80,6 +81,7 @@ vi.mock('@solana/kit', () => ({
createTransactionPlanExecutor: createTransactionPlanExecutorMock,
createTransactionPlanner: createTransactionPlannerMock,
getBase64EncodedWireTransaction: getBase64EncodedWireTransactionMock,
getSignatureFromTransaction: getSignatureFromTransactionMock,
getMessagePackerInstructionPlanFromInstructions: getMessagePackerInstructionPlanFromInstructionsMock,
isInstructionForProgram: isInstructionForProgramMock,
isInstructionWithData: isInstructionWithDataMock,
Expand Down
7 changes: 5 additions & 2 deletions packages/client/src/features/transactions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import {
createTransactionPlanner,
getBase64EncodedWireTransaction,
getMessagePackerInstructionPlanFromInstructions,
getSignatureFromTransaction,
isInstructionForProgram,
isInstructionWithData,
isTransactionSendingSigner,
Expand Down Expand Up @@ -433,11 +434,13 @@ export function createTransactionHelper(
: BigInt(options.maxRetries);
let latestSignature: ReturnType<typeof signature> | null = null;
const executor = createTransactionPlanExecutor({
async executeTransactionMessage(message, config = {}) {
async executeTransactionMessage(context, message, config = {}) {
const signed = await signTransactionMessageWithSigners(message as SignableTransactionMessage, {
abortSignal: config.abortSignal ?? options.abortSignal,
minContextSlot: options.minContextSlot,
});
context.transaction = signed;
context.signature = getSignatureFromTransaction(signed);
const wire = getBase64EncodedWireTransaction(signed);
const response = await runtime.rpc
.sendTransaction(wire, {
Expand All @@ -448,7 +451,7 @@ export function createTransactionHelper(
})
.send({ abortSignal: config.abortSignal ?? options.abortSignal });
latestSignature = signature(response);
return { transaction: signed };
return signed;
},
});
await executor(prepared.plan, { abortSignal: options.abortSignal });
Expand Down
7 changes: 5 additions & 2 deletions packages/client/src/features/wsol.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import {
createTransactionMessage,
createTransactionPlanExecutor,
getBase64EncodedWireTransaction,
getSignatureFromTransaction,
isSolanaError,
isTransactionSendingSigner,
pipe,
Expand Down Expand Up @@ -477,11 +478,13 @@ export function createWsolHelper(runtime: SolanaClientRuntime): WsolHelper {
: BigInt(options.maxRetries);
let latestSignature: ReturnType<typeof signature> | null = null;
const executor = createTransactionPlanExecutor({
async executeTransactionMessage(message, config = {}) {
async executeTransactionMessage(context, message, config = {}) {
const signed = await signTransactionMessageWithSigners(message as SignableWsolTransactionMessage, {
abortSignal: config.abortSignal ?? options.abortSignal,
minContextSlot: options.minContextSlot,
});
context.transaction = signed;
context.signature = getSignatureFromTransaction(signed);
const wire = getBase64EncodedWireTransaction(signed);
const response = await runtime.rpc
.sendTransaction(wire, {
Expand All @@ -492,7 +495,7 @@ export function createWsolHelper(runtime: SolanaClientRuntime): WsolHelper {
})
.send({ abortSignal: config.abortSignal ?? options.abortSignal });
latestSignature = signature(response);
return { transaction: signed };
return signed;
},
});
await executor(prepared.plan ?? singleTransactionPlan(prepared.message), { abortSignal: options.abortSignal });
Expand Down
10 changes: 5 additions & 5 deletions packages/client/src/transactions/referenceKeys.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import type { Address, BaseTransactionMessage } from '@solana/kit';
import type { Address, TransactionMessage } from '@solana/kit';
import { AccountRole, SOLANA_ERROR__INSTRUCTION_ERROR__GENERIC_ERROR, SolanaError } from '@solana/kit';

const MEMO_PROGRAM_ADDRESS = 'MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr';

function ensureNonMemoInstructionIndex(instructions: BaseTransactionMessage['instructions']): number {
function ensureNonMemoInstructionIndex(instructions: TransactionMessage['instructions']): number {
const index = instructions.findIndex((instruction) => instruction.programAddress !== MEMO_PROGRAM_ADDRESS);
if (instructions.length === 0 || index === -1) {
throw new SolanaError(SOLANA_ERROR__INSTRUCTION_ERROR__GENERIC_ERROR, {
Expand All @@ -17,14 +17,14 @@ function ensureNonMemoInstructionIndex(instructions: BaseTransactionMessage['ins
/**
* Appends reference address metadata to the first non-memo instruction in a transaction.
*/
export function insertReferenceKey<T extends BaseTransactionMessage>(reference: Address, transaction: T): T {
export function insertReferenceKey<T extends TransactionMessage>(reference: Address, transaction: T): T {
return insertReferenceKeys([reference], transaction);
}

/**
* Appends multiple reference addresses to the first non-memo instruction in a transaction.
*/
export function insertReferenceKeys<T extends BaseTransactionMessage>(references: Address[], transaction: T): T {
export function insertReferenceKeys<T extends TransactionMessage>(references: Address[], transaction: T): T {
const index = ensureNonMemoInstructionIndex(transaction.instructions);
const targetInstruction = transaction.instructions[index];
const accounts = [
Expand All @@ -36,5 +36,5 @@ export function insertReferenceKeys<T extends BaseTransactionMessage>(references
return Object.freeze({
...transaction,
instructions: Object.freeze(updatedInstructions),
});
}) as T;
}
Loading
Loading