Repository: solana-labs/solana-program-library
Pull request #5931 (2023-11-30 01:59:35)

token-2022: [OS-SPL-ADV-00] Enable and fix account ordering on confidential transfer with split proofs
#### Problem
The accounts that are required for a confidential transfer with split proof are as follows:
```
    ///   1. `[writable]` The source SPL Token account.
    ///   2. `[]` The token mint.
    ///   3. `[writable]` The destination SPL Token account.
    ///   4. `[]` Context state account for
    ///      `VerifyCiphertextCommitmentEqualityProof`.
    ///   5. `[]` Context state account for
    ///      `VerifyBatchedGroupedCiphertext2HandlesValidityProof`.
    ///   6. `[]` Context state account for `VerifyBatchedRangeProofU128`.
    ///   7. `[signer]` The source account owner.
    ///   If `close_split_context_state_on_execution` is set, all context state
    ///     accounts must be `writable` and the following sequence
    ///     of accounts are needed:
    ///   8. `[]` The destination account for lamports from the context state
    ///      accounts.
    ///   9. `[signer]` The context state account owner.
    ///   10. `[]` The zk token proof program.
```
However, the actual instruction processor assumes that `7. [signer] The source account owner` is assumed to be last in the order.
```
    ///   1. `[writable]` The source SPL Token account.
    ///   2. `[]` The token mint.
    ///   3. `[writable]` The destination SPL Token account.
    ///   4. `[]` Context state account for
    ///      `VerifyCiphertextCommitmentEqualityProof`.
    ///   5. `[]` Context state account for
    ///      `VerifyBatchedGroupedCiphertext2HandlesValidityProof`.
    ///   6. `[]` Context state account for `VerifyBatchedRangeProofU128`.
    ///   If `close_split_context_state_on_execution` is set, all context state
    ///     accounts must be `writable` and the following sequence
    ///     of accounts that are marked with asterisk are needed:
    ///   7*. `[]` The destination account for lamports from the context state
    ///      accounts.
    ///   8*. `[signer]` The context state account owner.
    ///   9*. `[]` The zk token proof program.
    ///   10. `[signer]` The source account owner.
```
This issue with the ordering of the accounts was left undetected because there were no tests for auto-close of context accounts. There were no tests for auto-close because auto-close was not enabled.

#### Solution
- Enabled auto-close of context accounts in the instruction processor logic
- Added tests for auto-close of context accounts
- Fixed the issue with the ordering of the accounts


Patch:
diff --git a/account-compression/sdk/package.json b/account-compression/sdk/package.json
index a565fd4aa..163e97cde 100644
--- a/account-compression/sdk/package.json
+++ b/account-compression/sdk/package.json
@@ -57,7 +57,6 @@
     "@metaplex-foundation/beet": "^0.7.1",
     "@metaplex-foundation/beet-solana": "^0.4.0",
     "bn.js": "^5.2.1",
-    "borsh": "^0.7.0",
     "js-sha3": "^0.9.2",
     "typescript-collections": "^1.3.3"
   },
@@ -69,7 +68,7 @@
     "@metaplex-foundation/solita": "0.20.1",
     "@project-serum/anchor": "^0.26.0",
     "@solana/eslint-config-solana": "^1.0.2",
-    "@solana/prettier-config-solana": "^0.0.3",
+    "@solana/prettier-config-solana": "^0.0.4",
     "@types/bn.js": "^5.1.0",
     "@types/chai": "^4.3.0",
     "@types/jest": "^29.5.10",
