@solana/transactions 2.0.0-experimental.efe6f4d → 2.0.0-experimental.f025b33

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 (50) hide show
  1. package/dist/index.browser.cjs +316 -403
  2. package/dist/index.browser.cjs.map +1 -1
  3. package/dist/index.browser.js +315 -406
  4. package/dist/index.browser.js.map +1 -1
  5. package/dist/index.native.js +313 -406
  6. package/dist/index.native.js.map +1 -1
  7. package/dist/index.node.cjs +316 -403
  8. package/dist/index.node.cjs.map +1 -1
  9. package/dist/index.node.js +313 -406
  10. package/dist/index.node.js.map +1 -1
  11. package/dist/types/blockhash.d.ts +5 -7
  12. package/dist/types/blockhash.d.ts.map +1 -1
  13. package/dist/types/compilable-transaction.d.ts +4 -4
  14. package/dist/types/compile-address-table-lookups.d.ts +1 -1
  15. package/dist/types/compile-header.d.ts +1 -1
  16. package/dist/types/compile-instructions.d.ts +1 -1
  17. package/dist/types/compile-lifetime-token.d.ts +1 -1
  18. package/dist/types/compile-static-accounts.d.ts +1 -1
  19. package/dist/types/compile-transaction.d.ts +3 -3
  20. package/dist/types/create-transaction.d.ts +1 -1
  21. package/dist/types/decompile-transaction.d.ts +12 -4
  22. package/dist/types/decompile-transaction.d.ts.map +1 -1
  23. package/dist/types/durable-nonce.d.ts +2 -2
  24. package/dist/types/fee-payer.d.ts +2 -2
  25. package/dist/types/index.d.ts +12 -10
  26. package/dist/types/index.d.ts.map +1 -1
  27. package/dist/types/instructions.d.ts +2 -2
  28. package/dist/types/message.d.ts +6 -6
  29. package/dist/types/serializers/address-table-lookup.d.ts +5 -5
  30. package/dist/types/serializers/address-table-lookup.d.ts.map +1 -1
  31. package/dist/types/serializers/header.d.ts +5 -5
  32. package/dist/types/serializers/header.d.ts.map +1 -1
  33. package/dist/types/serializers/index.d.ts +2 -1
  34. package/dist/types/serializers/index.d.ts.map +1 -1
  35. package/dist/types/serializers/instruction.d.ts +5 -5
  36. package/dist/types/serializers/instruction.d.ts.map +1 -1
  37. package/dist/types/serializers/message.d.ts +5 -5
  38. package/dist/types/serializers/message.d.ts.map +1 -1
  39. package/dist/types/serializers/transaction-version.d.ts +5 -5
  40. package/dist/types/serializers/transaction-version.d.ts.map +1 -1
  41. package/dist/types/serializers/transaction.d.ts +9 -6
  42. package/dist/types/serializers/transaction.d.ts.map +1 -1
  43. package/dist/types/signatures.d.ts +2 -2
  44. package/dist/types/signatures.d.ts.map +1 -1
  45. package/dist/types/unsigned-transaction.d.ts +1 -1
  46. package/dist/types/wire-transaction.d.ts +1 -1
  47. package/package.json +17 -16
  48. package/dist/index.development.js +0 -1750
  49. package/dist/index.development.js.map +0 -1
  50. package/dist/index.production.min.js +0 -27
@@ -1,31 +1,14 @@
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
9
  var keys = require('@solana/keys');
10
10
 
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
11
+ // ../rpc-types/dist/index.browser.js
29
12
  var base58Encoder;
30
13
  function assertIsBlockhash(putativeBlockhash) {
31
14
  if (!base58Encoder)
@@ -49,6 +32,38 @@ function assertIsBlockhash(putativeBlockhash) {
49
32
  });
50
33
  }
51
34
  }
