@solana/transactions 2.0.0-experimental.e4483d3 → 2.0.0-experimental.e58bb22
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/dist/index.browser.cjs +290 -382
- package/dist/index.browser.cjs.map +1 -1
- package/dist/index.browser.js +294 -386
- package/dist/index.browser.js.map +1 -1
- package/dist/index.native.js +294 -386
- package/dist/index.native.js.map +1 -1
- package/dist/index.node.cjs +290 -382
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.js +294 -386
- package/dist/index.node.js.map +1 -1
- package/dist/types/blockhash.d.ts +5 -7
- package/dist/types/blockhash.d.ts.map +1 -1
- package/dist/types/compilable-transaction.d.ts +4 -4
- package/dist/types/compile-address-table-lookups.d.ts +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 +1 -1
- package/dist/types/compile-transaction.d.ts +3 -3
- package/dist/types/create-transaction.d.ts +1 -1
- package/dist/types/decompile-transaction.d.ts +12 -4
- package/dist/types/decompile-transaction.d.ts.map +1 -1
- package/dist/types/durable-nonce.d.ts +2 -2
- package/dist/types/fee-payer.d.ts +2 -2
- package/dist/types/index.d.ts +12 -11
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/instructions.d.ts +2 -2
- package/dist/types/message.d.ts +6 -6
- 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 -2
- 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 +9 -6
- package/dist/types/serializers/transaction.d.ts.map +1 -1
- package/dist/types/signatures.d.ts +2 -2
- package/dist/types/signatures.d.ts.map +1 -1
- package/dist/types/unsigned-transaction.d.ts +1 -1
- package/dist/types/wire-transaction.d.ts +1 -1
- package/package.json +19 -17
- package/dist/index.development.js +0 -1783
- package/dist/index.development.js.map +0 -1
- package/dist/index.production.min.js +0 -31
package/dist/index.browser.cjs
CHANGED
|
@@ -2,30 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
var codecsStrings = require('@solana/codecs-strings');
|
|
4
4
|
var addresses = require('@solana/addresses');
|
|
5
|
+
var functional = require('@solana/functional');
|
|
5
6
|
var codecsCore = require('@solana/codecs-core');
|
|
6
7
|
var codecsDataStructures = require('@solana/codecs-data-structures');
|
|
7
8
|
var codecsNumbers = require('@solana/codecs-numbers');
|
|
8
|
-
var
|
|
9
|
+
var errors = require('@solana/errors');
|
|
9
10
|
var keys = require('@solana/keys');
|
|
10
11
|
|
|
11
|
-
// ../
|
|
12
|
-
var __DEV__ = /* @__PURE__ */ (() => process["env"].NODE_ENV === "development")();
|
|
13
|
-
|
|
14
|
-
// src/unsigned-transaction.ts
|
|
15
|
-
function getUnsignedTransaction(transaction) {
|
|
16
|
-
if ("signatures" in transaction) {
|
|
17
|
-
const {
|
|
18
|
-
signatures: _,
|
|
19
|
-
// eslint-disable-line @typescript-eslint/no-unused-vars
|
|
20
|
-
...unsignedTransaction
|
|
21
|
-
} = transaction;
|
|
22
|
-
return unsignedTransaction;
|
|
23
|
-
} else {
|
|
24
|
-
return transaction;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// src/blockhash.ts
|
|
12
|
+
// ../rpc-types/dist/index.browser.js
|
|
29
13
|
var base58Encoder;
|
|
30
14
|
function assertIsBlockhash(putativeBlockhash) {
|
|
31
15
|
if (!base58Encoder)
|
|
@@ -49,6 +33,38 @@ function assertIsBlockhash(putativeBlockhash) {
|
|
|
49
33
|
});
|
|
50
34
|
}
|
|
51
35
|
}
|
|
36
|
+
|
|
37
|
+
// src/unsigned-transaction.ts
|
|
38
|
+
function getUnsignedTransaction(transaction) {
|
|
39
|
+
if ("signatures" in transaction) {
|
|
40
|
+
const {
|
|
41
|
+
signatures: _,
|
|
42
|
+
// eslint-disable-line @typescript-eslint/no-unused-vars
|
|
43
|
+
...unsignedTransaction
|
|
44
|
+
} = transaction;
|
|
45
|
+
return unsignedTransaction;
|
|
46
|
+
} else {
|
|
47
|
+
return transaction;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// src/blockhash.ts
|
|
52
|
+
function isTransactionWithBlockhashLifetime(transaction) {
|
|
53
|
+
const lifetimeConstraintShapeMatches = "lifetimeConstraint" in transaction && typeof transaction.lifetimeConstraint.blockhash === "string" && typeof transaction.lifetimeConstraint.lastValidBlockHeight === "bigint";
|
|
54
|
+
if (!lifetimeConstraintShapeMatches)
|
|
55
|
+
return false;
|
|
56
|
+
try {
|
|
57
|
+
assertIsBlockhash(transaction.lifetimeConstraint.blockhash);
|
|
58
|
+
return true;
|
|
59
|
+
} catch {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function assertIsTransactionWithBlockhashLifetime(transaction) {
|
|
64
|
+
if (!isTransactionWithBlockhashLifetime(transaction)) {
|
|
65
|
+
throw new Error("Transaction does not have a blockhash lifetime");
|
|
66
|
+
}
|
|
67
|
+
}
|
|
52
68
|
function setTransactionLifetimeUsingBlockhash(blockhashLifetimeConstraint, transaction) {
|
|
53
69
|
if ("lifetimeConstraint" in transaction && transaction.lifetimeConstraint.blockhash === blockhashLifetimeConstraint.blockhash && transaction.lifetimeConstraint.lastValidBlockHeight === blockhashLifetimeConstraint.lastValidBlockHeight) {
|
|
54
70
|
return transaction;
|
|
@@ -202,6 +218,151 @@ function prependTransactionInstruction(instruction, transaction) {
|
|
|
202
218
|
Object.freeze(out);
|
|
203
219
|
return out;
|
|
204
220
|
}
|
|
221
|
+
|
|
222
|
+
// src/decompile-transaction.ts
|
|
223
|
+
function getAccountMetas(message) {
|
|
224
|
+
const { header } = message;
|
|
225
|
+
const numWritableSignerAccounts = header.numSignerAccounts - header.numReadonlySignerAccounts;
|
|
226
|
+
const numWritableNonSignerAccounts = message.staticAccounts.length - header.numSignerAccounts - header.numReadonlyNonSignerAccounts;
|
|
227
|
+
const accountMetas = [];
|
|
228
|
+
let accountIndex = 0;
|
|
229
|
+
for (let i = 0; i < numWritableSignerAccounts; i++) {
|
|
230
|
+
accountMetas.push({
|
|
231
|
+
address: message.staticAccounts[accountIndex],
|
|
232
|
+
role: AccountRole.WRITABLE_SIGNER
|
|
233
|
+
});
|
|
234
|
+
accountIndex++;
|
|
235
|
+
}
|
|
236
|
+
for (let i = 0; i < header.numReadonlySignerAccounts; i++) {
|
|
237
|
+
accountMetas.push({
|
|
238
|
+
address: message.staticAccounts[accountIndex],
|
|
239
|
+
role: AccountRole.READONLY_SIGNER
|
|
240
|
+
});
|
|
241
|
+
accountIndex++;
|
|
242
|
+
}
|
|
243
|
+
for (let i = 0; i < numWritableNonSignerAccounts; i++) {
|
|
244
|
+
accountMetas.push({
|
|
245
|
+
address: message.staticAccounts[accountIndex],
|
|
246
|
+
role: AccountRole.WRITABLE
|
|
247
|
+
});
|
|
248
|
+
accountIndex++;
|
|
249
|
+
}
|
|
250
|
+
for (let i = 0; i < header.numReadonlyNonSignerAccounts; i++) {
|
|
251
|
+
accountMetas.push({
|
|
252
|
+
address: message.staticAccounts[accountIndex],
|
|
253
|
+
role: AccountRole.READONLY
|
|
254
|
+
});
|
|
255
|
+
accountIndex++;
|
|
256
|
+
}
|
|
257
|
+
return accountMetas;
|
|
258
|
+
}
|
|
259
|
+
function getAddressLookupMetas(compiledAddressTableLookups, addressesByLookupTableAddress) {
|
|
260
|
+
const compiledAddressTableLookupAddresses = compiledAddressTableLookups.map((l) => l.lookupTableAddress);
|
|
261
|
+
const missing = compiledAddressTableLookupAddresses.filter((a) => addressesByLookupTableAddress[a] === void 0);
|
|
262
|
+
if (missing.length > 0) {
|
|
263
|
+
const missingAddresses = missing.join(", ");
|
|
264
|
+
throw new Error(`Addresses not provided for lookup tables: [${missingAddresses}]`);
|
|
265
|
+
}
|
|
266
|
+
const readOnlyMetas = [];
|
|
267
|
+
const writableMetas = [];
|
|
268
|
+
for (const lookup of compiledAddressTableLookups) {
|
|
269
|
+
const addresses = addressesByLookupTableAddress[lookup.lookupTableAddress];
|
|
270
|
+
const highestIndex = Math.max(...lookup.readableIndices, ...lookup.writableIndices);
|
|
271
|
+
if (highestIndex >= addresses.length) {
|
|
272
|
+
throw new Error(
|
|
273
|
+
`Cannot look up index ${highestIndex} in lookup table [${lookup.lookupTableAddress}]. The lookup table may have been extended since the addresses provided were retrieved.`
|
|
274
|
+
);
|
|
275
|
+
}
|
|
276
|
+
const readOnlyForLookup = lookup.readableIndices.map((r) => ({
|
|
277
|
+
address: addresses[r],
|
|
278
|
+
addressIndex: r,
|
|
279
|
+
lookupTableAddress: lookup.lookupTableAddress,
|
|
280
|
+
role: AccountRole.READONLY
|
|
281
|
+
}));
|
|
282
|
+
readOnlyMetas.push(...readOnlyForLookup);
|
|
283
|
+
const writableForLookup = lookup.writableIndices.map((w) => ({
|
|
284
|
+
address: addresses[w],
|
|
285
|
+
addressIndex: w,
|
|
286
|
+
lookupTableAddress: lookup.lookupTableAddress,
|
|
287
|
+
role: AccountRole.WRITABLE
|
|
288
|
+
}));
|
|
289
|
+
writableMetas.push(...writableForLookup);
|
|
290
|
+
}
|
|
291
|
+
return [...writableMetas, ...readOnlyMetas];
|
|
292
|
+
}
|
|
293
|
+
function convertInstruction(instruction, accountMetas) {
|
|
294
|
+
const programAddress = accountMetas[instruction.programAddressIndex]?.address;
|
|
295
|
+
if (!programAddress) {
|
|
296
|
+
throw new Error(`Could not find program address at index ${instruction.programAddressIndex}`);
|
|
297
|
+
}
|
|
298
|
+
const accounts = instruction.accountIndices?.map((accountIndex) => accountMetas[accountIndex]);
|
|
299
|
+
const { data } = instruction;
|
|
300
|
+
return {
|
|
301
|
+
programAddress,
|
|
302
|
+
...accounts && accounts.length ? { accounts } : {},
|
|
303
|
+
...data && data.length ? { data } : {}
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
function getLifetimeConstraint(messageLifetimeToken, firstInstruction, lastValidBlockHeight) {
|
|
307
|
+
if (!firstInstruction || !isAdvanceNonceAccountInstruction(firstInstruction)) {
|
|
308
|
+
return {
|
|
309
|
+
blockhash: messageLifetimeToken,
|
|
310
|
+
lastValidBlockHeight: lastValidBlockHeight ?? 2n ** 64n - 1n
|
|
311
|
+
// U64 MAX
|
|
312
|
+
};
|
|
313
|
+
} else {
|
|
314
|
+
const nonceAccountAddress = firstInstruction.accounts[0].address;
|
|
315
|
+
addresses.assertIsAddress(nonceAccountAddress);
|
|
316
|
+
const nonceAuthorityAddress = firstInstruction.accounts[2].address;
|
|
317
|
+
addresses.assertIsAddress(nonceAuthorityAddress);
|
|
318
|
+
return {
|
|
319
|
+
nonce: messageLifetimeToken,
|
|
320
|
+
nonceAccountAddress,
|
|
321
|
+
nonceAuthorityAddress
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
function convertSignatures(compiledTransaction) {
|
|
326
|
+
const {
|
|
327
|
+
compiledMessage: { staticAccounts },
|
|
328
|
+
signatures
|
|
329
|
+
} = compiledTransaction;
|
|
330
|
+
return signatures.reduce((acc, sig, index) => {
|
|
331
|
+
const allZeros = sig.every((byte) => byte === 0);
|
|
332
|
+
if (allZeros)
|
|
333
|
+
return acc;
|
|
334
|
+
const address = staticAccounts[index];
|
|
335
|
+
return { ...acc, [address]: sig };
|
|
336
|
+
}, {});
|
|
337
|
+
}
|
|
338
|
+
function decompileTransaction(compiledTransaction, config) {
|
|
339
|
+
const { compiledMessage } = compiledTransaction;
|
|
340
|
+
const feePayer = compiledMessage.staticAccounts[0];
|
|
341
|
+
if (!feePayer)
|
|
342
|
+
throw new Error("No fee payer set in CompiledTransaction");
|
|
343
|
+
const accountMetas = getAccountMetas(compiledMessage);
|
|
344
|
+
const accountLookupMetas = "addressTableLookups" in compiledMessage && compiledMessage.addressTableLookups !== void 0 && compiledMessage.addressTableLookups.length > 0 ? getAddressLookupMetas(compiledMessage.addressTableLookups, config?.addressesByLookupTableAddress ?? {}) : [];
|
|
345
|
+
const transactionMetas = [...accountMetas, ...accountLookupMetas];
|
|
346
|
+
const instructions = compiledMessage.instructions.map(
|
|
347
|
+
(compiledInstruction) => convertInstruction(compiledInstruction, transactionMetas)
|
|
348
|
+
);
|
|
349
|
+
const firstInstruction = instructions[0];
|
|
350
|
+
const lifetimeConstraint = getLifetimeConstraint(
|
|
351
|
+
compiledMessage.lifetimeToken,
|
|
352
|
+
firstInstruction,
|
|
353
|
+
config?.lastValidBlockHeight
|
|
354
|
+
);
|
|
355
|
+
const signatures = convertSignatures(compiledTransaction);
|
|
356
|
+
return functional.pipe(
|
|
357
|
+
createTransaction({ version: compiledMessage.version }),
|
|
358
|
+
(tx) => setTransactionFeePayer(feePayer, tx),
|
|
359
|
+
(tx) => instructions.reduce((acc, instruction) => {
|
|
360
|
+
return appendTransactionInstruction(instruction, acc);
|
|
361
|
+
}, tx),
|
|
362
|
+
(tx) => "blockhash" in lifetimeConstraint ? setTransactionLifetimeUsingBlockhash(lifetimeConstraint, tx) : setTransactionLifetimeUsingDurableNonce(lifetimeConstraint, tx),
|
|
363
|
+
(tx) => Object.keys(signatures).length > 0 ? { ...tx, signatures } : tx
|
|
364
|
+
);
|
|
365
|
+
}
|
|
205
366
|
function upsert(addressMap, address, update) {
|
|
206
367
|
addressMap[address] = update(addressMap[address] ?? { role: AccountRole.READONLY });
|
|
207
368
|
}
|
|
@@ -467,59 +628,31 @@ function compileMessage(transaction) {
|
|
|
467
628
|
version: transaction.version
|
|
468
629
|
};
|
|
469
630
|
}
|
|
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
631
|
var memoizedAddressTableLookupEncoder;
|
|
475
632
|
function getAddressTableLookupEncoder() {
|
|
476
633
|
if (!memoizedAddressTableLookupEncoder) {
|
|
477
|
-
memoizedAddressTableLookupEncoder = codecsDataStructures.getStructEncoder(
|
|
634
|
+
memoizedAddressTableLookupEncoder = codecsDataStructures.getStructEncoder([
|
|
635
|
+
["lookupTableAddress", addresses.getAddressEncoder()],
|
|
478
636
|
[
|
|
479
|
-
|
|
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
|
-
]
|
|
637
|
+
"writableIndices",
|
|
638
|
+
codecsDataStructures.getArrayEncoder(codecsNumbers.getU8Encoder(), { size: codecsNumbers.getShortU16Encoder() })
|
|
494
639
|
],
|
|
495
|
-
|
|
496
|
-
|
|
640
|
+
[
|
|
641
|
+
"readableIndices",
|
|
642
|
+
codecsDataStructures.getArrayEncoder(codecsNumbers.getU8Encoder(), { size: codecsNumbers.getShortU16Encoder() })
|
|
643
|
+
]
|
|
644
|
+
]);
|
|
497
645
|
}
|
|
498
646
|
return memoizedAddressTableLookupEncoder;
|
|
499
647
|
}
|
|
500
648
|
var memoizedAddressTableLookupDecoder;
|
|
501
649
|
function getAddressTableLookupDecoder() {
|
|
502
650
|
if (!memoizedAddressTableLookupDecoder) {
|
|
503
|
-
memoizedAddressTableLookupDecoder = codecsDataStructures.getStructDecoder(
|
|
504
|
-
[
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
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
|
-
]
|
|
520
|
-
],
|
|
521
|
-
{ description: addressTableLookupDescription }
|
|
522
|
-
);
|
|
651
|
+
memoizedAddressTableLookupDecoder = codecsDataStructures.getStructDecoder([
|
|
652
|
+
["lookupTableAddress", addresses.getAddressDecoder()],
|
|
653
|
+
["writableIndices", codecsDataStructures.getArrayDecoder(codecsNumbers.getU8Decoder(), { size: codecsNumbers.getShortU16Decoder() })],
|
|
654
|
+
["readableIndices", codecsDataStructures.getArrayDecoder(codecsNumbers.getU8Decoder(), { size: codecsNumbers.getShortU16Decoder() })]
|
|
655
|
+
]);
|
|
523
656
|
}
|
|
524
657
|
return memoizedAddressTableLookupDecoder;
|
|
525
658
|
}
|
|
@@ -529,72 +662,34 @@ function getMemoizedU8Encoder() {
|
|
|
529
662
|
memoizedU8Encoder = codecsNumbers.getU8Encoder();
|
|
530
663
|
return memoizedU8Encoder;
|
|
531
664
|
}
|
|
532
|
-
function getMemoizedU8EncoderDescription(description) {
|
|
533
|
-
const encoder = getMemoizedU8Encoder();
|
|
534
|
-
return {
|
|
535
|
-
...encoder,
|
|
536
|
-
description: description ?? encoder.description
|
|
537
|
-
};
|
|
538
|
-
}
|
|
539
665
|
var memoizedU8Decoder;
|
|
540
666
|
function getMemoizedU8Decoder() {
|
|
541
667
|
if (!memoizedU8Decoder)
|
|
542
668
|
memoizedU8Decoder = codecsNumbers.getU8Decoder();
|
|
543
669
|
return memoizedU8Decoder;
|
|
544
670
|
}
|
|
545
|
-
function getMemoizedU8DecoderDescription(description) {
|
|
546
|
-
const decoder = getMemoizedU8Decoder();
|
|
547
|
-
return {
|
|
548
|
-
...decoder,
|
|
549
|
-
description: description ?? decoder.description
|
|
550
|
-
};
|
|
551
|
-
}
|
|
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;
|
|
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;
|
|
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;
|
|
555
|
-
var messageHeaderDescription = __DEV__ ? "The transaction message header containing counts of the signer, readonly-signer, and readonly-nonsigner account addresses" : void 0;
|
|
556
671
|
function getMessageHeaderEncoder() {
|
|
557
|
-
return codecsDataStructures.getStructEncoder(
|
|
558
|
-
[
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
],
|
|
563
|
-
{
|
|
564
|
-
description: messageHeaderDescription
|
|
565
|
-
}
|
|
566
|
-
);
|
|
672
|
+
return codecsDataStructures.getStructEncoder([
|
|
673
|
+
["numSignerAccounts", getMemoizedU8Encoder()],
|
|
674
|
+
["numReadonlySignerAccounts", getMemoizedU8Encoder()],
|
|
675
|
+
["numReadonlyNonSignerAccounts", getMemoizedU8Encoder()]
|
|
676
|
+
]);
|
|
567
677
|
}
|
|
568
678
|
function getMessageHeaderDecoder() {
|
|
569
|
-
return codecsDataStructures.getStructDecoder(
|
|
570
|
-
[
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
],
|
|
575
|
-
{
|
|
576
|
-
description: messageHeaderDescription
|
|
577
|
-
}
|
|
578
|
-
);
|
|
679
|
+
return codecsDataStructures.getStructDecoder([
|
|
680
|
+
["numSignerAccounts", getMemoizedU8Decoder()],
|
|
681
|
+
["numReadonlySignerAccounts", getMemoizedU8Decoder()],
|
|
682
|
+
["numReadonlyNonSignerAccounts", getMemoizedU8Decoder()]
|
|
683
|
+
]);
|
|
579
684
|
}
|
|
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
685
|
var memoizedGetInstructionEncoder;
|
|
585
686
|
function getInstructionEncoder() {
|
|
586
687
|
if (!memoizedGetInstructionEncoder) {
|
|
587
688
|
memoizedGetInstructionEncoder = codecsCore.mapEncoder(
|
|
588
689
|
codecsDataStructures.getStructEncoder([
|
|
589
|
-
["programAddressIndex", codecsNumbers.getU8Encoder(
|
|
590
|
-
[
|
|
591
|
-
|
|
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() })]
|
|
690
|
+
["programAddressIndex", codecsNumbers.getU8Encoder()],
|
|
691
|
+
["accountIndices", codecsDataStructures.getArrayEncoder(codecsNumbers.getU8Encoder(), { size: codecsNumbers.getShortU16Encoder() })],
|
|
692
|
+
["data", codecsDataStructures.getBytesEncoder({ size: codecsNumbers.getShortU16Encoder() })]
|
|
598
693
|
]),
|
|
599
694
|
// Convert an instruction to have all fields defined
|
|
600
695
|
(instruction) => {
|
|
@@ -616,15 +711,9 @@ function getInstructionDecoder() {
|
|
|
616
711
|
if (!memoizedGetInstructionDecoder) {
|
|
617
712
|
memoizedGetInstructionDecoder = codecsCore.mapDecoder(
|
|
618
713
|
codecsDataStructures.getStructDecoder([
|
|
619
|
-
["programAddressIndex", codecsNumbers.getU8Decoder(
|
|
620
|
-
[
|
|
621
|
-
|
|
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() })]
|
|
714
|
+
["programAddressIndex", codecsNumbers.getU8Decoder()],
|
|
715
|
+
["accountIndices", codecsDataStructures.getArrayDecoder(codecsNumbers.getU8Decoder(), { size: codecsNumbers.getShortU16Decoder() })],
|
|
716
|
+
["data", codecsDataStructures.getBytesDecoder({ size: codecsNumbers.getShortU16Decoder() })]
|
|
628
717
|
]),
|
|
629
718
|
// Convert an instruction to exclude optional fields if they are empty
|
|
630
719
|
(instruction) => {
|
|
@@ -643,47 +732,38 @@ function getInstructionDecoder() {
|
|
|
643
732
|
return memoizedGetInstructionDecoder;
|
|
644
733
|
}
|
|
645
734
|
var VERSION_FLAG_MASK = 128;
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
}
|
|
660
|
-
|
|
661
|
-
if (value === "legacy") {
|
|
662
|
-
return new Uint8Array();
|
|
663
|
-
}
|
|
664
|
-
if (value < 0 || value > 127) {
|
|
665
|
-
throw new Error(`Transaction version must be in the range [0, 127]. \`${value}\` given.`);
|
|
666
|
-
}
|
|
667
|
-
return new Uint8Array([value | VERSION_FLAG_MASK]);
|
|
735
|
+
function getTransactionVersionEncoder() {
|
|
736
|
+
return codecsCore.createEncoder({
|
|
737
|
+
getSizeFromValue: (value) => value === "legacy" ? 0 : 1,
|
|
738
|
+
maxSize: 1,
|
|
739
|
+
write: (value, bytes, offset) => {
|
|
740
|
+
if (value === "legacy") {
|
|
741
|
+
return offset;
|
|
742
|
+
}
|
|
743
|
+
if (value < 0 || value > 127) {
|
|
744
|
+
throw new Error(`Transaction version must be in the range [0, 127]. \`${value}\` given.`);
|
|
745
|
+
}
|
|
746
|
+
bytes.set([value | VERSION_FLAG_MASK], offset);
|
|
747
|
+
return offset + 1;
|
|
748
|
+
}
|
|
749
|
+
});
|
|
668
750
|
}
|
|
669
751
|
function getTransactionVersionDecoder() {
|
|
670
|
-
return {
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
752
|
+
return codecsCore.createDecoder({
|
|
753
|
+
maxSize: 1,
|
|
754
|
+
read: (bytes, offset) => {
|
|
755
|
+
const firstByte = bytes[offset];
|
|
756
|
+
if ((firstByte & VERSION_FLAG_MASK) === 0) {
|
|
757
|
+
return ["legacy", offset];
|
|
758
|
+
} else {
|
|
759
|
+
const version = firstByte ^ VERSION_FLAG_MASK;
|
|
760
|
+
return [version, offset + 1];
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
});
|
|
680
764
|
}
|
|
681
765
|
|
|
682
766
|
// src/serializers/message.ts
|
|
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
767
|
function getCompiledMessageLegacyEncoder() {
|
|
688
768
|
return codecsDataStructures.getStructEncoder(getPreludeStructEncoderTuple());
|
|
689
769
|
}
|
|
@@ -708,98 +788,52 @@ function getPreludeStructEncoderTuple() {
|
|
|
708
788
|
return [
|
|
709
789
|
["version", getTransactionVersionEncoder()],
|
|
710
790
|
["header", getMessageHeaderEncoder()],
|
|
711
|
-
[
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
description: staticAccountsDescription,
|
|
715
|
-
size: codecsNumbers.getShortU16Encoder()
|
|
716
|
-
})
|
|
717
|
-
],
|
|
718
|
-
[
|
|
719
|
-
"lifetimeToken",
|
|
720
|
-
codecsStrings.getStringEncoder({
|
|
721
|
-
description: lifetimeTokenDescription,
|
|
722
|
-
encoding: codecsStrings.getBase58Encoder(),
|
|
723
|
-
size: 32
|
|
724
|
-
})
|
|
725
|
-
],
|
|
726
|
-
[
|
|
727
|
-
"instructions",
|
|
728
|
-
codecsDataStructures.getArrayEncoder(getInstructionEncoder(), {
|
|
729
|
-
description: instructionsDescription,
|
|
730
|
-
size: codecsNumbers.getShortU16Encoder()
|
|
731
|
-
})
|
|
732
|
-
]
|
|
791
|
+
["staticAccounts", codecsDataStructures.getArrayEncoder(addresses.getAddressEncoder(), { size: codecsNumbers.getShortU16Encoder() })],
|
|
792
|
+
["lifetimeToken", codecsStrings.getStringEncoder({ encoding: codecsStrings.getBase58Encoder(), size: 32 })],
|
|
793
|
+
["instructions", codecsDataStructures.getArrayEncoder(getInstructionEncoder(), { size: codecsNumbers.getShortU16Encoder() })]
|
|
733
794
|
];
|
|
734
795
|
}
|
|
735
796
|
function getPreludeStructDecoderTuple() {
|
|
736
797
|
return [
|
|
737
798
|
["version", getTransactionVersionDecoder()],
|
|
738
799
|
["header", getMessageHeaderDecoder()],
|
|
739
|
-
[
|
|
740
|
-
|
|
741
|
-
|
|
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
|
-
],
|
|
800
|
+
["staticAccounts", codecsDataStructures.getArrayDecoder(addresses.getAddressDecoder(), { size: codecsNumbers.getShortU16Decoder() })],
|
|
801
|
+
["lifetimeToken", codecsStrings.getStringDecoder({ encoding: codecsStrings.getBase58Decoder(), size: 32 })],
|
|
802
|
+
["instructions", codecsDataStructures.getArrayDecoder(getInstructionDecoder(), { size: codecsNumbers.getShortU16Decoder() })],
|
|
761
803
|
["addressTableLookups", getAddressTableLookupArrayDecoder()]
|
|
762
804
|
];
|
|
763
805
|
}
|
|
764
806
|
function getAddressTableLookupArrayEncoder() {
|
|
765
|
-
return codecsDataStructures.getArrayEncoder(getAddressTableLookupEncoder(), {
|
|
766
|
-
description: addressTableLookupsDescription,
|
|
767
|
-
size: codecsNumbers.getShortU16Encoder()
|
|
768
|
-
});
|
|
807
|
+
return codecsDataStructures.getArrayEncoder(getAddressTableLookupEncoder(), { size: codecsNumbers.getShortU16Encoder() });
|
|
769
808
|
}
|
|
770
809
|
function getAddressTableLookupArrayDecoder() {
|
|
771
|
-
return codecsDataStructures.getArrayDecoder(getAddressTableLookupDecoder(), {
|
|
772
|
-
description: addressTableLookupsDescription,
|
|
773
|
-
size: codecsNumbers.getShortU16Decoder()
|
|
774
|
-
});
|
|
810
|
+
return codecsDataStructures.getArrayDecoder(getAddressTableLookupDecoder(), { size: codecsNumbers.getShortU16Decoder() });
|
|
775
811
|
}
|
|
776
|
-
var messageDescription = __DEV__ ? "The wire format of a Solana transaction message" : "message";
|
|
777
812
|
function getCompiledMessageEncoder() {
|
|
778
|
-
return {
|
|
779
|
-
|
|
780
|
-
encode: (compiledMessage) => {
|
|
813
|
+
return codecsCore.createEncoder({
|
|
814
|
+
getSizeFromValue: (compiledMessage) => {
|
|
781
815
|
if (compiledMessage.version === "legacy") {
|
|
782
|
-
return getCompiledMessageLegacyEncoder().
|
|
816
|
+
return getCompiledMessageLegacyEncoder().getSizeFromValue(compiledMessage);
|
|
783
817
|
} else {
|
|
784
|
-
return getCompiledMessageVersionedEncoder().
|
|
818
|
+
return getCompiledMessageVersionedEncoder().getSizeFromValue(compiledMessage);
|
|
785
819
|
}
|
|
786
820
|
},
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
821
|
+
write: (compiledMessage, bytes, offset) => {
|
|
822
|
+
if (compiledMessage.version === "legacy") {
|
|
823
|
+
return getCompiledMessageLegacyEncoder().write(compiledMessage, bytes, offset);
|
|
824
|
+
} else {
|
|
825
|
+
return getCompiledMessageVersionedEncoder().write(compiledMessage, bytes, offset);
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
});
|
|
790
829
|
}
|
|
791
830
|
function getCompiledMessageDecoder() {
|
|
792
|
-
return codecsCore.mapDecoder(
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
}),
|
|
796
|
-
({ addressTableLookups, ...restOfMessage }) => {
|
|
797
|
-
if (restOfMessage.version === "legacy" || !addressTableLookups?.length) {
|
|
798
|
-
return restOfMessage;
|
|
799
|
-
}
|
|
800
|
-
return { ...restOfMessage, addressTableLookups };
|
|
831
|
+
return codecsCore.mapDecoder(codecsDataStructures.getStructDecoder(getPreludeStructDecoderTuple()), ({ addressTableLookups, ...restOfMessage }) => {
|
|
832
|
+
if (restOfMessage.version === "legacy" || !addressTableLookups?.length) {
|
|
833
|
+
return restOfMessage;
|
|
801
834
|
}
|
|
802
|
-
|
|
835
|
+
return { ...restOfMessage, addressTableLookups };
|
|
836
|
+
});
|
|
803
837
|
}
|
|
804
838
|
function getCompiledMessageCodec() {
|
|
805
839
|
return codecsCore.combineCodec(getCompiledMessageEncoder(), getCompiledMessageDecoder());
|
|
@@ -822,168 +856,36 @@ function getCompiledTransaction(transaction) {
|
|
|
822
856
|
signatures
|
|
823
857
|
};
|
|
824
858
|
}
|
|
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
|
|
856
|
-
});
|
|
857
|
-
accountIndex++;
|
|
858
|
-
}
|
|
859
|
-
return accountMetas;
|
|
860
|
-
}
|
|
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
|
-
};
|
|
891
|
-
}
|
|
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");
|
|
910
|
-
}
|
|
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
859
|
|
|
936
860
|
// 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
861
|
function getCompiledTransactionEncoder() {
|
|
940
|
-
return codecsDataStructures.getStructEncoder(
|
|
941
|
-
[
|
|
942
|
-
|
|
943
|
-
|
|
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);
|
|
862
|
+
return codecsDataStructures.getStructEncoder([
|
|
863
|
+
["signatures", codecsDataStructures.getArrayEncoder(codecsDataStructures.getBytesEncoder({ size: 64 }), { size: codecsNumbers.getShortU16Encoder() })],
|
|
864
|
+
["compiledMessage", getCompiledMessageEncoder()]
|
|
865
|
+
]);
|
|
958
866
|
}
|
|
959
867
|
function getCompiledTransactionDecoder() {
|
|
960
|
-
return codecsDataStructures.getStructDecoder(
|
|
868
|
+
return codecsDataStructures.getStructDecoder([
|
|
961
869
|
[
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
size: codecsNumbers.getShortU16Decoder()
|
|
967
|
-
})
|
|
968
|
-
],
|
|
969
|
-
["compiledMessage", getCompiledMessageDecoder()]
|
|
870
|
+
"signatures",
|
|
871
|
+
codecsDataStructures.getArrayDecoder(codecsDataStructures.getBytesDecoder({ size: 64 }), {
|
|
872
|
+
size: codecsNumbers.getShortU16Decoder()
|
|
873
|
+
})
|
|
970
874
|
],
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
}
|
|
974
|
-
);
|
|
875
|
+
["compiledMessage", getCompiledMessageDecoder()]
|
|
876
|
+
]);
|
|
975
877
|
}
|
|
976
878
|
function getTransactionEncoder() {
|
|
977
879
|
return codecsCore.mapEncoder(getCompiledTransactionEncoder(), getCompiledTransaction);
|
|
978
880
|
}
|
|
979
|
-
function getTransactionDecoder(
|
|
881
|
+
function getTransactionDecoder(config) {
|
|
980
882
|
return codecsCore.mapDecoder(
|
|
981
883
|
getCompiledTransactionDecoder(),
|
|
982
|
-
(compiledTransaction) => decompileTransaction(compiledTransaction,
|
|
884
|
+
(compiledTransaction) => decompileTransaction(compiledTransaction, config)
|
|
983
885
|
);
|
|
984
886
|
}
|
|
985
|
-
function getTransactionCodec(
|
|
986
|
-
return codecsCore.combineCodec(getTransactionEncoder(), getTransactionDecoder(
|
|
887
|
+
function getTransactionCodec(config) {
|
|
888
|
+
return codecsCore.combineCodec(getTransactionEncoder(), getTransactionDecoder(config));
|
|
987
889
|
}
|
|
988
890
|
var base58Decoder;
|
|
989
891
|
function getSignatureFromTransaction(transaction) {
|
|
@@ -991,11 +893,9 @@ function getSignatureFromTransaction(transaction) {
|
|
|
991
893
|
base58Decoder = codecsStrings.getBase58Decoder();
|
|
992
894
|
const signatureBytes = transaction.signatures[transaction.feePayer];
|
|
993
895
|
if (!signatureBytes) {
|
|
994
|
-
throw new
|
|
995
|
-
"Could not determine this transaction's signature. Make sure that the transaction has been signed by its fee payer."
|
|
996
|
-
);
|
|
896
|
+
throw new errors.SolanaError(errors.SOLANA_ERROR__TRANSACTION_SIGNATURE_NOT_COMPUTABLE);
|
|
997
897
|
}
|
|
998
|
-
const transactionSignature = base58Decoder.decode(signatureBytes)
|
|
898
|
+
const transactionSignature = base58Decoder.decode(signatureBytes);
|
|
999
899
|
return transactionSignature;
|
|
1000
900
|
}
|
|
1001
901
|
async function partiallySignTransaction(keyPairs, transaction) {
|
|
@@ -1026,27 +926,35 @@ async function signTransaction(keyPairs, transaction) {
|
|
|
1026
926
|
function assertTransactionIsFullySigned(transaction) {
|
|
1027
927
|
const signerAddressesFromInstructions = transaction.instructions.flatMap((i) => i.accounts?.filter((a) => isSignerRole(a.role)) ?? []).map((a) => a.address);
|
|
1028
928
|
const requiredSigners = /* @__PURE__ */ new Set([transaction.feePayer, ...signerAddressesFromInstructions]);
|
|
929
|
+
const missingSigs = [];
|
|
1029
930
|
requiredSigners.forEach((address) => {
|
|
1030
931
|
if (!transaction.signatures[address]) {
|
|
1031
|
-
|
|
932
|
+
missingSigs.push(address);
|
|
1032
933
|
}
|
|
1033
934
|
});
|
|
935
|
+
if (missingSigs.length > 0) {
|
|
936
|
+
throw new errors.SolanaError(errors.SOLANA_ERROR__TRANSACTION_MISSING_SIGNATURES, {
|
|
937
|
+
addresses: missingSigs
|
|
938
|
+
});
|
|
939
|
+
}
|
|
1034
940
|
}
|
|
1035
941
|
function getBase64EncodedWireTransaction(transaction) {
|
|
1036
942
|
const wireTransactionBytes = getTransactionEncoder().encode(transaction);
|
|
1037
|
-
return codecsStrings.getBase64Decoder().decode(wireTransactionBytes)
|
|
943
|
+
return codecsStrings.getBase64Decoder().decode(wireTransactionBytes);
|
|
1038
944
|
}
|
|
1039
945
|
|
|
1040
946
|
exports.appendTransactionInstruction = appendTransactionInstruction;
|
|
1041
|
-
exports.assertIsBlockhash = assertIsBlockhash;
|
|
1042
947
|
exports.assertIsDurableNonceTransaction = assertIsDurableNonceTransaction;
|
|
948
|
+
exports.assertIsTransactionWithBlockhashLifetime = assertIsTransactionWithBlockhashLifetime;
|
|
1043
949
|
exports.assertTransactionIsFullySigned = assertTransactionIsFullySigned;
|
|
1044
950
|
exports.compileMessage = compileMessage;
|
|
1045
951
|
exports.createTransaction = createTransaction;
|
|
952
|
+
exports.decompileTransaction = decompileTransaction;
|
|
1046
953
|
exports.getBase64EncodedWireTransaction = getBase64EncodedWireTransaction;
|
|
1047
954
|
exports.getCompiledMessageCodec = getCompiledMessageCodec;
|
|
1048
955
|
exports.getCompiledMessageDecoder = getCompiledMessageDecoder;
|
|
1049
956
|
exports.getCompiledMessageEncoder = getCompiledMessageEncoder;
|
|
957
|
+
exports.getCompiledTransactionDecoder = getCompiledTransactionDecoder;
|
|
1050
958
|
exports.getSignatureFromTransaction = getSignatureFromTransaction;
|
|
1051
959
|
exports.getTransactionCodec = getTransactionCodec;
|
|
1052
960
|
exports.getTransactionDecoder = getTransactionDecoder;
|