Verify the invoice returned when creating a swap out before storing and
paying it:
- the invoice payment hash must match the payment hash of the locally
generated preimage
- the invoice amount must not exceed the requested amount plus the
quoted service and miner fees (with a small rounding tolerance)
- the lockup address is checked against the swap tree, matching the
checks already performed for swap in and refunds
- the invoice is verified again directly before it is paid
Also renames AlbySwapServiceFee to AlbySwapServiceFeePercentage for
clarity.
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix: avoid mempool api failures during swaps by using boltz for fee and tx lookup
* fix: ensure swap payment isn't made twice on refresh
---------
Co-authored-by: Roland Bewick <roland.bewick@gmail.com>
* chore: remove json tags from lnclient models
these should not be passed through the API directly
* fix: properly return not implemented errors
* fix: json tags on TLVRecord
* fix: checks for ok status code in responses
* refactor: replacing native fetch with useSWR
* chore: remove url from logs
* chore: add phoenixd error logs for non-success responses
* chore: add use currencies hook
* chore: use loading from currencies hook and filter out btc
---------
Co-authored-by: im-adithya <imadithyavardhan@gmail.com>
* chore: remove balance card and fix layout
* chore: change send screen styling
* feat: add onchain send
* feat: send exact amount in swap outs
* chore: address feedback
* chore: change swap transaction title and add to address
* chore: refactor zero amount screen and remove confirmation
* chore: add x icon to recipient in lnurl pay
* chore: split onchain send page into separate components
* fix: set headers and remove send layout
* chore: show warning if balance is low
* chore: change name to PendingPaymentAlert
* chore: add increase balance warning on exceeding amount
* chore: minor changes
* chore: remove you'll be notified message
* chore: add on-chain transactions alert on wallet page
* chore: align sending and payment pending alerts
* chore: make sure amount doesn't reset
* fix: small onchain amount alert copy
* chore: rename isSending to useExactReceiveAmount
* chore: add mempool and anchor reserves alert to onchain send screen
* chore: use spending alert consistently and remove red text
* chore: add option to edit fee rate
* fix: styling after tailwind upgrade
* feat: add swap in and onchain deposit to receive flow (#1585)
* chore: remove receive layout
* feat: add onchain address to receive flow
* feat: add receive screen to swap in and deposit bitcoin
* chore: rename import to MIN_SWAP_AMOUNT
* chore: add onchain button when alby account is disconnected
* fix: link
* chore: add OnchainAddressDisplay and use useSearchParams hook
* fix: use actual swap limits from boltz api (#1598)
* fix: create another invoice button
* chore: use fee rate instead of network fee
* fix: styling after tailwind upgrade
* chore: rename swap fees to swap info
* chore: use lottie loading component
* chore: add mempool alert
* chore: make swaps the default option for send/receive onchain
---------
Co-authored-by: Roland Bewick <roland.bewick@gmail.com>
* chore: consistently show fee rate in sat/vByte
* chore: minor copy changes
---------
Co-authored-by: Roland Bewick <roland.bewick@gmail.com>
* chore: move out swaps from settings
* chore: link to swaps in wallet and node page
* chore: add frontend for swap ins
* chore: update all swap redirects
* chore: remove swap dialogs
* chore: remove auto swap-ins frontend
* feat: add support for one time swap outs
* chore: remove unused code
* chore: use separate endpoint for one off swap outs
* chore: further changes
* chore: separate one off and auto swaps
* chore: naming changes
* fix: tests
* feat: add one off swap in
* feat: add auto swap ins
* chore: remove comments
* fix: tests
* chore: further changes
* chore: further changes
* chore: rename to swap in and swap out
* chore: do not show swaps for non LDK/LND users
* chore: add receive limit checks for swap ins
* chore: remove probing
* chore: dark mode
* fix: swap link
* chore: add extra swap links
* fix: fee rates log
* fix: fee rates log
* chore: color changes
* Feat: swap out improvements (#1403)
* feat: swap out improvements
- add lockup transaction id to hold payment metadata
- return swap ID and payment hash in swap out response
- retries to get fee rates
- separate swap out success page with status
* chore: rename
* chore: show current balance on swap out form
* chore: add pulse animation to badge while pending
* chore: minor typo
* chore: update fee rate retry interval to 10 seconds
* chore: use icons instead of badges
---------
Co-authored-by: im-adithya <imadithyavardhan@gmail.com>
* chore: update comment
* chore: remove comment
* chore: update boltz client to v2.6.1
* feat: swap in improvements (WIP) (#1411)
* feat: swap in improvements (WIP)
* feat: new swap in status page
* fix: hide pay button when already paid
* chore: improve swap in UI
* chore: more swap in ui improvements
* chore: minor improvements and fixes
* fix: typo
* feat: add swap in refund logic in case of failure
* fix: tests
* chore: add swap expired case for refunds
---------
Co-authored-by: im-adithya <imadithyavardhan@gmail.com>
* feat: add swaps table (#1419)
* feat: add swaps table
* fix: test
* chore: bump LDK-node to v0.6.0 (#1418)
* [Freepilot] fix: startup error handling (#1413)
* fix: handle errors from service.NewService() in startup code
Previously, both HTTP and Wails startup code ignored errors from
service.NewService(ctx) using blank identifier (_), which could
cause panics later if NewService fails (e.g., unable to connect
to postgres database).
Now properly handle the error and exit gracefully with a fatal
log message when service initialization fails.
* fix: compile error
---------
Co-authored-by: Roland Bewick <roland.bewick@gmail.com>
* feat: add hd key derivation
* Chore: add albyhub region cookie to developer page (#1421)
* docs: add AlbyHub-Region cookie instructions to developer page
* fix: use region from alby api
---------
Co-authored-by: achaldps@gmail.com <achaldps@gmail.com>
* build(deps): bump golang.org/x/crypto from 0.38.0 to 0.39.0 (#1415)
Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.38.0 to 0.39.0.
- [Commits](https://github.com/golang/crypto/compare/v0.38.0...v0.39.0)
---
updated-dependencies:
- dependency-name: golang.org/x/crypto
dependency-version: 0.39.0
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* build(deps): bump gorm.io/driver/sqlite from 1.5.7 to 1.6.0 (#1416)
Bumps [gorm.io/driver/sqlite](https://github.com/go-gorm/sqlite) from 1.5.7 to 1.6.0.
- [Commits](https://github.com/go-gorm/sqlite/compare/v1.5.7...v1.6.0)
---
updated-dependencies:
- dependency-name: gorm.io/driver/sqlite
dependency-version: 1.6.0
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* build(deps): bump github.com/btcsuite/btcd/btcec/v2 from 2.3.4 to 2.3.5 (#1417)
Bumps [github.com/btcsuite/btcd/btcec/v2](https://github.com/btcsuite/btcd) from 2.3.4 to 2.3.5.
- [Release notes](https://github.com/btcsuite/btcd/releases)
- [Changelog](https://github.com/btcsuite/btcd/blob/master/CHANGES)
- [Commits](https://github.com/btcsuite/btcd/compare/btcec/v2.3.4...btcec/v2.3.5)
---
updated-dependencies:
- dependency-name: github.com/btcsuite/btcd/btcec/v2
dependency-version: 2.3.5
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* feat: allow setting LDK node alias (#1398)
* feat: add node alias customization for LDK nodes with public channels
- Add new NodeAlias field to InfoResponse in API
- Add SetNodeAlias method to API with config storage
- Add HTTP endpoint POST /node/alias for setting node alias
- Add corresponding Wails endpoint support
- Create new Node settings page in frontend
- Add conditional navigation item for LDK nodes with public channels
- Include upgrade dialog and paid subscription check
- Display success message prompting node restart after alias change
- Show error toast for non-paid users attempting to change alias
* chore: use node alias from config in LDK init
* fix: make upgrade button non-absolute, remove disabled attribute
* chore: move node alias page to be consistent with other node management pages
* chore: remove redundant comment
* chore: show upgrade dialog when clicking node alias option, show also for private channels
---------
Co-authored-by: Roland Bewick <roland.bewick@gmail.com>
* fix: always pass in fee and handle mempool errors (#1408)
* fix: always pass in fee and handle mempool errors
* chore: improve withdraw on-chain funds UI
---------
Co-authored-by: Roland Bewick <roland.bewick@gmail.com>
* feat: derive keys from id and add fields to swap table
* feat: use bip 85 to derive swap mnemonic
* chore: mark swaps as failed if payment fails
* feat: add process refund method for swap ins
* chore: add process refund to swap service interface
* feat: add frontend
* fix: swap out failure message
* feat: add process refund button in swap in status screen
* chore: further improvements
* fix: wails routes
* feat: add frequency selector for ZapPlanner payments (#1312) (#1317)
* feat: add frequency selector for ZapPlanner payments (#1312)
* feat: add frequency selector for ZapPlanner payments (#1312) +corrections
* feat(zapplanner): add USD/BTC selector and frequency option
Budget renewal still has to be adjusted
* feat(zapplanner): set default frequency to 1 month
* feat(zapplanner): set default amount to usd and added (sats) to clarify BTC unit
* feat(zapplanner): convert months to days for subscriptions
* feat(zapplanner): add open to convertCurrency deps to allow consecutive subscriptions
* feat(Zapplanner freq¤cy selector): added all currencies to the selector
* feat(Zapplanner freq¤cy selector): removed bug about 2xBTC(sats) on the menu
* feat(zapplanner): frequency & currency all comments addressed
* chore: zapplanner fixes
- currency sorting
- sats currency usage for ZapPlanner
- force whole values for ZapPlanner
- pass correct currency to ZapPlanner
- rename field
- fix input width
---------
Co-authored-by: jpl-btc <>
Co-authored-by: Roland Bewick <roland.bewick@gmail.com>
* chore: add reconnection logic
* chore: specify fees while locking btc
* fix: do not use context background
* chore: improve auto swaps frontend
* chore: add boltz logo to tx item
* Updated Primal app connection (#1428)
* Updated Primal app connection
* fix: lint
---------
Co-authored-by: René Aaron <rene@twentyuno.net>
* chore: bump uniffi-bindgen-go and revert error handling in the LDK client (#1434)
* chore: revert error handling in the LDK client
* chore: update ldk-node-go dependency
---------
Co-authored-by: Roland Bewick <roland.bewick@gmail.com>
* Read.me adjustments (#1440)
* Update README.md
1) We spend a lot of time helping users to fix their problems with Raspi PIs.
2) Computers that are offline regularly create a bad UX because payments in external apps do not work and channels are closed earlier.
* Update README.md
* feat: add expired state to nip47 transactions (#1441)
* fix: use custom mempool url (#1431)
* fix: use custom mempool url
* chore: return mempool url in info endpoint
* chore: use mempool url from info response in frontend
* chore: remove default mempool url in frontend
* fix: tests
* feat: add LDK bitcoind rpc chain source (#1367)
* feat: add LDK bitcoind rpc chain source
* fix: crash in bitcoindrpc due to not enabling continuous sync
* chore: renaming
* chore: mark swap status as failed
* chore: use mempool url from info
* chore: poll balances on node page
* fix: when opening outbound channel, extract host part if full peer connection url is pasted
* chore: use mempool url from backend info endpoint
* docs: add boltz regtest setup instructions
* chore: separate swap in and out status pages
* fix: remove duplicate useInfo
* fix: mnemonic derivation logic
* chore: address comments
* chore: add tests for swap mnemonic generation
* chore: add refunded state
* chore: rename columns
* chore: simplify swap status frontend
* chore: mark swap out as successful after claim tx conf
* chore: add address to refund
* fix: wails
* feat: add resubscription
* chore: add logging
* chore: save refund address to db and use new address
* chore: add comment
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Roland <33993199+rolznz@users.noreply.github.com>
Co-authored-by: Freepilot <215356755+freepilot-bot@users.noreply.github.com>
Co-authored-by: Roland Bewick <roland.bewick@gmail.com>
Co-authored-by: achaldps@gmail.com <achaldps@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Nodii <13803869+NodeDiver@users.noreply.github.com>
Co-authored-by: Moritz Kaminski <moritz.kaminski@gmail.com>
Co-authored-by: René Aaron <rene@twentyuno.net>
Co-authored-by: Roman D <roman@dmitrienko.com>
* chore: rename to receive_amount
* chore: remove auto swap success and add boltz link
* chore: use constant and rename variables
* fix: mark swaps as failed
* fix: show receive amount in swap in success screen
* chore: remove duplicate endpoint and reorder
* chore: add comment in wails handler
* chore: use markSwapState
* chore: add retries
* fix: use one websocket per swap
* chore: frontend fixes
* feat: add swap mnemonic to debug tools
* fix: tx list
* fix: tests
* chore: further changes
* chore: improve copy
* chore: improve copy
* chore: improve copy
* chore: rename, add autofocus on swap inputs
* fix: swap in failed state when no lockup tx exists
* chore: add interval note to active swap component
* chore: remove boltz image
* chore: use hasChannelManagement check
* chore: use link instead of navigate
* chore: mark swaps as failed in case of errors
* chore: add comment
* chore: only mark swaps as failed in defer function
* chore: improve copy
* chore: update boltz client to v2.7.2
* chore: use refundSwapRequest param
* fix: refund swap method
* chore: minor changes
* chore: add retries
* chore: add retries and use single ws connection for pending swaps
* fix: swap fee error message
* chore: remove sending partial signature in swap in
* chore: log error when update channel is not ok
* fix: add tx claimed state in swap in listener
* chore: add nwc_swap_succeeded to whitelist and readme
* feat: use single boltz ws connection
* chore: only check for tx claimed state
* chore: use lock while sending updates
* chore: handle boltz update error
* chore: remove swap id from success event
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Roland Bewick <roland.bewick@gmail.com>
Co-authored-by: Roland <33993199+rolznz@users.noreply.github.com>
Co-authored-by: Freepilot <215356755+freepilot-bot@users.noreply.github.com>
Co-authored-by: achaldps@gmail.com <achaldps@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Nodii <13803869+NodeDiver@users.noreply.github.com>
Co-authored-by: Moritz Kaminski <moritz.kaminski@gmail.com>
Co-authored-by: René Aaron <rene@twentyuno.net>
Co-authored-by: Roman D <roman@dmitrienko.com>