Description
After batch invoice payments, the SDK's internal accounting of sent amounts can drift from on-chain balances due to failed operations, fee deductions, or claimable balance unclaims. A reconciliation engine should compare the SDK's internal PaymentRecord ledger against actual on-chain balances fetched from Horizon and surface any discrepancies as typed reconciliation findings.
Technical Context
Add src/reconciliationEngine.ts. Fetches actual balances via @stellar/stellar-sdk Server.loadAccount(). Reads PaymentRecord[] from src/recorder.ts. Computes expected vs actual balance deltas per asset per account. Adds ReconciliationFinding and ReconciliationReport to src/types.ts. Integrates with src/complianceExporter.ts to include reconciliation findings in compliance exports.
Acceptance Criteria
Description
After batch invoice payments, the SDK's internal accounting of sent amounts can drift from on-chain balances due to failed operations, fee deductions, or claimable balance unclaims. A reconciliation engine should compare the SDK's internal
PaymentRecordledger against actual on-chain balances fetched from Horizon and surface any discrepancies as typed reconciliation findings.Technical Context
Add
src/reconciliationEngine.ts. Fetches actual balances via@stellar/stellar-sdkServer.loadAccount(). ReadsPaymentRecord[]fromsrc/recorder.ts. Computes expected vs actual balance deltas per asset per account. AddsReconciliationFindingandReconciliationReporttosrc/types.ts. Integrates withsrc/complianceExporter.tsto include reconciliation findings in compliance exports.Acceptance Criteria
ReconciliationEngine.reconcile(accountId, assetCode, dateRange): Promise<ReconciliationReport>compares internal records to Horizon for the given date rangeReconciliationReport.findingslists eachReconciliationFindingwith{ expectedDelta, actualDelta, discrepancy, severity: 'info' | 'warning' | 'critical' }severity: 'info'; unexplained discrepancies above a configurable threshold are'critical'ReconciliationReport.isBalancedistrueonly when all findings have zero discrepancy'critical'finding