@solana/web3.js 1.32.2 → 1.32.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solana/web3.js",
3
- "version": "1.32.2",
3
+ "version": "1.32.3",
4
4
  "description": "Solana Javascript API",
5
5
  "keywords": [
6
6
  "api",
@@ -36,27 +36,6 @@
36
36
  "/module.flow.js",
37
37
  "/src"
38
38
  ],
39
- "scripts": {
40
- "build": "npm run clean; cross-env NODE_ENV=production rollup -c; npm run type:gen; npm run flow:gen; npm run flow:check",
41
- "build:fixtures": "set -ex; ./test/fixtures/noop-program/build.sh",
42
- "clean": "rimraf ./coverage ./lib",
43
- "codecov": "set -ex; npm run test:cover; cat ./coverage/lcov.info | codecov",
44
- "dev": "cross-env NODE_ENV=development rollup -c",
45
- "doc": "set -ex; typedoc --treatWarningsAsErrors",
46
- "flow:check": "flow check-contents < module.flow.js",
47
- "flow:gen": "flowgen lib/index.d.ts -o module.flow.js",
48
- "type:gen": "./scripts/typegen.sh",
49
- "lint": "set -ex; npm run pretty; eslint . --ext .js,.ts",
50
- "lint:fix": "npm run pretty:fix && eslint . --fix --ext .js,.ts",
51
- "ok": "run-s lint test doc",
52
- "pretty": "prettier --check '{,{src,test}/**/}*.{j,t}s'",
53
- "pretty:fix": "prettier --write '{,{src,test}/**/}*.{j,t}s'",
54
- "re": "semantic-release --repository-url git@github.com:solana-labs/solana-web3.js.git",
55
- "test": "mocha -r ts-node/register './test/**/*.test.ts'",
56
- "test:cover": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\" }' nyc --reporter=lcov mocha -r ts-node/register './test/**/*.test.ts'",
57
- "test:live": "TEST_LIVE=1 npm run test",
58
- "test:live-with-test-validator": "start-server-and-test 'solana-test-validator --reset --quiet' http://localhost:8899/health test:live"
59
- },
60
39
  "dependencies": {
61
40
  "@babel/runtime": "^7.12.5",
62
41
  "@ethersproject/sha2": "^5.5.0",
@@ -137,5 +116,26 @@
137
116
  },
138
117
  "engines": {
139
118
  "node": ">=12.20.0"
119
+ },
120
+ "scripts": {
121
+ "build": "npm run clean; cross-env NODE_ENV=production rollup -c; npm run type:gen; npm run flow:gen; npm run flow:check",
122
+ "build:fixtures": "set -ex; ./test/fixtures/noop-program/build.sh",
123
+ "clean": "rimraf ./coverage ./lib",
124
+ "codecov": "set -ex; npm run test:cover; cat ./coverage/lcov.info | codecov",
125
+ "dev": "cross-env NODE_ENV=development rollup -c",
126
+ "doc": "set -ex; typedoc --treatWarningsAsErrors",
127
+ "flow:check": "flow check-contents < module.flow.js",
128
+ "flow:gen": "flowgen lib/index.d.ts -o module.flow.js",
129
+ "type:gen": "./scripts/typegen.sh",
130
+ "lint": "set -ex; npm run pretty; eslint . --ext .js,.ts",
131
+ "lint:fix": "npm run pretty:fix && eslint . --fix --ext .js,.ts",
132
+ "ok": "run-s lint test doc",
133
+ "pretty": "prettier --check '{,{src,test}/**/}*.{j,t}s'",
134
+ "pretty:fix": "prettier --write '{,{src,test}/**/}*.{j,t}s'",
135
+ "re": "semantic-release --repository-url git@github.com:solana-labs/solana-web3.js.git",
136
+ "test": "mocha -r ts-node/register './test/**/*.test.ts'",
137
+ "test:cover": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\" }' nyc --reporter=lcov mocha -r ts-node/register './test/**/*.test.ts'",
138
+ "test:live": "TEST_LIVE=1 npm run test",
139
+ "test:live-with-test-validator": "start-server-and-test 'solana-test-validator --reset --quiet' http://localhost:8899/health test:live"
140
140
  }
141
- }
141
+ }
package/src/message.ts CHANGED
@@ -8,6 +8,7 @@ import * as Layout from './layout';
8
8
  import {PACKET_DATA_SIZE} from './transaction';
9
9
  import * as shortvec from './util/shortvec-encoding';
10
10
  import {toBuffer} from './util/to-buffer';
11
+ import {guardedShift, guardedSplice} from './util/guarded-array-utils';
11
12
 
