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