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