summaryrefslogtreecommitdiffstats
path: root/src/ark
diff options
context:
space:
mode:
Diffstat (limited to 'src/ark')
-rw-r--r--src/ark/manager.js5
-rw-r--r--src/ark/proto.js3
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));