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