{"version":3,"sources":["../../src/shared/settleReceipt.ts"],"sourcesContent":["import { Network, SettleResponse } from \"@bankofai/x402-core/types\";\nimport { invalidBroadcastHashResponse, isValidTxHash, truncateErrorMessage } from \"../utils\";\nimport { ErrInvalidTransactionState, ErrSettlementPending } from \"../exact/facilitator/errors\";\nimport { FacilitatorEvmSigner } from \"../signer\";\n\ntype SettleReceipt = Awaited<ReturnType<FacilitatorEvmSigner[\"waitForTransactionReceipt\"]>>;\n\n/**\n * Optional behavior for {@link waitAndReturnSettleResponse}.\n */\nexport interface WaitForSettleReceiptOptions {\n  /**\n   * Error reason for terminal failures: an invalid broadcast hash or reverted receipt.\n   * Receipt-wait failures always report `ErrSettlementPending` regardless of this value.\n   * Defaults to `ErrInvalidTransactionState`.\n   */\n  failedStatusReason?: string;\n  /**\n   * Optional check after a successful receipt (e.g. Transfer event). Return a SettleResponse\n   * to fail settlement; return undefined to accept success.\n   */\n  validateReceipt?: (receipt: SettleReceipt) => SettleResponse | undefined;\n  /** Settled amount attached on success when `onSuccess` is omitted. */\n  amount?: string;\n  /** Builds the success response from the receipt when set. */\n  onSuccess?: (receipt: SettleReceipt) => SettleResponse | Promise<SettleResponse>;\n}\n\n/**\n * Waits for a transaction receipt and returns the appropriate SettleResponse.\n *\n * @param signer - Signer with waitForTransactionReceipt capability\n * @param tx - The transaction hash to wait for\n * @param network - Network the transaction was broadcast to\n * @param payer - The payer address\n * @param options - Optional receipt-wait behavior; see {@link WaitForSettleReceiptOptions}\n * @returns Promise resolving to a settlement response indicating success or failure\n */\nexport async function waitAndReturnSettleResponse(\n  signer: Pick<FacilitatorEvmSigner, \"waitForTransactionReceipt\">,\n  tx: `0x${string}`,\n  network: Network,\n  payer: string | undefined,\n  options: WaitForSettleReceiptOptions = {},\n): Promise<SettleResponse> {\n  const {\n    failedStatusReason = ErrInvalidTransactionState,\n    validateReceipt,\n    amount,\n    onSuccess,\n  } = options;\n\n  if (!isValidTxHash(tx)) {\n    return invalidBroadcastHashResponse(tx, failedStatusReason, network, payer);\n  }\n\n  let receipt;\n  try {\n    receipt = await signer.waitForTransactionReceipt({ hash: tx });\n  } catch (error) {\n    return settlementPendingResponse(tx, network, payer, error);\n  }\n\n  try {\n    if (receipt.status !== \"success\") {\n      return {\n        success: false,\n        errorReason: failedStatusReason,\n        transaction: tx,\n        network,\n        payer,\n      };\n    }\n\n    const validationFailure = validateReceipt?.(receipt);\n    if (validationFailure) {\n      return validationFailure;\n    }\n\n    if (onSuccess) {\n      return await onSuccess(receipt);\n    }\n\n    return {\n      success: true,\n      transaction: tx,\n      network,\n      payer,\n      ...(amount !== undefined ? { amount } : {}),\n    };\n  } catch (error) {\n    // Processing a confirmed receipt threw, leaving the transaction onchain with an unknown\n    // effect. A reverted receipt and an explicit validation failure return above and stay\n    // terminal; this does not.\n    return settlementPendingResponse(tx, network, payer, error);\n  }\n}\n\n/**\n * Builds the non-terminal failure for a broadcast whose effect could not be established,\n * preserving the hash for the caller to reconcile against.\n *\n * @param tx - The broadcast transaction hash\n * @param network - Network the transaction was broadcast to\n * @param payer - The payer address\n * @param error - The receipt-wait or receipt-processing error\n * @returns Failed settle response with reason `settlement_pending`\n */\nfunction settlementPendingResponse(\n  tx: `0x${string}`,\n  network: Network,\n  payer: string | undefined,\n  error: unknown,\n): SettleResponse {\n  return {\n    success: false,\n    errorReason: ErrSettlementPending,\n    errorMessage: truncateErrorMessage(error instanceof Error ? error.message : String(error)),\n    transaction: tx,\n    network,\n    payer,\n  };\n}\n"],"mappings":";;;;;;;;;;;AAsCA,eAAsB,4BACpB,QACA,IACA,SACA,OACA,UAAuC,CAAC,GACf;AACzB,QAAM;AAAA,IACJ,qBAAqB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,MAAI,CAAC,cAAc,EAAE,GAAG;AACtB,WAAO,6BAA6B,IAAI,oBAAoB,SAAS,KAAK;AAAA,EAC5E;AAEA,MAAI;AACJ,MAAI;AACF,cAAU,MAAM,OAAO,0BAA0B,EAAE,MAAM,GAAG,CAAC;AAAA,EAC/D,SAAS,OAAO;AACd,WAAO,0BAA0B,IAAI,SAAS,OAAO,KAAK;AAAA,EAC5D;AAEA,MAAI;AACF,QAAI,QAAQ,WAAW,WAAW;AAChC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,aAAa;AAAA,QACb,aAAa;AAAA,QACb;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,oBAAoB,kBAAkB,OAAO;AACnD,QAAI,mBAAmB;AACrB,aAAO;AAAA,IACT;AAEA,QAAI,WAAW;AACb,aAAO,MAAM,UAAU,OAAO;AAAA,IAChC;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA,GAAI,WAAW,SAAY,EAAE,OAAO,IAAI,CAAC;AAAA,IAC3C;AAAA,EACF,SAAS,OAAO;AAId,WAAO,0BAA0B,IAAI,SAAS,OAAO,KAAK;AAAA,EAC5D;AACF;AAYA,SAAS,0BACP,IACA,SACA,OACA,OACgB;AAChB,SAAO;AAAA,IACL,SAAS;AAAA,IACT,aAAa;AAAA,IACb,cAAc,qBAAqB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IACzF,aAAa;AAAA,IACb;AAAA,IACA;AAAA,EACF;AACF;","names":[]}