mirror of
https://github.com/getAlby/hub.git
synced 2026-08-13 12:33:39 +02:00
Swaps improvements (shifting to standalone page + one-time swaps) (#1371)
* 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>
This commit is contained in:
parent
f50f02bf27
commit
a1eaa63eed
45 changed files with 3513 additions and 951 deletions
|
|
@ -164,9 +164,17 @@ func (httpSvc *HttpService) RegisterSharedRoutes(e *echo.Echo) {
|
|||
restrictedApiGroup.GET("/health", httpSvc.healthHandler)
|
||||
restrictedApiGroup.GET("/commands", httpSvc.getCustomNodeCommandsHandler)
|
||||
restrictedApiGroup.POST("/command", httpSvc.execCustomNodeCommandHandler)
|
||||
restrictedApiGroup.GET("/settings/swaps", httpSvc.getAutoSwapsConfigHandler)
|
||||
restrictedApiGroup.POST("/settings/swaps", httpSvc.enableAutoSwapsHandler)
|
||||
restrictedApiGroup.DELETE("/settings/swaps", httpSvc.disableAutoSwapsHandler)
|
||||
restrictedApiGroup.GET("/swaps", httpSvc.listSwapsHandler)
|
||||
restrictedApiGroup.GET("/swaps/:swapId", httpSvc.lookupSwapHandler)
|
||||
restrictedApiGroup.GET("/swaps/out/fees", httpSvc.getSwapOutFeesHandler)
|
||||
restrictedApiGroup.GET("/swaps/in/fees", httpSvc.getSwapInFeesHandler)
|
||||
restrictedApiGroup.POST("/swaps/out", httpSvc.initiateSwapOutHandler)
|
||||
restrictedApiGroup.POST("/swaps/in", httpSvc.initiateSwapInHandler)
|
||||
restrictedApiGroup.POST("/swaps/refund", httpSvc.refundSwapHandler)
|
||||
restrictedApiGroup.GET("/swaps/mnemonic", httpSvc.swapMnemonicHandler)
|
||||
restrictedApiGroup.GET("/autoswap", httpSvc.getAutoSwapConfigHandler)
|
||||
restrictedApiGroup.POST("/autoswap", httpSvc.enableAutoSwapOutHandler)
|
||||
restrictedApiGroup.DELETE("/autoswap", httpSvc.disableAutoSwapOutHandler)
|
||||
restrictedApiGroup.POST("/node/alias", httpSvc.setNodeAliasHandler)
|
||||
|
||||
httpSvc.albyHttpSvc.RegisterSharedRoutes(restrictedApiGroup, e)
|
||||
|
|
@ -1226,7 +1234,7 @@ func (httpSvc *HttpService) restoreBackupHandler(c echo.Context) error {
|
|||
return err
|
||||
}
|
||||
if info.SetupCompleted {
|
||||
return errors.New("Setup already completed")
|
||||
return errors.New("setup already completed")
|
||||
}
|
||||
|
||||
password := c.FormValue("unlockPassword")
|
||||
|
|
@ -1267,26 +1275,130 @@ func (httpSvc *HttpService) healthHandler(c echo.Context) error {
|
|||
return c.JSON(http.StatusOK, healthResponse)
|
||||
}
|
||||
|
||||
func (httpSvc *HttpService) getAutoSwapsConfigHandler(c echo.Context) error {
|
||||
getAutoSwapsConfigResponse, err := httpSvc.api.GetAutoSwapsConfig()
|
||||
func (httpSvc *HttpService) listSwapsHandler(c echo.Context) error {
|
||||
swaps, err := httpSvc.api.ListSwaps()
|
||||
|
||||
if err != nil {
|
||||
return c.JSON(http.StatusInternalServerError, ErrorResponse{
|
||||
Message: err.Error(),
|
||||
})
|
||||
}
|
||||
|
||||
return c.JSON(http.StatusOK, swaps)
|
||||
}
|
||||
|
||||
func (httpSvc *HttpService) lookupSwapHandler(c echo.Context) error {
|
||||
swap, err := httpSvc.api.LookupSwap(c.Param("swapId"))
|
||||
if err != nil {
|
||||
return c.JSON(http.StatusNotFound, ErrorResponse{
|
||||
Message: "App not found",
|
||||
})
|
||||
}
|
||||
|
||||
return c.JSON(http.StatusOK, swap)
|
||||
}
|
||||
|
||||
func (httpSvc *HttpService) getSwapOutFeesHandler(c echo.Context) error {
|
||||
swapOutFeesResponse, err := httpSvc.api.GetSwapOutFees()
|
||||
if err != nil {
|
||||
return c.JSON(http.StatusInternalServerError, ErrorResponse{
|
||||
Message: fmt.Sprintf("Failed to get swap out fees: %v", err),
|
||||
})
|
||||
}
|
||||
|
||||
return c.JSON(http.StatusOK, swapOutFeesResponse)
|
||||
}
|
||||
|
||||
func (httpSvc *HttpService) getSwapInFeesHandler(c echo.Context) error {
|
||||
swapOutFeesResponse, err := httpSvc.api.GetSwapInFees()
|
||||
if err != nil {
|
||||
return c.JSON(http.StatusInternalServerError, ErrorResponse{
|
||||
Message: fmt.Sprintf("Failed to get swap in fees: %v", err),
|
||||
})
|
||||
}
|
||||
|
||||
return c.JSON(http.StatusOK, swapOutFeesResponse)
|
||||
}
|
||||
|
||||
func (httpSvc *HttpService) initiateSwapOutHandler(c echo.Context) error {
|
||||
var initiateSwapOutRequest api.InitiateSwapRequest
|
||||
if err := c.Bind(&initiateSwapOutRequest); err != nil {
|
||||
return c.JSON(http.StatusBadRequest, ErrorResponse{
|
||||
Message: fmt.Sprintf("Bad request: %s", err.Error()),
|
||||
})
|
||||
}
|
||||
|
||||
swapOutResponse, err := httpSvc.api.InitiateSwapOut(c.Request().Context(), &initiateSwapOutRequest)
|
||||
if err != nil {
|
||||
return c.JSON(http.StatusInternalServerError, ErrorResponse{
|
||||
Message: fmt.Sprintf("Failed to initiate swap out: %v", err),
|
||||
})
|
||||
}
|
||||
|
||||
return c.JSON(http.StatusOK, swapOutResponse)
|
||||
}
|
||||
|
||||
func (httpSvc *HttpService) initiateSwapInHandler(c echo.Context) error {
|
||||
var initiateSwapInRequest api.InitiateSwapRequest
|
||||
if err := c.Bind(&initiateSwapInRequest); err != nil {
|
||||
return c.JSON(http.StatusBadRequest, ErrorResponse{
|
||||
Message: fmt.Sprintf("Bad request: %s", err.Error()),
|
||||
})
|
||||
}
|
||||
|
||||
txId, err := httpSvc.api.InitiateSwapIn(c.Request().Context(), &initiateSwapInRequest)
|
||||
if err != nil {
|
||||
return c.JSON(http.StatusInternalServerError, ErrorResponse{
|
||||
Message: fmt.Sprintf("Failed to initiate swap in: %v", err),
|
||||
})
|
||||
}
|
||||
|
||||
return c.JSON(http.StatusOK, txId)
|
||||
}
|
||||
|
||||
func (httpSvc *HttpService) refundSwapHandler(c echo.Context) error {
|
||||
var refundSwapInRequest api.RefundSwapRequest
|
||||
if err := c.Bind(&refundSwapInRequest); err != nil {
|
||||
return c.JSON(http.StatusBadRequest, ErrorResponse{
|
||||
Message: fmt.Sprintf("Bad request: %s", err.Error()),
|
||||
})
|
||||
}
|
||||
|
||||
err := httpSvc.api.RefundSwap(&refundSwapInRequest)
|
||||
if err != nil {
|
||||
return c.JSON(http.StatusInternalServerError, ErrorResponse{
|
||||
Message: err.Error(),
|
||||
})
|
||||
}
|
||||
|
||||
return c.NoContent(http.StatusNoContent)
|
||||
}
|
||||
|
||||
func (httpSvc *HttpService) swapMnemonicHandler(c echo.Context) error {
|
||||
mnemonic := httpSvc.api.GetSwapMnemonic()
|
||||
return c.JSON(http.StatusOK, mnemonic)
|
||||
}
|
||||
|
||||
func (httpSvc *HttpService) getAutoSwapConfigHandler(c echo.Context) error {
|
||||
getAutoSwapConfigResponse, err := httpSvc.api.GetAutoSwapConfig()
|
||||
if err != nil {
|
||||
return c.JSON(http.StatusInternalServerError, ErrorResponse{
|
||||
Message: fmt.Sprintf("Failed to get swap settings: %v", err),
|
||||
})
|
||||
}
|
||||
|
||||
return c.JSON(http.StatusOK, getAutoSwapsConfigResponse)
|
||||
return c.JSON(http.StatusOK, getAutoSwapConfigResponse)
|
||||
}
|
||||
|
||||
func (httpSvc *HttpService) enableAutoSwapsHandler(c echo.Context) error {
|
||||
var enableAutoSwapsRequest api.EnableAutoSwapsRequest
|
||||
if err := c.Bind(&enableAutoSwapsRequest); err != nil {
|
||||
func (httpSvc *HttpService) enableAutoSwapOutHandler(c echo.Context) error {
|
||||
var enableAutoSwapRequest api.EnableAutoSwapRequest
|
||||
if err := c.Bind(&enableAutoSwapRequest); err != nil {
|
||||
return c.JSON(http.StatusBadRequest, ErrorResponse{
|
||||
Message: fmt.Sprintf("Bad request: %s", err.Error()),
|
||||
})
|
||||
}
|
||||
|
||||
err := httpSvc.api.EnableAutoSwaps(c.Request().Context(), &enableAutoSwapsRequest)
|
||||
err := httpSvc.api.EnableAutoSwapOut(c.Request().Context(), &enableAutoSwapRequest)
|
||||
if err != nil {
|
||||
return c.JSON(http.StatusInternalServerError, ErrorResponse{
|
||||
Message: fmt.Sprintf("Failed to save swap settings: %v", err),
|
||||
|
|
@ -1296,8 +1408,8 @@ func (httpSvc *HttpService) enableAutoSwapsHandler(c echo.Context) error {
|
|||
return c.NoContent(http.StatusNoContent)
|
||||
}
|
||||
|
||||
func (httpSvc *HttpService) disableAutoSwapsHandler(c echo.Context) error {
|
||||
err := httpSvc.api.DisableAutoSwaps()
|
||||
func (httpSvc *HttpService) disableAutoSwapOutHandler(c echo.Context) error {
|
||||
err := httpSvc.api.DisableAutoSwap()
|
||||
|
||||
if err != nil {
|
||||
return c.JSON(http.StatusInternalServerError, ErrorResponse{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue