{"version":3,"file":"app-deployer.mjs","sources":["../../src/types/app-deployer.ts"],"sourcesContent":["import algosdk, { Address } from 'algosdk'\nimport { Config } from '../config'\nimport * as indexer from '../indexer-lookup'\nimport { calculateExtraProgramPages } from '../util'\nimport { AlgorandClientTransactionSender } from './algorand-client-transaction-sender'\nimport {\n  APP_DEPLOY_NOTE_DAPP,\n  OnSchemaBreak,\n  OnUpdate,\n  type ABIReturn,\n  type AppDeployMetadata,\n  type SendAppCreateTransactionResult,\n  type SendAppUpdateTransactionResult,\n  type TealTemplateParams,\n} from './app'\nimport { AppManager } from './app-manager'\nimport {\n  AppCreateMethodCall,\n  AppCreateParams,\n  AppDeleteMethodCall,\n  AppDeleteParams,\n  AppUpdateMethodCall,\n  AppUpdateParams,\n  TransactionComposer,\n} from './composer'\nimport { Expand } from './expand'\nimport { ConfirmedTransactionResult, SendParams } from './transaction'\n\n/** Params to specify an update transaction for an app deployment */\nexport type DeployAppUpdateParams = Expand<Omit<AppUpdateParams, 'appId' | 'approvalProgram' | 'clearStateProgram'>>\n/** Params to specify an update method call for an app deployment */\nexport type DeployAppUpdateMethodCall = Expand<Omit<AppUpdateMethodCall, 'appId' | 'approvalProgram' | 'clearStateProgram'>>\n/** Params to specify a transaction for an app deployment */\nexport type DeployAppDeleteParams = Expand<Omit<AppDeleteParams, 'appId'>>\n/** Params to specify a delete method call for an app deployment */\nexport type DeployAppDeleteMethodCall = Expand<Omit<AppDeleteMethodCall, 'appId'>>\n\n/** The parameters to idempotently deploy an app */\nexport type AppDeployParams = Expand<\n  SendParams & {\n    /** The deployment metadata */\n    metadata: AppDeployMetadata\n    /** Any deploy-time parameters to replace in the TEAL code before compiling it (used if teal code is passed in as a string) */\n    deployTimeParams?: TealTemplateParams\n    /** What action to perform if a schema break (storage schema or extra pages change) is detected:\n     *\n     * * `fail` - Fail the deployment (throw an error, **default**)\n     * * `replace` - Delete the old app and create a new one\n     * * `append` - Deploy a new app and leave the old one as is\n     */\n    onSchemaBreak?: 'replace' | 'fail' | 'append' | OnSchemaBreak\n    /** What action to perform if a TEAL code update is detected:\n     *\n     * * `fail` - Fail the deployment (throw an error, **default**)\n     * * `update` - Update the app with the new TEAL code\n     * * `replace` - Delete the old app and create a new one\n     * * `append` - Deploy a new app and leave the old one as is\n     */\n    onUpdate?: 'update' | 'replace' | 'fail' | 'append' | OnUpdate\n    /** Create transaction parameters to use if a create needs to be issued as part of deployment */\n    createParams: AppCreateParams | AppCreateMethodCall\n    /** Update transaction parameters to use if an update needs to be issued as part of deployment */\n    updateParams: DeployAppUpdateParams | DeployAppUpdateMethodCall\n    /** Delete transaction parameters to use if a delete needs to be issued as part of deployment */\n    deleteParams: DeployAppDeleteParams | DeployAppDeleteMethodCall\n    /** Optional cached value of the existing apps for the given creator; use this to avoid an indexer lookup */\n    existingDeployments?: AppLookup\n    /** Whether or not to ignore the app metadata cache and force a lookup, default: use the cache **/\n    ignoreCache?: boolean\n  }\n>\n\n/** The metadata that can be collected about a deployed app */\nexport interface AppMetadata extends AppDeployMetadata {\n  /** The id of the app */\n  appId: bigint\n  /** The Algorand address of the account associated with the app */\n  appAddress: Address\n  /** The round the app was created */\n  createdRound: bigint\n  /** The last round that the app was updated */\n  updatedRound: bigint\n  /** The metadata when the app was created */\n  createdMetadata: AppDeployMetadata\n  /** Whether or not the app is deleted */\n  deleted: boolean\n}\n\n/** A lookup of name -> Algorand app for a creator */\nexport interface AppLookup {\n  /** The address of the creator associated with this lookup */\n  creator: Readonly<Address>\n  /** A hash map of app name to app metadata */\n  apps: {\n    [name: string]: AppMetadata\n  }\n}\n\nexport type AppDeployResult =\n  | Expand<{ operationPerformed: 'create' } & Omit<AppMetadata, 'appId' | 'appAddress'> & SendAppCreateTransactionResult>\n  | Expand<{ operationPerformed: 'update' } & AppMetadata & SendAppUpdateTransactionResult>\n  | Expand<\n      { operationPerformed: 'replace' } & Omit<AppMetadata, 'appId' | 'appAddress'> &\n        SendAppCreateTransactionResult & {\n          deleteReturn?: ABIReturn\n          deleteResult: ConfirmedTransactionResult\n        }\n    >\n  | Expand<{ operationPerformed: 'nothing' } & AppMetadata>\n\n/** Allows management of deployment and deployment metadata of applications. */\nexport class AppDeployer {\n  private _appManager: AppManager\n  private _transactionSender: AlgorandClientTransactionSender\n  private _indexer?: algosdk.Indexer\n  private _appLookups = new Map<string, AppLookup>()\n\n  /**\n   * Creates an `AppManager`\n   * @param appManager An `AppManager` instance\n   * @param transactionSender An `AlgorandClientTransactionSender` instance\n   * @param indexer An optional indexer instance; supply if you want to indexer to look up app metadata\n   * @example\n   * ```ts\n   * const deployer = new AppDeployer(appManager, transactionSender, indexer)\n   * ```\n   */\n  constructor(appManager: AppManager, transactionSender: AlgorandClientTransactionSender, indexer?: algosdk.Indexer) {\n    this._appManager = appManager\n    this._transactionSender = transactionSender\n    this._indexer = indexer\n  }\n\n  /**\n   * Idempotently deploy (create if not exists, update if changed) an app against the given name for the given creator account, including deploy-time TEAL template placeholder substitutions (if specified).\n   *\n   * To understand the architecture decisions behind this functionality please see https://github.com/algorandfoundation/algokit-cli/blob/main/docs/architecture-decisions/2023-01-12_smart-contract-deployment.md\n   *\n   * **Note:** When using the return from this function be sure to check `operationPerformed` to get access to various return properties like `transaction`, `confirmation` and `deleteResult`.\n   *\n   * **Note:** if there is a breaking state schema change to an existing app (and `onSchemaBreak` is set to `'replace'`) the existing app will be deleted and re-created.\n   *\n   * **Note:** if there is an update (different TEAL code) to an existing app (and `onUpdate` is set to `'replace'`) the existing app will be deleted and re-created.\n   * @param deployment The arguments to control the app deployment\n   * @returns The result of the deployment\n   * @example\n   * ```ts\n   * const deployResult = await deployer.deploy({\n   *   createParams: {\n   *     sender: 'SENDER_ADDRESS',\n   *     approvalProgram: 'APPROVAL PROGRAM',\n   *     clearStateProgram: 'CLEAR PROGRAM',\n   *     schema: {\n   *       globalByteSlices: 0,\n   *       globalInts: 0,\n   *       localByteSlices: 0,\n   *       localInts: 0\n   *     }\n   *   },\n   *   updateParams: {\n   *     sender: 'SENDER_ADDRESS'\n   *   },\n   *   deleteParams: {\n   *     sender: 'SENDER_ADDRESS'\n   *   },\n   *   metadata: { name: 'my_app', version: '2.0', updatable: false, deletable: false },\n   *   onSchemaBreak: 'append',\n   *   onUpdate: 'append'\n   *  })\n   * ```\n   */\n  async deploy(deployment: AppDeployParams): Promise<AppDeployResult> {\n    const {\n      metadata,\n      deployTimeParams,\n      onSchemaBreak,\n      onUpdate,\n      createParams,\n      updateParams,\n      deleteParams,\n      existingDeployments,\n      ignoreCache,\n      ...sendParams\n    } = deployment\n\n    // Set creation note\n\n    createParams.note = updateParams.note = TransactionComposer.arc2Note({\n      dAppName: APP_DEPLOY_NOTE_DAPP,\n      data: metadata,\n      format: 'j',\n    })\n\n    // Check for required fields\n\n    if (existingDeployments && existingDeployments.creator.toString() !== createParams.sender.toString()) {\n      throw new Error(\n        `Received invalid existingDeployments value for creator ${existingDeployments.creator} when attempting to deploy for creator ${createParams.sender}`,\n      )\n    }\n    if (!existingDeployments && !this._indexer) {\n      throw new Error(\n        `Didn't receive an indexer client when this AppManager was created, but also didn't receive an existingDeployments cache - one of them must be provided`,\n      )\n    }\n\n    Config.getLogger(sendParams?.suppressLog).info(\n      `Idempotently deploying app \"${metadata.name}\" from creator ${createParams.sender} using ${createParams.approvalProgram.length} bytes of ${typeof createParams.approvalProgram === 'string' ? 'teal code' : 'AVM bytecode'} and ${createParams.clearStateProgram.length} bytes of ${typeof createParams.approvalProgram === 'string' ? 'teal code' : 'AVM bytecode'}`,\n    )\n\n    // Compile code if required\n\n    const compiledApproval =\n      typeof createParams.approvalProgram === 'string'\n        ? await this._appManager.compileTealTemplate(createParams.approvalProgram, deployTimeParams, metadata)\n        : undefined\n    const approvalProgram = compiledApproval ? compiledApproval.compiledBase64ToBytes : createParams.approvalProgram\n\n    const compiledClear =\n      typeof createParams.clearStateProgram === 'string'\n        ? await this._appManager.compileTealTemplate(createParams.clearStateProgram, deployTimeParams)\n        : undefined\n    const clearStateProgram = compiledClear ? compiledClear.compiledBase64ToBytes : createParams.clearStateProgram\n\n    // Define routines for create, update, and replace\n\n    const createApp = async () => {\n      const result = await ('method' in createParams\n        ? this._transactionSender.appCreateMethodCall({ ...createParams, approvalProgram, clearStateProgram, ...sendParams })\n        : this._transactionSender.appCreate({ ...createParams, approvalProgram, clearStateProgram, ...sendParams }))\n      const appMetadata: AppMetadata = {\n        appId: result.appId,\n        appAddress: result.appAddress,\n        ...metadata,\n        createdMetadata: metadata,\n        createdRound: BigInt(result.confirmation.confirmedRound!),\n        updatedRound: BigInt(result.confirmation.confirmedRound!),\n        deleted: false,\n      }\n      this.updateAppLookup(createParams.sender, appMetadata)\n      return {\n        operationPerformed: 'create',\n        compiledApproval,\n        compiledClear,\n        ...result,\n        ...appMetadata,\n      } satisfies SendAppCreateTransactionResult & AppMetadata & { operationPerformed: 'create' }\n    }\n    const updateApp = async (existingApp: AppMetadata) => {\n      Config.getLogger(sendParams?.suppressLog).info(\n        `Updating existing ${metadata.name} app for ${createParams.sender} to version ${metadata.version}.`,\n      )\n      const result = await ('method' in updateParams\n        ? this._transactionSender.appUpdateMethodCall({\n            appId: existingApp.appId,\n            approvalProgram,\n            clearStateProgram,\n            ...updateParams,\n            ...sendParams,\n          })\n        : this._transactionSender.appUpdate({\n            appId: existingApp.appId,\n            approvalProgram,\n            clearStateProgram,\n            ...updateParams,\n            ...sendParams,\n          }))\n      const appMetadata: AppMetadata = {\n        appId: existingApp.appId,\n        appAddress: existingApp.appAddress,\n        createdMetadata: existingApp.createdMetadata,\n        createdRound: existingApp.createdRound,\n        updatedRound: BigInt(result.confirmation.confirmedRound!),\n        ...metadata,\n        deleted: false,\n      }\n      this.updateAppLookup(createParams.sender, appMetadata)\n      return {\n        operationPerformed: 'update',\n        compiledApproval,\n        compiledClear,\n        ...result,\n        ...appMetadata,\n      } satisfies SendAppUpdateTransactionResult & AppMetadata & { operationPerformed: 'update' }\n    }\n    const replaceApp = async (existingApp: AppMetadata) => {\n      Config.getLogger(sendParams?.suppressLog).info(\n        `Deploying a new ${metadata.name} app for ${createParams.sender}; deploying app with version ${metadata.version}.`,\n      )\n\n      Config.getLogger(sendParams?.suppressLog).warn(\n        `Deleting existing ${metadata.name} app with id ${existingApp.appId} from ${deleteParams.sender} account.`,\n      )\n\n      const composer = this._transactionSender.newGroup()\n      if ('method' in createParams) {\n        composer.addAppCreateMethodCall({ ...createParams, approvalProgram, clearStateProgram })\n      } else {\n        composer.addAppCreate({ ...createParams, approvalProgram, clearStateProgram })\n      }\n      const createIndex = await composer.count()\n      if ('method' in deleteParams) {\n        composer.addAppDeleteMethodCall({ appId: existingApp.appId, ...deleteParams })\n      } else {\n        composer.addAppDelete({ appId: existingApp.appId, ...deleteParams })\n      }\n      const result = await composer.send({ ...sendParams })\n      const confirmation = result.confirmations.at(createIndex - 1)!\n      const transaction = result.transactions.at(createIndex - 1)!\n      const deleteTransaction = result.transactions.at(-1)!\n\n      Config.getLogger(sendParams?.suppressLog).warn(\n        `Sent transactions ${transaction.txID()} to create app with id ${confirmation.applicationIndex} and ${deleteTransaction.txID()} to delete app with id ${\n          existingApp.appId\n        } from ${createParams.sender} account.`,\n      )\n\n      const appMetadata: AppMetadata = {\n        appId: BigInt(confirmation.applicationIndex!),\n        appAddress: algosdk.getApplicationAddress(confirmation.applicationIndex!),\n        ...metadata,\n        createdMetadata: metadata,\n        createdRound: BigInt(confirmation.confirmedRound!),\n        updatedRound: BigInt(confirmation.confirmedRound!),\n        deleted: false,\n      }\n      this.updateAppLookup(createParams.sender, appMetadata)\n\n      return {\n        operationPerformed: 'replace',\n        ...result,\n        compiledApproval,\n        compiledClear,\n        transaction,\n        confirmation,\n        return: 'method' in createParams ? result.returns?.[0] : undefined,\n        deleteReturn: 'method' in deleteParams ? result.returns?.at(-1) : undefined,\n        ...appMetadata,\n        deleteResult: { transaction: deleteTransaction, confirmation: result.confirmations.at(-1)! },\n      } satisfies { operationPerformed: 'replace' } & AppMetadata &\n        SendAppCreateTransactionResult & {\n          deleteReturn?: ABIReturn\n          deleteResult: ConfirmedTransactionResult\n        }\n    }\n\n    // Lookup existing app metadata\n\n    const apps = existingDeployments ?? (await this.getCreatorAppsByName(createParams.sender, ignoreCache))\n\n    const existingApp = apps.apps[metadata.name]\n    if (!existingApp || existingApp.deleted) {\n      Config.getLogger(sendParams?.suppressLog).info(\n        `App ${metadata.name} not found in apps created by ${createParams.sender}; deploying app with version ${metadata.version}.`,\n      )\n\n      return await createApp()\n    }\n\n    Config.getLogger(sendParams?.suppressLog).info(\n      `Existing app ${metadata.name} found by creator ${createParams.sender}, with app id ${existingApp.appId} and version ${existingApp.version}.`,\n    )\n\n    const existingAppRecord = await this._appManager.getById(existingApp.appId)\n    const existingApproval = Buffer.from(existingAppRecord.approvalProgram).toString('base64')\n    const existingClear = Buffer.from(existingAppRecord.clearStateProgram).toString('base64')\n    const extraPages = existingAppRecord.extraProgramPages ?? 0\n\n    const newApprovalBytes = Buffer.from(approvalProgram)\n    const newClearBytes = Buffer.from(clearStateProgram)\n    const newApproval = newApprovalBytes.toString('base64')\n    const newClear = newClearBytes.toString('base64')\n    const newExtraPages = calculateExtraProgramPages(newApprovalBytes, newClearBytes)\n\n    // Check for changes\n\n    const isUpdate = newApproval !== existingApproval || newClear !== existingClear\n    const isSchemaBreak =\n      existingAppRecord.localInts < (createParams.schema?.localInts ?? 0) ||\n      existingAppRecord.globalInts < (createParams.schema?.globalInts ?? 0) ||\n      existingAppRecord.localByteSlices < (createParams.schema?.localByteSlices ?? 0) ||\n      existingAppRecord.globalByteSlices < (createParams.schema?.globalByteSlices ?? 0) ||\n      extraPages < newExtraPages\n\n    if (isSchemaBreak) {\n      Config.getLogger(sendParams?.suppressLog).warn(`Detected a breaking app schema change in app ${existingApp.appId}:`, {\n        from: {\n          globalInts: existingAppRecord.globalInts,\n          globalByteSlices: existingAppRecord.globalByteSlices,\n          localInts: existingAppRecord.localInts,\n          localByteSlices: existingAppRecord.localByteSlices,\n          extraProgramPages: extraPages,\n        },\n        to: { ...createParams.schema, extraProgramPages: newExtraPages },\n      })\n\n      if (onSchemaBreak === undefined || onSchemaBreak === 'fail' || onSchemaBreak === OnSchemaBreak.Fail) {\n        throw new Error(\n          'Schema break detected and onSchemaBreak=OnSchemaBreak.Fail, stopping deployment. ' +\n            'If you want to try deleting and recreating the app then ' +\n            're-run with onSchemaBreak=OnSchemaBreak.ReplaceApp',\n        )\n      }\n\n      if (onSchemaBreak === 'append' || onSchemaBreak === OnSchemaBreak.AppendApp) {\n        Config.getLogger(sendParams?.suppressLog).info('onSchemaBreak=AppendApp, will attempt to create a new app')\n        return await createApp()\n      }\n\n      if (existingApp.deletable) {\n        Config.getLogger(sendParams?.suppressLog).info(\n          'App is deletable and onSchemaBreak=ReplaceApp, will attempt to create new app and delete old app',\n        )\n      } else {\n        Config.getLogger(sendParams?.suppressLog).info(\n          'App is not deletable but onSchemaBreak=ReplaceApp, will attempt to delete app, delete will most likely fail',\n        )\n      }\n\n      return await replaceApp(existingApp)\n    }\n\n    if (isUpdate) {\n      Config.getLogger(sendParams?.suppressLog).info(\n        `Detected a TEAL update in app ${existingApp.appId} for creator ${createParams.sender}`,\n      )\n\n      if (onUpdate === undefined || onUpdate === 'fail' || onUpdate === OnUpdate.Fail) {\n        throw new Error('Update detected and onUpdate=Fail, stopping deployment. Try a different onUpdate value to not fail.')\n      }\n\n      if (onUpdate === 'append' || onUpdate === OnUpdate.AppendApp) {\n        Config.getLogger(sendParams?.suppressLog).info('onUpdate=AppendApp, will attempt to create a new app')\n        return await createApp()\n      }\n\n      if (onUpdate === 'update' || onUpdate === OnUpdate.UpdateApp) {\n        if (existingApp.updatable) {\n          Config.getLogger(sendParams?.suppressLog).info(`App is updatable and onUpdate=UpdateApp, updating app...`)\n        } else {\n          Config.getLogger(sendParams?.suppressLog).warn(\n            `App is not updatable but onUpdate=UpdateApp, will attempt to update app, update will most likely fail`,\n          )\n        }\n\n        return await updateApp(existingApp)\n      }\n\n      if (onUpdate === 'replace' || onUpdate === OnUpdate.ReplaceApp) {\n        if (existingApp.deletable) {\n          Config.getLogger(sendParams?.suppressLog).warn(\n            'App is deletable and onUpdate=ReplaceApp, creating new app and deleting old app...',\n          )\n        } else {\n          Config.getLogger(sendParams?.suppressLog).warn(\n            'App is not deletable and onUpdate=ReplaceApp, will attempt to create new app and delete old app, delete will most likely fail',\n          )\n        }\n\n        return await replaceApp(existingApp)\n      }\n    }\n\n    Config.getLogger(sendParams?.suppressLog).debug('No detected changes in app, nothing to do.')\n\n    return { ...existingApp, operationPerformed: 'nothing' }\n  }\n\n  private updateAppLookup(sender: string | Address, appMetadata: AppMetadata) {\n    const s = typeof sender === 'string' ? sender : sender.toString()\n    const lookup = this._appLookups.get(s)\n    if (!lookup) {\n      this._appLookups.set(s, { creator: Address.fromString(s), apps: { [appMetadata.name]: appMetadata } })\n    } else {\n      lookup.apps[appMetadata.name] = appMetadata\n    }\n  }\n\n  /**\n   * Returns a lookup of name => app metadata (id, address, ...metadata) for all apps created by the given account that have\n   * an [ARC-2](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0002.md) `AppDeployNote` as the transaction\n   * note of the app creation transaction.\n   *\n   * This function caches the result for the given creator account so that subsequent calls will not require an indexer lookup.\n   *\n   * If the `AppManager` instance wasn't created with an indexer client, this function will throw an error.\n   *\n   * @param creatorAddress The address of the account that is the creator of the apps you want to search for\n   * @param ignoreCache Whether or not to ignore the cache and force a lookup, default: use the cache\n   * @returns A name-based lookup of the app metadata\n   * @example\n   * ```ts\n   * const result = await deployer.getCreatorAppsByName(creator)\n   */\n  async getCreatorAppsByName(creatorAddress: string | Address, ignoreCache?: boolean): Promise<AppLookup> {\n    const appLookup: Record<string, AppMetadata> = {}\n\n    const address = typeof creatorAddress === 'string' ? creatorAddress : creatorAddress.toString()\n    if (!ignoreCache && this._appLookups.has(address)) {\n      return this._appLookups.get(address)!\n    }\n\n    if (!this._indexer) {\n      throw new Error(`Didn't receive an indexer client when this AppManager was created, but received a call to getCreatorApps`)\n    }\n\n    // Extract all apps that account created\n    const createdApps = (await indexer.lookupAccountCreatedApplicationByAddress(this._indexer, creatorAddress))\n      .map((a) => {\n        return { id: a.id, createdAtRound: a.createdAtRound!, deleted: a.deleted }\n      })\n      .sort((a, b) => Number(a.createdAtRound - b.createdAtRound))\n\n    // For each app that account created (in parallel)...\n    const apps = await Promise.all(\n      createdApps.map(async (createdApp) => {\n        // Find any app transactions for that app in the round it was created (should always just be a single creation transaction)\n        const appTransactions = await indexer.searchTransactions(this._indexer!, (s) =>\n          s\n            .minRound(createdApp.createdAtRound)\n            .txType(algosdk.TransactionType.appl)\n            .applicationID(Number(createdApp.id))\n            .address(creatorAddress)\n            .addressRole('sender')\n            .notePrefix(Buffer.from(APP_DEPLOY_NOTE_DAPP).toString('base64')),\n        )\n\n        // Triple check the transaction is intact by filtering for the one we want:\n        //  * application-id is 0 when the app is first created\n        //  * also verify the sender to prevent a potential security risk\n        const appCreationTransaction = appTransactions.transactions.filter(\n          (t) => t.applicationTransaction?.applicationId === 0n && t.sender.toString() === creatorAddress.toString(),\n        )[0]\n\n        const latestAppUpdateTransaction = appTransactions.transactions\n          .filter((t) => t.sender.toString() === creatorAddress.toString())\n          .sort((a, b) =>\n            a.confirmedRound === b.confirmedRound\n              ? (b.intraRoundOffset! - a.intraRoundOffset!) / 10\n              : Number(b.confirmedRound! - a.confirmedRound!),\n          )[0]\n\n        if (!appCreationTransaction?.note)\n          // No note; ignoring\n          return null\n\n        return { createdApp, appCreationTransaction, latestAppUpdateTransaction }\n      }),\n    )\n\n    apps\n      .filter((a) => a !== null)\n      .forEach((a) => {\n        const { createdApp, appCreationTransaction, latestAppUpdateTransaction } = a!\n\n        const parseNote = (note?: string) => {\n          if (!note) {\n            // No note; ignoring...\n            return\n          }\n\n          if (!note.startsWith(`${APP_DEPLOY_NOTE_DAPP}:j{`))\n            // Clearly not APP_DEPLOY JSON; ignoring...\n            return\n\n          return JSON.parse(note.substring(APP_DEPLOY_NOTE_DAPP.length + 2)) as AppDeployMetadata\n        }\n\n        try {\n          const creationNote = parseNote(\n            appCreationTransaction.note ? Buffer.from(appCreationTransaction.note).toString('utf-8') : undefined,\n          )\n          const updateNote = parseNote(\n            latestAppUpdateTransaction.note ? Buffer.from(latestAppUpdateTransaction.note).toString('utf-8') : undefined,\n          )\n          if (creationNote?.name) {\n            appLookup[creationNote.name] = {\n              appId: createdApp.id,\n              appAddress: algosdk.getApplicationAddress(createdApp.id),\n              createdMetadata: creationNote,\n              createdRound: appCreationTransaction.confirmedRound ?? 0n,\n              ...(updateNote ?? creationNote),\n              updatedRound: latestAppUpdateTransaction?.confirmedRound ?? 0n,\n              deleted: createdApp.deleted ?? false,\n            }\n          }\n        } catch (e) {\n          Config.logger.warn(\n            `Received error trying to retrieve app with ${createdApp.id} for creator ${creatorAddress}; failing silently`,\n            e,\n          )\n          return\n        }\n      })\n\n    const lookup = {\n      creator: typeof creatorAddress === 'string' ? Address.fromString(creatorAddress) : creatorAddress,\n      apps: appLookup,\n    }\n\n    this._appLookups.set(creatorAddress.toString(), lookup)\n\n    return lookup\n  }\n}\n"],"names":["indexer.lookupAccountCreatedApplicationByAddress","indexer.searchTransactions"],"mappings":"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"}