@solana/transactions 2.0.0-experimental.2938d71 → 2.0.0-experimental.2962a3f
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/README.md +1 -43
- package/dist/index.browser.cjs +366 -218
- package/dist/index.browser.cjs.map +1 -1
- package/dist/index.browser.js +361 -219
- package/dist/index.browser.js.map +1 -1
- package/dist/index.native.js +359 -219
- package/dist/index.native.js.map +1 -1
- package/dist/index.node.cjs +364 -218
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.js +361 -219
- package/dist/index.node.js.map +1 -1
- package/dist/types/accounts.d.ts +2 -2
- package/dist/types/accounts.d.ts.map +1 -1
- package/dist/types/blockhash.d.ts +4 -3
- package/dist/types/blockhash.d.ts.map +1 -1
- package/dist/types/compilable-transaction.d.ts +7 -0
- package/dist/types/compilable-transaction.d.ts.map +1 -0
- package/dist/types/compile-address-table-lookups.d.ts +3 -3
- package/dist/types/compile-address-table-lookups.d.ts.map +1 -1
- package/dist/types/compile-header.d.ts +1 -1
- package/dist/types/compile-instructions.d.ts +1 -1
- package/dist/types/compile-lifetime-token.d.ts +1 -1
- package/dist/types/compile-static-accounts.d.ts +3 -3
- package/dist/types/compile-static-accounts.d.ts.map +1 -1
- package/dist/types/compile-transaction.d.ts +6 -7
- package/dist/types/compile-transaction.d.ts.map +1 -1
- package/dist/types/create-transaction.d.ts +1 -1
- package/dist/types/decompile-transaction.d.ts +5 -0
- package/dist/types/decompile-transaction.d.ts.map +1 -0
- package/dist/types/durable-nonce.d.ts +7 -8
- package/dist/types/durable-nonce.d.ts.map +1 -1
- package/dist/types/fee-payer.d.ts +6 -6
- package/dist/types/fee-payer.d.ts.map +1 -1
- package/dist/types/index.d.ts +11 -9
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/instructions.d.ts +2 -2
- package/dist/types/message.d.ts +6 -10
- package/dist/types/message.d.ts.map +1 -1
- package/dist/types/serializers/address-table-lookup.d.ts +5 -5
- package/dist/types/serializers/address-table-lookup.d.ts.map +1 -1
- package/dist/types/serializers/header.d.ts +5 -5
- package/dist/types/serializers/header.d.ts.map +1 -1
- package/dist/types/serializers/index.d.ts +2 -1
- package/dist/types/serializers/index.d.ts.map +1 -1
- package/dist/types/serializers/instruction.d.ts +5 -5
- package/dist/types/serializers/instruction.d.ts.map +1 -1
- package/dist/types/serializers/message.d.ts +5 -5
- package/dist/types/serializers/message.d.ts.map +1 -1
- package/dist/types/serializers/transaction-version.d.ts +5 -5
- package/dist/types/serializers/transaction-version.d.ts.map +1 -1
- package/dist/types/serializers/transaction.d.ts +6 -6
- package/dist/types/serializers/transaction.d.ts.map +1 -1
- package/dist/types/signatures.d.ts +9 -13
- package/dist/types/signatures.d.ts.map +1 -1
- package/dist/types/types.d.ts +6 -13
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/unsigned-transaction.d.ts +1 -1
- package/dist/types/wire-transaction.d.ts +1 -1
- package/dist/types/wire-transaction.d.ts.map +1 -1
- package/package.json +17 -17
- package/dist/index.development.js +0 -1378
- package/dist/index.development.js.map +0 -1
- package/dist/index.production.min.js +0 -26
package/dist/index.browser.cjs
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var codecsStrings = require('@solana/codecs-strings');
|
|
4
|
+
var addresses = require('@solana/addresses');
|
|
4
5
|
var codecsCore = require('@solana/codecs-core');
|
|
5
6
|
var codecsDataStructures = require('@solana/codecs-data-structures');
|
|
6
7
|
var codecsNumbers = require('@solana/codecs-numbers');
|
|
7
|
-
var
|
|
8
|
-
var codecsStrings = require('@solana/codecs-strings');
|
|
8
|
+
var functional = require('@solana/functional');
|
|
9
9
|
var keys = require('@solana/keys');
|
|
10
10
|
|
|
11
|
-
//
|
|
12
|
-
var __DEV__ = /* @__PURE__ */ (() => process["env"].NODE_ENV === "development")();
|
|
11
|
+
// src/blockhash.ts
|
|
13
12
|
|
|
14
13
|
// src/unsigned-transaction.ts
|
|
15
14
|
function getUnsignedTransaction(transaction) {
|
|
@@ -26,7 +25,10 @@ function getUnsignedTransaction(transaction) {
|
|
|
26
25
|
}
|
|
27
26
|
|
|
28
27
|
// src/blockhash.ts
|
|
28
|
+
var base58Encoder;
|
|
29
29
|
function assertIsBlockhash(putativeBlockhash) {
|
|
30
|
+
if (!base58Encoder)
|
|
31
|
+
base58Encoder = codecsStrings.getBase58Encoder();
|
|
30
32
|
try {
|
|
31
33
|
if (
|
|
32
34
|
// Lowest value (32 bytes of zeroes)
|
|
@@ -35,7 +37,7 @@ function assertIsBlockhash(putativeBlockhash) {
|
|
|
35
37
|
) {
|
|
36
38
|
throw new Error("Expected input string to decode to a byte array of length 32.");
|
|
37
39
|
}
|
|
38
|
-
const bytes =
|
|
40
|
+
const bytes = base58Encoder.encode(putativeBlockhash);
|
|
39
41
|
const numBytes = bytes.byteLength;
|
|
40
42
|
if (numBytes !== 32) {
|
|
41
43
|
throw new Error(`Expected input string to decode to a byte array of length 32. Actual length: ${numBytes}`);
|
|
@@ -46,6 +48,22 @@ function assertIsBlockhash(putativeBlockhash) {
|
|
|
46
48
|
});
|
|
47
49
|
}
|
|
48
50
|
}
|
|
51
|
+
function isTransactionWithBlockhashLifetime(transaction) {
|
|
52
|
+
const lifetimeConstraintShapeMatches = "lifetimeConstraint" in transaction && typeof transaction.lifetimeConstraint.blockhash === "string" && typeof transaction.lifetimeConstraint.lastValidBlockHeight === "bigint";
|
|
53
|
+
if (!lifetimeConstraintShapeMatches)
|
|
54
|
+
return false;
|
|
55
|
+
try {
|
|
56
|
+
assertIsBlockhash(transaction.lifetimeConstraint.blockhash);
|
|
57
|
+
return true;
|
|
58
|
+
} catch {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function assertIsTransactionWithBlockhashLifetime(transaction) {
|
|
63
|
+
if (!isTransactionWithBlockhashLifetime(transaction)) {
|
|
64
|
+
throw new Error("Transaction does not have a blockhash lifetime");
|
|
65
|
+
}
|
|
66
|
+
}
|
|
49
67
|
function setTransactionLifetimeUsingBlockhash(blockhashLifetimeConstraint, transaction) {
|
|
50
68
|
if ("lifetimeConstraint" in transaction && transaction.lifetimeConstraint.blockhash === blockhashLifetimeConstraint.blockhash && transaction.lifetimeConstraint.lastValidBlockHeight === blockhashLifetimeConstraint.lastValidBlockHeight) {
|
|
51
69
|
return transaction;
|
|
@@ -121,7 +139,7 @@ function isAdvanceNonceAccountInstruction(instruction) {
|
|
|
121
139
|
instruction.accounts?.length === 3 && // First account is nonce account address
|
|
122
140
|
instruction.accounts[0].address != null && instruction.accounts[0].role === AccountRole.WRITABLE && // Second account is recent blockhashes sysvar
|
|
123
141
|
instruction.accounts[1].address === RECENT_BLOCKHASHES_SYSVAR_ADDRESS && instruction.accounts[1].role === AccountRole.READONLY && // Third account is nonce authority account
|
|
124
|
-
instruction.accounts[2].address != null && instruction.accounts[2].role
|
|
142
|
+
instruction.accounts[2].address != null && isSignerRole(instruction.accounts[2].role);
|
|
125
143
|
}
|
|
126
144
|
function isAdvanceNonceAccountInstructionData(data) {
|
|
127
145
|
return data.byteLength === 4 && data[0] === 4 && data[1] === 0 && data[2] === 0 && data[3] === 0;
|
|
@@ -129,21 +147,38 @@ function isAdvanceNonceAccountInstructionData(data) {
|
|
|
129
147
|
function isDurableNonceTransaction(transaction) {
|
|
130
148
|
return "lifetimeConstraint" in transaction && typeof transaction.lifetimeConstraint.nonce === "string" && transaction.instructions[0] != null && isAdvanceNonceAccountInstruction(transaction.instructions[0]);
|
|
131
149
|
}
|
|
150
|
+
function isAdvanceNonceAccountInstructionForNonce(instruction, nonceAccountAddress, nonceAuthorityAddress) {
|
|
151
|
+
return instruction.accounts[0].address === nonceAccountAddress && instruction.accounts[2].address === nonceAuthorityAddress;
|
|
152
|
+
}
|
|
132
153
|
function setTransactionLifetimeUsingDurableNonce({
|
|
133
154
|
nonce,
|
|
134
155
|
nonceAccountAddress,
|
|
135
156
|
nonceAuthorityAddress
|
|
136
157
|
}, transaction) {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
158
|
+
let newInstructions;
|
|
159
|
+
const firstInstruction = transaction.instructions[0];
|
|
160
|
+
if (firstInstruction && isAdvanceNonceAccountInstruction(firstInstruction)) {
|
|
161
|
+
if (isAdvanceNonceAccountInstructionForNonce(firstInstruction, nonceAccountAddress, nonceAuthorityAddress)) {
|
|
162
|
+
if (isDurableNonceTransaction(transaction) && transaction.lifetimeConstraint.nonce === nonce) {
|
|
163
|
+
return transaction;
|
|
164
|
+
} else {
|
|
165
|
+
newInstructions = [firstInstruction, ...transaction.instructions.slice(1)];
|
|
166
|
+
}
|
|
167
|
+
} else {
|
|
168
|
+
newInstructions = [
|
|
169
|
+
createAdvanceNonceAccountInstruction(nonceAccountAddress, nonceAuthorityAddress),
|
|
170
|
+
...transaction.instructions.slice(1)
|
|
171
|
+
];
|
|
172
|
+
}
|
|
173
|
+
} else {
|
|
174
|
+
newInstructions = [
|
|
175
|
+
createAdvanceNonceAccountInstruction(nonceAccountAddress, nonceAuthorityAddress),
|
|
176
|
+
...transaction.instructions
|
|
177
|
+
];
|
|
140
178
|
}
|
|
141
179
|
const out = {
|
|
142
180
|
...getUnsignedTransaction(transaction),
|
|
143
|
-
instructions:
|
|
144
|
-
createAdvanceNonceAccountInstruction(nonceAccountAddress, nonceAuthorityAddress),
|
|
145
|
-
...isAlreadyDurableNonceTransaction ? transaction.instructions.slice(1) : transaction.instructions
|
|
146
|
-
],
|
|
181
|
+
instructions: newInstructions,
|
|
147
182
|
lifetimeConstraint: {
|
|
148
183
|
nonce
|
|
149
184
|
}
|
|
@@ -234,7 +269,7 @@ function getAddressMapFromInstructions(feePayer, instructions) {
|
|
|
234
269
|
const shouldReplaceEntry = (
|
|
235
270
|
// Consider using the new LOOKUP_TABLE if its address is different...
|
|
236
271
|
entry.lookupTableAddress !== accountMeta.lookupTableAddress && // ...and sorts before the existing one.
|
|
237
|
-
(addressComparator
|
|
272
|
+
(addressComparator ||= addresses.getAddressComparator())(
|
|
238
273
|
accountMeta.lookupTableAddress,
|
|
239
274
|
entry.lookupTableAddress
|
|
240
275
|
) < 0
|
|
@@ -340,7 +375,7 @@ function getOrderedAccountsFromAddressMap(addressMap) {
|
|
|
340
375
|
if (leftIsWritable !== isWritableRole(rightEntry.role)) {
|
|
341
376
|
return leftIsWritable ? -1 : 1;
|
|
342
377
|
}
|
|
343
|
-
addressComparator
|
|
378
|
+
addressComparator ||= addresses.getAddressComparator();
|
|
344
379
|
if (leftEntry[TYPE] === 1 /* LOOKUP_TABLE */ && rightEntry[TYPE] === 1 /* LOOKUP_TABLE */ && leftEntry.lookupTableAddress !== rightEntry.lookupTableAddress) {
|
|
345
380
|
return addressComparator(leftEntry.lookupTableAddress, rightEntry.lookupTableAddress);
|
|
346
381
|
} else {
|
|
@@ -353,16 +388,15 @@ function getOrderedAccountsFromAddressMap(addressMap) {
|
|
|
353
388
|
return orderedAccounts;
|
|
354
389
|
}
|
|
355
390
|
function getCompiledAddressTableLookups(orderedAccounts) {
|
|
356
|
-
var _a;
|
|
357
391
|
const index = {};
|
|
358
392
|
for (const account of orderedAccounts) {
|
|
359
393
|
if (!("lookupTableAddress" in account)) {
|
|
360
394
|
continue;
|
|
361
395
|
}
|
|
362
|
-
const entry = index[
|
|
396
|
+
const entry = index[account.lookupTableAddress] ||= {
|
|
363
397
|
readableIndices: [],
|
|
364
398
|
writableIndices: []
|
|
365
|
-
}
|
|
399
|
+
};
|
|
366
400
|
if (account.role === AccountRole.WRITABLE) {
|
|
367
401
|
entry.writableIndices.push(account.addressIndex);
|
|
368
402
|
} else {
|
|
@@ -448,101 +482,68 @@ function compileMessage(transaction) {
|
|
|
448
482
|
version: transaction.version
|
|
449
483
|
};
|
|
450
484
|
}
|
|
451
|
-
|
|
452
|
-
// src/compile-transaction.ts
|
|
453
|
-
function getCompiledTransaction(transaction) {
|
|
454
|
-
const compiledMessage = compileMessage(transaction);
|
|
455
|
-
let signatures;
|
|
456
|
-
if ("signatures" in transaction) {
|
|
457
|
-
signatures = [];
|
|
458
|
-
for (let ii = 0; ii < compiledMessage.header.numSignerAccounts; ii++) {
|
|
459
|
-
signatures[ii] = transaction.signatures[compiledMessage.staticAccounts[ii]] ?? new Uint8Array(Array(64).fill(0));
|
|
460
|
-
}
|
|
461
|
-
} else {
|
|
462
|
-
signatures = Array(compiledMessage.header.numSignerAccounts).fill(new Uint8Array(Array(64).fill(0)));
|
|
463
|
-
}
|
|
464
|
-
return {
|
|
465
|
-
compiledMessage,
|
|
466
|
-
signatures
|
|
467
|
-
};
|
|
468
|
-
}
|
|
469
|
-
var lookupTableAddressDescription = __DEV__ ? "The address of the address lookup table account from which instruction addresses should be looked up" : "lookupTableAddress";
|
|
470
|
-
var writableIndicesDescription = __DEV__ ? "The indices of the accounts in the lookup table that should be loaded as writeable" : "writableIndices";
|
|
471
|
-
var readableIndicesDescription = __DEV__ ? "The indices of the accounts in the lookup table that should be loaded as read-only" : "readableIndices";
|
|
472
|
-
var addressTableLookupDescription = __DEV__ ? "A pointer to the address of an address lookup table, along with the readonly/writeable indices of the addresses that should be loaded from it" : "addressTableLookup";
|
|
473
485
|
var memoizedAddressTableLookupEncoder;
|
|
474
486
|
function getAddressTableLookupEncoder() {
|
|
475
487
|
if (!memoizedAddressTableLookupEncoder) {
|
|
476
|
-
memoizedAddressTableLookupEncoder = codecsDataStructures.getStructEncoder(
|
|
488
|
+
memoizedAddressTableLookupEncoder = codecsDataStructures.getStructEncoder([
|
|
489
|
+
["lookupTableAddress", addresses.getAddressEncoder()],
|
|
477
490
|
[
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
"writableIndices",
|
|
481
|
-
codecsDataStructures.getArrayEncoder(codecsNumbers.getU8Encoder(), {
|
|
482
|
-
description: writableIndicesDescription,
|
|
483
|
-
size: codecsNumbers.getShortU16Encoder()
|
|
484
|
-
})
|
|
485
|
-
],
|
|
486
|
-
[
|
|
487
|
-
"readableIndices",
|
|
488
|
-
codecsDataStructures.getArrayEncoder(codecsNumbers.getU8Encoder(), {
|
|
489
|
-
description: readableIndicesDescription,
|
|
490
|
-
size: codecsNumbers.getShortU16Encoder()
|
|
491
|
-
})
|
|
492
|
-
]
|
|
491
|
+
"writableIndices",
|
|
492
|
+
codecsDataStructures.getArrayEncoder(codecsNumbers.getU8Encoder(), { size: codecsNumbers.getShortU16Encoder() })
|
|
493
493
|
],
|
|
494
|
-
|
|
495
|
-
|
|
494
|
+
[
|
|
495
|
+
"readableIndices",
|
|
496
|
+
codecsDataStructures.getArrayEncoder(codecsNumbers.getU8Encoder(), { size: codecsNumbers.getShortU16Encoder() })
|
|
497
|
+
]
|
|
498
|
+
]);
|
|
496
499
|
}
|
|
497
500
|
return memoizedAddressTableLookupEncoder;
|
|
498
501
|
}
|
|
502
|
+
var memoizedAddressTableLookupDecoder;
|
|
503
|
+
function getAddressTableLookupDecoder() {
|
|
504
|
+
if (!memoizedAddressTableLookupDecoder) {
|
|
505
|
+
memoizedAddressTableLookupDecoder = codecsDataStructures.getStructDecoder([
|
|
506
|
+
["lookupTableAddress", addresses.getAddressDecoder()],
|
|
507
|
+
["writableIndices", codecsDataStructures.getArrayDecoder(codecsNumbers.getU8Decoder(), { size: codecsNumbers.getShortU16Decoder() })],
|
|
508
|
+
["readableIndices", codecsDataStructures.getArrayDecoder(codecsNumbers.getU8Decoder(), { size: codecsNumbers.getShortU16Decoder() })]
|
|
509
|
+
]);
|
|
510
|
+
}
|
|
511
|
+
return memoizedAddressTableLookupDecoder;
|
|
512
|
+
}
|
|
499
513
|
var memoizedU8Encoder;
|
|
500
514
|
function getMemoizedU8Encoder() {
|
|
501
515
|
if (!memoizedU8Encoder)
|
|
502
516
|
memoizedU8Encoder = codecsNumbers.getU8Encoder();
|
|
503
517
|
return memoizedU8Encoder;
|
|
504
518
|
}
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
};
|
|
519
|
+
var memoizedU8Decoder;
|
|
520
|
+
function getMemoizedU8Decoder() {
|
|
521
|
+
if (!memoizedU8Decoder)
|
|
522
|
+
memoizedU8Decoder = codecsNumbers.getU8Decoder();
|
|
523
|
+
return memoizedU8Decoder;
|
|
511
524
|
}
|
|
512
|
-
var numSignerAccountsDescription = __DEV__ ? "The expected number of addresses in the static address list belonging to accounts that are required to sign this transaction" : void 0;
|
|
513
|
-
var numReadonlySignerAccountsDescription = __DEV__ ? "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" : void 0;
|
|
514
|
-
var numReadonlyNonSignerAccountsDescription = __DEV__ ? "The expected number of addresses in the static address list belonging to accounts that are neither signers, nor writable" : void 0;
|
|
515
|
-
var messageHeaderDescription = __DEV__ ? "The transaction message header containing counts of the signer, readonly-signer, and readonly-nonsigner account addresses" : void 0;
|
|
516
525
|
function getMessageHeaderEncoder() {
|
|
517
|
-
return codecsDataStructures.getStructEncoder(
|
|
518
|
-
[
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
526
|
+
return codecsDataStructures.getStructEncoder([
|
|
527
|
+
["numSignerAccounts", getMemoizedU8Encoder()],
|
|
528
|
+
["numReadonlySignerAccounts", getMemoizedU8Encoder()],
|
|
529
|
+
["numReadonlyNonSignerAccounts", getMemoizedU8Encoder()]
|
|
530
|
+
]);
|
|
531
|
+
}
|
|
532
|
+
function getMessageHeaderDecoder() {
|
|
533
|
+
return codecsDataStructures.getStructDecoder([
|
|
534
|
+
["numSignerAccounts", getMemoizedU8Decoder()],
|
|
535
|
+
["numReadonlySignerAccounts", getMemoizedU8Decoder()],
|
|
536
|
+
["numReadonlyNonSignerAccounts", getMemoizedU8Decoder()]
|
|
537
|
+
]);
|
|
527
538
|
}
|
|
528
|
-
var programAddressIndexDescription = __DEV__ ? "The index of the program being called, according to the well-ordered accounts list for this transaction" : "programAddressIndex";
|
|
529
|
-
var accountIndexDescription = __DEV__ ? "The index of an account, according to the well-ordered accounts list for this transaction" : void 0;
|
|
530
|
-
var accountIndicesDescription = __DEV__ ? "An optional list of account indices, according to the well-ordered accounts list for this transaction, in the order in which the program being called expects them" : "accountIndices";
|
|
531
|
-
var dataDescription = __DEV__ ? "An optional buffer of data passed to the instruction" : "data";
|
|
532
539
|
var memoizedGetInstructionEncoder;
|
|
533
540
|
function getInstructionEncoder() {
|
|
534
541
|
if (!memoizedGetInstructionEncoder) {
|
|
535
542
|
memoizedGetInstructionEncoder = codecsCore.mapEncoder(
|
|
536
543
|
codecsDataStructures.getStructEncoder([
|
|
537
|
-
["programAddressIndex", codecsNumbers.getU8Encoder(
|
|
538
|
-
[
|
|
539
|
-
|
|
540
|
-
codecsDataStructures.getArrayEncoder(codecsNumbers.getU8Encoder({ description: accountIndexDescription }), {
|
|
541
|
-
description: accountIndicesDescription,
|
|
542
|
-
size: codecsNumbers.getShortU16Encoder()
|
|
543
|
-
})
|
|
544
|
-
],
|
|
545
|
-
["data", codecsDataStructures.getBytesEncoder({ description: dataDescription, size: codecsNumbers.getShortU16Encoder() })]
|
|
544
|
+
["programAddressIndex", codecsNumbers.getU8Encoder()],
|
|
545
|
+
["accountIndices", codecsDataStructures.getArrayEncoder(codecsNumbers.getU8Encoder(), { size: codecsNumbers.getShortU16Encoder() })],
|
|
546
|
+
["data", codecsDataStructures.getBytesEncoder({ size: codecsNumbers.getShortU16Encoder() })]
|
|
546
547
|
]),
|
|
547
548
|
// Convert an instruction to have all fields defined
|
|
548
549
|
(instruction) => {
|
|
@@ -559,33 +560,64 @@ function getInstructionEncoder() {
|
|
|
559
560
|
}
|
|
560
561
|
return memoizedGetInstructionEncoder;
|
|
561
562
|
}
|
|
562
|
-
var
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
563
|
+
var memoizedGetInstructionDecoder;
|
|
564
|
+
function getInstructionDecoder() {
|
|
565
|
+
if (!memoizedGetInstructionDecoder) {
|
|
566
|
+
memoizedGetInstructionDecoder = codecsCore.mapDecoder(
|
|
567
|
+
codecsDataStructures.getStructDecoder([
|
|
568
|
+
["programAddressIndex", codecsNumbers.getU8Decoder()],
|
|
569
|
+
["accountIndices", codecsDataStructures.getArrayDecoder(codecsNumbers.getU8Decoder(), { size: codecsNumbers.getShortU16Decoder() })],
|
|
570
|
+
["data", codecsDataStructures.getBytesDecoder({ size: codecsNumbers.getShortU16Decoder() })]
|
|
571
|
+
]),
|
|
572
|
+
// Convert an instruction to exclude optional fields if they are empty
|
|
573
|
+
(instruction) => {
|
|
574
|
+
if (instruction.accountIndices.length && instruction.data.byteLength) {
|
|
575
|
+
return instruction;
|
|
576
|
+
}
|
|
577
|
+
const { accountIndices, data, ...rest } = instruction;
|
|
578
|
+
return {
|
|
579
|
+
...rest,
|
|
580
|
+
...accountIndices.length ? { accountIndices } : null,
|
|
581
|
+
...data.byteLength ? { data } : null
|
|
582
|
+
};
|
|
583
|
+
}
|
|
584
|
+
);
|
|
574
585
|
}
|
|
575
|
-
return
|
|
586
|
+
return memoizedGetInstructionDecoder;
|
|
576
587
|
}
|
|
588
|
+
var VERSION_FLAG_MASK = 128;
|
|
577
589
|
function getTransactionVersionEncoder() {
|
|
578
|
-
return {
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
590
|
+
return codecsCore.createEncoder({
|
|
591
|
+
getSizeFromValue: (value) => value === "legacy" ? 0 : 1,
|
|
592
|
+
maxSize: 1,
|
|
593
|
+
write: (value, bytes, offset) => {
|
|
594
|
+
if (value === "legacy") {
|
|
595
|
+
return offset;
|
|
596
|
+
}
|
|
597
|
+
if (value < 0 || value > 127) {
|
|
598
|
+
throw new Error(`Transaction version must be in the range [0, 127]. \`${value}\` given.`);
|
|
599
|
+
}
|
|
600
|
+
bytes.set([value | VERSION_FLAG_MASK], offset);
|
|
601
|
+
return offset + 1;
|
|
602
|
+
}
|
|
603
|
+
});
|
|
604
|
+
}
|
|
605
|
+
function getTransactionVersionDecoder() {
|
|
606
|
+
return codecsCore.createDecoder({
|
|
607
|
+
maxSize: 1,
|
|
608
|
+
read: (bytes, offset) => {
|
|
609
|
+
const firstByte = bytes[offset];
|
|
610
|
+
if ((firstByte & VERSION_FLAG_MASK) === 0) {
|
|
611
|
+
return ["legacy", offset];
|
|
612
|
+
} else {
|
|
613
|
+
const version = firstByte ^ VERSION_FLAG_MASK;
|
|
614
|
+
return [version, offset + 1];
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
});
|
|
582
618
|
}
|
|
583
619
|
|
|
584
620
|
// src/serializers/message.ts
|
|
585
|
-
var staticAccountsDescription = __DEV__ ? "A compact-array of static account addresses belonging to this transaction" : "staticAccounts";
|
|
586
|
-
var lifetimeTokenDescription = __DEV__ ? "A 32-byte token that specifies the lifetime of this transaction (eg. a recent blockhash, or a durable nonce)" : "lifetimeToken";
|
|
587
|
-
var instructionsDescription = __DEV__ ? "A compact-array of instructions belonging to this transaction" : "instructions";
|
|
588
|
-
var addressTableLookupsDescription = __DEV__ ? "A compact array of address table lookups belonging to this transaction" : "addressTableLookups";
|
|
589
621
|
function getCompiledMessageLegacyEncoder() {
|
|
590
622
|
return codecsDataStructures.getStructEncoder(getPreludeStructEncoderTuple());
|
|
591
623
|
}
|
|
@@ -610,134 +642,235 @@ function getPreludeStructEncoderTuple() {
|
|
|
610
642
|
return [
|
|
611
643
|
["version", getTransactionVersionEncoder()],
|
|
612
644
|
["header", getMessageHeaderEncoder()],
|
|
613
|
-
[
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
[
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
})
|
|
627
|
-
],
|
|
628
|
-
[
|
|
629
|
-
"instructions",
|
|
630
|
-
codecsDataStructures.getArrayEncoder(getInstructionEncoder(), {
|
|
631
|
-
description: instructionsDescription,
|
|
632
|
-
size: codecsNumbers.getShortU16Encoder()
|
|
633
|
-
})
|
|
634
|
-
]
|
|
645
|
+
["staticAccounts", codecsDataStructures.getArrayEncoder(addresses.getAddressEncoder(), { size: codecsNumbers.getShortU16Encoder() })],
|
|
646
|
+
["lifetimeToken", codecsStrings.getStringEncoder({ encoding: codecsStrings.getBase58Encoder(), size: 32 })],
|
|
647
|
+
["instructions", codecsDataStructures.getArrayEncoder(getInstructionEncoder(), { size: codecsNumbers.getShortU16Encoder() })]
|
|
648
|
+
];
|
|
649
|
+
}
|
|
650
|
+
function getPreludeStructDecoderTuple() {
|
|
651
|
+
return [
|
|
652
|
+
["version", getTransactionVersionDecoder()],
|
|
653
|
+
["header", getMessageHeaderDecoder()],
|
|
654
|
+
["staticAccounts", codecsDataStructures.getArrayDecoder(addresses.getAddressDecoder(), { size: codecsNumbers.getShortU16Decoder() })],
|
|
655
|
+
["lifetimeToken", codecsStrings.getStringDecoder({ encoding: codecsStrings.getBase58Decoder(), size: 32 })],
|
|
656
|
+
["instructions", codecsDataStructures.getArrayDecoder(getInstructionDecoder(), { size: codecsNumbers.getShortU16Decoder() })],
|
|
657
|
+
["addressTableLookups", getAddressTableLookupArrayDecoder()]
|
|
635
658
|
];
|
|
636
659
|
}
|
|
637
660
|
function getAddressTableLookupArrayEncoder() {
|
|
638
|
-
return codecsDataStructures.getArrayEncoder(getAddressTableLookupEncoder(), {
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
});
|
|
661
|
+
return codecsDataStructures.getArrayEncoder(getAddressTableLookupEncoder(), { size: codecsNumbers.getShortU16Encoder() });
|
|
662
|
+
}
|
|
663
|
+
function getAddressTableLookupArrayDecoder() {
|
|
664
|
+
return codecsDataStructures.getArrayDecoder(getAddressTableLookupDecoder(), { size: codecsNumbers.getShortU16Decoder() });
|
|
642
665
|
}
|
|
643
|
-
var messageDescription = __DEV__ ? "The wire format of a Solana transaction message" : "message";
|
|
644
666
|
function getCompiledMessageEncoder() {
|
|
645
|
-
return {
|
|
646
|
-
|
|
647
|
-
encode: (compiledMessage) => {
|
|
667
|
+
return codecsCore.createEncoder({
|
|
668
|
+
getSizeFromValue: (compiledMessage) => {
|
|
648
669
|
if (compiledMessage.version === "legacy") {
|
|
649
|
-
return getCompiledMessageLegacyEncoder().
|
|
670
|
+
return getCompiledMessageLegacyEncoder().getSizeFromValue(compiledMessage);
|
|
650
671
|
} else {
|
|
651
|
-
return getCompiledMessageVersionedEncoder().
|
|
672
|
+
return getCompiledMessageVersionedEncoder().getSizeFromValue(compiledMessage);
|
|
652
673
|
}
|
|
653
674
|
},
|
|
654
|
-
|
|
655
|
-
|
|
675
|
+
write: (compiledMessage, bytes, offset) => {
|
|
676
|
+
if (compiledMessage.version === "legacy") {
|
|
677
|
+
return getCompiledMessageLegacyEncoder().write(compiledMessage, bytes, offset);
|
|
678
|
+
} else {
|
|
679
|
+
return getCompiledMessageVersionedEncoder().write(compiledMessage, bytes, offset);
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
});
|
|
683
|
+
}
|
|
684
|
+
function getCompiledMessageDecoder() {
|
|
685
|
+
return codecsCore.mapDecoder(codecsDataStructures.getStructDecoder(getPreludeStructDecoderTuple()), ({ addressTableLookups, ...restOfMessage }) => {
|
|
686
|
+
if (restOfMessage.version === "legacy" || !addressTableLookups?.length) {
|
|
687
|
+
return restOfMessage;
|
|
688
|
+
}
|
|
689
|
+
return { ...restOfMessage, addressTableLookups };
|
|
690
|
+
});
|
|
691
|
+
}
|
|
692
|
+
function getCompiledMessageCodec() {
|
|
693
|
+
return codecsCore.combineCodec(getCompiledMessageEncoder(), getCompiledMessageDecoder());
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
// src/compile-transaction.ts
|
|
697
|
+
function getCompiledTransaction(transaction) {
|
|
698
|
+
const compiledMessage = compileMessage(transaction);
|
|
699
|
+
let signatures;
|
|
700
|
+
if ("signatures" in transaction) {
|
|
701
|
+
signatures = [];
|
|
702
|
+
for (let ii = 0; ii < compiledMessage.header.numSignerAccounts; ii++) {
|
|
703
|
+
signatures[ii] = transaction.signatures[compiledMessage.staticAccounts[ii]] ?? new Uint8Array(Array(64).fill(0));
|
|
704
|
+
}
|
|
705
|
+
} else {
|
|
706
|
+
signatures = Array(compiledMessage.header.numSignerAccounts).fill(new Uint8Array(Array(64).fill(0)));
|
|
707
|
+
}
|
|
708
|
+
return {
|
|
709
|
+
compiledMessage,
|
|
710
|
+
signatures
|
|
656
711
|
};
|
|
657
712
|
}
|
|
713
|
+
function getAccountMetas(message) {
|
|
714
|
+
const { header } = message;
|
|
715
|
+
const numWritableSignerAccounts = header.numSignerAccounts - header.numReadonlySignerAccounts;
|
|
716
|
+
const numWritableNonSignerAccounts = message.staticAccounts.length - header.numSignerAccounts - header.numReadonlyNonSignerAccounts;
|
|
717
|
+
const accountMetas = [];
|
|
718
|
+
let accountIndex = 0;
|
|
719
|
+
for (let i = 0; i < numWritableSignerAccounts; i++) {
|
|
720
|
+
accountMetas.push({
|
|
721
|
+
address: message.staticAccounts[accountIndex],
|
|
722
|
+
role: AccountRole.WRITABLE_SIGNER
|
|
723
|
+
});
|
|
724
|
+
accountIndex++;
|
|
725
|
+
}
|
|
726
|
+
for (let i = 0; i < header.numReadonlySignerAccounts; i++) {
|
|
727
|
+
accountMetas.push({
|
|
728
|
+
address: message.staticAccounts[accountIndex],
|
|
729
|
+
role: AccountRole.READONLY_SIGNER
|
|
730
|
+
});
|
|
731
|
+
accountIndex++;
|
|
732
|
+
}
|
|
733
|
+
for (let i = 0; i < numWritableNonSignerAccounts; i++) {
|
|
734
|
+
accountMetas.push({
|
|
735
|
+
address: message.staticAccounts[accountIndex],
|
|
736
|
+
role: AccountRole.WRITABLE
|
|
737
|
+
});
|
|
738
|
+
accountIndex++;
|
|
739
|
+
}
|
|
740
|
+
for (let i = 0; i < header.numReadonlyNonSignerAccounts; i++) {
|
|
741
|
+
accountMetas.push({
|
|
742
|
+
address: message.staticAccounts[accountIndex],
|
|
743
|
+
role: AccountRole.READONLY
|
|
744
|
+
});
|
|
745
|
+
accountIndex++;
|
|
746
|
+
}
|
|
747
|
+
return accountMetas;
|
|
748
|
+
}
|
|
749
|
+
function convertInstruction(instruction, accountMetas) {
|
|
750
|
+
const programAddress = accountMetas[instruction.programAddressIndex]?.address;
|
|
751
|
+
if (!programAddress) {
|
|
752
|
+
throw new Error(`Could not find program address at index ${instruction.programAddressIndex}`);
|
|
753
|
+
}
|
|
754
|
+
const accounts = instruction.accountIndices?.map((accountIndex) => accountMetas[accountIndex]);
|
|
755
|
+
const { data } = instruction;
|
|
756
|
+
return {
|
|
757
|
+
programAddress,
|
|
758
|
+
...accounts && accounts.length ? { accounts } : {},
|
|
759
|
+
...data && data.length ? { data } : {}
|
|
760
|
+
};
|
|
761
|
+
}
|
|
762
|
+
function getLifetimeConstraint(messageLifetimeToken, firstInstruction, lastValidBlockHeight) {
|
|
763
|
+
if (!firstInstruction || !isAdvanceNonceAccountInstruction(firstInstruction)) {
|
|
764
|
+
return {
|
|
765
|
+
blockhash: messageLifetimeToken,
|
|
766
|
+
lastValidBlockHeight: lastValidBlockHeight ?? 2n ** 64n - 1n
|
|
767
|
+
// U64 MAX
|
|
768
|
+
};
|
|
769
|
+
} else {
|
|
770
|
+
const nonceAccountAddress = firstInstruction.accounts[0].address;
|
|
771
|
+
addresses.assertIsAddress(nonceAccountAddress);
|
|
772
|
+
const nonceAuthorityAddress = firstInstruction.accounts[2].address;
|
|
773
|
+
addresses.assertIsAddress(nonceAuthorityAddress);
|
|
774
|
+
return {
|
|
775
|
+
nonce: messageLifetimeToken,
|
|
776
|
+
nonceAccountAddress,
|
|
777
|
+
nonceAuthorityAddress
|
|
778
|
+
};
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
function convertSignatures(compiledTransaction) {
|
|
782
|
+
const {
|
|
783
|
+
compiledMessage: { staticAccounts },
|
|
784
|
+
signatures
|
|
785
|
+
} = compiledTransaction;
|
|
786
|
+
return signatures.reduce((acc, sig, index) => {
|
|
787
|
+
const allZeros = sig.every((byte) => byte === 0);
|
|
788
|
+
if (allZeros)
|
|
789
|
+
return acc;
|
|
790
|
+
const address = staticAccounts[index];
|
|
791
|
+
return { ...acc, [address]: sig };
|
|
792
|
+
}, {});
|
|
793
|
+
}
|
|
794
|
+
function decompileTransaction(compiledTransaction, lastValidBlockHeight) {
|
|
795
|
+
const { compiledMessage } = compiledTransaction;
|
|
796
|
+
if ("addressTableLookups" in compiledMessage && compiledMessage.addressTableLookups.length > 0) {
|
|
797
|
+
throw new Error("Cannot convert transaction with addressTableLookups");
|
|
798
|
+
}
|
|
799
|
+
const feePayer = compiledMessage.staticAccounts[0];
|
|
800
|
+
if (!feePayer)
|
|
801
|
+
throw new Error("No fee payer set in CompiledTransaction");
|
|
802
|
+
const accountMetas = getAccountMetas(compiledMessage);
|
|
803
|
+
const instructions = compiledMessage.instructions.map(
|
|
804
|
+
(compiledInstruction) => convertInstruction(compiledInstruction, accountMetas)
|
|
805
|
+
);
|
|
806
|
+
const firstInstruction = instructions[0];
|
|
807
|
+
const lifetimeConstraint = getLifetimeConstraint(
|
|
808
|
+
compiledMessage.lifetimeToken,
|
|
809
|
+
firstInstruction,
|
|
810
|
+
lastValidBlockHeight
|
|
811
|
+
);
|
|
812
|
+
const signatures = convertSignatures(compiledTransaction);
|
|
813
|
+
return functional.pipe(
|
|
814
|
+
createTransaction({ version: compiledMessage.version }),
|
|
815
|
+
(tx) => setTransactionFeePayer(feePayer, tx),
|
|
816
|
+
(tx) => instructions.reduce((acc, instruction) => {
|
|
817
|
+
return appendTransactionInstruction(instruction, acc);
|
|
818
|
+
}, tx),
|
|
819
|
+
(tx) => "blockhash" in lifetimeConstraint ? setTransactionLifetimeUsingBlockhash(lifetimeConstraint, tx) : setTransactionLifetimeUsingDurableNonce(lifetimeConstraint, tx),
|
|
820
|
+
(tx) => compiledTransaction.signatures.length ? { ...tx, signatures } : tx
|
|
821
|
+
);
|
|
822
|
+
}
|
|
658
823
|
|
|
659
824
|
// src/serializers/transaction.ts
|
|
660
|
-
var transactionDescription = __DEV__ ? "The wire format of a Solana transaction" : "transaction";
|
|
661
|
-
var signaturesDescription = __DEV__ ? "A compact array of 64-byte, base-64 encoded Ed25519 signatures" : "signatures";
|
|
662
825
|
function getCompiledTransactionEncoder() {
|
|
663
|
-
return codecsDataStructures.getStructEncoder(
|
|
826
|
+
return codecsDataStructures.getStructEncoder([
|
|
827
|
+
["signatures", codecsDataStructures.getArrayEncoder(codecsDataStructures.getBytesEncoder({ size: 64 }), { size: codecsNumbers.getShortU16Encoder() })],
|
|
828
|
+
["compiledMessage", getCompiledMessageEncoder()]
|
|
829
|
+
]);
|
|
830
|
+
}
|
|
831
|
+
function getCompiledTransactionDecoder() {
|
|
832
|
+
return codecsDataStructures.getStructDecoder([
|
|
664
833
|
[
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
size: codecsNumbers.getShortU16Encoder()
|
|
670
|
-
})
|
|
671
|
-
],
|
|
672
|
-
["compiledMessage", getCompiledMessageEncoder()]
|
|
834
|
+
"signatures",
|
|
835
|
+
codecsDataStructures.getArrayDecoder(codecsDataStructures.getBytesDecoder({ size: 64 }), {
|
|
836
|
+
size: codecsNumbers.getShortU16Decoder()
|
|
837
|
+
})
|
|
673
838
|
],
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
}
|
|
677
|
-
);
|
|
839
|
+
["compiledMessage", getCompiledMessageDecoder()]
|
|
840
|
+
]);
|
|
678
841
|
}
|
|
679
842
|
function getTransactionEncoder() {
|
|
680
843
|
return codecsCore.mapEncoder(getCompiledTransactionEncoder(), getCompiledTransaction);
|
|
681
844
|
}
|
|
682
|
-
function
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
putativeTransactionSignature.length > 88
|
|
688
|
-
) {
|
|
689
|
-
throw new Error("Expected input string to decode to a byte array of length 64.");
|
|
690
|
-
}
|
|
691
|
-
const bytes = umiSerializers.base58.serialize(putativeTransactionSignature);
|
|
692
|
-
const numBytes = bytes.byteLength;
|
|
693
|
-
if (numBytes !== 64) {
|
|
694
|
-
throw new Error(`Expected input string to decode to a byte array of length 64. Actual length: ${numBytes}`);
|
|
695
|
-
}
|
|
696
|
-
} catch (e) {
|
|
697
|
-
throw new Error(`\`${putativeTransactionSignature}\` is not a transaction signature`, {
|
|
698
|
-
cause: e
|
|
699
|
-
});
|
|
700
|
-
}
|
|
701
|
-
}
|
|
702
|
-
function isTransactionSignature(putativeTransactionSignature) {
|
|
703
|
-
if (
|
|
704
|
-
// Lowest value (64 bytes of zeroes)
|
|
705
|
-
putativeTransactionSignature.length < 64 || // Highest value (64 bytes of 255)
|
|
706
|
-
putativeTransactionSignature.length > 88
|
|
707
|
-
) {
|
|
708
|
-
return false;
|
|
709
|
-
}
|
|
710
|
-
const bytes = umiSerializers.base58.serialize(putativeTransactionSignature);
|
|
711
|
-
const numBytes = bytes.byteLength;
|
|
712
|
-
if (numBytes !== 64) {
|
|
713
|
-
return false;
|
|
714
|
-
}
|
|
715
|
-
return true;
|
|
845
|
+
function getTransactionDecoder(lastValidBlockHeight) {
|
|
846
|
+
return codecsCore.mapDecoder(
|
|
847
|
+
getCompiledTransactionDecoder(),
|
|
848
|
+
(compiledTransaction) => decompileTransaction(compiledTransaction, lastValidBlockHeight)
|
|
849
|
+
);
|
|
716
850
|
}
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
const signature = await keys.signBytes(secretKey, wireMessageBytes);
|
|
720
|
-
return signature;
|
|
851
|
+
function getTransactionCodec(lastValidBlockHeight) {
|
|
852
|
+
return codecsCore.combineCodec(getTransactionEncoder(), getTransactionDecoder(lastValidBlockHeight));
|
|
721
853
|
}
|
|
854
|
+
var base58Decoder;
|
|
722
855
|
function getSignatureFromTransaction(transaction) {
|
|
856
|
+
if (!base58Decoder)
|
|
857
|
+
base58Decoder = codecsStrings.getBase58Decoder();
|
|
723
858
|
const signatureBytes = transaction.signatures[transaction.feePayer];
|
|
724
859
|
if (!signatureBytes) {
|
|
725
860
|
throw new Error(
|
|
726
861
|
"Could not determine this transaction's signature. Make sure that the transaction has been signed by its fee payer."
|
|
727
862
|
);
|
|
728
863
|
}
|
|
729
|
-
const
|
|
730
|
-
return
|
|
864
|
+
const transactionSignature = base58Decoder.decode(signatureBytes);
|
|
865
|
+
return transactionSignature;
|
|
731
866
|
}
|
|
732
|
-
async function
|
|
867
|
+
async function partiallySignTransaction(keyPairs, transaction) {
|
|
733
868
|
const compiledMessage = compileMessage(transaction);
|
|
734
869
|
const nextSignatures = "signatures" in transaction ? { ...transaction.signatures } : {};
|
|
870
|
+
const wireMessageBytes = getCompiledMessageEncoder().encode(compiledMessage);
|
|
735
871
|
const publicKeySignaturePairs = await Promise.all(
|
|
736
872
|
keyPairs.map(
|
|
737
|
-
(keyPair) => Promise.all([
|
|
738
|
-
addresses.getAddressFromPublicKey(keyPair.publicKey),
|
|
739
|
-
getCompiledMessageSignature(compiledMessage, keyPair.privateKey)
|
|
740
|
-
])
|
|
873
|
+
(keyPair) => Promise.all([addresses.getAddressFromPublicKey(keyPair.publicKey), keys.signBytes(keyPair.privateKey, wireMessageBytes)])
|
|
741
874
|
)
|
|
742
875
|
);
|
|
743
876
|
for (const [signerPublicKey, signature] of publicKeySignaturePairs) {
|
|
@@ -750,32 +883,47 @@ async function signTransaction(keyPairs, transaction) {
|
|
|
750
883
|
Object.freeze(out);
|
|
751
884
|
return out;
|
|
752
885
|
}
|
|
753
|
-
function
|
|
754
|
-
|
|
755
|
-
|
|
886
|
+
async function signTransaction(keyPairs, transaction) {
|
|
887
|
+
const out = await partiallySignTransaction(keyPairs, transaction);
|
|
888
|
+
assertTransactionIsFullySigned(out);
|
|
889
|
+
Object.freeze(out);
|
|
890
|
+
return out;
|
|
891
|
+
}
|
|
892
|
+
function assertTransactionIsFullySigned(transaction) {
|
|
893
|
+
const signerAddressesFromInstructions = transaction.instructions.flatMap((i) => i.accounts?.filter((a) => isSignerRole(a.role)) ?? []).map((a) => a.address);
|
|
894
|
+
const requiredSigners = /* @__PURE__ */ new Set([transaction.feePayer, ...signerAddressesFromInstructions]);
|
|
895
|
+
requiredSigners.forEach((address) => {
|
|
896
|
+
if (!transaction.signatures[address]) {
|
|
897
|
+
throw new Error(`Transaction is missing signature for address \`${address}\``);
|
|
898
|
+
}
|
|
899
|
+
});
|
|
756
900
|
}
|
|
757
|
-
|
|
758
|
-
// src/wire-transaction.ts
|
|
759
901
|
function getBase64EncodedWireTransaction(transaction) {
|
|
760
902
|
const wireTransactionBytes = getTransactionEncoder().encode(transaction);
|
|
761
|
-
|
|
762
|
-
return btoa(String.fromCharCode(...wireTransactionBytes));
|
|
763
|
-
}
|
|
903
|
+
return codecsStrings.getBase64Decoder().decode(wireTransactionBytes);
|
|
764
904
|
}
|
|
765
905
|
|
|
766
906
|
exports.appendTransactionInstruction = appendTransactionInstruction;
|
|
767
907
|
exports.assertIsBlockhash = assertIsBlockhash;
|
|
768
908
|
exports.assertIsDurableNonceTransaction = assertIsDurableNonceTransaction;
|
|
769
|
-
exports.
|
|
909
|
+
exports.assertIsTransactionWithBlockhashLifetime = assertIsTransactionWithBlockhashLifetime;
|
|
910
|
+
exports.assertTransactionIsFullySigned = assertTransactionIsFullySigned;
|
|
911
|
+
exports.compileMessage = compileMessage;
|
|
770
912
|
exports.createTransaction = createTransaction;
|
|
771
913
|
exports.getBase64EncodedWireTransaction = getBase64EncodedWireTransaction;
|
|
914
|
+
exports.getCompiledMessageCodec = getCompiledMessageCodec;
|
|
915
|
+
exports.getCompiledMessageDecoder = getCompiledMessageDecoder;
|
|
916
|
+
exports.getCompiledMessageEncoder = getCompiledMessageEncoder;
|
|
772
917
|
exports.getSignatureFromTransaction = getSignatureFromTransaction;
|
|
918
|
+
exports.getTransactionCodec = getTransactionCodec;
|
|
919
|
+
exports.getTransactionDecoder = getTransactionDecoder;
|
|
773
920
|
exports.getTransactionEncoder = getTransactionEncoder;
|
|
774
921
|
exports.isAdvanceNonceAccountInstruction = isAdvanceNonceAccountInstruction;
|
|
775
|
-
exports.
|
|
922
|
+
exports.partiallySignTransaction = partiallySignTransaction;
|
|
776
923
|
exports.prependTransactionInstruction = prependTransactionInstruction;
|
|
777
924
|
exports.setTransactionFeePayer = setTransactionFeePayer;
|
|
778
925
|
exports.setTransactionLifetimeUsingBlockhash = setTransactionLifetimeUsingBlockhash;
|
|
779
926
|
exports.setTransactionLifetimeUsingDurableNonce = setTransactionLifetimeUsingDurableNonce;
|
|
780
927
|
exports.signTransaction = signTransaction;
|
|
781
|
-
|
|
928
|
+
//# sourceMappingURL=out.js.map
|
|
929
|
+
//# sourceMappingURL=index.browser.cjs.map
|