@algorandfoundation/algokit-utils 8.2.0-beta.2 → 8.2.0-beta.3

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.
Files changed (71) hide show
  1. package/package.json +3 -2
  2. package/types/account-manager.d.ts +33 -18
  3. package/types/account-manager.js +33 -18
  4. package/types/account-manager.js.map +1 -1
  5. package/types/account-manager.mjs +33 -18
  6. package/types/account-manager.mjs.map +1 -1
  7. package/types/account.d.ts +5 -0
  8. package/types/account.js +5 -0
  9. package/types/account.js.map +1 -1
  10. package/types/account.mjs +5 -0
  11. package/types/account.mjs.map +1 -1
  12. package/types/algorand-client-transaction-creator.d.ts +103 -70
  13. package/types/algorand-client-transaction-creator.js +103 -70
  14. package/types/algorand-client-transaction-creator.js.map +1 -1
  15. package/types/algorand-client-transaction-creator.mjs +103 -70
  16. package/types/algorand-client-transaction-creator.mjs.map +1 -1
  17. package/types/algorand-client-transaction-sender.d.ts +107 -20
  18. package/types/algorand-client-transaction-sender.js +107 -21
  19. package/types/algorand-client-transaction-sender.js.map +1 -1
  20. package/types/algorand-client-transaction-sender.mjs +107 -21
  21. package/types/algorand-client-transaction-sender.mjs.map +1 -1
  22. package/types/algorand-client.d.ts +108 -24
  23. package/types/algorand-client.js +107 -23
  24. package/types/algorand-client.js.map +1 -1
  25. package/types/algorand-client.mjs +107 -23
  26. package/types/algorand-client.mjs.map +1 -1
  27. package/types/amount.d.ts +10 -0
  28. package/types/amount.js +10 -0
  29. package/types/amount.js.map +1 -1
  30. package/types/amount.mjs +10 -0
  31. package/types/amount.mjs.map +1 -1
  32. package/types/app-client.d.ts +128 -8
  33. package/types/app-client.js +128 -8
  34. package/types/app-client.js.map +1 -1
  35. package/types/app-client.mjs +128 -8
  36. package/types/app-client.mjs.map +1 -1
  37. package/types/app-deployer.d.ts +33 -1
  38. package/types/app-deployer.js +33 -1
  39. package/types/app-deployer.js.map +1 -1
  40. package/types/app-deployer.mjs +33 -1
  41. package/types/app-deployer.mjs.map +1 -1
  42. package/types/app-factory.d.ts +74 -4
  43. package/types/app-factory.js +74 -4
  44. package/types/app-factory.js.map +1 -1
  45. package/types/app-factory.mjs +74 -4
  46. package/types/app-factory.mjs.map +1 -1
  47. package/types/app-manager.d.ts +64 -0
  48. package/types/app-manager.js +64 -0
  49. package/types/app-manager.js.map +1 -1
  50. package/types/app-manager.mjs +64 -0
  51. package/types/app-manager.mjs.map +1 -1
  52. package/types/app-spec.d.ts +9 -0
  53. package/types/app-spec.js +9 -0
  54. package/types/app-spec.js.map +1 -1
  55. package/types/app-spec.mjs +9 -0
  56. package/types/app-spec.mjs.map +1 -1
  57. package/types/asset-manager.d.ts +5 -5
  58. package/types/asset-manager.js +5 -5
  59. package/types/asset-manager.js.map +1 -1
  60. package/types/asset-manager.mjs +5 -5
  61. package/types/asset-manager.mjs.map +1 -1
  62. package/types/client-manager.d.ts +79 -18
  63. package/types/client-manager.js +79 -18
  64. package/types/client-manager.js.map +1 -1
  65. package/types/client-manager.mjs +79 -18
  66. package/types/client-manager.mjs.map +1 -1
  67. package/types/composer.d.ts +599 -1
  68. package/types/composer.js +575 -1
  69. package/types/composer.js.map +1 -1
  70. package/types/composer.mjs +575 -1
  71. package/types/composer.mjs.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"client-manager.js","sources":["../../src/types/client-manager.ts"],"sourcesContent":["import algosdk, { SuggestedParams } from 'algosdk'\nimport { AlgoHttpClientWithRetry } from './algo-http-client-with-retry'\nimport { AlgorandClientInterface } from './algorand-client-interface'\nimport { AppClient, AppClientParams, ResolveAppClientByCreatorAndName } from './app-client'\nimport { AppFactory, AppFactoryParams } from './app-factory'\nimport { TestNetDispenserApiClient, TestNetDispenserApiClientParams } from './dispenser-client'\nimport { Expand } from './expand'\nimport { AlgoClientConfig, AlgoConfig, NetworkDetails, genesisIdIsLocalNet } from './network-client'\nimport Kmd = algosdk.Kmd\nimport Indexer = algosdk.Indexer\nimport Algodv2 = algosdk.Algodv2\n\n/** Clients from algosdk that interact with the official Algorand APIs */\nexport interface AlgoSdkClients {\n /** Algod client, see https://developer.algorand.org/docs/rest-apis/algod/ */\n algod: algosdk.Algodv2\n /** Optional indexer client, see https://developer.algorand.org/docs/rest-apis/indexer/ */\n indexer?: algosdk.Indexer\n /** Optional KMD client, see https://developer.algorand.org/docs/rest-apis/kmd/ */\n kmd?: algosdk.Kmd\n}\n\n/** Params to get an app factory from `ClientManager`. */\nexport type ClientAppFactoryParams = Expand<Omit<AppFactoryParams, 'algorand'>>\n\n/** Params to get an app client by creator address and name from `ClientManager`. */\nexport type ClientResolveAppClientByCreatorAndNameParams = Expand<Omit<ResolveAppClientByCreatorAndName, 'algorand'>>\n\n/** Params to get an app client by ID from `ClientManager`. */\nexport type ClientAppClientParams = Expand<Omit<AppClientParams, 'algorand'>>\n\n/** Params to get an app client by network from `ClientManager`. */\nexport type ClientAppClientByNetworkParams = Expand<Omit<AppClientParams, 'algorand' | 'appId'>>\n\n/** Params to get a typed app client by creator address and name from `ClientManager`. */\nexport type ClientTypedAppClientByCreatorAndNameParams = Expand<Omit<ResolveAppClientByCreatorAndName, 'algorand' | 'appSpec'>>\n\n/** Params to get a typed app client by ID from `ClientManager`. */\nexport type ClientTypedAppClientParams = Expand<Omit<AppClientParams, 'algorand' | 'appSpec'>>\n\n/** Params to get a typed app client by network from `ClientManager`. */\nexport type ClientTypedAppClientByNetworkParams = Expand<Omit<AppClientParams, 'algorand' | 'appSpec' | 'appId'>>\n\n/** Params to get a typed app factory from `ClientManager`. */\nexport type ClientTypedAppFactoryParams = Expand<Omit<AppFactoryParams, 'algorand' | 'appSpec'>>\n\n/** Exposes access to various API clients. */\nexport class ClientManager {\n private _algod: algosdk.Algodv2\n private _indexer?: algosdk.Indexer\n private _kmd?: algosdk.Kmd\n private _algorand?: AlgorandClientInterface\n\n /**\n * algosdk clients or config for interacting with the official Algorand APIs.\n * @param clientsOrConfig The clients or config to use\n * @example Algod client only\n * ```typescript\n * const clientManager = new ClientManager({ algod: algodClient })\n * ```\n * @example All clients\n * ```typescript\n * const clientManager = new ClientManager({ algod: algodClient, indexer: indexerClient, kmd: kmdClient })\n * ```\n * @example Algod config only\n * ```typescript\n * const clientManager = new ClientManager({ algodConfig })\n * ```\n * @example All client configs\n * ```typescript\n * const clientManager = new ClientManager({ algodConfig, indexerConfig, kmdConfig })\n * ```\n */\n constructor(clientsOrConfig: AlgoConfig | AlgoSdkClients, algorandClient?: AlgorandClientInterface) {\n const _clients =\n 'algod' in clientsOrConfig\n ? clientsOrConfig\n : {\n algod: ClientManager.getAlgodClient(clientsOrConfig.algodConfig),\n indexer: clientsOrConfig.indexerConfig ? ClientManager.getIndexerClient(clientsOrConfig.indexerConfig) : undefined,\n kmd: clientsOrConfig.kmdConfig ? ClientManager.getKmdClient(clientsOrConfig.kmdConfig) : undefined,\n }\n this._algod = _clients.algod\n this._indexer = _clients.indexer\n this._kmd = _clients.kmd\n this._algorand = algorandClient\n }\n\n /** Returns an algosdk Algod API client. */\n public get algod(): algosdk.Algodv2 {\n return this._algod\n }\n\n /** Returns an algosdk Indexer API client or throws an error if it's not been provided. */\n public get indexer(): algosdk.Indexer {\n if (!this._indexer) throw new Error('Attempt to use Indexer client in AlgoKit instance with no Indexer configured')\n return this._indexer\n }\n\n /** Returns an algosdk Indexer API client or `undefined` if it's not been provided. */\n public get indexerIfPresent(): algosdk.Indexer | undefined {\n return this._indexer\n }\n\n /** Returns an algosdk KMD API client or throws an error if it's not been provided. */\n public get kmd(): algosdk.Kmd {\n if (!this._kmd) throw new Error('Attempt to use Kmd client in AlgoKit instance with no Kmd configured')\n return this._kmd\n }\n\n private _getNetworkPromise: Promise<SuggestedParams> | undefined\n /**\n * Get details about the current network.\n * @example Getting genesis ID\n * ```typescript\n * const network = await networkClient.network()\n * const genesisId = network.genesisId\n * ```\n * @returns The current network details\n */\n public async network(): Promise<NetworkDetails> {\n if (!this._getNetworkPromise) {\n this._getNetworkPromise = this._algod.getTransactionParams().do()\n }\n\n const params = await this._getNetworkPromise\n return {\n isTestNet: ['testnet-v1.0', 'testnet-v1', 'testnet'].includes(params.genesisID ?? 'unknown'),\n isMainNet: ['mainnet-v1.0', 'mainnet-v1', 'mainnet'].includes(params.genesisID ?? 'unknown'),\n isLocalNet: ClientManager.genesisIdIsLocalNet(params.genesisID ?? 'unknown'),\n genesisId: params.genesisID ?? 'unknown',\n genesisHash: params.genesisHash ? Buffer.from(params.genesisHash).toString('base64') : 'unknown',\n }\n }\n\n /**\n * Returns true if the given network genesisId is associated with a LocalNet network.\n * @param genesisId The network genesis ID\n * @returns Whether the given genesis ID is associated with a LocalNet network\n */\n public static genesisIdIsLocalNet(genesisId: string) {\n return genesisIdIsLocalNet(genesisId)\n }\n\n /**\n * Returns true if the current network is LocalNet.\n * @returns True if the current network is LocalNet.\n */\n public async isLocalNet() {\n return (await this.network()).isLocalNet\n }\n\n /**\n * Returns true if the current network is TestNet.\n * @returns True if the current network is TestNet.\n */\n public async isTestNet() {\n return (await this.network()).isTestNet\n }\n\n /**\n * Returns true if the current network is MainNet.\n * @returns True if the current network is MainNet.\n */\n public async isMainNet() {\n return (await this.network()).isMainNet\n }\n\n /**\n * Returns a TestNet Dispenser API client.\n *\n * Refer to [docs](https://github.com/algorandfoundation/algokit/blob/main/docs/testnet_api.md) on guidance to obtain an access token.\n *\n * @param params An object containing parameters for the TestNetDispenserApiClient class.\n * @example\n * const client = clientManager.getTestNetDispenser(\n * {\n * authToken: 'your_auth_token',\n * requestTimeout: 15,\n * }\n * )\n *\n * @returns An instance of the TestNetDispenserApiClient class.\n */\n public getTestNetDispenser(params: TestNetDispenserApiClientParams) {\n return new TestNetDispenserApiClient(params)\n }\n\n /**\n * Returns a TestNet Dispenser API client, loading the auth token from `process.env.ALGOKIT_DISPENSER_ACCESS_TOKEN`.\n *\n * Refer to [docs](https://github.com/algorandfoundation/algokit/blob/main/docs/testnet_api.md) on guidance to obtain an access token.\n *\n * @param params An object containing parameters for the TestNetDispenserApiClient class.\n * @example\n * const client = clientManager.getTestNetDispenserFromEnvironment(\n * {\n * requestTimeout: 15,\n * }\n * )\n *\n * @returns An instance of the TestNetDispenserApiClient class.\n */\n public getTestNetDispenserFromEnvironment(params?: Omit<TestNetDispenserApiClientParams, 'authToken'>) {\n return new TestNetDispenserApiClient(params ? { ...params, authToken: '' } : undefined)\n }\n\n /**\n * Returns a new `AppFactory` client\n * @example Basic example\n * ```typescript\n * const factory = algorand.client.getAppFactory({\n * appSpec: '{/* ARC-56 or ARC-32 compatible JSON *\\/}',\n * })\n * ```\n * @example Advanced example\n * ```typescript\n * const factory = algorand.client.getAppFactory({\n * appSpec: parsedAppSpec_AppSpec_or_Arc56Contract,\n * defaultSender: \"SENDERADDRESS\",\n * appName: \"OverriddenAppName\",\n * version: \"2.0.0\",\n * updatable: true,\n * deletable: false,\n * deployTimeParams: { ONE: 1, TWO: 'value' }\n * })\n * ```\n */\n public getAppFactory(params: ClientAppFactoryParams) {\n if (!this._algorand) {\n throw new Error('Attempt to get app factory from a ClientManager without an Algorand client')\n }\n\n return new AppFactory({ ...params, algorand: this._algorand })\n }\n\n /**\n * Returns a new `AppClient` client for managing calls and state for an ARC-32/ARC-56 app.\n * This method resolves the app ID by looking up the creator address and name\n * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).\n * @param params The parameters to create the app client\n * @example Basic\n * ```typescript\n * const appClient = algorand.client.getAppClientByCreatorAndName({\n * appSpec: '{/* ARC-56 or ARC-32 compatible JSON *\\}',\n * // appId resolved by looking for app ID of named app by this creator\n * creatorAddress: 'CREATORADDRESS',\n * })\n * ```\n * @returns The `AppClient`\n */\n public getAppClientByCreatorAndName(params: ClientResolveAppClientByCreatorAndNameParams) {\n if (!this._algorand) {\n throw new Error('Attempt to get app client from a ClientManager without an Algorand client')\n }\n\n return AppClient.fromCreatorAndName({\n ...params,\n algorand: this._algorand,\n })\n }\n\n /**\n * Returns a new `AppClient` client for managing calls and state for an ARC-32/ARC-56 app.\n * @param params The parameters to create the app client\n * @example Basic\n * ```typescript\n * const appClient = algorand.client.getAppClientById({\n * appSpec: '{/* ARC-56 or ARC-32 compatible JSON *\\}',\n * appId: 12345n,\n * })\n * ```\n * @returns The `AppClient`\n */\n public getAppClientById(params: ClientAppClientParams) {\n if (!this._algorand) {\n throw new Error('Attempt to get app client from a ClientManager without an Algorand client')\n }\n return new AppClient({ ...params, algorand: this._algorand })\n }\n\n /**\n * Returns a new `AppClient` client for managing calls and state for an ARC-56 app.\n * This method resolves the app ID for the current network based on\n * pre-determined network-specific app IDs specified in the ARC-56 app spec.\n *\n * If no IDs are in the app spec or the network isn't recognised, an error is thrown.\n * @param params The parameters to create the app client\n * @example Basic\n * ```typescript\n * const appClient = algorand.client.getAppClientByNetwork({\n * appSpec: '{/* ARC-56 or ARC-32 compatible JSON *\\}',\n * // appId resolved by using ARC-56 spec to find app ID for current network\n * })\n * ```\n * @returns The `AppClient`\n */\n public async getAppClientByNetwork(params: ClientAppClientByNetworkParams) {\n if (!this._algorand) {\n throw new Error('Attempt to get app client from a ClientManager without an Algorand client')\n }\n return AppClient.fromNetwork({ ...params, algorand: this._algorand })\n }\n\n /**\n * Returns a new typed client, resolving the app by creator address and name.\n * @param typedClient The typed client type to use\n * @param params The params to resolve the app by creator address and name\n * @example Use name in ARC-32 / ARC-56 app spec\n * ```typescript\n * const appClient = algorand.client.getTypedAppClientByCreatorAndName(MyContractClient, {\n * creatorAddress: \"CREATORADDRESS\",\n * defaultSender: alice,\n * })\n * ```\n * @example Specify name\n * ```typescript\n * const appClient = algorand.client.getTypedAppClientByCreatorAndName(MyContractClient, {\n * creatorAddress: \"CREATORADDRESS\",\n * name: \"contract-name\",\n * defaultSender: alice,\n * })\n * ```\n * @returns The typed client instance\n */\n public async getTypedAppClientByCreatorAndName<TClient extends TypedAppClient<InstanceType<TClient>>>(\n typedClient: TClient,\n params: ClientTypedAppClientByCreatorAndNameParams,\n ) {\n if (!this._algorand) {\n throw new Error('Attempt to get app client from a ClientManager without an Algorand client')\n }\n\n return typedClient.fromCreatorAndName({ ...params, algorand: this._algorand })\n }\n\n /**\n * Returns a new typed client, resolving the app by app ID.\n * @param typedClient The typed client type to use\n * @param params The params to resolve the app by ID\n * @example\n * ```typescript\n * const appClient = algorand.client.getTypedAppClientById(MyContractClient, {\n * appId: 12345n,\n * defaultSender: alice,\n * })\n * ```\n * @returns The typed client instance\n */\n public getTypedAppClientById<TClient extends TypedAppClient<InstanceType<TClient>>>(\n typedClient: TClient,\n params: ClientTypedAppClientParams,\n ) {\n if (!this._algorand) {\n throw new Error('Attempt to get app client from a ClientManager without an Algorand client')\n }\n\n return new typedClient({ ...params, algorand: this._algorand })\n }\n\n /**\n * Returns a new typed client, resolves the app ID for the current network based on\n * pre-determined network-specific app IDs specified in the ARC-56 app spec.\n *\n * If no IDs are in the app spec or the network isn't recognised, an error is thrown.\n * @param typedClient The typed client type to use\n * @param params The params to resolve the app by network\n * @example\n * ```typescript\n * const appClient = algorand.client.getTypedAppClientByNetwork(MyContractClient, {\n * defaultSender: alice,\n * })\n * ```\n * @returns The typed client instance\n */\n public getTypedAppClientByNetwork<TClient extends TypedAppClient<InstanceType<TClient>>>(\n typedClient: TClient,\n params?: ClientTypedAppClientByNetworkParams,\n ) {\n if (!this._algorand) {\n throw new Error('Attempt to get app client from a ClientManager without an Algorand client')\n }\n\n return typedClient.fromNetwork({ ...params, algorand: this._algorand })\n }\n\n /**\n * Returns a new typed app factory.\n * @param typedFactory The typed factory type to use\n * @param params The params to resolve the factory by\n * @example\n * ```typescript\n * const appFactory = algorand.client.getTypedAppFactory(MyContractClient, {\n * sender: alice,\n * })\n * ```\n * @returns The typed client instance\n */\n public getTypedAppFactory<TClient>(typedFactory: TypedAppFactory<TClient>, params?: ClientTypedAppFactoryParams) {\n if (!this._algorand) {\n throw new Error('Attempt to get app factory from a ClientManager without an Algorand client')\n }\n\n return new typedFactory({ ...params, algorand: this._algorand })\n }\n\n /**\n * Retrieve client configurations from environment variables when defined or get defaults (expects to be called from a Node.js environment)\n *\n * If both `process.env.INDEXER_SERVER` and `process.env.ALGOD_SERVER` is defined it will use both along with optional `process.env.ALGOD_PORT`, `process.env.ALGOD_TOKEN`, `process.env.INDEXER_PORT` and `process.env.INDEXER_TOKEN`.\n *\n * If only `process.env.ALGOD_SERVER` is defined it will use this along with optional `process.env.ALGOD_PORT` and `process.env.ALGOD_TOKEN` and leave indexer as `undefined`.\n *\n * If only `process.env.INDEXER_SERVER` is defined it will use the default (LocalNet) configuration for both algod and indexer.\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 * @example\n * ```typescript\n * const config = ClientManager.getConfigFromEnvironmentOrLocalNet()\n * ```\n * @returns The config for algod, indexer and kmd\n */\n public static getConfigFromEnvironmentOrLocalNet(): AlgoConfig {\n if (!process || !process.env) {\n throw new Error('Attempt to get default client configuration from a non Node.js context; supply the config instead')\n }\n const [algodConfig, indexerConfig, kmdConfig] = process.env.ALGOD_SERVER\n ? [\n ClientManager.getAlgodConfigFromEnvironment(),\n process.env.INDEXER_SERVER ? ClientManager.getIndexerConfigFromEnvironment() : undefined,\n !process.env.ALGOD_SERVER.includes('mainnet') && !process.env.ALGOD_SERVER.includes('testnet')\n ? { ...ClientManager.getAlgodConfigFromEnvironment(), port: process?.env?.KMD_PORT ?? '4002' }\n : undefined,\n ]\n : [\n ClientManager.getDefaultLocalNetConfig('algod'),\n ClientManager.getDefaultLocalNetConfig('indexer'),\n ClientManager.getDefaultLocalNetConfig('kmd'),\n ]\n\n return {\n algodConfig,\n indexerConfig,\n kmdConfig,\n }\n }\n\n /** Retrieve the algod configuration from environment variables (expects to be called from a Node.js environment)\n *\n * Expects `process.env.ALGOD_SERVER` to be defined, and you can also specify `process.env.ALGOD_PORT` and `process.env.ALGOD_TOKEN`.\n */\n public static getAlgodConfigFromEnvironment(): AlgoClientConfig {\n if (!process || !process.env) {\n throw new Error('Attempt to get default algod configuration from a non Node.js context; supply the config instead')\n }\n\n if (!process.env.ALGOD_SERVER) {\n throw new Error('Attempt to get default algod configuration without specifying ALGOD_SERVER in the environment variables')\n }\n\n return {\n server: process.env.ALGOD_SERVER,\n port: process.env.ALGOD_PORT,\n token: process.env.ALGOD_TOKEN,\n }\n }\n\n /**\n * Retrieve the indexer configuration from environment variables (expects to be called from a Node.js environment).\n *\n * Expects `process.env.INDEXER_SERVER` to be defined, and you can also specify `process.env.INDEXER_PORT` and `process.env.INDEXER_TOKEN`.\n */\n public static getIndexerConfigFromEnvironment(): AlgoClientConfig {\n if (!process || !process.env) {\n throw new Error('Attempt to get default indexer configuration from a non Node.js context; supply the config instead')\n }\n\n if (!process.env.INDEXER_SERVER) {\n throw new Error('Attempt to get default indexer configuration without specifying INDEXER_SERVER in the environment variables')\n }\n\n return {\n server: process.env.INDEXER_SERVER,\n port: process.env.INDEXER_PORT,\n token: process.env.INDEXER_TOKEN,\n }\n }\n\n /** Returns the Algorand configuration to point to the free tier of the AlgoNode service.\n *\n * @param network Which network to connect to - TestNet or MainNet\n * @param config Which algod config to return - Algod or Indexer\n */\n public static getAlgoNodeConfig(network: 'testnet' | 'mainnet', config: 'algod' | 'indexer'): AlgoClientConfig {\n return {\n server: `https://${network}-${config === 'algod' ? 'api' : 'idx'}.algonode.cloud/`,\n port: 443,\n }\n }\n\n /** Returns the Algorand configuration to point to the default LocalNet.\n *\n * @param configOrPort Which algod config to return - algod, kmd, or indexer OR a port number\n */\n public static getDefaultLocalNetConfig(configOrPort: 'algod' | 'indexer' | 'kmd' | number): AlgoClientConfig {\n return {\n server: `http://localhost`,\n port: configOrPort === 'algod' ? 4001 : configOrPort === 'indexer' ? 8980 : configOrPort === 'kmd' ? 4002 : configOrPort,\n token: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',\n }\n }\n\n /**\n * Returns an algod SDK client that automatically retries on idempotent calls.\n *\n * @param config The config of the client\n * @example AlgoNode (testnet)\n * ```typescript\n * const algod = ClientManager.getAlgodClient(ClientManager.getAlgoNodeConfig('testnet', 'algod'))\n * await algod.healthCheck().do()\n * ```\n * @example AlgoNode (mainnet)\n * ```typescript\n * const algod = ClientManager.getAlgodClient(ClientManager.getAlgoNodeConfig('mainnet', 'algod'))\n * await algod.healthCheck().do()\n * ```\n * @example Custom (e.g. default LocalNet)\n * ```typescript\n * const algod = ClientManager.getAlgodClient({server: 'http://localhost', port: '4001', token: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'})\n * await algod.healthCheck().do()\n * ```\n */\n public static getAlgodClient(config: AlgoClientConfig): Algodv2 {\n const { token, server, port } = config\n const tokenHeader = typeof token === 'string' ? { 'X-Algo-API-Token': token } : (token ?? {})\n const httpClientWithRetry = new AlgoHttpClientWithRetry(tokenHeader, server, port)\n return new algosdk.Algodv2(httpClientWithRetry, server)\n }\n\n /**\n * Returns an algod SDK client that automatically retries on idempotent calls loaded from environment variables (expects to be called from a Node.js environment).\n *\n * @example\n * ```typescript\n * // Uses process.env.ALGOD_SERVER, process.env.ALGOD_PORT and process.env.ALGOD_TOKEN\n * const algod = ClientManager.getAlgodClientFromEnvironment()\n * await algod.healthCheck().do()\n * ```\n */\n public static getAlgodClientFromEnvironment(): Algodv2 {\n return ClientManager.getAlgodClient(ClientManager.getAlgodConfigFromEnvironment())\n }\n\n /**\n * Returns an indexer SDK client that automatically retries on idempotent calls\n *\n * @param config The config of the client\n * @example AlgoNode (testnet)\n * ```typescript\n * const indexer = ClientManager.getIndexerClient(ClientManager.getAlgoNodeConfig('testnet', 'indexer'))\n * await indexer.makeHealthCheck().do()\n * ```\n * @example AlgoNode (mainnet)\n * ```typescript\n * const indexer = ClientManager.getIndexerClient(ClientManager.getAlgoNodeConfig('mainnet', 'indexer'))\n * await indexer.makeHealthCheck().do()\n * ```\n * @example Custom (e.g. default LocalNet, although we recommend loading this into a .env and using the Default option instead)\n * ```typescript\n * const indexer = ClientManager.getIndexerClient({server: 'http://localhost', port: '8980', token: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'})\n * await indexer.makeHealthCheck().do()\n * ```\n */\n public static getIndexerClient(config: AlgoClientConfig): Indexer {\n const { token, server, port } = config\n const tokenHeader = typeof token === 'string' ? { 'X-Indexer-API-Token': token } : (token ?? {})\n const httpClientWithRetry = new AlgoHttpClientWithRetry(tokenHeader, server, port)\n return new Indexer(httpClientWithRetry)\n }\n\n /**\n * Returns an indexer SDK client that automatically retries on idempotent calls loaded from environment variables (expects to be called from a Node.js environment).\n *\n * @example\n *\n * ```typescript\n * // Uses process.env.INDEXER_SERVER, process.env.INDEXER_PORT and process.env.INDEXER_TOKEN\n * const indexer = ClientManager.getIndexerClientFromEnvironment()\n * await indexer.makeHealthCheck().do()\n * ```\n */\n public static getIndexerClientFromEnvironment(): Indexer {\n return ClientManager.getIndexerClient(ClientManager.getIndexerConfigFromEnvironment())\n }\n\n /**\n * Returns a KMD SDK client.\n *\n * KMD client allows you to export private keys, which is useful to (for instance) get the default account in a LocalNet network.\n *\n * @param config The config for the client\n * @example Custom (e.g. default LocalNet, although we recommend loading this into a .env and using the Default option instead)\n * ```typescript\n * const kmd = ClientManager.getKmdClient({server: 'http://localhost', port: '4002', token: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'})\n * ```\n */\n public static getKmdClient(config: AlgoClientConfig): Kmd {\n const { token, server, port } = config\n return new Kmd(token as string, server, port)\n }\n\n /**\n * Returns a KMD SDK client that automatically retries on idempotent calls loaded from environment variables (expects to be called from a Node.js environment).\n *\n * @example\n * ```typescript\n * // Uses process.env.ALGOD_SERVER, process.env.KMD_PORT (or if not specified: port 4002) and process.env.ALGOD_TOKEN\n * const kmd = ClientManager.getKmdClientFromEnvironment()\n * ```\n */\n public static getKmdClientFromEnvironment(): Kmd {\n // We can only use Kmd on the LocalNet otherwise it's not exposed so this makes some assumptions\n // (e.g. same token and server as algod and port 4002 by default)\n return ClientManager.getKmdClient({ ...ClientManager.getAlgodConfigFromEnvironment(), port: process?.env?.KMD_PORT ?? '4002' })\n }\n}\n\n/**\n * Interface to identify a typed client that can be used to interact with an application.\n */\nexport interface TypedAppClient<TClient> {\n new (params: Omit<AppClientParams, 'appSpec'>): TClient\n fromNetwork(params: Omit<AppClientParams, 'appId' | 'appSpec'>): Promise<TClient>\n fromCreatorAndName(params: Omit<ResolveAppClientByCreatorAndName, 'appSpec'>): Promise<TClient>\n}\n\n/**\n * Interface to identify a typed factory that can be used to create and deploy an application.\n */\nexport interface TypedAppFactory<TClient> {\n new (params: Omit<AppFactoryParams, 'appSpec'>): TClient\n}\n"],"names":["genesisIdIsLocalNet","TestNetDispenserApiClient","AppFactory","AppClient","AlgoHttpClientWithRetry"],"mappings":"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"}
