@solana/transactions 2.0.0-experimental.95bfd9f → 2.0.0-experimental.99a64e9
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/LICENSE +1 -1
- package/dist/index.browser.cjs +308 -167
- package/dist/index.browser.cjs.map +1 -1
- package/dist/index.browser.js +302 -169
- package/dist/index.browser.js.map +1 -1
- package/dist/index.development.js +784 -219
- package/dist/index.development.js.map +1 -1
- package/dist/index.native.js +304 -169
- package/dist/index.native.js.map +1 -1
- package/dist/index.node.cjs +308 -167
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.js +302 -169
- package/dist/index.node.js.map +1 -1
- package/dist/index.production.min.js +16 -8
- package/dist/types/accounts.d.ts +2 -2
- package/dist/types/blockhash.d.ts +6 -1
- package/dist/types/compile-address-table-lookups.d.ts +1 -1
- package/dist/types/compile-instructions.d.ts +1 -1
- package/dist/types/compile-static-accounts.d.ts +1 -1
- package/dist/types/durable-nonce.d.ts +20 -7
- package/dist/types/fee-payer.d.ts +3 -2
- package/dist/types/index.d.ts +1 -0
- package/dist/types/serializers/header.d.ts +4 -2
- package/dist/types/serializers/index.d.ts +2 -0
- package/dist/types/serializers/transaction-version.d.ts +4 -4
- package/dist/types/signatures.d.ts +13 -6
- package/dist/types/types.d.ts +7 -0
- package/dist/types/unsigned-transaction.d.ts +4 -0
- package/dist/types/wire-transaction.d.ts +1 -1
- package/package.json +21 -18
- package/dist/types/accounts.d.ts.map +0 -1
- package/dist/types/blockhash.d.ts.map +0 -1
- package/dist/types/compile-address-table-lookups.d.ts.map +0 -1
- package/dist/types/compile-header.d.ts.map +0 -1
- package/dist/types/compile-instructions.d.ts.map +0 -1
- package/dist/types/compile-lifetime-token.d.ts.map +0 -1
- package/dist/types/compile-static-accounts.d.ts.map +0 -1
- package/dist/types/compile-transaction.d.ts.map +0 -1
- package/dist/types/create-transaction.d.ts.map +0 -1
- package/dist/types/durable-nonce.d.ts.map +0 -1
- package/dist/types/fee-payer.d.ts.map +0 -1
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/instructions.d.ts.map +0 -1
- package/dist/types/message.d.ts.map +0 -1
- package/dist/types/serializers/address-table-lookup.d.ts.map +0 -1
- package/dist/types/serializers/header.d.ts.map +0 -1
- package/dist/types/serializers/instruction.d.ts.map +0 -1
- package/dist/types/serializers/message.d.ts.map +0 -1
- package/dist/types/serializers/transaction-version.d.ts.map +0 -1
- package/dist/types/serializers/transaction.d.ts.map +0 -1
- package/dist/types/serializers/unimplemented.d.ts.map +0 -1
- package/dist/types/signatures.d.ts.map +0 -1
- package/dist/types/types.d.ts.map +0 -1
- package/dist/types/wire-transaction.d.ts.map +0 -1
|
@@ -9,7 +9,7 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
9
9
|
return value;
|
|
10
10
|
};
|
|
11
11
|
|
|
12
|
-
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-core@0.8.
|
|
12
|
+
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-core@0.8.9/node_modules/@metaplex-foundation/umi-serializers-core/dist/esm/bytes.mjs
|
|
13
13
|
var mergeBytes = (bytesArr) => {
|
|
14
14
|
const totalLength = bytesArr.reduce((total, arr) => total + arr.length, 0);
|
|
15
15
|
const result = new Uint8Array(totalLength);
|
|
@@ -29,7 +29,7 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
29
29
|
};
|
|
30
30
|
var fixBytes = (bytes2, length) => padBytes(bytes2.slice(0, length), length);
|
|
31
31
|
|
|
32
|
-
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-core@0.8.
|
|
32
|
+
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-core@0.8.9/node_modules/@metaplex-foundation/umi-serializers-core/dist/esm/errors.mjs
|
|
33
33
|
var DeserializingEmptyBufferError = class extends Error {
|
|
34
34
|
constructor(serializer) {
|
|
35
35
|
super(`Serializer [${serializer}] cannot deserialize empty buffers.`);
|
|
@@ -50,7 +50,7 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
50
50
|
}
|
|
51
51
|
};
|
|
52
52
|
|
|
53
|
-
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-core@0.8.
|
|
53
|
+
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-core@0.8.9/node_modules/@metaplex-foundation/umi-serializers-core/dist/esm/fixSerializer.mjs
|
|
54
54
|
function fixSerializer(serializer, fixedBytes, description) {
|
|
55
55
|
return {
|
|
56
56
|
description: description ?? `fixed(${fixedBytes}, ${serializer.description})`,
|
|
@@ -71,7 +71,7 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
71
71
|
};
|
|
72
72
|
}
|
|
73
73
|
|
|
74
|
-
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-core@0.8.
|
|
74
|
+
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-core@0.8.9/node_modules/@metaplex-foundation/umi-serializers-core/dist/esm/mapSerializer.mjs
|
|
75
75
|
function mapSerializer(serializer, unmap, map) {
|
|
76
76
|
return {
|
|
77
77
|
description: serializer.description,
|
|
@@ -85,7 +85,7 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
85
85
|
};
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
-
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-encodings@0.8.
|
|
88
|
+
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-encodings@0.8.9/node_modules/@metaplex-foundation/umi-serializers-encodings/dist/esm/errors.mjs
|
|
89
89
|
var InvalidBaseStringError = class extends Error {
|
|
90
90
|
constructor(value, base, cause) {
|
|
91
91
|
const message = `Expected a string of base ${base}, got [${value}].`;
|
|
@@ -95,7 +95,7 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
95
95
|
}
|
|
96
96
|
};
|
|
97
97
|
|
|
98
|
-
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-encodings@0.8.
|
|
98
|
+
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-encodings@0.8.9/node_modules/@metaplex-foundation/umi-serializers-encodings/dist/esm/baseX.mjs
|
|
99
99
|
var baseX = (alphabet) => {
|
|
100
100
|
const base = alphabet.length;
|
|
101
101
|
const baseBigInt = BigInt(base);
|
|
@@ -149,16 +149,16 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
149
149
|
};
|
|
150
150
|
};
|
|
151
151
|
|
|
152
|
-
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-encodings@0.8.
|
|
152
|
+
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-encodings@0.8.9/node_modules/@metaplex-foundation/umi-serializers-encodings/dist/esm/base58.mjs
|
|
153
153
|
var base58 = baseX("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz");
|
|
154
154
|
|
|
155
|
-
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-encodings@0.8.
|
|
155
|
+
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-encodings@0.8.9/node_modules/@metaplex-foundation/umi-serializers-encodings/dist/esm/nullCharacters.mjs
|
|
156
156
|
var removeNullCharacters = (value) => (
|
|
157
157
|
// eslint-disable-next-line no-control-regex
|
|
158
158
|
value.replace(/\u0000/g, "")
|
|
159
159
|
);
|
|
160
160
|
|
|
161
|
-
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-encodings@0.8.
|
|
161
|
+
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-encodings@0.8.9/node_modules/@metaplex-foundation/umi-serializers-encodings/dist/esm/utf8.mjs
|
|
162
162
|
var utf8 = {
|
|
163
163
|
description: "utf8",
|
|
164
164
|
fixedSize: null,
|
|
@@ -172,14 +172,14 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
172
172
|
}
|
|
173
173
|
};
|
|
174
174
|
|
|
175
|
-
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-numbers@0.8.
|
|
175
|
+
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-numbers@0.8.9/node_modules/@metaplex-foundation/umi-serializers-numbers/dist/esm/common.mjs
|
|
176
176
|
var Endian;
|
|
177
177
|
(function(Endian2) {
|
|
178
178
|
Endian2["Little"] = "le";
|
|
179
179
|
Endian2["Big"] = "be";
|
|
180
180
|
})(Endian || (Endian = {}));
|
|
181
181
|
|
|
182
|
-
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-numbers@0.8.
|
|
182
|
+
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-numbers@0.8.9/node_modules/@metaplex-foundation/umi-serializers-numbers/dist/esm/errors.mjs
|
|
183
183
|
var NumberOutOfRangeError = class extends RangeError {
|
|
184
184
|
constructor(serializer, min, max, actual) {
|
|
185
185
|
super(`Serializer [${serializer}] expected number to be between ${min} and ${max}, got ${actual}.`);
|
|
@@ -187,7 +187,7 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
187
187
|
}
|
|
188
188
|
};
|
|
189
189
|
|
|
190
|
-
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-numbers@0.8.
|
|
190
|
+
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-numbers@0.8.9/node_modules/@metaplex-foundation/umi-serializers-numbers/dist/esm/utils.mjs
|
|
191
191
|
function numberFactory(input) {
|
|
192
192
|
let littleEndian;
|
|
193
193
|
let defaultDescription = input.name;
|
|
@@ -231,7 +231,7 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
231
231
|
}
|
|
232
232
|
};
|
|
233
233
|
|
|
234
|
-
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-numbers@0.8.
|
|
234
|
+
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-numbers@0.8.9/node_modules/@metaplex-foundation/umi-serializers-numbers/dist/esm/u8.mjs
|
|
235
235
|
var u8 = (options = {}) => numberFactory({
|
|
236
236
|
name: "u8",
|
|
237
237
|
size: 1,
|
|
@@ -241,7 +241,7 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
241
241
|
options
|
|
242
242
|
});
|
|
243
243
|
|
|
244
|
-
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-numbers@0.8.
|
|
244
|
+
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-numbers@0.8.9/node_modules/@metaplex-foundation/umi-serializers-numbers/dist/esm/u32.mjs
|
|
245
245
|
var u32 = (options = {}) => numberFactory({
|
|
246
246
|
name: "u32",
|
|
247
247
|
size: 4,
|
|
@@ -251,7 +251,7 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
251
251
|
options
|
|
252
252
|
});
|
|
253
253
|
|
|
254
|
-
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-numbers@0.8.
|
|
254
|
+
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-numbers@0.8.9/node_modules/@metaplex-foundation/umi-serializers-numbers/dist/esm/shortU16.mjs
|
|
255
255
|
var shortU16 = (options = {}) => ({
|
|
256
256
|
description: options.description ?? "shortU16",
|
|
257
257
|
fixedSize: null,
|
|
@@ -288,7 +288,7 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
288
288
|
}
|
|
289
289
|
});
|
|
290
290
|
|
|
291
|
-
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers@0.8.
|
|
291
|
+
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers@0.8.9/node_modules/@metaplex-foundation/umi-serializers/dist/esm/errors.mjs
|
|
292
292
|
var InvalidNumberOfItemsError = class extends Error {
|
|
293
293
|
constructor(serializer, expected, actual) {
|
|
294
294
|
super(`Expected [${serializer}] to have ${expected} items, got ${actual}.`);
|
|
@@ -308,12 +308,12 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
308
308
|
}
|
|
309
309
|
};
|
|
310
310
|
|
|
311
|
-
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers@0.8.
|
|
311
|
+
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers@0.8.9/node_modules/@metaplex-foundation/umi-serializers/dist/esm/sumSerializerSizes.mjs
|
|
312
312
|
function sumSerializerSizes(sizes) {
|
|
313
313
|
return sizes.reduce((all, size) => all === null || size === null ? null : all + size, 0);
|
|
314
314
|
}
|
|
315
315
|
|
|
316
|
-
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers@0.8.
|
|
316
|
+
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers@0.8.9/node_modules/@metaplex-foundation/umi-serializers/dist/esm/utils.mjs
|
|
317
317
|
function getResolvedSize(size, childrenSizes, bytes2, offset) {
|
|
318
318
|
if (typeof size === "number") {
|
|
319
319
|
return [size, offset];
|
|
@@ -349,7 +349,7 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
349
349
|
return typeof size === "object" ? size.serialize(realSize) : new Uint8Array();
|
|
350
350
|
}
|
|
351
351
|
|
|
352
|
-
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers@0.8.
|
|
352
|
+
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers@0.8.9/node_modules/@metaplex-foundation/umi-serializers/dist/esm/array.mjs
|
|
353
353
|
function array(item, options = {}) {
|
|
354
354
|
const size = options.size ?? u32();
|
|
355
355
|
if (size === "remainder" && item.fixedSize === null) {
|
|
@@ -382,7 +382,7 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
382
382
|
};
|
|
383
383
|
}
|
|
384
384
|
|
|
385
|
-
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers@0.8.
|
|
385
|
+
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers@0.8.9/node_modules/@metaplex-foundation/umi-serializers/dist/esm/bytes.mjs
|
|
386
386
|
function bytes(options = {}) {
|
|
387
387
|
const size = options.size ?? "variable";
|
|
388
388
|
const description = options.description ?? `bytes(${getSizeDescription(size)})`;
|
|
@@ -429,7 +429,7 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
429
429
|
};
|
|
430
430
|
}
|
|
431
431
|
|
|
432
|
-
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers@0.8.
|
|
432
|
+
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers@0.8.9/node_modules/@metaplex-foundation/umi-serializers/dist/esm/string.mjs
|
|
433
433
|
function string(options = {}) {
|
|
434
434
|
const size = options.size ?? u32();
|
|
435
435
|
const encoding = options.encoding ?? utf8;
|
|
@@ -470,7 +470,7 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
470
470
|
};
|
|
471
471
|
}
|
|
472
472
|
|
|
473
|
-
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers@0.8.
|
|
473
|
+
// ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers@0.8.9/node_modules/@metaplex-foundation/umi-serializers/dist/esm/struct.mjs
|
|
474
474
|
function struct(fields, options = {}) {
|
|
475
475
|
const fieldDescriptions = fields.map(([name, serializer]) => `${String(name)}: ${serializer.description}`).join(", ");
|
|
476
476
|
return {
|
|
@@ -493,6 +493,20 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
493
493
|
};
|
|
494
494
|
}
|
|
495
495
|
|
|
496
|
+
// src/unsigned-transaction.ts
|
|
497
|
+
function getUnsignedTransaction(transaction) {
|
|
498
|
+
if ("signatures" in transaction) {
|
|
499
|
+
const {
|
|
500
|
+
signatures: _,
|
|
501
|
+
// eslint-disable-line @typescript-eslint/no-unused-vars
|
|
502
|
+
...unsignedTransaction
|
|
503
|
+
} = transaction;
|
|
504
|
+
return unsignedTransaction;
|
|
505
|
+
} else {
|
|
506
|
+
return transaction;
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
|
|
496
510
|
// src/blockhash.ts
|
|
497
511
|
function assertIsBlockhash(putativeBlockhash) {
|
|
498
512
|
try {
|
|
@@ -508,12 +522,23 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
508
522
|
if (numBytes !== 32) {
|
|
509
523
|
throw new Error(`Expected input string to decode to a byte array of length 32. Actual length: ${numBytes}`);
|
|
510
524
|
}
|
|
511
|
-
} catch (
|
|
525
|
+
} catch (e2) {
|
|
512
526
|
throw new Error(`\`${putativeBlockhash}\` is not a blockhash`, {
|
|
513
|
-
cause:
|
|
527
|
+
cause: e2
|
|
514
528
|
});
|
|
515
529
|
}
|
|
516
530
|
}
|
|
531
|
+
function setTransactionLifetimeUsingBlockhash(blockhashLifetimeConstraint, transaction) {
|
|
532
|
+
if ("lifetimeConstraint" in transaction && transaction.lifetimeConstraint.blockhash === blockhashLifetimeConstraint.blockhash && transaction.lifetimeConstraint.lastValidBlockHeight === blockhashLifetimeConstraint.lastValidBlockHeight) {
|
|
533
|
+
return transaction;
|
|
534
|
+
}
|
|
535
|
+
const out = {
|
|
536
|
+
...getUnsignedTransaction(transaction),
|
|
537
|
+
lifetimeConstraint: blockhashLifetimeConstraint
|
|
538
|
+
};
|
|
539
|
+
Object.freeze(out);
|
|
540
|
+
return out;
|
|
541
|
+
}
|
|
517
542
|
|
|
518
543
|
// src/create-transaction.ts
|
|
519
544
|
function createTransaction({
|
|
@@ -527,82 +552,451 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
527
552
|
return out;
|
|
528
553
|
}
|
|
529
554
|
|
|
555
|
+
// ../instructions/dist/index.browser.js
|
|
556
|
+
var AccountRole = /* @__PURE__ */ ((AccountRole2) => {
|
|
557
|
+
AccountRole2[AccountRole2["WRITABLE_SIGNER"] = /* 3 */
|
|
558
|
+
3] = "WRITABLE_SIGNER";
|
|
559
|
+
AccountRole2[AccountRole2["READONLY_SIGNER"] = /* 2 */
|
|
560
|
+
2] = "READONLY_SIGNER";
|
|
561
|
+
AccountRole2[AccountRole2["WRITABLE"] = /* 1 */
|
|
562
|
+
1] = "WRITABLE";
|
|
563
|
+
AccountRole2[AccountRole2["READONLY"] = /* 0 */
|
|
564
|
+
0] = "READONLY";
|
|
565
|
+
return AccountRole2;
|
|
566
|
+
})(AccountRole || {});
|
|
567
|
+
var IS_WRITABLE_BITMASK = 1;
|
|
568
|
+
function isSignerRole(role) {
|
|
569
|
+
return role >= 2;
|
|
570
|
+
}
|
|
571
|
+
function isWritableRole(role) {
|
|
572
|
+
return (role & IS_WRITABLE_BITMASK) !== 0;
|
|
573
|
+
}
|
|
574
|
+
function mergeRoles(roleA, roleB) {
|
|
575
|
+
return roleA | roleB;
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
// src/durable-nonce.ts
|
|
579
|
+
var RECENT_BLOCKHASHES_SYSVAR_ADDRESS = "SysvarRecentB1ockHashes11111111111111111111";
|
|
580
|
+
var SYSTEM_PROGRAM_ADDRESS = "11111111111111111111111111111111";
|
|
581
|
+
function assertIsDurableNonceTransaction(transaction) {
|
|
582
|
+
if (!isDurableNonceTransaction(transaction)) {
|
|
583
|
+
throw new Error("Transaction is not a durable nonce transaction");
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
function createAdvanceNonceAccountInstruction(nonceAccountAddress, nonceAuthorityAddress) {
|
|
587
|
+
return {
|
|
588
|
+
accounts: [
|
|
589
|
+
{ address: nonceAccountAddress, role: AccountRole.WRITABLE },
|
|
590
|
+
{
|
|
591
|
+
address: RECENT_BLOCKHASHES_SYSVAR_ADDRESS,
|
|
592
|
+
role: AccountRole.READONLY
|
|
593
|
+
},
|
|
594
|
+
{ address: nonceAuthorityAddress, role: AccountRole.READONLY_SIGNER }
|
|
595
|
+
],
|
|
596
|
+
data: new Uint8Array([4, 0, 0, 0]),
|
|
597
|
+
programAddress: SYSTEM_PROGRAM_ADDRESS
|
|
598
|
+
};
|
|
599
|
+
}
|
|
600
|
+
function isAdvanceNonceAccountInstruction(instruction) {
|
|
601
|
+
return instruction.programAddress === SYSTEM_PROGRAM_ADDRESS && // Test for `AdvanceNonceAccount` instruction data
|
|
602
|
+
instruction.data != null && isAdvanceNonceAccountInstructionData(instruction.data) && // Test for exactly 3 accounts
|
|
603
|
+
instruction.accounts?.length === 3 && // First account is nonce account address
|
|
604
|
+
instruction.accounts[0].address != null && instruction.accounts[0].role === AccountRole.WRITABLE && // Second account is recent blockhashes sysvar
|
|
605
|
+
instruction.accounts[1].address === RECENT_BLOCKHASHES_SYSVAR_ADDRESS && instruction.accounts[1].role === AccountRole.READONLY && // Third account is nonce authority account
|
|
606
|
+
instruction.accounts[2].address != null && instruction.accounts[2].role === AccountRole.READONLY_SIGNER;
|
|
607
|
+
}
|
|
608
|
+
function isAdvanceNonceAccountInstructionData(data) {
|
|
609
|
+
return data.byteLength === 4 && data[0] === 4 && data[1] === 0 && data[2] === 0 && data[3] === 0;
|
|
610
|
+
}
|
|
611
|
+
function isDurableNonceTransaction(transaction) {
|
|
612
|
+
return "lifetimeConstraint" in transaction && typeof transaction.lifetimeConstraint.nonce === "string" && transaction.instructions[0] != null && isAdvanceNonceAccountInstruction(transaction.instructions[0]);
|
|
613
|
+
}
|
|
614
|
+
function setTransactionLifetimeUsingDurableNonce({
|
|
615
|
+
nonce,
|
|
616
|
+
nonceAccountAddress,
|
|
617
|
+
nonceAuthorityAddress
|
|
618
|
+
}, transaction) {
|
|
619
|
+
const isAlreadyDurableNonceTransaction = isDurableNonceTransaction(transaction);
|
|
620
|
+
if (isAlreadyDurableNonceTransaction && transaction.lifetimeConstraint.nonce === nonce && transaction.instructions[0].accounts[0].address === nonceAccountAddress && transaction.instructions[0].accounts[2].address === nonceAuthorityAddress) {
|
|
621
|
+
return transaction;
|
|
622
|
+
}
|
|
623
|
+
const out = {
|
|
624
|
+
...getUnsignedTransaction(transaction),
|
|
625
|
+
instructions: [
|
|
626
|
+
createAdvanceNonceAccountInstruction(nonceAccountAddress, nonceAuthorityAddress),
|
|
627
|
+
...isAlreadyDurableNonceTransaction ? transaction.instructions.slice(1) : transaction.instructions
|
|
628
|
+
],
|
|
629
|
+
lifetimeConstraint: {
|
|
630
|
+
nonce
|
|
631
|
+
}
|
|
632
|
+
};
|
|
633
|
+
Object.freeze(out);
|
|
634
|
+
return out;
|
|
635
|
+
}
|
|
636
|
+
|
|
530
637
|
// src/fee-payer.ts
|
|
531
638
|
function setTransactionFeePayer(feePayer, transaction) {
|
|
532
639
|
if ("feePayer" in transaction && feePayer === transaction.feePayer) {
|
|
533
640
|
return transaction;
|
|
534
641
|
}
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
// eslint-disable-line @typescript-eslint/no-unused-vars
|
|
540
|
-
...unsignedTransaction
|
|
541
|
-
} = transaction;
|
|
542
|
-
out = {
|
|
543
|
-
...unsignedTransaction,
|
|
544
|
-
feePayer
|
|
545
|
-
};
|
|
546
|
-
} else {
|
|
547
|
-
out = {
|
|
548
|
-
...transaction,
|
|
549
|
-
feePayer
|
|
550
|
-
};
|
|
551
|
-
}
|
|
642
|
+
const out = {
|
|
643
|
+
...getUnsignedTransaction(transaction),
|
|
644
|
+
feePayer
|
|
645
|
+
};
|
|
552
646
|
Object.freeze(out);
|
|
553
647
|
return out;
|
|
554
648
|
}
|
|
555
649
|
|
|
556
650
|
// src/instructions.ts
|
|
557
|
-
function replaceInstructions(transaction, nextInstructions) {
|
|
558
|
-
let out;
|
|
559
|
-
if ("signatures" in transaction) {
|
|
560
|
-
const {
|
|
561
|
-
signatures: _,
|
|
562
|
-
// eslint-disable-line @typescript-eslint/no-unused-vars
|
|
563
|
-
...unsignedTransaction
|
|
564
|
-
} = transaction;
|
|
565
|
-
out = {
|
|
566
|
-
...unsignedTransaction,
|
|
567
|
-
instructions: nextInstructions
|
|
568
|
-
};
|
|
569
|
-
} else {
|
|
570
|
-
out = {
|
|
571
|
-
...transaction,
|
|
572
|
-
instructions: nextInstructions
|
|
573
|
-
};
|
|
574
|
-
}
|
|
575
|
-
return out;
|
|
576
|
-
}
|
|
577
651
|
function appendTransactionInstruction(instruction, transaction) {
|
|
578
|
-
const
|
|
579
|
-
|
|
652
|
+
const out = {
|
|
653
|
+
...getUnsignedTransaction(transaction),
|
|
654
|
+
instructions: [...transaction.instructions, instruction]
|
|
655
|
+
};
|
|
580
656
|
Object.freeze(out);
|
|
581
657
|
return out;
|
|
582
658
|
}
|
|
583
659
|
function prependTransactionInstruction(instruction, transaction) {
|
|
584
|
-
const
|
|
585
|
-
|
|
660
|
+
const out = {
|
|
661
|
+
...getUnsignedTransaction(transaction),
|
|
662
|
+
instructions: [instruction, ...transaction.instructions]
|
|
663
|
+
};
|
|
586
664
|
Object.freeze(out);
|
|
587
665
|
return out;
|
|
588
666
|
}
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
667
|
+
|
|
668
|
+
// ../codecs-core/dist/index.browser.js
|
|
669
|
+
function assertByteArrayIsNotEmptyForCodec(codecDescription, bytes2, offset = 0) {
|
|
670
|
+
if (bytes2.length - offset <= 0) {
|
|
671
|
+
throw new Error(`Codec [${codecDescription}] cannot decode empty byte arrays.`);
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
function assertByteArrayHasEnoughBytesForCodec(codecDescription, expected, bytes2, offset = 0) {
|
|
675
|
+
const bytesLength = bytes2.length - offset;
|
|
676
|
+
if (bytesLength < expected) {
|
|
677
|
+
throw new Error(`Codec [${codecDescription}] expected ${expected} bytes, got ${bytesLength}.`);
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
var mergeBytes2 = (byteArrays) => {
|
|
681
|
+
const nonEmptyByteArrays = byteArrays.filter((arr) => arr.length);
|
|
682
|
+
if (nonEmptyByteArrays.length === 0) {
|
|
683
|
+
return byteArrays.length ? byteArrays[0] : new Uint8Array();
|
|
684
|
+
}
|
|
685
|
+
if (nonEmptyByteArrays.length === 1) {
|
|
686
|
+
return nonEmptyByteArrays[0];
|
|
687
|
+
}
|
|
688
|
+
const totalLength = nonEmptyByteArrays.reduce((total, arr) => total + arr.length, 0);
|
|
689
|
+
const result = new Uint8Array(totalLength);
|
|
690
|
+
let offset = 0;
|
|
691
|
+
nonEmptyByteArrays.forEach((arr) => {
|
|
692
|
+
result.set(arr, offset);
|
|
693
|
+
offset += arr.length;
|
|
594
694
|
});
|
|
695
|
+
return result;
|
|
696
|
+
};
|
|
697
|
+
var padBytes2 = (bytes2, length) => {
|
|
698
|
+
if (bytes2.length >= length)
|
|
699
|
+
return bytes2;
|
|
700
|
+
const paddedBytes = new Uint8Array(length).fill(0);
|
|
701
|
+
paddedBytes.set(bytes2);
|
|
702
|
+
return paddedBytes;
|
|
703
|
+
};
|
|
704
|
+
var fixBytes2 = (bytes2, length) => padBytes2(bytes2.length <= length ? bytes2 : bytes2.slice(0, length), length);
|
|
705
|
+
function combineCodec(encoder, decoder, description) {
|
|
706
|
+
if (encoder.fixedSize !== decoder.fixedSize) {
|
|
707
|
+
throw new Error(
|
|
708
|
+
`Encoder and decoder must have the same fixed size, got [${encoder.fixedSize}] and [${decoder.fixedSize}].`
|
|
709
|
+
);
|
|
710
|
+
}
|
|
711
|
+
if (encoder.maxSize !== decoder.maxSize) {
|
|
712
|
+
throw new Error(
|
|
713
|
+
`Encoder and decoder must have the same max size, got [${encoder.maxSize}] and [${decoder.maxSize}].`
|
|
714
|
+
);
|
|
715
|
+
}
|
|
716
|
+
if (description === void 0 && encoder.description !== decoder.description) {
|
|
717
|
+
throw new Error(
|
|
718
|
+
`Encoder and decoder must have the same description, got [${encoder.description}] and [${decoder.description}]. Pass a custom description as a third argument if you want to override the description and bypass this error.`
|
|
719
|
+
);
|
|
720
|
+
}
|
|
721
|
+
return {
|
|
722
|
+
decode: decoder.decode,
|
|
723
|
+
description: description ?? encoder.description,
|
|
724
|
+
encode: encoder.encode,
|
|
725
|
+
fixedSize: encoder.fixedSize,
|
|
726
|
+
maxSize: encoder.maxSize
|
|
727
|
+
};
|
|
595
728
|
}
|
|
596
|
-
function
|
|
597
|
-
return
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
729
|
+
function fixCodecHelper(data, fixedBytes, description) {
|
|
730
|
+
return {
|
|
731
|
+
description: description ?? `fixed(${fixedBytes}, ${data.description})`,
|
|
732
|
+
fixedSize: fixedBytes,
|
|
733
|
+
maxSize: fixedBytes
|
|
734
|
+
};
|
|
735
|
+
}
|
|
736
|
+
function fixEncoder(encoder, fixedBytes, description) {
|
|
737
|
+
return {
|
|
738
|
+
...fixCodecHelper(encoder, fixedBytes, description),
|
|
739
|
+
encode: (value) => fixBytes2(encoder.encode(value), fixedBytes)
|
|
740
|
+
};
|
|
741
|
+
}
|
|
742
|
+
function fixDecoder(decoder, fixedBytes, description) {
|
|
743
|
+
return {
|
|
744
|
+
...fixCodecHelper(decoder, fixedBytes, description),
|
|
745
|
+
decode: (bytes2, offset = 0) => {
|
|
746
|
+
assertByteArrayHasEnoughBytesForCodec("fixCodec", fixedBytes, bytes2, offset);
|
|
747
|
+
if (offset > 0 || bytes2.length > fixedBytes) {
|
|
748
|
+
bytes2 = bytes2.slice(offset, offset + fixedBytes);
|
|
749
|
+
}
|
|
750
|
+
if (decoder.fixedSize !== null) {
|
|
751
|
+
bytes2 = fixBytes2(bytes2, decoder.fixedSize);
|
|
752
|
+
}
|
|
753
|
+
const [value] = decoder.decode(bytes2, 0);
|
|
754
|
+
return [value, offset + fixedBytes];
|
|
755
|
+
}
|
|
756
|
+
};
|
|
757
|
+
}
|
|
758
|
+
function mapEncoder(encoder, unmap) {
|
|
759
|
+
return {
|
|
760
|
+
description: encoder.description,
|
|
761
|
+
encode: (value) => encoder.encode(unmap(value)),
|
|
762
|
+
fixedSize: encoder.fixedSize,
|
|
763
|
+
maxSize: encoder.maxSize
|
|
764
|
+
};
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
// ../codecs-numbers/dist/index.browser.js
|
|
768
|
+
function assertNumberIsBetweenForCodec(codecDescription, min, max, value) {
|
|
769
|
+
if (value < min || value > max) {
|
|
770
|
+
throw new Error(
|
|
771
|
+
`Codec [${codecDescription}] expected number to be in the range [${min}, ${max}], got ${value}.`
|
|
772
|
+
);
|
|
773
|
+
}
|
|
774
|
+
}
|
|
775
|
+
function sharedNumberFactory(input) {
|
|
776
|
+
let littleEndian;
|
|
777
|
+
let defaultDescription = input.name;
|
|
778
|
+
if (input.size > 1) {
|
|
779
|
+
littleEndian = !("endian" in input.options) || input.options.endian === 0;
|
|
780
|
+
defaultDescription += littleEndian ? "(le)" : "(be)";
|
|
781
|
+
}
|
|
782
|
+
return {
|
|
783
|
+
description: input.options.description ?? defaultDescription,
|
|
784
|
+
fixedSize: input.size,
|
|
785
|
+
littleEndian,
|
|
786
|
+
maxSize: input.size
|
|
787
|
+
};
|
|
605
788
|
}
|
|
789
|
+
function numberEncoderFactory(input) {
|
|
790
|
+
const codecData = sharedNumberFactory(input);
|
|
791
|
+
return {
|
|
792
|
+
description: codecData.description,
|
|
793
|
+
encode(value) {
|
|
794
|
+
if (input.range) {
|
|
795
|
+
assertNumberIsBetweenForCodec(input.name, input.range[0], input.range[1], value);
|
|
796
|
+
}
|
|
797
|
+
const arrayBuffer = new ArrayBuffer(input.size);
|
|
798
|
+
input.set(new DataView(arrayBuffer), value, codecData.littleEndian);
|
|
799
|
+
return new Uint8Array(arrayBuffer);
|
|
800
|
+
},
|
|
801
|
+
fixedSize: codecData.fixedSize,
|
|
802
|
+
maxSize: codecData.maxSize
|
|
803
|
+
};
|
|
804
|
+
}
|
|
805
|
+
function numberDecoderFactory(input) {
|
|
806
|
+
const codecData = sharedNumberFactory(input);
|
|
807
|
+
return {
|
|
808
|
+
decode(bytes2, offset = 0) {
|
|
809
|
+
assertByteArrayIsNotEmptyForCodec(codecData.description, bytes2, offset);
|
|
810
|
+
assertByteArrayHasEnoughBytesForCodec(codecData.description, input.size, bytes2, offset);
|
|
811
|
+
const view = new DataView(toArrayBuffer2(bytes2, offset, input.size));
|
|
812
|
+
return [input.get(view, codecData.littleEndian), offset + input.size];
|
|
813
|
+
},
|
|
814
|
+
description: codecData.description,
|
|
815
|
+
fixedSize: codecData.fixedSize,
|
|
816
|
+
maxSize: codecData.maxSize
|
|
817
|
+
};
|
|
818
|
+
}
|
|
819
|
+
function toArrayBuffer2(bytes2, offset, length) {
|
|
820
|
+
const bytesOffset = bytes2.byteOffset + (offset ?? 0);
|
|
821
|
+
const bytesLength = length ?? bytes2.byteLength;
|
|
822
|
+
return bytes2.buffer.slice(bytesOffset, bytesOffset + bytesLength);
|
|
823
|
+
}
|
|
824
|
+
var getU32Encoder = (options = {}) => numberEncoderFactory({
|
|
825
|
+
name: "u32",
|
|
826
|
+
options,
|
|
827
|
+
range: [0, Number("0xffffffff")],
|
|
828
|
+
set: (view, value, le) => view.setUint32(0, value, le),
|
|
829
|
+
size: 4
|
|
830
|
+
});
|
|
831
|
+
var getU32Decoder = (options = {}) => numberDecoderFactory({
|
|
832
|
+
get: (view, le) => view.getUint32(0, le),
|
|
833
|
+
name: "u32",
|
|
834
|
+
options,
|
|
835
|
+
size: 4
|
|
836
|
+
});
|
|
837
|
+
var getU8Encoder = (options = {}) => numberEncoderFactory({
|
|
838
|
+
name: "u8",
|
|
839
|
+
options,
|
|
840
|
+
range: [0, Number("0xff")],
|
|
841
|
+
set: (view, value) => view.setUint8(0, value),
|
|
842
|
+
size: 1
|
|
843
|
+
});
|
|
844
|
+
var getU8Decoder = (options = {}) => numberDecoderFactory({
|
|
845
|
+
get: (view) => view.getUint8(0),
|
|
846
|
+
name: "u8",
|
|
847
|
+
options,
|
|
848
|
+
size: 1
|
|
849
|
+
});
|
|
850
|
+
var getU8Codec = (options = {}) => combineCodec(getU8Encoder(options), getU8Decoder(options));
|
|
851
|
+
|
|
852
|
+
// ../codecs-strings/dist/index.browser.js
|
|
853
|
+
function assertValidBaseString(alphabet4, testValue, givenValue = testValue) {
|
|
854
|
+
if (!testValue.match(new RegExp(`^[${alphabet4}]*$`))) {
|
|
855
|
+
throw new Error(`Expected a string of base ${alphabet4.length}, got [${givenValue}].`);
|
|
856
|
+
}
|
|
857
|
+
}
|
|
858
|
+
var getBaseXEncoder = (alphabet4) => {
|
|
859
|
+
const base = alphabet4.length;
|
|
860
|
+
const baseBigInt = BigInt(base);
|
|
861
|
+
return {
|
|
862
|
+
description: `base${base}`,
|
|
863
|
+
encode(value) {
|
|
864
|
+
assertValidBaseString(alphabet4, value);
|
|
865
|
+
if (value === "")
|
|
866
|
+
return new Uint8Array();
|
|
867
|
+
const chars = [...value];
|
|
868
|
+
let trailIndex = chars.findIndex((c) => c !== alphabet4[0]);
|
|
869
|
+
trailIndex = trailIndex === -1 ? chars.length : trailIndex;
|
|
870
|
+
const leadingZeroes = Array(trailIndex).fill(0);
|
|
871
|
+
if (trailIndex === chars.length)
|
|
872
|
+
return Uint8Array.from(leadingZeroes);
|
|
873
|
+
const tailChars = chars.slice(trailIndex);
|
|
874
|
+
let base10Number = 0n;
|
|
875
|
+
let baseXPower = 1n;
|
|
876
|
+
for (let i = tailChars.length - 1; i >= 0; i -= 1) {
|
|
877
|
+
base10Number += baseXPower * BigInt(alphabet4.indexOf(tailChars[i]));
|
|
878
|
+
baseXPower *= baseBigInt;
|
|
879
|
+
}
|
|
880
|
+
const tailBytes = [];
|
|
881
|
+
while (base10Number > 0n) {
|
|
882
|
+
tailBytes.unshift(Number(base10Number % 256n));
|
|
883
|
+
base10Number /= 256n;
|
|
884
|
+
}
|
|
885
|
+
return Uint8Array.from(leadingZeroes.concat(tailBytes));
|
|
886
|
+
},
|
|
887
|
+
fixedSize: null,
|
|
888
|
+
maxSize: null
|
|
889
|
+
};
|
|
890
|
+
};
|
|
891
|
+
var getBaseXDecoder = (alphabet4) => {
|
|
892
|
+
const base = alphabet4.length;
|
|
893
|
+
const baseBigInt = BigInt(base);
|
|
894
|
+
return {
|
|
895
|
+
decode(rawBytes, offset = 0) {
|
|
896
|
+
const bytes2 = offset === 0 ? rawBytes : rawBytes.slice(offset);
|
|
897
|
+
if (bytes2.length === 0)
|
|
898
|
+
return ["", 0];
|
|
899
|
+
let trailIndex = bytes2.findIndex((n) => n !== 0);
|
|
900
|
+
trailIndex = trailIndex === -1 ? bytes2.length : trailIndex;
|
|
901
|
+
const leadingZeroes = alphabet4[0].repeat(trailIndex);
|
|
902
|
+
if (trailIndex === bytes2.length)
|
|
903
|
+
return [leadingZeroes, rawBytes.length];
|
|
904
|
+
let base10Number = bytes2.slice(trailIndex).reduce((sum, byte) => sum * 256n + BigInt(byte), 0n);
|
|
905
|
+
const tailChars = [];
|
|
906
|
+
while (base10Number > 0n) {
|
|
907
|
+
tailChars.unshift(alphabet4[Number(base10Number % baseBigInt)]);
|
|
908
|
+
base10Number /= baseBigInt;
|
|
909
|
+
}
|
|
910
|
+
return [leadingZeroes + tailChars.join(""), rawBytes.length];
|
|
911
|
+
},
|
|
912
|
+
description: `base${base}`,
|
|
913
|
+
fixedSize: null,
|
|
914
|
+
maxSize: null
|
|
915
|
+
};
|
|
916
|
+
};
|
|
917
|
+
var alphabet2 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
|
918
|
+
var getBase58Encoder = () => getBaseXEncoder(alphabet2);
|
|
919
|
+
var getBase58Decoder = () => getBaseXDecoder(alphabet2);
|
|
920
|
+
var removeNullCharacters2 = (value) => (
|
|
921
|
+
// eslint-disable-next-line no-control-regex
|
|
922
|
+
value.replace(/\u0000/g, "")
|
|
923
|
+
);
|
|
924
|
+
var e = globalThis.TextDecoder;
|
|
925
|
+
var o = globalThis.TextEncoder;
|
|
926
|
+
var getUtf8Encoder = () => {
|
|
927
|
+
let textEncoder;
|
|
928
|
+
return {
|
|
929
|
+
description: "utf8",
|
|
930
|
+
encode: (value) => new Uint8Array((textEncoder || (textEncoder = new o())).encode(value)),
|
|
931
|
+
fixedSize: null,
|
|
932
|
+
maxSize: null
|
|
933
|
+
};
|
|
934
|
+
};
|
|
935
|
+
var getUtf8Decoder = () => {
|
|
936
|
+
let textDecoder;
|
|
937
|
+
return {
|
|
938
|
+
decode(bytes2, offset = 0) {
|
|
939
|
+
const value = (textDecoder || (textDecoder = new e())).decode(bytes2.slice(offset));
|
|
940
|
+
return [removeNullCharacters2(value), bytes2.length];
|
|
941
|
+
},
|
|
942
|
+
description: "utf8",
|
|
943
|
+
fixedSize: null,
|
|
944
|
+
maxSize: null
|
|
945
|
+
};
|
|
946
|
+
};
|
|
947
|
+
var getStringEncoder = (options = {}) => {
|
|
948
|
+
const size = options.size ?? getU32Encoder();
|
|
949
|
+
const encoding = options.encoding ?? getUtf8Encoder();
|
|
950
|
+
const description = options.description ?? `string(${encoding.description}; ${getSizeDescription2(size)})`;
|
|
951
|
+
if (size === "variable") {
|
|
952
|
+
return { ...encoding, description };
|
|
953
|
+
}
|
|
954
|
+
if (typeof size === "number") {
|
|
955
|
+
return fixEncoder(encoding, size, description);
|
|
956
|
+
}
|
|
957
|
+
return {
|
|
958
|
+
description,
|
|
959
|
+
encode: (value) => {
|
|
960
|
+
const contentBytes = encoding.encode(value);
|
|
961
|
+
const lengthBytes = size.encode(contentBytes.length);
|
|
962
|
+
return mergeBytes2([lengthBytes, contentBytes]);
|
|
963
|
+
},
|
|
964
|
+
fixedSize: null,
|
|
965
|
+
maxSize: null
|
|
966
|
+
};
|
|
967
|
+
};
|
|
968
|
+
var getStringDecoder = (options = {}) => {
|
|
969
|
+
const size = options.size ?? getU32Decoder();
|
|
970
|
+
const encoding = options.encoding ?? getUtf8Decoder();
|
|
971
|
+
const description = options.description ?? `string(${encoding.description}; ${getSizeDescription2(size)})`;
|
|
972
|
+
if (size === "variable") {
|
|
973
|
+
return { ...encoding, description };
|
|
974
|
+
}
|
|
975
|
+
if (typeof size === "number") {
|
|
976
|
+
return fixDecoder(encoding, size, description);
|
|
977
|
+
}
|
|
978
|
+
return {
|
|
979
|
+
decode: (bytes2, offset = 0) => {
|
|
980
|
+
assertByteArrayIsNotEmptyForCodec("string", bytes2, offset);
|
|
981
|
+
const [lengthBigInt, lengthOffset] = size.decode(bytes2, offset);
|
|
982
|
+
const length = Number(lengthBigInt);
|
|
983
|
+
offset = lengthOffset;
|
|
984
|
+
const contentBytes = bytes2.slice(offset, offset + length);
|
|
985
|
+
assertByteArrayHasEnoughBytesForCodec("string", length, contentBytes);
|
|
986
|
+
const [value, contentOffset] = encoding.decode(contentBytes);
|
|
987
|
+
offset += contentOffset;
|
|
988
|
+
return [value, offset];
|
|
989
|
+
},
|
|
990
|
+
description,
|
|
991
|
+
fixedSize: null,
|
|
992
|
+
maxSize: null
|
|
993
|
+
};
|
|
994
|
+
};
|
|
995
|
+
function getSizeDescription2(size) {
|
|
996
|
+
return typeof size === "object" ? size.description : `${size}`;
|
|
997
|
+
}
|
|
998
|
+
|
|
999
|
+
// ../assertions/dist/index.browser.js
|
|
606
1000
|
function assertIsSecureContext() {
|
|
607
1001
|
if (!globalThis.isSecureContext) {
|
|
608
1002
|
throw new Error(
|
|
@@ -622,47 +1016,88 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
622
1016
|
throw new Error("No signing implementation could be found");
|
|
623
1017
|
}
|
|
624
1018
|
}
|
|
625
|
-
|
|
1019
|
+
|
|
1020
|
+
// ../addresses/dist/index.browser.js
|
|
1021
|
+
var memoizedBase58Encoder;
|
|
1022
|
+
var memoizedBase58Decoder;
|
|
1023
|
+
function getMemoizedBase58Encoder() {
|
|
1024
|
+
if (!memoizedBase58Encoder)
|
|
1025
|
+
memoizedBase58Encoder = getBase58Encoder();
|
|
1026
|
+
return memoizedBase58Encoder;
|
|
1027
|
+
}
|
|
1028
|
+
function getMemoizedBase58Decoder() {
|
|
1029
|
+
if (!memoizedBase58Decoder)
|
|
1030
|
+
memoizedBase58Decoder = getBase58Decoder();
|
|
1031
|
+
return memoizedBase58Decoder;
|
|
1032
|
+
}
|
|
1033
|
+
function assertIsAddress(putativeBase58EncodedAddress) {
|
|
1034
|
+
try {
|
|
1035
|
+
if (
|
|
1036
|
+
// Lowest address (32 bytes of zeroes)
|
|
1037
|
+
putativeBase58EncodedAddress.length < 32 || // Highest address (32 bytes of 255)
|
|
1038
|
+
putativeBase58EncodedAddress.length > 44
|
|
1039
|
+
) {
|
|
1040
|
+
throw new Error("Expected input string to decode to a byte array of length 32.");
|
|
1041
|
+
}
|
|
1042
|
+
const base58Encoder = getMemoizedBase58Encoder();
|
|
1043
|
+
const bytes2 = base58Encoder.encode(putativeBase58EncodedAddress);
|
|
1044
|
+
const numBytes = bytes2.byteLength;
|
|
1045
|
+
if (numBytes !== 32) {
|
|
1046
|
+
throw new Error(`Expected input string to decode to a byte array of length 32. Actual length: ${numBytes}`);
|
|
1047
|
+
}
|
|
1048
|
+
} catch (e2) {
|
|
1049
|
+
throw new Error(`\`${putativeBase58EncodedAddress}\` is not a base-58 encoded address`, {
|
|
1050
|
+
cause: e2
|
|
1051
|
+
});
|
|
1052
|
+
}
|
|
1053
|
+
}
|
|
1054
|
+
function address(putativeBase58EncodedAddress) {
|
|
1055
|
+
assertIsAddress(putativeBase58EncodedAddress);
|
|
1056
|
+
return putativeBase58EncodedAddress;
|
|
1057
|
+
}
|
|
1058
|
+
function getAddressEncoder(config) {
|
|
1059
|
+
return mapEncoder(
|
|
1060
|
+
getStringEncoder({
|
|
1061
|
+
description: config?.description ?? "Base58EncodedAddress",
|
|
1062
|
+
encoding: getMemoizedBase58Encoder(),
|
|
1063
|
+
size: 32
|
|
1064
|
+
}),
|
|
1065
|
+
(putativeAddress) => address(putativeAddress)
|
|
1066
|
+
);
|
|
1067
|
+
}
|
|
1068
|
+
function getAddressDecoder(config) {
|
|
1069
|
+
return getStringDecoder({
|
|
1070
|
+
description: config?.description ?? "Base58EncodedAddress",
|
|
1071
|
+
encoding: getMemoizedBase58Decoder(),
|
|
1072
|
+
size: 32
|
|
1073
|
+
});
|
|
1074
|
+
}
|
|
1075
|
+
function getAddressCodec(config) {
|
|
1076
|
+
return combineCodec(getAddressEncoder(config), getAddressDecoder(config));
|
|
1077
|
+
}
|
|
1078
|
+
function getAddressComparator() {
|
|
1079
|
+
return new Intl.Collator("en", {
|
|
1080
|
+
caseFirst: "lower",
|
|
1081
|
+
ignorePunctuation: false,
|
|
1082
|
+
localeMatcher: "best fit",
|
|
1083
|
+
numeric: false,
|
|
1084
|
+
sensitivity: "variant",
|
|
1085
|
+
usage: "sort"
|
|
1086
|
+
}).compare;
|
|
1087
|
+
}
|
|
1088
|
+
async function getAddressFromPublicKey(publicKey) {
|
|
626
1089
|
await assertKeyExporterIsAvailable();
|
|
627
1090
|
if (publicKey.type !== "public" || publicKey.algorithm.name !== "Ed25519") {
|
|
628
1091
|
throw new Error("The `CryptoKey` must be an `Ed25519` public key");
|
|
629
1092
|
}
|
|
630
1093
|
const publicKeyBytes = await crypto.subtle.exportKey("raw", publicKey);
|
|
631
|
-
const [base58EncodedAddress] =
|
|
1094
|
+
const [base58EncodedAddress] = getAddressDecoder().decode(new Uint8Array(publicKeyBytes));
|
|
632
1095
|
return base58EncodedAddress;
|
|
633
1096
|
}
|
|
634
|
-
async function signBytes(key, data) {
|
|
635
|
-
await assertSigningCapabilityIsAvailable();
|
|
636
|
-
const signedData = await crypto.subtle.sign("Ed25519", key, data);
|
|
637
|
-
return new Uint8Array(signedData);
|
|
638
|
-
}
|
|
639
|
-
|
|
640
|
-
// ../instructions/dist/index.browser.js
|
|
641
|
-
var AccountRole = /* @__PURE__ */ ((AccountRole2) => {
|
|
642
|
-
AccountRole2[AccountRole2["WRITABLE_SIGNER"] = /* 3 */
|
|
643
|
-
3] = "WRITABLE_SIGNER";
|
|
644
|
-
AccountRole2[AccountRole2["READONLY_SIGNER"] = /* 2 */
|
|
645
|
-
2] = "READONLY_SIGNER";
|
|
646
|
-
AccountRole2[AccountRole2["WRITABLE"] = /* 1 */
|
|
647
|
-
1] = "WRITABLE";
|
|
648
|
-
AccountRole2[AccountRole2["READONLY"] = /* 0 */
|
|
649
|
-
0] = "READONLY";
|
|
650
|
-
return AccountRole2;
|
|
651
|
-
})(AccountRole || {});
|
|
652
|
-
var IS_WRITABLE_BITMASK = 1;
|
|
653
|
-
function isSignerRole(role) {
|
|
654
|
-
return role >= 2;
|
|
655
|
-
}
|
|
656
|
-
function isWritableRole(role) {
|
|
657
|
-
return (role & IS_WRITABLE_BITMASK) !== 0;
|
|
658
|
-
}
|
|
659
|
-
function mergeRoles(roleA, roleB) {
|
|
660
|
-
return roleA | roleB;
|
|
661
|
-
}
|
|
662
1097
|
|
|
663
1098
|
// src/accounts.ts
|
|
664
|
-
function upsert(addressMap,
|
|
665
|
-
addressMap[
|
|
1099
|
+
function upsert(addressMap, address2, update) {
|
|
1100
|
+
addressMap[address2] = update(addressMap[address2] ?? { role: AccountRole.READONLY });
|
|
666
1101
|
}
|
|
667
1102
|
var TYPE = Symbol("AddressMapTypeProperty");
|
|
668
1103
|
function getAddressMapFromInstructions(feePayer, instructions) {
|
|
@@ -713,7 +1148,7 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
713
1148
|
const shouldReplaceEntry = (
|
|
714
1149
|
// Consider using the new LOOKUP_TABLE if its address is different...
|
|
715
1150
|
entry.lookupTableAddress !== accountMeta.lookupTableAddress && // ...and sorts before the existing one.
|
|
716
|
-
(addressComparator || (addressComparator =
|
|
1151
|
+
(addressComparator || (addressComparator = getAddressComparator()))(
|
|
717
1152
|
accountMeta.lookupTableAddress,
|
|
718
1153
|
entry.lookupTableAddress
|
|
719
1154
|
) < 0
|
|
@@ -819,14 +1254,14 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
819
1254
|
if (leftIsWritable !== isWritableRole(rightEntry.role)) {
|
|
820
1255
|
return leftIsWritable ? -1 : 1;
|
|
821
1256
|
}
|
|
822
|
-
addressComparator || (addressComparator =
|
|
1257
|
+
addressComparator || (addressComparator = getAddressComparator());
|
|
823
1258
|
if (leftEntry[TYPE] === 1 /* LOOKUP_TABLE */ && rightEntry[TYPE] === 1 /* LOOKUP_TABLE */ && leftEntry.lookupTableAddress !== rightEntry.lookupTableAddress) {
|
|
824
1259
|
return addressComparator(leftEntry.lookupTableAddress, rightEntry.lookupTableAddress);
|
|
825
1260
|
} else {
|
|
826
1261
|
return addressComparator(leftAddress, rightAddress);
|
|
827
1262
|
}
|
|
828
|
-
}).map(([
|
|
829
|
-
address,
|
|
1263
|
+
}).map(([address2, addressMeta]) => ({
|
|
1264
|
+
address: address2,
|
|
830
1265
|
...addressMeta
|
|
831
1266
|
}));
|
|
832
1267
|
return orderedAccounts;
|
|
@@ -850,7 +1285,7 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
850
1285
|
entry.readableIndices.push(account.addressIndex);
|
|
851
1286
|
}
|
|
852
1287
|
}
|
|
853
|
-
return Object.keys(index).sort(
|
|
1288
|
+
return Object.keys(index).sort(getAddressComparator()).map((lookupTableAddress) => ({
|
|
854
1289
|
lookupTableAddress,
|
|
855
1290
|
...index[lookupTableAddress]
|
|
856
1291
|
}));
|
|
@@ -895,7 +1330,7 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
895
1330
|
return instructions.map(({ accounts, data, programAddress }) => {
|
|
896
1331
|
return {
|
|
897
1332
|
programAddressIndex: accountIndex[programAddress],
|
|
898
|
-
...accounts ? { accountIndices: accounts.map(({ address }) => accountIndex[
|
|
1333
|
+
...accounts ? { accountIndices: accounts.map(({ address: address2 }) => accountIndex[address2]) } : null,
|
|
899
1334
|
...data ? { data } : null
|
|
900
1335
|
};
|
|
901
1336
|
});
|
|
@@ -913,7 +1348,7 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
913
1348
|
function getCompiledStaticAccounts(orderedAccounts) {
|
|
914
1349
|
const firstLookupTableAccountIndex = orderedAccounts.findIndex((account) => "lookupTableAddress" in account);
|
|
915
1350
|
const orderedStaticAccounts = firstLookupTableAccountIndex === -1 ? orderedAccounts : orderedAccounts.slice(0, firstLookupTableAccountIndex);
|
|
916
|
-
return orderedStaticAccounts.map(({ address }) =>
|
|
1351
|
+
return orderedStaticAccounts.map(({ address: address2 }) => address2);
|
|
917
1352
|
}
|
|
918
1353
|
|
|
919
1354
|
// src/message.ts
|
|
@@ -930,13 +1365,41 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
930
1365
|
};
|
|
931
1366
|
}
|
|
932
1367
|
|
|
1368
|
+
// src/compile-transaction.ts
|
|
1369
|
+
function getCompiledTransaction(transaction) {
|
|
1370
|
+
const compiledMessage = compileMessage(transaction);
|
|
1371
|
+
let signatures;
|
|
1372
|
+
if ("signatures" in transaction) {
|
|
1373
|
+
signatures = [];
|
|
1374
|
+
for (let ii = 0; ii < compiledMessage.header.numSignerAccounts; ii++) {
|
|
1375
|
+
signatures[ii] = transaction.signatures[compiledMessage.staticAccounts[ii]] ?? new Uint8Array(Array(64).fill(0));
|
|
1376
|
+
}
|
|
1377
|
+
} else {
|
|
1378
|
+
signatures = Array(compiledMessage.header.numSignerAccounts).fill(new Uint8Array(Array(64).fill(0)));
|
|
1379
|
+
}
|
|
1380
|
+
return {
|
|
1381
|
+
compiledMessage,
|
|
1382
|
+
signatures
|
|
1383
|
+
};
|
|
1384
|
+
}
|
|
1385
|
+
|
|
933
1386
|
// src/serializers/address-table-lookup.ts
|
|
1387
|
+
function addressSerializerCompat(compat) {
|
|
1388
|
+
const codec = getAddressCodec();
|
|
1389
|
+
return {
|
|
1390
|
+
description: compat?.description ?? codec.description,
|
|
1391
|
+
deserialize: codec.decode,
|
|
1392
|
+
fixedSize: codec.fixedSize,
|
|
1393
|
+
maxSize: codec.maxSize,
|
|
1394
|
+
serialize: codec.encode
|
|
1395
|
+
};
|
|
1396
|
+
}
|
|
934
1397
|
function getAddressTableLookupCodec() {
|
|
935
1398
|
return struct(
|
|
936
1399
|
[
|
|
937
1400
|
[
|
|
938
1401
|
"lookupTableAddress",
|
|
939
|
-
|
|
1402
|
+
addressSerializerCompat(
|
|
940
1403
|
{
|
|
941
1404
|
description: "The address of the address lookup table account from which instruction addresses should be looked up"
|
|
942
1405
|
}
|
|
@@ -967,38 +1430,73 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
967
1430
|
);
|
|
968
1431
|
}
|
|
969
1432
|
|
|
1433
|
+
// ../codecs-data-structures/dist/index.browser.js
|
|
1434
|
+
function sumCodecSizes(sizes) {
|
|
1435
|
+
return sizes.reduce((all, size) => all === null || size === null ? null : all + size, 0);
|
|
1436
|
+
}
|
|
1437
|
+
function structCodecHelper(fields, description) {
|
|
1438
|
+
const fieldDescriptions = fields.map(([name, codec]) => `${String(name)}: ${codec.description}`).join(", ");
|
|
1439
|
+
return {
|
|
1440
|
+
description: description ?? `struct(${fieldDescriptions})`,
|
|
1441
|
+
fixedSize: sumCodecSizes(fields.map(([, field]) => field.fixedSize)),
|
|
1442
|
+
maxSize: sumCodecSizes(fields.map(([, field]) => field.maxSize))
|
|
1443
|
+
};
|
|
1444
|
+
}
|
|
1445
|
+
function getStructEncoder(fields, options = {}) {
|
|
1446
|
+
return {
|
|
1447
|
+
...structCodecHelper(fields, options.description),
|
|
1448
|
+
encode: (struct2) => {
|
|
1449
|
+
const fieldBytes = fields.map(([key, codec]) => codec.encode(struct2[key]));
|
|
1450
|
+
return mergeBytes2(fieldBytes);
|
|
1451
|
+
}
|
|
1452
|
+
};
|
|
1453
|
+
}
|
|
1454
|
+
function getStructDecoder(fields, options = {}) {
|
|
1455
|
+
return {
|
|
1456
|
+
...structCodecHelper(fields, options.description),
|
|
1457
|
+
decode: (bytes2, offset = 0) => {
|
|
1458
|
+
const struct2 = {};
|
|
1459
|
+
fields.forEach(([key, codec]) => {
|
|
1460
|
+
const [value, newOffset] = codec.decode(bytes2, offset);
|
|
1461
|
+
offset = newOffset;
|
|
1462
|
+
struct2[key] = value;
|
|
1463
|
+
});
|
|
1464
|
+
return [struct2, offset];
|
|
1465
|
+
}
|
|
1466
|
+
};
|
|
1467
|
+
}
|
|
1468
|
+
function getStructCodec(fields, options = {}) {
|
|
1469
|
+
return combineCodec(getStructEncoder(fields, options), getStructDecoder(fields, options));
|
|
1470
|
+
}
|
|
1471
|
+
|
|
970
1472
|
// src/serializers/header.ts
|
|
1473
|
+
var memoizedU8Codec;
|
|
1474
|
+
function getMemoizedU8Codec() {
|
|
1475
|
+
if (!memoizedU8Codec)
|
|
1476
|
+
memoizedU8Codec = getU8Codec();
|
|
1477
|
+
return memoizedU8Codec;
|
|
1478
|
+
}
|
|
1479
|
+
function getMemoizedU8CodecDescription(description) {
|
|
1480
|
+
const codec = getMemoizedU8Codec();
|
|
1481
|
+
return {
|
|
1482
|
+
...codec,
|
|
1483
|
+
description: description ?? codec.description
|
|
1484
|
+
};
|
|
1485
|
+
}
|
|
1486
|
+
var numSignerAccountsDescription = "The expected number of addresses in the static address list belonging to accounts that are required to sign this transaction" ;
|
|
1487
|
+
var numReadonlySignerAccountsDescription = "The expected number of addresses in the static address list belonging to accounts that are required to sign this transaction, but may not be writable" ;
|
|
1488
|
+
var numReadonlyNonSignerAccountsDescription = "The expected number of addresses in the static address list belonging to accounts that are neither signers, nor writable" ;
|
|
1489
|
+
var messageHeaderDescription = "The transaction message header containing counts of the signer, readonly-signer, and readonly-nonsigner account addresses" ;
|
|
971
1490
|
function getMessageHeaderCodec() {
|
|
972
|
-
return
|
|
1491
|
+
return getStructCodec(
|
|
973
1492
|
[
|
|
974
|
-
[
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
{
|
|
978
|
-
description: "The expected number of addresses in the static address list belonging to accounts that are required to sign this transaction"
|
|
979
|
-
}
|
|
980
|
-
)
|
|
981
|
-
],
|
|
982
|
-
[
|
|
983
|
-
"numReadonlySignerAccounts",
|
|
984
|
-
u8(
|
|
985
|
-
{
|
|
986
|
-
description: "The expected number of addresses in the static address list belonging to accounts that are required to sign this transaction, but may not be writable"
|
|
987
|
-
}
|
|
988
|
-
)
|
|
989
|
-
],
|
|
990
|
-
[
|
|
991
|
-
"numReadonlyNonSignerAccounts",
|
|
992
|
-
u8(
|
|
993
|
-
{
|
|
994
|
-
description: "The expected number of addresses in the static address list belonging to accounts that are neither signers, nor writable"
|
|
995
|
-
}
|
|
996
|
-
)
|
|
997
|
-
]
|
|
1493
|
+
["numSignerAccounts", getMemoizedU8CodecDescription(numSignerAccountsDescription)],
|
|
1494
|
+
["numReadonlySignerAccounts", getMemoizedU8CodecDescription(numReadonlySignerAccountsDescription)],
|
|
1495
|
+
["numReadonlyNonSignerAccounts", getMemoizedU8CodecDescription(numReadonlyNonSignerAccountsDescription)]
|
|
998
1496
|
],
|
|
999
1497
|
{
|
|
1000
|
-
description:
|
|
1001
|
-
}
|
|
1498
|
+
description: messageHeaderDescription
|
|
1499
|
+
}
|
|
1002
1500
|
);
|
|
1003
1501
|
}
|
|
1004
1502
|
|
|
@@ -1015,7 +1513,7 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
1015
1513
|
)
|
|
1016
1514
|
],
|
|
1017
1515
|
[
|
|
1018
|
-
"
|
|
1516
|
+
"accountIndices",
|
|
1019
1517
|
array(
|
|
1020
1518
|
u8({
|
|
1021
1519
|
description: "The index of an account, according to the well-ordered accounts list for this transaction"
|
|
@@ -1035,42 +1533,29 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
1035
1533
|
]
|
|
1036
1534
|
]),
|
|
1037
1535
|
(value) => {
|
|
1038
|
-
if (value.
|
|
1536
|
+
if (value.accountIndices !== void 0 && value.data !== void 0) {
|
|
1039
1537
|
return value;
|
|
1040
1538
|
}
|
|
1041
1539
|
return {
|
|
1042
1540
|
...value,
|
|
1043
|
-
|
|
1541
|
+
accountIndices: value.accountIndices ?? [],
|
|
1044
1542
|
data: value.data ?? new Uint8Array(0)
|
|
1045
1543
|
};
|
|
1046
1544
|
},
|
|
1047
1545
|
(value) => {
|
|
1048
|
-
if (value.
|
|
1546
|
+
if (value.accountIndices.length && value.data.byteLength) {
|
|
1049
1547
|
return value;
|
|
1050
1548
|
}
|
|
1051
|
-
const {
|
|
1549
|
+
const { accountIndices, data, ...rest } = value;
|
|
1052
1550
|
return {
|
|
1053
1551
|
...rest,
|
|
1054
|
-
...
|
|
1552
|
+
...accountIndices.length ? { accountIndices } : null,
|
|
1055
1553
|
...data.byteLength ? { data } : null
|
|
1056
1554
|
};
|
|
1057
1555
|
}
|
|
1058
1556
|
);
|
|
1059
1557
|
}
|
|
1060
1558
|
|
|
1061
|
-
// src/serializers/unimplemented.ts
|
|
1062
|
-
function getError(type, name) {
|
|
1063
|
-
const functionSuffix = name + type[0].toUpperCase() + type.slice(1);
|
|
1064
|
-
return new Error(
|
|
1065
|
-
`No ${type} exists for ${name}. Use \`get${functionSuffix}()\` if you need a ${type}, and \`get${name}Codec()\` if you need to both encode and decode ${name}`
|
|
1066
|
-
);
|
|
1067
|
-
}
|
|
1068
|
-
function getUnimplementedDecoder(name) {
|
|
1069
|
-
return () => {
|
|
1070
|
-
throw getError("decoder", name);
|
|
1071
|
-
};
|
|
1072
|
-
}
|
|
1073
|
-
|
|
1074
1559
|
// src/serializers/transaction-version.ts
|
|
1075
1560
|
var VERSION_FLAG_MASK = 128;
|
|
1076
1561
|
var BASE_CONFIG = {
|
|
@@ -1078,7 +1563,7 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
1078
1563
|
fixedSize: null,
|
|
1079
1564
|
maxSize: 1
|
|
1080
1565
|
};
|
|
1081
|
-
function
|
|
1566
|
+
function decode(bytes2, offset = 0) {
|
|
1082
1567
|
const firstByte = bytes2[offset];
|
|
1083
1568
|
if ((firstByte & VERSION_FLAG_MASK) === 0) {
|
|
1084
1569
|
return ["legacy", offset];
|
|
@@ -1087,7 +1572,7 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
1087
1572
|
return [version, offset + 1];
|
|
1088
1573
|
}
|
|
1089
1574
|
}
|
|
1090
|
-
function
|
|
1575
|
+
function encode(value) {
|
|
1091
1576
|
if (value === "legacy") {
|
|
1092
1577
|
return new Uint8Array();
|
|
1093
1578
|
}
|
|
@@ -1096,11 +1581,32 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
1096
1581
|
}
|
|
1097
1582
|
return new Uint8Array([value | VERSION_FLAG_MASK]);
|
|
1098
1583
|
}
|
|
1099
|
-
function
|
|
1584
|
+
function getTransactionVersionDecoder() {
|
|
1100
1585
|
return {
|
|
1101
1586
|
...BASE_CONFIG,
|
|
1102
|
-
|
|
1103
|
-
|
|
1587
|
+
decode
|
|
1588
|
+
};
|
|
1589
|
+
}
|
|
1590
|
+
function getTransactionVersionEncoder() {
|
|
1591
|
+
return {
|
|
1592
|
+
...BASE_CONFIG,
|
|
1593
|
+
encode
|
|
1594
|
+
};
|
|
1595
|
+
}
|
|
1596
|
+
function getTransactionVersionCodec() {
|
|
1597
|
+
return combineCodec(getTransactionVersionEncoder(), getTransactionVersionDecoder());
|
|
1598
|
+
}
|
|
1599
|
+
|
|
1600
|
+
// src/serializers/unimplemented.ts
|
|
1601
|
+
function getError(type, name) {
|
|
1602
|
+
const functionSuffix = name + type[0].toUpperCase() + type.slice(1);
|
|
1603
|
+
return new Error(
|
|
1604
|
+
`No ${type} exists for ${name}. Use \`get${functionSuffix}()\` if you need a ${type}, and \`get${name}Codec()\` if you need to both encode and decode ${name}`
|
|
1605
|
+
);
|
|
1606
|
+
}
|
|
1607
|
+
function getUnimplementedDecoder(name) {
|
|
1608
|
+
return () => {
|
|
1609
|
+
throw getError("decoder", name);
|
|
1104
1610
|
};
|
|
1105
1611
|
}
|
|
1106
1612
|
|
|
@@ -1110,7 +1616,7 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
1110
1616
|
fixedSize: null,
|
|
1111
1617
|
maxSize: null
|
|
1112
1618
|
};
|
|
1113
|
-
function
|
|
1619
|
+
function serialize(compiledMessage) {
|
|
1114
1620
|
if (compiledMessage.version === "legacy") {
|
|
1115
1621
|
return struct(getPreludeStructSerializerTuple()).serialize(compiledMessage);
|
|
1116
1622
|
} else {
|
|
@@ -1131,13 +1637,22 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
1131
1637
|
).serialize(compiledMessage);
|
|
1132
1638
|
}
|
|
1133
1639
|
}
|
|
1640
|
+
function toSerializer(codec) {
|
|
1641
|
+
return {
|
|
1642
|
+
description: codec.description,
|
|
1643
|
+
deserialize: codec.decode,
|
|
1644
|
+
fixedSize: codec.fixedSize,
|
|
1645
|
+
maxSize: codec.maxSize,
|
|
1646
|
+
serialize: codec.encode
|
|
1647
|
+
};
|
|
1648
|
+
}
|
|
1134
1649
|
function getPreludeStructSerializerTuple() {
|
|
1135
1650
|
return [
|
|
1136
|
-
["version", getTransactionVersionCodec()],
|
|
1137
|
-
["header", getMessageHeaderCodec()],
|
|
1651
|
+
["version", toSerializer(getTransactionVersionCodec())],
|
|
1652
|
+
["header", toSerializer(getMessageHeaderCodec())],
|
|
1138
1653
|
[
|
|
1139
1654
|
"staticAccounts",
|
|
1140
|
-
array(
|
|
1655
|
+
array(toSerializer(getAddressCodec()), {
|
|
1141
1656
|
description: "A compact-array of static account addresses belonging to this transaction" ,
|
|
1142
1657
|
size: shortU16()
|
|
1143
1658
|
})
|
|
@@ -1169,49 +1684,7 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
1169
1684
|
return {
|
|
1170
1685
|
...BASE_CONFIG2,
|
|
1171
1686
|
deserialize: getUnimplementedDecoder("CompiledMessage"),
|
|
1172
|
-
serialize
|
|
1173
|
-
};
|
|
1174
|
-
}
|
|
1175
|
-
|
|
1176
|
-
// src/signatures.ts
|
|
1177
|
-
async function getCompiledMessageSignature(message, secretKey) {
|
|
1178
|
-
const wireMessageBytes = getCompiledMessageEncoder().serialize(message);
|
|
1179
|
-
const signature = await signBytes(secretKey, wireMessageBytes);
|
|
1180
|
-
return signature;
|
|
1181
|
-
}
|
|
1182
|
-
async function signTransaction(keyPair, transaction) {
|
|
1183
|
-
const compiledMessage = compileMessage(transaction);
|
|
1184
|
-
const [signerPublicKey, signature] = await Promise.all([
|
|
1185
|
-
getBase58EncodedAddressFromPublicKey(keyPair.publicKey),
|
|
1186
|
-
getCompiledMessageSignature(compiledMessage, keyPair.privateKey)
|
|
1187
|
-
]);
|
|
1188
|
-
const nextSignatures = {
|
|
1189
|
-
..."signatures" in transaction ? transaction.signatures : null,
|
|
1190
|
-
...{ [signerPublicKey]: signature }
|
|
1191
|
-
};
|
|
1192
|
-
const out = {
|
|
1193
|
-
...transaction,
|
|
1194
|
-
signatures: nextSignatures
|
|
1195
|
-
};
|
|
1196
|
-
Object.freeze(out);
|
|
1197
|
-
return out;
|
|
1198
|
-
}
|
|
1199
|
-
|
|
1200
|
-
// src/compile-transaction.ts
|
|
1201
|
-
function getCompiledTransaction(transaction) {
|
|
1202
|
-
const compiledMessage = compileMessage(transaction);
|
|
1203
|
-
let signatures;
|
|
1204
|
-
if ("signatures" in transaction) {
|
|
1205
|
-
signatures = [];
|
|
1206
|
-
for (let ii = 0; ii < compiledMessage.header.numSignerAccounts; ii++) {
|
|
1207
|
-
signatures[ii] = transaction.signatures[compiledMessage.staticAccounts[ii]] ?? new Uint8Array(Array(64).fill(0));
|
|
1208
|
-
}
|
|
1209
|
-
} else {
|
|
1210
|
-
signatures = Array(compiledMessage.header.numSignerAccounts).fill(new Uint8Array(Array(64).fill(0)));
|
|
1211
|
-
}
|
|
1212
|
-
return {
|
|
1213
|
-
compiledMessage,
|
|
1214
|
-
signatures
|
|
1687
|
+
serialize
|
|
1215
1688
|
};
|
|
1216
1689
|
}
|
|
1217
1690
|
|
|
@@ -1221,7 +1694,7 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
1221
1694
|
fixedSize: null,
|
|
1222
1695
|
maxSize: null
|
|
1223
1696
|
};
|
|
1224
|
-
function
|
|
1697
|
+
function serialize2(transaction) {
|
|
1225
1698
|
const compiledTransaction = getCompiledTransaction(transaction);
|
|
1226
1699
|
return struct([
|
|
1227
1700
|
[
|
|
@@ -1238,10 +1711,94 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
1238
1711
|
return {
|
|
1239
1712
|
...BASE_CONFIG3,
|
|
1240
1713
|
deserialize: getUnimplementedDecoder("CompiledMessage"),
|
|
1241
|
-
serialize:
|
|
1714
|
+
serialize: serialize2
|
|
1242
1715
|
};
|
|
1243
1716
|
}
|
|
1244
1717
|
|
|
1718
|
+
// ../keys/dist/index.browser.js
|
|
1719
|
+
async function signBytes(key, data) {
|
|
1720
|
+
await assertSigningCapabilityIsAvailable();
|
|
1721
|
+
const signedData = await crypto.subtle.sign("Ed25519", key, data);
|
|
1722
|
+
return new Uint8Array(signedData);
|
|
1723
|
+
}
|
|
1724
|
+
|
|
1725
|
+
// src/signatures.ts
|
|
1726
|
+
function assertIsTransactionSignature(putativeTransactionSignature) {
|
|
1727
|
+
try {
|
|
1728
|
+
if (
|
|
1729
|
+
// Lowest value (64 bytes of zeroes)
|
|
1730
|
+
putativeTransactionSignature.length < 64 || // Highest value (64 bytes of 255)
|
|
1731
|
+
putativeTransactionSignature.length > 88
|
|
1732
|
+
) {
|
|
1733
|
+
throw new Error("Expected input string to decode to a byte array of length 64.");
|
|
1734
|
+
}
|
|
1735
|
+
const bytes2 = base58.serialize(putativeTransactionSignature);
|
|
1736
|
+
const numBytes = bytes2.byteLength;
|
|
1737
|
+
if (numBytes !== 64) {
|
|
1738
|
+
throw new Error(`Expected input string to decode to a byte array of length 64. Actual length: ${numBytes}`);
|
|
1739
|
+
}
|
|
1740
|
+
} catch (e2) {
|
|
1741
|
+
throw new Error(`\`${putativeTransactionSignature}\` is not a transaction signature`, {
|
|
1742
|
+
cause: e2
|
|
1743
|
+
});
|
|
1744
|
+
}
|
|
1745
|
+
}
|
|
1746
|
+
function isTransactionSignature(putativeTransactionSignature) {
|
|
1747
|
+
if (
|
|
1748
|
+
// Lowest value (64 bytes of zeroes)
|
|
1749
|
+
putativeTransactionSignature.length < 64 || // Highest value (64 bytes of 255)
|
|
1750
|
+
putativeTransactionSignature.length > 88
|
|
1751
|
+
) {
|
|
1752
|
+
return false;
|
|
1753
|
+
}
|
|
1754
|
+
const bytes2 = base58.serialize(putativeTransactionSignature);
|
|
1755
|
+
const numBytes = bytes2.byteLength;
|
|
1756
|
+
if (numBytes !== 64) {
|
|
1757
|
+
return false;
|
|
1758
|
+
}
|
|
1759
|
+
return true;
|
|
1760
|
+
}
|
|
1761
|
+
async function getCompiledMessageSignature(message, secretKey) {
|
|
1762
|
+
const wireMessageBytes = getCompiledMessageEncoder().serialize(message);
|
|
1763
|
+
const signature = await signBytes(secretKey, wireMessageBytes);
|
|
1764
|
+
return signature;
|
|
1765
|
+
}
|
|
1766
|
+
function getSignatureFromTransaction(transaction) {
|
|
1767
|
+
const signatureBytes = transaction.signatures[transaction.feePayer];
|
|
1768
|
+
if (!signatureBytes) {
|
|
1769
|
+
throw new Error(
|
|
1770
|
+
"Could not determine this transaction's signature. Make sure that the transaction has been signed by its fee payer."
|
|
1771
|
+
);
|
|
1772
|
+
}
|
|
1773
|
+
const transactionSignature2 = base58.deserialize(signatureBytes)[0];
|
|
1774
|
+
return transactionSignature2;
|
|
1775
|
+
}
|
|
1776
|
+
async function signTransaction(keyPairs, transaction) {
|
|
1777
|
+
const compiledMessage = compileMessage(transaction);
|
|
1778
|
+
const nextSignatures = "signatures" in transaction ? { ...transaction.signatures } : {};
|
|
1779
|
+
const publicKeySignaturePairs = await Promise.all(
|
|
1780
|
+
keyPairs.map(
|
|
1781
|
+
(keyPair) => Promise.all([
|
|
1782
|
+
getAddressFromPublicKey(keyPair.publicKey),
|
|
1783
|
+
getCompiledMessageSignature(compiledMessage, keyPair.privateKey)
|
|
1784
|
+
])
|
|
1785
|
+
)
|
|
1786
|
+
);
|
|
1787
|
+
for (const [signerPublicKey, signature] of publicKeySignaturePairs) {
|
|
1788
|
+
nextSignatures[signerPublicKey] = signature;
|
|
1789
|
+
}
|
|
1790
|
+
const out = {
|
|
1791
|
+
...transaction,
|
|
1792
|
+
signatures: nextSignatures
|
|
1793
|
+
};
|
|
1794
|
+
Object.freeze(out);
|
|
1795
|
+
return out;
|
|
1796
|
+
}
|
|
1797
|
+
function transactionSignature(putativeTransactionSignature) {
|
|
1798
|
+
assertIsTransactionSignature(putativeTransactionSignature);
|
|
1799
|
+
return putativeTransactionSignature;
|
|
1800
|
+
}
|
|
1801
|
+
|
|
1245
1802
|
// src/wire-transaction.ts
|
|
1246
1803
|
function getBase64EncodedWireTransaction(transaction) {
|
|
1247
1804
|
const wireTransactionBytes = getTransactionEncoder().serialize(transaction);
|
|
@@ -1252,11 +1809,19 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
1252
1809
|
|
|
1253
1810
|
exports.appendTransactionInstruction = appendTransactionInstruction;
|
|
1254
1811
|
exports.assertIsBlockhash = assertIsBlockhash;
|
|
1812
|
+
exports.assertIsDurableNonceTransaction = assertIsDurableNonceTransaction;
|
|
1813
|
+
exports.assertIsTransactionSignature = assertIsTransactionSignature;
|
|
1255
1814
|
exports.createTransaction = createTransaction;
|
|
1256
1815
|
exports.getBase64EncodedWireTransaction = getBase64EncodedWireTransaction;
|
|
1816
|
+
exports.getSignatureFromTransaction = getSignatureFromTransaction;
|
|
1817
|
+
exports.getTransactionEncoder = getTransactionEncoder;
|
|
1818
|
+
exports.isTransactionSignature = isTransactionSignature;
|
|
1257
1819
|
exports.prependTransactionInstruction = prependTransactionInstruction;
|
|
1258
1820
|
exports.setTransactionFeePayer = setTransactionFeePayer;
|
|
1821
|
+
exports.setTransactionLifetimeUsingBlockhash = setTransactionLifetimeUsingBlockhash;
|
|
1822
|
+
exports.setTransactionLifetimeUsingDurableNonce = setTransactionLifetimeUsingDurableNonce;
|
|
1259
1823
|
exports.signTransaction = signTransaction;
|
|
1824
|
+
exports.transactionSignature = transactionSignature;
|
|
1260
1825
|
|
|
1261
1826
|
return exports;
|
|
1262
1827
|
|