From a72f18f42c689337ab817caa88ba4660560a045f Mon Sep 17 00:00:00 2001 From: Tao Zhu Date: Tue, 3 Jun 2025 10:08:57 -0500 Subject: [PATCH 1/8] add loadedAccountsDataSize to simulate transaction response --- packages/errors/src/json-rpc-error.ts | 1 + packages/rpc-api/src/simulateTransaction.ts | 2 ++ 2 files changed, 3 insertions(+) diff --git a/packages/errors/src/json-rpc-error.ts b/packages/errors/src/json-rpc-error.ts index 0025049a8..b6d404dd2 100644 --- a/packages/errors/src/json-rpc-error.ts +++ b/packages/errors/src/json-rpc-error.ts @@ -90,6 +90,7 @@ export interface RpcSimulateTransactionResult { programId: string; } | null; unitsConsumed: number | null; + loadedAccountsDataSize: number | null; } export function getSolanaErrorFromJsonRpcError(putativeErrorResponse: unknown): SolanaError { diff --git a/packages/rpc-api/src/simulateTransaction.ts b/packages/rpc-api/src/simulateTransaction.ts index 0d88f2fd8..1cab18a1c 100644 --- a/packages/rpc-api/src/simulateTransaction.ts +++ b/packages/rpc-api/src/simulateTransaction.ts @@ -117,6 +117,8 @@ type SimulateTransactionApiResponseBase = Readonly<{ }> | null; /** The number of compute budget units consumed during the processing of this transaction */ unitsConsumed?: bigint; + /** The number of bytes of all accounts loaded by this transaction */ + loadedAccountsDataSize?: bigint; }>; type SimulateTransactionApiResponseWithAccounts = Readonly<{ From 323d0e980f95331bee44519a9426383b3f403388 Mon Sep 17 00:00:00 2001 From: Tao Zhu Date: Thu, 5 Jun 2025 22:43:28 +0000 Subject: [PATCH 2/8] alpha-order new field with type number --- packages/rpc-api/src/index.ts | 1 + packages/rpc-api/src/simulateTransaction.ts | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/rpc-api/src/index.ts b/packages/rpc-api/src/index.ts index 815e3bf47..8256d6fc1 100644 --- a/packages/rpc-api/src/index.ts +++ b/packages/rpc-api/src/index.ts @@ -343,6 +343,7 @@ function getAllowedNumericKeypaths(): AllowedNumericKeypaths ['value', 'accounts', KEYPATH_WILDCARD, ...c]), ...innerInstructionsConfigs.map(c => ['value', 'innerInstructions', KEYPATH_WILDCARD, ...c]), ], diff --git a/packages/rpc-api/src/simulateTransaction.ts b/packages/rpc-api/src/simulateTransaction.ts index 1cab18a1c..f3aec66aa 100644 --- a/packages/rpc-api/src/simulateTransaction.ts +++ b/packages/rpc-api/src/simulateTransaction.ts @@ -94,6 +94,8 @@ type WithInnerInstructionsConfig = Readonly<{ type SimulateTransactionApiResponseBase = Readonly<{ /** If the transaction failed, this property will contain the error */ err: TransactionError | null; + /** The number of bytes of all accounts loaded by this transaction */ + loadedAccountsDataSize?: number; /** * Array of log messages the transaction instructions output during execution, `null` if * simulation failed before the transaction was able to execute (for example due to an invalid @@ -117,8 +119,6 @@ type SimulateTransactionApiResponseBase = Readonly<{ }> | null; /** The number of compute budget units consumed during the processing of this transaction */ unitsConsumed?: bigint; - /** The number of bytes of all accounts loaded by this transaction */ - loadedAccountsDataSize?: bigint; }>; type SimulateTransactionApiResponseWithAccounts = Readonly<{ From 42655c0b38e11dafae71169e8546ad84d6b6ca51 Mon Sep 17 00:00:00 2001 From: Tao Zhu Date: Thu, 5 Jun 2025 23:23:03 +0000 Subject: [PATCH 3/8] update test --- .../src/__tests__/simulate-transaction-test.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/rpc-api/src/__tests__/simulate-transaction-test.ts b/packages/rpc-api/src/__tests__/simulate-transaction-test.ts index 33646da55..71d7f5eb4 100644 --- a/packages/rpc-api/src/__tests__/simulate-transaction-test.ts +++ b/packages/rpc-api/src/__tests__/simulate-transaction-test.ts @@ -173,6 +173,7 @@ describe('simulateTransaction', () => { accounts: null, err: null, innerInstructions: null, + loadedAccountsDataSize: expect.any(Number), logs: expect.any(Array), replacementBlockhash: null, returnData: null, @@ -284,6 +285,7 @@ describe('simulateTransaction', () => { accounts: null, err: null, innerInstructions: null, + loadedAccountsDataSize: expect.any(Number), logs: expect.any(Array), replacementBlockhash: null, returnData: null, @@ -324,6 +326,7 @@ describe('simulateTransaction', () => { accounts: null, err: 'BlockhashNotFound', innerInstructions: null, + loadedAccountsDataSize: expect.any(Number), logs: expect.any(Array), replacementBlockhash: null, returnData: null, @@ -364,6 +367,7 @@ describe('simulateTransaction', () => { accounts: null, err: null, innerInstructions: null, + loadedAccountsDataSize: expect.any(Number), logs: expect.any(Array), replacementBlockhash: { blockhash: expect.any(String), @@ -470,6 +474,7 @@ describe('simulateTransaction', () => { accounts: null, err: 'AccountNotFound', innerInstructions: null, + loadedAccountsDataSize: expect.any(Number), logs: expect.any(Array), replacementBlockhash: null, returnData: null, @@ -520,6 +525,7 @@ describe('simulateTransaction', () => { ], err: null, innerInstructions: null, + loadedAccountsDataSize: expect.any(Number), logs: expect.any(Array), replacementBlockhash: null, returnData: null, @@ -570,6 +576,7 @@ describe('simulateTransaction', () => { ], err: null, innerInstructions: null, + loadedAccountsDataSize: expect.any(Number), logs: expect.any(Array), replacementBlockhash: null, returnData: null, @@ -637,6 +644,7 @@ describe('simulateTransaction', () => { ], err: null, innerInstructions: null, + loadedAccountsDataSize: expect.any(Number), logs: expect.any(Array), replacementBlockhash: null, returnData: null, @@ -688,6 +696,7 @@ describe('simulateTransaction', () => { ], err: null, innerInstructions: null, + loadedAccountsDataSize: expect.any(Number), logs: expect.any(Array), replacementBlockhash: null, returnData: null, @@ -737,7 +746,7 @@ describe('simulateTransaction', () => { ], err: null, innerInstructions: null, - + loadedAccountsDataSize: expect.any(Number), logs: expect.any(Array), replacementBlockhash: null, returnData: null, @@ -793,6 +802,7 @@ describe('simulateTransaction', () => { ], err: null, innerInstructions: null, + loadedAccountsDataSize: expect.any(Number), logs: expect.any(Array), replacementBlockhash: null, returnData: null, @@ -834,6 +844,7 @@ describe('simulateTransaction', () => { accounts: null, err: null, innerInstructions: null, + loadedAccountsDataSize: expect.any(Number), logs: expect.any(Array), replacementBlockhash: null, returnData: null, From 955d92f4d03c6e914565e46f6d0c5153cc19d5c8 Mon Sep 17 00:00:00 2001 From: Tao Zhu Date: Thu, 5 Jun 2025 23:23:16 +0000 Subject: [PATCH 4/8] add changeset --- .changeset/tidy-baths-rule.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/tidy-baths-rule.md diff --git a/.changeset/tidy-baths-rule.md b/.changeset/tidy-baths-rule.md new file mode 100644 index 000000000..a9a28b7b8 --- /dev/null +++ b/.changeset/tidy-baths-rule.md @@ -0,0 +1,5 @@ +--- +'@solana/kit': patch +--- + +Add loadedAccountsDataSize to simulateTransaction response From 4f0ec00235fe2fae61cb58c348c29eff35f02b64 Mon Sep 17 00:00:00 2001 From: Tao Zhu Date: Thu, 5 Jun 2025 23:26:11 +0000 Subject: [PATCH 5/8] alpha-order error code --- packages/errors/src/json-rpc-error.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/errors/src/json-rpc-error.ts b/packages/errors/src/json-rpc-error.ts index b6d404dd2..17c9a9156 100644 --- a/packages/errors/src/json-rpc-error.ts +++ b/packages/errors/src/json-rpc-error.ts @@ -84,13 +84,13 @@ export interface RpcSimulateTransactionResult { )[]; }[] | null; + loadedAccountsDataSize: number | null; logs: string[] | null; returnData: { data: [string, 'base64']; programId: string; } | null; unitsConsumed: number | null; - loadedAccountsDataSize: number | null; } export function getSolanaErrorFromJsonRpcError(putativeErrorResponse: unknown): SolanaError { From 72da5e2d436f3d5aa218ffe86c518ec0ab6f32bb Mon Sep 17 00:00:00 2001 From: Tao Zhu Date: Thu, 5 Jun 2025 23:39:34 +0000 Subject: [PATCH 6/8] update set-transaction-test for added field --- packages/rpc-api/src/__tests__/send-transaction-test.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/rpc-api/src/__tests__/send-transaction-test.ts b/packages/rpc-api/src/__tests__/send-transaction-test.ts index 9c45a94cd..e4bd66aa7 100644 --- a/packages/rpc-api/src/__tests__/send-transaction-test.ts +++ b/packages/rpc-api/src/__tests__/send-transaction-test.ts @@ -248,6 +248,7 @@ describe('sendTransaction', () => { accounts: null, cause: new SolanaError(SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_NOT_FOUND), innerInstructions: null, + loadedAccountsDataSize: 0, logs: [], returnData: null, unitsConsumed: 0, @@ -283,6 +284,7 @@ describe('sendTransaction', () => { accounts: null, cause: new SolanaError(SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_FEE), innerInstructions: null, + loadedAccountsDataSize: 0, logs: [], returnData: null, unitsConsumed: 0, @@ -315,6 +317,7 @@ describe('sendTransaction', () => { accounts: null, cause: new SolanaError(SOLANA_ERROR__TRANSACTION_ERROR__BLOCKHASH_NOT_FOUND), innerInstructions: null, + loadedAccountsDataSize: 0, logs: [], returnData: null, unitsConsumed: 0, From 451e061885d8052ddb35e8fdd820179835777166 Mon Sep 17 00:00:00 2001 From: Steven Luscher Date: Fri, 6 Jun 2025 18:11:08 +0000 Subject: [PATCH 7/8] Ran `pnpm style:fix` --- .../src/__tests__/send-transaction-test.ts | 6 ++--- .../__tests__/simulate-transaction-test.ts | 24 +++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/packages/rpc-api/src/__tests__/send-transaction-test.ts b/packages/rpc-api/src/__tests__/send-transaction-test.ts index e4bd66aa7..f8cbf25d8 100644 --- a/packages/rpc-api/src/__tests__/send-transaction-test.ts +++ b/packages/rpc-api/src/__tests__/send-transaction-test.ts @@ -248,7 +248,7 @@ describe('sendTransaction', () => { accounts: null, cause: new SolanaError(SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_NOT_FOUND), innerInstructions: null, - loadedAccountsDataSize: 0, + loadedAccountsDataSize: 0, logs: [], returnData: null, unitsConsumed: 0, @@ -284,7 +284,7 @@ describe('sendTransaction', () => { accounts: null, cause: new SolanaError(SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_FEE), innerInstructions: null, - loadedAccountsDataSize: 0, + loadedAccountsDataSize: 0, logs: [], returnData: null, unitsConsumed: 0, @@ -317,7 +317,7 @@ describe('sendTransaction', () => { accounts: null, cause: new SolanaError(SOLANA_ERROR__TRANSACTION_ERROR__BLOCKHASH_NOT_FOUND), innerInstructions: null, - loadedAccountsDataSize: 0, + loadedAccountsDataSize: 0, logs: [], returnData: null, unitsConsumed: 0, diff --git a/packages/rpc-api/src/__tests__/simulate-transaction-test.ts b/packages/rpc-api/src/__tests__/simulate-transaction-test.ts index 71d7f5eb4..272ce80f0 100644 --- a/packages/rpc-api/src/__tests__/simulate-transaction-test.ts +++ b/packages/rpc-api/src/__tests__/simulate-transaction-test.ts @@ -173,7 +173,7 @@ describe('simulateTransaction', () => { accounts: null, err: null, innerInstructions: null, - loadedAccountsDataSize: expect.any(Number), + loadedAccountsDataSize: expect.any(Number), logs: expect.any(Array), replacementBlockhash: null, returnData: null, @@ -285,7 +285,7 @@ describe('simulateTransaction', () => { accounts: null, err: null, innerInstructions: null, - loadedAccountsDataSize: expect.any(Number), + loadedAccountsDataSize: expect.any(Number), logs: expect.any(Array), replacementBlockhash: null, returnData: null, @@ -326,7 +326,7 @@ describe('simulateTransaction', () => { accounts: null, err: 'BlockhashNotFound', innerInstructions: null, - loadedAccountsDataSize: expect.any(Number), + loadedAccountsDataSize: expect.any(Number), logs: expect.any(Array), replacementBlockhash: null, returnData: null, @@ -367,7 +367,7 @@ describe('simulateTransaction', () => { accounts: null, err: null, innerInstructions: null, - loadedAccountsDataSize: expect.any(Number), + loadedAccountsDataSize: expect.any(Number), logs: expect.any(Array), replacementBlockhash: { blockhash: expect.any(String), @@ -474,7 +474,7 @@ describe('simulateTransaction', () => { accounts: null, err: 'AccountNotFound', innerInstructions: null, - loadedAccountsDataSize: expect.any(Number), + loadedAccountsDataSize: expect.any(Number), logs: expect.any(Array), replacementBlockhash: null, returnData: null, @@ -525,7 +525,7 @@ describe('simulateTransaction', () => { ], err: null, innerInstructions: null, - loadedAccountsDataSize: expect.any(Number), + loadedAccountsDataSize: expect.any(Number), logs: expect.any(Array), replacementBlockhash: null, returnData: null, @@ -576,7 +576,7 @@ describe('simulateTransaction', () => { ], err: null, innerInstructions: null, - loadedAccountsDataSize: expect.any(Number), + loadedAccountsDataSize: expect.any(Number), logs: expect.any(Array), replacementBlockhash: null, returnData: null, @@ -644,7 +644,7 @@ describe('simulateTransaction', () => { ], err: null, innerInstructions: null, - loadedAccountsDataSize: expect.any(Number), + loadedAccountsDataSize: expect.any(Number), logs: expect.any(Array), replacementBlockhash: null, returnData: null, @@ -696,7 +696,7 @@ describe('simulateTransaction', () => { ], err: null, innerInstructions: null, - loadedAccountsDataSize: expect.any(Number), + loadedAccountsDataSize: expect.any(Number), logs: expect.any(Array), replacementBlockhash: null, returnData: null, @@ -746,7 +746,7 @@ describe('simulateTransaction', () => { ], err: null, innerInstructions: null, - loadedAccountsDataSize: expect.any(Number), + loadedAccountsDataSize: expect.any(Number), logs: expect.any(Array), replacementBlockhash: null, returnData: null, @@ -802,7 +802,7 @@ describe('simulateTransaction', () => { ], err: null, innerInstructions: null, - loadedAccountsDataSize: expect.any(Number), + loadedAccountsDataSize: expect.any(Number), logs: expect.any(Array), replacementBlockhash: null, returnData: null, @@ -844,7 +844,7 @@ describe('simulateTransaction', () => { accounts: null, err: null, innerInstructions: null, - loadedAccountsDataSize: expect.any(Number), + loadedAccountsDataSize: expect.any(Number), logs: expect.any(Array), replacementBlockhash: null, returnData: null, From a3d0c4e68e0c1287a5860ff66195807917548622 Mon Sep 17 00:00:00 2001 From: Steven Luscher Date: Fri, 6 Jun 2025 18:11:18 +0000 Subject: [PATCH 8/8] Change allowed numeric path to `value.loadedAccountsDataSize` --- packages/rpc-api/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rpc-api/src/index.ts b/packages/rpc-api/src/index.ts index 8256d6fc1..03690674f 100644 --- a/packages/rpc-api/src/index.ts +++ b/packages/rpc-api/src/index.ts @@ -343,7 +343,7 @@ function getAllowedNumericKeypaths(): AllowedNumericKeypaths ['value', 'accounts', KEYPATH_WILDCARD, ...c]), ...innerInstructionsConfigs.map(c => ['value', 'innerInstructions', KEYPATH_WILDCARD, ...c]), ],