@solana/web3.js 1.9.0 → 1.9.2

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/module.flow.js CHANGED
@@ -1513,10 +1513,18 @@ declare module "@solana/web3.js" {
1513
1513
  /**
1514
1514
  * Configuration object for getParsedProgramAccounts
1515
1515
  */
1516
- declare export type GetParsedProgramAccountsConfig = Exclude<
1517
- GetProgramAccountsConfig,
1518
- "encoding" | "dataSlice"
1519
- >;
1516
+ declare export type GetParsedProgramAccountsConfig = {
1517
+ /**
1518
+ * Optional commitment level
1519
+ */
1520
+ commitment?: Commitment,
1521
+
1522
+ /**
1523
+ * Optional array of filters to apply to accounts
1524
+ */
1525
+ filters?: GetProgramAccountsFilter[],
1526
+ ...
1527
+ };
1520
1528
 
1521
1529
  /**
1522
1530
  * Information describing an account
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solana/web3.js",
3
- "version": "1.9.0",
3
+ "version": "1.9.2",
4
4
  "description": "Solana Javascript API",
5
5
  "keywords": [
6
6
  "api",
@@ -36,32 +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 generate:dts; npm run generate:flow",
41
- "build:browser-test": "rollup -c test/rollup.config.js",
42
- "build:fixtures": "set -ex; ./test/fixtures/noop-program/build.sh",
43
- "clean": "rimraf ./coverage ./lib",
44
- "codecov": "set -ex; npm run test:cover; cat ./coverage/lcov.info | codecov",
45
- "dev": "cross-env NODE_ENV=development rollup -c",
46
- "doc": "set -ex; typedoc",
47
- "doc:watch": "watch 'npm run doc' . --wait=1 --ignoreDirectoryPattern=/doc/",
48
- "generate:dts": "./scripts/typegen.sh",
49
- "generate:flow": "flowgen lib/index.d.ts -o module.flow.js",
50
- "lint": "set -ex; npm run pretty; eslint . --ext .js,.ts",
51
- "lint:fix": "npm run pretty:fix && eslint . --fix",
52
- "lint:watch": "watch 'npm run lint:fix' . --wait=1 --ignoreDirectoryPattern=/doc/",
53
- "ok": "run-s lint test doc",
54
- "pretty": "prettier --check '{,{src,test}/**/}*.{j,t}s'",
55
- "pretty:fix": "prettier --write '{,{src,test}/**/}*.{j,t}s'",
56
- "re": "semantic-release --repository-url git@github.com:solana-labs/solana-web3.js.git",
57
- "test": "mocha -r ts-node/register './test/**/*.test.ts'",
58
- "test:cover": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\" }' nyc --reporter=lcov mocha -r ts-node/register './test/**/*.test.ts'",
59
- "test:browser": "TEST_LIVE=1 npm run build:browser-test && mocha-headless-chrome -f http://localhost:8080/mocha.html --timeout 180000",
60
- "test:browser-with-server": "start-server-and-test 'http-server -p 8080' 8080 test:browser",
61
- "test:browser-with-test-validator": "start-server-and-test 'solana-test-validator --reset --quiet' http://localhost:8899/health test:browser-with-server",
62
- "test:live": "TEST_LIVE=1 npm run test",
63
- "test:live-with-test-validator": "start-server-and-test 'solana-test-validator --reset --quiet' http://localhost:8899/health test:live"
64
- },
65
39
  "dependencies": {
66
40
  "@babel/runtime": "^7.12.5",
67
41
  "bn.js": "^5.0.0",
@@ -91,7 +65,7 @@
91
65
  "@rollup/plugin-commonjs": "^18.0.0",
92
66
  "@rollup/plugin-json": "^4.1.0",
93
67
  "@rollup/plugin-multi-entry": "^4.0.0",
94
- "@rollup/plugin-node-resolve": "^11.1.1",
68
+ "@rollup/plugin-node-resolve": "^13.0.0",
95
69
  "@rollup/plugin-replace": "^2.3.4",
96
70
  "@solana/spl-token": "^0.1.2",
97
71
  "@types/bn.js": "^5.1.0",
@@ -116,6 +90,7 @@
116
90
  "eslint-plugin-mocha": "^8.0.0",
117
91
  "eslint-plugin-prettier": "^3.0.0",
118
92
  "esm": "^3.2.25",
93
+ "flow-bin": "^0.150.0",
119
94
  "flowgen": "^1.13.0",
120
95
  "http-server": "^0.12.3",
121
96
  "mocha": "^8.2.1",
@@ -136,7 +111,31 @@
136
111
  "ts-node": "^9.1.1",
137
112
  "tslib": "^2.1.0",
138
113
  "typedoc": "^0.20.31",
139
- "typescript": "^4.1.5",
140
- "watch": "^1.0.2"
114
+ "typescript": "^4.1.5"
115
+ },
116
+ "scripts": {
117
+ "build": "npm run clean; cross-env NODE_ENV=production rollup -c; npm run type:gen; npm run flow:gen; npm run flow:check",
118
+ "build:browser-test": "rollup -c test/rollup.config.js",
119
+ "build:fixtures": "set -ex; ./test/fixtures/noop-program/build.sh",
120
+ "clean": "rimraf ./coverage ./lib",
121
+ "codecov": "set -ex; npm run test:cover; cat ./coverage/lcov.info | codecov",
122
+ "dev": "cross-env NODE_ENV=development rollup -c",
123
+ "doc": "set -ex; typedoc",
124
+ "flow:check": "flow check-contents < module.flow.js",
125
+ "flow:gen": "flowgen lib/index.d.ts -o module.flow.js",
126
+ "type:gen": "./scripts/typegen.sh",
127
+ "lint": "set -ex; npm run pretty; eslint . --ext .js,.ts",
128
+ "lint:fix": "npm run pretty:fix && eslint . --fix",
129
+ "ok": "run-s lint test doc",
130
+ "pretty": "prettier --check '{,{src,test}/**/}*.{j,t}s'",
131
+ "pretty:fix": "prettier --write '{,{src,test}/**/}*.{j,t}s'",
132
+ "re": "semantic-release --repository-url git@github.com:solana-labs/solana-web3.js.git",
133
+ "test": "mocha -r ts-node/register './test/**/*.test.ts'",
134
+ "test:cover": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\" }' nyc --reporter=lcov mocha -r ts-node/register './test/**/*.test.ts'",
135
+ "test:browser": "TEST_LIVE=1 npm run build:browser-test && mocha-headless-chrome -f http://localhost:8080/mocha.html --timeout 180000",
136
+ "test:browser-with-server": "start-server-and-test 'http-server -p 8080' 8080 test:browser",
137
+ "test:browser-with-test-validator": "start-server-and-test 'solana-test-validator --reset --quiet' http://localhost:8899/health test:browser-with-server",
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"
141
140
  }
