mirror of
https://github.com/getAlby/hub.git
synced 2026-08-20 13:28:40 +02:00
* fix: keep showing migration success page after creating migration file After creating a node migration file the hub is halted and the Alby OAuth token is intentionally removed, so visiting the homepage sent the user through /start into the Alby OAuth flow. Track the halted state in memory and redirect back to the migration success page instead. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix: synchronize migration flag access and propagate zip close error Make nodeMigrationFileCreated an atomic.Bool since it is written by CreateBackup and read by GetInfo on concurrent HTTP handler goroutines, and finalize the migration archive explicitly so a failed zip close returns an error instead of reporting a corrupt backup as success. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix: return minimal info response after migration file is created Once a migration file is created the hub is halted and the database is closed. GetInfo previously only worked because every config key it reads happened to be served from the config cache; any cache miss on an error-propagating read would fail /api/info. Return early with a minimal response instead so the migration success page does not depend on cache state. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
771 lines
30 KiB
Go
771 lines
30 KiB
Go
package api
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"io"
|
|
"time"
|
|
|
|
"github.com/getAlby/hub/alby"
|
|
"github.com/getAlby/hub/db"
|
|
"github.com/getAlby/hub/swaps"
|
|
)
|
|
|
|
type API interface {
|
|
CreateApp(createAppRequest *CreateAppRequest) (*CreateAppResponse, error)
|
|
UpdateApp(app *db.App, updateAppRequest *UpdateAppRequest) error
|
|
Transfer(ctx context.Context, fromAppId *uint, toAppId *uint, amountMsat uint64, description string) error
|
|
DeleteApp(app *db.App) error
|
|
GetApp(app *db.App) (*App, error)
|
|
ListApps(limit uint64, offset uint64, filters ListAppsFilters, orderBy string) (*ListAppsResponse, error)
|
|
CreateLightningAddress(ctx context.Context, createLightningAddressRequest *CreateLightningAddressRequest) error
|
|
DeleteLightningAddress(ctx context.Context, appId uint) error
|
|
ListChannels(ctx context.Context) ([]Channel, error)
|
|
GetChannelPeerSuggestions(ctx context.Context) ([]alby.ChannelPeerSuggestion, error)
|
|
GetStories(ctx context.Context) ([]alby.Story, error)
|
|
GetLSPChannelOffer(ctx context.Context) (*alby.LSPChannelOffer, error)
|
|
ResetRouter(key string) error
|
|
ChangeUnlockPassword(changeUnlockPasswordRequest *ChangeUnlockPasswordRequest) error
|
|
SetAutoUnlockPassword(unlockPassword string) error
|
|
Stop() error
|
|
GetNodeConnectionInfo(ctx context.Context) (*NodeConnectionInfo, error)
|
|
GetNodeStatus(ctx context.Context) (*NodeStatus, error)
|
|
ListPeers(ctx context.Context) ([]PeerDetails, error)
|
|
ConnectPeer(ctx context.Context, connectPeerRequest *ConnectPeerRequest) error
|
|
DisconnectPeer(ctx context.Context, peerId string) error
|
|
OpenChannel(ctx context.Context, openChannelRequest *OpenChannelRequest) (*OpenChannelResponse, error)
|
|
RebalanceChannel(ctx context.Context, rebalanceChannelRequest *RebalanceChannelRequest) (*RebalanceChannelResponse, error)
|
|
CloseChannel(ctx context.Context, peerId, channelId string, force bool) (*CloseChannelResponse, error)
|
|
UpdateChannel(ctx context.Context, updateChannelRequest *UpdateChannelRequest) error
|
|
MakeOffer(ctx context.Context, description string) (string, error)
|
|
GetNewOnchainAddress(ctx context.Context) (string, error)
|
|
GetUnusedOnchainAddress(ctx context.Context) (string, error)
|
|
SignMessage(ctx context.Context, message string) (*SignMessageResponse, error)
|
|
RedeemOnchainFunds(ctx context.Context, toAddress string, amountSat uint64, feeRate *uint64, sendAll bool) (*RedeemOnchainFundsResponse, error)
|
|
GetBalances(ctx context.Context) (*BalancesResponse, error)
|
|
ListTransactions(ctx context.Context, appId *uint, limit uint64, offset uint64, filters ListTransactionsFilters) (*ListTransactionsResponse, error)
|
|
ListOnchainTransactions(ctx context.Context) ([]OnchainTransaction, error)
|
|
SendPayment(ctx context.Context, invoice string, amountMsat *uint64, metadata map[string]interface{}, fromAppId *uint) (*SendPaymentResponse, error)
|
|
CreateInvoice(ctx context.Context, amountMsat uint64, description string, toAppId *uint) (*MakeInvoiceResponse, error)
|
|
LookupInvoice(ctx context.Context, paymentHash string) (*LookupInvoiceResponse, error)
|
|
SetTransactionUserLabels(ctx context.Context, id uint, labels map[string]string) error
|
|
RequestMempoolApi(ctx context.Context, endpoint string) (interface{}, error)
|
|
GetInfo(ctx context.Context) (*InfoResponse, error)
|
|
GetMnemonic(unlockPassword string) (*MnemonicResponse, error)
|
|
SetNextBackupReminder(backupReminderRequest *BackupReminderRequest) error
|
|
Start(startRequest *StartRequest)
|
|
Setup(ctx context.Context, setupRequest *SetupRequest) error
|
|
GetNetworkGraph(ctx context.Context, nodeIds []string) (NetworkGraphResponse, error)
|
|
SyncWallet() error
|
|
GetLogOutput(ctx context.Context, logType string, getLogRequest *GetLogOutputRequest) (*GetLogOutputResponse, error)
|
|
RequestLSPOrder(ctx context.Context, request *LSPOrderRequest) (*LSPOrderResponse, error)
|
|
CreateBackup(unlockPassword string, w io.Writer) error
|
|
RestoreBackup(unlockPassword string, r io.Reader) error
|
|
MigrateNodeStorage(ctx context.Context, to string) error
|
|
GetWalletCapabilities(ctx context.Context) (*WalletCapabilitiesResponse, error)
|
|
Health(ctx context.Context) (*HealthResponse, error)
|
|
UpdateSettings(updateSettingsRequest *UpdateSettingsRequest) error
|
|
LookupSwap(swapId string) (*LookupSwapResponse, error)
|
|
ListSwaps() (*ListSwapsResponse, error)
|
|
GetSwapInInfo() (*SwapInfoResponse, error)
|
|
GetSwapOutInfo() (*SwapInfoResponse, error)
|
|
InitiateSwapIn(ctx context.Context, initiateSwapInRequest *InitiateSwapRequest) (*swaps.SwapResponse, error)
|
|
InitiateSwapOut(ctx context.Context, initiateSwapOutRequest *InitiateSwapRequest) (*swaps.SwapResponse, error)
|
|
RefundSwap(refundSwapRequest *RefundSwapRequest) error
|
|
GetSwapMnemonic() string
|
|
GetAutoSwapConfig() (*GetAutoSwapConfigResponse, error)
|
|
EnableAutoSwapOut(ctx context.Context, autoSwapRequest *EnableAutoSwapRequest) error
|
|
DisableAutoSwap() error
|
|
SetNodeAlias(nodeAlias string) error
|
|
GetCustomNodeCommands() (*CustomNodeCommandsResponse, error)
|
|
ExecuteCustomNodeCommand(ctx context.Context, command string) (interface{}, error)
|
|
SendEvent(event string, properties interface{})
|
|
GetForwards() (*GetForwardsResponse, error)
|
|
}
|
|
|
|
var ErrLNClientNotStarted = errors.New("LNClient not started")
|
|
|
|
type App struct {
|
|
ID uint `json:"id"`
|
|
Name string `json:"name"`
|
|
Description string `json:"description"`
|
|
AppPubkey string `json:"appPubkey"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
UpdatedAt time.Time `json:"updatedAt"`
|
|
LastUsedAt *time.Time `json:"lastUsedAt"`
|
|
LastSettledTransactionAt *time.Time `json:"lastSettledTransactionAt"`
|
|
ExpiresAt *time.Time `json:"expiresAt"`
|
|
Scopes []string `json:"scopes"`
|
|
MaxAmount uint64 `json:"maxAmount"` // deprecated
|
|
MaxAmountSat uint64 `json:"maxAmountSat"`
|
|
MaxAmountMsat uint64 `json:"maxAmountMsat"`
|
|
BudgetUsage uint64 `json:"budgetUsage"` // deprecated
|
|
BudgetUsageSat uint64 `json:"budgetUsageSat"`
|
|
BudgetUsageMsat uint64 `json:"budgetUsageMsat"`
|
|
BudgetRenewal string `json:"budgetRenewal"`
|
|
Isolated bool `json:"isolated"`
|
|
WalletPubkey string `json:"walletPubkey"`
|
|
UniqueWalletPubkey bool `json:"uniqueWalletPubkey"`
|
|
Balance int64 `json:"balance"` // deprecated
|
|
BalanceSat int64 `json:"balanceSat"`
|
|
BalanceMsat int64 `json:"balanceMsat"`
|
|
Metadata Metadata `json:"metadata,omitempty"`
|
|
}
|
|
|
|
type ListAppsFilters struct {
|
|
Name string `json:"name"`
|
|
AppStoreAppId string `json:"appStoreAppId"`
|
|
Unused bool `json:"unused"`
|
|
SubWallets *bool `json:"subWallets"`
|
|
}
|
|
|
|
type ListAppsResponse struct {
|
|
Apps []App `json:"apps"`
|
|
TotalCount uint64 `json:"totalCount"`
|
|
TotalBalance *int64 `json:"totalBalance,omitempty"` // deprecated
|
|
TotalBalanceSat *int64 `json:"totalBalanceSat,omitempty"`
|
|
TotalBalanceMsat *int64 `json:"totalBalanceMsat,omitempty"`
|
|
}
|
|
|
|
type UpdateAppRequest struct {
|
|
Name *string `json:"name"`
|
|
MaxAmount *uint64 `json:"maxAmount"` // deprecated
|
|
MaxAmountSat *uint64 `json:"maxAmountSat"`
|
|
MaxAmountMsat *uint64 `json:"maxAmountMsat"`
|
|
BudgetRenewal *string `json:"budgetRenewal"`
|
|
ExpiresAt *string `json:"expiresAt"`
|
|
UpdateExpiresAt bool `json:"updateExpiresAt"`
|
|
Scopes []string `json:"scopes"`
|
|
Metadata *Metadata `json:"metadata"`
|
|
Isolated *bool `json:"isolated"`
|
|
}
|
|
|
|
type TransferRequest struct {
|
|
AmountSat *uint64 `json:"amountSat"`
|
|
AmountMsat *uint64 `json:"amountMsat"`
|
|
FromAppId *uint `json:"fromAppId"`
|
|
ToAppId *uint `json:"toAppId"`
|
|
Description string `json:"description"`
|
|
}
|
|
|
|
type CreateAppRequest struct {
|
|
Name string `json:"name"`
|
|
Pubkey string `json:"pubkey"`
|
|
MaxAmount *uint64 `json:"maxAmount"` // deprecated
|
|
MaxAmountSat *uint64 `json:"maxAmountSat"`
|
|
MaxAmountMsat *uint64 `json:"maxAmountMsat"`
|
|
BudgetRenewal string `json:"budgetRenewal"`
|
|
ExpiresAt string `json:"expiresAt"`
|
|
Scopes []string `json:"scopes"`
|
|
ReturnTo string `json:"returnTo"`
|
|
Isolated bool `json:"isolated"`
|
|
Metadata Metadata `json:"metadata,omitempty"`
|
|
UnlockPassword string `json:"unlockPassword"`
|
|
}
|
|
|
|
type CreateLightningAddressRequest struct {
|
|
Address string `json:"address"`
|
|
AppId uint `json:"appId"`
|
|
}
|
|
|
|
type InitiateSwapRequest struct {
|
|
SwapAmount *uint64 `json:"swapAmount"` // deprecated
|
|
SwapAmountSat *uint64 `json:"swapAmountSat"`
|
|
Destination string `json:"destination"`
|
|
}
|
|
|
|
type RefundSwapRequest struct {
|
|
SwapId string `json:"swapId"`
|
|
Address string `json:"address"`
|
|
}
|
|
|
|
type EnableAutoSwapRequest struct {
|
|
BalanceThreshold *uint64 `json:"balanceThreshold"` // deprecated
|
|
BalanceThresholdSat *uint64 `json:"balanceThresholdSat"`
|
|
SwapAmount *uint64 `json:"swapAmount"` // deprecated
|
|
SwapAmountSat *uint64 `json:"swapAmountSat"`
|
|
Destination string `json:"destination"`
|
|
DestinationType string `json:"destinationType"`
|
|
UnlockPassword string `json:"unlockPassword"`
|
|
}
|
|
|
|
type GetAutoSwapConfigResponse struct {
|
|
Type string `json:"type"`
|
|
Enabled bool `json:"enabled"`
|
|
BalanceThreshold uint64 `json:"balanceThreshold"` // deprecated
|
|
BalanceThresholdSat uint64 `json:"balanceThresholdSat"`
|
|
SwapAmount uint64 `json:"swapAmount"` // deprecated
|
|
SwapAmountSat uint64 `json:"swapAmountSat"`
|
|
Destination string `json:"destination"`
|
|
}
|
|
|
|
type SwapInfoResponse struct {
|
|
AlbyServiceFee float64 `json:"albyServiceFee"`
|
|
BoltzServiceFee float64 `json:"boltzServiceFee"`
|
|
BoltzNetworkFee uint64 `json:"boltzNetworkFee"` // deprecated
|
|
BoltzNetworkFeeSat uint64 `json:"boltzNetworkFeeSat"`
|
|
MinAmount uint64 `json:"minAmount"` // deprecated
|
|
MinAmountSat uint64 `json:"minAmountSat"`
|
|
MaxAmount uint64 `json:"maxAmount"` // deprecated
|
|
MaxAmountSat uint64 `json:"maxAmountSat"`
|
|
}
|
|
|
|
type ListSwapsResponse struct {
|
|
Swaps []Swap `json:"swaps"`
|
|
}
|
|
|
|
type LookupSwapResponse = Swap
|
|
|
|
type Swap struct {
|
|
Id string `json:"id"`
|
|
Type string `json:"type"`
|
|
State string `json:"state"`
|
|
Invoice string `json:"invoice"`
|
|
SendAmount uint64 `json:"sendAmount"` // deprecated
|
|
SendAmountSat uint64 `json:"sendAmountSat"`
|
|
ReceiveAmount uint64 `json:"receiveAmount"` // deprecated
|
|
ReceiveAmountSat uint64 `json:"receiveAmountSat"`
|
|
PaymentHash string `json:"paymentHash"`
|
|
DestinationAddress string `json:"destinationAddress"`
|
|
RefundAddress string `json:"refundAddress"`
|
|
LockupAddress string `json:"lockupAddress"`
|
|
LockupTxId string `json:"lockupTxId"`
|
|
ClaimTxId string `json:"claimTxId"`
|
|
AutoSwap bool `json:"autoSwap"`
|
|
BoltzPubkey string `json:"boltzPubkey"`
|
|
CreatedAt string `json:"createdAt"`
|
|
UpdatedAt string `json:"updatedAt"`
|
|
UsedXpub bool `json:"usedXpub"`
|
|
}
|
|
|
|
type StartRequest struct {
|
|
UnlockPassword string `json:"unlockPassword"`
|
|
}
|
|
|
|
type UnlockRequest struct {
|
|
UnlockPassword string `json:"unlockPassword"`
|
|
TokenExpiryDays *uint64 `json:"tokenExpiryDays"`
|
|
Permission string `json:"permission,omitempty"` // "full" or "readonly"
|
|
}
|
|
|
|
type BackupReminderRequest struct {
|
|
NextBackupReminder string `json:"nextBackupReminder"`
|
|
}
|
|
|
|
type SendEventRequest struct {
|
|
Event string `json:"event"`
|
|
Properties interface{} `json:"properties"`
|
|
}
|
|
|
|
type SetupRequest struct {
|
|
LNBackendType string `json:"backendType"`
|
|
UnlockPassword string `json:"unlockPassword"`
|
|
|
|
Mnemonic string `json:"mnemonic"`
|
|
NextBackupReminder string `json:"nextBackupReminder"`
|
|
|
|
// LND fields
|
|
LNDAddress string `json:"lndAddress"`
|
|
LNDCertFile string `json:"lndCertFile"`
|
|
LNDMacaroonFile string `json:"lndMacaroonFile"`
|
|
|
|
// Phoenixd fields
|
|
PhoenixdAddress string `json:"phoenixdAddress"`
|
|
PhoenixdAuthorization string `json:"phoenixdAuthorization"`
|
|
|
|
// Cashu fields
|
|
CashuMintUrl string `json:"cashuMintUrl"`
|
|
|
|
// CLN fields
|
|
CLNAddress string `json:"clnAddress"`
|
|
CLNLightningDir string `json:"clnLightningDir"`
|
|
CLNAddressHold string `json:"clnAddressHold"`
|
|
}
|
|
|
|
type CreateAppResponse struct {
|
|
PairingUri string `json:"pairingUri"`
|
|
PairingSecret string `json:"pairingSecretKey"`
|
|
Pubkey string `json:"pairingPublicKey"`
|
|
RelayUrls []string `json:"relayUrls"`
|
|
WalletPubkey string `json:"walletPubkey"`
|
|
Lud16 string `json:"lud16"`
|
|
Id uint `json:"id"`
|
|
Name string `json:"name"`
|
|
ReturnTo string `json:"returnTo"`
|
|
}
|
|
|
|
type User struct {
|
|
Email string `json:"email"`
|
|
}
|
|
|
|
type InfoResponseRelay struct {
|
|
Url string `json:"url"`
|
|
Online bool `json:"online"`
|
|
}
|
|
|
|
type InfoResponse struct {
|
|
BackendType string `json:"backendType"`
|
|
SetupCompleted bool `json:"setupCompleted"`
|
|
OAuthRedirect bool `json:"oauthRedirect"`
|
|
Running bool `json:"running"`
|
|
Unlocked bool `json:"unlocked"`
|
|
AlbyAuthUrl string `json:"albyAuthUrl"`
|
|
NextBackupReminder string `json:"nextBackupReminder"`
|
|
AlbyUserIdentifier string `json:"albyUserIdentifier"`
|
|
AlbyAccountConnected bool `json:"albyAccountConnected"`
|
|
Version string `json:"version"`
|
|
Network string `json:"network"`
|
|
EnableAdvancedSetup bool `json:"enableAdvancedSetup"`
|
|
LdkVssEnabled bool `json:"ldkVssEnabled"`
|
|
LdkVssUrl string `json:"ldkVssUrl"`
|
|
VssSupported bool `json:"vssSupported"`
|
|
DatabaseType string `json:"databaseType"`
|
|
StartupState string `json:"startupState"`
|
|
StartupError string `json:"startupError"`
|
|
StartupErrorTime time.Time `json:"startupErrorTime"`
|
|
AutoUnlockPasswordSupported bool `json:"autoUnlockPasswordSupported"`
|
|
AutoUnlockPasswordEnabled bool `json:"autoUnlockPasswordEnabled"`
|
|
Currency string `json:"currency"`
|
|
BitcoinDisplayFormat string `json:"bitcoinDisplayFormat"`
|
|
Relays []InfoResponseRelay `json:"relays"`
|
|
NodeAlias string `json:"nodeAlias"`
|
|
MempoolUrl string `json:"mempoolUrl"`
|
|
ChainDataSourceType string `json:"chainDataSourceType,omitempty"`
|
|
ChainDataSourceAddress string `json:"chainDataSourceAddress,omitempty"`
|
|
JitChannelsLiquiditySource string `json:"jitChannelsLiquiditySource,omitempty"`
|
|
JitChannelsMinPaymentSizeMsat *uint64 `json:"jitChannelsMinPaymentSizeMsat,omitempty"`
|
|
JitChannelsMaxPaymentSizeMsat *uint64 `json:"jitChannelsMaxPaymentSizeMsat,omitempty"`
|
|
JitChannelsEnabled bool `json:"jitChannelsEnabled"`
|
|
HideUpdateBanner bool `json:"hideUpdateBanner"`
|
|
SupportsBolt12 bool `json:"supportsBolt12"`
|
|
NodeMigrationFileCreated bool `json:"nodeMigrationFileCreated"`
|
|
}
|
|
|
|
type UpdateSettingsRequest struct {
|
|
Currency string `json:"currency"`
|
|
BitcoinDisplayFormat string `json:"bitcoinDisplayFormat"`
|
|
JitChannelsEnabled *bool `json:"jitChannelsEnabled"`
|
|
}
|
|
|
|
type SetNodeAliasRequest struct {
|
|
NodeAlias string `json:"nodeAlias"`
|
|
}
|
|
|
|
type MnemonicRequest struct {
|
|
UnlockPassword string `json:"unlockPassword"`
|
|
}
|
|
|
|
type MnemonicResponse struct {
|
|
Mnemonic string `json:"mnemonic"`
|
|
}
|
|
|
|
type ChangeUnlockPasswordRequest struct {
|
|
CurrentUnlockPassword string `json:"currentUnlockPassword"`
|
|
NewUnlockPassword string `json:"newUnlockPassword"`
|
|
}
|
|
type AutoUnlockRequest struct {
|
|
UnlockPassword string `json:"unlockPassword"`
|
|
}
|
|
|
|
type ConnectPeerRequest struct {
|
|
Pubkey string `json:"pubkey"`
|
|
Address string `json:"address"`
|
|
Port uint16 `json:"port"`
|
|
}
|
|
|
|
type OpenChannelRequest struct {
|
|
Pubkey string `json:"pubkey"`
|
|
AmountSats int64 `json:"amountSats"`
|
|
Public bool `json:"public"`
|
|
}
|
|
|
|
type OpenChannelResponse struct {
|
|
FundingTxId string `json:"fundingTxId"`
|
|
}
|
|
|
|
type CloseChannelResponse struct {
|
|
}
|
|
|
|
type UpdateChannelRequest struct {
|
|
ChannelId string `json:"channelId"`
|
|
NodeId string `json:"nodeId"`
|
|
ForwardingFeeBaseMsat uint32 `json:"forwardingFeeBaseMsat"`
|
|
ForwardingFeeProportionalMillionths uint32 `json:"forwardingFeeProportionalMillionths"`
|
|
MaxDustHtlcExposureFromFeeRateMultiplier uint64 `json:"maxDustHtlcExposureFromFeeRateMultiplier"`
|
|
}
|
|
|
|
type NodeConnectionInfo struct {
|
|
Pubkey string `json:"pubkey"`
|
|
Address string `json:"address"`
|
|
Port int `json:"port"`
|
|
}
|
|
|
|
type NodeStatus struct {
|
|
IsReady bool `json:"isReady"`
|
|
InternalNodeStatus interface{} `json:"internalNodeStatus"`
|
|
}
|
|
|
|
type PeerDetails struct {
|
|
NodeId string `json:"nodeId"`
|
|
Address string `json:"address"`
|
|
IsPersisted bool `json:"isPersisted"`
|
|
IsConnected bool `json:"isConnected"`
|
|
}
|
|
|
|
type OnchainTransaction struct {
|
|
AmountSat uint64 `json:"amountSat"`
|
|
CreatedAt uint64 `json:"createdAt"`
|
|
State string `json:"state"`
|
|
Type string `json:"type"`
|
|
NumConfirmations uint32 `json:"numConfirmations"`
|
|
TxId string `json:"txId"`
|
|
}
|
|
|
|
type PendingBalanceDetails struct {
|
|
ChannelId string `json:"channelId"`
|
|
NodeId string `json:"nodeId"`
|
|
Amount uint64 `json:"amount"` // deprecated
|
|
AmountSat uint64 `json:"amountSat"`
|
|
FundingTxId string `json:"fundingTxId"`
|
|
FundingTxVout uint32 `json:"fundingTxVout"`
|
|
}
|
|
|
|
type RebalanceChannelRequest struct {
|
|
ReceiveThroughNodePubkey string `json:"receiveThroughNodePubkey"`
|
|
AmountSat *uint64 `json:"amountSat"`
|
|
AmountMsat *uint64 `json:"amountMsat"`
|
|
}
|
|
type RebalanceChannelResponse struct {
|
|
TotalFeeSat uint64 `json:"totalFeeSat"`
|
|
TotalFeeMsat uint64 `json:"totalFeeMsat"`
|
|
}
|
|
|
|
type RedeemOnchainFundsRequest struct {
|
|
ToAddress string `json:"toAddress"`
|
|
Amount *uint64 `json:"amount"` // deprecated
|
|
AmountSat *uint64 `json:"amountSat"`
|
|
FeeRate *uint64 `json:"feeRate"`
|
|
SendAll bool `json:"sendAll"`
|
|
}
|
|
|
|
type RedeemOnchainFundsResponse struct {
|
|
TxId string `json:"txId"`
|
|
}
|
|
|
|
type OnchainBalanceResponse struct {
|
|
Spendable int64 `json:"spendable"` // deprecated
|
|
SpendableSat int64 `json:"spendableSat"`
|
|
Total int64 `json:"total"` // deprecated
|
|
TotalSat int64 `json:"totalSat"`
|
|
Reserved int64 `json:"reserved"` // deprecated
|
|
ReservedSat int64 `json:"reservedSat"`
|
|
PendingBalancesFromChannelClosures uint64 `json:"pendingBalancesFromChannelClosures"` // deprecated
|
|
PendingBalancesFromChannelClosuresSat uint64 `json:"pendingBalancesFromChannelClosuresSat"`
|
|
PendingBalancesDetails []PendingBalanceDetails `json:"pendingBalancesDetails"`
|
|
PendingSweepBalancesDetails []PendingBalanceDetails `json:"pendingSweepBalancesDetails"`
|
|
InternalBalances interface{} `json:"internalBalances"`
|
|
}
|
|
|
|
type LightningBalanceResponse struct {
|
|
TotalSpendable int64 `json:"totalSpendable"` // deprecated
|
|
TotalSpendableSat int64 `json:"totalSpendableSat"`
|
|
TotalSpendableMsat int64 `json:"totalSpendableMsat"`
|
|
TotalReceivable int64 `json:"totalReceivable"` // deprecated
|
|
TotalReceivableSat int64 `json:"totalReceivableSat"`
|
|
TotalReceivableMsat int64 `json:"totalReceivableMsat"`
|
|
NextMaxSpendable int64 `json:"nextMaxSpendable"` // deprecated
|
|
NextMaxSpendableSat int64 `json:"nextMaxSpendableSat"`
|
|
NextMaxSpendableMsat int64 `json:"nextMaxSpendableMsat"`
|
|
NextMaxReceivable int64 `json:"nextMaxReceivable"` // deprecated
|
|
NextMaxReceivableSat int64 `json:"nextMaxReceivableSat"`
|
|
NextMaxReceivableMsat int64 `json:"nextMaxReceivableMsat"`
|
|
NextMaxSpendableMPP int64 `json:"nextMaxSpendableMPP"` // deprecated
|
|
NextMaxSpendableMPPSat int64 `json:"nextMaxSpendableMPPSat"`
|
|
NextMaxSpendableMPPMsat int64 `json:"nextMaxSpendableMPPMsat"`
|
|
NextMaxReceivableMPP int64 `json:"nextMaxReceivableMPP"` // deprecated
|
|
NextMaxReceivableMPPSat int64 `json:"nextMaxReceivableMPPSat"`
|
|
NextMaxReceivableMPPMsat int64 `json:"nextMaxReceivableMPPMsat"`
|
|
}
|
|
|
|
type BalancesResponse struct {
|
|
Onchain OnchainBalanceResponse `json:"onchain"`
|
|
Lightning LightningBalanceResponse `json:"lightning"`
|
|
}
|
|
|
|
type SendPaymentResponse = Transaction
|
|
type MakeInvoiceResponse = Transaction
|
|
type LookupInvoiceResponse = Transaction
|
|
|
|
type SetTransactionUserLabelsRequest struct {
|
|
Labels map[string]string `json:"labels"`
|
|
}
|
|
|
|
type ListTransactionsFilters struct {
|
|
Type *string
|
|
MinAmountMsat *uint64
|
|
HideFailed bool
|
|
SearchTerm string
|
|
}
|
|
|
|
type ListTransactionsResponse struct {
|
|
TotalCount uint64 `json:"totalCount"`
|
|
Transactions []Transaction `json:"transactions"`
|
|
}
|
|
|
|
// TODO: camelCase
|
|
type Transaction struct {
|
|
ID uint `json:"id"`
|
|
Type string `json:"type"`
|
|
State string `json:"state"`
|
|
Invoice string `json:"invoice"`
|
|
Description string `json:"description"`
|
|
DescriptionHash string `json:"descriptionHash"`
|
|
Preimage *string `json:"preimage"`
|
|
PaymentHash string `json:"paymentHash"`
|
|
Amount uint64 `json:"amount"` // deprecated
|
|
AmountSat uint64 `json:"amountSat"`
|
|
AmountMsat uint64 `json:"amountMsat"`
|
|
FeesPaid uint64 `json:"feesPaid"` // deprecated
|
|
FeesPaidSat uint64 `json:"feesPaidSat"`
|
|
FeesPaidMsat uint64 `json:"feesPaidMsat"`
|
|
UpdatedAt string `json:"updatedAt"`
|
|
CreatedAt string `json:"createdAt"`
|
|
SettledAt *string `json:"settledAt"`
|
|
AppId *uint `json:"appId"`
|
|
Metadata Metadata `json:"metadata,omitempty"`
|
|
Boostagram *Boostagram `json:"boostagram,omitempty"`
|
|
FailureReason string `json:"failureReason"`
|
|
}
|
|
|
|
type Metadata = map[string]interface{}
|
|
|
|
type Boostagram struct {
|
|
AppName string `json:"appName"`
|
|
Name string `json:"name"`
|
|
Podcast string `json:"podcast"`
|
|
URL string `json:"url"`
|
|
Episode string `json:"episode,omitempty"`
|
|
FeedId string `json:"feedId,omitempty"`
|
|
ItemId string `json:"itemId,omitempty"`
|
|
Timestamp int64 `json:"ts,omitempty"`
|
|
Message string `json:"message,omitempty"`
|
|
SenderId string `json:"senderId"`
|
|
SenderName string `json:"senderName"`
|
|
Time string `json:"time"`
|
|
Action string `json:"action"`
|
|
ValueSatTotal int64 `json:"valueSatTotal"`
|
|
ValueMsatTotal int64 `json:"valueMsatTotal"`
|
|
}
|
|
|
|
const (
|
|
LogTypeNode = "node"
|
|
LogTypeApp = "app"
|
|
)
|
|
|
|
type GetLogOutputRequest struct {
|
|
MaxLen int `query:"maxLen"`
|
|
}
|
|
|
|
type GetLogOutputResponse struct {
|
|
Log string `json:"logs"`
|
|
}
|
|
|
|
type SignMessageRequest struct {
|
|
Message string `json:"message"`
|
|
}
|
|
|
|
type SignMessageResponse struct {
|
|
Message string `json:"message"`
|
|
Signature string `json:"signature"`
|
|
}
|
|
|
|
type PayInvoiceRequest struct {
|
|
Amount *uint64 `json:"amount"` // deprecated
|
|
AmountSat *uint64 `json:"amountSat"`
|
|
AmountMsat *uint64 `json:"amountMsat"`
|
|
Metadata Metadata `json:"metadata"`
|
|
FromAppID *uint `json:"fromAppId"`
|
|
}
|
|
|
|
type MakeOfferRequest struct {
|
|
Description string `json:"description"`
|
|
}
|
|
|
|
type MakeInvoiceRequest struct {
|
|
Amount *uint64 `json:"amount"` // deprecated
|
|
AmountSat *uint64 `json:"amountSat"`
|
|
AmountMsat *uint64 `json:"amountMsat"`
|
|
Description string `json:"description"`
|
|
ToAppID *uint `json:"toAppId"`
|
|
}
|
|
|
|
type ResetRouterRequest struct {
|
|
Key string `json:"key"`
|
|
}
|
|
|
|
type BasicBackupRequest struct {
|
|
UnlockPassword string `json:"unlockPassword"`
|
|
}
|
|
|
|
type BasicRestoreWailsRequest struct {
|
|
UnlockPassword string `json:"unlockPassword"`
|
|
}
|
|
|
|
type NetworkGraphResponse = interface{}
|
|
|
|
type LSPOrderRequest struct {
|
|
Amount *uint64 `json:"amount"` // deprecated
|
|
AmountSat *uint64 `json:"amountSat"`
|
|
LSPType string `json:"lspType"`
|
|
LSPIdentifier string `json:"lspIdentifier"`
|
|
Public bool `json:"public"`
|
|
}
|
|
|
|
type LSPOrderResponse struct {
|
|
Invoice string `json:"invoice"`
|
|
Fee uint64 `json:"fee"` // deprecated
|
|
FeeSat uint64 `json:"feeSat"`
|
|
InvoiceAmount uint64 `json:"invoiceAmount"` // deprecated
|
|
InvoiceAmountSat uint64 `json:"invoiceAmountSat"`
|
|
IncomingLiquidity uint64 `json:"incomingLiquidity"` // deprecated
|
|
IncomingLiquiditySat uint64 `json:"incomingLiquiditySat"`
|
|
OutgoingLiquidity uint64 `json:"outgoingLiquidity"` // deprecated
|
|
OutgoingLiquiditySat uint64 `json:"outgoingLiquiditySat"`
|
|
}
|
|
|
|
type WalletCapabilitiesResponse struct {
|
|
Scopes []string `json:"scopes"`
|
|
Methods []string `json:"methods"`
|
|
NotificationTypes []string `json:"notificationTypes"`
|
|
}
|
|
|
|
type Channel struct {
|
|
LocalBalance int64 `json:"localBalance"` // deprecated
|
|
LocalBalanceSat int64 `json:"localBalanceSat"`
|
|
LocalBalanceMsat int64 `json:"localBalanceMsat"`
|
|
LocalSpendableBalance int64 `json:"localSpendableBalance"` // deprecated
|
|
LocalSpendableBalanceSat int64 `json:"localSpendableBalanceSat"`
|
|
LocalSpendableBalanceMsat int64 `json:"localSpendableBalanceMsat"`
|
|
RemoteBalance int64 `json:"remoteBalance"` // deprecated
|
|
RemoteBalanceSat int64 `json:"remoteBalanceSat"`
|
|
RemoteBalanceMsat int64 `json:"remoteBalanceMsat"`
|
|
Id string `json:"id"`
|
|
RemotePubkey string `json:"remotePubkey"`
|
|
FundingTxId string `json:"fundingTxId"`
|
|
FundingTxVout uint32 `json:"fundingTxVout"`
|
|
Active bool `json:"active"`
|
|
Public bool `json:"public"`
|
|
InternalChannel interface{} `json:"internalChannel"`
|
|
Confirmations *uint32 `json:"confirmations"`
|
|
ConfirmationsRequired *uint32 `json:"confirmationsRequired"`
|
|
ForwardingFeeBaseMsat uint32 `json:"forwardingFeeBaseMsat"` // expressed only in msat as per Lightning spec
|
|
ForwardingFeeProportionalMillionths uint32 `json:"forwardingFeeProportionalMillionths"`
|
|
UnspendablePunishmentReserve uint64 `json:"unspendablePunishmentReserve"` // deprecated
|
|
UnspendablePunishmentReserveSat uint64 `json:"unspendablePunishmentReserveSat"`
|
|
CounterpartyUnspendablePunishmentReserve uint64 `json:"counterpartyUnspendablePunishmentReserve"` // deprecated
|
|
CounterpartyUnspendablePunishmentReserveSat uint64 `json:"counterpartyUnspendablePunishmentReserveSat"`
|
|
Error *string `json:"error"`
|
|
Status string `json:"status"`
|
|
IsOutbound bool `json:"isOutbound"`
|
|
}
|
|
|
|
type MigrateNodeStorageRequest struct {
|
|
To string `json:"to"`
|
|
}
|
|
|
|
type HealthAlarmKind string
|
|
|
|
const (
|
|
HealthAlarmKindAlbyService HealthAlarmKind = "alby_service"
|
|
HealthAlarmKindNodeNotReady HealthAlarmKind = "node_not_ready"
|
|
HealthAlarmKindChannelsOffline HealthAlarmKind = "channels_offline"
|
|
HealthAlarmKindNostrRelayOffline HealthAlarmKind = "nostr_relay_offline"
|
|
HealthAlarmKindVssNoSubscription HealthAlarmKind = "vss_no_subscription"
|
|
)
|
|
|
|
type HealthAlarm struct {
|
|
Kind HealthAlarmKind `json:"kind"`
|
|
RawDetails any `json:"rawDetails,omitempty"`
|
|
}
|
|
|
|
func NewHealthAlarm(kind HealthAlarmKind, rawDetails any) HealthAlarm {
|
|
return HealthAlarm{
|
|
Kind: kind,
|
|
RawDetails: rawDetails,
|
|
}
|
|
}
|
|
|
|
type HealthResponse struct {
|
|
Alarms []HealthAlarm `json:"alarms,omitempty"`
|
|
}
|
|
|
|
type CustomNodeCommandArgDef struct {
|
|
Name string `json:"name"`
|
|
Description string `json:"description"`
|
|
}
|
|
|
|
type CustomNodeCommandDef struct {
|
|
Name string `json:"name"`
|
|
Description string `json:"description"`
|
|
Args []CustomNodeCommandArgDef `json:"args"`
|
|
}
|
|
|
|
type CustomNodeCommandsResponse struct {
|
|
Commands []CustomNodeCommandDef `json:"commands"`
|
|
}
|
|
|
|
type ExecuteCustomNodeCommandRequest struct {
|
|
Command string `json:"command"`
|
|
}
|
|
|
|
type GetForwardsResponse struct {
|
|
OutboundAmountForwardedSat uint64 `json:"outboundAmountForwardedSat"`
|
|
OutboundAmountForwardedMsat uint64 `json:"outboundAmountForwardedMsat"`
|
|
TotalFeeEarnedSat uint64 `json:"totalFeeEarnedSat"`
|
|
TotalFeeEarnedMsat uint64 `json:"totalFeeEarnedMsat"`
|
|
NumForwards uint64 `json:"numForwards"`
|
|
}
|
|
|
|
func ResolveToSat(satValue *uint64, msatValue *uint64, legacyValueSat *uint64, legacyValueMsat *uint64) (resolvedSatValue *uint64) {
|
|
if legacyValueSat != nil {
|
|
resolvedSatValue = legacyValueSat
|
|
}
|
|
|
|
if legacyValueMsat != nil {
|
|
tmpSat := *legacyValueMsat / 1000
|
|
resolvedSatValue = &tmpSat
|
|
}
|
|
|
|
if satValue != nil {
|
|
resolvedSatValue = satValue
|
|
}
|
|
|
|
if msatValue != nil {
|
|
tmpSat := *msatValue / 1000
|
|
resolvedSatValue = &tmpSat
|
|
}
|
|
|
|
return resolvedSatValue
|
|
}
|
|
|
|
func ResolveToMsat(satValue *uint64, msatValue *uint64, legacyValueSat *uint64, legacyValueMsat *uint64) (resolvedMsatValue *uint64) {
|
|
if legacyValueSat != nil {
|
|
tmpMsat := *legacyValueSat * 1000
|
|
resolvedMsatValue = &tmpMsat
|
|
}
|
|
|
|
if legacyValueMsat != nil {
|
|
resolvedMsatValue = legacyValueMsat
|
|
}
|
|
|
|
if satValue != nil {
|
|
tmpMsat := *satValue * 1000
|
|
resolvedMsatValue = &tmpMsat
|
|
}
|
|
|
|
if msatValue != nil {
|
|
resolvedMsatValue = msatValue
|
|
}
|
|
|
|
return resolvedMsatValue
|
|
}
|