35
+
36
+ // src/unsigned-transaction.ts
37
+ function getUnsignedTransaction(transaction) {
38
+ if ("signatures" in transaction) {
39
+ const {
40
+ signatures: _,
41
+ // eslint-disable-line @typescript-eslint/no-unused-vars
42
+ ...unsignedTransaction
43
+ } = transaction;
44
+ return unsignedTransaction;
45
+ } else {
46
+ return transaction;
47
+ }
48
+ }
49
+
50
+ // src/blockhash.ts
51
+ function isTransactionWithBlockhashLifetime(transaction) {
52
+ const lifetimeConstraintShapeMatches = "lifetimeConstraint" in transaction && typeof transaction.lifetimeConstraint.blockhash === "string" && typeof transaction.lifetimeConstraint.lastValidBlockHeight === "bigint";
53
+ if (!lifetimeConstraintShapeMatches)
54
+ return false;
55
+ try {
56
+ assertIsBlockhash(transaction.lifetimeConstraint.blockhash);
57
+ return true;
58
+ } catch {
59
+ return false;
60
+ }
61
+ }
62
+ function assertIsTransactionWithBlockhashLifetime(transaction) {
63
+ if (!isTransactionWithBlockhashLifetime(transaction)) {
64
+ throw new Error("Transaction does not have a blockhash lifetime");
65
+ }
66
+ }
52
67
  function setTransactionLifetimeUsingBlockhash(blockhashLifetimeConstraint, transaction) {
53
68
  if ("lifetimeConstraint" in transaction && transaction.lifetimeConstraint.blockhash === blockhashLifetimeConstraint.blockhash && transaction.lifetimeConstraint.lastValidBlockHeight === blockhashLifetimeConstraint.lastValidBlockHeight) {
54
69
  return transaction;
@@ -202,6 +217,151 @@ function prependTransactionInstruction(instruction, transaction) {
202
217
  Object.freeze(out);
203
218
  return out;
204
219
  }
220
+
221
+ // src/decompile-transaction.ts
222
+ function getAccountMetas(message) {
223
+ const { header } = message;
224
+ const numWritableSignerAccounts = header.numSignerAccounts - header.numReadonlySignerAccounts;
225
+ const numWritableNonSignerAccounts = message.staticAccounts.length - header.numSignerAccounts - header.numReadonlyNonSignerAccounts;
226
+ const accountMetas = [];
227
+ let accountIndex = 0;
228
+ for (let i = 0; i < numWritableSignerAccounts; i++) {
229
+ accountMetas.push({
230
+ address: message.staticAccounts[accountIndex],
231
+ role: AccountRole.WRITABLE_SIGNER
232
+ });
233
+ accountIndex++;
234
+ }
235
+ for (let i = 0; i < header.numReadonlySignerAccounts; i++) {
236
+ accountMetas.push({
237
+ address: message.staticAccounts[accountIndex],
238
+ role: AccountRole.READONLY_SIGNER
239
+ });
240
+ accountIndex++;
241
+ }
242
+ for (let i = 0; i < numWritableNonSignerAccounts; i++) {
243
+ accountMetas.push({
244
+ address: message.staticAccounts[accountIndex],
245
+ role: AccountRole.WRITABLE
246
+ });
247
+ accountIndex++;
248
+ }
249
+ for (let i = 0; i < header.numReadonlyNonSignerAccounts; i++) {
250
+ accountMetas.push({
251
+ address: message.staticAccounts[accountIndex],
252
+ role: AccountRole.READONLY
253
+ });
254
+ accountIndex++;
255
+ }
256
+ return accountMetas;
257
+ }
258
+ function getAddressLookupMetas(compiledAddressTableLookups, addressesByLookupTableAddress) {
259
+ const compiledAddressTableLookupAddresses = compiledAddressTableLookups.map((l) => l.lookupTableAddress);
260
+ const missing = compiledAddressTableLookupAddresses.filter((a) => addressesByLookupTableAddress[a] === void 0);
261
+ if (missing.length > 0) {
262
+ const missingAddresses = missing.join(", ");
263
+ throw new Error(`Addresses not provided for lookup tables: [${missingAddresses}]`);
264
+ }
265
+ const readOnlyMetas = [];
266
+ const writableMetas = [];
267
+ for (const lookup of compiledAddressTableLookups) {
268
+ const addresses = addressesByLookupTableAddress[lookup.lookupTableAddress];
269
+ const highestIndex = Math.max(...lookup.readableIndices, ...lookup.writableIndices);
270
+ if (highestIndex >= addresses.length) {
271
+ throw new Error(
272
+ `Cannot look up index ${highestIndex} in lookup table [${lookup.lookupTableAddress}]. The lookup table may have been extended since the addresses provided were retrieved.`
273
+ );
274
+ }
275
+ const readOnlyForLookup = lookup.readableIndices.map((r) => ({
276
+ address: addresses[r],
277
+ addressIndex: r,
278
+ lookupTableAddress: lookup.lookupTableAddress,
279
+ role: AccountRole.READONLY
280
+ }));
281
+ readOnlyMetas.push(...readOnlyForLookup);
282
+ const writableForLookup = lookup.writableIndices.map((w) => ({
283
+ address: addresses[w],
284
+ addressIndex: w,
285
+ lookupTableAddress: lookup.lookupTableAddress,
286
+ role: AccountRole.WRITABLE
287
+ }));
288
+ writableMetas.push(...writableForLookup);
289
+ }
290
+ return [...writableMetas, ...readOnlyMetas];
291
+ }
292
+ function convertInstruction(instruction, accountMetas) {
293
+ const programAddress = accountMetas[instruction.programAddressIndex]?.address;
294
+ if (!programAddress) {
295
+ throw new Error(`Could not find program address at index ${instruction.programAddressIndex}`);
296
+ }
297
+ const accounts = instruction.accountIndices?.map((accountIndex) => accountMetas[accountIndex]);
298
+ const { data } = instruction;
299
+ return {
300
+ programAddress,
301
+ ...accounts && accounts.length ? { accounts } : {},
302
+ ...data && data.length ? { data } : {}
303
+ };
304
+ }
305
+ function getLifetimeConstraint(messageLifetimeToken, firstInstruction, lastValidBlockHeight) {
306
+ if (!firstInstruction || !isAdvanceNonceAccountInstruction(firstInstruction)) {
307
+ return {
308
+ blockhash: messageLifetimeToken,
309
+ lastValidBlockHeight: lastValidBlockHeight ?? 2n ** 64n - 1n
310
+ // U64 MAX
311
+ };
312
+ } else {
313
+ const nonceAccountAddress = firstInstruction.accounts[0].address;
314
+ addresses.assertIsAddress(nonceAccountAddress);
315
+ const nonceAuthorityAddress = firstInstruction.accounts[2].address;
316
+ addresses.assertIsAddress(nonceAuthorityAddress);
317
+ return {
318
+ nonce: messageLifetimeToken,
319
+ nonceAccountAddress,
320
+ nonceAuthorityAddress
321
+ };
322
+ }
323
+ }
324
+ function convertSignatures(compiledTransaction) {
325
+ const {
326
+ compiledMessage: { staticAccounts },
327
+ signatures
328
+ } = compiledTransaction;
329
+ return signatures.reduce((acc, sig, index) => {
330
+ const allZeros = sig.every((byte) => byte === 0);
331
+ if (allZeros)
332
+ return acc;
333
+ const address = staticAccounts[index];
334
+ return { ...acc, [address]: sig };
335
+ }, {});
336
+ }
337
+ function decompileTransaction(compiledTransaction, config) {
338
+ const { compiledMessage } = compiledTransaction;
339
+ const feePayer = compiledMessage.staticAccounts[0];
340
+ if (!feePayer)
341
+ throw new Error("No fee payer set in CompiledTransaction");
342
+ const accountMetas = getAccountMetas(compiledMessage);
343
+ const accountLookupMetas = "addressTableLookups" in compiledMessage && compiledMessage.addressTableLookups !== void 0 && compiledMessage.addressTableLookups.length > 0 ? getAddressLookupMetas(compiledMessage.addressTableLookups, config?.addressesByLookupTableAddress ?? {}) : [];
344
+ const transactionMetas = [...accountMetas, ...accountLookupMetas];
345
+ const instructions = compiledMessage.instructions.map(
346
+ (compiledInstruction) => convertInstruction(compiledInstruction, transactionMetas)
347
+ );
348
+ const firstInstruction = instructions[0];
349
+ const lifetimeConstraint = getLifetimeConstraint(
350
+ compiledMessage.lifetimeToken,
351
+ firstInstruction,
352
+ config?.lastValidBlockHeight
353
+ );
354
+ const signatures = convertSignatures(compiledTransaction);
355
+ return functional.pipe(
356
+ createTransaction({ version: compiledMessage.version }),
357
+ (tx) => setTransactionFeePayer(feePayer, tx),
358
+ (tx) => instructions.reduce((acc, instruction) => {
359
+ return appendTransactionInstruction(instruction, acc);
360
+ }, tx),
361
+ (tx) => "blockhash" in lifetimeConstraint ? setTransactionLifetimeUsingBlockhash(lifetimeConstraint, tx) : setTransactionLifetimeUsingDurableNonce(lifetimeConstraint, tx),
362
+ (tx) => Object.keys(signatures).length > 0 ? { ...tx, signatures } : tx
363
+ );
364
+ }
205
365
  function upsert(addressMap, address, update) {
206
366
  addressMap[address] = update(addressMap[address] ?? { role: AccountRole.READONLY });
207
367
  }
@@ -254,7 +414,7 @@ function getAddressMapFromInstructions(feePayer, instructions) {
254
414
  const shouldReplaceEntry = (
255
415
  // Consider using the new LOOKUP_TABLE if its address is different...
256
416
  entry.lookupTableAddress !== accountMeta.lookupTableAddress && // ...and sorts before the existing one.
257
- (addressComparator || (addressComparator = addresses.getAddressComparator()))(
417
+ (addressComparator ||= addresses.getAddressComparator())(
258
418
  accountMeta.lookupTableAddress,
259
419
  entry.lookupTableAddress
260
420
  ) < 0
@@ -360,7 +520,7 @@ function getOrderedAccountsFromAddressMap(addressMap) {
360
520
  if (leftIsWritable !== isWritableRole(rightEntry.role)) {
361
521
  return leftIsWritable ? -1 : 1;
362
522
  }
363
- addressComparator || (addressComparator = addresses.getAddressComparator());
523
+ addressComparator ||= addresses.getAddressComparator();
364
524
  if (leftEntry[TYPE] === 1 /* LOOKUP_TABLE */ && rightEntry[TYPE] === 1 /* LOOKUP_TABLE */ && leftEntry.lookupTableAddress !== rightEntry.lookupTableAddress) {
365
525
  return addressComparator(leftEntry.lookupTableAddress, rightEntry.lookupTableAddress);
366
526
  } else {
@@ -373,16 +533,15 @@ function getOrderedAccountsFromAddressMap(addressMap) {
373
533
  return orderedAccounts;
374
534
  }
375
535
  function getCompiledAddressTableLookups(orderedAccounts) {
376
- var _a;
377
536
  const index = {};
378
537
  for (const account of orderedAccounts) {
379
538
  if (!("lookupTableAddress" in account)) {
380
539
  continue;
381
540
  }
382
- const entry = index[_a = account.lookupTableAddress] || (index[_a] = {
541
+ const entry = index[account.lookupTableAddress] ||= {
383
542
  readableIndices: [],
384
543
  writableIndices: []
385
- });
544
+ };
386
545
  if (account.role === AccountRole.WRITABLE) {
387
546
  entry.writableIndices.push(account.addressIndex);
388
547
  } else {
@@ -468,187 +627,31 @@ function compileMessage(transaction) {
468
627
  version: transaction.version
469
628
  };
470
629
  }
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
630
  var memoizedAddressTableLookupEncoder;
604
631
  function getAddressTableLookupEncoder() {
605
632
  if (!memoizedAddressTableLookupEncoder) {
606
- memoizedAddressTableLookupEncoder = codecsDataStructures.getStructEncoder(
633
+ memoizedAddressTableLookupEncoder = codecsDataStructures.getStructEncoder([
634
+ ["lookupTableAddress", addresses.getAddressEncoder()],
607
635
  [
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
- ]
636
+ "writableIndices",
637
+ codecsDataStructures.getArrayEncoder(codecsNumbers.getU8Encoder(), { size: codecsNumbers.getShortU16Encoder() })
623
638
  ],
624
- { description: addressTableLookupDescription }
625
- );
639
+ [
640
+ "readableIndices",
641
+ codecsDataStructures.getArrayEncoder(codecsNumbers.getU8Encoder(), { size: codecsNumbers.getShortU16Encoder() })
642
+ ]
643
+ ]);
626
644
  }
627
645
  return memoizedAddressTableLookupEncoder;
628
646
  }
629
647
  var memoizedAddressTableLookupDecoder;
630
648
  function getAddressTableLookupDecoder() {
631
649
  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
- );
650
+ memoizedAddressTableLookupDecoder = codecsDataStructures.getStructDecoder([
651
+ ["lookupTableAddress", addresses.getAddressDecoder()],
652
+ ["writableIndices", codecsDataStructures.getArrayDecoder(codecsNumbers.getU8Decoder(), { size: codecsNumbers.getShortU16Decoder() })],
653
+ ["readableIndices", codecsDataStructures.getArrayDecoder(codecsNumbers.getU8Decoder(), { size: codecsNumbers.getShortU16Decoder() })]
654
+ ]);
652
655
  }
653
656
  return memoizedAddressTableLookupDecoder;
654
657
  }
@@ -658,72 +661,34 @@ function getMemoizedU8Encoder() {
658
661
  memoizedU8Encoder = codecsNumbers.getU8Encoder();
659
662
  return memoizedU8Encoder;
660
663
  }
661
- function getMemoizedU8EncoderDescription(description) {
662
- const encoder = getMemoizedU8Encoder();
663
- return {
664
- ...encoder,
665
- description: description ?? encoder.description
666
- };
667
- }
668
664
  var memoizedU8Decoder;
669
665
  function getMemoizedU8Decoder() {
670
666
  if (!memoizedU8Decoder)
671
667
  memoizedU8Decoder = codecsNumbers.getU8Decoder();
672
668
  return memoizedU8Decoder;
673
669
  }
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
670
  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
- );
671
+ return codecsDataStructures.getStructEncoder([
672
+ ["numSignerAccounts", getMemoizedU8Encoder()],
673
+ ["numReadonlySignerAccounts", getMemoizedU8Encoder()],
674
+ ["numReadonlyNonSignerAccounts", getMemoizedU8Encoder()]
675
+ ]);
696
676
  }
697
677
  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
- );
678
+ return codecsDataStructures.getStructDecoder([
679
+ ["numSignerAccounts", getMemoizedU8Decoder()],
680
+ ["numReadonlySignerAccounts", getMemoizedU8Decoder()],
681
+ ["numReadonlyNonSignerAccounts", getMemoizedU8Decoder()]
682
+ ]);
708
683
  }
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
684
  var memoizedGetInstructionEncoder;
714
685
  function getInstructionEncoder() {
715
686
  if (!memoizedGetInstructionEncoder) {
716
687
  memoizedGetInstructionEncoder = codecsCore.mapEncoder(
717
688
  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() })]
689
+ ["programAddressIndex", codecsNumbers.getU8Encoder()],
690
+ ["accountIndices", codecsDataStructures.getArrayEncoder(codecsNumbers.getU8Encoder(), { size: codecsNumbers.getShortU16Encoder() })],
691
+ ["data", codecsDataStructures.getBytesEncoder({ size: codecsNumbers.getShortU16Encoder() })]
727
692
  ]),