142
- }
141
+ }
package/src/connection.ts CHANGED
@@ -1594,10 +1594,12 @@ export type GetProgramAccountsConfig = {
1594
1594
  /**
1595
1595
  * Configuration object for getParsedProgramAccounts
1596
1596
  */
1597
- export type GetParsedProgramAccountsConfig = Exclude<
1598
- GetProgramAccountsConfig,
1599
- 'encoding' | 'dataSlice'
1600
- >;
1597
+ export type GetParsedProgramAccountsConfig = {
1598
+ /** Optional commitment level */
1599
+ commitment?: Commitment;
1600
+ /** Optional array of filters to apply to accounts */
1601
+ filters?: GetProgramAccountsFilter[];
1602
+ };
1601
1603
 
1602
1604
  /**
1603
1605
  * Information describing an account
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
@@ -178,32 +179,28 @@ export class Message {
178
179
  // Slice up wire data
179
180
  let byteArray = [...buffer];
180
181
 
181
- const numRequiredSignatures = byteArray.shift() as number;
182
- const numReadonlySignedAccounts = byteArray.shift() as number;
183
- const numReadonlyUnsignedAccounts = byteArray.shift() as number;
182
+ const numRequiredSignatures = guardedShift(byteArray);
183
+ const numReadonlySignedAccounts = guardedShift(byteArray);
184
+ const numReadonlyUnsignedAccounts = guardedShift(byteArray);
184
185
 
185
186
  const accountCount = shortvec.decodeLength(byteArray);
186
187
  let accountKeys = [];
187
188
  for (let i = 0; i < accountCount; i++) {
188
- const account = byteArray.slice(0, PUBKEY_LENGTH);
189
- byteArray = byteArray.slice(PUBKEY_LENGTH);
189
+ const account = guardedSplice(byteArray, 0, PUBKEY_LENGTH);
190
190
  accountKeys.push(bs58.encode(Buffer.from(account)));
191
191
  }
192
192
 
193
- const recentBlockhash = byteArray.slice(0, PUBKEY_LENGTH);
194
- byteArray = byteArray.slice(PUBKEY_LENGTH);
193
+ const recentBlockhash = guardedSplice(byteArray, 0, PUBKEY_LENGTH);
195
194
 
196
195
  const instructionCount = shortvec.decodeLength(byteArray);
197
196
  let instructions: CompiledInstruction[] = [];
198
197
  for (let i = 0; i < instructionCount; i++) {
199
- const programIdIndex = byteArray.shift() as number;
198
+ const programIdIndex = guardedShift(byteArray);
200
199
  const accountCount = shortvec.decodeLength(byteArray);
201
- const accounts = byteArray.slice(0, accountCount);
202
- byteArray = byteArray.slice(accountCount);
200
+ const accounts = guardedSplice(byteArray, 0, accountCount);
203
201
  const dataLength = shortvec.decodeLength(byteArray);
204
- const dataSlice = byteArray.slice(0, dataLength);
202
+ const dataSlice = guardedSplice(byteArray, 0, dataLength);
205
203
  const data = bs58.encode(Buffer.from(dataSlice));
206
- byteArray = byteArray.slice(dataLength);
207
204
  instructions.push({
208
205
  programIdIndex,
209
206
  accounts,
@@ -10,6 +10,7 @@ import {Account} from './account';
10
10
  import * as shortvec from './util/shortvec-encoding';
11
11
  import type {Blockhash} from './blockhash';
12
12
  import {toBuffer} from './util/to-buffer';
13
+ import {guardedSplice} from './util/guarded-array-utils';
13
14
 
14
15
  /**
15
16
  * Transaction signature as base-58 encoded string
@@ -655,8 +656,7 @@ export class Transaction {
655
656
  const signatureCount = shortvec.decodeLength(byteArray);
656
657
  let signatures = [];
657
658
  for (let i = 0; i < signatureCount; i++) {
658
- const signature = byteArray.slice(0, SIGNATURE_LENGTH);
659
- byteArray = byteArray.slice(SIGNATURE_LENGTH);
659
+ const signature = guardedSplice(byteArray, 0, SIGNATURE_LENGTH);
660
660
  signatures.push(bs58.encode(Buffer.from(signature)));
661
661
  }
662
662
 
@@ -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