diff options
Diffstat (limited to 'src/ark')
| -rw-r--r-- | src/ark/manager.js | 5 | ||||
| -rw-r--r-- | src/ark/proto.js | 3 |
2 files changed, 8 insertions, 0 deletions
diff --git a/src/ark/manager.js b/src/ark/manager.js index 01de06f..f9819a0 100644 --- a/src/ark/manager.js +++ b/src/ark/manager.js @@ -1270,6 +1270,11 @@ export class ArkManager { const tip = await this.chain.tipHeight(); const totalSat = inputs.reduce((n, v) => n + v.amountSat, 0); const feeSat = this.refreshFee(inputs, tip); + // The server refuses round outputs under P2TR dust (330), so a wallet + // this small can't renew — fail before the action marks coins pending. + if (totalSat - feeSat < 330) { + throw new Error(`balance too small to refresh: ${totalSat} sat minus ${feeSat} sat fee is under the 330 sat minimum`); + } const action = { id: `refresh-${Date.now()}`, type: 'refresh', step: 'created', inputIds: inputs.map((v) => v.id), diff --git a/src/ark/proto.js b/src/ark/proto.js index 6729465..81651ee 100644 --- a/src/ark/proto.js +++ b/src/ark/proto.js @@ -29,6 +29,9 @@ export function pbWriter() { const chunks = []; const varint = (n) => { n = BigInt(n); + // a negative sign-extends under >>= forever — the do/while would push + // bytes until the process dies of memory, so refuse it loudly instead + if (n < 0n) throw new Error(`varint: negative value ${n}`); const bs = []; do { let b = Number(n & 0x7fn); n >>= 7n; if (n) b |= 0x80; bs.push(b); } while (n); chunks.push(Uint8Array.from(bs)); |