728
693
  // Convert an instruction to have all fields defined
729
694
  (instruction) => {
@@ -745,15 +710,9 @@ function getInstructionDecoder() {
745
710
  if (!memoizedGetInstructionDecoder) {
746
711
  memoizedGetInstructionDecoder = codecsCore.mapDecoder(
747
712
  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() })]
713
+ ["programAddressIndex", codecsNumbers.getU8Decoder()],
714
+ ["accountIndices", codecsDataStructures.getArrayDecoder(codecsNumbers.getU8Decoder(), { size: codecsNumbers.getShortU16Decoder() })],
715
+ ["data", codecsDataStructures.getBytesDecoder({ size: codecsNumbers.getShortU16Decoder() })]
757
716
  ]),
758
717
  // Convert an instruction to exclude optional fields if they are empty
759
718
  (instruction) => {
@@ -772,47 +731,38 @@ function getInstructionDecoder() {
772
731
  return memoizedGetInstructionDecoder;
773
732
  }
774
733
  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]);
734
+ function getTransactionVersionEncoder() {
735
+ return codecsCore.createEncoder({
736
+ getSizeFromValue: (value) => value === "legacy" ? 0 : 1,
737
+ maxSize: 1,
738
+ write: (value, bytes, offset) => {
739
+ if (value === "legacy") {
740
+ return offset;
741
+ }
742
+ if (value < 0 || value > 127) {
743
+ throw new Error(`Transaction version must be in the range [0, 127]. \`${value}\` given.`);
744
+ }
745
+ bytes.set([value | VERSION_FLAG_MASK], offset);
746
+ return offset + 1;
747
+ }
748
+ });
797
749
  }
798
750
  function getTransactionVersionDecoder() {
799
- return {
800
- ...BASE_CONFIG,
801
- decode
802
- };
803
- }
804
- function getTransactionVersionEncoder() {
805
- return {
806
- ...BASE_CONFIG,
807
- encode
808
- };
751
+ return codecsCore.createDecoder({
752
+ maxSize: 1,
753
+ read: (bytes, offset) => {
754
+ const firstByte = bytes[offset];
755
+ if ((firstByte & VERSION_FLAG_MASK) === 0) {
756
+ return ["legacy", offset];
757
+ } else {
758
+ const version = firstByte ^ VERSION_FLAG_MASK;
759
+ return [version, offset + 1];
760
+ }
761
+ }
762
+ });
809
763
  }
810
764
 
811
765
  // 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
766
  function getCompiledMessageLegacyEncoder() {
817
767
  return codecsDataStructures.getStructEncoder(getPreludeStructEncoderTuple());
818
768
  }
@@ -837,151 +787,104 @@ function getPreludeStructEncoderTuple() {
837
787
  return [
838
788
  ["version", getTransactionVersionEncoder()],
839
789
  ["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
- ]
790
+ ["staticAccounts", codecsDataStructures.getArrayEncoder(addresses.getAddressEncoder(), { size: codecsNumbers.getShortU16Encoder() })],
791
+ ["lifetimeToken", codecsStrings.getStringEncoder({ encoding: codecsStrings.getBase58Encoder(), size: 32 })],
792
+ ["instructions", codecsDataStructures.getArrayEncoder(getInstructionEncoder(), { size: codecsNumbers.getShortU16Encoder() })]
862
793
  ];
863
794
  }
