@algorandfoundation/algokit-utils 6.3.0-beta.1 → 7.0.0-alpha.2
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 +22 -26
- package/account/account.d.ts +12 -10
- package/account/account.js +17 -14
- package/account/account.js.map +1 -1
- package/account/account.mjs +18 -15
- package/account/account.mjs.map +1 -1
- package/account/get-account-config-from-environment.d.ts +0 -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.d.ts +2 -3
- package/account/get-account.js +1 -1
- package/account/get-account.js.map +1 -1
- package/account/get-account.mjs +1 -1
- package/account/get-account.mjs.map +1 -1
- package/account/get-dispenser-account.d.ts +2 -3
- package/account/get-dispenser-account.js +1 -1
- package/account/get-dispenser-account.js.map +1 -1
- package/account/get-dispenser-account.mjs +1 -1
- package/account/get-dispenser-account.mjs.map +1 -1
- package/account/index.d.ts +0 -1
- package/account/mnemonic-account.d.ts +1 -2
- package/account/mnemonic-account.js +1 -1
- package/account/mnemonic-account.js.map +1 -1
- package/account/mnemonic-account.mjs +1 -1
- package/account/mnemonic-account.mjs.map +1 -1
- package/amount.d.ts +15 -5
- package/amount.js +9 -2
- package/amount.js.map +1 -1
- package/amount.mjs +9 -3
- package/amount.mjs.map +1 -1
- package/app-client.d.ts +19 -5
- package/app-client.js +19 -4
- package/app-client.js.map +1 -1
- package/app-client.mjs +19 -4
- package/app-client.mjs.map +1 -1
- package/app-deploy.d.ts +18 -2
- package/app-deploy.js +159 -342
- package/app-deploy.js.map +1 -1
- package/app-deploy.mjs +163 -346
- package/app-deploy.mjs.map +1 -1
- package/app.d.ts +39 -3
- package/app.js +121 -371
- package/app.js.map +1 -1
- package/app.mjs +122 -372
- package/app.mjs.map +1 -1
- package/asset.d.ts +5 -6
- package/asset.js +5 -8
- package/asset.js.map +1 -1
- package/asset.mjs +5 -8
- package/asset.mjs.map +1 -1
- package/config.d.ts +0 -1
- package/config.js.map +1 -1
- package/config.mjs.map +1 -1
- package/debugging/debugging.d.ts +3 -5
- package/debugging/debugging.js +4 -128
- package/debugging/debugging.js.map +1 -1
- package/debugging/debugging.mjs +4 -109
- package/debugging/debugging.mjs.map +1 -1
- package/debugging/index.d.ts +0 -2
- package/dispenser-client.d.ts +0 -1
- package/dispenser-client.js.map +1 -1
- package/dispenser-client.mjs.map +1 -1
- package/index.d.ts +5 -4
- package/index.js +36 -26
- package/index.js.map +1 -1
- package/index.mjs +6 -5
- package/index.mjs.map +1 -1
- package/indexer-lookup.d.ts +10 -9
- 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.d.ts +1 -2
- package/localnet/get-kmd-wallet-account.js +1 -1
- package/localnet/get-kmd-wallet-account.js.map +1 -1
- package/localnet/get-kmd-wallet-account.mjs +1 -1
- package/localnet/get-kmd-wallet-account.mjs.map +1 -1
- package/localnet/get-localnet-dispenser-account.d.ts +1 -2
- package/localnet/get-localnet-dispenser-account.js +1 -1
- package/localnet/get-localnet-dispenser-account.js.map +1 -1
- package/localnet/get-localnet-dispenser-account.mjs +1 -1
- package/localnet/get-localnet-dispenser-account.mjs.map +1 -1
- package/localnet/get-or-create-kmd-wallet-account.d.ts +1 -2
- package/localnet/get-or-create-kmd-wallet-account.js +1 -1
- package/localnet/get-or-create-kmd-wallet-account.js.map +1 -1
- package/localnet/get-or-create-kmd-wallet-account.mjs +1 -1
- package/localnet/get-or-create-kmd-wallet-account.mjs.map +1 -1
- package/localnet/index.d.ts +0 -1
- package/localnet/is-localnet.d.ts +1 -2
- package/localnet/is-localnet.js +1 -1
- package/localnet/is-localnet.js.map +1 -1
- package/localnet/is-localnet.mjs +1 -1
- package/localnet/is-localnet.mjs.map +1 -1
- package/network-client.d.ts +3 -10
- package/network-client.js +4 -11
- package/network-client.js.map +1 -1
- package/network-client.mjs +4 -11
- package/network-client.mjs.map +1 -1
- package/package.json +3 -4
- package/testing/_asset.d.ts +2 -2
- package/testing/account.d.ts +4 -4
- 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.d.ts +0 -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.d.ts +0 -1
- package/testing/fixtures/algorand-fixture.js +13 -14
- package/testing/fixtures/algorand-fixture.js.map +1 -1
- package/testing/fixtures/algorand-fixture.mjs +13 -14
- package/testing/fixtures/algorand-fixture.mjs.map +1 -1
- package/testing/fixtures/index.d.ts +0 -1
- package/testing/index.d.ts +0 -1
- package/testing/indexer.d.ts +0 -1
- package/testing/indexer.js.map +1 -1
- package/testing/indexer.mjs.map +1 -1
- package/testing/test-logger.d.ts +0 -1
- package/testing/test-logger.js +7 -3
- package/testing/test-logger.js.map +1 -1
- package/testing/test-logger.mjs +7 -3
- package/testing/test-logger.mjs.map +1 -1
- package/testing/transaction-logger.d.ts +0 -1
- package/testing/transaction-logger.js.map +1 -1
- package/testing/transaction-logger.mjs.map +1 -1
- package/transaction/index.d.ts +0 -1
- package/transaction/legacy-bridge.d.ts +31 -6
- package/transaction/legacy-bridge.js +101 -7
- package/transaction/legacy-bridge.js.map +1 -1
- package/transaction/legacy-bridge.mjs +101 -10
- package/transaction/legacy-bridge.mjs.map +1 -1
- package/transaction/perform-atomic-transaction-composer-simulate.d.ts +4 -2
- 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 +38 -19
- package/transaction/transaction.js +217 -137
- package/transaction/transaction.js.map +1 -1
- package/transaction/transaction.mjs +218 -138
- package/transaction/transaction.mjs.map +1 -1
- package/transfer/index.d.ts +0 -1
- package/transfer/transfer-algos.d.ts +1 -2
- package/transfer/transfer-algos.js +1 -1
- package/transfer/transfer-algos.js.map +1 -1
- package/transfer/transfer-algos.mjs +1 -1
- package/transfer/transfer-algos.mjs.map +1 -1
- package/transfer/transfer.d.ts +1 -2
- package/transfer/transfer.js +6 -4
- package/transfer/transfer.js.map +1 -1
- package/transfer/transfer.mjs +6 -4
- package/transfer/transfer.mjs.map +1 -1
- package/types/account-manager.d.ts +33 -25
- package/types/account-manager.js +54 -31
- package/types/account-manager.js.map +1 -1
- package/types/account-manager.mjs +56 -33
- package/types/account-manager.mjs.map +1 -1
- package/types/account.d.ts +17 -9
- 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 -3
- 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 +28 -0
- package/types/algorand-client-interface.js +3 -0
- package/types/algorand-client-interface.js.map +1 -0
- package/types/algorand-client-interface.mjs +2 -0
- package/types/algorand-client-interface.mjs.map +1 -0
- package/types/algorand-client-transaction-creator.d.ts +452 -23
- package/types/algorand-client-transaction-creator.js +407 -23
- package/types/algorand-client-transaction-creator.js.map +1 -1
- package/types/algorand-client-transaction-creator.mjs +407 -23
- package/types/algorand-client-transaction-creator.mjs.map +1 -1
- package/types/algorand-client-transaction-sender.d.ts +772 -47
- package/types/algorand-client-transaction-sender.js +445 -15
- package/types/algorand-client-transaction-sender.js.map +1 -1
- package/types/algorand-client-transaction-sender.mjs +445 -15
- package/types/algorand-client-transaction-sender.mjs.map +1 -1
- package/types/algorand-client.d.ts +24 -17
- package/types/algorand-client.js +26 -16
- package/types/algorand-client.js.map +1 -1
- package/types/algorand-client.mjs +28 -15
- package/types/algorand-client.mjs.map +1 -1
- package/types/amount.d.ts +10 -11
- package/types/amount.js +7 -7
- package/types/amount.js.map +1 -1
- package/types/amount.mjs +7 -7
- package/types/amount.mjs.map +1 -1
- package/types/app-arc56.d.ts +359 -0
- package/types/app-arc56.js +184 -0
- package/types/app-arc56.js.map +1 -0
- package/types/app-arc56.mjs +175 -0
- package/types/app-arc56.mjs.map +1 -0
- package/types/app-client.d.ts +1508 -12
- package/types/app-client.js +1018 -29
- package/types/app-client.js.map +1 -1
- package/types/app-client.mjs +1020 -32
- package/types/app-client.mjs.map +1 -1
- package/types/app-deployer.d.ts +126 -0
- package/types/app-deployer.js +353 -0
- package/types/app-deployer.js.map +1 -0
- package/types/app-deployer.mjs +351 -0
- package/types/app-deployer.mjs.map +1 -0
- package/types/app-factory.d.ts +846 -0
- package/types/app-factory.js +410 -0
- package/types/app-factory.js.map +1 -0
- package/types/app-factory.mjs +408 -0
- package/types/app-factory.mjs.map +1 -0
- package/types/app-manager.d.ts +244 -0
- package/types/app-manager.js +423 -0
- package/types/app-manager.js.map +1 -0
- package/types/app-manager.mjs +421 -0
- package/types/app-manager.mjs.map +1 -0
- package/types/app-spec.d.ts +2 -1
- package/types/app-spec.js +127 -0
- package/types/app-spec.js.map +1 -1
- package/types/app-spec.mjs +126 -0
- package/types/app-spec.mjs.map +1 -1
- package/types/app.d.ts +57 -18
- package/types/app.js +1 -1
- package/types/app.js.map +1 -1
- package/types/app.mjs +1 -1
- package/types/app.mjs.map +1 -1
- package/types/asset-manager.d.ts +10 -10
- package/types/asset-manager.js +13 -17
- package/types/asset-manager.js.map +1 -1
- package/types/asset-manager.mjs +13 -17
- package/types/asset-manager.mjs.map +1 -1
- package/types/asset.d.ts +0 -1
- package/types/async-event-emitter.d.ts +14 -0
- package/types/async-event-emitter.js +50 -0
- package/types/async-event-emitter.js.map +1 -0
- package/types/async-event-emitter.mjs +48 -0
- package/types/async-event-emitter.mjs.map +1 -0
- package/types/client-manager.d.ts +135 -60
- package/types/client-manager.js +158 -44
- package/types/client-manager.js.map +1 -1
- package/types/client-manager.mjs +159 -45
- package/types/client-manager.mjs.map +1 -1
- package/types/composer.d.ts +271 -87
- package/types/composer.js +405 -125
- package/types/composer.js.map +1 -1
- package/types/composer.mjs +407 -125
- package/types/composer.mjs.map +1 -1
- package/types/config.d.ts +3 -6
- package/types/config.js +5 -44
- package/types/config.js.map +1 -1
- package/types/config.mjs +5 -27
- package/types/config.mjs.map +1 -1
- package/types/debugging.d.ts +29 -101
- package/types/debugging.js +16 -109
- package/types/debugging.js.map +1 -1
- package/types/debugging.mjs +12 -107
- package/types/debugging.mjs.map +1 -1
- package/types/dispenser-client.d.ts +2 -2
- package/types/dispenser-client.js +10 -5
- package/types/dispenser-client.js.map +1 -1
- package/types/dispenser-client.mjs +10 -5
- package/types/dispenser-client.mjs.map +1 -1
- package/types/expand.d.ts +7 -0
- package/types/expand.js +3 -0
- package/types/expand.js.map +1 -0
- package/types/expand.mjs +2 -0
- package/types/expand.mjs.map +1 -0
- package/types/indexer.d.ts +74 -756
- package/types/indexer.js.map +1 -1
- package/types/indexer.mjs.map +1 -1
- package/types/kmd-account-manager.d.ts +2 -3
- package/types/kmd-account-manager.js +3 -3
- package/types/kmd-account-manager.js.map +1 -1
- package/types/kmd-account-manager.mjs +4 -4
- 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.d.ts +0 -1
- package/types/logging.js.map +1 -1
- package/types/logging.mjs.map +1 -1
- package/types/logic-error.d.ts +2 -4
- 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 +14 -2
- package/types/network-client.js.map +1 -1
- package/types/network-client.mjs.map +1 -1
- package/types/testing.d.ts +8 -10
- package/types/transaction.d.ts +17 -4
- package/types/transfer.d.ts +0 -1
- package/util.d.ts +2 -2
- package/util.js +11 -10
- package/util.js.map +1 -1
- package/util.mjs +11 -10
- package/util.mjs.map +1 -1
- package/account/account.d.ts.map +0 -1
- package/account/get-account-config-from-environment.d.ts.map +0 -1
- package/account/get-account.d.ts.map +0 -1
- package/account/get-dispenser-account.d.ts.map +0 -1
- package/account/index.d.ts.map +0 -1
- package/account/mnemonic-account.d.ts.map +0 -1
- package/amount.d.ts.map +0 -1
- package/app-client.d.ts.map +0 -1
- package/app-deploy.d.ts.map +0 -1
- package/app.d.ts.map +0 -1
- package/asset.d.ts.map +0 -1
- package/config.d.ts.map +0 -1
- package/debugging/debugging.d.ts.map +0 -1
- package/debugging/index.d.ts.map +0 -1
- package/debugging/simulate-and-persist-response.d.ts +0 -20
- package/debugging/simulate-and-persist-response.d.ts.map +0 -1
- package/debugging/simulate-and-persist-response.js +0 -108
- package/debugging/simulate-and-persist-response.js.map +0 -1
- package/debugging/simulate-and-persist-response.mjs +0 -89
- package/debugging/simulate-and-persist-response.mjs.map +0 -1
- package/dispenser-client.d.ts.map +0 -1
- package/index.d.ts.map +0 -1
- package/indexer-lookup.d.ts.map +0 -1
- package/localnet/get-kmd-wallet-account.d.ts.map +0 -1
- package/localnet/get-localnet-dispenser-account.d.ts.map +0 -1
- package/localnet/get-or-create-kmd-wallet-account.d.ts.map +0 -1
- package/localnet/index.d.ts.map +0 -1
- package/localnet/is-localnet.d.ts.map +0 -1
- package/network-client.d.ts.map +0 -1
- package/testing/_asset.d.ts.map +0 -1
- package/testing/account.d.ts.map +0 -1
- package/testing/fixtures/algokit-log-capture-fixture.d.ts.map +0 -1
- package/testing/fixtures/algorand-fixture.d.ts.map +0 -1
- package/testing/fixtures/index.d.ts.map +0 -1
- package/testing/index.d.ts.map +0 -1
- package/testing/indexer.d.ts.map +0 -1
- package/testing/test-logger.d.ts.map +0 -1
- package/testing/transaction-logger.d.ts.map +0 -1
- package/transaction/index.d.ts.map +0 -1
- package/transaction/legacy-bridge.d.ts.map +0 -1
- package/transaction/perform-atomic-transaction-composer-simulate.d.ts.map +0 -1
- package/transaction/transaction.d.ts.map +0 -1
- package/transfer/index.d.ts.map +0 -1
- package/transfer/transfer-algos.d.ts.map +0 -1
- package/transfer/transfer.d.ts.map +0 -1
- package/types/account-manager.d.ts.map +0 -1
- package/types/account.d.ts.map +0 -1
- package/types/algo-http-client-with-retry.d.ts.map +0 -1
- package/types/algorand-client-transaction-creator.d.ts.map +0 -1
- package/types/algorand-client-transaction-sender.d.ts.map +0 -1
- package/types/algorand-client.d.ts.map +0 -1
- package/types/amount.d.ts.map +0 -1
- package/types/app-client.d.ts.map +0 -1
- package/types/app-spec.d.ts.map +0 -1
- package/types/app.d.ts.map +0 -1
- package/types/asset-manager.d.ts.map +0 -1
- package/types/asset.d.ts.map +0 -1
- package/types/client-manager.d.ts.map +0 -1
- package/types/composer.d.ts.map +0 -1
- package/types/config.d.ts.map +0 -1
- package/types/debugging.d.ts.map +0 -1
- package/types/dispenser-client.d.ts.map +0 -1
- package/types/indexer.d.ts.map +0 -1
- package/types/kmd-account-manager.d.ts.map +0 -1
- package/types/logging.d.ts.map +0 -1
- package/types/logic-error.d.ts.map +0 -1
- package/types/network-client.d.ts.map +0 -1
- package/types/testing.d.ts.map +0 -1
- package/types/transaction.d.ts.map +0 -1
- package/types/transfer.d.ts.map +0 -1
- package/types/urlTokenBaseHTTPClient.d.ts +0 -41
- package/types/urlTokenBaseHTTPClient.d.ts.map +0 -1
- 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/util.d.ts.map +0 -1
package/types/composer.js
CHANGED
|
@@ -1,18 +1,24 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
-
|
|
5
3
|
var algosdk = require('algosdk');
|
|
4
|
+
var config = require('../config.js');
|
|
6
5
|
var transaction = require('../transaction/transaction.js');
|
|
6
|
+
var types_app = require('./app.js');
|
|
7
|
+
var types_appManager = require('./app-manager.js');
|
|
8
|
+
var types_lifecycleEvents = require('./lifecycle-events.js');
|
|
7
9
|
var types_networkClient = require('./network-client.js');
|
|
8
10
|
|
|
11
|
+
var AtomicTransactionComposer = algosdk.AtomicTransactionComposer;
|
|
9
12
|
var isTransactionWithSigner = algosdk.isTransactionWithSigner;
|
|
10
|
-
var
|
|
13
|
+
var modelsv2 = algosdk.modelsv2;
|
|
14
|
+
const address = (address) => {
|
|
15
|
+
return typeof address === 'string' ? algosdk.Address.fromString(address) : address;
|
|
16
|
+
};
|
|
11
17
|
const MAX_TRANSACTION_GROUP_SIZE = 16;
|
|
12
|
-
/**
|
|
13
|
-
class
|
|
18
|
+
/** TransactionComposer helps you compose and execute transactions as a transaction group. */
|
|
19
|
+
class TransactionComposer {
|
|
14
20
|
/**
|
|
15
|
-
* Create
|
|
21
|
+
* Create a `TransactionComposer`.
|
|
16
22
|
* @param params The configuration for this composer
|
|
17
23
|
*/
|
|
18
24
|
constructor(params) {
|
|
@@ -23,7 +29,7 @@ class AlgoKitComposer {
|
|
|
23
29
|
/** Transactions that have not yet been composed */
|
|
24
30
|
this.txns = [];
|
|
25
31
|
/** The default transaction validity window */
|
|
26
|
-
this.defaultValidityWindow =
|
|
32
|
+
this.defaultValidityWindow = 10n;
|
|
27
33
|
/** Whether the validity window was explicitly set on construction */
|
|
28
34
|
this.defaultValidityWindowIsExplicit = false;
|
|
29
35
|
this.algod = params.algod;
|
|
@@ -32,6 +38,21 @@ class AlgoKitComposer {
|
|
|
32
38
|
this.getSigner = params.getSigner;
|
|
33
39
|
this.defaultValidityWindow = params.defaultValidityWindow ?? this.defaultValidityWindow;
|
|
34
40
|
this.defaultValidityWindowIsExplicit = params.defaultValidityWindow !== undefined;
|
|
41
|
+
this.appManager = params.appManager ?? new types_appManager.AppManager(params.algod);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Add a pre-built transaction to the transaction group.
|
|
45
|
+
* @param transaction The pre-built transaction
|
|
46
|
+
* @param signer Optional signer override for the transaction
|
|
47
|
+
* @returns The composer so you can chain method calls
|
|
48
|
+
*/
|
|
49
|
+
addTransaction(transaction, signer) {
|
|
50
|
+
this.txns.push({
|
|
51
|
+
txn: transaction,
|
|
52
|
+
signer: signer ?? this.getSigner(transaction.sender),
|
|
53
|
+
type: 'txnWithSigner',
|
|
54
|
+
});
|
|
55
|
+
return this;
|
|
35
56
|
}
|
|
36
57
|
/**
|
|
37
58
|
* Add a payment transaction to the transaction group.
|
|
@@ -105,9 +126,44 @@ class AlgoKitComposer {
|
|
|
105
126
|
this.txns.push({ ...params, type: 'assetOptOut' });
|
|
106
127
|
return this;
|
|
107
128
|
}
|
|
129
|
+
/**
|
|
130
|
+
* Add an application create transaction to the transaction group.
|
|
131
|
+
*
|
|
132
|
+
* Note: we recommend using app clients to make it easier to make app calls.
|
|
133
|
+
* @param params The application create transaction parameters
|
|
134
|
+
* @returns The composer so you can chain method calls
|
|
135
|
+
*/
|
|
136
|
+
addAppCreate(params) {
|
|
137
|
+
this.txns.push({ ...params, type: 'appCall' });
|
|
138
|
+
return this;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Add an application update transaction to the transaction group.
|
|
142
|
+
*
|
|
143
|
+
* Note: we recommend using app clients to make it easier to make app calls.
|
|
144
|
+
* @param params The application update transaction parameters
|
|
145
|
+
* @returns The composer so you can chain method calls
|
|
146
|
+
*/
|
|
147
|
+
addAppUpdate(params) {
|
|
148
|
+
this.txns.push({ ...params, type: 'appCall', onComplete: algosdk.OnApplicationComplete.UpdateApplicationOC });
|
|
149
|
+
return this;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Add an application delete transaction to the transaction group.
|
|
153
|
+
*
|
|
154
|
+
* Note: we recommend using app clients to make it easier to make app calls.
|
|
155
|
+
* @param params The application delete transaction parameters
|
|
156
|
+
* @returns The composer so you can chain method calls
|
|
157
|
+
*/
|
|
158
|
+
addAppDelete(params) {
|
|
159
|
+
this.txns.push({ ...params, type: 'appCall', onComplete: algosdk.OnApplicationComplete.DeleteApplicationOC });
|
|
160
|
+
return this;
|
|
161
|
+
}
|
|
108
162
|
/**
|
|
109
163
|
* Add an application call transaction to the transaction group.
|
|
110
164
|
*
|
|
165
|
+
* If you want to create or update an app use `addAppCreate` or `addAppUpdate`.
|
|
166
|
+
*
|
|
111
167
|
* Note: we recommend using app clients to make it easier to make app calls.
|
|
112
168
|
* @param params The application call transaction parameters
|
|
113
169
|
* @returns The composer so you can chain method calls
|
|
@@ -117,13 +173,46 @@ class AlgoKitComposer {
|
|
|
117
173
|
return this;
|
|
118
174
|
}
|
|
119
175
|
/**
|
|
120
|
-
* Add an ABI method application call transaction to the transaction group.
|
|
176
|
+
* Add an ABI method create application call transaction to the transaction group.
|
|
177
|
+
*
|
|
178
|
+
* Note: we recommend using app clients to make it easier to make app calls.
|
|
179
|
+
* @param params The ABI create method application call transaction parameters
|
|
180
|
+
* @returns The composer so you can chain method calls
|
|
181
|
+
*/
|
|
182
|
+
addAppCreateMethodCall(params) {
|
|
183
|
+
this.txns.push({ ...params, type: 'methodCall' });
|
|
184
|
+
return this;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Add an ABI method update application call transaction to the transaction group.
|
|
188
|
+
*
|
|
189
|
+
* Note: we recommend using app clients to make it easier to make app calls.
|
|
190
|
+
* @param params The ABI update method application call transaction parameters
|
|
191
|
+
* @returns The composer so you can chain method calls
|
|
192
|
+
*/
|
|
193
|
+
addAppUpdateMethodCall(params) {
|
|
194
|
+
this.txns.push({ ...params, type: 'methodCall', onComplete: algosdk.OnApplicationComplete.UpdateApplicationOC });
|
|
195
|
+
return this;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Add an ABI method delete application call transaction to the transaction group.
|
|
199
|
+
*
|
|
200
|
+
* Note: we recommend using app clients to make it easier to make app calls.
|
|
201
|
+
* @param params The ABI delete method application call transaction parameters
|
|
202
|
+
* @returns The composer so you can chain method calls
|
|
203
|
+
*/
|
|
204
|
+
addAppDeleteMethodCall(params) {
|
|
205
|
+
this.txns.push({ ...params, type: 'methodCall', onComplete: algosdk.OnApplicationComplete.DeleteApplicationOC });
|
|
206
|
+
return this;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Add a non-create/non-update ABI method application call transaction to the transaction group.
|
|
121
210
|
*
|
|
122
211
|
* Note: we recommend using app clients to make it easier to make app calls.
|
|
123
212
|
* @param params The ABI method application call transaction parameters
|
|
124
213
|
* @returns The composer so you can chain method calls
|
|
125
214
|
*/
|
|
126
|
-
|
|
215
|
+
addAppCallMethodCall(params) {
|
|
127
216
|
this.txns.push({ ...params, type: 'methodCall' });
|
|
128
217
|
return this;
|
|
129
218
|
}
|
|
@@ -145,73 +234,105 @@ class AlgoKitComposer {
|
|
|
145
234
|
this.txns.push({ atc, type: 'atc' });
|
|
146
235
|
return this;
|
|
147
236
|
}
|
|
237
|
+
/** Build an ATC and return transactions ready to be incorporated into a broader set of transactions this composer is composing */
|
|
148
238
|
buildAtc(atc) {
|
|
149
239
|
const group = atc.buildGroup();
|
|
150
|
-
const txnWithSigners = group.map((ts) => {
|
|
240
|
+
const txnWithSigners = group.map((ts, idx) => {
|
|
241
|
+
// Remove underlying group ID from the transaction since it will be re-grouped when this TransactionComposer is built
|
|
151
242
|
ts.txn.group = undefined;
|
|
243
|
+
// If this was a method call stash the ABIMethod for later
|
|
244
|
+
if (atc['methodCalls'].get(idx)) {
|
|
245
|
+
this.txnMethodMap.set(ts.txn.txID(), atc['methodCalls'].get(idx));
|
|
246
|
+
}
|
|
152
247
|
return ts;
|
|
153
248
|
});
|
|
154
|
-
const method = atc['methodCalls'].get(group.length - 1);
|
|
155
|
-
if (method)
|
|
156
|
-
this.txnMethodMap.set(txnWithSigners.at(-1).txn.txID(), method);
|
|
157
249
|
return txnWithSigners;
|
|
158
250
|
}
|
|
159
|
-
commonTxnBuildStep(
|
|
251
|
+
commonTxnBuildStep(buildTxn, params, txnParams) {
|
|
252
|
+
// We are going to mutate suggested params, let's create a clone first
|
|
253
|
+
txnParams.suggestedParams = { ...txnParams.suggestedParams };
|
|
160
254
|
if (params.lease)
|
|
161
|
-
|
|
255
|
+
txnParams.lease = transaction.encodeLease(params.lease);
|
|
162
256
|
if (params.rekeyTo)
|
|
163
|
-
|
|
257
|
+
txnParams.rekeyTo = address(params.rekeyTo);
|
|
258
|
+
const encoder = new TextEncoder();
|
|
164
259
|
if (params.note)
|
|
165
|
-
|
|
260
|
+
txnParams.note = (typeof params.note === 'string' ? encoder.encode(params.note) : params.note);
|
|
166
261
|
if (params.firstValidRound) {
|
|
167
|
-
|
|
262
|
+
txnParams.suggestedParams.firstValid = params.firstValidRound;
|
|
168
263
|
}
|
|
169
264
|
if (params.lastValidRound) {
|
|
170
|
-
|
|
265
|
+
txnParams.suggestedParams.lastValid = params.lastValidRound;
|
|
171
266
|
}
|
|
172
267
|
else {
|
|
173
268
|
// If the validity window isn't set in this transaction or by default and we are pointing at
|
|
174
269
|
// LocalNet set a bigger window to avoid dead transactions
|
|
175
|
-
const window = params.validityWindow
|
|
176
|
-
|
|
177
|
-
|
|
270
|
+
const window = params.validityWindow
|
|
271
|
+
? BigInt(params.validityWindow)
|
|
272
|
+
: !this.defaultValidityWindowIsExplicit && types_networkClient.genesisIdIsLocalNet(txnParams.suggestedParams.genesisID ?? 'unknown')
|
|
273
|
+
? 1000n
|
|
274
|
+
: this.defaultValidityWindow;
|
|
275
|
+
txnParams.suggestedParams.lastValid = BigInt(txnParams.suggestedParams.firstValid) + window;
|
|
178
276
|
}
|
|
179
277
|
if (params.staticFee !== undefined && params.extraFee !== undefined) {
|
|
180
278
|
throw Error('Cannot set both staticFee and extraFee');
|
|
181
279
|
}
|
|
182
280
|
if (params.staticFee !== undefined) {
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
else {
|
|
186
|
-
txn.fee = txn.estimateSize() * suggestedParams.fee || algosdk.ALGORAND_MIN_TX_FEE;
|
|
187
|
-
if (params.extraFee)
|
|
188
|
-
txn.fee += params.extraFee.microAlgo;
|
|
281
|
+
txnParams.suggestedParams.fee = params.staticFee.microAlgo;
|
|
282
|
+
txnParams.suggestedParams.flatFee = true;
|
|
189
283
|
}
|
|
190
|
-
txn
|
|
284
|
+
const txn = buildTxn(txnParams);
|
|
285
|
+
if (params.extraFee)
|
|
286
|
+
txn.fee += params.extraFee.microAlgo;
|
|
191
287
|
if (params.maxFee !== undefined && txn.fee > params.maxFee.microAlgo) {
|
|
192
|
-
throw Error(`Transaction fee ${txn.fee} is greater than maxFee ${params.maxFee}`);
|
|
288
|
+
throw Error(`Transaction fee ${txn.fee} µALGO is greater than maxFee ${params.maxFee}`);
|
|
193
289
|
}
|
|
194
290
|
return txn;
|
|
195
291
|
}
|
|
292
|
+
/**
|
|
293
|
+
* Builds an ABI method call transaction and any other associated transactions represented in the ABI args.
|
|
294
|
+
* @param includeSigner Whether to include the actual signer for the transactions.
|
|
295
|
+
* If you are just building transactions without signers yet then set this to `false`.
|
|
296
|
+
*/
|
|
196
297
|
async buildMethodCall(params, suggestedParams, includeSigner) {
|
|
197
298
|
const methodArgs = [];
|
|
299
|
+
const transactionsForGroup = [];
|
|
198
300
|
const isAbiValue = (x) => {
|
|
199
301
|
if (Array.isArray(x))
|
|
200
302
|
return x.length == 0 || x.every(isAbiValue);
|
|
201
|
-
return
|
|
303
|
+
return typeof x === 'bigint' || typeof x === 'boolean' || typeof x === 'number' || typeof x === 'string' || x instanceof Uint8Array;
|
|
202
304
|
};
|
|
203
|
-
for (
|
|
305
|
+
for (let i = (params.args ?? []).length - 1; i >= 0; i--) {
|
|
306
|
+
const arg = params.args[i];
|
|
307
|
+
if (arg === undefined) {
|
|
308
|
+
// An undefined transaction argument signals that the value will be supplied by a method call argument
|
|
309
|
+
if (algosdk.abiTypeIsTransaction(params.method.args[i].type) && transactionsForGroup.length > 0) {
|
|
310
|
+
// Move the last transaction from the group to the method call arguments to appease algosdk
|
|
311
|
+
const placeholderTransaction = transactionsForGroup.splice(-1, 1)[0];
|
|
312
|
+
methodArgs.push(placeholderTransaction);
|
|
313
|
+
continue;
|
|
314
|
+
}
|
|
315
|
+
throw Error(`No value provided for argument ${i + 1} within call to ${params.method.name}`);
|
|
316
|
+
}
|
|
204
317
|
if (isAbiValue(arg)) {
|
|
205
318
|
methodArgs.push(arg);
|
|
206
319
|
continue;
|
|
207
320
|
}
|
|
321
|
+
// Underlying ATC only supports addresses as strings
|
|
322
|
+
if (arg instanceof algosdk.Address) {
|
|
323
|
+
methodArgs.push(arg.toString());
|
|
324
|
+
continue;
|
|
325
|
+
}
|
|
208
326
|
if (isTransactionWithSigner(arg)) {
|
|
209
327
|
methodArgs.push(arg);
|
|
210
328
|
continue;
|
|
211
329
|
}
|
|
212
330
|
if ('method' in arg) {
|
|
213
331
|
const tempTxnWithSigners = await this.buildMethodCall(arg, suggestedParams, includeSigner);
|
|
214
|
-
|
|
332
|
+
// If there is any transaction args, add to the atc
|
|
333
|
+
// Everything else should be added as method args
|
|
334
|
+
methodArgs.push(...tempTxnWithSigners.slice(-1)); // Add the method call itself as a method arg
|
|
335
|
+
transactionsForGroup.push(...tempTxnWithSigners.slice(0, -1).reverse()); // Add any transaction arguments to the atc
|
|
215
336
|
continue;
|
|
216
337
|
}
|
|
217
338
|
const txn = await arg;
|
|
@@ -222,73 +343,97 @@ class AlgoKitComposer {
|
|
|
222
343
|
? 'signer' in params.signer
|
|
223
344
|
? params.signer.signer
|
|
224
345
|
: params.signer
|
|
225
|
-
: this.getSigner(
|
|
226
|
-
:
|
|
346
|
+
: this.getSigner(txn.sender)
|
|
347
|
+
: TransactionComposer.NULL_SIGNER,
|
|
227
348
|
});
|
|
228
349
|
}
|
|
229
350
|
const methodAtc = new algosdk.AtomicTransactionComposer();
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
351
|
+
transactionsForGroup.reverse().forEach((txn) => methodAtc.addTransaction(txn));
|
|
352
|
+
const appId = Number('appId' in params ? params.appId : 0n);
|
|
353
|
+
const approvalProgram = 'approvalProgram' in params
|
|
354
|
+
? typeof params.approvalProgram === 'string'
|
|
355
|
+
? (await this.appManager.compileTeal(params.approvalProgram)).compiledBase64ToBytes
|
|
356
|
+
: params.approvalProgram
|
|
357
|
+
: undefined;
|
|
358
|
+
const clearStateProgram = 'clearStateProgram' in params
|
|
359
|
+
? typeof params.clearStateProgram === 'string'
|
|
360
|
+
? (await this.appManager.compileTeal(params.clearStateProgram)).compiledBase64ToBytes
|
|
361
|
+
: params.clearStateProgram
|
|
362
|
+
: undefined;
|
|
363
|
+
const txnParams = {
|
|
364
|
+
appID: appId,
|
|
233
365
|
sender: params.sender,
|
|
234
366
|
suggestedParams,
|
|
235
|
-
onComplete: params.onComplete,
|
|
367
|
+
onComplete: params.onComplete ?? algosdk.OnApplicationComplete.NoOpOC,
|
|
236
368
|
appAccounts: params.accountReferences,
|
|
237
369
|
appForeignApps: params.appReferences?.map((x) => Number(x)),
|
|
238
370
|
appForeignAssets: params.assetReferences?.map((x) => Number(x)),
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
371
|
+
boxes: params.boxReferences?.map(types_appManager.AppManager.getBoxReference),
|
|
372
|
+
approvalProgram,
|
|
373
|
+
clearProgram: clearStateProgram,
|
|
374
|
+
extraPages: appId === 0
|
|
375
|
+
? 'extraProgramPages' in params && params.extraProgramPages !== undefined
|
|
376
|
+
? params.extraProgramPages
|
|
377
|
+
: approvalProgram
|
|
378
|
+
? Math.floor((approvalProgram.length + (clearStateProgram?.length ?? 0)) / types_app.APP_PAGE_MAX_SIZE)
|
|
379
|
+
: 0
|
|
380
|
+
: undefined,
|
|
381
|
+
numLocalInts: appId === 0 ? ('schema' in params ? (params.schema?.localInts ?? 0) : 0) : undefined,
|
|
382
|
+
numLocalByteSlices: appId === 0 ? ('schema' in params ? (params.schema?.localByteSlices ?? 0) : 0) : undefined,
|
|
383
|
+
numGlobalInts: appId === 0 ? ('schema' in params ? (params.schema?.globalInts ?? 0) : 0) : undefined,
|
|
384
|
+
numGlobalByteSlices: appId === 0 ? ('schema' in params ? (params.schema?.globalByteSlices ?? 0) : 0) : undefined,
|
|
246
385
|
method: params.method,
|
|
247
|
-
signer:
|
|
248
|
-
|
|
386
|
+
signer: includeSigner
|
|
387
|
+
? params.signer
|
|
388
|
+
? 'signer' in params.signer
|
|
389
|
+
? params.signer.signer
|
|
390
|
+
: params.signer
|
|
391
|
+
: this.getSigner(params.sender)
|
|
392
|
+
: TransactionComposer.NULL_SIGNER,
|
|
393
|
+
methodArgs: methodArgs.reverse(),
|
|
249
394
|
// note, lease, and rekeyTo are set in the common build step
|
|
250
395
|
note: undefined,
|
|
251
396
|
lease: undefined,
|
|
252
397
|
rekeyTo: undefined,
|
|
253
|
-
}
|
|
254
|
-
//
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
398
|
+
};
|
|
399
|
+
// Build the transaction
|
|
400
|
+
this.commonTxnBuildStep((txnParams) => {
|
|
401
|
+
methodAtc.addMethodCall(txnParams);
|
|
402
|
+
return methodAtc.buildGroup()[methodAtc.count() - 1].txn;
|
|
403
|
+
}, params, txnParams);
|
|
404
|
+
// Process the ATC to get a set of transactions ready for broader grouping
|
|
258
405
|
return this.buildAtc(methodAtc);
|
|
259
406
|
}
|
|
260
407
|
buildPayment(params, suggestedParams) {
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
408
|
+
return this.commonTxnBuildStep(algosdk.makePaymentTxnWithSuggestedParamsFromObject, params, {
|
|
409
|
+
sender: params.sender,
|
|
410
|
+
receiver: params.receiver,
|
|
264
411
|
amount: params.amount.microAlgo,
|
|
265
412
|
closeRemainderTo: params.closeRemainderTo,
|
|
266
413
|
suggestedParams,
|
|
267
414
|
});
|
|
268
|
-
return this.commonTxnBuildStep(params, txn, suggestedParams);
|
|
269
415
|
}
|
|
270
416
|
buildAssetCreate(params, suggestedParams) {
|
|
271
|
-
|
|
272
|
-
|
|
417
|
+
return this.commonTxnBuildStep(algosdk.makeAssetCreateTxnWithSuggestedParamsFromObject, params, {
|
|
418
|
+
sender: params.sender,
|
|
273
419
|
total: params.total,
|
|
274
420
|
decimals: params.decimals ?? 0,
|
|
275
421
|
assetName: params.assetName,
|
|
276
422
|
unitName: params.unitName,
|
|
277
423
|
assetURL: params.url,
|
|
278
424
|
defaultFrozen: params.defaultFrozen ?? false,
|
|
279
|
-
assetMetadataHash: params.metadataHash,
|
|
425
|
+
assetMetadataHash: typeof params.metadataHash === 'string' ? Buffer.from(params.metadataHash, 'utf-8') : params.metadataHash,
|
|
280
426
|
manager: params.manager,
|
|
281
427
|
reserve: params.reserve,
|
|
282
428
|
freeze: params.freeze,
|
|
283
429
|
clawback: params.clawback,
|
|
284
430
|
suggestedParams,
|
|
285
431
|
});
|
|
286
|
-
return this.commonTxnBuildStep(params, txn, suggestedParams);
|
|
287
432
|
}
|
|
288
433
|
buildAssetConfig(params, suggestedParams) {
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
assetIndex:
|
|
434
|
+
return this.commonTxnBuildStep(algosdk.makeAssetConfigTxnWithSuggestedParamsFromObject, params, {
|
|
435
|
+
sender: params.sender,
|
|
436
|
+
assetIndex: params.assetId,
|
|
292
437
|
suggestedParams,
|
|
293
438
|
manager: params.manager,
|
|
294
439
|
reserve: params.reserve,
|
|
@@ -296,89 +441,101 @@ class AlgoKitComposer {
|
|
|
296
441
|
clawback: params.clawback,
|
|
297
442
|
strictEmptyAddressChecking: false,
|
|
298
443
|
});
|
|
299
|
-
return this.commonTxnBuildStep(params, txn, suggestedParams);
|
|
300
444
|
}
|
|
301
445
|
buildAssetDestroy(params, suggestedParams) {
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
assetIndex:
|
|
446
|
+
return this.commonTxnBuildStep(algosdk.makeAssetDestroyTxnWithSuggestedParamsFromObject, params, {
|
|
447
|
+
sender: params.sender,
|
|
448
|
+
assetIndex: params.assetId,
|
|
305
449
|
suggestedParams,
|
|
306
450
|
});
|
|
307
|
-
return this.commonTxnBuildStep(params, txn, suggestedParams);
|
|
308
451
|
}
|
|
309
452
|
buildAssetFreeze(params, suggestedParams) {
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
assetIndex:
|
|
453
|
+
return this.commonTxnBuildStep(algosdk.makeAssetFreezeTxnWithSuggestedParamsFromObject, params, {
|
|
454
|
+
sender: params.sender,
|
|
455
|
+
assetIndex: params.assetId,
|
|
313
456
|
freezeTarget: params.account,
|
|
314
|
-
|
|
457
|
+
frozen: params.frozen,
|
|
315
458
|
suggestedParams,
|
|
316
459
|
});
|
|
317
|
-
return this.commonTxnBuildStep(params, txn, suggestedParams);
|
|
318
460
|
}
|
|
319
461
|
buildAssetTransfer(params, suggestedParams) {
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
assetIndex:
|
|
462
|
+
return this.commonTxnBuildStep(algosdk.makeAssetTransferTxnWithSuggestedParamsFromObject, params, {
|
|
463
|
+
sender: params.sender,
|
|
464
|
+
receiver: params.receiver,
|
|
465
|
+
assetIndex: params.assetId,
|
|
324
466
|
amount: params.amount,
|
|
325
467
|
suggestedParams,
|
|
326
468
|
closeRemainderTo: params.closeAssetTo,
|
|
327
|
-
|
|
469
|
+
assetSender: params.clawbackTarget,
|
|
328
470
|
});
|
|
329
|
-
return this.commonTxnBuildStep(params, txn, suggestedParams);
|
|
330
471
|
}
|
|
331
|
-
buildAppCall(params, suggestedParams) {
|
|
472
|
+
async buildAppCall(params, suggestedParams) {
|
|
473
|
+
const appId = 'appId' in params ? params.appId : 0n;
|
|
474
|
+
const approvalProgram = 'approvalProgram' in params
|
|
475
|
+
? typeof params.approvalProgram === 'string'
|
|
476
|
+
? (await this.appManager.compileTeal(params.approvalProgram)).compiledBase64ToBytes
|
|
477
|
+
: params.approvalProgram
|
|
478
|
+
: undefined;
|
|
479
|
+
const clearStateProgram = 'clearStateProgram' in params
|
|
480
|
+
? typeof params.clearStateProgram === 'string'
|
|
481
|
+
? (await this.appManager.compileTeal(params.clearStateProgram)).compiledBase64ToBytes
|
|
482
|
+
: params.clearStateProgram
|
|
483
|
+
: undefined;
|
|
332
484
|
const sdkParams = {
|
|
333
|
-
|
|
485
|
+
sender: params.sender,
|
|
334
486
|
suggestedParams,
|
|
335
|
-
onComplete: params.onComplete,
|
|
336
|
-
approvalProgram: params.approvalProgram,
|
|
337
|
-
clearProgram: params.clearProgram,
|
|
338
487
|
appArgs: params.args,
|
|
488
|
+
onComplete: params.onComplete ?? algosdk.OnApplicationComplete.NoOpOC,
|
|
339
489
|
accounts: params.accountReferences,
|
|
340
490
|
foreignApps: params.appReferences?.map((x) => Number(x)),
|
|
341
491
|
foreignAssets: params.assetReferences?.map((x) => Number(x)),
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
numGlobalInts: params.schema?.globalUints || 0,
|
|
346
|
-
numGlobalByteSlices: params.schema?.globalByteSlices || 0,
|
|
492
|
+
boxes: params.boxReferences?.map(types_appManager.AppManager.getBoxReference),
|
|
493
|
+
approvalProgram,
|
|
494
|
+
clearProgram: clearStateProgram,
|
|
347
495
|
};
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
if (params.approvalProgram === undefined || params.clearProgram === undefined) {
|
|
352
|
-
throw new Error('approvalProgram and clearProgram are required for application creation');
|
|
496
|
+
if (appId === 0n) {
|
|
497
|
+
if (sdkParams.approvalProgram === undefined || sdkParams.clearProgram === undefined) {
|
|
498
|
+
throw new Error('approvalProgram and clearStateProgram are required for application creation');
|
|
353
499
|
}
|
|
354
|
-
|
|
500
|
+
return this.commonTxnBuildStep(algosdk.makeApplicationCreateTxnFromObject, params, {
|
|
355
501
|
...sdkParams,
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
502
|
+
extraPages: 'extraProgramPages' in params
|
|
503
|
+
? (params.extraProgramPages ?? Math.floor((approvalProgram.length + clearStateProgram.length) / types_app.APP_PAGE_MAX_SIZE))
|
|
504
|
+
: 0,
|
|
505
|
+
numLocalInts: 'schema' in params ? (params.schema?.localInts ?? 0) : 0,
|
|
506
|
+
numLocalByteSlices: 'schema' in params ? (params.schema?.localByteSlices ?? 0) : 0,
|
|
507
|
+
numGlobalInts: 'schema' in params ? (params.schema?.globalInts ?? 0) : 0,
|
|
508
|
+
numGlobalByteSlices: 'schema' in params ? (params.schema?.globalByteSlices ?? 0) : 0,
|
|
509
|
+
approvalProgram: approvalProgram,
|
|
510
|
+
clearProgram: clearStateProgram,
|
|
359
511
|
});
|
|
360
512
|
}
|
|
361
|
-
|
|
362
|
-
|
|
513
|
+
else {
|
|
514
|
+
return this.commonTxnBuildStep(algosdk.makeApplicationCallTxnFromObject, params, { ...sdkParams, appIndex: appId });
|
|
515
|
+
}
|
|
363
516
|
}
|
|
364
517
|
buildKeyReg(params, suggestedParams) {
|
|
365
|
-
|
|
366
|
-
|
|
518
|
+
return this.commonTxnBuildStep(algosdk.makeKeyRegistrationTxnWithSuggestedParamsFromObject, params, {
|
|
519
|
+
sender: params.sender,
|
|
520
|
+
voteKey: params.voteKey,
|
|
521
|
+
selectionKey: params.selectionKey,
|
|
522
|
+
voteFirst: params.voteFirst,
|
|
523
|
+
voteLast: params.voteLast,
|
|
524
|
+
voteKeyDilution: params.voteKeyDilution,
|
|
525
|
+
stateProofKey: params.stateProofKey,
|
|
526
|
+
nonParticipation: false,
|
|
527
|
+
suggestedParams,
|
|
528
|
+
});
|
|
367
529
|
}
|
|
530
|
+
/** Builds all transaction types apart from `txnWithSigner`, `atc` and `methodCall` since those ones can have custom signers that need to be retrieved. */
|
|
368
531
|
async buildTxn(txn, suggestedParams) {
|
|
369
532
|
switch (txn.type) {
|
|
370
|
-
case 'txnWithSigner':
|
|
371
|
-
return [txn.txn];
|
|
372
|
-
case 'atc':
|
|
373
|
-
return txn.atc.buildGroup().map((ts) => ts.txn);
|
|
374
|
-
case 'methodCall':
|
|
375
|
-
return (await this.buildMethodCall(txn, suggestedParams, false)).map((ts) => ts.txn);
|
|
376
533
|
case 'pay':
|
|
377
534
|
return [this.buildPayment(txn, suggestedParams)];
|
|
378
535
|
case 'assetCreate':
|
|
379
536
|
return [this.buildAssetCreate(txn, suggestedParams)];
|
|
380
537
|
case 'appCall':
|
|
381
|
-
return [this.buildAppCall(txn, suggestedParams)];
|
|
538
|
+
return [await this.buildAppCall(txn, suggestedParams)];
|
|
382
539
|
case 'assetConfig':
|
|
383
540
|
return [this.buildAssetConfig(txn, suggestedParams)];
|
|
384
541
|
case 'assetDestroy':
|
|
@@ -411,43 +568,77 @@ class AlgoKitComposer {
|
|
|
411
568
|
return (await this.buildTxn(txn, suggestedParams)).map((txn) => ({ txn, signer }));
|
|
412
569
|
}
|
|
413
570
|
/**
|
|
414
|
-
* Compose all of the transactions without signers and return the transaction objects directly.
|
|
571
|
+
* Compose all of the transactions without signers and return the transaction objects directly along with any ABI method calls.
|
|
415
572
|
*
|
|
416
|
-
* @returns The array of built transactions
|
|
573
|
+
* @returns The array of built transactions and any corresponding method calls
|
|
417
574
|
*/
|
|
418
575
|
async buildTransactions() {
|
|
419
576
|
const suggestedParams = await this.getSuggestedParams();
|
|
420
577
|
const transactions = [];
|
|
578
|
+
const methodCalls = new Map();
|
|
579
|
+
const signers = new Map();
|
|
421
580
|
for (const txn of this.txns) {
|
|
422
|
-
|
|
581
|
+
if (!['txnWithSigner', 'atc', 'methodCall'].includes(txn.type)) {
|
|
582
|
+
transactions.push(...(await this.buildTxn(txn, suggestedParams)));
|
|
583
|
+
}
|
|
584
|
+
else {
|
|
585
|
+
const transactionsWithSigner = txn.type === 'txnWithSigner'
|
|
586
|
+
? [txn]
|
|
587
|
+
: txn.type === 'atc'
|
|
588
|
+
? this.buildAtc(txn.atc)
|
|
589
|
+
: txn.type === 'methodCall'
|
|
590
|
+
? await this.buildMethodCall(txn, suggestedParams, false)
|
|
591
|
+
: [];
|
|
592
|
+
transactions.push(...transactionsWithSigner.map((ts) => ts.txn));
|
|
593
|
+
transactionsWithSigner.forEach((ts, idx) => {
|
|
594
|
+
if (ts.signer && ts.signer !== TransactionComposer.NULL_SIGNER) {
|
|
595
|
+
signers.set(idx, ts.signer);
|
|
596
|
+
}
|
|
597
|
+
});
|
|
598
|
+
}
|
|
423
599
|
}
|
|
424
|
-
|
|
600
|
+
for (let i = 0; i < transactions.length; i++) {
|
|
601
|
+
const method = this.txnMethodMap.get(transactions[i].txID());
|
|
602
|
+
if (method)
|
|
603
|
+
methodCalls.set(i, method);
|
|
604
|
+
}
|
|
605
|
+
return { transactions, methodCalls, signers };
|
|
606
|
+
}
|
|
607
|
+
/**
|
|
608
|
+
* Get the number of transactions currently added to this composer.
|
|
609
|
+
*/
|
|
610
|
+
async count() {
|
|
611
|
+
return (await this.buildTransactions()).transactions.length;
|
|
425
612
|
}
|
|
426
613
|
/**
|
|
427
614
|
* Compose all of the transactions in a single atomic transaction group and an atomic transaction composer.
|
|
428
615
|
*
|
|
429
616
|
* You can then use the transactions standalone, or use the composer to execute or simulate the transactions.
|
|
617
|
+
*
|
|
618
|
+
* Once this method is called, no further transactions will be able to be added.
|
|
619
|
+
* You can safely call this method multiple times to get the same result.
|
|
430
620
|
* @returns The built atomic transaction composer and the transactions
|
|
431
621
|
*/
|
|
432
622
|
async build() {
|
|
433
623
|
if (this.atc.getStatus() === algosdk.AtomicTransactionComposerStatus.BUILDING) {
|
|
434
624
|
const suggestedParams = await this.getSuggestedParams();
|
|
625
|
+
// Build all of the transactions
|
|
435
626
|
const txnWithSigners = [];
|
|
436
627
|
for (const txn of this.txns) {
|
|
437
628
|
txnWithSigners.push(...(await this.buildTxnWithSigner(txn, suggestedParams)));
|
|
438
629
|
}
|
|
439
|
-
|
|
440
|
-
this.atc.addTransaction(ts);
|
|
441
|
-
});
|
|
630
|
+
// Add all of the transactions to the underlying ATC
|
|
442
631
|
const methodCalls = new Map();
|
|
443
632
|
txnWithSigners.forEach((ts, idx) => {
|
|
633
|
+
this.atc.addTransaction(ts);
|
|
634
|
+
// Populate consolidated set of all ABI method calls
|
|
444
635
|
const method = this.txnMethodMap.get(ts.txn.txID());
|
|
445
636
|
if (method)
|
|
446
637
|
methodCalls.set(idx, method);
|
|
447
638
|
});
|
|
448
639
|
this.atc['methodCalls'] = methodCalls;
|
|
449
640
|
}
|
|
450
|
-
return { atc: this.atc, transactions: this.atc.buildGroup() };
|
|
641
|
+
return { atc: this.atc, transactions: this.atc.buildGroup(), methodCalls: this.atc['methodCalls'] };
|
|
451
642
|
}
|
|
452
643
|
/**
|
|
453
644
|
* Rebuild the group, discarding any previously built transactions.
|
|
@@ -459,25 +650,114 @@ class AlgoKitComposer {
|
|
|
459
650
|
return await this.build();
|
|
460
651
|
}
|
|
461
652
|
/**
|
|
462
|
-
* Compose the atomic transaction group and send it to the network
|
|
653
|
+
* Compose the atomic transaction group and send it to the network.
|
|
463
654
|
* @param params The parameters to control execution with
|
|
464
655
|
* @returns The execution result
|
|
465
656
|
*/
|
|
466
|
-
async
|
|
657
|
+
async send(params) {
|
|
467
658
|
const group = (await this.build()).transactions;
|
|
468
659
|
let waitRounds = params?.maxRoundsToWaitForConfirmation;
|
|
469
660
|
if (waitRounds === undefined) {
|
|
470
|
-
const lastRound = group.reduce((max, txn) =>
|
|
471
|
-
const { firstRound } = await this.getSuggestedParams();
|
|
472
|
-
waitRounds = lastRound - firstRound + 1;
|
|
661
|
+
const lastRound = group.reduce((max, txn) => (txn.txn.lastValid > max ? txn.txn.lastValid : BigInt(max)), 0n);
|
|
662
|
+
const { firstValid: firstRound } = await this.getSuggestedParams();
|
|
663
|
+
waitRounds = Number(BigInt(lastRound) - BigInt(firstRound)) + 1;
|
|
473
664
|
}
|
|
474
665
|
return await transaction.sendAtomicTransactionComposer({
|
|
475
666
|
atc: this.atc,
|
|
476
|
-
|
|
667
|
+
suppressLog: params?.suppressLog,
|
|
668
|
+
maxRoundsToWaitForConfirmation: waitRounds,
|
|
669
|
+
populateAppCallResources: params?.populateAppCallResources,
|
|
477
670
|
}, this.algod);
|
|
478
671
|
}
|
|
672
|
+
/**
|
|
673
|
+
* @deprecated Use `send` instead.
|
|
674
|
+
*
|
|
675
|
+
* Compose the atomic transaction group and send it to the network
|
|
676
|
+
*
|
|
677
|
+
* An alias for `composer.send(params)`.
|
|
678
|
+
* @param params The parameters to control execution with
|
|
679
|
+
* @returns The execution result
|
|
680
|
+
*/
|
|
681
|
+
async execute(params) {
|
|
682
|
+
return this.send(params);
|
|
683
|
+
}
|
|
684
|
+
/**
|
|
685
|
+
* Compose the atomic transaction group and simulate sending it to the network
|
|
686
|
+
* @returns The simulation result
|
|
687
|
+
*/
|
|
688
|
+
async simulate(options) {
|
|
689
|
+
const atc = options?.skipSignatures ? new AtomicTransactionComposer() : this.atc;
|
|
690
|
+
// Build the transactions
|
|
691
|
+
if (options?.skipSignatures) {
|
|
692
|
+
options.allowEmptySignatures = true;
|
|
693
|
+
options.fixSigners = true;
|
|
694
|
+
// Build transactions uses empty signers
|
|
695
|
+
const transactions = await this.buildTransactions();
|
|
696
|
+
for (const txn of transactions.transactions) {
|
|
697
|
+
atc.addTransaction({ txn, signer: TransactionComposer.NULL_SIGNER });
|
|
698
|
+
}
|
|
699
|
+
atc['methodCalls'] = transactions.methodCalls;
|
|
700
|
+
}
|
|
701
|
+
else {
|
|
702
|
+
// Build creates real signatures
|
|
703
|
+
await this.build();
|
|
704
|
+
}
|
|
705
|
+
const { methodResults, simulateResponse } = await atc.simulate(this.algod, new modelsv2.SimulateRequest({
|
|
706
|
+
txnGroups: [],
|
|
707
|
+
...options,
|
|
708
|
+
...(config.Config.debug
|
|
709
|
+
? {
|
|
710
|
+
allowEmptySignatures: true,
|
|
711
|
+
fixSigners: true,
|
|
712
|
+
allowMoreLogging: true,
|
|
713
|
+
execTraceConfig: new modelsv2.SimulateTraceConfig({
|
|
714
|
+
enable: true,
|
|
715
|
+
scratchChange: true,
|
|
716
|
+
stackChange: true,
|
|
717
|
+
stateChange: true,
|
|
718
|
+
}),
|
|
719
|
+
}
|
|
720
|
+
: undefined),
|
|
721
|
+
}));
|
|
722
|
+
const failedGroup = simulateResponse?.txnGroups[0];
|
|
723
|
+
if (failedGroup?.failureMessage) {
|
|
724
|
+
const errorMessage = `Transaction failed at transaction(s) ${failedGroup.failedAt?.join(', ') || 'unknown'} in the group. ${failedGroup.failureMessage}`;
|
|
725
|
+
const error = new Error(errorMessage);
|
|
726
|
+
if (config.Config.debug) {
|
|
727
|
+
await config.Config.events.emitAsync(types_lifecycleEvents.EventType.TxnGroupSimulated, { simulateResponse });
|
|
728
|
+
}
|
|
729
|
+
error.simulateResponse = simulateResponse;
|
|
730
|
+
throw error;
|
|
731
|
+
}
|
|
732
|
+
if (config.Config.debug && config.Config.traceAll) {
|
|
733
|
+
await config.Config.events.emitAsync(types_lifecycleEvents.EventType.TxnGroupSimulated, { simulateResponse });
|
|
734
|
+
}
|
|
735
|
+
const transactions = atc.buildGroup().map((t) => t.txn);
|
|
736
|
+
return {
|
|
737
|
+
confirmations: simulateResponse.txnGroups[0].txnResults.map((t) => t.txnResult),
|
|
738
|
+
transactions: transactions,
|
|
739
|
+
txIds: transactions.map((t) => t.txID()),
|
|
740
|
+
groupId: Buffer.from(transactions[0].group ?? new Uint8Array()).toString('base64'),
|
|
741
|
+
simulateResponse,
|
|
742
|
+
returns: methodResults.map(transaction.getABIReturnValue),
|
|
743
|
+
};
|
|
744
|
+
}
|
|
745
|
+
/**
|
|
746
|
+
* Create an encoded transaction note that follows the ARC-2 spec.
|
|
747
|
+
*
|
|
748
|
+
* https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0002.md
|
|
749
|
+
* @param note The ARC-2 transaction note data
|
|
750
|
+
* @returns The binary encoded transaction note
|
|
751
|
+
*/
|
|
752
|
+
static arc2Note(note) {
|
|
753
|
+
const arc2Payload = `${note.dAppName}:${note.format}${typeof note.data === 'string' ? note.data : JSON.stringify(note.data)}`;
|
|
754
|
+
const encoder = new TextEncoder();
|
|
755
|
+
return encoder.encode(arc2Payload);
|
|
756
|
+
}
|
|
479
757
|
}
|
|
758
|
+
/** Signer used to represent a lack of signer */
|
|
759
|
+
TransactionComposer.NULL_SIGNER = algosdk.makeEmptyTransactionSigner();
|
|
480
760
|
|
|
481
761
|
exports.MAX_TRANSACTION_GROUP_SIZE = MAX_TRANSACTION_GROUP_SIZE;
|
|
482
|
-
exports.
|
|
762
|
+
exports.TransactionComposer = TransactionComposer;
|
|
483
763
|
//# sourceMappingURL=composer.js.map
|