@solana/transactions 2.0.0-experimental.cc94aa3 → 2.0.0-experimental.cdf7079

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