aboutsummaryrefslogtreecommitdiffstats
path: root/src/ark/manager.js
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2026-08-05 12:24:03 -0700
committerAdam Soltys <[email protected]>2026-08-05 12:24:03 -0700
commit68fd614f8cb404904e1939ab711f7c7ba4350c32 (patch)
tree861637d85964802e37211d98d536d35d796ca1bd /src/ark/manager.js
parent1307f8930283393fcf987cfa7e5cfa054676396a (diff)
downloadcoinosv3-68fd614f8cb404904e1939ab711f7c7ba4350c32.tar.gz
coinosv3-68fd614f8cb404904e1939ab711f7c7ba4350c32.zip
hal speaks pver 5: preimages prove their size, and fees round up as one
0.6.0 servers require the new hashlock clauses (OP_SIZE 32 guard) for Lightning and rounds. New policies/transitions carry the v1 scripts and type bytes; _v0 variants keep old vtxos reconstructing and exiting. The retired third-party HTLC policy is dropped (upstream took 0x08). Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01M5kFodm9azZJVTQxnkDdKe
Diffstat (limited to 'src/ark/manager.js')
-rw-r--r--src/ark/manager.js9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/ark/manager.js b/src/ark/manager.js
index f9819a0..a478d19 100644
--- a/src/ark/manager.js
+++ b/src/ark/manager.js
@@ -1250,14 +1250,17 @@ export class ArkManager {
// ---- refresh (also the consolidation primitive) ----
refreshFee(inputs, tip) {
+ // pver >= 4: ppm accumulates sub-satoshi across ALL inputs and rounds UP
+ // once at the end (the server's calc_ppm_expiry_fee). Per-input floor —
+ // the old way — undercharges and the server rejects the round intent.
const table = this.info.refreshFees.ppmExpiryTable;
- let fee = this.info.refreshFees.baseFeeSat;
+ let ppmUnits = 0;
for (const v of inputs) {
const blocks = v.expiryHeight - tip;
const entry = table.filter((e) => e.thresholdBlocks <= blocks).pop();
- fee += Math.floor((v.amountSat * (entry?.ppm ?? 0)) / 1_000_000);
+ ppmUnits += v.amountSat * (entry?.ppm ?? 0);
}
- return fee;
+ return this.info.refreshFees.baseFeeSat + Math.ceil(ppmUnits / 1_000_000);
}
async refresh(vtxoIds) {