@solana/transactions 2.0.0-experimental.a9e6db3 → 2.0.0-experimental.ab12c29

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