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