From 62a2e437afcee62cf3be215410686cce4bce6707 Mon Sep 17 00:00:00 2001 From: boufni95 Date: Fri, 20 Oct 2023 16:55:26 +0200 Subject: [PATCH] live user op --- proto/autogenerated/client.md | 301 +-- proto/autogenerated/debug.txt | 2512 +++++++++++---------- proto/autogenerated/ts/express_server.ts | 1 + proto/autogenerated/ts/http_client.ts | 1 + proto/autogenerated/ts/nostr_client.ts | 121 +- proto/autogenerated/ts/nostr_transport.ts | 11 + proto/autogenerated/ts/types.ts | 1504 ++++++------ proto/protoc-gen-pub | Bin 9046254 -> 9056054 bytes proto/service/methods.proto | 6 + proto/service/structs.proto | 4 + src/services/main/paymentManager.ts | 1 + src/services/storage/paymentStorage.ts | 2 +- 12 files changed, 2311 insertions(+), 2153 deletions(-) diff --git a/proto/autogenerated/client.md b/proto/autogenerated/client.md index 6a21691f..10ef0516 100644 --- a/proto/autogenerated/client.md +++ b/proto/autogenerated/client.md @@ -80,6 +80,11 @@ The nostr server will send back a message response, and inside the body there wi - This methods has an __empty__ __request__ body - output: [LnurlLinkResponse](#LnurlLinkResponse) +- GetLiveUserOperations + - auth type: __User__ + - This methods has an __empty__ __request__ body + - output: [LiveUserOperation](#LiveUserOperation) + # HTTP API DEFINITION ## Supported HTTP Auths @@ -90,9 +95,9 @@ The nostr server will send back a message response, and inside the body there wi - __User__: - expected context content + - __app_id__: _string_ - __app_user_id__: _string_ - __user_id__: _string_ - - __app_id__: _string_ - __Admin__: - expected context content @@ -355,41 +360,48 @@ The nostr server will send back a message response, and inside the body there wi - 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) + # INPUTS AND OUTPUTS ## Messages ### The content of requests and response from the methods -### EncryptionExchangeRequest - - __publicKey__: _string_ - - __deviceId__: _string_ - -### PayInvoiceResponse - - __preimage__: _string_ - - __amount_paid__: _number_ - ### SetMockAppUserBalanceRequest - __user_identifier__: _string_ - __amount__: _number_ -### HandleLnurlPayResponse - - __pr__: _string_ - - __routes__: ARRAY of: _[Empty](#Empty)_ +### LndGetInfoRequest + - __nodeId__: _number_ -### UserOperations - - __fromIndex__: _number_ - - __toIndex__: _number_ - - __operations__: ARRAY of: _[UserOperation](#UserOperation)_ - -### Empty +### AddAppUserInvoiceRequest + - __receiver_identifier__: _string_ + - __payer_identifier__: _string_ + - __http_callback_url__: _string_ + - __invoice_req__: _[NewInvoiceRequest](#NewInvoiceRequest)_ ### GetAppUserLNURLInfoRequest - __user_identifier__: _string_ - __base_url_override__: _string_ -### SendAppUserToAppPaymentRequest - - __from_user_identifier__: _string_ - - __amount__: _number_ +### Product + - __id__: _string_ + - __name__: _string_ + - __price_sats__: _number_ + +### PayAddressRequest + - __address__: _string_ + - __amoutSats__: _number_ + - __satsPerVByte__: _number_ + +### HandleLnurlPayResponse + - __pr__: _string_ + - __routes__: ARRAY of: _[Empty](#Empty)_ ### GetUserOperationsRequest - __latestIncomingInvoice__: _number_ @@ -399,54 +411,117 @@ The nostr server will send back a message response, and inside the body there wi - __latestIncomingUserToUserPayment__: _number_ - __latestOutgoingUserToUserPayment__: _number_ -### UserOperation - - __paidAtUnix__: _number_ - - __type__: _[UserOperationType](#UserOperationType)_ - - __inbound__: _boolean_ - - __amount__: _number_ +### NewAddressResponse + - __address__: _string_ -### Product - - __id__: _string_ - - __name__: _string_ - - __price_sats__: _number_ - -### LndGetInfoResponse - - __alias__: _string_ - -### AddAppUserRequest - - __identifier__: _string_ - - __fail_if_exists__: _boolean_ - - __balance__: _number_ - -### OpenChannelResponse - - __channelId__: _string_ - -### LnurlLinkResponse - - __lnurl__: _string_ - - __k1__: _string_ +### NewInvoiceRequest + - __amountSats__: _number_ + - __memo__: _string_ ### AddProductRequest - __name__: _string_ - __price_sats__: _number_ -### DecodeInvoiceResponse +### UserOperations + - __fromIndex__: _number_ + - __toIndex__: _number_ + - __operations__: ARRAY of: _[UserOperation](#UserOperation)_ + +### PayAddressResponse + - __txId__: _string_ + +### LnurlPayInfoResponse + - __tag__: _string_ + - __callback__: _string_ + - __maxSendable__: _number_ + - __minSendable__: _number_ + - __metadata__: _string_ + +### UserInfo + - __userId__: _string_ + - __balance__: _number_ + +### SendAppUserToAppPaymentRequest + - __from_user_identifier__: _string_ - __amount__: _number_ +### SetMockAppBalanceRequest + - __amount__: _number_ + +### OpenChannelRequest + - __destination__: _string_ + - __fundingAmount__: _number_ + - __pushAmount__: _number_ + - __closeAddress__: _string_ + +### GetUserOperationsResponse + - __latestOutgoingInvoiceOperations__: _[UserOperations](#UserOperations)_ + - __latestIncomingInvoiceOperations__: _[UserOperations](#UserOperations)_ + - __latestOutgoingTxOperations__: _[UserOperations](#UserOperations)_ + - __latestIncomingTxOperations__: _[UserOperations](#UserOperations)_ + - __latestOutgoingUserToUserPayemnts__: _[UserOperations](#UserOperations)_ + - __latestIncomingUserToUserPayemnts__: _[UserOperations](#UserOperations)_ + +### LiveUserOperation + - __id__: _string_ + +### LndGetInfoResponse + - __alias__: _string_ + +### AuthApp + - __app__: _[Application](#Application)_ + - __auth_token__: _string_ + +### SendAppUserToAppUserPaymentRequest + - __from_user_identifier__: _string_ + - __to_user_identifier__: _string_ + - __amount__: _number_ + +### AddAppInvoiceRequest + - __payer_identifier__: _string_ + - __http_callback_url__: _string_ + - __invoice_req__: _[NewInvoiceRequest](#NewInvoiceRequest)_ + +### PayAppUserInvoiceResponse + - __preimage__: _string_ + - __amount_paid__: _number_ + +### NewAddressRequest + - __addressType__: _[AddressType](#AddressType)_ + +### NewInvoiceResponse + - __invoice__: _string_ + ### PayInvoiceRequest - __invoice__: _string_ - __amount__: _number_ -### AuthApp - - __app__: _[Application](#Application)_ - - __auth_token__: _string_ +### AddAppRequest + - __name__: _string_ + - __allow_user_creation__: _boolean_ + +### Application + - __name__: _string_ + - __id__: _string_ + - __balance__: _number_ + - __npub__: _string_ ### AppUser - __identifier__: _string_ - __info__: _[UserInfo](#UserInfo)_ - __max_withdrawable__: _number_ -### PayAddressResponse - - __txId__: _string_ +### GetProductBuyLinkResponse + - __link__: _string_ + +### PayAppUserInvoiceRequest + - __user_identifier__: _string_ + - __invoice__: _string_ + - __amount__: _number_ + +### PayInvoiceResponse + - __preimage__: _string_ + - __amount_paid__: _number_ ### LnurlWithdrawInfoResponse - __tag__: _string_ @@ -458,106 +533,46 @@ The nostr server will send back a message response, and inside the body there wi - __balanceCheck__: _string_ - __payLink__: _string_ -### LndGetInfoRequest - - __nodeId__: _number_ +### UserOperation + - __paidAtUnix__: _number_ + - __type__: _[UserOperationType](#UserOperationType)_ + - __inbound__: _boolean_ + - __amount__: _number_ + +### Empty + +### AddAppUserRequest + - __identifier__: _string_ + - __fail_if_exists__: _boolean_ + - __balance__: _number_ + +### GetAppUserRequest + - __user_identifier__: _string_ + +### DecodeInvoiceRequest + - __invoice__: _string_ + +### DecodeInvoiceResponse + - __amount__: _number_ + +### OpenChannelResponse + - __channelId__: _string_ + +### LnurlLinkResponse + - __lnurl__: _string_ + - __k1__: _string_ + +### EncryptionExchangeRequest + - __publicKey__: _string_ + - __deviceId__: _string_ ### SetMockInvoiceAsPaidRequest - __invoice__: _string_ - __amount__: _number_ -### PayAppUserInvoiceRequest - - __user_identifier__: _string_ - - __invoice__: _string_ - - __amount__: _number_ - -### SendAppUserToAppUserPaymentRequest - - __from_user_identifier__: _string_ - - __to_user_identifier__: _string_ - - __amount__: _number_ - -### SetMockAppBalanceRequest - - __amount__: _number_ - -### NewAddressRequest - - __addressType__: _[AddressType](#AddressType)_ - -### NewAddressResponse - - __address__: _string_ - -### NewInvoiceResponse - - __invoice__: _string_ - -### AddAppRequest - - __name__: _string_ - - __allow_user_creation__: _boolean_ - -### GetAppUserRequest - - __user_identifier__: _string_ - -### GetUserOperationsResponse - - __latestOutgoingInvoiceOperations__: _[UserOperations](#UserOperations)_ - - __latestIncomingInvoiceOperations__: _[UserOperations](#UserOperations)_ - - __latestOutgoingTxOperations__: _[UserOperations](#UserOperations)_ - - __latestIncomingTxOperations__: _[UserOperations](#UserOperations)_ - - __latestOutgoingUserToUserPayemnts__: _[UserOperations](#UserOperations)_ - - __latestIncomingUserToUserPayemnts__: _[UserOperations](#UserOperations)_ - -### GetProductBuyLinkResponse - - __link__: _string_ - -### OpenChannelRequest - - __destination__: _string_ - - __fundingAmount__: _number_ - - __pushAmount__: _number_ - - __closeAddress__: _string_ - -### LnurlPayInfoResponse - - __tag__: _string_ - - __callback__: _string_ - - __maxSendable__: _number_ - - __minSendable__: _number_ - - __metadata__: _string_ - -### AddAppUserInvoiceRequest - - __receiver_identifier__: _string_ - - __payer_identifier__: _string_ - - __http_callback_url__: _string_ - - __invoice_req__: _[NewInvoiceRequest](#NewInvoiceRequest)_ - -### UserInfo - - __userId__: _string_ - - __balance__: _number_ - -### AddAppInvoiceRequest - - __payer_identifier__: _string_ - - __http_callback_url__: _string_ - - __invoice_req__: _[NewInvoiceRequest](#NewInvoiceRequest)_ - -### PayAppUserInvoiceResponse - - __preimage__: _string_ - - __amount_paid__: _number_ - -### PayAddressRequest - - __address__: _string_ - - __amoutSats__: _number_ - - __satsPerVByte__: _number_ - -### NewInvoiceRequest - - __amountSats__: _number_ - - __memo__: _string_ - -### DecodeInvoiceRequest - - __invoice__: _string_ - ### AuthAppRequest - __name__: _string_ - __allow_user_creation__: _boolean_ *this field is optional - -### Application - - __name__: _string_ - - __id__: _string_ - - __balance__: _number_ - - __npub__: _string_ ## Enums ### The enumerators used in the messages diff --git a/proto/autogenerated/debug.txt b/proto/autogenerated/debug.txt index a74bbda2..49d5c02c 100644 --- a/proto/autogenerated/debug.txt +++ b/proto/autogenerated/debug.txt @@ -1,4 +1,4 @@ -([]*main.Method) (len=34 cap=64) { +([]*main.Method) (len=35 cap=64) { (*main.Method)(0xc0002f2500)({ in: (main.MethodMessage) { name: (string) (len=17) "LndGetInfoRequest", @@ -9,8 +9,8 @@ name: (string) (len=18) "LndGetInfoResponse", hasZeroFields: (bool) false }, - opts: (*main.methodOptions)(0xc00054b080)({ - authType: (*main.supportedAuth)(0xc0003fd530)({ + opts: (*main.methodOptions)(0xc000518180)({ + authType: (*main.supportedAuth)(0xc0004d5680)({ id: (string) (len=5) "admin", name: (string) (len=5) "Admin", encrypted: (bool) false, @@ -25,7 +25,8 @@ }, query: ([]string) , nostr: (bool) false - }) + }), + serverStream: (bool) false }), (*main.Method)(0xc0002f2780)({ in: (main.MethodMessage) { @@ -37,8 +38,8 @@ name: (string) (len=7) "AuthApp", hasZeroFields: (bool) false }, - opts: (*main.methodOptions)(0xc00054b200)({ - authType: (*main.supportedAuth)(0xc0003fd5c0)({ + opts: (*main.methodOptions)(0xc000518300)({ + authType: (*main.supportedAuth)(0xc0004d5710)({ id: (string) (len=5) "admin", name: (string) (len=5) "Admin", encrypted: (bool) false, @@ -53,7 +54,8 @@ }, query: ([]string) , nostr: (bool) false - }) + }), + serverStream: (bool) false }), (*main.Method)(0xc0002f2910)({ in: (main.MethodMessage) { @@ -65,8 +67,8 @@ name: (string) (len=7) "AuthApp", hasZeroFields: (bool) false }, - opts: (*main.methodOptions)(0xc00054b380)({ - authType: (*main.supportedAuth)(0xc0003fd650)({ + opts: (*main.methodOptions)(0xc000518480)({ + authType: (*main.supportedAuth)(0xc0004d57a0)({ id: (string) (len=5) "admin", name: (string) (len=5) "Admin", encrypted: (bool) false, @@ -81,7 +83,8 @@ }, query: ([]string) , nostr: (bool) false - }) + }), + serverStream: (bool) false }), (*main.Method)(0xc0002f2960)({ in: (main.MethodMessage) { @@ -93,8 +96,8 @@ name: (string) (len=5) "Empty", hasZeroFields: (bool) true }, - opts: (*main.methodOptions)(0xc00054b500)({ - authType: (*main.supportedAuth)(0xc0003fd6e0)({ + opts: (*main.methodOptions)(0xc000518600)({ + authType: (*main.supportedAuth)(0xc0004d5830)({ id: (string) (len=5) "guest", name: (string) (len=5) "Guest", encrypted: (bool) false, @@ -108,7 +111,8 @@ }, query: ([]string) , nostr: (bool) false - }) + }), + serverStream: (bool) false }), (*main.Method)(0xc0002f29b0)({ in: (main.MethodMessage) { @@ -120,8 +124,8 @@ name: (string) (len=5) "Empty", hasZeroFields: (bool) true }, - opts: (*main.methodOptions)(0xc00054b680)({ - authType: (*main.supportedAuth)(0xc0003fd7a0)({ + opts: (*main.methodOptions)(0xc000518780)({ + authType: (*main.supportedAuth)(0xc0004d58f0)({ id: (string) (len=5) "guest", name: (string) (len=5) "Guest", encrypted: (bool) false, @@ -135,7 +139,8 @@ }, query: ([]string) , nostr: (bool) false - }) + }), + serverStream: (bool) false }), (*main.Method)(0xc0002f2a00)({ in: (main.MethodMessage) { @@ -147,8 +152,8 @@ name: (string) (len=5) "Empty", hasZeroFields: (bool) true }, - opts: (*main.methodOptions)(0xc00054b860)({ - authType: (*main.supportedAuth)(0xc0003fd830)({ + opts: (*main.methodOptions)(0xc000518960)({ + authType: (*main.supportedAuth)(0xc0004d5980)({ id: (string) (len=5) "guest", name: (string) (len=5) "Guest", encrypted: (bool) false, @@ -162,7 +167,8 @@ }, query: ([]string) , nostr: (bool) false - }) + }), + serverStream: (bool) false }), (*main.Method)(0xc0002f2aa0)({ in: (main.MethodMessage) { @@ -174,8 +180,8 @@ name: (string) (len=25) "LnurlWithdrawInfoResponse", hasZeroFields: (bool) false }, - opts: (*main.methodOptions)(0xc00054bbc0)({ - authType: (*main.supportedAuth)(0xc0003fd980)({ + opts: (*main.methodOptions)(0xc000518cc0)({ + authType: (*main.supportedAuth)(0xc0004d5ad0)({ id: (string) (len=5) "guest", name: (string) (len=5) "Guest", encrypted: (bool) false, @@ -191,7 +197,8 @@ (string) (len=2) "k1" }, nostr: (bool) false - }) + }), + serverStream: (bool) false }), (*main.Method)(0xc0002f2b40)({ in: (main.MethodMessage) { @@ -203,8 +210,8 @@ name: (string) (len=5) "Empty", hasZeroFields: (bool) true }, - opts: (*main.methodOptions)(0xc00054bf20)({ - authType: (*main.supportedAuth)(0xc0003fdad0)({ + opts: (*main.methodOptions)(0xc000519020)({ + authType: (*main.supportedAuth)(0xc0004d5c20)({ id: (string) (len=5) "guest", name: (string) (len=5) "Guest", encrypted: (bool) false, @@ -221,7 +228,8 @@ (string) (len=2) "pr" }, nostr: (bool) false - }) + }), + serverStream: (bool) false }), (*main.Method)(0xc0002f2be0)({ in: (main.MethodMessage) { @@ -233,8 +241,8 @@ name: (string) (len=20) "LnurlPayInfoResponse", hasZeroFields: (bool) false }, - opts: (*main.methodOptions)(0xc000323260)({ - authType: (*main.supportedAuth)(0xc0003fdbf0)({ + opts: (*main.methodOptions)(0xc000519380)({ + authType: (*main.supportedAuth)(0xc0004d5d40)({ id: (string) (len=5) "guest", name: (string) (len=5) "Guest", encrypted: (bool) false, @@ -250,7 +258,8 @@ (string) (len=2) "k1" }, nostr: (bool) false - }) + }), + serverStream: (bool) false }), (*main.Method)(0xc0002f2c80)({ in: (main.MethodMessage) { @@ -262,8 +271,8 @@ name: (string) (len=22) "HandleLnurlPayResponse", hasZeroFields: (bool) false }, - opts: (*main.methodOptions)(0xc0003235c0)({ - authType: (*main.supportedAuth)(0xc0003fdd40)({ + opts: (*main.methodOptions)(0xc0005196e0)({ + authType: (*main.supportedAuth)(0xc0004d5e90)({ id: (string) (len=5) "guest", name: (string) (len=5) "Guest", encrypted: (bool) false, @@ -280,7 +289,8 @@ (string) (len=6) "amount" }, nostr: (bool) false - }) + }), + serverStream: (bool) false }), (*main.Method)(0xc0002f2cd0)({ in: (main.MethodMessage) { @@ -292,8 +302,8 @@ name: (string) (len=11) "Application", hasZeroFields: (bool) false }, - opts: (*main.methodOptions)(0xc000323740)({ - authType: (*main.supportedAuth)(0xc0003fddd0)({ + opts: (*main.methodOptions)(0xc000519860)({ + authType: (*main.supportedAuth)(0xc0004d5f20)({ id: (string) (len=3) "app", name: (string) (len=3) "App", encrypted: (bool) false, @@ -308,7 +318,8 @@ }, query: ([]string) , nostr: (bool) false - }) + }), + serverStream: (bool) false }), (*main.Method)(0xc0002f2d70)({ in: (main.MethodMessage) { @@ -320,8 +331,8 @@ name: (string) (len=7) "AppUser", hasZeroFields: (bool) false }, - opts: (*main.methodOptions)(0xc0003238c0)({ - authType: (*main.supportedAuth)(0xc0003fde60)({ + opts: (*main.methodOptions)(0xc0005199e0)({ + authType: (*main.supportedAuth)(0xc0004d5fb0)({ id: (string) (len=3) "app", name: (string) (len=3) "App", encrypted: (bool) false, @@ -336,7 +347,8 @@ }, query: ([]string) , nostr: (bool) false - }) + }), + serverStream: (bool) false }), (*main.Method)(0xc0002f2e10)({ in: (main.MethodMessage) { @@ -348,8 +360,8 @@ name: (string) (len=18) "NewInvoiceResponse", hasZeroFields: (bool) false }, - opts: (*main.methodOptions)(0xc000323a40)({ - authType: (*main.supportedAuth)(0xc0003fdef0)({ + opts: (*main.methodOptions)(0xc000519b60)({ + authType: (*main.supportedAuth)(0xc000100270)({ id: (string) (len=3) "app", name: (string) (len=3) "App", encrypted: (bool) false, @@ -364,7 +376,8 @@ }, query: ([]string) , nostr: (bool) false - }) + }), + serverStream: (bool) false }), (*main.Method)(0xc0002f2e60)({ in: (main.MethodMessage) { @@ -376,8 +389,8 @@ name: (string) (len=18) "NewInvoiceResponse", hasZeroFields: (bool) false }, - opts: (*main.methodOptions)(0xc000323c20)({ - authType: (*main.supportedAuth)(0xc0003fdf80)({ + opts: (*main.methodOptions)(0xc000519d40)({ + authType: (*main.supportedAuth)(0xc000100330)({ id: (string) (len=3) "app", name: (string) (len=3) "App", encrypted: (bool) false, @@ -392,7 +405,8 @@ }, query: ([]string) , nostr: (bool) false - }) + }), + serverStream: (bool) false }), (*main.Method)(0xc0002f2f00)({ in: (main.MethodMessage) { @@ -404,8 +418,8 @@ name: (string) (len=7) "AppUser", hasZeroFields: (bool) false }, - opts: (*main.methodOptions)(0xc000323da0)({ - authType: (*main.supportedAuth)(0xc000100210)({ + opts: (*main.methodOptions)(0xc000519ec0)({ + authType: (*main.supportedAuth)(0xc0001006c0)({ id: (string) (len=3) "app", name: (string) (len=3) "App", encrypted: (bool) false, @@ -420,7 +434,8 @@ }, query: ([]string) , nostr: (bool) false - }) + }), + serverStream: (bool) false }), (*main.Method)(0xc0002f2fa0)({ in: (main.MethodMessage) { @@ -432,8 +447,8 @@ name: (string) (len=25) "PayAppUserInvoiceResponse", hasZeroFields: (bool) false }, - opts: (*main.methodOptions)(0xc000323f20)({ - authType: (*main.supportedAuth)(0xc000100300)({ + opts: (*main.methodOptions)(0xc00006c540)({ + authType: (*main.supportedAuth)(0xc000100e10)({ id: (string) (len=3) "app", name: (string) (len=3) "App", encrypted: (bool) false, @@ -448,7 +463,8 @@ }, query: ([]string) , nostr: (bool) false - }) + }), + serverStream: (bool) false }), (*main.Method)(0xc0002f2ff0)({ in: (main.MethodMessage) { @@ -460,8 +476,8 @@ name: (string) (len=5) "Empty", hasZeroFields: (bool) true }, - opts: (*main.methodOptions)(0xc00006c600)({ - authType: (*main.supportedAuth)(0xc000100690)({ + opts: (*main.methodOptions)(0xc00006c780)({ + authType: (*main.supportedAuth)(0xc000100ed0)({ id: (string) (len=3) "app", name: (string) (len=3) "App", encrypted: (bool) false, @@ -476,7 +492,8 @@ }, query: ([]string) , nostr: (bool) false - }) + }), + serverStream: (bool) false }), (*main.Method)(0xc0002f3090)({ in: (main.MethodMessage) { @@ -488,8 +505,8 @@ name: (string) (len=5) "Empty", hasZeroFields: (bool) true }, - opts: (*main.methodOptions)(0xc00006c7e0)({ - authType: (*main.supportedAuth)(0xc000100de0)({ + opts: (*main.methodOptions)(0xc00006c900)({ + authType: (*main.supportedAuth)(0xc000100f60)({ id: (string) (len=3) "app", name: (string) (len=3) "App", encrypted: (bool) false, @@ -504,7 +521,8 @@ }, query: ([]string) , nostr: (bool) false - }) + }), + serverStream: (bool) false }), (*main.Method)(0xc0002f30e0)({ in: (main.MethodMessage) { @@ -516,8 +534,8 @@ name: (string) (len=20) "LnurlPayInfoResponse", hasZeroFields: (bool) false }, - opts: (*main.methodOptions)(0xc00006c960)({ - authType: (*main.supportedAuth)(0xc000100e70)({ + opts: (*main.methodOptions)(0xc00006ca80)({ + authType: (*main.supportedAuth)(0xc000101140)({ id: (string) (len=3) "app", name: (string) (len=3) "App", encrypted: (bool) false, @@ -532,7 +550,8 @@ }, query: ([]string) , nostr: (bool) false - }) + }), + serverStream: (bool) false }), (*main.Method)(0xc0002f3130)({ in: (main.MethodMessage) { @@ -544,8 +563,8 @@ name: (string) (len=5) "Empty", hasZeroFields: (bool) true }, - opts: (*main.methodOptions)(0xc00006cae0)({ - authType: (*main.supportedAuth)(0xc000100f30)({ + opts: (*main.methodOptions)(0xc00006cc00)({ + authType: (*main.supportedAuth)(0xc0001011d0)({ id: (string) (len=3) "app", name: (string) (len=3) "App", encrypted: (bool) false, @@ -560,7 +579,8 @@ }, query: ([]string) , nostr: (bool) false - }) + }), + serverStream: (bool) false }), (*main.Method)(0xc0002f3180)({ in: (main.MethodMessage) { @@ -572,8 +592,8 @@ name: (string) (len=5) "Empty", hasZeroFields: (bool) true }, - opts: (*main.methodOptions)(0xc00006ccc0)({ - authType: (*main.supportedAuth)(0xc000101080)({ + opts: (*main.methodOptions)(0xc00006cde0)({ + authType: (*main.supportedAuth)(0xc000101260)({ id: (string) (len=3) "app", name: (string) (len=3) "App", encrypted: (bool) false, @@ -588,7 +608,8 @@ }, query: ([]string) , nostr: (bool) false - }) + }), + serverStream: (bool) false }), (*main.Method)(0xc0002f31d0)({ in: (main.MethodMessage) { @@ -600,15 +621,15 @@ name: (string) (len=8) "UserInfo", hasZeroFields: (bool) false }, - opts: (*main.methodOptions)(0xc00006cea0)({ - authType: (*main.supportedAuth)(0xc0001011d0)({ + opts: (*main.methodOptions)(0xc00006d020)({ + authType: (*main.supportedAuth)(0xc000101320)({ id: (string) (len=4) "user", name: (string) (len=4) "User", encrypted: (bool) false, 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" + (string) (len=11) "app_user_id": (string) (len=6) "string", + (string) (len=7) "user_id": (string) (len=6) "string" } }), method: (string) (len=4) "post", @@ -618,7 +639,8 @@ }, query: ([]string) , nostr: (bool) true - }) + }), + serverStream: (bool) false }), (*main.Method)(0xc0002f3270)({ in: (main.MethodMessage) { @@ -630,15 +652,15 @@ name: (string) (len=7) "Product", hasZeroFields: (bool) false }, - opts: (*main.methodOptions)(0xc00006d140)({ - authType: (*main.supportedAuth)(0xc000101260)({ + opts: (*main.methodOptions)(0xc00006d260)({ + authType: (*main.supportedAuth)(0xc0001013b0)({ id: (string) (len=4) "user", name: (string) (len=4) "User", encrypted: (bool) false, 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" + (string) (len=6) "app_id": (string) (len=6) "string", + (string) (len=11) "app_user_id": (string) (len=6) "string" } }), method: (string) (len=4) "post", @@ -648,7 +670,8 @@ }, query: ([]string) , nostr: (bool) true - }) + }), + serverStream: (bool) false }), (*main.Method)(0xc0002f32c0)({ in: (main.MethodMessage) { @@ -660,8 +683,8 @@ name: (string) (len=18) "NewInvoiceResponse", hasZeroFields: (bool) false }, - opts: (*main.methodOptions)(0xc00057a0c0)({ - authType: (*main.supportedAuth)(0xc000101380)({ + opts: (*main.methodOptions)(0xc00055c1e0)({ + authType: (*main.supportedAuth)(0xc0001014d0)({ id: (string) (len=4) "user", name: (string) (len=4) "User", encrypted: (bool) false, @@ -680,7 +703,8 @@ (string) (len=2) "id" }, nostr: (bool) true - }) + }), + serverStream: (bool) false }), (*main.Method)(0xc0002f3310)({ in: (main.MethodMessage) { @@ -692,15 +716,15 @@ name: (string) (len=25) "GetUserOperationsResponse", hasZeroFields: (bool) false }, - opts: (*main.methodOptions)(0xc00057a2a0)({ - authType: (*main.supportedAuth)(0xc000101410)({ + opts: (*main.methodOptions)(0xc00055c3c0)({ + authType: (*main.supportedAuth)(0xc000101560)({ id: (string) (len=4) "user", name: (string) (len=4) "User", encrypted: (bool) false, 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" + (string) (len=11) "app_user_id": (string) (len=6) "string", + (string) (len=7) "user_id": (string) (len=6) "string" } }), method: (string) (len=4) "post", @@ -710,7 +734,8 @@ }, query: ([]string) , nostr: (bool) true - }) + }), + serverStream: (bool) false }), (*main.Method)(0xc0002f33b0)({ in: (main.MethodMessage) { @@ -722,15 +747,15 @@ name: (string) (len=18) "NewAddressResponse", hasZeroFields: (bool) false }, - opts: (*main.methodOptions)(0xc00057a480)({ - authType: (*main.supportedAuth)(0xc0001014a0)({ + opts: (*main.methodOptions)(0xc00055c5a0)({ + authType: (*main.supportedAuth)(0xc0001015f0)({ id: (string) (len=4) "user", name: (string) (len=4) "User", encrypted: (bool) false, 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" + (string) (len=11) "app_user_id": (string) (len=6) "string", + (string) (len=7) "user_id": (string) (len=6) "string" } }), method: (string) (len=4) "post", @@ -740,7 +765,8 @@ }, query: ([]string) , nostr: (bool) true - }) + }), + serverStream: (bool) false }), (*main.Method)(0xc0002f3450)({ in: (main.MethodMessage) { @@ -752,15 +778,15 @@ name: (string) (len=18) "PayAddressResponse", hasZeroFields: (bool) false }, - opts: (*main.methodOptions)(0xc00057a660)({ - authType: (*main.supportedAuth)(0xc000101530)({ + opts: (*main.methodOptions)(0xc00055c780)({ + authType: (*main.supportedAuth)(0xc000101680)({ id: (string) (len=4) "user", name: (string) (len=4) "User", encrypted: (bool) false, 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" + (string) (len=11) "app_user_id": (string) (len=6) "string", + (string) (len=7) "user_id": (string) (len=6) "string" } }), method: (string) (len=4) "post", @@ -770,7 +796,8 @@ }, query: ([]string) , nostr: (bool) true - }) + }), + serverStream: (bool) false }), (*main.Method)(0xc0002f34f0)({ in: (main.MethodMessage) { @@ -782,8 +809,8 @@ name: (string) (len=18) "NewInvoiceResponse", hasZeroFields: (bool) false }, - opts: (*main.methodOptions)(0xc00057a840)({ - authType: (*main.supportedAuth)(0xc0001015c0)({ + opts: (*main.methodOptions)(0xc00055c960)({ + authType: (*main.supportedAuth)(0xc000101890)({ id: (string) (len=4) "user", name: (string) (len=4) "User", encrypted: (bool) false, @@ -800,7 +827,8 @@ }, query: ([]string) , nostr: (bool) true - }) + }), + serverStream: (bool) false }), (*main.Method)(0xc0002f3590)({ in: (main.MethodMessage) { @@ -812,15 +840,15 @@ name: (string) (len=21) "DecodeInvoiceResponse", hasZeroFields: (bool) false }, - opts: (*main.methodOptions)(0xc00057aa20)({ - authType: (*main.supportedAuth)(0xc000101650)({ + opts: (*main.methodOptions)(0xc00055cb40)({ + authType: (*main.supportedAuth)(0xc000101920)({ id: (string) (len=4) "user", name: (string) (len=4) "User", encrypted: (bool) false, 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" + (string) (len=11) "app_user_id": (string) (len=6) "string", + (string) (len=7) "user_id": (string) (len=6) "string" } }), method: (string) (len=4) "post", @@ -830,7 +858,8 @@ }, query: ([]string) , nostr: (bool) true - }) + }), + serverStream: (bool) false }), (*main.Method)(0xc0002f3630)({ in: (main.MethodMessage) { @@ -842,15 +871,15 @@ name: (string) (len=18) "PayInvoiceResponse", hasZeroFields: (bool) false }, - opts: (*main.methodOptions)(0xc00057ac00)({ - authType: (*main.supportedAuth)(0xc000101860)({ + opts: (*main.methodOptions)(0xc00055cd20)({ + authType: (*main.supportedAuth)(0xc000101b30)({ id: (string) (len=4) "user", name: (string) (len=4) "User", encrypted: (bool) false, 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" + (string) (len=11) "app_user_id": (string) (len=6) "string", + (string) (len=7) "user_id": (string) (len=6) "string" } }), method: (string) (len=4) "post", @@ -860,7 +889,8 @@ }, query: ([]string) , nostr: (bool) true - }) + }), + serverStream: (bool) false }), (*main.Method)(0xc0002f36d0)({ in: (main.MethodMessage) { @@ -872,15 +902,15 @@ name: (string) (len=19) "OpenChannelResponse", hasZeroFields: (bool) false }, - opts: (*main.methodOptions)(0xc00057ade0)({ - authType: (*main.supportedAuth)(0xc0001018f0)({ + opts: (*main.methodOptions)(0xc00055cf00)({ + authType: (*main.supportedAuth)(0xc000101e00)({ id: (string) (len=4) "user", name: (string) (len=4) "User", encrypted: (bool) false, 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", - (string) (len=6) "app_id": (string) (len=6) "string" + (string) (len=7) "user_id": (string) (len=6) "string" } }), method: (string) (len=4) "post", @@ -890,7 +920,8 @@ }, query: ([]string) , nostr: (bool) true - }) + }), + serverStream: (bool) false }), (*main.Method)(0xc0002f3770)({ in: (main.MethodMessage) { @@ -902,15 +933,15 @@ name: (string) (len=17) "LnurlLinkResponse", hasZeroFields: (bool) false }, - opts: (*main.methodOptions)(0xc00057afc0)({ - authType: (*main.supportedAuth)(0xc000101b00)({ + opts: (*main.methodOptions)(0xc00055d0e0)({ + authType: (*main.supportedAuth)(0xc000246000)({ id: (string) (len=4) "user", name: (string) (len=4) "User", encrypted: (bool) false, 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" + (string) (len=11) "app_user_id": (string) (len=6) "string", + (string) (len=7) "user_id": (string) (len=6) "string" } }), method: (string) (len=3) "get", @@ -920,7 +951,8 @@ }, query: ([]string) , nostr: (bool) true - }) + }), + serverStream: (bool) false }), (*main.Method)(0xc0002f3810)({ in: (main.MethodMessage) { @@ -932,15 +964,15 @@ name: (string) (len=17) "LnurlLinkResponse", hasZeroFields: (bool) false }, - opts: (*main.methodOptions)(0xc00057b1a0)({ - authType: (*main.supportedAuth)(0xc000101dd0)({ + opts: (*main.methodOptions)(0xc00055d2c0)({ + authType: (*main.supportedAuth)(0xc000246090)({ id: (string) (len=4) "user", name: (string) (len=4) "User", encrypted: (bool) false, 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", - (string) (len=6) "app_id": (string) (len=6) "string" + (string) (len=7) "user_id": (string) (len=6) "string" } }), method: (string) (len=3) "get", @@ -950,7 +982,8 @@ }, query: ([]string) , nostr: (bool) true - }) + }), + serverStream: (bool) false }), (*main.Method)(0xc0002f38b0)({ in: (main.MethodMessage) { @@ -962,15 +995,15 @@ name: (string) (len=17) "LnurlLinkResponse", hasZeroFields: (bool) false }, - opts: (*main.methodOptions)(0xc00057b380)({ - authType: (*main.supportedAuth)(0xc000101e60)({ + opts: (*main.methodOptions)(0xc00055d4a0)({ + authType: (*main.supportedAuth)(0xc000246690)({ id: (string) (len=4) "user", name: (string) (len=4) "User", encrypted: (bool) false, 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" + (string) (len=11) "app_user_id": (string) (len=6) "string", + (string) (len=7) "user_id": (string) (len=6) "string" } }), method: (string) (len=4) "post", @@ -980,12 +1013,44 @@ }, query: ([]string) , nostr: (bool) true - }) + }), + serverStream: (bool) false + }), + (*main.Method)(0xc0002f3950)({ + 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)(0xc00055d680)({ + authType: (*main.supportedAuth)(0xc000246810)({ + id: (string) (len=4) "user", + name: (string) (len=4) "User", + encrypted: (bool) false, + 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=24) "/api/user/operations/sub", + params: ([]string) + }, + query: ([]string) , + nostr: (bool) true + }), + serverStream: (bool) true }) } ([]*main.Enum) (len=2 cap=2) { - (*main.Enum)(0xc0003fcc60)({ + (*main.Enum)(0xc0004d4db0)({ name: (string) (len=11) "AddressType", values: ([]main.EnumValue) (len=3 cap=4) { (main.EnumValue) { @@ -1002,7 +1067,7 @@ } } }), - (*main.Enum)(0xc0003fccc0)({ + (*main.Enum)(0xc0004d4e10)({ name: (string) (len=17) "UserOperationType", values: ([]main.EnumValue) (len=6 cap=8) { (main.EnumValue) { @@ -1033,102 +1098,12 @@ }) } -(map[string]*main.Message) (len=45) { - (string) (len=24) "AddAppUserInvoiceRequest": (*main.Message)(0xc00052a580)({ - fullName: (string) (len=24) "AddAppUserInvoiceRequest", - name: (string) (len=24) "AddAppUserInvoiceRequest", - fields: ([]*main.Field) (len=4 cap=4) { - (*main.Field)(0xc0000fb140)({ - 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)(0xc0000fb170)({ - 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)(0xc0000fb1a0)({ - 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)(0xc0000fb1d0)({ - 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=8) "UserInfo": (*main.Message)(0xc00052ac40)({ - fullName: (string) (len=8) "UserInfo", - name: (string) (len=8) "UserInfo", - fields: ([]*main.Field) (len=2 cap=2) { - (*main.Field)(0xc0000fbbf0)({ - 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)(0xc0000fbc20)({ - 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=25) "PayAppUserInvoiceResponse": (*main.Message)(0xc00052a640)({ - fullName: (string) (len=25) "PayAppUserInvoiceResponse", - name: (string) (len=25) "PayAppUserInvoiceResponse", - fields: ([]*main.Field) (len=2 cap=2) { - (*main.Field)(0xc0000fb2c0)({ - 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)(0xc0000fb2f0)({ - 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 - }) - } - }), - (string) (len=17) "PayAddressRequest": (*main.Message)(0xc00052a840)({ - fullName: (string) (len=17) "PayAddressRequest", - name: (string) (len=17) "PayAddressRequest", - fields: ([]*main.Field) (len=3 cap=4) { - (*main.Field)(0xc0000fb560)({ +(map[string]*main.Message) (len=46) { + (string) (len=18) "NewAddressResponse": (*main.Message)(0xc00043c7c0)({ + fullName: (string) (len=18) "NewAddressResponse", + name: (string) (len=18) "NewAddressResponse", + fields: ([]*main.Field) (len=1 cap=1) { + (*main.Field)(0xc000401dd0)({ name: (string) (len=7) "address", kind: (string) (len=6) "string", isMap: (bool) false, @@ -1136,32 +1111,14 @@ isEnum: (bool) false, isMessage: (bool) false, isOptional: (bool) false - }), - (*main.Field)(0xc0000fb590)({ - 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)(0xc0000fb5c0)({ - 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=17) "NewInvoiceRequest": (*main.Message)(0xc00052a8c0)({ + (string) (len=17) "NewInvoiceRequest": (*main.Message)(0xc00043c880)({ fullName: (string) (len=17) "NewInvoiceRequest", name: (string) (len=17) "NewInvoiceRequest", fields: ([]*main.Field) (len=2 cap=2) { - (*main.Field)(0xc0000fb620)({ + (*main.Field)(0xc000401ec0)({ name: (string) (len=10) "amountSats", kind: (string) (len=5) "int64", isMap: (bool) false, @@ -1170,7 +1127,7 @@ isMessage: (bool) false, isOptional: (bool) false }), - (*main.Field)(0xc0000fb650)({ + (*main.Field)(0xc000401ef0)({ name: (string) (len=4) "memo", kind: (string) (len=6) "string", isMap: (bool) false, @@ -1181,514 +1138,11 @@ }) } }), - (string) (len=20) "DecodeInvoiceRequest": (*main.Message)(0xc00052a940)({ - fullName: (string) (len=20) "DecodeInvoiceRequest", - name: (string) (len=20) "DecodeInvoiceRequest", - fields: ([]*main.Field) (len=1 cap=1) { - (*main.Field)(0xc0000fb6b0)({ - 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=14) "AuthAppRequest": (*main.Message)(0xc00052a400)({ - fullName: (string) (len=14) "AuthAppRequest", - name: (string) (len=14) "AuthAppRequest", - fields: ([]*main.Field) (len=2 cap=2) { - (*main.Field)(0xc0000fae10)({ - 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)(0xc0000fae40)({ - 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=11) "Application": (*main.Message)(0xc00052a440)({ - fullName: (string) (len=11) "Application", - name: (string) (len=11) "Application", - fields: ([]*main.Field) (len=4 cap=4) { - (*main.Field)(0xc0000fae70)({ - 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)(0xc0000faea0)({ - 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)(0xc0000faed0)({ - 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)(0xc0000faf00)({ - 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=20) "AddAppInvoiceRequest": (*main.Message)(0xc00052a540)({ - fullName: (string) (len=20) "AddAppInvoiceRequest", - name: (string) (len=20) "AddAppInvoiceRequest", - fields: ([]*main.Field) (len=3 cap=4) { - (*main.Field)(0xc0000fb0b0)({ - 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)(0xc0000fb0e0)({ - 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)(0xc0000fb110)({ - 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) "EncryptionExchangeRequest": (*main.Message)(0xc00052a2c0)({ - fullName: (string) (len=25) "EncryptionExchangeRequest", - name: (string) (len=25) "EncryptionExchangeRequest", - fields: ([]*main.Field) (len=2 cap=2) { - (*main.Field)(0xc0000fac90)({ - 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)(0xc0000facc0)({ - 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=18) "PayInvoiceResponse": (*main.Message)(0xc00052aa00)({ - fullName: (string) (len=18) "PayInvoiceResponse", - name: (string) (len=18) "PayInvoiceResponse", - fields: ([]*main.Field) (len=2 cap=2) { - (*main.Field)(0xc0000fb770)({ - 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)(0xc0000fb7a0)({ - 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 - }) - } - }), - (string) (len=22) "HandleLnurlPayResponse": (*main.Message)(0xc00052ac00)({ - fullName: (string) (len=22) "HandleLnurlPayResponse", - name: (string) (len=22) "HandleLnurlPayResponse", - fields: ([]*main.Field) (len=2 cap=2) { - (*main.Field)(0xc0000fbb90)({ - 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)(0xc0000fbbc0)({ - 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=14) "UserOperations": (*main.Message)(0xc00052ad40)({ - fullName: (string) (len=14) "UserOperations", - name: (string) (len=14) "UserOperations", - fields: ([]*main.Field) (len=3 cap=4) { - (*main.Field)(0xc0000fbe30)({ - 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)(0xc0000fbe60)({ - 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)(0xc0000fbe90)({ - 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=5) "Empty": (*main.Message)(0xc00052a280)({ - fullName: (string) (len=5) "Empty", - name: (string) (len=5) "Empty", - fields: ([]*main.Field) - }), - (string) (len=26) "GetAppUserLNURLInfoRequest": (*main.Message)(0xc00052a700)({ - fullName: (string) (len=26) "GetAppUserLNURLInfoRequest", - name: (string) (len=26) "GetAppUserLNURLInfoRequest", - fields: ([]*main.Field) (len=2 cap=2) { - (*main.Field)(0xc0000fb410)({ - 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)(0xc0000fb440)({ - 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=28) "SetMockAppUserBalanceRequest": (*main.Message)(0xc00052a740)({ - fullName: (string) (len=28) "SetMockAppUserBalanceRequest", - name: (string) (len=28) "SetMockAppUserBalanceRequest", - fields: ([]*main.Field) (len=2 cap=2) { - (*main.Field)(0xc0000fb470)({ - 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)(0xc0000fb4a0)({ - 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=24) "GetUserOperationsRequest": (*main.Message)(0xc00052acc0)({ - fullName: (string) (len=24) "GetUserOperationsRequest", - name: (string) (len=24) "GetUserOperationsRequest", - fields: ([]*main.Field) (len=6 cap=8) { - (*main.Field)(0xc0000fbc50)({ - 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)(0xc0000fbc80)({ - 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)(0xc0000fbcb0)({ - 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)(0xc0000fbce0)({ - 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)(0xc0000fbd10)({ - 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)(0xc0000fbd40)({ - 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 - }) - } - }), - (string) (len=13) "UserOperation": (*main.Message)(0xc00052ad00)({ - fullName: (string) (len=13) "UserOperation", - name: (string) (len=13) "UserOperation", - fields: ([]*main.Field) (len=4 cap=4) { - (*main.Field)(0xc0000fbd70)({ - 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)(0xc0000fbda0)({ - 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)(0xc0000fbdd0)({ - 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)(0xc0000fbe00)({ - 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=7) "Product": (*main.Message)(0xc00052ae40)({ - fullName: (string) (len=7) "Product", - name: (string) (len=7) "Product", - fields: ([]*main.Field) (len=3 cap=4) { - (*main.Field)(0xc0003fcb70)({ - 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)(0xc0003fcba0)({ - 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)(0xc0003fcbd0)({ - 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=18) "LndGetInfoResponse": (*main.Message)(0xc00052a380)({ - fullName: (string) (len=18) "LndGetInfoResponse", - name: (string) (len=18) "LndGetInfoResponse", - fields: ([]*main.Field) (len=1 cap=1) { - (*main.Field)(0xc0000fad80)({ - 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) "AddAppUserRequest": (*main.Message)(0xc00052a4c0)({ - fullName: (string) (len=17) "AddAppUserRequest", - name: (string) (len=17) "AddAppUserRequest", - fields: ([]*main.Field) (len=3 cap=4) { - (*main.Field)(0xc0000faf90)({ - 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)(0xc0000fafc0)({ - 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)(0xc0000faff0)({ - 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=30) "SendAppUserToAppPaymentRequest": (*main.Message)(0xc00052a6c0)({ - fullName: (string) (len=30) "SendAppUserToAppPaymentRequest", - name: (string) (len=30) "SendAppUserToAppPaymentRequest", - fields: ([]*main.Field) (len=2 cap=2) { - (*main.Field)(0xc0000fb3b0)({ - 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)(0xc0000fb3e0)({ - 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) "LnurlLinkResponse": (*main.Message)(0xc00052aac0)({ - fullName: (string) (len=17) "LnurlLinkResponse", - name: (string) (len=17) "LnurlLinkResponse", - fields: ([]*main.Field) (len=2 cap=2) { - (*main.Field)(0xc0000fb8c0)({ - 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)(0xc0000fb8f0)({ - 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=17) "AddProductRequest": (*main.Message)(0xc00052ae00)({ + (string) (len=17) "AddProductRequest": (*main.Message)(0xc00043cdc0)({ fullName: (string) (len=17) "AddProductRequest", name: (string) (len=17) "AddProductRequest", fields: ([]*main.Field) (len=2 cap=2) { - (*main.Field)(0xc0003fcb10)({ + (*main.Field)(0xc0004d4c30)({ name: (string) (len=4) "name", kind: (string) (len=6) "string", isMap: (bool) false, @@ -1697,7 +1151,7 @@ isMessage: (bool) false, isOptional: (bool) false }), - (*main.Field)(0xc0003fcb40)({ + (*main.Field)(0xc0004d4c60)({ name: (string) (len=10) "price_sats", kind: (string) (len=5) "int64", isMap: (bool) false, @@ -1708,98 +1162,11 @@ }) } }), - (string) (len=21) "DecodeInvoiceResponse": (*main.Message)(0xc00052a980)({ - fullName: (string) (len=21) "DecodeInvoiceResponse", - name: (string) (len=21) "DecodeInvoiceResponse", - fields: ([]*main.Field) (len=1 cap=1) { - (*main.Field)(0xc0000fb6e0)({ - 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) "PayInvoiceRequest": (*main.Message)(0xc00052a9c0)({ - fullName: (string) (len=17) "PayInvoiceRequest", - name: (string) (len=17) "PayInvoiceRequest", - fields: ([]*main.Field) (len=2 cap=2) { - (*main.Field)(0xc0000fb710)({ - 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)(0xc0000fb740)({ - 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=19) "OpenChannelResponse": (*main.Message)(0xc00052aa80)({ - fullName: (string) (len=19) "OpenChannelResponse", - name: (string) (len=19) "OpenChannelResponse", - fields: ([]*main.Field) (len=1 cap=1) { - (*main.Field)(0xc0000fb890)({ - 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=7) "AppUser": (*main.Message)(0xc00052a500)({ - fullName: (string) (len=7) "AppUser", - name: (string) (len=7) "AppUser", - fields: ([]*main.Field) (len=3 cap=4) { - (*main.Field)(0xc0000fb020)({ - 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)(0xc0000fb050)({ - 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)(0xc0000fb080)({ - 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=18) "PayAddressResponse": (*main.Message)(0xc00052a880)({ + (string) (len=18) "PayAddressResponse": (*main.Message)(0xc00043c840)({ fullName: (string) (len=18) "PayAddressResponse", name: (string) (len=18) "PayAddressResponse", fields: ([]*main.Field) (len=1 cap=1) { - (*main.Field)(0xc0000fb5f0)({ + (*main.Field)(0xc000401e90)({ name: (string) (len=4) "txId", kind: (string) (len=6) "string", isMap: (bool) false, @@ -1810,374 +1177,11 @@ }) } }), - (string) (len=25) "LnurlWithdrawInfoResponse": (*main.Message)(0xc00052ab40)({ - fullName: (string) (len=25) "LnurlWithdrawInfoResponse", - name: (string) (len=25) "LnurlWithdrawInfoResponse", - fields: ([]*main.Field) (len=8 cap=8) { - (*main.Field)(0xc0000fb920)({ - 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)(0xc0000fb950)({ - 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)(0xc0000fb980)({ - 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)(0xc0000fb9b0)({ - 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)(0xc0000fb9e0)({ - 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)(0xc0000fba10)({ - 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)(0xc0000fba40)({ - 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)(0xc0000fba70)({ - 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=17) "LndGetInfoRequest": (*main.Message)(0xc00052a300)({ - fullName: (string) (len=17) "LndGetInfoRequest", - name: (string) (len=17) "LndGetInfoRequest", - fields: ([]*main.Field) (len=1 cap=1) { - (*main.Field)(0xc0000facf0)({ - 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=27) "SetMockInvoiceAsPaidRequest": (*main.Message)(0xc00052a340)({ - fullName: (string) (len=27) "SetMockInvoiceAsPaidRequest", - name: (string) (len=27) "SetMockInvoiceAsPaidRequest", - fields: ([]*main.Field) (len=2 cap=2) { - (*main.Field)(0xc0000fad20)({ - 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)(0xc0000fad50)({ - 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=7) "AuthApp": (*main.Message)(0xc00052a480)({ - fullName: (string) (len=7) "AuthApp", - name: (string) (len=7) "AuthApp", - fields: ([]*main.Field) (len=2 cap=2) { - (*main.Field)(0xc0000faf30)({ - 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)(0xc0000faf60)({ - 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=34) "SendAppUserToAppUserPaymentRequest": (*main.Message)(0xc00052a680)({ - fullName: (string) (len=34) "SendAppUserToAppUserPaymentRequest", - name: (string) (len=34) "SendAppUserToAppUserPaymentRequest", - fields: ([]*main.Field) (len=3 cap=4) { - (*main.Field)(0xc0000fb320)({ - 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)(0xc0000fb350)({ - 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)(0xc0000fb380)({ - 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=24) "SetMockAppBalanceRequest": (*main.Message)(0xc00052a780)({ - fullName: (string) (len=24) "SetMockAppBalanceRequest", - name: (string) (len=24) "SetMockAppBalanceRequest", - fields: ([]*main.Field) (len=1 cap=1) { - (*main.Field)(0xc0000fb4d0)({ - 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) "NewAddressRequest": (*main.Message)(0xc00052a7c0)({ - fullName: (string) (len=17) "NewAddressRequest", - name: (string) (len=17) "NewAddressRequest", - fields: ([]*main.Field) (len=1 cap=1) { - (*main.Field)(0xc0000fb500)({ - 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=18) "NewAddressResponse": (*main.Message)(0xc00052a800)({ - fullName: (string) (len=18) "NewAddressResponse", - name: (string) (len=18) "NewAddressResponse", - fields: ([]*main.Field) (len=1 cap=1) { - (*main.Field)(0xc0000fb530)({ - 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=18) "NewInvoiceResponse": (*main.Message)(0xc00052a900)({ - fullName: (string) (len=18) "NewInvoiceResponse", - name: (string) (len=18) "NewInvoiceResponse", - fields: ([]*main.Field) (len=1 cap=1) { - (*main.Field)(0xc0000fb680)({ - 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=13) "AddAppRequest": (*main.Message)(0xc00052a3c0)({ - fullName: (string) (len=13) "AddAppRequest", - name: (string) (len=13) "AddAppRequest", - fields: ([]*main.Field) (len=2 cap=2) { - (*main.Field)(0xc0000fadb0)({ - 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)(0xc0000fade0)({ - 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) "GetAppUserRequest": (*main.Message)(0xc00052a5c0)({ - fullName: (string) (len=17) "GetAppUserRequest", - name: (string) (len=17) "GetAppUserRequest", - fields: ([]*main.Field) (len=1 cap=1) { - (*main.Field)(0xc0000fb200)({ - 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=24) "PayAppUserInvoiceRequest": (*main.Message)(0xc00052a600)({ - fullName: (string) (len=24) "PayAppUserInvoiceRequest", - name: (string) (len=24) "PayAppUserInvoiceRequest", - fields: ([]*main.Field) (len=3 cap=4) { - (*main.Field)(0xc0000fb230)({ - 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)(0xc0000fb260)({ - 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)(0xc0000fb290)({ - 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=25) "GetProductBuyLinkResponse": (*main.Message)(0xc00052ae80)({ - fullName: (string) (len=25) "GetProductBuyLinkResponse", - name: (string) (len=25) "GetProductBuyLinkResponse", - fields: ([]*main.Field) (len=1 cap=1) { - (*main.Field)(0xc0003fcc00)({ - 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=18) "OpenChannelRequest": (*main.Message)(0xc00052aa40)({ - fullName: (string) (len=18) "OpenChannelRequest", - name: (string) (len=18) "OpenChannelRequest", - fields: ([]*main.Field) (len=4 cap=4) { - (*main.Field)(0xc0000fb7d0)({ - 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)(0xc0000fb800)({ - 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)(0xc0000fb830)({ - 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)(0xc0000fb860)({ - 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)(0xc00052abc0)({ + (string) (len=20) "LnurlPayInfoResponse": (*main.Message)(0xc00043cb80)({ fullName: (string) (len=20) "LnurlPayInfoResponse", name: (string) (len=20) "LnurlPayInfoResponse", fields: ([]*main.Field) (len=5 cap=8) { - (*main.Field)(0xc0000fbaa0)({ + (*main.Field)(0xc0004d46f0)({ name: (string) (len=3) "tag", kind: (string) (len=6) "string", isMap: (bool) false, @@ -2186,7 +1190,7 @@ isMessage: (bool) false, isOptional: (bool) false }), - (*main.Field)(0xc0000fbad0)({ + (*main.Field)(0xc0004d4720)({ name: (string) (len=8) "callback", kind: (string) (len=6) "string", isMap: (bool) false, @@ -2195,7 +1199,7 @@ isMessage: (bool) false, isOptional: (bool) false }), - (*main.Field)(0xc0000fbb00)({ + (*main.Field)(0xc0004d4750)({ name: (string) (len=11) "maxSendable", kind: (string) (len=5) "int64", isMap: (bool) false, @@ -2204,7 +1208,7 @@ isMessage: (bool) false, isOptional: (bool) false }), - (*main.Field)(0xc0000fbb30)({ + (*main.Field)(0xc0004d4780)({ name: (string) (len=11) "minSendable", kind: (string) (len=5) "int64", isMap: (bool) false, @@ -2213,7 +1217,7 @@ isMessage: (bool) false, isOptional: (bool) false }), - (*main.Field)(0xc0000fbb60)({ + (*main.Field)(0xc0004d47b0)({ name: (string) (len=8) "metadata", kind: (string) (len=6) "string", isMap: (bool) false, @@ -2224,11 +1228,68 @@ }) } }), - (string) (len=25) "GetUserOperationsResponse": (*main.Message)(0xc00052adc0)({ + (string) (len=8) "UserInfo": (*main.Message)(0xc00043cc00)({ + fullName: (string) (len=8) "UserInfo", + name: (string) (len=8) "UserInfo", + fields: ([]*main.Field) (len=2 cap=2) { + (*main.Field)(0xc0004d4840)({ + 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)(0xc0004d4870)({ + 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=14) "UserOperations": (*main.Message)(0xc00043cd00)({ + fullName: (string) (len=14) "UserOperations", + name: (string) (len=14) "UserOperations", + fields: ([]*main.Field) (len=3 cap=4) { + (*main.Field)(0xc0004d4a80)({ + 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)(0xc0004d4ab0)({ + 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)(0xc0004d4ae0)({ + 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=25) "GetUserOperationsResponse": (*main.Message)(0xc00043cd80)({ fullName: (string) (len=25) "GetUserOperationsResponse", name: (string) (len=25) "GetUserOperationsResponse", fields: ([]*main.Field) (len=6 cap=8) { - (*main.Field)(0xc0000fbec0)({ + (*main.Field)(0xc0004d4b10)({ name: (string) (len=31) "latestOutgoingInvoiceOperations", kind: (string) (len=14) "UserOperations", isMap: (bool) false, @@ -2237,7 +1298,7 @@ isMessage: (bool) true, isOptional: (bool) false }), - (*main.Field)(0xc0000fbef0)({ + (*main.Field)(0xc0004d4b40)({ name: (string) (len=31) "latestIncomingInvoiceOperations", kind: (string) (len=14) "UserOperations", isMap: (bool) false, @@ -2246,7 +1307,7 @@ isMessage: (bool) true, isOptional: (bool) false }), - (*main.Field)(0xc0000fbf20)({ + (*main.Field)(0xc0004d4b70)({ name: (string) (len=26) "latestOutgoingTxOperations", kind: (string) (len=14) "UserOperations", isMap: (bool) false, @@ -2255,7 +1316,7 @@ isMessage: (bool) true, isOptional: (bool) false }), - (*main.Field)(0xc0000fbf50)({ + (*main.Field)(0xc0004d4ba0)({ name: (string) (len=26) "latestIncomingTxOperations", kind: (string) (len=14) "UserOperations", isMap: (bool) false, @@ -2264,7 +1325,7 @@ isMessage: (bool) true, isOptional: (bool) false }), - (*main.Field)(0xc0000fbf80)({ + (*main.Field)(0xc0004d4bd0)({ name: (string) (len=32) "latestOutgoingUserToUserPayemnts", kind: (string) (len=14) "UserOperations", isMap: (bool) false, @@ -2273,7 +1334,7 @@ isMessage: (bool) true, isOptional: (bool) false }), - (*main.Field)(0xc0000fbfb0)({ + (*main.Field)(0xc0004d4c00)({ name: (string) (len=32) "latestIncomingUserToUserPayemnts", kind: (string) (len=14) "UserOperations", isMap: (bool) false, @@ -2283,10 +1344,1029 @@ isOptional: (bool) false }) } + }), + (string) (len=17) "LiveUserOperation": (*main.Message)(0xc00043ce80)({ + fullName: (string) (len=17) "LiveUserOperation", + name: (string) (len=17) "LiveUserOperation", + fields: ([]*main.Field) (len=1 cap=1) { + (*main.Field)(0xc0004d4d50)({ + 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 + }) + } + }), + (string) (len=18) "LndGetInfoResponse": (*main.Message)(0xc00043c340)({ + fullName: (string) (len=18) "LndGetInfoResponse", + name: (string) (len=18) "LndGetInfoResponse", + fields: ([]*main.Field) (len=1 cap=1) { + (*main.Field)(0xc000401620)({ + 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=7) "AuthApp": (*main.Message)(0xc00043c440)({ + fullName: (string) (len=7) "AuthApp", + name: (string) (len=7) "AuthApp", + fields: ([]*main.Field) (len=2 cap=2) { + (*main.Field)(0xc0004017d0)({ + 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)(0xc000401800)({ + 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=34) "SendAppUserToAppUserPaymentRequest": (*main.Message)(0xc00043c640)({ + fullName: (string) (len=34) "SendAppUserToAppUserPaymentRequest", + name: (string) (len=34) "SendAppUserToAppUserPaymentRequest", + fields: ([]*main.Field) (len=3 cap=4) { + (*main.Field)(0xc000401bc0)({ + 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)(0xc000401bf0)({ + 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)(0xc000401c20)({ + 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=30) "SendAppUserToAppPaymentRequest": (*main.Message)(0xc00043c680)({ + fullName: (string) (len=30) "SendAppUserToAppPaymentRequest", + name: (string) (len=30) "SendAppUserToAppPaymentRequest", + fields: ([]*main.Field) (len=2 cap=2) { + (*main.Field)(0xc000401c50)({ + 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)(0xc000401c80)({ + 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=24) "SetMockAppBalanceRequest": (*main.Message)(0xc00043c740)({ + fullName: (string) (len=24) "SetMockAppBalanceRequest", + name: (string) (len=24) "SetMockAppBalanceRequest", + fields: ([]*main.Field) (len=1 cap=1) { + (*main.Field)(0xc000401d70)({ + 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)(0xc00043ca00)({ + fullName: (string) (len=18) "OpenChannelRequest", + name: (string) (len=18) "OpenChannelRequest", + fields: ([]*main.Field) (len=4 cap=4) { + (*main.Field)(0xc0004d4420)({ + 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)(0xc0004d4450)({ + 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)(0xc0004d4480)({ + 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)(0xc0004d44b0)({ + 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=18) "NewInvoiceResponse": (*main.Message)(0xc00043c8c0)({ + fullName: (string) (len=18) "NewInvoiceResponse", + name: (string) (len=18) "NewInvoiceResponse", + fields: ([]*main.Field) (len=1 cap=1) { + (*main.Field)(0xc000401f20)({ + 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=17) "PayInvoiceRequest": (*main.Message)(0xc00043c980)({ + fullName: (string) (len=17) "PayInvoiceRequest", + name: (string) (len=17) "PayInvoiceRequest", + fields: ([]*main.Field) (len=2 cap=2) { + (*main.Field)(0xc000401fb0)({ + 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)(0xc0004d4390)({ + 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=13) "AddAppRequest": (*main.Message)(0xc00043c380)({ + fullName: (string) (len=13) "AddAppRequest", + name: (string) (len=13) "AddAppRequest", + fields: ([]*main.Field) (len=2 cap=2) { + (*main.Field)(0xc000401650)({ + 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)(0xc000401680)({ + 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=11) "Application": (*main.Message)(0xc00043c400)({ + fullName: (string) (len=11) "Application", + name: (string) (len=11) "Application", + fields: ([]*main.Field) (len=4 cap=4) { + (*main.Field)(0xc000401710)({ + 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)(0xc000401740)({ + 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)(0xc000401770)({ + 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)(0xc0004017a0)({ + 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=7) "AppUser": (*main.Message)(0xc00043c4c0)({ + fullName: (string) (len=7) "AppUser", + name: (string) (len=7) "AppUser", + fields: ([]*main.Field) (len=3 cap=4) { + (*main.Field)(0xc0004018c0)({ + 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)(0xc0004018f0)({ + 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)(0xc000401920)({ + 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)(0xc00043c500)({ + fullName: (string) (len=20) "AddAppInvoiceRequest", + name: (string) (len=20) "AddAppInvoiceRequest", + fields: ([]*main.Field) (len=3 cap=4) { + (*main.Field)(0xc000401950)({ + 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)(0xc000401980)({ + 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)(0xc0004019b0)({ + 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) "PayAppUserInvoiceResponse": (*main.Message)(0xc00043c600)({ + fullName: (string) (len=25) "PayAppUserInvoiceResponse", + name: (string) (len=25) "PayAppUserInvoiceResponse", + fields: ([]*main.Field) (len=2 cap=2) { + (*main.Field)(0xc000401b60)({ + 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)(0xc000401b90)({ + 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 + }) + } + }), + (string) (len=17) "NewAddressRequest": (*main.Message)(0xc00043c780)({ + fullName: (string) (len=17) "NewAddressRequest", + name: (string) (len=17) "NewAddressRequest", + fields: ([]*main.Field) (len=1 cap=1) { + (*main.Field)(0xc000401da0)({ + 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) "GetProductBuyLinkResponse": (*main.Message)(0xc00043ce40)({ + fullName: (string) (len=25) "GetProductBuyLinkResponse", + name: (string) (len=25) "GetProductBuyLinkResponse", + fields: ([]*main.Field) (len=1 cap=1) { + (*main.Field)(0xc0004d4d20)({ + 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=13) "UserOperation": (*main.Message)(0xc00043ccc0)({ + fullName: (string) (len=13) "UserOperation", + name: (string) (len=13) "UserOperation", + fields: ([]*main.Field) (len=4 cap=4) { + (*main.Field)(0xc0004d49c0)({ + 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)(0xc0004d49f0)({ + 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)(0xc0004d4a20)({ + 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)(0xc0004d4a50)({ + 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=5) "Empty": (*main.Message)(0xc00043c240)({ + fullName: (string) (len=5) "Empty", + name: (string) (len=5) "Empty", + fields: ([]*main.Field) + }), + (string) (len=17) "AddAppUserRequest": (*main.Message)(0xc00043c480)({ + fullName: (string) (len=17) "AddAppUserRequest", + name: (string) (len=17) "AddAppUserRequest", + fields: ([]*main.Field) (len=3 cap=4) { + (*main.Field)(0xc000401830)({ + 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)(0xc000401860)({ + 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)(0xc000401890)({ + 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) "GetAppUserRequest": (*main.Message)(0xc00043c580)({ + fullName: (string) (len=17) "GetAppUserRequest", + name: (string) (len=17) "GetAppUserRequest", + fields: ([]*main.Field) (len=1 cap=1) { + (*main.Field)(0xc000401aa0)({ + 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=24) "PayAppUserInvoiceRequest": (*main.Message)(0xc00043c5c0)({ + fullName: (string) (len=24) "PayAppUserInvoiceRequest", + name: (string) (len=24) "PayAppUserInvoiceRequest", + fields: ([]*main.Field) (len=3 cap=4) { + (*main.Field)(0xc000401ad0)({ + 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)(0xc000401b00)({ + 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)(0xc000401b30)({ + 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)(0xc00043c9c0)({ + fullName: (string) (len=18) "PayInvoiceResponse", + name: (string) (len=18) "PayInvoiceResponse", + fields: ([]*main.Field) (len=2 cap=2) { + (*main.Field)(0xc0004d43c0)({ + 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)(0xc0004d43f0)({ + 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 + }) + } + }), + (string) (len=25) "LnurlWithdrawInfoResponse": (*main.Message)(0xc00043cb00)({ + fullName: (string) (len=25) "LnurlWithdrawInfoResponse", + name: (string) (len=25) "LnurlWithdrawInfoResponse", + fields: ([]*main.Field) (len=8 cap=8) { + (*main.Field)(0xc0004d4570)({ + 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)(0xc0004d45a0)({ + 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)(0xc0004d45d0)({ + 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)(0xc0004d4600)({ + 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)(0xc0004d4630)({ + 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)(0xc0004d4660)({ + 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)(0xc0004d4690)({ + 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)(0xc0004d46c0)({ + 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=17) "LnurlLinkResponse": (*main.Message)(0xc00043ca80)({ + fullName: (string) (len=17) "LnurlLinkResponse", + name: (string) (len=17) "LnurlLinkResponse", + fields: ([]*main.Field) (len=2 cap=2) { + (*main.Field)(0xc0004d4510)({ + 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)(0xc0004d4540)({ + 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=25) "EncryptionExchangeRequest": (*main.Message)(0xc00043c280)({ + fullName: (string) (len=25) "EncryptionExchangeRequest", + name: (string) (len=25) "EncryptionExchangeRequest", + fields: ([]*main.Field) (len=2 cap=2) { + (*main.Field)(0xc000401530)({ + 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)(0xc000401560)({ + 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=27) "SetMockInvoiceAsPaidRequest": (*main.Message)(0xc00043c300)({ + fullName: (string) (len=27) "SetMockInvoiceAsPaidRequest", + name: (string) (len=27) "SetMockInvoiceAsPaidRequest", + fields: ([]*main.Field) (len=2 cap=2) { + (*main.Field)(0xc0004015c0)({ + 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)(0xc0004015f0)({ + 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) "AuthAppRequest": (*main.Message)(0xc00043c3c0)({ + fullName: (string) (len=14) "AuthAppRequest", + name: (string) (len=14) "AuthAppRequest", + fields: ([]*main.Field) (len=2 cap=2) { + (*main.Field)(0xc0004016b0)({ + 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)(0xc0004016e0)({ + 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=20) "DecodeInvoiceRequest": (*main.Message)(0xc00043c900)({ + fullName: (string) (len=20) "DecodeInvoiceRequest", + name: (string) (len=20) "DecodeInvoiceRequest", + fields: ([]*main.Field) (len=1 cap=1) { + (*main.Field)(0xc000401f50)({ + 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=21) "DecodeInvoiceResponse": (*main.Message)(0xc00043c940)({ + fullName: (string) (len=21) "DecodeInvoiceResponse", + name: (string) (len=21) "DecodeInvoiceResponse", + fields: ([]*main.Field) (len=1 cap=1) { + (*main.Field)(0xc000401f80)({ + 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=19) "OpenChannelResponse": (*main.Message)(0xc00043ca40)({ + fullName: (string) (len=19) "OpenChannelResponse", + name: (string) (len=19) "OpenChannelResponse", + fields: ([]*main.Field) (len=1 cap=1) { + (*main.Field)(0xc0004d44e0)({ + 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=17) "LndGetInfoRequest": (*main.Message)(0xc00043c2c0)({ + fullName: (string) (len=17) "LndGetInfoRequest", + name: (string) (len=17) "LndGetInfoRequest", + fields: ([]*main.Field) (len=1 cap=1) { + (*main.Field)(0xc000401590)({ + 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=24) "AddAppUserInvoiceRequest": (*main.Message)(0xc00043c540)({ + fullName: (string) (len=24) "AddAppUserInvoiceRequest", + name: (string) (len=24) "AddAppUserInvoiceRequest", + fields: ([]*main.Field) (len=4 cap=4) { + (*main.Field)(0xc0004019e0)({ + 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)(0xc000401a10)({ + 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)(0xc000401a40)({ + 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)(0xc000401a70)({ + 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=26) "GetAppUserLNURLInfoRequest": (*main.Message)(0xc00043c6c0)({ + fullName: (string) (len=26) "GetAppUserLNURLInfoRequest", + name: (string) (len=26) "GetAppUserLNURLInfoRequest", + fields: ([]*main.Field) (len=2 cap=2) { + (*main.Field)(0xc000401cb0)({ + 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)(0xc000401ce0)({ + 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=28) "SetMockAppUserBalanceRequest": (*main.Message)(0xc00043c700)({ + fullName: (string) (len=28) "SetMockAppUserBalanceRequest", + name: (string) (len=28) "SetMockAppUserBalanceRequest", + fields: ([]*main.Field) (len=2 cap=2) { + (*main.Field)(0xc000401d10)({ + 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)(0xc000401d40)({ + 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) "PayAddressRequest": (*main.Message)(0xc00043c800)({ + fullName: (string) (len=17) "PayAddressRequest", + name: (string) (len=17) "PayAddressRequest", + fields: ([]*main.Field) (len=3 cap=4) { + (*main.Field)(0xc000401e00)({ + 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)(0xc000401e30)({ + 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)(0xc000401e60)({ + 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=22) "HandleLnurlPayResponse": (*main.Message)(0xc00043cbc0)({ + fullName: (string) (len=22) "HandleLnurlPayResponse", + name: (string) (len=22) "HandleLnurlPayResponse", + fields: ([]*main.Field) (len=2 cap=2) { + (*main.Field)(0xc0004d47e0)({ + 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)(0xc0004d4810)({ + 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=24) "GetUserOperationsRequest": (*main.Message)(0xc00043cc80)({ + fullName: (string) (len=24) "GetUserOperationsRequest", + name: (string) (len=24) "GetUserOperationsRequest", + fields: ([]*main.Field) (len=6 cap=8) { + (*main.Field)(0xc0004d48a0)({ + 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)(0xc0004d48d0)({ + 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)(0xc0004d4900)({ + 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)(0xc0004d4930)({ + 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)(0xc0004d4960)({ + 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)(0xc0004d4990)({ + 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 + }) + } + }), + (string) (len=7) "Product": (*main.Message)(0xc00043ce00)({ + fullName: (string) (len=7) "Product", + name: (string) (len=7) "Product", + fields: ([]*main.Field) (len=3 cap=4) { + (*main.Field)(0xc0004d4c90)({ + 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)(0xc0004d4cc0)({ + 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)(0xc0004d4cf0)({ + 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 + }) + } }) } -parsing file: structs 45 +parsing file: structs 46 parsing file: methods 2 -> [{guest Guest false map[]} {user User false map[app_id:string app_user_id:string user_id:string]} {admin Admin false map[admin_id:string]} {app App false map[app_id:string]}] diff --git a/proto/autogenerated/ts/express_server.ts b/proto/autogenerated/ts/express_server.ts index 571f8b16..bda09143 100644 --- a/proto/autogenerated/ts/express_server.ts +++ b/proto/autogenerated/ts/express_server.ts @@ -519,4 +519,5 @@ export type MethodsOverride = { GetLnurlWithdrawLink_Override?: (httpRes:Response, handlerRes:Types.LnurlLinkResponse) => Promise GetLnurlPayLink_Override?: (httpRes:Response, handlerRes:Types.LnurlLinkResponse) => Promise GetLNURLChannelLink_Override?: (httpRes:Response, handlerRes:Types.LnurlLinkResponse) => Promise + GetLiveUserOperations_Override?: (httpRes:Response, handlerRes:Types.LiveUserOperation) => Promise } diff --git a/proto/autogenerated/ts/http_client.ts b/proto/autogenerated/ts/http_client.ts index c0eb6b81..be0f5291 100644 --- a/proto/autogenerated/ts/http_client.ts +++ b/proto/autogenerated/ts/http_client.ts @@ -477,4 +477,5 @@ export default (params: ClientParams) => ({ } return { status: 'ERROR', reason: 'invalid response' } }, + GetLiveUserOperations: async (cb: (v:ResultError | ({ status: 'OK' }& Types.LiveUserOperation)) => void): Promise => { throw new Error('http streams are not supported')} }) diff --git a/proto/autogenerated/ts/nostr_client.ts b/proto/autogenerated/ts/nostr_client.ts index 97feac05..0b49b77c 100644 --- a/proto/autogenerated/ts/nostr_client.ts +++ b/proto/autogenerated/ts/nostr_client.ts @@ -8,196 +8,211 @@ export type NostrClientParams = { retrieveNostrUserAuth: () => Promise checkResult?: true } -export default (params: NostrClientParams, send: (to:string, message: NostrRequest) => Promise) => ({ - GetUserInfo: async (): Promise => { +export default (params: NostrClientParams, send: (to: string, message: NostrRequest) => Promise, subscribe: (to: string, message: NostrRequest, cb: (res: any) => void) => void) => ({ + GetUserInfo: async (): Promise => { const auth = await params.retrieveNostrUserAuth() if (auth === null) throw new Error('retrieveNostrUserAuth() returned null') const nostrRequest: NostrRequest = {} - const data = await send(params.pubDestination, {rpcName:'GetUserInfo',authIdentifier:auth, ...nostrRequest }) + const data = await send(params.pubDestination, { rpcName: 'GetUserInfo', authIdentifier: auth, ...nostrRequest }) if (data.status === 'ERROR' && typeof data.reason === 'string') return data - if (data.status === 'OK') { + if (data.status === 'OK') { const result = data - if(!params.checkResult) return { status: 'OK', ...result } + if (!params.checkResult) return { status: 'OK', ...result } const error = Types.UserInfoValidate(result) if (error === null) { return { status: 'OK', ...result } } else return { status: 'ERROR', reason: error.message } } return { status: 'ERROR', reason: 'invalid response' } }, - AddProduct: async (request: Types.AddProductRequest): Promise => { + AddProduct: async (request: Types.AddProductRequest): Promise => { const auth = await params.retrieveNostrUserAuth() if (auth === null) throw new Error('retrieveNostrUserAuth() returned null') const nostrRequest: NostrRequest = {} nostrRequest.body = request - const data = await send(params.pubDestination, {rpcName:'AddProduct',authIdentifier:auth, ...nostrRequest }) + const data = await send(params.pubDestination, { rpcName: 'AddProduct', authIdentifier: auth, ...nostrRequest }) if (data.status === 'ERROR' && typeof data.reason === 'string') return data - if (data.status === 'OK') { + if (data.status === 'OK') { const result = data - if(!params.checkResult) return { status: 'OK', ...result } + if (!params.checkResult) return { status: 'OK', ...result } const error = Types.ProductValidate(result) if (error === null) { return { status: 'OK', ...result } } else return { status: 'ERROR', reason: error.message } } return { status: 'ERROR', reason: 'invalid response' } }, - NewProductInvoice: async (query: Types.NewProductInvoice_Query): Promise => { + NewProductInvoice: async (query: Types.NewProductInvoice_Query): Promise => { const auth = await params.retrieveNostrUserAuth() if (auth === null) throw new Error('retrieveNostrUserAuth() returned null') const nostrRequest: NostrRequest = {} nostrRequest.query = query - const data = await send(params.pubDestination, {rpcName:'NewProductInvoice',authIdentifier:auth, ...nostrRequest }) + const data = await send(params.pubDestination, { rpcName: 'NewProductInvoice', authIdentifier: auth, ...nostrRequest }) if (data.status === 'ERROR' && typeof data.reason === 'string') return data - if (data.status === 'OK') { + if (data.status === 'OK') { const result = data - if(!params.checkResult) return { status: 'OK', ...result } + if (!params.checkResult) return { status: 'OK', ...result } const error = Types.NewInvoiceResponseValidate(result) if (error === null) { return { status: 'OK', ...result } } else return { status: 'ERROR', reason: error.message } } return { status: 'ERROR', reason: 'invalid response' } }, - GetUserOperations: async (request: Types.GetUserOperationsRequest): Promise => { + GetUserOperations: async (request: Types.GetUserOperationsRequest): Promise => { const auth = await params.retrieveNostrUserAuth() if (auth === null) throw new Error('retrieveNostrUserAuth() returned null') const nostrRequest: NostrRequest = {} nostrRequest.body = request - const data = await send(params.pubDestination, {rpcName:'GetUserOperations',authIdentifier:auth, ...nostrRequest }) + const data = await send(params.pubDestination, { rpcName: 'GetUserOperations', authIdentifier: auth, ...nostrRequest }) if (data.status === 'ERROR' && typeof data.reason === 'string') return data - if (data.status === 'OK') { + if (data.status === 'OK') { const result = data - if(!params.checkResult) return { status: 'OK', ...result } + if (!params.checkResult) return { status: 'OK', ...result } const error = Types.GetUserOperationsResponseValidate(result) if (error === null) { return { status: 'OK', ...result } } else return { status: 'ERROR', reason: error.message } } return { status: 'ERROR', reason: 'invalid response' } }, - NewAddress: async (request: Types.NewAddressRequest): Promise => { + NewAddress: async (request: Types.NewAddressRequest): Promise => { const auth = await params.retrieveNostrUserAuth() if (auth === null) throw new Error('retrieveNostrUserAuth() returned null') const nostrRequest: NostrRequest = {} nostrRequest.body = request - const data = await send(params.pubDestination, {rpcName:'NewAddress',authIdentifier:auth, ...nostrRequest }) + const data = await send(params.pubDestination, { rpcName: 'NewAddress', authIdentifier: auth, ...nostrRequest }) if (data.status === 'ERROR' && typeof data.reason === 'string') return data - if (data.status === 'OK') { + if (data.status === 'OK') { const result = data - if(!params.checkResult) return { status: 'OK', ...result } + if (!params.checkResult) return { status: 'OK', ...result } const error = Types.NewAddressResponseValidate(result) if (error === null) { return { status: 'OK', ...result } } else return { status: 'ERROR', reason: error.message } } return { status: 'ERROR', reason: 'invalid response' } }, - PayAddress: async (request: Types.PayAddressRequest): Promise => { + PayAddress: async (request: Types.PayAddressRequest): Promise => { const auth = await params.retrieveNostrUserAuth() if (auth === null) throw new Error('retrieveNostrUserAuth() returned null') const nostrRequest: NostrRequest = {} nostrRequest.body = request - const data = await send(params.pubDestination, {rpcName:'PayAddress',authIdentifier:auth, ...nostrRequest }) + const data = await send(params.pubDestination, { rpcName: 'PayAddress', authIdentifier: auth, ...nostrRequest }) if (data.status === 'ERROR' && typeof data.reason === 'string') return data - if (data.status === 'OK') { + if (data.status === 'OK') { const result = data - if(!params.checkResult) return { status: 'OK', ...result } + if (!params.checkResult) return { status: 'OK', ...result } const error = Types.PayAddressResponseValidate(result) if (error === null) { return { status: 'OK', ...result } } else return { status: 'ERROR', reason: error.message } } return { status: 'ERROR', reason: 'invalid response' } }, - NewInvoice: async (request: Types.NewInvoiceRequest): Promise => { + NewInvoice: async (request: Types.NewInvoiceRequest): Promise => { const auth = await params.retrieveNostrUserAuth() if (auth === null) throw new Error('retrieveNostrUserAuth() returned null') const nostrRequest: NostrRequest = {} nostrRequest.body = request - const data = await send(params.pubDestination, {rpcName:'NewInvoice',authIdentifier:auth, ...nostrRequest }) + const data = await send(params.pubDestination, { rpcName: 'NewInvoice', authIdentifier: auth, ...nostrRequest }) if (data.status === 'ERROR' && typeof data.reason === 'string') return data - if (data.status === 'OK') { + if (data.status === 'OK') { const result = data - if(!params.checkResult) return { status: 'OK', ...result } + if (!params.checkResult) return { status: 'OK', ...result } const error = Types.NewInvoiceResponseValidate(result) if (error === null) { return { status: 'OK', ...result } } else return { status: 'ERROR', reason: error.message } } return { status: 'ERROR', reason: 'invalid response' } }, - DecodeInvoice: async (request: Types.DecodeInvoiceRequest): Promise => { + DecodeInvoice: async (request: Types.DecodeInvoiceRequest): Promise => { const auth = await params.retrieveNostrUserAuth() if (auth === null) throw new Error('retrieveNostrUserAuth() returned null') const nostrRequest: NostrRequest = {} nostrRequest.body = request - const data = await send(params.pubDestination, {rpcName:'DecodeInvoice',authIdentifier:auth, ...nostrRequest }) + const data = await send(params.pubDestination, { rpcName: 'DecodeInvoice', authIdentifier: auth, ...nostrRequest }) if (data.status === 'ERROR' && typeof data.reason === 'string') return data - if (data.status === 'OK') { + if (data.status === 'OK') { const result = data - if(!params.checkResult) return { status: 'OK', ...result } + if (!params.checkResult) return { status: 'OK', ...result } const error = Types.DecodeInvoiceResponseValidate(result) if (error === null) { return { status: 'OK', ...result } } else return { status: 'ERROR', reason: error.message } } return { status: 'ERROR', reason: 'invalid response' } }, - PayInvoice: async (request: Types.PayInvoiceRequest): Promise => { + PayInvoice: async (request: Types.PayInvoiceRequest): Promise => { const auth = await params.retrieveNostrUserAuth() if (auth === null) throw new Error('retrieveNostrUserAuth() returned null') const nostrRequest: NostrRequest = {} nostrRequest.body = request - const data = await send(params.pubDestination, {rpcName:'PayInvoice',authIdentifier:auth, ...nostrRequest }) + const data = await send(params.pubDestination, { rpcName: 'PayInvoice', authIdentifier: auth, ...nostrRequest }) if (data.status === 'ERROR' && typeof data.reason === 'string') return data - if (data.status === 'OK') { + if (data.status === 'OK') { const result = data - if(!params.checkResult) return { status: 'OK', ...result } + if (!params.checkResult) return { status: 'OK', ...result } const error = Types.PayInvoiceResponseValidate(result) if (error === null) { return { status: 'OK', ...result } } else return { status: 'ERROR', reason: error.message } } return { status: 'ERROR', reason: 'invalid response' } }, - OpenChannel: async (request: Types.OpenChannelRequest): Promise => { + OpenChannel: async (request: Types.OpenChannelRequest): Promise => { const auth = await params.retrieveNostrUserAuth() if (auth === null) throw new Error('retrieveNostrUserAuth() returned null') const nostrRequest: NostrRequest = {} nostrRequest.body = request - const data = await send(params.pubDestination, {rpcName:'OpenChannel',authIdentifier:auth, ...nostrRequest }) + const data = await send(params.pubDestination, { rpcName: 'OpenChannel', authIdentifier: auth, ...nostrRequest }) if (data.status === 'ERROR' && typeof data.reason === 'string') return data - if (data.status === 'OK') { + if (data.status === 'OK') { const result = data - if(!params.checkResult) return { status: 'OK', ...result } + if (!params.checkResult) return { status: 'OK', ...result } const error = Types.OpenChannelResponseValidate(result) if (error === null) { return { status: 'OK', ...result } } else return { status: 'ERROR', reason: error.message } } return { status: 'ERROR', reason: 'invalid response' } }, - GetLnurlWithdrawLink: async (): Promise => { + GetLnurlWithdrawLink: async (): Promise => { const auth = await params.retrieveNostrUserAuth() if (auth === null) throw new Error('retrieveNostrUserAuth() returned null') const nostrRequest: NostrRequest = {} - const data = await send(params.pubDestination, {rpcName:'GetLnurlWithdrawLink',authIdentifier:auth, ...nostrRequest }) + const data = await send(params.pubDestination, { rpcName: 'GetLnurlWithdrawLink', authIdentifier: auth, ...nostrRequest }) if (data.status === 'ERROR' && typeof data.reason === 'string') return data - if (data.status === 'OK') { + if (data.status === 'OK') { const result = data - if(!params.checkResult) return { status: 'OK', ...result } + if (!params.checkResult) return { status: 'OK', ...result } const error = Types.LnurlLinkResponseValidate(result) if (error === null) { return { status: 'OK', ...result } } else return { status: 'ERROR', reason: error.message } } return { status: 'ERROR', reason: 'invalid response' } }, - GetLnurlPayLink: async (): Promise => { + GetLnurlPayLink: async (): Promise => { const auth = await params.retrieveNostrUserAuth() if (auth === null) throw new Error('retrieveNostrUserAuth() returned null') const nostrRequest: NostrRequest = {} - const data = await send(params.pubDestination, {rpcName:'GetLnurlPayLink',authIdentifier:auth, ...nostrRequest }) + const data = await send(params.pubDestination, { rpcName: 'GetLnurlPayLink', authIdentifier: auth, ...nostrRequest }) if (data.status === 'ERROR' && typeof data.reason === 'string') return data - if (data.status === 'OK') { + if (data.status === 'OK') { const result = data - if(!params.checkResult) return { status: 'OK', ...result } + if (!params.checkResult) return { status: 'OK', ...result } const error = Types.LnurlLinkResponseValidate(result) if (error === null) { return { status: 'OK', ...result } } else return { status: 'ERROR', reason: error.message } } return { status: 'ERROR', reason: 'invalid response' } }, - GetLNURLChannelLink: async (): Promise => { + GetLNURLChannelLink: async (): Promise => { const auth = await params.retrieveNostrUserAuth() if (auth === null) throw new Error('retrieveNostrUserAuth() returned null') const nostrRequest: NostrRequest = {} - const data = await send(params.pubDestination, {rpcName:'GetLNURLChannelLink',authIdentifier:auth, ...nostrRequest }) + const data = await send(params.pubDestination, { rpcName: 'GetLNURLChannelLink', authIdentifier: auth, ...nostrRequest }) if (data.status === 'ERROR' && typeof data.reason === 'string') return data - if (data.status === 'OK') { + if (data.status === 'OK') { const result = data - if(!params.checkResult) return { status: 'OK', ...result } + if (!params.checkResult) return { status: 'OK', ...result } const error = Types.LnurlLinkResponseValidate(result) if (error === null) { return { status: 'OK', ...result } } else return { status: 'ERROR', reason: error.message } } return { status: 'ERROR', reason: 'invalid response' } }, + GetLiveUserOperations: async (cb: (res: ResultError | ({ status: 'OK' } & Types.LiveUserOperation)) => void): Promise => { + const auth = await params.retrieveNostrUserAuth() + if (auth === null) throw new Error('retrieveNostrUserAuth() returned null') + const nostrRequest: NostrRequest = {} + subscribe(params.pubDestination, { rpcName: 'GetLiveUserOperations', authIdentifier: auth, ...nostrRequest }, (data) => { + if (data.status === 'ERROR' && typeof data.reason === 'string') return cb(data) + if (data.status === 'OK') { + const result = data + if (!params.checkResult) return { status: 'OK', ...result } + const error = Types.LiveUserOperationValidate(result) + if (error === null) { return cb({ status: 'OK', ...result }) } else return cb({ status: 'ERROR', reason: error.message }) + } + return cb({ status: 'ERROR', reason: 'invalid response' }) + }) + }, }) diff --git a/proto/autogenerated/ts/nostr_transport.ts b/proto/autogenerated/ts/nostr_transport.ts index bf236841..6c4c4084 100644 --- a/proto/autogenerated/ts/nostr_transport.ts +++ b/proto/autogenerated/ts/nostr_transport.ts @@ -176,6 +176,17 @@ export default (methods: Types.ServerMethods, opts: NostrOptions) => { res({status: 'OK', ...response}) }catch(ex){ const e = ex as any; logErrorAndReturnResponse(e, e.message || e, res, logger); if (opts.throwErrors) throw e } break + case 'GetLiveUserOperations': + try { + if (!methods.GetLiveUserOperations) throw new Error('method: GetLiveUserOperations is not implemented') + const authContext = await opts.NostrUserAuthGuard(req.appId, req.authIdentifier) + const query = req.query + const params = req.params + methods.GetLiveUserOperations({ ...authContext, ...query, ...params }, (response, err) => { + if (err) { logErrorAndReturnResponse(err, err.message, res, logger)} else { res({status: 'OK', ...response})} + }) + }catch(ex){ const e = ex as any; logErrorAndReturnResponse(e, e.message || e, res, logger); if (opts.throwErrors) throw e } + break default: logger.error('unknown rpc call name from nostr event:'+req.rpcName) } } diff --git a/proto/autogenerated/ts/types.ts b/proto/autogenerated/ts/types.ts index cd2478fe..f4194175 100644 --- a/proto/autogenerated/ts/types.ts +++ b/proto/autogenerated/ts/types.ts @@ -192,6 +192,11 @@ export type GetLNURLChannelLink_Query = { export type GetLNURLChannelLink_RouteParams = { } export type GetLNURLChannelLink_Context = GetLNURLChannelLink_Query & GetLNURLChannelLink_RouteParams & UserContext +export type GetLiveUserOperations_Query = { +} +export type GetLiveUserOperations_RouteParams = { +} +export type GetLiveUserOperations_Context = GetLiveUserOperations_Query & GetLiveUserOperations_RouteParams & UserContext export type ServerMethods = { LndGetInfo?: (ctx: LndGetInfo_Context, req: LndGetInfoRequest) => Promise AddApp?: (ctx: AddApp_Context, req: AddAppRequest) => Promise @@ -227,6 +232,7 @@ export type ServerMethods = { GetLnurlWithdrawLink?: (ctx: GetLnurlWithdrawLink_Context) => Promise GetLnurlPayLink?: (ctx: GetLnurlPayLink_Context) => Promise GetLNURLChannelLink?: (ctx: GetLNURLChannelLink_Context) => Promise + GetLiveUserOperations?: (ctx: GetLiveUserOperations_Context, cb:(res: LiveUserOperation, err:Error)=> void) => void } export enum AddressType { @@ -255,43 +261,20 @@ export type OptionsBaseMessage = { allOptionalsAreSet?: true } -export type AddProductRequest = { - name: string - price_sats: number +export type NewInvoiceResponse = { + invoice: string } -export const AddProductRequestOptionalFields: [] = [] -export type AddProductRequestOptions = OptionsBaseMessage & { +export const NewInvoiceResponseOptionalFields: [] = [] +export type NewInvoiceResponseOptions = OptionsBaseMessage & { checkOptionalsAreSet?: [] - name_CustomCheck?: (v: string) => boolean - price_sats_CustomCheck?: (v: number) => boolean + invoice_CustomCheck?: (v: string) => boolean } -export const AddProductRequestValidate = (o?: AddProductRequest, opts: AddProductRequestOptions = {}, path: string = 'AddProductRequest::root.'): Error | null => { +export const NewInvoiceResponseValidate = (o?: NewInvoiceResponse, opts: NewInvoiceResponseOptions = {}, path: string = 'NewInvoiceResponse::root.'): Error | null => { if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - if (typeof o.name !== 'string') return new Error(`${path}.name: is not a string`) - if (opts.name_CustomCheck && !opts.name_CustomCheck(o.name)) return new Error(`${path}.name: custom check failed`) - - if (typeof o.price_sats !== 'number') return new Error(`${path}.price_sats: is not a number`) - if (opts.price_sats_CustomCheck && !opts.price_sats_CustomCheck(o.price_sats)) return new Error(`${path}.price_sats: custom check failed`) - - return null -} - -export type DecodeInvoiceResponse = { - amount: number -} -export const DecodeInvoiceResponseOptionalFields: [] = [] -export type DecodeInvoiceResponseOptions = OptionsBaseMessage & { - checkOptionalsAreSet?: [] - amount_CustomCheck?: (v: number) => boolean -} -export const DecodeInvoiceResponseValidate = (o?: DecodeInvoiceResponse, opts: DecodeInvoiceResponseOptions = {}, path: string = 'DecodeInvoiceResponse::root.'): Error | null => { - if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') - if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - - if (typeof o.amount !== 'number') return new Error(`${path}.amount: is not a number`) - if (opts.amount_CustomCheck && !opts.amount_CustomCheck(o.amount)) return new Error(`${path}.amount: custom check failed`) + if (typeof o.invoice !== 'string') return new Error(`${path}.invoice: is not a string`) + if (opts.invoice_CustomCheck && !opts.invoice_CustomCheck(o.invoice)) return new Error(`${path}.invoice: custom check failed`) return null } @@ -319,61 +302,318 @@ export const PayInvoiceRequestValidate = (o?: PayInvoiceRequest, opts: PayInvoic return null } -export type OpenChannelResponse = { - channelId: string +export type AddAppRequest = { + name: string + allow_user_creation: boolean } -export const OpenChannelResponseOptionalFields: [] = [] -export type OpenChannelResponseOptions = OptionsBaseMessage & { +export const AddAppRequestOptionalFields: [] = [] +export type AddAppRequestOptions = OptionsBaseMessage & { checkOptionalsAreSet?: [] - channelId_CustomCheck?: (v: string) => boolean + name_CustomCheck?: (v: string) => boolean + allow_user_creation_CustomCheck?: (v: boolean) => boolean } -export const OpenChannelResponseValidate = (o?: OpenChannelResponse, opts: OpenChannelResponseOptions = {}, path: string = 'OpenChannelResponse::root.'): Error | null => { +export const AddAppRequestValidate = (o?: AddAppRequest, opts: AddAppRequestOptions = {}, path: string = 'AddAppRequest::root.'): Error | null => { if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - if (typeof o.channelId !== 'string') return new Error(`${path}.channelId: is not a string`) - if (opts.channelId_CustomCheck && !opts.channelId_CustomCheck(o.channelId)) return new Error(`${path}.channelId: custom check failed`) + if (typeof o.name !== 'string') return new Error(`${path}.name: is not a string`) + if (opts.name_CustomCheck && !opts.name_CustomCheck(o.name)) return new Error(`${path}.name: custom check failed`) + + if (typeof o.allow_user_creation !== 'boolean') return new Error(`${path}.allow_user_creation: is not a boolean`) + if (opts.allow_user_creation_CustomCheck && !opts.allow_user_creation_CustomCheck(o.allow_user_creation)) return new Error(`${path}.allow_user_creation: custom check failed`) return null } -export type LnurlLinkResponse = { - lnurl: string - k1: string +export type Application = { + name: string + id: string + balance: number + npub: string } -export const LnurlLinkResponseOptionalFields: [] = [] -export type LnurlLinkResponseOptions = OptionsBaseMessage & { +export const ApplicationOptionalFields: [] = [] +export type ApplicationOptions = OptionsBaseMessage & { checkOptionalsAreSet?: [] - lnurl_CustomCheck?: (v: string) => boolean - k1_CustomCheck?: (v: string) => boolean + name_CustomCheck?: (v: string) => boolean + id_CustomCheck?: (v: string) => boolean + balance_CustomCheck?: (v: number) => boolean + npub_CustomCheck?: (v: string) => boolean } -export const LnurlLinkResponseValidate = (o?: LnurlLinkResponse, opts: LnurlLinkResponseOptions = {}, path: string = 'LnurlLinkResponse::root.'): Error | null => { +export const ApplicationValidate = (o?: Application, opts: ApplicationOptions = {}, path: string = 'Application::root.'): Error | null => { if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - if (typeof o.lnurl !== 'string') return new Error(`${path}.lnurl: is not a string`) - if (opts.lnurl_CustomCheck && !opts.lnurl_CustomCheck(o.lnurl)) return new Error(`${path}.lnurl: custom check failed`) + if (typeof o.name !== 'string') return new Error(`${path}.name: is not a string`) + if (opts.name_CustomCheck && !opts.name_CustomCheck(o.name)) return new Error(`${path}.name: custom check failed`) - if (typeof o.k1 !== 'string') return new Error(`${path}.k1: is not a string`) - if (opts.k1_CustomCheck && !opts.k1_CustomCheck(o.k1)) return new Error(`${path}.k1: custom check failed`) + if (typeof o.id !== 'string') return new Error(`${path}.id: is not a string`) + if (opts.id_CustomCheck && !opts.id_CustomCheck(o.id)) return new Error(`${path}.id: custom check failed`) + + if (typeof o.balance !== 'number') return new Error(`${path}.balance: is not a number`) + if (opts.balance_CustomCheck && !opts.balance_CustomCheck(o.balance)) return new Error(`${path}.balance: custom check failed`) + + if (typeof o.npub !== 'string') return new Error(`${path}.npub: is not a string`) + if (opts.npub_CustomCheck && !opts.npub_CustomCheck(o.npub)) return new Error(`${path}.npub: custom check failed`) return null } -export type PayAddressResponse = { - txId: string +export type AppUser = { + identifier: string + info: UserInfo + max_withdrawable: number } -export const PayAddressResponseOptionalFields: [] = [] -export type PayAddressResponseOptions = OptionsBaseMessage & { +export const AppUserOptionalFields: [] = [] +export type AppUserOptions = OptionsBaseMessage & { checkOptionalsAreSet?: [] - txId_CustomCheck?: (v: string) => boolean + identifier_CustomCheck?: (v: string) => boolean + info_Options?: UserInfoOptions + max_withdrawable_CustomCheck?: (v: number) => boolean } -export const PayAddressResponseValidate = (o?: PayAddressResponse, opts: PayAddressResponseOptions = {}, path: string = 'PayAddressResponse::root.'): Error | null => { +export const AppUserValidate = (o?: AppUser, opts: AppUserOptions = {}, path: string = 'AppUser::root.'): Error | null => { if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - if (typeof o.txId !== 'string') return new Error(`${path}.txId: is not a string`) - if (opts.txId_CustomCheck && !opts.txId_CustomCheck(o.txId)) return new Error(`${path}.txId: custom check failed`) + if (typeof o.identifier !== 'string') return new Error(`${path}.identifier: is not a string`) + if (opts.identifier_CustomCheck && !opts.identifier_CustomCheck(o.identifier)) return new Error(`${path}.identifier: custom check failed`) + + const infoErr = UserInfoValidate(o.info, opts.info_Options, `${path}.info`) + if (infoErr !== null) return infoErr + + + if (typeof o.max_withdrawable !== 'number') return new Error(`${path}.max_withdrawable: is not a number`) + if (opts.max_withdrawable_CustomCheck && !opts.max_withdrawable_CustomCheck(o.max_withdrawable)) return new Error(`${path}.max_withdrawable: custom check failed`) + + return null +} + +export type AddAppInvoiceRequest = { + payer_identifier: string + http_callback_url: string + invoice_req: NewInvoiceRequest +} +export const AddAppInvoiceRequestOptionalFields: [] = [] +export type AddAppInvoiceRequestOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + payer_identifier_CustomCheck?: (v: string) => boolean + http_callback_url_CustomCheck?: (v: string) => boolean + invoice_req_Options?: NewInvoiceRequestOptions +} +export const AddAppInvoiceRequestValidate = (o?: AddAppInvoiceRequest, opts: AddAppInvoiceRequestOptions = {}, path: string = 'AddAppInvoiceRequest::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.payer_identifier !== 'string') return new Error(`${path}.payer_identifier: is not a string`) + if (opts.payer_identifier_CustomCheck && !opts.payer_identifier_CustomCheck(o.payer_identifier)) return new Error(`${path}.payer_identifier: custom check failed`) + + if (typeof o.http_callback_url !== 'string') return new Error(`${path}.http_callback_url: is not a string`) + if (opts.http_callback_url_CustomCheck && !opts.http_callback_url_CustomCheck(o.http_callback_url)) return new Error(`${path}.http_callback_url: custom check failed`) + + const invoice_reqErr = NewInvoiceRequestValidate(o.invoice_req, opts.invoice_req_Options, `${path}.invoice_req`) + if (invoice_reqErr !== null) return invoice_reqErr + + + return null +} + +export type PayAppUserInvoiceResponse = { + preimage: string + amount_paid: number +} +export const PayAppUserInvoiceResponseOptionalFields: [] = [] +export type PayAppUserInvoiceResponseOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + preimage_CustomCheck?: (v: string) => boolean + amount_paid_CustomCheck?: (v: number) => boolean +} +export const PayAppUserInvoiceResponseValidate = (o?: PayAppUserInvoiceResponse, opts: PayAppUserInvoiceResponseOptions = {}, path: string = 'PayAppUserInvoiceResponse::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.preimage !== 'string') return new Error(`${path}.preimage: is not a string`) + if (opts.preimage_CustomCheck && !opts.preimage_CustomCheck(o.preimage)) return new Error(`${path}.preimage: custom check failed`) + + if (typeof o.amount_paid !== 'number') return new Error(`${path}.amount_paid: is not a number`) + if (opts.amount_paid_CustomCheck && !opts.amount_paid_CustomCheck(o.amount_paid)) return new Error(`${path}.amount_paid: custom check failed`) + + return null +} + +export type NewAddressRequest = { + addressType: AddressType +} +export const NewAddressRequestOptionalFields: [] = [] +export type NewAddressRequestOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + addressType_CustomCheck?: (v: AddressType) => boolean +} +export const NewAddressRequestValidate = (o?: NewAddressRequest, opts: NewAddressRequestOptions = {}, path: string = 'NewAddressRequest::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (!enumCheckAddressType(o.addressType)) return new Error(`${path}.addressType: is not a valid AddressType`) + if (opts.addressType_CustomCheck && !opts.addressType_CustomCheck(o.addressType)) return new Error(`${path}.addressType: custom check failed`) + + return null +} + +export type GetProductBuyLinkResponse = { + link: string +} +export const GetProductBuyLinkResponseOptionalFields: [] = [] +export type GetProductBuyLinkResponseOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + link_CustomCheck?: (v: string) => boolean +} +export const GetProductBuyLinkResponseValidate = (o?: GetProductBuyLinkResponse, opts: GetProductBuyLinkResponseOptions = {}, path: string = 'GetProductBuyLinkResponse::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.link !== 'string') return new Error(`${path}.link: is not a string`) + if (opts.link_CustomCheck && !opts.link_CustomCheck(o.link)) return new Error(`${path}.link: custom check failed`) + + return null +} + +export type UserOperation = { + paidAtUnix: number + type: UserOperationType + inbound: boolean + amount: number +} +export const UserOperationOptionalFields: [] = [] +export type UserOperationOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + paidAtUnix_CustomCheck?: (v: number) => boolean + type_CustomCheck?: (v: UserOperationType) => boolean + inbound_CustomCheck?: (v: boolean) => boolean + amount_CustomCheck?: (v: number) => boolean +} +export const UserOperationValidate = (o?: UserOperation, opts: UserOperationOptions = {}, path: string = 'UserOperation::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.paidAtUnix !== 'number') return new Error(`${path}.paidAtUnix: is not a number`) + if (opts.paidAtUnix_CustomCheck && !opts.paidAtUnix_CustomCheck(o.paidAtUnix)) return new Error(`${path}.paidAtUnix: custom check failed`) + + if (!enumCheckUserOperationType(o.type)) return new Error(`${path}.type: is not a valid UserOperationType`) + if (opts.type_CustomCheck && !opts.type_CustomCheck(o.type)) return new Error(`${path}.type: custom check failed`) + + if (typeof o.inbound !== 'boolean') return new Error(`${path}.inbound: is not a boolean`) + if (opts.inbound_CustomCheck && !opts.inbound_CustomCheck(o.inbound)) return new Error(`${path}.inbound: custom check failed`) + + if (typeof o.amount !== 'number') return new Error(`${path}.amount: is not a number`) + if (opts.amount_CustomCheck && !opts.amount_CustomCheck(o.amount)) return new Error(`${path}.amount: custom check failed`) + + return null +} + +export type Empty = { +} +export const EmptyOptionalFields: [] = [] +export type EmptyOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] +} +export const EmptyValidate = (o?: Empty, opts: EmptyOptions = {}, path: string = 'Empty::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + return null +} + +export type AddAppUserRequest = { + identifier: string + fail_if_exists: boolean + balance: number +} +export const AddAppUserRequestOptionalFields: [] = [] +export type AddAppUserRequestOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + identifier_CustomCheck?: (v: string) => boolean + fail_if_exists_CustomCheck?: (v: boolean) => boolean + balance_CustomCheck?: (v: number) => boolean +} +export const AddAppUserRequestValidate = (o?: AddAppUserRequest, opts: AddAppUserRequestOptions = {}, path: string = 'AddAppUserRequest::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.identifier !== 'string') return new Error(`${path}.identifier: is not a string`) + if (opts.identifier_CustomCheck && !opts.identifier_CustomCheck(o.identifier)) return new Error(`${path}.identifier: custom check failed`) + + if (typeof o.fail_if_exists !== 'boolean') return new Error(`${path}.fail_if_exists: is not a boolean`) + if (opts.fail_if_exists_CustomCheck && !opts.fail_if_exists_CustomCheck(o.fail_if_exists)) return new Error(`${path}.fail_if_exists: custom check failed`) + + if (typeof o.balance !== 'number') return new Error(`${path}.balance: is not a number`) + if (opts.balance_CustomCheck && !opts.balance_CustomCheck(o.balance)) return new Error(`${path}.balance: custom check failed`) + + return null +} + +export type GetAppUserRequest = { + user_identifier: string +} +export const GetAppUserRequestOptionalFields: [] = [] +export type GetAppUserRequestOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + user_identifier_CustomCheck?: (v: string) => boolean +} +export const GetAppUserRequestValidate = (o?: GetAppUserRequest, opts: GetAppUserRequestOptions = {}, path: string = 'GetAppUserRequest::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.user_identifier !== 'string') return new Error(`${path}.user_identifier: is not a string`) + if (opts.user_identifier_CustomCheck && !opts.user_identifier_CustomCheck(o.user_identifier)) return new Error(`${path}.user_identifier: custom check failed`) + + return null +} + +export type PayAppUserInvoiceRequest = { + user_identifier: string + invoice: string + amount: number +} +export const PayAppUserInvoiceRequestOptionalFields: [] = [] +export type PayAppUserInvoiceRequestOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + user_identifier_CustomCheck?: (v: string) => boolean + invoice_CustomCheck?: (v: string) => boolean + amount_CustomCheck?: (v: number) => boolean +} +export const PayAppUserInvoiceRequestValidate = (o?: PayAppUserInvoiceRequest, opts: PayAppUserInvoiceRequestOptions = {}, path: string = 'PayAppUserInvoiceRequest::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.user_identifier !== 'string') return new Error(`${path}.user_identifier: is not a string`) + if (opts.user_identifier_CustomCheck && !opts.user_identifier_CustomCheck(o.user_identifier)) return new Error(`${path}.user_identifier: custom check failed`) + + if (typeof o.invoice !== 'string') return new Error(`${path}.invoice: is not a string`) + if (opts.invoice_CustomCheck && !opts.invoice_CustomCheck(o.invoice)) return new Error(`${path}.invoice: custom check failed`) + + if (typeof o.amount !== 'number') return new Error(`${path}.amount: is not a number`) + if (opts.amount_CustomCheck && !opts.amount_CustomCheck(o.amount)) return new Error(`${path}.amount: custom check failed`) + + return null +} + +export type PayInvoiceResponse = { + preimage: string + amount_paid: number +} +export const PayInvoiceResponseOptionalFields: [] = [] +export type PayInvoiceResponseOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + preimage_CustomCheck?: (v: string) => boolean + amount_paid_CustomCheck?: (v: number) => boolean +} +export const PayInvoiceResponseValidate = (o?: PayInvoiceResponse, opts: PayInvoiceResponseOptions = {}, path: string = 'PayInvoiceResponse::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.preimage !== 'string') return new Error(`${path}.preimage: is not a string`) + if (opts.preimage_CustomCheck && !opts.preimage_CustomCheck(o.preimage)) return new Error(`${path}.preimage: custom check failed`) + + if (typeof o.amount_paid !== 'number') return new Error(`${path}.amount_paid: is not a number`) + if (opts.amount_paid_CustomCheck && !opts.amount_paid_CustomCheck(o.amount_paid)) return new Error(`${path}.amount_paid: custom check failed`) return null } @@ -431,20 +671,48 @@ export const LnurlWithdrawInfoResponseValidate = (o?: LnurlWithdrawInfoResponse, return null } -export type LndGetInfoRequest = { - nodeId: number +export type LnurlLinkResponse = { + lnurl: string + k1: string } -export const LndGetInfoRequestOptionalFields: [] = [] -export type LndGetInfoRequestOptions = OptionsBaseMessage & { +export const LnurlLinkResponseOptionalFields: [] = [] +export type LnurlLinkResponseOptions = OptionsBaseMessage & { checkOptionalsAreSet?: [] - nodeId_CustomCheck?: (v: number) => boolean + lnurl_CustomCheck?: (v: string) => boolean + k1_CustomCheck?: (v: string) => boolean } -export const LndGetInfoRequestValidate = (o?: LndGetInfoRequest, opts: LndGetInfoRequestOptions = {}, path: string = 'LndGetInfoRequest::root.'): Error | null => { +export const LnurlLinkResponseValidate = (o?: LnurlLinkResponse, opts: LnurlLinkResponseOptions = {}, path: string = 'LnurlLinkResponse::root.'): Error | null => { if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - if (typeof o.nodeId !== 'number') return new Error(`${path}.nodeId: is not a number`) - if (opts.nodeId_CustomCheck && !opts.nodeId_CustomCheck(o.nodeId)) return new Error(`${path}.nodeId: custom check failed`) + if (typeof o.lnurl !== 'string') return new Error(`${path}.lnurl: is not a string`) + if (opts.lnurl_CustomCheck && !opts.lnurl_CustomCheck(o.lnurl)) return new Error(`${path}.lnurl: custom check failed`) + + if (typeof o.k1 !== 'string') return new Error(`${path}.k1: is not a string`) + if (opts.k1_CustomCheck && !opts.k1_CustomCheck(o.k1)) return new Error(`${path}.k1: custom check failed`) + + return null +} + +export type EncryptionExchangeRequest = { + publicKey: string + deviceId: string +} +export const EncryptionExchangeRequestOptionalFields: [] = [] +export type EncryptionExchangeRequestOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + publicKey_CustomCheck?: (v: string) => boolean + deviceId_CustomCheck?: (v: string) => boolean +} +export const EncryptionExchangeRequestValidate = (o?: EncryptionExchangeRequest, opts: EncryptionExchangeRequestOptions = {}, path: string = 'EncryptionExchangeRequest::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.publicKey !== 'string') return new Error(`${path}.publicKey: is not a string`) + if (opts.publicKey_CustomCheck && !opts.publicKey_CustomCheck(o.publicKey)) return new Error(`${path}.publicKey: custom check failed`) + + if (typeof o.deviceId !== 'string') return new Error(`${path}.deviceId: is not a string`) + if (opts.deviceId_CustomCheck && !opts.deviceId_CustomCheck(o.deviceId)) return new Error(`${path}.deviceId: custom check failed`) return null } @@ -472,68 +740,57 @@ export const SetMockInvoiceAsPaidRequestValidate = (o?: SetMockInvoiceAsPaidRequ return null } -export type AuthApp = { - app: Application - auth_token: string +export type AuthAppRequest = { + name: string + allow_user_creation?: boolean } -export const AuthAppOptionalFields: [] = [] -export type AuthAppOptions = OptionsBaseMessage & { - checkOptionalsAreSet?: [] - app_Options?: ApplicationOptions - auth_token_CustomCheck?: (v: string) => boolean +export type AuthAppRequestOptionalField = 'allow_user_creation' +export const AuthAppRequestOptionalFields: AuthAppRequestOptionalField[] = ['allow_user_creation'] +export type AuthAppRequestOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: AuthAppRequestOptionalField[] + name_CustomCheck?: (v: string) => boolean + allow_user_creation_CustomCheck?: (v?: boolean) => boolean } -export const AuthAppValidate = (o?: AuthApp, opts: AuthAppOptions = {}, path: string = 'AuthApp::root.'): Error | null => { +export const AuthAppRequestValidate = (o?: AuthAppRequest, opts: AuthAppRequestOptions = {}, path: string = 'AuthAppRequest::root.'): Error | null => { if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - const appErr = ApplicationValidate(o.app, opts.app_Options, `${path}.app`) - if (appErr !== null) return appErr - + if (typeof o.name !== 'string') return new Error(`${path}.name: is not a string`) + if (opts.name_CustomCheck && !opts.name_CustomCheck(o.name)) return new Error(`${path}.name: custom check failed`) - if (typeof o.auth_token !== 'string') return new Error(`${path}.auth_token: is not a string`) - if (opts.auth_token_CustomCheck && !opts.auth_token_CustomCheck(o.auth_token)) return new Error(`${path}.auth_token: custom check failed`) + if ((o.allow_user_creation || opts.allOptionalsAreSet || opts.checkOptionalsAreSet?.includes('allow_user_creation')) && typeof o.allow_user_creation !== 'boolean') return new Error(`${path}.allow_user_creation: is not a boolean`) + if (opts.allow_user_creation_CustomCheck && !opts.allow_user_creation_CustomCheck(o.allow_user_creation)) return new Error(`${path}.allow_user_creation: custom check failed`) return null } -export type AppUser = { - identifier: string - info: UserInfo - max_withdrawable: number +export type DecodeInvoiceRequest = { + invoice: string } -export const AppUserOptionalFields: [] = [] -export type AppUserOptions = OptionsBaseMessage & { +export const DecodeInvoiceRequestOptionalFields: [] = [] +export type DecodeInvoiceRequestOptions = OptionsBaseMessage & { checkOptionalsAreSet?: [] - identifier_CustomCheck?: (v: string) => boolean - info_Options?: UserInfoOptions - max_withdrawable_CustomCheck?: (v: number) => boolean + invoice_CustomCheck?: (v: string) => boolean } -export const AppUserValidate = (o?: AppUser, opts: AppUserOptions = {}, path: string = 'AppUser::root.'): Error | null => { +export const DecodeInvoiceRequestValidate = (o?: DecodeInvoiceRequest, opts: DecodeInvoiceRequestOptions = {}, path: string = 'DecodeInvoiceRequest::root.'): Error | null => { if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - if (typeof o.identifier !== 'string') return new Error(`${path}.identifier: is not a string`) - if (opts.identifier_CustomCheck && !opts.identifier_CustomCheck(o.identifier)) return new Error(`${path}.identifier: custom check failed`) - - const infoErr = UserInfoValidate(o.info, opts.info_Options, `${path}.info`) - if (infoErr !== null) return infoErr - - - if (typeof o.max_withdrawable !== 'number') return new Error(`${path}.max_withdrawable: is not a number`) - if (opts.max_withdrawable_CustomCheck && !opts.max_withdrawable_CustomCheck(o.max_withdrawable)) return new Error(`${path}.max_withdrawable: custom check failed`) + if (typeof o.invoice !== 'string') return new Error(`${path}.invoice: is not a string`) + if (opts.invoice_CustomCheck && !opts.invoice_CustomCheck(o.invoice)) return new Error(`${path}.invoice: custom check failed`) return null } -export type SetMockAppBalanceRequest = { +export type DecodeInvoiceResponse = { amount: number } -export const SetMockAppBalanceRequestOptionalFields: [] = [] -export type SetMockAppBalanceRequestOptions = OptionsBaseMessage & { +export const DecodeInvoiceResponseOptionalFields: [] = [] +export type DecodeInvoiceResponseOptions = OptionsBaseMessage & { checkOptionalsAreSet?: [] amount_CustomCheck?: (v: number) => boolean } -export const SetMockAppBalanceRequestValidate = (o?: SetMockAppBalanceRequest, opts: SetMockAppBalanceRequestOptions = {}, path: string = 'SetMockAppBalanceRequest::root.'): Error | null => { +export const DecodeInvoiceResponseValidate = (o?: DecodeInvoiceResponse, opts: DecodeInvoiceResponseOptions = {}, path: string = 'DecodeInvoiceResponse::root.'): Error | null => { if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') @@ -543,20 +800,245 @@ export const SetMockAppBalanceRequestValidate = (o?: SetMockAppBalanceRequest, o return null } -export type NewAddressRequest = { - addressType: AddressType +export type OpenChannelResponse = { + channelId: string } -export const NewAddressRequestOptionalFields: [] = [] -export type NewAddressRequestOptions = OptionsBaseMessage & { +export const OpenChannelResponseOptionalFields: [] = [] +export type OpenChannelResponseOptions = OptionsBaseMessage & { checkOptionalsAreSet?: [] - addressType_CustomCheck?: (v: AddressType) => boolean + channelId_CustomCheck?: (v: string) => boolean } -export const NewAddressRequestValidate = (o?: NewAddressRequest, opts: NewAddressRequestOptions = {}, path: string = 'NewAddressRequest::root.'): Error | null => { +export const OpenChannelResponseValidate = (o?: OpenChannelResponse, opts: OpenChannelResponseOptions = {}, path: string = 'OpenChannelResponse::root.'): Error | null => { if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - if (!enumCheckAddressType(o.addressType)) return new Error(`${path}.addressType: is not a valid AddressType`) - if (opts.addressType_CustomCheck && !opts.addressType_CustomCheck(o.addressType)) return new Error(`${path}.addressType: custom check failed`) + if (typeof o.channelId !== 'string') return new Error(`${path}.channelId: is not a string`) + if (opts.channelId_CustomCheck && !opts.channelId_CustomCheck(o.channelId)) return new Error(`${path}.channelId: custom check failed`) + + return null +} + +export type LndGetInfoRequest = { + nodeId: number +} +export const LndGetInfoRequestOptionalFields: [] = [] +export type LndGetInfoRequestOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + nodeId_CustomCheck?: (v: number) => boolean +} +export const LndGetInfoRequestValidate = (o?: LndGetInfoRequest, opts: LndGetInfoRequestOptions = {}, path: string = 'LndGetInfoRequest::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.nodeId !== 'number') return new Error(`${path}.nodeId: is not a number`) + if (opts.nodeId_CustomCheck && !opts.nodeId_CustomCheck(o.nodeId)) return new Error(`${path}.nodeId: custom check failed`) + + return null +} + +export type AddAppUserInvoiceRequest = { + receiver_identifier: string + payer_identifier: string + http_callback_url: string + invoice_req: NewInvoiceRequest +} +export const AddAppUserInvoiceRequestOptionalFields: [] = [] +export type AddAppUserInvoiceRequestOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + receiver_identifier_CustomCheck?: (v: string) => boolean + payer_identifier_CustomCheck?: (v: string) => boolean + http_callback_url_CustomCheck?: (v: string) => boolean + invoice_req_Options?: NewInvoiceRequestOptions +} +export const AddAppUserInvoiceRequestValidate = (o?: AddAppUserInvoiceRequest, opts: AddAppUserInvoiceRequestOptions = {}, path: string = 'AddAppUserInvoiceRequest::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.receiver_identifier !== 'string') return new Error(`${path}.receiver_identifier: is not a string`) + if (opts.receiver_identifier_CustomCheck && !opts.receiver_identifier_CustomCheck(o.receiver_identifier)) return new Error(`${path}.receiver_identifier: custom check failed`) + + if (typeof o.payer_identifier !== 'string') return new Error(`${path}.payer_identifier: is not a string`) + if (opts.payer_identifier_CustomCheck && !opts.payer_identifier_CustomCheck(o.payer_identifier)) return new Error(`${path}.payer_identifier: custom check failed`) + + if (typeof o.http_callback_url !== 'string') return new Error(`${path}.http_callback_url: is not a string`) + if (opts.http_callback_url_CustomCheck && !opts.http_callback_url_CustomCheck(o.http_callback_url)) return new Error(`${path}.http_callback_url: custom check failed`) + + const invoice_reqErr = NewInvoiceRequestValidate(o.invoice_req, opts.invoice_req_Options, `${path}.invoice_req`) + if (invoice_reqErr !== null) return invoice_reqErr + + + return null +} + +export type GetAppUserLNURLInfoRequest = { + user_identifier: string + base_url_override: string +} +export const GetAppUserLNURLInfoRequestOptionalFields: [] = [] +export type GetAppUserLNURLInfoRequestOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + user_identifier_CustomCheck?: (v: string) => boolean + base_url_override_CustomCheck?: (v: string) => boolean +} +export const GetAppUserLNURLInfoRequestValidate = (o?: GetAppUserLNURLInfoRequest, opts: GetAppUserLNURLInfoRequestOptions = {}, path: string = 'GetAppUserLNURLInfoRequest::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.user_identifier !== 'string') return new Error(`${path}.user_identifier: is not a string`) + if (opts.user_identifier_CustomCheck && !opts.user_identifier_CustomCheck(o.user_identifier)) return new Error(`${path}.user_identifier: custom check failed`) + + if (typeof o.base_url_override !== 'string') return new Error(`${path}.base_url_override: is not a string`) + if (opts.base_url_override_CustomCheck && !opts.base_url_override_CustomCheck(o.base_url_override)) return new Error(`${path}.base_url_override: custom check failed`) + + return null +} + +export type SetMockAppUserBalanceRequest = { + user_identifier: string + amount: number +} +export const SetMockAppUserBalanceRequestOptionalFields: [] = [] +export type SetMockAppUserBalanceRequestOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + user_identifier_CustomCheck?: (v: string) => boolean + amount_CustomCheck?: (v: number) => boolean +} +export const SetMockAppUserBalanceRequestValidate = (o?: SetMockAppUserBalanceRequest, opts: SetMockAppUserBalanceRequestOptions = {}, path: string = 'SetMockAppUserBalanceRequest::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.user_identifier !== 'string') return new Error(`${path}.user_identifier: is not a string`) + if (opts.user_identifier_CustomCheck && !opts.user_identifier_CustomCheck(o.user_identifier)) return new Error(`${path}.user_identifier: custom check failed`) + + if (typeof o.amount !== 'number') return new Error(`${path}.amount: is not a number`) + if (opts.amount_CustomCheck && !opts.amount_CustomCheck(o.amount)) return new Error(`${path}.amount: custom check failed`) + + return null +} + +export type PayAddressRequest = { + address: string + amoutSats: number + satsPerVByte: number +} +export const PayAddressRequestOptionalFields: [] = [] +export type PayAddressRequestOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + address_CustomCheck?: (v: string) => boolean + amoutSats_CustomCheck?: (v: number) => boolean + satsPerVByte_CustomCheck?: (v: number) => boolean +} +export const PayAddressRequestValidate = (o?: PayAddressRequest, opts: PayAddressRequestOptions = {}, path: string = 'PayAddressRequest::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.address !== 'string') return new Error(`${path}.address: is not a string`) + if (opts.address_CustomCheck && !opts.address_CustomCheck(o.address)) return new Error(`${path}.address: custom check failed`) + + if (typeof o.amoutSats !== 'number') return new Error(`${path}.amoutSats: is not a number`) + if (opts.amoutSats_CustomCheck && !opts.amoutSats_CustomCheck(o.amoutSats)) return new Error(`${path}.amoutSats: custom check failed`) + + if (typeof o.satsPerVByte !== 'number') return new Error(`${path}.satsPerVByte: is not a number`) + if (opts.satsPerVByte_CustomCheck && !opts.satsPerVByte_CustomCheck(o.satsPerVByte)) return new Error(`${path}.satsPerVByte: custom check failed`) + + return null +} + +export type HandleLnurlPayResponse = { + pr: string + routes: Empty[] +} +export const HandleLnurlPayResponseOptionalFields: [] = [] +export type HandleLnurlPayResponseOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + pr_CustomCheck?: (v: string) => boolean + routes_ItemOptions?: EmptyOptions + routes_CustomCheck?: (v: Empty[]) => boolean +} +export const HandleLnurlPayResponseValidate = (o?: HandleLnurlPayResponse, opts: HandleLnurlPayResponseOptions = {}, path: string = 'HandleLnurlPayResponse::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.pr !== 'string') return new Error(`${path}.pr: is not a string`) + if (opts.pr_CustomCheck && !opts.pr_CustomCheck(o.pr)) return new Error(`${path}.pr: custom check failed`) + + if (!Array.isArray(o.routes)) return new Error(`${path}.routes: is not an array`) + for (let index = 0; index < o.routes.length; index++) { + const routesErr = EmptyValidate(o.routes[index], opts.routes_ItemOptions, `${path}.routes[${index}]`) + if (routesErr !== null) return routesErr + } + if (opts.routes_CustomCheck && !opts.routes_CustomCheck(o.routes)) return new Error(`${path}.routes: custom check failed`) + + return null +} + +export type GetUserOperationsRequest = { + latestIncomingInvoice: number + latestOutgoingInvoice: number + latestIncomingTx: number + latestOutgoingTx: number + latestIncomingUserToUserPayment: number + latestOutgoingUserToUserPayment: number +} +export const GetUserOperationsRequestOptionalFields: [] = [] +export type GetUserOperationsRequestOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + latestIncomingInvoice_CustomCheck?: (v: number) => boolean + latestOutgoingInvoice_CustomCheck?: (v: number) => boolean + latestIncomingTx_CustomCheck?: (v: number) => boolean + latestOutgoingTx_CustomCheck?: (v: number) => boolean + latestIncomingUserToUserPayment_CustomCheck?: (v: number) => boolean + latestOutgoingUserToUserPayment_CustomCheck?: (v: number) => boolean +} +export const GetUserOperationsRequestValidate = (o?: GetUserOperationsRequest, opts: GetUserOperationsRequestOptions = {}, path: string = 'GetUserOperationsRequest::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.latestIncomingInvoice !== 'number') return new Error(`${path}.latestIncomingInvoice: is not a number`) + if (opts.latestIncomingInvoice_CustomCheck && !opts.latestIncomingInvoice_CustomCheck(o.latestIncomingInvoice)) return new Error(`${path}.latestIncomingInvoice: custom check failed`) + + if (typeof o.latestOutgoingInvoice !== 'number') return new Error(`${path}.latestOutgoingInvoice: is not a number`) + if (opts.latestOutgoingInvoice_CustomCheck && !opts.latestOutgoingInvoice_CustomCheck(o.latestOutgoingInvoice)) return new Error(`${path}.latestOutgoingInvoice: custom check failed`) + + if (typeof o.latestIncomingTx !== 'number') return new Error(`${path}.latestIncomingTx: is not a number`) + if (opts.latestIncomingTx_CustomCheck && !opts.latestIncomingTx_CustomCheck(o.latestIncomingTx)) return new Error(`${path}.latestIncomingTx: custom check failed`) + + if (typeof o.latestOutgoingTx !== 'number') return new Error(`${path}.latestOutgoingTx: is not a number`) + if (opts.latestOutgoingTx_CustomCheck && !opts.latestOutgoingTx_CustomCheck(o.latestOutgoingTx)) return new Error(`${path}.latestOutgoingTx: custom check failed`) + + if (typeof o.latestIncomingUserToUserPayment !== 'number') return new Error(`${path}.latestIncomingUserToUserPayment: is not a number`) + if (opts.latestIncomingUserToUserPayment_CustomCheck && !opts.latestIncomingUserToUserPayment_CustomCheck(o.latestIncomingUserToUserPayment)) return new Error(`${path}.latestIncomingUserToUserPayment: custom check failed`) + + if (typeof o.latestOutgoingUserToUserPayment !== 'number') return new Error(`${path}.latestOutgoingUserToUserPayment: is not a number`) + if (opts.latestOutgoingUserToUserPayment_CustomCheck && !opts.latestOutgoingUserToUserPayment_CustomCheck(o.latestOutgoingUserToUserPayment)) return new Error(`${path}.latestOutgoingUserToUserPayment: custom check failed`) + + return null +} + +export type Product = { + id: string + name: string + price_sats: number +} +export const ProductOptionalFields: [] = [] +export type ProductOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + id_CustomCheck?: (v: string) => boolean + name_CustomCheck?: (v: string) => boolean + price_sats_CustomCheck?: (v: number) => boolean +} +export const ProductValidate = (o?: Product, opts: ProductOptions = {}, path: string = 'Product::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.id !== 'string') return new Error(`${path}.id: is not a string`) + if (opts.id_CustomCheck && !opts.id_CustomCheck(o.id)) return new Error(`${path}.id: custom check failed`) + + if (typeof o.name !== 'string') return new Error(`${path}.name: is not a string`) + if (opts.name_CustomCheck && !opts.name_CustomCheck(o.name)) return new Error(`${path}.name: custom check failed`) + + if (typeof o.price_sats !== 'number') return new Error(`${path}.price_sats: is not a number`) + if (opts.price_sats_CustomCheck && !opts.price_sats_CustomCheck(o.price_sats)) return new Error(`${path}.price_sats: custom check failed`) return null } @@ -579,150 +1061,66 @@ export const NewAddressResponseValidate = (o?: NewAddressResponse, opts: NewAddr return null } -export type NewInvoiceResponse = { - invoice: string +export type NewInvoiceRequest = { + amountSats: number + memo: string } -export const NewInvoiceResponseOptionalFields: [] = [] -export type NewInvoiceResponseOptions = OptionsBaseMessage & { +export const NewInvoiceRequestOptionalFields: [] = [] +export type NewInvoiceRequestOptions = OptionsBaseMessage & { checkOptionalsAreSet?: [] - invoice_CustomCheck?: (v: string) => boolean + amountSats_CustomCheck?: (v: number) => boolean + memo_CustomCheck?: (v: string) => boolean } -export const NewInvoiceResponseValidate = (o?: NewInvoiceResponse, opts: NewInvoiceResponseOptions = {}, path: string = 'NewInvoiceResponse::root.'): Error | null => { +export const NewInvoiceRequestValidate = (o?: NewInvoiceRequest, opts: NewInvoiceRequestOptions = {}, path: string = 'NewInvoiceRequest::root.'): Error | null => { if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - if (typeof o.invoice !== 'string') return new Error(`${path}.invoice: is not a string`) - if (opts.invoice_CustomCheck && !opts.invoice_CustomCheck(o.invoice)) return new Error(`${path}.invoice: custom check failed`) + if (typeof o.amountSats !== 'number') return new Error(`${path}.amountSats: is not a number`) + if (opts.amountSats_CustomCheck && !opts.amountSats_CustomCheck(o.amountSats)) return new Error(`${path}.amountSats: custom check failed`) + + if (typeof o.memo !== 'string') return new Error(`${path}.memo: is not a string`) + if (opts.memo_CustomCheck && !opts.memo_CustomCheck(o.memo)) return new Error(`${path}.memo: custom check failed`) return null } -export type AddAppRequest = { +export type AddProductRequest = { name: string - allow_user_creation: boolean + price_sats: number } -export const AddAppRequestOptionalFields: [] = [] -export type AddAppRequestOptions = OptionsBaseMessage & { +export const AddProductRequestOptionalFields: [] = [] +export type AddProductRequestOptions = OptionsBaseMessage & { checkOptionalsAreSet?: [] name_CustomCheck?: (v: string) => boolean - allow_user_creation_CustomCheck?: (v: boolean) => boolean + price_sats_CustomCheck?: (v: number) => boolean } -export const AddAppRequestValidate = (o?: AddAppRequest, opts: AddAppRequestOptions = {}, path: string = 'AddAppRequest::root.'): Error | null => { +export const AddProductRequestValidate = (o?: AddProductRequest, opts: AddProductRequestOptions = {}, path: string = 'AddProductRequest::root.'): Error | null => { if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') if (typeof o.name !== 'string') return new Error(`${path}.name: is not a string`) if (opts.name_CustomCheck && !opts.name_CustomCheck(o.name)) return new Error(`${path}.name: custom check failed`) - if (typeof o.allow_user_creation !== 'boolean') return new Error(`${path}.allow_user_creation: is not a boolean`) - if (opts.allow_user_creation_CustomCheck && !opts.allow_user_creation_CustomCheck(o.allow_user_creation)) return new Error(`${path}.allow_user_creation: custom check failed`) + if (typeof o.price_sats !== 'number') return new Error(`${path}.price_sats: is not a number`) + if (opts.price_sats_CustomCheck && !opts.price_sats_CustomCheck(o.price_sats)) return new Error(`${path}.price_sats: custom check failed`) return null } -export type GetAppUserRequest = { - user_identifier: string +export type PayAddressResponse = { + txId: string } -export const GetAppUserRequestOptionalFields: [] = [] -export type GetAppUserRequestOptions = OptionsBaseMessage & { +export const PayAddressResponseOptionalFields: [] = [] +export type PayAddressResponseOptions = OptionsBaseMessage & { checkOptionalsAreSet?: [] - user_identifier_CustomCheck?: (v: string) => boolean + txId_CustomCheck?: (v: string) => boolean } -export const GetAppUserRequestValidate = (o?: GetAppUserRequest, opts: GetAppUserRequestOptions = {}, path: string = 'GetAppUserRequest::root.'): Error | null => { +export const PayAddressResponseValidate = (o?: PayAddressResponse, opts: PayAddressResponseOptions = {}, path: string = 'PayAddressResponse::root.'): Error | null => { if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - if (typeof o.user_identifier !== 'string') return new Error(`${path}.user_identifier: is not a string`) - if (opts.user_identifier_CustomCheck && !opts.user_identifier_CustomCheck(o.user_identifier)) return new Error(`${path}.user_identifier: custom check failed`) - - return null -} - -export type PayAppUserInvoiceRequest = { - user_identifier: string - invoice: string - amount: number -} -export const PayAppUserInvoiceRequestOptionalFields: [] = [] -export type PayAppUserInvoiceRequestOptions = OptionsBaseMessage & { - checkOptionalsAreSet?: [] - user_identifier_CustomCheck?: (v: string) => boolean - invoice_CustomCheck?: (v: string) => boolean - amount_CustomCheck?: (v: number) => boolean -} -export const PayAppUserInvoiceRequestValidate = (o?: PayAppUserInvoiceRequest, opts: PayAppUserInvoiceRequestOptions = {}, path: string = 'PayAppUserInvoiceRequest::root.'): Error | null => { - if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') - if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - - if (typeof o.user_identifier !== 'string') return new Error(`${path}.user_identifier: is not a string`) - if (opts.user_identifier_CustomCheck && !opts.user_identifier_CustomCheck(o.user_identifier)) return new Error(`${path}.user_identifier: custom check failed`) - - if (typeof o.invoice !== 'string') return new Error(`${path}.invoice: is not a string`) - if (opts.invoice_CustomCheck && !opts.invoice_CustomCheck(o.invoice)) return new Error(`${path}.invoice: custom check failed`) - - if (typeof o.amount !== 'number') return new Error(`${path}.amount: is not a number`) - if (opts.amount_CustomCheck && !opts.amount_CustomCheck(o.amount)) return new Error(`${path}.amount: custom check failed`) - - return null -} - -export type SendAppUserToAppUserPaymentRequest = { - from_user_identifier: string - to_user_identifier: string - amount: number -} -export const SendAppUserToAppUserPaymentRequestOptionalFields: [] = [] -export type SendAppUserToAppUserPaymentRequestOptions = OptionsBaseMessage & { - checkOptionalsAreSet?: [] - from_user_identifier_CustomCheck?: (v: string) => boolean - to_user_identifier_CustomCheck?: (v: string) => boolean - amount_CustomCheck?: (v: number) => boolean -} -export const SendAppUserToAppUserPaymentRequestValidate = (o?: SendAppUserToAppUserPaymentRequest, opts: SendAppUserToAppUserPaymentRequestOptions = {}, path: string = 'SendAppUserToAppUserPaymentRequest::root.'): Error | null => { - if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') - if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - - if (typeof o.from_user_identifier !== 'string') return new Error(`${path}.from_user_identifier: is not a string`) - if (opts.from_user_identifier_CustomCheck && !opts.from_user_identifier_CustomCheck(o.from_user_identifier)) return new Error(`${path}.from_user_identifier: custom check failed`) - - if (typeof o.to_user_identifier !== 'string') return new Error(`${path}.to_user_identifier: is not a string`) - if (opts.to_user_identifier_CustomCheck && !opts.to_user_identifier_CustomCheck(o.to_user_identifier)) return new Error(`${path}.to_user_identifier: custom check failed`) - - if (typeof o.amount !== 'number') return new Error(`${path}.amount: is not a number`) - if (opts.amount_CustomCheck && !opts.amount_CustomCheck(o.amount)) return new Error(`${path}.amount: custom check failed`) - - return null -} - -export type OpenChannelRequest = { - destination: string - fundingAmount: number - pushAmount: number - closeAddress: string -} -export const OpenChannelRequestOptionalFields: [] = [] -export type OpenChannelRequestOptions = OptionsBaseMessage & { - checkOptionalsAreSet?: [] - destination_CustomCheck?: (v: string) => boolean - fundingAmount_CustomCheck?: (v: number) => boolean - pushAmount_CustomCheck?: (v: number) => boolean - closeAddress_CustomCheck?: (v: string) => boolean -} -export const OpenChannelRequestValidate = (o?: OpenChannelRequest, opts: OpenChannelRequestOptions = {}, path: string = 'OpenChannelRequest::root.'): Error | null => { - if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') - if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - - if (typeof o.destination !== 'string') return new Error(`${path}.destination: is not a string`) - if (opts.destination_CustomCheck && !opts.destination_CustomCheck(o.destination)) return new Error(`${path}.destination: custom check failed`) - - if (typeof o.fundingAmount !== 'number') return new Error(`${path}.fundingAmount: is not a number`) - if (opts.fundingAmount_CustomCheck && !opts.fundingAmount_CustomCheck(o.fundingAmount)) return new Error(`${path}.fundingAmount: custom check failed`) - - if (typeof o.pushAmount !== 'number') return new Error(`${path}.pushAmount: is not a number`) - if (opts.pushAmount_CustomCheck && !opts.pushAmount_CustomCheck(o.pushAmount)) return new Error(`${path}.pushAmount: custom check failed`) - - if (typeof o.closeAddress !== 'string') return new Error(`${path}.closeAddress: is not a string`) - if (opts.closeAddress_CustomCheck && !opts.closeAddress_CustomCheck(o.closeAddress)) return new Error(`${path}.closeAddress: custom check failed`) + if (typeof o.txId !== 'string') return new Error(`${path}.txId: is not a string`) + if (opts.txId_CustomCheck && !opts.txId_CustomCheck(o.txId)) return new Error(`${path}.txId: custom check failed`) return null } @@ -765,6 +1163,62 @@ export const LnurlPayInfoResponseValidate = (o?: LnurlPayInfoResponse, opts: Lnu return null } +export type UserInfo = { + userId: string + balance: number +} +export const UserInfoOptionalFields: [] = [] +export type UserInfoOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + userId_CustomCheck?: (v: string) => boolean + balance_CustomCheck?: (v: number) => boolean +} +export const UserInfoValidate = (o?: UserInfo, opts: UserInfoOptions = {}, path: string = 'UserInfo::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.userId !== 'string') return new Error(`${path}.userId: is not a string`) + if (opts.userId_CustomCheck && !opts.userId_CustomCheck(o.userId)) return new Error(`${path}.userId: custom check failed`) + + if (typeof o.balance !== 'number') return new Error(`${path}.balance: is not a number`) + if (opts.balance_CustomCheck && !opts.balance_CustomCheck(o.balance)) return new Error(`${path}.balance: custom check failed`) + + return null +} + +export type UserOperations = { + fromIndex: number + toIndex: number + operations: UserOperation[] +} +export const UserOperationsOptionalFields: [] = [] +export type UserOperationsOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + fromIndex_CustomCheck?: (v: number) => boolean + toIndex_CustomCheck?: (v: number) => boolean + operations_ItemOptions?: UserOperationOptions + operations_CustomCheck?: (v: UserOperation[]) => boolean +} +export const UserOperationsValidate = (o?: UserOperations, opts: UserOperationsOptions = {}, path: string = 'UserOperations::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.fromIndex !== 'number') return new Error(`${path}.fromIndex: is not a number`) + if (opts.fromIndex_CustomCheck && !opts.fromIndex_CustomCheck(o.fromIndex)) return new Error(`${path}.fromIndex: custom check failed`) + + if (typeof o.toIndex !== 'number') return new Error(`${path}.toIndex: is not a number`) + if (opts.toIndex_CustomCheck && !opts.toIndex_CustomCheck(o.toIndex)) return new Error(`${path}.toIndex: custom check failed`) + + if (!Array.isArray(o.operations)) return new Error(`${path}.operations: is not an array`) + for (let index = 0; index < o.operations.length; index++) { + const operationsErr = UserOperationValidate(o.operations[index], opts.operations_ItemOptions, `${path}.operations[${index}]`) + if (operationsErr !== null) return operationsErr + } + if (opts.operations_CustomCheck && !opts.operations_CustomCheck(o.operations)) return new Error(`${path}.operations: custom check failed`) + + return null +} + export type GetUserOperationsResponse = { latestOutgoingInvoiceOperations: UserOperations latestIncomingInvoiceOperations: UserOperations @@ -814,483 +1268,21 @@ export const GetUserOperationsResponseValidate = (o?: GetUserOperationsResponse, return null } -export type GetProductBuyLinkResponse = { - link: string -} -export const GetProductBuyLinkResponseOptionalFields: [] = [] -export type GetProductBuyLinkResponseOptions = OptionsBaseMessage & { - checkOptionalsAreSet?: [] - link_CustomCheck?: (v: string) => boolean -} -export const GetProductBuyLinkResponseValidate = (o?: GetProductBuyLinkResponse, opts: GetProductBuyLinkResponseOptions = {}, path: string = 'GetProductBuyLinkResponse::root.'): Error | null => { - if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') - if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - - if (typeof o.link !== 'string') return new Error(`${path}.link: is not a string`) - if (opts.link_CustomCheck && !opts.link_CustomCheck(o.link)) return new Error(`${path}.link: custom check failed`) - - return null -} - -export type AddAppUserInvoiceRequest = { - receiver_identifier: string - payer_identifier: string - http_callback_url: string - invoice_req: NewInvoiceRequest -} -export const AddAppUserInvoiceRequestOptionalFields: [] = [] -export type AddAppUserInvoiceRequestOptions = OptionsBaseMessage & { - checkOptionalsAreSet?: [] - receiver_identifier_CustomCheck?: (v: string) => boolean - payer_identifier_CustomCheck?: (v: string) => boolean - http_callback_url_CustomCheck?: (v: string) => boolean - invoice_req_Options?: NewInvoiceRequestOptions -} -export const AddAppUserInvoiceRequestValidate = (o?: AddAppUserInvoiceRequest, opts: AddAppUserInvoiceRequestOptions = {}, path: string = 'AddAppUserInvoiceRequest::root.'): Error | null => { - if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') - if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - - if (typeof o.receiver_identifier !== 'string') return new Error(`${path}.receiver_identifier: is not a string`) - if (opts.receiver_identifier_CustomCheck && !opts.receiver_identifier_CustomCheck(o.receiver_identifier)) return new Error(`${path}.receiver_identifier: custom check failed`) - - if (typeof o.payer_identifier !== 'string') return new Error(`${path}.payer_identifier: is not a string`) - if (opts.payer_identifier_CustomCheck && !opts.payer_identifier_CustomCheck(o.payer_identifier)) return new Error(`${path}.payer_identifier: custom check failed`) - - if (typeof o.http_callback_url !== 'string') return new Error(`${path}.http_callback_url: is not a string`) - if (opts.http_callback_url_CustomCheck && !opts.http_callback_url_CustomCheck(o.http_callback_url)) return new Error(`${path}.http_callback_url: custom check failed`) - - const invoice_reqErr = NewInvoiceRequestValidate(o.invoice_req, opts.invoice_req_Options, `${path}.invoice_req`) - if (invoice_reqErr !== null) return invoice_reqErr - - - return null -} - -export type UserInfo = { - userId: string - balance: number -} -export const UserInfoOptionalFields: [] = [] -export type UserInfoOptions = OptionsBaseMessage & { - checkOptionalsAreSet?: [] - userId_CustomCheck?: (v: string) => boolean - balance_CustomCheck?: (v: number) => boolean -} -export const UserInfoValidate = (o?: UserInfo, opts: UserInfoOptions = {}, path: string = 'UserInfo::root.'): Error | null => { - if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') - if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - - if (typeof o.userId !== 'string') return new Error(`${path}.userId: is not a string`) - if (opts.userId_CustomCheck && !opts.userId_CustomCheck(o.userId)) return new Error(`${path}.userId: custom check failed`) - - if (typeof o.balance !== 'number') return new Error(`${path}.balance: is not a number`) - if (opts.balance_CustomCheck && !opts.balance_CustomCheck(o.balance)) return new Error(`${path}.balance: custom check failed`) - - return null -} - -export type PayAddressRequest = { - address: string - amoutSats: number - satsPerVByte: number -} -export const PayAddressRequestOptionalFields: [] = [] -export type PayAddressRequestOptions = OptionsBaseMessage & { - checkOptionalsAreSet?: [] - address_CustomCheck?: (v: string) => boolean - amoutSats_CustomCheck?: (v: number) => boolean - satsPerVByte_CustomCheck?: (v: number) => boolean -} -export const PayAddressRequestValidate = (o?: PayAddressRequest, opts: PayAddressRequestOptions = {}, path: string = 'PayAddressRequest::root.'): Error | null => { - if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') - if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - - if (typeof o.address !== 'string') return new Error(`${path}.address: is not a string`) - if (opts.address_CustomCheck && !opts.address_CustomCheck(o.address)) return new Error(`${path}.address: custom check failed`) - - if (typeof o.amoutSats !== 'number') return new Error(`${path}.amoutSats: is not a number`) - if (opts.amoutSats_CustomCheck && !opts.amoutSats_CustomCheck(o.amoutSats)) return new Error(`${path}.amoutSats: custom check failed`) - - if (typeof o.satsPerVByte !== 'number') return new Error(`${path}.satsPerVByte: is not a number`) - if (opts.satsPerVByte_CustomCheck && !opts.satsPerVByte_CustomCheck(o.satsPerVByte)) return new Error(`${path}.satsPerVByte: custom check failed`) - - return null -} - -export type NewInvoiceRequest = { - amountSats: number - memo: string -} -export const NewInvoiceRequestOptionalFields: [] = [] -export type NewInvoiceRequestOptions = OptionsBaseMessage & { - checkOptionalsAreSet?: [] - amountSats_CustomCheck?: (v: number) => boolean - memo_CustomCheck?: (v: string) => boolean -} -export const NewInvoiceRequestValidate = (o?: NewInvoiceRequest, opts: NewInvoiceRequestOptions = {}, path: string = 'NewInvoiceRequest::root.'): Error | null => { - if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') - if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - - if (typeof o.amountSats !== 'number') return new Error(`${path}.amountSats: is not a number`) - if (opts.amountSats_CustomCheck && !opts.amountSats_CustomCheck(o.amountSats)) return new Error(`${path}.amountSats: custom check failed`) - - if (typeof o.memo !== 'string') return new Error(`${path}.memo: is not a string`) - if (opts.memo_CustomCheck && !opts.memo_CustomCheck(o.memo)) return new Error(`${path}.memo: custom check failed`) - - return null -} - -export type DecodeInvoiceRequest = { - invoice: string -} -export const DecodeInvoiceRequestOptionalFields: [] = [] -export type DecodeInvoiceRequestOptions = OptionsBaseMessage & { - checkOptionalsAreSet?: [] - invoice_CustomCheck?: (v: string) => boolean -} -export const DecodeInvoiceRequestValidate = (o?: DecodeInvoiceRequest, opts: DecodeInvoiceRequestOptions = {}, path: string = 'DecodeInvoiceRequest::root.'): Error | null => { - if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') - if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - - if (typeof o.invoice !== 'string') return new Error(`${path}.invoice: is not a string`) - if (opts.invoice_CustomCheck && !opts.invoice_CustomCheck(o.invoice)) return new Error(`${path}.invoice: custom check failed`) - - return null -} - -export type AuthAppRequest = { - name: string - allow_user_creation?: boolean -} -export type AuthAppRequestOptionalField = 'allow_user_creation' -export const AuthAppRequestOptionalFields: AuthAppRequestOptionalField[] = ['allow_user_creation'] -export type AuthAppRequestOptions = OptionsBaseMessage & { - checkOptionalsAreSet?: AuthAppRequestOptionalField[] - name_CustomCheck?: (v: string) => boolean - allow_user_creation_CustomCheck?: (v?: boolean) => boolean -} -export const AuthAppRequestValidate = (o?: AuthAppRequest, opts: AuthAppRequestOptions = {}, path: string = 'AuthAppRequest::root.'): Error | null => { - if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') - if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - - if (typeof o.name !== 'string') return new Error(`${path}.name: is not a string`) - if (opts.name_CustomCheck && !opts.name_CustomCheck(o.name)) return new Error(`${path}.name: custom check failed`) - - if ((o.allow_user_creation || opts.allOptionalsAreSet || opts.checkOptionalsAreSet?.includes('allow_user_creation')) && typeof o.allow_user_creation !== 'boolean') return new Error(`${path}.allow_user_creation: is not a boolean`) - if (opts.allow_user_creation_CustomCheck && !opts.allow_user_creation_CustomCheck(o.allow_user_creation)) return new Error(`${path}.allow_user_creation: custom check failed`) - - return null -} - -export type Application = { - name: string +export type LiveUserOperation = { id: string - balance: number - npub: string } -export const ApplicationOptionalFields: [] = [] -export type ApplicationOptions = OptionsBaseMessage & { - checkOptionalsAreSet?: [] - name_CustomCheck?: (v: string) => boolean - id_CustomCheck?: (v: string) => boolean - balance_CustomCheck?: (v: number) => boolean - npub_CustomCheck?: (v: string) => boolean -} -export const ApplicationValidate = (o?: Application, opts: ApplicationOptions = {}, path: string = 'Application::root.'): Error | null => { - if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') - if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - - if (typeof o.name !== 'string') return new Error(`${path}.name: is not a string`) - if (opts.name_CustomCheck && !opts.name_CustomCheck(o.name)) return new Error(`${path}.name: custom check failed`) - - if (typeof o.id !== 'string') return new Error(`${path}.id: is not a string`) - if (opts.id_CustomCheck && !opts.id_CustomCheck(o.id)) return new Error(`${path}.id: custom check failed`) - - if (typeof o.balance !== 'number') return new Error(`${path}.balance: is not a number`) - if (opts.balance_CustomCheck && !opts.balance_CustomCheck(o.balance)) return new Error(`${path}.balance: custom check failed`) - - if (typeof o.npub !== 'string') return new Error(`${path}.npub: is not a string`) - if (opts.npub_CustomCheck && !opts.npub_CustomCheck(o.npub)) return new Error(`${path}.npub: custom check failed`) - - return null -} - -export type AddAppInvoiceRequest = { - payer_identifier: string - http_callback_url: string - invoice_req: NewInvoiceRequest -} -export const AddAppInvoiceRequestOptionalFields: [] = [] -export type AddAppInvoiceRequestOptions = OptionsBaseMessage & { - checkOptionalsAreSet?: [] - payer_identifier_CustomCheck?: (v: string) => boolean - http_callback_url_CustomCheck?: (v: string) => boolean - invoice_req_Options?: NewInvoiceRequestOptions -} -export const AddAppInvoiceRequestValidate = (o?: AddAppInvoiceRequest, opts: AddAppInvoiceRequestOptions = {}, path: string = 'AddAppInvoiceRequest::root.'): Error | null => { - if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') - if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - - if (typeof o.payer_identifier !== 'string') return new Error(`${path}.payer_identifier: is not a string`) - if (opts.payer_identifier_CustomCheck && !opts.payer_identifier_CustomCheck(o.payer_identifier)) return new Error(`${path}.payer_identifier: custom check failed`) - - if (typeof o.http_callback_url !== 'string') return new Error(`${path}.http_callback_url: is not a string`) - if (opts.http_callback_url_CustomCheck && !opts.http_callback_url_CustomCheck(o.http_callback_url)) return new Error(`${path}.http_callback_url: custom check failed`) - - const invoice_reqErr = NewInvoiceRequestValidate(o.invoice_req, opts.invoice_req_Options, `${path}.invoice_req`) - if (invoice_reqErr !== null) return invoice_reqErr - - - return null -} - -export type PayAppUserInvoiceResponse = { - preimage: string - amount_paid: number -} -export const PayAppUserInvoiceResponseOptionalFields: [] = [] -export type PayAppUserInvoiceResponseOptions = OptionsBaseMessage & { - checkOptionalsAreSet?: [] - preimage_CustomCheck?: (v: string) => boolean - amount_paid_CustomCheck?: (v: number) => boolean -} -export const PayAppUserInvoiceResponseValidate = (o?: PayAppUserInvoiceResponse, opts: PayAppUserInvoiceResponseOptions = {}, path: string = 'PayAppUserInvoiceResponse::root.'): Error | null => { - if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') - if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - - if (typeof o.preimage !== 'string') return new Error(`${path}.preimage: is not a string`) - if (opts.preimage_CustomCheck && !opts.preimage_CustomCheck(o.preimage)) return new Error(`${path}.preimage: custom check failed`) - - if (typeof o.amount_paid !== 'number') return new Error(`${path}.amount_paid: is not a number`) - if (opts.amount_paid_CustomCheck && !opts.amount_paid_CustomCheck(o.amount_paid)) return new Error(`${path}.amount_paid: custom check failed`) - - return null -} - -export type EncryptionExchangeRequest = { - publicKey: string - deviceId: string -} -export const EncryptionExchangeRequestOptionalFields: [] = [] -export type EncryptionExchangeRequestOptions = OptionsBaseMessage & { - checkOptionalsAreSet?: [] - publicKey_CustomCheck?: (v: string) => boolean - deviceId_CustomCheck?: (v: string) => boolean -} -export const EncryptionExchangeRequestValidate = (o?: EncryptionExchangeRequest, opts: EncryptionExchangeRequestOptions = {}, path: string = 'EncryptionExchangeRequest::root.'): Error | null => { - if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') - if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - - if (typeof o.publicKey !== 'string') return new Error(`${path}.publicKey: is not a string`) - if (opts.publicKey_CustomCheck && !opts.publicKey_CustomCheck(o.publicKey)) return new Error(`${path}.publicKey: custom check failed`) - - if (typeof o.deviceId !== 'string') return new Error(`${path}.deviceId: is not a string`) - if (opts.deviceId_CustomCheck && !opts.deviceId_CustomCheck(o.deviceId)) return new Error(`${path}.deviceId: custom check failed`) - - return null -} - -export type PayInvoiceResponse = { - preimage: string - amount_paid: number -} -export const PayInvoiceResponseOptionalFields: [] = [] -export type PayInvoiceResponseOptions = OptionsBaseMessage & { - checkOptionalsAreSet?: [] - preimage_CustomCheck?: (v: string) => boolean - amount_paid_CustomCheck?: (v: number) => boolean -} -export const PayInvoiceResponseValidate = (o?: PayInvoiceResponse, opts: PayInvoiceResponseOptions = {}, path: string = 'PayInvoiceResponse::root.'): Error | null => { - if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') - if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - - if (typeof o.preimage !== 'string') return new Error(`${path}.preimage: is not a string`) - if (opts.preimage_CustomCheck && !opts.preimage_CustomCheck(o.preimage)) return new Error(`${path}.preimage: custom check failed`) - - if (typeof o.amount_paid !== 'number') return new Error(`${path}.amount_paid: is not a number`) - if (opts.amount_paid_CustomCheck && !opts.amount_paid_CustomCheck(o.amount_paid)) return new Error(`${path}.amount_paid: custom check failed`) - - return null -} - -export type UserOperations = { - fromIndex: number - toIndex: number - operations: UserOperation[] -} -export const UserOperationsOptionalFields: [] = [] -export type UserOperationsOptions = OptionsBaseMessage & { - checkOptionalsAreSet?: [] - fromIndex_CustomCheck?: (v: number) => boolean - toIndex_CustomCheck?: (v: number) => boolean - operations_ItemOptions?: UserOperationOptions - operations_CustomCheck?: (v: UserOperation[]) => boolean -} -export const UserOperationsValidate = (o?: UserOperations, opts: UserOperationsOptions = {}, path: string = 'UserOperations::root.'): Error | null => { - if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') - if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - - if (typeof o.fromIndex !== 'number') return new Error(`${path}.fromIndex: is not a number`) - if (opts.fromIndex_CustomCheck && !opts.fromIndex_CustomCheck(o.fromIndex)) return new Error(`${path}.fromIndex: custom check failed`) - - if (typeof o.toIndex !== 'number') return new Error(`${path}.toIndex: is not a number`) - if (opts.toIndex_CustomCheck && !opts.toIndex_CustomCheck(o.toIndex)) return new Error(`${path}.toIndex: custom check failed`) - - if (!Array.isArray(o.operations)) return new Error(`${path}.operations: is not an array`) - for (let index = 0; index < o.operations.length; index++) { - const operationsErr = UserOperationValidate(o.operations[index], opts.operations_ItemOptions, `${path}.operations[${index}]`) - if (operationsErr !== null) return operationsErr - } - if (opts.operations_CustomCheck && !opts.operations_CustomCheck(o.operations)) return new Error(`${path}.operations: custom check failed`) - - return null -} - -export type Empty = { -} -export const EmptyOptionalFields: [] = [] -export type EmptyOptions = OptionsBaseMessage & { - checkOptionalsAreSet?: [] -} -export const EmptyValidate = (o?: Empty, opts: EmptyOptions = {}, path: string = 'Empty::root.'): Error | null => { - if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') - if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - - return null -} - -export type GetAppUserLNURLInfoRequest = { - user_identifier: string - base_url_override: string -} -export const GetAppUserLNURLInfoRequestOptionalFields: [] = [] -export type GetAppUserLNURLInfoRequestOptions = OptionsBaseMessage & { - checkOptionalsAreSet?: [] - user_identifier_CustomCheck?: (v: string) => boolean - base_url_override_CustomCheck?: (v: string) => boolean -} -export const GetAppUserLNURLInfoRequestValidate = (o?: GetAppUserLNURLInfoRequest, opts: GetAppUserLNURLInfoRequestOptions = {}, path: string = 'GetAppUserLNURLInfoRequest::root.'): Error | null => { - if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') - if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - - if (typeof o.user_identifier !== 'string') return new Error(`${path}.user_identifier: is not a string`) - if (opts.user_identifier_CustomCheck && !opts.user_identifier_CustomCheck(o.user_identifier)) return new Error(`${path}.user_identifier: custom check failed`) - - if (typeof o.base_url_override !== 'string') return new Error(`${path}.base_url_override: is not a string`) - if (opts.base_url_override_CustomCheck && !opts.base_url_override_CustomCheck(o.base_url_override)) return new Error(`${path}.base_url_override: custom check failed`) - - return null -} - -export type SetMockAppUserBalanceRequest = { - user_identifier: string - amount: number -} -export const SetMockAppUserBalanceRequestOptionalFields: [] = [] -export type SetMockAppUserBalanceRequestOptions = OptionsBaseMessage & { - checkOptionalsAreSet?: [] - user_identifier_CustomCheck?: (v: string) => boolean - amount_CustomCheck?: (v: number) => boolean -} -export const SetMockAppUserBalanceRequestValidate = (o?: SetMockAppUserBalanceRequest, opts: SetMockAppUserBalanceRequestOptions = {}, path: string = 'SetMockAppUserBalanceRequest::root.'): Error | null => { - if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') - if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - - if (typeof o.user_identifier !== 'string') return new Error(`${path}.user_identifier: is not a string`) - if (opts.user_identifier_CustomCheck && !opts.user_identifier_CustomCheck(o.user_identifier)) return new Error(`${path}.user_identifier: custom check failed`) - - if (typeof o.amount !== 'number') return new Error(`${path}.amount: is not a number`) - if (opts.amount_CustomCheck && !opts.amount_CustomCheck(o.amount)) return new Error(`${path}.amount: custom check failed`) - - return null -} - -export type HandleLnurlPayResponse = { - pr: string - routes: Empty[] -} -export const HandleLnurlPayResponseOptionalFields: [] = [] -export type HandleLnurlPayResponseOptions = OptionsBaseMessage & { - checkOptionalsAreSet?: [] - pr_CustomCheck?: (v: string) => boolean - routes_ItemOptions?: EmptyOptions - routes_CustomCheck?: (v: Empty[]) => boolean -} -export const HandleLnurlPayResponseValidate = (o?: HandleLnurlPayResponse, opts: HandleLnurlPayResponseOptions = {}, path: string = 'HandleLnurlPayResponse::root.'): Error | null => { - if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') - if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - - if (typeof o.pr !== 'string') return new Error(`${path}.pr: is not a string`) - if (opts.pr_CustomCheck && !opts.pr_CustomCheck(o.pr)) return new Error(`${path}.pr: custom check failed`) - - if (!Array.isArray(o.routes)) return new Error(`${path}.routes: is not an array`) - for (let index = 0; index < o.routes.length; index++) { - const routesErr = EmptyValidate(o.routes[index], opts.routes_ItemOptions, `${path}.routes[${index}]`) - if (routesErr !== null) return routesErr - } - if (opts.routes_CustomCheck && !opts.routes_CustomCheck(o.routes)) return new Error(`${path}.routes: custom check failed`) - - return null -} - -export type UserOperation = { - paidAtUnix: number - type: UserOperationType - inbound: boolean - amount: number -} -export const UserOperationOptionalFields: [] = [] -export type UserOperationOptions = OptionsBaseMessage & { - checkOptionalsAreSet?: [] - paidAtUnix_CustomCheck?: (v: number) => boolean - type_CustomCheck?: (v: UserOperationType) => boolean - inbound_CustomCheck?: (v: boolean) => boolean - amount_CustomCheck?: (v: number) => boolean -} -export const UserOperationValidate = (o?: UserOperation, opts: UserOperationOptions = {}, path: string = 'UserOperation::root.'): Error | null => { - if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') - if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - - if (typeof o.paidAtUnix !== 'number') return new Error(`${path}.paidAtUnix: is not a number`) - if (opts.paidAtUnix_CustomCheck && !opts.paidAtUnix_CustomCheck(o.paidAtUnix)) return new Error(`${path}.paidAtUnix: custom check failed`) - - if (!enumCheckUserOperationType(o.type)) return new Error(`${path}.type: is not a valid UserOperationType`) - if (opts.type_CustomCheck && !opts.type_CustomCheck(o.type)) return new Error(`${path}.type: custom check failed`) - - if (typeof o.inbound !== 'boolean') return new Error(`${path}.inbound: is not a boolean`) - if (opts.inbound_CustomCheck && !opts.inbound_CustomCheck(o.inbound)) return new Error(`${path}.inbound: custom check failed`) - - if (typeof o.amount !== 'number') return new Error(`${path}.amount: is not a number`) - if (opts.amount_CustomCheck && !opts.amount_CustomCheck(o.amount)) return new Error(`${path}.amount: custom check failed`) - - return null -} - -export type Product = { - id: string - name: string - price_sats: number -} -export const ProductOptionalFields: [] = [] -export type ProductOptions = OptionsBaseMessage & { +export const LiveUserOperationOptionalFields: [] = [] +export type LiveUserOperationOptions = OptionsBaseMessage & { checkOptionalsAreSet?: [] id_CustomCheck?: (v: string) => boolean - name_CustomCheck?: (v: string) => boolean - price_sats_CustomCheck?: (v: number) => boolean } -export const ProductValidate = (o?: Product, opts: ProductOptions = {}, path: string = 'Product::root.'): Error | null => { +export const LiveUserOperationValidate = (o?: LiveUserOperation, opts: LiveUserOperationOptions = {}, path: string = 'LiveUserOperation::root.'): Error | null => { if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') if (typeof o.id !== 'string') return new Error(`${path}.id: is not a string`) if (opts.id_CustomCheck && !opts.id_CustomCheck(o.id)) return new Error(`${path}.id: custom check failed`) - if (typeof o.name !== 'string') return new Error(`${path}.name: is not a string`) - if (opts.name_CustomCheck && !opts.name_CustomCheck(o.name)) return new Error(`${path}.name: custom check failed`) - - if (typeof o.price_sats !== 'number') return new Error(`${path}.price_sats: is not a number`) - if (opts.price_sats_CustomCheck && !opts.price_sats_CustomCheck(o.price_sats)) return new Error(`${path}.price_sats: custom check failed`) - return null } @@ -1312,30 +1304,54 @@ export const LndGetInfoResponseValidate = (o?: LndGetInfoResponse, opts: LndGetI return null } -export type AddAppUserRequest = { - identifier: string - fail_if_exists: boolean - balance: number +export type AuthApp = { + app: Application + auth_token: string } -export const AddAppUserRequestOptionalFields: [] = [] -export type AddAppUserRequestOptions = OptionsBaseMessage & { +export const AuthAppOptionalFields: [] = [] +export type AuthAppOptions = OptionsBaseMessage & { checkOptionalsAreSet?: [] - identifier_CustomCheck?: (v: string) => boolean - fail_if_exists_CustomCheck?: (v: boolean) => boolean - balance_CustomCheck?: (v: number) => boolean + app_Options?: ApplicationOptions + auth_token_CustomCheck?: (v: string) => boolean } -export const AddAppUserRequestValidate = (o?: AddAppUserRequest, opts: AddAppUserRequestOptions = {}, path: string = 'AddAppUserRequest::root.'): Error | null => { +export const AuthAppValidate = (o?: AuthApp, opts: AuthAppOptions = {}, path: string = 'AuthApp::root.'): Error | null => { if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - if (typeof o.identifier !== 'string') return new Error(`${path}.identifier: is not a string`) - if (opts.identifier_CustomCheck && !opts.identifier_CustomCheck(o.identifier)) return new Error(`${path}.identifier: custom check failed`) + const appErr = ApplicationValidate(o.app, opts.app_Options, `${path}.app`) + if (appErr !== null) return appErr + - if (typeof o.fail_if_exists !== 'boolean') return new Error(`${path}.fail_if_exists: is not a boolean`) - if (opts.fail_if_exists_CustomCheck && !opts.fail_if_exists_CustomCheck(o.fail_if_exists)) return new Error(`${path}.fail_if_exists: custom check failed`) + if (typeof o.auth_token !== 'string') return new Error(`${path}.auth_token: is not a string`) + if (opts.auth_token_CustomCheck && !opts.auth_token_CustomCheck(o.auth_token)) return new Error(`${path}.auth_token: custom check failed`) - if (typeof o.balance !== 'number') return new Error(`${path}.balance: is not a number`) - if (opts.balance_CustomCheck && !opts.balance_CustomCheck(o.balance)) return new Error(`${path}.balance: custom check failed`) + return null +} + +export type SendAppUserToAppUserPaymentRequest = { + from_user_identifier: string + to_user_identifier: string + amount: number +} +export const SendAppUserToAppUserPaymentRequestOptionalFields: [] = [] +export type SendAppUserToAppUserPaymentRequestOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + from_user_identifier_CustomCheck?: (v: string) => boolean + to_user_identifier_CustomCheck?: (v: string) => boolean + amount_CustomCheck?: (v: number) => boolean +} +export const SendAppUserToAppUserPaymentRequestValidate = (o?: SendAppUserToAppUserPaymentRequest, opts: SendAppUserToAppUserPaymentRequestOptions = {}, path: string = 'SendAppUserToAppUserPaymentRequest::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.from_user_identifier !== 'string') return new Error(`${path}.from_user_identifier: is not a string`) + if (opts.from_user_identifier_CustomCheck && !opts.from_user_identifier_CustomCheck(o.from_user_identifier)) return new Error(`${path}.from_user_identifier: custom check failed`) + + if (typeof o.to_user_identifier !== 'string') return new Error(`${path}.to_user_identifier: is not a string`) + if (opts.to_user_identifier_CustomCheck && !opts.to_user_identifier_CustomCheck(o.to_user_identifier)) return new Error(`${path}.to_user_identifier: custom check failed`) + + if (typeof o.amount !== 'number') return new Error(`${path}.amount: is not a number`) + if (opts.amount_CustomCheck && !opts.amount_CustomCheck(o.amount)) return new Error(`${path}.amount: custom check failed`) return null } @@ -1363,45 +1379,53 @@ export const SendAppUserToAppPaymentRequestValidate = (o?: SendAppUserToAppPayme return null } -export type GetUserOperationsRequest = { - latestIncomingInvoice: number - latestOutgoingInvoice: number - latestIncomingTx: number - latestOutgoingTx: number - latestIncomingUserToUserPayment: number - latestOutgoingUserToUserPayment: number +export type SetMockAppBalanceRequest = { + amount: number } -export const GetUserOperationsRequestOptionalFields: [] = [] -export type GetUserOperationsRequestOptions = OptionsBaseMessage & { +export const SetMockAppBalanceRequestOptionalFields: [] = [] +export type SetMockAppBalanceRequestOptions = OptionsBaseMessage & { checkOptionalsAreSet?: [] - latestIncomingInvoice_CustomCheck?: (v: number) => boolean - latestOutgoingInvoice_CustomCheck?: (v: number) => boolean - latestIncomingTx_CustomCheck?: (v: number) => boolean - latestOutgoingTx_CustomCheck?: (v: number) => boolean - latestIncomingUserToUserPayment_CustomCheck?: (v: number) => boolean - latestOutgoingUserToUserPayment_CustomCheck?: (v: number) => boolean + amount_CustomCheck?: (v: number) => boolean } -export const GetUserOperationsRequestValidate = (o?: GetUserOperationsRequest, opts: GetUserOperationsRequestOptions = {}, path: string = 'GetUserOperationsRequest::root.'): Error | null => { +export const SetMockAppBalanceRequestValidate = (o?: SetMockAppBalanceRequest, opts: SetMockAppBalanceRequestOptions = {}, path: string = 'SetMockAppBalanceRequest::root.'): Error | null => { if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') - if (typeof o.latestIncomingInvoice !== 'number') return new Error(`${path}.latestIncomingInvoice: is not a number`) - if (opts.latestIncomingInvoice_CustomCheck && !opts.latestIncomingInvoice_CustomCheck(o.latestIncomingInvoice)) return new Error(`${path}.latestIncomingInvoice: custom check failed`) - - if (typeof o.latestOutgoingInvoice !== 'number') return new Error(`${path}.latestOutgoingInvoice: is not a number`) - if (opts.latestOutgoingInvoice_CustomCheck && !opts.latestOutgoingInvoice_CustomCheck(o.latestOutgoingInvoice)) return new Error(`${path}.latestOutgoingInvoice: custom check failed`) - - if (typeof o.latestIncomingTx !== 'number') return new Error(`${path}.latestIncomingTx: is not a number`) - if (opts.latestIncomingTx_CustomCheck && !opts.latestIncomingTx_CustomCheck(o.latestIncomingTx)) return new Error(`${path}.latestIncomingTx: custom check failed`) - - if (typeof o.latestOutgoingTx !== 'number') return new Error(`${path}.latestOutgoingTx: is not a number`) - if (opts.latestOutgoingTx_CustomCheck && !opts.latestOutgoingTx_CustomCheck(o.latestOutgoingTx)) return new Error(`${path}.latestOutgoingTx: custom check failed`) - - if (typeof o.latestIncomingUserToUserPayment !== 'number') return new Error(`${path}.latestIncomingUserToUserPayment: is not a number`) - if (opts.latestIncomingUserToUserPayment_CustomCheck && !opts.latestIncomingUserToUserPayment_CustomCheck(o.latestIncomingUserToUserPayment)) return new Error(`${path}.latestIncomingUserToUserPayment: custom check failed`) - - if (typeof o.latestOutgoingUserToUserPayment !== 'number') return new Error(`${path}.latestOutgoingUserToUserPayment: is not a number`) - if (opts.latestOutgoingUserToUserPayment_CustomCheck && !opts.latestOutgoingUserToUserPayment_CustomCheck(o.latestOutgoingUserToUserPayment)) return new Error(`${path}.latestOutgoingUserToUserPayment: custom check failed`) + if (typeof o.amount !== 'number') return new Error(`${path}.amount: is not a number`) + if (opts.amount_CustomCheck && !opts.amount_CustomCheck(o.amount)) return new Error(`${path}.amount: custom check failed`) + + return null +} + +export type OpenChannelRequest = { + destination: string + fundingAmount: number + pushAmount: number + closeAddress: string +} +export const OpenChannelRequestOptionalFields: [] = [] +export type OpenChannelRequestOptions = OptionsBaseMessage & { + checkOptionalsAreSet?: [] + destination_CustomCheck?: (v: string) => boolean + fundingAmount_CustomCheck?: (v: number) => boolean + pushAmount_CustomCheck?: (v: number) => boolean + closeAddress_CustomCheck?: (v: string) => boolean +} +export const OpenChannelRequestValidate = (o?: OpenChannelRequest, opts: OpenChannelRequestOptions = {}, path: string = 'OpenChannelRequest::root.'): Error | null => { + if (opts.checkOptionalsAreSet && opts.allOptionalsAreSet) return new Error(path + ': only one of checkOptionalsAreSet or allOptionalNonDefault can be set for each message') + if (typeof o !== 'object' || o === null) return new Error(path + ': object is not an instance of an object or is null') + + if (typeof o.destination !== 'string') return new Error(`${path}.destination: is not a string`) + if (opts.destination_CustomCheck && !opts.destination_CustomCheck(o.destination)) return new Error(`${path}.destination: custom check failed`) + + if (typeof o.fundingAmount !== 'number') return new Error(`${path}.fundingAmount: is not a number`) + if (opts.fundingAmount_CustomCheck && !opts.fundingAmount_CustomCheck(o.fundingAmount)) return new Error(`${path}.fundingAmount: custom check failed`) + + if (typeof o.pushAmount !== 'number') return new Error(`${path}.pushAmount: is not a number`) + if (opts.pushAmount_CustomCheck && !opts.pushAmount_CustomCheck(o.pushAmount)) return new Error(`${path}.pushAmount: custom check failed`) + + if (typeof o.closeAddress !== 'string') return new Error(`${path}.closeAddress: is not a string`) + if (opts.closeAddress_CustomCheck && !opts.closeAddress_CustomCheck(o.closeAddress)) return new Error(`${path}.closeAddress: custom check failed`) return null } diff --git a/proto/protoc-gen-pub b/proto/protoc-gen-pub index 8b282494c4d9632d0131a1a0a7fe56356c7cd83f..6cbea3d491593cbd02d353d4c38a06d21bc6bdae 100755 GIT binary patch delta 2945860 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