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