864
795
  function getPreludeStructDecoderTuple() {
865
796
  return [
866
797
  ["version", getTransactionVersionDecoder()],
867
798
  ["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
- ],
799
+ ["staticAccounts", codecsDataStructures.getArrayDecoder(addresses.getAddressDecoder(), { size: codecsNumbers.getShortU16Decoder() })],
800
+ ["lifetimeToken", codecsStrings.getStringDecoder({ encoding: codecsStrings.getBase58Decoder(), size: 32 })],
801
+ ["instructions", codecsDataStructures.getArrayDecoder(getInstructionDecoder(), { size: codecsNumbers.getShortU16Decoder() })],
890
802
  ["addressTableLookups", getAddressTableLookupArrayDecoder()]
891
803
  ];
892
804
  }
893
805
  function getAddressTableLookupArrayEncoder() {
894
- return codecsDataStructures.getArrayEncoder(getAddressTableLookupEncoder(), {
895
- description: addressTableLookupsDescription,
896
- size: codecsNumbers.getShortU16Encoder()
897
- });
806
+ return codecsDataStructures.getArrayEncoder(getAddressTableLookupEncoder(), { size: codecsNumbers.getShortU16Encoder() });
898
807
  }
899
808
  function getAddressTableLookupArrayDecoder() {
900
- return codecsDataStructures.getArrayDecoder(getAddressTableLookupDecoder(), {
901
- description: addressTableLookupsDescription,
902
- size: codecsNumbers.getShortU16Decoder()
903
- });
809
+ return codecsDataStructures.getArrayDecoder(getAddressTableLookupDecoder(), { size: codecsNumbers.getShortU16Decoder() });
904
810
  }
