{"version":3,"sources":["../../../../src/exact/facilitator/scheme.ts"],"sourcesContent":["import { AccountAddress, Deserializer, Ed25519PublicKey, PublicKey } from \"@aptos-labs/ts-sdk\";\nimport type {\n  PaymentPayload,\n  PaymentRequirements,\n  SchemeNetworkFacilitator,\n  SettleResponse,\n  VerifyResponse,\n} from \"@bankofai/x402-core/types\";\nimport type { FacilitatorAptosSigner } from \"../../signer\";\nimport type { ExactAptosPayload } from \"../../types\";\nimport { createAptosClient, deserializeAptosPayment } from \"../../utils\";\nimport { getAptosChainId, MAX_GAS_AMOUNT } from \"../../constants\";\n\n/**\n * Aptos facilitator implementation for the Exact payment scheme.\n */\nexport class ExactAptosScheme implements SchemeNetworkFacilitator {\n  readonly scheme = \"exact\";\n  readonly caipFamily = \"aptos:*\";\n\n  /**\n   * Creates a new ExactAptosFacilitator instance.\n   *\n   * @param signer - The Aptos facilitator signer for transaction submission\n   * @param sponsorTransactions - Whether to sponsor transactions (pay gas fees). Defaults to true.\n   */\n  constructor(\n    private readonly signer: FacilitatorAptosSigner,\n    private readonly sponsorTransactions: boolean = true,\n  ) {}\n\n  /**\n   * Get mechanism-specific extra data for the supported kinds endpoint.\n   *\n   * @param _ - The network identifier (unused)\n   * @returns Extra data with fee payer address, or undefined if sponsorship is disabled\n   */\n  getExtra(_: string): Record<string, unknown> | undefined {\n    if (!this.sponsorTransactions) {\n      return undefined;\n    }\n    const addresses = this.signer.getAddresses();\n    const randomIndex = Math.floor(Math.random() * addresses.length);\n    return { feePayer: addresses[randomIndex] };\n  }\n\n  /**\n   * Get signer addresses used by this facilitator.\n   *\n   * @param _ - The network identifier (unused)\n   * @returns Array of fee payer addresses\n   */\n  getSigners(_: string): string[] {\n    return [...this.signer.getAddresses()];\n  }\n\n  /**\n   * Verifies a payment payload.\n   *\n   * @param payload - The payment payload to verify\n   * @param requirements - The payment requirements\n   * @returns Promise resolving to verification response\n   */\n  async verify(\n    payload: PaymentPayload,\n    requirements: PaymentRequirements,\n  ): Promise<VerifyResponse> {\n    try {\n      const aptosPayload = payload.payload as ExactAptosPayload;\n      const signerAddresses = this.signer.getAddresses();\n      const isSponsored = typeof requirements.extra?.feePayer === \"string\";\n\n      // Step 2: Verify x402Version is 2\n      if (payload.x402Version !== 2) {\n        return {\n          isValid: false,\n          invalidReason: \"invalid_exact_aptos_payload_unsupported_version\",\n          payer: \"\",\n        };\n      }\n\n      // Step 3: Verify the network matches\n      if (payload.accepted.scheme !== \"exact\" || requirements.scheme !== \"exact\") {\n        return { isValid: false, invalidReason: \"unsupported_scheme\", payer: \"\" };\n      }\n\n      if (payload.accepted.network !== requirements.network) {\n        return { isValid: false, invalidReason: \"network_mismatch\", payer: \"\" };\n      }\n\n      // If sponsored, verify the fee payer is managed by this facilitator\n      if (isSponsored && !signerAddresses.includes(requirements.extra.feePayer as string)) {\n        return { isValid: false, invalidReason: \"fee_payer_not_managed_by_facilitator\", payer: \"\" };\n      }\n\n      // Step 4: Deserialize the BCS-encoded transaction and verify the signature\n      const { transaction, senderAuthenticator, entryFunction } = deserializeAptosPayment(\n        aptosPayload.transaction,\n      );\n      const senderAddress = transaction.rawTransaction.sender.toString();\n\n      // Verify chain ID matches expected network\n      const expectedChainId = getAptosChainId(requirements.network);\n      const txChainId = Number(transaction.rawTransaction.chain_id.chainId);\n      if (txChainId !== expectedChainId) {\n        return {\n          isValid: false,\n          invalidReason: `invalid_exact_aptos_payload_chain_id_mismatch: expected ${expectedChainId}, got ${txChainId}`,\n          payer: senderAddress,\n        };\n      }\n\n      // Verify sender matches authenticator public key (for Ed25519 accounts)\n      // Note: SingleKey and MultiKey authenticators are validated during simulation (step 11)\n      if (senderAuthenticator.isEd25519()) {\n        const pubKey = senderAuthenticator.public_key as Ed25519PublicKey;\n        const derivedAddress = AccountAddress.from(pubKey.authKey().derivedAddress());\n        if (!derivedAddress.equals(transaction.rawTransaction.sender)) {\n          return {\n            isValid: false,\n            invalidReason: \"invalid_exact_aptos_payload_sender_authenticator_mismatch\",\n            payer: senderAddress,\n          };\n        }\n      }\n\n      // For sponsored transactions, verify max gas to prevent gas draining\n      if (isSponsored) {\n        const maxGasAmount = BigInt(transaction.rawTransaction.max_gas_amount);\n        if (maxGasAmount > MAX_GAS_AMOUNT) {\n          return {\n            isValid: false,\n            invalidReason: `invalid_exact_aptos_payload_gas_too_high: ${maxGasAmount} > ${MAX_GAS_AMOUNT}`,\n            payer: senderAddress,\n          };\n        }\n      }\n\n      // For sponsored transactions, verify fee payer address matches\n      if (isSponsored) {\n        const expectedFeePayer = AccountAddress.from(requirements.extra.feePayer as string);\n        if (!transaction.feePayerAddress || !expectedFeePayer.equals(transaction.feePayerAddress)) {\n          return {\n            isValid: false,\n            invalidReason: \"invalid_exact_aptos_payload_fee_payer_mismatch\",\n            payer: senderAddress,\n          };\n        }\n      }\n\n      // SECURITY (reference implementation): Prevent facilitator from signing away their own tokens\n      if (isSponsored && signerAddresses.includes(senderAddress)) {\n        return {\n          isValid: false,\n          invalidReason: \"invalid_exact_aptos_payload_fee_payer_transferring_funds\",\n          payer: senderAddress,\n        };\n      }\n\n      // Step 5: Verify the transaction has not expired\n      const EXPIRATION_BUFFER_SECONDS = 5;\n      const expirationTimestamp = Number(transaction.rawTransaction.expiration_timestamp_secs);\n      if (expirationTimestamp < Math.floor(Date.now() / 1000) + EXPIRATION_BUFFER_SECONDS) {\n        return {\n          isValid: false,\n          invalidReason: \"invalid_exact_aptos_payload_transaction_expired\",\n          payer: senderAddress,\n        };\n      }\n\n      // Step 6: Verify the transaction contains a fungible asset transfer operation\n      // We accept both primary_fungible_store::transfer and fungible_asset::transfer:\n      // - primary_fungible_store::transfer operates on primary stores (the default store for each asset)\n      //   and automatically creates the recipient's store if it doesn't exist\n      // - fungible_asset::transfer is a lower-level function for arbitrary store-to-store transfers\n      //   and is more gas efficient when stores already exist\n      if (!entryFunction) {\n        return {\n          isValid: false,\n          invalidReason: \"invalid_exact_aptos_payload_missing_entry_function\",\n          payer: senderAddress,\n        };\n      }\n\n      const moduleAddress = entryFunction.module_name.address;\n      const moduleName = entryFunction.module_name.name.identifier;\n      const functionName = entryFunction.function_name.identifier;\n\n      const isPrimaryFungibleStore =\n        AccountAddress.ONE.equals(moduleAddress) &&\n        moduleName === \"primary_fungible_store\" &&\n        functionName === \"transfer\";\n\n      const isFungibleAsset =\n        AccountAddress.ONE.equals(moduleAddress) &&\n        moduleName === \"fungible_asset\" &&\n        functionName === \"transfer\";\n\n      if (!isPrimaryFungibleStore && !isFungibleAsset) {\n        return {\n          isValid: false,\n          invalidReason: \"invalid_exact_aptos_payload_wrong_function\",\n          payer: senderAddress,\n        };\n      }\n\n      if (entryFunction.type_args.length !== 1) {\n        return {\n          isValid: false,\n          invalidReason: \"invalid_exact_aptos_payload_wrong_type_args\",\n          payer: senderAddress,\n        };\n      }\n\n      const args = entryFunction.args;\n      if (args.length !== 3) {\n        return {\n          isValid: false,\n          invalidReason: \"invalid_exact_aptos_payload_wrong_args\",\n          payer: senderAddress,\n        };\n      }\n\n      const [faAddressArg, recipientAddressArg, amountArg] = args;\n\n      // Step 7: Verify the transfer is for the correct asset\n      const faAddress = AccountAddress.from(faAddressArg.bcsToBytes());\n      if (!faAddress.equals(AccountAddress.from(requirements.asset))) {\n        return {\n          isValid: false,\n          invalidReason: \"invalid_exact_aptos_payload_asset_mismatch\",\n          payer: senderAddress,\n        };\n      }\n\n      // Step 8: Verify the transfer amount matches\n      const amount = new Deserializer(amountArg.bcsToBytes()).deserializeU64().toString(10);\n      if (amount !== requirements.amount) {\n        return {\n          isValid: false,\n          invalidReason: \"invalid_exact_aptos_payload_amount_mismatch\",\n          payer: senderAddress,\n        };\n      }\n\n      // Step 9: Verify the transfer recipient matches\n      const recipientAddress = AccountAddress.from(recipientAddressArg.bcsToBytes());\n      if (!recipientAddress.equals(AccountAddress.from(requirements.payTo))) {\n        return {\n          isValid: false,\n          invalidReason: \"invalid_exact_aptos_payload_recipient_mismatch\",\n          payer: senderAddress,\n        };\n      }\n\n      // Step 10: Verify the sender has sufficient balance\n      const aptos = createAptosClient(requirements.network);\n      const balance = await aptos.getCurrentFungibleAssetBalances({\n        options: {\n          where: {\n            owner_address: { _eq: senderAddress },\n            asset_type: { _eq: requirements.asset },\n          },\n        },\n      });\n      const currentBalance = BigInt(balance[0]?.amount ?? 0);\n      if (currentBalance < BigInt(requirements.amount)) {\n        return {\n          isValid: false,\n          invalidReason: \"invalid_exact_aptos_payload_insufficient_balance\",\n          payer: senderAddress,\n        };\n      }\n\n      // Step 11: Simulate the transaction\n      let publicKey: PublicKey | undefined;\n      if (senderAuthenticator.isEd25519()) {\n        publicKey = senderAuthenticator.public_key;\n      } else if (senderAuthenticator.isSingleKey()) {\n        publicKey = senderAuthenticator.public_key;\n      } else if (senderAuthenticator.isMultiKey()) {\n        publicKey = senderAuthenticator.public_keys;\n      }\n\n      const simulationResult = (\n        await aptos.transaction.simulate.simple({ signerPublicKey: publicKey, transaction })\n      )[0];\n\n      if (!simulationResult.success) {\n        return {\n          isValid: false,\n          invalidReason: `invalid_exact_aptos_payload_simulation_failed: ${simulationResult.vm_status}`,\n          payer: senderAddress,\n        };\n      }\n\n      return { isValid: true, invalidReason: undefined, payer: senderAddress };\n    } catch (error) {\n      const errorMessage = error instanceof Error ? error.message : String(error);\n      return {\n        isValid: false,\n        invalidReason: `invalid_exact_aptos_payload_verification_error: ${errorMessage}`,\n        payer: \"\",\n      };\n    }\n  }\n\n  /**\n   * Settles a payment by submitting the transaction.\n   *\n   * @param payload - The payment payload to settle\n   * @param requirements - The payment requirements\n   * @returns Promise resolving to settlement response\n   */\n  async settle(\n    payload: PaymentPayload,\n    requirements: PaymentRequirements,\n  ): Promise<SettleResponse> {\n    const aptosPayload = payload.payload as ExactAptosPayload;\n\n    const valid = await this.verify(payload, requirements);\n    if (!valid.isValid) {\n      return {\n        success: false,\n        network: payload.accepted.network,\n        transaction: \"\",\n        errorReason: valid.invalidReason ?? \"verification_failed\",\n        payer: valid.payer || \"\",\n      };\n    }\n\n    try {\n      const { transaction, senderAuthenticator } = deserializeAptosPayment(\n        aptosPayload.transaction,\n      );\n      const senderAddress = transaction.rawTransaction.sender.toStringLong();\n      const isSponsored = typeof requirements.extra?.feePayer === \"string\";\n\n      const pendingTxn = isSponsored\n        ? await this.signer.signAndSubmitAsFeePayer(\n            transaction,\n            senderAuthenticator,\n            requirements.network,\n          )\n        : await this.signer.submitTransaction(\n            transaction,\n            senderAuthenticator,\n            requirements.network,\n          );\n\n      await this.signer.waitForTransaction(pendingTxn.hash, requirements.network);\n\n      return {\n        success: true,\n        transaction: pendingTxn.hash,\n        network: payload.accepted.network,\n        payer: senderAddress,\n      };\n    } catch (error) {\n      const errorMessage = error instanceof Error ? error.message : String(error);\n      return {\n        success: false,\n        errorReason: `transaction_failed: ${errorMessage}`,\n        transaction: \"\",\n        network: payload.accepted.network,\n        payer: valid.payer || \"\",\n      };\n    }\n  }\n}\n"],"mappings":"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","names":[]}