{"version":3,"sources":["../../../../src/upto/server/scheme.ts"],"sourcesContent":["import {\n  AssetAmount,\n  Network,\n  PaymentRequirements,\n  Price,\n  SchemeNetworkServer,\n  MoneyParser,\n} from \"@x402/core/types\";\nimport { convertToTokenAmount, numberToDecimalString, parseMoneyString } from \"@x402/core/utils\";\nimport { getAddress } from \"viem\";\nimport { getDefaultAsset } from \"../../shared/defaultAssets\";\n\n/**\n * EVM server implementation for the Upto payment scheme.\n * Handles price parsing, payment requirements enhancement, and default asset resolution.\n */\nexport class UptoEvmScheme implements SchemeNetworkServer {\n  readonly scheme = \"upto\";\n  private moneyParsers: MoneyParser[] = [];\n\n  /**\n   * Registers a custom money parser for converting prices to asset amounts.\n   *\n   * @param parser - The money parser function to register\n   * @returns This instance for chaining\n   */\n  registerMoneyParser(parser: MoneyParser): UptoEvmScheme {\n    this.moneyParsers.push(parser);\n    return this;\n  }\n\n  /**\n   * Returns the decimal precision of the default stablecoin for the given network.\n   * Implements the optional AssetDecimalsProvider interface used by resolveSettlementOverrideAmount.\n   *\n   * @param _asset - The asset symbol (unused; defaults to the network's default stablecoin)\n   * @param network - The network to look up the default asset for\n   * @returns The number of decimal places for the asset\n   */\n  getAssetDecimals(_asset: string, network: Network): number {\n    try {\n      return getDefaultAsset(network).decimals;\n    } catch {\n      return 6;\n    }\n  }\n\n  /**\n   * Parses a price into an asset amount for the given network.\n   *\n   * @param price - The price to parse (string, number, or AssetAmount)\n   * @param network - The target network\n   * @returns Promise resolving to an 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      return {\n        amount: price.amount,\n        asset: price.asset,\n        extra: price.extra || {},\n      };\n    }\n\n    const amount = this.parseMoneyToDecimal(price);\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   * Enhances payment requirements with upto-specific metadata.\n   *\n   * @param paymentRequirements - The base payment requirements\n   * @param supportedKind - The supported scheme/network kind\n   * @param supportedKind.x402Version - The x402 protocol version\n   * @param supportedKind.scheme - The payment scheme name\n   * @param supportedKind.network - The target network\n   * @param supportedKind.extra - Optional extra metadata\n   * @param extensionKeys - Extension keys to include\n   * @returns Promise resolving to enhanced payment requirements\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    return Promise.resolve({\n      ...paymentRequirements,\n      extra: {\n        ...paymentRequirements.extra,\n        assetTransferMethod: \"permit2\",\n        ...(supportedKind.extra?.facilitatorAddress\n          ? { facilitatorAddress: getAddress(supportedKind.extra.facilitatorAddress as string) }\n          : {}),\n      },\n    });\n  }\n\n  /**\n   * Parses a money string or number into a decimal value.\n   *\n   * @param money - The money value to parse\n   * @returns The parsed decimal amount\n   */\n  private parseMoneyToDecimal(money: string | number): number {\n    if (typeof money === \"number\") {\n      return money;\n    }\n\n    return parseMoneyString(money);\n  }\n\n  /**\n   * Converts a numeric dollar amount to an AssetAmount using the default token for the network.\n   *\n   * @param amount - The dollar amount as a number\n   * @param network - The target network\n   * @returns The converted asset amount with token metadata\n   */\n  private defaultMoneyConversion(amount: number, network: Network): AssetAmount {\n    const assetInfo = getDefaultAsset(network);\n    const tokenAmount = convertToTokenAmount(numberToDecimalString(amount), assetInfo.decimals);\n\n    return {\n      amount: tokenAmount,\n      asset: assetInfo.address,\n      extra: {\n        name: assetInfo.name,\n        version: assetInfo.version,\n        assetTransferMethod: \"permit2\",\n      },\n    };\n  }\n}\n"],"mappings":";;;;;AAQA,SAAS,sBAAsB,uBAAuB,wBAAwB;AAC9E,SAAS,kBAAkB;AAOpB,IAAM,gBAAN,MAAmD;AAAA,EAAnD;AACL,SAAS,SAAS;AAClB,SAAQ,eAA8B,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQvC,oBAAoB,QAAoC;AACtD,SAAK,aAAa,KAAK,MAAM;AAC7B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,iBAAiB,QAAgB,SAA0B;AACzD,QAAI;AACF,aAAO,gBAAgB,OAAO,EAAE;AAAA,IAClC,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;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,aAAO;AAAA,QACL,QAAQ,MAAM;AAAA,QACd,OAAO,MAAM;AAAA,QACb,OAAO,MAAM,SAAS,CAAC;AAAA,MACzB;AAAA,IACF;AAEA,UAAM,SAAS,KAAK,oBAAoB,KAAK;AAE7C,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;AACL,WAAO,QAAQ,QAAQ;AAAA,MACrB,GAAG;AAAA,MACH,OAAO;AAAA,QACL,GAAG,oBAAoB;AAAA,QACvB,qBAAqB;AAAA,QACrB,GAAI,cAAc,OAAO,qBACrB,EAAE,oBAAoB,WAAW,cAAc,MAAM,kBAA4B,EAAE,IACnF,CAAC;AAAA,MACP;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,oBAAoB,OAAgC;AAC1D,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO;AAAA,IACT;AAEA,WAAO,iBAAiB,KAAK;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,uBAAuB,QAAgB,SAA+B;AAC5E,UAAM,YAAY,gBAAgB,OAAO;AACzC,UAAM,cAAc,qBAAqB,sBAAsB,MAAM,GAAG,UAAU,QAAQ;AAE1F,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO,UAAU;AAAA,MACjB,OAAO;AAAA,QACL,MAAM,UAAU;AAAA,QAChB,SAAS,UAAU;AAAA,QACnB,qBAAqB;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AACF;","names":[]}