{"version":3,"file":"transaction.mjs","sources":["../../src/transaction/transaction.ts"],"sourcesContent":["import algosdk, {\n  ABIMethod,\n  ABIReturnType,\n  Address,\n  ApplicationTransactionFields,\n  stringifyJSON,\n  TransactionBoxReference,\n  TransactionType,\n} from 'algosdk'\nimport { Buffer } from 'buffer'\nimport { Config } from '../config'\nimport { AlgoAmount } from '../types/amount'\nimport { ABIReturn } from '../types/app'\nimport { EventType } from '../types/lifecycle-events'\nimport {\n  AdditionalAtomicTransactionComposerContext,\n  AtomicTransactionComposerToSend,\n  SendAtomicTransactionComposerResults,\n  SendParams,\n  SendTransactionFrom,\n  SendTransactionParams,\n  SendTransactionResult,\n  TransactionGroupToSend,\n  TransactionNote,\n  TransactionToSign,\n} from '../types/transaction'\nimport { asJson, convertAbiByteArrays, convertABIDecodedBigIntToNumber, toNumber } from '../util'\nimport { performAtomicTransactionComposerSimulate } from './perform-atomic-transaction-composer-simulate'\nimport Algodv2 = algosdk.Algodv2\nimport AtomicTransactionComposer = algosdk.AtomicTransactionComposer\nimport modelsv2 = algosdk.modelsv2\nimport SuggestedParams = algosdk.SuggestedParams\nimport Transaction = algosdk.Transaction\nimport TransactionSigner = algosdk.TransactionSigner\nimport TransactionWithSigner = algosdk.TransactionWithSigner\n\nexport const MAX_TRANSACTION_GROUP_SIZE = 16\nexport const MAX_APP_CALL_FOREIGN_REFERENCES = 8\nexport const MAX_APP_CALL_ACCOUNT_REFERENCES = 8\n\n/**\n * @deprecated Convert your data to a `string` or `Uint8Array`, if using ARC-2 use `TransactionComposer.arc2Note`.\n *\n * Encodes a transaction note into a byte array ready to be included in an Algorand transaction.\n *\n * @param note The transaction note\n * @returns the transaction note ready for inclusion in a transaction\n *\n *  Case on the value of `data` this either be:\n *   * `null` | `undefined`: `undefined`\n *   * `string`: The string value\n *   * Uint8Array: passthrough\n *   * Arc2TransactionNote object: ARC-0002 compatible transaction note\n *   * Else: The object/value converted into a JSON string representation\n */\nexport function encodeTransactionNote(note?: TransactionNote): Uint8Array | undefined {\n  if (note == null || typeof note === 'undefined') {\n    return undefined\n  } else if (typeof note === 'object' && note.constructor === Uint8Array) {\n    return note\n  } else if (typeof note === 'object' && 'dAppName' in note) {\n    const arc2Payload = `${note.dAppName}:${note.format}${typeof note.data === 'string' ? note.data : asJson(note.data)}`\n    const encoder = new TextEncoder()\n    return encoder.encode(arc2Payload)\n  } else {\n    const n = typeof note === 'string' ? note : asJson(note)\n    const encoder = new TextEncoder()\n    return encoder.encode(n)\n  }\n}\n\n/** Encodes a transaction lease into a 32-byte array ready to be included in an Algorand transaction.\n *\n * @param lease The transaction lease as a string or binary array or null/undefined if there is no lease\n * @returns the transaction lease ready for inclusion in a transaction or `undefined` if there is no lease\n * @throws if the length of the data is > 32 bytes or empty\n * @example algokit.encodeLease('UNIQUE_ID')\n * @example algokit.encodeLease(new Uint8Array([1, 2, 3]))\n */\nexport function encodeLease(lease?: string | Uint8Array): Uint8Array | undefined {\n  if (lease === null || typeof lease === 'undefined') {\n    return undefined\n  } else if (typeof lease === 'object' && lease.constructor === Uint8Array) {\n    if (lease.length === 0 || lease.length > 32) {\n      throw new Error(\n        `Received invalid lease; expected something with length between 1 and 32, but received bytes with length ${lease.length}`,\n      )\n    }\n    if (lease.length === 32) return lease\n    const lease32 = new Uint8Array(32)\n    lease32.set(lease, 0)\n    return lease32\n  } else if (typeof lease === 'string') {\n    if (lease.length === 0 || lease.length > 32) {\n      throw new Error(\n        `Received invalid lease; expected something with length between 1 and 32, but received '${lease}' with length ${lease.length}`,\n      )\n    }\n    const encoder = new TextEncoder()\n    const lease32 = new Uint8Array(32)\n    lease32.set(encoder.encode(lease), 0)\n    return lease32\n  } else {\n    throw new Error(`Unknown lease type received of ${typeof lease}`)\n  }\n}\n\n/**\n * @deprecated Use `algorand.client` to interact with accounts, and use `.addr` to get the address\n * and/or move from using `SendTransactionFrom` to `TransactionSignerAccount` and use `.addr` instead.\n *\n * Returns the public address of the given transaction sender.\n * @param sender A transaction sender\n * @returns The public address\n */\nexport const getSenderAddress = function (sender: string | SendTransactionFrom): string {\n  return typeof sender === 'string' ? sender : 'addr' in sender ? sender.addr.toString() : sender.address().toString()\n}\n\n/**\n * @deprecated Use `AlgorandClient` / `TransactionComposer` to construct transactions instead or\n * construct an `algosdk.TransactionWithSigner` manually instead.\n *\n * Given a transaction in a variety of supported formats, returns a TransactionWithSigner object ready to be passed to an\n * AtomicTransactionComposer's addTransaction method.\n * @param transaction One of: A TransactionWithSigner object (returned as is), a TransactionToSign object (signer is obtained from the\n * signer property), a Transaction object (signer is extracted from the defaultSender parameter), an async SendTransactionResult returned by\n * one of algokit utils' helpers (signer is obtained from the defaultSender parameter)\n * @param defaultSender The default sender to be used to obtain a signer where the object provided to the transaction parameter does not\n * include a signer.\n * @returns A TransactionWithSigner object.\n */\nexport const getTransactionWithSigner = async (\n  transaction: TransactionWithSigner | TransactionToSign | Transaction | Promise<SendTransactionResult>,\n  defaultSender?: SendTransactionFrom,\n): Promise<TransactionWithSigner> => {\n  if ('txn' in transaction) return transaction\n  if (defaultSender === undefined)\n    throw new Error('Default sender must be provided when passing in a transaction object that does not contain its own signer')\n  return transaction instanceof Promise\n    ? {\n        txn: (await transaction).transaction,\n        signer: getSenderTransactionSigner(defaultSender),\n      }\n    : 'transaction' in transaction\n      ? {\n          txn: transaction.transaction,\n          signer: getSenderTransactionSigner(transaction.signer),\n        }\n      : {\n          txn: transaction,\n          signer: getSenderTransactionSigner(defaultSender),\n        }\n}\n\nconst memoize = <T = unknown, R = unknown>(fn: (val: T) => R) => {\n  const cache = new Map()\n  const cached = function (this: unknown, val: T) {\n    return cache.has(val) ? cache.get(val) : cache.set(val, fn.call(this, val)) && cache.get(val)\n  }\n  cached.cache = cache\n  return cached as (val: T) => R\n}\n\n/**\n * @deprecated Use `TransactionSignerAccount` instead of `SendTransactionFrom` or use\n * `algosdk.makeBasicAccountTransactionSigner` / `algosdk.makeLogicSigAccountTransactionSigner`.\n *\n * Returns a `TransactionSigner` for the given transaction sender.\n * This function has memoization, so will return the same transaction signer for a given sender.\n * @param sender A transaction sender\n * @returns A transaction signer\n */\nexport const getSenderTransactionSigner = memoize(function (sender: SendTransactionFrom): TransactionSigner {\n  return 'signer' in sender\n    ? sender.signer\n    : 'lsig' in sender\n      ? algosdk.makeLogicSigAccountTransactionSigner(sender)\n      : algosdk.makeBasicAccountTransactionSigner(sender)\n})\n\n/**\n * @deprecated Use `AlgorandClient` / `TransactionComposer` to sign transactions\n * or use the relevant underlying `account.signTxn` / `algosdk.signLogicSigTransactionObject`\n * / `multiSigAccount.sign` / `TransactionSigner` methods directly.\n *\n * Signs a single transaction by the given signer.\n * @param transaction The transaction to sign\n * @param signer The signer to sign\n * @returns The signed transaction as a `Uint8Array`\n */\nexport const signTransaction = async (transaction: Transaction, signer: SendTransactionFrom) => {\n  return 'sk' in signer\n    ? transaction.signTxn(signer.sk)\n    : 'lsig' in signer\n      ? algosdk.signLogicSigTransactionObject(transaction, signer).blob\n      : 'sign' in signer\n        ? signer.sign(transaction)\n        : (await signer.signer([transaction], [0]))[0]\n}\n\n/**\n * @deprecated Use `AlgorandClient` / `TransactionComposer` to send transactions.\n *\n * Prepares a transaction for sending and then (if instructed) signs and sends the given transaction to the chain.\n *\n * @param send The details for the transaction to prepare/send, including:\n *   * `transaction`: The unsigned transaction\n *   * `from`: The account to sign the transaction with: either an account with private key loaded or a logic signature account\n *   * `config`: The sending configuration for this transaction\n * @param algod An algod client\n *\n * @returns An object with transaction (`transaction`) and (if `skipWaiting` is `false` or `undefined`) confirmation (`confirmation`)\n */\nexport const sendTransaction = async function (\n  send: {\n    transaction: Transaction\n    from: SendTransactionFrom\n    sendParams?: SendTransactionParams\n  },\n  algod: Algodv2,\n): Promise<SendTransactionResult> {\n  const { transaction, from, sendParams } = send\n  const { skipSending, skipWaiting, fee, maxFee, suppressLog, maxRoundsToWaitForConfirmation, atc } = sendParams ?? {}\n\n  controlFees(transaction, { fee, maxFee })\n\n  if (atc) {\n    atc.addTransaction({ txn: transaction, signer: getSenderTransactionSigner(from) })\n    return { transaction }\n  }\n\n  if (skipSending) {\n    return { transaction }\n  }\n\n  let txnToSend = transaction\n\n  const populateAppCallResources = sendParams?.populateAppCallResources ?? Config.populateAppCallResources\n\n  // Populate resources if the transaction is an appcall and populateAppCallResources wasn't explicitly set to false\n  if (txnToSend.type === algosdk.TransactionType.appl && populateAppCallResources) {\n    const newAtc = new AtomicTransactionComposer()\n    newAtc.addTransaction({ txn: txnToSend, signer: getSenderTransactionSigner(from) })\n    const atc = await prepareGroupForSending(newAtc, algod, { ...sendParams, populateAppCallResources })\n    txnToSend = atc.buildGroup()[0].txn\n  }\n\n  const signedTransaction = await signTransaction(txnToSend, from)\n\n  await algod.sendRawTransaction(signedTransaction).do()\n\n  Config.getLogger(suppressLog).verbose(`Sent transaction ID ${txnToSend.txID()} ${txnToSend.type} from ${getSenderAddress(from)}`)\n\n  let confirmation: modelsv2.PendingTransactionResponse | undefined = undefined\n  if (!skipWaiting) {\n    confirmation = await waitForConfirmation(txnToSend.txID(), maxRoundsToWaitForConfirmation ?? 5, algod)\n  }\n\n  return { transaction: txnToSend, confirmation }\n}\n\n/**\n * Get the execution info of a transaction group for the given ATC\n * The function uses the simulate endpoint and depending on the sendParams can return the following:\n * - The unnamed resources accessed by the group\n * - The unnamed resources accessed by each transaction in the group\n * - The required fee delta for each transaction in the group. A positive value indicates a fee deficit, a negative value indicates a surplus.\n *\n * @param atc The ATC containing the txn group\n * @param algod The algod client to use for the simulation\n * @param sendParams The send params for the transaction group\n * @param additionalAtcContext Additional ATC context used to determine how best to alter transactions in the group\n * @returns The execution info for the group\n */\nasync function getGroupExecutionInfo(\n  atc: algosdk.AtomicTransactionComposer,\n  algod: algosdk.Algodv2,\n  sendParams: SendParams,\n  additionalAtcContext?: AdditionalAtomicTransactionComposerContext,\n) {\n  const simulateRequest = new algosdk.modelsv2.SimulateRequest({\n    txnGroups: [],\n    allowUnnamedResources: true,\n    allowEmptySignatures: true,\n    fixSigners: true,\n  })\n\n  const nullSigner = algosdk.makeEmptyTransactionSigner()\n\n  const emptySignerAtc = atc.clone()\n\n  const appCallIndexesWithoutMaxFees: number[] = []\n  emptySignerAtc['transactions'].forEach((t: algosdk.TransactionWithSigner, i: number) => {\n    t.signer = nullSigner\n\n    if (sendParams.coverAppCallInnerTransactionFees && t.txn.type === TransactionType.appl) {\n      if (!additionalAtcContext?.suggestedParams) {\n        throw Error(`Please provide additionalAtcContext.suggestedParams when coverAppCallInnerTransactionFees is enabled`)\n      }\n\n      const maxFee = additionalAtcContext?.maxFees?.get(i)?.microAlgo\n      if (maxFee === undefined) {\n        appCallIndexesWithoutMaxFees.push(i)\n      } else {\n        t.txn.fee = maxFee\n      }\n    }\n  })\n\n  if (sendParams.coverAppCallInnerTransactionFees && appCallIndexesWithoutMaxFees.length > 0) {\n    throw Error(\n      `Please provide a maxFee for each app call transaction when coverAppCallInnerTransactionFees is enabled. Required for transaction ${appCallIndexesWithoutMaxFees.join(', ')}`,\n    )\n  }\n\n  const perByteTxnFee = BigInt(additionalAtcContext?.suggestedParams.fee ?? 0n)\n  const minTxnFee = BigInt(additionalAtcContext?.suggestedParams.minFee ?? 1000n)\n\n  const result = await emptySignerAtc.simulate(algod, simulateRequest)\n\n  const groupResponse = result.simulateResponse.txnGroups[0]\n\n  if (groupResponse.failureMessage) {\n    if (sendParams.coverAppCallInnerTransactionFees && groupResponse.failureMessage.match(/fee too small/)) {\n      throw Error(`Fees were too small to resolve execution info via simulate. You may need to increase an app call transaction maxFee.`)\n    }\n\n    throw Error(`Error resolving execution info via simulate in transaction ${groupResponse.failedAt}: ${groupResponse.failureMessage}`)\n  }\n\n  const sortedResources = groupResponse.unnamedResourcesAccessed\n\n  // NOTE: We explicitly want to avoid localeCompare as that can lead to different results in different environments\n  const compare = (a: string | bigint, b: string | bigint) => (a < b ? -1 : a > b ? 1 : 0)\n\n  if (sortedResources) {\n    sortedResources.accounts?.sort((a, b) => compare(a.toString(), b.toString()))\n    sortedResources.assets?.sort(compare)\n    sortedResources.apps?.sort(compare)\n    sortedResources.boxes?.sort((a, b) => {\n      const aStr = `${a.app}-${a.name}`\n      const bStr = `${b.app}-${b.name}`\n      return compare(aStr, bStr)\n    })\n    sortedResources.appLocals?.sort((a, b) => {\n      const aStr = `${a.app}-${a.account}`\n      const bStr = `${b.app}-${b.account}`\n      return compare(aStr, bStr)\n    })\n    sortedResources.assetHoldings?.sort((a, b) => {\n      const aStr = `${a.asset}-${a.account}`\n      const bStr = `${b.asset}-${b.account}`\n      return compare(aStr, bStr)\n    })\n  }\n\n  return {\n    groupUnnamedResourcesAccessed: sendParams.populateAppCallResources ? sortedResources : undefined,\n    txns: groupResponse.txnResults.map((txn, i) => {\n      const originalTxn = atc['transactions'][i].txn as algosdk.Transaction\n\n      let requiredFeeDelta = 0n\n      if (sendParams.coverAppCallInnerTransactionFees) {\n        // Min fee calc is lifted from algosdk https://github.com/algorand/js-algorand-sdk/blob/6973ff583b243ddb0632e91f4c0383021430a789/src/transaction.ts#L710\n        // 75 is the number of bytes added to a txn after signing it\n        const parentPerByteFee = perByteTxnFee * BigInt(originalTxn.toByte().length + 75)\n        const parentMinFee = parentPerByteFee < minTxnFee ? minTxnFee : parentPerByteFee\n        const parentFeeDelta = parentMinFee - originalTxn.fee\n        if (originalTxn.type === TransactionType.appl) {\n          const calculateInnerFeeDelta = (itxns: algosdk.modelsv2.PendingTransactionResponse[], acc: bigint = 0n): bigint => {\n            // Surplus inner transaction fees do not pool up to the parent transaction.\n            // Additionally surplus inner transaction fees only pool from sibling transactions that are sent prior to a given inner transaction, hence why we iterate in reverse order.\n            return itxns.reverse().reduce((acc, itxn) => {\n              const currentFeeDelta =\n                (itxn.innerTxns && itxn.innerTxns.length > 0 ? calculateInnerFeeDelta(itxn.innerTxns, acc) : acc) +\n                (minTxnFee - itxn.txn.txn.fee) // Inner transactions don't require per byte fees\n              return currentFeeDelta < 0n ? 0n : currentFeeDelta\n            }, acc)\n          }\n\n          const innerFeeDelta = calculateInnerFeeDelta(txn.txnResult.innerTxns ?? [])\n          requiredFeeDelta = innerFeeDelta + parentFeeDelta\n        } else {\n          requiredFeeDelta = parentFeeDelta\n        }\n      }\n\n      return {\n        unnamedResourcesAccessed: sendParams.populateAppCallResources ? txn.unnamedResourcesAccessed : undefined,\n        requiredFeeDelta,\n      }\n    }),\n  }\n}\n\n/**\n * Take an existing Atomic Transaction Composer and return a new one with the required\n * app call resources populated into it\n *\n * @param algod The algod client to use for the simulation\n * @param atc The ATC containing the txn group\n * @returns A new ATC with the resources populated into the transactions\n *\n * @privateRemarks\n *\n * This entire function will eventually be implemented in simulate upstream in algod. The simulate endpoint will return\n * an array of refference arrays for each transaction, so this eventually will eventually just call simulate and set the\n * reference arrays in the transactions to the reference arrays returned by simulate.\n *\n * See https://github.com/algorand/go-algorand/pull/5684\n *\n */\nexport async function populateAppCallResources(atc: algosdk.AtomicTransactionComposer, algod: algosdk.Algodv2) {\n  return await prepareGroupForSending(atc, algod, { populateAppCallResources: true })\n}\n\n/**\n * Take an existing Atomic Transaction Composer and return a new one with changes applied to the transactions\n * based on the supplied sendParams to prepare it for sending.\n * Please note, that before calling `.execute()` on the returned ATC, you must call `.buildGroup()`.\n *\n * @param algod The algod client to use for the simulation\n * @param atc The ATC containing the txn group\n * @param sendParams The send params for the transaction group\n * @param additionalAtcContext Additional ATC context used to determine how best to change the transactions in the group\n * @returns A new ATC with the changes applied\n *\n * @privateRemarks\n * Parts of this function will eventually be implemented in algod. Namely:\n * - Simulate will return information on how to populate reference arrays, see https://github.com/algorand/go-algorand/pull/6015\n */\nexport async function prepareGroupForSending(\n  atc: algosdk.AtomicTransactionComposer,\n  algod: algosdk.Algodv2,\n  sendParams: SendParams,\n  additionalAtcContext?: AdditionalAtomicTransactionComposerContext,\n) {\n  const executionInfo = await getGroupExecutionInfo(atc, algod, sendParams, additionalAtcContext)\n  const group = atc.buildGroup()\n\n  const [_, additionalTransactionFees] = sendParams.coverAppCallInnerTransactionFees\n    ? executionInfo.txns\n        .map((txn, i) => {\n          const groupIndex = i\n          const txnInGroup = group[groupIndex].txn\n          const maxFee = additionalAtcContext?.maxFees?.get(i)?.microAlgo\n          const immutableFee = maxFee !== undefined && maxFee === txnInGroup.fee\n          // Because we don't alter non app call transaction, they take priority\n          const priorityMultiplier =\n            txn.requiredFeeDelta > 0n && (immutableFee || txnInGroup.type !== algosdk.TransactionType.appl) ? 1_000n : 1n\n\n          return {\n            ...txn,\n            groupIndex,\n            // Measures the priority level of covering the transaction fee using the surplus group fees. The higher the number, the higher the priority.\n            surplusFeePriorityLevel: txn.requiredFeeDelta > 0n ? txn.requiredFeeDelta * priorityMultiplier : -1n,\n          }\n        })\n        .sort((a, b) => {\n          return a.surplusFeePriorityLevel > b.surplusFeePriorityLevel ? -1 : a.surplusFeePriorityLevel < b.surplusFeePriorityLevel ? 1 : 0\n        })\n        .reduce(\n          (acc, { groupIndex, requiredFeeDelta }) => {\n            if (requiredFeeDelta > 0n) {\n              // There is a fee deficit on the transaction\n              let surplusGroupFees = acc[0]\n              const additionalTransactionFees = acc[1]\n              const additionalFeeDelta = requiredFeeDelta - surplusGroupFees\n              if (additionalFeeDelta <= 0n) {\n                // The surplus group fees fully cover the required fee delta\n                surplusGroupFees = -additionalFeeDelta\n              } else {\n                // The surplus group fees do not fully cover the required fee delta, use what is available\n                additionalTransactionFees.set(groupIndex, additionalFeeDelta)\n                surplusGroupFees = 0n\n              }\n              return [surplusGroupFees, additionalTransactionFees] as const\n            }\n            return acc\n          },\n          [\n            executionInfo.txns.reduce((acc, { requiredFeeDelta }) => {\n              if (requiredFeeDelta < 0n) {\n                return acc + -requiredFeeDelta\n              }\n              return acc\n            }, 0n),\n            new Map<number, bigint>(),\n          ] as const,\n        )\n    : [0n, new Map<number, bigint>()]\n\n  const appCallHasAccessReferences = (txn: algosdk.Transaction) => {\n    return txn.type === TransactionType.appl && txn.applicationCall?.access && txn.applicationCall?.access.length > 0\n  }\n\n  const indexesWithAccessReferences: number[] = []\n\n  executionInfo.txns.forEach(({ unnamedResourcesAccessed: r }, i) => {\n    // Populate Transaction App Call Resources\n    if (sendParams.populateAppCallResources && group[i].txn.type === TransactionType.appl) {\n      const hasAccessReferences = appCallHasAccessReferences(group[i].txn)\n\n      if (hasAccessReferences && (r || executionInfo.groupUnnamedResourcesAccessed)) {\n        indexesWithAccessReferences.push(i)\n      }\n\n      if (r && !hasAccessReferences) {\n        if (r.boxes || r.extraBoxRefs) throw Error('Unexpected boxes at the transaction level')\n        if (r.appLocals) throw Error('Unexpected app local at the transaction level')\n        if (r.assetHoldings)\n          throw Error('Unexpected asset holding at the transaction level')\n          // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        ;(group[i].txn as any)['applicationCall'] = {\n          ...group[i].txn.applicationCall,\n          accounts: [...(group[i].txn?.applicationCall?.accounts ?? []), ...(r.accounts ?? [])],\n          foreignApps: [...(group[i].txn?.applicationCall?.foreignApps ?? []), ...(r.apps ?? [])],\n          foreignAssets: [...(group[i].txn?.applicationCall?.foreignAssets ?? []), ...(r.assets ?? [])],\n          boxes: [...(group[i].txn?.applicationCall?.boxes ?? []), ...(r.boxes ?? [])],\n        } satisfies Partial<ApplicationTransactionFields>\n\n        const accounts = group[i].txn.applicationCall?.accounts?.length ?? 0\n        if (accounts > MAX_APP_CALL_ACCOUNT_REFERENCES)\n          throw Error(`Account reference limit of ${MAX_APP_CALL_ACCOUNT_REFERENCES} exceeded in transaction ${i}`)\n        const assets = group[i].txn.applicationCall?.foreignAssets?.length ?? 0\n        const apps = group[i].txn.applicationCall?.foreignApps?.length ?? 0\n        const boxes = group[i].txn.applicationCall?.boxes?.length ?? 0\n        if (accounts + assets + apps + boxes > MAX_APP_CALL_FOREIGN_REFERENCES) {\n          throw Error(`Resource reference limit of ${MAX_APP_CALL_FOREIGN_REFERENCES} exceeded in transaction ${i}`)\n        }\n      }\n    }\n\n    // Cover App Call Inner Transaction Fees\n    if (sendParams.coverAppCallInnerTransactionFees) {\n      const additionalTransactionFee = additionalTransactionFees.get(i)\n\n      if (additionalTransactionFee !== undefined) {\n        if (group[i].txn.type !== algosdk.TransactionType.appl) {\n          throw Error(`An additional fee of ${additionalTransactionFee} µALGO is required for non app call transaction ${i}`)\n        }\n        const transactionFee = group[i].txn.fee + additionalTransactionFee\n        const maxFee = additionalAtcContext?.maxFees?.get(i)?.microAlgo\n        if (maxFee === undefined || transactionFee > maxFee) {\n          throw Error(\n            `Calculated transaction fee ${transactionFee} µALGO is greater than max of ${maxFee ?? 'undefined'} for transaction ${i}`,\n          )\n        }\n        group[i].txn.fee = transactionFee\n      }\n    }\n  })\n\n  // Populate Group App Call Resources\n  if (sendParams.populateAppCallResources) {\n    if (indexesWithAccessReferences.length > 0) {\n      Config.logger.warn(\n        `Resource population will be skipped for transaction indexes ${indexesWithAccessReferences.join(', ')} as they use access references.`,\n      )\n    }\n\n    const populateGroupResource = (\n      txns: algosdk.TransactionWithSigner[],\n      reference:\n        | string\n        | algosdk.modelsv2.BoxReference\n        | algosdk.modelsv2.ApplicationLocalReference\n        | algosdk.modelsv2.AssetHoldingReference\n        | bigint\n        | number\n        | Address,\n      type: 'account' | 'assetHolding' | 'appLocal' | 'app' | 'box' | 'asset',\n    ): void => {\n      const isApplBelowLimit = (t: algosdk.TransactionWithSigner) => {\n        if (t.txn.type !== algosdk.TransactionType.appl) return false\n        if (appCallHasAccessReferences(t.txn)) return false\n\n        const accounts = t.txn.applicationCall?.accounts?.length ?? 0\n        const assets = t.txn.applicationCall?.foreignAssets?.length ?? 0\n        const apps = t.txn.applicationCall?.foreignApps?.length ?? 0\n        const boxes = t.txn.applicationCall?.boxes?.length ?? 0\n\n        return accounts + assets + apps + boxes < MAX_APP_CALL_FOREIGN_REFERENCES\n      }\n\n      // If this is a asset holding or app local, first try to find a transaction that already has the account available\n      if (type === 'assetHolding' || type === 'appLocal') {\n        const { account } = reference as algosdk.modelsv2.ApplicationLocalReference | algosdk.modelsv2.AssetHoldingReference\n\n        let txnIndex = txns.findIndex((t) => {\n          if (!isApplBelowLimit(t)) return false\n\n          return (\n            // account is in the foreign accounts array\n            t.txn.applicationCall?.accounts?.map((a) => a.toString()).includes(account.toString()) ||\n            // account is available as an app account\n            t.txn.applicationCall?.foreignApps?.map((a) => algosdk.getApplicationAddress(a).toString()).includes(account.toString()) ||\n            // account is available since it's in one of the fields\n            Object.values(t.txn).some((f) =>\n              stringifyJSON(f, (_, v) => (v instanceof Address ? v.toString() : v))?.includes(account.toString()),\n            )\n          )\n        })\n\n        if (txnIndex > -1) {\n          if (type === 'assetHolding') {\n            const { asset } = reference as algosdk.modelsv2.AssetHoldingReference\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\n            ;(txns[txnIndex].txn as any)['applicationCall'] = {\n              ...txns[txnIndex].txn.applicationCall,\n              foreignAssets: [...(txns[txnIndex].txn?.applicationCall?.foreignAssets ?? []), ...[asset]],\n            } satisfies Partial<ApplicationTransactionFields>\n          } else {\n            const { app } = reference as algosdk.modelsv2.ApplicationLocalReference\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\n            ;(txns[txnIndex].txn as any)['applicationCall'] = {\n              ...txns[txnIndex].txn.applicationCall,\n              foreignApps: [...(txns[txnIndex].txn?.applicationCall?.foreignApps ?? []), ...[app]],\n            } satisfies Partial<ApplicationTransactionFields>\n          }\n          return\n        }\n\n        // Now try to find a txn that already has that app or asset available\n        txnIndex = txns.findIndex((t) => {\n          if (!isApplBelowLimit(t)) return false\n\n          // check if there is space in the accounts array\n          if ((t.txn.applicationCall?.accounts?.length ?? 0) >= MAX_APP_CALL_ACCOUNT_REFERENCES) return false\n\n          if (type === 'assetHolding') {\n            const { asset } = reference as algosdk.modelsv2.AssetHoldingReference\n            return t.txn.applicationCall?.foreignAssets?.includes(asset)\n          } else {\n            const { app } = reference as algosdk.modelsv2.ApplicationLocalReference\n            return t.txn.applicationCall?.foreignApps?.includes(app) || t.txn.applicationCall?.appIndex === app\n          }\n        })\n\n        if (txnIndex > -1) {\n          const { account } = reference as algosdk.modelsv2.AssetHoldingReference | algosdk.modelsv2.ApplicationLocalReference\n\n          // eslint-disable-next-line @typescript-eslint/no-explicit-any\n          ;(txns[txnIndex].txn as any)['applicationCall'] = {\n            ...txns[txnIndex].txn.applicationCall,\n            accounts: [...(txns[txnIndex].txn?.applicationCall?.accounts ?? []), ...[account]],\n          } satisfies Partial<ApplicationTransactionFields>\n\n          return\n        }\n      }\n\n      // If this is a box, first try to find a transaction that already has the app available\n      if (type === 'box') {\n        const { app, name } = reference as algosdk.modelsv2.BoxReference\n\n        const txnIndex = txns.findIndex((t) => {\n          if (!isApplBelowLimit(t)) return false\n\n          // If the app is in the foreign array OR the app being called, then we know it's available\n          return t.txn.applicationCall?.foreignApps?.includes(app) || t.txn.applicationCall?.appIndex === app\n        })\n\n        if (txnIndex > -1) {\n          // eslint-disable-next-line @typescript-eslint/no-explicit-any\n          ;(txns[txnIndex].txn as any)['applicationCall'] = {\n            ...txns[txnIndex].txn.applicationCall,\n            boxes: [...(txns[txnIndex].txn?.applicationCall?.boxes ?? []), ...[{ appIndex: app, name } satisfies TransactionBoxReference]],\n          } satisfies Partial<ApplicationTransactionFields>\n\n          return\n        }\n      }\n\n      // Find the txn index to put the reference(s)\n      const txnIndex = txns.findIndex((t) => {\n        if (t.txn.type !== algosdk.TransactionType.appl) return false\n        if (appCallHasAccessReferences(t.txn)) return false\n\n        const accounts = t.txn.applicationCall?.accounts?.length ?? 0\n        const assets = t.txn.applicationCall?.foreignAssets?.length ?? 0\n        const apps = t.txn.applicationCall?.foreignApps?.length ?? 0\n        const boxes = t.txn.applicationCall?.boxes?.length ?? 0\n\n        if (type === 'account')\n          return accounts < MAX_APP_CALL_ACCOUNT_REFERENCES && accounts + assets + apps + boxes < MAX_APP_CALL_FOREIGN_REFERENCES\n\n        // If we're adding local state or asset holding, we need space for the acocunt and the other reference\n        if (type === 'assetHolding' || type === 'appLocal') {\n          return accounts + assets + apps + boxes < MAX_APP_CALL_FOREIGN_REFERENCES - 1 && accounts < MAX_APP_CALL_ACCOUNT_REFERENCES\n        }\n\n        // If we're adding a box, we need space for both the box ref and the app ref\n        if (type === 'box' && BigInt((reference as algosdk.modelsv2.BoxReference).app) !== BigInt(0)) {\n          return accounts + assets + apps + boxes < MAX_APP_CALL_FOREIGN_REFERENCES - 1\n        }\n\n        return accounts + assets + apps + boxes < MAX_APP_CALL_FOREIGN_REFERENCES\n      })\n\n      if (txnIndex === -1) {\n        throw Error('No more transactions below reference limit. Add another app call to the group.')\n      }\n\n      if (type === 'account') {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        ;(txns[txnIndex].txn as any)['applicationCall'] = {\n          ...txns[txnIndex].txn.applicationCall,\n          accounts: [...(txns[txnIndex].txn?.applicationCall?.accounts ?? []), ...[reference as Address]],\n        } satisfies Partial<ApplicationTransactionFields>\n      } else if (type === 'app') {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        ;(txns[txnIndex].txn as any)['applicationCall'] = {\n          ...txns[txnIndex].txn.applicationCall,\n          foreignApps: [\n            ...(txns[txnIndex].txn?.applicationCall?.foreignApps ?? []),\n            ...[typeof reference === 'bigint' ? reference : BigInt(reference as number)],\n          ],\n        } satisfies Partial<ApplicationTransactionFields>\n      } else if (type === 'box') {\n        const { app, name } = reference as algosdk.modelsv2.BoxReference\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        ;(txns[txnIndex].txn as any)['applicationCall'] = {\n          ...txns[txnIndex].txn.applicationCall,\n          boxes: [...(txns[txnIndex].txn?.applicationCall?.boxes ?? []), ...[{ appIndex: app, name } satisfies TransactionBoxReference]],\n        } satisfies Partial<ApplicationTransactionFields>\n\n        if (app.toString() !== '0') {\n          // eslint-disable-next-line @typescript-eslint/no-explicit-any\n          ;(txns[txnIndex].txn as any)['applicationCall'] = {\n            ...txns[txnIndex].txn.applicationCall,\n            foreignApps: [...(txns[txnIndex].txn?.applicationCall?.foreignApps ?? []), ...[app]],\n          } satisfies Partial<ApplicationTransactionFields>\n        }\n      } else if (type === 'assetHolding') {\n        const { asset, account } = reference as algosdk.modelsv2.AssetHoldingReference\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        ;(txns[txnIndex].txn as any)['applicationCall'] = {\n          ...txns[txnIndex].txn.applicationCall,\n          foreignAssets: [...(txns[txnIndex].txn?.applicationCall?.foreignAssets ?? []), ...[asset]],\n          accounts: [...(txns[txnIndex].txn?.applicationCall?.accounts ?? []), ...[account]],\n        } satisfies Partial<ApplicationTransactionFields>\n      } else if (type === 'appLocal') {\n        const { app, account } = reference as algosdk.modelsv2.ApplicationLocalReference\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        ;(txns[txnIndex].txn as any)['applicationCall'] = {\n          ...txns[txnIndex].txn.applicationCall,\n          foreignApps: [...(txns[txnIndex].txn?.applicationCall?.foreignApps ?? []), ...[app]],\n          accounts: [...(txns[txnIndex].txn?.applicationCall?.accounts ?? []), ...[account]],\n        } satisfies Partial<ApplicationTransactionFields>\n      } else if (type === 'asset') {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        ;(txns[txnIndex].txn as any)['applicationCall'] = {\n          ...txns[txnIndex].txn.applicationCall,\n          foreignAssets: [\n            ...(txns[txnIndex].txn?.applicationCall?.foreignAssets ?? []),\n            ...[typeof reference === 'bigint' ? reference : BigInt(reference as number)],\n          ],\n        } satisfies Partial<ApplicationTransactionFields>\n      }\n    }\n\n    const g = executionInfo.groupUnnamedResourcesAccessed\n\n    if (g) {\n      // Do cross-reference resources first because they are the most restrictive in terms\n      // of which transactions can be used\n      g.appLocals?.forEach((a) => {\n        populateGroupResource(group, a, 'appLocal')\n\n        // Remove resources from the group if we're adding them here\n        g.accounts = g.accounts?.filter((acc) => acc !== a.account)\n        g.apps = g.apps?.filter((app) => BigInt(app) !== BigInt(a.app))\n      })\n\n      g.assetHoldings?.forEach((a) => {\n        populateGroupResource(group, a, 'assetHolding')\n\n        // Remove resources from the group if we're adding them here\n        g.accounts = g.accounts?.filter((acc) => acc !== a.account)\n        g.assets = g.assets?.filter((asset) => BigInt(asset) !== BigInt(a.asset))\n      })\n\n      // Do accounts next because the account limit is 4\n      g.accounts?.forEach((a) => {\n        populateGroupResource(group, a, 'account')\n      })\n\n      g.boxes?.forEach((b) => {\n        populateGroupResource(group, b, 'box')\n\n        // Remove apps as resource from the group if we're adding it here\n        g.apps = g.apps?.filter((app) => BigInt(app) !== BigInt(b.app))\n      })\n\n      g.assets?.forEach((a) => {\n        populateGroupResource(group, a, 'asset')\n      })\n\n      g.apps?.forEach((a) => {\n        populateGroupResource(group, a, 'app')\n      })\n\n      if (g.extraBoxRefs) {\n        for (let i = 0; i < g.extraBoxRefs; i += 1) {\n          const ref = new algosdk.modelsv2.BoxReference({ app: 0, name: new Uint8Array(0) })\n          populateGroupResource(group, ref, 'box')\n        }\n      }\n    }\n  }\n\n  const newAtc = new algosdk.AtomicTransactionComposer()\n\n  group.forEach((t) => {\n    t.txn.group = undefined\n    newAtc.addTransaction(t)\n  })\n\n  newAtc['methodCalls'] = atc['methodCalls']\n  return newAtc\n}\n\n/**\n * Signs and sends transactions that have been collected by an `AtomicTransactionComposer`.\n * @param atcSend The parameters controlling the send, including `atc` The `AtomicTransactionComposer` and params to control send behaviour\n * @param algod An algod client\n * @returns An object with transaction IDs, transactions, group transaction ID (`groupTransactionId`) if more than 1 transaction sent, and (if `skipWaiting` is `false` or unset) confirmation (`confirmation`)\n */\nexport const sendAtomicTransactionComposer = async function (atcSend: AtomicTransactionComposerToSend, algod: Algodv2) {\n  const { atc: givenAtc, sendParams, additionalAtcContext, ...executeParams } = atcSend\n\n  let atc: AtomicTransactionComposer\n\n  atc = givenAtc\n  try {\n    const transactionsWithSigner = atc.buildGroup()\n\n    // If populateAppCallResources is true OR if populateAppCallResources is undefined and there are app calls, then populate resources\n    const populateAppCallResources =\n      executeParams?.populateAppCallResources ?? sendParams?.populateAppCallResources ?? Config.populateAppCallResources\n    const coverAppCallInnerTransactionFees = executeParams?.coverAppCallInnerTransactionFees\n\n    if (\n      (populateAppCallResources || coverAppCallInnerTransactionFees) &&\n      transactionsWithSigner.map((t) => t.txn.type).includes(algosdk.TransactionType.appl)\n    ) {\n      atc = await prepareGroupForSending(\n        givenAtc,\n        algod,\n        { ...executeParams, populateAppCallResources, coverAppCallInnerTransactionFees },\n        additionalAtcContext,\n      )\n    }\n\n    // atc.buildGroup() is needed to ensure that any changes made by prepareGroupForSending are reflected and the group id is set\n    const transactionsToSend = atc.buildGroup().map((t) => {\n      return t.txn\n    })\n    let groupId: string | undefined = undefined\n    if (transactionsToSend.length > 1) {\n      groupId = transactionsToSend[0].group ? Buffer.from(transactionsToSend[0].group).toString('base64') : ''\n      Config.getLogger(executeParams?.suppressLog ?? sendParams?.suppressLog).verbose(\n        `Sending group of ${transactionsToSend.length} transactions (${groupId})`,\n        {\n          transactionsToSend,\n        },\n      )\n\n      Config.getLogger(executeParams?.suppressLog ?? sendParams?.suppressLog).debug(\n        `Transaction IDs (${groupId})`,\n        transactionsToSend.map((t) => t.txID()),\n      )\n    }\n\n    if (Config.debug && Config.traceAll) {\n      // Emit the simulate response for use with AlgoKit AVM debugger\n      const simulateResponse = await performAtomicTransactionComposerSimulate(atc, algod)\n      await Config.events.emitAsync(EventType.TxnGroupSimulated, {\n        simulateResponse,\n      })\n    }\n    const result = await atc.execute(\n      algod,\n      executeParams?.maxRoundsToWaitForConfirmation ?? sendParams?.maxRoundsToWaitForConfirmation ?? 5,\n    )\n\n    if (transactionsToSend.length > 1) {\n      Config.getLogger(executeParams?.suppressLog ?? sendParams?.suppressLog).verbose(\n        `Group transaction (${groupId}) sent with ${transactionsToSend.length} transactions`,\n      )\n    } else {\n      Config.getLogger(executeParams?.suppressLog ?? sendParams?.suppressLog).verbose(\n        `Sent transaction ID ${transactionsToSend[0].txID()} ${transactionsToSend[0].type} from ${transactionsToSend[0].sender.toString()}`,\n      )\n    }\n\n    let confirmations: modelsv2.PendingTransactionResponse[] | undefined = undefined\n    if (!sendParams?.skipWaiting) {\n      confirmations = await Promise.all(transactionsToSend.map(async (t) => await algod.pendingTransactionInformation(t.txID()).do()))\n    }\n\n    const methodCalls = [...(atc['methodCalls'] as Map<number, ABIMethod>).values()]\n\n    return {\n      groupId,\n      confirmations,\n      txIds: transactionsToSend.map((t) => t.txID()),\n      transactions: transactionsToSend,\n      returns: result.methodResults.map((r, i) => getABIReturnValue(r, methodCalls[i]!.returns.type)),\n    } as SendAtomicTransactionComposerResults\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  } catch (e: any) {\n    // Create a new error object so the stack trace is correct (algosdk throws an error with a more limited stack trace)\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const err = new Error(typeof e === 'object' ? e?.message : 'Received error executing Atomic Transaction Composer') as any as any\n    err.cause = e\n    if (typeof e === 'object') {\n      // Remove headers as it doesn't have anything useful.\n      delete e.response?.headers\n      err.response = e.response\n      // body property very noisy\n      if (e.response && 'body' in e.response) delete err.response.body\n      err.name = e.name\n    }\n\n    if (Config.debug && typeof e === 'object') {\n      err.traces = []\n      Config.getLogger(executeParams?.suppressLog ?? sendParams?.suppressLog).error(\n        'Received error executing Atomic Transaction Composer and debug flag enabled; attempting simulation to get more information',\n        err,\n      )\n      const simulate = await performAtomicTransactionComposerSimulate(atc, algod)\n      if (Config.debug && !Config.traceAll) {\n        // Emit the event only if traceAll: false, as it should have already been emitted above\n        await Config.events.emitAsync(EventType.TxnGroupSimulated, {\n          simulateResponse: simulate,\n        })\n      }\n\n      if (simulate && simulate.txnGroups[0].failedAt) {\n        for (const txn of simulate.txnGroups[0].txnResults) {\n          err.traces.push({\n            trace: txn.execTrace?.toEncodingData(),\n            appBudget: txn.appBudgetConsumed,\n            logicSigBudget: txn.logicSigBudgetConsumed,\n            logs: txn.txnResult.logs,\n            message: simulate.txnGroups[0].failureMessage,\n          })\n        }\n      }\n    } else {\n      Config.getLogger(executeParams?.suppressLog ?? sendParams?.suppressLog).error(\n        'Received error executing Atomic Transaction Composer, for more information enable the debug flag',\n        err,\n      )\n    }\n\n    // Attach the sent transactions so we can use them in error transformers\n    err.sentTransactions = atc.buildGroup().map((t) => t.txn)\n    throw err\n  }\n}\n\n/**\n * Takes an algosdk `ABIResult` and converts it to an `ABIReturn`.\n * Converts `bigint`'s for Uint's < 64 to `number` for easier use.\n * @param result The `ABIReturn`\n */\nexport function getABIReturnValue(result: algosdk.ABIResult, type: ABIReturnType): ABIReturn {\n  if (result.decodeError) {\n    return {\n      decodeError: result.decodeError,\n    }\n  }\n\n  const returnValue = convertAbiByteArrays(\n    result.returnValue !== undefined && result.method.returns.type !== 'void'\n      ? convertABIDecodedBigIntToNumber(result.returnValue, result.method.returns.type)\n      : result.returnValue!,\n    type,\n  )\n\n  return {\n    method: result.method,\n    rawReturnValue: result.rawReturnValue,\n    decodeError: undefined,\n    returnValue,\n  }\n}\n\n/**\n * @deprecated Use `TransactionComposer` (`algorand.newGroup()`) or `AtomicTransactionComposer` to construct and send group transactions instead.\n *\n * Signs and sends a group of [up to 16](https://dev.algorand.co/concepts/transactions/atomic-txn-groups/#create-transactions) transactions to the chain\n *\n * @param groupSend The group details to send, with:\n *   * `transactions`: The array of transactions to send along with their signing account\n *   * `sendParams`: The parameters to dictate how the group is sent\n * @param algod An algod client\n * @returns An object with transaction IDs, transactions, group transaction ID (`groupTransactionId`) if more than 1 transaction sent, and (if `skipWaiting` is `false` or unset) confirmation (`confirmation`)\n */\nexport const sendGroupOfTransactions = async function (groupSend: TransactionGroupToSend, algod: Algodv2) {\n  const { transactions, signer, sendParams } = groupSend\n\n  const defaultTransactionSigner = signer ? getSenderTransactionSigner(signer) : undefined\n\n  const transactionsWithSigner = await Promise.all(\n    transactions.map(async (t) => {\n      if ('signer' in t)\n        return {\n          txn: t.transaction,\n          signer: getSenderTransactionSigner(t.signer),\n          sender: t.signer,\n        }\n\n      const txn = 'then' in t ? (await t).transaction : t\n      if (!signer) {\n        throw new Error(`Attempt to send transaction ${txn.txID()} as part of a group transaction, but no signer parameter was provided.`)\n      }\n\n      return {\n        txn,\n        signer: defaultTransactionSigner!,\n        sender: signer,\n      }\n    }),\n  )\n\n  const atc = new AtomicTransactionComposer()\n  transactionsWithSigner.forEach((txn) => atc.addTransaction(txn))\n\n  return (await sendAtomicTransactionComposer({ atc, sendParams }, algod)) as Omit<SendAtomicTransactionComposerResults, 'returns'>\n}\n\n/**\n * Wait until the transaction is confirmed or rejected, or until `timeout`\n * number of rounds have passed.\n *\n * @param algod An algod client\n * @param transactionId The transaction ID to wait for\n * @param maxRoundsToWait Maximum number of rounds to wait\n *\n * @return Pending transaction information\n * @throws Throws an error if the transaction is not confirmed or rejected in the next `timeout` rounds\n */\nexport const waitForConfirmation = async function (\n  transactionId: string,\n  maxRoundsToWait: number | bigint,\n  algod: Algodv2,\n): Promise<modelsv2.PendingTransactionResponse> {\n  if (maxRoundsToWait < 0) {\n    throw new Error(`Invalid timeout, received ${maxRoundsToWait}, expected > 0`)\n  }\n\n  // Get current round\n  const status = await algod.status().do()\n  if (status === undefined) {\n    throw new Error('Unable to get node status')\n  }\n\n  // Loop for up to `timeout` rounds looking for a confirmed transaction\n  const startRound = BigInt(status.lastRound) + 1n\n  let currentRound = startRound\n  while (currentRound < startRound + BigInt(maxRoundsToWait)) {\n    try {\n      const pendingInfo = await algod.pendingTransactionInformation(transactionId).do()\n\n      if (pendingInfo !== undefined) {\n        const confirmedRound = pendingInfo.confirmedRound\n        if (confirmedRound && confirmedRound > 0) {\n          return pendingInfo\n        } else {\n          const poolError = pendingInfo.poolError\n          if (poolError != null && poolError.length > 0) {\n            // If there was a pool error, then the transaction has been rejected!\n            throw new Error(`Transaction ${transactionId} was rejected; pool error: ${poolError}`)\n          }\n        }\n      }\n    } catch (e: unknown) {\n      if ((e as Error).name === 'URLTokenBaseHTTPError') {\n        currentRound++\n        continue\n      }\n    }\n\n    await algod.statusAfterBlock(toNumber(currentRound)).do()\n    currentRound++\n  }\n\n  throw new Error(`Transaction ${transactionId} not confirmed after ${maxRoundsToWait} rounds`)\n}\n\n/**\n * @deprecated Use `TransactionComposer` and the `maxFee` field in the transaction params instead.\n *\n * Limit the acceptable fee to a defined amount of µAlgo.\n * This also sets the transaction to be flatFee to ensure the transaction only succeeds at\n * the estimated rate.\n * @param transaction The transaction to cap or suggested params object about to be used to create a transaction\n * @param maxAcceptableFee The maximum acceptable fee to pay\n */\nexport function capTransactionFee(transaction: algosdk.Transaction | SuggestedParams, maxAcceptableFee: AlgoAmount) {\n  // If a flat fee hasn't already been defined\n  if (!('flatFee' in transaction) || !transaction.flatFee) {\n    // Once a transaction has been constructed by algosdk, transaction.fee indicates what the total transaction fee\n    // Will be based on the current suggested fee-per-byte value.\n    if (transaction.fee > maxAcceptableFee.microAlgo) {\n      throw new Error(\n        `Cancelled transaction due to high network congestion fees. Algorand suggested fees would cause this transaction to cost ${transaction.fee} µALGO. Cap for this transaction is ${maxAcceptableFee.microAlgo} µALGO.`,\n      )\n    } else if (transaction.fee > 1_000_000) {\n      Config.logger.warn(`Algorand network congestion fees are in effect. This transaction will incur a fee of ${transaction.fee} µALGO.`)\n    }\n\n    // Now set the flat on the transaction. Otherwise the network may increase the fee above our cap and perform the transaction.\n    if ('flatFee' in transaction) {\n      transaction.flatFee = true\n    }\n  }\n}\n\n/**\n * @deprecated Use `TransactionComposer` and the `maxFee` and `staticFee` fields in the transaction params instead.\n *\n * Allows for control of fees on a `Transaction` or `SuggestedParams` object\n * @param transaction The transaction or suggested params\n * @param feeControl The fee control parameters\n */\nexport function controlFees<T extends SuggestedParams | Transaction>(\n  transaction: T,\n  feeControl: { fee?: AlgoAmount; maxFee?: AlgoAmount },\n) {\n  const { fee, maxFee } = feeControl\n  if (fee) {\n    transaction.fee = Number(fee.microAlgo)\n    if ('flatFee' in transaction) {\n      transaction.flatFee = true\n    }\n  }\n\n  if (maxFee !== undefined) {\n    capTransactionFee(transaction, maxFee)\n  }\n\n  return transaction\n}\n\n/**\n * @deprecated Use `suggestedParams ? { ...suggestedParams } : await algod.getTransactionParams().do()` instead\n *\n * Returns suggested transaction parameters from algod unless some are already provided.\n * @param params Optionally provide parameters to use\n * @param algod Algod algod\n * @returns The suggested transaction parameters\n */\nexport async function getTransactionParams(params: SuggestedParams | undefined, algod: Algodv2): Promise<SuggestedParams> {\n  if (params) {\n    return { ...params }\n  }\n  const p = await algod.getTransactionParams().do()\n  return {\n    fee: p.fee,\n    firstValid: p.firstValid,\n    lastValid: p.lastValid,\n    genesisID: p.genesisID,\n    genesisHash: p.genesisHash,\n    minFee: p.minFee,\n  }\n}\n\n/**\n * @deprecated Use `atc.clone().buildGroup()` instead.\n *\n * Returns the array of transactions currently present in the given `AtomicTransactionComposer`\n * @param atc The atomic transaction composer\n * @returns The array of transactions with signers\n */\nexport function getAtomicTransactionComposerTransactions(atc: AtomicTransactionComposer) {\n  try {\n    return atc.clone().buildGroup()\n  } catch {\n    return []\n  }\n}\n"],"names":[],"mappings":"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"}