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