diff --git a/libraries/type-length-value/js/package.json b/libraries/type-length-value/js/package.json
index 5dc24e792..3f9602852 100644
--- a/libraries/type-length-value/js/package.json
+++ b/libraries/type-length-value/js/package.json
@@ -46,7 +46,7 @@
     "devDependencies": {
         "@types/chai": "^4.3.11",
         "@types/mocha": "^10.0.6",
-        "@types/node": "^20.10.0",
+        "@types/node": "^20.10.1",
         "@typescript-eslint/eslint-plugin": "^6.13.1",
         "@typescript-eslint/parser": "^6.13.1",
         "chai": "^4.3.10",
diff --git a/memo/js/package.json b/memo/js/package.json
index d92ad0eac..cd5bf341f 100644
--- a/memo/js/package.json
+++ b/memo/js/package.json
@@ -55,7 +55,7 @@
         "@solana/web3.js": "^1.87.6",
         "@types/chai": "^4.3.11",
         "@types/jest": "^29.5.10",
-        "@types/node": "^20.10.0",
+        "@types/node": "^20.10.1",
         "@types/node-fetch": "^2.6.2",
         "@typescript-eslint/eslint-plugin": "^6.13.1",
         "@typescript-eslint/parser": "^6.13.1",
diff --git a/name-service/js/package.json b/name-service/js/package.json
index ed1fd5cc0..acf6104b7 100644
--- a/name-service/js/package.json
+++ b/name-service/js/package.json
@@ -39,7 +39,7 @@
     "@types/chai": "^4.3.11",
     "@types/chai-as-promised": "^7.1.5",
     "@types/mocha": "^10.0.6",
-    "@types/node": "^20.10.0",
+    "@types/node": "^20.10.1",
     "@typescript-eslint/eslint-plugin": "^6.13.1",
     "@typescript-eslint/parser": "^6.13.1",
     "chai": "^4.3.7",
@@ -59,7 +59,7 @@
   "dependencies": {
     "@solana/web3.js": "^1.87.6",
     "bn.js": "^5.1.3",
-    "borsh": "^0.7.0"
+    "borsh": "^2.0.0"
   },
   "mocha": {
     "require": [
diff --git a/name-service/js/src/state.ts b/name-service/js/src/state.ts
index 3cfecdb7a..88b728090 100644
--- a/name-service/js/src/state.ts
+++ b/name-service/js/src/state.ts
@@ -1,5 +1,11 @@
 import { Connection, PublicKey } from '@solana/web3.js';
-import { deserializeUnchecked, Schema } from 'borsh';
+import { deserialize, Schema } from 'borsh';
+
+type InitArgs = {
+  parentName: Uint8Array;
+  owner: Uint8Array;
+  class: Uint8Array;
+};
 
 export class NameRegistryState {
   static HEADER_LEN = 96;
@@ -8,24 +14,14 @@ export class NameRegistryState {
   class: PublicKey;
   data: Buffer | undefined;
 
-  static schema: Schema = new Map([
-    [
-      NameRegistryState,
-      {
-        kind: 'struct',
-        fields: [
-          ['parentName', [32]],
-          ['owner', [32]],
-          ['class', [32]],
-        ],
-      },
-    ],
-  ]);
-  constructor(obj: {
-    parentName: Uint8Array;
-    owner: Uint8Array;
-    class: Uint8Array;
-  }) {
+  static schema: Schema = {
+    struct: {
+      parentName: { array: { type: 'u8', len: 32 } },
+      owner: { array: { type: 'u8', len: 32 } },
+      class: { array: { type: 'u8', len: 32 } },
+    },
+  };
+  constructor(obj: InitArgs) {
     this.parentName = new PublicKey(obj.parentName);
     this.owner = new PublicKey(obj.owner);
     this.class = new PublicKey(obj.class);
@@ -43,11 +39,8 @@ export class NameRegistryState {
       throw new Error('Invalid name account provided');
     }
 
-    const res: NameRegistryState = deserializeUnchecked(
-      this.schema,
-      NameRegistryState,
-      nameAccount.data,
-    );
+    const deserialized = deserialize(this.schema, nameAccount.data) as InitArgs;
+    const res = new NameRegistryState(deserialized);
 
     res.data = nameAccount.data?.slice(this.HEADER_LEN);
 
diff --git a/name-service/js/src/twitter.ts b/name-service/js/src/twitter.ts
index fbb77c9d8..5748780de 100644
--- a/name-service/js/src/twitter.ts
+++ b/name-service/js/src/twitter.ts
@@ -4,7 +4,7 @@ import {
   SystemProgram,
   TransactionInstruction,
 } from '@solana/web3.js';
-import { deserialize, deserializeUnchecked, Schema, serialize } from 'borsh';
+import { deserialize, Schema, serialize } from 'borsh';
 
 import { deleteNameRegistry, NAME_PROGRAM_ID } from './bindings';
 import {
@@ -291,11 +291,10 @@ export async function getTwitterHandleandRegistryKeyViaFilters(
   for (const f of filteredAccounts) {
     if (f.accountInfo.data.length > NameRegistryState.HEADER_LEN + 32) {
       const data = f.accountInfo.data.slice(NameRegistryState.HEADER_LEN);
-      const state: ReverseTwitterRegistryState = deserialize(
+      const state = deserialize(
         ReverseTwitterRegistryState.schema,
-        ReverseTwitterRegistryState,
         data,
-      );
+      ) as ReverseTwitterRegistryState;
       return [state.twitterHandle, new PublicKey(state.twitterRegistryKey)];
     }
   }
@@ -351,18 +350,12 @@ export class ReverseTwitterRegistryState {
   twitterRegistryKey: Uint8Array;
   twitterHandle: string;
 
-  static schema: Schema = new Map([
-    [
-      ReverseTwitterRegistryState,
-      {
-        kind: 'struct',
-        fields: [
-          ['twitterRegistryKey', [32]],
-          ['twitterHandle', 'string'],
-        ],
-      },
-    ],
-  ]);
+  static schema: Schema = {
+    struct: {
+      twitterRegistryKey: { array: { type: 'u8', len: 32 } },
+      twitterHandle: 'string',
+    },
+  };
   constructor(obj: { twitterRegistryKey: Uint8Array; twitterHandle: string }) {
     this.twitterRegistryKey = obj.twitterRegistryKey;
     this.twitterHandle = obj.twitterHandle;
@@ -380,11 +373,10 @@ export class ReverseTwitterRegistryState {
       throw new Error('Invalid reverse Twitter account provided');
     }
 
-    const res: ReverseTwitterRegistryState = deserializeUnchecked(
+    const res = deserialize(
       this.schema,
-      ReverseTwitterRegistryState,
       reverseTwitterAccount.data.slice(NameRegistryState.HEADER_LEN),
-    );
+    ) as ReverseTwitterRegistryState;
 
     return res;
   }
diff --git a/package.json b/package.json
index 63c5a832a..10a1abd91 100644
--- a/package.json
+++ b/package.json
@@ -21,7 +21,7 @@
     },
     "devDependencies": {
         "@solana/eslint-config-solana": "^1.0.2",
-        "@solana/prettier-config-solana": "^0.0.3",
+        "@solana/prettier-config-solana": "^0.0.4",
         "eslint-config-turbo": "^1.10.16",
         "turbo": "^1.10.16"
     },
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index d898cfc0a..fd8418239 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -8,8 +8,8 @@ importers:
         specifier: ^1.0.2
         version: 1.0.2(@typescript-eslint/eslint-plugin@6.13.1)(@typescript-eslint/parser@6.13.1)(eslint-plugin-jest@27.6.0)(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-simple-import-sort@10.0.0)(eslint-plugin-sort-keys-fix@1.1.2)(eslint@8.54.0)(typescript@5.3.2)
       '@solana/prettier-config-solana':
-        specifier: ^0.0.3
-        version: 0.0.3(prettier@3.1.0)
+        specifier: ^0.0.4
+        version: 0.0.4(prettier@3.1.0)
       eslint-config-turbo:
         specifier: ^1.10.16
         version: 1.10.16(eslint@8.54.0)
@@ -31,9 +31,6 @@ importers:
       bn.js:
         specifier: ^5.2.1
         version: 5.2.1
-      borsh:
-        specifier: ^0.7.0
-        version: 0.7.0
       js-sha3:
         specifier: ^0.9.2
         version: 0.9.2
@@ -54,8 +51,8 @@ importers:
         specifier: ^1.0.2
         version: 1.0.2(@typescript-eslint/eslint-plugin@6.13.1)(@typescript-eslint/parser@6.13.1)(eslint-plugin-jest@27.6.0)(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-simple-import-sort@10.0.0)(eslint-plugin-sort-keys-fix@1.1.2)(eslint@8.54.0)(typescript@5.3.2)
       '@solana/prettier-config-solana':
-        specifier: ^0.0.3
-        version: 0.0.3(prettier@3.1.0)
+        specifier: ^0.0.4
+        version: 0.0.4(prettier@3.1.0)
       '@types/bn.js':
         specifier: ^5.1.0
         version: 5.1.5
@@ -97,7 +94,7 @@ importers:
         version: 10.2.0(eslint@8.54.0)
       eslint-plugin-prettier:
         specifier: ^5.0.1
-        version: 5.0.1(@types/eslint@8.44.7)(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.1.0)
+        version: 5.0.1(@types/eslint@8.44.8)(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.1.0)
       eslint-plugin-simple-import-sort:
         specifier: ^10.0.0
         version: 10.0.0(eslint@8.54.0)
@@ -109,10 +106,10 @@ importers:
         version: 6.1.0
       jest:
         specifier: ^29.0.1
-        version: 29.7.0(@types/node@20.10.0)(ts-node@10.9.1)
+        version: 29.7.0(@types/node@20.10.1)(ts-node@10.9.1)
       jest-config:
         specifier: ^29.0.1
-        version: 29.7.0(@types/node@20.10.0)(ts-node@10.9.1)
+        version: 29.7.0(@types/node@20.10.1)(ts-node@10.9.1)
       start-server-and-test:
         specifier: ^2.0.3
         version: 2.0.3
@@ -124,7 +121,7 @@ importers:
         version: 2.0.1
       ts-node:
         specifier: ^10.9.1
-        version: 10.9.1(@types/node@20.10.0)(typescript@5.3.2)
+        version: 10.9.1(@types/node@20.10.1)(typescript@5.3.2)
       typedoc:
         specifier: ^0.25.4
         version: 0.25.4(typescript@5.3.2)
@@ -145,8 +142,8 @@ importers:
         specifier: ^10.0.6
         version: 10.0.6
       '@types/node':
-        specifier: ^20.10.0
-        version: 20.10.0
+        specifier: ^20.10.1
+        version: 20.10.1
       '@typescript-eslint/eslint-plugin':
         specifier: ^6.13.1
         version: 6.13.1(@typescript-eslint/parser@6.13.1)(eslint@8.54.0)(typescript@5.3.2)
@@ -167,7 +164,7 @@ importers:
         version: 9.0.0(eslint@8.54.0)
       eslint-plugin-prettier:
         specifier: ^5.0.1
-        version: 5.0.1(@types/eslint@8.44.7)(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.1.0)
+        version: 5.0.1(@types/eslint@8.44.8)(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.1.0)
       eslint-plugin-require-extensions:
         specifier: ^0.1.1
         version: 0.1.3(eslint@8.54.0)
@@ -185,7 +182,7 @@ importers:
         version: 0.3.4
       ts-node:
         specifier: ^10.9.1
-        version: 10.9.1(@types/node@20.10.0)(typescript@5.3.2)
+        version: 10.9.1(@types/node@20.10.1)(typescript@5.3.2)
       typescript:
         specifier: ^5.3.2
         version: 5.3.2
@@ -206,8 +203,8 @@ importers:
         specifier: ^29.5.10
         version: 29.5.10
       '@types/node':
-        specifier: ^20.10.0
-        version: 20.10.0
+        specifier: ^20.10.1
+        version: 20.10.1
       '@types/node-fetch':
         specifier: ^2.6.2
         version: 2.6.9
@@ -228,7 +225,7 @@ importers:
         version: 9.0.0(eslint@8.54.0)
       eslint-plugin-prettier:
         specifier: ^5.0.1
-        version: 5.0.1(@types/eslint@8.44.7)(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.1.0)
+        version: 5.0.1(@types/eslint@8.44.8)(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.1.0)
       eslint-plugin-require-extensions:
         specifier: ^0.1.1
         version: 0.1.3(eslint@8.54.0)
@@ -237,7 +234,7 @@ importers:
         version: 6.1.0
       jest:
         specifier: ^29.0.0
-        version: 29.7.0(@types/node@20.10.0)(ts-node@10.9.1)
+        version: 29.7.0(@types/node@20.10.1)(ts-node@10.9.1)
       prettier:
         specifier: ^3.1.0
         version: 3.1.0
@@ -255,7 +252,7 @@ importers:
         version: 29.1.1(@babel/core@7.23.2)(jest@29.7.0)(typescript@5.3.2)
       ts-node:
         specifier: ^10.9.1
-        version: 10.9.1(@types/node@20.10.0)(typescript@5.3.2)
+        version: 10.9.1(@types/node@20.10.1)(typescript@5.3.2)
       typedoc:
         specifier: ^0.25.4
         version: 0.25.4(typescript@5.3.2)
@@ -272,8 +269,8 @@ importers:
         specifier: ^5.1.3
         version: 5.2.1
       borsh:
-        specifier: ^0.7.0
-        version: 0.7.0
+        specifier: ^2.0.0
+        version: 2.0.0
     devDependencies:
       '@types/bn.js':
         specifier: ^5.1.1
@@ -288,8 +285,8 @@ importers:
         specifier: ^10.0.6
         version: 10.0.6
       '@types/node':
-        specifier: ^20.10.0
-        version: 20.10.0
+        specifier: ^20.10.1
+        version: 20.10.1
       '@typescript-eslint/eslint-plugin':
         specifier: ^6.13.1
         version: 6.13.1(@typescript-eslint/parser@6.13.1)(eslint@8.54.0)(typescript@5.3.2)
@@ -328,7 +325,7 @@ importers:
         version: 2.0.3
       ts-node:
         specifier: ^10.9.1
-        version: 10.9.1(@types/node@20.10.0)(typescript@5.3.2)
+        version: 10.9.1(@types/node@20.10.1)(typescript@5.3.2)
       typedoc:
         specifier: ^0.25.4
         version: 0.25.4(typescript@5.3.2)
@@ -349,8 +346,8 @@ importers:
         specifier: ^4.1.0
         version: 4.1.0
       '@types/node':
-        specifier: ^20.10.0
-        version: 20.10.0
+        specifier: ^20.10.1
+        version: 20.10.1
       '@typescript-eslint/eslint-plugin':
         specifier: ^6.13.1
         version: 6.13.1(@typescript-eslint/parser@6.13.1)(eslint@8.54.0)(typescript@5.3.2)
@@ -365,13 +362,13 @@ importers:
         version: 9.0.0(eslint@8.54.0)
       eslint-plugin-prettier:
         specifier: ^5.0.1
-        version: 5.0.1(@types/eslint@8.44.7)(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.1.0)
+        version: 5.0.1(@types/eslint@8.44.8)(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.1.0)
       solana-bankrun:
         specifier: ^0.2.0
         version: 0.2.0
       tsx:
-        specifier: ^4.6.0
-        version: 4.6.0
+        specifier: ^4.6.1
+        version: 4.6.1
       typescript:
         specifier: ^5.3.2
         version: 5.3.2
@@ -383,8 +380,8 @@ importers:
         version: 2.0.0-experimental.21e994f(node-fetch@2.7.0)(ws@8.14.2)
     devDependencies:
       '@types/node':
-        specifier: ^20.10.0
-        version: 20.10.0
+        specifier: ^20.10.1
+        version: 20.10.1
       '@typescript-eslint/eslint-plugin':
         specifier: ^6.13.1
         version: 6.13.1(@typescript-eslint/parser@6.13.1)(eslint@8.54.0)(typescript@5.3.2)
@@ -396,7 +393,7 @@ importers:
         version: 9.0.0(eslint@8.54.0)
       eslint-plugin-prettier:
         specifier: ^5.0.1
-        version: 5.0.1(@types/eslint@8.44.7)(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.1.0)
+        version: 5.0.1(@types/eslint@8.44.8)(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.1.0)
       typescript:
         specifier: ^5.3.2
         version: 5.3.2
@@ -427,25 +424,25 @@ importers:
     devDependencies:
       '@rollup/plugin-alias':
         specifier: ^5.1.0
-        version: 5.1.0(rollup@4.6.0)
+        version: 5.1.0(rollup@4.6.1)
       '@rollup/plugin-commonjs':
         specifier: ^25.0.0
-        version: 25.0.7(rollup@4.6.0)
+        version: 25.0.7(rollup@4.6.1)
       '@rollup/plugin-json':
         specifier: ^6.0.0
-        version: 6.0.1(rollup@4.6.0)
+        version: 6.0.1(rollup@4.6.1)
       '@rollup/plugin-multi-entry':
         specifier: ^6.0.0
-        version: 6.0.1(rollup@4.6.0)
+        version: 6.0.1(rollup@4.6.1)
       '@rollup/plugin-node-resolve':
         specifier: ^15.0.2
-        version: 15.2.3(rollup@4.6.0)
+        version: 15.2.3(rollup@4.6.1)
       '@rollup/plugin-terser':
         specifier: ^0.4.4
-        version: 0.4.4(rollup@4.6.0)
+        version: 0.4.4(rollup@4.6.1)
       '@rollup/plugin-typescript':
         specifier: ^11.1.0
-        version: 11.1.5(rollup@4.6.0)(tslib@2.6.2)(typescript@5.3.2)
+        version: 11.1.5(rollup@4.6.1)(tslib@2.6.2)(typescript@5.3.2)
       '@types/bn.js':
         specifier: ^5.1.0
         version: 5.1.5
@@ -453,8 +450,8 @@ importers:
         specifier: ^29.5.10
         version: 29.5.10
       '@types/node':
-        specifier: ^20.10.0
-        version: 20.10.0
+        specifier: ^20.10.1
+        version: 20.10.1
       '@types/node-fetch':
         specifier: ^2.6.3
         version: 2.6.9
@@ -475,10 +472,10 @@ importers:
         version: 9.0.0(eslint@8.54.0)
       eslint-plugin-prettier:
         specifier: ^5.0.1
-        version: 5.0.1(@types/eslint@8.44.7)(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.1.0)
+        version: 5.0.1(@types/eslint@8.44.8)(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.1.0)
       jest:
         specifier: ^29.0.0
-        version: 29.7.0(@types/node@20.10.0)(ts-node@10.9.1)
+        version: 29.7.0(@types/node@20.10.1)(ts-node@10.9.1)
       prettier:
         specifier: ^3.1.0
         version: 3.1.0
@@ -486,11 +483,11 @@ importers:
         specifier: ^5.0.0
         version: 5.0.5
       rollup:
-        specifier: ^4.6.0
-        version: 4.6.0
+        specifier: ^4.6.1
+        version: 4.6.1
       rollup-plugin-dts:
         specifier: ^6.1.0
-        version: 6.1.0(rollup@4.6.0)(typescript@5.3.2)
+        version: 6.1.0(rollup@4.6.1)(typescript@5.3.2)
       ts-jest:
         specifier: ^29.0.0
         version: 29.1.1(@babel/core@7.23.2)(jest@29.7.0)(typescript@5.3.2)
@@ -515,13 +512,13 @@ importers:
     devDependencies:
       '@rollup/plugin-commonjs':
         specifier: ^25.0.0
-        version: 25.0.7(rollup@4.6.0)
+        version: 25.0.7(rollup@4.6.1)
       '@rollup/plugin-node-resolve':
         specifier: ^15.0.2
-        version: 15.2.3(rollup@4.6.0)
+        version: 15.2.3(rollup@4.6.1)
       '@rollup/plugin-typescript':
         specifier: ^11.1.1
-        version: 11.1.5(rollup@4.6.0)(tslib@2.6.2)(typescript@5.3.2)
+        version: 11.1.5(rollup@4.6.1)(tslib@2.6.2)(typescript@5.3.2)
       '@solana/spl-token':
         specifier: workspace:*
         version: link:../../token/js
@@ -529,14 +526,14 @@ importers:
         specifier: ^1.87.6
         version: 1.87.6
       '@types/eslint':
-        specifier: ^8.4.1
-        version: 8.44.7
+        specifier: ^8.44.8
+        version: 8.44.8
       '@types/eslint-plugin-prettier':
         specifier: ^3.1.0
         version: 3.1.3
       '@types/node':
-        specifier: ^20.10.0
-        version: 20.10.0
+        specifier: ^20.10.1
+        version: 20.10.1
       '@typescript-eslint/eslint-plugin':
         specifier: ^6.13.1
         version: 6.13.1(@typescript-eslint/parser@6.13.1)(eslint@8.54.0)(typescript@5.3.2)
@@ -551,7 +548,7 @@ importers:
         version: 9.0.0(eslint@8.54.0)
       eslint-plugin-prettier:
         specifier: ^5.0.1
-        version: 5.0.1(@types/eslint@8.44.7)(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.1.0)
+        version: 5.0.1(@types/eslint@8.44.8)(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.1.0)
       gh-pages:
         specifier: ^6.1.0
         version: 6.1.0
@@ -559,11 +556,11 @@ importers:
         specifier: ^3.1.0
         version: 3.1.0
       rollup:
-        specifier: ^4.6.0
-        version: 4.6.0
+        specifier: ^4.6.1
+        version: 4.6.1
       ts-node:
         specifier: ^10.7.0
-        version: 10.9.1(@types/node@20.10.0)(typescript@5.3.2)
+        version: 10.9.1(@types/node@20.10.1)(typescript@5.3.2)
       tslib:
         specifier: ^2.3.0
         version: 2.6.2
@@ -605,8 +602,8 @@ importers:
         specifier: ^10.0.6
         version: 10.0.6
       '@types/node':
-        specifier: ^20.10.0
-        version: 20.10.0
+        specifier: ^20.10.1
+        version: 20.10.1
       '@typescript-eslint/eslint-plugin':
         specifier: ^6.13.1
         version: 6.13.1(@typescript-eslint/parser@6.13.1)(eslint@8.54.0)(typescript@5.3.2)
@@ -624,7 +621,7 @@ importers:
         version: 9.0.0(eslint@8.54.0)
       eslint-plugin-prettier:
         specifier: ^5.0.1
-        version: 5.0.1(@types/eslint@8.44.7)(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.1.0)
+        version: 5.0.1(@types/eslint@8.44.8)(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.1.0)
       eslint-plugin-require-extensions:
         specifier: ^0.1.1
         version: 0.1.3(eslint@8.54.0)
@@ -642,7 +639,7 @@ importers:
         version: 0.3.4
       ts-node:
         specifier: ^10.9.1
-        version: 10.9.1(@types/node@20.10.0)(typescript@5.3.2)
+        version: 10.9.1(@types/node@20.10.1)(typescript@5.3.2)
       tslib:
         specifier: ^2.3.1
         version: 2.6.2
@@ -697,7 +694,7 @@ importers:
         version: 2.29.0(@typescript-eslint/parser@6.13.1)(eslint@8.54.0)
       eslint-plugin-prettier:
         specifier: ^5.0.1
-        version: 5.0.1(@types/eslint@8.44.7)(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.1.0)
+        version: 5.0.1(@types/eslint@8.44.8)(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.1.0)
       eslint-plugin-require-extensions:
         specifier: ^0.1.1
         version: 0.1.3(eslint@8.54.0)
@@ -712,7 +709,7 @@ importers:
         version: 2.0.3
       ts-node:
         specifier: ^10.0.0
-        version: 10.9.1(@types/node@20.10.0)(typescript@5.3.2)
+        version: 10.9.1(@types/node@20.10.1)(typescript@5.3.2)
       typescript:
         specifier: ^5.3.2
         version: 5.3.2
@@ -745,8 +742,8 @@ importers:
         specifier: ^10.0.6
         version: 10.0.6
       '@types/node':
-        specifier: ^20.10.0
-        version: 20.10.0
+        specifier: ^20.10.1
+        version: 20.10.1
       '@types/node-fetch':
         specifier: ^2.6.2
         version: 2.6.9
@@ -770,7 +767,7 @@ importers:
         version: 9.0.0(eslint@8.54.0)
       eslint-plugin-prettier:
         specifier: ^5.0.1
-        version: 5.0.1(@types/eslint@8.44.7)(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.1.0)
+        version: 5.0.1(@types/eslint@8.44.8)(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.1.0)
       eslint-plugin-require-extensions:
         specifier: ^0.1.1
         version: 0.1.3(eslint@8.54.0)
@@ -794,7 +791,7 @@ importers:
         version: 2.0.3
       ts-node:
         specifier: ^10.9.1
-        version: 10.9.1(@types/node@20.10.0)(typescript@5.3.2)
+        version: 10.9.1(@types/node@20.10.1)(typescript@5.3.2)
       tslib:
         specifier: ^2.3.1
         version: 2.6.2
@@ -1490,7 +1487,7 @@ packages:
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
       '@jest/types': 29.6.3
-      '@types/node': 20.10.0
+      '@types/node': 20.10.1
       chalk: 4.1.2
       jest-message-util: 29.7.0
       jest-util: 29.7.0
@@ -1511,14 +1508,14 @@ packages:
       '@jest/test-result': 29.7.0
       '@jest/transform': 29.7.0
       '@jest/types': 29.6.3
-      '@types/node': 20.10.0
+      '@types/node': 20.10.1
       ansi-escapes: 4.3.2
       chalk: 4.1.2
       ci-info: 3.9.0
       exit: 0.1.2
       graceful-fs: 4.2.11
       jest-changed-files: 29.7.0
-      jest-config: 29.7.0(@types/node@20.10.0)(ts-node@10.9.1)
+      jest-config: 29.7.0(@types/node@20.10.1)(ts-node@10.9.1)
       jest-haste-map: 29.7.0
       jest-message-util: 29.7.0
       jest-regex-util: 29.6.3
@@ -1546,7 +1543,7 @@ packages:
     dependencies:
       '@jest/fake-timers': 29.7.0
       '@jest/types': 29.6.3
-      '@types/node': 20.10.0
+      '@types/node': 20.10.1
       jest-mock: 29.7.0
     dev: true
 
@@ -1573,7 +1570,7 @@ packages:
     dependencies:
       '@jest/types': 29.6.3
       '@sinonjs/fake-timers': 10.3.0
-      '@types/node': 20.10.0
+      '@types/node': 20.10.1
       jest-message-util: 29.7.0
       jest-mock: 29.7.0
       jest-util: 29.7.0
@@ -1606,7 +1603,7 @@ packages:
       '@jest/transform': 29.7.0
       '@jest/types': 29.6.3
       '@jridgewell/trace-mapping': 0.3.20
-      '@types/node': 20.10.0
+      '@types/node': 20.10.1
       chalk: 4.1.2
       collect-v8-coverage: 1.0.2
       exit: 0.1.2
@@ -1694,7 +1691,7 @@ packages:
       '@jest/schemas': 29.6.3
       '@types/istanbul-lib-coverage': 2.0.6
       '@types/istanbul-reports': 3.0.4
-      '@types/node': 20.10.0
+      '@types/node': 20.10.1
       '@types/yargs': 17.0.31
       chalk: 4.1.2
     dev: true
@@ -1923,7 +1920,7 @@ packages:
       - utf-8-validate
     dev: true
 
-  /@rollup/plugin-alias@5.1.0(rollup@4.6.0):
+  /@rollup/plugin-alias@5.1.0(rollup@4.6.1):
     resolution: {integrity: sha512-lpA3RZ9PdIG7qqhEfv79tBffNaoDuukFDrmhLqg9ifv99u/ehn+lOg30x2zmhf8AQqQUZaMk/B9fZraQ6/acDQ==}
     engines: {node: '>=14.0.0'}
     peerDependencies:
@@ -1932,11 +1929,11 @@ packages:
       rollup:
         optional: true
     dependencies:
-      rollup: 4.6.0
+      rollup: 4.6.1
       slash: 4.0.0
     dev: true
 
-  /@rollup/plugin-commonjs@25.0.7(rollup@4.6.0):
+  /@rollup/plugin-commonjs@25.0.7(rollup@4.6.1):
     resolution: {integrity: sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==}
     engines: {node: '>=14.0.0'}
     peerDependencies:
@@ -1945,16 +1942,16 @@ packages:
       rollup:
         optional: true
     dependencies:
-      '@rollup/pluginutils': 5.0.5(rollup@4.6.0)
+      '@rollup/pluginutils': 5.0.5(rollup@4.6.1)
       commondir: 1.0.1
       estree-walker: 2.0.2
       glob: 8.1.0
       is-reference: 1.2.1
       magic-string: 0.30.5
-      rollup: 4.6.0
+      rollup: 4.6.1
     dev: true
 
-  /@rollup/plugin-json@6.0.1(rollup@4.6.0):
+  /@rollup/plugin-json@6.0.1(rollup@4.6.1):
     resolution: {integrity: sha512-RgVfl5hWMkxN1h/uZj8FVESvPuBJ/uf6ly6GTj0GONnkfoBN5KC0MSz+PN2OLDgYXMhtG0mWpTrkiOjoxAIevw==}
     engines: {node: '>=14.0.0'}
     peerDependencies:
@@ -1963,11 +1960,11 @@ packages:
       rollup:
         optional: true
     dependencies:
-      '@rollup/pluginutils': 5.0.5(rollup@4.6.0)
-      rollup: 4.6.0
+      '@rollup/pluginutils': 5.0.5(rollup@4.6.1)
+      rollup: 4.6.1
     dev: true
 
-  /@rollup/plugin-multi-entry@6.0.1(rollup@4.6.0):
+  /@rollup/plugin-multi-entry@6.0.1(rollup@4.6.1):
     resolution: {integrity: sha512-AXm6toPyTSfbYZWghQGbom1Uh7dHXlrGa+HoiYNhQtDUE3Q7LqoUYdVQx9E1579QWS1uOiu+cZRSE4okO7ySgw==}
     engines: {node: '>=14.0.0'}
     peerDependencies:
@@ -1976,12 +1973,12 @@ packages:
       rollup:
         optional: true
     dependencies:
-      '@rollup/plugin-virtual': 3.0.2(rollup@4.6.0)
+      '@rollup/plugin-virtual': 3.0.2(rollup@4.6.1)
       matched: 5.0.1
-      rollup: 4.6.0
+      rollup: 4.6.1
     dev: true
 
-  /@rollup/plugin-node-resolve@15.2.3(rollup@4.6.0):
+  /@rollup/plugin-node-resolve@15.2.3(rollup@4.6.1):
     resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==}
     engines: {node: '>=14.0.0'}
     peerDependencies:
@@ -1990,16 +1987,16 @@ packages:
       rollup:
         optional: true
     dependencies:
-      '@rollup/pluginutils': 5.0.5(rollup@4.6.0)
+      '@rollup/pluginutils': 5.0.5(rollup@4.6.1)
       '@types/resolve': 1.20.2
       deepmerge: 4.3.1
       is-builtin-module: 3.2.1
       is-module: 1.0.0
       resolve: 1.22.8
-      rollup: 4.6.0
+      rollup: 4.6.1
     dev: true
 
-  /@rollup/plugin-terser@0.4.4(rollup@4.6.0):
+  /@rollup/plugin-terser@0.4.4(rollup@4.6.1):
     resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==}
     engines: {node: '>=14.0.0'}
     peerDependencies:
@@ -2008,13 +2005,13 @@ packages:
       rollup:
         optional: true
     dependencies:
-      rollup: 4.6.0
+      rollup: 4.6.1
       serialize-javascript: 6.0.1
       smob: 1.4.1
       terser: 5.24.0
     dev: true
 
-  /@rollup/plugin-typescript@11.1.5(rollup@4.6.0)(tslib@2.6.2)(typescript@5.3.2):
+  /@rollup/plugin-typescript@11.1.5(rollup@4.6.1)(tslib@2.6.2)(typescript@5.3.2):
     resolution: {integrity: sha512-rnMHrGBB0IUEv69Q8/JGRD/n4/n6b3nfpufUu26axhUcboUzv/twfZU8fIBbTOphRAe0v8EyxzeDpKXqGHfyDA==}
     engines: {node: '>=14.0.0'}
     peerDependencies:
@@ -2027,14 +2024,14 @@ packages:
       tslib:
         optional: true
     dependencies:
-      '@rollup/pluginutils': 5.0.5(rollup@4.6.0)
+      '@rollup/pluginutils': 5.0.5(rollup@4.6.1)
       resolve: 1.22.8
-      rollup: 4.6.0
+      rollup: 4.6.1
       tslib: 2.6.2
       typescript: 5.3.2
     dev: true
 
-  /@rollup/plugin-virtual@3.0.2(rollup@4.6.0):
+  /@rollup/plugin-virtual@3.0.2(rollup@4.6.1):
     resolution: {integrity: sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A==}
     engines: {node: '>=14.0.0'}
     peerDependencies:
@@ -2043,10 +2040,10 @@ packages:
       rollup:
         optional: true
     dependencies:
-      rollup: 4.6.0
+      rollup: 4.6.1
     dev: true
 
-  /@rollup/pluginutils@5.0.5(rollup@4.6.0):
+  /@rollup/pluginutils@5.0.5(rollup@4.6.1):
     resolution: {integrity: sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==}
     engines: {node: '>=14.0.0'}
     peerDependencies:
@@ -2058,99 +2055,99 @@ packages:
       '@types/estree': 1.0.5
       estree-walker: 2.0.2
       picomatch: 2.3.1
-      rollup: 4.6.0
+      rollup: 4.6.1
     dev: true
 
-  /@rollup/rollup-android-arm-eabi@4.6.0:
-    resolution: {integrity: sha512-keHkkWAe7OtdALGoutLY3utvthkGF+Y17ws9LYT8pxMBYXaCoH/8dXS2uzo6e8+sEhY7y/zi5RFo22Dy2lFpDw==}
+  /@rollup/rollup-android-arm-eabi@4.6.1:
+    resolution: {integrity: sha512-0WQ0ouLejaUCRsL93GD4uft3rOmB8qoQMU05Kb8CmMtMBe7XUDLAltxVZI1q6byNqEtU7N1ZX1Vw5lIpgulLQA==}
     cpu: [arm]
     os: [android]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/rollup-android-arm64@4.6.0:
-    resolution: {integrity: sha512-y3Kt+34smKQNWilicPbBz/MXEY7QwDzMFNgwEWeYiOhUt9MTWKjHqe3EVkXwT2fR7izOvHpDWZ0o2IyD9SWX7A==}
+  /@rollup/rollup-android-arm64@4.6.1:
+    resolution: {integrity: sha512-1TKm25Rn20vr5aTGGZqo6E4mzPicCUD79k17EgTLAsXc1zysyi4xXKACfUbwyANEPAEIxkzwue6JZ+stYzWUTA==}
     cpu: [arm64]
     os: [android]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/rollup-darwin-arm64@4.6.0:
-    resolution: {integrity: sha512-oLzzxcUIHltHxOCmaXl+pkIlU+uhSxef5HfntW7RsLh1eHm+vJzjD9Oo4oUKso4YuP4PpbFJNlZjJuOrxo8dPg==}
+  /@rollup/rollup-darwin-arm64@4.6.1:
+    resolution: {integrity: sha512-cEXJQY/ZqMACb+nxzDeX9IPLAg7S94xouJJCNVE5BJM8JUEP4HeTF+ti3cmxWeSJo+5D+o8Tc0UAWUkfENdeyw==}
     cpu: [arm64]
     os: [darwin]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/rollup-darwin-x64@4.6.0:
-    resolution: {integrity: sha512-+ANnmjkcOBaV25n0+M0Bere3roeVAnwlKW65qagtuAfIxXF9YxUneRyAn/RDcIdRa7QrjRNJL3jR7T43ObGe8Q==}
+  /@rollup/rollup-darwin-x64@4.6.1:
+    resolution: {integrity: sha512-LoSU9Xu56isrkV2jLldcKspJ7sSXmZWkAxg7sW/RfF7GS4F5/v4EiqKSMCFbZtDu2Nc1gxxFdQdKwkKS4rwxNg==}
     cpu: [x64]
     os: [darwin]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/rollup-linux-arm-gnueabihf@4.6.0:
-    resolution: {integrity: sha512-tBTSIkjSVUyrekddpkAqKOosnj1Fc0ZY0rJL2bIEWPKqlEQk0paORL9pUIlt7lcGJi3LzMIlUGXvtNi1Z6MOCQ==}
+  /@rollup/rollup-linux-arm-gnueabihf@4.6.1:
+    resolution: {integrity: sha512-EfI3hzYAy5vFNDqpXsNxXcgRDcFHUWSx5nnRSCKwXuQlI5J9dD84g2Usw81n3FLBNsGCegKGwwTVsSKK9cooSQ==}
     cpu: [arm]
     os: [linux]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/rollup-linux-arm64-gnu@4.6.0:
-    resolution: {integrity: sha512-Ed8uJI3kM11de9S0j67wAV07JUNhbAqIrDYhQBrQW42jGopgheyk/cdcshgGO4fW5Wjq97COCY/BHogdGvKVNQ==}
+  /@rollup/rollup-linux-arm64-gnu@4.6.1:
+    resolution: {integrity: sha512-9lhc4UZstsegbNLhH0Zu6TqvDfmhGzuCWtcTFXY10VjLLUe4Mr0Ye2L3rrtHaDd/J5+tFMEuo5LTCSCMXWfUKw==}
     cpu: [arm64]
     os: [linux]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/rollup-linux-arm64-musl@4.6.0:
-    resolution: {integrity: sha512-mZoNQ/qK4D7SSY8v6kEsAAyDgznzLLuSFCA3aBHZTmf3HP/dW4tNLTtWh9+LfyO0Z1aUn+ecpT7IQ3WtIg3ViQ==}
+  /@rollup/rollup-linux-arm64-musl@4.6.1:
+    resolution: {integrity: sha512-FfoOK1yP5ksX3wwZ4Zk1NgyGHZyuRhf99j64I5oEmirV8EFT7+OhUZEnP+x17lcP/QHJNWGsoJwrz4PJ9fBEXw==}
     cpu: [arm64]
     os: [linux]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/rollup-linux-x64-gnu@4.6.0:
-    resolution: {integrity: sha512-rouezFHpwCqdEXsqAfNsTgSWO0FoZ5hKv5p+TGO5KFhyN/dvYXNMqMolOb8BkyKcPqjYRBeT+Z6V3aM26rPaYg==}
+  /@rollup/rollup-linux-x64-gnu@4.6.1:
+    resolution: {integrity: sha512-DNGZvZDO5YF7jN5fX8ZqmGLjZEXIJRdJEdTFMhiyXqyXubBa0WVLDWSNlQ5JR2PNgDbEV1VQowhVRUh+74D+RA==}
     cpu: [x64]
     os: [linux]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/rollup-linux-x64-musl@4.6.0:
-    resolution: {integrity: sha512-Bbm+fyn3S6u51urfj3YnqBXg5vI2jQPncRRELaucmhBVyZkbWClQ1fEsRmdnCPpQOQfkpg9gZArvtMVkOMsh1w==}
+  /@rollup/rollup-linux-x64-musl@4.6.1:
+    resolution: {integrity: sha512-RkJVNVRM+piYy87HrKmhbexCHg3A6Z6MU0W9GHnJwBQNBeyhCJG9KDce4SAMdicQnpURggSvtbGo9xAWOfSvIQ==}
     cpu: [x64]
     os: [linux]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/rollup-win32-arm64-msvc@4.6.0:
-    resolution: {integrity: sha512-+MRMcyx9L2kTrTUzYmR61+XVsliMG4odFb5UmqtiT8xOfEicfYAGEuF/D1Pww1+uZkYhBqAHpvju7VN+GnC3ng==}
+  /@rollup/rollup-win32-arm64-msvc@4.6.1:
+    resolution: {integrity: sha512-v2FVT6xfnnmTe3W9bJXl6r5KwJglMK/iRlkKiIFfO6ysKs0rDgz7Cwwf3tjldxQUrHL9INT/1r4VA0n9L/F1vQ==}
     cpu: [arm64]
     os: [win32]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/rollup-win32-ia32-msvc@4.6.0:
-    resolution: {integrity: sha512-rxfeE6K6s/Xl2HGeK6cO8SiQq3k/3BYpw7cfhW5Bk2euXNEpuzi2cc7llxx1si1QgwfjNtdRNTGqdBzGlFZGFw==}
+  /@rollup/rollup-win32-ia32-msvc@4.6.1:
+    resolution: {integrity: sha512-YEeOjxRyEjqcWphH9dyLbzgkF8wZSKAKUkldRY6dgNR5oKs2LZazqGB41cWJ4Iqqcy9/zqYgmzBkRoVz3Q9MLw==}
     cpu: [ia32]
     os: [win32]
     requiresBuild: true
     dev: true
     optional: true
 
-  /@rollup/rollup-win32-x64-msvc@4.6.0:
-    resolution: {integrity: sha512-QqmCsydHS172Y0Kc13bkMXvipbJSvzeglBncJG3LsYJSiPlxYACz7MmJBs4A8l1oU+jfhYEIC/+AUSlvjmiX/g==}
+  /@rollup/rollup-win32-x64-msvc@4.6.1:
+    resolution: {integrity: sha512-0zfTlFAIhgz8V2G8STq8toAjsYYA6eci1hnXuyOTUFnymrtJwnS6uGKiv3v5UrPZkBlamLvrLV2iiaeqCKzb0A==}
     cpu: [x64]
     os: [win32]
     requiresBuild: true
@@ -2288,10 +2285,10 @@ packages:
       '@solana/codecs-numbers': 2.0.0-experimental.7123512
     dev: false
 
-  /@solana/prettier-config-solana@0.0.3(prettier@3.1.0):
-    resolution: {integrity: sha512-69lOncqTcp7Q/yQIU7R4/nQ6Ejir0TlYiUMcOM/z1PHsiDRF6qL+Jzfy8J9j5euDAR5VCoh0kM5lzaB/sdWgCA==}
+  /@solana/prettier-config-solana@0.0.4(prettier@3.1.0):
+    resolution: {integrity: sha512-8kNkSb7h4DkJlDn4C8v0V2IJQhAswPE4kHE45xAp6eKDEJw7PlHsiYIm46A6owpr57W3KS/xnTVVGE4p/5PijA==}
     peerDependencies:
-      prettier: ^3.0.2
+      prettier: ^3.1.0
     dependencies:
       prettier: 3.1.0
     dev: true
@@ -2408,7 +2405,7 @@ packages:
   /@types/bn.js@5.1.5:
     resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==}
     dependencies:
-      '@types/node': 20.10.0
+      '@types/node': 20.10.1
     dev: true
 
   /@types/chai-as-promised@7.1.8:
@@ -2424,16 +2421,16 @@ packages:
   /@types/connect@3.4.38:
     resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
     dependencies:
-      '@types/node': 20.10.0
+      '@types/node': 20.10.1
 
   /@types/eslint-plugin-prettier@3.1.3:
     resolution: {integrity: sha512-Jk+lgBZM0u9ETUyqe2HvykL1j6uE7L1oEqbInWtsVHT6sP+AdwLb4ncmQBqASTS+YzYOPF6hKX0zgEhblRMjqA==}
     dependencies:
-      '@types/eslint': 8.44.7
+      '@types/eslint': 8.44.8
     dev: true
 
-  /@types/eslint@8.44.7:
-    resolution: {integrity: sha512-f5ORu2hcBbKei97U73mf+l9t4zTGl74IqZ0GQk4oVea/VS8tQZYkUveSYojk+frraAVYId0V2WC9O4PTNru2FQ==}
+  /@types/eslint@8.44.8:
+    resolution: {integrity: sha512-4K8GavROwhrYl2QXDXm0Rv9epkA8GBFu0EI+XrrnnuCl7u8CWBRusX7fXJfanhZTDWSAL24gDI/UqXyUM0Injw==}
     dependencies:
       '@types/estree': 1.0.5
       '@types/json-schema': 7.0.15
@@ -2446,7 +2443,7 @@ packages:
   /@types/graceful-fs@4.1.9:
     resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==}
     dependencies:
-      '@types/node': 20.10.0
+      '@types/node': 20.10.1
     dev: true
 
   /@types/istanbul-lib-coverage@2.0.6:
@@ -2487,15 +2484,15 @@ packages:
   /@types/node-fetch@2.6.9:
     resolution: {integrity: sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA==}
     dependencies:
-      '@types/node': 20.10.0
+      '@types/node': 20.10.1
       form-data: 4.0.0
     dev: true
 
   /@types/node@12.20.55:
     resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==}
 
-  /@types/node@20.10.0:
-    resolution: {integrity: sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==}
+  /@types/node@20.10.1:
+    resolution: {integrity: sha512-T2qwhjWwGH81vUEx4EXmBKsTJRXFXNZTL4v0gi01+zyBmCwzE6TyHszqX01m+QHTEq+EZNo13NeJIdEqf+Myrg==}
     dependencies:
       undici-types: 5.26.5
 
@@ -2514,7 +2511,7 @@ packages:
   /@types/ws@7.4.7:
     resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==}
     dependencies:
-      '@types/node': 20.10.0
+      '@types/node': 20.10.1
 
   /@types/yargs-parser@21.0.3:
     resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==}
@@ -3241,6 +3238,10 @@ packages:
       bs58: 4.0.1
       text-encoding-utf-8: 1.0.2
 
+  /borsh@2.0.0:
+    resolution: {integrity: sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==}
+    dev: false
+
   /bplist-parser@0.2.0:
     resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==}
     engines: {node: '>= 5.10.0'}
@@ -3600,7 +3601,7 @@ packages:
     engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
     dev: true
 
-  /create-jest@29.7.0(@types/node@20.10.0)(ts-node@10.9.1):
+  /create-jest@29.7.0(@types/node@20.10.1)(ts-node@10.9.1):
     resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     hasBin: true
@@ -3609,7 +3610,7 @@ packages:
       chalk: 4.1.2
       exit: 0.1.2
       graceful-fs: 4.2.11
-      jest-config: 29.7.0(@types/node@20.10.0)(ts-node@10.9.1)
+      jest-config: 29.7.0(@types/node@20.10.1)(ts-node@10.9.1)
       jest-util: 29.7.0
       prompts: 2.4.2
     transitivePeerDependencies:
@@ -4141,7 +4142,7 @@ packages:
       '@typescript-eslint/eslint-plugin': 6.13.1(@typescript-eslint/parser@6.13.1)(eslint@8.54.0)(typescript@5.3.2)
       '@typescript-eslint/utils': 5.62.0(eslint@8.54.0)(typescript@5.3.2)
       eslint: 8.54.0
-      jest: 29.7.0(@types/node@20.10.0)(ts-node@10.9.1)
+      jest: 29.7.0(@types/node@20.10.1)(ts-node@10.9.1)
     transitivePeerDependencies:
       - supports-color
       - typescript
@@ -4158,7 +4159,7 @@ packages:
       rambda: 7.5.0
     dev: true
 
-  /eslint-plugin-prettier@5.0.1(@types/eslint@8.44.7)(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.1.0):
+  /eslint-plugin-prettier@5.0.1(@types/eslint@8.44.8)(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.1.0):
     resolution: {integrity: sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==}
     engines: {node: ^14.18.0 || >=16.0.0}
     peerDependencies:
@@ -4172,7 +4173,7 @@ packages:
       eslint-config-prettier:
         optional: true
     dependencies:
-      '@types/eslint': 8.44.7
+      '@types/eslint': 8.44.8
       eslint: 8.54.0
       eslint-config-prettier: 9.0.0(eslint@8.54.0)
       prettier: 3.1.0
@@ -5342,7 +5343,7 @@ packages:
       '@jest/expect': 29.7.0
       '@jest/test-result': 29.7.0
       '@jest/types': 29.6.3
-      '@types/node': 20.10.0
+      '@types/node': 20.10.1
       chalk: 4.1.2
       co: 4.6.0
       dedent: 1.5.1
@@ -5363,7 +5364,7 @@ packages:
       - supports-color
     dev: true
 
-  /jest-cli@29.7.0(@types/node@20.10.0)(ts-node@10.9.1):
+  /jest-cli@29.7.0(@types/node@20.10.1)(ts-node@10.9.1):
     resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     hasBin: true
@@ -5377,10 +5378,10 @@ packages:
       '@jest/test-result': 29.7.0
       '@jest/types': 29.6.3
       chalk: 4.1.2
-      create-jest: 29.7.0(@types/node@20.10.0)(ts-node@10.9.1)
+      create-jest: 29.7.0(@types/node@20.10.1)(ts-node@10.9.1)
       exit: 0.1.2
       import-local: 3.1.0
-      jest-config: 29.7.0(@types/node@20.10.0)(ts-node@10.9.1)
+      jest-config: 29.7.0(@types/node@20.10.1)(ts-node@10.9.1)
       jest-util: 29.7.0
       jest-validate: 29.7.0
       yargs: 17.7.2
@@ -5391,7 +5392,7 @@ packages:
       - ts-node
     dev: true
 
-  /jest-config@29.7.0(@types/node@20.10.0)(ts-node@10.9.1):
+  /jest-config@29.7.0(@types/node@20.10.1)(ts-node@10.9.1):
     resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     peerDependencies:
@@ -5406,7 +5407,7 @@ packages:
       '@babel/core': 7.23.2
       '@jest/test-sequencer': 29.7.0
       '@jest/types': 29.6.3
-      '@types/node': 20.10.0
+      '@types/node': 20.10.1
       babel-jest: 29.7.0(@babel/core@7.23.2)
       chalk: 4.1.2
       ci-info: 3.9.0
@@ -5426,7 +5427,7 @@ packages:
       pretty-format: 29.7.0
       slash: 3.0.0
       strip-json-comments: 3.1.1
-      ts-node: 10.9.1(@types/node@20.10.0)(typescript@5.3.2)
+      ts-node: 10.9.1(@types/node@20.10.1)(typescript@5.3.2)
     transitivePeerDependencies:
       - babel-plugin-macros
       - supports-color
@@ -5467,7 +5468,7 @@ packages:
       '@jest/environment': 29.7.0
       '@jest/fake-timers': 29.7.0
       '@jest/types': 29.6.3
-      '@types/node': 20.10.0
+      '@types/node': 20.10.1
       jest-mock: 29.7.0
       jest-util: 29.7.0
     dev: true
@@ -5483,7 +5484,7 @@ packages:
     dependencies:
       '@jest/types': 29.6.3
       '@types/graceful-fs': 4.1.9
-      '@types/node': 20.10.0
+      '@types/node': 20.10.1
       anymatch: 3.1.3
       fb-watchman: 2.0.2
       graceful-fs: 4.2.11
@@ -5534,7 +5535,7 @@ packages:
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
       '@jest/types': 29.6.3
-      '@types/node': 20.10.0
+      '@types/node': 20.10.1
       jest-util: 29.7.0
     dev: true
 
@@ -5589,7 +5590,7 @@ packages:
       '@jest/test-result': 29.7.0
       '@jest/transform': 29.7.0
       '@jest/types': 29.6.3
-      '@types/node': 20.10.0
+      '@types/node': 20.10.1
       chalk: 4.1.2
       emittery: 0.13.1
       graceful-fs: 4.2.11
@@ -5620,7 +5621,7 @@ packages:
       '@jest/test-result': 29.7.0
       '@jest/transform': 29.7.0
       '@jest/types': 29.6.3
-      '@types/node': 20.10.0
+      '@types/node': 20.10.1
       chalk: 4.1.2
       cjs-module-lexer: 1.2.3
       collect-v8-coverage: 1.0.2
@@ -5672,7 +5673,7 @@ packages:
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
       '@jest/types': 29.6.3
-      '@types/node': 20.10.0
+      '@types/node': 20.10.1
       chalk: 4.1.2
       ci-info: 3.9.0
       graceful-fs: 4.2.11
@@ -5697,7 +5698,7 @@ packages:
     dependencies:
       '@jest/test-result': 29.7.0
       '@jest/types': 29.6.3
-      '@types/node': 20.10.0
+      '@types/node': 20.10.1
       ansi-escapes: 4.3.2
       chalk: 4.1.2
       emittery: 0.13.1
@@ -5709,13 +5710,13 @@ packages:
     resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@types/node': 20.10.0
+      '@types/node': 20.10.1
       jest-util: 29.7.0
       merge-stream: 2.0.0
       supports-color: 8.1.1
     dev: true
 
-  /jest@29.7.0(@types/node@20.10.0)(ts-node@10.9.1):
+  /jest@29.7.0(@types/node@20.10.1)(ts-node@10.9.1):
     resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     hasBin: true
@@ -5728,7 +5729,7 @@ packages:
       '@jest/core': 29.7.0(ts-node@10.9.1)
       '@jest/types': 29.6.3
       import-local: 3.1.0
-      jest-cli: 29.7.0(@types/node@20.10.0)(ts-node@10.9.1)
+      jest-cli: 29.7.0(@types/node@20.10.1)(ts-node@10.9.1)
     transitivePeerDependencies:
       - '@types/node'
       - babel-plugin-macros
@@ -6675,7 +6676,7 @@ packages:
       glob: 10.3.10
     dev: true
 
-  /rollup-plugin-dts@6.1.0(rollup@4.6.0)(typescript@5.3.2):
+  /rollup-plugin-dts@6.1.0(rollup@4.6.1)(typescript@5.3.2):
     resolution: {integrity: sha512-ijSCPICkRMDKDLBK9torss07+8dl9UpY9z1N/zTeA1cIqdzMlpkV3MOOC7zukyvQfDyxa1s3Dl2+DeiP/G6DOw==}
     engines: {node: '>=16'}
     peerDependencies:
@@ -6683,29 +6684,29 @@ packages:
       typescript: ^4.5 || ^5.0
     dependencies:
       magic-string: 0.30.5
-      rollup: 4.6.0
+      rollup: 4.6.1
       typescript: 5.3.2
     optionalDependencies:
       '@babel/code-frame': 7.22.13
     dev: true
 
-  /rollup@4.6.0:
-    resolution: {integrity: sha512-R8i5Her4oO1LiMQ3jKf7MUglYV/mhQ5g5OKeld5CnkmPdIGo79FDDQYqPhq/PCVuTQVuxsWgIbDy9F+zdHn80w==}
+  /rollup@4.6.1:
+    resolution: {integrity: sha512-jZHaZotEHQaHLgKr8JnQiDT1rmatjgKlMekyksz+yk9jt/8z9quNjnKNRoaM0wd9DC2QKXjmWWuDYtM3jfF8pQ==}
     engines: {node: '>=18.0.0', npm: '>=8.0.0'}
     hasBin: true
     optionalDependencies:
-      '@rollup/rollup-android-arm-eabi': 4.6.0
-      '@rollup/rollup-android-arm64': 4.6.0
-      '@rollup/rollup-darwin-arm64': 4.6.0
-      '@rollup/rollup-darwin-x64': 4.6.0
-      '@rollup/rollup-linux-arm-gnueabihf': 4.6.0
-      '@rollup/rollup-linux-arm64-gnu': 4.6.0
-      '@rollup/rollup-linux-arm64-musl': 4.6.0
-      '@rollup/rollup-linux-x64-gnu': 4.6.0
-      '@rollup/rollup-linux-x64-musl': 4.6.0
-      '@rollup/rollup-win32-arm64-msvc': 4.6.0
-      '@rollup/rollup-win32-ia32-msvc': 4.6.0
-      '@rollup/rollup-win32-x64-msvc': 4.6.0
+      '@rollup/rollup-android-arm-eabi': 4.6.1
+      '@rollup/rollup-android-arm64': 4.6.1
+      '@rollup/rollup-darwin-arm64': 4.6.1
+      '@rollup/rollup-darwin-x64': 4.6.1
+      '@rollup/rollup-linux-arm-gnueabihf': 4.6.1
+      '@rollup/rollup-linux-arm64-gnu': 4.6.1
+      '@rollup/rollup-linux-arm64-musl': 4.6.1
+      '@rollup/rollup-linux-x64-gnu': 4.6.1
+      '@rollup/rollup-linux-x64-musl': 4.6.1
+      '@rollup/rollup-win32-arm64-msvc': 4.6.1
+      '@rollup/rollup-win32-ia32-msvc': 4.6.1
+      '@rollup/rollup-win32-x64-msvc': 4.6.1
       fsevents: 2.3.3
     dev: true
 
@@ -7297,7 +7298,7 @@ packages:
       '@babel/core': 7.23.2
       bs-logger: 0.2.6
       fast-json-stable-stringify: 2.1.0
-      jest: 29.7.0(@types/node@20.10.0)(ts-node@10.9.1)
+      jest: 29.7.0(@types/node@20.10.1)(ts-node@10.9.1)
       jest-util: 29.7.0
       json5: 2.2.3
       lodash.memoize: 4.1.2
@@ -7307,7 +7308,7 @@ packages:
       yargs-parser: 21.1.1
     dev: true
 
-  /ts-node@10.9.1(@types/node@20.10.0)(typescript@5.3.2):
+  /ts-node@10.9.1(@types/node@20.10.1)(typescript@5.3.2):
     resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==}
     hasBin: true
     peerDependencies:
