Skip to content

fix: avoid msat truncation when paying invoices with built-in amounts#512

Open
ben-kaufman wants to merge 7 commits intomasterfrom
fix/msat-invoice-precision
Open

fix: avoid msat truncation when paying invoices with built-in amounts#512
ben-kaufman wants to merge 7 commits intomasterfrom
fix/msat-invoice-precision

Conversation

@ben-kaufman
Copy link
Copy Markdown
Contributor

Summary

  • Bump bitkit-core to v0.1.56 which rounds up sub-satoshi invoice amounts (ceiling division instead of floor)
  • Stop overriding the amount for invoices that already have one — pass sats: nil so LDK uses the invoice's native msat precision instead of our truncated sats value converted back to msat
  • Only pass sats for zero-amount invoices where the user specifies the amount

Test plan

  • E2E: pay invoices created with lnd.addInvoice({ valueMsat }) using amounts 222538, 222222, 500500 msat
  • Verify zero-amount invoice flow still works
  • Verify LNURL pay flow still works
  • Verify quickpay flow still works

Depends on synonymdev/bitkit-core#85
Closes #511

🤖 Generated with Claude Code

Bump bitkit-core to v0.1.56 which rounds up sub-satoshi invoice amounts.

Additionally, stop overriding the amount for invoices that already have
one. Pass sats: nil so LDK uses the invoice's native msat precision
instead of our truncated sats value converted back to msat. Only pass
sats for zero-amount invoices where the user specifies the amount.

Closes #511
@claude

This comment has been minimized.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@claude

This comment has been minimized.

@claude
Copy link
Copy Markdown

claude bot commented Apr 2, 2026

Code review

No issues found. Checked for bugs and CLAUDE.md compliance.

ben-kaufman and others added 3 commits April 3, 2026 09:26
LNURL protocol uses millisatoshis, but the app was normalizing msat
values to sats in-place on the data structs. When those sats were later
converted back to msats for callbacks, the fractional part was lost
(e.g. 500500 msat -> 501 sats -> 501000 msat, rejected by server).

- Stop normalizing LNURL data structs in-place; keep original msat values
- Change fetchLnurlInvoice to accept amountMsats directly
- Convert to sats only for display (floor) and validation (ceil for min)
- For fixed-amount LNURL-pay, pass original msat value to callback
- For fixed-amount LNURL-withdraw, use floor(msats/1000) for invoice amount

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
For LNURL-withdraw with sub-sat precision (e.g. 222538 msat), neither
floor (222 sats) nor ceiling (223 sats) matches the server's exact
amount range. Add receiveMsats/createInvoiceMsats to create invoices
with native msat precision, used for fixed-amount LNURL withdrawals.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@piotr-iohk
Copy link
Copy Markdown
Collaborator

Not sure, what's up with CI here, but I cannot build it locally:

** BUILD FAILED **


The following build commands failed:
	Ld /Users/piotr/code/synonym/bitkit-ios/build/Build/Products/Debug-iphonesimulator/BitkitNotification.appex/BitkitNotification.debug.dylib normal (in target 'BitkitNotification' from project 'Bitkit')
	Building project Bitkit with scheme Bitkit and configuration Debug
(2 failures)

Use ceiling division for LNURL display amounts to match BOLT11 behavior.
Previously LNURL-pay showed 222 sats on review but 223 after sending,
and LNURL-withdraw showed 222 while BOLT11 showed 223 for the same
222222 msat amount.

Also revert the LDK Node revision to the master-pinned version
(c5698d00) which was inadvertently changed during package resolution.
This fixes the BitkitNotification linker failure.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@ben-kaufman
Copy link
Copy Markdown
Contributor Author

@piotr-iohk The build failure should be fixed — the LDK Node revision was inadvertently changed from the master-pinned version during SPM package resolution. Reverted it back to c5698d00.

If the issue persists, try cleaning derived data (rm -rf ~/Library/Developer/Xcode/DerivedData) and resolving packages fresh.

@piotr-iohk
Copy link
Copy Markdown
Collaborator

Ok, note there is a conflict on the branch on changelog file, perhaps that is why CI does not start properly 🤔

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: msat-precision invoices fail to send (regular BOLT11 + LNURL pay/withdraw)

2 participants