1
+ {"version":3,"file":"client-manager.js","sources":["../../src/types/client-manager.ts"],"sourcesContent":["import algosdk, { SuggestedParams } from 'algosdk'\nimport { AlgoHttpClientWithRetry } from './algo-http-client-with-retry'\nimport { AlgorandClientInterface } from './algorand-client-interface'\nimport { AppClient, AppClientParams, ResolveAppClientByCreatorAndName } from './app-client'\nimport { AppFactory, AppFactoryParams } from './app-factory'\nimport { TestNetDispenserApiClient, TestNetDispenserApiClientParams } from './dispenser-client'\nimport { Expand } from './expand'\nimport { AlgoClientConfig, AlgoConfig, NetworkDetails, genesisIdIsLocalNet } from './network-client'\nimport Kmd = algosdk.Kmd\nimport Indexer = algosdk.Indexer\nimport Algodv2 = algosdk.Algodv2\n\n/** Clients from algosdk that interact with the official Algorand APIs */\nexport interface AlgoSdkClients {\n /** Algod client, see https://developer.algorand.org/docs/rest-apis/algod/ */\n algod: algosdk.Algodv2\n /** Optional indexer client, see https://developer.algorand.org/docs/rest-apis/indexer/ */\n indexer?: algosdk.Indexer\n /** Optional KMD client, see https://developer.algorand.org/docs/rest-apis/kmd/ */\n kmd?: algosdk.Kmd\n}\n\n/** Params to get an app factory from `ClientManager`. */\nexport type ClientAppFactoryParams = Expand<Omit<AppFactoryParams, 'algorand'>>\n\n/** Params to get an app client by creator address and name from `ClientManager`. */\nexport type ClientResolveAppClientByCreatorAndNameParams = Expand<Omit<ResolveAppClientByCreatorAndName, 'algorand'>>\n\n/** Params to get an app client by ID from `ClientManager`. */\nexport type ClientAppClientParams = Expand<Omit<AppClientParams, 'algorand'>>\n\n/** Params to get an app client by network from `ClientManager`. */\nexport type ClientAppClientByNetworkParams = Expand<Omit<AppClientParams, 'algorand' | 'appId'>>\n\n/** Params to get a typed app client by creator address and name from `ClientManager`. */\nexport type ClientTypedAppClientByCreatorAndNameParams = Expand<Omit<ResolveAppClientByCreatorAndName, 'algorand' | 'appSpec'>>\n\n/** Params to get a typed app client by ID from `ClientManager`. */\nexport type ClientTypedAppClientParams = Expand<Omit<AppClientParams, 'algorand' | 'appSpec'>>\n\n/** Params to get a typed app client by network from `ClientManager`. */\nexport type ClientTypedAppClientByNetworkParams = Expand<Omit<AppClientParams, 'algorand' | 'appSpec' | 'appId'>>\n\n/** Params to get a typed app factory from `ClientManager`. */\nexport type ClientTypedAppFactoryParams = Expand<Omit<AppFactoryParams, 'algorand' | 'appSpec'>>\n\n/** Exposes access to various API clients. */\nexport class ClientManager {\n private _algod: algosdk.Algodv2\n private _indexer?: algosdk.Indexer\n private _kmd?: algosdk.Kmd\n private _algorand?: AlgorandClientInterface\n\n /**\n * algosdk clients or config for interacting with the official Algorand APIs.\n * @param clientsOrConfig The clients or config to use\n * @example Algod client only\n * ```typescript\n * const clientManager = new ClientManager({ algod: algodClient })\n * ```\n * @example All clients\n * ```typescript\n * const clientManager = new ClientManager({ algod: algodClient, indexer: indexerClient, kmd: kmdClient })\n * ```\n * @example Algod config only\n * ```typescript\n * const clientManager = new ClientManager({ algodConfig })\n * ```\n * @example All client configs\n * ```typescript\n * const clientManager = new ClientManager({ algodConfig, indexerConfig, kmdConfig })\n * ```\n */\n constructor(clientsOrConfig: AlgoConfig | AlgoSdkClients, algorandClient?: AlgorandClientInterface) {\n const _clients =\n 'algod' in clientsOrConfig\n ? clientsOrConfig\n : {\n algod: ClientManager.getAlgodClient(clientsOrConfig.algodConfig),\n indexer: clientsOrConfig.indexerConfig ? ClientManager.getIndexerClient(clientsOrConfig.indexerConfig) : undefined,\n kmd: clientsOrConfig.kmdConfig ? ClientManager.getKmdClient(clientsOrConfig.kmdConfig) : undefined,\n }\n this._algod = _clients.algod\n this._indexer = _clients.indexer\n this._kmd = _clients.kmd\n this._algorand = algorandClient\n }\n\n /**\n * Returns an algosdk Algod API client.\n * @returns The Algod client\n */\n public get algod(): algosdk.Algodv2 {\n return this._algod\n }\n\n /**\n * Returns an algosdk Indexer API client or throws an error if it's not been provided.\n * @returns The Indexer client\n * @throws Error if no Indexer client is configured\n */\n public get indexer(): algosdk.Indexer {\n if (!this._indexer) throw new Error('Attempt to use Indexer client in AlgoKit instance with no Indexer configured')\n return this._indexer\n }\n\n /**\n * Returns an algosdk Indexer API client or `undefined` if it's not been provided.\n * @returns The Indexer client or `undefined`\n */\n public get indexerIfPresent(): algosdk.Indexer | undefined {\n return this._indexer\n }\n\n /**\n * Returns an algosdk KMD API client or throws an error if it's not been provided.\n * @returns The KMD client\n * @throws Error if no KMD client is configured\n */\n public get kmd(): algosdk.Kmd {\n if (!this._kmd) throw new Error('Attempt to use Kmd client in AlgoKit instance with no Kmd configured')\n return this._kmd\n }\n\n private _getNetworkPromise: Promise<SuggestedParams> | undefined\n /**\n * Get details about the current network.\n * @example Getting genesis ID\n * ```typescript\n * const network = await networkClient.network()\n * const genesisId = network.genesisId\n * ```\n * @returns The current network details\n */\n public async network(): Promise<NetworkDetails> {\n if (!this._getNetworkPromise) {\n this._getNetworkPromise = this._algod.getTransactionParams().do()\n }\n\n const params = await this._getNetworkPromise\n return {\n isTestNet: ['testnet-v1.0', 'testnet-v1', 'testnet'].includes(params.genesisID ?? 'unknown'),\n isMainNet: ['mainnet-v1.0', 'mainnet-v1', 'mainnet'].includes(params.genesisID ?? 'unknown'),\n isLocalNet: ClientManager.genesisIdIsLocalNet(params.genesisID ?? 'unknown'),\n genesisId: params.genesisID ?? 'unknown',\n genesisHash: params.genesisHash ? Buffer.from(params.genesisHash).toString('base64') : 'unknown',\n }\n }\n\n /**\n * Returns true if the given network genesisId is associated with a LocalNet network.\n * @param genesisId The network genesis ID\n * @returns Whether the given genesis ID is associated with a LocalNet network\n * @example\n * ```typescript\n * const isLocalNet = ClientManager.genesisIdIsLocalNet('testnet-v1.0')\n * ```\n */\n public static genesisIdIsLocalNet(genesisId: string) {\n return genesisIdIsLocalNet(genesisId)\n }\n\n /**\n * Returns true if the current network is LocalNet.\n * @returns True if the current network is LocalNet.\n * @example\n * ```typescript\n * const isLocalNet = await clientManager.isLocalNet()\n * ```\n */\n public async isLocalNet() {\n return (await this.network()).isLocalNet\n }\n\n /**\n * Returns true if the current network is TestNet.\n * @returns True if the current network is TestNet.\n * @example\n * ```typescript\n * const isTestNet = await clientManager.isTestNet()\n * ```\n */\n public async isTestNet() {\n return (await this.network()).isTestNet\n }\n\n /**\n * Returns true if the current network is MainNet.\n * @returns True if the current network is MainNet.\n * @example\n * ```typescript\n * const isMainNet = await clientManager.isMainNet()\n * ```\n */\n public async isMainNet() {\n return (await this.network()).isMainNet\n }\n\n /**\n * Returns a TestNet Dispenser API client.\n *\n * Refer to [docs](https://github.com/algorandfoundation/algokit/blob/main/docs/testnet_api.md) on guidance to obtain an access token.\n *\n * @param params An object containing parameters for the TestNetDispenserApiClient class.\n * @example\n * const client = clientManager.getTestNetDispenser(\n * {\n * authToken: 'your_auth_token',\n * requestTimeout: 15,\n * }\n * )\n *\n * @returns An instance of the TestNetDispenserApiClient class.\n */\n public getTestNetDispenser(params: TestNetDispenserApiClientParams) {\n return new TestNetDispenserApiClient(params)\n }\n\n /**\n * Returns a TestNet Dispenser API client, loading the auth token from `process.env.ALGOKIT_DISPENSER_ACCESS_TOKEN`.\n *\n * Refer to [docs](https://github.com/algorandfoundation/algokit/blob/main/docs/testnet_api.md) on guidance to obtain an access token.\n *\n * @param params An object containing parameters for the TestNetDispenserApiClient class.\n * @example\n * const client = clientManager.getTestNetDispenserFromEnvironment(\n * {\n * requestTimeout: 15,\n * }\n * )\n *\n * @returns An instance of the TestNetDispenserApiClient class.\n */\n public getTestNetDispenserFromEnvironment(params?: Omit<TestNetDispenserApiClientParams, 'authToken'>) {\n return new TestNetDispenserApiClient(params ? { ...params, authToken: '' } : undefined)\n }\n\n /**\n * Returns a new `AppFactory` client\n * @param params The parameters to create the app factory\n * @example Basic example\n * ```typescript\n * const factory = clientManager.getAppFactory({\n * appSpec: '{/* ARC-56 or ARC-32 compatible JSON *\\/}',\n * })\n * ```\n * @example Advanced example\n * ```typescript\n * const factory = clientManager.getAppFactory({\n * appSpec: parsedAppSpec_AppSpec_or_Arc56Contract,\n * defaultSender: \"SENDERADDRESS\",\n * appName: \"OverriddenAppName\",\n * version: \"2.0.0\",\n * updatable: true,\n * deletable: false,\n * deployTimeParams: { ONE: 1, TWO: 'value' }\n * })\n * ```\n * @returns The `AppFactory` instance\n */\n public getAppFactory(params: ClientAppFactoryParams) {\n if (!this._algorand) {\n throw new Error('Attempt to get app factory from a ClientManager without an Algorand client')\n }\n\n return new AppFactory({ ...params, algorand: this._algorand })\n }\n\n /**\n * Returns a new `AppClient` client for managing calls and state for an ARC-32/ARC-56 app.\n * This method resolves the app ID by looking up the creator address and name\n * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).\n * @param params The parameters to create the app client\n * @example Basic\n * ```typescript\n * const appClient = clientManager.getAppClientByCreatorAndName({\n * appSpec: '{/* ARC-56 or ARC-32 compatible JSON *\\}',\n * // appId resolved by looking for app ID of named app by this creator\n * creatorAddress: 'CREATORADDRESS',\n * })\n * ```\n * @returns The `AppClient` instance\n */\n public getAppClientByCreatorAndName(params: ClientResolveAppClientByCreatorAndNameParams) {\n if (!this._algorand) {\n throw new Error('Attempt to get app client from a ClientManager without an Algorand client')\n }\n\n return AppClient.fromCreatorAndName({\n ...params,\n algorand: this._algorand,\n })\n }\n\n /**\n * Returns a new `AppClient` client for managing calls and state for an ARC-32/ARC-56 app.\n * @param params The parameters to create the app client\n * @example Basic\n * ```typescript\n * const appClient = clientManager.getAppClientById({\n * appSpec: '{/* ARC-56 or ARC-32 compatible JSON *\\}',\n * appId: 12345n,\n * })\n * ```\n * @returns The `AppClient` instance\n */\n public getAppClientById(params: ClientAppClientParams) {\n if (!this._algorand) {\n throw new Error('Attempt to get app client from a ClientManager without an Algorand client')\n }\n return new AppClient({ ...params, algorand: this._algorand })\n }\n\n /**\n * Returns a new `AppClient` client for managing calls and state for an ARC-56 app.\n * This method resolves the app ID for the current network based on\n * pre-determined network-specific app IDs specified in the ARC-56 app spec.\n *\n * If no IDs are in the app spec or the network isn't recognised, an error is thrown.\n * @param params The parameters to create the app client\n * @example Basic\n * ```typescript\n * const appClient = clientManager.getAppClientByNetwork({\n * appSpec: '{/* ARC-56 or ARC-32 compatible JSON *\\}',\n * // appId resolved by using ARC-56 spec to find app ID for current network\n * })\n * ```\n * @returns The `AppClient` instance\n */\n public async getAppClientByNetwork(params: ClientAppClientByNetworkParams) {\n if (!this._algorand) {\n throw new Error('Attempt to get app client from a ClientManager without an Algorand client')\n }\n return AppClient.fromNetwork({ ...params, algorand: this._algorand })\n }\n\n /**\n * Returns a new typed client, resolving the app by creator address and name.\n * @param typedClient The typed client type to use\n * @param params The params to resolve the app by creator address and name\n * @example Use name in ARC-32 / ARC-56 app spec\n * ```typescript\n * const appClient = clientManager.getTypedAppClientByCreatorAndName(MyContractClient, {\n * creatorAddress: \"CREATORADDRESS\",\n * defaultSender: alice,\n * })\n * ```\n * @example Specify name\n * ```typescript\n * const appClient = clientManager.getTypedAppClientByCreatorAndName(MyContractClient, {\n * creatorAddress: \"CREATORADDRESS\",\n * name: \"contract-name\",\n * defaultSender: alice,\n * })\n * ```\n * @returns The typed client instance\n */\n public async getTypedAppClientByCreatorAndName<TClient extends TypedAppClient<InstanceType<TClient>>>(\n typedClient: TClient,\n params: ClientTypedAppClientByCreatorAndNameParams,\n ) {\n if (!this._algorand) {\n throw new Error('Attempt to get app client from a ClientManager without an Algorand client')\n }\n\n return typedClient.fromCreatorAndName({ ...params, algorand: this._algorand })\n }\n\n /**\n * Returns a new typed client, resolving the app by app ID.\n * @param typedClient The typed client type to use\n * @param params The params to resolve the app by ID\n * @example\n * ```typescript\n * const appClient = clientManager.getTypedAppClientById(MyContractClient, {\n * appId: 12345n,\n * defaultSender: alice,\n * })\n * ```\n * @returns The typed client instance\n */\n public getTypedAppClientById<TClient extends TypedAppClient<InstanceType<TClient>>>(\n typedClient: TClient,\n params: ClientTypedAppClientParams,\n ) {\n if (!this._algorand) {\n throw new Error('Attempt to get app client from a ClientManager without an Algorand client')\n }\n\n return new typedClient({ ...params, algorand: this._algorand })\n }\n\n /**\n * Returns a new typed client, resolves the app ID for the current network based on\n * pre-determined network-specific app IDs specified in the ARC-56 app spec.\n *\n * If no IDs are in the app spec or the network isn't recognised, an error is thrown.\n * @param typedClient The typed client type to use\n * @param params The params to resolve the app by network\n * @example\n * ```typescript\n * const appClient = clientManager.getTypedAppClientByNetwork(MyContractClient, {\n * defaultSender: alice,\n * })\n * ```\n * @returns The typed client instance\n */\n public getTypedAppClientByNetwork<TClient extends TypedAppClient<InstanceType<TClient>>>(\n typedClient: TClient,\n params?: ClientTypedAppClientByNetworkParams,\n ) {\n if (!this._algorand) {\n throw new Error('Attempt to get app client from a ClientManager without an Algorand client')\n }\n\n return typedClient.fromNetwork({ ...params, algorand: this._algorand })\n }\n\n /**\n * Returns a new typed app factory.\n * @param typedFactory The typed factory type to use\n * @param params The params to resolve the factory by\n * @example\n * ```typescript\n * const appFactory = clientManager.getTypedAppFactory(MyContractClient, {\n * sender: alice,\n * })\n * ```\n * @returns The typed client instance\n */\n public getTypedAppFactory<TClient>(typedFactory: TypedAppFactory<TClient>, params?: ClientTypedAppFactoryParams) {\n if (!this._algorand) {\n throw new Error('Attempt to get app factory from a ClientManager without an Algorand client')\n }\n\n return new typedFactory({ ...params, algorand: this._algorand })\n }\n\n /**\n * Retrieve client configurations from environment variables when defined or get defaults (expects to be called from a Node.js environment)\n *\n * If both `process.env.INDEXER_SERVER` and `process.env.ALGOD_SERVER` is defined it will use both along with optional `process.env.ALGOD_PORT`, `process.env.ALGOD_TOKEN`, `process.env.INDEXER_PORT` and `process.env.INDEXER_TOKEN`.\n *\n * If only `process.env.ALGOD_SERVER` is defined it will use this along with optional `process.env.ALGOD_PORT` and `process.env.ALGOD_TOKEN` and leave indexer as `undefined`.\n *\n * If only `process.env.INDEXER_SERVER` is defined it will use the default (LocalNet) configuration for both algod and indexer.\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 * @example\n * ```typescript\n * const config = ClientManager.getConfigFromEnvironmentOrLocalNet()\n * ```\n * @returns The config for algod, indexer and kmd\n */\n public static getConfigFromEnvironmentOrLocalNet(): AlgoConfig {\n if (!process || !process.env) {\n throw new Error('Attempt to get default client configuration from a non Node.js context; supply the config instead')\n }\n const [algodConfig, indexerConfig, kmdConfig] = process.env.ALGOD_SERVER\n ? [\n ClientManager.getAlgodConfigFromEnvironment(),\n process.env.INDEXER_SERVER ? ClientManager.getIndexerConfigFromEnvironment() : undefined,\n !process.env.ALGOD_SERVER.includes('mainnet') && !process.env.ALGOD_SERVER.includes('testnet')\n ? { ...ClientManager.getAlgodConfigFromEnvironment(), port: process?.env?.KMD_PORT ?? '4002' }\n : undefined,\n ]\n : [\n ClientManager.getDefaultLocalNetConfig('algod'),\n ClientManager.getDefaultLocalNetConfig('indexer'),\n ClientManager.getDefaultLocalNetConfig('kmd'),\n ]\n\n return {\n algodConfig,\n indexerConfig,\n kmdConfig,\n }\n }\n\n /**\n * Retrieve the algod configuration from environment variables (expects to be called from a Node.js environment)\n *\n * Expects `process.env.ALGOD_SERVER` to be defined, and you can also specify `process.env.ALGOD_PORT` and `process.env.ALGOD_TOKEN`.\n * @returns The Algod client configuration\n * @throws Error if `process.env.ALGOD_SERVER` is not defined\n * @example\n * ```typescript\n * const config = ClientManager.getAlgodConfigFromEnvironment()\n * ```\n */\n public static getAlgodConfigFromEnvironment(): AlgoClientConfig {\n if (!process || !process.env) {\n throw new Error('Attempt to get default algod configuration from a non Node.js context; supply the config instead')\n }\n\n if (!process.env.ALGOD_SERVER) {\n throw new Error('Attempt to get default algod configuration without specifying ALGOD_SERVER in the environment variables')\n }\n\n return {\n server: process.env.ALGOD_SERVER,\n port: process.env.ALGOD_PORT,\n token: process.env.ALGOD_TOKEN,\n }\n }\n\n /**\n * Retrieve the indexer configuration from environment variables (expects to be called from a Node.js environment).\n *\n * Expects `process.env.INDEXER_SERVER` to be defined, and you can also specify `process.env.INDEXER_PORT` and `process.env.INDEXER_TOKEN`.\n * @returns The Indexer client configuration\n * @throws Error if `process.env.INDEXER_SERVER` is not defined\n * @example\n * ```typescript\n * const config = ClientManager.getIndexerConfigFromEnvironment()\n * ```\n */\n public static getIndexerConfigFromEnvironment(): AlgoClientConfig {\n if (!process || !process.env) {\n throw new Error('Attempt to get default indexer configuration from a non Node.js context; supply the config instead')\n }\n\n if (!process.env.INDEXER_SERVER) {\n throw new Error('Attempt to get default indexer configuration without specifying INDEXER_SERVER in the environment variables')\n }\n\n return {\n server: process.env.INDEXER_SERVER,\n port: process.env.INDEXER_PORT,\n token: process.env.INDEXER_TOKEN,\n }\n }\n\n /** Returns the Algorand configuration to point to the free tier of the AlgoNode service.\n *\n * @param network Which network to connect to - TestNet or MainNet\n * @param config Which algod config to return - Algod or Indexer\n * @returns The AlgoNode client configuration\n * @example\n * ```typescript\n * const config = ClientManager.getAlgoNodeConfig('testnet', 'algod')\n * ```\n */\n public static getAlgoNodeConfig(network: 'testnet' | 'mainnet', config: 'algod' | 'indexer'): AlgoClientConfig {\n return {\n server: `https://${network}-${config === 'algod' ? 'api' : 'idx'}.algonode.cloud/`,\n port: 443,\n }\n }\n\n /** Returns the Algorand configuration to point to the default LocalNet.\n *\n * @param configOrPort Which algod config to return - algod, kmd, or indexer OR a port number\n * @returns The LocalNet client configuration\n * @example\n * ```typescript\n * const config = ClientManager.getDefaultLocalNetConfig('algod')\n * ```\n */\n public static getDefaultLocalNetConfig(configOrPort: 'algod' | 'indexer' | 'kmd' | number): AlgoClientConfig {\n return {\n server: `http://localhost`,\n port: configOrPort === 'algod' ? 4001 : configOrPort === 'indexer' ? 8980 : configOrPort === 'kmd' ? 4002 : configOrPort,\n token: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',\n }\n }\n\n /**\n * Returns an algod SDK client that automatically retries on idempotent calls.\n *\n * @param config The config of the client\n * @returns The Algod client\n * @example AlgoNode (testnet)\n * ```typescript\n * const algod = ClientManager.getAlgodClient(ClientManager.getAlgoNodeConfig('testnet', 'algod'))\n * await algod.healthCheck().do()\n * ```\n * @example AlgoNode (mainnet)\n * ```typescript\n * const algod = ClientManager.getAlgodClient(ClientManager.getAlgoNodeConfig('mainnet', 'algod'))\n * await algod.healthCheck().do()\n * ```\n * @example Custom (e.g. default LocalNet)\n * ```typescript\n * const algod = ClientManager.getAlgodClient({server: 'http://localhost', port: '4001', token: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'})\n * await algod.healthCheck().do()\n * ```\n */\n public static getAlgodClient(config: AlgoClientConfig): Algodv2 {\n const { token, server, port } = config\n const tokenHeader = typeof token === 'string' ? { 'X-Algo-API-Token': token } : (token ?? {})\n const httpClientWithRetry = new AlgoHttpClientWithRetry(tokenHeader, server, port)\n return new algosdk.Algodv2(httpClientWithRetry, server)\n }\n\n /**\n * Returns an algod SDK client that automatically retries on idempotent calls loaded from environment variables (expects to be called from a Node.js environment).\n *\n * @returns The Algod client\n * @example\n * ```typescript\n * // Uses process.env.ALGOD_SERVER, process.env.ALGOD_PORT and process.env.ALGOD_TOKEN\n * const algod = ClientManager.getAlgodClientFromEnvironment()\n * await algod.healthCheck().do()\n * ```\n */\n public static getAlgodClientFromEnvironment(): Algodv2 {\n return ClientManager.getAlgodClient(ClientManager.getAlgodConfigFromEnvironment())\n }\n\n /**\n * Returns an indexer SDK client that automatically retries on idempotent calls\n *\n * @param config The config of the client\n * @returns The Indexer client\n * @example AlgoNode (testnet)\n * ```typescript\n * const indexer = ClientManager.getIndexerClient(ClientManager.getAlgoNodeConfig('testnet', 'indexer'))\n * await indexer.makeHealthCheck().do()\n * ```\n * @example AlgoNode (mainnet)\n * ```typescript\n * const indexer = ClientManager.getIndexerClient(ClientManager.getAlgoNodeConfig('mainnet', 'indexer'))\n * await indexer.makeHealthCheck().do()\n * ```\n * @example Custom (e.g. default LocalNet, although we recommend loading this into a .env and using the Default option instead)\n * ```typescript\n * const indexer = ClientManager.getIndexerClient({server: 'http://localhost', port: '8980', token: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'})\n * await indexer.makeHealthCheck().do()\n * ```\n */\n public static getIndexerClient(config: AlgoClientConfig): Indexer {\n const { token, server, port } = config\n const tokenHeader = typeof token === 'string' ? { 'X-Indexer-API-Token': token } : (token ?? {})\n const httpClientWithRetry = new AlgoHttpClientWithRetry(tokenHeader, server, port)\n return new Indexer(httpClientWithRetry)\n }\n\n /**\n * Returns an indexer SDK client that automatically retries on idempotent calls loaded from environment variables (expects to be called from a Node.js environment).\n *\n * @returns The Indexer client\n * @example\n *\n * ```typescript\n * // Uses process.env.INDEXER_SERVER, process.env.INDEXER_PORT and process.env.INDEXER_TOKEN\n * const indexer = ClientManager.getIndexerClientFromEnvironment()\n * await indexer.makeHealthCheck().do()\n * ```\n */\n public static getIndexerClientFromEnvironment(): Indexer {\n return ClientManager.getIndexerClient(ClientManager.getIndexerConfigFromEnvironment())\n }\n\n /**\n * Returns a KMD SDK client.\n *\n * KMD client allows you to export private keys, which is useful to (for instance) get the default account in a LocalNet network.\n *\n * @param config The config for the client\n * @returns The KMD client\n * @example Custom (e.g. default LocalNet, although we recommend loading this into a .env and using the Default option instead)\n * ```typescript\n * const kmd = ClientManager.getKmdClient({server: 'http://localhost', port: '4002', token: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'})\n * ```\n */\n public static getKmdClient(config: AlgoClientConfig): Kmd {\n const { token, server, port } = config\n return new Kmd(token as string, server, port)\n }\n\n /**\n * Returns a KMD SDK client that automatically retries on idempotent calls loaded from environment variables (expects to be called from a Node.js environment).\n *\n * @returns The KMD client\n * @example\n * ```typescript\n * // Uses process.env.ALGOD_SERVER, process.env.KMD_PORT (or if not specified: port 4002) and process.env.ALGOD_TOKEN\n * const kmd = ClientManager.getKmdClientFromEnvironment()\n * ```\n */\n public static getKmdClientFromEnvironment(): Kmd {\n // We can only use Kmd on the LocalNet otherwise it's not exposed so this makes some assumptions\n // (e.g. same token and server as algod and port 4002 by default)\n return ClientManager.getKmdClient({ ...ClientManager.getAlgodConfigFromEnvironment(), port: process?.env?.KMD_PORT ?? '4002' })\n }\n}\n\n/**\n * Interface to identify a typed client that can be used to interact with an application.\n */\nexport interface TypedAppClient<TClient> {\n new (params: Omit<AppClientParams, 'appSpec'>): TClient\n fromNetwork(params: Omit<AppClientParams, 'appId' | 'appSpec'>): Promise<TClient>\n fromCreatorAndName(params: Omit<ResolveAppClientByCreatorAndName, 'appSpec'>): Promise<TClient>\n}\n\n/**\n * Interface to identify a typed factory that can be used to create and deploy an application.\n */\nexport interface TypedAppFactory<TClient> {\n new (params: Omit<AppFactoryParams, 'appSpec'>): TClient\n}\n"],"names":["genesisIdIsLocalNet","TestNetDispenserApiClient","AppFactory","AppClient","AlgoHttpClientWithRetry"],"mappings":";;;;;;;;;AAQA,IAAO,GAAG,GAAG,OAAO,CAAC,GAAG;AACxB,IAAO,OAAO,GAAG,OAAO,CAAC,OAAO;AAqChC;MACa,aAAa,CAAA;AAMxB;;;;;;;;;;;;;;;;;;;AAmBG;IACH,WAAY,CAAA,eAA4C,EAAE,cAAwC,EAAA;AAChG,QAAA,MAAM,QAAQ,GACZ,OAAO,IAAI;AACT,cAAE;AACF,cAAE;gBACE,KAAK,EAAE,aAAa,CAAC,cAAc,CAAC,eAAe,CAAC,WAAW,CAAC;AAChE,gBAAA,OAAO,EAAE,eAAe,CAAC,aAAa,GAAG,aAAa,CAAC,gBAAgB,CAAC,eAAe,CAAC,aAAa,CAAC,GAAG,SAAS;AAClH,gBAAA,GAAG,EAAE,eAAe,CAAC,SAAS,GAAG,aAAa,CAAC,YAAY,CAAC,eAAe,CAAC,SAAS,CAAC,GAAG,SAAS;aACnG;AACP,QAAA,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,KAAK;AAC5B,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,OAAO;AAChC,QAAA,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,GAAG;AACxB,QAAA,IAAI,CAAC,SAAS,GAAG,cAAc;;AAGjC;;;AAGG;AACH,IAAA,IAAW,KAAK,GAAA;QACd,OAAO,IAAI,CAAC,MAAM;;AAGpB;;;;AAIG;AACH,IAAA,IAAW,OAAO,GAAA;QAChB,IAAI,CAAC,IAAI,CAAC,QAAQ;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC;QACnH,OAAO,IAAI,CAAC,QAAQ;;AAGtB;;;AAGG;AACH,IAAA,IAAW,gBAAgB,GAAA;QACzB,OAAO,IAAI,CAAC,QAAQ;;AAGtB;;;;AAIG;AACH,IAAA,IAAW,GAAG,GAAA;QACZ,IAAI,CAAC,IAAI,CAAC,IAAI;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC;QACvG,OAAO,IAAI,CAAC,IAAI;;AAIlB;;;;;;;;AAQG;AACI,IAAA,MAAM,OAAO,GAAA;AAClB,QAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;AAC5B,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC,EAAE,EAAE;;AAGnE,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB;QAC5C,OAAO;AACL,YAAA,SAAS,EAAE,CAAC,cAAc,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,IAAI,SAAS,CAAC;AAC5F,YAAA,SAAS,EAAE,CAAC,cAAc,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,IAAI,SAAS,CAAC;YAC5F,UAAU,EAAE,aAAa,CAAC,mBAAmB,CAAC,MAAM,CAAC,SAAS,IAAI,SAAS,CAAC;AAC5E,YAAA,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,SAAS;YACxC,WAAW,EAAE,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,SAAS;SACjG;;AAGH;;;;;;;;AAQG;IACI,OAAO,mBAAmB,CAAC,SAAiB,EAAA;AACjD,QAAA,OAAOA,uCAAmB,CAAC,SAAS,CAAC;;AAGvC;;;;;;;AAOG;AACI,IAAA,MAAM,UAAU,GAAA;QACrB,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU;;AAG1C;;;;;;;AAOG;AACI,IAAA,MAAM,SAAS,GAAA;QACpB,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS;;AAGzC;;;;;;;AAOG;AACI,IAAA,MAAM,SAAS,GAAA;QACpB,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS;;AAGzC;;;;;;;;;;;;;;;AAeG;AACI,IAAA,mBAAmB,CAAC,MAAuC,EAAA;AAChE,QAAA,OAAO,IAAIC,+CAAyB,CAAC,MAAM,CAAC;;AAG9C;;;;;;;;;;;;;;AAcG;AACI,IAAA,kCAAkC,CAAC,MAA2D,EAAA;QACnG,OAAO,IAAIA,+CAAyB,CAAC,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,SAAS,CAAC;;AAGzF;;;;;;;;;;;;;;;;;;;;;;AAsBG;AACI,IAAA,aAAa,CAAC,MAA8B,EAAA;AACjD,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AACnB,YAAA,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC;;AAG/F,QAAA,OAAO,IAAIC,2BAAU,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;;AAGhE;;;;;;;;;;;;;;AAcG;AACI,IAAA,4BAA4B,CAAC,MAAoD,EAAA;AACtF,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AACnB,YAAA,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC;;QAG9F,OAAOC,yBAAS,CAAC,kBAAkB,CAAC;AAClC,YAAA,GAAG,MAAM;YACT,QAAQ,EAAE,IAAI,CAAC,SAAS;AACzB,SAAA,CAAC;;AAGJ;;;;;;;;;;;AAWG;AACI,IAAA,gBAAgB,CAAC,MAA6B,EAAA;AACnD,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AACnB,YAAA,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC;;AAE9F,QAAA,OAAO,IAAIA,yBAAS,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;;AAG/D;;;;;;;;;;;;;;;AAeG;IACI,MAAM,qBAAqB,CAAC,MAAsC,EAAA;AACvE,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AACnB,YAAA,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC;;AAE9F,QAAA,OAAOA,yBAAS,CAAC,WAAW,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;;AAGvE;;;;;;;;;;;;;;;;;;;;AAoBG;AACI,IAAA,MAAM,iCAAiC,CAC5C,WAAoB,EACpB,MAAkD,EAAA;AAElD,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AACnB,YAAA,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC;;AAG9F,QAAA,OAAO,WAAW,CAAC,kBAAkB,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;;AAGhF;;;;;;;;;;;;AAYG;IACI,qBAAqB,CAC1B,WAAoB,EACpB,MAAkC,EAAA;AAElC,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AACnB,YAAA,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC;;AAG9F,QAAA,OAAO,IAAI,WAAW,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;;AAGjE;;;;;;;;;;;;;;AAcG;IACI,0BAA0B,CAC/B,WAAoB,EACpB,MAA4C,EAAA;AAE5C,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AACnB,YAAA,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC;;AAG9F,QAAA,OAAO,WAAW,CAAC,WAAW,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;;AAGzE;;;;;;;;;;;AAWG;IACI,kBAAkB,CAAU,YAAsC,EAAE,MAAoC,EAAA;AAC7G,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AACnB,YAAA,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC;;AAG/F,QAAA,OAAO,IAAI,YAAY,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;;AAGlE;;;;;;;;;;;;;;;;AAgBG;AACI,IAAA,OAAO,kCAAkC,GAAA;QAC9C,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;AAC5B,YAAA,MAAM,IAAI,KAAK,CAAC,mGAAmG,CAAC;;AAEtH,QAAA,MAAM,CAAC,WAAW,EAAE,aAAa,EAAE,SAAS,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;AAC1D,cAAE;gBACE,aAAa,CAAC,6BAA6B,EAAE;AAC7C,gBAAA,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,aAAa,CAAC,+BAA+B,EAAE,GAAG,SAAS;gBACxF,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS;AAC3F,sBAAE,EAAE,GAAG,aAAa,CAAC,6BAA6B,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,IAAI,MAAM;AAC5F,sBAAE,SAAS;AACd;AACH,cAAE;AACE,gBAAA,aAAa,CAAC,wBAAwB,CAAC,OAAO,CAAC;AAC/C,gBAAA,aAAa,CAAC,wBAAwB,CAAC,SAAS,CAAC;AACjD,gBAAA,aAAa,CAAC,wBAAwB,CAAC,KAAK,CAAC;aAC9C;QAEL,OAAO;YACL,WAAW;YACX,aAAa;YACb,SAAS;SACV;;AAGH;;;;;;;;;;AAUG;AACI,IAAA,OAAO,6BAA6B,GAAA;QACzC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;AAC5B,YAAA,MAAM,IAAI,KAAK,CAAC,kGAAkG,CAAC;;AAGrH,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE;AAC7B,YAAA,MAAM,IAAI,KAAK,CAAC,yGAAyG,CAAC;;QAG5H,OAAO;AACL,YAAA,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY;AAChC,YAAA,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;AAC5B,YAAA,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW;SAC/B;;AAGH;;;;;;;;;;AAUG;AACI,IAAA,OAAO,+BAA+B,GAAA;QAC3C,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;AAC5B,YAAA,MAAM,IAAI,KAAK,CAAC,oGAAoG,CAAC;;AAGvH,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE;AAC/B,YAAA,MAAM,IAAI,KAAK,CAAC,6GAA6G,CAAC;;QAGhI,OAAO;AACL,YAAA,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc;AAClC,YAAA,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY;AAC9B,YAAA,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa;SACjC;;AAGH;;;;;;;;;AASG;AACI,IAAA,OAAO,iBAAiB,CAAC,OAA8B,EAAE,MAA2B,EAAA;QACzF,OAAO;AACL,YAAA,MAAM,EAAE,CAAA,QAAA,EAAW,OAAO,CAAA,CAAA,EAAI,MAAM,KAAK,OAAO,GAAG,KAAK,GAAG,KAAK,CAAkB,gBAAA,CAAA;AAClF,YAAA,IAAI,EAAE,GAAG;SACV;;AAGH;;;;;;;;AAQG;IACI,OAAO,wBAAwB,CAAC,YAAkD,EAAA;QACvF,OAAO;AACL,YAAA,MAAM,EAAE,CAAkB,gBAAA,CAAA;AAC1B,YAAA,IAAI,EAAE,YAAY,KAAK,OAAO,GAAG,IAAI,GAAG,YAAY,KAAK,SAAS,GAAG,IAAI,GAAG,YAAY,KAAK,KAAK,GAAG,IAAI,GAAG,YAAY;AACxH,YAAA,KAAK,EAAE,kEAAkE;SAC1E;;AAGH;;;;;;;;;;;;;;;;;;;;AAoBG;IACI,OAAO,cAAc,CAAC,MAAwB,EAAA;QACnD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM;QACtC,MAAM,WAAW,GAAG,OAAO,KAAK,KAAK,QAAQ,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,IAAI,KAAK,IAAI,EAAE,CAAC;QAC7F,MAAM,mBAAmB,GAAG,IAAIC,qDAAuB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC;QAClF,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC;;AAGzD;;;;;;;;;;AAUG;AACI,IAAA,OAAO,6BAA6B,GAAA;QACzC,OAAO,aAAa,CAAC,cAAc,CAAC,aAAa,CAAC,6BAA6B,EAAE,CAAC;;AAGpF;;;;;;;;;;;;;;;;;;;;AAoBG;IACI,OAAO,gBAAgB,CAAC,MAAwB,EAAA;QACrD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM;QACtC,MAAM,WAAW,GAAG,OAAO,KAAK,KAAK,QAAQ,GAAG,EAAE,qBAAqB,EAAE,KAAK,EAAE,IAAI,KAAK,IAAI,EAAE,CAAC;QAChG,MAAM,mBAAmB,GAAG,IAAIA,qDAAuB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC;AAClF,QAAA,OAAO,IAAI,OAAO,CAAC,mBAAmB,CAAC;;AAGzC;;;;;;;;;;;AAWG;AACI,IAAA,OAAO,+BAA+B,GAAA;QAC3C,OAAO,aAAa,CAAC,gBAAgB,CAAC,aAAa,CAAC,+BAA+B,EAAE,CAAC;;AAGxF;;;;;;;;;;;AAWG;IACI,OAAO,YAAY,CAAC,MAAwB,EAAA;QACjD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM;QACtC,OAAO,IAAI,GAAG,CAAC,KAAe,EAAE,MAAM,EAAE,IAAI,CAAC;;AAG/C;;;;;;;;;AASG;AACI,IAAA,OAAO,2BAA2B,GAAA;;;QAGvC,OAAO,aAAa,CAAC,YAAY,CAAC,EAAE,GAAG,aAAa,CAAC,6BAA6B,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,IAAI,MAAM,EAAE,CAAC;;AAElI;;;;"}
@@ -42,21 +42,35 @@ class ClientManager {
42
42
  this._kmd = _clients.kmd;
43
43
  this._algorand = algorandClient;
44
44
  }
