@solana/web3.js 1.61.0 → 1.61.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/lib/index.browser.cjs.js +56 -33
- package/lib/index.browser.cjs.js.map +1 -1
- package/lib/index.browser.esm.js +56 -33
- package/lib/index.browser.esm.js.map +1 -1
- package/lib/index.cjs.js +56 -33
- package/lib/index.cjs.js.map +1 -1
- package/lib/index.esm.js +56 -33
- package/lib/index.esm.js.map +1 -1
- package/lib/index.iife.js +56 -33
- package/lib/index.iife.js.map +1 -1
- package/lib/index.iife.min.js +3 -3
- package/lib/index.iife.min.js.map +1 -1
- package/lib/index.native.js +56 -33
- package/lib/index.native.js.map +1 -1
- package/package.json +22 -22
- package/src/message/legacy.ts +9 -12
- package/src/message/v0.ts +29 -12
- package/src/programs/address-lookup-table/state.ts +1 -1
- package/src/transaction/legacy.ts +2 -2
- package/src/transaction/versioned.ts +2 -1
- package/src/utils/guarded-array-utils.ts +34 -0
- package/src/validator-info.ts +5 -4
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@solana/web3.js",
|
|
3
|
-
"version": "1.61.
|
|
3
|
+
"version": "1.61.2",
|
|
4
4
|
"description": "Solana Javascript API",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"api",
|
|
@@ -36,26 +36,6 @@
|
|
|
36
36
|
"/lib",
|
|
37
37
|
"/src"
|
|
38
38
|
],
|
|
39
|
-
"scripts": {
|
|
40
|
-
"build": "npm run clean; cross-env NODE_ENV=production rollup -c; npm run type:gen",
|
|
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
|
-
"type:gen": "./scripts/typegen.sh",
|
|
47
|
-
"lint": "set -ex; npm run pretty; eslint . --ext .js,.ts",
|
|
48
|
-
"lint:fix": "npm run pretty:fix && eslint . --fix --ext .js,.ts",
|
|
49
|
-
"type:check": "tsc -p tsconfig.json --noEmit",
|
|
50
|
-
"ok": "run-s lint test doc type:check",
|
|
51
|
-
"pretty": "prettier --check '{,{src,test}/**/}*.{j,t}s'",
|
|
52
|
-
"pretty:fix": "prettier --write '{,{src,test}/**/}*.{j,t}s'",
|
|
53
|
-
"re": "semantic-release --repository-url git@github.com:solana-labs/solana-web3.js.git",
|
|
54
|
-
"test": "cross-env TS_NODE_COMPILER_OPTIONS='{ \"module\": \"commonjs\", \"target\": \"es2019\" }' ts-mocha --require esm './test/**/*.test.ts'",
|
|
55
|
-
"test:cover": "nyc --reporter=lcov npm run test",
|
|
56
|
-
"test:live": "TEST_LIVE=1 npm run test",
|
|
57
|
-
"test:live-with-test-validator": "start-server-and-test 'solana-test-validator --reset --quiet' http://localhost:8899/health test:live"
|
|
58
|
-
},
|
|
59
39
|
"dependencies": {
|
|
60
40
|
"@babel/runtime": "^7.12.5",
|
|
61
41
|
"@noble/ed25519": "^1.7.0",
|
|
@@ -137,5 +117,25 @@
|
|
|
137
117
|
},
|
|
138
118
|
"engines": {
|
|
139
119
|
"node": ">=12.20.0"
|
|
120
|
+
},
|
|
121
|
+
"scripts": {
|
|
122
|
+
"build": "npm run clean; cross-env NODE_ENV=production rollup -c; npm run type:gen",
|
|
123
|
+
"build:fixtures": "set -ex; ./test/fixtures/noop-program/build.sh",
|
|
124
|
+
"clean": "rimraf ./coverage ./lib",
|
|
125
|
+
"codecov": "set -ex; npm run test:cover; cat ./coverage/lcov.info | codecov",
|
|
126
|
+
"dev": "cross-env NODE_ENV=development rollup -c",
|
|
127
|
+
"doc": "set -ex; typedoc --treatWarningsAsErrors",
|
|
128
|
+
"type:gen": "./scripts/typegen.sh",
|
|
129
|
+
"lint": "set -ex; npm run pretty; eslint . --ext .js,.ts",
|
|
130
|
+
"lint:fix": "npm run pretty:fix && eslint . --fix --ext .js,.ts",
|
|
131
|
+
"type:check": "tsc -p tsconfig.json --noEmit",
|
|
132
|
+
"ok": "run-s lint test doc type:check",
|
|
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": "cross-env TS_NODE_COMPILER_OPTIONS='{ \"module\": \"commonjs\", \"target\": \"es2019\" }' ts-mocha --require esm './test/**/*.test.ts'",
|
|
137
|
+
"test:cover": "nyc --reporter=lcov npm run test",
|
|
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/legacy.ts
CHANGED
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
import {TransactionInstruction} from '../transaction';
|
|
17
17
|
import {CompiledKeys} from './compiled-keys';
|
|
18
18
|
import {MessageAccountKeys} from './account-keys';
|
|
19
|
+
import {guardedShift, guardedSplice} from '../utils/guarded-array-utils';
|
|
19
20
|
|
|
20
21
|
/**
|
|
21
22
|
* An instruction to execute by a program
|
|
@@ -264,7 +265,7 @@ export class Message {
|
|
|
264
265
|
// Slice up wire data
|
|
265
266
|
let byteArray = [...buffer];
|
|
266
267
|
|
|
267
|
-
const numRequiredSignatures = byteArray
|
|
268
|
+
const numRequiredSignatures = guardedShift(byteArray);
|
|
268
269
|
if (
|
|
269
270
|
numRequiredSignatures !==
|
|
270
271
|
(numRequiredSignatures & VERSION_PREFIX_MASK)
|
|
@@ -274,31 +275,27 @@ export class Message {
|
|
|
274
275
|
);
|
|
275
276
|
}
|
|
276
277
|
|
|
277
|
-
const numReadonlySignedAccounts = byteArray
|
|
278
|
-
const numReadonlyUnsignedAccounts = byteArray
|
|
278
|
+
const numReadonlySignedAccounts = guardedShift(byteArray);
|
|
279
|
+
const numReadonlyUnsignedAccounts = guardedShift(byteArray);
|
|
279
280
|
|
|
280
281
|
const accountCount = shortvec.decodeLength(byteArray);
|
|
281
282
|
let accountKeys = [];
|
|
282
283
|
for (let i = 0; i < accountCount; i++) {
|
|
283
|
-
const account = byteArray
|
|
284
|
-
byteArray = byteArray.slice(PUBLIC_KEY_LENGTH);
|
|
284
|
+
const account = guardedSplice(byteArray, 0, PUBLIC_KEY_LENGTH);
|
|
285
285
|
accountKeys.push(new PublicKey(Buffer.from(account)));
|
|
286
286
|
}
|
|
287
287
|
|
|
288
|
-
const recentBlockhash = byteArray
|
|
289
|
-
byteArray = byteArray.slice(PUBLIC_KEY_LENGTH);
|
|
288
|
+
const recentBlockhash = guardedSplice(byteArray, 0, PUBLIC_KEY_LENGTH);
|
|
290
289
|
|
|
291
290
|
const instructionCount = shortvec.decodeLength(byteArray);
|
|
292
291
|
let instructions: CompiledInstruction[] = [];
|
|
293
292
|
for (let i = 0; i < instructionCount; i++) {
|
|
294
|
-
const programIdIndex = byteArray
|
|
293
|
+
const programIdIndex = guardedShift(byteArray);
|
|
295
294
|
const accountCount = shortvec.decodeLength(byteArray);
|
|
296
|
-
const accounts = byteArray
|
|
297
|
-
byteArray = byteArray.slice(accountCount);
|
|
295
|
+
const accounts = guardedSplice(byteArray, 0, accountCount);
|
|
298
296
|
const dataLength = shortvec.decodeLength(byteArray);
|
|
299
|
-
const dataSlice = byteArray
|
|
297
|
+
const dataSlice = guardedSplice(byteArray, 0, dataLength);
|
|
300
298
|
const data = bs58.encode(Buffer.from(dataSlice));
|
|
301
|
-
byteArray = byteArray.slice(dataLength);
|
|
302
299
|
instructions.push({
|
|
303
300
|
programIdIndex,
|
|
304
301
|
accounts,
|
package/src/message/v0.ts
CHANGED
|
@@ -16,6 +16,7 @@ import {TransactionInstruction} from '../transaction';
|
|
|
16
16
|
import {AddressLookupTableAccount} from '../programs';
|
|
17
17
|
import {CompiledKeys} from './compiled-keys';
|
|
18
18
|
import {AccountKeysFromLookups, MessageAccountKeys} from './account-keys';
|
|
19
|
+
import {guardedShift, guardedSplice} from '../utils/guarded-array-utils';
|
|
19
20
|
|
|
20
21
|
/**
|
|
21
22
|
* Message constructor arguments
|
|
@@ -391,7 +392,7 @@ export class MessageV0 {
|
|
|
391
392
|
static deserialize(serializedMessage: Uint8Array): MessageV0 {
|
|
392
393
|
let byteArray = [...serializedMessage];
|
|
393
394
|
|
|
394
|
-
const prefix = byteArray
|
|
395
|
+
const prefix = guardedShift(byteArray);
|
|
395
396
|
const maskedPrefix = prefix & VERSION_PREFIX_MASK;
|
|
396
397
|
assert(
|
|
397
398
|
prefix !== maskedPrefix,
|
|
@@ -405,29 +406,35 @@ export class MessageV0 {
|
|
|
405
406
|
);
|
|
406
407
|
|
|
407
408
|
const header: MessageHeader = {
|
|
408
|
-
numRequiredSignatures: byteArray
|
|
409
|
-
numReadonlySignedAccounts: byteArray
|
|
410
|
-
numReadonlyUnsignedAccounts: byteArray
|
|
409
|
+
numRequiredSignatures: guardedShift(byteArray),
|
|
410
|
+
numReadonlySignedAccounts: guardedShift(byteArray),
|
|
411
|
+
numReadonlyUnsignedAccounts: guardedShift(byteArray),
|
|
411
412
|
};
|
|
412
413
|
|
|
413
414
|
const staticAccountKeys = [];
|
|
414
415
|
const staticAccountKeysLength = shortvec.decodeLength(byteArray);
|
|
415
416
|
for (let i = 0; i < staticAccountKeysLength; i++) {
|
|
416
417
|
staticAccountKeys.push(
|
|
417
|
-
new PublicKey(byteArray
|
|
418
|
+
new PublicKey(guardedSplice(byteArray, 0, PUBLIC_KEY_LENGTH)),
|
|
418
419
|
);
|
|
419
420
|
}
|
|
420
421
|
|
|
421
|
-
const recentBlockhash = bs58.encode(
|
|
422
|
+
const recentBlockhash = bs58.encode(
|
|
423
|
+
guardedSplice(byteArray, 0, PUBLIC_KEY_LENGTH),
|
|
424
|
+
);
|
|
422
425
|
|
|
423
426
|
const instructionCount = shortvec.decodeLength(byteArray);
|
|
424
427
|
const compiledInstructions: MessageCompiledInstruction[] = [];
|
|
425
428
|
for (let i = 0; i < instructionCount; i++) {
|
|
426
|
-
const programIdIndex = byteArray
|
|
429
|
+
const programIdIndex = guardedShift(byteArray);
|
|
427
430
|
const accountKeyIndexesLength = shortvec.decodeLength(byteArray);
|
|
428
|
-
const accountKeyIndexes =
|
|
431
|
+
const accountKeyIndexes = guardedSplice(
|
|
432
|
+
byteArray,
|
|
433
|
+
0,
|
|
434
|
+
accountKeyIndexesLength,
|
|
435
|
+
);
|
|
429
436
|
const dataLength = shortvec.decodeLength(byteArray);
|
|
430
|
-
const data = new Uint8Array(byteArray
|
|
437
|
+
const data = new Uint8Array(guardedSplice(byteArray, 0, dataLength));
|
|
431
438
|
compiledInstructions.push({
|
|
432
439
|
programIdIndex,
|
|
433
440
|
accountKeyIndexes,
|
|
@@ -438,11 +445,21 @@ export class MessageV0 {
|
|
|
438
445
|
const addressTableLookupsCount = shortvec.decodeLength(byteArray);
|
|
439
446
|
const addressTableLookups: MessageAddressTableLookup[] = [];
|
|
440
447
|
for (let i = 0; i < addressTableLookupsCount; i++) {
|
|
441
|
-
const accountKey = new PublicKey(
|
|
448
|
+
const accountKey = new PublicKey(
|
|
449
|
+
guardedSplice(byteArray, 0, PUBLIC_KEY_LENGTH),
|
|
450
|
+
);
|
|
442
451
|
const writableIndexesLength = shortvec.decodeLength(byteArray);
|
|
443
|
-
const writableIndexes =
|
|
452
|
+
const writableIndexes = guardedSplice(
|
|
453
|
+
byteArray,
|
|
454
|
+
0,
|
|
455
|
+
writableIndexesLength,
|
|
456
|
+
);
|
|
444
457
|
const readonlyIndexesLength = shortvec.decodeLength(byteArray);
|
|
445
|
-
const readonlyIndexes =
|
|
458
|
+
const readonlyIndexes = guardedSplice(
|
|
459
|
+
byteArray,
|
|
460
|
+
0,
|
|
461
|
+
readonlyIndexesLength,
|
|
462
|
+
);
|
|
446
463
|
addressTableLookups.push({
|
|
447
464
|
accountKey,
|
|
448
465
|
writableIndexes,
|
|
@@ -12,6 +12,7 @@ import type {Signer} from '../keypair';
|
|
|
12
12
|
import type {Blockhash} from '../blockhash';
|
|
13
13
|
import type {CompiledInstruction} from '../message';
|
|
14
14
|
import {sign, verify} from '../utils/ed25519';
|
|
15
|
+
import {guardedSplice} from '../utils/guarded-array-utils';
|
|
15
16
|
|
|
16
17
|
/**
|
|
17
18
|
* Transaction signature as base-58 encoded string
|
|
@@ -803,8 +804,7 @@ export class Transaction {
|
|
|
803
804
|
const signatureCount = shortvec.decodeLength(byteArray);
|
|
804
805
|
let signatures = [];
|
|
805
806
|
for (let i = 0; i < signatureCount; i++) {
|
|
806
|
-
const signature = byteArray
|
|
807
|
-
byteArray = byteArray.slice(SIGNATURE_LENGTH_IN_BYTES);
|
|
807
|
+
const signature = guardedSplice(byteArray, 0, SIGNATURE_LENGTH_IN_BYTES);
|
|
808
808
|
signatures.push(bs58.encode(Buffer.from(signature)));
|
|
809
809
|
}
|
|
810
810
|
|
|
@@ -7,6 +7,7 @@ import {SIGNATURE_LENGTH_IN_BYTES} from './constants';
|
|
|
7
7
|
import * as shortvec from '../utils/shortvec-encoding';
|
|
8
8
|
import * as Layout from '../layout';
|
|
9
9
|
import {sign} from '../utils/ed25519';
|
|
10
|
+
import {guardedSplice} from '../utils/guarded-array-utils';
|
|
10
11
|
|
|
11
12
|
export type TransactionVersion = 'legacy' | 0;
|
|
12
13
|
|
|
@@ -81,7 +82,7 @@ export class VersionedTransaction {
|
|
|
81
82
|
const signaturesLength = shortvec.decodeLength(byteArray);
|
|
82
83
|
for (let i = 0; i < signaturesLength; i++) {
|
|
83
84
|
signatures.push(
|
|
84
|
-
new Uint8Array(byteArray
|
|
85
|
+
new Uint8Array(guardedSplice(byteArray, 0, SIGNATURE_LENGTH_IN_BYTES)),
|
|
85
86
|
);
|
|
86
87
|
}
|
|
87
88
|
|
|
@@ -0,0 +1,34 @@
|
|
|
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
|
+
const [start] = args;
|
|
24
|
+
if (
|
|
25
|
+
args.length === 2 // Implies that `deleteCount` was supplied
|
|
26
|
+
? start + (args[1] ?? 0) > byteArray.length
|
|
27
|
+
: start >= byteArray.length
|
|
28
|
+
) {
|
|
29
|
+
throw new Error(END_OF_BUFFER_ERROR_MESSAGE);
|
|
30
|
+
}
|
|
31
|
+
return byteArray.splice(
|
|
32
|
+
...(args as Parameters<typeof Array.prototype.splice>),
|
|
33
|
+
);
|
|
34
|
+
}
|
package/src/validator-info.ts
CHANGED
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
import * as Layout from './layout';
|
|
10
10
|
import * as shortvec from './utils/shortvec-encoding';
|
|
11
11
|
import {PublicKey, PUBLIC_KEY_LENGTH} from './publickey';
|
|
12
|
+
import {guardedShift, guardedSplice} from './utils/guarded-array-utils';
|
|
12
13
|
|
|
13
14
|
export const VALIDATOR_INFO_KEY = new PublicKey(
|
|
14
15
|
'Va1idator1nfo111111111111111111111111111111',
|
|
@@ -83,10 +84,10 @@ export class ValidatorInfo {
|
|
|
83
84
|
|
|
84
85
|
const configKeys: Array<ConfigKey> = [];
|
|
85
86
|
for (let i = 0; i < 2; i++) {
|
|
86
|
-
const publicKey = new PublicKey(
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
87
|
+
const publicKey = new PublicKey(
|
|
88
|
+
guardedSplice(byteArray, 0, PUBLIC_KEY_LENGTH),
|
|
89
|
+
);
|
|
90
|
+
const isSigner = guardedShift(byteArray) === 1;
|
|
90
91
|
configKeys.push({publicKey, isSigner});
|
|
91
92
|
}
|
|
92
93
|
|