@algorandfoundation/algokit-utils 7.0.0-beta.9 → 8.0.0-beta.1
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/LICENSE +21 -0
- package/README.md +21 -3
- package/account/account.d.ts +4 -1
- package/account/account.js +10 -7
- package/account/account.js.map +1 -1
- package/account/account.mjs +11 -8
- package/account/account.mjs.map +1 -1
- package/account/get-account-config-from-environment.js.map +1 -1
- package/account/get-account-config-from-environment.mjs.map +1 -1
- package/account/get-account.js.map +1 -1
- package/account/get-account.mjs.map +1 -1
- package/account/get-dispenser-account.d.ts +1 -1
- package/account/get-dispenser-account.js.map +1 -1
- package/account/get-dispenser-account.mjs.map +1 -1
- package/account/mnemonic-account.js.map +1 -1
- package/account/mnemonic-account.mjs.map +1 -1
- package/amount.d.ts +1 -0
- package/amount.js +3 -2
- package/amount.js.map +1 -1
- package/amount.mjs +3 -3
- package/amount.mjs.map +1 -1
- package/app-client.d.ts +4 -4
- package/app-client.js +4 -4
- package/app-client.js.map +1 -1
- package/app-client.mjs +4 -4
- package/app-client.mjs.map +1 -1
- package/app-deploy.js +25 -15
- package/app-deploy.js.map +1 -1
- package/app-deploy.mjs +27 -17
- package/app-deploy.mjs.map +1 -1
- package/app.d.ts +2 -2
- package/app.js +9 -6
- package/app.js.map +1 -1
- package/app.mjs +9 -6
- package/app.mjs.map +1 -1
- package/asset.js.map +1 -1
- package/asset.mjs.map +1 -1
- package/debugging/debugging.js.map +1 -1
- package/debugging/debugging.mjs.map +1 -1
- package/dispenser-client.js.map +1 -1
- package/dispenser-client.mjs.map +1 -1
- package/index.d.ts +1 -0
- package/index.js +7 -1
- package/index.js.map +1 -1
- package/index.mjs +3 -2
- package/index.mjs.map +1 -1
- package/indexer-lookup.d.ts +10 -8
- package/indexer-lookup.js +14 -10
- package/indexer-lookup.js.map +1 -1
- package/indexer-lookup.mjs +14 -10
- package/indexer-lookup.mjs.map +1 -1
- package/localnet/get-kmd-wallet-account.js.map +1 -1
- package/localnet/get-kmd-wallet-account.mjs.map +1 -1
- package/localnet/get-localnet-dispenser-account.js.map +1 -1
- package/localnet/get-localnet-dispenser-account.mjs.map +1 -1
- package/localnet/get-or-create-kmd-wallet-account.js.map +1 -1
- package/localnet/get-or-create-kmd-wallet-account.mjs.map +1 -1
- package/localnet/is-localnet.js.map +1 -1
- package/localnet/is-localnet.mjs.map +1 -1
- package/network-client.d.ts +1 -7
- package/network-client.js +2 -9
- package/network-client.js.map +1 -1
- package/network-client.mjs +2 -9
- package/network-client.mjs.map +1 -1
- package/package.json +5 -5
- package/testing/_asset.d.ts +2 -1
- package/testing/account.d.ts +4 -3
- package/testing/account.js +8 -2
- package/testing/account.js.map +1 -1
- package/testing/account.mjs +9 -3
- package/testing/account.mjs.map +1 -1
- package/testing/fixtures/algokit-log-capture-fixture.js.map +1 -1
- package/testing/fixtures/algokit-log-capture-fixture.mjs.map +1 -1
- package/testing/fixtures/algorand-fixture.js +5 -6
- package/testing/fixtures/algorand-fixture.js.map +1 -1
- package/testing/fixtures/algorand-fixture.mjs +5 -6
- package/testing/fixtures/algorand-fixture.mjs.map +1 -1
- package/testing/indexer.js.map +1 -1
- package/testing/indexer.mjs.map +1 -1
- package/testing/test-logger.js +7 -1
- package/testing/test-logger.js.map +1 -1
- package/testing/test-logger.mjs +7 -1
- package/testing/test-logger.mjs.map +1 -1
- package/testing/transaction-logger.js.map +1 -1
- package/testing/transaction-logger.mjs.map +1 -1
- package/transaction/legacy-bridge.js +2 -2
- package/transaction/legacy-bridge.js.map +1 -1
- package/transaction/legacy-bridge.mjs +3 -3
- package/transaction/legacy-bridge.mjs.map +1 -1
- package/transaction/perform-atomic-transaction-composer-simulate.d.ts +4 -1
- package/transaction/perform-atomic-transaction-composer-simulate.js +14 -9
- package/transaction/perform-atomic-transaction-composer-simulate.js.map +1 -1
- package/transaction/perform-atomic-transaction-composer-simulate.mjs +15 -10
- package/transaction/perform-atomic-transaction-composer-simulate.mjs.map +1 -1
- package/transaction/transaction.d.ts +13 -22
- package/transaction/transaction.js +164 -110
- package/transaction/transaction.js.map +1 -1
- package/transaction/transaction.mjs +163 -109
- package/transaction/transaction.mjs.map +1 -1
- package/transfer/transfer-algos.js.map +1 -1
- package/transfer/transfer-algos.mjs.map +1 -1
- package/transfer/transfer.js +3 -1
- package/transfer/transfer.js.map +1 -1
- package/transfer/transfer.mjs +3 -1
- package/transfer/transfer.mjs.map +1 -1
- package/types/account-manager.d.ts +20 -20
- package/types/account-manager.js +36 -27
- package/types/account-manager.js.map +1 -1
- package/types/account-manager.mjs +38 -29
- package/types/account-manager.mjs.map +1 -1
- package/types/account.d.ts +17 -8
- package/types/account.js +2 -2
- package/types/account.js.map +1 -1
- package/types/account.mjs +3 -3
- package/types/account.mjs.map +1 -1
- package/types/algo-http-client-with-retry.d.ts +1 -2
- package/types/algo-http-client-with-retry.js +33 -3
- package/types/algo-http-client-with-retry.js.map +1 -1
- package/types/algo-http-client-with-retry.mjs +32 -2
- package/types/algo-http-client-with-retry.mjs.map +1 -1
- package/types/algorand-client-interface.d.ts +2 -2
- package/types/algorand-client-transaction-creator.d.ts +16 -14
- package/types/algorand-client-transaction-creator.js +3 -1
- package/types/algorand-client-transaction-creator.js.map +1 -1
- package/types/algorand-client-transaction-creator.mjs +3 -1
- package/types/algorand-client-transaction-creator.mjs.map +1 -1
- package/types/algorand-client-transaction-sender.d.ts +109 -105
- package/types/algorand-client-transaction-sender.js +6 -2
- package/types/algorand-client-transaction-sender.js.map +1 -1
- package/types/algorand-client-transaction-sender.mjs +6 -2
- package/types/algorand-client-transaction-sender.mjs.map +1 -1
- package/types/algorand-client.d.ts +6 -7
- package/types/algorand-client.js +3 -6
- package/types/algorand-client.js.map +1 -1
- package/types/algorand-client.mjs +5 -5
- package/types/algorand-client.mjs.map +1 -1
- package/types/amount.js.map +1 -1
- package/types/amount.mjs.map +1 -1
- package/types/app-arc56.d.ts +31 -20
- package/types/app-arc56.js.map +1 -1
- package/types/app-arc56.mjs.map +1 -1
- package/types/app-client.d.ts +298 -286
- package/types/app-client.js +148 -41
- package/types/app-client.js.map +1 -1
- package/types/app-client.mjs +147 -40
- package/types/app-client.mjs.map +1 -1
- package/types/app-deployer.d.ts +4 -4
- package/types/app-deployer.js +23 -24
- package/types/app-deployer.js.map +1 -1
- package/types/app-deployer.mjs +25 -26
- package/types/app-deployer.mjs.map +1 -1
- package/types/app-factory.d.ts +130 -130
- package/types/app-factory.js +4 -5
- package/types/app-factory.js.map +1 -1
- package/types/app-factory.mjs +5 -6
- package/types/app-factory.mjs.map +1 -1
- package/types/app-manager.d.ts +5 -5
- package/types/app-manager.js +116 -38
- package/types/app-manager.js.map +1 -1
- package/types/app-manager.mjs +117 -39
- package/types/app-manager.mjs.map +1 -1
- package/types/app-spec.js +8 -2
- package/types/app-spec.js.map +1 -1
- package/types/app-spec.mjs +8 -2
- package/types/app-spec.mjs.map +1 -1
- package/types/app.d.ts +12 -11
- package/types/app.js.map +1 -1
- package/types/app.mjs.map +1 -1
- package/types/asset-manager.d.ts +9 -9
- package/types/asset-manager.js +10 -13
- package/types/asset-manager.js.map +1 -1
- package/types/asset-manager.mjs +10 -13
- package/types/asset-manager.mjs.map +1 -1
- package/types/async-event-emitter.d.ts +1 -10
- package/types/async-event-emitter.js +0 -5
- package/types/async-event-emitter.js.map +1 -1
- package/types/async-event-emitter.mjs +1 -6
- package/types/async-event-emitter.mjs.map +1 -1
- package/types/client-manager.d.ts +2 -9
- package/types/client-manager.js +11 -21
- package/types/client-manager.js.map +1 -1
- package/types/client-manager.mjs +11 -21
- package/types/client-manager.mjs.map +1 -1
- package/types/composer.d.ts +58 -46
- package/types/composer.js +154 -105
- package/types/composer.js.map +1 -1
- package/types/composer.mjs +156 -105
- package/types/composer.mjs.map +1 -1
- package/types/config.js.map +1 -1
- package/types/config.mjs.map +1 -1
- package/types/debugging.d.ts +1 -1
- package/types/debugging.js +1 -1
- package/types/debugging.js.map +1 -1
- package/types/debugging.mjs +1 -1
- package/types/debugging.mjs.map +1 -1
- package/types/dispenser-client.d.ts +2 -1
- package/types/dispenser-client.js +5 -1
- package/types/dispenser-client.js.map +1 -1
- package/types/dispenser-client.mjs +5 -1
- package/types/dispenser-client.mjs.map +1 -1
- package/types/indexer.d.ts +74 -755
- package/types/indexer.js.map +1 -1
- package/types/indexer.mjs.map +1 -1
- package/types/kmd-account-manager.d.ts +2 -2
- package/types/kmd-account-manager.js +1 -1
- package/types/kmd-account-manager.js.map +1 -1
- package/types/kmd-account-manager.mjs +2 -2
- package/types/kmd-account-manager.mjs.map +1 -1
- package/types/lifecycle-events.d.ts +10 -0
- package/types/lifecycle-events.js +8 -0
- package/types/lifecycle-events.js.map +1 -0
- package/types/lifecycle-events.mjs +8 -0
- package/types/lifecycle-events.mjs.map +1 -0
- package/types/logging.js.map +1 -1
- package/types/logging.mjs.map +1 -1
- package/types/logic-error.d.ts +2 -3
- package/types/logic-error.js +3 -3
- package/types/logic-error.js.map +1 -1
- package/types/logic-error.mjs +3 -3
- package/types/logic-error.mjs.map +1 -1
- package/types/network-client.d.ts +1 -1
- package/types/network-client.js.map +1 -1
- package/types/network-client.mjs.map +1 -1
- package/types/testing.d.ts +6 -7
- package/util.js.map +1 -1
- package/util.mjs.map +1 -1
- package/types/urlTokenBaseHTTPClient.d.ts +0 -40
- package/types/urlTokenBaseHTTPClient.js +0 -153
- package/types/urlTokenBaseHTTPClient.js.map +0 -1
- package/types/urlTokenBaseHTTPClient.mjs +0 -151
- package/types/urlTokenBaseHTTPClient.mjs.map +0 -1
package/types/composer.js
CHANGED
|
@@ -1,25 +1,24 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
-
|
|
5
3
|
var algosdk = require('algosdk');
|
|
6
4
|
var config = require('../config.js');
|
|
7
|
-
var performAtomicTransactionComposerSimulate = require('../transaction/perform-atomic-transaction-composer-simulate.js');
|
|
8
5
|
var transaction = require('../transaction/transaction.js');
|
|
9
6
|
var types_app = require('./app.js');
|
|
10
7
|
var types_appManager = require('./app-manager.js');
|
|
11
|
-
var
|
|
8
|
+
var types_lifecycleEvents = require('./lifecycle-events.js');
|
|
12
9
|
var types_networkClient = require('./network-client.js');
|
|
13
10
|
|
|
14
11
|
var AtomicTransactionComposer = algosdk.AtomicTransactionComposer;
|
|
15
12
|
var isTransactionWithSigner = algosdk.isTransactionWithSigner;
|
|
16
|
-
var encodeAddress = algosdk.encodeAddress;
|
|
17
13
|
var modelsv2 = algosdk.modelsv2;
|
|
14
|
+
const address = (address) => {
|
|
15
|
+
return typeof address === 'string' ? algosdk.Address.fromString(address) : address;
|
|
16
|
+
};
|
|
18
17
|
const MAX_TRANSACTION_GROUP_SIZE = 16;
|
|
19
|
-
/**
|
|
20
|
-
class
|
|
18
|
+
/** TransactionComposer helps you compose and execute transactions as a transaction group. */
|
|
19
|
+
class TransactionComposer {
|
|
21
20
|
/**
|
|
22
|
-
* Create
|
|
21
|
+
* Create a `TransactionComposer`.
|
|
23
22
|
* @param params The configuration for this composer
|
|
24
23
|
*/
|
|
25
24
|
constructor(params) {
|
|
@@ -30,7 +29,7 @@ class AlgoKitComposer {
|
|
|
30
29
|
/** Transactions that have not yet been composed */
|
|
31
30
|
this.txns = [];
|
|
32
31
|
/** The default transaction validity window */
|
|
33
|
-
this.defaultValidityWindow =
|
|
32
|
+
this.defaultValidityWindow = 10n;
|
|
34
33
|
/** Whether the validity window was explicitly set on construction */
|
|
35
34
|
this.defaultValidityWindowIsExplicit = false;
|
|
36
35
|
this.algod = params.algod;
|
|
@@ -50,7 +49,7 @@ class AlgoKitComposer {
|
|
|
50
49
|
addTransaction(transaction, signer) {
|
|
51
50
|
this.txns.push({
|
|
52
51
|
txn: transaction,
|
|
53
|
-
signer: signer ?? this.getSigner(
|
|
52
|
+
signer: signer ?? this.getSigner(transaction.sender),
|
|
54
53
|
type: 'txnWithSigner',
|
|
55
54
|
});
|
|
56
55
|
return this;
|
|
@@ -226,6 +225,15 @@ class AlgoKitComposer {
|
|
|
226
225
|
this.txns.push({ ...params, type: 'keyReg' });
|
|
227
226
|
return this;
|
|
228
227
|
}
|
|
228
|
+
/**
|
|
229
|
+
* Add an offline key registration transaction to the transaction group.
|
|
230
|
+
* @param params The offline key registration transaction parameters
|
|
231
|
+
* @returns The composer so you can chain method calls
|
|
232
|
+
*/
|
|
233
|
+
addOfflineKeyRegistration(params) {
|
|
234
|
+
this.txns.push({ ...params, type: 'keyReg' });
|
|
235
|
+
return this;
|
|
236
|
+
}
|
|
229
237
|
/**
|
|
230
238
|
* Add the transactions within an `AtomicTransactionComposer` to the transaction group.
|
|
231
239
|
* @param atc The `AtomicTransactionComposer` to build transactions from and add to the group
|
|
@@ -236,13 +244,11 @@ class AlgoKitComposer {
|
|
|
236
244
|
return this;
|
|
237
245
|
}
|
|
238
246
|
/** Build an ATC and return transactions ready to be incorporated into a broader set of transactions this composer is composing */
|
|
239
|
-
buildAtc(atc
|
|
247
|
+
buildAtc(atc) {
|
|
240
248
|
const group = atc.buildGroup();
|
|
241
249
|
const txnWithSigners = group.map((ts, idx) => {
|
|
242
|
-
// Remove underlying group ID from the transaction since it will be re-grouped when this
|
|
250
|
+
// Remove underlying group ID from the transaction since it will be re-grouped when this TransactionComposer is built
|
|
243
251
|
ts.txn.group = undefined;
|
|
244
|
-
// Process transaction if a function is provided
|
|
245
|
-
ts.txn = processTransaction?.(ts.txn, idx) ?? ts.txn;
|
|
246
252
|
// If this was a method call stash the ABIMethod for later
|
|
247
253
|
if (atc['methodCalls'].get(idx)) {
|
|
248
254
|
this.txnMethodMap.set(ts.txn.txID(), atc['methodCalls'].get(idx));
|
|
@@ -251,39 +257,42 @@ class AlgoKitComposer {
|
|
|
251
257
|
});
|
|
252
258
|
return txnWithSigners;
|
|
253
259
|
}
|
|
254
|
-
commonTxnBuildStep(
|
|
260
|
+
commonTxnBuildStep(buildTxn, params, txnParams) {
|
|
261
|
+
// We are going to mutate suggested params, let's create a clone first
|
|
262
|
+
txnParams.suggestedParams = { ...txnParams.suggestedParams };
|
|
255
263
|
if (params.lease)
|
|
256
|
-
|
|
264
|
+
txnParams.lease = transaction.encodeLease(params.lease);
|
|
257
265
|
if (params.rekeyTo)
|
|
258
|
-
|
|
266
|
+
txnParams.rekeyTo = address(params.rekeyTo);
|
|
259
267
|
const encoder = new TextEncoder();
|
|
260
268
|
if (params.note)
|
|
261
|
-
|
|
269
|
+
txnParams.note = (typeof params.note === 'string' ? encoder.encode(params.note) : params.note);
|
|
262
270
|
if (params.firstValidRound) {
|
|
263
|
-
|
|
271
|
+
txnParams.suggestedParams.firstValid = params.firstValidRound;
|
|
264
272
|
}
|
|
265
273
|
if (params.lastValidRound) {
|
|
266
|
-
|
|
274
|
+
txnParams.suggestedParams.lastValid = params.lastValidRound;
|
|
267
275
|
}
|
|
268
276
|
else {
|
|
269
277
|
// If the validity window isn't set in this transaction or by default and we are pointing at
|
|
270
278
|
// LocalNet set a bigger window to avoid dead transactions
|
|
271
|
-
const window = params.validityWindow
|
|
272
|
-
|
|
273
|
-
|
|
279
|
+
const window = params.validityWindow
|
|
280
|
+
? BigInt(params.validityWindow)
|
|
281
|
+
: !this.defaultValidityWindowIsExplicit && types_networkClient.genesisIdIsLocalNet(txnParams.suggestedParams.genesisID ?? 'unknown')
|
|
282
|
+
? 1000n
|
|
283
|
+
: this.defaultValidityWindow;
|
|
284
|
+
txnParams.suggestedParams.lastValid = BigInt(txnParams.suggestedParams.firstValid) + window;
|
|
274
285
|
}
|
|
275
286
|
if (params.staticFee !== undefined && params.extraFee !== undefined) {
|
|
276
287
|
throw Error('Cannot set both staticFee and extraFee');
|
|
277
288
|
}
|
|
278
289
|
if (params.staticFee !== undefined) {
|
|
279
|
-
|
|
290
|
+
txnParams.suggestedParams.fee = params.staticFee.microAlgo;
|
|
291
|
+
txnParams.suggestedParams.flatFee = true;
|
|
280
292
|
}
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
txn.fee += Number(params.extraFee.microAlgo);
|
|
285
|
-
}
|
|
286
|
-
txn.flatFee = true;
|
|
293
|
+
const txn = buildTxn(txnParams);
|
|
294
|
+
if (params.extraFee)
|
|
295
|
+
txn.fee += params.extraFee.microAlgo;
|
|
287
296
|
if (params.maxFee !== undefined && txn.fee > params.maxFee.microAlgo) {
|
|
288
297
|
throw Error(`Transaction fee ${txn.fee} µALGO is greater than maxFee ${params.maxFee}`);
|
|
289
298
|
}
|
|
@@ -296,14 +305,22 @@ class AlgoKitComposer {
|
|
|
296
305
|
*/
|
|
297
306
|
async buildMethodCall(params, suggestedParams, includeSigner) {
|
|
298
307
|
const methodArgs = [];
|
|
308
|
+
const transactionsForGroup = [];
|
|
299
309
|
const isAbiValue = (x) => {
|
|
300
310
|
if (Array.isArray(x))
|
|
301
311
|
return x.length == 0 || x.every(isAbiValue);
|
|
302
312
|
return typeof x === 'bigint' || typeof x === 'boolean' || typeof x === 'number' || typeof x === 'string' || x instanceof Uint8Array;
|
|
303
313
|
};
|
|
304
|
-
for (let i =
|
|
314
|
+
for (let i = (params.args ?? []).length - 1; i >= 0; i--) {
|
|
305
315
|
const arg = params.args[i];
|
|
306
316
|
if (arg === undefined) {
|
|
317
|
+
// An undefined transaction argument signals that the value will be supplied by a method call argument
|
|
318
|
+
if (algosdk.abiTypeIsTransaction(params.method.args[i].type) && transactionsForGroup.length > 0) {
|
|
319
|
+
// Move the last transaction from the group to the method call arguments to appease algosdk
|
|
320
|
+
const placeholderTransaction = transactionsForGroup.splice(-1, 1)[0];
|
|
321
|
+
methodArgs.push(placeholderTransaction);
|
|
322
|
+
continue;
|
|
323
|
+
}
|
|
307
324
|
throw Error(`No value provided for argument ${i + 1} within call to ${params.method.name}`);
|
|
308
325
|
}
|
|
309
326
|
if (isAbiValue(arg)) {
|
|
@@ -316,7 +333,10 @@ class AlgoKitComposer {
|
|
|
316
333
|
}
|
|
317
334
|
if ('method' in arg) {
|
|
318
335
|
const tempTxnWithSigners = await this.buildMethodCall(arg, suggestedParams, includeSigner);
|
|
319
|
-
|
|
336
|
+
// If there is any transaction args, add to the atc
|
|
337
|
+
// Everything else should be added as method args
|
|
338
|
+
methodArgs.push(...tempTxnWithSigners.slice(-1)); // Add the method call itself as a method arg
|
|
339
|
+
transactionsForGroup.push(...tempTxnWithSigners.slice(0, -1).reverse()); // Add any transaction arguments to the atc
|
|
320
340
|
continue;
|
|
321
341
|
}
|
|
322
342
|
const txn = await arg;
|
|
@@ -327,11 +347,12 @@ class AlgoKitComposer {
|
|
|
327
347
|
? 'signer' in params.signer
|
|
328
348
|
? params.signer.signer
|
|
329
349
|
: params.signer
|
|
330
|
-
: this.getSigner(
|
|
331
|
-
:
|
|
350
|
+
: this.getSigner(txn.sender)
|
|
351
|
+
: TransactionComposer.NULL_SIGNER,
|
|
332
352
|
});
|
|
333
353
|
}
|
|
334
354
|
const methodAtc = new algosdk.AtomicTransactionComposer();
|
|
355
|
+
transactionsForGroup.reverse().forEach((txn) => methodAtc.addTransaction(txn));
|
|
335
356
|
const appId = Number('appId' in params ? params.appId : 0n);
|
|
336
357
|
const approvalProgram = 'approvalProgram' in params
|
|
337
358
|
? typeof params.approvalProgram === 'string'
|
|
@@ -343,7 +364,7 @@ class AlgoKitComposer {
|
|
|
343
364
|
? (await this.appManager.compileTeal(params.clearStateProgram)).compiledBase64ToBytes
|
|
344
365
|
: params.clearStateProgram
|
|
345
366
|
: undefined;
|
|
346
|
-
|
|
367
|
+
const txnParams = {
|
|
347
368
|
appID: appId,
|
|
348
369
|
sender: params.sender,
|
|
349
370
|
suggestedParams,
|
|
@@ -361,10 +382,10 @@ class AlgoKitComposer {
|
|
|
361
382
|
? Math.floor((approvalProgram.length + (clearStateProgram?.length ?? 0)) / types_app.APP_PAGE_MAX_SIZE)
|
|
362
383
|
: 0
|
|
363
384
|
: undefined,
|
|
364
|
-
numLocalInts: appId === 0 ? ('schema' in params ? params.schema?.localInts ?? 0 : 0) : undefined,
|
|
365
|
-
numLocalByteSlices: appId === 0 ? ('schema' in params ? params.schema?.localByteSlices ?? 0 : 0) : undefined,
|
|
366
|
-
numGlobalInts: appId === 0 ? ('schema' in params ? params.schema?.globalInts ?? 0 : 0) : undefined,
|
|
367
|
-
numGlobalByteSlices: appId === 0 ? ('schema' in params ? params.schema?.globalByteSlices ?? 0 : 0) : undefined,
|
|
385
|
+
numLocalInts: appId === 0 ? ('schema' in params ? (params.schema?.localInts ?? 0) : 0) : undefined,
|
|
386
|
+
numLocalByteSlices: appId === 0 ? ('schema' in params ? (params.schema?.localByteSlices ?? 0) : 0) : undefined,
|
|
387
|
+
numGlobalInts: appId === 0 ? ('schema' in params ? (params.schema?.globalInts ?? 0) : 0) : undefined,
|
|
388
|
+
numGlobalByteSlices: appId === 0 ? ('schema' in params ? (params.schema?.globalByteSlices ?? 0) : 0) : undefined,
|
|
368
389
|
method: params.method,
|
|
369
390
|
signer: includeSigner
|
|
370
391
|
? params.signer
|
|
@@ -372,49 +393,51 @@ class AlgoKitComposer {
|
|
|
372
393
|
? params.signer.signer
|
|
373
394
|
: params.signer
|
|
374
395
|
: this.getSigner(params.sender)
|
|
375
|
-
:
|
|
376
|
-
methodArgs: methodArgs,
|
|
396
|
+
: TransactionComposer.NULL_SIGNER,
|
|
397
|
+
methodArgs: methodArgs.reverse(),
|
|
377
398
|
// note, lease, and rekeyTo are set in the common build step
|
|
378
399
|
note: undefined,
|
|
379
400
|
lease: undefined,
|
|
380
401
|
rekeyTo: undefined,
|
|
381
|
-
}
|
|
402
|
+
};
|
|
403
|
+
// Build the transaction
|
|
404
|
+
this.commonTxnBuildStep((txnParams) => {
|
|
405
|
+
methodAtc.addMethodCall(txnParams);
|
|
406
|
+
return methodAtc.buildGroup()[methodAtc.count() - 1].txn;
|
|
407
|
+
}, params, txnParams);
|
|
382
408
|
// Process the ATC to get a set of transactions ready for broader grouping
|
|
383
|
-
|
|
384
|
-
return this.buildAtc(methodAtc, (txn, idx) => idx === methodAtc.count() - 1 ? this.commonTxnBuildStep(params, txn, suggestedParams) : txn);
|
|
409
|
+
return this.buildAtc(methodAtc);
|
|
385
410
|
}
|
|
386
411
|
buildPayment(params, suggestedParams) {
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
412
|
+
return this.commonTxnBuildStep(algosdk.makePaymentTxnWithSuggestedParamsFromObject, params, {
|
|
413
|
+
sender: params.sender,
|
|
414
|
+
receiver: params.receiver,
|
|
390
415
|
amount: params.amount.microAlgo,
|
|
391
416
|
closeRemainderTo: params.closeRemainderTo,
|
|
392
417
|
suggestedParams,
|
|
393
418
|
});
|
|
394
|
-
return this.commonTxnBuildStep(params, txn, suggestedParams);
|
|
395
419
|
}
|
|
396
420
|
buildAssetCreate(params, suggestedParams) {
|
|
397
|
-
|
|
398
|
-
|
|
421
|
+
return this.commonTxnBuildStep(algosdk.makeAssetCreateTxnWithSuggestedParamsFromObject, params, {
|
|
422
|
+
sender: params.sender,
|
|
399
423
|
total: params.total,
|
|
400
424
|
decimals: params.decimals ?? 0,
|
|
401
425
|
assetName: params.assetName,
|
|
402
426
|
unitName: params.unitName,
|
|
403
427
|
assetURL: params.url,
|
|
404
428
|
defaultFrozen: params.defaultFrozen ?? false,
|
|
405
|
-
assetMetadataHash: params.metadataHash,
|
|
429
|
+
assetMetadataHash: typeof params.metadataHash === 'string' ? Buffer.from(params.metadataHash, 'utf-8') : params.metadataHash,
|
|
406
430
|
manager: params.manager,
|
|
407
431
|
reserve: params.reserve,
|
|
408
432
|
freeze: params.freeze,
|
|
409
433
|
clawback: params.clawback,
|
|
410
434
|
suggestedParams,
|
|
411
435
|
});
|
|
412
|
-
return this.commonTxnBuildStep(params, txn, suggestedParams);
|
|
413
436
|
}
|
|
414
437
|
buildAssetConfig(params, suggestedParams) {
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
assetIndex:
|
|
438
|
+
return this.commonTxnBuildStep(algosdk.makeAssetConfigTxnWithSuggestedParamsFromObject, params, {
|
|
439
|
+
sender: params.sender,
|
|
440
|
+
assetIndex: params.assetId,
|
|
418
441
|
suggestedParams,
|
|
419
442
|
manager: params.manager,
|
|
420
443
|
reserve: params.reserve,
|
|
@@ -422,40 +445,36 @@ class AlgoKitComposer {
|
|
|
422
445
|
clawback: params.clawback,
|
|
423
446
|
strictEmptyAddressChecking: false,
|
|
424
447
|
});
|
|
425
|
-
return this.commonTxnBuildStep(params, txn, suggestedParams);
|
|
426
448
|
}
|
|
427
449
|
buildAssetDestroy(params, suggestedParams) {
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
assetIndex:
|
|
450
|
+
return this.commonTxnBuildStep(algosdk.makeAssetDestroyTxnWithSuggestedParamsFromObject, params, {
|
|
451
|
+
sender: params.sender,
|
|
452
|
+
assetIndex: params.assetId,
|
|
431
453
|
suggestedParams,
|
|
432
454
|
});
|
|
433
|
-
return this.commonTxnBuildStep(params, txn, suggestedParams);
|
|
434
455
|
}
|
|
435
456
|
buildAssetFreeze(params, suggestedParams) {
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
assetIndex:
|
|
457
|
+
return this.commonTxnBuildStep(algosdk.makeAssetFreezeTxnWithSuggestedParamsFromObject, params, {
|
|
458
|
+
sender: params.sender,
|
|
459
|
+
assetIndex: params.assetId,
|
|
439
460
|
freezeTarget: params.account,
|
|
440
|
-
|
|
461
|
+
frozen: params.frozen,
|
|
441
462
|
suggestedParams,
|
|
442
463
|
});
|
|
443
|
-
return this.commonTxnBuildStep(params, txn, suggestedParams);
|
|
444
464
|
}
|
|
445
465
|
buildAssetTransfer(params, suggestedParams) {
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
assetIndex:
|
|
466
|
+
return this.commonTxnBuildStep(algosdk.makeAssetTransferTxnWithSuggestedParamsFromObject, params, {
|
|
467
|
+
sender: params.sender,
|
|
468
|
+
receiver: params.receiver,
|
|
469
|
+
assetIndex: params.assetId,
|
|
450
470
|
amount: params.amount,
|
|
451
471
|
suggestedParams,
|
|
452
472
|
closeRemainderTo: params.closeAssetTo,
|
|
453
|
-
|
|
473
|
+
assetSender: params.clawbackTarget,
|
|
454
474
|
});
|
|
455
|
-
return this.commonTxnBuildStep(params, txn, suggestedParams);
|
|
456
475
|
}
|
|
457
476
|
async buildAppCall(params, suggestedParams) {
|
|
458
|
-
const appId =
|
|
477
|
+
const appId = 'appId' in params ? params.appId : 0n;
|
|
459
478
|
const approvalProgram = 'approvalProgram' in params
|
|
460
479
|
? typeof params.approvalProgram === 'string'
|
|
461
480
|
? (await this.appManager.compileTeal(params.approvalProgram)).compiledBase64ToBytes
|
|
@@ -467,7 +486,7 @@ class AlgoKitComposer {
|
|
|
467
486
|
: params.clearStateProgram
|
|
468
487
|
: undefined;
|
|
469
488
|
const sdkParams = {
|
|
470
|
-
|
|
489
|
+
sender: params.sender,
|
|
471
490
|
suggestedParams,
|
|
472
491
|
appArgs: params.args,
|
|
473
492
|
onComplete: params.onComplete ?? algosdk.OnApplicationComplete.NoOpOC,
|
|
@@ -478,32 +497,46 @@ class AlgoKitComposer {
|
|
|
478
497
|
approvalProgram,
|
|
479
498
|
clearProgram: clearStateProgram,
|
|
480
499
|
};
|
|
481
|
-
|
|
482
|
-
if (appId === 0) {
|
|
500
|
+
if (appId === 0n) {
|
|
483
501
|
if (sdkParams.approvalProgram === undefined || sdkParams.clearProgram === undefined) {
|
|
484
502
|
throw new Error('approvalProgram and clearStateProgram are required for application creation');
|
|
485
503
|
}
|
|
486
|
-
|
|
504
|
+
return this.commonTxnBuildStep(algosdk.makeApplicationCreateTxnFromObject, params, {
|
|
487
505
|
...sdkParams,
|
|
488
506
|
extraPages: 'extraProgramPages' in params
|
|
489
|
-
? params.extraProgramPages ?? Math.floor((approvalProgram.length + clearStateProgram.length) / types_app.APP_PAGE_MAX_SIZE)
|
|
507
|
+
? (params.extraProgramPages ?? Math.floor((approvalProgram.length + clearStateProgram.length) / types_app.APP_PAGE_MAX_SIZE))
|
|
490
508
|
: 0,
|
|
491
|
-
numLocalInts: 'schema' in params ? params.schema?.localInts ?? 0 : 0,
|
|
492
|
-
numLocalByteSlices: 'schema' in params ? params.schema?.localByteSlices ?? 0 : 0,
|
|
493
|
-
numGlobalInts: 'schema' in params ? params.schema?.globalInts ?? 0 : 0,
|
|
494
|
-
numGlobalByteSlices: 'schema' in params ? params.schema?.globalByteSlices ?? 0 : 0,
|
|
509
|
+
numLocalInts: 'schema' in params ? (params.schema?.localInts ?? 0) : 0,
|
|
510
|
+
numLocalByteSlices: 'schema' in params ? (params.schema?.localByteSlices ?? 0) : 0,
|
|
511
|
+
numGlobalInts: 'schema' in params ? (params.schema?.globalInts ?? 0) : 0,
|
|
512
|
+
numGlobalByteSlices: 'schema' in params ? (params.schema?.globalByteSlices ?? 0) : 0,
|
|
495
513
|
approvalProgram: approvalProgram,
|
|
496
514
|
clearProgram: clearStateProgram,
|
|
497
515
|
});
|
|
498
516
|
}
|
|
499
517
|
else {
|
|
500
|
-
|
|
518
|
+
return this.commonTxnBuildStep(algosdk.makeApplicationCallTxnFromObject, params, { ...sdkParams, appIndex: appId });
|
|
501
519
|
}
|
|
502
|
-
return this.commonTxnBuildStep(params, txn, suggestedParams);
|
|
503
520
|
}
|
|
504
521
|
buildKeyReg(params, suggestedParams) {
|
|
505
|
-
|
|
506
|
-
|
|
522
|
+
if ('voteKey' in params) {
|
|
523
|
+
return this.commonTxnBuildStep(algosdk.makeKeyRegistrationTxnWithSuggestedParamsFromObject, params, {
|
|
524
|
+
sender: params.sender,
|
|
525
|
+
voteKey: params.voteKey,
|
|
526
|
+
selectionKey: params.selectionKey,
|
|
527
|
+
voteFirst: params.voteFirst,
|
|
528
|
+
voteLast: params.voteLast,
|
|
529
|
+
voteKeyDilution: params.voteKeyDilution,
|
|
530
|
+
suggestedParams,
|
|
531
|
+
nonParticipation: false,
|
|
532
|
+
stateProofKey: params.stateProofKey,
|
|
533
|
+
});
|
|
534
|
+
}
|
|
535
|
+
return this.commonTxnBuildStep(algosdk.makeKeyRegistrationTxnWithSuggestedParamsFromObject, params, {
|
|
536
|
+
sender: params.sender,
|
|
537
|
+
suggestedParams,
|
|
538
|
+
nonParticipation: params.preventAccountFromEverParticipatingAgain,
|
|
539
|
+
});
|
|
507
540
|
}
|
|
508
541
|
/** Builds all transaction types apart from `txnWithSigner`, `atc` and `methodCall` since those ones can have custom signers that need to be retrieved. */
|
|
509
542
|
async buildTxn(txn, suggestedParams) {
|
|
@@ -569,7 +602,7 @@ class AlgoKitComposer {
|
|
|
569
602
|
: [];
|
|
570
603
|
transactions.push(...transactionsWithSigner.map((ts) => ts.txn));
|
|
571
604
|
transactionsWithSigner.forEach((ts, idx) => {
|
|
572
|
-
if (ts.signer && ts.signer !==
|
|
605
|
+
if (ts.signer && ts.signer !== TransactionComposer.NULL_SIGNER) {
|
|
573
606
|
signers.set(idx, ts.signer);
|
|
574
607
|
}
|
|
575
608
|
});
|
|
@@ -636,9 +669,9 @@ class AlgoKitComposer {
|
|
|
636
669
|
const group = (await this.build()).transactions;
|
|
637
670
|
let waitRounds = params?.maxRoundsToWaitForConfirmation;
|
|
638
671
|
if (waitRounds === undefined) {
|
|
639
|
-
const lastRound = group.reduce((max, txn) =>
|
|
640
|
-
const { firstRound } = await this.getSuggestedParams();
|
|
641
|
-
waitRounds = lastRound - firstRound + 1;
|
|
672
|
+
const lastRound = group.reduce((max, txn) => (txn.txn.lastValid > max ? txn.txn.lastValid : BigInt(max)), 0n);
|
|
673
|
+
const { firstValid: firstRound } = await this.getSuggestedParams();
|
|
674
|
+
waitRounds = Number(BigInt(lastRound) - BigInt(firstRound)) + 1;
|
|
642
675
|
}
|
|
643
676
|
return await transaction.sendAtomicTransactionComposer({
|
|
644
677
|
atc: this.atc,
|
|
@@ -668,10 +701,11 @@ class AlgoKitComposer {
|
|
|
668
701
|
// Build the transactions
|
|
669
702
|
if (options?.skipSignatures) {
|
|
670
703
|
options.allowEmptySignatures = true;
|
|
704
|
+
options.fixSigners = true;
|
|
671
705
|
// Build transactions uses empty signers
|
|
672
706
|
const transactions = await this.buildTransactions();
|
|
673
707
|
for (const txn of transactions.transactions) {
|
|
674
|
-
atc.addTransaction({ txn, signer:
|
|
708
|
+
atc.addTransaction({ txn, signer: TransactionComposer.NULL_SIGNER });
|
|
675
709
|
}
|
|
676
710
|
atc['methodCalls'] = transactions.methodCalls;
|
|
677
711
|
}
|
|
@@ -679,21 +713,36 @@ class AlgoKitComposer {
|
|
|
679
713
|
// Build creates real signatures
|
|
680
714
|
await this.build();
|
|
681
715
|
}
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
716
|
+
const { methodResults, simulateResponse } = await atc.simulate(this.algod, new modelsv2.SimulateRequest({
|
|
717
|
+
txnGroups: [],
|
|
718
|
+
...options,
|
|
719
|
+
...(config.Config.debug
|
|
720
|
+
? {
|
|
721
|
+
allowEmptySignatures: true,
|
|
722
|
+
fixSigners: true,
|
|
723
|
+
allowMoreLogging: true,
|
|
724
|
+
execTraceConfig: new modelsv2.SimulateTraceConfig({
|
|
725
|
+
enable: true,
|
|
726
|
+
scratchChange: true,
|
|
727
|
+
stackChange: true,
|
|
728
|
+
stateChange: true,
|
|
729
|
+
}),
|
|
730
|
+
}
|
|
731
|
+
: undefined),
|
|
732
|
+
}));
|
|
733
|
+
const failedGroup = simulateResponse?.txnGroups[0];
|
|
734
|
+
if (failedGroup?.failureMessage) {
|
|
735
|
+
const errorMessage = `Transaction failed at transaction(s) ${failedGroup.failedAt?.join(', ') || 'unknown'} in the group. ${failedGroup.failureMessage}`;
|
|
736
|
+
const error = new Error(errorMessage);
|
|
737
|
+
if (config.Config.debug) {
|
|
738
|
+
await config.Config.events.emitAsync(types_lifecycleEvents.EventType.TxnGroupSimulated, { simulateResponse });
|
|
739
|
+
}
|
|
694
740
|
error.simulateResponse = simulateResponse;
|
|
695
741
|
throw error;
|
|
696
742
|
}
|
|
743
|
+
if (config.Config.debug && config.Config.traceAll) {
|
|
744
|
+
await config.Config.events.emitAsync(types_lifecycleEvents.EventType.TxnGroupSimulated, { simulateResponse });
|
|
745
|
+
}
|
|
697
746
|
const transactions = atc.buildGroup().map((t) => t.txn);
|
|
698
747
|
return {
|
|
699
748
|
confirmations: simulateResponse.txnGroups[0].txnResults.map((t) => t.txnResult),
|
|
@@ -701,7 +750,7 @@ class AlgoKitComposer {
|
|
|
701
750
|
txIds: transactions.map((t) => t.txID()),
|
|
702
751
|
groupId: Buffer.from(transactions[0].group ?? new Uint8Array()).toString('base64'),
|
|
703
752
|
simulateResponse,
|
|
704
|
-
returns: methodResults.map(
|
|
753
|
+
returns: methodResults.map(transaction.getABIReturnValue),
|
|
705
754
|
};
|
|
706
755
|
}
|
|
707
756
|
/**
|
|
@@ -718,8 +767,8 @@ class AlgoKitComposer {
|
|
|
718
767
|
}
|
|
719
768
|
}
|
|
720
769
|
/** Signer used to represent a lack of signer */
|
|
721
|
-
|
|
770
|
+
TransactionComposer.NULL_SIGNER = algosdk.makeEmptyTransactionSigner();
|
|
722
771
|
|
|
723
772
|
exports.MAX_TRANSACTION_GROUP_SIZE = MAX_TRANSACTION_GROUP_SIZE;
|
|
724
|
-
exports.
|
|
773
|
+
exports.TransactionComposer = TransactionComposer;
|
|
725
774
|
//# sourceMappingURL=composer.js.map
|