@@ -7326,7 +7327,7 @@ packages:
       '@tsconfig/node12': 1.0.11
       '@tsconfig/node14': 1.0.3
       '@tsconfig/node16': 1.0.4
-      '@types/node': 20.10.0
+      '@types/node': 20.10.1
       acorn: 8.11.2
       acorn-walk: 8.3.0
       arg: 4.1.3
@@ -7365,8 +7366,8 @@ packages:
       typescript: 5.3.2
     dev: true
 
-  /tsx@4.6.0:
-    resolution: {integrity: sha512-HLHaDQ78mly4Pd5co6tWQOiNVYoYYAPUcwSSZK4bcs3zSEsg+/67LS/ReHook0E7DKPfe1J5jc0ocIhUrnaR4w==}
+  /tsx@4.6.1:
+    resolution: {integrity: sha512-OQ4TAPHXAPUo/NZAmmIybl0o8LFOTlycQxFepLBAp6EV87U88fOKYGCQI2viGAEOVU9UW/cgQcxcOMnfEKVY3Q==}
     engines: {node: '>=18.0.0'}
     hasBin: true
     dependencies:
diff --git a/single-pool/js/packages/classic/package.json b/single-pool/js/packages/classic/package.json
index 4559f3dfe..097d52ec1 100644
--- a/single-pool/js/packages/classic/package.json
+++ b/single-pool/js/packages/classic/package.json
@@ -18,7 +18,7 @@
     "test": "sed -i '1s/.*/{ \"type\": \"module\",/' package.json && NODE_OPTIONS='--loader=tsx' ava ; ret=$?; sed -i '1s/.*/{/' package.json && exit $ret"
   },
   "devDependencies": {
-    "@types/node": "^20.10.0",
+    "@types/node": "^20.10.1",
     "@ava/typescript": "^4.1.0",
     "@typescript-eslint/eslint-plugin": "^6.13.1",
     "ava": "^5.3.1",
@@ -26,7 +26,7 @@
     "eslint-config-prettier": "^9.0.0",
     "eslint-plugin-prettier": "^5.0.1",
     "solana-bankrun": "^0.2.0",
-    "tsx": "^4.6.0",
+    "tsx": "^4.6.1",
     "typescript": "^5.3.2"
   },
   "dependencies": {
diff --git a/single-pool/js/packages/modern/package.json b/single-pool/js/packages/modern/package.json
index 456f3857d..d1975c1d0 100644
--- a/single-pool/js/packages/modern/package.json
+++ b/single-pool/js/packages/modern/package.json
@@ -16,7 +16,7 @@
     "lint:fix": "eslint . --fix"
   },
   "devDependencies": {
-    "@types/node": "^20.10.0",
+    "@types/node": "^20.10.1",
     "@typescript-eslint/eslint-plugin": "^6.13.1",
     "eslint": "^8.54.0",
     "eslint-config-prettier": "^9.0.0",
diff --git a/stake-pool/js/package.json b/stake-pool/js/package.json
index d7d8700e4..854f9cc22 100644
--- a/stake-pool/js/package.json
+++ b/stake-pool/js/package.json
@@ -61,7 +61,7 @@
     "@rollup/plugin-typescript": "^11.1.0",
     "@types/bn.js": "^5.1.0",
     "@types/jest": "^29.5.10",
-    "@types/node": "^20.10.0",
+    "@types/node": "^20.10.1",
     "@types/node-fetch": "^2.6.3",
     "@typescript-eslint/eslint-plugin": "^6.13.1",
     "@typescript-eslint/parser": "^6.13.1",
@@ -72,7 +72,7 @@
     "jest": "^29.0.0",
     "prettier": "^3.1.0",
     "rimraf": "^5.0.0",
-    "rollup": "^4.6.0",
+    "rollup": "^4.6.1",
     "rollup-plugin-dts": "^6.1.0",
     "ts-jest": "^29.0.0",
     "typescript": "^5.3.2"
diff --git a/token-lending/js/package.json b/token-lending/js/package.json
index 36b969512..0aab76fb3 100644
--- a/token-lending/js/package.json
+++ b/token-lending/js/package.json
@@ -46,9 +46,9 @@
         "@rollup/plugin-typescript": "^11.1.1",
         "@solana/spl-token": "workspace:*",
         "@solana/web3.js": "^1.87.6",
-        "@types/eslint": "^8.4.1",
+        "@types/eslint": "^8.44.8",
         "@types/eslint-plugin-prettier": "^3.1.0",
-        "@types/node": "^20.10.0",
+        "@types/node": "^20.10.1",
         "@typescript-eslint/eslint-plugin": "^6.13.1",
         "@typescript-eslint/parser": "^6.13.1",
         "eslint": "^8.54.0",
@@ -56,7 +56,7 @@
         "eslint-plugin-prettier": "^5.0.1",
         "gh-pages": "^6.1.0",
         "prettier": "^3.1.0",
-        "rollup": "^4.6.0",
+        "rollup": "^4.6.1",
         "ts-node": "^10.7.0",
         "tslib": "^2.3.0",
         "typedoc": "^0.25.4",
diff --git a/token-metadata/js/package.json b/token-metadata/js/package.json
index 314881d81..82de6c21e 100644
--- a/token-metadata/js/package.json
+++ b/token-metadata/js/package.json
@@ -58,7 +58,7 @@
         "@solana/web3.js": "^1.87.6",
         "@types/chai": "^4.3.11",
         "@types/mocha": "^10.0.6",
-        "@types/node": "^20.10.0",
+        "@types/node": "^20.10.1",
         "@typescript-eslint/eslint-plugin": "^6.13.1",
         "@typescript-eslint/parser": "^6.13.1",
         "chai": "^4.3.6",
diff --git a/token/js/package.json b/token/js/package.json
index 2da412922..eaaf39d5e 100644
--- a/token/js/package.json
+++ b/token/js/package.json
@@ -64,7 +64,7 @@
         "@types/chai-as-promised": "^7.1.4",
         "@types/chai": "^4.3.11",
         "@types/mocha": "^10.0.6",
-        "@types/node": "^20.10.0",
+        "@types/node": "^20.10.1",
         "@types/node-fetch": "^2.6.2",
         "@typescript-eslint/eslint-plugin": "^6.13.1",
         "@typescript-eslint/parser": "^6.13.1",
diff --git a/token/program-2022/src/extension/confidential_transfer/instruction.rs b/token/program-2022/src/extension/confidential_transfer/instruction.rs
index 49e055a5f..abb3b47fe 100644
--- a/token/program-2022/src/extension/confidential_transfer/instruction.rs
+++ b/token/program-2022/src/extension/confidential_transfer/instruction.rs
@@ -399,14 +399,14 @@ pub enum ConfidentialTransferInstruction {
     ///   5. `[]` Context state account for
     ///      `VerifyBatchedGroupedCiphertext2HandlesValidityProof`.
     ///   6. `[]` Context state account for `VerifyBatchedRangeProofU128`.
-    ///   7. `[signer]` The source account owner.
     ///   If `close_split_context_state_on_execution` is set, all context state
-    ///     accounts must be `writable` and the following additional sequence
-    ///     of accounts are needed:
-    ///   8. `[]` The destination account for lamports from the context state
+    ///     accounts must be `writable` and the following sequence
+    ///     of accounts that are marked with asterisk are needed:
+    ///   7*. `[]` The destination account for lamports from the context state
     ///      accounts.
-    ///   9. `[signer]` The context state account owner.
-    ///   10. `[]` The zk token proof program.
+    ///   8*. `[signer]` The context state account owner.
+    ///   9*. `[]` The zk token proof program.
+    ///   10. `[signer]` The source account owner.
     ///
     ///   * Transfer with fee
     ///   1. `[writable]` The source SPL Token account.
@@ -420,14 +420,14 @@ pub enum ConfidentialTransferInstruction {
     ///   7. `[]` Context state account for
     ///      `VerifyBatchedGroupedCiphertext2HandlesValidityProof`.
     ///   8. `[]` Context state account for `VerifyBatchedRangeProofU256`.
-    ///   9. `[signer]` The source account owner.
     ///   If `close_split_context_state_on_execution` is set, all context state
-    ///     accounts must be   `writable` and the following additional sequence
-    ///     of accounts are needed:
-    ///   10. `[]` The destination account for lamports from the context state
+    ///     accounts must be  `writable` and the following sequence
+    ///     of accounts that are marked with asterisk are needed:
+    ///   9*. `[]` The destination account for lamports from the context state
     ///       accounts.
-    ///   11. `[signer]` The context state account owner.
-    ///   12. `[]` The zk token proof program.
+    ///   10*. `[signer]` The context state account owner.
+    ///   11*. `[]` The zk token proof program.
+    ///   12. `[signer]` The source account owner.
     ///
     /// Data expected by this instruction:
     ///   `TransferWithSplitProofsInstructionData`
@@ -1389,7 +1389,6 @@ pub fn transfer_with_split_proofs(
                 false,
             ));
             accounts.push(AccountMeta::new(*context_accounts.range_proof, false));
-            accounts.push(AccountMeta::new_readonly(*source_account_authority, true));
             accounts.push(AccountMeta::new(
                 *close_split_context_state_on_execution_accounts.lamport_destination,
                 false,
@@ -1399,6 +1398,7 @@ pub fn transfer_with_split_proofs(
                 *close_split_context_state_on_execution_accounts.zk_token_proof_program,
                 false,
             ));
+            accounts.push(AccountMeta::new_readonly(*source_account_authority, true));
             true
         } else {
             // If `close_split_context_state_accounts` is not set, then context state
@@ -1473,7 +1473,6 @@ pub fn transfer_with_fee_and_split_proofs(
                 false,
             ));
             accounts.push(AccountMeta::new(*context_accounts.range_proof, false));
-            accounts.push(AccountMeta::new_readonly(*source_account_authority, true));
             accounts.push(AccountMeta::new(
                 *close_split_context_state_on_execution_accounts.lamport_destination,
                 false,
@@ -1483,6 +1482,7 @@ pub fn transfer_with_fee_and_split_proofs(
                 *close_split_context_state_on_execution_accounts.zk_token_proof_program,
                 false,
             ));
+            accounts.push(AccountMeta::new_readonly(*source_account_authority, true));
             true
         } else {
             // If `close_split_context_state_accounts` is not set, then context state
@@ -1508,7 +1508,6 @@ pub fn transfer_with_fee_and_split_proofs(
                 false,
             ));
             accounts.push(AccountMeta::new_readonly(*source_account_authority, true));
-
             false
         };
 
diff --git a/token/program-2022/src/extension/confidential_transfer/processor.rs b/token/program-2022/src/extension/confidential_transfer/processor.rs
index f99b24014..71359673d 100644
--- a/token/program-2022/src/extension/confidential_transfer/processor.rs
+++ b/token/program-2022/src/extension/confidential_transfer/processor.rs
@@ -1164,13 +1164,6 @@ pub(crate) fn process_instruction(
             {
                 let data =
                     decode_instruction_data::<TransferWithSplitProofsInstructionData>(input)?;
-
-                // Remove this error on the next Solana version upgrade.
-                if data.close_split_context_state_on_execution.into() {
-                    msg!("Auto-close of context state account is not yet supported");
-                    return Err(ProgramError::InvalidInstructionData);
-                }
-
                 process_transfer(
                     program_id,
                     accounts,
diff --git a/token/program-2022/src/extension/confidential_transfer/verify_proof.rs b/token/program-2022/src/extension/confidential_transfer/verify_proof.rs
index 5f5e10025..13c6001ba 100644
--- a/token/program-2022/src/extension/confidential_transfer/verify_proof.rs
+++ b/token/program-2022/src/extension/confidential_transfer/verify_proof.rs
@@ -188,6 +188,7 @@ pub fn verify_transfer_proof(
         if close_split_context_state_on_execution {
             let lamport_destination_account_info = next_account_info(account_info_iter)?;
             let context_state_account_authority_info = next_account_info(account_info_iter)?;
+            let _zk_token_proof_program = next_account_info(account_info_iter)?;
 
             msg!("Closing equality proof context state account");
             invoke(
@@ -363,6 +364,7 @@ pub fn verify_transfer_with_fee_proof(
         if close_split_context_state_on_execution {
             let lamport_destination_account_info = next_account_info(account_info_iter)?;
             let context_state_account_authority_info = next_account_info(account_info_iter)?;
+            let _zk_token_proof_program = next_account_info(account_info_iter)?;
 
             msg!("Closing equality proof context state account");
             invoke(


Test patch:
diff --git a/token/program-2022-test/tests/confidential_transfer.rs b/token/program-2022-test/tests/confidential_transfer.rs
index 8181ae680..70658ec92 100644
--- a/token/program-2022-test/tests/confidential_transfer.rs
+++ b/token/program-2022-test/tests/confidential_transfer.rs
@@ -20,7 +20,8 @@ use {
                 self,
                 account_info::TransferAccountInfo,
                 instruction::{
-                    TransferSplitContextStateAccounts, TransferWithFeeSplitContextStateAccounts,
+                    CloseSplitContextStateAccounts, TransferSplitContextStateAccounts,
+                    TransferWithFeeSplitContextStateAccounts,
                 },
                 ConfidentialTransferAccount, MAXIMUM_DEPOSIT_TRANSFER_AMOUNT,
             },
@@ -2668,21 +2669,33 @@ async fn confidential_transfer_transfer_with_split_proof_contexts_in_parallel()
     let ciphertext_validity_proof_context_state_account = Keypair::new();
     let range_proof_context_state_account = Keypair::new();
 
+    let lamport_destination = Pubkey::new_unique();
+
+    let close_split_context_state_accounts = CloseSplitContextStateAccounts {
+        lamport_destination: &lamport_destination,
+        zk_token_proof_program: &zk_token_proof_program::id(),
+    };
+
     let transfer_context_state_accounts = TransferSplitContextStateAccounts {
         equality_proof: &equality_proof_context_state_account.pubkey(),
         ciphertext_validity_proof: &ciphertext_validity_proof_context_state_account.pubkey(),
         range_proof: &range_proof_context_state_account.pubkey(),
         authority: &context_state_authority.pubkey(),
         no_op_on_uninitialized_split_context_state: true,
-        close_split_context_state_accounts: None,
+        close_split_context_state_accounts: Some(close_split_context_state_accounts),
     };
 
     let equality_and_ciphertext_proof_signers = vec![
         &alice,
         &equality_proof_context_state_account,
         &ciphertext_validity_proof_context_state_account,
+        &context_state_authority,
+    ];
+    let range_proof_signers = vec![
+        &alice,
+        &range_proof_context_state_account,
+        &context_state_authority,
     ];
-    let range_proof_signers = vec![&alice, &range_proof_context_state_account];
     token
         .confidential_transfer_transfer_with_split_proofs_in_parallel(
             &alice_meta.token_account,
@@ -2724,6 +2737,27 @@ async fn confidential_transfer_transfer_with_split_proof_contexts_in_parallel()
             },
         )
         .await;
+
+    let error = token
+        .get_account(equality_proof_context_state_account.pubkey())
+        .await
+        .unwrap_err();
+    assert_eq!(error, TokenClientError::AccountNotFound);
+
+    let error = token
+        .get_account(ciphertext_validity_proof_context_state_account.pubkey())
+        .await
+        .unwrap_err();
+    assert_eq!(error, TokenClientError::AccountNotFound);
+
+    let error = token
+        .get_account(range_proof_context_state_account.pubkey())
+        .await
+        .unwrap_err();
+    assert_eq!(error, TokenClientError::AccountNotFound);
+
+    let lamport_destination = token.get_account(lamport_destination).await.unwrap();
+    assert!(lamport_destination.lamports > 0);
 }
 
 #[tokio::test]
@@ -3043,6 +3077,13 @@ async fn confidential_transfer_transfer_with_fee_and_split_proof_context_in_para
     let fee_ciphertext_validity_proof_context_state_account = Keypair::new();
     let range_proof_context_state_account = Keypair::new();
 
+    let lamport_destination = Pubkey::new_unique();
+
+    let close_split_context_state_accounts = CloseSplitContextStateAccounts {
+        lamport_destination: &lamport_destination,
+        zk_token_proof_program: &zk_token_proof_program::id(),
+    };
+
     let transfer_context_state_accounts = TransferWithFeeSplitContextStateAccounts {
         equality_proof: &equality_proof_context_state_account.pubkey(),
         transfer_amount_ciphertext_validity_proof:
@@ -3053,20 +3094,26 @@ async fn confidential_transfer_transfer_with_fee_and_split_proof_context_in_para
         range_proof: &range_proof_context_state_account.pubkey(),
         authority: &context_state_authority.pubkey(),
         no_op_on_uninitialized_split_context_state: true,
-        close_split_context_state_accounts: None,
+        close_split_context_state_accounts: Some(close_split_context_state_accounts),
     };
 
     let equality_and_ciphertext_proof_signers = vec![
         &alice,
         &equality_proof_context_state_account,
         &transfer_amount_ciphertext_validity_proof_context_state_account,
+        &context_state_authority,
     ];
     let fee_sigma_proof_signers = vec![
         &alice,
         &fee_sigma_proof_context_state_account,
         &fee_ciphertext_validity_proof_context_state_account,
+        &context_state_authority,
+    ];
+    let range_proof_signers = vec![
+        &alice,
+        &range_proof_context_state_account,
+        &context_state_authority,
     ];
-    let range_proof_signers = vec![&alice, &range_proof_context_state_account];
     token
         .confidential_transfer_transfer_with_fee_and_split_proofs_in_parallel(
             &alice_meta.token_account,
@@ -3113,4 +3160,37 @@ async fn confidential_transfer_transfer_with_fee_and_split_proof_context_in_para
             },
         )
         .await;
+
+    let error = token
+        .get_account(equality_proof_context_state_account.pubkey())
+        .await
+        .unwrap_err();
+    assert_eq!(error, TokenClientError::AccountNotFound);
+
+    let error = token
+        .get_account(transfer_amount_ciphertext_validity_proof_context_state_account.pubkey())
+        .await
+        .unwrap_err();
+    assert_eq!(error, TokenClientError::AccountNotFound);
+
+    let error = token
+        .get_account(fee_sigma_proof_context_state_account.pubkey())
+        .await
+        .unwrap_err();
+    assert_eq!(error, TokenClientError::AccountNotFound);
+
+    let error = token
+        .get_account(fee_ciphertext_validity_proof_context_state_account.pubkey())
+        .await
+        .unwrap_err();
+    assert_eq!(error, TokenClientError::AccountNotFound);
+
+    let error = token
+        .get_account(range_proof_context_state_account.pubkey())
+        .await
+        .unwrap_err();
+    assert_eq!(error, TokenClientError::AccountNotFound);
+
+    let lamport_destination = token.get_account(lamport_destination).await.unwrap();
+    assert!(lamport_destination.lamports > 0);
 }