12
13
  /**
13
14
  * The message header, identifying signed and read-only account
@@ -205,32 +206,28 @@ export class Message {
205
206
  // Slice up wire data
206
207
  let byteArray = [...buffer];
207
208
 
208
- const numRequiredSignatures = byteArray.shift() as number;
209
- const numReadonlySignedAccounts = byteArray.shift() as number;
210
- const numReadonlyUnsignedAccounts = byteArray.shift() as number;
209
+ const numRequiredSignatures = guardedShift(byteArray);
210
+ const numReadonlySignedAccounts = guardedShift(byteArray);
211
+ const numReadonlyUnsignedAccounts = guardedShift(byteArray);
211
212
 
212
213
  const accountCount = shortvec.decodeLength(byteArray);
213
214
  let accountKeys = [];
214
215
  for (let i = 0; i < accountCount; i++) {
215
- const account = byteArray.slice(0, PUBKEY_LENGTH);
216
- byteArray = byteArray.slice(PUBKEY_LENGTH);
216
+ const account = guardedSplice(byteArray, 0, PUBKEY_LENGTH);
217
217
  accountKeys.push(bs58.encode(Buffer.from(account)));
218
218
  }
219
219
 
220
- const recentBlockhash = byteArray.slice(0, PUBKEY_LENGTH);
221
- byteArray = byteArray.slice(PUBKEY_LENGTH);
220
+ const recentBlockhash = guardedSplice(byteArray, 0, PUBKEY_LENGTH);
222
221
 
223
222
  const instructionCount = shortvec.decodeLength(byteArray);
224
223
  let instructions: CompiledInstruction[] = [];
225
224
  for (let i = 0; i < instructionCount; i++) {
226
- const programIdIndex = byteArray.shift() as number;
225
+ const programIdIndex = guardedShift(byteArray);
227
226
  const accountCount = shortvec.decodeLength(byteArray);
228
- const accounts = byteArray.slice(0, accountCount);
229
- byteArray = byteArray.slice(accountCount);
227
+ const accounts = guardedSplice(byteArray, 0, accountCount);
230
228
  const dataLength = shortvec.decodeLength(byteArray);
231
- const dataSlice = byteArray.slice(0, dataLength);
229
+ const dataSlice = guardedSplice(byteArray, 0, dataLength);
232
230
  const data = bs58.encode(Buffer.from(dataSlice));
233
- byteArray = byteArray.slice(dataLength);
234
231
  instructions.push({
235
232
  programIdIndex,
236
233
  accounts,
@@ -10,6 +10,7 @@ import invariant from './util/assert';
10
10
  import type {Signer} from './keypair';
11
11
  import type {Blockhash} from './blockhash';
12
12
  import type {CompiledInstruction} from './message';
13
+ import {guardedSplice} from './util/guarded-array-utils';
13
14
 
14
15
  /**
15
16
  * Transaction signature as base-58 encoded string
@@ -658,8 +659,7 @@ export class Transaction {
658
659
  const signatureCount = shortvec.decodeLength(byteArray);
659
660
  let signatures = [];
660
661
  for (let i = 0; i < signatureCount; i++) {
661
- const signature = byteArray.slice(0, SIGNATURE_LENGTH);
662
- byteArray = byteArray.slice(SIGNATURE_LENGTH);
662
+ const signature = guardedSplice(byteArray, 0, SIGNATURE_LENGTH);
663
663
  signatures.push(bs58.encode(Buffer.from(signature)));
664
664
  }
665
665
 
@@ -0,0 +1,37 @@
1
+ const END_OF_BUFFER_ERROR_MESSAGE = 'Reached end of buffer unexpectedly';
2
+
3
+ /**
4
+ * Delegates to `Array#shift`, but throws if the array is zero-length.
5
+ */
6
+ export function guardedShift<T>(byteArray: T[]): T {
7
+ if (byteArray.length === 0) {
8
+ throw new Error(END_OF_BUFFER_ERROR_MESSAGE);
9
+ }
10
+ return byteArray.shift() as T;
11
+ }
12
+
13
+ /**
14
+ * Delegates to `Array#splice`, but throws if the section being spliced out extends past the end of
15
+ * the array.
16
+ */
17
+ export function guardedSplice<T>(
18
+ byteArray: T[],
19
+ ...args:
20
+ | [start: number, deleteCount?: number]
21
+ | [start: number, deleteCount: number, ...items: T[]]
22
+ ): T[] {
23
+ var _args$;
24
+ const [start] = args;
25
+ if (
26
+ args.length === 2 // Implies that `deleteCount` was supplied
27
+ ? start +
28
+ ((_args$ = args[1]) !== null && _args$ !== void 0 ? _args$ : 0) >
29
+ byteArray.length
30
+ : start >= byteArray.length
31
+ ) {
32
+ throw new Error(END_OF_BUFFER_ERROR_MESSAGE);
33
+ }
34
+ return byteArray.splice(
35
+ ...(args as Parameters<typeof Array.prototype.splice>),
36
+ );
37
+ }
@@ -9,6 +9,7 @@ import {
9
9
  import * as Layout from './layout';
10
10
  import * as shortvec from './util/shortvec-encoding';
11
11
  import {PublicKey} from './publickey';
12
+ import {guardedShift, guardedSplice} from './util/guarded-array-utils';
12
13
 
13
14
  export const VALIDATOR_INFO_KEY = new PublicKey(
14
15
  'Va1idator1nfo111111111111111111111111111111',
@@ -85,10 +86,10 @@ export class ValidatorInfo {
85
86
 
86
87
  const configKeys: Array<ConfigKey> = [];
87
88
  for (let i = 0; i < 2; i++) {
88
- const publicKey = new PublicKey(byteArray.slice(0, PUBKEY_LENGTH));
89
- byteArray = byteArray.slice(PUBKEY_LENGTH);
90
- const isSigner = byteArray.slice(0, 1)[0] === 1;
91
- byteArray = byteArray.slice(1);
89
+ const publicKey = new PublicKey(
90
+ guardedSplice(byteArray, 0, PUBKEY_LENGTH),
91
+ );
92
+ const isSigner = guardedShift(byteArray) === 1;
92
93
  configKeys.push({publicKey, isSigner});
93
94
  }
94
95