@algorandfoundation/algokit-utils 10.0.0-alpha.36 → 10.0.0-alpha.38
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/_virtual/_rolldown/runtime.js +0 -2
- package/account-manager.js +3 -3
- package/account-manager.mjs +3 -3
- package/algorand-client.d.ts +19 -0
- package/algorand-client.js +22 -0
- package/algorand-client.js.map +1 -1
- package/algorand-client.mjs +22 -0
- package/algorand-client.mjs.map +1 -1
- package/app-client.js +2 -2
- package/app-client.mjs +2 -2
- package/app-deployer.js +1 -1
- package/app-deployer.mjs +1 -1
- package/app-factory.js +1 -1
- package/app-factory.mjs +1 -1
- package/app-manager.js +1 -1
- package/app-manager.mjs +1 -1
- package/composer.js +20 -20
- package/composer.js.map +1 -1
- package/composer.mjs +4 -4
- package/index.d.ts +2 -1
- package/index.js +3 -0
- package/index.mjs +2 -1
- package/kmd-account-manager.js +1 -1
- package/kmd-account-manager.mjs +1 -1
- package/network-manager.d.ts +143 -0
- package/network-manager.js +191 -0
- package/network-manager.js.map +1 -0
- package/network-manager.mjs +190 -0
- package/network-manager.mjs.map +1 -0
- package/package.json +3 -1
- package/packages/abi/src/abi-method.js +3 -2
- package/packages/abi/src/abi-method.js.map +1 -1
- package/packages/abi/src/abi-method.mjs +1 -1
- package/packages/algo25/src/index.js +1 -1
- package/packages/algo25/src/index.mjs +1 -1
- package/packages/common/src/address.js +3 -3
- package/packages/common/src/address.js.map +1 -1
- package/packages/common/src/address.mjs +1 -1
- package/packages/crypto/src/ed25519.js +9 -7
- package/packages/crypto/src/ed25519.js.map +1 -1
- package/packages/crypto/src/ed25519.mjs +7 -7
- package/packages/crypto/src/ed25519.mjs.map +1 -1
- package/packages/crypto/src/hash.js +3 -2
- package/packages/crypto/src/hash.js.map +1 -1
- package/packages/crypto/src/hash.mjs +1 -1
- package/packages/crypto/src/hd.js +12 -12
- package/packages/crypto/src/hd.js.map +1 -1
- package/packages/crypto/src/hd.mjs +1 -2
- package/packages/crypto/src/hd.mjs.map +1 -1
- package/testing/transaction-logger.js +1 -1
- package/testing/transaction-logger.mjs +1 -1
- package/transactions/app-call.js +1 -1
- package/transactions/app-call.mjs +1 -1
- package/transactions/method-call.js +1 -1
- package/transactions/method-call.mjs +1 -1
- package/_virtual/_rolldown/runtime.mjs +0 -33
|
@@ -5,7 +5,6 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
|
5
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
6
|
var __getProtoOf = Object.getPrototypeOf;
|
|
7
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
-
var __commonJSMin = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
|
|
9
8
|
var __copyProps = (to, from, except, desc) => {
|
|
10
9
|
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
10
|
for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
|
|
@@ -27,5 +26,4 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
27
26
|
|
|
28
27
|
//#endregion
|
|
29
28
|
|
|
30
|
-
exports.__commonJSMin = __commonJSMin;
|
|
31
29
|
exports.__toESM = __toESM;
|
package/account-manager.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
2
|
const require_runtime = require('./_virtual/_rolldown/runtime.js');
|
|
3
3
|
const require_address = require('./packages/common/src/address.js');
|
|
4
|
-
const require_amount = require('./amount.js');
|
|
5
|
-
const require_config = require('./config.js');
|
|
6
|
-
const require_util = require('./util.js');
|
|
7
4
|
const require_index = require('./packages/algo25/src/index.js');
|
|
8
5
|
const require_signer = require('./packages/transact/src/signer.js');
|
|
9
6
|
const require_multisig = require('./packages/transact/src/multisig.js');
|
|
10
7
|
const require_logicsig = require('./packages/transact/src/logicsig.js');
|
|
11
8
|
const require_account = require('./account.js');
|
|
9
|
+
const require_amount = require('./amount.js');
|
|
10
|
+
const require_config = require('./config.js');
|
|
11
|
+
const require_util = require('./util.js');
|
|
12
12
|
const require_composer = require('./composer.js');
|
|
13
13
|
const require_kmd_account_manager = require('./kmd-account-manager.js');
|
|
14
14
|
let tweetnacl = require("tweetnacl");
|
package/account-manager.mjs
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { Address, getAddress, getOptionalAddress } from "./packages/common/src/address.mjs";
|
|
2
|
-
import { AlgoAmount } from "./amount.mjs";
|
|
3
|
-
import { Config } from "./config.mjs";
|
|
4
|
-
import { calculateFundAmount, memoize } from "./util.mjs";
|
|
5
2
|
import { seedFromMnemonic } from "./packages/algo25/src/index.mjs";
|
|
6
3
|
import { generateAddressWithSigners } from "./packages/transact/src/signer.mjs";
|
|
7
4
|
import { MultisigAccount } from "./packages/transact/src/multisig.mjs";
|
|
8
5
|
import { LogicSigAccount } from "./packages/transact/src/logicsig.mjs";
|
|
9
6
|
import { DISPENSER_ACCOUNT } from "./account.mjs";
|
|
7
|
+
import { AlgoAmount } from "./amount.mjs";
|
|
8
|
+
import { Config } from "./config.mjs";
|
|
9
|
+
import { calculateFundAmount, memoize } from "./util.mjs";
|
|
10
10
|
import { TransactionComposer } from "./composer.mjs";
|
|
11
11
|
import { KmdAccountManager } from "./kmd-account-manager.mjs";
|
|
12
12
|
import nacl from "tweetnacl";
|
package/algorand-client.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ import { AssetManager } from "./asset-manager.js";
|
|
|
10
10
|
import { AlgorandClientTransactionSender } from "./algorand-client-transaction-sender.js";
|
|
11
11
|
import { AppDeployer } from "./app-deployer.js";
|
|
12
12
|
import { AlgoConfig } from "./network-client.js";
|
|
13
|
+
import { NetworkManager } from "./network-manager.js";
|
|
13
14
|
import { AlgoSdkClients, ClientManager } from "./client-manager.js";
|
|
14
15
|
import { AccountManager } from "./account-manager.js";
|
|
15
16
|
|
|
@@ -23,6 +24,7 @@ declare class AlgorandClient {
|
|
|
23
24
|
private _appManager;
|
|
24
25
|
private _appDeployer;
|
|
25
26
|
private _assetManager;
|
|
27
|
+
private _networkManager;
|
|
26
28
|
private _transactionSender;
|
|
27
29
|
private _transactionCreator;
|
|
28
30
|
private _cachedSuggestedParams?;
|
|
@@ -148,6 +150,23 @@ declare class AlgorandClient {
|
|
|
148
150
|
* const deployer = AlgorandClient.mainNet().appDeployer;
|
|
149
151
|
*/
|
|
150
152
|
get appDeployer(): AppDeployer;
|
|
153
|
+
/**
|
|
154
|
+
* Methods for interacting with the network.
|
|
155
|
+
* Provides utilities for querying blockchain state and waiting for specific conditions.
|
|
156
|
+
* @returns The `NetworkManager` instance.
|
|
157
|
+
* @example
|
|
158
|
+
* ```typescript
|
|
159
|
+
* // Get last round
|
|
160
|
+
* const lastRound = await algorand.network.getLastRound()
|
|
161
|
+
*
|
|
162
|
+
* // Wait for a specific round
|
|
163
|
+
* await algorand.network.waitUntilRound(1000n)
|
|
164
|
+
*
|
|
165
|
+
* // LocalNet-specific: block warp
|
|
166
|
+
* await algorand.network.localNet.blockWarp(100n)
|
|
167
|
+
* ```
|
|
168
|
+
*/
|
|
169
|
+
get network(): NetworkManager;
|
|
151
170
|
/**
|
|
152
171
|
* Register a function that will be used to transform an error caught when simulating or executing
|
|
153
172
|
* composed transaction groups made from `newGroup`
|
package/algorand-client.js
CHANGED
|
@@ -8,6 +8,7 @@ const require_algorand_client_transaction_creator = require('./algorand-client-t
|
|
|
8
8
|
const require_algorand_client_transaction_sender = require('./algorand-client-transaction-sender.js');
|
|
9
9
|
const require_app_deployer = require('./app-deployer.js');
|
|
10
10
|
const require_asset_manager = require('./asset-manager.js');
|
|
11
|
+
const require_network_manager = require('./network-manager.js');
|
|
11
12
|
|
|
12
13
|
//#region src/algorand-client.ts
|
|
13
14
|
/**
|
|
@@ -19,6 +20,7 @@ var AlgorandClient = class AlgorandClient {
|
|
|
19
20
|
_appManager;
|
|
20
21
|
_appDeployer;
|
|
21
22
|
_assetManager;
|
|
23
|
+
_networkManager;
|
|
22
24
|
_transactionSender;
|
|
23
25
|
_transactionCreator;
|
|
24
26
|
_cachedSuggestedParams;
|
|
@@ -36,6 +38,7 @@ var AlgorandClient = class AlgorandClient {
|
|
|
36
38
|
this._accountManager = new require_account_manager.AccountManager(this._clientManager, { ed25519Generator: config.ed25519Generator ?? require_ed25519.nobleEd25519Generator });
|
|
37
39
|
this._appManager = new require_app_manager.AppManager(this._clientManager.algod);
|
|
38
40
|
this._assetManager = new require_asset_manager.AssetManager(this._clientManager.algod, (config) => this.newGroup(config));
|
|
41
|
+
this._networkManager = new require_network_manager.NetworkManager(this._clientManager.algod, this);
|
|
39
42
|
this._transactionSender = new require_algorand_client_transaction_sender.AlgorandClientTransactionSender((config) => this.newGroup(config), this._assetManager, this._appManager);
|
|
40
43
|
this._transactionCreator = new require_algorand_client_transaction_creator.AlgorandClientTransactionCreator((config) => this.newGroup(config));
|
|
41
44
|
this._appDeployer = new require_app_deployer.AppDeployer(this._appManager, this._transactionSender, this._clientManager.indexerIfPresent);
|
|
@@ -187,6 +190,25 @@ var AlgorandClient = class AlgorandClient {
|
|
|
187
190
|
return this._appDeployer;
|
|
188
191
|
}
|
|
189
192
|
/**
|
|
193
|
+
* Methods for interacting with the network.
|
|
194
|
+
* Provides utilities for querying blockchain state and waiting for specific conditions.
|
|
195
|
+
* @returns The `NetworkManager` instance.
|
|
196
|
+
* @example
|
|
197
|
+
* ```typescript
|
|
198
|
+
* // Get last round
|
|
199
|
+
* const lastRound = await algorand.network.getLastRound()
|
|
200
|
+
*
|
|
201
|
+
* // Wait for a specific round
|
|
202
|
+
* await algorand.network.waitUntilRound(1000n)
|
|
203
|
+
*
|
|
204
|
+
* // LocalNet-specific: block warp
|
|
205
|
+
* await algorand.network.localNet.blockWarp(100n)
|
|
206
|
+
* ```
|
|
207
|
+
*/
|
|
208
|
+
get network() {
|
|
209
|
+
return this._networkManager;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
190
212
|
* Register a function that will be used to transform an error caught when simulating or executing
|
|
191
213
|
* composed transaction groups made from `newGroup`
|
|
192
214
|
*/
|
package/algorand-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"algorand-client.js","names":["ClientManager","AccountManager","nobleEd25519Generator","AppManager","AssetManager","AlgorandClientTransactionSender","AlgorandClientTransactionCreator","AppDeployer","TransactionComposer"],"sources":["../src/algorand-client.ts"],"sourcesContent":["import { SuggestedParams } from '@algorandfoundation/algokit-algod-client'\nimport { Address, ReadableAddress } from '@algorandfoundation/algokit-common'\nimport { AddressWithTransactionSigner, LogicSigAccount, TransactionSigner, MultisigAccount } from '@algorandfoundation/algokit-transact'\nimport { AccountManager, AccountManagerConfig } from './account-manager'\nimport { AlgorandClientTransactionCreator } from './algorand-client-transaction-creator'\nimport { AlgorandClientTransactionSender } from './algorand-client-transaction-sender'\nimport { AppDeployer } from './app-deployer'\nimport { AppManager } from './app-manager'\nimport { AssetManager } from './asset-manager'\nimport { AlgoSdkClients, ClientManager } from './client-manager'\nimport { ErrorTransformer, TransactionComposer, TransactionComposerConfig } from './composer'\nimport { AlgoConfig } from './network-client'\nimport { nobleEd25519Generator } from '@algorandfoundation/algokit-crypto'\n\n\n/**\n * A client that brokers easy access to Algorand functionality.\n */\nexport class AlgorandClient {\n private _clientManager: ClientManager\n private _accountManager: AccountManager\n private _appManager: AppManager\n private _appDeployer: AppDeployer\n private _assetManager: AssetManager\n private _transactionSender: AlgorandClientTransactionSender\n private _transactionCreator: AlgorandClientTransactionCreator\n\n private _cachedSuggestedParams?: SuggestedParams\n private _cachedSuggestedParamsExpiry?: Date\n private _cachedSuggestedParamsTimeout: number = 3_000 // three seconds\n\n private _defaultValidityWindow: bigint | undefined = undefined\n\n /**\n * A set of error transformers to use when an error is caught in simulate or execute\n * `registerErrorTransformer` and `unregisterErrorTransformer` can be used to add and remove\n * error transformers from the set.\n */\n private _errorTransformers: Set<ErrorTransformer> = new Set()\n\n private constructor(config: (AlgoConfig | AlgoSdkClients) & Partial<AccountManagerConfig>) {\n this._clientManager = new ClientManager(config, this)\n this._accountManager = new AccountManager(this._clientManager, { ed25519Generator: config.ed25519Generator ?? nobleEd25519Generator })\n this._appManager = new AppManager(this._clientManager.algod)\n this._assetManager = new AssetManager(this._clientManager.algod, (config) => this.newGroup(config))\n this._transactionSender = new AlgorandClientTransactionSender((config) => this.newGroup(config), this._assetManager, this._appManager)\n this._transactionCreator = new AlgorandClientTransactionCreator((config) => this.newGroup(config))\n this._appDeployer = new AppDeployer(this._appManager, this._transactionSender, this._clientManager.indexerIfPresent)\n }\n\n /**\n * Sets the default validity window for transactions.\n * @param validityWindow The number of rounds between the first and last valid rounds\n * @returns The `AlgorandClient` so method calls can be chained\n * @example\n * ```typescript\n * const algorand = AlgorandClient.mainNet().setDefaultValidityWindow(1000);\n * ```\n */\n public setDefaultValidityWindow(validityWindow: number | bigint) {\n this._defaultValidityWindow = BigInt(validityWindow)\n return this\n }\n\n /**\n * Sets the default signer to use if no other signer is specified.\n * @param signer The signer to use, either a `TransactionSigner` or a `AddressWithSigner`\n * @returns The `AlgorandClient` so method calls can be chained\n * @example\n * ```typescript\n * const signer = new SigningAccount(account, account.addr)\n * const algorand = AlgorandClient.mainNet().setDefaultSigner(signer)\n * ```\n */\n public setDefaultSigner(signer: TransactionSigner | AddressWithTransactionSigner): AlgorandClient {\n this._accountManager.setDefaultSigner(signer)\n return this\n }\n\n /**\n * Tracks the given account (object that encapsulates an address and a signer) for later signing.\n * @param account The account to register, which can be a `AddressWithSigner` or\n * a `algosdk.Account`, `algosdk.LogicSigAccount`, `SigningAccount` or `MultisigAccount`\n * @example\n * ```typescript\n * const accountManager = AlgorandClient.mainNet()\n * .setSignerFromAccount(algosdk.generateAccount())\n * .setSignerFromAccount(new algosdk.LogicSigAccount(program, args))\n * .setSignerFromAccount(new SigningAccount(account, sender))\n * .setSignerFromAccount(new MultisigAccount({version: 1, threshold: 1, addrs: [\"ADDRESS1...\", \"ADDRESS2...\"]}, [account1, account2]))\n * .setSignerFromAccount({addr: \"SENDERADDRESS\", signer: transactionSigner})\n * ```\n * @returns The `AlgorandClient` so method calls can be chained\n */\n public setSignerFromAccount(account: AddressWithTransactionSigner | LogicSigAccount | MultisigAccount) {\n this._accountManager.setSignerFromAccount(account)\n return this\n }\n\n /**\n * Tracks the given signer against the given sender for later signing.\n * @param sender The sender address to use this signer for\n * @param signer The signer to sign transactions with for the given sender\n * @returns The `AlgorandClient` so method calls can be chained\n * @example\n * ```typescript\n * const signer = new SigningAccount(account, account.addr)\n * const algorand = AlgorandClient.mainNet().setSigner(signer.addr, signer.signer)\n * ```\n */\n public setSigner(sender: string | Address, signer: TransactionSigner) {\n this._accountManager.setSigner(sender, signer)\n return this\n }\n\n /**\n * Sets a cache value to use for suggested transaction params.\n * @param suggestedParams The suggested params to use\n * @param until A date until which to cache, or if not specified then the timeout is used\n * @returns The `AlgorandClient` so method calls can be chained\n * @example\n * ```typescript\n * const algorand = AlgorandClient.mainNet().setSuggestedParamsCache(suggestedParams, new Date(+new Date() + 3_600_000))\n * ```\n */\n public setSuggestedParamsCache(suggestedParams: SuggestedParams, until?: Date) {\n this._cachedSuggestedParams = suggestedParams\n this._cachedSuggestedParamsExpiry = until ?? new Date(+new Date() + this._cachedSuggestedParamsTimeout)\n return this\n }\n\n /**\n * Sets the timeout for caching suggested params.\n * @param timeout The timeout in milliseconds\n * @returns The `AlgorandClient` so method calls can be chained\n * @example\n * ```typescript\n * const algorand = AlgorandClient.mainNet().setSuggestedParamsCacheTimeout(10_000)\n * ```\n */\n public setSuggestedParamsCacheTimeout(timeout: number) {\n this._cachedSuggestedParamsTimeout = timeout\n return this\n }\n\n /**\n * Get suggested params for a transaction (either cached or from algod if the cache is stale or empty)\n * @returns The suggested transaction parameters.\n * @example\n * const params = await AlgorandClient.mainNet().getSuggestedParams();\n */\n public async getSuggestedParams(): Promise<SuggestedParams> {\n if (this._cachedSuggestedParams && (!this._cachedSuggestedParamsExpiry || this._cachedSuggestedParamsExpiry > new Date())) {\n return {\n ...this._cachedSuggestedParams,\n }\n }\n\n this._cachedSuggestedParams = await this._clientManager.algod.suggestedParams()\n this._cachedSuggestedParamsExpiry = new Date(new Date().getTime() + this._cachedSuggestedParamsTimeout)\n\n return {\n ...this._cachedSuggestedParams,\n }\n }\n\n /**\n * Get clients, including algosdk clients and app clients.\n * @returns The `ClientManager` instance.\n * @example\n * const clientManager = AlgorandClient.mainNet().client;\n */\n public get client() {\n return this._clientManager\n }\n\n /**\n * Get or create accounts that can sign transactions.\n * @returns The `AccountManager` instance.\n * @example\n * const accountManager = AlgorandClient.mainNet().account;\n */\n public get account() {\n return this._accountManager\n }\n\n /**\n * Methods for interacting with assets.\n * @returns The `AssetManager` instance.\n * @example\n * const assetManager = AlgorandClient.mainNet().asset;\n */\n public get asset() {\n return this._assetManager\n }\n\n /**\n * Methods for interacting with apps.\n * @returns The `AppManager` instance.\n * @example\n * const appManager = AlgorandClient.mainNet().app;\n */\n public get app() {\n return this._appManager\n }\n\n /**\n * Methods for deploying apps and managing app deployment metadata.\n * @returns The `AppDeployer` instance.\n * @example\n * const deployer = AlgorandClient.mainNet().appDeployer;\n */\n public get appDeployer() {\n return this._appDeployer\n }\n\n /**\n * Register a function that will be used to transform an error caught when simulating or executing\n * composed transaction groups made from `newGroup`\n */\n public registerErrorTransformer(transformer: ErrorTransformer) {\n this._errorTransformers.add(transformer)\n }\n\n public unregisterErrorTransformer(transformer: ErrorTransformer) {\n this._errorTransformers.delete(transformer)\n }\n\n /** Start a new `TransactionComposer` transaction group\n * @returns A new instance of `TransactionComposer`.\n * @example\n * {@includeCode ./algorand-client.spec.ts#example-newGroup}\n * @see [Full working example](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/algorand-client.spec.ts)\n */\n public newGroup(composerConfig?: TransactionComposerConfig) {\n return new TransactionComposer({\n algod: this.client.algod,\n getSigner: (addr: ReadableAddress) => this.account.getSigner(addr),\n getSuggestedParams: () => this.getSuggestedParams(),\n defaultValidityWindow: this._defaultValidityWindow,\n appManager: this._appManager,\n errorTransformers: [...this._errorTransformers],\n composerConfig: composerConfig,\n })\n }\n\n /**\n * Methods for sending a transaction.\n * @returns The `AlgorandClientTransactionSender` instance.\n * @example\n * const result = await AlgorandClient.mainNet().send.payment({\n * sender: \"SENDERADDRESS\",\n * receiver: \"RECEIVERADDRESS\",\n * amount: algo(1)\n * })\n */\n public get send() {\n return this._transactionSender\n }\n\n /**\n * Methods for creating a transaction.\n * @returns The `AlgorandClientTransactionCreator` instance.\n * @example\n * const payment = await AlgorandClient.mainNet().createTransaction.payment({\n * sender: \"SENDERADDRESS\",\n * receiver: \"RECEIVERADDRESS\",\n * amount: algo(1)\n * })\n */\n public get createTransaction() {\n return this._transactionCreator\n }\n\n // Static methods to create an `AlgorandClient`\n\n /**\n * Creates an `AlgorandClient` pointing at default LocalNet ports and API token.\n * @returns An instance of the `AlgorandClient`.\n * @example\n * {@includeCode ./algorand-client.spec.ts#example-defaultLocalNet}\n * @see [Full working example](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/algorand-client.spec.ts)\n */\n public static defaultLocalNet() {\n return new AlgorandClient({\n algodConfig: ClientManager.getDefaultLocalNetConfig('algod'),\n indexerConfig: ClientManager.getDefaultLocalNetConfig('indexer'),\n kmdConfig: ClientManager.getDefaultLocalNetConfig('kmd'),\n })\n }\n\n /**\n * Creates an `AlgorandClient` pointing at TestNet using AlgoNode.\n * @returns An instance of the `AlgorandClient`.\n * @example\n * const algorand = AlgorandClient.testNet();\n */\n public static testNet() {\n return new AlgorandClient({\n algodConfig: ClientManager.getAlgoNodeConfig('testnet', 'algod'),\n indexerConfig: ClientManager.getAlgoNodeConfig('testnet', 'indexer'),\n kmdConfig: undefined,\n })\n }\n\n /**\n * Creates an `AlgorandClient` pointing at MainNet using AlgoNode.\n * @returns An instance of the `AlgorandClient`.\n * @example\n * const algorand = AlgorandClient.mainNet();\n */\n public static mainNet() {\n return new AlgorandClient({\n algodConfig: ClientManager.getAlgoNodeConfig('mainnet', 'algod'),\n indexerConfig: ClientManager.getAlgoNodeConfig('mainnet', 'indexer'),\n kmdConfig: undefined,\n })\n }\n\n /**\n * Creates an `AlgorandClient` pointing to the given client(s).\n * @param clients The clients to use.\n * @returns An instance of the `AlgorandClient`.\n * @example\n * const algorand = AlgorandClient.fromClients({ algod, indexer, kmd });\n */\n public static fromClients(clients: AlgoSdkClients) {\n return new AlgorandClient(clients)\n }\n\n /**\n * Creates an `AlgorandClient` loading the configuration from environment variables.\n *\n * Retrieve configurations from environment variables when defined or get default LocalNet configuration if they aren't defined.\n *\n * Expects to be called from a Node.js environment.\n *\n * If `process.env.ALGOD_SERVER` is defined it will use that along with optional `process.env.ALGOD_PORT` and `process.env.ALGOD_TOKEN`.\n *\n * If `process.env.INDEXER_SERVER` is defined it will use that along with optional `process.env.INDEXER_PORT` and `process.env.INDEXER_TOKEN`.\n *\n * If either aren't defined it will use the default LocalNet config.\n *\n * It will return a KMD configuration that uses `process.env.KMD_PORT` (or port 4002) if `process.env.ALGOD_SERVER` is defined,\n * otherwise it will use the default LocalNet config unless it detects testnet or mainnet.\n * @returns An instance of the `AlgorandClient`.\n * @example\n * const client = AlgorandClient.fromEnvironment();\n */\n public static fromEnvironment() {\n return new AlgorandClient(ClientManager.getConfigFromEnvironmentOrLocalNet())\n }\n\n /**\n * Creates an `AlgorandClient` from the given config.\n * @param config The config to use.\n * @returns An instance of the `AlgorandClient`.\n * @example\n * const client = AlgorandClient.fromConfig({ algodConfig, indexerConfig, kmdConfig });\n */\n public static fromConfig(config: AlgoConfig) {\n return new AlgorandClient(config)\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"algorand-client.js","names":["ClientManager","AccountManager","nobleEd25519Generator","AppManager","AssetManager","NetworkManager","AlgorandClientTransactionSender","AlgorandClientTransactionCreator","AppDeployer","TransactionComposer"],"sources":["../src/algorand-client.ts"],"sourcesContent":["import { SuggestedParams } from '@algorandfoundation/algokit-algod-client'\nimport { Address, ReadableAddress } from '@algorandfoundation/algokit-common'\nimport { nobleEd25519Generator } from '@algorandfoundation/algokit-crypto'\nimport { AddressWithTransactionSigner, LogicSigAccount, MultisigAccount, TransactionSigner } from '@algorandfoundation/algokit-transact'\nimport { AccountManager, AccountManagerConfig } from './account-manager'\nimport { AlgorandClientTransactionCreator } from './algorand-client-transaction-creator'\nimport { AlgorandClientTransactionSender } from './algorand-client-transaction-sender'\nimport { AppDeployer } from './app-deployer'\nimport { AppManager } from './app-manager'\nimport { AssetManager } from './asset-manager'\nimport { AlgoSdkClients, ClientManager } from './client-manager'\nimport { ErrorTransformer, TransactionComposer, TransactionComposerConfig } from './composer'\nimport { AlgoConfig } from './network-client'\nimport { NetworkManager } from './network-manager'\n\n/**\n * A client that brokers easy access to Algorand functionality.\n */\nexport class AlgorandClient {\n private _clientManager: ClientManager\n private _accountManager: AccountManager\n private _appManager: AppManager\n private _appDeployer: AppDeployer\n private _assetManager: AssetManager\n private _networkManager: NetworkManager\n private _transactionSender: AlgorandClientTransactionSender\n private _transactionCreator: AlgorandClientTransactionCreator\n\n private _cachedSuggestedParams?: SuggestedParams\n private _cachedSuggestedParamsExpiry?: Date\n private _cachedSuggestedParamsTimeout: number = 3_000 // three seconds\n\n private _defaultValidityWindow: bigint | undefined = undefined\n\n /**\n * A set of error transformers to use when an error is caught in simulate or execute\n * `registerErrorTransformer` and `unregisterErrorTransformer` can be used to add and remove\n * error transformers from the set.\n */\n private _errorTransformers: Set<ErrorTransformer> = new Set()\n\n private constructor(config: (AlgoConfig | AlgoSdkClients) & Partial<AccountManagerConfig>) {\n this._clientManager = new ClientManager(config, this)\n this._accountManager = new AccountManager(this._clientManager, { ed25519Generator: config.ed25519Generator ?? nobleEd25519Generator })\n this._appManager = new AppManager(this._clientManager.algod)\n this._assetManager = new AssetManager(this._clientManager.algod, (config) => this.newGroup(config))\n this._networkManager = new NetworkManager(this._clientManager.algod, this)\n this._transactionSender = new AlgorandClientTransactionSender((config) => this.newGroup(config), this._assetManager, this._appManager)\n this._transactionCreator = new AlgorandClientTransactionCreator((config) => this.newGroup(config))\n this._appDeployer = new AppDeployer(this._appManager, this._transactionSender, this._clientManager.indexerIfPresent)\n }\n\n /**\n * Sets the default validity window for transactions.\n * @param validityWindow The number of rounds between the first and last valid rounds\n * @returns The `AlgorandClient` so method calls can be chained\n * @example\n * ```typescript\n * const algorand = AlgorandClient.mainNet().setDefaultValidityWindow(1000);\n * ```\n */\n public setDefaultValidityWindow(validityWindow: number | bigint) {\n this._defaultValidityWindow = BigInt(validityWindow)\n return this\n }\n\n /**\n * Sets the default signer to use if no other signer is specified.\n * @param signer The signer to use, either a `TransactionSigner` or a `AddressWithSigner`\n * @returns The `AlgorandClient` so method calls can be chained\n * @example\n * ```typescript\n * const signer = new SigningAccount(account, account.addr)\n * const algorand = AlgorandClient.mainNet().setDefaultSigner(signer)\n * ```\n */\n public setDefaultSigner(signer: TransactionSigner | AddressWithTransactionSigner): AlgorandClient {\n this._accountManager.setDefaultSigner(signer)\n return this\n }\n\n /**\n * Tracks the given account (object that encapsulates an address and a signer) for later signing.\n * @param account The account to register, which can be a `AddressWithSigner` or\n * a `algosdk.Account`, `algosdk.LogicSigAccount`, `SigningAccount` or `MultisigAccount`\n * @example\n * ```typescript\n * const accountManager = AlgorandClient.mainNet()\n * .setSignerFromAccount(algosdk.generateAccount())\n * .setSignerFromAccount(new algosdk.LogicSigAccount(program, args))\n * .setSignerFromAccount(new SigningAccount(account, sender))\n * .setSignerFromAccount(new MultisigAccount({version: 1, threshold: 1, addrs: [\"ADDRESS1...\", \"ADDRESS2...\"]}, [account1, account2]))\n * .setSignerFromAccount({addr: \"SENDERADDRESS\", signer: transactionSigner})\n * ```\n * @returns The `AlgorandClient` so method calls can be chained\n */\n public setSignerFromAccount(account: AddressWithTransactionSigner | LogicSigAccount | MultisigAccount) {\n this._accountManager.setSignerFromAccount(account)\n return this\n }\n\n /**\n * Tracks the given signer against the given sender for later signing.\n * @param sender The sender address to use this signer for\n * @param signer The signer to sign transactions with for the given sender\n * @returns The `AlgorandClient` so method calls can be chained\n * @example\n * ```typescript\n * const signer = new SigningAccount(account, account.addr)\n * const algorand = AlgorandClient.mainNet().setSigner(signer.addr, signer.signer)\n * ```\n */\n public setSigner(sender: string | Address, signer: TransactionSigner) {\n this._accountManager.setSigner(sender, signer)\n return this\n }\n\n /**\n * Sets a cache value to use for suggested transaction params.\n * @param suggestedParams The suggested params to use\n * @param until A date until which to cache, or if not specified then the timeout is used\n * @returns The `AlgorandClient` so method calls can be chained\n * @example\n * ```typescript\n * const algorand = AlgorandClient.mainNet().setSuggestedParamsCache(suggestedParams, new Date(+new Date() + 3_600_000))\n * ```\n */\n public setSuggestedParamsCache(suggestedParams: SuggestedParams, until?: Date) {\n this._cachedSuggestedParams = suggestedParams\n this._cachedSuggestedParamsExpiry = until ?? new Date(+new Date() + this._cachedSuggestedParamsTimeout)\n return this\n }\n\n /**\n * Sets the timeout for caching suggested params.\n * @param timeout The timeout in milliseconds\n * @returns The `AlgorandClient` so method calls can be chained\n * @example\n * ```typescript\n * const algorand = AlgorandClient.mainNet().setSuggestedParamsCacheTimeout(10_000)\n * ```\n */\n public setSuggestedParamsCacheTimeout(timeout: number) {\n this._cachedSuggestedParamsTimeout = timeout\n return this\n }\n\n /**\n * Get suggested params for a transaction (either cached or from algod if the cache is stale or empty)\n * @returns The suggested transaction parameters.\n * @example\n * const params = await AlgorandClient.mainNet().getSuggestedParams();\n */\n public async getSuggestedParams(): Promise<SuggestedParams> {\n if (this._cachedSuggestedParams && (!this._cachedSuggestedParamsExpiry || this._cachedSuggestedParamsExpiry > new Date())) {\n return {\n ...this._cachedSuggestedParams,\n }\n }\n\n this._cachedSuggestedParams = await this._clientManager.algod.suggestedParams()\n this._cachedSuggestedParamsExpiry = new Date(new Date().getTime() + this._cachedSuggestedParamsTimeout)\n\n return {\n ...this._cachedSuggestedParams,\n }\n }\n\n /**\n * Get clients, including algosdk clients and app clients.\n * @returns The `ClientManager` instance.\n * @example\n * const clientManager = AlgorandClient.mainNet().client;\n */\n public get client() {\n return this._clientManager\n }\n\n /**\n * Get or create accounts that can sign transactions.\n * @returns The `AccountManager` instance.\n * @example\n * const accountManager = AlgorandClient.mainNet().account;\n */\n public get account() {\n return this._accountManager\n }\n\n /**\n * Methods for interacting with assets.\n * @returns The `AssetManager` instance.\n * @example\n * const assetManager = AlgorandClient.mainNet().asset;\n */\n public get asset() {\n return this._assetManager\n }\n\n /**\n * Methods for interacting with apps.\n * @returns The `AppManager` instance.\n * @example\n * const appManager = AlgorandClient.mainNet().app;\n */\n public get app() {\n return this._appManager\n }\n\n /**\n * Methods for deploying apps and managing app deployment metadata.\n * @returns The `AppDeployer` instance.\n * @example\n * const deployer = AlgorandClient.mainNet().appDeployer;\n */\n public get appDeployer() {\n return this._appDeployer\n }\n\n /**\n * Methods for interacting with the network.\n * Provides utilities for querying blockchain state and waiting for specific conditions.\n * @returns The `NetworkManager` instance.\n * @example\n * ```typescript\n * // Get last round\n * const lastRound = await algorand.network.getLastRound()\n *\n * // Wait for a specific round\n * await algorand.network.waitUntilRound(1000n)\n *\n * // LocalNet-specific: block warp\n * await algorand.network.localNet.blockWarp(100n)\n * ```\n */\n public get network() {\n return this._networkManager\n }\n\n /**\n * Register a function that will be used to transform an error caught when simulating or executing\n * composed transaction groups made from `newGroup`\n */\n public registerErrorTransformer(transformer: ErrorTransformer) {\n this._errorTransformers.add(transformer)\n }\n\n public unregisterErrorTransformer(transformer: ErrorTransformer) {\n this._errorTransformers.delete(transformer)\n }\n\n /** Start a new `TransactionComposer` transaction group\n * @returns A new instance of `TransactionComposer`.\n * @example\n * {@includeCode ./algorand-client.spec.ts#example-newGroup}\n * @see [Full working example](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/algorand-client.spec.ts)\n */\n public newGroup(composerConfig?: TransactionComposerConfig) {\n return new TransactionComposer({\n algod: this.client.algod,\n getSigner: (addr: ReadableAddress) => this.account.getSigner(addr),\n getSuggestedParams: () => this.getSuggestedParams(),\n defaultValidityWindow: this._defaultValidityWindow,\n appManager: this._appManager,\n errorTransformers: [...this._errorTransformers],\n composerConfig: composerConfig,\n })\n }\n\n /**\n * Methods for sending a transaction.\n * @returns The `AlgorandClientTransactionSender` instance.\n * @example\n * const result = await AlgorandClient.mainNet().send.payment({\n * sender: \"SENDERADDRESS\",\n * receiver: \"RECEIVERADDRESS\",\n * amount: algo(1)\n * })\n */\n public get send() {\n return this._transactionSender\n }\n\n /**\n * Methods for creating a transaction.\n * @returns The `AlgorandClientTransactionCreator` instance.\n * @example\n * const payment = await AlgorandClient.mainNet().createTransaction.payment({\n * sender: \"SENDERADDRESS\",\n * receiver: \"RECEIVERADDRESS\",\n * amount: algo(1)\n * })\n */\n public get createTransaction() {\n return this._transactionCreator\n }\n\n // Static methods to create an `AlgorandClient`\n\n /**\n * Creates an `AlgorandClient` pointing at default LocalNet ports and API token.\n * @returns An instance of the `AlgorandClient`.\n * @example\n * {@includeCode ./algorand-client.spec.ts#example-defaultLocalNet}\n * @see [Full working example](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/algorand-client.spec.ts)\n */\n public static defaultLocalNet() {\n return new AlgorandClient({\n algodConfig: ClientManager.getDefaultLocalNetConfig('algod'),\n indexerConfig: ClientManager.getDefaultLocalNetConfig('indexer'),\n kmdConfig: ClientManager.getDefaultLocalNetConfig('kmd'),\n })\n }\n\n /**\n * Creates an `AlgorandClient` pointing at TestNet using AlgoNode.\n * @returns An instance of the `AlgorandClient`.\n * @example\n * const algorand = AlgorandClient.testNet();\n */\n public static testNet() {\n return new AlgorandClient({\n algodConfig: ClientManager.getAlgoNodeConfig('testnet', 'algod'),\n indexerConfig: ClientManager.getAlgoNodeConfig('testnet', 'indexer'),\n kmdConfig: undefined,\n })\n }\n\n /**\n * Creates an `AlgorandClient` pointing at MainNet using AlgoNode.\n * @returns An instance of the `AlgorandClient`.\n * @example\n * const algorand = AlgorandClient.mainNet();\n */\n public static mainNet() {\n return new AlgorandClient({\n algodConfig: ClientManager.getAlgoNodeConfig('mainnet', 'algod'),\n indexerConfig: ClientManager.getAlgoNodeConfig('mainnet', 'indexer'),\n kmdConfig: undefined,\n })\n }\n\n /**\n * Creates an `AlgorandClient` pointing to the given client(s).\n * @param clients The clients to use.\n * @returns An instance of the `AlgorandClient`.\n * @example\n * const algorand = AlgorandClient.fromClients({ algod, indexer, kmd });\n */\n public static fromClients(clients: AlgoSdkClients) {\n return new AlgorandClient(clients)\n }\n\n /**\n * Creates an `AlgorandClient` loading the configuration from environment variables.\n *\n * Retrieve configurations from environment variables when defined or get default LocalNet configuration if they aren't defined.\n *\n * Expects to be called from a Node.js environment.\n *\n * If `process.env.ALGOD_SERVER` is defined it will use that along with optional `process.env.ALGOD_PORT` and `process.env.ALGOD_TOKEN`.\n *\n * If `process.env.INDEXER_SERVER` is defined it will use that along with optional `process.env.INDEXER_PORT` and `process.env.INDEXER_TOKEN`.\n *\n * If either aren't defined it will use the default LocalNet config.\n *\n * It will return a KMD configuration that uses `process.env.KMD_PORT` (or port 4002) if `process.env.ALGOD_SERVER` is defined,\n * otherwise it will use the default LocalNet config unless it detects testnet or mainnet.\n * @returns An instance of the `AlgorandClient`.\n * @example\n * const client = AlgorandClient.fromEnvironment();\n */\n public static fromEnvironment() {\n return new AlgorandClient(ClientManager.getConfigFromEnvironmentOrLocalNet())\n }\n\n /**\n * Creates an `AlgorandClient` from the given config.\n * @param config The config to use.\n * @returns An instance of the `AlgorandClient`.\n * @example\n * const client = AlgorandClient.fromConfig({ algodConfig, indexerConfig, kmdConfig });\n */\n public static fromConfig(config: AlgoConfig) {\n return new AlgorandClient(config)\n }\n}\n"],"mappings":"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"}
|
package/algorand-client.mjs
CHANGED
|
@@ -7,6 +7,7 @@ import { AlgorandClientTransactionCreator } from "./algorand-client-transaction-
|
|
|
7
7
|
import { AlgorandClientTransactionSender } from "./algorand-client-transaction-sender.mjs";
|
|
8
8
|
import { AppDeployer } from "./app-deployer.mjs";
|
|
9
9
|
import { AssetManager } from "./asset-manager.mjs";
|
|
10
|
+
import { NetworkManager } from "./network-manager.mjs";
|
|
10
11
|
|
|
11
12
|
//#region src/algorand-client.ts
|
|
12
13
|
/**
|
|
@@ -18,6 +19,7 @@ var AlgorandClient = class AlgorandClient {
|
|
|
18
19
|
_appManager;
|
|
19
20
|
_appDeployer;
|
|
20
21
|
_assetManager;
|
|
22
|
+
_networkManager;
|
|
21
23
|
_transactionSender;
|
|
22
24
|
_transactionCreator;
|
|
23
25
|
_cachedSuggestedParams;
|
|
@@ -35,6 +37,7 @@ var AlgorandClient = class AlgorandClient {
|
|
|
35
37
|
this._accountManager = new AccountManager(this._clientManager, { ed25519Generator: config.ed25519Generator ?? nobleEd25519Generator });
|
|
36
38
|
this._appManager = new AppManager(this._clientManager.algod);
|
|
37
39
|
this._assetManager = new AssetManager(this._clientManager.algod, (config) => this.newGroup(config));
|
|
40
|
+
this._networkManager = new NetworkManager(this._clientManager.algod, this);
|
|
38
41
|
this._transactionSender = new AlgorandClientTransactionSender((config) => this.newGroup(config), this._assetManager, this._appManager);
|
|
39
42
|
this._transactionCreator = new AlgorandClientTransactionCreator((config) => this.newGroup(config));
|
|
40
43
|
this._appDeployer = new AppDeployer(this._appManager, this._transactionSender, this._clientManager.indexerIfPresent);
|
|
@@ -186,6 +189,25 @@ var AlgorandClient = class AlgorandClient {
|
|
|
186
189
|
return this._appDeployer;
|
|
187
190
|
}
|
|
188
191
|
/**
|
|
192
|
+
* Methods for interacting with the network.
|
|
193
|
+
* Provides utilities for querying blockchain state and waiting for specific conditions.
|
|
194
|
+
* @returns The `NetworkManager` instance.
|
|
195
|
+
* @example
|
|
196
|
+
* ```typescript
|
|
197
|
+
* // Get last round
|
|
198
|
+
* const lastRound = await algorand.network.getLastRound()
|
|
199
|
+
*
|
|
200
|
+
* // Wait for a specific round
|
|
201
|
+
* await algorand.network.waitUntilRound(1000n)
|
|
202
|
+
*
|
|
203
|
+
* // LocalNet-specific: block warp
|
|
204
|
+
* await algorand.network.localNet.blockWarp(100n)
|
|
205
|
+
* ```
|
|
206
|
+
*/
|
|
207
|
+
get network() {
|
|
208
|
+
return this._networkManager;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
189
211
|
* Register a function that will be used to transform an error caught when simulating or executing
|
|
190
212
|
* composed transaction groups made from `newGroup`
|
|
191
213
|
*/
|
package/algorand-client.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"algorand-client.mjs","names":[],"sources":["../src/algorand-client.ts"],"sourcesContent":["import { SuggestedParams } from '@algorandfoundation/algokit-algod-client'\nimport { Address, ReadableAddress } from '@algorandfoundation/algokit-common'\nimport { AddressWithTransactionSigner, LogicSigAccount, TransactionSigner, MultisigAccount } from '@algorandfoundation/algokit-transact'\nimport { AccountManager, AccountManagerConfig } from './account-manager'\nimport { AlgorandClientTransactionCreator } from './algorand-client-transaction-creator'\nimport { AlgorandClientTransactionSender } from './algorand-client-transaction-sender'\nimport { AppDeployer } from './app-deployer'\nimport { AppManager } from './app-manager'\nimport { AssetManager } from './asset-manager'\nimport { AlgoSdkClients, ClientManager } from './client-manager'\nimport { ErrorTransformer, TransactionComposer, TransactionComposerConfig } from './composer'\nimport { AlgoConfig } from './network-client'\nimport { nobleEd25519Generator } from '@algorandfoundation/algokit-crypto'\n\n\n/**\n * A client that brokers easy access to Algorand functionality.\n */\nexport class AlgorandClient {\n private _clientManager: ClientManager\n private _accountManager: AccountManager\n private _appManager: AppManager\n private _appDeployer: AppDeployer\n private _assetManager: AssetManager\n private _transactionSender: AlgorandClientTransactionSender\n private _transactionCreator: AlgorandClientTransactionCreator\n\n private _cachedSuggestedParams?: SuggestedParams\n private _cachedSuggestedParamsExpiry?: Date\n private _cachedSuggestedParamsTimeout: number = 3_000 // three seconds\n\n private _defaultValidityWindow: bigint | undefined = undefined\n\n /**\n * A set of error transformers to use when an error is caught in simulate or execute\n * `registerErrorTransformer` and `unregisterErrorTransformer` can be used to add and remove\n * error transformers from the set.\n */\n private _errorTransformers: Set<ErrorTransformer> = new Set()\n\n private constructor(config: (AlgoConfig | AlgoSdkClients) & Partial<AccountManagerConfig>) {\n this._clientManager = new ClientManager(config, this)\n this._accountManager = new AccountManager(this._clientManager, { ed25519Generator: config.ed25519Generator ?? nobleEd25519Generator })\n this._appManager = new AppManager(this._clientManager.algod)\n this._assetManager = new AssetManager(this._clientManager.algod, (config) => this.newGroup(config))\n this._transactionSender = new AlgorandClientTransactionSender((config) => this.newGroup(config), this._assetManager, this._appManager)\n this._transactionCreator = new AlgorandClientTransactionCreator((config) => this.newGroup(config))\n this._appDeployer = new AppDeployer(this._appManager, this._transactionSender, this._clientManager.indexerIfPresent)\n }\n\n /**\n * Sets the default validity window for transactions.\n * @param validityWindow The number of rounds between the first and last valid rounds\n * @returns The `AlgorandClient` so method calls can be chained\n * @example\n * ```typescript\n * const algorand = AlgorandClient.mainNet().setDefaultValidityWindow(1000);\n * ```\n */\n public setDefaultValidityWindow(validityWindow: number | bigint) {\n this._defaultValidityWindow = BigInt(validityWindow)\n return this\n }\n\n /**\n * Sets the default signer to use if no other signer is specified.\n * @param signer The signer to use, either a `TransactionSigner` or a `AddressWithSigner`\n * @returns The `AlgorandClient` so method calls can be chained\n * @example\n * ```typescript\n * const signer = new SigningAccount(account, account.addr)\n * const algorand = AlgorandClient.mainNet().setDefaultSigner(signer)\n * ```\n */\n public setDefaultSigner(signer: TransactionSigner | AddressWithTransactionSigner): AlgorandClient {\n this._accountManager.setDefaultSigner(signer)\n return this\n }\n\n /**\n * Tracks the given account (object that encapsulates an address and a signer) for later signing.\n * @param account The account to register, which can be a `AddressWithSigner` or\n * a `algosdk.Account`, `algosdk.LogicSigAccount`, `SigningAccount` or `MultisigAccount`\n * @example\n * ```typescript\n * const accountManager = AlgorandClient.mainNet()\n * .setSignerFromAccount(algosdk.generateAccount())\n * .setSignerFromAccount(new algosdk.LogicSigAccount(program, args))\n * .setSignerFromAccount(new SigningAccount(account, sender))\n * .setSignerFromAccount(new MultisigAccount({version: 1, threshold: 1, addrs: [\"ADDRESS1...\", \"ADDRESS2...\"]}, [account1, account2]))\n * .setSignerFromAccount({addr: \"SENDERADDRESS\", signer: transactionSigner})\n * ```\n * @returns The `AlgorandClient` so method calls can be chained\n */\n public setSignerFromAccount(account: AddressWithTransactionSigner | LogicSigAccount | MultisigAccount) {\n this._accountManager.setSignerFromAccount(account)\n return this\n }\n\n /**\n * Tracks the given signer against the given sender for later signing.\n * @param sender The sender address to use this signer for\n * @param signer The signer to sign transactions with for the given sender\n * @returns The `AlgorandClient` so method calls can be chained\n * @example\n * ```typescript\n * const signer = new SigningAccount(account, account.addr)\n * const algorand = AlgorandClient.mainNet().setSigner(signer.addr, signer.signer)\n * ```\n */\n public setSigner(sender: string | Address, signer: TransactionSigner) {\n this._accountManager.setSigner(sender, signer)\n return this\n }\n\n /**\n * Sets a cache value to use for suggested transaction params.\n * @param suggestedParams The suggested params to use\n * @param until A date until which to cache, or if not specified then the timeout is used\n * @returns The `AlgorandClient` so method calls can be chained\n * @example\n * ```typescript\n * const algorand = AlgorandClient.mainNet().setSuggestedParamsCache(suggestedParams, new Date(+new Date() + 3_600_000))\n * ```\n */\n public setSuggestedParamsCache(suggestedParams: SuggestedParams, until?: Date) {\n this._cachedSuggestedParams = suggestedParams\n this._cachedSuggestedParamsExpiry = until ?? new Date(+new Date() + this._cachedSuggestedParamsTimeout)\n return this\n }\n\n /**\n * Sets the timeout for caching suggested params.\n * @param timeout The timeout in milliseconds\n * @returns The `AlgorandClient` so method calls can be chained\n * @example\n * ```typescript\n * const algorand = AlgorandClient.mainNet().setSuggestedParamsCacheTimeout(10_000)\n * ```\n */\n public setSuggestedParamsCacheTimeout(timeout: number) {\n this._cachedSuggestedParamsTimeout = timeout\n return this\n }\n\n /**\n * Get suggested params for a transaction (either cached or from algod if the cache is stale or empty)\n * @returns The suggested transaction parameters.\n * @example\n * const params = await AlgorandClient.mainNet().getSuggestedParams();\n */\n public async getSuggestedParams(): Promise<SuggestedParams> {\n if (this._cachedSuggestedParams && (!this._cachedSuggestedParamsExpiry || this._cachedSuggestedParamsExpiry > new Date())) {\n return {\n ...this._cachedSuggestedParams,\n }\n }\n\n this._cachedSuggestedParams = await this._clientManager.algod.suggestedParams()\n this._cachedSuggestedParamsExpiry = new Date(new Date().getTime() + this._cachedSuggestedParamsTimeout)\n\n return {\n ...this._cachedSuggestedParams,\n }\n }\n\n /**\n * Get clients, including algosdk clients and app clients.\n * @returns The `ClientManager` instance.\n * @example\n * const clientManager = AlgorandClient.mainNet().client;\n */\n public get client() {\n return this._clientManager\n }\n\n /**\n * Get or create accounts that can sign transactions.\n * @returns The `AccountManager` instance.\n * @example\n * const accountManager = AlgorandClient.mainNet().account;\n */\n public get account() {\n return this._accountManager\n }\n\n /**\n * Methods for interacting with assets.\n * @returns The `AssetManager` instance.\n * @example\n * const assetManager = AlgorandClient.mainNet().asset;\n */\n public get asset() {\n return this._assetManager\n }\n\n /**\n * Methods for interacting with apps.\n * @returns The `AppManager` instance.\n * @example\n * const appManager = AlgorandClient.mainNet().app;\n */\n public get app() {\n return this._appManager\n }\n\n /**\n * Methods for deploying apps and managing app deployment metadata.\n * @returns The `AppDeployer` instance.\n * @example\n * const deployer = AlgorandClient.mainNet().appDeployer;\n */\n public get appDeployer() {\n return this._appDeployer\n }\n\n /**\n * Register a function that will be used to transform an error caught when simulating or executing\n * composed transaction groups made from `newGroup`\n */\n public registerErrorTransformer(transformer: ErrorTransformer) {\n this._errorTransformers.add(transformer)\n }\n\n public unregisterErrorTransformer(transformer: ErrorTransformer) {\n this._errorTransformers.delete(transformer)\n }\n\n /** Start a new `TransactionComposer` transaction group\n * @returns A new instance of `TransactionComposer`.\n * @example\n * {@includeCode ./algorand-client.spec.ts#example-newGroup}\n * @see [Full working example](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/algorand-client.spec.ts)\n */\n public newGroup(composerConfig?: TransactionComposerConfig) {\n return new TransactionComposer({\n algod: this.client.algod,\n getSigner: (addr: ReadableAddress) => this.account.getSigner(addr),\n getSuggestedParams: () => this.getSuggestedParams(),\n defaultValidityWindow: this._defaultValidityWindow,\n appManager: this._appManager,\n errorTransformers: [...this._errorTransformers],\n composerConfig: composerConfig,\n })\n }\n\n /**\n * Methods for sending a transaction.\n * @returns The `AlgorandClientTransactionSender` instance.\n * @example\n * const result = await AlgorandClient.mainNet().send.payment({\n * sender: \"SENDERADDRESS\",\n * receiver: \"RECEIVERADDRESS\",\n * amount: algo(1)\n * })\n */\n public get send() {\n return this._transactionSender\n }\n\n /**\n * Methods for creating a transaction.\n * @returns The `AlgorandClientTransactionCreator` instance.\n * @example\n * const payment = await AlgorandClient.mainNet().createTransaction.payment({\n * sender: \"SENDERADDRESS\",\n * receiver: \"RECEIVERADDRESS\",\n * amount: algo(1)\n * })\n */\n public get createTransaction() {\n return this._transactionCreator\n }\n\n // Static methods to create an `AlgorandClient`\n\n /**\n * Creates an `AlgorandClient` pointing at default LocalNet ports and API token.\n * @returns An instance of the `AlgorandClient`.\n * @example\n * {@includeCode ./algorand-client.spec.ts#example-defaultLocalNet}\n * @see [Full working example](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/algorand-client.spec.ts)\n */\n public static defaultLocalNet() {\n return new AlgorandClient({\n algodConfig: ClientManager.getDefaultLocalNetConfig('algod'),\n indexerConfig: ClientManager.getDefaultLocalNetConfig('indexer'),\n kmdConfig: ClientManager.getDefaultLocalNetConfig('kmd'),\n })\n }\n\n /**\n * Creates an `AlgorandClient` pointing at TestNet using AlgoNode.\n * @returns An instance of the `AlgorandClient`.\n * @example\n * const algorand = AlgorandClient.testNet();\n */\n public static testNet() {\n return new AlgorandClient({\n algodConfig: ClientManager.getAlgoNodeConfig('testnet', 'algod'),\n indexerConfig: ClientManager.getAlgoNodeConfig('testnet', 'indexer'),\n kmdConfig: undefined,\n })\n }\n\n /**\n * Creates an `AlgorandClient` pointing at MainNet using AlgoNode.\n * @returns An instance of the `AlgorandClient`.\n * @example\n * const algorand = AlgorandClient.mainNet();\n */\n public static mainNet() {\n return new AlgorandClient({\n algodConfig: ClientManager.getAlgoNodeConfig('mainnet', 'algod'),\n indexerConfig: ClientManager.getAlgoNodeConfig('mainnet', 'indexer'),\n kmdConfig: undefined,\n })\n }\n\n /**\n * Creates an `AlgorandClient` pointing to the given client(s).\n * @param clients The clients to use.\n * @returns An instance of the `AlgorandClient`.\n * @example\n * const algorand = AlgorandClient.fromClients({ algod, indexer, kmd });\n */\n public static fromClients(clients: AlgoSdkClients) {\n return new AlgorandClient(clients)\n }\n\n /**\n * Creates an `AlgorandClient` loading the configuration from environment variables.\n *\n * Retrieve configurations from environment variables when defined or get default LocalNet configuration if they aren't defined.\n *\n * Expects to be called from a Node.js environment.\n *\n * If `process.env.ALGOD_SERVER` is defined it will use that along with optional `process.env.ALGOD_PORT` and `process.env.ALGOD_TOKEN`.\n *\n * If `process.env.INDEXER_SERVER` is defined it will use that along with optional `process.env.INDEXER_PORT` and `process.env.INDEXER_TOKEN`.\n *\n * If either aren't defined it will use the default LocalNet config.\n *\n * It will return a KMD configuration that uses `process.env.KMD_PORT` (or port 4002) if `process.env.ALGOD_SERVER` is defined,\n * otherwise it will use the default LocalNet config unless it detects testnet or mainnet.\n * @returns An instance of the `AlgorandClient`.\n * @example\n * const client = AlgorandClient.fromEnvironment();\n */\n public static fromEnvironment() {\n return new AlgorandClient(ClientManager.getConfigFromEnvironmentOrLocalNet())\n }\n\n /**\n * Creates an `AlgorandClient` from the given config.\n * @param config The config to use.\n * @returns An instance of the `AlgorandClient`.\n * @example\n * const client = AlgorandClient.fromConfig({ algodConfig, indexerConfig, kmdConfig });\n */\n public static fromConfig(config: AlgoConfig) {\n return new AlgorandClient(config)\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"algorand-client.mjs","names":[],"sources":["../src/algorand-client.ts"],"sourcesContent":["import { SuggestedParams } from '@algorandfoundation/algokit-algod-client'\nimport { Address, ReadableAddress } from '@algorandfoundation/algokit-common'\nimport { nobleEd25519Generator } from '@algorandfoundation/algokit-crypto'\nimport { AddressWithTransactionSigner, LogicSigAccount, MultisigAccount, TransactionSigner } from '@algorandfoundation/algokit-transact'\nimport { AccountManager, AccountManagerConfig } from './account-manager'\nimport { AlgorandClientTransactionCreator } from './algorand-client-transaction-creator'\nimport { AlgorandClientTransactionSender } from './algorand-client-transaction-sender'\nimport { AppDeployer } from './app-deployer'\nimport { AppManager } from './app-manager'\nimport { AssetManager } from './asset-manager'\nimport { AlgoSdkClients, ClientManager } from './client-manager'\nimport { ErrorTransformer, TransactionComposer, TransactionComposerConfig } from './composer'\nimport { AlgoConfig } from './network-client'\nimport { NetworkManager } from './network-manager'\n\n/**\n * A client that brokers easy access to Algorand functionality.\n */\nexport class AlgorandClient {\n private _clientManager: ClientManager\n private _accountManager: AccountManager\n private _appManager: AppManager\n private _appDeployer: AppDeployer\n private _assetManager: AssetManager\n private _networkManager: NetworkManager\n private _transactionSender: AlgorandClientTransactionSender\n private _transactionCreator: AlgorandClientTransactionCreator\n\n private _cachedSuggestedParams?: SuggestedParams\n private _cachedSuggestedParamsExpiry?: Date\n private _cachedSuggestedParamsTimeout: number = 3_000 // three seconds\n\n private _defaultValidityWindow: bigint | undefined = undefined\n\n /**\n * A set of error transformers to use when an error is caught in simulate or execute\n * `registerErrorTransformer` and `unregisterErrorTransformer` can be used to add and remove\n * error transformers from the set.\n */\n private _errorTransformers: Set<ErrorTransformer> = new Set()\n\n private constructor(config: (AlgoConfig | AlgoSdkClients) & Partial<AccountManagerConfig>) {\n this._clientManager = new ClientManager(config, this)\n this._accountManager = new AccountManager(this._clientManager, { ed25519Generator: config.ed25519Generator ?? nobleEd25519Generator })\n this._appManager = new AppManager(this._clientManager.algod)\n this._assetManager = new AssetManager(this._clientManager.algod, (config) => this.newGroup(config))\n this._networkManager = new NetworkManager(this._clientManager.algod, this)\n this._transactionSender = new AlgorandClientTransactionSender((config) => this.newGroup(config), this._assetManager, this._appManager)\n this._transactionCreator = new AlgorandClientTransactionCreator((config) => this.newGroup(config))\n this._appDeployer = new AppDeployer(this._appManager, this._transactionSender, this._clientManager.indexerIfPresent)\n }\n\n /**\n * Sets the default validity window for transactions.\n * @param validityWindow The number of rounds between the first and last valid rounds\n * @returns The `AlgorandClient` so method calls can be chained\n * @example\n * ```typescript\n * const algorand = AlgorandClient.mainNet().setDefaultValidityWindow(1000);\n * ```\n */\n public setDefaultValidityWindow(validityWindow: number | bigint) {\n this._defaultValidityWindow = BigInt(validityWindow)\n return this\n }\n\n /**\n * Sets the default signer to use if no other signer is specified.\n * @param signer The signer to use, either a `TransactionSigner` or a `AddressWithSigner`\n * @returns The `AlgorandClient` so method calls can be chained\n * @example\n * ```typescript\n * const signer = new SigningAccount(account, account.addr)\n * const algorand = AlgorandClient.mainNet().setDefaultSigner(signer)\n * ```\n */\n public setDefaultSigner(signer: TransactionSigner | AddressWithTransactionSigner): AlgorandClient {\n this._accountManager.setDefaultSigner(signer)\n return this\n }\n\n /**\n * Tracks the given account (object that encapsulates an address and a signer) for later signing.\n * @param account The account to register, which can be a `AddressWithSigner` or\n * a `algosdk.Account`, `algosdk.LogicSigAccount`, `SigningAccount` or `MultisigAccount`\n * @example\n * ```typescript\n * const accountManager = AlgorandClient.mainNet()\n * .setSignerFromAccount(algosdk.generateAccount())\n * .setSignerFromAccount(new algosdk.LogicSigAccount(program, args))\n * .setSignerFromAccount(new SigningAccount(account, sender))\n * .setSignerFromAccount(new MultisigAccount({version: 1, threshold: 1, addrs: [\"ADDRESS1...\", \"ADDRESS2...\"]}, [account1, account2]))\n * .setSignerFromAccount({addr: \"SENDERADDRESS\", signer: transactionSigner})\n * ```\n * @returns The `AlgorandClient` so method calls can be chained\n */\n public setSignerFromAccount(account: AddressWithTransactionSigner | LogicSigAccount | MultisigAccount) {\n this._accountManager.setSignerFromAccount(account)\n return this\n }\n\n /**\n * Tracks the given signer against the given sender for later signing.\n * @param sender The sender address to use this signer for\n * @param signer The signer to sign transactions with for the given sender\n * @returns The `AlgorandClient` so method calls can be chained\n * @example\n * ```typescript\n * const signer = new SigningAccount(account, account.addr)\n * const algorand = AlgorandClient.mainNet().setSigner(signer.addr, signer.signer)\n * ```\n */\n public setSigner(sender: string | Address, signer: TransactionSigner) {\n this._accountManager.setSigner(sender, signer)\n return this\n }\n\n /**\n * Sets a cache value to use for suggested transaction params.\n * @param suggestedParams The suggested params to use\n * @param until A date until which to cache, or if not specified then the timeout is used\n * @returns The `AlgorandClient` so method calls can be chained\n * @example\n * ```typescript\n * const algorand = AlgorandClient.mainNet().setSuggestedParamsCache(suggestedParams, new Date(+new Date() + 3_600_000))\n * ```\n */\n public setSuggestedParamsCache(suggestedParams: SuggestedParams, until?: Date) {\n this._cachedSuggestedParams = suggestedParams\n this._cachedSuggestedParamsExpiry = until ?? new Date(+new Date() + this._cachedSuggestedParamsTimeout)\n return this\n }\n\n /**\n * Sets the timeout for caching suggested params.\n * @param timeout The timeout in milliseconds\n * @returns The `AlgorandClient` so method calls can be chained\n * @example\n * ```typescript\n * const algorand = AlgorandClient.mainNet().setSuggestedParamsCacheTimeout(10_000)\n * ```\n */\n public setSuggestedParamsCacheTimeout(timeout: number) {\n this._cachedSuggestedParamsTimeout = timeout\n return this\n }\n\n /**\n * Get suggested params for a transaction (either cached or from algod if the cache is stale or empty)\n * @returns The suggested transaction parameters.\n * @example\n * const params = await AlgorandClient.mainNet().getSuggestedParams();\n */\n public async getSuggestedParams(): Promise<SuggestedParams> {\n if (this._cachedSuggestedParams && (!this._cachedSuggestedParamsExpiry || this._cachedSuggestedParamsExpiry > new Date())) {\n return {\n ...this._cachedSuggestedParams,\n }\n }\n\n this._cachedSuggestedParams = await this._clientManager.algod.suggestedParams()\n this._cachedSuggestedParamsExpiry = new Date(new Date().getTime() + this._cachedSuggestedParamsTimeout)\n\n return {\n ...this._cachedSuggestedParams,\n }\n }\n\n /**\n * Get clients, including algosdk clients and app clients.\n * @returns The `ClientManager` instance.\n * @example\n * const clientManager = AlgorandClient.mainNet().client;\n */\n public get client() {\n return this._clientManager\n }\n\n /**\n * Get or create accounts that can sign transactions.\n * @returns The `AccountManager` instance.\n * @example\n * const accountManager = AlgorandClient.mainNet().account;\n */\n public get account() {\n return this._accountManager\n }\n\n /**\n * Methods for interacting with assets.\n * @returns The `AssetManager` instance.\n * @example\n * const assetManager = AlgorandClient.mainNet().asset;\n */\n public get asset() {\n return this._assetManager\n }\n\n /**\n * Methods for interacting with apps.\n * @returns The `AppManager` instance.\n * @example\n * const appManager = AlgorandClient.mainNet().app;\n */\n public get app() {\n return this._appManager\n }\n\n /**\n * Methods for deploying apps and managing app deployment metadata.\n * @returns The `AppDeployer` instance.\n * @example\n * const deployer = AlgorandClient.mainNet().appDeployer;\n */\n public get appDeployer() {\n return this._appDeployer\n }\n\n /**\n * Methods for interacting with the network.\n * Provides utilities for querying blockchain state and waiting for specific conditions.\n * @returns The `NetworkManager` instance.\n * @example\n * ```typescript\n * // Get last round\n * const lastRound = await algorand.network.getLastRound()\n *\n * // Wait for a specific round\n * await algorand.network.waitUntilRound(1000n)\n *\n * // LocalNet-specific: block warp\n * await algorand.network.localNet.blockWarp(100n)\n * ```\n */\n public get network() {\n return this._networkManager\n }\n\n /**\n * Register a function that will be used to transform an error caught when simulating or executing\n * composed transaction groups made from `newGroup`\n */\n public registerErrorTransformer(transformer: ErrorTransformer) {\n this._errorTransformers.add(transformer)\n }\n\n public unregisterErrorTransformer(transformer: ErrorTransformer) {\n this._errorTransformers.delete(transformer)\n }\n\n /** Start a new `TransactionComposer` transaction group\n * @returns A new instance of `TransactionComposer`.\n * @example\n * {@includeCode ./algorand-client.spec.ts#example-newGroup}\n * @see [Full working example](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/algorand-client.spec.ts)\n */\n public newGroup(composerConfig?: TransactionComposerConfig) {\n return new TransactionComposer({\n algod: this.client.algod,\n getSigner: (addr: ReadableAddress) => this.account.getSigner(addr),\n getSuggestedParams: () => this.getSuggestedParams(),\n defaultValidityWindow: this._defaultValidityWindow,\n appManager: this._appManager,\n errorTransformers: [...this._errorTransformers],\n composerConfig: composerConfig,\n })\n }\n\n /**\n * Methods for sending a transaction.\n * @returns The `AlgorandClientTransactionSender` instance.\n * @example\n * const result = await AlgorandClient.mainNet().send.payment({\n * sender: \"SENDERADDRESS\",\n * receiver: \"RECEIVERADDRESS\",\n * amount: algo(1)\n * })\n */\n public get send() {\n return this._transactionSender\n }\n\n /**\n * Methods for creating a transaction.\n * @returns The `AlgorandClientTransactionCreator` instance.\n * @example\n * const payment = await AlgorandClient.mainNet().createTransaction.payment({\n * sender: \"SENDERADDRESS\",\n * receiver: \"RECEIVERADDRESS\",\n * amount: algo(1)\n * })\n */\n public get createTransaction() {\n return this._transactionCreator\n }\n\n // Static methods to create an `AlgorandClient`\n\n /**\n * Creates an `AlgorandClient` pointing at default LocalNet ports and API token.\n * @returns An instance of the `AlgorandClient`.\n * @example\n * {@includeCode ./algorand-client.spec.ts#example-defaultLocalNet}\n * @see [Full working example](https://github.com/algorandfoundation/algokit-utils-ts/blob/main/src/algorand-client.spec.ts)\n */\n public static defaultLocalNet() {\n return new AlgorandClient({\n algodConfig: ClientManager.getDefaultLocalNetConfig('algod'),\n indexerConfig: ClientManager.getDefaultLocalNetConfig('indexer'),\n kmdConfig: ClientManager.getDefaultLocalNetConfig('kmd'),\n })\n }\n\n /**\n * Creates an `AlgorandClient` pointing at TestNet using AlgoNode.\n * @returns An instance of the `AlgorandClient`.\n * @example\n * const algorand = AlgorandClient.testNet();\n */\n public static testNet() {\n return new AlgorandClient({\n algodConfig: ClientManager.getAlgoNodeConfig('testnet', 'algod'),\n indexerConfig: ClientManager.getAlgoNodeConfig('testnet', 'indexer'),\n kmdConfig: undefined,\n })\n }\n\n /**\n * Creates an `AlgorandClient` pointing at MainNet using AlgoNode.\n * @returns An instance of the `AlgorandClient`.\n * @example\n * const algorand = AlgorandClient.mainNet();\n */\n public static mainNet() {\n return new AlgorandClient({\n algodConfig: ClientManager.getAlgoNodeConfig('mainnet', 'algod'),\n indexerConfig: ClientManager.getAlgoNodeConfig('mainnet', 'indexer'),\n kmdConfig: undefined,\n })\n }\n\n /**\n * Creates an `AlgorandClient` pointing to the given client(s).\n * @param clients The clients to use.\n * @returns An instance of the `AlgorandClient`.\n * @example\n * const algorand = AlgorandClient.fromClients({ algod, indexer, kmd });\n */\n public static fromClients(clients: AlgoSdkClients) {\n return new AlgorandClient(clients)\n }\n\n /**\n * Creates an `AlgorandClient` loading the configuration from environment variables.\n *\n * Retrieve configurations from environment variables when defined or get default LocalNet configuration if they aren't defined.\n *\n * Expects to be called from a Node.js environment.\n *\n * If `process.env.ALGOD_SERVER` is defined it will use that along with optional `process.env.ALGOD_PORT` and `process.env.ALGOD_TOKEN`.\n *\n * If `process.env.INDEXER_SERVER` is defined it will use that along with optional `process.env.INDEXER_PORT` and `process.env.INDEXER_TOKEN`.\n *\n * If either aren't defined it will use the default LocalNet config.\n *\n * It will return a KMD configuration that uses `process.env.KMD_PORT` (or port 4002) if `process.env.ALGOD_SERVER` is defined,\n * otherwise it will use the default LocalNet config unless it detects testnet or mainnet.\n * @returns An instance of the `AlgorandClient`.\n * @example\n * const client = AlgorandClient.fromEnvironment();\n */\n public static fromEnvironment() {\n return new AlgorandClient(ClientManager.getConfigFromEnvironmentOrLocalNet())\n }\n\n /**\n * Creates an `AlgorandClient` from the given config.\n * @param config The config to use.\n * @returns An instance of the `AlgorandClient`.\n * @example\n * const client = AlgorandClient.fromConfig({ algodConfig, indexerConfig, kmdConfig });\n */\n public static fromConfig(config: AlgoConfig) {\n return new AlgorandClient(config)\n }\n}\n"],"mappings":"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"}
|
package/app-client.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
2
|
const require_runtime = require('./_virtual/_rolldown/runtime.js');
|
|
3
3
|
const require_address = require('./packages/common/src/address.js');
|
|
4
|
-
const require_config = require('./config.js');
|
|
5
|
-
const require_util = require('./util.js');
|
|
6
4
|
const require_sourcemap = require('./packages/common/src/sourcemap.js');
|
|
7
5
|
const require_app_call = require('./packages/transact/src/transactions/app-call.js');
|
|
6
|
+
const require_config = require('./config.js');
|
|
7
|
+
const require_util = require('./util.js');
|
|
8
8
|
const require_lifecycle_events = require('./lifecycle-events.js');
|
|
9
9
|
const require_abi_method = require('./packages/abi/src/abi-method.js');
|
|
10
10
|
const require_arc56_contract = require('./packages/abi/src/arc56-contract.js');
|
package/app-client.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { getAddress, getApplicationAddress, getOptionalAddress } from "./packages/common/src/address.mjs";
|
|
2
|
-
import { Config } from "./config.mjs";
|
|
3
|
-
import { asJson, binaryStartsWith } from "./util.mjs";
|
|
4
2
|
import { ProgramSourceMap } from "./packages/common/src/sourcemap.mjs";
|
|
5
3
|
import { OnApplicationComplete } from "./packages/transact/src/transactions/app-call.mjs";
|
|
4
|
+
import { Config } from "./config.mjs";
|
|
5
|
+
import { asJson, binaryStartsWith } from "./util.mjs";
|
|
6
6
|
import { EventType } from "./lifecycle-events.mjs";
|
|
7
7
|
import { argTypeIsTransaction, getABIDecodedValue, getABIEncodedValue, getABIMethod } from "./packages/abi/src/abi-method.mjs";
|
|
8
8
|
import { getBoxABIStorageKey, getBoxABIStorageKeys, getBoxABIStorageMap, getGlobalABIStorageKeys, getGlobalABIStorageMaps, getLocalABIStorageKeys, getLocalABIStorageMaps } from "./packages/abi/src/arc56-contract.mjs";
|
package/app-deployer.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
2
|
const require_address = require('./packages/common/src/address.js');
|
|
3
|
+
const require_transaction_type = require('./packages/transact/src/transactions/transaction-type.js');
|
|
3
4
|
const require_config = require('./config.js');
|
|
4
5
|
const require_app = require('./app.js');
|
|
5
6
|
const require_util = require('./util.js');
|
|
6
|
-
const require_transaction_type = require('./packages/transact/src/transactions/transaction-type.js');
|
|
7
7
|
const require_composer = require('./composer.js');
|
|
8
8
|
const require_indexer_lookup = require('./indexer-client/indexer-lookup.js');
|
|
9
9
|
|
package/app-deployer.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Address, getAddress, getApplicationAddress } from "./packages/common/src/address.mjs";
|
|
2
|
+
import { TransactionType } from "./packages/transact/src/transactions/transaction-type.mjs";
|
|
2
3
|
import { Config } from "./config.mjs";
|
|
3
4
|
import { APP_DEPLOY_NOTE_DAPP, OnSchemaBreak, OnUpdate } from "./app.mjs";
|
|
4
5
|
import { calculateExtraProgramPages } from "./util.mjs";
|
|
5
|
-
import { TransactionType } from "./packages/transact/src/transactions/transaction-type.mjs";
|
|
6
6
|
import { TransactionComposer } from "./composer.mjs";
|
|
7
7
|
import { lookupAccountCreatedApplicationByAddress, searchTransactions } from "./indexer-client/indexer-lookup.mjs";
|
|
8
8
|
|
package/app-factory.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
2
|
const require_address = require('./packages/common/src/address.js');
|
|
3
|
-
const require_app = require('./app.js');
|
|
4
3
|
const require_sourcemap = require('./packages/common/src/sourcemap.js');
|
|
5
4
|
const require_app_call = require('./packages/transact/src/transactions/app-call.js');
|
|
5
|
+
const require_app = require('./app.js');
|
|
6
6
|
const require_abi_method = require('./packages/abi/src/abi-method.js');
|
|
7
7
|
const require_app_client = require('./app-client.js');
|
|
8
8
|
|
package/app-factory.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { getAddress, getOptionalAddress } from "./packages/common/src/address.mjs";
|
|
2
|
-
import { DELETABLE_TEMPLATE_NAME, UPDATABLE_TEMPLATE_NAME } from "./app.mjs";
|
|
3
2
|
import { ProgramSourceMap } from "./packages/common/src/sourcemap.mjs";
|
|
4
3
|
import { OnApplicationComplete } from "./packages/transact/src/transactions/app-call.mjs";
|
|
4
|
+
import { DELETABLE_TEMPLATE_NAME, UPDATABLE_TEMPLATE_NAME } from "./app.mjs";
|
|
5
5
|
import { argTypeIsTransaction, getABIDecodedValue, getABIMethod } from "./packages/abi/src/abi-method.mjs";
|
|
6
6
|
import { AppClient } from "./app-client.mjs";
|
|
7
7
|
|
package/app-manager.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
2
|
const require_address = require('./packages/common/src/address.js');
|
|
3
|
-
const require_app = require('./app.js');
|
|
4
3
|
const require_sourcemap = require('./packages/common/src/sourcemap.js');
|
|
4
|
+
const require_app = require('./app.js');
|
|
5
5
|
|
|
6
6
|
//#region src/app-manager.ts
|
|
7
7
|
/** Allows management of application information. */
|
package/app-manager.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { getAddress, getApplicationAddress } from "./packages/common/src/address.mjs";
|
|
2
|
-
import { ABI_RETURN_PREFIX, DELETABLE_TEMPLATE_NAME, UPDATABLE_TEMPLATE_NAME } from "./app.mjs";
|
|
3
2
|
import { ProgramSourceMap } from "./packages/common/src/sourcemap.mjs";
|
|
3
|
+
import { ABI_RETURN_PREFIX, DELETABLE_TEMPLATE_NAME, UPDATABLE_TEMPLATE_NAME } from "./app.mjs";
|
|
4
4
|
|
|
5
5
|
//#region src/app-manager.ts
|
|
6
6
|
/** Allows management of application information. */
|
package/composer.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
2
|
const require_runtime = require('./_virtual/_rolldown/runtime.js');
|
|
3
3
|
const require_constants = require('./packages/common/src/constants.js');
|
|
4
|
-
const require_amount = require('./amount.js');
|
|
5
|
-
const require_config = require('./config.js');
|
|
6
|
-
const require_util = require('./util.js');
|
|
7
|
-
const require_transaction = require('./transaction/transaction.js');
|
|
8
4
|
const require_app_call = require('./packages/transact/src/transactions/app-call.js');
|
|
9
5
|
const require_transaction_type = require('./packages/transact/src/transactions/transaction-type.js');
|
|
10
|
-
const require_transaction
|
|
6
|
+
const require_transaction = require('./packages/transact/src/transactions/transaction.js');
|
|
11
7
|
const require_signed_transaction = require('./packages/transact/src/transactions/signed-transaction.js');
|
|
12
8
|
const require_signer = require('./packages/transact/src/signer.js');
|
|
9
|
+
const require_amount = require('./amount.js');
|
|
10
|
+
const require_config = require('./config.js');
|
|
11
|
+
const require_util = require('./util.js');
|
|
12
|
+
const require_transaction$1 = require('./transaction/transaction.js');
|
|
13
13
|
const require_app_manager = require('./app-manager.js');
|
|
14
14
|
const require_app_call$1 = require('./transactions/app-call.js');
|
|
15
15
|
const require_asset_transfer = require('./transactions/asset-transfer.js');
|
|
@@ -130,7 +130,7 @@ var TransactionComposer = class TransactionComposer {
|
|
|
130
130
|
};
|
|
131
131
|
case "txn": {
|
|
132
132
|
const { txn: transaction, signer, maxFee } = txn.data;
|
|
133
|
-
const clonedTxn = require_transaction
|
|
133
|
+
const clonedTxn = require_transaction.decodeTransaction(require_transaction.encodeTransactionRaw(transaction));
|
|
134
134
|
delete clonedTxn.group;
|
|
135
135
|
return {
|
|
136
136
|
type: "txn",
|
|
@@ -147,7 +147,7 @@ var TransactionComposer = class TransactionComposer {
|
|
|
147
147
|
type: "asyncTxn",
|
|
148
148
|
data: {
|
|
149
149
|
txn: txnPromise.then((resolvedTxn) => {
|
|
150
|
-
const clonedTxn = require_transaction
|
|
150
|
+
const clonedTxn = require_transaction.decodeTransaction(require_transaction.encodeTransactionRaw(resolvedTxn));
|
|
151
151
|
delete clonedTxn.group;
|
|
152
152
|
return clonedTxn;
|
|
153
153
|
}),
|
|
@@ -207,7 +207,7 @@ var TransactionComposer = class TransactionComposer {
|
|
|
207
207
|
*/
|
|
208
208
|
addTransaction(transaction, signer) {
|
|
209
209
|
if (transaction.group) throw new Error("Cannot add a transaction to the composer because it is already in a group");
|
|
210
|
-
require_transaction
|
|
210
|
+
require_transaction.validateTransaction(transaction);
|
|
211
211
|
this.push({
|
|
212
212
|
data: {
|
|
213
213
|
txn: transaction,
|
|
@@ -1087,7 +1087,7 @@ var TransactionComposer = class TransactionComposer {
|
|
|
1087
1087
|
if (!this.transactionsWithSigners) {
|
|
1088
1088
|
const suggestedParams = await this.getSuggestedParams();
|
|
1089
1089
|
const builtTransactions = await this._buildTransactions(suggestedParams);
|
|
1090
|
-
this.rawBuildTransactions = builtTransactions.transactions.map((txn) => new require_transaction
|
|
1090
|
+
this.rawBuildTransactions = builtTransactions.transactions.map((txn) => new require_transaction.Transaction({ ...txn }));
|
|
1091
1091
|
const groupAnalysis = (this.composerConfig.coverAppCallInnerTransactionFees || this.composerConfig.populateAppCallResources) && builtTransactions.transactions.some((txn) => txn.type === require_transaction_type.TransactionType.AppCall) ? await this.analyzeGroupRequirements(builtTransactions.transactions, suggestedParams, this.composerConfig) : void 0;
|
|
1092
1092
|
this.populateTransactionAndGroupResources(builtTransactions.transactions, groupAnalysis);
|
|
1093
1093
|
this.transactionsWithSigners = builtTransactions.transactions.map((txn, index) => {
|
|
@@ -1112,13 +1112,13 @@ var TransactionComposer = class TransactionComposer {
|
|
|
1112
1112
|
const transactions = new Array();
|
|
1113
1113
|
let transactionIndex = 0;
|
|
1114
1114
|
for (const ctxn of this.txns) if (ctxn.type === "txn") {
|
|
1115
|
-
require_transaction
|
|
1115
|
+
require_transaction.validateTransaction(ctxn.data.txn);
|
|
1116
1116
|
transactions.push(ctxn.data.txn);
|
|
1117
1117
|
if (ctxn.data.signer) signers.set(transactionIndex, ctxn.data.signer);
|
|
1118
1118
|
transactionIndex++;
|
|
1119
1119
|
} else if (ctxn.type === "asyncTxn") {
|
|
1120
1120
|
const transaction = await ctxn.data.txn;
|
|
1121
|
-
require_transaction
|
|
1121
|
+
require_transaction.validateTransaction(transaction);
|
|
1122
1122
|
transactions.push(transaction);
|
|
1123
1123
|
if (ctxn.data.signer) signers.set(transactionIndex, ctxn.data.signer);
|
|
1124
1124
|
transactionIndex++;
|
|
@@ -1164,13 +1164,13 @@ var TransactionComposer = class TransactionComposer {
|
|
|
1164
1164
|
break;
|
|
1165
1165
|
default: throw new Error(`Unsupported transaction type: ${ctxn.type}`);
|
|
1166
1166
|
}
|
|
1167
|
-
if (transaction.fee === void 0) transaction = require_transaction
|
|
1167
|
+
if (transaction.fee === void 0) transaction = require_transaction.assignFee(transaction, {
|
|
1168
1168
|
feePerByte: suggestedParams.fee,
|
|
1169
1169
|
minFee: suggestedParams.minFee,
|
|
1170
1170
|
extraFee: ctxn.data.extraFee?.microAlgos,
|
|
1171
1171
|
maxFee: ctxn.data.maxFee?.microAlgos
|
|
1172
1172
|
});
|
|
1173
|
-
require_transaction
|
|
1173
|
+
require_transaction.validateTransaction(transaction);
|
|
1174
1174
|
transactions.push(transaction);
|
|
1175
1175
|
if (ctxn.data.signer) {
|
|
1176
1176
|
const signer = "signer" in ctxn.data.signer ? ctxn.data.signer.signer : ctxn.data.signer;
|
|
@@ -1260,7 +1260,7 @@ var TransactionComposer = class TransactionComposer {
|
|
|
1260
1260
|
if (groupAnalysis.unnamedResourcesAccessed) require_app_call$1.populateGroupResources(transactions, groupAnalysis.unnamedResourcesAccessed);
|
|
1261
1261
|
}
|
|
1262
1262
|
if (transactions.length > 1) {
|
|
1263
|
-
const groupedTransactions = require_transaction
|
|
1263
|
+
const groupedTransactions = require_transaction.groupTransactions(transactions);
|
|
1264
1264
|
transactions.forEach((t) => t.group = groupedTransactions[0].group);
|
|
1265
1265
|
return transactions;
|
|
1266
1266
|
} else return transactions;
|
|
@@ -1276,9 +1276,9 @@ var TransactionComposer = class TransactionComposer {
|
|
|
1276
1276
|
if (logicalMaxFee !== void 0) params.fee = logicalMaxFee;
|
|
1277
1277
|
else appCallIndexesWithoutMaxFees.push(groupIndex);
|
|
1278
1278
|
}
|
|
1279
|
-
return new require_transaction
|
|
1279
|
+
return new require_transaction.Transaction(params);
|
|
1280
1280
|
});
|
|
1281
|
-
if (transactionsToSimulate.length > 1) transactionsToSimulate = require_transaction
|
|
1281
|
+
if (transactionsToSimulate.length > 1) transactionsToSimulate = require_transaction.groupTransactions(transactionsToSimulate);
|
|
1282
1282
|
if (analysisParams.coverAppCallInnerTransactionFees && appCallIndexesWithoutMaxFees.length > 0) throw new Error(`Please provide a maxFee for each app call transaction when coverAppCallInnerTransactionFees is enabled. Required for transaction ${appCallIndexesWithoutMaxFees.join(", ")}`);
|
|
1283
1283
|
const simulateRequest = {
|
|
1284
1284
|
txnGroups: [{ txns: transactionsToSimulate.map((txn) => ({
|
|
@@ -1305,7 +1305,7 @@ var TransactionComposer = class TransactionComposer {
|
|
|
1305
1305
|
const btxn = transactions[groupIndex];
|
|
1306
1306
|
let requiredFeeDelta;
|
|
1307
1307
|
if (analysisParams.coverAppCallInnerTransactionFees) {
|
|
1308
|
-
const minTxnFee = require_transaction
|
|
1308
|
+
const minTxnFee = require_transaction.calculateFee(btxn, {
|
|
1309
1309
|
feePerByte: suggestedParams.fee,
|
|
1310
1310
|
minFee: suggestedParams.minFee
|
|
1311
1311
|
});
|
|
@@ -1409,7 +1409,7 @@ var TransactionComposer = class TransactionComposer {
|
|
|
1409
1409
|
if (transactionsToSend.length > 1 && group) require_config.Config.getLogger(params?.suppressLog).verbose(`Group transaction (${buffer.Buffer.from(group).toString("base64")}) sent with ${transactionsToSend.length} transactions`);
|
|
1410
1410
|
else require_config.Config.getLogger(params?.suppressLog).verbose(`Sent transaction ID ${transactionsToSend[0].txId()} ${transactionsToSend[0].type} from ${transactionsToSend[0].sender}`);
|
|
1411
1411
|
let confirmations = new Array();
|
|
1412
|
-
if (params?.maxRoundsToWaitForConfirmation !== 0) confirmations = await Promise.all(transactionIds.map(async (id) => await require_transaction.waitForConfirmation(id, waitRounds, this.algod)));
|
|
1412
|
+
if (params?.maxRoundsToWaitForConfirmation !== 0) confirmations = await Promise.all(transactionIds.map(async (id) => await require_transaction$1.waitForConfirmation(id, waitRounds, this.algod)));
|
|
1413
1413
|
const abiReturns = this.parseAbiReturnValues(confirmations);
|
|
1414
1414
|
return {
|
|
1415
1415
|
groupId: group ? buffer.Buffer.from(group).toString("base64") : void 0,
|
|
@@ -1425,7 +1425,7 @@ var TransactionComposer = class TransactionComposer {
|
|
|
1425
1425
|
if (typeof originalError === "object") err.name = originalError.name;
|
|
1426
1426
|
let sentTransactions;
|
|
1427
1427
|
if (this.transactionsWithSigners) sentTransactions = this.transactionsWithSigners.map((t) => t.txn);
|
|
1428
|
-
else if (this.rawBuildTransactions) sentTransactions = this.rawBuildTransactions.length > 1 ? require_transaction
|
|
1428
|
+
else if (this.rawBuildTransactions) sentTransactions = this.rawBuildTransactions.length > 1 ? require_transaction.groupTransactions(this.rawBuildTransactions) : this.rawBuildTransactions;
|
|
1429
1429
|
if (require_config.Config.debug && typeof originalError === "object" && sentTransactions) {
|
|
1430
1430
|
err.traces = [];
|
|
1431
1431
|
require_config.Config.getLogger(params?.suppressLog).error("Received error executing Transaction Composer and debug flag enabled; attempting simulation to get more information", err);
|
|
@@ -1468,7 +1468,7 @@ var TransactionComposer = class TransactionComposer {
|
|
|
1468
1468
|
let transactionsWithSigner;
|
|
1469
1469
|
if (!this.transactionsWithSigners) {
|
|
1470
1470
|
const builtTransactions = await this.buildTransactions();
|
|
1471
|
-
transactionsWithSigner = (builtTransactions.transactions.length > 1 ? require_transaction
|
|
1471
|
+
transactionsWithSigner = (builtTransactions.transactions.length > 1 ? require_transaction.groupTransactions(builtTransactions.transactions) : builtTransactions.transactions).map((txn, index) => ({
|
|
1472
1472
|
txn,
|
|
1473
1473
|
signer: skipSignatures ? require_signer.makeEmptyTransactionSigner() : builtTransactions.signers.get(index) ?? require_signer.makeEmptyTransactionSigner()
|
|
1474
1474
|
}));
|