diff --git a/nip60/pay.go b/nip60/pay.go index aad51bc..96b56f9 100644 --- a/nip60/pay.go +++ b/nip60/pay.go @@ -28,9 +28,10 @@ func (w *Wallet) PayBolt11(ctx context.Context, invoice string, opts ...SendOpti var meltQuote string var meltAmount uint64 - invoicePct := uint64(99) + feeReservePct := uint64(1) + feeReserveAbs := uint64(1) for range 10 { - amount := invoiceAmount * invoicePct / 100 + amount := invoiceAmount*(100+feeReservePct)/100 + feeReserveAbs var fee uint64 chosen, fee, err = w.getProofsForSending(ctx, amount, ss.specificMint) if err != nil { @@ -48,16 +49,17 @@ func (w *Wallet) PayBolt11(ctx context.Context, invoice string, opts ...SendOpti // if amount in proofs is not sufficient to pay for the melt request, // increase the amount and get proofs again (because of lighting fees) - if meltResp.Amount+meltResp.FeeReserve+fee > chosen.proofs.Amount() { - invoicePct-- + meltQuote = meltResp.Quote + meltAmount = meltResp.Amount + meltResp.FeeReserve + fee + + if meltAmount > chosen.proofs.Amount() { + feeReserveAbs++ } else { - meltQuote = meltResp.Quote - meltAmount = meltResp.Amount goto meltworked } } - return "", fmt.Errorf("stop trying to do the melt because the mint part is too expensive") + return "", fmt.Errorf("stop trying to do the melt because the invoice is too expensive") meltworked: // swap our proofs so we get the exact amount for paying the invoice diff --git a/nip60/send.go b/nip60/send.go index bb7f2d0..1459e00 100644 --- a/nip60/send.go +++ b/nip60/send.go @@ -180,6 +180,7 @@ func (w *Wallet) getProofsForSending( part.tokens = make([]Token, 0, 3) part.tokenIndexes = make([]int, 0, 3) part.proofs = make(cashu.Proofs, 0, 7) + part.mint = token.Mint } part.tokens = append(part.tokens, token) @@ -193,6 +194,8 @@ func (w *Wallet) getProofsForSending( return part, fee, nil } } + + byMint[token.Mint] = part } // if we got here it's because we didn't get enough proofs from the same mint