{"version":3,"sources":["../../../../src/exact/server/scheme.ts"],"sourcesContent":["import type {\n  AssetAmount,\n  Money,\n  MoneyParser,\n  Network,\n  PaymentRequirements,\n  Price,\n  SchemeNetworkServer,\n} from \"@bankofai/x402-core/types\";\nimport { APTOS_ADDRESS_REGEX, USDC_MAINNET_FA, USDC_TESTNET_FA } from \"../../constants\";\n\n/**\n * Aptos server implementation for the Exact payment scheme.\n */\nexport class ExactAptosScheme implements SchemeNetworkServer {\n  readonly scheme = \"exact\";\n  private moneyParsers: MoneyParser[] = [];\n\n  /**\n   * Register a custom money parser in the parser chain.\n   *\n   * @param parser - Custom function to convert amount to AssetAmount (or null to skip)\n   * @returns The service instance for chaining\n   */\n  registerMoneyParser(parser: MoneyParser): ExactAptosScheme {\n    this.moneyParsers.push(parser);\n    return this;\n  }\n\n  /**\n   * Parses a price into an asset amount.\n   *\n   * @param price - The price to parse\n   * @param network - The network to use\n   * @returns Promise that resolves to the parsed asset amount\n   */\n  async parsePrice(price: Price, network: Network): Promise<AssetAmount> {\n    if (typeof price === \"object\" && price !== null && \"amount\" in price) {\n      if (!price.asset) {\n        throw new Error(`Asset address must be specified for AssetAmount on network ${network}`);\n      }\n      if (!APTOS_ADDRESS_REGEX.test(price.asset)) {\n        throw new Error(`Invalid asset address format: ${price.asset}`);\n      }\n      return { amount: price.amount, asset: price.asset, extra: price.extra || {} };\n    }\n\n    const amount = this.parseMoneyToDecimal(price as Money);\n\n    for (const parser of this.moneyParsers) {\n      const result = await parser(amount, network);\n      if (result !== null) {\n        return result;\n      }\n    }\n\n    return this.defaultMoneyConversion(amount, network);\n  }\n\n  /**\n   * Build payment requirements for this scheme/network combination\n   *\n   * @param paymentRequirements - The base payment requirements\n   * @param supportedKind - The supported kind configuration\n   * @param supportedKind.x402Version - The x402 protocol version\n   * @param supportedKind.scheme - The payment scheme\n   * @param supportedKind.network - The network identifier\n   * @param supportedKind.extra - Extra metadata including feePayer address\n   * @param extensionKeys - Extension keys supported by the facilitator\n   * @returns Enhanced payment requirements with feePayer in extra\n   */\n  enhancePaymentRequirements(\n    paymentRequirements: PaymentRequirements,\n    supportedKind: {\n      x402Version: number;\n      scheme: string;\n      network: Network;\n      extra?: Record<string, unknown>;\n    },\n    extensionKeys: string[],\n  ): Promise<PaymentRequirements> {\n    void extensionKeys;\n\n    const extra: Record<string, unknown> = { ...paymentRequirements.extra };\n    if (typeof supportedKind.extra?.feePayer === \"string\") {\n      extra.feePayer = supportedKind.extra.feePayer;\n    }\n\n    return Promise.resolve({ ...paymentRequirements, extra });\n  }\n\n  /**\n   * Parse Money to a decimal number.\n   *\n   * @param money - The money value to parse\n   * @returns Decimal number\n   */\n  private parseMoneyToDecimal(money: string | number): number {\n    if (typeof money === \"number\") {\n      return money;\n    }\n    const cleanMoney = money.replace(/^\\$/, \"\").trim();\n    const amount = parseFloat(cleanMoney);\n    if (isNaN(amount)) {\n      throw new Error(`Invalid money format: ${money}`);\n    }\n    return amount;\n  }\n\n  /**\n   * Default money conversion to USDC.\n   *\n   * @param amount - The decimal amount\n   * @param network - The network to use\n   * @returns The parsed asset amount in USDC\n   */\n  private defaultMoneyConversion(amount: number, network: Network): AssetAmount {\n    const decimals = 6;\n    const tokenAmount = this.convertToTokenAmount(amount.toString(), decimals);\n    const asset = network === \"aptos:2\" ? USDC_TESTNET_FA : USDC_MAINNET_FA;\n    return { amount: tokenAmount, asset, extra: {} };\n  }\n\n  /**\n   * Convert a decimal amount string to a token amount string.\n   *\n   * @param amount - The decimal amount\n   * @param decimals - Number of decimals for the token\n   * @returns The amount in atomic units as a string\n   */\n  private convertToTokenAmount(amount: string, decimals: number): string {\n    const parts = amount.split(\".\");\n    const wholePart = parts[0] || \"0\";\n    const fractionalPart = (parts[1] || \"\").padEnd(decimals, \"0\").slice(0, decimals);\n    return BigInt(wholePart + fractionalPart).toString();\n  }\n}\n"],"mappings":";;;;;;;AAcO,IAAM,mBAAN,MAAsD;AAAA,EAAtD;AACL,SAAS,SAAS;AAClB,SAAQ,eAA8B,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQvC,oBAAoB,QAAuC;AACzD,SAAK,aAAa,KAAK,MAAM;AAC7B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,WAAW,OAAc,SAAwC;AACrE,QAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,YAAY,OAAO;AACpE,UAAI,CAAC,MAAM,OAAO;AAChB,cAAM,IAAI,MAAM,8DAA8D,OAAO,EAAE;AAAA,MACzF;AACA,UAAI,CAAC,oBAAoB,KAAK,MAAM,KAAK,GAAG;AAC1C,cAAM,IAAI,MAAM,iCAAiC,MAAM,KAAK,EAAE;AAAA,MAChE;AACA,aAAO,EAAE,QAAQ,MAAM,QAAQ,OAAO,MAAM,OAAO,OAAO,MAAM,SAAS,CAAC,EAAE;AAAA,IAC9E;AAEA,UAAM,SAAS,KAAK,oBAAoB,KAAc;AAEtD,eAAW,UAAU,KAAK,cAAc;AACtC,YAAM,SAAS,MAAM,OAAO,QAAQ,OAAO;AAC3C,UAAI,WAAW,MAAM;AACnB,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO,KAAK,uBAAuB,QAAQ,OAAO;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,2BACE,qBACA,eAMA,eAC8B;AAC9B,SAAK;AAEL,UAAM,QAAiC,EAAE,GAAG,oBAAoB,MAAM;AACtE,QAAI,OAAO,cAAc,OAAO,aAAa,UAAU;AACrD,YAAM,WAAW,cAAc,MAAM;AAAA,IACvC;AAEA,WAAO,QAAQ,QAAQ,EAAE,GAAG,qBAAqB,MAAM,CAAC;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,oBAAoB,OAAgC;AAC1D,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO;AAAA,IACT;AACA,UAAM,aAAa,MAAM,QAAQ,OAAO,EAAE,EAAE,KAAK;AACjD,UAAM,SAAS,WAAW,UAAU;AACpC,QAAI,MAAM,MAAM,GAAG;AACjB,YAAM,IAAI,MAAM,yBAAyB,KAAK,EAAE;AAAA,IAClD;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,uBAAuB,QAAgB,SAA+B;AAC5E,UAAM,WAAW;AACjB,UAAM,cAAc,KAAK,qBAAqB,OAAO,SAAS,GAAG,QAAQ;AACzE,UAAM,QAAQ,YAAY,YAAY,kBAAkB;AACxD,WAAO,EAAE,QAAQ,aAAa,OAAO,OAAO,CAAC,EAAE;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,qBAAqB,QAAgB,UAA0B;AACrE,UAAM,QAAQ,OAAO,MAAM,GAAG;AAC9B,UAAM,YAAY,MAAM,CAAC,KAAK;AAC9B,UAAM,kBAAkB,MAAM,CAAC,KAAK,IAAI,OAAO,UAAU,GAAG,EAAE,MAAM,GAAG,QAAQ;AAC/E,WAAO,OAAO,YAAY,cAAc,EAAE,SAAS;AAAA,EACrD;AACF;","names":[]}