{"version":3,"file":"algorand-client.mjs","sources":["../../src/types/algorand-client.ts"],"sourcesContent":["import algosdk, { Address } from 'algosdk'\nimport { MultisigAccount, SigningAccount, TransactionSignerAccount } from './account'\nimport { AccountManager } 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 } from './composer'\nimport { AlgoConfig } from './network-client'\nimport Account = algosdk.Account\nimport LogicSigAccount = algosdk.LogicSigAccount\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?: algosdk.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) {\n    this._clientManager = new ClientManager(config, this)\n    this._accountManager = new AccountManager(this._clientManager)\n    this._appManager = new AppManager(this._clientManager.algod)\n    this._assetManager = new AssetManager(this._clientManager.algod, () => this.newGroup())\n    this._transactionSender = new AlgorandClientTransactionSender(() => this.newGroup(), this._assetManager, this._appManager)\n    this._transactionCreator = new AlgorandClientTransactionCreator(() => this.newGroup())\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 `TransactionSignerAccount`\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: algosdk.TransactionSigner | TransactionSignerAccount): 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 `TransactionSignerAccount` 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: TransactionSignerAccount | Account | LogicSigAccount | SigningAccount | 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: algosdk.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: algosdk.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<algosdk.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.getTransactionParams().do()\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   * const composer = AlgorandClient.mainNet().newGroup();\n   * const result = await composer.addTransaction(payment).send()\n   */\n  public newGroup() {\n    return new TransactionComposer({\n      algod: this.client.algod,\n      getSigner: (addr: string | Address) => this.account.getSigner(addr),\n      getSuggestedParams: () => this.getSuggestedParams(),\n      defaultValidityWindow: this._defaultValidityWindow,\n      appManager: this._appManager,\n      errorTransformers: [...this._errorTransformers],\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   * const algorand = AlgorandClient.defaultLocalNet();\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"],"names":[],"mappings":";;;;;;;;;AAcA;;AAEG;MACU,cAAc,CAAA;AAsBzB,IAAA,WAAA,CAAoB,MAAmC,EAAA;AAX/C,QAAA,IAAA,CAAA,6BAA6B,GAAW,IAAK,CAAA;QAE7C,IAAsB,CAAA,sBAAA,GAAuB,SAAS;AAE9D;;;;AAIG;AACK,QAAA,IAAA,CAAA,kBAAkB,GAA0B,IAAI,GAAG,EAAE;QAG3D,IAAI,CAAC,cAAc,GAAG,IAAI,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC;QACrD,IAAI,CAAC,eAAe,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC;AAC9D,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;QAC5D,IAAI,CAAC,aAAa,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACvF,IAAI,CAAC,kBAAkB,GAAG,IAAI,+BAA+B,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC;AAC1H,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,gCAAgC,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtF,IAAI,CAAC,YAAY,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC;;AAGtH;;;;;;;;AAQG;AACI,IAAA,wBAAwB,CAAC,cAA+B,EAAA;AAC7D,QAAA,IAAI,CAAC,sBAAsB,GAAG,MAAM,CAAC,cAAc,CAAC;AACpD,QAAA,OAAO,IAAI;;AAGb;;;;;;;;;AASG;AACI,IAAA,gBAAgB,CAAC,MAA4D,EAAA;AAClF,QAAA,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,MAAM,CAAC;AAC7C,QAAA,OAAO,IAAI;;AAGb;;;;;;;;;;;;;;AAcG;AACI,IAAA,oBAAoB,CAAC,OAAgG,EAAA;AAC1H,QAAA,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC,OAAO,CAAC;AAClD,QAAA,OAAO,IAAI;;AAGb;;;;;;;;;;AAUG;IACI,SAAS,CAAC,MAAwB,EAAE,MAAiC,EAAA;QAC1E,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;AAC9C,QAAA,OAAO,IAAI;;AAGb;;;;;;;;;AASG;IACI,uBAAuB,CAAC,eAAwC,EAAE,KAAY,EAAA;AACnF,QAAA,IAAI,CAAC,sBAAsB,GAAG,eAAe;AAC7C,QAAA,IAAI,CAAC,4BAA4B,GAAG,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,GAAG,IAAI,CAAC,6BAA6B,CAAC;AACvG,QAAA,OAAO,IAAI;;AAGb;;;;;;;;AAQG;AACI,IAAA,8BAA8B,CAAC,OAAe,EAAA;AACnD,QAAA,IAAI,CAAC,6BAA6B,GAAG,OAAO;AAC5C,QAAA,OAAO,IAAI;;AAGb;;;;;AAKG;AACI,IAAA,MAAM,kBAAkB,GAAA;AAC7B,QAAA,IAAI,IAAI,CAAC,sBAAsB,KAAK,CAAC,IAAI,CAAC,4BAA4B,IAAI,IAAI,CAAC,4BAA4B,GAAG,IAAI,IAAI,EAAE,CAAC,EAAE;YACzH,OAAO;gBACL,GAAG,IAAI,CAAC,sBAAsB;aAC/B;;AAGH,QAAA,IAAI,CAAC,sBAAsB,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,oBAAoB,EAAE,CAAC,EAAE,EAAE;AACzF,QAAA,IAAI,CAAC,4BAA4B,GAAG,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,6BAA6B,CAAC;QAEvG,OAAO;YACL,GAAG,IAAI,CAAC,sBAAsB;SAC/B;;AAGH;;;;;AAKG;AACH,IAAA,IAAW,MAAM,GAAA;QACf,OAAO,IAAI,CAAC,cAAc;;AAG5B;;;;;AAKG;AACH,IAAA,IAAW,OAAO,GAAA;QAChB,OAAO,IAAI,CAAC,eAAe;;AAG7B;;;;;AAKG;AACH,IAAA,IAAW,KAAK,GAAA;QACd,OAAO,IAAI,CAAC,aAAa;;AAG3B;;;;;AAKG;AACH,IAAA,IAAW,GAAG,GAAA;QACZ,OAAO,IAAI,CAAC,WAAW;;AAGzB;;;;;AAKG;AACH,IAAA,IAAW,WAAW,GAAA;QACpB,OAAO,IAAI,CAAC,YAAY;;AAG1B;;;AAGG;AACI,IAAA,wBAAwB,CAAC,WAA6B,EAAA;AAC3D,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC;;AAGnC,IAAA,0BAA0B,CAAC,WAA6B,EAAA;AAC7D,QAAA,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAC;;AAG7C;;;;;AAKG;IACI,QAAQ,GAAA;QACb,OAAO,IAAI,mBAAmB,CAAC;AAC7B,YAAA,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;AACxB,YAAA,SAAS,EAAE,CAAC,IAAsB,KAAK,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC;AACnE,YAAA,kBAAkB,EAAE,MAAM,IAAI,CAAC,kBAAkB,EAAE;YACnD,qBAAqB,EAAE,IAAI,CAAC,sBAAsB;YAClD,UAAU,EAAE,IAAI,CAAC,WAAW;AAC5B,YAAA,iBAAiB,EAAE,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC;AAChD,SAAA,CAAC;;AAGJ;;;;;;;;;AASG;AACH,IAAA,IAAW,IAAI,GAAA;QACb,OAAO,IAAI,CAAC,kBAAkB;;AAGhC;;;;;;;;;AASG;AACH,IAAA,IAAW,iBAAiB,GAAA;QAC1B,OAAO,IAAI,CAAC,mBAAmB;;;AAKjC;;;;;AAKG;AACI,IAAA,OAAO,eAAe,GAAA;QAC3B,OAAO,IAAI,cAAc,CAAC;AACxB,YAAA,WAAW,EAAE,aAAa,CAAC,wBAAwB,CAAC,OAAO,CAAC;AAC5D,YAAA,aAAa,EAAE,aAAa,CAAC,wBAAwB,CAAC,SAAS,CAAC;AAChE,YAAA,SAAS,EAAE,aAAa,CAAC,wBAAwB,CAAC,KAAK,CAAC;AACzD,SAAA,CAAC;;AAGJ;;;;;AAKG;AACI,IAAA,OAAO,OAAO,GAAA;QACnB,OAAO,IAAI,cAAc,CAAC;YACxB,WAAW,EAAE,aAAa,CAAC,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC;YAChE,aAAa,EAAE,aAAa,CAAC,iBAAiB,CAAC,SAAS,EAAE,SAAS,CAAC;AACpE,YAAA,SAAS,EAAE,SAAS;AACrB,SAAA,CAAC;;AAGJ;;;;;AAKG;AACI,IAAA,OAAO,OAAO,GAAA;QACnB,OAAO,IAAI,cAAc,CAAC;YACxB,WAAW,EAAE,aAAa,CAAC,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC;YAChE,aAAa,EAAE,aAAa,CAAC,iBAAiB,CAAC,SAAS,EAAE,SAAS,CAAC;AACpE,YAAA,SAAS,EAAE,SAAS;AACrB,SAAA,CAAC;;AAGJ;;;;;;AAMG;IACI,OAAO,WAAW,CAAC,OAAuB,EAAA;AAC/C,QAAA,OAAO,IAAI,cAAc,CAAC,OAAO,CAAC;;AAGpC;;;;;;;;;;;;;;;;;;AAkBG;AACI,IAAA,OAAO,eAAe,GAAA;QAC3B,OAAO,IAAI,cAAc,CAAC,aAAa,CAAC,kCAAkC,EAAE,CAAC;;AAG/E;;;;;;AAMG;IACI,OAAO,UAAU,CAAC,MAAkB,EAAA;AACzC,QAAA,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC;;AAEpC;;;;"}