905
- var messageDescription = __DEV__ ? "The wire format of a Solana transaction message" : "message";
906
811
  function getCompiledMessageEncoder() {
907
- return {
908
- description: messageDescription,
909
- encode: (compiledMessage) => {
812
+ return codecsCore.createEncoder({
813
+ getSizeFromValue: (compiledMessage) => {
910
814
  if (compiledMessage.version === "legacy") {
911
- return getCompiledMessageLegacyEncoder().encode(compiledMessage);
815
+ return getCompiledMessageLegacyEncoder().getSizeFromValue(compiledMessage);
912
816
  } else {
913
- return getCompiledMessageVersionedEncoder().encode(compiledMessage);
817
+ return getCompiledMessageVersionedEncoder().getSizeFromValue(compiledMessage);
914
818
  }
915
819
  },
916
- fixedSize: null,
917
- maxSize: null
918
- };
820
+ write: (compiledMessage, bytes, offset) => {
821
+ if (compiledMessage.version === "legacy") {
822
+ return getCompiledMessageLegacyEncoder().write(compiledMessage, bytes, offset);
823
+ } else {
824
+ return getCompiledMessageVersionedEncoder().write(compiledMessage, bytes, offset);
825
+ }
826
+ }
827
+ });
919
828
  }
920
829
  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 };
