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