@solana/transactions 2.0.0-experimental.b153bb7 → 2.0.0-experimental.b2c1b82

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.
Files changed (53) hide show
  1. package/README.md +7 -3
  2. package/dist/index.browser.cjs +331 -412
  3. package/dist/index.browser.cjs.map +1 -1
  4. package/dist/index.browser.js +325 -415
  5. package/dist/index.browser.js.map +1 -1
  6. package/dist/index.native.js +325 -415
  7. package/dist/index.native.js.map +1 -1
  8. package/dist/index.node.cjs +331 -412
  9. package/dist/index.node.cjs.map +1 -1
  10. package/dist/index.node.js +325 -415
  11. package/dist/index.node.js.map +1 -1
  12. package/dist/types/blockhash.d.ts +5 -7
  13. package/dist/types/blockhash.d.ts.map +1 -1
  14. package/dist/types/compilable-transaction.d.ts +4 -4
  15. package/dist/types/compile-address-table-lookups.d.ts +1 -1
  16. package/dist/types/compile-header.d.ts +1 -1
  17. package/dist/types/compile-instructions.d.ts +1 -1
  18. package/dist/types/compile-lifetime-token.d.ts +1 -1
  19. package/dist/types/compile-static-accounts.d.ts +1 -1
  20. package/dist/types/compile-transaction.d.ts +3 -3
  21. package/dist/types/create-transaction.d.ts +1 -1
  22. package/dist/types/decompile-transaction.d.ts +12 -4
  23. package/dist/types/decompile-transaction.d.ts.map +1 -1
  24. package/dist/types/durable-nonce.d.ts +2 -2
  25. package/dist/types/fee-payer.d.ts +2 -2
  26. package/dist/types/index.d.ts +13 -10
  27. package/dist/types/index.d.ts.map +1 -1
  28. package/dist/types/instructions.d.ts +4 -2
  29. package/dist/types/instructions.d.ts.map +1 -1
  30. package/dist/types/message.d.ts +6 -6
  31. package/dist/types/serializers/address-table-lookup.d.ts +5 -5
  32. package/dist/types/serializers/address-table-lookup.d.ts.map +1 -1
  33. package/dist/types/serializers/header.d.ts +5 -5
  34. package/dist/types/serializers/header.d.ts.map +1 -1
  35. package/dist/types/serializers/index.d.ts +2 -1
  36. package/dist/types/serializers/index.d.ts.map +1 -1
  37. package/dist/types/serializers/instruction.d.ts +5 -5
  38. package/dist/types/serializers/instruction.d.ts.map +1 -1
  39. package/dist/types/serializers/message.d.ts +5 -5
  40. package/dist/types/serializers/message.d.ts.map +1 -1
  41. package/dist/types/serializers/transaction-version.d.ts +5 -5
  42. package/dist/types/serializers/transaction-version.d.ts.map +1 -1
  43. package/dist/types/serializers/transaction.d.ts +9 -6
  44. package/dist/types/serializers/transaction.d.ts.map +1 -1
  45. package/dist/types/signatures.d.ts +2 -2
  46. package/dist/types/signatures.d.ts.map +1 -1
  47. package/dist/types/unsigned-transaction.d.ts +1 -1
  48. package/dist/types/wire-transaction.d.ts +1 -1
  49. package/dist/types/wire-transaction.d.ts.map +1 -1
  50. package/package.json +19 -17
  51. package/dist/index.development.js +0 -1738
  52. package/dist/index.development.js.map +0 -1
  53. package/dist/index.production.min.js +0 -27
@@ -1,31 +1,15 @@
1
1
  'use strict';
2
2
 
3
3
  var codecsStrings = require('@solana/codecs-strings');
4
+ var addresses = require('@solana/addresses');
5
+ var functional = require('@solana/functional');
4
6
  var codecsCore = require('@solana/codecs-core');
5
7
  var codecsDataStructures = require('@solana/codecs-data-structures');
6
8
  var codecsNumbers = require('@solana/codecs-numbers');
7
- var addresses = require('@solana/addresses');
8
- var functional = require('@solana/functional');
9
+ var errors = require('@solana/errors');
9
10
  var keys = require('@solana/keys');
10
11
 