830
+ return codecsCore.mapDecoder(codecsDataStructures.getStructDecoder(getPreludeStructDecoderTuple()), ({ addressTableLookups, ...restOfMessage }) => {
831
+ if (restOfMessage.version === "legacy" || !addressTableLookups?.length) {
832
+ return restOfMessage;
930
833
  }
931
- );
834
+ return { ...restOfMessage, addressTableLookups };
835
+ });
836
+ }
837
+ function getCompiledMessageCodec() {
838
+ return codecsCore.combineCodec(getCompiledMessageEncoder(), getCompiledMessageDecoder());
932
839
  }
933
840
 
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
841
+ // src/compile-transaction.ts
842
+ function getCompiledTransaction(transaction) {
843
+ const compiledMessage = compileMessage(transaction);
844
+ let signatures;
845
+ if ("signatures" in transaction) {
846
+ signatures = [];
847
+ for (let ii = 0; ii < compiledMessage.header.numSignerAccounts; ii++) {
848
+ signatures[ii] = transaction.signatures[compiledMessage.staticAccounts[ii]] ?? new Uint8Array(Array(64).fill(0));
951
849
  }
952
- );
850
+ } else {
851
+ signatures = Array(compiledMessage.header.numSignerAccounts).fill(new Uint8Array(Array(64).fill(0)));
852
+ }
853
+ return {
854
+ compiledMessage,
855
+ signatures
856
+ };
953
857
  }
954
- function getSignatureDecoder() {
955
- return codecsCore.mapDecoder(codecsDataStructures.getBytesDecoder({ size: 64 }), (bytes) => bytes);
858
+
859
+ // src/serializers/transaction.ts
860
+ function getCompiledTransactionEncoder() {
861
+ return codecsDataStructures.getStructEncoder([
862
+ ["signatures", codecsDataStructures.getArrayEncoder(codecsDataStructures.getBytesEncoder({ size: 64 }), { size: codecsNumbers.getShortU16Encoder() })],
863
+ ["compiledMessage", getCompiledMessageEncoder()]
864
+ ]);
956
865
  }
957
866
  function getCompiledTransactionDecoder() {
958
- return codecsDataStructures.getStructDecoder(
867
+ return codecsDataStructures.getStructDecoder([
959
868
  [
960
- [
961
- "signatures",
962
- codecsDataStructures.getArrayDecoder(getSignatureDecoder(), {
963
- description: signaturesDescription,
964
- size: codecsNumbers.getShortU16Decoder()
965
- })
966
- ],
967
- ["compiledMessage", getCompiledMessageDecoder()]
869
+ "signatures",
870
+ codecsDataStructures.getArrayDecoder(codecsDataStructures.getBytesDecoder({ size: 64 }), {
871
+ size: codecsNumbers.getShortU16Decoder()
872
+ })
968
873
  ],
969
- {
970
- description: transactionDescription
971
- }
972
- );
874
+ ["compiledMessage", getCompiledMessageDecoder()]
875
+ ]);
973
876
  }
974
877
  function getTransactionEncoder() {
975
878
  return codecsCore.mapEncoder(getCompiledTransactionEncoder(), getCompiledTransaction);
976
879
  }
977
- function getTransactionDecoder(lastValidBlockHeight) {
880
+ function getTransactionDecoder(config) {
978
881
  return codecsCore.mapDecoder(
979
882
  getCompiledTransactionDecoder(),
980
- (compiledTransaction) => decompileTransaction(compiledTransaction, lastValidBlockHeight)
883
+ (compiledTransaction) => decompileTransaction(compiledTransaction, config)
981
884
  );
982
885
  }
983
- function getTransactionCodec(lastValidBlockHeight) {
984
- return codecsCore.combineCodec(getTransactionEncoder(), getTransactionDecoder(lastValidBlockHeight));
886
+ function getTransactionCodec(config) {
887
+ return codecsCore.combineCodec(getTransactionEncoder(), getTransactionDecoder(config));
985
888
  }
986
889
  var base58Decoder;
987
890
  function getSignatureFromTransaction(transaction) {
@@ -993,7 +896,7 @@ function getSignatureFromTransaction(transaction) {
993
896
  "Could not determine this transaction's signature. Make sure that the transaction has been signed by its fee payer."
994
897
  );
995
898
  }
996
- const transactionSignature = base58Decoder.decode(signatureBytes)[0];
899
+ const transactionSignature = base58Decoder.decode(signatureBytes);
997
900
  return transactionSignature;
998
901
  }
999
902
  async function partiallySignTransaction(keyPairs, transaction) {
@@ -1024,23 +927,33 @@ async function signTransaction(keyPairs, transaction) {
1024
927
  function assertTransactionIsFullySigned(transaction) {
1025
928
  const signerAddressesFromInstructions = transaction.instructions.flatMap((i) => i.accounts?.filter((a) => isSignerRole(a.role)) ?? []).map((a) => a.address);
1026
929
  const requiredSigners = /* @__PURE__ */ new Set([transaction.feePayer, ...signerAddressesFromInstructions]);
930
+ const missingSigs = [];
1027
931
  requiredSigners.forEach((address) => {
1028
932
  if (!transaction.signatures[address]) {
1029
- throw new Error(`Transaction is missing signature for address \`${address}\``);
933
+ missingSigs.push(address);
1030
934
  }
1031
935
  });
936
+ if (missingSigs.length > 0) {
937
+ throw new Error("Transaction is missing signatures for addresses: " + missingSigs.join(", "));
938
+ }
1032
939
  }
1033
940
  function getBase64EncodedWireTransaction(transaction) {
1034
941
  const wireTransactionBytes = getTransactionEncoder().encode(transaction);
1035
- return codecsStrings.getBase64Decoder().decode(wireTransactionBytes)[0];
942
+ return codecsStrings.getBase64Decoder().decode(wireTransactionBytes);
1036
943
  }
1037
944
 
1038
945
  exports.appendTransactionInstruction = appendTransactionInstruction;
1039
- exports.assertIsBlockhash = assertIsBlockhash;
1040
946
  exports.assertIsDurableNonceTransaction = assertIsDurableNonceTransaction;
947
+ exports.assertIsTransactionWithBlockhashLifetime = assertIsTransactionWithBlockhashLifetime;
1041
948
  exports.assertTransactionIsFullySigned = assertTransactionIsFullySigned;
949
+ exports.compileMessage = compileMessage;
1042
950
  exports.createTransaction = createTransaction;
951
+ exports.decompileTransaction = decompileTransaction;
1043
952
  exports.getBase64EncodedWireTransaction = getBase64EncodedWireTransaction;
953
+ exports.getCompiledMessageCodec = getCompiledMessageCodec;
954
+ exports.getCompiledMessageDecoder = getCompiledMessageDecoder;
955
+ exports.getCompiledMessageEncoder = getCompiledMessageEncoder;
956
+ exports.getCompiledTransactionDecoder = getCompiledTransactionDecoder;
1044
957
  exports.getSignatureFromTransaction = getSignatureFromTransaction;
1045
958
  exports.getTransactionCodec = getTransactionCodec;
1046
959
  exports.getTransactionDecoder = getTransactionDecoder;