@solana/transactions 2.0.0-experimental.a9e6db3 → 2.0.0-experimental.ab12c29
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 +272 -5
- package/dist/index.browser.cjs +496 -286
- package/dist/index.browser.cjs.map +1 -1
- package/dist/index.browser.js +491 -287
- package/dist/index.browser.js.map +1 -1
- package/dist/index.development.js +996 -1042
- package/dist/index.development.js.map +1 -1
- package/dist/index.native.js +491 -287
- package/dist/index.native.js.map +1 -1
- package/dist/index.node.cjs +496 -288
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.js +491 -289
- package/dist/index.node.js.map +1 -1
- package/dist/index.production.min.js +22 -16
- package/dist/types/accounts.d.ts +2 -2
- package/dist/types/accounts.d.ts.map +1 -0
- package/dist/types/blockhash.d.ts.map +1 -0
- 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 +2 -2
- package/dist/types/compile-address-table-lookups.d.ts.map +1 -0
- package/dist/types/compile-header.d.ts.map +1 -0
- package/dist/types/compile-instructions.d.ts.map +1 -0
- package/dist/types/compile-lifetime-token.d.ts.map +1 -0
- package/dist/types/compile-static-accounts.d.ts +2 -2
- package/dist/types/compile-static-accounts.d.ts.map +1 -0
- package/dist/types/compile-transaction.d.ts +5 -6
- package/dist/types/compile-transaction.d.ts.map +1 -0
- package/dist/types/create-transaction.d.ts.map +1 -0
- 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 +6 -6
- package/dist/types/durable-nonce.d.ts.map +1 -0
- package/dist/types/fee-payer.d.ts +4 -4
- package/dist/types/fee-payer.d.ts.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/instructions.d.ts.map +1 -0
- package/dist/types/message.d.ts +1 -5
- package/dist/types/message.d.ts.map +1 -0
- package/dist/types/serializers/address-table-lookup.d.ts +5 -3
- package/dist/types/serializers/address-table-lookup.d.ts.map +1 -0
- package/dist/types/serializers/header.d.ts.map +1 -0
- package/dist/types/serializers/index.d.ts +1 -0
- package/dist/types/serializers/index.d.ts.map +1 -0
- package/dist/types/serializers/instruction.d.ts +4 -2
- package/dist/types/serializers/instruction.d.ts.map +1 -0
- package/dist/types/serializers/message.d.ts +4 -4
- package/dist/types/serializers/message.d.ts.map +1 -0
- package/dist/types/serializers/transaction-version.d.ts.map +1 -0
- package/dist/types/serializers/transaction.d.ts +6 -5
- package/dist/types/serializers/transaction.d.ts.map +1 -0
- package/dist/types/signatures.d.ts +8 -12
- package/dist/types/signatures.d.ts.map +1 -0
- package/dist/types/types.d.ts +6 -13
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/unsigned-transaction.d.ts.map +1 -0
- package/dist/types/wire-transaction.d.ts +1 -1
- package/dist/types/wire-transaction.d.ts.map +1 -0
- package/package.json +14 -13
- package/dist/types/serializers/unimplemented.d.ts +0 -3
package/dist/index.browser.cjs
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var codecsStrings = require('@solana/codecs-strings');
|
|
4
4
|
var addresses = require('@solana/addresses');
|
|
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 functional = require('@solana/functional');
|
|
8
9
|
var keys = require('@solana/keys');
|
|
9
10
|
|
|
10
11
|
// ../build-scripts/env-shim.ts
|
|
@@ -25,7 +26,10 @@ function getUnsignedTransaction(transaction) {
|
|
|
25
26
|
}
|
|
26
27
|
|
|
27
28
|
// src/blockhash.ts
|
|
29
|
+
var base58Encoder;
|
|
28
30
|
function assertIsBlockhash(putativeBlockhash) {
|
|
31
|
+
if (!base58Encoder)
|
|
32
|
+
base58Encoder = codecsStrings.getBase58Encoder();
|
|
29
33
|
try {
|
|
30
34
|
if (
|
|
31
35
|
// Lowest value (32 bytes of zeroes)
|
|
@@ -34,8 +38,8 @@ function assertIsBlockhash(putativeBlockhash) {
|
|
|
34
38
|
) {
|
|
35
39
|
throw new Error("Expected input string to decode to a byte array of length 32.");
|
|
36
40
|
}
|
|
37
|
-
const
|
|
38
|
-
const numBytes =
|
|
41
|
+
const bytes = base58Encoder.encode(putativeBlockhash);
|
|
42
|
+
const numBytes = bytes.byteLength;
|
|
39
43
|
if (numBytes !== 32) {
|
|
40
44
|
throw new Error(`Expected input string to decode to a byte array of length 32. Actual length: ${numBytes}`);
|
|
41
45
|
}
|
|
@@ -120,7 +124,7 @@ function isAdvanceNonceAccountInstruction(instruction) {
|
|
|
120
124
|
instruction.accounts?.length === 3 && // First account is nonce account address
|
|
121
125
|
instruction.accounts[0].address != null && instruction.accounts[0].role === AccountRole.WRITABLE && // Second account is recent blockhashes sysvar
|
|
122
126
|
instruction.accounts[1].address === RECENT_BLOCKHASHES_SYSVAR_ADDRESS && instruction.accounts[1].role === AccountRole.READONLY && // Third account is nonce authority account
|
|
123
|
-
instruction.accounts[2].address != null && instruction.accounts[2].role
|
|
127
|
+
instruction.accounts[2].address != null && isSignerRole(instruction.accounts[2].role);
|
|
124
128
|
}
|
|
125
129
|
function isAdvanceNonceAccountInstructionData(data) {
|
|
126
130
|
return data.byteLength === 4 && data[0] === 4 && data[1] === 0 && data[2] === 0 && data[3] === 0;
|
|
@@ -128,21 +132,38 @@ function isAdvanceNonceAccountInstructionData(data) {
|
|
|
128
132
|
function isDurableNonceTransaction(transaction) {
|
|
129
133
|
return "lifetimeConstraint" in transaction && typeof transaction.lifetimeConstraint.nonce === "string" && transaction.instructions[0] != null && isAdvanceNonceAccountInstruction(transaction.instructions[0]);
|
|
130
134
|
}
|
|
135
|
+
function isAdvanceNonceAccountInstructionForNonce(instruction, nonceAccountAddress, nonceAuthorityAddress) {
|
|
136
|
+
return instruction.accounts[0].address === nonceAccountAddress && instruction.accounts[2].address === nonceAuthorityAddress;
|
|
137
|
+
}
|
|
131
138
|
function setTransactionLifetimeUsingDurableNonce({
|
|
132
139
|
nonce,
|
|
133
140
|
nonceAccountAddress,
|
|
134
141
|
nonceAuthorityAddress
|
|
135
142
|
}, transaction) {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
143
|
+
let newInstructions;
|
|
144
|
+
const firstInstruction = transaction.instructions[0];
|
|
145
|
+
if (firstInstruction && isAdvanceNonceAccountInstruction(firstInstruction)) {
|
|
146
|
+
if (isAdvanceNonceAccountInstructionForNonce(firstInstruction, nonceAccountAddress, nonceAuthorityAddress)) {
|
|
147
|
+
if (isDurableNonceTransaction(transaction) && transaction.lifetimeConstraint.nonce === nonce) {
|
|
148
|
+
return transaction;
|
|
149
|
+
} else {
|
|
150
|
+
newInstructions = [firstInstruction, ...transaction.instructions.slice(1)];
|
|
151
|
+
}
|
|
152
|
+
} else {
|
|
153
|
+
newInstructions = [
|
|
154
|
+
createAdvanceNonceAccountInstruction(nonceAccountAddress, nonceAuthorityAddress),
|
|
155
|
+
...transaction.instructions.slice(1)
|
|
156
|
+
];
|
|
157
|
+
}
|
|
158
|
+
} else {
|
|
159
|
+
newInstructions = [
|
|
160
|
+
createAdvanceNonceAccountInstruction(nonceAccountAddress, nonceAuthorityAddress),
|
|
161
|
+
...transaction.instructions
|
|
162
|
+
];
|
|
139
163
|
}
|
|
140
164
|
const out = {
|
|
141
165
|
...getUnsignedTransaction(transaction),
|
|
142
|
-
instructions:
|
|
143
|
-
createAdvanceNonceAccountInstruction(nonceAccountAddress, nonceAuthorityAddress),
|
|
144
|
-
...isAlreadyDurableNonceTransaction ? transaction.instructions.slice(1) : transaction.instructions
|
|
145
|
-
],
|
|
166
|
+
instructions: newInstructions,
|
|
146
167
|
lifetimeConstraint: {
|
|
147
168
|
nonce
|
|
148
169
|
}
|
|
@@ -233,7 +254,7 @@ function getAddressMapFromInstructions(feePayer, instructions) {
|
|
|
233
254
|
const shouldReplaceEntry = (
|
|
234
255
|
// Consider using the new LOOKUP_TABLE if its address is different...
|
|
235
256
|
entry.lookupTableAddress !== accountMeta.lookupTableAddress && // ...and sorts before the existing one.
|
|
236
|
-
(addressComparator
|
|
257
|
+
(addressComparator ||= addresses.getAddressComparator())(
|
|
237
258
|
accountMeta.lookupTableAddress,
|
|
238
259
|
entry.lookupTableAddress
|
|
239
260
|
) < 0
|
|
@@ -339,7 +360,7 @@ function getOrderedAccountsFromAddressMap(addressMap) {
|
|
|
339
360
|
if (leftIsWritable !== isWritableRole(rightEntry.role)) {
|
|
340
361
|
return leftIsWritable ? -1 : 1;
|
|
341
362
|
}
|
|
342
|
-
addressComparator
|
|
363
|
+
addressComparator ||= addresses.getAddressComparator();
|
|
343
364
|
if (leftEntry[TYPE] === 1 /* LOOKUP_TABLE */ && rightEntry[TYPE] === 1 /* LOOKUP_TABLE */ && leftEntry.lookupTableAddress !== rightEntry.lookupTableAddress) {
|
|
344
365
|
return addressComparator(leftEntry.lookupTableAddress, rightEntry.lookupTableAddress);
|
|
345
366
|
} else {
|
|
@@ -352,16 +373,15 @@ function getOrderedAccountsFromAddressMap(addressMap) {
|
|
|
352
373
|
return orderedAccounts;
|
|
353
374
|
}
|
|
354
375
|
function getCompiledAddressTableLookups(orderedAccounts) {
|
|
355
|
-
var _a;
|
|
356
376
|
const index = {};
|
|
357
377
|
for (const account of orderedAccounts) {
|
|
358
378
|
if (!("lookupTableAddress" in account)) {
|
|
359
379
|
continue;
|
|
360
380
|
}
|
|
361
|
-
const entry = index[
|
|
381
|
+
const entry = index[account.lookupTableAddress] ||= {
|
|
362
382
|
readableIndices: [],
|
|
363
383
|
writableIndices: []
|
|
364
|
-
}
|
|
384
|
+
};
|
|
365
385
|
if (account.role === AccountRole.WRITABLE) {
|
|
366
386
|
entry.writableIndices.push(account.addressIndex);
|
|
367
387
|
} else {
|
|
@@ -447,160 +467,189 @@ function compileMessage(transaction) {
|
|
|
447
467
|
version: transaction.version
|
|
448
468
|
};
|
|
449
469
|
}
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
signatures[ii] = transaction.signatures[compiledMessage.staticAccounts[ii]] ?? new Uint8Array(Array(64).fill(0));
|
|
459
|
-
}
|
|
460
|
-
} else {
|
|
461
|
-
signatures = Array(compiledMessage.header.numSignerAccounts).fill(new Uint8Array(Array(64).fill(0)));
|
|
462
|
-
}
|
|
463
|
-
return {
|
|
464
|
-
compiledMessage,
|
|
465
|
-
signatures
|
|
466
|
-
};
|
|
467
|
-
}
|
|
468
|
-
function addressSerializerCompat(compat) {
|
|
469
|
-
const codec = addresses.getAddressCodec();
|
|
470
|
-
return {
|
|
471
|
-
description: compat?.description ?? codec.description,
|
|
472
|
-
deserialize: codec.decode,
|
|
473
|
-
fixedSize: codec.fixedSize,
|
|
474
|
-
maxSize: codec.maxSize,
|
|
475
|
-
serialize: codec.encode
|
|
476
|
-
};
|
|
477
|
-
}
|
|
478
|
-
function getAddressTableLookupCodec() {
|
|
479
|
-
return umiSerializers.struct(
|
|
480
|
-
[
|
|
470
|
+
var lookupTableAddressDescription = __DEV__ ? "The address of the address lookup table account from which instruction addresses should be looked up" : "lookupTableAddress";
|
|
471
|
+
var writableIndicesDescription = __DEV__ ? "The indices of the accounts in the lookup table that should be loaded as writeable" : "writableIndices";
|
|
472
|
+
var readableIndicesDescription = __DEV__ ? "The indices of the accounts in the lookup table that should be loaded as read-only" : "readableIndices";
|
|
473
|
+
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";
|
|
474
|
+
var memoizedAddressTableLookupEncoder;
|
|
475
|
+
function getAddressTableLookupEncoder() {
|
|
476
|
+
if (!memoizedAddressTableLookupEncoder) {
|
|
477
|
+
memoizedAddressTableLookupEncoder = codecsDataStructures.getStructEncoder(
|
|
481
478
|
[
|
|
482
|
-
"lookupTableAddress",
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
479
|
+
["lookupTableAddress", addresses.getAddressEncoder({ description: lookupTableAddressDescription })],
|
|
480
|
+
[
|
|
481
|
+
"writableIndices",
|
|
482
|
+
codecsDataStructures.getArrayEncoder(codecsNumbers.getU8Encoder(), {
|
|
483
|
+
description: writableIndicesDescription,
|
|
484
|
+
size: codecsNumbers.getShortU16Encoder()
|
|
485
|
+
})
|
|
486
|
+
],
|
|
487
|
+
[
|
|
488
|
+
"readableIndices",
|
|
489
|
+
codecsDataStructures.getArrayEncoder(codecsNumbers.getU8Encoder(), {
|
|
490
|
+
description: readableIndicesDescription,
|
|
491
|
+
size: codecsNumbers.getShortU16Encoder()
|
|
492
|
+
})
|
|
493
|
+
]
|
|
488
494
|
],
|
|
495
|
+
{ description: addressTableLookupDescription }
|
|
496
|
+
);
|
|
497
|
+
}
|
|
498
|
+
return memoizedAddressTableLookupEncoder;
|
|
499
|
+
}
|
|
500
|
+
var memoizedAddressTableLookupDecoder;
|
|
501
|
+
function getAddressTableLookupDecoder() {
|
|
502
|
+
if (!memoizedAddressTableLookupDecoder) {
|
|
503
|
+
memoizedAddressTableLookupDecoder = codecsDataStructures.getStructDecoder(
|
|
489
504
|
[
|
|
490
|
-
"
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
505
|
+
["lookupTableAddress", addresses.getAddressDecoder({ description: lookupTableAddressDescription })],
|
|
506
|
+
[
|
|
507
|
+
"writableIndices",
|
|
508
|
+
codecsDataStructures.getArrayDecoder(codecsNumbers.getU8Decoder(), {
|
|
509
|
+
description: writableIndicesDescription,
|
|
510
|
+
size: codecsNumbers.getShortU16Decoder()
|
|
511
|
+
})
|
|
512
|
+
],
|
|
513
|
+
[
|
|
514
|
+
"readableIndices",
|
|
515
|
+
codecsDataStructures.getArrayDecoder(codecsNumbers.getU8Decoder(), {
|
|
516
|
+
description: readableIndicesDescription,
|
|
517
|
+
size: codecsNumbers.getShortU16Decoder()
|
|
518
|
+
})
|
|
519
|
+
]
|
|
497
520
|
],
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
521
|
+
{ description: addressTableLookupDescription }
|
|
522
|
+
);
|
|
523
|
+
}
|
|
524
|
+
return memoizedAddressTableLookupDecoder;
|
|
525
|
+
}
|
|
526
|
+
var memoizedU8Encoder;
|
|
527
|
+
function getMemoizedU8Encoder() {
|
|
528
|
+
if (!memoizedU8Encoder)
|
|
529
|
+
memoizedU8Encoder = codecsNumbers.getU8Encoder();
|
|
530
|
+
return memoizedU8Encoder;
|
|
531
|
+
}
|
|
532
|
+
function getMemoizedU8EncoderDescription(description) {
|
|
533
|
+
const encoder = getMemoizedU8Encoder();
|
|
534
|
+
return {
|
|
535
|
+
...encoder,
|
|
536
|
+
description: description ?? encoder.description
|
|
537
|
+
};
|
|
512
538
|
}
|
|
513
|
-
var
|
|
514
|
-
function
|
|
515
|
-
if (!
|
|
516
|
-
|
|
517
|
-
return
|
|
539
|
+
var memoizedU8Decoder;
|
|
540
|
+
function getMemoizedU8Decoder() {
|
|
541
|
+
if (!memoizedU8Decoder)
|
|
542
|
+
memoizedU8Decoder = codecsNumbers.getU8Decoder();
|
|
543
|
+
return memoizedU8Decoder;
|
|
518
544
|
}
|
|
519
|
-
function
|
|
520
|
-
const
|
|
545
|
+
function getMemoizedU8DecoderDescription(description) {
|
|
546
|
+
const decoder = getMemoizedU8Decoder();
|
|
521
547
|
return {
|
|
522
|
-
...
|
|
523
|
-
description: description ??
|
|
548
|
+
...decoder,
|
|
549
|
+
description: description ?? decoder.description
|
|
524
550
|
};
|
|
525
551
|
}
|
|
526
552
|
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;
|
|
527
553
|
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;
|
|
528
554
|
var numReadonlyNonSignerAccountsDescription = __DEV__ ? "The expected number of addresses in the static address list belonging to accounts that are neither signers, nor writable" : void 0;
|
|
529
555
|
var messageHeaderDescription = __DEV__ ? "The transaction message header containing counts of the signer, readonly-signer, and readonly-nonsigner account addresses" : void 0;
|
|
530
|
-
function
|
|
531
|
-
return codecsDataStructures.
|
|
556
|
+
function getMessageHeaderEncoder() {
|
|
557
|
+
return codecsDataStructures.getStructEncoder(
|
|
532
558
|
[
|
|
533
|
-
["numSignerAccounts",
|
|
534
|
-
["numReadonlySignerAccounts",
|
|
535
|
-
["numReadonlyNonSignerAccounts",
|
|
559
|
+
["numSignerAccounts", getMemoizedU8EncoderDescription(numSignerAccountsDescription)],
|
|
560
|
+
["numReadonlySignerAccounts", getMemoizedU8EncoderDescription(numReadonlySignerAccountsDescription)],
|
|
561
|
+
["numReadonlyNonSignerAccounts", getMemoizedU8EncoderDescription(numReadonlyNonSignerAccountsDescription)]
|
|
536
562
|
],
|
|
537
563
|
{
|
|
538
564
|
description: messageHeaderDescription
|
|
539
565
|
}
|
|
540
566
|
);
|
|
541
567
|
}
|
|
542
|
-
function
|
|
543
|
-
return
|
|
544
|
-
|
|
545
|
-
[
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
)
|
|
552
|
-
],
|
|
553
|
-
[
|
|
554
|
-
"accountIndices",
|
|
555
|
-
umiSerializers.array(
|
|
556
|
-
umiSerializers.u8({
|
|
557
|
-
description: __DEV__ ? "The index of an account, according to the well-ordered accounts list for this transaction" : ""
|
|
558
|
-
}),
|
|
559
|
-
{
|
|
560
|
-
description: __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" : "",
|
|
561
|
-
size: umiSerializers.shortU16()
|
|
562
|
-
}
|
|
563
|
-
)
|
|
564
|
-
],
|
|
565
|
-
[
|
|
566
|
-
"data",
|
|
567
|
-
umiSerializers.bytes({
|
|
568
|
-
description: __DEV__ ? "An optional buffer of data passed to the instruction" : "",
|
|
569
|
-
size: umiSerializers.shortU16()
|
|
570
|
-
})
|
|
571
|
-
]
|
|
572
|
-
]),
|
|
573
|
-
(value) => {
|
|
574
|
-
if (value.accountIndices !== void 0 && value.data !== void 0) {
|
|
575
|
-
return value;
|
|
576
|
-
}
|
|
577
|
-
return {
|
|
578
|
-
...value,
|
|
579
|
-
accountIndices: value.accountIndices ?? [],
|
|
580
|
-
data: value.data ?? new Uint8Array(0)
|
|
581
|
-
};
|
|
582
|
-
},
|
|
583
|
-
(value) => {
|
|
584
|
-
if (value.accountIndices.length && value.data.byteLength) {
|
|
585
|
-
return value;
|
|
586
|
-
}
|
|
587
|
-
const { accountIndices, data, ...rest } = value;
|
|
588
|
-
return {
|
|
589
|
-
...rest,
|
|
590
|
-
...accountIndices.length ? { accountIndices } : null,
|
|
591
|
-
...data.byteLength ? { data } : null
|
|
592
|
-
};
|
|
568
|
+
function getMessageHeaderDecoder() {
|
|
569
|
+
return codecsDataStructures.getStructDecoder(
|
|
570
|
+
[
|
|
571
|
+
["numSignerAccounts", getMemoizedU8DecoderDescription(numSignerAccountsDescription)],
|
|
572
|
+
["numReadonlySignerAccounts", getMemoizedU8DecoderDescription(numReadonlySignerAccountsDescription)],
|
|
573
|
+
["numReadonlyNonSignerAccounts", getMemoizedU8DecoderDescription(numReadonlyNonSignerAccountsDescription)]
|
|
574
|
+
],
|
|
575
|
+
{
|
|
576
|
+
description: messageHeaderDescription
|
|
593
577
|
}
|
|
594
578
|
);
|
|
595
579
|
}
|
|
580
|
+
var programAddressIndexDescription = __DEV__ ? "The index of the program being called, according to the well-ordered accounts list for this transaction" : "programAddressIndex";
|
|
581
|
+
var accountIndexDescription = __DEV__ ? "The index of an account, according to the well-ordered accounts list for this transaction" : void 0;
|
|
582
|
+
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";
|
|
583
|
+
var dataDescription = __DEV__ ? "An optional buffer of data passed to the instruction" : "data";
|
|
584
|
+
var memoizedGetInstructionEncoder;
|
|
585
|
+
function getInstructionEncoder() {
|
|
586
|
+
if (!memoizedGetInstructionEncoder) {
|
|
587
|
+
memoizedGetInstructionEncoder = codecsCore.mapEncoder(
|
|
588
|
+
codecsDataStructures.getStructEncoder([
|
|
589
|
+
["programAddressIndex", codecsNumbers.getU8Encoder({ description: programAddressIndexDescription })],
|
|
590
|
+
[
|
|
591
|
+
"accountIndices",
|
|
592
|
+
codecsDataStructures.getArrayEncoder(codecsNumbers.getU8Encoder({ description: accountIndexDescription }), {
|
|
593
|
+
description: accountIndicesDescription,
|
|
594
|
+
size: codecsNumbers.getShortU16Encoder()
|
|
595
|
+
})
|
|
596
|
+
],
|
|
597
|
+
["data", codecsDataStructures.getBytesEncoder({ description: dataDescription, size: codecsNumbers.getShortU16Encoder() })]
|
|
598
|
+
]),
|
|
599
|
+
// Convert an instruction to have all fields defined
|
|
600
|
+
(instruction) => {
|
|
601
|
+
if (instruction.accountIndices !== void 0 && instruction.data !== void 0) {
|
|
602
|
+
return instruction;
|
|
603
|
+
}
|
|
604
|
+
return {
|
|
605
|
+
...instruction,
|
|
606
|
+
accountIndices: instruction.accountIndices ?? [],
|
|
607
|
+
data: instruction.data ?? new Uint8Array(0)
|
|
608
|
+
};
|
|
609
|
+
}
|
|
610
|
+
);
|
|
611
|
+
}
|
|
612
|
+
return memoizedGetInstructionEncoder;
|
|
613
|
+
}
|
|
614
|
+
var memoizedGetInstructionDecoder;
|
|
615
|
+
function getInstructionDecoder() {
|
|
616
|
+
if (!memoizedGetInstructionDecoder) {
|
|
617
|
+
memoizedGetInstructionDecoder = codecsCore.mapDecoder(
|
|
618
|
+
codecsDataStructures.getStructDecoder([
|
|
619
|
+
["programAddressIndex", codecsNumbers.getU8Decoder({ description: programAddressIndexDescription })],
|
|
620
|
+
[
|
|
621
|
+
"accountIndices",
|
|
622
|
+
codecsDataStructures.getArrayDecoder(codecsNumbers.getU8Decoder({ description: accountIndexDescription }), {
|
|
623
|
+
description: accountIndicesDescription,
|
|
624
|
+
size: codecsNumbers.getShortU16Decoder()
|
|
625
|
+
})
|
|
626
|
+
],
|
|
627
|
+
["data", codecsDataStructures.getBytesDecoder({ description: dataDescription, size: codecsNumbers.getShortU16Decoder() })]
|
|
628
|
+
]),
|
|
629
|
+
// Convert an instruction to exclude optional fields if they are empty
|
|
630
|
+
(instruction) => {
|
|
631
|
+
if (instruction.accountIndices.length && instruction.data.byteLength) {
|
|
632
|
+
return instruction;
|
|
633
|
+
}
|
|
634
|
+
const { accountIndices, data, ...rest } = instruction;
|
|
635
|
+
return {
|
|
636
|
+
...rest,
|
|
637
|
+
...accountIndices.length ? { accountIndices } : null,
|
|
638
|
+
...data.byteLength ? { data } : null
|
|
639
|
+
};
|
|
640
|
+
}
|
|
641
|
+
);
|
|
642
|
+
}
|
|
643
|
+
return memoizedGetInstructionDecoder;
|
|
644
|
+
}
|
|
596
645
|
var VERSION_FLAG_MASK = 128;
|
|
597
646
|
var BASE_CONFIG = {
|
|
598
647
|
description: __DEV__ ? "A single byte that encodes the version of the transaction" : "",
|
|
599
648
|
fixedSize: null,
|
|
600
649
|
maxSize: 1
|
|
601
650
|
};
|
|
602
|
-
function decode(
|
|
603
|
-
const firstByte =
|
|
651
|
+
function decode(bytes, offset = 0) {
|
|
652
|
+
const firstByte = bytes[offset];
|
|
604
653
|
if ((firstByte & VERSION_FLAG_MASK) === 0) {
|
|
605
654
|
return ["legacy", offset];
|
|
606
655
|
} else {
|
|
@@ -629,185 +678,333 @@ function getTransactionVersionEncoder() {
|
|
|
629
678
|
encode
|
|
630
679
|
};
|
|
631
680
|
}
|
|
632
|
-
function getTransactionVersionCodec() {
|
|
633
|
-
return codecsCore.combineCodec(getTransactionVersionEncoder(), getTransactionVersionDecoder());
|
|
634
|
-
}
|
|
635
|
-
|
|
636
|
-
// src/serializers/unimplemented.ts
|
|
637
|
-
function getError(type, name) {
|
|
638
|
-
const functionSuffix = name + type[0].toUpperCase() + type.slice(1);
|
|
639
|
-
return new Error(
|
|
640
|
-
`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}`
|
|
641
|
-
);
|
|
642
|
-
}
|
|
643
|
-
function getUnimplementedDecoder(name) {
|
|
644
|
-
return () => {
|
|
645
|
-
throw getError("decoder", name);
|
|
646
|
-
};
|
|
647
|
-
}
|
|
648
681
|
|
|
649
682
|
// src/serializers/message.ts
|
|
650
|
-
var
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
if (compiledMessage.version === "legacy") {
|
|
657
|
-
return umiSerializers.struct(getPreludeStructSerializerTuple()).serialize(compiledMessage);
|
|
658
|
-
} else {
|
|
659
|
-
return umiSerializers.mapSerializer(
|
|
660
|
-
umiSerializers.struct([
|
|
661
|
-
...getPreludeStructSerializerTuple(),
|
|
662
|
-
["addressTableLookups", getAddressTableLookupsSerializer()]
|
|
663
|
-
]),
|
|
664
|
-
(value) => {
|
|
665
|
-
if (value.version === "legacy") {
|
|
666
|
-
return value;
|
|
667
|
-
}
|
|
668
|
-
return {
|
|
669
|
-
...value,
|
|
670
|
-
addressTableLookups: value.addressTableLookups ?? []
|
|
671
|
-
};
|
|
672
|
-
}
|
|
673
|
-
).serialize(compiledMessage);
|
|
674
|
-
}
|
|
683
|
+
var staticAccountsDescription = __DEV__ ? "A compact-array of static account addresses belonging to this transaction" : "staticAccounts";
|
|
684
|
+
var lifetimeTokenDescription = __DEV__ ? "A 32-byte token that specifies the lifetime of this transaction (eg. a recent blockhash, or a durable nonce)" : "lifetimeToken";
|
|
685
|
+
var instructionsDescription = __DEV__ ? "A compact-array of instructions belonging to this transaction" : "instructions";
|
|
686
|
+
var addressTableLookupsDescription = __DEV__ ? "A compact array of address table lookups belonging to this transaction" : "addressTableLookups";
|
|
687
|
+
function getCompiledMessageLegacyEncoder() {
|
|
688
|
+
return codecsDataStructures.getStructEncoder(getPreludeStructEncoderTuple());
|
|
675
689
|
}
|
|
676
|
-
function
|
|
677
|
-
return
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
690
|
+
function getCompiledMessageVersionedEncoder() {
|
|
691
|
+
return codecsCore.mapEncoder(
|
|
692
|
+
codecsDataStructures.getStructEncoder([
|
|
693
|
+
...getPreludeStructEncoderTuple(),
|
|
694
|
+
["addressTableLookups", getAddressTableLookupArrayEncoder()]
|
|
695
|
+
]),
|
|
696
|
+
(value) => {
|
|
697
|
+
if (value.version === "legacy") {
|
|
698
|
+
return value;
|
|
699
|
+
}
|
|
700
|
+
return {
|
|
701
|
+
...value,
|
|
702
|
+
addressTableLookups: value.addressTableLookups ?? []
|
|
703
|
+
};
|
|
704
|
+
}
|
|
705
|
+
);
|
|
684
706
|
}
|
|
685
|
-
function
|
|
707
|
+
function getPreludeStructEncoderTuple() {
|
|
686
708
|
return [
|
|
687
|
-
["version",
|
|
688
|
-
["header",
|
|
709
|
+
["version", getTransactionVersionEncoder()],
|
|
710
|
+
["header", getMessageHeaderEncoder()],
|
|
689
711
|
[
|
|
690
712
|
"staticAccounts",
|
|
691
|
-
|
|
692
|
-
description:
|
|
693
|
-
size:
|
|
713
|
+
codecsDataStructures.getArrayEncoder(addresses.getAddressEncoder(), {
|
|
714
|
+
description: staticAccountsDescription,
|
|
715
|
+
size: codecsNumbers.getShortU16Encoder()
|
|
694
716
|
})
|
|
695
717
|
],
|
|
696
718
|
[
|
|
697
719
|
"lifetimeToken",
|
|
698
|
-
|
|
699
|
-
description:
|
|
700
|
-
encoding:
|
|
720
|
+
codecsStrings.getStringEncoder({
|
|
721
|
+
description: lifetimeTokenDescription,
|
|
722
|
+
encoding: codecsStrings.getBase58Encoder(),
|
|
701
723
|
size: 32
|
|
702
724
|
})
|
|
703
725
|
],
|
|
704
726
|
[
|
|
705
727
|
"instructions",
|
|
706
|
-
|
|
707
|
-
description:
|
|
708
|
-
size:
|
|
728
|
+
codecsDataStructures.getArrayEncoder(getInstructionEncoder(), {
|
|
729
|
+
description: instructionsDescription,
|
|
730
|
+
size: codecsNumbers.getShortU16Encoder()
|
|
709
731
|
})
|
|
710
732
|
]
|
|
711
733
|
];
|
|
712
734
|
}
|
|
713
|
-
function
|
|
714
|
-
return
|
|
715
|
-
|
|
716
|
-
|
|
735
|
+
function getPreludeStructDecoderTuple() {
|
|
736
|
+
return [
|
|
737
|
+
["version", getTransactionVersionDecoder()],
|
|
738
|
+
["header", getMessageHeaderDecoder()],
|
|
739
|
+
[
|
|
740
|
+
"staticAccounts",
|
|
741
|
+
codecsDataStructures.getArrayDecoder(addresses.getAddressDecoder(), {
|
|
742
|
+
description: staticAccountsDescription,
|
|
743
|
+
size: codecsNumbers.getShortU16Decoder()
|
|
744
|
+
})
|
|
745
|
+
],
|
|
746
|
+
[
|
|
747
|
+
"lifetimeToken",
|
|
748
|
+
codecsStrings.getStringDecoder({
|
|
749
|
+
description: lifetimeTokenDescription,
|
|
750
|
+
encoding: codecsStrings.getBase58Decoder(),
|
|
751
|
+
size: 32
|
|
752
|
+
})
|
|
753
|
+
],
|
|
754
|
+
[
|
|
755
|
+
"instructions",
|
|
756
|
+
codecsDataStructures.getArrayDecoder(getInstructionDecoder(), {
|
|
757
|
+
description: instructionsDescription,
|
|
758
|
+
size: codecsNumbers.getShortU16Decoder()
|
|
759
|
+
})
|
|
760
|
+
],
|
|
761
|
+
["addressTableLookups", getAddressTableLookupArrayDecoder()]
|
|
762
|
+
];
|
|
763
|
+
}
|
|
764
|
+
function getAddressTableLookupArrayEncoder() {
|
|
765
|
+
return codecsDataStructures.getArrayEncoder(getAddressTableLookupEncoder(), {
|
|
766
|
+
description: addressTableLookupsDescription,
|
|
767
|
+
size: codecsNumbers.getShortU16Encoder()
|
|
768
|
+
});
|
|
769
|
+
}
|
|
770
|
+
function getAddressTableLookupArrayDecoder() {
|
|
771
|
+
return codecsDataStructures.getArrayDecoder(getAddressTableLookupDecoder(), {
|
|
772
|
+
description: addressTableLookupsDescription,
|
|
773
|
+
size: codecsNumbers.getShortU16Decoder()
|
|
717
774
|
});
|
|
718
775
|
}
|
|
776
|
+
var messageDescription = __DEV__ ? "The wire format of a Solana transaction message" : "message";
|
|
719
777
|
function getCompiledMessageEncoder() {
|
|
720
778
|
return {
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
779
|
+
description: messageDescription,
|
|
780
|
+
encode: (compiledMessage) => {
|
|
781
|
+
if (compiledMessage.version === "legacy") {
|
|
782
|
+
return getCompiledMessageLegacyEncoder().encode(compiledMessage);
|
|
783
|
+
} else {
|
|
784
|
+
return getCompiledMessageVersionedEncoder().encode(compiledMessage);
|
|
785
|
+
}
|
|
786
|
+
},
|
|
787
|
+
fixedSize: null,
|
|
788
|
+
maxSize: null
|
|
724
789
|
};
|
|
725
790
|
}
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
umiSerializers.array(umiSerializers.bytes({ size: 64 }), {
|
|
739
|
-
...__DEV__ ? { description: "A compact array of 64-byte, base-64 encoded Ed25519 signatures" } : null,
|
|
740
|
-
size: umiSerializers.shortU16()
|
|
741
|
-
})
|
|
742
|
-
],
|
|
743
|
-
["compiledMessage", getCompiledMessageEncoder()]
|
|
744
|
-
]).serialize(compiledTransaction);
|
|
791
|
+
function getCompiledMessageDecoder() {
|
|
792
|
+
return codecsCore.mapDecoder(
|
|
793
|
+
codecsDataStructures.getStructDecoder(getPreludeStructDecoderTuple(), {
|
|
794
|
+
description: messageDescription
|
|
795
|
+
}),
|
|
796
|
+
({ addressTableLookups, ...restOfMessage }) => {
|
|
797
|
+
if (restOfMessage.version === "legacy" || !addressTableLookups?.length) {
|
|
798
|
+
return restOfMessage;
|
|
799
|
+
}
|
|
800
|
+
return { ...restOfMessage, addressTableLookups };
|
|
801
|
+
}
|
|
802
|
+
);
|
|
745
803
|
}
|
|
746
|
-
function
|
|
804
|
+
function getCompiledMessageCodec() {
|
|
805
|
+
return codecsCore.combineCodec(getCompiledMessageEncoder(), getCompiledMessageDecoder());
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
// src/compile-transaction.ts
|
|
809
|
+
function getCompiledTransaction(transaction) {
|
|
810
|
+
const compiledMessage = compileMessage(transaction);
|
|
811
|
+
let signatures;
|
|
812
|
+
if ("signatures" in transaction) {
|
|
813
|
+
signatures = [];
|
|
814
|
+
for (let ii = 0; ii < compiledMessage.header.numSignerAccounts; ii++) {
|
|
815
|
+
signatures[ii] = transaction.signatures[compiledMessage.staticAccounts[ii]] ?? new Uint8Array(Array(64).fill(0));
|
|
816
|
+
}
|
|
817
|
+
} else {
|
|
818
|
+
signatures = Array(compiledMessage.header.numSignerAccounts).fill(new Uint8Array(Array(64).fill(0)));
|
|
819
|
+
}
|
|
747
820
|
return {
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
serialize: serialize2
|
|
821
|
+
compiledMessage,
|
|
822
|
+
signatures
|
|
751
823
|
};
|
|
752
824
|
}
|
|
753
|
-
function
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
825
|
+
function getAccountMetas(message) {
|
|
826
|
+
const { header } = message;
|
|
827
|
+
const numWritableSignerAccounts = header.numSignerAccounts - header.numReadonlySignerAccounts;
|
|
828
|
+
const numWritableNonSignerAccounts = message.staticAccounts.length - header.numSignerAccounts - header.numReadonlyNonSignerAccounts;
|
|
829
|
+
const accountMetas = [];
|
|
830
|
+
let accountIndex = 0;
|
|
831
|
+
for (let i = 0; i < numWritableSignerAccounts; i++) {
|
|
832
|
+
accountMetas.push({
|
|
833
|
+
address: message.staticAccounts[accountIndex],
|
|
834
|
+
role: AccountRole.WRITABLE_SIGNER
|
|
835
|
+
});
|
|
836
|
+
accountIndex++;
|
|
837
|
+
}
|
|
838
|
+
for (let i = 0; i < header.numReadonlySignerAccounts; i++) {
|
|
839
|
+
accountMetas.push({
|
|
840
|
+
address: message.staticAccounts[accountIndex],
|
|
841
|
+
role: AccountRole.READONLY_SIGNER
|
|
842
|
+
});
|
|
843
|
+
accountIndex++;
|
|
844
|
+
}
|
|
845
|
+
for (let i = 0; i < numWritableNonSignerAccounts; i++) {
|
|
846
|
+
accountMetas.push({
|
|
847
|
+
address: message.staticAccounts[accountIndex],
|
|
848
|
+
role: AccountRole.WRITABLE
|
|
849
|
+
});
|
|
850
|
+
accountIndex++;
|
|
851
|
+
}
|
|
852
|
+
for (let i = 0; i < header.numReadonlyNonSignerAccounts; i++) {
|
|
853
|
+
accountMetas.push({
|
|
854
|
+
address: message.staticAccounts[accountIndex],
|
|
855
|
+
role: AccountRole.READONLY
|
|
770
856
|
});
|
|
857
|
+
accountIndex++;
|
|
771
858
|
}
|
|
859
|
+
return accountMetas;
|
|
772
860
|
}
|
|
773
|
-
function
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
)
|
|
779
|
-
|
|
861
|
+
function convertInstruction(instruction, accountMetas) {
|
|
862
|
+
const programAddress = accountMetas[instruction.programAddressIndex]?.address;
|
|
863
|
+
if (!programAddress) {
|
|
864
|
+
throw new Error(`Could not find program address at index ${instruction.programAddressIndex}`);
|
|
865
|
+
}
|
|
866
|
+
const accounts = instruction.accountIndices?.map((accountIndex) => accountMetas[accountIndex]);
|
|
867
|
+
const { data } = instruction;
|
|
868
|
+
return {
|
|
869
|
+
programAddress,
|
|
870
|
+
...accounts && accounts.length ? { accounts } : {},
|
|
871
|
+
...data && data.length ? { data } : {}
|
|
872
|
+
};
|
|
873
|
+
}
|
|
874
|
+
function getLifetimeConstraint(messageLifetimeToken, firstInstruction, lastValidBlockHeight) {
|
|
875
|
+
if (!firstInstruction || !isAdvanceNonceAccountInstruction(firstInstruction)) {
|
|
876
|
+
return {
|
|
877
|
+
blockhash: messageLifetimeToken,
|
|
878
|
+
lastValidBlockHeight: lastValidBlockHeight ?? 2n ** 64n - 1n
|
|
879
|
+
// U64 MAX
|
|
880
|
+
};
|
|
881
|
+
} else {
|
|
882
|
+
const nonceAccountAddress = firstInstruction.accounts[0].address;
|
|
883
|
+
addresses.assertIsAddress(nonceAccountAddress);
|
|
884
|
+
const nonceAuthorityAddress = firstInstruction.accounts[2].address;
|
|
885
|
+
addresses.assertIsAddress(nonceAuthorityAddress);
|
|
886
|
+
return {
|
|
887
|
+
nonce: messageLifetimeToken,
|
|
888
|
+
nonceAccountAddress,
|
|
889
|
+
nonceAuthorityAddress
|
|
890
|
+
};
|
|
780
891
|
}
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
892
|
+
}
|
|
893
|
+
function convertSignatures(compiledTransaction) {
|
|
894
|
+
const {
|
|
895
|
+
compiledMessage: { staticAccounts },
|
|
896
|
+
signatures
|
|
897
|
+
} = compiledTransaction;
|
|
898
|
+
return signatures.reduce((acc, sig, index) => {
|
|
899
|
+
const allZeros = sig.every((byte) => byte === 0);
|
|
900
|
+
if (allZeros)
|
|
901
|
+
return acc;
|
|
902
|
+
const address = staticAccounts[index];
|
|
903
|
+
return { ...acc, [address]: sig };
|
|
904
|
+
}, {});
|
|
905
|
+
}
|
|
906
|
+
function decompileTransaction(compiledTransaction, lastValidBlockHeight) {
|
|
907
|
+
const { compiledMessage } = compiledTransaction;
|
|
908
|
+
if ("addressTableLookups" in compiledMessage && compiledMessage.addressTableLookups.length > 0) {
|
|
909
|
+
throw new Error("Cannot convert transaction with addressTableLookups");
|
|
785
910
|
}
|
|
786
|
-
|
|
911
|
+
const feePayer = compiledMessage.staticAccounts[0];
|
|
912
|
+
if (!feePayer)
|
|
913
|
+
throw new Error("No fee payer set in CompiledTransaction");
|
|
914
|
+
const accountMetas = getAccountMetas(compiledMessage);
|
|
915
|
+
const instructions = compiledMessage.instructions.map(
|
|
916
|
+
(compiledInstruction) => convertInstruction(compiledInstruction, accountMetas)
|
|
917
|
+
);
|
|
918
|
+
const firstInstruction = instructions[0];
|
|
919
|
+
const lifetimeConstraint = getLifetimeConstraint(
|
|
920
|
+
compiledMessage.lifetimeToken,
|
|
921
|
+
firstInstruction,
|
|
922
|
+
lastValidBlockHeight
|
|
923
|
+
);
|
|
924
|
+
const signatures = convertSignatures(compiledTransaction);
|
|
925
|
+
return functional.pipe(
|
|
926
|
+
createTransaction({ version: compiledMessage.version }),
|
|
927
|
+
(tx) => setTransactionFeePayer(feePayer, tx),
|
|
928
|
+
(tx) => instructions.reduce((acc, instruction) => {
|
|
929
|
+
return appendTransactionInstruction(instruction, acc);
|
|
930
|
+
}, tx),
|
|
931
|
+
(tx) => "blockhash" in lifetimeConstraint ? setTransactionLifetimeUsingBlockhash(lifetimeConstraint, tx) : setTransactionLifetimeUsingDurableNonce(lifetimeConstraint, tx),
|
|
932
|
+
(tx) => compiledTransaction.signatures.length ? { ...tx, signatures } : tx
|
|
933
|
+
);
|
|
934
|
+
}
|
|
935
|
+
|
|
936
|
+
// src/serializers/transaction.ts
|
|
937
|
+
var signaturesDescription = __DEV__ ? "A compact array of 64-byte, base-64 encoded Ed25519 signatures" : "signatures";
|
|
938
|
+
var transactionDescription = __DEV__ ? "The wire format of a Solana transaction" : "transaction";
|
|
939
|
+
function getCompiledTransactionEncoder() {
|
|
940
|
+
return codecsDataStructures.getStructEncoder(
|
|
941
|
+
[
|
|
942
|
+
[
|
|
943
|
+
"signatures",
|
|
944
|
+
codecsDataStructures.getArrayEncoder(codecsDataStructures.getBytesEncoder({ size: 64 }), {
|
|
945
|
+
description: signaturesDescription,
|
|
946
|
+
size: codecsNumbers.getShortU16Encoder()
|
|
947
|
+
})
|
|
948
|
+
],
|
|
949
|
+
["compiledMessage", getCompiledMessageEncoder()]
|
|
950
|
+
],
|
|
951
|
+
{
|
|
952
|
+
description: transactionDescription
|
|
953
|
+
}
|
|
954
|
+
);
|
|
955
|
+
}
|
|
956
|
+
function getSignatureDecoder() {
|
|
957
|
+
return codecsCore.mapDecoder(codecsDataStructures.getBytesDecoder({ size: 64 }), (bytes) => bytes);
|
|
958
|
+
}
|
|
959
|
+
function getCompiledTransactionDecoder() {
|
|
960
|
+
return codecsDataStructures.getStructDecoder(
|
|
961
|
+
[
|
|
962
|
+
[
|
|
963
|
+
"signatures",
|
|
964
|
+
codecsDataStructures.getArrayDecoder(getSignatureDecoder(), {
|
|
965
|
+
description: signaturesDescription,
|
|
966
|
+
size: codecsNumbers.getShortU16Decoder()
|
|
967
|
+
})
|
|
968
|
+
],
|
|
969
|
+
["compiledMessage", getCompiledMessageDecoder()]
|
|
970
|
+
],
|
|
971
|
+
{
|
|
972
|
+
description: transactionDescription
|
|
973
|
+
}
|
|
974
|
+
);
|
|
975
|
+
}
|
|
976
|
+
function getTransactionEncoder() {
|
|
977
|
+
return codecsCore.mapEncoder(getCompiledTransactionEncoder(), getCompiledTransaction);
|
|
787
978
|
}
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
979
|
+
function getTransactionDecoder(lastValidBlockHeight) {
|
|
980
|
+
return codecsCore.mapDecoder(
|
|
981
|
+
getCompiledTransactionDecoder(),
|
|
982
|
+
(compiledTransaction) => decompileTransaction(compiledTransaction, lastValidBlockHeight)
|
|
983
|
+
);
|
|
792
984
|
}
|
|
985
|
+
function getTransactionCodec(lastValidBlockHeight) {
|
|
986
|
+
return codecsCore.combineCodec(getTransactionEncoder(), getTransactionDecoder(lastValidBlockHeight));
|
|
987
|
+
}
|
|
988
|
+
var base58Decoder;
|
|
793
989
|
function getSignatureFromTransaction(transaction) {
|
|
794
|
-
|
|
795
|
-
|
|
990
|
+
if (!base58Decoder)
|
|
991
|
+
base58Decoder = codecsStrings.getBase58Decoder();
|
|
992
|
+
const signatureBytes = transaction.signatures[transaction.feePayer];
|
|
993
|
+
if (!signatureBytes) {
|
|
796
994
|
throw new Error(
|
|
797
995
|
"Could not determine this transaction's signature. Make sure that the transaction has been signed by its fee payer."
|
|
798
996
|
);
|
|
799
997
|
}
|
|
800
|
-
|
|
998
|
+
const transactionSignature = base58Decoder.decode(signatureBytes)[0];
|
|
999
|
+
return transactionSignature;
|
|
801
1000
|
}
|
|
802
|
-
async function
|
|
1001
|
+
async function partiallySignTransaction(keyPairs, transaction) {
|
|
803
1002
|
const compiledMessage = compileMessage(transaction);
|
|
804
1003
|
const nextSignatures = "signatures" in transaction ? { ...transaction.signatures } : {};
|
|
1004
|
+
const wireMessageBytes = getCompiledMessageEncoder().encode(compiledMessage);
|
|
805
1005
|
const publicKeySignaturePairs = await Promise.all(
|
|
806
1006
|
keyPairs.map(
|
|
807
|
-
(keyPair) => Promise.all([
|
|
808
|
-
addresses.getAddressFromPublicKey(keyPair.publicKey),
|
|
809
|
-
getCompiledMessageSignature(compiledMessage, keyPair.privateKey)
|
|
810
|
-
])
|
|
1007
|
+
(keyPair) => Promise.all([addresses.getAddressFromPublicKey(keyPair.publicKey), keys.signBytes(keyPair.privateKey, wireMessageBytes)])
|
|
811
1008
|
)
|
|
812
1009
|
);
|
|
813
1010
|
for (const [signerPublicKey, signature] of publicKeySignaturePairs) {
|
|
@@ -820,33 +1017,46 @@ async function signTransaction(keyPairs, transaction) {
|
|
|
820
1017
|
Object.freeze(out);
|
|
821
1018
|
return out;
|
|
822
1019
|
}
|
|
823
|
-
function
|
|
824
|
-
|
|
825
|
-
|
|
1020
|
+
async function signTransaction(keyPairs, transaction) {
|
|
1021
|
+
const out = await partiallySignTransaction(keyPairs, transaction);
|
|
1022
|
+
assertTransactionIsFullySigned(out);
|
|
1023
|
+
Object.freeze(out);
|
|
1024
|
+
return out;
|
|
1025
|
+
}
|
|
1026
|
+
function assertTransactionIsFullySigned(transaction) {
|
|
1027
|
+
const signerAddressesFromInstructions = transaction.instructions.flatMap((i) => i.accounts?.filter((a) => isSignerRole(a.role)) ?? []).map((a) => a.address);
|
|
1028
|
+
const requiredSigners = /* @__PURE__ */ new Set([transaction.feePayer, ...signerAddressesFromInstructions]);
|
|
1029
|
+
requiredSigners.forEach((address) => {
|
|
1030
|
+
if (!transaction.signatures[address]) {
|
|
1031
|
+
throw new Error(`Transaction is missing signature for address \`${address}\``);
|
|
1032
|
+
}
|
|
1033
|
+
});
|
|
826
1034
|
}
|
|
827
|
-
|
|
828
|
-
// src/wire-transaction.ts
|
|
829
1035
|
function getBase64EncodedWireTransaction(transaction) {
|
|
830
|
-
const wireTransactionBytes = getTransactionEncoder().
|
|
831
|
-
|
|
832
|
-
return btoa(String.fromCharCode(...wireTransactionBytes));
|
|
833
|
-
}
|
|
1036
|
+
const wireTransactionBytes = getTransactionEncoder().encode(transaction);
|
|
1037
|
+
return codecsStrings.getBase64Decoder().decode(wireTransactionBytes)[0];
|
|
834
1038
|
}
|
|
835
1039
|
|
|
836
1040
|
exports.appendTransactionInstruction = appendTransactionInstruction;
|
|
837
1041
|
exports.assertIsBlockhash = assertIsBlockhash;
|
|
838
1042
|
exports.assertIsDurableNonceTransaction = assertIsDurableNonceTransaction;
|
|
839
|
-
exports.
|
|
1043
|
+
exports.assertTransactionIsFullySigned = assertTransactionIsFullySigned;
|
|
1044
|
+
exports.compileMessage = compileMessage;
|
|
840
1045
|
exports.createTransaction = createTransaction;
|
|
841
1046
|
exports.getBase64EncodedWireTransaction = getBase64EncodedWireTransaction;
|
|
1047
|
+
exports.getCompiledMessageCodec = getCompiledMessageCodec;
|
|
1048
|
+
exports.getCompiledMessageDecoder = getCompiledMessageDecoder;
|
|
1049
|
+
exports.getCompiledMessageEncoder = getCompiledMessageEncoder;
|
|
842
1050
|
exports.getSignatureFromTransaction = getSignatureFromTransaction;
|
|
1051
|
+
exports.getTransactionCodec = getTransactionCodec;
|
|
1052
|
+
exports.getTransactionDecoder = getTransactionDecoder;
|
|
843
1053
|
exports.getTransactionEncoder = getTransactionEncoder;
|
|
844
|
-
exports.
|
|
1054
|
+
exports.isAdvanceNonceAccountInstruction = isAdvanceNonceAccountInstruction;
|
|
1055
|
+
exports.partiallySignTransaction = partiallySignTransaction;
|
|
845
1056
|
exports.prependTransactionInstruction = prependTransactionInstruction;
|
|
846
1057
|
exports.setTransactionFeePayer = setTransactionFeePayer;
|
|
847
1058
|
exports.setTransactionLifetimeUsingBlockhash = setTransactionLifetimeUsingBlockhash;
|
|
848
1059
|
exports.setTransactionLifetimeUsingDurableNonce = setTransactionLifetimeUsingDurableNonce;
|
|
849
1060
|
exports.signTransaction = signTransaction;
|
|
850
|
-
exports.transactionSignature = transactionSignature;
|
|
851
1061
|
//# sourceMappingURL=out.js.map
|
|
852
1062
|
//# sourceMappingURL=index.browser.cjs.map
|