This commit is contained in:
boufni95 2024-07-13 20:07:54 +02:00
parent cd52198d61
commit 6fea71be40
12 changed files with 4395 additions and 4353 deletions

View file

@ -482,96 +482,20 @@ The nostr server will send back a message response, and inside the body there wi
## Messages ## Messages
### The content of requests and response from the methods ### The content of requests and response from the methods
### OpenChannel ### SetMockInvoiceAsPaidRequest
- __channel_id__: _string_
- __capacity__: _number_
- __active__: _boolean_
- __lifetime__: _number_
- __local_balance__: _number_
- __remote_balance__: _number_
### ClosedChannel
- __channel_id__: _string_
- __capacity__: _number_
- __closed_height__: _number_
### PayInvoiceResponse
- __preimage__: _string_
- __amount_paid__: _number_
- __operation_id__: _string_
- __service_fee__: _number_
- __network_fee__: _number_
### RelaysMigration
- __relays__: ARRAY of: _string_
### AppsMetrics
- __apps__: ARRAY of: _[AppMetrics](#AppMetrics)_
### LndNodeMetrics
- __channels_balance_events__: ARRAY of: _[ChannelBalanceEvent](#ChannelBalanceEvent)_
- __chain_balance_events__: ARRAY of: _[ChainBalanceEvent](#ChainBalanceEvent)_
- __offline_channels__: _number_
- __online_channels__: _number_
- __pending_channels__: _number_
- __closing_channels__: _number_
- __open_channels__: ARRAY of: _[OpenChannel](#OpenChannel)_
- __closed_channels__: ARRAY of: _[ClosedChannel](#ClosedChannel)_
- __channel_routing__: ARRAY of: _[ChannelRouting](#ChannelRouting)_
### PayInvoiceRequest
- __invoice__: _string_ - __invoice__: _string_
- __amount__: _number_ - __amount__: _number_
### LnurlLinkResponse ### AppUser
- __lnurl__: _string_
- __k1__: _string_
### AppsMetricsRequest
- __from_unix__: _number_ *this field is optional
- __to_unix__: _number_ *this field is optional
- __include_operations__: _boolean_ *this field is optional
### LiveUserOperation
- __operation__: _[UserOperation](#UserOperation)_
### EncryptionExchangeRequest
- __publicKey__: _string_
- __deviceId__: _string_
### LnurlPayInfoResponse
- __tag__: _string_
- __callback__: _string_
- __maxSendable__: _number_
- __minSendable__: _number_
- __metadata__: _string_
- __allowsNostr__: _boolean_
- __nostrPubkey__: _string_
### UsageMetrics
- __metrics__: ARRAY of: _[UsageMetric](#UsageMetric)_
### SetMockAppUserBalanceRequest
- __user_identifier__: _string_
- __amount__: _number_
### UserOperation
- __paidAtUnix__: _number_
- __type__: _[UserOperationType](#UserOperationType)_
- __inbound__: _boolean_
- __amount__: _number_
- __identifier__: _string_ - __identifier__: _string_
- __operationId__: _string_ - __info__: _[UserInfo](#UserInfo)_
- __service_fee__: _number_ - __max_withdrawable__: _number_
- __network_fee__: _number_
- __confirmed__: _boolean_
- __tx_hash__: _string_
- __internal__: _boolean_
### UserOperations ### SetMockAppBalanceRequest
- __fromIndex__: _number_ - __amount__: _number_
- __toIndex__: _number_
- __operations__: ARRAY of: _[UserOperation](#UserOperation)_ ### DecodeInvoiceResponse
- __amount__: _number_
### GetUserOperationsResponse ### GetUserOperationsResponse
- __latestOutgoingInvoiceOperations__: _[UserOperations](#UserOperations)_ - __latestOutgoingInvoiceOperations__: _[UserOperations](#UserOperations)_
@ -581,63 +505,82 @@ The nostr server will send back a message response, and inside the body there wi
- __latestOutgoingUserToUserPayemnts__: _[UserOperations](#UserOperations)_ - __latestOutgoingUserToUserPayemnts__: _[UserOperations](#UserOperations)_
- __latestIncomingUserToUserPayemnts__: _[UserOperations](#UserOperations)_ - __latestIncomingUserToUserPayemnts__: _[UserOperations](#UserOperations)_
### GetProductBuyLinkResponse ### Empty
- __link__: _string_
### UsersInfo ### ChainBalanceEvent
- __total__: _number_ - __block_height__: _number_
- __no_balance__: _number_ - __confirmed_balance__: _number_
- __negative_balance__: _number_ - __unconfirmed_balance__: _number_
- __always_been_inactive__: _number_ - __total_balance__: _number_
- __balance_avg__: _number_
- __balance_median__: _number_
### GetAppUserRequest ### RequestNPubLinkingTokenRequest
- __user_identifier__: _string_ - __user_identifier__: _string_
### DecodeInvoiceRequest ### AuthApp
- __invoice__: _string_ - __app__: _[Application](#Application)_
- __auth_token__: _string_
### MigrationUpdate ### OpenChannelRequest
- __closure__: _[ClosureMigration](#ClosureMigration)_ *this field is optional - __destination__: _string_
- __relays__: _[RelaysMigration](#RelaysMigration)_ *this field is optional - __fundingAmount__: _number_
- __pushAmount__: _number_
- __closeAddress__: _string_
### BanUserResponse ### AddAppInvoiceRequest
- __balance_sats__: _number_
- __banned_app_users__: ARRAY of: _[BannedAppUser](#BannedAppUser)_
### SendAppUserToAppPaymentRequest
- __from_user_identifier__: _string_
- __amount__: _number_
### ChannelBalanceEvent
- __block_height__: _number_
- __channel_id__: _string_
- __local_balance_sats__: _number_
- __remote_balance_sats__: _number_
### BanUserRequest
- __user_id__: _string_
### AuthAppRequest
- __name__: _string_
- __allow_user_creation__: _boolean_ *this field is optional
### AddAppUserInvoiceRequest
- __receiver_identifier__: _string_
- __payer_identifier__: _string_ - __payer_identifier__: _string_
- __http_callback_url__: _string_ - __http_callback_url__: _string_
- __invoice_req__: _[NewInvoiceRequest](#NewInvoiceRequest)_ - __invoice_req__: _[NewInvoiceRequest](#NewInvoiceRequest)_
### NewInvoiceRequest ### LnurlLinkResponse
- __amountSats__: _number_ - __lnurl__: _string_
- __memo__: _string_ - __k1__: _string_
### DecodeInvoiceResponse ### BannedAppUser
- __app_name__: _string_
- __app_id__: _string_
- __user_identifier__: _string_
- __nostr_pub__: _string_
### Application
- __name__: _string_
- __id__: _string_
- __balance__: _number_
- __npub__: _string_
### SetMockAppUserBalanceRequest
- __user_identifier__: _string_
- __amount__: _number_ - __amount__: _number_
### ClosureMigration ### PayAddressRequest
- __closes_at_unix__: _number_ - __address__: _string_
- __amoutSats__: _number_
- __satsPerVByte__: _number_
### UserOperations
- __fromIndex__: _number_
- __toIndex__: _number_
- __operations__: ARRAY of: _[UserOperation](#UserOperation)_
### UsageMetrics
- __metrics__: ARRAY of: _[UsageMetric](#UsageMetric)_
### AppMetrics
- __app__: _[Application](#Application)_
- __users__: _[UsersInfo](#UsersInfo)_
- __received__: _number_
- __spent__: _number_
- __available__: _number_
- __fees__: _number_
- __invoices__: _number_
- __total_fees__: _number_
- __operations__: ARRAY of: _[UserOperation](#UserOperation)_
### PayInvoiceRequest
- __invoice__: _string_
- __amount__: _number_
### RelaysMigration
- __relays__: ARRAY of: _string_
### RoutingEvent ### RoutingEvent
- __incoming_channel_id__: _number_ - __incoming_channel_id__: _number_
@ -653,66 +596,58 @@ The nostr server will send back a message response, and inside the body there wi
- __offchain__: _boolean_ - __offchain__: _boolean_
- __forward_fail_event__: _boolean_ - __forward_fail_event__: _boolean_
### BannedAppUser ### LndGetInfoResponse
- __app_name__: _string_ - __alias__: _string_
- __app_id__: _string_
- __user_identifier__: _string_
- __nostr_pub__: _string_
### AddAppInvoiceRequest ### DecodeInvoiceRequest
- __payer_identifier__: _string_ - __invoice__: _string_
- __http_callback_url__: _string_
- __invoice_req__: _[NewInvoiceRequest](#NewInvoiceRequest)_ ### UsersInfo
- __total__: _number_
- __no_balance__: _number_
- __negative_balance__: _number_
- __always_been_inactive__: _number_
- __balance_avg__: _number_
- __balance_median__: _number_
### NewInvoiceResponse ### NewInvoiceResponse
- __invoice__: _string_ - __invoice__: _string_
### OpenChannelRequest ### AddAppUserInvoiceRequest
- __destination__: _string_ - __receiver_identifier__: _string_
- __fundingAmount__: _number_ - __payer_identifier__: _string_
- __pushAmount__: _number_ - __http_callback_url__: _string_
- __closeAddress__: _string_ - __invoice_req__: _[NewInvoiceRequest](#NewInvoiceRequest)_
### AddProductRequest ### GetAppUserRequest
- __user_identifier__: _string_
### PayAddressResponse
- __txId__: _string_
- __operation_id__: _string_
- __service_fee__: _number_
- __network_fee__: _number_
### Product
- __id__: _string_
- __name__: _string_ - __name__: _string_
- __price_sats__: _number_ - __price_sats__: _number_
### AppsMetrics
- __apps__: ARRAY of: _[AppMetrics](#AppMetrics)_
### LndGetInfoRequest ### LndGetInfoRequest
- __nodeId__: _number_ - __nodeId__: _number_
### Application ### AddAppUserRequest
- __name__: _string_ - __identifier__: _string_
- __id__: _string_ - __fail_if_exists__: _boolean_
- __balance__: _number_ - __balance__: _number_
- __npub__: _string_
### PayAddressRequest ### SendAppUserToAppUserPaymentRequest
- __address__: _string_ - __from_user_identifier__: _string_
- __amoutSats__: _number_ - __to_user_identifier__: _string_
- __satsPerVByte__: _number_ - __amount__: _number_
### GetUserOperationsRequest
- __latestIncomingInvoice__: _number_
- __latestOutgoingInvoice__: _number_
- __latestIncomingTx__: _number_
- __latestOutgoingTx__: _number_
- __latestIncomingUserToUserPayment__: _number_
- __latestOutgoingUserToUserPayment__: _number_
- __max_size__: _number_
### RequestNPubLinkingTokenResponse
- __token__: _string_
### AppMetrics
- __app__: _[Application](#Application)_
- __users__: _[UsersInfo](#UsersInfo)_
- __received__: _number_
- __spent__: _number_
- __available__: _number_
- __fees__: _number_
- __invoices__: _number_
- __total_fees__: _number_
- __operations__: ARRAY of: _[UserOperation](#UserOperation)_
### UserInfo ### UserInfo
- __userId__: _string_ - __userId__: _string_
@ -723,76 +658,27 @@ The nostr server will send back a message response, and inside the body there wi
- __network_max_fee_bps__: _number_ - __network_max_fee_bps__: _number_
- __network_max_fee_fixed__: _number_ - __network_max_fee_fixed__: _number_
### Product ### ChannelBalanceEvent
- __id__: _string_ - __block_height__: _number_
- __name__: _string_
- __price_sats__: _number_
### ChannelRouting
- __channel_id__: _string_ - __channel_id__: _string_
- __send_errors__: _number_ - __local_balance_sats__: _number_
- __receive_errors__: _number_ - __remote_balance_sats__: _number_
- __forward_errors_as_input__: _number_
- __forward_errors_as_output__: _number_ ### OpenChannel
- __missed_forward_fee_as_input__: _number_ - __channel_id__: _string_
- __missed_forward_fee_as_output__: _number_ - __capacity__: _number_
- __forward_fee_as_input__: _number_ - __active__: _boolean_
- __forward_fee_as_output__: _number_ - __lifetime__: _number_
- __events_number__: _number_ - __local_balance__: _number_
- __remote_balance__: _number_
### GetAppUserLNURLInfoRequest ### GetAppUserLNURLInfoRequest
- __user_identifier__: _string_ - __user_identifier__: _string_
- __base_url_override__: _string_ - __base_url_override__: _string_
### LnurlWithdrawInfoResponse ### NewInvoiceRequest
- __tag__: _string_ - __amountSats__: _number_
- __callback__: _string_ - __memo__: _string_
- __k1__: _string_
- __defaultDescription__: _string_
- __minWithdrawable__: _number_
- __maxWithdrawable__: _number_
- __balanceCheck__: _string_
- __payLink__: _string_
### HandleLnurlPayResponse
- __pr__: _string_
- __routes__: ARRAY of: _[Empty](#Empty)_
### PayAppUserInvoiceRequest
- __user_identifier__: _string_
- __invoice__: _string_
- __amount__: _number_
### LndMetricsRequest
- __from_unix__: _number_ *this field is optional
- __to_unix__: _number_ *this field is optional
### AddAppUserRequest
- __identifier__: _string_
- __fail_if_exists__: _boolean_
- __balance__: _number_
### PayAddressResponse
- __txId__: _string_
- __operation_id__: _string_
- __service_fee__: _number_
- __network_fee__: _number_
### RequestNPubLinkingTokenRequest
- __user_identifier__: _string_
### Empty
### SetMockInvoiceAsPaidRequest
- __invoice__: _string_
- __amount__: _number_
### OpenChannelResponse
- __channelId__: _string_
### LinkNPubThroughTokenRequest
- __token__: _string_
- __nostr_pub__: _string_
### UsageMetric ### UsageMetric
- __processed_at_ms__: _number_ - __processed_at_ms__: _number_
@ -805,48 +691,164 @@ The nostr server will send back a message response, and inside the body there wi
- __nostr__: _boolean_ - __nostr__: _boolean_
- __batch_size__: _number_ - __batch_size__: _number_
### LndGetInfoResponse ### LndNodeMetrics
- __alias__: _string_ - __channels_balance_events__: ARRAY of: _[ChannelBalanceEvent](#ChannelBalanceEvent)_
- __chain_balance_events__: ARRAY of: _[ChainBalanceEvent](#ChainBalanceEvent)_
- __offline_channels__: _number_
- __online_channels__: _number_
- __pending_channels__: _number_
- __closing_channels__: _number_
- __open_channels__: ARRAY of: _[OpenChannel](#OpenChannel)_
- __closed_channels__: ARRAY of: _[ClosedChannel](#ClosedChannel)_
- __channel_routing__: ARRAY of: _[ChannelRouting](#ChannelRouting)_
### AuthApp ### MigrationUpdate
- __app__: _[Application](#Application)_ - __closure__: _[ClosureMigration](#ClosureMigration)_ *this field is optional
- __auth_token__: _string_ - __relays__: _[RelaysMigration](#RelaysMigration)_ *this field is optional
### SendAppUserToAppUserPaymentRequest ### RequestNPubLinkingTokenResponse
- __from_user_identifier__: _string_ - __token__: _string_
- __to_user_identifier__: _string_
### PayAppUserInvoiceRequest
- __user_identifier__: _string_
- __invoice__: _string_
- __amount__: _number_ - __amount__: _number_
### SetMockAppBalanceRequest
- __amount__: _number_
### NewAddressRequest
- __addressType__: _[AddressType](#AddressType)_
### NewAddressResponse ### NewAddressResponse
- __address__: _string_ - __address__: _string_
### HttpCreds ### HandleLnurlPayResponse
- __url__: _string_ - __pr__: _string_
- __token__: _string_ - __routes__: ARRAY of: _[Empty](#Empty)_
### LndMetrics ### UserOperation
- __nodes__: ARRAY of: _[LndNodeMetrics](#LndNodeMetrics)_ - __paidAtUnix__: _number_
- __type__: _[UserOperationType](#UserOperationType)_
- __inbound__: _boolean_
- __amount__: _number_
- __identifier__: _string_
- __operationId__: _string_
- __service_fee__: _number_
- __network_fee__: _number_
- __confirmed__: _boolean_
- __tx_hash__: _string_
- __internal__: _boolean_
### ClosureMigration
- __closes_at_unix__: _number_
### BanUserRequest
- __user_id__: _string_
### NewAddressRequest
- __addressType__: _[AddressType](#AddressType)_
### PayInvoiceResponse
- __preimage__: _string_
- __amount_paid__: _number_
- __operation_id__: _string_
- __service_fee__: _number_
- __network_fee__: _number_
- __latest_balance__: _number_
### OpenChannelResponse
- __channelId__: _string_
### GetProductBuyLinkResponse
- __link__: _string_
### LiveUserOperation
- __operation__: _[UserOperation](#UserOperation)_
- __latest_balance__: _number_
### ClosedChannel
- __channel_id__: _string_
- __capacity__: _number_
- __closed_height__: _number_
### AddAppRequest ### AddAppRequest
- __name__: _string_ - __name__: _string_
- __allow_user_creation__: _boolean_ - __allow_user_creation__: _boolean_
### AppUser ### BanUserResponse
- __identifier__: _string_ - __balance_sats__: _number_
- __info__: _[UserInfo](#UserInfo)_ - __banned_app_users__: ARRAY of: _[BannedAppUser](#BannedAppUser)_
- __max_withdrawable__: _number_
### ChainBalanceEvent ### SendAppUserToAppPaymentRequest
- __block_height__: _number_ - __from_user_identifier__: _string_
- __confirmed_balance__: _number_ - __amount__: _number_
- __unconfirmed_balance__: _number_
- __total_balance__: _number_ ### LndMetricsRequest
- __from_unix__: _number_ *this field is optional
- __to_unix__: _number_ *this field is optional
### LndMetrics
- __nodes__: ARRAY of: _[LndNodeMetrics](#LndNodeMetrics)_
### HttpCreds
- __url__: _string_
- __token__: _string_
### AppsMetricsRequest
- __from_unix__: _number_ *this field is optional
- __to_unix__: _number_ *this field is optional
- __include_operations__: _boolean_ *this field is optional
### AuthAppRequest
- __name__: _string_
- __allow_user_creation__: _boolean_ *this field is optional
### LnurlWithdrawInfoResponse
- __tag__: _string_
- __callback__: _string_
- __k1__: _string_
- __defaultDescription__: _string_
- __minWithdrawable__: _number_
- __maxWithdrawable__: _number_
- __balanceCheck__: _string_
- __payLink__: _string_
### GetUserOperationsRequest
- __latestIncomingInvoice__: _number_
- __latestOutgoingInvoice__: _number_
- __latestIncomingTx__: _number_
- __latestOutgoingTx__: _number_
- __latestIncomingUserToUserPayment__: _number_
- __latestOutgoingUserToUserPayment__: _number_
- __max_size__: _number_
### LnurlPayInfoResponse
- __tag__: _string_
- __callback__: _string_
- __maxSendable__: _number_
- __minSendable__: _number_
- __metadata__: _string_
- __allowsNostr__: _boolean_
- __nostrPubkey__: _string_
### AddProductRequest
- __name__: _string_
- __price_sats__: _number_
### LinkNPubThroughTokenRequest
- __token__: _string_
- __nostr_pub__: _string_
### EncryptionExchangeRequest
- __publicKey__: _string_
- __deviceId__: _string_
### ChannelRouting
- __channel_id__: _string_
- __send_errors__: _number_
- __receive_errors__: _number_
- __forward_errors_as_input__: _number_
- __forward_errors_as_output__: _number_
- __missed_forward_fee_as_input__: _number_
- __missed_forward_fee_as_output__: _number_
- __forward_fee_as_input__: _number_
- __forward_fee_as_output__: _number_
- __events_number__: _number_
## Enums ## Enums
### The enumerators used in the messages ### The enumerators used in the messages

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -302,6 +302,7 @@ message PayInvoiceResponse{
string operation_id = 3; string operation_id = 3;
int64 service_fee = 4; int64 service_fee = 4;
int64 network_fee = 5; int64 network_fee = 5;
int64 latest_balance = 6;
} }
message OpenChannelRequest{ message OpenChannelRequest{
@ -416,6 +417,7 @@ message GetProductBuyLinkResponse {
message LiveUserOperation { message LiveUserOperation {
UserOperation operation = 1; UserOperation operation = 1;
int64 latest_balance = 2;
} }
message MigrationUpdate { message MigrationUpdate {
optional ClosureMigration closure = 1; optional ClosureMigration closure = 1;

View file

@ -48,7 +48,8 @@ export default class {
this.settings = settings this.settings = settings
this.storage = storage this.storage = storage
this.utils = utils this.utils = utils
this.liquidityProvider = new LiquidityProvider(settings.liquiditySettings.liquidityProviderPub, this.utils, this.invoicePaidCb) const updateProviderBalance = (b: number) => this.storage.liquidityStorage.UpdateTrackedProviderBalance('lnPub', settings.liquiditySettings.liquidityProviderPub, b)
this.liquidityProvider = new LiquidityProvider(settings.liquiditySettings.liquidityProviderPub, this.utils, this.invoicePaidCb, updateProviderBalance)
this.rugPullTracker = new RugPullTracker(this.storage, this.liquidityProvider) this.rugPullTracker = new RugPullTracker(this.storage, this.liquidityProvider)
this.lnd = new LND(settings.lndSettings, this.liquidityProvider, this.utils, this.addressPaidCb, this.invoicePaidCb, this.newBlockCb, this.htlcCb) this.lnd = new LND(settings.lndSettings, this.liquidityProvider, this.utils, this.addressPaidCb, this.invoicePaidCb, this.newBlockCb, this.htlcCb)
this.liquidityManager = new LiquidityManager(this.settings.liquiditySettings, this.storage, this.utils, this.liquidityProvider, this.lnd, this.rugPullTracker) this.liquidityManager = new LiquidityManager(this.settings.liquiditySettings, this.storage, this.utils, this.liquidityProvider, this.lnd, this.rugPullTracker)
@ -226,7 +227,7 @@ export default class {
getLogger({ appName: app.name })("cannot notify user, not a nostr user") getLogger({ appName: app.name })("cannot notify user, not a nostr user")
return return
} }
const message: Types.LiveUserOperation & { requestId: string, status: 'OK' } = { operation: op, requestId: "GetLiveUserOperations", status: 'OK' } const message: Types.LiveUserOperation & { requestId: string, status: 'OK' } = { operation: op, latest_balance: user.user.balance_sats, requestId: "GetLiveUserOperations", status: 'OK' }
this.nostrSend({ type: 'app', appId: app.app_id }, { type: 'content', content: JSON.stringify(message), pub: user.nostr_public_key }) this.nostrSend({ type: 'app', appId: app.app_id }, { type: 'content', content: JSON.stringify(message), pub: user.nostr_public_key })
} }

View file

@ -28,8 +28,9 @@ export class LiquidityProvider {
queue: ((state: 'ready') => void)[] = [] queue: ((state: 'ready') => void)[] = []
utils: Utils utils: Utils
pendingPayments: Record<string, number> = {} pendingPayments: Record<string, number> = {}
updateProviderBalance: (balance: number) => void
// make the sub process accept client // make the sub process accept client
constructor(pubDestination: string, utils: Utils, invoicePaidCb: InvoicePaidCb) { constructor(pubDestination: string, utils: Utils, invoicePaidCb: InvoicePaidCb, updateProviderBalance: (balance: number) => void) {
this.utils = utils this.utils = utils
if (!pubDestination) { if (!pubDestination) {
this.log("No pub provider to liquidity provider, will not be initialized") this.log("No pub provider to liquidity provider, will not be initialized")
@ -38,6 +39,7 @@ export class LiquidityProvider {
this.log("connecting to liquidity provider:", pubDestination) this.log("connecting to liquidity provider:", pubDestination)
this.pubDestination = pubDestination this.pubDestination = pubDestination
this.invoicePaidCb = invoicePaidCb this.invoicePaidCb = invoicePaidCb
this.updateProviderBalance = updateProviderBalance
this.client = newNostrClient({ this.client = newNostrClient({
pubDestination: this.pubDestination, pubDestination: this.pubDestination,
retrieveNostrUserAuth: async () => this.myPub, retrieveNostrUserAuth: async () => this.myPub,
@ -93,6 +95,7 @@ export class LiquidityProvider {
} }
//this.log("got user operation", res.operation) //this.log("got user operation", res.operation)
if (res.operation.type === Types.UserOperationType.INCOMING_INVOICE) { if (res.operation.type === Types.UserOperationType.INCOMING_INVOICE) {
this.updateProviderBalance(res.latest_balance)
this.invoicePaidCb(res.operation.identifier, res.operation.amount, 'provider') this.invoicePaidCb(res.operation.identifier, res.operation.amount, 'provider')
} }
}) })
@ -191,6 +194,7 @@ export class LiquidityProvider {
throw new Error(res.reason) throw new Error(res.reason)
} }
delete this.pendingPayments[invoice] delete this.pendingPayments[invoice]
this.updateProviderBalance(userInfo.balance)
this.utils.stateBundler.AddTxPoint('paidAnInvoice', decodedAmount, { used: 'provider', from, timeDiscount: true }) this.utils.stateBundler.AddTxPoint('paidAnInvoice', decodedAmount, { used: 'provider', from, timeDiscount: true })
return res return res
} catch (err) { } catch (err) {

View file

@ -193,7 +193,8 @@ export default class {
amount_paid: paymentInfo.amtPaid, amount_paid: paymentInfo.amtPaid,
operation_id: `${Types.UserOperationType.OUTGOING_INVOICE}-${paymentInfo.serialId}`, operation_id: `${Types.UserOperationType.OUTGOING_INVOICE}-${paymentInfo.serialId}`,
network_fee: paymentInfo.networkFee, network_fee: paymentInfo.networkFee,
service_fee: serviceFee service_fee: serviceFee,
latest_balance: user.balance_sats
} }
} }

View file

@ -24,20 +24,24 @@ export class RugPullTracker {
if (!pubDst) { if (!pubDst) {
return { balance: 0 } return { balance: 0 }
} }
const fetchedBalance = await this.liquidProvider.GetLatestBalance()
const pendingBalance = await this.liquidProvider.GetPendingBalance()
const providerTracker = await this.storage.liquidityStorage.GetTrackedProvider('lnPub', pubDst) const providerTracker = await this.storage.liquidityStorage.GetTrackedProvider('lnPub', pubDst)
const balance = this.liquidProvider.IsReady() ? fetchedBalance : providerTracker?.latest_balance || 0 const ready = this.liquidProvider.IsReady()
const trackedBalance = balance + pendingBalance if (ready) {
if (!providerTracker) { const balance = await this.liquidProvider.GetLatestBalance()
this.log("starting to track provider", this.liquidProvider.GetProviderDestination()) const pendingBalance = await this.liquidProvider.GetPendingBalance()
await this.storage.liquidityStorage.CreateTrackedProvider('lnPub', pubDst, trackedBalance) const trackedBalance = balance + pendingBalance
return { balance: trackedBalance } if (!providerTracker) {
this.log("starting to track provider", this.liquidProvider.GetProviderDestination())
await this.storage.liquidityStorage.CreateTrackedProvider('lnPub', pubDst, trackedBalance)
return { balance: trackedBalance }
}
return this.checkForDisruption(pubDst, trackedBalance, providerTracker)
} else {
return { balance: providerTracker?.latest_balance || 0 }
} }
return this.updateDisruption(pubDst, trackedBalance, providerTracker)
} }
updateDisruption = async (pubDst: string, trackedBalance: number, providerTracker: TrackedProvider) => { checkForDisruption = async (pubDst: string, trackedBalance: number, providerTracker: TrackedProvider) => {
const diff = trackedBalance - providerTracker.latest_balance const diff = trackedBalance - providerTracker.latest_balance
if (diff < 0) { if (diff < 0) {
this.rugPulled = true this.rugPulled = true
@ -48,7 +52,7 @@ export class RugPullTracker {
getLogger({ component: 'rugPull' })("ongoing rugpull from: ", pubDst, "provider balance changed from", providerTracker.latest_balance, "to", trackedBalance, "losing", diff) getLogger({ component: 'rugPull' })("ongoing rugpull from: ", pubDst, "provider balance changed from", providerTracker.latest_balance, "to", trackedBalance, "losing", diff)
} }
} else { } else {
this.rugPulled = true this.rugPulled = false
if (providerTracker.latest_distruption_at_unix !== 0) { if (providerTracker.latest_distruption_at_unix !== 0) {
await this.storage.liquidityStorage.UpdateTrackedProviderDisruption('lnPub', pubDst, 0) await this.storage.liquidityStorage.UpdateTrackedProviderDisruption('lnPub', pubDst, 0)
getLogger({ component: 'rugPull' })("rugpull from: ", pubDst, "cleared after: ", (Date.now() / 1000) - providerTracker.latest_distruption_at_unix, "seconds") getLogger({ component: 'rugPull' })("rugpull from: ", pubDst, "cleared after: ", (Date.now() / 1000) - providerTracker.latest_distruption_at_unix, "seconds")

View file

@ -100,7 +100,7 @@ export class Watchdog {
} }
checkBalanceUpdate = async (deltaLnd: number, deltaUsers: number) => { checkBalanceUpdate = async (deltaLnd: number, deltaUsers: number) => {
this.utils.stateBundler.AddBalancePoint('deltaLnd', deltaLnd) this.utils.stateBundler.AddBalancePoint('deltaExternal', deltaLnd)
this.utils.stateBundler.AddBalancePoint('deltaUsers', deltaUsers) this.utils.stateBundler.AddBalancePoint('deltaUsers', deltaUsers)
const result = this.checkDeltas(deltaLnd, deltaUsers) const result = this.checkDeltas(deltaLnd, deltaUsers)

View file

@ -1,7 +1,7 @@
import { getLogger } from "../helpers/logger.js" import { getLogger } from "../helpers/logger.js"
const transactionStatePointTypes = ['addedInvoice', 'invoiceWasPaid', 'paidAnInvoice', 'addedAddress', 'addressWasPaid', 'paidAnAddress', 'user2user'] as const const transactionStatePointTypes = ['addedInvoice', 'invoiceWasPaid', 'paidAnInvoice', 'addedAddress', 'addressWasPaid', 'paidAnAddress', 'user2user'] as const
const balanceStatePointTypes = ['providerBalance', 'providerMaxWithdrawable', 'walletBalance', 'channelBalance', 'usersBalance', 'feesPaidForLiquidity', 'totalLndBalance', 'accumulatedHtlcFees', 'deltaUsers', 'deltaLnd'] as const const balanceStatePointTypes = ['providerBalance', 'providerMaxWithdrawable', 'walletBalance', 'channelBalance', 'usersBalance', 'feesPaidForLiquidity', 'totalLndBalance', 'accumulatedHtlcFees', 'deltaUsers', 'deltaExternal'] as const
const maxStatePointTypes = ['maxProviderRespTime'] as const const maxStatePointTypes = ['maxProviderRespTime'] as const
export type TransactionStatePointType = typeof transactionStatePointTypes[number] export type TransactionStatePointType = typeof transactionStatePointTypes[number]
export type BalanceStatePointType = typeof balanceStatePointTypes[number] export type BalanceStatePointType = typeof balanceStatePointTypes[number]

View file

@ -10,8 +10,8 @@ export const setupNetwork = async () => {
await core.InitAddress() await core.InitAddress()
await core.Mine(1) await core.Mine(1)
const setupUtils = new Utils(settings) const setupUtils = new Utils(settings)
const alice = new LND(settings.lndSettings, new LiquidityProvider("", setupUtils, async () => { }), setupUtils, async () => { }, async () => { }, () => { }, () => { }) const alice = new LND(settings.lndSettings, new LiquidityProvider("", setupUtils, async () => { }, () => { }), setupUtils, async () => { }, async () => { }, () => { }, () => { })
const bob = new LND({ ...settings.lndSettings, mainNode: settings.lndSettings.otherNode }, new LiquidityProvider("", setupUtils, async () => { }), setupUtils, async () => { }, async () => { }, () => { }, () => { }) const bob = new LND({ ...settings.lndSettings, mainNode: settings.lndSettings.otherNode }, new LiquidityProvider("", setupUtils, async () => { }, () => { }), setupUtils, async () => { }, async () => { }, () => { }, () => { })
await tryUntil<void>(async i => { await tryUntil<void>(async i => {
const peers = await alice.ListPeers() const peers = await alice.ListPeers()
if (peers.peers.length > 0) { if (peers.peers.length > 0) {

View file

@ -47,15 +47,15 @@ export const SetupTest = async (d: Describe): Promise<TestBase> => {
const user2 = { userId: u2.info.userId, appUserIdentifier: u2.identifier, appId: app.appId } const user2 = { userId: u2.info.userId, appUserIdentifier: u2.identifier, appId: app.appId }
const extermnalUtils = new Utils(settings) const extermnalUtils = new Utils(settings)
const externalAccessToMainLnd = new LND(settings.lndSettings, new LiquidityProvider("", extermnalUtils, async () => { }), extermnalUtils, async () => { }, async () => { }, () => { }, () => { }) const externalAccessToMainLnd = new LND(settings.lndSettings, new LiquidityProvider("", extermnalUtils, async () => { }, () => { }), extermnalUtils, async () => { }, async () => { }, () => { }, () => { })
await externalAccessToMainLnd.Warmup() await externalAccessToMainLnd.Warmup()
const otherLndSetting = { ...settings.lndSettings, mainNode: settings.lndSettings.otherNode } const otherLndSetting = { ...settings.lndSettings, mainNode: settings.lndSettings.otherNode }
const externalAccessToOtherLnd = new LND(otherLndSetting, new LiquidityProvider("", extermnalUtils, async () => { }), extermnalUtils, async () => { }, async () => { }, () => { }, () => { }) const externalAccessToOtherLnd = new LND(otherLndSetting, new LiquidityProvider("", extermnalUtils, async () => { }, () => { }), extermnalUtils, async () => { }, async () => { }, () => { }, () => { })
await externalAccessToOtherLnd.Warmup() await externalAccessToOtherLnd.Warmup()
const thirdLndSetting = { ...settings.lndSettings, mainNode: settings.lndSettings.thirdNode } const thirdLndSetting = { ...settings.lndSettings, mainNode: settings.lndSettings.thirdNode }
const externalAccessToThirdLnd = new LND(thirdLndSetting, new LiquidityProvider("", extermnalUtils, async () => { }), extermnalUtils, async () => { }, async () => { }, () => { }, () => { }) const externalAccessToThirdLnd = new LND(thirdLndSetting, new LiquidityProvider("", extermnalUtils, async () => { }, () => { }), extermnalUtils, async () => { }, async () => { }, () => { }, () => { })
await externalAccessToThirdLnd.Warmup() await externalAccessToThirdLnd.Warmup()