mirror of
https://github.com/minibits-cash/minibits_wallet.git
synced 2026-10-05 19:28:26 +00:00
Relocate per-transaction melt recovery data (the serialized meltPreview) from the MST MintProofsCounter (debounced MMKV) to a dedicated SQLite table, so it can be written synchronously and read with no MST loaded. Why: meltPreview is recovery-critical — it unblinds the change of a paid- but-unconfirmed melt. It was persisted only via the batched whole-tree MMKV snapshot, so a crash right after the payment was submitted could lose it and the change ecash. It's also a prerequisite for off-MST background melt (NWC pay_invoice). - schema/migration v28: new melt_recovery table (txId PK, mintUrl, keysetId, meltPreview JSON); added to cleanAll. - meltRecoveryRepo: add (ON CONFLICT DO NOTHING — first preview wins, matching the old "already tracked" guard) / get / remove / seed. - WalletStore: write the preview synchronously via Database.addMeltRecovery BEFORE completeMelt; remove on terminal success/failure. - meltOperations / transferOperationApi: read/remove via Database instead of the counter model; drop the now-needless counter fetch in those blocks. - Mint model: remove meltCounterValues map, MeltCounterValueModel, the melt actions/views, the dead counterAtMelt field, and serializeMeltPreview (moved to cashuUtils). migrateSnapshot now STRIPS meltCounterValues from old snapshots so applySnapshot tolerates the removed field. - one-time seed (rootStoreModelVersion 33->34): _runMigrations reads the RAW pre-upgrade snapshot (the model no longer holds it) and copies any in-flight meltPreview into SQLite. Idempotent. - tests: __tests__/meltRecovery.test.ts (JSON round-trip, first-wins, remove, isolation, idempotent seed). Full suite green (14 suites / 157 tests). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>