diff --git a/env.example b/env.example index 721db7e9..4a709cd8 100644 --- a/env.example +++ b/env.example @@ -44,3 +44,9 @@ MIGRATE_DB=false RECORD_PERFORMANCE=true SKIP_SANITY_CHECK=false DISABLE_EXTERNAL_PAYMENTS=false + +# Max difference between users balance and LND balance since beginning of app execution +WATCHDOG_MAX_DIFF_SATS=10000 + +# Max difference between users balance and LND balance after each payment +WATCHDOG_MAX_UPDATE_DIFF_SATS=1000 \ No newline at end of file diff --git a/proto/autogenerated/client.md b/proto/autogenerated/client.md index 04b78463..e69de29b 100644 --- a/proto/autogenerated/client.md +++ b/proto/autogenerated/client.md @@ -1,825 +0,0 @@ -# NOSTR API DEFINITION - - -A nostr request will take the same parameter and give the same response as an http request, but it will use nostr as transport, to do that it will send encrypted events to the server public key, in the event 6 thing are required: -- __rpcName__: string containing the name of the method -- __params__: a map with the all the url params for the method -- __query__: a map with the the url query for the method -- __body__: the body of the method request -- __requestId__: id of the request to be able to get a response - -The nostr server will send back a message response, and inside the body there will also be a __requestId__ to identify the request this response is answering - -## NOSTR Methods -### These are the nostr methods the client implements to communicate with the API via nostr - -- LinkNPubThroughToken - - auth type: __User__ - - input: [LinkNPubThroughTokenRequest](#LinkNPubThroughTokenRequest) - - This methods has an __empty__ __response__ body - -- UserHealth - - auth type: __User__ - - This methods has an __empty__ __request__ body - - This methods has an __empty__ __response__ body - -- GetUserInfo - - auth type: __User__ - - This methods has an __empty__ __request__ body - - output: [UserInfo](#UserInfo) - -- AddProduct - - auth type: __User__ - - input: [AddProductRequest](#AddProductRequest) - - output: [Product](#Product) - -- NewProductInvoice - - auth type: __User__ - - the request url __query__ can take the following string items: - - id - - This methods has an __empty__ __request__ body - - output: [NewInvoiceResponse](#NewInvoiceResponse) - -- GetUserOperations - - auth type: __User__ - - input: [GetUserOperationsRequest](#GetUserOperationsRequest) - - output: [GetUserOperationsResponse](#GetUserOperationsResponse) - -- NewAddress - - auth type: __User__ - - input: [NewAddressRequest](#NewAddressRequest) - - output: [NewAddressResponse](#NewAddressResponse) - -- PayAddress - - auth type: __User__ - - input: [PayAddressRequest](#PayAddressRequest) - - output: [PayAddressResponse](#PayAddressResponse) - -- NewInvoice - - auth type: __User__ - - input: [NewInvoiceRequest](#NewInvoiceRequest) - - output: [NewInvoiceResponse](#NewInvoiceResponse) - -- DecodeInvoice - - auth type: __User__ - - input: [DecodeInvoiceRequest](#DecodeInvoiceRequest) - - output: [DecodeInvoiceResponse](#DecodeInvoiceResponse) - -- PayInvoice - - auth type: __User__ - - input: [PayInvoiceRequest](#PayInvoiceRequest) - - output: [PayInvoiceResponse](#PayInvoiceResponse) - -- OpenChannel - - auth type: __User__ - - input: [OpenChannelRequest](#OpenChannelRequest) - - output: [OpenChannelResponse](#OpenChannelResponse) - -- GetLnurlWithdrawLink - - auth type: __User__ - - This methods has an __empty__ __request__ body - - output: [LnurlLinkResponse](#LnurlLinkResponse) - -- GetLnurlPayLink - - auth type: __User__ - - This methods has an __empty__ __request__ body - - output: [LnurlLinkResponse](#LnurlLinkResponse) - -- GetLNURLChannelLink - - auth type: __User__ - - This methods has an __empty__ __request__ body - - output: [LnurlLinkResponse](#LnurlLinkResponse) - -- GetLiveUserOperations - - auth type: __User__ - - This methods has an __empty__ __request__ body - - output: [LiveUserOperation](#LiveUserOperation) - -- GetMigrationUpdate - - auth type: __User__ - - This methods has an __empty__ __request__ body - - output: [MigrationUpdate](#MigrationUpdate) - -- BatchUser - - auth type: __User__ - - This methods has an __empty__ __request__ body - - This methods has an __empty__ __response__ body - -# HTTP API DEFINITION - -## Supported HTTP Auths -### These are the supported http auth types, to give different type of access to the API users - -- __Guest__: - - expected context content - -- __User__: - - expected context content - - __user_id__: _string_ - - __app_id__: _string_ - - __app_user_id__: _string_ - -- __Admin__: - - expected context content - - __admin_id__: _string_ - -- __Metrics__: - - expected context content - - __operator_id__: _string_ - -- __App__: - - expected context content - - __app_id__: _string_ - -## HTTP Methods -### These are the http methods the client implements to communicate with the API - -- LndGetInfo - - auth type: __Admin__ - - http method: __post__ - - http route: __/api/admin/lnd/getinfo__ - - input: [LndGetInfoRequest](#LndGetInfoRequest) - - output: [LndGetInfoResponse](#LndGetInfoResponse) - -- AddApp - - auth type: __Admin__ - - http method: __post__ - - http route: __/api/admin/app/add__ - - input: [AddAppRequest](#AddAppRequest) - - output: [AuthApp](#AuthApp) - -- AuthApp - - auth type: __Admin__ - - http method: __post__ - - http route: __/api/admin/app/auth__ - - input: [AuthAppRequest](#AuthAppRequest) - - output: [AuthApp](#AuthApp) - -- GetUsageMetrics - - auth type: __Metrics__ - - http method: __post__ - - http route: __/api/reports/usage__ - - This methods has an __empty__ __request__ body - - output: [UsageMetrics](#UsageMetrics) - -- GetAppsMetrics - - auth type: __Metrics__ - - http method: __post__ - - http route: __/api/reports/apps__ - - input: [AppsMetricsRequest](#AppsMetricsRequest) - - output: [AppsMetrics](#AppsMetrics) - -- GetLndMetrics - - auth type: __Metrics__ - - http method: __post__ - - http route: __/api/reports/lnd__ - - input: [LndMetricsRequest](#LndMetricsRequest) - - output: [LndMetrics](#LndMetrics) - -- Health - - auth type: __Guest__ - - http method: __get__ - - http route: __/api/health__ - - This methods has an __empty__ __request__ body - - This methods has an __empty__ __response__ body - -- EncryptionExchange - - auth type: __Guest__ - - http method: __post__ - - http route: __/api/encryption/exchange__ - - input: [EncryptionExchangeRequest](#EncryptionExchangeRequest) - - This methods has an __empty__ __response__ body - -- SetMockInvoiceAsPaid - - auth type: __Guest__ - - http method: __post__ - - http route: __/api/lnd/mock/invoice/paid__ - - input: [SetMockInvoiceAsPaidRequest](#SetMockInvoiceAsPaidRequest) - - This methods has an __empty__ __response__ body - -- GetLnurlWithdrawInfo - - auth type: __Guest__ - - http method: __get__ - - http route: __/api/guest/lnurl_withdraw/info__ - - the request url __query__ can take the following string items: - - k1 - - This methods has an __empty__ __request__ body - - output: [LnurlWithdrawInfoResponse](#LnurlWithdrawInfoResponse) - -- HandleLnurlWithdraw - - auth type: __Guest__ - - http method: __get__ - - http route: __/api/guest/lnurl_withdraw/handle__ - - the request url __query__ can take the following string items: - - k1 - - pr - - This methods has an __empty__ __request__ body - - This methods has an __empty__ __response__ body - -- GetLnurlPayInfo - - auth type: __Guest__ - - http method: __get__ - - http route: __/api/guest/lnurl_pay/info__ - - the request url __query__ can take the following string items: - - k1 - - This methods has an __empty__ __request__ body - - output: [LnurlPayInfoResponse](#LnurlPayInfoResponse) - -- HandleLnurlPay - - auth type: __Guest__ - - http method: __get__ - - http route: __/api/guest/lnurl_pay/handle__ - - the request url __query__ can take the following string items: - - k1 - - amount - - nostr - - lnurl - - This methods has an __empty__ __request__ body - - output: [HandleLnurlPayResponse](#HandleLnurlPayResponse) - -- HandleLnurlAddress - - auth type: __Guest__ - - http method: __get__ - - http route: __/.well-known/lnurlp/:address_name__ - - the request url __params__ are the following string items: - - address_name - - This methods has an __empty__ __request__ body - - output: [LnurlPayInfoResponse](#LnurlPayInfoResponse) - -- LinkNPubThroughToken - - auth type: __User__ - - http method: __post__ - - http route: __/api/guest/npub/link__ - - input: [LinkNPubThroughTokenRequest](#LinkNPubThroughTokenRequest) - - This methods has an __empty__ __response__ body - -- GetApp - - auth type: __App__ - - http method: __post__ - - http route: __/api/app/get__ - - This methods has an __empty__ __request__ body - - output: [Application](#Application) - -- AddAppUser - - auth type: __App__ - - http method: __post__ - - http route: __/api/app/user/add__ - - input: [AddAppUserRequest](#AddAppUserRequest) - - output: [AppUser](#AppUser) - -- AddAppInvoice - - auth type: __App__ - - http method: __post__ - - http route: __/api/app/add/invoice__ - - input: [AddAppInvoiceRequest](#AddAppInvoiceRequest) - - output: [NewInvoiceResponse](#NewInvoiceResponse) - -- AddAppUserInvoice - - auth type: __App__ - - http method: __post__ - - http route: __/api/app/user/add/invoice__ - - input: [AddAppUserInvoiceRequest](#AddAppUserInvoiceRequest) - - output: [NewInvoiceResponse](#NewInvoiceResponse) - -- GetAppUser - - auth type: __App__ - - http method: __post__ - - http route: __/api/app/user/get__ - - input: [GetAppUserRequest](#GetAppUserRequest) - - output: [AppUser](#AppUser) - -- PayAppUserInvoice - - auth type: __App__ - - http method: __post__ - - http route: __/api/app/invoice/pay__ - - input: [PayAppUserInvoiceRequest](#PayAppUserInvoiceRequest) - - output: [PayInvoiceResponse](#PayInvoiceResponse) - -- SendAppUserToAppUserPayment - - auth type: __App__ - - http method: __post__ - - http route: __/api/app/user/internal/pay__ - - input: [SendAppUserToAppUserPaymentRequest](#SendAppUserToAppUserPaymentRequest) - - This methods has an __empty__ __response__ body - -- SendAppUserToAppPayment - - auth type: __App__ - - http method: __post__ - - http route: __/api/app/internal/pay__ - - input: [SendAppUserToAppPaymentRequest](#SendAppUserToAppPaymentRequest) - - This methods has an __empty__ __response__ body - -- GetAppUserLNURLInfo - - auth type: __App__ - - http method: __post__ - - http route: __/api/app/user/lnurl/pay/info__ - - input: [GetAppUserLNURLInfoRequest](#GetAppUserLNURLInfoRequest) - - output: [LnurlPayInfoResponse](#LnurlPayInfoResponse) - -- SetMockAppUserBalance - - auth type: __App__ - - http method: __post__ - - http route: __/api/app/mock/user/blance/set__ - - input: [SetMockAppUserBalanceRequest](#SetMockAppUserBalanceRequest) - - This methods has an __empty__ __response__ body - -- SetMockAppBalance - - auth type: __App__ - - http method: __post__ - - http route: __/api/app/mock/blance/set__ - - input: [SetMockAppBalanceRequest](#SetMockAppBalanceRequest) - - This methods has an __empty__ __response__ body - -- RequestNPubLinkingToken - - auth type: __App__ - - http method: __post__ - - http route: __/api/app/user/npub/token__ - - input: [RequestNPubLinkingTokenRequest](#RequestNPubLinkingTokenRequest) - - output: [RequestNPubLinkingTokenResponse](#RequestNPubLinkingTokenResponse) - -- UserHealth - - auth type: __User__ - - http method: __post__ - - http route: __/api/user/health__ - - This methods has an __empty__ __request__ body - - This methods has an __empty__ __response__ body - -- GetUserInfo - - auth type: __User__ - - http method: __post__ - - http route: __/api/user/info__ - - This methods has an __empty__ __request__ body - - output: [UserInfo](#UserInfo) - -- AddProduct - - auth type: __User__ - - http method: __post__ - - http route: __/api/user/product/add__ - - input: [AddProductRequest](#AddProductRequest) - - output: [Product](#Product) - -- NewProductInvoice - - auth type: __User__ - - http method: __get__ - - http route: __/api/user/product/get/invoice__ - - the request url __query__ can take the following string items: - - id - - This methods has an __empty__ __request__ body - - output: [NewInvoiceResponse](#NewInvoiceResponse) - -- GetUserOperations - - auth type: __User__ - - http method: __post__ - - http route: __/api/user/operations__ - - input: [GetUserOperationsRequest](#GetUserOperationsRequest) - - output: [GetUserOperationsResponse](#GetUserOperationsResponse) - -- NewAddress - - auth type: __User__ - - http method: __post__ - - http route: __/api/user/chain/new__ - - input: [NewAddressRequest](#NewAddressRequest) - - output: [NewAddressResponse](#NewAddressResponse) - -- PayAddress - - auth type: __User__ - - http method: __post__ - - http route: __/api/user/chain/pay__ - - input: [PayAddressRequest](#PayAddressRequest) - - output: [PayAddressResponse](#PayAddressResponse) - -- NewInvoice - - auth type: __User__ - - http method: __post__ - - http route: __/api/user/invoice/new__ - - input: [NewInvoiceRequest](#NewInvoiceRequest) - - output: [NewInvoiceResponse](#NewInvoiceResponse) - -- DecodeInvoice - - auth type: __User__ - - http method: __post__ - - http route: __/api/user/invoice/decode__ - - input: [DecodeInvoiceRequest](#DecodeInvoiceRequest) - - output: [DecodeInvoiceResponse](#DecodeInvoiceResponse) - -- PayInvoice - - auth type: __User__ - - http method: __post__ - - http route: __/api/user/invoice/pay__ - - input: [PayInvoiceRequest](#PayInvoiceRequest) - - output: [PayInvoiceResponse](#PayInvoiceResponse) - -- OpenChannel - - auth type: __User__ - - http method: __post__ - - http route: __/api/user/open/channel__ - - input: [OpenChannelRequest](#OpenChannelRequest) - - output: [OpenChannelResponse](#OpenChannelResponse) - -- GetLnurlWithdrawLink - - auth type: __User__ - - http method: __get__ - - http route: __/api/user/lnurl_withdraw/link__ - - This methods has an __empty__ __request__ body - - output: [LnurlLinkResponse](#LnurlLinkResponse) - -- GetLnurlPayLink - - auth type: __User__ - - http method: __get__ - - http route: __/api/user/lnurl_pay/link__ - - This methods has an __empty__ __request__ body - - output: [LnurlLinkResponse](#LnurlLinkResponse) - -- GetLNURLChannelLink - - auth type: __User__ - - http method: __post__ - - http route: __/api/user/lnurl_channel/url__ - - This methods has an __empty__ __request__ body - - output: [LnurlLinkResponse](#LnurlLinkResponse) - -- GetLiveUserOperations - - auth type: __User__ - - http method: __post__ - - http route: __/api/user/operations/sub__ - - This methods has an __empty__ __request__ body - - output: [LiveUserOperation](#LiveUserOperation) - -- GetMigrationUpdate - - auth type: __User__ - - http method: __post__ - - http route: __/api/user/migrations/sub__ - - This methods has an __empty__ __request__ body - - output: [MigrationUpdate](#MigrationUpdate) - -- BatchUser - - auth type: __User__ - - http method: __post__ - - http route: __/api/user/batch__ - - This methods has an __empty__ __request__ body - - This methods has an __empty__ __response__ body - -# INPUTS AND OUTPUTS - -## Messages -### The content of requests and response from the methods - -### Application - - __name__: _string_ - - __id__: _string_ - - __balance__: _number_ - - __npub__: _string_ - -### ClosureMigration - - __closes_at_unix__: _number_ - -### LinkNPubThroughTokenRequest - - __token__: _string_ - - __nostr_pub__: _string_ - -### EncryptionExchangeRequest - - __publicKey__: _string_ - - __deviceId__: _string_ - -### UsersInfo - - __total__: _number_ - - __no_balance__: _number_ - - __negative_balance__: _number_ - - __always_been_inactive__: _number_ - - __balance_avg__: _number_ - - __balance_median__: _number_ - -### HandleLnurlPayResponse - - __pr__: _string_ - - __routes__: ARRAY of: _[Empty](#Empty)_ - -### MigrationUpdate - - __closure__: _[ClosureMigration](#ClosureMigration)_ *this field is optional - - __relays__: _[RelaysMigration](#RelaysMigration)_ *this field is optional - -### AppMetrics - - __app__: _[Application](#Application)_ - - __users__: _[UsersInfo](#UsersInfo)_ - - __received__: _number_ - - __spent__: _number_ - - __available__: _number_ - - __fees__: _number_ - - __invoices__: _number_ - - __total_fees__: _number_ - - __operations__: ARRAY of: _[UserOperation](#UserOperation)_ - -### NewInvoiceResponse - - __invoice__: _string_ - -### LndMetrics - - __nodes__: ARRAY of: _[LndNodeMetrics](#LndNodeMetrics)_ - -### AddProductRequest - - __name__: _string_ - - __price_sats__: _number_ - -### PayAddressRequest - - __address__: _string_ - - __amoutSats__: _number_ - - __satsPerVByte__: _number_ - -### UserOperation - - __paidAtUnix__: _number_ - - __type__: _[UserOperationType](#UserOperationType)_ - - __inbound__: _boolean_ - - __amount__: _number_ - - __identifier__: _string_ - - __operationId__: _string_ - - __service_fee__: _number_ - - __network_fee__: _number_ - - __confirmed__: _boolean_ - - __tx_hash__: _string_ - - __internal__: _boolean_ - -### GetUserOperationsResponse - - __latestOutgoingInvoiceOperations__: _[UserOperations](#UserOperations)_ - - __latestIncomingInvoiceOperations__: _[UserOperations](#UserOperations)_ - - __latestOutgoingTxOperations__: _[UserOperations](#UserOperations)_ - - __latestIncomingTxOperations__: _[UserOperations](#UserOperations)_ - - __latestOutgoingUserToUserPayemnts__: _[UserOperations](#UserOperations)_ - - __latestIncomingUserToUserPayemnts__: _[UserOperations](#UserOperations)_ - -### AuthAppRequest - - __name__: _string_ - - __allow_user_creation__: _boolean_ *this field is optional - -### AddAppUserRequest - - __identifier__: _string_ - - __fail_if_exists__: _boolean_ - - __balance__: _number_ - -### SetMockAppBalanceRequest - - __amount__: _number_ - -### DecodeInvoiceResponse - - __amount__: _number_ - -### UserOperations - - __fromIndex__: _number_ - - __toIndex__: _number_ - - __operations__: ARRAY of: _[UserOperation](#UserOperation)_ - -### RelaysMigration - - __relays__: ARRAY of: _string_ - -### LndNodeMetrics - - __channels_balance_events__: ARRAY of: _[ChannelBalanceEvent](#ChannelBalanceEvent)_ - - __chain_balance_events__: ARRAY of: _[ChainBalanceEvent](#ChainBalanceEvent)_ - - __offline_channels__: _number_ - - __online_channels__: _number_ - - __pending_channels__: _number_ - - __closing_channels__: _number_ - - __open_channels__: ARRAY of: _[OpenChannel](#OpenChannel)_ - - __closed_channels__: ARRAY of: _[ClosedChannel](#ClosedChannel)_ - - __channel_routing__: ARRAY of: _[ChannelRouting](#ChannelRouting)_ - -### AddAppUserInvoiceRequest - - __receiver_identifier__: _string_ - - __payer_identifier__: _string_ - - __http_callback_url__: _string_ - - __invoice_req__: _[NewInvoiceRequest](#NewInvoiceRequest)_ - -### ClosedChannel - - __channel_id__: _string_ - - __capacity__: _number_ - - __closed_height__: _number_ - -### AddAppRequest - - __name__: _string_ - - __allow_user_creation__: _boolean_ - -### LnurlLinkResponse - - __lnurl__: _string_ - - __k1__: _string_ - -### UsageMetrics - - __metrics__: ARRAY of: _[UsageMetric](#UsageMetric)_ - -### ChainBalanceEvent - - __block_height__: _number_ - - __confirmed_balance__: _number_ - - __unconfirmed_balance__: _number_ - - __total_balance__: _number_ - -### Product - - __id__: _string_ - - __name__: _string_ - - __price_sats__: _number_ - -### ChannelBalanceEvent - - __block_height__: _number_ - - __channel_id__: _string_ - - __local_balance_sats__: _number_ - - __remote_balance_sats__: _number_ - -### AuthApp - - __app__: _[Application](#Application)_ - - __auth_token__: _string_ - -### AppsMetrics - - __apps__: ARRAY of: _[AppMetrics](#AppMetrics)_ - -### RoutingEvent - - __incoming_channel_id__: _number_ - - __incoming_htlc_id__: _number_ - - __outgoing_channel_id__: _number_ - - __outgoing_htlc_id__: _number_ - - __timestamp_ns__: _number_ - - __event_type__: _string_ - - __incoming_amt_msat__: _number_ - - __outgoing_amt_msat__: _number_ - - __failure_string__: _string_ - - __settled__: _boolean_ - - __offchain__: _boolean_ - - __forward_fail_event__: _boolean_ - -### AddAppInvoiceRequest - - __payer_identifier__: _string_ - - __http_callback_url__: _string_ - - __invoice_req__: _[NewInvoiceRequest](#NewInvoiceRequest)_ - -### LnurlWithdrawInfoResponse - - __tag__: _string_ - - __callback__: _string_ - - __k1__: _string_ - - __defaultDescription__: _string_ - - __minWithdrawable__: _number_ - - __maxWithdrawable__: _number_ - - __balanceCheck__: _string_ - - __payLink__: _string_ - -### LndGetInfoRequest - - __nodeId__: _number_ - -### AppUser - - __identifier__: _string_ - - __info__: _[UserInfo](#UserInfo)_ - - __max_withdrawable__: _number_ - -### PayAppUserInvoiceRequest - - __user_identifier__: _string_ - - __invoice__: _string_ - - __amount__: _number_ - -### OpenChannelRequest - - __destination__: _string_ - - __fundingAmount__: _number_ - - __pushAmount__: _number_ - - __closeAddress__: _string_ - -### LnurlPayInfoResponse - - __tag__: _string_ - - __callback__: _string_ - - __maxSendable__: _number_ - - __minSendable__: _number_ - - __metadata__: _string_ - - __allowsNostr__: _boolean_ - - __nostrPubkey__: _string_ - -### GetProductBuyLinkResponse - - __link__: _string_ - -### Empty - -### ChannelRouting - - __channel_id__: _string_ - - __send_errors__: _number_ - - __receive_errors__: _number_ - - __forward_errors_as_input__: _number_ - - __forward_errors_as_output__: _number_ - - __missed_forward_fee_as_input__: _number_ - - __missed_forward_fee_as_output__: _number_ - - __forward_fee_as_input__: _number_ - - __forward_fee_as_output__: _number_ - - __events_number__: _number_ - -### OpenChannel - - __channel_id__: _string_ - - __capacity__: _number_ - - __active__: _boolean_ - - __lifetime__: _number_ - - __local_balance__: _number_ - - __remote_balance__: _number_ - -### RequestNPubLinkingTokenResponse - - __token__: _string_ - -### SendAppUserToAppPaymentRequest - - __from_user_identifier__: _string_ - - __amount__: _number_ - -### NewInvoiceRequest - - __amountSats__: _number_ - - __memo__: _string_ - -### DecodeInvoiceRequest - - __invoice__: _string_ - -### GetUserOperationsRequest - - __latestIncomingInvoice__: _number_ - - __latestOutgoingInvoice__: _number_ - - __latestIncomingTx__: _number_ - - __latestOutgoingTx__: _number_ - - __latestIncomingUserToUserPayment__: _number_ - - __latestOutgoingUserToUserPayment__: _number_ - - __max_size__: _number_ - -### LiveUserOperation - - __operation__: _[UserOperation](#UserOperation)_ - -### UsageMetric - - __processed_at_ms__: _number_ - - __parsed_in_nano__: _number_ - - __auth_in_nano__: _number_ - - __validate_in_nano__: _number_ - - __handle_in_nano__: _number_ - - __rpc_name__: _string_ - - __batch__: _boolean_ - - __nostr__: _boolean_ - - __batch_size__: _number_ - -### LndMetricsRequest - - __from_unix__: _number_ *this field is optional - - __to_unix__: _number_ *this field is optional - -### GetAppUserRequest - - __user_identifier__: _string_ - -### SendAppUserToAppUserPaymentRequest - - __from_user_identifier__: _string_ - - __to_user_identifier__: _string_ - - __amount__: _number_ - -### PayAddressResponse - - __txId__: _string_ - - __operation_id__: _string_ - - __service_fee__: _number_ - - __network_fee__: _number_ - -### OpenChannelResponse - - __channelId__: _string_ - -### RequestNPubLinkingTokenRequest - - __user_identifier__: _string_ - -### SetMockInvoiceAsPaidRequest - - __invoice__: _string_ - - __amount__: _number_ - -### LndGetInfoResponse - - __alias__: _string_ - -### UserInfo - - __userId__: _string_ - - __balance__: _number_ - - __max_withdrawable__: _number_ - - __user_identifier__: _string_ - -### AppsMetricsRequest - - __from_unix__: _number_ *this field is optional - - __to_unix__: _number_ *this field is optional - - __include_operations__: _boolean_ *this field is optional - -### GetAppUserLNURLInfoRequest - - __user_identifier__: _string_ - - __base_url_override__: _string_ - -### PayInvoiceRequest - - __invoice__: _string_ - - __amount__: _number_ - -### PayInvoiceResponse - - __preimage__: _string_ - - __amount_paid__: _number_ - - __operation_id__: _string_ - - __service_fee__: _number_ - - __network_fee__: _number_ - -### SetMockAppUserBalanceRequest - - __user_identifier__: _string_ - - __amount__: _number_ - -### NewAddressResponse - - __address__: _string_ - -### NewAddressRequest - - __addressType__: _[AddressType](#AddressType)_ -## Enums -### The enumerators used in the messages - -### AddressType - - __WITNESS_PUBKEY_HASH__ - - __NESTED_PUBKEY_HASH__ - - __TAPROOT_PUBKEY__ - -### UserOperationType - - __INCOMING_TX__ - - __OUTGOING_TX__ - - __INCOMING_INVOICE__ - - __OUTGOING_INVOICE__ - - __OUTGOING_USER_TO_USER__ - - __INCOMING_USER_TO_USER__ diff --git a/proto/autogenerated/debug.txt b/proto/autogenerated/debug.txt index 8fe4dddf..e69de29b 100644 --- a/proto/autogenerated/debug.txt +++ b/proto/autogenerated/debug.txt @@ -1,3700 +0,0 @@ -([]*main.Method) (len=44 cap=64) { - (*main.Method)(0xc00023c730)({ - in: (main.MethodMessage) { - name: (string) (len=17) "LndGetInfoRequest", - hasZeroFields: (bool) false - }, - name: (string) (len=10) "LndGetInfo", - out: (main.MethodMessage) { - name: (string) (len=18) "LndGetInfoResponse", - hasZeroFields: (bool) false - }, - opts: (*main.methodOptions)(0xc00007d140)({ - authType: (*main.supportedAuth)(0xc000259fb0)({ - id: (string) (len=5) "admin", - name: (string) (len=5) "Admin", - context: (map[string]string) (len=1) { - (string) (len=8) "admin_id": (string) (len=6) "string" - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=22) "/api/admin/lnd/getinfo", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) false, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023c8c0)({ - in: (main.MethodMessage) { - name: (string) (len=13) "AddAppRequest", - hasZeroFields: (bool) false - }, - name: (string) (len=6) "AddApp", - out: (main.MethodMessage) { - name: (string) (len=7) "AuthApp", - hasZeroFields: (bool) false - }, - opts: (*main.methodOptions)(0xc00007d2c0)({ - authType: (*main.supportedAuth)(0xc0002b6060)({ - id: (string) (len=5) "admin", - name: (string) (len=5) "Admin", - context: (map[string]string) (len=1) { - (string) (len=8) "admin_id": (string) (len=6) "string" - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=18) "/api/admin/app/add", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) false, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023c960)({ - in: (main.MethodMessage) { - name: (string) (len=14) "AuthAppRequest", - hasZeroFields: (bool) false - }, - name: (string) (len=7) "AuthApp", - out: (main.MethodMessage) { - name: (string) (len=7) "AuthApp", - hasZeroFields: (bool) false - }, - opts: (*main.methodOptions)(0xc00007d4a0)({ - authType: (*main.supportedAuth)(0xc0002b60f0)({ - id: (string) (len=5) "admin", - name: (string) (len=5) "Admin", - context: (map[string]string) (len=1) { - (string) (len=8) "admin_id": (string) (len=6) "string" - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=19) "/api/admin/app/auth", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) false, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023c9b0)({ - in: (main.MethodMessage) { - name: (string) (len=5) "Empty", - hasZeroFields: (bool) true - }, - name: (string) (len=15) "GetUsageMetrics", - out: (main.MethodMessage) { - name: (string) (len=12) "UsageMetrics", - hasZeroFields: (bool) false - }, - opts: (*main.methodOptions)(0xc0002b80c0)({ - authType: (*main.supportedAuth)(0xc0002b6180)({ - id: (string) (len=7) "metrics", - name: (string) (len=7) "Metrics", - context: (map[string]string) (len=1) { - (string) (len=11) "operator_id": (string) (len=6) "string" - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=18) "/api/reports/usage", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) false, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023ca00)({ - in: (main.MethodMessage) { - name: (string) (len=18) "AppsMetricsRequest", - hasZeroFields: (bool) false - }, - name: (string) (len=14) "GetAppsMetrics", - out: (main.MethodMessage) { - name: (string) (len=11) "AppsMetrics", - hasZeroFields: (bool) false - }, - opts: (*main.methodOptions)(0xc0002b8240)({ - authType: (*main.supportedAuth)(0xc0002b6210)({ - id: (string) (len=7) "metrics", - name: (string) (len=7) "Metrics", - context: (map[string]string) (len=1) { - (string) (len=11) "operator_id": (string) (len=6) "string" - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=17) "/api/reports/apps", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) false, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023ca50)({ - in: (main.MethodMessage) { - name: (string) (len=17) "LndMetricsRequest", - hasZeroFields: (bool) false - }, - name: (string) (len=13) "GetLndMetrics", - out: (main.MethodMessage) { - name: (string) (len=10) "LndMetrics", - hasZeroFields: (bool) false - }, - opts: (*main.methodOptions)(0xc0002b83c0)({ - authType: (*main.supportedAuth)(0xc0002b62a0)({ - id: (string) (len=7) "metrics", - name: (string) (len=7) "Metrics", - context: (map[string]string) (len=1) { - (string) (len=11) "operator_id": (string) (len=6) "string" - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=16) "/api/reports/lnd", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) false, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023caa0)({ - in: (main.MethodMessage) { - name: (string) (len=5) "Empty", - hasZeroFields: (bool) true - }, - name: (string) (len=6) "Health", - out: (main.MethodMessage) { - name: (string) (len=5) "Empty", - hasZeroFields: (bool) true - }, - opts: (*main.methodOptions)(0xc0002b8540)({ - authType: (*main.supportedAuth)(0xc0002b6330)({ - id: (string) (len=5) "guest", - name: (string) (len=5) "Guest", - context: (map[string]string) { - } - }), - method: (string) (len=3) "get", - route: (main.decodedRoute) { - route: (string) (len=11) "/api/health", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) false, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023caf0)({ - in: (main.MethodMessage) { - name: (string) (len=25) "EncryptionExchangeRequest", - hasZeroFields: (bool) false - }, - name: (string) (len=18) "EncryptionExchange", - out: (main.MethodMessage) { - name: (string) (len=5) "Empty", - hasZeroFields: (bool) true - }, - opts: (*main.methodOptions)(0xc0002b86c0)({ - authType: (*main.supportedAuth)(0xc0002b63f0)({ - id: (string) (len=5) "guest", - name: (string) (len=5) "Guest", - context: (map[string]string) { - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=24) "/api/encryption/exchange", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) false, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023cb40)({ - in: (main.MethodMessage) { - name: (string) (len=27) "SetMockInvoiceAsPaidRequest", - hasZeroFields: (bool) false - }, - name: (string) (len=20) "SetMockInvoiceAsPaid", - out: (main.MethodMessage) { - name: (string) (len=5) "Empty", - hasZeroFields: (bool) true - }, - opts: (*main.methodOptions)(0xc0002b88a0)({ - authType: (*main.supportedAuth)(0xc0002b6480)({ - id: (string) (len=5) "guest", - name: (string) (len=5) "Guest", - context: (map[string]string) { - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=26) "/api/lnd/mock/invoice/paid", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) false, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023cbe0)({ - in: (main.MethodMessage) { - name: (string) (len=5) "Empty", - hasZeroFields: (bool) true - }, - name: (string) (len=20) "GetLnurlWithdrawInfo", - out: (main.MethodMessage) { - name: (string) (len=25) "LnurlWithdrawInfoResponse", - hasZeroFields: (bool) false - }, - opts: (*main.methodOptions)(0xc0002b8c00)({ - authType: (*main.supportedAuth)(0xc0002b65d0)({ - id: (string) (len=5) "guest", - name: (string) (len=5) "Guest", - context: (map[string]string) { - } - }), - method: (string) (len=3) "get", - route: (main.decodedRoute) { - route: (string) (len=30) "/api/guest/lnurl_withdraw/info", - params: ([]string) - }, - query: ([]string) (len=1 cap=1) { - (string) (len=2) "k1" - }, - nostr: (bool) false, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023cc80)({ - in: (main.MethodMessage) { - name: (string) (len=5) "Empty", - hasZeroFields: (bool) true - }, - name: (string) (len=19) "HandleLnurlWithdraw", - out: (main.MethodMessage) { - name: (string) (len=5) "Empty", - hasZeroFields: (bool) true - }, - opts: (*main.methodOptions)(0xc0002b8f60)({ - authType: (*main.supportedAuth)(0xc0002b6720)({ - id: (string) (len=5) "guest", - name: (string) (len=5) "Guest", - context: (map[string]string) { - } - }), - method: (string) (len=3) "get", - route: (main.decodedRoute) { - route: (string) (len=32) "/api/guest/lnurl_withdraw/handle", - params: ([]string) - }, - query: ([]string) (len=2 cap=2) { - (string) (len=2) "k1", - (string) (len=2) "pr" - }, - nostr: (bool) false, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023cd20)({ - in: (main.MethodMessage) { - name: (string) (len=5) "Empty", - hasZeroFields: (bool) true - }, - name: (string) (len=15) "GetLnurlPayInfo", - out: (main.MethodMessage) { - name: (string) (len=20) "LnurlPayInfoResponse", - hasZeroFields: (bool) false - }, - opts: (*main.methodOptions)(0xc0002b92c0)({ - authType: (*main.supportedAuth)(0xc0002b6840)({ - id: (string) (len=5) "guest", - name: (string) (len=5) "Guest", - context: (map[string]string) { - } - }), - method: (string) (len=3) "get", - route: (main.decodedRoute) { - route: (string) (len=25) "/api/guest/lnurl_pay/info", - params: ([]string) - }, - query: ([]string) (len=1 cap=1) { - (string) (len=2) "k1" - }, - nostr: (bool) false, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023cdc0)({ - in: (main.MethodMessage) { - name: (string) (len=5) "Empty", - hasZeroFields: (bool) true - }, - name: (string) (len=14) "HandleLnurlPay", - out: (main.MethodMessage) { - name: (string) (len=22) "HandleLnurlPayResponse", - hasZeroFields: (bool) false - }, - opts: (*main.methodOptions)(0xc0002b9680)({ - authType: (*main.supportedAuth)(0xc0002b6990)({ - id: (string) (len=5) "guest", - name: (string) (len=5) "Guest", - context: (map[string]string) { - } - }), - method: (string) (len=3) "get", - route: (main.decodedRoute) { - route: (string) (len=27) "/api/guest/lnurl_pay/handle", - params: ([]string) - }, - query: ([]string) (len=4 cap=4) { - (string) (len=2) "k1", - (string) (len=6) "amount", - (string) (len=5) "nostr", - (string) (len=5) "lnurl" - }, - nostr: (bool) false, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023ce10)({ - in: (main.MethodMessage) { - name: (string) (len=5) "Empty", - hasZeroFields: (bool) true - }, - name: (string) (len=18) "HandleLnurlAddress", - out: (main.MethodMessage) { - name: (string) (len=20) "LnurlPayInfoResponse", - hasZeroFields: (bool) false - }, - opts: (*main.methodOptions)(0xc0002b9800)({ - authType: (*main.supportedAuth)(0xc0002b6a20)({ - id: (string) (len=5) "guest", - name: (string) (len=5) "Guest", - context: (map[string]string) { - } - }), - method: (string) (len=3) "get", - route: (main.decodedRoute) { - route: (string) (len=33) "/.well-known/lnurlp/:address_name", - params: ([]string) (len=1 cap=1) { - (string) (len=12) "address_name" - } - }, - query: ([]string) , - nostr: (bool) false, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023ceb0)({ - in: (main.MethodMessage) { - name: (string) (len=27) "LinkNPubThroughTokenRequest", - hasZeroFields: (bool) false - }, - name: (string) (len=20) "LinkNPubThroughToken", - out: (main.MethodMessage) { - name: (string) (len=5) "Empty", - hasZeroFields: (bool) true - }, - opts: (*main.methodOptions)(0xc0002b99e0)({ - authType: (*main.supportedAuth)(0xc0002b6ae0)({ - id: (string) (len=4) "user", - name: (string) (len=4) "User", - context: (map[string]string) (len=3) { - (string) (len=11) "app_user_id": (string) (len=6) "string", - (string) (len=7) "user_id": (string) (len=6) "string", - (string) (len=6) "app_id": (string) (len=6) "string" - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=20) "/api/guest/npub/link", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) true, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023cf00)({ - in: (main.MethodMessage) { - name: (string) (len=5) "Empty", - hasZeroFields: (bool) true - }, - name: (string) (len=6) "GetApp", - out: (main.MethodMessage) { - name: (string) (len=11) "Application", - hasZeroFields: (bool) false - }, - opts: (*main.methodOptions)(0xc0002b9b60)({ - authType: (*main.supportedAuth)(0xc0002b6b70)({ - id: (string) (len=3) "app", - name: (string) (len=3) "App", - context: (map[string]string) (len=1) { - (string) (len=6) "app_id": (string) (len=6) "string" - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=12) "/api/app/get", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) false, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023cfa0)({ - in: (main.MethodMessage) { - name: (string) (len=17) "AddAppUserRequest", - hasZeroFields: (bool) false - }, - name: (string) (len=10) "AddAppUser", - out: (main.MethodMessage) { - name: (string) (len=7) "AppUser", - hasZeroFields: (bool) false - }, - opts: (*main.methodOptions)(0xc0002b9ce0)({ - authType: (*main.supportedAuth)(0xc0002b6c00)({ - id: (string) (len=3) "app", - name: (string) (len=3) "App", - context: (map[string]string) (len=1) { - (string) (len=6) "app_id": (string) (len=6) "string" - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=17) "/api/app/user/add", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) false, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023d040)({ - in: (main.MethodMessage) { - name: (string) (len=20) "AddAppInvoiceRequest", - hasZeroFields: (bool) false - }, - name: (string) (len=13) "AddAppInvoice", - out: (main.MethodMessage) { - name: (string) (len=18) "NewInvoiceResponse", - hasZeroFields: (bool) false - }, - opts: (*main.methodOptions)(0xc0002b9e60)({ - authType: (*main.supportedAuth)(0xc0002b6c90)({ - id: (string) (len=3) "app", - name: (string) (len=3) "App", - context: (map[string]string) (len=1) { - (string) (len=6) "app_id": (string) (len=6) "string" - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=20) "/api/app/add/invoice", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) false, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023d090)({ - in: (main.MethodMessage) { - name: (string) (len=24) "AddAppUserInvoiceRequest", - hasZeroFields: (bool) false - }, - name: (string) (len=17) "AddAppUserInvoice", - out: (main.MethodMessage) { - name: (string) (len=18) "NewInvoiceResponse", - hasZeroFields: (bool) false - }, - opts: (*main.methodOptions)(0xc0002c2060)({ - authType: (*main.supportedAuth)(0xc0002b6d20)({ - id: (string) (len=3) "app", - name: (string) (len=3) "App", - context: (map[string]string) (len=1) { - (string) (len=6) "app_id": (string) (len=6) "string" - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=25) "/api/app/user/add/invoice", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) false, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023d130)({ - in: (main.MethodMessage) { - name: (string) (len=17) "GetAppUserRequest", - hasZeroFields: (bool) false - }, - name: (string) (len=10) "GetAppUser", - out: (main.MethodMessage) { - name: (string) (len=7) "AppUser", - hasZeroFields: (bool) false - }, - opts: (*main.methodOptions)(0xc0002c21e0)({ - authType: (*main.supportedAuth)(0xc0002b6db0)({ - id: (string) (len=3) "app", - name: (string) (len=3) "App", - context: (map[string]string) (len=1) { - (string) (len=6) "app_id": (string) (len=6) "string" - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=17) "/api/app/user/get", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) false, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023d1d0)({ - in: (main.MethodMessage) { - name: (string) (len=24) "PayAppUserInvoiceRequest", - hasZeroFields: (bool) false - }, - name: (string) (len=17) "PayAppUserInvoice", - out: (main.MethodMessage) { - name: (string) (len=18) "PayInvoiceResponse", - hasZeroFields: (bool) false - }, - opts: (*main.methodOptions)(0xc0002c2360)({ - authType: (*main.supportedAuth)(0xc0002b6e40)({ - id: (string) (len=3) "app", - name: (string) (len=3) "App", - context: (map[string]string) (len=1) { - (string) (len=6) "app_id": (string) (len=6) "string" - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=20) "/api/app/invoice/pay", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) false, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023d220)({ - in: (main.MethodMessage) { - name: (string) (len=34) "SendAppUserToAppUserPaymentRequest", - hasZeroFields: (bool) false - }, - name: (string) (len=27) "SendAppUserToAppUserPayment", - out: (main.MethodMessage) { - name: (string) (len=5) "Empty", - hasZeroFields: (bool) true - }, - opts: (*main.methodOptions)(0xc0002c2540)({ - authType: (*main.supportedAuth)(0xc0002b6ed0)({ - id: (string) (len=3) "app", - name: (string) (len=3) "App", - context: (map[string]string) (len=1) { - (string) (len=6) "app_id": (string) (len=6) "string" - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=26) "/api/app/user/internal/pay", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) false, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023d2c0)({ - in: (main.MethodMessage) { - name: (string) (len=30) "SendAppUserToAppPaymentRequest", - hasZeroFields: (bool) false - }, - name: (string) (len=23) "SendAppUserToAppPayment", - out: (main.MethodMessage) { - name: (string) (len=5) "Empty", - hasZeroFields: (bool) true - }, - opts: (*main.methodOptions)(0xc0002c26c0)({ - authType: (*main.supportedAuth)(0xc0002b6f60)({ - id: (string) (len=3) "app", - name: (string) (len=3) "App", - context: (map[string]string) (len=1) { - (string) (len=6) "app_id": (string) (len=6) "string" - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=21) "/api/app/internal/pay", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) false, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023d310)({ - in: (main.MethodMessage) { - name: (string) (len=26) "GetAppUserLNURLInfoRequest", - hasZeroFields: (bool) false - }, - name: (string) (len=19) "GetAppUserLNURLInfo", - out: (main.MethodMessage) { - name: (string) (len=20) "LnurlPayInfoResponse", - hasZeroFields: (bool) false - }, - opts: (*main.methodOptions)(0xc0002c2840)({ - authType: (*main.supportedAuth)(0xc0002b6ff0)({ - id: (string) (len=3) "app", - name: (string) (len=3) "App", - context: (map[string]string) (len=1) { - (string) (len=6) "app_id": (string) (len=6) "string" - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=28) "/api/app/user/lnurl/pay/info", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) false, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023d360)({ - in: (main.MethodMessage) { - name: (string) (len=28) "SetMockAppUserBalanceRequest", - hasZeroFields: (bool) false - }, - name: (string) (len=21) "SetMockAppUserBalance", - out: (main.MethodMessage) { - name: (string) (len=5) "Empty", - hasZeroFields: (bool) true - }, - opts: (*main.methodOptions)(0xc0002c29c0)({ - authType: (*main.supportedAuth)(0xc0002b7080)({ - id: (string) (len=3) "app", - name: (string) (len=3) "App", - context: (map[string]string) (len=1) { - (string) (len=6) "app_id": (string) (len=6) "string" - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=29) "/api/app/mock/user/blance/set", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) false, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023d3b0)({ - in: (main.MethodMessage) { - name: (string) (len=24) "SetMockAppBalanceRequest", - hasZeroFields: (bool) false - }, - name: (string) (len=17) "SetMockAppBalance", - out: (main.MethodMessage) { - name: (string) (len=5) "Empty", - hasZeroFields: (bool) true - }, - opts: (*main.methodOptions)(0xc0002c2ba0)({ - authType: (*main.supportedAuth)(0xc0002b7110)({ - id: (string) (len=3) "app", - name: (string) (len=3) "App", - context: (map[string]string) (len=1) { - (string) (len=6) "app_id": (string) (len=6) "string" - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=24) "/api/app/mock/blance/set", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) false, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023d400)({ - in: (main.MethodMessage) { - name: (string) (len=30) "RequestNPubLinkingTokenRequest", - hasZeroFields: (bool) false - }, - name: (string) (len=23) "RequestNPubLinkingToken", - out: (main.MethodMessage) { - name: (string) (len=31) "RequestNPubLinkingTokenResponse", - hasZeroFields: (bool) false - }, - opts: (*main.methodOptions)(0xc0002c2d80)({ - authType: (*main.supportedAuth)(0xc0002b71a0)({ - id: (string) (len=3) "app", - name: (string) (len=3) "App", - context: (map[string]string) (len=1) { - (string) (len=6) "app_id": (string) (len=6) "string" - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=24) "/api/app/user/npub/token", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) false, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023d450)({ - in: (main.MethodMessage) { - name: (string) (len=5) "Empty", - hasZeroFields: (bool) true - }, - name: (string) (len=10) "UserHealth", - out: (main.MethodMessage) { - name: (string) (len=5) "Empty", - hasZeroFields: (bool) true - }, - opts: (*main.methodOptions)(0xc0002c2f60)({ - authType: (*main.supportedAuth)(0xc0002b7230)({ - id: (string) (len=4) "user", - name: (string) (len=4) "User", - context: (map[string]string) (len=3) { - (string) (len=7) "user_id": (string) (len=6) "string", - (string) (len=6) "app_id": (string) (len=6) "string", - (string) (len=11) "app_user_id": (string) (len=6) "string" - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=16) "/api/user/health", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) true, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023d4a0)({ - in: (main.MethodMessage) { - name: (string) (len=5) "Empty", - hasZeroFields: (bool) true - }, - name: (string) (len=11) "GetUserInfo", - out: (main.MethodMessage) { - name: (string) (len=8) "UserInfo", - hasZeroFields: (bool) false - }, - opts: (*main.methodOptions)(0xc0002c3140)({ - authType: (*main.supportedAuth)(0xc0002b72c0)({ - id: (string) (len=4) "user", - name: (string) (len=4) "User", - context: (map[string]string) (len=3) { - (string) (len=7) "user_id": (string) (len=6) "string", - (string) (len=6) "app_id": (string) (len=6) "string", - (string) (len=11) "app_user_id": (string) (len=6) "string" - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=14) "/api/user/info", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) true, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023d540)({ - in: (main.MethodMessage) { - name: (string) (len=17) "AddProductRequest", - hasZeroFields: (bool) false - }, - name: (string) (len=10) "AddProduct", - out: (main.MethodMessage) { - name: (string) (len=7) "Product", - hasZeroFields: (bool) false - }, - opts: (*main.methodOptions)(0xc0002c3320)({ - authType: (*main.supportedAuth)(0xc0002b7350)({ - id: (string) (len=4) "user", - name: (string) (len=4) "User", - context: (map[string]string) (len=3) { - (string) (len=7) "user_id": (string) (len=6) "string", - (string) (len=6) "app_id": (string) (len=6) "string", - (string) (len=11) "app_user_id": (string) (len=6) "string" - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=21) "/api/user/product/add", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) true, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023d590)({ - in: (main.MethodMessage) { - name: (string) (len=5) "Empty", - hasZeroFields: (bool) true - }, - name: (string) (len=17) "NewProductInvoice", - out: (main.MethodMessage) { - name: (string) (len=18) "NewInvoiceResponse", - hasZeroFields: (bool) false - }, - opts: (*main.methodOptions)(0xc0002c37a0)({ - authType: (*main.supportedAuth)(0xc0002b7470)({ - id: (string) (len=4) "user", - name: (string) (len=4) "User", - context: (map[string]string) (len=3) { - (string) (len=7) "user_id": (string) (len=6) "string", - (string) (len=6) "app_id": (string) (len=6) "string", - (string) (len=11) "app_user_id": (string) (len=6) "string" - } - }), - method: (string) (len=3) "get", - route: (main.decodedRoute) { - route: (string) (len=29) "/api/user/product/get/invoice", - params: ([]string) - }, - query: ([]string) (len=1 cap=1) { - (string) (len=2) "id" - }, - nostr: (bool) true, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023d5e0)({ - in: (main.MethodMessage) { - name: (string) (len=24) "GetUserOperationsRequest", - hasZeroFields: (bool) false - }, - name: (string) (len=17) "GetUserOperations", - out: (main.MethodMessage) { - name: (string) (len=25) "GetUserOperationsResponse", - hasZeroFields: (bool) false - }, - opts: (*main.methodOptions)(0xc0002c3980)({ - authType: (*main.supportedAuth)(0xc0002b7500)({ - id: (string) (len=4) "user", - name: (string) (len=4) "User", - context: (map[string]string) (len=3) { - (string) (len=7) "user_id": (string) (len=6) "string", - (string) (len=6) "app_id": (string) (len=6) "string", - (string) (len=11) "app_user_id": (string) (len=6) "string" - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=20) "/api/user/operations", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) true, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023d680)({ - in: (main.MethodMessage) { - name: (string) (len=17) "NewAddressRequest", - hasZeroFields: (bool) false - }, - name: (string) (len=10) "NewAddress", - out: (main.MethodMessage) { - name: (string) (len=18) "NewAddressResponse", - hasZeroFields: (bool) false - }, - opts: (*main.methodOptions)(0xc0002c3b60)({ - authType: (*main.supportedAuth)(0xc0002b7590)({ - id: (string) (len=4) "user", - name: (string) (len=4) "User", - context: (map[string]string) (len=3) { - (string) (len=7) "user_id": (string) (len=6) "string", - (string) (len=6) "app_id": (string) (len=6) "string", - (string) (len=11) "app_user_id": (string) (len=6) "string" - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=19) "/api/user/chain/new", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) true, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023d720)({ - in: (main.MethodMessage) { - name: (string) (len=17) "PayAddressRequest", - hasZeroFields: (bool) false - }, - name: (string) (len=10) "PayAddress", - out: (main.MethodMessage) { - name: (string) (len=18) "PayAddressResponse", - hasZeroFields: (bool) false - }, - opts: (*main.methodOptions)(0xc0002c3d40)({ - authType: (*main.supportedAuth)(0xc0002b7620)({ - id: (string) (len=4) "user", - name: (string) (len=4) "User", - context: (map[string]string) (len=3) { - (string) (len=7) "user_id": (string) (len=6) "string", - (string) (len=6) "app_id": (string) (len=6) "string", - (string) (len=11) "app_user_id": (string) (len=6) "string" - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=19) "/api/user/chain/pay", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) true, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023d7c0)({ - in: (main.MethodMessage) { - name: (string) (len=17) "NewInvoiceRequest", - hasZeroFields: (bool) false - }, - name: (string) (len=10) "NewInvoice", - out: (main.MethodMessage) { - name: (string) (len=18) "NewInvoiceResponse", - hasZeroFields: (bool) false - }, - opts: (*main.methodOptions)(0xc0002c3f20)({ - authType: (*main.supportedAuth)(0xc0002b76b0)({ - id: (string) (len=4) "user", - name: (string) (len=4) "User", - context: (map[string]string) (len=3) { - (string) (len=7) "user_id": (string) (len=6) "string", - (string) (len=6) "app_id": (string) (len=6) "string", - (string) (len=11) "app_user_id": (string) (len=6) "string" - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=21) "/api/user/invoice/new", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) true, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023d860)({ - in: (main.MethodMessage) { - name: (string) (len=20) "DecodeInvoiceRequest", - hasZeroFields: (bool) false - }, - name: (string) (len=13) "DecodeInvoice", - out: (main.MethodMessage) { - name: (string) (len=21) "DecodeInvoiceResponse", - hasZeroFields: (bool) false - }, - opts: (*main.methodOptions)(0xc0002c6120)({ - authType: (*main.supportedAuth)(0xc0002b7740)({ - id: (string) (len=4) "user", - name: (string) (len=4) "User", - context: (map[string]string) (len=3) { - (string) (len=7) "user_id": (string) (len=6) "string", - (string) (len=6) "app_id": (string) (len=6) "string", - (string) (len=11) "app_user_id": (string) (len=6) "string" - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=24) "/api/user/invoice/decode", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) true, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023d900)({ - in: (main.MethodMessage) { - name: (string) (len=17) "PayInvoiceRequest", - hasZeroFields: (bool) false - }, - name: (string) (len=10) "PayInvoice", - out: (main.MethodMessage) { - name: (string) (len=18) "PayInvoiceResponse", - hasZeroFields: (bool) false - }, - opts: (*main.methodOptions)(0xc0002c6300)({ - authType: (*main.supportedAuth)(0xc0002b77d0)({ - id: (string) (len=4) "user", - name: (string) (len=4) "User", - context: (map[string]string) (len=3) { - (string) (len=7) "user_id": (string) (len=6) "string", - (string) (len=6) "app_id": (string) (len=6) "string", - (string) (len=11) "app_user_id": (string) (len=6) "string" - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=21) "/api/user/invoice/pay", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) true, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023d9a0)({ - in: (main.MethodMessage) { - name: (string) (len=18) "OpenChannelRequest", - hasZeroFields: (bool) false - }, - name: (string) (len=11) "OpenChannel", - out: (main.MethodMessage) { - name: (string) (len=19) "OpenChannelResponse", - hasZeroFields: (bool) false - }, - opts: (*main.methodOptions)(0xc0002c64e0)({ - authType: (*main.supportedAuth)(0xc0002b7860)({ - id: (string) (len=4) "user", - name: (string) (len=4) "User", - context: (map[string]string) (len=3) { - (string) (len=11) "app_user_id": (string) (len=6) "string", - (string) (len=7) "user_id": (string) (len=6) "string", - (string) (len=6) "app_id": (string) (len=6) "string" - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=22) "/api/user/open/channel", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) true, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023da40)({ - in: (main.MethodMessage) { - name: (string) (len=5) "Empty", - hasZeroFields: (bool) true - }, - name: (string) (len=20) "GetLnurlWithdrawLink", - out: (main.MethodMessage) { - name: (string) (len=17) "LnurlLinkResponse", - hasZeroFields: (bool) false - }, - opts: (*main.methodOptions)(0xc0002c66c0)({ - authType: (*main.supportedAuth)(0xc0002b78f0)({ - id: (string) (len=4) "user", - name: (string) (len=4) "User", - context: (map[string]string) (len=3) { - (string) (len=7) "user_id": (string) (len=6) "string", - (string) (len=6) "app_id": (string) (len=6) "string", - (string) (len=11) "app_user_id": (string) (len=6) "string" - } - }), - method: (string) (len=3) "get", - route: (main.decodedRoute) { - route: (string) (len=29) "/api/user/lnurl_withdraw/link", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) true, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023dae0)({ - in: (main.MethodMessage) { - name: (string) (len=5) "Empty", - hasZeroFields: (bool) true - }, - name: (string) (len=15) "GetLnurlPayLink", - out: (main.MethodMessage) { - name: (string) (len=17) "LnurlLinkResponse", - hasZeroFields: (bool) false - }, - opts: (*main.methodOptions)(0xc0002c68a0)({ - authType: (*main.supportedAuth)(0xc0002b7980)({ - id: (string) (len=4) "user", - name: (string) (len=4) "User", - context: (map[string]string) (len=3) { - (string) (len=11) "app_user_id": (string) (len=6) "string", - (string) (len=7) "user_id": (string) (len=6) "string", - (string) (len=6) "app_id": (string) (len=6) "string" - } - }), - method: (string) (len=3) "get", - route: (main.decodedRoute) { - route: (string) (len=24) "/api/user/lnurl_pay/link", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) true, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023db80)({ - in: (main.MethodMessage) { - name: (string) (len=5) "Empty", - hasZeroFields: (bool) true - }, - name: (string) (len=19) "GetLNURLChannelLink", - out: (main.MethodMessage) { - name: (string) (len=17) "LnurlLinkResponse", - hasZeroFields: (bool) false - }, - opts: (*main.methodOptions)(0xc0002c6a80)({ - authType: (*main.supportedAuth)(0xc0002b7a10)({ - id: (string) (len=4) "user", - name: (string) (len=4) "User", - context: (map[string]string) (len=3) { - (string) (len=7) "user_id": (string) (len=6) "string", - (string) (len=6) "app_id": (string) (len=6) "string", - (string) (len=11) "app_user_id": (string) (len=6) "string" - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=27) "/api/user/lnurl_channel/url", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) true, - batch: (bool) false - }), - serverStream: (bool) false - }), - (*main.Method)(0xc00023dc20)({ - in: (main.MethodMessage) { - name: (string) (len=5) "Empty", - hasZeroFields: (bool) true - }, - name: (string) (len=21) "GetLiveUserOperations", - out: (main.MethodMessage) { - name: (string) (len=17) "LiveUserOperation", - hasZeroFields: (bool) false - }, - opts: (*main.methodOptions)(0xc0002c6c60)({ - authType: (*main.supportedAuth)(0xc0002b7aa0)({ - id: (string) (len=4) "user", - name: (string) (len=4) "User", - context: (map[string]string) (len=3) { - (string) (len=7) "user_id": (string) (len=6) "string", - (string) (len=6) "app_id": (string) (len=6) "string", - (string) (len=11) "app_user_id": (string) (len=6) "string" - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=24) "/api/user/operations/sub", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) true, - batch: (bool) false - }), - serverStream: (bool) true - }), - (*main.Method)(0xc00023dcc0)({ - in: (main.MethodMessage) { - name: (string) (len=5) "Empty", - hasZeroFields: (bool) true - }, - name: (string) (len=18) "GetMigrationUpdate", - out: (main.MethodMessage) { - name: (string) (len=15) "MigrationUpdate", - hasZeroFields: (bool) false - }, - opts: (*main.methodOptions)(0xc0002c6e40)({ - authType: (*main.supportedAuth)(0xc0002b7b30)({ - id: (string) (len=4) "user", - name: (string) (len=4) "User", - context: (map[string]string) (len=3) { - (string) (len=7) "user_id": (string) (len=6) "string", - (string) (len=6) "app_id": (string) (len=6) "string", - (string) (len=11) "app_user_id": (string) (len=6) "string" - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=24) "/api/user/migrations/sub", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) true, - batch: (bool) false - }), - serverStream: (bool) true - }), - (*main.Method)(0xc00023dd10)({ - in: (main.MethodMessage) { - name: (string) (len=5) "Empty", - hasZeroFields: (bool) true - }, - name: (string) (len=9) "BatchUser", - out: (main.MethodMessage) { - name: (string) (len=5) "Empty", - hasZeroFields: (bool) true - }, - opts: (*main.methodOptions)(0xc0002c7080)({ - authType: (*main.supportedAuth)(0xc0002b7bf0)({ - id: (string) (len=4) "user", - name: (string) (len=4) "User", - context: (map[string]string) (len=3) { - (string) (len=6) "app_id": (string) (len=6) "string", - (string) (len=11) "app_user_id": (string) (len=6) "string", - (string) (len=7) "user_id": (string) (len=6) "string" - } - }), - method: (string) (len=4) "post", - route: (main.decodedRoute) { - route: (string) (len=15) "/api/user/batch", - params: ([]string) - }, - query: ([]string) , - nostr: (bool) true, - batch: (bool) true - }), - serverStream: (bool) false - }) -} - -([]*main.Enum) (len=2 cap=2) { - (*main.Enum)(0xc000259680)({ - name: (string) (len=11) "AddressType", - values: ([]main.EnumValue) (len=3 cap=4) { - (main.EnumValue) { - number: (int64) 0, - name: (string) (len=19) "WITNESS_PUBKEY_HASH" - }, - (main.EnumValue) { - number: (int64) 1, - name: (string) (len=18) "NESTED_PUBKEY_HASH" - }, - (main.EnumValue) { - number: (int64) 2, - name: (string) (len=14) "TAPROOT_PUBKEY" - } - } - }), - (*main.Enum)(0xc0002596e0)({ - name: (string) (len=17) "UserOperationType", - values: ([]main.EnumValue) (len=6 cap=8) { - (main.EnumValue) { - number: (int64) 0, - name: (string) (len=11) "INCOMING_TX" - }, - (main.EnumValue) { - number: (int64) 1, - name: (string) (len=11) "OUTGOING_TX" - }, - (main.EnumValue) { - number: (int64) 2, - name: (string) (len=16) "INCOMING_INVOICE" - }, - (main.EnumValue) { - number: (int64) 3, - name: (string) (len=16) "OUTGOING_INVOICE" - }, - (main.EnumValue) { - number: (int64) 4, - name: (string) (len=21) "OUTGOING_USER_TO_USER" - }, - (main.EnumValue) { - number: (int64) 5, - name: (string) (len=21) "INCOMING_USER_TO_USER" - } - } - }) -} - -(map[string]*main.Message) (len=66) { - (string) (len=27) "SetMockInvoiceAsPaidRequest": (*main.Message)(0xc0001cb9c0)({ - fullName: (string) (len=27) "SetMockInvoiceAsPaidRequest", - name: (string) (len=27) "SetMockInvoiceAsPaidRequest", - fields: ([]*main.Field) (len=2 cap=2) { - (*main.Field)(0xc00044fda0)({ - name: (string) (len=7) "invoice", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044fdd0)({ - name: (string) (len=6) "amount", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=18) "LndGetInfoResponse": (*main.Message)(0xc0001cba00)({ - fullName: (string) (len=18) "LndGetInfoResponse", - name: (string) (len=18) "LndGetInfoResponse", - fields: ([]*main.Field) (len=1 cap=1) { - (*main.Field)(0xc00044fe00)({ - name: (string) (len=5) "alias", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=17) "GetAppUserRequest": (*main.Message)(0xc0001cbc40)({ - fullName: (string) (len=17) "GetAppUserRequest", - name: (string) (len=17) "GetAppUserRequest", - fields: ([]*main.Field) (len=1 cap=1) { - (*main.Field)(0xc0002582a0)({ - name: (string) (len=15) "user_identifier", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=34) "SendAppUserToAppUserPaymentRequest": (*main.Message)(0xc0001cbcc0)({ - fullName: (string) (len=34) "SendAppUserToAppUserPaymentRequest", - name: (string) (len=34) "SendAppUserToAppUserPaymentRequest", - fields: ([]*main.Field) (len=3 cap=4) { - (*main.Field)(0xc000258360)({ - name: (string) (len=20) "from_user_identifier", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258390)({ - name: (string) (len=18) "to_user_identifier", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc0002583c0)({ - name: (string) (len=6) "amount", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=18) "PayAddressResponse": (*main.Message)(0xc0001cbec0)({ - fullName: (string) (len=18) "PayAddressResponse", - name: (string) (len=18) "PayAddressResponse", - fields: ([]*main.Field) (len=4 cap=4) { - (*main.Field)(0xc000258630)({ - name: (string) (len=4) "txId", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258660)({ - name: (string) (len=12) "operation_id", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258690)({ - name: (string) (len=11) "service_fee", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc0002586c0)({ - name: (string) (len=11) "network_fee", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=19) "OpenChannelResponse": (*main.Message)(0xc000038400)({ - fullName: (string) (len=19) "OpenChannelResponse", - name: (string) (len=19) "OpenChannelResponse", - fields: ([]*main.Field) (len=1 cap=1) { - (*main.Field)(0xc0002589f0)({ - name: (string) (len=9) "channelId", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=30) "RequestNPubLinkingTokenRequest": (*main.Message)(0xc000038e00)({ - fullName: (string) (len=30) "RequestNPubLinkingTokenRequest", - name: (string) (len=30) "RequestNPubLinkingTokenRequest", - fields: ([]*main.Field) (len=1 cap=1) { - (*main.Field)(0xc000259590)({ - name: (string) (len=15) "user_identifier", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=18) "AppsMetricsRequest": (*main.Message)(0xc0001cb340)({ - fullName: (string) (len=18) "AppsMetricsRequest", - name: (string) (len=18) "AppsMetricsRequest", - fields: ([]*main.Field) (len=3 cap=4) { - (*main.Field)(0xc00044f050)({ - name: (string) (len=9) "from_unix", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) true - }), - (*main.Field)(0xc00044f080)({ - name: (string) (len=7) "to_unix", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) true - }), - (*main.Field)(0xc00044f0b0)({ - name: (string) (len=18) "include_operations", - kind: (string) (len=4) "bool", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) true - }) - } - }), - (string) (len=26) "GetAppUserLNURLInfoRequest": (*main.Message)(0xc0001cbd40)({ - fullName: (string) (len=26) "GetAppUserLNURLInfoRequest", - name: (string) (len=26) "GetAppUserLNURLInfoRequest", - fields: ([]*main.Field) (len=2 cap=2) { - (*main.Field)(0xc000258450)({ - name: (string) (len=15) "user_identifier", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258480)({ - name: (string) (len=17) "base_url_override", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=8) "UserInfo": (*main.Message)(0xc000038880)({ - fullName: (string) (len=8) "UserInfo", - name: (string) (len=8) "UserInfo", - fields: ([]*main.Field) (len=4 cap=4) { - (*main.Field)(0xc000258db0)({ - name: (string) (len=6) "userId", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258de0)({ - name: (string) (len=7) "balance", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258e10)({ - name: (string) (len=16) "max_withdrawable", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258e40)({ - name: (string) (len=15) "user_identifier", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=28) "SetMockAppUserBalanceRequest": (*main.Message)(0xc0001cbd80)({ - fullName: (string) (len=28) "SetMockAppUserBalanceRequest", - name: (string) (len=28) "SetMockAppUserBalanceRequest", - fields: ([]*main.Field) (len=2 cap=2) { - (*main.Field)(0xc0002584b0)({ - name: (string) (len=15) "user_identifier", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc0002584e0)({ - name: (string) (len=6) "amount", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=18) "NewAddressResponse": (*main.Message)(0xc0001cbe40)({ - fullName: (string) (len=18) "NewAddressResponse", - name: (string) (len=18) "NewAddressResponse", - fields: ([]*main.Field) (len=1 cap=1) { - (*main.Field)(0xc000258570)({ - name: (string) (len=7) "address", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=17) "PayInvoiceRequest": (*main.Message)(0xc000038040)({ - fullName: (string) (len=17) "PayInvoiceRequest", - name: (string) (len=17) "PayInvoiceRequest", - fields: ([]*main.Field) (len=2 cap=2) { - (*main.Field)(0xc0002587e0)({ - name: (string) (len=7) "invoice", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258810)({ - name: (string) (len=6) "amount", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=18) "PayInvoiceResponse": (*main.Message)(0xc0000380c0)({ - fullName: (string) (len=18) "PayInvoiceResponse", - name: (string) (len=18) "PayInvoiceResponse", - fields: ([]*main.Field) (len=5 cap=8) { - (*main.Field)(0xc000258840)({ - name: (string) (len=8) "preimage", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258870)({ - name: (string) (len=11) "amount_paid", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc0002588a0)({ - name: (string) (len=12) "operation_id", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc0002588d0)({ - name: (string) (len=11) "service_fee", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258900)({ - name: (string) (len=11) "network_fee", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=17) "NewAddressRequest": (*main.Message)(0xc0001cbe00)({ - fullName: (string) (len=17) "NewAddressRequest", - name: (string) (len=17) "NewAddressRequest", - fields: ([]*main.Field) (len=1 cap=1) { - (*main.Field)(0xc000258540)({ - name: (string) (len=11) "addressType", - kind: (string) (len=11) "AddressType", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) true, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=25) "EncryptionExchangeRequest": (*main.Message)(0xc0001cb080)({ - fullName: (string) (len=25) "EncryptionExchangeRequest", - name: (string) (len=25) "EncryptionExchangeRequest", - fields: ([]*main.Field) (len=2 cap=2) { - (*main.Field)(0xc00044ee10)({ - name: (string) (len=9) "publicKey", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044ee40)({ - name: (string) (len=8) "deviceId", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=9) "UsersInfo": (*main.Message)(0xc0001cb3c0)({ - fullName: (string) (len=9) "UsersInfo", - name: (string) (len=9) "UsersInfo", - fields: ([]*main.Field) (len=6 cap=8) { - (*main.Field)(0xc00044f0e0)({ - name: (string) (len=5) "total", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f110)({ - name: (string) (len=10) "no_balance", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f140)({ - name: (string) (len=16) "negative_balance", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f170)({ - name: (string) (len=20) "always_been_inactive", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f1a0)({ - name: (string) (len=11) "balance_avg", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f1d0)({ - name: (string) (len=14) "balance_median", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=11) "Application": (*main.Message)(0xc0001cbac0)({ - fullName: (string) (len=11) "Application", - name: (string) (len=11) "Application", - fields: ([]*main.Field) (len=4 cap=4) { - (*main.Field)(0xc00044fef0)({ - name: (string) (len=4) "name", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044ff20)({ - name: (string) (len=2) "id", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044ff50)({ - name: (string) (len=7) "balance", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044ff80)({ - name: (string) (len=4) "npub", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=16) "ClosureMigration": (*main.Message)(0xc000038d80)({ - fullName: (string) (len=16) "ClosureMigration", - name: (string) (len=16) "ClosureMigration", - fields: ([]*main.Field) (len=1 cap=1) { - (*main.Field)(0xc000259530)({ - name: (string) (len=14) "closes_at_unix", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=27) "LinkNPubThroughTokenRequest": (*main.Message)(0xc000038e80)({ - fullName: (string) (len=27) "LinkNPubThroughTokenRequest", - name: (string) (len=27) "LinkNPubThroughTokenRequest", - fields: ([]*main.Field) (len=2 cap=2) { - (*main.Field)(0xc0002595f0)({ - name: (string) (len=5) "token", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000259620)({ - name: (string) (len=9) "nostr_pub", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=10) "AppMetrics": (*main.Message)(0xc0001cb440)({ - fullName: (string) (len=10) "AppMetrics", - name: (string) (len=10) "AppMetrics", - fields: ([]*main.Field) (len=9 cap=16) { - (*main.Field)(0xc00044f200)({ - name: (string) (len=3) "app", - kind: (string) (len=11) "Application", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) true, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f230)({ - name: (string) (len=5) "users", - kind: (string) (len=9) "UsersInfo", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) true, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f260)({ - name: (string) (len=8) "received", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f290)({ - name: (string) (len=5) "spent", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f2c0)({ - name: (string) (len=9) "available", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f2f0)({ - name: (string) (len=4) "fees", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f320)({ - name: (string) (len=8) "invoices", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f350)({ - name: (string) (len=10) "total_fees", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f380)({ - name: (string) (len=10) "operations", - kind: (string) (len=13) "UserOperation", - isMap: (bool) false, - isArray: (bool) true, - isEnum: (bool) false, - isMessage: (bool) true, - isOptional: (bool) false - }) - } - }), - (string) (len=18) "NewInvoiceResponse": (*main.Message)(0xc0001cbf40)({ - fullName: (string) (len=18) "NewInvoiceResponse", - name: (string) (len=18) "NewInvoiceResponse", - fields: ([]*main.Field) (len=1 cap=1) { - (*main.Field)(0xc000258750)({ - name: (string) (len=7) "invoice", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=22) "HandleLnurlPayResponse": (*main.Message)(0xc000038840)({ - fullName: (string) (len=22) "HandleLnurlPayResponse", - name: (string) (len=22) "HandleLnurlPayResponse", - fields: ([]*main.Field) (len=2 cap=2) { - (*main.Field)(0xc000258d50)({ - name: (string) (len=2) "pr", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258d80)({ - name: (string) (len=6) "routes", - kind: (string) (len=5) "Empty", - isMap: (bool) false, - isArray: (bool) true, - isEnum: (bool) false, - isMessage: (bool) true, - isOptional: (bool) false - }) - } - }), - (string) (len=15) "MigrationUpdate": (*main.Message)(0xc000038d40)({ - fullName: (string) (len=15) "MigrationUpdate", - name: (string) (len=15) "MigrationUpdate", - fields: ([]*main.Field) (len=2 cap=2) { - (*main.Field)(0xc0002594d0)({ - name: (string) (len=7) "closure", - kind: (string) (len=16) "ClosureMigration", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) true, - isOptional: (bool) true - }), - (*main.Field)(0xc000259500)({ - name: (string) (len=6) "relays", - kind: (string) (len=15) "RelaysMigration", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) true, - isOptional: (bool) true - }) - } - }), - (string) (len=10) "LndMetrics": (*main.Message)(0xc0001cb940)({ - fullName: (string) (len=10) "LndMetrics", - name: (string) (len=10) "LndMetrics", - fields: ([]*main.Field) (len=1 cap=1) { - (*main.Field)(0xc00044fd40)({ - name: (string) (len=5) "nodes", - kind: (string) (len=14) "LndNodeMetrics", - isMap: (bool) false, - isArray: (bool) true, - isEnum: (bool) false, - isMessage: (bool) true, - isOptional: (bool) false - }) - } - }), - (string) (len=17) "AddProductRequest": (*main.Message)(0xc000038b80)({ - fullName: (string) (len=17) "AddProductRequest", - name: (string) (len=17) "AddProductRequest", - fields: ([]*main.Field) (len=2 cap=2) { - (*main.Field)(0xc000259380)({ - name: (string) (len=4) "name", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc0002593b0)({ - name: (string) (len=10) "price_sats", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=14) "AuthAppRequest": (*main.Message)(0xc0001cba80)({ - fullName: (string) (len=14) "AuthAppRequest", - name: (string) (len=14) "AuthAppRequest", - fields: ([]*main.Field) (len=2 cap=2) { - (*main.Field)(0xc00044fe90)({ - name: (string) (len=4) "name", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044fec0)({ - name: (string) (len=19) "allow_user_creation", - kind: (string) (len=4) "bool", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) true - }) - } - }), - (string) (len=17) "AddAppUserRequest": (*main.Message)(0xc0001cbb40)({ - fullName: (string) (len=17) "AddAppUserRequest", - name: (string) (len=17) "AddAppUserRequest", - fields: ([]*main.Field) (len=3 cap=4) { - (*main.Field)(0xc000258030)({ - name: (string) (len=10) "identifier", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258060)({ - name: (string) (len=14) "fail_if_exists", - kind: (string) (len=4) "bool", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258090)({ - name: (string) (len=7) "balance", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=17) "PayAddressRequest": (*main.Message)(0xc0001cbe80)({ - fullName: (string) (len=17) "PayAddressRequest", - name: (string) (len=17) "PayAddressRequest", - fields: ([]*main.Field) (len=3 cap=4) { - (*main.Field)(0xc0002585a0)({ - name: (string) (len=7) "address", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc0002585d0)({ - name: (string) (len=9) "amoutSats", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258600)({ - name: (string) (len=12) "satsPerVByte", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=13) "UserOperation": (*main.Message)(0xc000038980)({ - fullName: (string) (len=13) "UserOperation", - name: (string) (len=13) "UserOperation", - fields: ([]*main.Field) (len=11 cap=16) { - (*main.Field)(0xc000258fc0)({ - name: (string) (len=10) "paidAtUnix", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258ff0)({ - name: (string) (len=4) "type", - kind: (string) (len=17) "UserOperationType", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) true, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000259020)({ - name: (string) (len=7) "inbound", - kind: (string) (len=4) "bool", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000259050)({ - name: (string) (len=6) "amount", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000259080)({ - name: (string) (len=10) "identifier", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc0002590b0)({ - name: (string) (len=11) "operationId", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc0002590e0)({ - name: (string) (len=11) "service_fee", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000259110)({ - name: (string) (len=11) "network_fee", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000259140)({ - name: (string) (len=9) "confirmed", - kind: (string) (len=4) "bool", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000259170)({ - name: (string) (len=7) "tx_hash", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc0002591a0)({ - name: (string) (len=8) "internal", - kind: (string) (len=4) "bool", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=25) "GetUserOperationsResponse": (*main.Message)(0xc000038b40)({ - fullName: (string) (len=25) "GetUserOperationsResponse", - name: (string) (len=25) "GetUserOperationsResponse", - fields: ([]*main.Field) (len=6 cap=8) { - (*main.Field)(0xc000259260)({ - name: (string) (len=31) "latestOutgoingInvoiceOperations", - kind: (string) (len=14) "UserOperations", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) true, - isOptional: (bool) false - }), - (*main.Field)(0xc000259290)({ - name: (string) (len=31) "latestIncomingInvoiceOperations", - kind: (string) (len=14) "UserOperations", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) true, - isOptional: (bool) false - }), - (*main.Field)(0xc0002592c0)({ - name: (string) (len=26) "latestOutgoingTxOperations", - kind: (string) (len=14) "UserOperations", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) true, - isOptional: (bool) false - }), - (*main.Field)(0xc0002592f0)({ - name: (string) (len=26) "latestIncomingTxOperations", - kind: (string) (len=14) "UserOperations", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) true, - isOptional: (bool) false - }), - (*main.Field)(0xc000259320)({ - name: (string) (len=32) "latestOutgoingUserToUserPayemnts", - kind: (string) (len=14) "UserOperations", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) true, - isOptional: (bool) false - }), - (*main.Field)(0xc000259350)({ - name: (string) (len=32) "latestIncomingUserToUserPayemnts", - kind: (string) (len=14) "UserOperations", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) true, - isOptional: (bool) false - }) - } - }), - (string) (len=14) "LndNodeMetrics": (*main.Message)(0xc0001cb900)({ - fullName: (string) (len=14) "LndNodeMetrics", - name: (string) (len=14) "LndNodeMetrics", - fields: ([]*main.Field) (len=9 cap=16) { - (*main.Field)(0xc00044fb90)({ - name: (string) (len=23) "channels_balance_events", - kind: (string) (len=19) "ChannelBalanceEvent", - isMap: (bool) false, - isArray: (bool) true, - isEnum: (bool) false, - isMessage: (bool) true, - isOptional: (bool) false - }), - (*main.Field)(0xc00044fbc0)({ - name: (string) (len=20) "chain_balance_events", - kind: (string) (len=17) "ChainBalanceEvent", - isMap: (bool) false, - isArray: (bool) true, - isEnum: (bool) false, - isMessage: (bool) true, - isOptional: (bool) false - }), - (*main.Field)(0xc00044fbf0)({ - name: (string) (len=16) "offline_channels", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044fc20)({ - name: (string) (len=15) "online_channels", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044fc50)({ - name: (string) (len=16) "pending_channels", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044fc80)({ - name: (string) (len=16) "closing_channels", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044fcb0)({ - name: (string) (len=13) "open_channels", - kind: (string) (len=11) "OpenChannel", - isMap: (bool) false, - isArray: (bool) true, - isEnum: (bool) false, - isMessage: (bool) true, - isOptional: (bool) false - }), - (*main.Field)(0xc00044fce0)({ - name: (string) (len=15) "closed_channels", - kind: (string) (len=13) "ClosedChannel", - isMap: (bool) false, - isArray: (bool) true, - isEnum: (bool) false, - isMessage: (bool) true, - isOptional: (bool) false - }), - (*main.Field)(0xc00044fd10)({ - name: (string) (len=15) "channel_routing", - kind: (string) (len=14) "ChannelRouting", - isMap: (bool) false, - isArray: (bool) true, - isEnum: (bool) false, - isMessage: (bool) true, - isOptional: (bool) false - }) - } - }), - (string) (len=24) "AddAppUserInvoiceRequest": (*main.Message)(0xc0001cbc00)({ - fullName: (string) (len=24) "AddAppUserInvoiceRequest", - name: (string) (len=24) "AddAppUserInvoiceRequest", - fields: ([]*main.Field) (len=4 cap=4) { - (*main.Field)(0xc0002581e0)({ - name: (string) (len=19) "receiver_identifier", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258210)({ - name: (string) (len=16) "payer_identifier", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258240)({ - name: (string) (len=17) "http_callback_url", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258270)({ - name: (string) (len=11) "invoice_req", - kind: (string) (len=17) "NewInvoiceRequest", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) true, - isOptional: (bool) false - }) - } - }), - (string) (len=24) "SetMockAppBalanceRequest": (*main.Message)(0xc0001cbdc0)({ - fullName: (string) (len=24) "SetMockAppBalanceRequest", - name: (string) (len=24) "SetMockAppBalanceRequest", - fields: ([]*main.Field) (len=1 cap=1) { - (*main.Field)(0xc000258510)({ - name: (string) (len=6) "amount", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=21) "DecodeInvoiceResponse": (*main.Message)(0xc0001cbfc0)({ - fullName: (string) (len=21) "DecodeInvoiceResponse", - name: (string) (len=21) "DecodeInvoiceResponse", - fields: ([]*main.Field) (len=1 cap=1) { - (*main.Field)(0xc0002587b0)({ - name: (string) (len=6) "amount", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=14) "UserOperations": (*main.Message)(0xc000038ac0)({ - fullName: (string) (len=14) "UserOperations", - name: (string) (len=14) "UserOperations", - fields: ([]*main.Field) (len=3 cap=4) { - (*main.Field)(0xc0002591d0)({ - name: (string) (len=9) "fromIndex", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000259200)({ - name: (string) (len=7) "toIndex", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000259230)({ - name: (string) (len=10) "operations", - kind: (string) (len=13) "UserOperation", - isMap: (bool) false, - isArray: (bool) true, - isEnum: (bool) false, - isMessage: (bool) true, - isOptional: (bool) false - }) - } - }), - (string) (len=15) "RelaysMigration": (*main.Message)(0xc000038dc0)({ - fullName: (string) (len=15) "RelaysMigration", - name: (string) (len=15) "RelaysMigration", - fields: ([]*main.Field) (len=1 cap=1) { - (*main.Field)(0xc000259560)({ - name: (string) (len=6) "relays", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) true, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=12) "UsageMetrics": (*main.Message)(0xc0001cb280)({ - fullName: (string) (len=12) "UsageMetrics", - name: (string) (len=12) "UsageMetrics", - fields: ([]*main.Field) (len=1 cap=1) { - (*main.Field)(0xc00044f020)({ - name: (string) (len=7) "metrics", - kind: (string) (len=11) "UsageMetric", - isMap: (bool) false, - isArray: (bool) true, - isEnum: (bool) false, - isMessage: (bool) true, - isOptional: (bool) false - }) - } - }), - (string) (len=17) "ChainBalanceEvent": (*main.Message)(0xc0001cb740)({ - fullName: (string) (len=17) "ChainBalanceEvent", - name: (string) (len=17) "ChainBalanceEvent", - fields: ([]*main.Field) (len=4 cap=4) { - (*main.Field)(0xc00044f740)({ - name: (string) (len=12) "block_height", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f770)({ - name: (string) (len=17) "confirmed_balance", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f7a0)({ - name: (string) (len=19) "unconfirmed_balance", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f7d0)({ - name: (string) (len=13) "total_balance", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=13) "ClosedChannel": (*main.Message)(0xc0001cb800)({ - fullName: (string) (len=13) "ClosedChannel", - name: (string) (len=13) "ClosedChannel", - fields: ([]*main.Field) (len=3 cap=4) { - (*main.Field)(0xc00044f920)({ - name: (string) (len=10) "channel_id", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f950)({ - name: (string) (len=8) "capacity", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f980)({ - name: (string) (len=13) "closed_height", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=13) "AddAppRequest": (*main.Message)(0xc0001cba40)({ - fullName: (string) (len=13) "AddAppRequest", - name: (string) (len=13) "AddAppRequest", - fields: ([]*main.Field) (len=2 cap=2) { - (*main.Field)(0xc00044fe30)({ - name: (string) (len=4) "name", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044fe60)({ - name: (string) (len=19) "allow_user_creation", - kind: (string) (len=4) "bool", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=17) "LnurlLinkResponse": (*main.Message)(0xc000038680)({ - fullName: (string) (len=17) "LnurlLinkResponse", - name: (string) (len=17) "LnurlLinkResponse", - fields: ([]*main.Field) (len=2 cap=2) { - (*main.Field)(0xc000258a20)({ - name: (string) (len=5) "lnurl", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258a50)({ - name: (string) (len=2) "k1", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=7) "Product": (*main.Message)(0xc000038bc0)({ - fullName: (string) (len=7) "Product", - name: (string) (len=7) "Product", - fields: ([]*main.Field) (len=3 cap=4) { - (*main.Field)(0xc0002593e0)({ - name: (string) (len=2) "id", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000259410)({ - name: (string) (len=4) "name", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000259440)({ - name: (string) (len=10) "price_sats", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=11) "AppsMetrics": (*main.Message)(0xc0001cb500)({ - fullName: (string) (len=11) "AppsMetrics", - name: (string) (len=11) "AppsMetrics", - fields: ([]*main.Field) (len=1 cap=1) { - (*main.Field)(0xc00044f3b0)({ - name: (string) (len=4) "apps", - kind: (string) (len=10) "AppMetrics", - isMap: (bool) false, - isArray: (bool) true, - isEnum: (bool) false, - isMessage: (bool) true, - isOptional: (bool) false - }) - } - }), - (string) (len=12) "RoutingEvent": (*main.Message)(0xc0001cb6c0)({ - fullName: (string) (len=12) "RoutingEvent", - name: (string) (len=12) "RoutingEvent", - fields: ([]*main.Field) (len=12 cap=16) { - (*main.Field)(0xc00044f440)({ - name: (string) (len=19) "incoming_channel_id", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f470)({ - name: (string) (len=16) "incoming_htlc_id", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f4a0)({ - name: (string) (len=19) "outgoing_channel_id", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f4d0)({ - name: (string) (len=16) "outgoing_htlc_id", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f500)({ - name: (string) (len=12) "timestamp_ns", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f530)({ - name: (string) (len=10) "event_type", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f560)({ - name: (string) (len=17) "incoming_amt_msat", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f590)({ - name: (string) (len=17) "outgoing_amt_msat", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f5c0)({ - name: (string) (len=14) "failure_string", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f5f0)({ - name: (string) (len=7) "settled", - kind: (string) (len=4) "bool", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f620)({ - name: (string) (len=8) "offchain", - kind: (string) (len=4) "bool", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f650)({ - name: (string) (len=18) "forward_fail_event", - kind: (string) (len=4) "bool", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=19) "ChannelBalanceEvent": (*main.Message)(0xc0001cb700)({ - fullName: (string) (len=19) "ChannelBalanceEvent", - name: (string) (len=19) "ChannelBalanceEvent", - fields: ([]*main.Field) (len=4 cap=4) { - (*main.Field)(0xc00044f680)({ - name: (string) (len=12) "block_height", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f6b0)({ - name: (string) (len=10) "channel_id", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f6e0)({ - name: (string) (len=18) "local_balance_sats", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f710)({ - name: (string) (len=19) "remote_balance_sats", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=7) "AuthApp": (*main.Message)(0xc0001cbb00)({ - fullName: (string) (len=7) "AuthApp", - name: (string) (len=7) "AuthApp", - fields: ([]*main.Field) (len=2 cap=2) { - (*main.Field)(0xc00044ffb0)({ - name: (string) (len=3) "app", - kind: (string) (len=11) "Application", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) true, - isOptional: (bool) false - }), - (*main.Field)(0xc000258000)({ - name: (string) (len=10) "auth_token", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=17) "LndGetInfoRequest": (*main.Message)(0xc0001cb980)({ - fullName: (string) (len=17) "LndGetInfoRequest", - name: (string) (len=17) "LndGetInfoRequest", - fields: ([]*main.Field) (len=1 cap=1) { - (*main.Field)(0xc00044fd70)({ - name: (string) (len=6) "nodeId", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=7) "AppUser": (*main.Message)(0xc0001cbb80)({ - fullName: (string) (len=7) "AppUser", - name: (string) (len=7) "AppUser", - fields: ([]*main.Field) (len=3 cap=4) { - (*main.Field)(0xc0002580c0)({ - name: (string) (len=10) "identifier", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc0002580f0)({ - name: (string) (len=4) "info", - kind: (string) (len=8) "UserInfo", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) true, - isOptional: (bool) false - }), - (*main.Field)(0xc000258120)({ - name: (string) (len=16) "max_withdrawable", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=20) "AddAppInvoiceRequest": (*main.Message)(0xc0001cbbc0)({ - fullName: (string) (len=20) "AddAppInvoiceRequest", - name: (string) (len=20) "AddAppInvoiceRequest", - fields: ([]*main.Field) (len=3 cap=4) { - (*main.Field)(0xc000258150)({ - name: (string) (len=16) "payer_identifier", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258180)({ - name: (string) (len=17) "http_callback_url", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc0002581b0)({ - name: (string) (len=11) "invoice_req", - kind: (string) (len=17) "NewInvoiceRequest", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) true, - isOptional: (bool) false - }) - } - }), - (string) (len=25) "LnurlWithdrawInfoResponse": (*main.Message)(0xc000038700)({ - fullName: (string) (len=25) "LnurlWithdrawInfoResponse", - name: (string) (len=25) "LnurlWithdrawInfoResponse", - fields: ([]*main.Field) (len=8 cap=8) { - (*main.Field)(0xc000258a80)({ - name: (string) (len=3) "tag", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258ab0)({ - name: (string) (len=8) "callback", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258ae0)({ - name: (string) (len=2) "k1", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258b10)({ - name: (string) (len=18) "defaultDescription", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258b40)({ - name: (string) (len=15) "minWithdrawable", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258b70)({ - name: (string) (len=15) "maxWithdrawable", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258ba0)({ - name: (string) (len=12) "balanceCheck", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258bd0)({ - name: (string) (len=7) "payLink", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=5) "Empty": (*main.Message)(0xc0001cb040)({ - fullName: (string) (len=5) "Empty", - name: (string) (len=5) "Empty", - fields: ([]*main.Field) - }), - (string) (len=14) "ChannelRouting": (*main.Message)(0xc0001cb880)({ - fullName: (string) (len=14) "ChannelRouting", - name: (string) (len=14) "ChannelRouting", - fields: ([]*main.Field) (len=10 cap=16) { - (*main.Field)(0xc00044f9b0)({ - name: (string) (len=10) "channel_id", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f9e0)({ - name: (string) (len=11) "send_errors", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044fa10)({ - name: (string) (len=14) "receive_errors", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044fa40)({ - name: (string) (len=23) "forward_errors_as_input", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044fa70)({ - name: (string) (len=24) "forward_errors_as_output", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044faa0)({ - name: (string) (len=27) "missed_forward_fee_as_input", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044fad0)({ - name: (string) (len=28) "missed_forward_fee_as_output", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044fb00)({ - name: (string) (len=20) "forward_fee_as_input", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044fb30)({ - name: (string) (len=21) "forward_fee_as_output", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044fb60)({ - name: (string) (len=13) "events_number", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=24) "PayAppUserInvoiceRequest": (*main.Message)(0xc0001cbc80)({ - fullName: (string) (len=24) "PayAppUserInvoiceRequest", - name: (string) (len=24) "PayAppUserInvoiceRequest", - fields: ([]*main.Field) (len=3 cap=4) { - (*main.Field)(0xc0002582d0)({ - name: (string) (len=15) "user_identifier", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258300)({ - name: (string) (len=7) "invoice", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258330)({ - name: (string) (len=6) "amount", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=18) "OpenChannelRequest": (*main.Message)(0xc0000381c0)({ - fullName: (string) (len=18) "OpenChannelRequest", - name: (string) (len=18) "OpenChannelRequest", - fields: ([]*main.Field) (len=4 cap=4) { - (*main.Field)(0xc000258930)({ - name: (string) (len=11) "destination", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258960)({ - name: (string) (len=13) "fundingAmount", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258990)({ - name: (string) (len=10) "pushAmount", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc0002589c0)({ - name: (string) (len=12) "closeAddress", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=20) "LnurlPayInfoResponse": (*main.Message)(0xc000038800)({ - fullName: (string) (len=20) "LnurlPayInfoResponse", - name: (string) (len=20) "LnurlPayInfoResponse", - fields: ([]*main.Field) (len=7 cap=8) { - (*main.Field)(0xc000258c00)({ - name: (string) (len=3) "tag", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258c30)({ - name: (string) (len=8) "callback", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258c60)({ - name: (string) (len=11) "maxSendable", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258c90)({ - name: (string) (len=11) "minSendable", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258cc0)({ - name: (string) (len=8) "metadata", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258cf0)({ - name: (string) (len=11) "allowsNostr", - kind: (string) (len=4) "bool", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258d20)({ - name: (string) (len=11) "nostrPubkey", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=25) "GetProductBuyLinkResponse": (*main.Message)(0xc000038c00)({ - fullName: (string) (len=25) "GetProductBuyLinkResponse", - name: (string) (len=25) "GetProductBuyLinkResponse", - fields: ([]*main.Field) (len=1 cap=1) { - (*main.Field)(0xc000259470)({ - name: (string) (len=4) "link", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=11) "OpenChannel": (*main.Message)(0xc0001cb7c0)({ - fullName: (string) (len=11) "OpenChannel", - name: (string) (len=11) "OpenChannel", - fields: ([]*main.Field) (len=6 cap=8) { - (*main.Field)(0xc00044f800)({ - name: (string) (len=10) "channel_id", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f830)({ - name: (string) (len=8) "capacity", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f860)({ - name: (string) (len=6) "active", - kind: (string) (len=4) "bool", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f890)({ - name: (string) (len=8) "lifetime", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f8c0)({ - name: (string) (len=13) "local_balance", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044f8f0)({ - name: (string) (len=14) "remote_balance", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=31) "RequestNPubLinkingTokenResponse": (*main.Message)(0xc000038e40)({ - fullName: (string) (len=31) "RequestNPubLinkingTokenResponse", - name: (string) (len=31) "RequestNPubLinkingTokenResponse", - fields: ([]*main.Field) (len=1 cap=1) { - (*main.Field)(0xc0002595c0)({ - name: (string) (len=5) "token", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=11) "UsageMetric": (*main.Message)(0xc0001cb1c0)({ - fullName: (string) (len=11) "UsageMetric", - name: (string) (len=11) "UsageMetric", - fields: ([]*main.Field) (len=9 cap=16) { - (*main.Field)(0xc00044ee70)({ - name: (string) (len=15) "processed_at_ms", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044eea0)({ - name: (string) (len=14) "parsed_in_nano", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044eed0)({ - name: (string) (len=12) "auth_in_nano", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044ef00)({ - name: (string) (len=16) "validate_in_nano", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044ef30)({ - name: (string) (len=14) "handle_in_nano", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044ef60)({ - name: (string) (len=8) "rpc_name", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044ef90)({ - name: (string) (len=5) "batch", - kind: (string) (len=4) "bool", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044efc0)({ - name: (string) (len=5) "nostr", - kind: (string) (len=4) "bool", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc00044eff0)({ - name: (string) (len=10) "batch_size", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=17) "LndMetricsRequest": (*main.Message)(0xc0001cb640)({ - fullName: (string) (len=17) "LndMetricsRequest", - name: (string) (len=17) "LndMetricsRequest", - fields: ([]*main.Field) (len=2 cap=2) { - (*main.Field)(0xc00044f3e0)({ - name: (string) (len=9) "from_unix", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) true - }), - (*main.Field)(0xc00044f410)({ - name: (string) (len=7) "to_unix", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) true - }) - } - }), - (string) (len=30) "SendAppUserToAppPaymentRequest": (*main.Message)(0xc0001cbd00)({ - fullName: (string) (len=30) "SendAppUserToAppPaymentRequest", - name: (string) (len=30) "SendAppUserToAppPaymentRequest", - fields: ([]*main.Field) (len=2 cap=2) { - (*main.Field)(0xc0002583f0)({ - name: (string) (len=20) "from_user_identifier", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258420)({ - name: (string) (len=6) "amount", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=17) "NewInvoiceRequest": (*main.Message)(0xc0001cbf00)({ - fullName: (string) (len=17) "NewInvoiceRequest", - name: (string) (len=17) "NewInvoiceRequest", - fields: ([]*main.Field) (len=2 cap=2) { - (*main.Field)(0xc0002586f0)({ - name: (string) (len=10) "amountSats", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258720)({ - name: (string) (len=4) "memo", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=20) "DecodeInvoiceRequest": (*main.Message)(0xc0001cbf80)({ - fullName: (string) (len=20) "DecodeInvoiceRequest", - name: (string) (len=20) "DecodeInvoiceRequest", - fields: ([]*main.Field) (len=1 cap=1) { - (*main.Field)(0xc000258780)({ - name: (string) (len=7) "invoice", - kind: (string) (len=6) "string", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=24) "GetUserOperationsRequest": (*main.Message)(0xc000038900)({ - fullName: (string) (len=24) "GetUserOperationsRequest", - name: (string) (len=24) "GetUserOperationsRequest", - fields: ([]*main.Field) (len=7 cap=8) { - (*main.Field)(0xc000258e70)({ - name: (string) (len=21) "latestIncomingInvoice", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258ea0)({ - name: (string) (len=21) "latestOutgoingInvoice", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258ed0)({ - name: (string) (len=16) "latestIncomingTx", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258f00)({ - name: (string) (len=16) "latestOutgoingTx", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258f30)({ - name: (string) (len=31) "latestIncomingUserToUserPayment", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258f60)({ - name: (string) (len=31) "latestOutgoingUserToUserPayment", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }), - (*main.Field)(0xc000258f90)({ - name: (string) (len=8) "max_size", - kind: (string) (len=5) "int64", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) false, - isOptional: (bool) false - }) - } - }), - (string) (len=17) "LiveUserOperation": (*main.Message)(0xc000038d00)({ - fullName: (string) (len=17) "LiveUserOperation", - name: (string) (len=17) "LiveUserOperation", - fields: ([]*main.Field) (len=1 cap=1) { - (*main.Field)(0xc0002594a0)({ - name: (string) (len=9) "operation", - kind: (string) (len=13) "UserOperation", - isMap: (bool) false, - isArray: (bool) false, - isEnum: (bool) false, - isMessage: (bool) true, - isOptional: (bool) false - }) - } - }) -} - -parsing file: structs 66 -parsing file: methods 2 --> [{guest Guest map[]} {user User map[app_id:string app_user_id:string user_id:string]} {admin Admin map[admin_id:string]} {metrics Metrics map[operator_id:string]} {app App map[app_id:string]}] - diff --git a/proto/autogenerated/ts/express_server.ts b/proto/autogenerated/ts/express_server.ts index 1dfbdbee..908c1ed2 100644 --- a/proto/autogenerated/ts/express_server.ts +++ b/proto/autogenerated/ts/express_server.ts @@ -99,6 +99,28 @@ export default (methods: Types.ServerMethods, opts: ServerOptions) => { opts.metricsCallback([{ ...info, ...stats, ...authContext }]) } catch (ex) { const e = ex as any; logErrorAndReturnResponse(e, e.message || e, res, logger, { ...info, ...stats, ...authCtx }, opts.metricsCallback); if (opts.throwErrors) throw e } }) + if (!opts.allowNotImplementedMethods && !methods.BanUser) throw new Error('method: BanUser is not implemented') + app.post('/api/admin/user/ban', async (req, res) => { + const info: Types.RequestInfo = { rpcName: 'BanUser', batch: false, nostr: false, batchSize: 0} + const stats: Types.RequestStats = { startMs:req.startTimeMs || 0, start:req.startTime || 0n, parse: process.hrtime.bigint(), guard: 0n, validate: 0n, handle: 0n } + let authCtx: Types.AuthContext = {} + try { + if (!methods.BanUser) throw new Error('method: BanUser is not implemented') + const authContext = await opts.AdminAuthGuard(req.headers['authorization']) + authCtx = authContext + stats.guard = process.hrtime.bigint() + const request = req.body + const error = Types.BanUserRequestValidate(request) + stats.validate = process.hrtime.bigint() + if (error !== null) return logErrorAndReturnResponse(error, 'invalid request body', res, logger, { ...info, ...stats, ...authContext }, opts.metricsCallback) + const query = req.query + const params = req.params + const response = await methods.BanUser({rpcName:'BanUser', ctx:authContext , req: request}) + stats.handle = process.hrtime.bigint() + res.json({status: 'OK', ...response}) + opts.metricsCallback([{ ...info, ...stats, ...authContext }]) + } catch (ex) { const e = ex as any; logErrorAndReturnResponse(e, e.message || e, res, logger, { ...info, ...stats, ...authCtx }, opts.metricsCallback); if (opts.throwErrors) throw e } + }) if (!opts.allowNotImplementedMethods && !methods.GetUsageMetrics) throw new Error('method: GetUsageMetrics is not implemented') app.post('/api/reports/usage', async (req, res) => { const info: Types.RequestInfo = { rpcName: 'GetUsageMetrics', batch: false, nostr: false, batchSize: 0} diff --git a/proto/autogenerated/ts/http_client.ts b/proto/autogenerated/ts/http_client.ts index c6df00fd..58d2199c 100644 --- a/proto/autogenerated/ts/http_client.ts +++ b/proto/autogenerated/ts/http_client.ts @@ -58,6 +58,20 @@ export default (params: ClientParams) => ({ } return { status: 'ERROR', reason: 'invalid response' } }, + BanUser: async (request: Types.BanUserRequest): Promise => { + const auth = await params.retrieveAdminAuth() + if (auth === null) throw new Error('retrieveAdminAuth() returned null') + let finalRoute = '/api/admin/user/ban' + const { data } = await axios.post(params.baseUrl + finalRoute, request, { headers: { 'authorization': auth } }) + if (data.status === 'ERROR' && typeof data.reason === 'string') return data + if (data.status === 'OK') { + const result = data + if(!params.checkResult) return { status: 'OK', ...result } + const error = Types.BanUserResponseValidate(result) + if (error === null) { return { status: 'OK', ...result } } else return { status: 'ERROR', reason: error.message } + } + return { status: 'ERROR', reason: 'invalid response' } + }, GetUsageMetrics: async (): Promise => { const auth = await params.retrieveMetricsAuth() if (auth === null) throw new Error('retrieveMetricsAuth() returned null') diff --git a/proto/service/methods.proto b/proto/service/methods.proto index 123342a7..94dbf74f 100644 --- a/proto/service/methods.proto +++ b/proto/service/methods.proto @@ -106,6 +106,12 @@ service LightningPub { option (http_route) = "/api/admin/app/auth"; } + rpc BanUser(structs.BanUserRequest) returns (structs.BanUserResponse) { + option (auth_type) = "Admin"; + option (http_method) = "post"; + option (http_route) = "/api/admin/user/ban"; + } + rpc GetUsageMetrics(structs.Empty) returns (structs.UsageMetrics) { option (auth_type) = "Metrics"; option (http_method) = "post"; @@ -123,6 +129,8 @@ service LightningPub { option (http_method) = "post"; option (http_route) = "/api/reports/lnd"; } + + // // diff --git a/proto/service/structs.proto b/proto/service/structs.proto index d8c2adfc..33385b0a 100644 --- a/proto/service/structs.proto +++ b/proto/service/structs.proto @@ -155,6 +155,21 @@ message LndGetInfoResponse { string alias = 1; } +message BanUserRequest { + string user_id = 1; +} +message BannedAppUser { + string app_name = 1; + string app_id = 2; + string user_identifier = 3; + string nostr_pub = 4; + +} +message BanUserResponse { + int64 balance_sats = 1; + repeated BannedAppUser banned_app_users = 2; +} + message AddAppRequest { string name = 1; bool allow_user_creation = 2; diff --git a/src/index.ts b/src/index.ts index a8ce6e62..231d573a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,10 +2,8 @@ import 'dotenv/config' import NewServer from '../proto/autogenerated/ts/express_server.js' import GetServerMethods from './services/serverMethods/index.js' import serverOptions from './auth.js'; -import Storage from './services/storage/index.js' import { LoadNosrtSettingsFromEnv } from './services/nostr/index.js' import nostrMiddleware from './nostrMiddleware.js' -import { TypeOrmMigrationRunner } from './services/storage/migrations/runner.js'; import { getLogger } from './services/helpers/logger.js'; import { initMainHandler } from './services/main/init.js'; import { LoadMainSettingsFromEnv } from './services/main/settings.js'; diff --git a/src/nostrMiddleware.ts b/src/nostrMiddleware.ts index 83628271..64614ac1 100644 --- a/src/nostrMiddleware.ts +++ b/src/nostrMiddleware.ts @@ -10,7 +10,7 @@ export default (serverMethods: Types.ServerMethods, mainHandler: Main, nostrSett const nostrTransport = NewNostrTransport(serverMethods, { NostrUserAuthGuard: async (appId, pub) => { const app = await mainHandler.storage.applicationStorage.GetApplication(appId || "") - let nostrUser = await mainHandler.storage.applicationStorage.GetOrCreateNostrAppUser(app, pub || "") + const nostrUser = await mainHandler.storage.applicationStorage.GetOrCreateNostrAppUser(app, pub || "") return { user_id: nostrUser.user.user_id, app_user_id: nostrUser.identifier, app_id: appId || "" } }, metricsCallback: metrics => mainHandler.settings.recordPerformance ? mainHandler.metricsManager.AddMetrics(metrics) : null, diff --git a/src/services/helpers/envParser.ts b/src/services/helpers/envParser.ts index 87c44d81..fa8a4e92 100644 --- a/src/services/helpers/envParser.ts +++ b/src/services/helpers/envParser.ts @@ -10,6 +10,17 @@ export const EnvMustBeInteger = (name: string): number => { } return +env } +export const EnvCanBeInteger = (name: string, defaultValue = 0): number => { + const env = process.env[name] + if (!env) { + return defaultValue + } + const envNum = +env + if (isNaN(envNum) || !Number.isInteger(envNum)) { + throw new Error(`${name} ENV must be an integer number or nothing`); + } + return envNum +} export const EnvCanBeBoolean = (name: string): boolean => { const env = process.env[name] if (!env) return false diff --git a/src/services/lnd/index.ts b/src/services/lnd/index.ts index 81f04bae..87a0b3f0 100644 --- a/src/services/lnd/index.ts +++ b/src/services/lnd/index.ts @@ -38,6 +38,8 @@ export interface LightningHandler { GetForwardingHistory(indexOffset: number): Promise<{ fee: number, chanIdIn: string, chanIdOut: string, timestampNs: number, offset: number }[]> GetAllPaidInvoices(max: number): Promise GetAllPayments(max: number): Promise + LockOutgoingOperations(): void + UnlockOutgoingOperations(): void } export default (settings: LndSettings, addressPaidCb: AddressPaidCb, invoicePaidCb: InvoicePaidCb, newBlockCb: NewBlockCb, htlcCb: HtlcCb): LightningHandler => { diff --git a/src/services/lnd/lnd.ts b/src/services/lnd/lnd.ts index a43e1fcf..e1128e1b 100644 --- a/src/services/lnd/lnd.ts +++ b/src/services/lnd/lnd.ts @@ -33,6 +33,7 @@ export default class { newBlockCb: NewBlockCb htlcCb: HtlcCb log = getLogger({ appName: 'lndManager' }) + outgoingOpsLocked = false constructor(settings: LndSettings, addressPaidCb: AddressPaidCb, invoicePaidCb: InvoicePaidCb, newBlockCb: NewBlockCb, htlcCb: HtlcCb) { this.settings = settings this.addressPaidCb = addressPaidCb @@ -60,6 +61,14 @@ export default class { this.router = new RouterClient(transport) this.chainNotifier = new ChainNotifierClient(transport) } + + LockOutgoingOperations(): void { + this.outgoingOpsLocked = true + } + UnlockOutgoingOperations(): void { + this.outgoingOpsLocked = false + } + SetMockInvoiceAsPaid(invoice: string, amount: number): Promise { throw new Error("SetMockInvoiceAsPaid only available in mock mode") } @@ -251,6 +260,10 @@ export default class { return { local: r.localBalance ? Number(r.localBalance.sat) : 0, remote: r.remoteBalance ? Number(r.remoteBalance.sat) : 0 } } async PayInvoice(invoice: string, amount: number, feeLimit: number): Promise { + if (this.outgoingOpsLocked) { + this.log("outgoing ops locked, rejecting payment request") + throw new Error("lnd node is currently out of sync") + } await this.Health() this.log("paying invoice", invoice, "for", amount, "sats") const abortController = new AbortController() @@ -287,6 +300,10 @@ export default class { } async PayAddress(address: string, amount: number, satPerVByte: number, label = ""): Promise { + if (this.outgoingOpsLocked) { + this.log("outgoing ops locked, rejecting payment request") + throw new Error("lnd node is currently out of sync") + } await this.Health() this.log("sending chain TX for", amount, "sats", "to", address) const res = await this.lightning.sendCoins(SendCoinsReq(address, amount, satPerVByte, label), DeadLineMetadata()) diff --git a/src/services/lnd/mock.ts b/src/services/lnd/mock.ts index 44b2e6cb..17fd70c1 100644 --- a/src/services/lnd/mock.ts +++ b/src/services/lnd/mock.ts @@ -131,6 +131,12 @@ export default class { async GetAllPayments(max: number): Promise { throw new Error("not implemented") } + LockOutgoingOperations() { + throw new Error("not implemented") + } + UnlockOutgoingOperations() { + throw new Error("not implemented") + } } diff --git a/src/services/lnd/watchdog.ts b/src/services/lnd/watchdog.ts new file mode 100644 index 00000000..da52eaa4 --- /dev/null +++ b/src/services/lnd/watchdog.ts @@ -0,0 +1,117 @@ +import { EnvCanBeInteger } from "../helpers/envParser.js"; +import { getLogger } from "../helpers/logger.js"; +import { LightningHandler } from "./index.js"; +export type WatchdogSettings = { + maxDiffSats: number +} +export const LoadWatchdogSettingsFromEnv = (test = false): WatchdogSettings => { + return { + maxDiffSats: EnvCanBeInteger("WATCHDOG_MAX_DIFF_SATS") + } +} +export class Watchdog { + initialLndBalance: number; + initialUsersBalance: number; + lnd: LightningHandler; + settings: WatchdogSettings; + log = getLogger({ appName: "watchdog" }) + enabled = false + constructor(settings: WatchdogSettings, lnd: LightningHandler) { + this.lnd = lnd; + this.settings = settings; + } + + SeedLndBalance = async (totalUsersBalance: number) => { + this.initialLndBalance = await this.getTotalLndBalance() + this.initialUsersBalance = totalUsersBalance + this.enabled = true + } + + getTotalLndBalance = async () => { + const { channelsBalance, confirmedBalance } = await this.lnd.GetBalance() + return confirmedBalance + channelsBalance.reduce((acc, { localBalanceSats }) => acc + localBalanceSats, 0) + } + + checkBalanceUpdate = (deltaLnd: number, deltaUsers: number) => { + this.log("LND balance update:", deltaLnd, "sats since app startup") + this.log("Users balance update:", deltaUsers, "sats since app startup") + + const result = this.checkDeltas(deltaLnd, deltaUsers) + switch (result.type) { + case 'mismatch': + if (deltaLnd < 0) { + this.log("WARNING! LND balance decreased while users balance increased creating a difference of", result.absoluteDiff, "sats") + if (result.absoluteDiff > this.settings.maxDiffSats) { + this.log("Difference is too big for an update, locking outgoing operations") + return true + } + } else { + this.log("LND balance increased while users balance decreased creating a difference of", result.absoluteDiff, "sats, could be caused by data loss, or liquidity injection") + return false + } + break + case 'negative': + if (Math.abs(deltaLnd) > Math.abs(deltaUsers)) { + this.log("WARNING! LND balance decreased more than users balance with a difference of", result.absoluteDiff, "sats") + if (result.absoluteDiff > this.settings.maxDiffSats) { + this.log("Difference is too big for an update, locking outgoing operations") + return true + } + } else { + this.log("LND balance decreased less than users balance with a difference of", result.absoluteDiff, "sats, could be caused by data loss, or liquidity injection") + return false + } + break + case 'positive': + if (deltaLnd < deltaUsers) { + this.log("WARNING! LND balance increased less than users balance with a difference of", result.absoluteDiff, "sats") + if (result.absoluteDiff > this.settings.maxDiffSats) { + this.log("Difference is too big for an update, locking outgoing operations") + return true + } + } else { + this.log("LND balance increased more than users balance with a difference of", result.absoluteDiff, "sats, could be caused by data loss, or liquidity injection") + return false + } + } + return false + } + + PaymentRequested = async (totalUsersBalance: number) => { + this.log("Payment requested, checking balance") + if (!this.enabled) { + this.log("WARNING! Watchdog not enabled, skipping balance check") + return + } + const totalLndBalance = await this.getTotalLndBalance() + const deltaLnd = totalLndBalance - this.initialLndBalance + const deltaUsers = totalUsersBalance - this.initialUsersBalance + const deny = this.checkBalanceUpdate(deltaLnd, deltaUsers) + if (deny) { + this.log("Balance mismatch detected in absolute update, locking outgoing operations") + this.lnd.LockOutgoingOperations() + return + } + } + + checkDeltas = (deltaLnd: number, deltaUsers: number): DeltaCheckResult => { + if (deltaLnd < 0) { + if (deltaUsers < 0) { + const diff = Math.abs(deltaLnd - deltaUsers) + return { type: 'negative', absoluteDiff: diff, relativeDiff: diff / Math.max(deltaLnd, deltaUsers) } + } else { + const diff = Math.abs(deltaLnd) + deltaUsers + return { type: 'mismatch', absoluteDiff: diff } + } + } else { + if (deltaUsers < 0) { + const diff = deltaLnd + Math.abs(deltaUsers) + return { type: 'mismatch', absoluteDiff: diff } + } else { + const diff = Math.abs(deltaLnd - deltaUsers) + return { type: 'positive', absoluteDiff: diff, relativeDiff: diff / Math.max(deltaLnd, deltaUsers) } + } + } + } +} +type DeltaCheckResult = { type: 'negative' | 'positive', absoluteDiff: number, relativeDiff: number } | { type: 'mismatch', absoluteDiff: number } \ No newline at end of file diff --git a/src/services/main/appUserManager.ts b/src/services/main/appUserManager.ts index ec002e61..7db1ee3e 100644 --- a/src/services/main/appUserManager.ts +++ b/src/services/main/appUserManager.ts @@ -31,9 +31,23 @@ export default class { return decoded } + async BanUser(userId: string): Promise { + const banned = await this.storage.userStorage.BanUser(userId) + const appUsers = await this.storage.applicationStorage.GetAllAppUsersFromUser(userId) + return { + balance_sats: banned.balance_sats, + banned_app_users: appUsers.map(appUser => ({ + app_id: appUser.application.app_id, + app_name: appUser.application.name, + user_identifier: appUser.identifier, + nostr_pub: appUser.nostr_public_key || "" + })) + } + } + async GetUserInfo(ctx: Types.UserContext): Promise { const user = await this.storage.userStorage.GetUser(ctx.user_id) - const app = await this.storage.applicationStorage.GetApplication(ctx.app_id); + const app = await this.storage.applicationStorage.GetApplication(ctx.app_id) const appUser = await this.storage.applicationStorage.GetAppUserFromUser(app, user.user_id) if (!appUser) { throw new Error(`app user ${ctx.user_id} not found`) // TODO: fix logs doxing diff --git a/src/services/main/index.ts b/src/services/main/index.ts index 95b5bb10..33018e04 100644 --- a/src/services/main/index.ts +++ b/src/services/main/index.ts @@ -79,6 +79,10 @@ export default class { await Promise.all(confirmed.map(async c => { if (c.type === 'outgoing') { await this.storage.paymentStorage.UpdateUserTransactionPayment(c.tx.serial_id, { confs: c.confs }) + const { linkedApplication, user, address, paid_amount: amount, service_fees: serviceFee, serial_id: serialId, chain_fees } = c.tx; + const operationId = `${Types.UserOperationType.OUTGOING_TX}-${serialId}` + const op = { amount, paidAtUnix: Date.now() / 1000, inbound: false, type: Types.UserOperationType.OUTGOING_TX, identifier: address, operationId, network_fee: chain_fees, service_fee: serviceFee, confirmed: true, tx_hash: c.tx.tx_hash, internal: c.tx.internal } + this.sendOperationToNostr(linkedApplication!, user.user_id, op) } else { this.storage.StartTransaction(async tx => { const { user_address: userAddress, paid_amount: amount, service_fee: serviceFee, serial_id: serialId, tx_hash } = c.tx @@ -90,12 +94,12 @@ export default class { if (!updateResult.affected) { throw new Error("unable to flag chain transaction as paid") } - await this.storage.userStorage.IncrementUserBalance(userAddress.user.user_id, amount - serviceFee, userAddress.address, tx) + const addressData = `${userAddress.address}:${tx_hash}` + this.storage.eventsLog.LogEvent({ type: 'address_paid', userId: userAddress.user.user_id, appId: userAddress.linkedApplication.app_id, appUserId: "", balance: userAddress.user.balance_sats, data: addressData, amount }) + await this.storage.userStorage.IncrementUserBalance(userAddress.user.user_id, amount - serviceFee, addressData, tx) if (serviceFee > 0) { await this.storage.userStorage.IncrementUserBalance(userAddress.linkedApplication.owner.user_id, serviceFee, 'fees', tx) } - const addressData = `${userAddress.address}:${tx_hash}` - this.storage.eventsLog.LogEvent({ type: 'address_paid', userId: userAddress.user.user_id, appId: userAddress.linkedApplication.app_id, appUserId: "", balance: userAddress.user.balance_sats, data: addressData, amount }) const operationId = `${Types.UserOperationType.INCOMING_TX}-${serialId}` const op = { amount, paidAtUnix: Date.now() / 1000, inbound: true, type: Types.UserOperationType.INCOMING_TX, identifier: userAddress.address, operationId, network_fee: 0, service_fee: serviceFee, confirmed: true, tx_hash: c.tx.tx_hash, internal: c.tx.internal } this.sendOperationToNostr(userAddress.linkedApplication!, userAddress.user.user_id, op) @@ -125,12 +129,13 @@ export default class { // This call will fail if the transaction is already registered const addedTx = await this.storage.paymentStorage.AddAddressReceivingTransaction(userAddress, txOutput.hash, txOutput.index, amount, fee, internal, blockHeight, tx) if (internal) { - await this.storage.userStorage.IncrementUserBalance(userAddress.user.user_id, addedTx.paid_amount - fee, userAddress.address, tx) + const addressData = `${address}:${txOutput.hash}` + this.storage.eventsLog.LogEvent({ type: 'address_paid', userId: userAddress.user.user_id, appId: userAddress.linkedApplication.app_id, appUserId: "", balance: userAddress.user.balance_sats, data: addressData, amount }) + await this.storage.userStorage.IncrementUserBalance(userAddress.user.user_id, addedTx.paid_amount - fee, addressData, tx) if (fee > 0) { await this.storage.userStorage.IncrementUserBalance(userAddress.linkedApplication.owner.user_id, fee, 'fees', tx) } - const addressData = `${address}:${txOutput.hash}` - this.storage.eventsLog.LogEvent({ type: 'address_paid', userId: userAddress.user.user_id, appId: userAddress.linkedApplication.app_id, appUserId: "", balance: userAddress.user.balance_sats, data: addressData, amount }) + } const operationId = `${Types.UserOperationType.INCOMING_TX}-${addedTx.serial_id}` const op = { amount, paidAtUnix: Date.now() / 1000, inbound: true, type: Types.UserOperationType.INCOMING_TX, identifier: userAddress.address, operationId, network_fee: 0, service_fee: fee, confirmed: internal, tx_hash: txOutput.hash, internal: false } @@ -160,11 +165,11 @@ export default class { } try { await this.storage.paymentStorage.FlagInvoiceAsPaid(userInvoice, amount, fee, internal, tx) + this.storage.eventsLog.LogEvent({ type: 'invoice_paid', userId: userInvoice.user.user_id, appId: userInvoice.linkedApplication.app_id, appUserId: "", balance: userInvoice.user.balance_sats, data: paymentRequest, amount }) await this.storage.userStorage.IncrementUserBalance(userInvoice.user.user_id, amount - fee, userInvoice.invoice, tx) if (fee > 0) { await this.storage.userStorage.IncrementUserBalance(userInvoice.linkedApplication.owner.user_id, fee, 'fees', tx) } - this.storage.eventsLog.LogEvent({ type: 'invoice_paid', userId: userInvoice.user.user_id, appId: userInvoice.linkedApplication.app_id, appUserId: "", balance: userInvoice.user.balance_sats, data: paymentRequest, amount }) await this.triggerPaidCallback(log, userInvoice.callbackUrl) const operationId = `${Types.UserOperationType.INCOMING_INVOICE}-${userInvoice.serial_id}` const op = { amount, paidAtUnix: Date.now() / 1000, inbound: true, type: Types.UserOperationType.INCOMING_INVOICE, identifier: userInvoice.invoice, operationId, network_fee: 0, service_fee: fee, confirmed: true, tx_hash: "", internal } diff --git a/src/services/main/init.ts b/src/services/main/init.ts index 4925ca8d..419a3f9f 100644 --- a/src/services/main/init.ts +++ b/src/services/main/init.ts @@ -15,11 +15,13 @@ export const initMainHandler = async (log: PubLogger, mainSettings: MainSettings if (manualMigration) { return } - if (!mainSettings.skipSanityCheck) { - await storageManager.VerifyEventsLog() - } const mainHandler = new Main(mainSettings, storageManager) await mainHandler.lnd.Warmup() + if (!mainSettings.skipSanityCheck) { + await mainHandler.VerifyEventsLog() + } + const totalUsersBalance = await mainHandler.storage.paymentStorage.GetTotalUsersBalance() + await mainHandler.paymentManager.watchDog.SeedLndBalance(totalUsersBalance || 0) const appsData = await mainHandler.storage.applicationStorage.GetApplications() const existingWalletApp = await appsData.find(app => app.name === 'wallet' || app.name === 'wallet-test') if (!existingWalletApp) { @@ -49,7 +51,7 @@ const processArgs = async (mainHandler: Main) => { getLogger({ userId: process.argv[3] })(`user balance updated correctly`) return false case 'unlock': - await mainHandler.storage.userStorage.UnlockUser(process.argv[3]) + await mainHandler.storage.userStorage.UnbanUser(process.argv[3]) getLogger({ userId: process.argv[3] })(`user unlocked`) return false default: diff --git a/src/services/main/paymentManager.ts b/src/services/main/paymentManager.ts index a119e563..c8335368 100644 --- a/src/services/main/paymentManager.ts +++ b/src/services/main/paymentManager.ts @@ -14,6 +14,7 @@ import { SendCoinsResponse } from '../../../proto/lnd/lightning.js' import { Event, verifiedSymbol, verifySignature } from '../nostr/tools/event.js' import { AddressReceivingTransaction } from '../storage/entity/AddressReceivingTransaction.js' import { UserTransactionPayment } from '../storage/entity/UserTransactionPayment.js' +import { Watchdog } from '../lnd/watchdog.js' interface UserOperationInfo { serial_id: number paid_amount: number @@ -45,10 +46,12 @@ export default class { addressPaidCb: AddressPaidCb invoicePaidCb: InvoicePaidCb log = getLogger({ appName: "PaymentManager" }) + watchDog: Watchdog constructor(storage: Storage, lnd: LightningHandler, settings: MainSettings, addressPaidCb: AddressPaidCb, invoicePaidCb: InvoicePaidCb) { this.storage = storage this.settings = settings this.lnd = lnd + this.watchDog = new Watchdog(settings.watchDogSettings, lnd) this.addressPaidCb = addressPaidCb this.invoicePaidCb = invoicePaidCb } @@ -97,6 +100,9 @@ export default class { async NewAddress(ctx: Types.UserContext, req: Types.NewAddressRequest): Promise { const app = await this.storage.applicationStorage.GetApplication(ctx.app_id) const user = await this.storage.userStorage.GetUser(ctx.user_id) + if (user.locked) { + throw new Error("user is banned, cannot generate address") + } const existingAddress = await this.storage.paymentStorage.GetExistingUserAddress(ctx.user_id, app) if (existingAddress) { return { address: existingAddress.address } @@ -109,6 +115,9 @@ export default class { async NewInvoice(userId: string, req: Types.NewInvoiceRequest, options: InboundOptionals = { expiry: defaultInvoiceExpiry }): Promise { const user = await this.storage.userStorage.GetUser(userId) + if (user.locked) { + throw new Error("user is banned, cannot generate invoice") + } const res = await this.lnd.NewInvoice(req.amountSats, req.memo, options.expiry) const userInvoice = await this.storage.paymentStorage.AddUserInvoice(user, res.payRequest, options) const appId = options.linkedApplication ? options.linkedApplication.app_id : "" @@ -134,8 +143,18 @@ export default class { } } + async WatchdogCheck() { + const total = await this.storage.paymentStorage.GetTotalUsersBalance() + await this.watchDog.PaymentRequested(total || 0) + } + async PayInvoice(userId: string, req: Types.PayInvoiceRequest, linkedApplication: Application): Promise { this.log("paying invoice", req.invoice, "for user", userId, "with amount", req.amount) + await this.WatchdogCheck() + const maybeBanned = await this.storage.userStorage.GetUser(userId) + if (maybeBanned.locked) { + throw new Error("user is banned, cannot send payment") + } const decoded = await this.lnd.DecodeInvoice(req.invoice) if (decoded.numSatoshis !== 0 && req.amount !== 0) { throw new Error("invoice has value, do not provide amount the the request") @@ -192,6 +211,12 @@ export default class { async PayAddress(ctx: Types.UserContext, req: Types.PayAddressRequest): Promise { throw new Error("address payment currently disabled, use Lightning instead") + await this.WatchdogCheck() + this.log("paying address", req.address, "for user", ctx.user_id, "with amount", req.amoutSats) + const maybeBanned = await this.storage.userStorage.GetUser(ctx.user_id) + if (maybeBanned.locked) { + throw new Error("user is banned, cannot send chain tx") + } const { blockHeight } = await this.lnd.GetInfo() const app = await this.storage.applicationStorage.GetApplication(ctx.app_id) const serviceFee = this.getServiceFee(Types.UserOperationType.OUTGOING_TX, req.amoutSats, false) @@ -459,6 +484,10 @@ export default class { } async GetUserOperations(userId: string, req: Types.GetUserOperationsRequest): Promise { + const user = await this.storage.userStorage.GetUser(userId) + if (user.locked) { + throw new Error("user is banned, cannot retrieve operations") + } const [outgoingInvoices, outgoingTransactions, incomingInvoices, incomingTransactions, incomingUserToUser, outgoingUserToUser] = await Promise.all([ this.storage.paymentStorage.GetUserInvoicePayments(userId, req.latestOutgoingInvoice, req.max_size), this.storage.paymentStorage.GetUserTransactionPayments(userId, req.latestOutgoingTx, req.max_size), @@ -482,6 +511,9 @@ export default class { await this.storage.StartTransaction(async tx => { const fromUser = await this.storage.userStorage.GetUser(fromUserId, tx) const toUser = await this.storage.userStorage.GetUser(toUserId, tx) + if (fromUser.locked || toUser.locked) { + throw new Error("one of the users is banned, cannot send payment") + } if (fromUser.balance_sats < amount) { throw new Error("not enough balance to send payment") } diff --git a/src/services/main/settings.ts b/src/services/main/settings.ts index 71bb27ad..0fddaf87 100644 --- a/src/services/main/settings.ts +++ b/src/services/main/settings.ts @@ -1,10 +1,12 @@ import { LoadStorageSettingsFromEnv, StorageSettings } from '../storage/index.js' import { LndSettings } from '../lnd/settings.js' +import { LoadWatchdogSettingsFromEnv, WatchdogSettings } from '../lnd/watchdog.js' import { LoadLndSettingsFromEnv } from '../lnd/index.js' import { EnvMustBeInteger, EnvMustBeNonEmptyString } from '../helpers/envParser.js' export type MainSettings = { storageSettings: StorageSettings, lndSettings: LndSettings, + watchDogSettings: WatchdogSettings, jwtSecret: string incomingTxFee: number outgoingTxFee: number @@ -22,6 +24,7 @@ export type MainSettings = { } export const LoadMainSettingsFromEnv = (): MainSettings => { return { + watchDogSettings: LoadWatchdogSettingsFromEnv(), lndSettings: LoadLndSettingsFromEnv(), storageSettings: LoadStorageSettingsFromEnv(), jwtSecret: EnvMustBeNonEmptyString("JWT_SECRET"), @@ -37,7 +40,8 @@ export const LoadMainSettingsFromEnv = (): MainSettings => { servicePort: EnvMustBeInteger("PORT"), recordPerformance: process.env.RECORD_PERFORMANCE === 'true' || false, skipSanityCheck: process.env.SKIP_SANITY_CHECK === 'true' || false, - disableExternalPayments: process.env.DISABLE_EXTERNAL_PAYMENTS === 'true' || false + disableExternalPayments: process.env.DISABLE_EXTERNAL_PAYMENTS === 'true' || false, + } } diff --git a/src/services/serverMethods/index.ts b/src/services/serverMethods/index.ts index d0bb9434..2d1a8dd0 100644 --- a/src/services/serverMethods/index.ts +++ b/src/services/serverMethods/index.ts @@ -19,6 +19,13 @@ export default (mainHandler: Main): Types.ServerMethods => { const info = await mainHandler.lnd.GetInfo() return { alias: info.alias } }, + BanUser: async ({ ctx, req }) => { + const err = Types.BanUserRequestValidate(req, { + user_id_CustomCheck: id => id !== '' + }) + if (err != null) throw new Error(err.message) + return mainHandler.appUserManager.BanUser(req.user_id) + }, SetMockInvoiceAsPaid: async ({ ctx, req }) => { const err = Types.SetMockInvoiceAsPaidRequestValidate(req, { invoice_CustomCheck: invoice => invoice !== '', diff --git a/src/services/storage/applicationStorage.ts b/src/services/storage/applicationStorage.ts index e7d6f772..b54db0fe 100644 --- a/src/services/storage/applicationStorage.ts +++ b/src/services/storage/applicationStorage.ts @@ -143,7 +143,11 @@ export default class { } async GetAppUserFromUser(application: Application, userId: string, entityManager = this.DB): Promise { - return await entityManager.getRepository(ApplicationUser).findOne({ where: { user: { user_id: userId }, application: { app_id: application.app_id } } }) + return entityManager.getRepository(ApplicationUser).findOne({ where: { user: { user_id: userId }, application: { app_id: application.app_id } } }) + } + + async GetAllAppUsersFromUser(userId: string, entityManager = this.DB): Promise { + return entityManager.getRepository(ApplicationUser).find({ where: { user: { user_id: userId } } }) } async IsApplicationOwner(userId: string, entityManager = this.DB) { diff --git a/src/services/storage/paymentStorage.ts b/src/services/storage/paymentStorage.ts index 3fceb8a7..03281232 100644 --- a/src/services/storage/paymentStorage.ts +++ b/src/services/storage/paymentStorage.ts @@ -360,4 +360,8 @@ export default class { break; } } + + async GetTotalUsersBalance(entityManager = this.DB) { + return entityManager.getRepository(User).sum("balance_sats") + } } \ No newline at end of file diff --git a/src/services/storage/userStorage.ts b/src/services/storage/userStorage.ts index 78ad254d..afdb7deb 100644 --- a/src/services/storage/userStorage.ts +++ b/src/services/storage/userStorage.ts @@ -14,6 +14,7 @@ export default class { this.txQueue = txQueue this.eventsLog = eventsLog } + async AddUser(balance: number, dbTx: DataSource | EntityManager): Promise { if (balance && process.env.ALLOW_BALANCE_MIGRATION !== 'true') { throw new Error("balance migration is not allowed") @@ -53,15 +54,7 @@ export default class { return user } - async LockUser(userId: string, entityManager = this.DB) { - const res = await entityManager.getRepository(User).update({ - user_id: userId - }, { locked: true }) - if (!res.affected) { - throw new Error("unaffected user lock for " + userId) // TODO: fix logs doxing - } - } - async UnlockUser(userId: string, entityManager = this.DB) { + async UnbanUser(userId: string, entityManager = this.DB) { const res = await entityManager.getRepository(User).update({ user_id: userId }, { locked: false }) @@ -69,6 +62,20 @@ export default class { throw new Error("unaffected user unlock for " + userId) // TODO: fix logs doxing } } + + async BanUser(userId: string, entityManager = this.DB) { + const user = await this.GetUser(userId, entityManager) + const res = await entityManager.getRepository(User).update({ + user_id: userId + }, { balance_sats: 0, locked: true }) + if (!res.affected) { + throw new Error("unaffected ban user for " + userId) // TODO: fix logs doxing + } + if (user.balance_sats > 0) { + this.eventsLog.LogEvent({ type: 'balance_decrement', userId, appId: "", appUserId: "", balance: user.balance_sats, data: 'ban', amount: user.balance_sats }) + } + return user + } async IncrementUserBalance(userId: string, increment: number, reason: string, entityManager = this.DB) { const user = await this.GetUser(userId, entityManager) const res = await entityManager.getRepository(User).increment({