{"version":3,"file":"app-factory.mjs","sources":["../../src/types/app-factory.ts"],"sourcesContent":["import algosdk, { Address } from 'algosdk'\nimport { TransactionSignerAccount } from './account'\nimport { type AlgorandClient } from './algorand-client'\nimport {\n  AppCompilationResult,\n  AppReturn,\n  DELETABLE_TEMPLATE_NAME,\n  SendAppTransactionResult,\n  TealTemplateParams,\n  UPDATABLE_TEMPLATE_NAME,\n} from './app'\nimport {\n  ABIStruct,\n  Arc56Contract,\n  Arc56Method,\n  getABIDecodedValue,\n  getABITupleFromABIStruct,\n  getArc56Method,\n  getArc56ReturnValue,\n} from './app-arc56'\nimport {\n  AppClient,\n  AppClientBareCallParams,\n  AppClientCompilationParams,\n  AppClientMethodCallParams,\n  AppClientParams,\n  AppSourceMaps,\n  ResolveAppClientByCreatorAndName,\n} from './app-client'\nimport {\n  AppDeployParams,\n  DeployAppDeleteMethodCall,\n  DeployAppDeleteParams,\n  DeployAppUpdateMethodCall,\n  DeployAppUpdateParams,\n} from './app-deployer'\nimport { AppSpec } from './app-spec'\nimport { AppCreateMethodCall, AppCreateParams, AppMethodCall, AppMethodCallTransactionArgument, CommonAppCallParams } from './composer'\nimport { Expand } from './expand'\nimport { SendParams } from './transaction'\nimport SourceMap = algosdk.ProgramSourceMap\nimport OnApplicationComplete = algosdk.OnApplicationComplete\nimport ABIValue = algosdk.ABIValue\nimport TransactionSigner = algosdk.TransactionSigner\n\n/** Parameters to create an app client */\nexport interface AppFactoryParams {\n  /** The ARC-56 or ARC-32 application spec as either:\n   *  * Parsed JSON ARC-56 `Contract`\n   *  * Parsed JSON ARC-32 `AppSpec`\n   *  * Raw JSON string (in either ARC-56 or ARC-32 format)\n   */\n  appSpec: Arc56Contract | AppSpec | string\n\n  /** `AlgorandClient` instance */\n  algorand: AlgorandClient\n\n  /**\n   * Optional override for the app name; used for on-chain metadata and lookups.\n   * Defaults to the ARC-32/ARC-56 app spec name.\n   */\n  appName?: string\n\n  /** Optional address to use for the account to use as the default sender for calls. */\n  defaultSender?: Address | string\n\n  /** Optional signer to use as the default signer for default sender calls (if not specified then the signer will be resolved from `AlgorandClient`). */\n  defaultSigner?: TransactionSigner\n\n  /** The version of app that is / will be deployed; defaults to 1.0 */\n  version?: string\n\n  /**\n   * Whether or not the contract should have deploy-time immutability control set, undefined = ignore.\n   * If specified here will get used in calls to `deploy` and `create` calls unless overridden in those calls.\n   *\n   * Useful if you want to vend multiple contracts from the same factory without specifying this value\n   * for each call.\n   */\n  updatable?: boolean\n\n  /**\n   * Whether or not the contract should have deploy-time permanence control set, undefined = ignore.\n   * If specified here will get used in calls to `deploy` and `create` calls unless overridden in those calls.\n   *\n   * Useful if you want to vend multiple contracts from the same factory without specifying this value\n   * for each call.\n   */\n  deletable?: boolean\n\n  /**\n   * Optional deploy-time TEAL template replacement parameters.\n   * If specified here will get used in calls to `deploy` and `create` calls unless overridden in those calls.\n   *\n   * Useful if you want to vend multiple contracts from the same factory without specifying this value\n   * for each call.\n   */\n  deployTimeParams?: TealTemplateParams\n}\n\n/** onComplete parameter for a create app call */\nexport type CreateOnComplete = {\n  onComplete?: Exclude<OnApplicationComplete, OnApplicationComplete.ClearStateOC>\n}\n\n/** Specifies a schema used for creating an app */\nexport type CreateSchema = {\n  /** The state schema for the app. This is immutable once the app is created. By default uses the ARC32/ARC-56 spec. */\n  schema?: {\n    /** The number of integers saved in global state. */\n    globalInts: number\n    /** The number of byte slices saved in global state. */\n    globalByteSlices: number\n    /** The number of integers saved in local state. */\n    localInts: number\n    /** The number of byte slices saved in local state. */\n    localByteSlices: number\n  }\n  /** Number of extra pages required for the programs.\n   * Defaults to the number needed for the programs in this call if not specified.\n   * This is immutable once the app is created. */\n  extraProgramPages?: number\n}\n\n/** Params to specify a bare (raw) create call for an app */\nexport type AppFactoryCreateParams = Expand<AppClientBareCallParams & AppClientCompilationParams & CreateOnComplete & CreateSchema>\n\n/** Params to specify a create method call for an app */\nexport type AppFactoryCreateMethodCallParams = Expand<\n  AppClientMethodCallParams & AppClientCompilationParams & CreateOnComplete & CreateSchema\n>\n\n/** Params to get an app client by ID from an app factory. */\nexport type AppFactoryAppClientParams = Expand<Omit<AppClientParams, 'algorand' | 'appSpec'>>\n\n/** Params to get an app client by creator address and name from an app factory. */\nexport type AppFactoryResolveAppClientByCreatorAndNameParams = Expand<Omit<ResolveAppClientByCreatorAndName, 'algorand' | 'appSpec'>>\n\n/** Parameters to define a deployment for an `AppFactory` */\nexport type AppFactoryDeployParams = Expand<\n  Omit<AppDeployParams, 'createParams' | 'updateParams' | 'deleteParams' | 'metadata'> & {\n    /** Create transaction parameters to use if a create needs to be issued as part of deployment */\n    createParams?:\n      | Expand<AppClientMethodCallParams & CreateOnComplete & CreateSchema>\n      | Expand<AppClientBareCallParams & CreateOnComplete & CreateSchema>\n    /** Update transaction parameters to use if a create needs to be issued as part of deployment */\n    updateParams?: AppClientMethodCallParams | AppClientBareCallParams\n    /** Delete transaction parameters to use if a create needs to be issued as part of deployment */\n    deleteParams?: AppClientMethodCallParams | AppClientBareCallParams\n    /**\n     * Whether or not the contract should have deploy-time immutability control set.\n     * `undefined` = use AppFactory constructor value if set or base it on the app spec.\n     */\n    updatable?: boolean\n    /**\n     * Whether or not the contract should have deploy-time permanence control set.\n     * `undefined` = use AppFactory constructor value if set or base it on the app spec.\n     */\n    deletable?: boolean\n    /** Override the app name for this deployment */\n    appName?: string\n  }\n>\n\n/**\n * ARC-56/ARC-32 app factory that, for a given app spec, allows you to create\n * and deploy one or more app instances and to create one or more app clients\n * to interact with those (or other) app instances.\n */\nexport class AppFactory {\n  private _appSpec: Arc56Contract\n  private _appName: string\n  private _algorand: AlgorandClient\n  private _version: string\n  private _defaultSender?: Address\n  private _defaultSigner?: TransactionSigner\n  private _deployTimeParams?: TealTemplateParams\n  private _updatable?: boolean\n  private _deletable?: boolean\n\n  private _approvalSourceMap: SourceMap | undefined\n  private _clearSourceMap: SourceMap | undefined\n\n  private _paramsMethods: ReturnType<AppFactory['getParamsMethods']>\n\n  /**\n   * Create a new app factory.\n   * @param params The parameters to create the app factory\n   * @returns The `AppFactory` instance\n   * @example\n   * ```typescript\n   * const appFactory = new AppFactory({\n   *   appSpec: appSpec,\n   *   algorand: AlgorandClient.mainNet(),\n   * })\n   */\n  constructor(params: AppFactoryParams) {\n    this._appSpec = AppClient.normaliseAppSpec(params.appSpec)\n    this._appName = params.appName ?? this._appSpec.name\n    this._algorand = params.algorand\n    this._version = params.version ?? '1.0'\n    this._defaultSender = typeof params.defaultSender === 'string' ? Address.fromString(params.defaultSender) : params.defaultSender\n    this._defaultSigner = params.defaultSigner\n    this._deployTimeParams = params.deployTimeParams\n    this._updatable = params.updatable\n    this._deletable = params.deletable\n    this._paramsMethods = this.getParamsMethods()\n  }\n\n  /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */\n  public get appName() {\n    return this._appName\n  }\n\n  /** The ARC-56 app spec being used */\n  get appSpec() {\n    return this._appSpec\n  }\n\n  /** Return the algorand client this factory is using. */\n  get algorand() {\n    return this._algorand\n  }\n\n  /** Get parameters to create transactions (create and deploy related calls) for the current app.\n   *\n   * A good mental model for this is that these parameters represent a deferred transaction creation.\n   * @example Create a transaction in the future using Algorand Client\n   * ```typescript\n   * const createAppParams = appFactory.params.create({method: 'create_method', args: [123, 'hello']})\n   * // ...\n   * await algorand.send.AppCreateMethodCall(createAppParams)\n   * ```\n   * @example Define a nested transaction as an ABI argument\n   * ```typescript\n   * const createAppParams = appFactory.params.create({method: 'create_method', args: [123, 'hello']})\n   * await appClient.send.call({method: 'my_method', args: [createAppParams]})\n   * ```\n   */\n  get params() {\n    return this._paramsMethods\n  }\n\n  /** Create transactions for the current app */\n  readonly createTransaction = {\n    /** Create bare (raw) transactions for the current app */\n    bare: {\n      /**\n       * Create a create app call transaction using a bare (raw) create call.\n       *\n       * Performs deploy-time TEAL template placeholder substitutions (if specified).\n       * @param params The parameters to create the create call transaction\n       * @returns The create call transaction\n       */\n      create: async (params?: AppFactoryCreateParams) => {\n        return this._algorand.createTransaction.appCreate(await this.params.bare.create(params))\n      },\n    },\n\n    /**\n     * Create a create app call transaction using an ABI create call.\n     *\n     * Performs deploy-time TEAL template placeholder substitutions (if specified).\n     * @param params The parameters to create the create call transaction\n     * @returns The create call transaction\n     */\n    create: async (params: AppFactoryCreateMethodCallParams) => {\n      return this._algorand.createTransaction.appCreateMethodCall(await this.params.create(params))\n    },\n  }\n\n  /** Send transactions to the current app */\n  readonly send = {\n    /** Send bare (raw) transactions for the current app */\n    bare: {\n      /**\n       * Creates an instance of the app using a bare (raw) create call and returns the result\n       * of the creation transaction and an app client to interact with that app instance.\n       *\n       * Performs deploy-time TEAL template placeholder substitutions (if specified).\n       * @param params The parameters to create the app\n       * @returns The app client and the result of the creation transaction\n       */\n      create: async (params?: AppFactoryCreateParams & SendParams) => {\n        const updatable = params?.updatable ?? this._updatable\n        const deletable = params?.deletable ?? this._deletable\n        const deployTimeParams = params?.deployTimeParams ?? this._deployTimeParams\n        const compiled = await this.compile({ deployTimeParams, updatable, deletable })\n        const result = await this.handleCallErrors(async () => ({\n          ...(await this._algorand.send.appCreate(await this.params.bare.create({ ...params, updatable, deletable, deployTimeParams }))),\n          return: undefined,\n        }))\n        return {\n          appClient: this.getAppClientById({\n            appId: result.appId,\n          }),\n          result: {\n            ...result,\n            ...(compiled as Partial<AppCompilationResult>),\n          },\n        }\n      },\n    },\n\n    /**\n     * Creates an instance of the app and returns the result of the creation\n     * transaction and an app client to interact with that app instance.\n     *\n     * Performs deploy-time TEAL template placeholder substitutions (if specified).\n     * @param params The parameters to create the app\n     * @returns The app client and the result of the creation transaction\n     */\n    create: async (params: AppFactoryCreateMethodCallParams & SendParams) => {\n      const updatable = params?.updatable ?? this._updatable\n      const deletable = params?.deletable ?? this._deletable\n      const deployTimeParams = params?.deployTimeParams ?? this._deployTimeParams\n      const compiled = await this.compile({ deployTimeParams, updatable, deletable })\n      const result = await this.handleCallErrors(async () =>\n        this.parseMethodCallReturn(\n          this._algorand.send.appCreateMethodCall(await this.params.create({ ...params, updatable, deletable, deployTimeParams })),\n          getArc56Method(params.method, this._appSpec),\n        ),\n      )\n      return {\n        appClient: this.getAppClientById({\n          appId: result.appId,\n        }),\n        result: {\n          ...result,\n          ...(compiled as Partial<AppCompilationResult>),\n        },\n      }\n    },\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   * **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 params The arguments to control the app deployment\n   * @returns The app client and the result of the deployment\n   * @example\n   * ```ts\n   * const { appClient, result } = await factory.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  public async deploy(params: AppFactoryDeployParams) {\n    const updatable = params.updatable ?? this._updatable ?? this.getDeployTimeControl('updatable')\n    const deletable = params.deletable ?? this._deletable ?? this.getDeployTimeControl('deletable')\n    const deployTimeParams = params.deployTimeParams ?? this._deployTimeParams\n\n    // Compile using a appID 0 AppClient so we can register the error handler and use the programs\n    // to identify the app within the error handler (because we can't use app ID 0)\n    const tempAppClient = this.getAppClientById({ appId: 0n })\n    const compiled = await tempAppClient.compile({ deployTimeParams, updatable, deletable })\n\n    const deployResult = await this._algorand.appDeployer.deploy({\n      ...params,\n      createParams: await (params.createParams && 'method' in params.createParams\n        ? this.params.create({ ...params.createParams, updatable, deletable, deployTimeParams })\n        : this.params.bare.create({ ...params.createParams, updatable, deletable, deployTimeParams })),\n      updateParams:\n        params.updateParams && 'method' in params.updateParams\n          ? this.params.deployUpdate(params.updateParams)\n          : this.params.bare.deployUpdate(params.updateParams),\n      deleteParams:\n        params.deleteParams && 'method' in params.deleteParams\n          ? this.params.deployDelete(params.deleteParams)\n          : this.params.bare.deployDelete(params.deleteParams),\n      metadata: {\n        name: params.appName ?? this._appName,\n        version: this._version,\n        updatable,\n        deletable,\n      },\n    })\n    const appClient = this.getAppClientById({\n      appId: deployResult.appId,\n      appName: params.appName,\n    })\n    const result = {\n      ...deployResult,\n      ...(compiled as Partial<AppCompilationResult>),\n    }\n    return {\n      appClient,\n      result: {\n        ...result,\n        return:\n          'return' in result\n            ? result.operationPerformed === 'update'\n              ? params.updateParams && 'method' in params.updateParams\n                ? getArc56ReturnValue(result.return, getArc56Method(params.updateParams.method, this._appSpec), this._appSpec.structs)\n                : undefined\n              : params.createParams && 'method' in params.createParams\n                ? getArc56ReturnValue(result.return, getArc56Method(params.createParams.method, this._appSpec), this._appSpec.structs)\n                : undefined\n            : undefined,\n        deleteReturn:\n          'deleteReturn' in result && params.deleteParams && 'method' in params.deleteParams\n            ? getArc56ReturnValue(result.deleteReturn, getArc56Method(params.deleteParams.method, this._appSpec), this._appSpec.structs)\n            : undefined,\n      },\n    }\n  }\n\n  /**\n   * Returns a new `AppClient` client for an app instance of the given ID.\n   *\n   * Automatically populates appName, defaultSender and source maps from the factory\n   * if not specified in the params.\n   * @param params The parameters to create the app client\n   * @returns The `AppClient` instance\n   * @example\n   * ```typescript\n   * const appClient = factory.getAppClientById({ appId: 12345n })\n   * ```\n   */\n  public getAppClientById(params: AppFactoryAppClientParams) {\n    return new AppClient({\n      ...params,\n      algorand: this._algorand,\n      appSpec: this._appSpec,\n      appName: params.appName ?? this._appName,\n      defaultSender: params.defaultSender ?? this._defaultSender,\n      defaultSigner: params.defaultSigner ?? this._defaultSigner,\n      approvalSourceMap: params.approvalSourceMap ?? this._approvalSourceMap,\n      clearSourceMap: params.clearSourceMap ?? this._clearSourceMap,\n    })\n  }\n\n  /**\n   * Returns a new `AppClient` client, resolving the app by creator address and name\n   * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).\n   *\n   * Automatically populates appName, defaultSender and source maps from the factory\n   * if not specified in the params.\n   * @param params The parameters to create the app client\n   * @returns The `AppClient` instance\n   * @example\n   * ```typescript\n   * const appClient = factory.getAppClientByCreatorAndName({ creatorAddress: 'CREATOR_ADDRESS', appName: 'my_app' })\n   * ```\n   */\n  public getAppClientByCreatorAndName(params: AppFactoryResolveAppClientByCreatorAndNameParams) {\n    return AppClient.fromCreatorAndName({\n      ...params,\n      algorand: this._algorand,\n      appSpec: this._appSpec,\n      appName: params.appName ?? this._appName,\n      defaultSender: params.defaultSender ?? this._defaultSender,\n      approvalSourceMap: params.approvalSourceMap ?? this._approvalSourceMap,\n      clearSourceMap: params.clearSourceMap ?? this._clearSourceMap,\n    })\n  }\n\n  /**\n   * Takes an error that may include a logic error from a call to the current app and re-exposes the\n   * error to include source code information via the source map and ARC-56 spec.\n   * @param e The error to parse\n   * @param isClearStateProgram Whether or not the code was running the clear state program (defaults to approval program)\n   * @returns The new error, or if there was no logic error or source map then the wrapped error with source details\n   */\n  exposeLogicError(e: Error, isClearStateProgram?: boolean): Error {\n    return AppClient.exposeLogicError(e, this._appSpec, {\n      isClearStateProgram,\n      approvalSourceMap: this._approvalSourceMap,\n      clearSourceMap: this._clearSourceMap,\n    })\n  }\n\n  /**\n   * Export the current source maps for the app.\n   * @returns The source maps\n   */\n  exportSourceMaps(): AppSourceMaps {\n    if (!this._approvalSourceMap || !this._clearSourceMap) {\n      throw new Error(\n        \"Unable to export source maps; they haven't been loaded into this client - you need to call create, update, or deploy first\",\n      )\n    }\n\n    return {\n      approvalSourceMap: this._approvalSourceMap,\n      clearSourceMap: this._clearSourceMap,\n    }\n  }\n\n  /**\n   * Import source maps for the app.\n   * @param sourceMaps The source maps to import\n   */\n  importSourceMaps(sourceMaps: AppSourceMaps) {\n    this._approvalSourceMap = new SourceMap(sourceMaps.approvalSourceMap)\n    this._clearSourceMap = new SourceMap(sourceMaps.clearSourceMap)\n  }\n\n  private getDeployTimeControl(control: 'updatable' | 'deletable'): boolean | undefined {\n    const approval = this._appSpec.source?.approval ? Buffer.from(this._appSpec.source.approval, 'base64').toString('utf-8') : undefined\n    // variable not present, so unknown control value\n    if (!approval || !approval.includes(control === 'updatable' ? UPDATABLE_TEMPLATE_NAME : DELETABLE_TEMPLATE_NAME)) return undefined\n\n    // A call is present and configured\n    return (\n      this._appSpec.bareActions.call.includes(control === 'updatable' ? 'UpdateApplication' : 'DeleteApplication') ||\n      Object.values(this._appSpec.methods).some((c) =>\n        c.actions.call.includes(control === 'updatable' ? 'UpdateApplication' : 'DeleteApplication'),\n      )\n    )\n  }\n\n  private getParamsMethods() {\n    return {\n      /** Return params for a create ABI call, including deploy-time TEAL template replacements and compilation if provided */\n      create: async (params: AppFactoryCreateMethodCallParams) => {\n        const compiled = await this.compile({ ...params, deployTimeParams: params.deployTimeParams ?? this._deployTimeParams })\n        return this.getABIParams(\n          {\n            ...params,\n            deployTimeParams: params.deployTimeParams ?? this._deployTimeParams,\n            schema: params.schema ?? {\n              globalByteSlices: this._appSpec.state.schema.global.bytes,\n              globalInts: this._appSpec.state.schema.global.ints,\n              localByteSlices: this._appSpec.state.schema.local.bytes,\n              localInts: this._appSpec.state.schema.local.ints,\n            },\n            approvalProgram: compiled.approvalProgram,\n            clearStateProgram: compiled.clearStateProgram,\n          },\n          params.onComplete ?? OnApplicationComplete.NoOpOC,\n        ) satisfies AppCreateMethodCall\n      },\n      /** Return params for a deployment update ABI call */\n      deployUpdate: (params: AppClientMethodCallParams) => {\n        return this.getABIParams(params, OnApplicationComplete.UpdateApplicationOC) satisfies DeployAppUpdateMethodCall\n      },\n      /** Return params for a deployment delete ABI call */\n      deployDelete: (params: AppClientMethodCallParams) => {\n        return this.getABIParams(params, OnApplicationComplete.DeleteApplicationOC) satisfies DeployAppDeleteMethodCall\n      },\n      bare: {\n        /** Return params for a create bare call, including deploy-time TEAL template replacements and compilation if provided */\n        create: async (params?: AppFactoryCreateParams) => {\n          return this.getBareParams(\n            {\n              ...params,\n              deployTimeParams: params?.deployTimeParams ?? this._deployTimeParams,\n              schema: params?.schema ?? {\n                globalByteSlices: this._appSpec.state.schema.global.bytes,\n                globalInts: this._appSpec.state.schema.global.ints,\n                localByteSlices: this._appSpec.state.schema.local.bytes,\n                localInts: this._appSpec.state.schema.local.ints,\n              },\n              ...(await this.compile({ ...params, deployTimeParams: params?.deployTimeParams ?? this._deployTimeParams })),\n            },\n            params?.onComplete ?? OnApplicationComplete.NoOpOC,\n          ) satisfies AppCreateParams\n        },\n        /** Return params for a deployment update bare call */\n        deployUpdate: (params?: AppClientBareCallParams) => {\n          return this.getBareParams(params, OnApplicationComplete.UpdateApplicationOC) satisfies DeployAppUpdateParams\n        },\n        /** Return params for a deployment delete bare call */\n        deployDelete: (params?: AppClientBareCallParams) => {\n          return this.getBareParams(params, OnApplicationComplete.DeleteApplicationOC) satisfies DeployAppDeleteParams\n        },\n      },\n    }\n  }\n\n  /** Make the given call and catch any errors, augmenting with debugging information before re-throwing. */\n  private async handleCallErrors<TResult>(call: () => Promise<TResult>) {\n    try {\n      return await call()\n    } catch (e) {\n      throw this.exposeLogicError(e as Error)\n    }\n  }\n\n  /**\n   * Compiles the approval and clear state programs (if TEAL templates provided),\n   * performing any provided deploy-time parameter replacement and stores\n   * the source maps.\n   *\n   * If no TEAL templates provided it will use any byte code provided in the app spec.\n   *\n   * Will store any generated source maps for later use in debugging.\n   * @param compilation Optional compilation parameters to use for the compilation\n   * @returns The compilation result\n   * @example\n   * ```typescript\n   * const result = await factory.compile()\n   * ```\n   */\n  public async compile(compilation?: AppClientCompilationParams) {\n    const result = await AppClient.compile(this._appSpec, this._algorand.app, compilation)\n\n    if (result.compiledApproval) {\n      this._approvalSourceMap = result.compiledApproval.sourceMap\n    }\n    if (result.compiledClear) {\n      this._clearSourceMap = result.compiledClear.sourceMap\n    }\n\n    return result\n  }\n\n  private getBareParams<\n    TParams extends { sender?: Address | string; signer?: TransactionSigner | TransactionSignerAccount } | undefined,\n    TOnComplete extends OnApplicationComplete,\n  >(params: TParams, onComplete: TOnComplete) {\n    return {\n      ...params,\n      sender: this.getSender(params?.sender),\n      signer: this.getSigner(params?.sender, params?.signer),\n      onComplete,\n    }\n  }\n\n  private getABIParams<\n    TParams extends {\n      method: string\n      sender?: Address | string\n      signer?: TransactionSigner | TransactionSignerAccount\n      args?: AppClientMethodCallParams['args']\n    },\n    TOnComplete extends OnApplicationComplete,\n  >(params: TParams, onComplete: TOnComplete) {\n    return {\n      ...params,\n      sender: this.getSender(params.sender),\n      signer: this.getSigner(params.sender, params.signer),\n      method: getArc56Method(params.method, this._appSpec),\n      args: this.getCreateABIArgsWithDefaultValues(params.method, params.args),\n      onComplete,\n    }\n  }\n\n  private getCreateABIArgsWithDefaultValues(\n    methodNameOrSignature: string,\n    args: AppClientMethodCallParams['args'] | undefined,\n  ): AppMethodCall<CommonAppCallParams>['args'] {\n    const m = getArc56Method(methodNameOrSignature, this._appSpec)\n    return args?.map((a, i) => {\n      const arg = m.args[i]\n      if (a !== undefined) {\n        // If a struct then convert to tuple for the underlying call\n        return arg.struct && typeof a === 'object' && !Array.isArray(a)\n          ? getABITupleFromABIStruct(a as ABIStruct, this._appSpec.structs[arg.struct], this._appSpec.structs)\n          : (a as ABIValue | AppMethodCallTransactionArgument)\n      }\n      const defaultValue = arg.defaultValue\n      if (defaultValue) {\n        switch (defaultValue.source) {\n          case 'literal':\n            return getABIDecodedValue(Buffer.from(defaultValue.data, 'base64'), m.method.args[i].type, this._appSpec.structs) as ABIValue\n          default:\n            throw new Error(`Can't provide default value for ${defaultValue.source} for a contract creation call`)\n        }\n      }\n      throw new Error(`No value provided for required argument ${arg.name ?? `arg${i + 1}`} in call to method ${m.name}`)\n    })\n  }\n\n  /** Returns the sender for a call, using the `defaultSender`\n   * if none provided and throws an error if neither provided */\n  private getSender(sender: string | Address | undefined): Address {\n    if (!sender && !this._defaultSender) {\n      throw new Error(`No sender provided and no default sender present in app factory for call to app ${this._appName}`)\n    }\n    return typeof sender === 'string' ? Address.fromString(sender) : (sender ?? this._defaultSender!)\n  }\n\n  /** Returns the signer for a call, using the provided signer or the `defaultSigner`\n   * if no signer was provided and the sender resolves to the default sender, the call will use default signer\n   * or `undefined` otherwise (so the signer is resolved from `AlgorandClient`) */\n  private getSigner(\n    sender: Address | string | undefined,\n    signer: TransactionSigner | TransactionSignerAccount | undefined,\n  ): TransactionSigner | TransactionSignerAccount | undefined {\n    return signer ?? (!sender || sender === this._defaultSender ? this._defaultSigner : undefined)\n  }\n\n  /**\n   * Checks for decode errors on the SendAppTransactionResult and maps the return value to the specified type\n   * on the ARC-56 method.\n   *\n   * If the return type is a struct then the struct will be returned.\n   *\n   * @param result The SendAppTransactionResult to be mapped\n   * @param method The method that was called\n   * @returns The smart contract response with an updated return value\n   */\n  async parseMethodCallReturn<\n    TReturn extends Uint8Array | ABIValue | ABIStruct | undefined,\n    TResult extends SendAppTransactionResult = SendAppTransactionResult,\n  >(result: Promise<TResult> | TResult, method: Arc56Method): Promise<Omit<TResult, 'return'> & AppReturn<TReturn>> {\n    const resultValue = await result\n    return { ...resultValue, return: getArc56ReturnValue(resultValue.return, method, this._appSpec.structs) }\n  }\n}\n"],"names":[],"mappings":"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"}