@solana/transactions 2.0.0-experimental.762ff13 → 2.0.0-experimental.76ad167
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -43
- package/dist/index.browser.cjs +326 -455
- package/dist/index.browser.cjs.map +1 -1
- package/dist/index.browser.js +320 -455
- package/dist/index.browser.js.map +1 -1
- package/dist/index.native.js +320 -455
- package/dist/index.native.js.map +1 -1
- package/dist/index.node.cjs +326 -455
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.js +320 -455
- package/dist/index.node.js.map +1 -1
- package/dist/types/accounts.d.ts +2 -2
- package/dist/types/accounts.d.ts.map +1 -0
- package/dist/types/blockhash.d.ts +5 -7
- package/dist/types/blockhash.d.ts.map +1 -0
- package/dist/types/compilable-transaction.d.ts +7 -0
- package/dist/types/compilable-transaction.d.ts.map +1 -0
- package/dist/types/compile-address-table-lookups.d.ts +3 -3
- package/dist/types/compile-address-table-lookups.d.ts.map +1 -0
- package/dist/types/compile-header.d.ts +1 -1
- package/dist/types/compile-header.d.ts.map +1 -0
- package/dist/types/compile-instructions.d.ts +1 -1
- package/dist/types/compile-instructions.d.ts.map +1 -0
- package/dist/types/compile-lifetime-token.d.ts +1 -1
- package/dist/types/compile-lifetime-token.d.ts.map +1 -0
- package/dist/types/compile-static-accounts.d.ts +3 -3
- package/dist/types/compile-static-accounts.d.ts.map +1 -0
- package/dist/types/compile-transaction.d.ts +6 -7
- package/dist/types/compile-transaction.d.ts.map +1 -0
- package/dist/types/create-transaction.d.ts +1 -1
- package/dist/types/create-transaction.d.ts.map +1 -0
- package/dist/types/decompile-transaction.d.ts +12 -6
- package/dist/types/decompile-transaction.d.ts.map +1 -0
- package/dist/types/durable-nonce.d.ts +5 -5
- package/dist/types/durable-nonce.d.ts.map +1 -0
- package/dist/types/fee-payer.d.ts +6 -6
- package/dist/types/fee-payer.d.ts.map +1 -0
- package/dist/types/index.d.ts +12 -9
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/instructions.d.ts +2 -2
- package/dist/types/instructions.d.ts.map +1 -0
- package/dist/types/message.d.ts +6 -10
- package/dist/types/message.d.ts.map +1 -0
- package/dist/types/serializers/address-table-lookup.d.ts +5 -5
- package/dist/types/serializers/address-table-lookup.d.ts.map +1 -0
- package/dist/types/serializers/header.d.ts +5 -5
- package/dist/types/serializers/header.d.ts.map +1 -0
- package/dist/types/serializers/index.d.ts +2 -1
- package/dist/types/serializers/index.d.ts.map +1 -0
- package/dist/types/serializers/instruction.d.ts +5 -5
- package/dist/types/serializers/instruction.d.ts.map +1 -0
- package/dist/types/serializers/message.d.ts +5 -5
- package/dist/types/serializers/message.d.ts.map +1 -0
- package/dist/types/serializers/transaction-version.d.ts +5 -5
- package/dist/types/serializers/transaction-version.d.ts.map +1 -0
- package/dist/types/serializers/transaction.d.ts +9 -8
- package/dist/types/serializers/transaction.d.ts.map +1 -0
- package/dist/types/signatures.d.ts +9 -14
- package/dist/types/signatures.d.ts.map +1 -0
- package/dist/types/types.d.ts +6 -13
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/unsigned-transaction.d.ts +1 -1
- package/dist/types/unsigned-transaction.d.ts.map +1 -0
- package/dist/types/wire-transaction.d.ts +1 -1
- package/dist/types/wire-transaction.d.ts.map +1 -0
- package/package.json +17 -16
- package/dist/index.development.js +0 -1778
- package/dist/index.development.js.map +0 -1
- package/dist/index.production.min.js +0 -29
package/dist/index.browser.cjs
CHANGED
|
@@ -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
|
-
// ../
|
|
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
|
|
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
|
|
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[
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
635
|
-
|
|
636
|
-
|
|
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
|
-
|
|
689
|
-
|
|
690
|
-
|
|
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
|
-
|
|
701
|
-
|
|
702
|
-
|
|
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(
|
|
719
|
-
[
|
|
720
|
-
|
|
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(
|
|
749
|
-
[
|
|
750
|
-
|
|
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
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
}
|
|
789
|
-
|
|
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
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
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,193 +787,106 @@ function getPreludeStructEncoderTuple() {
|
|
|
837
787
|
return [
|
|
838
788
|
["version", getTransactionVersionEncoder()],
|
|
839
789
|
["header", getMessageHeaderEncoder()],
|
|
840
|
-
[
|
|
841
|
-
|
|
842
|
-
|
|
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
|
-
|
|
870
|
-
|
|
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
|
-
|
|
909
|
-
encode: (compiledMessage) => {
|
|
812
|
+
return codecsCore.createEncoder({
|
|
813
|
+
getSizeFromValue: (compiledMessage) => {
|
|
910
814
|
if (compiledMessage.version === "legacy") {
|
|
911
|
-
return getCompiledMessageLegacyEncoder().
|
|
815
|
+
return getCompiledMessageLegacyEncoder().getSizeFromValue(compiledMessage);
|
|
912
816
|
} else {
|
|
913
|
-
return getCompiledMessageVersionedEncoder().
|
|
817
|
+
return getCompiledMessageVersionedEncoder().getSizeFromValue(compiledMessage);
|
|
914
818
|
}
|
|
915
819
|
},
|
|
916
|
-
|
|
917
|
-
|
|
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
|
-
|
|
923
|
-
|
|
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/
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
[
|
|
940
|
-
|
|
941
|
-
|
|
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
|
-
|
|
955
|
-
|
|
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
|
-
|
|
962
|
-
|
|
963
|
-
|
|
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
|
-
|
|
971
|
-
}
|
|
972
|
-
);
|
|
874
|
+
["compiledMessage", getCompiledMessageDecoder()]
|
|
875
|
+
]);
|
|
973
876
|
}
|
|
974
877
|
function getTransactionEncoder() {
|
|
975
878
|
return codecsCore.mapEncoder(getCompiledTransactionEncoder(), getCompiledTransaction);
|
|
976
879
|
}
|
|
977
|
-
function getTransactionDecoder(
|
|
880
|
+
function getTransactionDecoder(config) {
|
|
978
881
|
return codecsCore.mapDecoder(
|
|
979
882
|
getCompiledTransactionDecoder(),
|
|
980
|
-
(compiledTransaction) => decompileTransaction(compiledTransaction,
|
|
883
|
+
(compiledTransaction) => decompileTransaction(compiledTransaction, config)
|
|
981
884
|
);
|
|
982
885
|
}
|
|
983
|
-
function getTransactionCodec(
|
|
984
|
-
return codecsCore.combineCodec(getTransactionEncoder(), getTransactionDecoder(
|
|
886
|
+
function getTransactionCodec(config) {
|
|
887
|
+
return codecsCore.combineCodec(getTransactionEncoder(), getTransactionDecoder(config));
|
|
985
888
|
}
|
|
986
|
-
var base58Encoder2;
|
|
987
889
|
var base58Decoder;
|
|
988
|
-
function assertIsTransactionSignature(putativeTransactionSignature) {
|
|
989
|
-
if (!base58Encoder2)
|
|
990
|
-
base58Encoder2 = codecsStrings.getBase58Encoder();
|
|
991
|
-
try {
|
|
992
|
-
if (
|
|
993
|
-
// Lowest value (64 bytes of zeroes)
|
|
994
|
-
putativeTransactionSignature.length < 64 || // Highest value (64 bytes of 255)
|
|
995
|
-
putativeTransactionSignature.length > 88
|
|
996
|
-
) {
|
|
997
|
-
throw new Error("Expected input string to decode to a byte array of length 64.");
|
|
998
|
-
}
|
|
999
|
-
const bytes = base58Encoder2.encode(putativeTransactionSignature);
|
|
1000
|
-
const numBytes = bytes.byteLength;
|
|
1001
|
-
if (numBytes !== 64) {
|
|
1002
|
-
throw new Error(`Expected input string to decode to a byte array of length 64. Actual length: ${numBytes}`);
|
|
1003
|
-
}
|
|
1004
|
-
} catch (e) {
|
|
1005
|
-
throw new Error(`\`${putativeTransactionSignature}\` is not a transaction signature`, {
|
|
1006
|
-
cause: e
|
|
1007
|
-
});
|
|
1008
|
-
}
|
|
1009
|
-
}
|
|
1010
|
-
function isTransactionSignature(putativeTransactionSignature) {
|
|
1011
|
-
if (!base58Encoder2)
|
|
1012
|
-
base58Encoder2 = codecsStrings.getBase58Encoder();
|
|
1013
|
-
if (
|
|
1014
|
-
// Lowest value (64 bytes of zeroes)
|
|
1015
|
-
putativeTransactionSignature.length < 64 || // Highest value (64 bytes of 255)
|
|
1016
|
-
putativeTransactionSignature.length > 88
|
|
1017
|
-
) {
|
|
1018
|
-
return false;
|
|
1019
|
-
}
|
|
1020
|
-
const bytes = base58Encoder2.encode(putativeTransactionSignature);
|
|
1021
|
-
const numBytes = bytes.byteLength;
|
|
1022
|
-
if (numBytes !== 64) {
|
|
1023
|
-
return false;
|
|
1024
|
-
}
|
|
1025
|
-
return true;
|
|
1026
|
-
}
|
|
1027
890
|
function getSignatureFromTransaction(transaction) {
|
|
1028
891
|
if (!base58Decoder)
|
|
1029
892
|
base58Decoder = codecsStrings.getBase58Decoder();
|
|
@@ -1033,10 +896,10 @@ function getSignatureFromTransaction(transaction) {
|
|
|
1033
896
|
"Could not determine this transaction's signature. Make sure that the transaction has been signed by its fee payer."
|
|
1034
897
|
);
|
|
1035
898
|
}
|
|
1036
|
-
const
|
|
1037
|
-
return
|
|
899
|
+
const transactionSignature = base58Decoder.decode(signatureBytes);
|
|
900
|
+
return transactionSignature;
|
|
1038
901
|
}
|
|
1039
|
-
async function
|
|
902
|
+
async function partiallySignTransaction(keyPairs, transaction) {
|
|
1040
903
|
const compiledMessage = compileMessage(transaction);
|
|
1041
904
|
const nextSignatures = "signatures" in transaction ? { ...transaction.signatures } : {};
|
|
1042
905
|
const wireMessageBytes = getCompiledMessageEncoder().encode(compiledMessage);
|
|
@@ -1055,44 +918,52 @@ async function signTransaction(keyPairs, transaction) {
|
|
|
1055
918
|
Object.freeze(out);
|
|
1056
919
|
return out;
|
|
1057
920
|
}
|
|
1058
|
-
function
|
|
1059
|
-
|
|
1060
|
-
|
|
921
|
+
async function signTransaction(keyPairs, transaction) {
|
|
922
|
+
const out = await partiallySignTransaction(keyPairs, transaction);
|
|
923
|
+
assertTransactionIsFullySigned(out);
|
|
924
|
+
Object.freeze(out);
|
|
925
|
+
return out;
|
|
1061
926
|
}
|
|
1062
927
|
function assertTransactionIsFullySigned(transaction) {
|
|
1063
928
|
const signerAddressesFromInstructions = transaction.instructions.flatMap((i) => i.accounts?.filter((a) => isSignerRole(a.role)) ?? []).map((a) => a.address);
|
|
1064
929
|
const requiredSigners = /* @__PURE__ */ new Set([transaction.feePayer, ...signerAddressesFromInstructions]);
|
|
930
|
+
const missingSigs = [];
|
|
1065
931
|
requiredSigners.forEach((address) => {
|
|
1066
932
|
if (!transaction.signatures[address]) {
|
|
1067
|
-
|
|
933
|
+
missingSigs.push(address);
|
|
1068
934
|
}
|
|
1069
935
|
});
|
|
936
|
+
if (missingSigs.length > 0) {
|
|
937
|
+
throw new Error("Transaction is missing signatures for addresses: " + missingSigs.join(", "));
|
|
938
|
+
}
|
|
1070
939
|
}
|
|
1071
|
-
|
|
1072
|
-
// src/wire-transaction.ts
|
|
1073
940
|
function getBase64EncodedWireTransaction(transaction) {
|
|
1074
941
|
const wireTransactionBytes = getTransactionEncoder().encode(transaction);
|
|
1075
|
-
|
|
1076
|
-
return btoa(String.fromCharCode(...wireTransactionBytes));
|
|
1077
|
-
}
|
|
942
|
+
return codecsStrings.getBase64Decoder().decode(wireTransactionBytes);
|
|
1078
943
|
}
|
|
1079
944
|
|
|
1080
945
|
exports.appendTransactionInstruction = appendTransactionInstruction;
|
|
1081
|
-
exports.assertIsBlockhash = assertIsBlockhash;
|
|
1082
946
|
exports.assertIsDurableNonceTransaction = assertIsDurableNonceTransaction;
|
|
1083
|
-
exports.
|
|
947
|
+
exports.assertIsTransactionWithBlockhashLifetime = assertIsTransactionWithBlockhashLifetime;
|
|
1084
948
|
exports.assertTransactionIsFullySigned = assertTransactionIsFullySigned;
|
|
949
|
+
exports.compileMessage = compileMessage;
|
|
1085
950
|
exports.createTransaction = createTransaction;
|
|
951
|
+
exports.decompileTransaction = decompileTransaction;
|
|
1086
952
|
exports.getBase64EncodedWireTransaction = getBase64EncodedWireTransaction;
|
|
953
|
+
exports.getCompiledMessageCodec = getCompiledMessageCodec;
|
|
954
|
+
exports.getCompiledMessageDecoder = getCompiledMessageDecoder;
|
|
955
|
+
exports.getCompiledMessageEncoder = getCompiledMessageEncoder;
|
|
956
|
+
exports.getCompiledTransactionDecoder = getCompiledTransactionDecoder;
|
|
1087
957
|
exports.getSignatureFromTransaction = getSignatureFromTransaction;
|
|
1088
958
|
exports.getTransactionCodec = getTransactionCodec;
|
|
1089
959
|
exports.getTransactionDecoder = getTransactionDecoder;
|
|
1090
960
|
exports.getTransactionEncoder = getTransactionEncoder;
|
|
1091
961
|
exports.isAdvanceNonceAccountInstruction = isAdvanceNonceAccountInstruction;
|
|
1092
|
-
exports.
|
|
962
|
+
exports.partiallySignTransaction = partiallySignTransaction;
|
|
1093
963
|
exports.prependTransactionInstruction = prependTransactionInstruction;
|
|
1094
964
|
exports.setTransactionFeePayer = setTransactionFeePayer;
|
|
1095
965
|
exports.setTransactionLifetimeUsingBlockhash = setTransactionLifetimeUsingBlockhash;
|
|
1096
966
|
exports.setTransactionLifetimeUsingDurableNonce = setTransactionLifetimeUsingDurableNonce;
|
|
1097
967
|
exports.signTransaction = signTransaction;
|
|
1098
|
-
|
|
968
|
+
//# sourceMappingURL=out.js.map
|
|
969
|
+
//# sourceMappingURL=index.browser.cjs.map
|