45
- /** Returns an algosdk Algod API client. */
45
+ /**
46
+ * Returns an algosdk Algod API client.
47
+ * @returns The Algod client
48
+ */
46
49
  get algod() {
47
50
  return this._algod;
48
51
  }
49
- /** Returns an algosdk Indexer API client or throws an error if it's not been provided. */
52
+ /**
53
+ * Returns an algosdk Indexer API client or throws an error if it's not been provided.
54
+ * @returns The Indexer client
55
+ * @throws Error if no Indexer client is configured
56
+ */
50
57
  get indexer() {
51
58
  if (!this._indexer)
52
59
  throw new Error('Attempt to use Indexer client in AlgoKit instance with no Indexer configured');
53
60
  return this._indexer;
54
61
  }
55
- /** Returns an algosdk Indexer API client or `undefined` if it's not been provided. */
62
+ /**
63
+ * Returns an algosdk Indexer API client or `undefined` if it's not been provided.
64
+ * @returns The Indexer client or `undefined`
65
+ */
56
66
  get indexerIfPresent() {
57
67
  return this._indexer;
58
68
  }
59
- /** Returns an algosdk KMD API client or throws an error if it's not been provided. */
69
+ /**
70
+ * Returns an algosdk KMD API client or throws an error if it's not been provided.
71
+ * @returns The KMD client
72
+ * @throws Error if no KMD client is configured
73
+ */
60
74
  get kmd() {
61
75
  if (!this._kmd)
62
76
  throw new Error('Attempt to use Kmd client in AlgoKit instance with no Kmd configured');
@@ -88,6 +102,10 @@ class ClientManager {
88
102
  * Returns true if the given network genesisId is associated with a LocalNet network.
89
103
  * @param genesisId The network genesis ID
90
104
  * @returns Whether the given genesis ID is associated with a LocalNet network
105
+ * @example
106
+ * ```typescript
107
+ * const isLocalNet = ClientManager.genesisIdIsLocalNet('testnet-v1.0')
108
+ * ```
91
109
  */
92
110
  static genesisIdIsLocalNet(genesisId) {
93
111
  return genesisIdIsLocalNet(genesisId);
@@ -95,6 +113,10 @@ class ClientManager {
95
113
  /**
96
114
  * Returns true if the current network is LocalNet.
97
115
  * @returns True if the current network is LocalNet.
116
+ * @example
117
+ * ```typescript
118
+ * const isLocalNet = await clientManager.isLocalNet()
119
+ * ```
98
120
  */
99
121
  async isLocalNet() {
100
122
  return (await this.network()).isLocalNet;
@@ -102,6 +124,10 @@ class ClientManager {
102
124
  /**
103
125
  * Returns true if the current network is TestNet.
104
126
  * @returns True if the current network is TestNet.
127
+ * @example
128
+ * ```typescript
129
+ * const isTestNet = await clientManager.isTestNet()
130
+ * ```
105
131
  */
106
132
  async isTestNet() {
107
133
  return (await this.network()).isTestNet;
@@ -109,6 +135,10 @@ class ClientManager {
109
135
  /**
110
136
  * Returns true if the current network is MainNet.
111
137
  * @returns True if the current network is MainNet.
138
+ * @example
139
+ * ```typescript
140
+ * const isMainNet = await clientManager.isMainNet()
141
+ * ```
112
142
  */
113
143
  async isMainNet() {
114
144
  return (await this.network()).isMainNet;
@@ -152,15 +182,16 @@ class ClientManager {
152
182
  }
153
183
  /**
154
184
  * Returns a new `AppFactory` client
185
+ * @param params The parameters to create the app factory
155
186
  * @example Basic example
156
187
  * ```typescript
157
- * const factory = algorand.client.getAppFactory({
188
+ * const factory = clientManager.getAppFactory({
158
189
  * appSpec: '{/* ARC-56 or ARC-32 compatible JSON *\/}',
159
190
  * })
160
191
  * ```
161
192
  * @example Advanced example
162
193
  * ```typescript
163
- * const factory = algorand.client.getAppFactory({
194
+ * const factory = clientManager.getAppFactory({
164
195
  * appSpec: parsedAppSpec_AppSpec_or_Arc56Contract,
165
196
  * defaultSender: "SENDERADDRESS",
166
197
  * appName: "OverriddenAppName",
@@ -170,6 +201,7 @@ class ClientManager {
170
201
  * deployTimeParams: { ONE: 1, TWO: 'value' }
171
202
  * })
172
203
  * ```
204
+ * @returns The `AppFactory` instance
173
205
  */
174
206
  getAppFactory(params) {
175
207
  if (!this._algorand) {
@@ -184,13 +216,13 @@ class ClientManager {
184
216
  * @param params The parameters to create the app client
185
217
  * @example Basic
186
218
  * ```typescript
187
- * const appClient = algorand.client.getAppClientByCreatorAndName({
219
+ * const appClient = clientManager.getAppClientByCreatorAndName({
188
220
  * appSpec: '{/* ARC-56 or ARC-32 compatible JSON *\}',
189
221
  * // appId resolved by looking for app ID of named app by this creator
190
222
  * creatorAddress: 'CREATORADDRESS',
191
223
  * })
192
224
  * ```
193
- * @returns The `AppClient`
225
+ * @returns The `AppClient` instance
194
226
  */
195
227
  getAppClientByCreatorAndName(params) {
196
228
  if (!this._algorand) {
@@ -206,12 +238,12 @@ class ClientManager {
206
238
  * @param params The parameters to create the app client
207
239
  * @example Basic
208
240
  * ```typescript
209
- * const appClient = algorand.client.getAppClientById({
241
+ * const appClient = clientManager.getAppClientById({
210
242
  * appSpec: '{/* ARC-56 or ARC-32 compatible JSON *\}',
211
243
  * appId: 12345n,
212
244
  * })
213
245
  * ```
214
- * @returns The `AppClient`
246
+ * @returns The `AppClient` instance
215
247
  */
216
248
  getAppClientById(params) {
217
249
  if (!this._algorand) {
@@ -228,12 +260,12 @@ class ClientManager {
228
260
  * @param params The parameters to create the app client
229
261
  * @example Basic
230
262
  * ```typescript
231
- * const appClient = algorand.client.getAppClientByNetwork({
263
+ * const appClient = clientManager.getAppClientByNetwork({
232
264
  * appSpec: '{/* ARC-56 or ARC-32 compatible JSON *\}',
233
265
  * // appId resolved by using ARC-56 spec to find app ID for current network
234
266
  * })
235
267
  * ```
236
- * @returns The `AppClient`
268
+ * @returns The `AppClient` instance
237
269
  */
238
270
  async getAppClientByNetwork(params) {
239
271
  if (!this._algorand) {
@@ -247,14 +279,14 @@ class ClientManager {
247
279
  * @param params The params to resolve the app by creator address and name
248
280
  * @example Use name in ARC-32 / ARC-56 app spec
249
281
  * ```typescript
250
- * const appClient = algorand.client.getTypedAppClientByCreatorAndName(MyContractClient, {
282
+ * const appClient = clientManager.getTypedAppClientByCreatorAndName(MyContractClient, {
251
283
  * creatorAddress: "CREATORADDRESS",
252
284
  * defaultSender: alice,
253
285
  * })
254
286
  * ```
255
287
  * @example Specify name
256
288
  * ```typescript
257
- * const appClient = algorand.client.getTypedAppClientByCreatorAndName(MyContractClient, {
289
+ * const appClient = clientManager.getTypedAppClientByCreatorAndName(MyContractClient, {
258
290
  * creatorAddress: "CREATORADDRESS",
259
291
  * name: "contract-name",
260
292
  * defaultSender: alice,
@@ -274,7 +306,7 @@ class ClientManager {
274
306
  * @param params The params to resolve the app by ID
275
307
  * @example
276
308
  * ```typescript
277
- * const appClient = algorand.client.getTypedAppClientById(MyContractClient, {
309
+ * const appClient = clientManager.getTypedAppClientById(MyContractClient, {
278
310
  * appId: 12345n,
279
311
  * defaultSender: alice,
280
312
  * })
@@ -296,7 +328,7 @@ class ClientManager {
296
328
  * @param params The params to resolve the app by network
297
329
  * @example
298
330
  * ```typescript
299
- * const appClient = algorand.client.getTypedAppClientByNetwork(MyContractClient, {
331
+ * const appClient = clientManager.getTypedAppClientByNetwork(MyContractClient, {
300
332
  * defaultSender: alice,
301
333
  * })
302
334
  * ```
@@ -314,7 +346,7 @@ class ClientManager {
314
346
  * @param params The params to resolve the factory by
315
347
  * @example
316
348
  * ```typescript
317
- * const appFactory = algorand.client.getTypedAppFactory(MyContractClient, {
349
+ * const appFactory = clientManager.getTypedAppFactory(MyContractClient, {
318
350
  * sender: alice,
319
351
  * })
320
352
  * ```
@@ -366,9 +398,16 @@ class ClientManager {
366
398
  kmdConfig,
367
399
  };
368
400
  }
369
- /** Retrieve the algod configuration from environment variables (expects to be called from a Node.js environment)
401
+ /**
402
+ * Retrieve the algod configuration from environment variables (expects to be called from a Node.js environment)
370
403
  *
371
404
  * Expects `process.env.ALGOD_SERVER` to be defined, and you can also specify `process.env.ALGOD_PORT` and `process.env.ALGOD_TOKEN`.
405
+ * @returns The Algod client configuration
406
+ * @throws Error if `process.env.ALGOD_SERVER` is not defined
407
+ * @example
408
+ * ```typescript
409
+ * const config = ClientManager.getAlgodConfigFromEnvironment()
410
+ * ```
372
411
  */
373
412
  static getAlgodConfigFromEnvironment() {
374
413
  if (!process || !process.env) {
@@ -387,6 +426,12 @@ class ClientManager {
387
426
  * Retrieve the indexer configuration from environment variables (expects to be called from a Node.js environment).
388
427
  *
389
428
  * Expects `process.env.INDEXER_SERVER` to be defined, and you can also specify `process.env.INDEXER_PORT` and `process.env.INDEXER_TOKEN`.
429
+ * @returns The Indexer client configuration
430
+ * @throws Error if `process.env.INDEXER_SERVER` is not defined
431
+ * @example
432
+ * ```typescript
433
+ * const config = ClientManager.getIndexerConfigFromEnvironment()
434
+ * ```
390
435
  */
391
436
  static getIndexerConfigFromEnvironment() {
392
437
  if (!process || !process.env) {
@@ -405,6 +450,11 @@ class ClientManager {
405
450
  *
406
451
  * @param network Which network to connect to - TestNet or MainNet
407
452
  * @param config Which algod config to return - Algod or Indexer
453
+ * @returns The AlgoNode client configuration
454
+ * @example
455
+ * ```typescript
456
+ * const config = ClientManager.getAlgoNodeConfig('testnet', 'algod')
457
+ * ```
408
458
  */
409
459
  static getAlgoNodeConfig(network, config) {
410
460
  return {
@@ -415,6 +465,11 @@ class ClientManager {
415
465
  /** Returns the Algorand configuration to point to the default LocalNet.
416
466
  *
417
467
  * @param configOrPort Which algod config to return - algod, kmd, or indexer OR a port number
468
+ * @returns The LocalNet client configuration
469
+ * @example
470
+ * ```typescript
471
+ * const config = ClientManager.getDefaultLocalNetConfig('algod')
472
+ * ```
418
473
  */
419
474
  static getDefaultLocalNetConfig(configOrPort) {
420
475
  return {
@@ -427,6 +482,7 @@ class ClientManager {
427
482
  * Returns an algod SDK client that automatically retries on idempotent calls.
428
483
  *
429
484
  * @param config The config of the client
485
+ * @returns The Algod client
430
486
  * @example AlgoNode (testnet)
431
487
  * ```typescript
432
488
  * const algod = ClientManager.getAlgodClient(ClientManager.getAlgoNodeConfig('testnet', 'algod'))
@@ -452,6 +508,7 @@ class ClientManager {
452
508
  /**
453
509
  * Returns an algod SDK client that automatically retries on idempotent calls loaded from environment variables (expects to be called from a Node.js environment).
454
510
  *
511
+ * @returns The Algod client
455
512
  * @example
456
513
  * ```typescript
457
514
  * // Uses process.env.ALGOD_SERVER, process.env.ALGOD_PORT and process.env.ALGOD_TOKEN
@@ -466,6 +523,7 @@ class ClientManager {
466
523
  * Returns an indexer SDK client that automatically retries on idempotent calls
467
524
  *
468
525
  * @param config The config of the client
526
+ * @returns The Indexer client
469
527
  * @example AlgoNode (testnet)
470
528
  * ```typescript
471
529
  * const indexer = ClientManager.getIndexerClient(ClientManager.getAlgoNodeConfig('testnet', 'indexer'))
@@ -491,6 +549,7 @@ class ClientManager {
491
549
  /**
492
550
  * Returns an indexer SDK client that automatically retries on idempotent calls loaded from environment variables (expects to be called from a Node.js environment).
493
551
  *
552
+ * @returns The Indexer client
494
553
  * @example
495
554
  *
496
555
  * ```typescript
@@ -508,6 +567,7 @@ class ClientManager {
508
567
  * KMD client allows you to export private keys, which is useful to (for instance) get the default account in a LocalNet network.
509
568
  *
510
569
  * @param config The config for the client
570
+ * @returns The KMD client
511
571
  * @example Custom (e.g. default LocalNet, although we recommend loading this into a .env and using the Default option instead)
512
572
  * ```typescript
513
573
  * const kmd = ClientManager.getKmdClient({server: 'http://localhost', port: '4002', token: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'})
@@ -520,6 +580,7 @@ class ClientManager {
520
580
  /**
521
581
  * Returns a KMD SDK client that automatically retries on idempotent calls loaded from environment variables (expects to be called from a Node.js environment).
522
582
  *
583
+ * @returns The KMD client
523
584
  * @example
524
585
  * ```typescript
525
586
  * // Uses process.env.ALGOD_SERVER, process.env.KMD_PORT (or if not specified: port 4002) and process.env.ALGOD_TOKEN