diff options
Diffstat (limited to 'src/wallet.js')
| -rw-r--r-- | src/wallet.js | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/src/wallet.js b/src/wallet.js index 194b9dc..72d33be 100644 --- a/src/wallet.js +++ b/src/wallet.js @@ -878,10 +878,10 @@ export class Wallet { if (gift < BigInt(giftMinimum(rate))) throw new Error('Gift amount is too small.'); // Select confirmed coins (largest first, to minimize inputs) until they - // cover the gift + the claimer's fee (which grows with input count) + a dust - // change. The change output goes back to us and is protected; the rest is - // the claimer's to direct. - const claimFeeFor = (n) => BigInt(Math.ceil((11 + 68 * n + 31 * 2) * rate)); + // cover the gift plus a dust change. The change output goes back to us and + // is protected; the rest — the full gift amount — is the claimer's to + // direct. No fee is reserved here: the claimer's wallet looks up the fee + // rate at claim time and subtracts it from this amount. const pool = this.utxos .filter((u) => u.confirmed && !this.isReserved(utxoId(u))) .sort((a, b) => b.value - a.value); @@ -890,12 +890,11 @@ export class Wallet { for (const u of pool) { sel.push(u); sum += BigInt(u.value); - if (sum >= gift + claimFeeFor(sel.length) + DUST) break; + if (sum >= gift + DUST) break; } - const claimFee = claimFeeFor(sel.length); - if (sum < gift + claimFee + DUST) throw new Error('Not enough confirmed funds for that gift amount.'); + if (sum < gift + DUST) throw new Error('Not enough confirmed funds for that gift amount.'); - const change = sum - gift - claimFee; // back to us, >= DUST by construction + const change = sum - gift; // back to us, >= DUST by construction const t = new btc.Transaction({ allowUnknownOutputs: true }); // First input commits the change output (SIGHASH_SINGLE on output 0); the // rest commit only the inputs (SIGHASH_NONE). Together: inputs and our @@ -1423,7 +1422,10 @@ function _sumInputs(tx) { export function previewGift(code) { try { const tx = btc.Transaction.fromPSBT(base64urlnopad.decode(code)); - return { room: Number(_sumInputs(tx) - tx.getOutput(0).amount) }; // room minus the claimer fee + // room is the full amount the claimer receives (inputs minus our change); + // the claim fee is subtracted from it at claim time, so report inputs too + // so the caller can size that fee for this PSBT. + return { room: Number(_sumInputs(tx) - tx.getOutput(0).amount), inputs: tx.inputsLength }; } catch { return null; } |