11
- // ../build-scripts/env-shim.ts
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;
@@ -187,21 +203,172 @@ function setTransactionFeePayer(feePayer, transaction) {
187
203
 
188
204
  // src/instructions.ts
189
205
  function appendTransactionInstruction(instruction, transaction) {
206
+ return appendTransactionInstructions([instruction], transaction);
207
+ }
208
+ function appendTransactionInstructions(instructions, transaction) {
190
209
  const out = {
191
210
  ...getUnsignedTransaction(transaction),
192
- instructions: [...transaction.instructions, instruction]
211
+ instructions: [...transaction.instructions, ...instructions]
193
212
  };
194
213
  Object.freeze(out);
195
214
  return out;
196
215
  }
197
216
  function prependTransactionInstruction(instruction, transaction) {
217
+ return prependTransactionInstructions([instruction], transaction);
218
+ }
219
+ function prependTransactionInstructions(instructions, transaction) {
198
220
  const out = {
199
221
  ...getUnsignedTransaction(transaction),
200
- instructions: [instruction, ...transaction.instructions]
222
+ instructions: [...instructions, ...transaction.instructions]
201
223
  };
202
224
  Object.freeze(out);
203
225
  return out;
204
226
  }
227
+
228
+ // src/decompile-transaction.ts
229
+ function getAccountMetas(message) {
230
+ const { header } = message;
231
+ const numWritableSignerAccounts = header.numSignerAccounts - header.numReadonlySignerAccounts;
232
+ const numWritableNonSignerAccounts = message.staticAccounts.length - header.numSignerAccounts - header.numReadonlyNonSignerAccounts;
233
+ const accountMetas = [];
234
+ let accountIndex = 0;
235
+ for (let i = 0; i < numWritableSignerAccounts; i++) {
236
+ accountMetas.push({
237
+ address: message.staticAccounts[accountIndex],
238
+ role: AccountRole.WRITABLE_SIGNER
239
+ });
240
+ accountIndex++;
241
+ }
242
+ for (let i = 0; i < header.numReadonlySignerAccounts; i++) {
243
+ accountMetas.push({
244
+ address: message.staticAccounts[accountIndex],
245
+ role: AccountRole.READONLY_SIGNER
246
+ });
247
+ accountIndex++;
248
+ }
249
+ for (let i = 0; i < numWritableNonSignerAccounts; i++) {
250
+ accountMetas.push({
251
+ address: message.staticAccounts[accountIndex],
252
+ role: AccountRole.WRITABLE
253
+ });
254
+ accountIndex++;
255
+ }
256
+ for (let i = 0; i < header.numReadonlyNonSignerAccounts; i++) {
257
+ accountMetas.push({
258
+ address: message.staticAccounts[accountIndex],
259
+ role: AccountRole.READONLY
260
+ });
261
+ accountIndex++;
262
+ }
263
+ return accountMetas;
264
+ }
265
+ function getAddressLookupMetas(compiledAddressTableLookups, addressesByLookupTableAddress) {
266
+ const compiledAddressTableLookupAddresses = compiledAddressTableLookups.map((l) => l.lookupTableAddress);
267
+ const missing = compiledAddressTableLookupAddresses.filter((a) => addressesByLookupTableAddress[a] === void 0);
268
+ if (missing.length > 0) {
269
+ const missingAddresses = missing.join(", ");
270
+ throw new Error(`Addresses not provided for lookup tables: [${missingAddresses}]`);
271
+ }
272
+ const readOnlyMetas = [];
273
+ const writableMetas = [];
274
+ for (const lookup of compiledAddressTableLookups) {
275
+ const addresses = addressesByLookupTableAddress[lookup.lookupTableAddress];
276
+ const highestIndex = Math.max(...lookup.readableIndices, ...lookup.writableIndices);
277
+ if (highestIndex >= addresses.length) {
278
+ throw new Error(
279
+ `Cannot look up index ${highestIndex} in lookup table [${lookup.lookupTableAddress}]. The lookup table may have been extended since the addresses provided were retrieved.`
280
+ );
281
+ }
282
+ const readOnlyForLookup = lookup.readableIndices.map((r) => ({
283
+ address: addresses[r],
284
+ addressIndex: r,
285
+ lookupTableAddress: lookup.lookupTableAddress,
286
+ role: AccountRole.READONLY
287
+ }));
288
+ readOnlyMetas.push(...readOnlyForLookup);
289
+ const writableForLookup = lookup.writableIndices.map((w) => ({
290
+ address: addresses[w],
291
+ addressIndex: w,
292
+ lookupTableAddress: lookup.lookupTableAddress,
293
+ role: AccountRole.WRITABLE
294
+ }));
295
+ writableMetas.push(...writableForLookup);
296
+ }
297
+ return [...writableMetas, ...readOnlyMetas];
298
+ }
299
+ function convertInstruction(instruction, accountMetas) {
300
+ const programAddress = accountMetas[instruction.programAddressIndex]?.address;
301
+ if (!programAddress) {
302
+ throw new Error(`Could not find program address at index ${instruction.programAddressIndex}`);
303
+ }
304
+ const accounts = instruction.accountIndices?.map((accountIndex) => accountMetas[accountIndex]);
305
+ const { data } = instruction;
306
+ return {
307
+ programAddress,
308
+ ...accounts && accounts.length ? { accounts } : {},
309
+ ...data && data.length ? { data } : {}
310
+ };
311
+ }
312
+ function getLifetimeConstraint(messageLifetimeToken, firstInstruction, lastValidBlockHeight) {
313
+ if (!firstInstruction || !isAdvanceNonceAccountInstruction(firstInstruction)) {
314
+ return {
315
+ blockhash: messageLifetimeToken,
316
+ lastValidBlockHeight: lastValidBlockHeight ?? 2n ** 64n - 1n
317
+ // U64 MAX
318
+ };
319
+ } else {
320
+ const nonceAccountAddress = firstInstruction.accounts[0].address;
321
+ addresses.assertIsAddress(nonceAccountAddress);
322
+ const nonceAuthorityAddress = firstInstruction.accounts[2].address;
323
+ addresses.assertIsAddress(nonceAuthorityAddress);
324
+ return {
325
+ nonce: messageLifetimeToken,
326
+ nonceAccountAddress,
327
+ nonceAuthorityAddress
328
+ };
329
+ }
330
+ }
331
+ function convertSignatures(compiledTransaction) {
332
+ const {
333
+ compiledMessage: { staticAccounts },
334
+ signatures
335
+ } = compiledTransaction;
336
+ return signatures.reduce((acc, sig, index) => {
337
+ const allZeros = sig.every((byte) => byte === 0);
338
+ if (allZeros)
339
+ return acc;
340
+ const address = staticAccounts[index];
341
+ return { ...acc, [address]: sig };
342
+ }, {});
343
+ }
344
+ function decompileTransaction(compiledTransaction, config) {
345
+ const { compiledMessage } = compiledTransaction;
346
+ const feePayer = compiledMessage.staticAccounts[0];
347
+ if (!feePayer)
348
+ throw new Error("No fee payer set in CompiledTransaction");
349
+ const accountMetas = getAccountMetas(compiledMessage);
350
+ const accountLookupMetas = "addressTableLookups" in compiledMessage && compiledMessage.addressTableLookups !== void 0 && compiledMessage.addressTableLookups.length > 0 ? getAddressLookupMetas(compiledMessage.addressTableLookups, config?.addressesByLookupTableAddress ?? {}) : [];
351
+ const transactionMetas = [...accountMetas, ...accountLookupMetas];
352
+ const instructions = compiledMessage.instructions.map(
353
+ (compiledInstruction) => convertInstruction(compiledInstruction, transactionMetas)
354
+ );
355
+ const firstInstruction = instructions[0];
356
+ const lifetimeConstraint = getLifetimeConstraint(
357
+ compiledMessage.lifetimeToken,
358
+ firstInstruction,
359
+ config?.lastValidBlockHeight
360
+ );
361
+ const signatures = convertSignatures(compiledTransaction);
362
+ return functional.pipe(
363
+ createTransaction({ version: compiledMessage.version }),
364
+ (tx) => setTransactionFeePayer(feePayer, tx),
365
+ (tx) => instructions.reduce((acc, instruction) => {
366
+ return appendTransactionInstruction(instruction, acc);
367
+ }, tx),
368
+ (tx) => "blockhash" in lifetimeConstraint ? setTransactionLifetimeUsingBlockhash(lifetimeConstraint, tx) : setTransactionLifetimeUsingDurableNonce(lifetimeConstraint, tx),
369
+ (tx) => Object.keys(signatures).length > 0 ? { ...tx, signatures } : tx
370
+ );
371
+ }
205
372
  function upsert(addressMap, address, update) {
206
373
  addressMap[address] = update(addressMap[address] ?? { role: AccountRole.READONLY });
207
374
  }
@@ -254,7 +421,7 @@ function getAddressMapFromInstructions(feePayer, instructions) {
254
421
  const shouldReplaceEntry = (
255
422
  // Consider using the new LOOKUP_TABLE if its address is different...
256
423
  entry.lookupTableAddress !== accountMeta.lookupTableAddress && // ...and sorts before the existing one.
257
- (addressComparator || (addressComparator = addresses.getAddressComparator()))(
424
+ (addressComparator ||= addresses.getAddressComparator())(
258
425
  accountMeta.lookupTableAddress,
259
426
  entry.lookupTableAddress
260
427
  ) < 0
@@ -360,7 +527,7 @@ function getOrderedAccountsFromAddressMap(addressMap) {
360
527
  if (leftIsWritable !== isWritableRole(rightEntry.role)) {
361
528
  return leftIsWritable ? -1 : 1;
362
529
  }
363
- addressComparator || (addressComparator = addresses.getAddressComparator());
530
+ addressComparator ||= addresses.getAddressComparator();
364
531
  if (leftEntry[TYPE] === 1 /* LOOKUP_TABLE */ && rightEntry[TYPE] === 1 /* LOOKUP_TABLE */ && leftEntry.lookupTableAddress !== rightEntry.lookupTableAddress) {
365
532
  return addressComparator(leftEntry.lookupTableAddress, rightEntry.lookupTableAddress);
366
533
  } else {
@@ -373,16 +540,15 @@ function getOrderedAccountsFromAddressMap(addressMap) {
373
540
  return orderedAccounts;
374
541
  }
375
542
  function getCompiledAddressTableLookups(orderedAccounts) {
376
- var _a;
377
543
  const index = {};
378
544
  for (const account of orderedAccounts) {
379
545
  if (!("lookupTableAddress" in account)) {
380
546
  continue;
381
547
  }
382
- const entry = index[_a = account.lookupTableAddress] || (index[_a] = {
548
+ const entry = index[account.lookupTableAddress] ||= {
383
549
  readableIndices: [],
384
550
  writableIndices: []
385
- });
551
+ };
386
552
  if (account.role === AccountRole.WRITABLE) {
387
553
  entry.writableIndices.push(account.addressIndex);
388
554
  } else {
@@ -468,187 +634,31 @@ function compileMessage(transaction) {
468
634
  version: transaction.version
469
635
  };
470
636
  }
471
-
472
- // src/compile-transaction.ts
473
- function getCompiledTransaction(transaction) {
474
- const compiledMessage = compileMessage(transaction);
475
- let signatures;
476
- if ("signatures" in transaction) {
477
- signatures = [];
478
- for (let ii = 0; ii < compiledMessage.header.numSignerAccounts; ii++) {
479
- signatures[ii] = transaction.signatures[compiledMessage.staticAccounts[ii]] ?? new Uint8Array(Array(64).fill(0));
480
- }
481
- } else {
482
- signatures = Array(compiledMessage.header.numSignerAccounts).fill(new Uint8Array(Array(64).fill(0)));
483
- }
484
- return {
485
- compiledMessage,
486
- signatures
487
- };
488
- }
489
- function getAccountMetas(message) {
490
- const { header } = message;
491
- const numWritableSignerAccounts = header.numSignerAccounts - header.numReadonlySignerAccounts;
492
- const numWritableNonSignerAccounts = message.staticAccounts.length - header.numSignerAccounts - header.numReadonlyNonSignerAccounts;
493
- const accountMetas = [];
494
- let accountIndex = 0;
495
- for (let i = 0; i < numWritableSignerAccounts; i++) {
496
- accountMetas.push({
497
- address: message.staticAccounts[accountIndex],
498
- role: AccountRole.WRITABLE_SIGNER
499
- });
500
- accountIndex++;
501
- }
502
- for (let i = 0; i < header.numReadonlySignerAccounts; i++) {
503
- accountMetas.push({
504
- address: message.staticAccounts[accountIndex],
505
- role: AccountRole.READONLY_SIGNER
506
- });
507
- accountIndex++;
508
- }
509
- for (let i = 0; i < numWritableNonSignerAccounts; i++) {
510
- accountMetas.push({
511
- address: message.staticAccounts[accountIndex],
512
- role: AccountRole.WRITABLE
513
- });
514
- accountIndex++;
515
- }
516
- for (let i = 0; i < header.numReadonlyNonSignerAccounts; i++) {
517
- accountMetas.push({
518
- address: message.staticAccounts[accountIndex],
519
- role: AccountRole.READONLY
520
- });
521
- accountIndex++;
522
- }
523
- return accountMetas;
524
- }
525
- function convertInstruction(instruction, accountMetas) {
526
- const programAddress = accountMetas[instruction.programAddressIndex]?.address;
527
- if (!programAddress) {
528
- throw new Error(`Could not find program address at index ${instruction.programAddressIndex}`);
529
- }
530
- const accounts = instruction.accountIndices?.map((accountIndex) => accountMetas[accountIndex]);
531
- const { data } = instruction;
532
- return {
533
- programAddress,
534
- ...accounts && accounts.length ? { accounts } : {},
535
- ...data && data.length ? { data } : {}
536
- };
537
- }
538
- function getLifetimeConstraint(messageLifetimeToken, firstInstruction, lastValidBlockHeight) {
539
- if (!firstInstruction || !isAdvanceNonceAccountInstruction(firstInstruction)) {
540
- return {
541
- blockhash: messageLifetimeToken,
542
- lastValidBlockHeight: lastValidBlockHeight ?? 2n ** 64n - 1n
543
- // U64 MAX
544
- };
545
- } else {
546
- const nonceAccountAddress = firstInstruction.accounts[0].address;
547
- addresses.assertIsAddress(nonceAccountAddress);
548
- const nonceAuthorityAddress = firstInstruction.accounts[2].address;
549
- addresses.assertIsAddress(nonceAuthorityAddress);
550
- return {
551
- nonce: messageLifetimeToken,
552
- nonceAccountAddress,
553
- nonceAuthorityAddress
554
- };
555
- }
556
- }
557
- function convertSignatures(compiledTransaction) {
558
- const {
559
- compiledMessage: { staticAccounts },
560
- signatures
561
- } = compiledTransaction;
562
- return signatures.reduce((acc, sig, index) => {
563
- const allZeros = sig.every((byte) => byte === 0);
564
- if (allZeros)
565
- return acc;
566
- const address = staticAccounts[index];
567
- return { ...acc, [address]: sig };
568
- }, {});
569
- }
570
- function decompileTransaction(compiledTransaction, lastValidBlockHeight) {
571
- const { compiledMessage } = compiledTransaction;
572
- if ("addressTableLookups" in compiledMessage && compiledMessage.addressTableLookups.length > 0) {
573
- throw new Error("Cannot convert transaction with addressTableLookups");
574
- }
575
- const feePayer = compiledMessage.staticAccounts[0];
576
- if (!feePayer)
577
- throw new Error("No fee payer set in CompiledTransaction");
578
- const accountMetas = getAccountMetas(compiledMessage);
579
- const instructions = compiledMessage.instructions.map(
580
- (compiledInstruction) => convertInstruction(compiledInstruction, accountMetas)
581
- );
582
- const firstInstruction = instructions[0];
583
- const lifetimeConstraint = getLifetimeConstraint(
584
- compiledMessage.lifetimeToken,
585
- firstInstruction,
586
- lastValidBlockHeight
587
- );
588
- const signatures = convertSignatures(compiledTransaction);
589
- return functional.pipe(
590
- createTransaction({ version: compiledMessage.version }),
591
- (tx) => setTransactionFeePayer(feePayer, tx),
592
- (tx) => instructions.reduce((acc, instruction) => {
593
- return appendTransactionInstruction(instruction, acc);
594
- }, tx),
595
- (tx) => "blockhash" in lifetimeConstraint ? setTransactionLifetimeUsingBlockhash(lifetimeConstraint, tx) : setTransactionLifetimeUsingDurableNonce(lifetimeConstraint, tx),
596
- (tx) => compiledTransaction.signatures.length ? { ...tx, signatures } : tx
597
- );
598
- }
599
- var lookupTableAddressDescription = __DEV__ ? "The address of the address lookup table account from which instruction addresses should be looked up" : "lookupTableAddress";
600
- var writableIndicesDescription = __DEV__ ? "The indices of the accounts in the lookup table that should be loaded as writeable" : "writableIndices";
601
- var readableIndicesDescription = __DEV__ ? "The indices of the accounts in the lookup table that should be loaded as read-only" : "readableIndices";
602
- 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";
603
637
  var memoizedAddressTableLookupEncoder;
604
638
  function getAddressTableLookupEncoder() {
605
639
  if (!memoizedAddressTableLookupEncoder) {
606
- memoizedAddressTableLookupEncoder = codecsDataStructures.getStructEncoder(
640
+ memoizedAddressTableLookupEncoder = codecsDataStructures.getStructEncoder([
641
+ ["lookupTableAddress", addresses.getAddressEncoder()],
607
642
  [
608
- ["lookupTableAddress", addresses.getAddressEncoder({ description: lookupTableAddressDescription })],
609
- [
610
- "writableIndices",
611
- codecsDataStructures.getArrayEncoder(codecsNumbers.getU8Encoder(), {
612
- description: writableIndicesDescription,
613
- size: codecsNumbers.getShortU16Encoder()
614
- })
615
- ],
616
- [
617
- "readableIndices",
618
- codecsDataStructures.getArrayEncoder(codecsNumbers.getU8Encoder(), {
619
- description: readableIndicesDescription,
620
- size: codecsNumbers.getShortU16Encoder()
621
- })
622
- ]
643
+ "writableIndices",
644
+ codecsDataStructures.getArrayEncoder(codecsNumbers.getU8Encoder(), { size: codecsNumbers.getShortU16Encoder() })
623
645
  ],
624
- { description: addressTableLookupDescription }
625
- );
646
+ [
647
+ "readableIndices",
648
+ codecsDataStructures.getArrayEncoder(codecsNumbers.getU8Encoder(), { size: codecsNumbers.getShortU16Encoder() })
649
+ ]
650
+ ]);
626
651
  }
627
652
  return memoizedAddressTableLookupEncoder;
628
653
  }
629
654
  var memoizedAddressTableLookupDecoder;
630
655
  function getAddressTableLookupDecoder() {
631
656
  if (!memoizedAddressTableLookupDecoder) {
632
- memoizedAddressTableLookupDecoder = codecsDataStructures.getStructDecoder(
633
- [
634
- ["lookupTableAddress", addresses.getAddressDecoder({ description: lookupTableAddressDescription })],
635
- [
636
- "writableIndices",
637
- codecsDataStructures.getArrayDecoder(codecsNumbers.getU8Decoder(), {
638
- description: writableIndicesDescription,
639
- size: codecsNumbers.getShortU16Decoder()
640
- })
641
- ],
642
- [
643
- "readableIndices",
644
- codecsDataStructures.getArrayDecoder(codecsNumbers.getU8Decoder(), {
645
- description: readableIndicesDescription,
646
- size: codecsNumbers.getShortU16Decoder()
647
- })
648
- ]
649
- ],
650
- { description: addressTableLookupDescription }
651
- );
657
+ memoizedAddressTableLookupDecoder = codecsDataStructures.getStructDecoder([
658
+ ["lookupTableAddress", addresses.getAddressDecoder()],
659
+ ["writableIndices", codecsDataStructures.getArrayDecoder(codecsNumbers.getU8Decoder(), { size: codecsNumbers.getShortU16Decoder() })],
660
+ ["readableIndices", codecsDataStructures.getArrayDecoder(codecsNumbers.getU8Decoder(), { size: codecsNumbers.getShortU16Decoder() })]
661
+ ]);
652
662
  }
653
663
  return memoizedAddressTableLookupDecoder;
654
664
  }
@@ -658,72 +668,34 @@ function getMemoizedU8Encoder() {
658
668
  memoizedU8Encoder = codecsNumbers.getU8Encoder();
659
669
  return memoizedU8Encoder;
660
670
  }
661
- function getMemoizedU8EncoderDescription(description) {
662
- const encoder = getMemoizedU8Encoder();
663
- return {
664
- ...encoder,
665
- description: description ?? encoder.description
666
- };
667
- }
668
671
  var memoizedU8Decoder;
669
672
  function getMemoizedU8Decoder() {
670
673
  if (!memoizedU8Decoder)
671
674
  memoizedU8Decoder = codecsNumbers.getU8Decoder();
672
675
  return memoizedU8Decoder;
673
676
  }
674
- function getMemoizedU8DecoderDescription(description) {
675
- const decoder = getMemoizedU8Decoder();
676
- return {
677
- ...decoder,
678
- description: description ?? decoder.description
679
- };
680
- }
681
- 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;
682
- 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;
683
- var numReadonlyNonSignerAccountsDescription = __DEV__ ? "The expected number of addresses in the static address list belonging to accounts that are neither signers, nor writable" : void 0;
684
- var messageHeaderDescription = __DEV__ ? "The transaction message header containing counts of the signer, readonly-signer, and readonly-nonsigner account addresses" : void 0;
685
677
  function getMessageHeaderEncoder() {
686
- return codecsDataStructures.getStructEncoder(
687
- [
688
- ["numSignerAccounts", getMemoizedU8EncoderDescription(numSignerAccountsDescription)],
689
- ["numReadonlySignerAccounts", getMemoizedU8EncoderDescription(numReadonlySignerAccountsDescription)],
690
- ["numReadonlyNonSignerAccounts", getMemoizedU8EncoderDescription(numReadonlyNonSignerAccountsDescription)]
691
- ],
692
- {
693
- description: messageHeaderDescription
694
- }
695
- );
678
+ return codecsDataStructures.getStructEncoder([
679
+ ["numSignerAccounts", getMemoizedU8Encoder()],
680
+ ["numReadonlySignerAccounts", getMemoizedU8Encoder()],
681
+ ["numReadonlyNonSignerAccounts", getMemoizedU8Encoder()]
682
+ ]);
696
683
  }
697
684
  function getMessageHeaderDecoder() {
698
- return codecsDataStructures.getStructDecoder(
699
- [
700
- ["numSignerAccounts", getMemoizedU8DecoderDescription(numSignerAccountsDescription)],
701
- ["numReadonlySignerAccounts", getMemoizedU8DecoderDescription(numReadonlySignerAccountsDescription)],
702
- ["numReadonlyNonSignerAccounts", getMemoizedU8DecoderDescription(numReadonlyNonSignerAccountsDescription)]
703
- ],
704
- {
705
- description: messageHeaderDescription
706
- }
707
- );
685
+ return codecsDataStructures.getStructDecoder([
686
+ ["numSignerAccounts", getMemoizedU8Decoder()],
687
+ ["numReadonlySignerAccounts", getMemoizedU8Decoder()],
688
+ ["numReadonlyNonSignerAccounts", getMemoizedU8Decoder()]
689
+ ]);
708
690
  }
709
- var programAddressIndexDescription = __DEV__ ? "The index of the program being called, according to the well-ordered accounts list for this transaction" : "programAddressIndex";
710
- var accountIndexDescription = __DEV__ ? "The index of an account, according to the well-ordered accounts list for this transaction" : void 0;
711
- 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";
712
- var dataDescription = __DEV__ ? "An optional buffer of data passed to the instruction" : "data";
713
691
  var memoizedGetInstructionEncoder;
714
692
  function getInstructionEncoder() {
715
693
  if (!memoizedGetInstructionEncoder) {
716
694
  memoizedGetInstructionEncoder = codecsCore.mapEncoder(
717
695
  codecsDataStructures.getStructEncoder([
718
- ["programAddressIndex", codecsNumbers.getU8Encoder({ description: programAddressIndexDescription })],
719
- [
720
- "accountIndices",
721
- codecsDataStructures.getArrayEncoder(codecsNumbers.getU8Encoder({ description: accountIndexDescription }), {
722
- description: accountIndicesDescription,
723
- size: codecsNumbers.getShortU16Encoder()
724
- })
725
- ],
726
- ["data", codecsDataStructures.getBytesEncoder({ description: dataDescription, size: codecsNumbers.getShortU16Encoder() })]
696
+ ["programAddressIndex", codecsNumbers.getU8Encoder()],
697
+ ["accountIndices", codecsDataStructures.getArrayEncoder(codecsNumbers.getU8Encoder(), { size: codecsNumbers.getShortU16Encoder() })],
698
+ ["data", codecsDataStructures.getBytesEncoder({ size: codecsNumbers.getShortU16Encoder() })]
727
699
  ]),
728
700
  // Convert an instruction to have all fields defined
729
701
  (instruction) => {
@@ -745,15 +717,9 @@ function getInstructionDecoder() {
745
717
  if (!memoizedGetInstructionDecoder) {
746
718
  memoizedGetInstructionDecoder = codecsCore.mapDecoder(
747
719
  codecsDataStructures.getStructDecoder([
748
- ["programAddressIndex", codecsNumbers.getU8Decoder({ description: programAddressIndexDescription })],
749
- [
750
- "accountIndices",
751
- codecsDataStructures.getArrayDecoder(codecsNumbers.getU8Decoder({ description: accountIndexDescription }), {
752
- description: accountIndicesDescription,
753
- size: codecsNumbers.getShortU16Decoder()
754
- })
755
- ],
756
- ["data", codecsDataStructures.getBytesDecoder({ description: dataDescription, size: codecsNumbers.getShortU16Decoder() })]
720
+ ["programAddressIndex", codecsNumbers.getU8Decoder()],
721
+ ["accountIndices", codecsDataStructures.getArrayDecoder(codecsNumbers.getU8Decoder(), { size: codecsNumbers.getShortU16Decoder() })],
722
+ ["data", codecsDataStructures.getBytesDecoder({ size: codecsNumbers.getShortU16Decoder() })]
757
723
  ]),
758
724
  // Convert an instruction to exclude optional fields if they are empty
759
725
  (instruction) => {
@@ -772,47 +738,38 @@ function getInstructionDecoder() {
772
738
  return memoizedGetInstructionDecoder;
773
739
  }
774
740
  var VERSION_FLAG_MASK = 128;
775
- var BASE_CONFIG = {
776
- description: __DEV__ ? "A single byte that encodes the version of the transaction" : "",
777
- fixedSize: null,
778
- maxSize: 1
779
- };
780
- function decode(bytes, offset = 0) {
781
- const firstByte = bytes[offset];
782
- if ((firstByte & VERSION_FLAG_MASK) === 0) {
783
- return ["legacy", offset];
784
- } else {
785
- const version = firstByte ^ VERSION_FLAG_MASK;
786
- return [version, offset + 1];
787
- }
788
- }
789
- function encode(value) {
790
- if (value === "legacy") {
791
- return new Uint8Array();
792
- }
793
- if (value < 0 || value > 127) {
794
- throw new Error(`Transaction version must be in the range [0, 127]. \`${value}\` given.`);
795
- }
796
- return new Uint8Array([value | VERSION_FLAG_MASK]);
741
+ function getTransactionVersionEncoder() {
742
+ return codecsCore.createEncoder({
743
+ getSizeFromValue: (value) => value === "legacy" ? 0 : 1,
744
+ maxSize: 1,
745
+ write: (value, bytes, offset) => {
746
+ if (value === "legacy") {
747
+ return offset;
748
+ }
749
+ if (value < 0 || value > 127) {
750
+ throw new Error(`Transaction version must be in the range [0, 127]. \`${value}\` given.`);
751
+ }
752
+ bytes.set([value | VERSION_FLAG_MASK], offset);
753
+ return offset + 1;
754
+ }
755
+ });
797
756
  }
798
757
  function getTransactionVersionDecoder() {
799
- return {
800
- ...BASE_CONFIG,
801
- decode
802
- };
803
- }
804
- function getTransactionVersionEncoder() {
805
- return {
806
- ...BASE_CONFIG,
807
- encode
808
- };
758
+ return codecsCore.createDecoder({
759
+ maxSize: 1,
760
+ read: (bytes, offset) => {
761
+ const firstByte = bytes[offset];
762
+ if ((firstByte & VERSION_FLAG_MASK) === 0) {
763
+ return ["legacy", offset];
764
+ } else {
765
+ const version = firstByte ^ VERSION_FLAG_MASK;
766
+ return [version, offset + 1];
767
+ }
768
+ }
769
+ });
809
770
  }
810
771
 
811
772
  // src/serializers/message.ts
812
- var staticAccountsDescription = __DEV__ ? "A compact-array of static account addresses belonging to this transaction" : "staticAccounts";
813
- var lifetimeTokenDescription = __DEV__ ? "A 32-byte token that specifies the lifetime of this transaction (eg. a recent blockhash, or a durable nonce)" : "lifetimeToken";
814
- var instructionsDescription = __DEV__ ? "A compact-array of instructions belonging to this transaction" : "instructions";
815
- var addressTableLookupsDescription = __DEV__ ? "A compact array of address table lookups belonging to this transaction" : "addressTableLookups";
816
773
  function getCompiledMessageLegacyEncoder() {
817
774
  return codecsDataStructures.getStructEncoder(getPreludeStructEncoderTuple());
818
775
  }
@@ -837,151 +794,104 @@ function getPreludeStructEncoderTuple() {
837
794
  return [
838
795
  ["version", getTransactionVersionEncoder()],
839
796
  ["header", getMessageHeaderEncoder()],
840
- [
841
- "staticAccounts",
842
- codecsDataStructures.getArrayEncoder(addresses.getAddressEncoder(), {
843
- description: staticAccountsDescription,
844
- size: codecsNumbers.getShortU16Encoder()
845
- })
846
- ],
847
- [
848
- "lifetimeToken",
849
- codecsStrings.getStringEncoder({
850
- description: lifetimeTokenDescription,
851
- encoding: codecsStrings.getBase58Encoder(),
852
- size: 32
853
- })
854
- ],
855
- [
856
- "instructions",
857
- codecsDataStructures.getArrayEncoder(getInstructionEncoder(), {
858
- description: instructionsDescription,
859
- size: codecsNumbers.getShortU16Encoder()
860
- })
861
- ]
797
+ ["staticAccounts", codecsDataStructures.getArrayEncoder(addresses.getAddressEncoder(), { size: codecsNumbers.getShortU16Encoder() })],
798
+ ["lifetimeToken", codecsStrings.getStringEncoder({ encoding: codecsStrings.getBase58Encoder(), size: 32 })],
799
+ ["instructions", codecsDataStructures.getArrayEncoder(getInstructionEncoder(), { size: codecsNumbers.getShortU16Encoder() })]
862
800
  ];
863
801
  }
864
802
  function getPreludeStructDecoderTuple() {
865
803
  return [
866
804
  ["version", getTransactionVersionDecoder()],
867
805
  ["header", getMessageHeaderDecoder()],
868
- [
869
- "staticAccounts",
870
- codecsDataStructures.getArrayDecoder(addresses.getAddressDecoder(), {
871
- description: staticAccountsDescription,
872
- size: codecsNumbers.getShortU16Decoder()
873
- })
874
- ],
875
- [
876
- "lifetimeToken",
877
- codecsStrings.getStringDecoder({
878
- description: lifetimeTokenDescription,
879
- encoding: codecsStrings.getBase58Decoder(),
880
- size: 32
881
- })
882
- ],
883
- [
884
- "instructions",
885
- codecsDataStructures.getArrayDecoder(getInstructionDecoder(), {
886
- description: instructionsDescription,
887
- size: codecsNumbers.getShortU16Decoder()
888
- })
889
- ],
806
+ ["staticAccounts", codecsDataStructures.getArrayDecoder(addresses.getAddressDecoder(), { size: codecsNumbers.getShortU16Decoder() })],
807
+ ["lifetimeToken", codecsStrings.getStringDecoder({ encoding: codecsStrings.getBase58Decoder(), size: 32 })],
808
+ ["instructions", codecsDataStructures.getArrayDecoder(getInstructionDecoder(), { size: codecsNumbers.getShortU16Decoder() })],
890
809
  ["addressTableLookups", getAddressTableLookupArrayDecoder()]
891
810
  ];
892
811
  }
893
812
  function getAddressTableLookupArrayEncoder() {
894
- return codecsDataStructures.getArrayEncoder(getAddressTableLookupEncoder(), {
895
- description: addressTableLookupsDescription,
896
- size: codecsNumbers.getShortU16Encoder()
897
- });
813
+ return codecsDataStructures.getArrayEncoder(getAddressTableLookupEncoder(), { size: codecsNumbers.getShortU16Encoder() });
898
814
  }
899
815
  function getAddressTableLookupArrayDecoder() {
900
- return codecsDataStructures.getArrayDecoder(getAddressTableLookupDecoder(), {
901
- description: addressTableLookupsDescription,
902
- size: codecsNumbers.getShortU16Decoder()
903
- });
816
+ return codecsDataStructures.getArrayDecoder(getAddressTableLookupDecoder(), { size: codecsNumbers.getShortU16Decoder() });
904
817
  }
905
- var messageDescription = __DEV__ ? "The wire format of a Solana transaction message" : "message";
906
818
  function getCompiledMessageEncoder() {
907
- return {
908
- description: messageDescription,
909
- encode: (compiledMessage) => {
819
+ return codecsCore.createEncoder({
820
+ getSizeFromValue: (compiledMessage) => {
910
821
  if (compiledMessage.version === "legacy") {
911
- return getCompiledMessageLegacyEncoder().encode(compiledMessage);
822
+ return getCompiledMessageLegacyEncoder().getSizeFromValue(compiledMessage);
912
823
  } else {
913
- return getCompiledMessageVersionedEncoder().encode(compiledMessage);
824
+ return getCompiledMessageVersionedEncoder().getSizeFromValue(compiledMessage);
914
825
  }
915
826
  },
916
- fixedSize: null,
917
- maxSize: null
918
- };
827
+ write: (compiledMessage, bytes, offset) => {
828
+ if (compiledMessage.version === "legacy") {
829
+ return getCompiledMessageLegacyEncoder().write(compiledMessage, bytes, offset);
830
+ } else {
831
+ return getCompiledMessageVersionedEncoder().write(compiledMessage, bytes, offset);
832
+ }
833
+ }
834
+ });
919
835
  }
920
836
  function getCompiledMessageDecoder() {
921
- return codecsCore.mapDecoder(
922
- codecsDataStructures.getStructDecoder(getPreludeStructDecoderTuple(), {
923
- description: messageDescription
924
- }),
925
- ({ addressTableLookups, ...restOfMessage }) => {
926
- if (restOfMessage.version === "legacy" || !addressTableLookups?.length) {
927
- return restOfMessage;
928
- }
929
- return { ...restOfMessage, addressTableLookups };
837
+ return codecsCore.mapDecoder(codecsDataStructures.getStructDecoder(getPreludeStructDecoderTuple()), ({ addressTableLookups, ...restOfMessage }) => {
838
+ if (restOfMessage.version === "legacy" || !addressTableLookups?.length) {
839
+ return restOfMessage;
930
840
  }
931
- );
841
+ return { ...restOfMessage, addressTableLookups };
842
+ });
843
+ }
844
+ function getCompiledMessageCodec() {
845
+ return codecsCore.combineCodec(getCompiledMessageEncoder(), getCompiledMessageDecoder());
932
846
  }
933
847
 
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 codecsDataStructures.getStructEncoder(
939
- [
940
- [
941
- "signatures",
942
- codecsDataStructures.getArrayEncoder(codecsDataStructures.getBytesEncoder({ size: 64 }), {
943
- description: signaturesDescription,
944
- size: codecsNumbers.getShortU16Encoder()
945
- })
946
- ],
947
- ["compiledMessage", getCompiledMessageEncoder()]
948
- ],
949
- {
950
- description: transactionDescription
848
+ // src/compile-transaction.ts
849
+ function getCompiledTransaction(transaction) {
850
+ const compiledMessage = compileMessage(transaction);
851
+ let signatures;
852
+ if ("signatures" in transaction) {
853
+ signatures = [];
854
+ for (let ii = 0; ii < compiledMessage.header.numSignerAccounts; ii++) {
855
+ signatures[ii] = transaction.signatures[compiledMessage.staticAccounts[ii]] ?? new Uint8Array(Array(64).fill(0));
951
856
  }
952
- );
857
+ } else {
858
+ signatures = Array(compiledMessage.header.numSignerAccounts).fill(new Uint8Array(Array(64).fill(0)));
859
+ }
860
+ return {
861
+ compiledMessage,
862
+ signatures
863
+ };
953
864
  }
954
- function getSignatureDecoder() {
955
- return codecsCore.mapDecoder(codecsDataStructures.getBytesDecoder({ size: 64 }), (bytes) => bytes);
865
+
866
+ // src/serializers/transaction.ts
867
+ function getCompiledTransactionEncoder() {
868
+ return codecsDataStructures.getStructEncoder([
869
+ ["signatures", codecsDataStructures.getArrayEncoder(codecsDataStructures.getBytesEncoder({ size: 64 }), { size: codecsNumbers.getShortU16Encoder() })],
870
+ ["compiledMessage", getCompiledMessageEncoder()]
871
+ ]);
956
872
  }
957
873
  function getCompiledTransactionDecoder() {
958
- return codecsDataStructures.getStructDecoder(
874
+ return codecsDataStructures.getStructDecoder([
959
875
  [
960
- [
961
- "signatures",
962
- codecsDataStructures.getArrayDecoder(getSignatureDecoder(), {
963
- description: signaturesDescription,
964
- size: codecsNumbers.getShortU16Decoder()
965
- })
966
- ],
967
- ["compiledMessage", getCompiledMessageDecoder()]
876
+ "signatures",
877
+ codecsDataStructures.getArrayDecoder(codecsDataStructures.getBytesDecoder({ size: 64 }), {
878
+ size: codecsNumbers.getShortU16Decoder()
879
+ })
968
880
  ],
969
- {
970
- description: transactionDescription
971
- }
972
- );
881
+ ["compiledMessage", getCompiledMessageDecoder()]
882
+ ]);
973
883
  }
974
884
  function getTransactionEncoder() {
975
885
  return codecsCore.mapEncoder(getCompiledTransactionEncoder(), getCompiledTransaction);
976
886
  }
977
- function getTransactionDecoder(lastValidBlockHeight) {
887
+ function getTransactionDecoder(config) {
978
888
  return codecsCore.mapDecoder(
979
889
  getCompiledTransactionDecoder(),
980
- (compiledTransaction) => decompileTransaction(compiledTransaction, lastValidBlockHeight)
890
+ (compiledTransaction) => decompileTransaction(compiledTransaction, config)
981
891
  );
982
892
  }
983
- function getTransactionCodec(lastValidBlockHeight) {
984
- return codecsCore.combineCodec(getTransactionEncoder(), getTransactionDecoder(lastValidBlockHeight));
893
+ function getTransactionCodec(config) {
894
+ return codecsCore.combineCodec(getTransactionEncoder(), getTransactionDecoder(config));
985
895
  }
986
896
  var base58Decoder;
987
897
  function getSignatureFromTransaction(transaction) {
@@ -989,11 +899,9 @@ function getSignatureFromTransaction(transaction) {
989
899
  base58Decoder = codecsStrings.getBase58Decoder();
990
900
  const signatureBytes = transaction.signatures[transaction.feePayer];
991
901
  if (!signatureBytes) {
992
- throw new Error(
993
- "Could not determine this transaction's signature. Make sure that the transaction has been signed by its fee payer."
994
- );
902
+ throw new errors.SolanaError(errors.SOLANA_ERROR__TRANSACTION_SIGNATURE_NOT_COMPUTABLE);
995
903
  }
996
- const transactionSignature = base58Decoder.decode(signatureBytes)[0];
904
+ const transactionSignature = base58Decoder.decode(signatureBytes);
997
905
  return transactionSignature;
998
906
  }
999
907
  async function partiallySignTransaction(keyPairs, transaction) {
@@ -1024,34 +932,45 @@ async function signTransaction(keyPairs, transaction) {
1024
932
  function assertTransactionIsFullySigned(transaction) {
1025
933
  const signerAddressesFromInstructions = transaction.instructions.flatMap((i) => i.accounts?.filter((a) => isSignerRole(a.role)) ?? []).map((a) => a.address);
1026
934
  const requiredSigners = /* @__PURE__ */ new Set([transaction.feePayer, ...signerAddressesFromInstructions]);
935
+ const missingSigs = [];
1027
936
  requiredSigners.forEach((address) => {
1028
937
  if (!transaction.signatures[address]) {
1029
- throw new Error(`Transaction is missing signature for address \`${address}\``);
938
+ missingSigs.push(address);
1030
939
  }
1031
940
  });
941
+ if (missingSigs.length > 0) {
942
+ throw new errors.SolanaError(errors.SOLANA_ERROR__TRANSACTION_MISSING_SIGNATURES, {
943
+ addresses: missingSigs
944
+ });
945
+ }
1032
946
  }
1033
-
1034
- // src/wire-transaction.ts
1035
947
  function getBase64EncodedWireTransaction(transaction) {
1036
948
  const wireTransactionBytes = getTransactionEncoder().encode(transaction);
1037
- {
1038
- return btoa(String.fromCharCode(...wireTransactionBytes));
1039
- }
949
+ return codecsStrings.getBase64Decoder().decode(wireTransactionBytes);
1040
950
  }
1041
951
 
1042
952
  exports.appendTransactionInstruction = appendTransactionInstruction;
1043
- exports.assertIsBlockhash = assertIsBlockhash;
953
+ exports.appendTransactionInstructions = appendTransactionInstructions;
1044
954
  exports.assertIsDurableNonceTransaction = assertIsDurableNonceTransaction;
955
+ exports.assertIsTransactionWithBlockhashLifetime = assertIsTransactionWithBlockhashLifetime;
1045
956
  exports.assertTransactionIsFullySigned = assertTransactionIsFullySigned;
957
+ exports.compileMessage = compileMessage;
1046
958
  exports.createTransaction = createTransaction;
959
+ exports.decompileTransaction = decompileTransaction;
1047
960
  exports.getBase64EncodedWireTransaction = getBase64EncodedWireTransaction;
961
+ exports.getCompiledMessageCodec = getCompiledMessageCodec;
962
+ exports.getCompiledMessageDecoder = getCompiledMessageDecoder;
963
+ exports.getCompiledMessageEncoder = getCompiledMessageEncoder;
964
+ exports.getCompiledTransactionDecoder = getCompiledTransactionDecoder;
1048
965
  exports.getSignatureFromTransaction = getSignatureFromTransaction;
1049
966
  exports.getTransactionCodec = getTransactionCodec;
1050
967
  exports.getTransactionDecoder = getTransactionDecoder;
1051
968
  exports.getTransactionEncoder = getTransactionEncoder;
969
+ exports.getUnsignedTransaction = getUnsignedTransaction;
1052
970
  exports.isAdvanceNonceAccountInstruction = isAdvanceNonceAccountInstruction;
1053
971
  exports.partiallySignTransaction = partiallySignTransaction;
1054
972
  exports.prependTransactionInstruction = prependTransactionInstruction;
973
+ exports.prependTransactionInstructions = prependTransactionInstructions;
1055
974
  exports.setTransactionFeePayer = setTransactionFeePayer;
1056
975
  exports.setTransactionLifetimeUsingBlockhash = setTransactionLifetimeUsingBlockhash;
1057
976
  exports.setTransactionLifetimeUsingDurableNonce = setTransactionLifetimeUsingDurableNonce;