You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
RTL/frontend/src_app_lnd_lnd_module_ts.0...

1 line
1.0 MiB

{"version":3,"file":"src_app_lnd_lnd_module_ts.0fea6d7c18422440.js","mappings":"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BACMjN,KAAK+N,SAAShN,MAAQf,KAAK+N,SAAShN,KAAKwD,OAAS,GACpDvE,KAAKkB,cAAcgM,aAAalN,KAAK+N,SAAShN,KAAM,gBAExD,CAEA8qB,oBAAoBZ,GAClB,OAAQA,EAAsB,KAAO1gB,WAAa,GACpD,CAEAtF,cACEjF,KAAK+B,OAAOmD,QAASC,IACnBA,EAAYX,KAAU,MACtBW,EAAYC,UAAQ,EAExB,CAAC3E,kDAlZUwpB,IAAyBvpB,iJAAzBupB,GAAyBtpB,6EAEzByM,KAAO,QACPC,KAAY,4GAPZ,CACT,CAAEC,QAASC,KAAkBC,YAAUC,MAAkB,gBAC1DC,y3HDtCH9N,iBAA6C,WAEzCA,iBACAA,iBAAuH,qBAAvHA,CAAuH,kBAElDA,2DAAyB,gDAA8B,GAAI0F,eAAa,GACvI1F,+BACFA,UAEFA,4BAA4B,aACyBA,yDAAuB,0BAAU0F,eAAa,EAA9C1F,CAAuB,0BAAkC0F,eAAa,GAAzH1F,cAINA,iBACEA,sCACAA,wBACEA,aACEA,yBACAA,yBAIFA,QACAA,aACEA,yBACAA,yBAIFA,QACAA,aACEA,yBACAA,yBAKFA,QACAA,aACEA,yBACAA,yBAKFA,QACAA,aACEA,yBACAA,yBAKFA,QACAA,aACEA,yBACAA,yBAKFA,QACAA,aACEA,yBACAA,yBACFA,QACAA,aACEA,yBACAA,yBACFA,QACAA,aACEA,yBACAA,yBACFA,QACAA,aACEA,yBACAA,yBACFA,QACAA,aACEA,yBACAA,yBACFA,QACAA,aACEA,yBACAA,yBACFA,QACAA,aACEA,yBACAA,yBACFA,QACAA,aACEA,yBACAA,yBACFA,QACAA,aACEA,yBACAA,yBACFA,QACAA,aACEA,yBACAA,yBACFA,QACAA,aACEA,yBACAA,yBACFA,QACAA,aACEA,yBACAA,yBACFA,QACAA,aACEA,yBACAA,yBACFA,QACAA,aACEA,yBACAA,yBACFA,QACAA,aACEA,yBACAA,yBACFA,QACAA,aACEA,yBACAA,yBACFA,QACAA,aACEA,yBACAA,yBAMFA,QACAA,aACEA,yBASAA,0BAaFA,QACAA,aACEA,yBAMFA,QA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jtB,cACEjF,KAAK+B,OAAOmD,QAASC,IACnBA,EAAYX,KAAU,MACtBW,EAAYC,UAAQ,EAExB,CAAC3E,kDAxRU8uB,IAA4B7uB,yEAA5B6uB,GAA4B5uB,+EAE5ByM,KAAO,inFD3BpBxN,iBAAoC,YACTA,2BAA0EA,QACnGA,2BACEA,qCACAA,iCAAoE,+BAApEA,CAAoE,qBAE/CA,SAA4CA,UAE/DA,kBACEA,sCACAA,sBACEA,YACEA,wBACAA,yBAKFA,QACAA,aACEA,wBACAA,yBAKFA,QACAA,aACEA,wBACAA,yBAKFA,QACAA,aACEA,wBACAA,yBACFA,QACAA,aACEA,wBACAA,yBACFA,QACAA,aACEA,yBACAA,yBACFA,QACAA,aACEA,yBACAA,yBACFA,QACAA,aACEA,yBACAA,yBACFA,QACAA,aACEA,yBACAA,yBACFA,QACAA,aACEA,yBACAA,yBACFA,QACAA,aACEA,yBACAA,yBACFA,QACAA,aACEA,yBACAA,yBACFA,QACAA,aACEA,yBAGAA,yBASFA,QACAA,aACEA,yBAKFA,QACAA,yBACAA,yBACAA,yBACFA,YAGJA,sCACAA,kCAAoE,gCAApEA,CAAoE,sBAE/CA,UAA6DA,UAEhFA,kBAA+E,iBAE3EA,aACEA,wBACAA,yBAKFA,QACAA,YACEA,wBACAA,yBAKFA,QACAA,aACEA,wBACAA,yBAKFA,QACAA,aACEA,wBACAA,yBAKFA,QACAA,aACEA,wBACAA,yBACFA,QACAA,aACEA,wBACAA,yBACFA,QACAA,aACEA,yBACAA,yBACFA,QACAA,aACEA,yBACAA,yBACFA,QACAA,aACEA,yBACAA,yBACFA,QACAA,aACEA,yBACAA,yBACFA,QACAA,aACEA,yBACAA,yBACFA,QACAA,aACEA,0BACAA,0BACFA,QACAA,cACEA,0BACAA,0BACFA,QACAA,cACEA,0BAGAA,0BAGFA,QACAA,cACEA,0BAKFA,QACAA,0BACAA,0BACAA,0BACFA,YAGJA,uCACAA,mCAAoE,iCAApEA,CAAoE,uBAE/CA,WAAkDA,UAErEA,mBAA+E,kBAE3EA,cACEA,yBACAA,0BAKFA,QACAA,a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","names":["i0","LNDRootComponent","constructor","router","this","events","subscribe","event","NavigationStart","loading","NavigationEnd","NavigationCancel","NavigationError","static","core","selectors","routeAnimation","CreateInvoiceComponent","dialogRef","data","store","decimalPipe","commonService","actions","faExclamationTriangle","PAGE_SIZE","TimeUnitEnum","TIME_UNITS","Subject","ngOnInit","pageSize","select","lndNodeSettings","pipe","takeUntil","unSubs","nodeSettings","selNode","lndNodeInformation","nodeInfo","information","filter","action","type","LNDActions","payload","invoiceError","message","status","APICallStatusEnum","close","onAddInvoice","form","expiryInSecs","expiry","selTimeUnit","convertTime","dispatch","saveNewInvoice","uiMessage","UI_MESSAGES","memo","value","invoiceValue","private","is_amp","isAmp","openModal","resetData","invoiceValueHint","onInvoiceValueChange","fiatConversion","convertCurrency","CurrencyUnitEnum","currencyUnits","length","next","symbol","transform","OTHER","CURRENCY_UNIT_FORMATS","unit","error","err","onTimeUnitChange","ngOnDestroy","forEach","completeSub","complete","MAT_DIALOG_DATA","ctx","LightningInvoicesComponent","logger","datePipe","camelCaseWithReplace","faEye","faEyeSlash","faHistory","faArrowsTurnToDots","faArrowsTurnRight","faBurst","faMoneyBill1","LND_PAGE_DEFS","tableId","recordsPerPage","sortBy","sortOrder","SortOrderEnum","MatTableDataSource","PAGE_SIZE_OPTIONS","ScreenSizeEnum","screenSize","getScreenSize","lndPageSettings","settings","errorMessage","apiCallStatus","tableSetting","pageSettings","find","page","pageId","PAGE_ID","tables","table","LND_DEFAULT_PAGE_SETTINGS","displayedColumns","JSON","parse","stringify","columnSelectionSM","columnSelection","unshift","push","colWidth","getContainerSize","width","info","invoices","invoicesSelector","totalInvoices","listInvoices","total_invoices","firstOffset","first_index_offset","lastOffset","last_index_offset","invoicesData","sort","paginator","loadInvoicesTable","resLookup","updateInvoicesData","ngAfterViewInit","newlyAddedInvoiceMemo","newlyAddedInvoiceValue","onInvoiceClick","selInvoice","openAlert","invoice","newlyAdded","component","InvoiceInformationComponent","onRefreshInvoice","r_hash","invoiceLookup","openSnackBar","paymentHash","Buffer","from","trim","toString","replace","newInvoice","map","applyFilter","selFilter","toLowerCase","getLabel","column","returnColumn","nodePageDefs","allowedColumns","col","label","titleCase","setFilterPredicate","filterPredicate","rowData","fltr","rowToFilter","selFilterBy","creation_date","Date","settle_date","is_keysend","indexOf","includes","sortingDataAccessor","sortHeaderId","isNaN","toLocaleLowerCase","id","start","disableClear","onPageChange","reverse","index_offset","pageIndex","previousPageIndex","fetchInvoices","num_max_invoices","reversed","onDownloadCSV","downloadFile","openCreateInvoiceModal","MatSort","MatPaginator","provide","MatPaginatorIntl","useValue","getPaginatorLabel","decls","LightningSendPaymentsComponent","dataService","UntypedFormControl","FEE_LIMIT_TYPES","channels","channelsSelector","activeChannels","channel","active","filteredMinAmtActvChannels","selectedChannelCtrl","enable","disable","paymentDecoded","num_satoshis","paymentError","x","y","c1","c2","remote_alias","chan_id","valueChanges","filterChannels","local_balance","displayFn","onSelectedChannelChanged","foundChannels","alias","setValue","setErrors","notfound","onSendPayment","paymentRequest","zeroAmtInvoice","paymentAmount","timestamp","sendPayment","onPaymentRequestEntry","selFeeLimitType","feeLimitTypes","feeLimit","num_msat","paymentReq","outgoingChannel","feeLimitType","fromDialog","onAmountChange","paymentDecodedHint","control","decodePayment","take","decodedPayment","onAdvancedPanelToggle","description","decodeError","isClosed","isReset","advancedTitle","name","LightningPaymentsComponent","rtlEffects","peers","peersSelector","htlcColumns","payments","paymentsSelector","paymentJSONArr","listPayments","totalPayments","loadPaymentsTable","slice","newlyAddedPayment","payment_hash","reorderedPaymentDecoded","key","title","destination","DataTypeEnum","cltv_expiry","openConfirmation","AlertTypeEnum","alertTitle","noBtnText","yesBtnText","closeConfirm","confirmRes","titleMsg","titleMessage","flgShowInput","getInputs","placeholder","inputType","inputValue","openSendPaymentModal","starting_index","is_group","index","payment","htlcs","resetForm","getHopDetails","currentHop","self","Promise","resolve","reject","peerFound","peer","pub_key","padEnd","amt_to_forward","getAliasesFromPubkeys","res","node","substring","onHTLCClick","selHtlc","selPayment","payment_request","setTimeout","showHTLCView","route","hops","all","hop","then","detailsAll","prepareData","scrollable","hopsDetails","modifiedData","preimage","attempt_time_ns","resolve_time_ns","total_amt","total_fees","total_time_lock","splice","onPaymentClick","nodePubkeys","reduce","pubkeys","nodes","showPaymentView","pathAliases","reorderedPayment","payment_preimage","value_msat","fee_msat","openPaymentAlert","shouldScroll","failure_reason","payms","paymentsDataCopy","paymentRequests","paymentReqs","decodePayments","decodedPayments","increament","idx","flattenedPayments","acc","curr","concat","NodeInfoComponent","ngOnChanges","chains","chain","network","BalancesInfoComponent","onchain","lightning","total","FeeInfoComponent","fees","month_fee_sum","totalFees","week_fee_sum","day_fee_sum","m","Math","ceil","log","LN10","maxFeeValue","Object","assign","ChannelStatusInfoComponent","ChannelCapacityInfoComponent","faBalanceScale","faDumbbell","goToChannels","navigateByUrl","ChannelLiquidityInfoComponent","loopService","showLoop","swapServerUrl","onLoopOut","getLoopOutTermsAndQuotes","targetConf","response","minHeight","minQuote","maxQuote","direction","LoopTypeEnum","LoopModalComponent","HomeComponent","faSmile","faFrown","faAngleDoubleDown","faAngleDoubleUp","faChartPie","faBolt","faServer","faNetworkWired","UserPersonaEnum","localBalance","remoteBalance","balancedness","operatorCards","goToOptions","links","icon","cols","rows","merchantCards","nodeInfoAndNodeSettingsAndAPIStatus","infoSettingsStatusSelector","errorMessages","apiCallStatusNodeInfo","feesSelector","apiCallStatusFees","blockchainBalance","bcBalanceSelector","apiCallStatusBlockchainBalance","balances","total_balance","pendingChannels","pendingChannelsSelector","apiCallStatusPendingChannels","channelsStatus","pending","num_channels","pendingChannelsSummary","open","capacity","limbo_balance","closing","force_closing","waiting_close","total_limbo_balance","apiCallStatusChannels","local","lightningBalance","remote","channelBalances","abs","toFixed","channelsSummary","inactiveChannels","inactive","totalInboundLiquidity","totalOutboundLiquidity","allChannels","allChannelsCapacity","sortDescByKey","allInboundChannels","remote_balance","allOutboundChannels","flgChildInfoUpdated","onNavigateTo","link","state","onsortChannelsBy","sortField","a","b","ConnectionsComponent","faUsers","dataValue","activeLink","findIndex","url","lastIndexOf","e","ResolveEnd","urlAfterRedirects","activePeers","confirmed_balance","unconfirmed_balance","onSelectedTabChange","OpenChannelComponent","TRANS_TYPES","totalBalance","balance","isPrivate","unannouncedChannels","channelConnectionError","sortedPeers","p1","p2","filteredPeers","selectedPeer","startWith","filterPeers","newlySelectedPeer","onSelectedPeerChanged","selectedPubkey","selPeer","onClose","fundingAmount","spendUnconfirmed","selTransType","transTypeValue","onOpenChannel","saveNewChannel","selectedPeerPubkey","transType","ConnectPeerComponent","lndEffects","formBuilder","peerFormGroup","group","hiddenAddress","Validators","peerAddress","channelFormGroup","disabled","hiddenAmount","statusFormGroup","controls","setValidators","flgEditable","newlyAddedPeer","stepper","peerConnectionError","onConnectPeer","deviderIndex","search","pubkey","host","connectPeerWithParams","fetchGraphNode","setGraphNode","graphNode","addresses","addr","saveNewPeer","perm","stepSelectionChanged","selectedIndex","peerFormLabel","channelFormLabel","previouslySelectedIndex","PeersComponent","availableBalance","peersData","loadPeersTable","onPeerClick","reorderedPeer","address","inbound","ping_time","sat_sent","sat_recv","bytes_sent","bytes_recv","showQRName","showQRField","peerToAddChannel","peerToAddChannelMessage","onPeerDetach","peerToDetach","msg","detachPeer","sync_type","ChannelsTablesComponent","numOpenChannels","numActiveHTLCs","totalHTLCs","pending_htlcs","numPendingChannels","total_channels","closedChannels","closedChannelsSelector","numClosedChannels","ChannelInformationComponent","snackBar","faReceipt","showCopy","onShowAdvanced","showAdvanced","onCopyChanID","ChannelRebalanceInfographicsComponent","EventEmitter","onSwipe","stepNumber","animationDirection","stepNumberChange","emit","sliderAnimation","ChannelRebalanceComponent","faInfoCircle","selChannel","FEE_LIMIT_TYPE","i","inputFormGroup","rebalanceAmount","selRebalancePeer","feeFormGroup","hiddenFeeLimit","queryRoute","flgPaymentSent","paymentStatus","flgInvoiceGenerated","get","amount","filteredActiveChannels","of","filterActiveChannels","onSelectFee","reset","required","inputFormLabel","feeFormLabel","remote_pubkey","routes","total_fees_msat","onRebalance","flgReusingInvoice","unsettledInvoice","findUnsettledInvoice","payReq","allowSelfPayment","lastHopPubkey","showInfo","flgShowInfo","onStepChanged","onRestart","opacityAnimation","CloseChannelComponent","channelToClose","filteredChannel","flgPendingHtlcs","onCloseChannel","blocks","closeChannelParams","channelPoint","channel_point","forcibly","satPerByte","closeChannel","ChannelOpenTableComponent","getCurrentNavigation","extras","version","versionsArr","split","numPeers","channelsData","calculateUptime","loadChannelsTable","onViewRemotePolicy","channelLookup","channelID","identity_pubkey","setLookup","fee_base_msat","fee_rate_milli_msat","time_lock_delta","reorderedChannelPolicy","digitsInfo","onCircularRebalance","channelsToRebalanceMessage","onChannelUpdate","channelToUpdate","confirmationMsg","step","min","hintFunction","percentHintFunction","base_fee","fee_rate","updateChannel","baseFeeMsat","feeRate","timeLockDelta","chanPoint","myChanPolicy","min_htlc_msat","max_htlc_msat","node1_pub","node1_policy","node2_pub","node2_policy","hasAdvanced","min_htlc","advancedField","updateChanPayload","minHtlcMsat","maxHtlcMsat","onChannelClose","fetchChannels","onChannelClick","total_satoshis_sent","total_satoshis_received","commit_fee","mychannels","maxDivider","minutesDivider","minDivider","max_uptime","uptime","hoursDivider","timeUnit","daysDivider","yearsDivider","uptime_str","floor","round","lifetime_str","lifetime","BumpFeeComponent","faCopy","outIdx","outputIdx","transTypes","bumpFeeChannel","pendingChannel","channelPointArr","txid_str","output_index","onBumpFee","outputIndex","pendingChannelOutputIndex","bumpFee","bumpFeeError","onCopyID","ChannelPendingTableComponent","openTableSetting","displayedOpenColumns","forceClosingTableSetting","displayedForceClosingColumns","closingTableSetting","displayedClosingColumns","waitingCloseTableSetting","displayedWaitClosingColumns","pending_open_channels","loadOpenChannelsTable","pending_force_closing_channels","loadForceClosingChannelsTable","pending_closing_channels","loadClosingChannelsTable","waiting_close_channels","loadWaitClosingChannelsTable","onOpenClick","fcChannelObj1","fcChannelObj2","preOrderedChannel","reorderedChannel","remote_node_pub","confirmation_height","fee_per_kw","commit_weight","onForceClosingClick","closing_txid","maturity_height","blocks_til_maturity","recovered_balance","onClosingClick","onWaitClosingClick","fcChannelObj3","commitments","local_txid","pendingOpenChannelsLength","pendingOpenChannels","pendingForceClosingChannelsLength","pendingForceClosingChannels","pendingClosingChannelsLength","pendingClosingChannels","pendingWaitClosingChannelsLength","pendingWaitClosingChannels","ChannelClosedTableComponent","CHANNEL_CLOSURE_TYPE","closedChannelsData","loadClosedChannelsTable","close_type","channelClosureType","onClosedChannelClick","settled_balance","time_locked_balance","close_height","closing_tx_hash","ChannelActiveHTLCsTableComponent","channelsJSONArr","loadHTLCsTable","reorderedHTLC","incoming","expiration_height","hash_lock","htlc","sortByKey","flattenHTLCs","UnlockWalletComponent","walletPassword","onUnlockWallet","unlockWallet","pwd","window","btoa","matchedPasswords","initWalletPassword","initWalletConfirmPassword","unmatchedPasswords","cipherSeedLength","cipherArr","invalidCipher","InitializeWalletComponent","passwordFormGroup","validators","cipherFormGroup","existingCipher","cipherSeed","passphraseFormGroup","enterPassphrase","passphrase","unsubs","checked","insecureLND","location","protocol","initWalletRes","initWalletResponse","genSeedResponse","genSeedRes","initWallet","cipher","onInitWallet","invalid","genSeed","onGoToHome","updateSelectedNodeOptions","fetchInfoLND","loadPage","unsub","MatStepper","STEPPER_GLOBAL_OPTIONS","displayDefaultIndicatorType","WalletComponent","faWallet","TransactionsComponent","faExchangeAlt","tooltip","linkFound","withLatestFrom","userPersona","GraphComponent","faSearch","QueryRoutesComponent","faRoute","setQueryRoutes","qrHops","flgLoading","onQueryRoutes","destinationPubkey","getQueryRoutes","destPubkey","onHopClick","selHop","reorderedHop","hop_sequence","chan_capacity","pubkey_alias","ChannelLookupComponent","lookupResult","node1_match","node2_match","NodeLookupComponent","NodeFeaturesLND","onCopyNodeURI","LookupsComponent","selectedFieldId","hasOwnProperty","lookupValue","flgSetLookupValue","onLookup","lookupKey","peerLookup","onSelectChange","clearLookupValue","RoutingComponent","faMapSigns","now","today","getFullYear","getMonth","getDate","lastMonthDay","onEventsFetch","setForwardingHistory","forwarding_events","endDate","startDate","getForwardingHistory","end_time","getTime","start_time","ForwardingHistoryComponent","forwardingHistory","fhSelector","eventsData","forwardingHistoryData","loadForwardingEventsTable","changes","currentValue","firstChange","onForwardingEventClick","selFEvent","reorderedFHEvent","amt_in","amt_out","alias_in","chan_id_in","alias_out","chan_id_out","forwardingHistoryEvents","forwardingEvents","RoutingPeersComponent","routingPeersData","sortIn","paginatorIn","sortOut","paginatorOut","loadRoutingPeersTable","onRoutingPeerClick","selRPeer","reorderedRoutingPeer","total_amount","applyFilterIncoming","routingPeersIncoming","filterIn","applyFilterOutgoing","routingPeersOutgoing","filterOut","rowDataIn","rowToFilterIn","selFilterByIn","rowDataOut","rowToFilterOut","selFilterByOut","results","groupRoutingPeers","incomingResults","outgoingResults","result","outgoing","ReportsComponent","faChartBar","RoutingReportComponent","SCROLL_RANGES","ReportBy","getMonthDays","showYAxisLabel","fetchEvents","containerSizeUpdated","CONTAINER_SIZE","screenPaddingX","view","height","end","startDateInSeconds","endDateInSeconds","routingReportData","selReportBy","reportBy","EVENTS","prepareEventsReport","prepareFeeReport","total_fee_msat","onChartMouseUp","srcElement","tagName","classList","eventFilterValue","onChartBarSelected","reportPeriod","padStart","MONTHS","feeReport","extra","totalEvents","monthNumber","dateNumber","secondsInADay","eventsReport","onSelectionChange","selectedValues","selMonth","selDate","selYear","selScrollRange","days","onSelReportByChange","yAxisLabel","fadeIn","TransactionsReportComponent","paymentsSelectedPeriod","invoicesSelectedPeriod","amountPaidSelectedPeriod","amountReceivedSelectedPeriod","date","series","amount_paid","amount_received","num_invoices","num_payments","clnPageSettings","allLightningTransactions","allLTSelector","getAllLightningTransactions","listPaymentsAll","listInvoicesAll","transactionsReportData","filterTransactionsForSelectedPeriod","transactionsNonZeroReportData","prepareTableData","transactionFilterValue","transactionsReport","transactionsReportSummary","filteredPayments","filteredInvoices","settled","amt_paid_msat","OnChainLabelModalComponent","utxo","onLabelUTXO","labelError","labelUTXO","outpoint","txid_bytes","fetchTransactions","fetchUTXOs","OnChainUTXOsComponent","faMoneyBillWave","WALLET_ADDRESS_TYPE","isDustUTXO","utxos","utxosSelector","dustUtxos","amount_sat","dustAmount","loadUTXOsTable","listUTXOs","address_type","addressType","confirmations","onUTXOClick","selUTXO","reorderedUTXOs","pk_script","UTXOs","onLeaseUTXO","utxoDetails","informationMessage","leaseUTXO","OnChainTransactionHistoryComponent","transactions","transactionsSelector","loadTransactionsTable","onTransactionClick","selTransaction","reorderedTransactions","block_hash","tx_hash","time_stamp","block_height","num_confirmations","dest_addresses","listTransactions","UTXOTablesComponent","numUtxos","numDustUtxos","DUST_AMOUNT","numTransactions","onSelectedIndexChanged","selectedTableIndexChange","OnChainComponent","activatedRoute","selectedTable","onSelectedTableIndexChanged","navigate","relativeTo","OnChainReceiveComponent","ADDRESS_TYPES","flgVersionCompatible","isVersionCompatible","addressTypes","at","addressId","onGenerateAddress","getNewAddress","selectedAddressType","setNewAddress","newAddress","addressTp","OnChainGeneratedAddressComponent","OnChainSendModalComponent","CURRENCY_UNITS","sweepAll","hiddenPassword","password","sendFundFormGroup","transactionAddress","transactionBlocks","transactionFees","confirmFormGroup","rootAppConfig","appConfig","rootSelectedNode","amountUnits","sendFundError","onAuthenticate","flgValidated","isAuthorized","sha256","isAuthorizedRes","authRes","onSendFunds","invalidValues","postTransaction","transactionAmount","sendAll","selAmountUnit","currencyUnitFormats","setChannelTransaction","amountError","passwordFormLabel","sendFundFormLabel","onAmountUnitChange","prevSelectedUnit","currSelectedUnit","OnChainSendComponent","routeData","openSendFundsModal","NetworkInfoComponent","faProjectDiagram","networkCards","nodeCards","networkInfo","networkInfoSelector","apiCallStatusNetwork","BackupComponent","faDownload","ChannelRestoreTableComponent","restoreChannelsList","setRestoreChannelList","resRCList","allRestoreExists","all_restore_exists","files","loadRestoreTable","onRestoreChannels","restoreChannels","ChannelBackupTableComponent","faArchive","channelsSeletor","loadBackupTable","RTLActions","selectedChannel","onBackupChannels","backupChannels","showMessage","onVerifyChannels","verifyChannel","onDownloadBackup","fetchFile","SignVerifyMessageComponent","faUserCheck","SignComponent","onSign","signMessage","signedMessage","signature","onMessageChange","onCopyField","VerifyComponent","valid","onVerify","verifyMessage","verifyRes","showVerifyStatus","verifiedMessage","verifiedSignature","onChange","NonRoutingPeersComponent","loadNonRoutingPeersTable","onManagePeer","selNonRoutingChannel","nonRoutingPeers","filteredNonRoutingChannels","actvChnl","evnt","PaymentLookupComponent","paths","InvoiceLookupComponent","qrWidth","getDecimalFormat","amt_msat","LookupTransactionsComponent","extractErrorMessage","paymentLookup","LndRoutes","path","children","pathMatch","redirectTo","canActivate","LNDUnlockedGuard","AuthGuard","NotFoundComponent","LNDRouting","RouterModule","LNDModule","bootstrap","imports","CommonModule","SharedModule"],"sourceRoot":"webpack:///","sources":["./src/app/lnd/lnd-root.component.html","./src/app/lnd/lnd-root.component.ts","./src/app/lnd/transactions/create-invoice-modal/create-invoice.component.html","./src/app/lnd/transactions/create-invoice-modal/create-invoice.component.ts","./src/app/lnd/transactions/invoices/lightning-invoices.component.html","./src/app/lnd/transactions/invoices/lightning-invoices.component.ts","./src/app/lnd/transactions/send-payment-modal/send-payment.component.html","./src/app/lnd/transactions/send-payment-modal/send-payment.component.ts","./src/app/lnd/transactions/payments/lightning-payments.component.html","./src/app/lnd/transactions/payments/lightning-payments.component.ts","./src/app/lnd/home/node-info/node-info.component.html","./src/app/lnd/home/node-info/node-info.component.ts","./src/app/lnd/home/balances-info/balances-info.component.html","./src/app/lnd/home/balances-info/balances-info.component.ts","./src/app/lnd/home/fee-info/fee-info.component.html","./src/app/lnd/home/fee-info/fee-info.component.ts","./src/app/lnd/home/channel-status-info/channel-status-info.component.html","./src/app/lnd/home/channel-status-info/channel-status-info.component.ts","./src/app/lnd/home/channel-capacity-info/channel-capacity-info.component.html","./src/app/lnd/home/channel-capacity-info/channel-capacity-info.component.ts","./src/app/lnd/home/channel-liquidity-info/channel-liquidity-info.component.html","./src/app/lnd/home/channel-liquidity-info/channel-liquidity-info.component.ts","./src/app/lnd/home/home.component.html","./src/app/lnd/home/home.component.ts","./src/app/lnd/peers-channels/connections.component.html","./src/app/lnd/peers-channels/connections.component.ts","./src/app/lnd/peers-channels/channels/open-channel-modal/open-channel.component.html","./src/app/lnd/peers-channels/channels/open-channel-modal/open-channel.component.ts","./src/app/lnd/peers-channels/connect-peer/connect-peer.component.html","./src/app/lnd/peers-channels/connect-peer/connect-peer.component.ts","./src/app/lnd/peers-channels/peers/peers.component.html","./src/app/lnd/peers-channels/peers/peers.component.ts","./src/app/lnd/peers-channels/channels/channels-tables/channels-tables.component.html","./src/app/lnd/peers-channels/channels/channels-tables/channels-tables.component.ts","./src/app/lnd/peers-channels/channels/channel-information-modal/channel-information.component.html","./src/app/lnd/peers-channels/channels/channel-information-modal/channel-information.component.ts","./src/app/lnd/peers-channels/channels/channel-rebalance-infographics/channel-rebalance-infographics.component.html","./src/app/lnd/peers-channels/channels/channel-rebalance-infographics/channel-rebalance-infographics.component.ts","./src/app/lnd/peers-channels/channels/channel-rebalance-modal/channel-rebalance.component.html","./src/app/lnd/peers-channels/channels/channel-rebalance-modal/channel-rebalance.component.ts","./src/app/lnd/peers-channels/channels/close-channel-modal/close-channel.component.html","./src/app/lnd/peers-channels/channels/close-channel-modal/close-channel.component.ts","./src/app/lnd/peers-channels/channels/channels-tables/channel-open-table/channel-open-table.component.html","./src/app/lnd/peers-channels/channels/channels-tables/channel-open-table/channel-open-table.component.ts","./src/app/lnd/peers-channels/channels/bump-fee-modal/bump-fee.component.html","./src/app/lnd/peers-channels/channels/bump-fee-modal/bump-fee.component.ts","./src/app/lnd/peers-channels/channels/channels-tables/channel-pending-table/channel-pending-table.component.html","./src/app/lnd/peers-channels/channels/channels-tables/channel-pending-table/channel-pending-table.component.ts","./src/app/lnd/peers-channels/channels/channels-tables/channel-closed-table/channel-closed-table.component.html","./src/app/lnd/peers-channels/channels/channels-tables/channel-closed-table/channel-closed-table.component.ts","./src/app/lnd/peers-channels/channels/channels-tables/channel-active-htlcs-table/channel-active-htlcs-table.component.html","./src/app/lnd/peers-channels/channels/channels-tables/channel-active-htlcs-table/channel-active-htlcs-table.component.ts","./src/app/lnd/wallet/unlock/unlock.component.html","./src/app/lnd/wallet/unlock/unlock.component.ts","./src/app/lnd/wallet/initialize/initialize.component.html","./src/app/lnd/wallet/initialize/initialize.component.ts","./src/app/lnd/wallet/wallet.component.ts","./src/app/lnd/wallet/wallet.component.html","./src/app/lnd/transactions/transactions.component.html","./src/app/lnd/transactions/transactions.component.ts","./src/app/lnd/graph/graph.component.html","./src/app/lnd/graph/graph.component.ts","./src/app/lnd/graph/query-routes/query-routes.component.html","./src/app/lnd/graph/query-routes/query-routes.component.ts","./src/app/lnd/graph/lookups/channel-lookup/channel-lookup.component.html","./src/app/lnd/graph/lookups/channel-lookup/channel-lookup.component.ts","./src/app/lnd/graph/lookups/node-lookup/node-lookup.component.html","./src/app/lnd/graph/lookups/node-lookup/node-lookup.component.ts","./src/app/lnd/graph/lookups/lookups.component.html","./src/app/lnd/graph/lookups/lookups.component.ts","./src/app/lnd/routing/routing.component.html","./src/app/lnd/routing/routing.component.ts","./src/app/lnd/routing/forwarding-history/forwarding-history.component.html","./src/app/lnd/routing/forwarding-history/forwarding-history.component.ts","./src/app/lnd/routing/routing-peers/routing-peers.component.html","./src/app/lnd/routing/routing-peers/routing-peers.component.ts","./src/app/lnd/reports/reports.component.html","./src/app/lnd/reports/reports.component.ts","./src/app/lnd/reports/routing/routing-report.component.html","./src/app/lnd/reports/routing/routing-report.component.ts","./src/app/lnd/reports/transactions/transactions-report.component.html","./src/app/lnd/reports/transactions/transactions-report.component.ts","./src/app/lnd/on-chain/on-chain-label-modal/on-chain-label-modal.component.html","./src/app/lnd/on-chain/on-chain-label-modal/on-chain-label-modal.component.ts","./src/app/lnd/on-chain/utxo-tables/utxos/utxos.component.html","./src/app/lnd/on-chain/utxo-tables/utxos/utxos.component.ts","./src/app/lnd/on-chain/utxo-tables/on-chain-transaction-history/on-chain-transaction-history.component.html","./src/app/lnd/on-chain/utxo-tables/on-chain-transaction-history/on-chain-transaction-history.component.ts","./src/app/lnd/on-chain/utxo-tables/utxo-tables.component.html","./src/app/lnd/on-chain/utxo-tables/utxo-tables.component.ts","./src/app/lnd/on-chain/on-chain.component.html","./src/app/lnd/on-chain/on-chain.component.ts","./src/app/lnd/on-chain/on-chain-receive/on-chain-receive.component.html","./src/app/lnd/on-chain/on-chain-receive/on-chain-receive.component.ts","./src/app/lnd/on-chain/on-chain-send-modal/on-chain-send-modal.component.html","./src/app/lnd/on-chain/on-chain-send-modal/on-chain-send-modal.component.ts","./src/app/lnd/on-chain/on-chain-send/on-chain-send.component.ts","./src/app/lnd/on-chain/on-chain-send/on-chain-send.component.html","./src/app/lnd/network-info/network-info.component.html","./src/app/lnd/network-info/network-info.component.ts","./src/app/lnd/backup/backup.component.html","./src/app/lnd/backup/backup.component.ts","./src/app/lnd/backup/channel-restore-table/channel-restore-table.component.html","./src/app/lnd/backup/channel-restore-table/channel-restore-table.component.ts","./src/app/lnd/backup/channel-backup-table/channel-backup-table.component.html","./src/app/lnd/backup/channel-backup-table/channel-backup-table.component.ts","./src/app/lnd/sign-verify-message/sign-verify-message.component.html","./src/app/lnd/sign-verify-message/sign-verify-message.component.ts","./src/app/lnd/sign-verify-message/sign/sign.component.html","./src/app/lnd/sign-verify-message/sign/sign.component.ts","./src/app/lnd/sign-verify-message/verify/verify.component.html","./src/app/lnd/sign-verify-message/verify/verify.component.ts","./src/app/lnd/routing/non-routing-peers/non-routing-peers.component.html","./src/app/lnd/routing/non-routing-peers/non-routing-peers.component.ts","./src/app/lnd/transactions/lookup-transactions/payment-lookup/payment-lookup.component.ts","./src/app/lnd/transactions/lookup-transactions/payment-lookup/payment-lookup.component.html","./src/app/lnd/transactions/lookup-transactions/invoice-lookup/invoice-lookup.component.html","./src/app/lnd/transactions/lookup-transactions/invoice-lookup/invoice-lookup.component.ts","./src/app/lnd/transactions/lookup-transactions/lookup-transactions.component.html","./src/app/lnd/transactions/lookup-transactions/lookup-transactions.component.ts","./src/app/lnd/lnd.routing.ts","./src/app/lnd/lnd.module.ts"],"sourcesContent":["<div class=\"inner-sidenav-content\" fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"start stretch\">\n <mat-progress-bar *ngIf=\"loading\" color=\"primary\" mode=\"indeterminate\"></mat-progress-bar>\n <router-outlet #outlet=\"outlet\"></router-outlet>\n</div>\n","import { Component } from '@angular/core';\nimport { Event, NavigationCancel, NavigationEnd, NavigationError, NavigationStart, Router } from '@angular/router';\nimport { routeAnimation } from '../shared/animation/route-animation';\n\n@Component({\n selector: 'rtl-lnd-root',\n templateUrl: './lnd-root.component.html',\n styleUrls: ['./lnd-root.component.scss'],\n animations: [routeAnimation]\n})\nexport class LNDRootComponent {\n\n loading = false;\n\n constructor(private router: Router) {\n this.router.events.subscribe((event: Event) => {\n switch (true) {\n case event instanceof NavigationStart: {\n this.loading = true;\n break;\n }\n case event instanceof NavigationEnd:\n case event instanceof NavigationCancel:\n case event instanceof NavigationError: {\n this.loading = false;\n break;\n }\n default: {\n break;\n }\n }\n });\n }\n\n}\n","<div fxLayout=\"row\">\n <div fxFlex=\"100\">\n <mat-card-header fxLayout=\"row\" fxLayoutAlign=\"space-between center\" class=\"modal-info-header\">\n <div fxFlex=\"95\" fxLayoutAlign=\"start start\">\n <span class=\"page-title\">Create Invoice</span>\n </div>\n <button tabindex=\"8\" fxFlex=\"5\" fxLayoutAlign=\"center\" class=\"btn-close-x p-0\" default mat-button [mat-dialog-close]=\"false\">X</button>\n </mat-card-header>\n <mat-card-content class=\"padding-gap-x-large\">\n <form #addInvoiceForm=\"ngForm\" fxLayout=\"row wrap\" fxLayoutAlign=\"space-between start\" fxFlex=\"100\">\n <mat-form-field fxFlex=\"100\" fxLayoutAlign=\"end start\">\n <input matInput autoFocus placeholder=\"Memo\" tabindex=\"1\" name=\"memo\" [(ngModel)]=\"memo\">\n </mat-form-field>\n <mat-form-field fxFlex=\"50\" fxLayoutAlign=\"start end\">\n <input matInput placeholder=\"Amount\" type=\"number\" tabindex=\"2\" name=\"invoiceValue\" [step]=\"100\" [min]=\"1\" [(ngModel)]=\"invoiceValue\" (keyup)=\"onInvoiceValueChange()\">\n <span matSuffix> Sats </span>\n <mat-hint>{{invoiceValueHint}}</mat-hint> \n </mat-form-field>\n <mat-form-field fxFlex=\"24\" fxLayoutAlign=\"start end\">\n <input matInput placeholder=\"Expiry\" type=\"number\" tabindex=\"3\" name=\"expiry\" [step]=\"selTimeUnit === timeUnitEnum.SECS ? 300 : selTimeUnit === timeUnitEnum.MINS ? 10 : selTimeUnit === timeUnitEnum.HOURS ? 2 : 1\" [min]=\"1\" [(ngModel)]=\"expiry\">\n <span matSuffix>{{selTimeUnit | titlecase}} </span>\n </mat-form-field>\n <mat-form-field fxFlex=\"24\" fxLayoutAlign=\"start end\">\n <mat-select tabindex=\"4\" name=\"timeUnit\" [value]=\"selTimeUnit\" (selectionChange)=\"onTimeUnitChange($event)\">\n <mat-option *ngFor=\"let timeUnit of timeUnits\" [value]=\"timeUnit\">{{timeUnit | titlecase}}</mat-option>\n </mat-select>\n </mat-form-field>\n <div fxLayout=\"row\" fxFlex=\"100\" class=\"mt-1\" fxLayoutAlign=\"start center\">\n <div fxFlex=\"49\">\n <mat-slide-toggle tabindex=\"4\" color=\"primary\" name=\"private\" [(ngModel)]=\"private\">Private Routing Hints</mat-slide-toggle>\n <mat-icon matTooltip=\"Include routing hints for private channels\" matTooltipPosition=\"above\" class=\"info-icon\">info_outline</mat-icon>\n </div>\n <div fxFlex=\"49\">\n <mat-slide-toggle tabindex=\"5\" color=\"primary\" name=\"amp\" [(ngModel)]=\"isAmp\">AMP Invoice</mat-slide-toggle>\n <mat-icon matTooltip=\"Atomic multipath payment invoice\" matTooltipPosition=\"above\" class=\"info-icon\">info_outline</mat-icon>\n </div>\n </div>\n <div *ngIf=\"invoiceError !== ''\" fxFlex=\"100\" class=\"alert alert-danger mt-1\">\n <fa-icon class=\"mr-1 alert-icon\" [icon]=\"faExclamationTriangle\"></fa-icon>\n <span *ngIf=\"invoiceError !== ''\">{{invoiceError}}</span>\n </div>\n <div fxLayout=\"row\" fxFlex=\"100\" class=\"mt-1\" fxLayoutAlign=\"end center\">\n <button class=\"mr-1\" mat-button color=\"primary\" tabindex=\"6\" type=\"reset\" (click)=\"resetData()\">Clear Field</button>\n <button mat-button color=\"primary\" tabindex=\"7\" (click)=\"onAddInvoice(addInvoiceForm)\">Create Invoice</button>\n </div>\n </form>\n </mat-card-content>\n </div> \n</div>\n","import { Component, OnInit, OnDestroy, Inject } from '@angular/core';\nimport { DecimalPipe } from '@angular/common';\nimport { Subject } from 'rxjs';\nimport { filter, takeUntil } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { Actions } from '@ngrx/effects';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';\n\nimport { InvoiceInformation } from '../../../shared/models/alertData';\nimport { LNDActions, TimeUnitEnum, CurrencyUnitEnum, TIME_UNITS, CURRENCY_UNIT_FORMATS, PAGE_SIZE, APICallStatusEnum, UI_MESSAGES } from '../../../shared/services/consts-enums-functions';\nimport { SelNodeChild } from '../../../shared/models/RTLconfig';\nimport { GetInfo } from '../../../shared/models/lndModels';\nimport { CommonService } from '../../../shared/services/common.service';\n\nimport { RTLState } from '../../../store/rtl.state';\nimport { saveNewInvoice } from '../../store/lnd.actions';\nimport { lndNodeInformation, lndNodeSettings } from '../../store/lnd.selector';\n\n@Component({\n selector: 'rtl-create-invoices',\n templateUrl: './create-invoice.component.html',\n styleUrls: ['./create-invoice.component.scss']\n})\nexport class CreateInvoiceComponent implements OnInit, OnDestroy {\n\n public faExclamationTriangle = faExclamationTriangle;\n public selNode: SelNodeChild | null = {};\n public memo = '';\n public expiry: number | null;\n public isAmp = false;\n public invoiceValue: number | null;\n public invoiceValueHint = '';\n public invoicePaymentReq = '';\n public information: GetInfo = {};\n public private = false;\n public expiryStep = 100;\n public pageSize = PAGE_SIZE;\n public timeUnitEnum = TimeUnitEnum;\n public timeUnits = TIME_UNITS;\n public selTimeUnit = TimeUnitEnum.SECS;\n public invoiceError = '';\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject(), new Subject()];\n\n constructor(public dialogRef: MatDialogRef<CreateInvoiceComponent>, @Inject(MAT_DIALOG_DATA) public data: InvoiceInformation, private store: Store<RTLState>, private decimalPipe: DecimalPipe, private commonService: CommonService, private actions: Actions) { }\n\n ngOnInit() {\n this.pageSize = this.data.pageSize;\n this.store.select(lndNodeSettings).pipe(takeUntil(this.unSubs[0])).subscribe((nodeSettings: SelNodeChild | null) => { this.selNode = nodeSettings; });\n this.store.select(lndNodeInformation).pipe(takeUntil(this.unSubs[1])).subscribe((nodeInfo: GetInfo) => { this.information = nodeInfo; });\n this.actions.pipe(takeUntil(this.unSubs[2]),\n filter((action) => action.type === LNDActions.UPDATE_API_CALL_STATUS_LND)).\n subscribe((action: any) => {\n if (action.type === LNDActions.UPDATE_API_CALL_STATUS_LND && action.payload.action === 'SaveNewInvoice') {\n this.invoiceError = action.payload.message;\n if (action.payload.status === APICallStatusEnum.ERROR) {\n this.invoiceError = action.payload.message;\n }\n if (action.payload.status === APICallStatusEnum.COMPLETED) {\n this.dialogRef.close();\n }\n }\n });\n }\n\n onAddInvoice(form: any) {\n this.invoiceError = '';\n let expiryInSecs = 0;\n if (this.expiry) {\n if (this.selTimeUnit !== TimeUnitEnum.SECS) {\n expiryInSecs = this.commonService.convertTime(this.expiry, this.selTimeUnit, TimeUnitEnum.SECS);\n } else {\n expiryInSecs = this.expiry;\n }\n } else {\n expiryInSecs = 3600;\n }\n this.store.dispatch(saveNewInvoice({\n payload: {\n uiMessage: UI_MESSAGES.ADD_INVOICE, memo: this.memo, value: this.invoiceValue!, private: this.private, expiry: expiryInSecs, is_amp: this.isAmp, pageSize: this.pageSize, openModal: true\n }\n }));\n }\n\n resetData() {\n this.memo = '';\n this.invoiceValue = null;\n this.private = false;\n this.isAmp = false;\n this.expiry = null;\n this.invoiceValueHint = '';\n this.selTimeUnit = TimeUnitEnum.SECS;\n this.invoiceError = '';\n }\n\n onInvoiceValueChange() {\n if (this.selNode && this.selNode.fiatConversion && this.invoiceValue && this.invoiceValue > 99) {\n this.invoiceValueHint = '';\n this.commonService.convertCurrency(this.invoiceValue, CurrencyUnitEnum.SATS, CurrencyUnitEnum.OTHER, (this.selNode.currencyUnits && this.selNode.currencyUnits.length > 2 ? this.selNode.currencyUnits[2] : ''), this.selNode.fiatConversion).\n pipe(takeUntil(this.unSubs[3])).\n subscribe({\n next: (data) => {\n this.invoiceValueHint = '= ' + data.symbol + this.decimalPipe.transform(data.OTHER, CURRENCY_UNIT_FORMATS.OTHER) + ' ' + data.unit;\n }, error: (err) => {\n this.invoiceValueHint = 'Conversion Error: ' + err;\n }\n });\n }\n }\n\n onTimeUnitChange(event: any) {\n if (this.expiry && this.selTimeUnit !== event.value) {\n this.expiry = this.commonService.convertTime(this.expiry, this.selTimeUnit, event.value);\n }\n this.selTimeUnit = event.value;\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"start stretch\" class=\"padding-gap\">\n <form *ngIf=\"calledFrom === 'home'\" #addInvoiceForm=\"ngForm\" fxLayout=\"row wrap\" fxLayoutAlign=\"stretch start\" fxFlex=\"100\">\n <mat-form-field fxFlex=\"100\" fxLayoutAlign=\"end start\">\n <input matInput placeholder=\"Memo\" tabindex=\"1\" name=\"memo\" [(ngModel)]=\"memo\">\n </mat-form-field>\n <mat-form-field fxFlex=\"100\" fxLayoutAlign=\"start end\">\n <input matInput placeholder=\"Amount\" type=\"number\" tabindex=\"2\" name=\"invValue\" [step]=\"100\" [min]=\"1\" [(ngModel)]=\"invoiceValue\" (keyup)=\"onInvoiceValueChange()\">\n <span matSuffix> Sats </span>\n <mat-hint>{{invoiceValueHint}}</mat-hint> \n </mat-form-field>\n <div fxLayout=\"row\" class=\"mt-1\">\n <button class=\"mr-1\" mat-stroked-button color=\"primary\" tabindex=\"3\" type=\"reset\" (click)=\"resetData()\">Clear Field</button>\n <button mat-flat-button color=\"primary\" tabindex=\"4\" (click)=\"onAddInvoice(addInvoiceForm)\">Create Invoice</button>\n </div>\n </form>\n <div *ngIf=\"calledFrom === 'transactions'\" fxLayout=\"row\">\n <button mat-flat-button color=\"primary\" tabindex=\"5\" (click)=\"openCreateInvoiceModal()\">Create Invoice</button>\n </div>\n <div *ngIf=\"calledFrom === 'transactions'\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\">\n <div fxLayout=\"column\" fxLayoutAlign=\"start stretch\" fxLayout.gt-sm=\"row wrap\" class=\"page-sub-title-container mt-1\">\n <div fxFlex=\"70\" fxLayoutAlign=\"start start\" fxLayoutAlign.gt-sm=\"start center\">\n <fa-icon class=\"page-title-img mr-1\" [icon]=\"faHistory\"></fa-icon>\n <span class=\"page-title\">Invoices History</span>\n </div>\n <div fxFlex.gt-xs=\"30\" fxLayoutAlign.gt-xs=\"space-between center\" fxLayout=\"row\" fxLayoutAlign=\"space-between stretch\">\n <mat-form-field fxFlex=\"49\">\n <mat-select placeholder=\"Filter By\" tabindex=\"1\" name=\"filterBy\" [(ngModel)]=\"selFilterBy\" (selectionChange)=\"selFilter=''; applyFilter()\">\n <mat-option *ngFor=\"let column of ['all'].concat(displayedColumns.slice(0, -1))\" [value]=\"column\">{{getLabel(column)}}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field fxFlex=\"49\">\n <input matInput name=\"filter\" placeholder=\"Filter\" [(ngModel)]=\"selFilter\" (input)=\"applyFilter()\" (keyup)=\"applyFilter()\">\n </mat-form-field>\n </div>\n </div>\n <div fxLayout=\"column\" fxLayoutAlign=\"start end\" fxFlex=\"100\" class=\"table-container\" [perfectScrollbar]>\n <mat-progress-bar *ngIf=\"apiCallStatus.status === apiCallStatusEnum.INITIATED\" mode=\"indeterminate\"></mat-progress-bar>\n <table #table mat-table fxFlex=\"100\" matSort [dataSource]=\"invoices\" [ngClass]=\"{'error-border': errorMessage !== ''}\">\n <ng-container matColumnDef=\"state\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\" matTooltip=\"State\"></th>\n <td *matCellDef=\"let invoice\" mat-cell>\n <span *ngIf=\"invoice?.state === 'OPEN'\" class=\"dot grey\" matTooltip=\"Open\" matTooltipPosition=\"right\" [ngClass]=\"{'mr-0': screenSize === screenSizeEnum.XS}\"></span>\n <span *ngIf=\"invoice?.state === 'SETTLED'\" class=\"dot green\" matTooltip=\"Settled\" matTooltipPosition=\"right\" [ngClass]=\"{'mr-0': screenSize === screenSizeEnum.XS}\"></span>\n <span *ngIf=\"invoice?.state === 'ACCEPTED'\" class=\"dot yellow\" matTooltip=\"Accepted\" matTooltipPosition=\"right\" [ngClass]=\"{'mr-0': screenSize === screenSizeEnum.XS}\"></span>\n <span *ngIf=\"invoice?.state === 'CANCELED'\" class=\"dot red\" matTooltip=\"Canceled\" matTooltipPosition=\"right\" [ngClass]=\"{'mr-0': screenSize === screenSizeEnum.XS}\"></span>\n </ng-container>\n <ng-container matColumnDef=\"private\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\" matTooltip=\"Private\"></th>\n <td *matCellDef=\"let invoice\" mat-cell>\n <span *ngIf=\"invoice.private\" class=\"mr-1\" matTooltip=\"Private\" matTooltipPosition=\"right\"><fa-icon [icon]=\"faEyeSlash\"></fa-icon></span>\n <span *ngIf=\"!invoice.private\" class=\"mr-1\" matTooltip=\"Public\" matTooltipPosition=\"right\"><fa-icon [icon]=\"faEye\"></fa-icon></span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"is_keysend\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\" matTooltip=\"Keysend\"></th>\n <td *matCellDef=\"let invoice\" mat-cell>\n <span *ngIf=\"invoice.is_keysend\" class=\"mr-1\" matTooltip=\"Keysend Invoices\" matTooltipPosition=\"right\"><fa-icon [icon]=\"faArrowsTurnToDots\"></fa-icon></span>\n <span *ngIf=\"!invoice.is_keysend\" class=\"mr-1\" matTooltip=\"Non Keysend Invoices\" matTooltipPosition=\"right\"><fa-icon [icon]=\"faArrowsTurnRight\"></fa-icon></span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"is_amp\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\" matTooltip=\"AMP\"></th>\n <td *matCellDef=\"let invoice\" mat-cell>\n <span *ngIf=\"!invoice.is_amp\" class=\"mr-1\" matTooltip=\"Non Atomic Payment\" matTooltipPosition=\"right\"><fa-icon [icon]=\"faMoneyBill1\"></fa-icon></span>\n <span *ngIf=\"invoice.is_amp\" class=\"mr-1\" matTooltip=\"Atomic Multi Path Payment\" matTooltipPosition=\"right\"><fa-icon [icon]=\"faBurst\"></fa-icon></span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"creation_date\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Date Created</th>\n <td *matCellDef=\"let invoice\" mat-cell>\n {{(invoice?.creation_date * 1000) | date:'dd/MMM/y HH:mm'}}</td>\n </ng-container>\n <ng-container matColumnDef=\"settle_date\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Date Settled</th>\n <td *matCellDef=\"let invoice\" mat-cell>{{(+invoice?.settle_date !== 0 ? ((+invoice?.settle_date * 1000) | date:'dd/MMM/y HH:mm') : '-')}}</td>\n </ng-container>\n <ng-container matColumnDef=\"memo\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Memo</th>\n <td *matCellDef=\"let invoice\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{invoice?.memo}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"r_preimage\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Preimage</th>\n <td *matCellDef=\"let invoice\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{invoice?.r_preimage}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"r_hash\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Preimage Hash</th>\n <td *matCellDef=\"let invoice\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{invoice?.r_hash}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"payment_addr\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Payment Address</th>\n <td *matCellDef=\"let invoice\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{invoice?.payment_addr}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"payment_request\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Payment Request</th>\n <td *matCellDef=\"let invoice\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{invoice?.payment_request}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"description_hash\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Description Hash</th>\n <td *matCellDef=\"let invoice\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{invoice?.description_hash}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"expiry\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Expiry</th>\n <td *matCellDef=\"let invoice\" mat-cell><span fxLayoutAlign=\"end center\">{{invoice?.expiry | number}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"cltv_expiry\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">CLTV Expiry</th>\n <td *matCellDef=\"let invoice\" mat-cell><span fxLayoutAlign=\"end center\">{{invoice?.cltv_expiry | number}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"add_index\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Add Index</th>\n <td *matCellDef=\"let invoice\" mat-cell><span fxLayoutAlign=\"end center\">{{invoice?.add_index | number}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"settle_index\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Settle Index</th>\n <td *matCellDef=\"let invoice\" mat-cell><span fxLayoutAlign=\"end center\">{{invoice?.settle_index | number}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"value\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Amount (Sats)</th>\n <td *matCellDef=\"let invoice\" mat-cell><span fxLayoutAlign=\"end center\">{{invoice?.value | number}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"amt_paid_sat\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Amount Settled (Sats)</th>\n <td *matCellDef=\"let invoice\" mat-cell><span fxLayoutAlign=\"end center\">{{invoice?.amt_paid_sat | number}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"actions\">\n <th *matHeaderCellDef mat-header-cell>\n <div class=\"bordered-box table-actions-select\" fxLayoutAlign=\"center center\">\n <mat-select placeholder=\"Actions\" tabindex=\"1\" class=\"mr-0\">\n <mat-select-trigger></mat-select-trigger>\n <mat-option (click)=\"onDownloadCSV()\">Download CSV</mat-option>\n </mat-select>\n </div>\n </th>\n <td *matCellDef=\"let invoice\" mat-cell fxLayoutAlign=\"end center\">\n <div class=\"bordered-box table-actions-select\" fxLayoutAlign=\"center center\">\n <mat-select placeholder=\"Actions\" tabindex=\"4\" class=\"mr-0\">\n <mat-select-trigger></mat-select-trigger>\n <mat-option (click)=\"onInvoiceClick(invoice)\">View Info</mat-option>\n <mat-option (click)=\"onRefreshInvoice(invoice)\">Refresh</mat-option>\n </mat-select>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"no_invoice\">\n <td *matFooterCellDef mat-footer-cellcolspan=\"6\">\n <p *ngIf=\"(!invoices?.data || invoices?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.COMPLETED\">No invoice available.</p>\n <p *ngIf=\"(!invoices?.data || invoices?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.INITIATED\">Getting invoices...</p>\n <p *ngIf=\"(!invoices?.data || invoices?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.ERROR\">{{errorMessage}}</p>\n </td>\n </ng-container>\n <tr *matFooterRowDef=\"['no_invoice']\" mat-footer-row [ngClass]=\"{'display-none': invoices?.data && invoices?.data?.length>0}\"></tr>\n <tr *matHeaderRowDef=\"displayedColumns\" mat-header-row></tr>\n <tr *matRowDef=\"let row; columns: displayedColumns;\" mat-row></tr>\n </table>\n <mat-paginator class=\"mb-1\" [length]=\"totalInvoices\" [pageSize]=\"pageSize\" [pageSizeOptions]=\"pageSizeOptions\" [showFirstLastButtons]=\"screenSize === screenSizeEnum.XS ? false : true\" (page)=\"onPageChange($event)\"></mat-paginator>\n </div>\n </div>\n</div>","import { Component, OnInit, OnDestroy, ViewChild, Input, AfterViewInit } from '@angular/core';\nimport { DatePipe, DecimalPipe } from '@angular/common';\nimport { Subject } from 'rxjs';\nimport { filter, takeUntil } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { Actions } from '@ngrx/effects';\nimport { faHistory, faEye, faEyeSlash, faBurst, faMoneyBill1, faArrowsTurnToDots, faArrowsTurnRight } from '@fortawesome/free-solid-svg-icons';\nimport { MatPaginator, MatPaginatorIntl, PageEvent } from '@angular/material/paginator';\nimport { MatSort } from '@angular/material/sort';\nimport { MatTableDataSource } from '@angular/material/table';\n\nimport { CurrencyUnitEnum, CURRENCY_UNIT_FORMATS, PAGE_SIZE, PAGE_SIZE_OPTIONS, getPaginatorLabel, ScreenSizeEnum, APICallStatusEnum, UI_MESSAGES, LNDActions, SortOrderEnum, LND_DEFAULT_PAGE_SETTINGS, LND_PAGE_DEFS } from '../../../shared/services/consts-enums-functions';\nimport { ApiCallStatusPayload } from '../../../shared/models/apiCallsPayload';\nimport { SelNodeChild } from '../../../shared/models/RTLconfig';\nimport { GetInfo, Invoice, ListInvoices } from '../../../shared/models/lndModels';\nimport { LoggerService } from '../../../shared/services/logger.service';\nimport { CommonService } from '../../../shared/services/common.service';\n\nimport { CreateInvoiceComponent } from '../create-invoice-modal/create-invoice.component';\nimport { InvoiceInformationComponent } from '../invoice-information-modal/invoice-information.component';\n\nimport { RTLState } from '../../../store/rtl.state';\nimport { openAlert } from '../../../store/rtl.actions';\nimport { fetchInvoices, invoiceLookup, saveNewInvoice } from '../../store/lnd.actions';\nimport { invoices, lndNodeInformation, lndNodeSettings, lndPageSettings } from '../../store/lnd.selector';\nimport { ColumnDefinition, PageSettings, TableSetting } from '../../../shared/models/pageSettings';\nimport { CamelCaseWithReplacePipe } from '../../../shared/pipes/app.pipe';\n\n@Component({\n selector: 'rtl-lightning-invoices',\n templateUrl: './lightning-invoices.component.html',\n styleUrls: ['./lightning-invoices.component.scss'],\n providers: [\n { provide: MatPaginatorIntl, useValue: getPaginatorLabel('Invoices') }\n ]\n})\nexport class LightningInvoicesComponent implements OnInit, AfterViewInit, OnDestroy {\n\n @Input() calledFrom = 'transactions'; // Transactions/home\n @ViewChild(MatSort, { static: false }) sort: MatSort | undefined;\n @ViewChild(MatPaginator, { static: false }) paginator: MatPaginator | undefined;\n public faEye = faEye;\n public faEyeSlash = faEyeSlash;\n public faHistory = faHistory;\n public faArrowsTurnToDots = faArrowsTurnToDots;\n public faArrowsTurnRight = faArrowsTurnRight;\n public faBurst = faBurst;\n public faMoneyBill1 = faMoneyBill1;\n public nodePageDefs = LND_PAGE_DEFS;\n public selFilterBy = 'all';\n public colWidth = '20rem';\n public PAGE_ID = 'transactions';\n public tableSetting: TableSetting = { tableId: 'invoices', recordsPerPage: PAGE_SIZE, sortBy: 'creation_date', sortOrder: SortOrderEnum.DESCENDING };\n public selNode: SelNodeChild | null = {};\n public newlyAddedInvoiceMemo: string | null = null;\n public newlyAddedInvoiceValue: number | null = null;\n public memo = '';\n public expiry: number | null;\n public invoiceValue: number | null;\n public invoiceValueHint = '';\n public displayedColumns: any[] = [];\n public invoicePaymentReq = '';\n public invoicesData: Invoice[] = [];\n public invoices: any = new MatTableDataSource<Invoice>([]);\n public information: GetInfo = {};\n public selFilter = '';\n public private = false;\n public expiryStep = 100;\n public pageSize = PAGE_SIZE;\n public pageSizeOptions = PAGE_SIZE_OPTIONS;\n private firstOffset = -1;\n private lastOffset = -1;\n public totalInvoices = 0;\n public screenSize = '';\n public screenSizeEnum = ScreenSizeEnum;\n public errorMessage = '';\n public apiCallStatus: ApiCallStatusPayload | null = null;\n public apiCallStatusEnum = APICallStatusEnum;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject(), new Subject(), new Subject(), new Subject(), new Subject()];\n\n constructor(private logger: LoggerService, private store: Store<RTLState>, private decimalPipe: DecimalPipe, private commonService: CommonService, private datePipe: DatePipe, private actions: Actions, private camelCaseWithReplace: CamelCaseWithReplacePipe) {\n this.screenSize = this.commonService.getScreenSize();\n }\n\n ngOnInit() {\n this.store.select(lndNodeSettings).pipe(takeUntil(this.unSubs[0])).subscribe((nodeSettings: SelNodeChild | null) => { this.selNode = nodeSettings; });\n this.store.select(lndNodeInformation).pipe(takeUntil(this.unSubs[1])).subscribe((nodeInfo: GetInfo) => { this.information = nodeInfo; });\n this.store.select(lndPageSettings).pipe(takeUntil(this.unSubs[2])).\n subscribe((settings: { pageSettings: PageSettings[], apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessage = '';\n this.apiCallStatus = settings.apiCallStatus;\n if (this.apiCallStatus.status === APICallStatusEnum.ERROR) {\n this.errorMessage = this.apiCallStatus.message || '';\n }\n this.tableSetting = settings.pageSettings.find((page) => page.pageId === this.PAGE_ID)?.tables.find((table) => table.tableId === this.tableSetting.tableId) || LND_DEFAULT_PAGE_SETTINGS.find((page) => page.pageId === this.PAGE_ID)?.tables.find((table) => table.tableId === this.tableSetting.tableId)!;\n if (this.screenSize === ScreenSizeEnum.XS || this.screenSize === ScreenSizeEnum.SM) {\n this.displayedColumns = JSON.parse(JSON.stringify(this.tableSetting.columnSelectionSM));\n } else {\n this.displayedColumns = JSON.parse(JSON.stringify(this.tableSetting.columnSelection));\n }\n this.displayedColumns.unshift('state');\n this.displayedColumns.push('actions');\n this.pageSize = this.tableSetting.recordsPerPage ? +this.tableSetting.recordsPerPage : PAGE_SIZE;\n this.colWidth = this.displayedColumns.length ? ((this.commonService.getContainerSize().width / this.displayedColumns.length) / 10) + 'rem' : '20rem';\n this.logger.info(this.displayedColumns);\n });\n this.store.select(invoices).pipe(takeUntil(this.unSubs[3])).\n subscribe((invoicesSelector: { listInvoices: ListInvoices, apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessage = '';\n this.apiCallStatus = invoicesSelector.apiCallStatus;\n if (this.apiCallStatus.status === APICallStatusEnum.ERROR) {\n this.errorMessage = !this.apiCallStatus.message ? '' : (typeof (this.apiCallStatus.message) === 'object') ? JSON.stringify(this.apiCallStatus.message) : this.apiCallStatus.message;\n }\n this.totalInvoices = (invoicesSelector.listInvoices.total_invoices || 0);\n this.firstOffset = +(invoicesSelector.listInvoices.first_index_offset || -1);\n this.lastOffset = +(invoicesSelector.listInvoices.last_index_offset || -1);\n this.invoicesData = invoicesSelector.listInvoices.invoices || [];\n if (this.invoicesData.length > 0 && this.sort && this.paginator && this.displayedColumns.length > 0) {\n this.loadInvoicesTable(this.invoicesData);\n }\n this.logger.info(invoicesSelector);\n });\n this.actions.pipe(takeUntil(this.unSubs[4]), filter((action) => (action.type === LNDActions.SET_LOOKUP_LND || action.type === LNDActions.UPDATE_API_CALL_STATUS_LND))).\n subscribe((resLookup: any) => {\n if (resLookup.type === LNDActions.SET_LOOKUP_LND) {\n if (this.invoicesData.length > 0 && this.sort && this.paginator && resLookup.payload) {\n this.updateInvoicesData(JSON.parse(JSON.stringify(resLookup.payload)));\n this.loadInvoicesTable(this.invoicesData);\n }\n }\n });\n }\n\n ngAfterViewInit() {\n if (this.invoicesData.length > 0) {\n this.loadInvoicesTable(this.invoicesData);\n }\n }\n\n\n onAddInvoice(form: any) {\n const expiryInSecs = (this.expiry ? this.expiry : 3600);\n this.newlyAddedInvoiceMemo = this.memo;\n this.newlyAddedInvoiceValue = this.invoiceValue;\n this.store.dispatch(saveNewInvoice({\n payload: {\n uiMessage: UI_MESSAGES.ADD_INVOICE, memo: this.memo, value: this.invoiceValue!, private: this.private, expiry: expiryInSecs, is_amp: false, pageSize: this.pageSize, openModal: true\n }\n }));\n this.resetData();\n }\n\n onInvoiceClick(selInvoice: Invoice) {\n this.store.dispatch(openAlert({\n payload: {\n data: {\n invoice: selInvoice,\n newlyAdded: false,\n component: InvoiceInformationComponent\n }\n }\n }));\n }\n\n onRefreshInvoice(selInvoice: Invoice) {\n if (selInvoice && selInvoice.r_hash) {\n this.store.dispatch(invoiceLookup({ payload: { openSnackBar: true, paymentHash: Buffer.from(selInvoice.r_hash.trim(), 'hex').toString('base64')?.replace(/\\+/g, '-')?.replace(/[/]/g, '_') } }));\n }\n }\n\n updateInvoicesData(newInvoice: Invoice) {\n this.invoicesData = this.invoicesData?.map((invoice) => ((invoice.r_hash === newInvoice.r_hash) ? newInvoice : invoice));\n }\n\n\n applyFilter() {\n this.invoices.filter = this.selFilter.trim().toLowerCase();\n }\n\n getLabel(column: string) {\n const returnColumn: ColumnDefinition = this.nodePageDefs[this.PAGE_ID][this.tableSetting.tableId].allowedColumns.find((col) => col.column === column);\n return returnColumn ? returnColumn.label ? returnColumn.label : this.camelCaseWithReplace.transform(returnColumn.column, '_') : this.commonService.titleCase(column);\n }\n\n setFilterPredicate() {\n this.invoices.filterPredicate = (rowData: Invoice, fltr: string) => {\n let rowToFilter = '';\n switch (this.selFilterBy) {\n case 'all':\n rowToFilter = (rowData.creation_date ? this.datePipe.transform(new Date(rowData.creation_date * 1000), 'dd/MMM/y HH:mm')?.toLowerCase() : '')! +\n (rowData.settle_date ? this.datePipe.transform(new Date(rowData.settle_date * 1000), 'dd/MMM/y HH:mm')?.toLowerCase() : '') + JSON.stringify(rowData).toLowerCase();\n break;\n\n case 'creation_date':\n case 'settle_date':\n rowToFilter = this.datePipe.transform(new Date((rowData[this.selFilterBy] || 0) * 1000), 'dd/MMM/y HH:mm')?.toLowerCase() || '';\n break;\n\n case 'private':\n rowToFilter = rowData?.private ? 'private' : 'public';\n break;\n\n case 'is_keysend':\n rowToFilter = rowData?.is_keysend ? 'keysend invoices' : 'non keysend invoices';\n break;\n\n case 'is_amp':\n rowToFilter = rowData?.is_amp ? 'atomic multi path payment' : 'non atomic payment';\n break;\n\n default:\n rowToFilter = typeof rowData[this.selFilterBy] === 'undefined' ? '' : typeof rowData[this.selFilterBy] === 'string' ? rowData[this.selFilterBy].toLowerCase() : typeof rowData[this.selFilterBy] === 'boolean' ? (rowData[this.selFilterBy] ? 'yes' : 'no') : rowData[this.selFilterBy].toString();\n break;\n }\n return (this.selFilterBy === 'is_keysend' || this.selFilterBy === 'is_amp') ? rowToFilter.indexOf(fltr) === 0 : rowToFilter.includes(fltr);\n };\n }\n\n loadInvoicesTable(invoices) {\n this.invoices = invoices ? new MatTableDataSource<Invoice>([...invoices]) : new MatTableDataSource<Invoice>([]);\n this.invoices.sort = this.sort;\n this.invoices.sortingDataAccessor = (data: any, sortHeaderId: string) => ((data[sortHeaderId] && isNaN(data[sortHeaderId])) ? data[sortHeaderId].toLocaleLowerCase() : data[sortHeaderId] ? +data[sortHeaderId] : null);\n this.invoices.sort?.sort({ id: this.tableSetting.sortBy, start: this.tableSetting.sortOrder, disableClear: true });\n this.setFilterPredicate();\n this.applyFilter();\n this.logger.info(this.invoices);\n }\n\n resetData() {\n this.memo = '';\n this.invoiceValue = null;\n this.private = false;\n this.expiry = null;\n this.invoiceValueHint = '';\n }\n\n onPageChange(event: PageEvent) {\n let reverse = true;\n let index_offset = this.lastOffset;\n this.pageSize = event.pageSize;\n if (event.pageIndex === 0) {\n reverse = true;\n index_offset = 0;\n } else if (event.previousPageIndex && event.pageIndex < event.previousPageIndex) {\n reverse = false;\n index_offset = this.lastOffset;\n } else if (event.previousPageIndex && event.pageIndex > event.previousPageIndex && (event.length > ((event.pageIndex + 1) * event.pageSize))) {\n reverse = true;\n index_offset = this.firstOffset;\n } else if (event.length <= ((event.pageIndex + 1) * event.pageSize)) {\n reverse = false;\n index_offset = 0;\n }\n this.store.dispatch(fetchInvoices({ payload: { num_max_invoices: event.pageSize, index_offset: index_offset, reversed: reverse } }));\n }\n\n onInvoiceValueChange() {\n if (this.selNode && this.selNode.fiatConversion && this.invoiceValue && this.invoiceValue > 99) {\n this.invoiceValueHint = '';\n this.commonService.convertCurrency(this.invoiceValue, CurrencyUnitEnum.SATS, CurrencyUnitEnum.OTHER, (this.selNode.currencyUnits && this.selNode.currencyUnits.length > 2 ? this.selNode.currencyUnits[2] : ''), this.selNode.fiatConversion).\n pipe(takeUntil(this.unSubs[5])).\n subscribe({\n next: (data) => {\n this.invoiceValueHint = '= ' + data.symbol + this.decimalPipe.transform(data.OTHER, CURRENCY_UNIT_FORMATS.OTHER) + ' ' + data.unit;\n }, error: (err) => {\n this.invoiceValueHint = 'Conversion Error: ' + err;\n }\n });\n }\n }\n\n onDownloadCSV() {\n if (this.invoices.data && this.invoices.data.length > 0) {\n this.commonService.downloadFile(this.invoices.data, 'Invoices');\n }\n }\n\n openCreateInvoiceModal() {\n this.store.dispatch(openAlert({\n payload: {\n data: {\n pageSize: this.pageSize,\n component: CreateInvoiceComponent\n }\n }\n }));\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"row\">\n <div fxFlex=\"100\">\n <mat-card-header fxLayout=\"row\" fxLayoutAlign=\"space-between center\" class=\"modal-info-header\">\n <div fxFlex=\"95\" fxLayoutAlign=\"start start\">\n <span class=\"page-title\">Send Payment</span>\n </div>\n <button tabindex=\"8\" fxFlex=\"5\" fxLayoutAlign=\"center\" class=\"btn-close-x p-0\" default mat-button [mat-dialog-close]=\"false\">X</button>\n </mat-card-header>\n <mat-card-content class=\"padding-gap-x-large\">\n <form #sendPaymentForm=\"ngForm\" fxLayoutAlign=\"space-between stretch\" fxLayout=\"column\">\n <mat-form-field fxFlex=\"100\">\n <textarea #paymentReq=\"ngModel\" autoFocus matInput placeholder=\"Payment Request\" name=\"paymentRequest\" rows=\"4\" tabindex=\"1\" required [ngModel]=\"paymentRequest\" (ngModelChange)=\"onPaymentRequestEntry($event)\" (matTextareaAutosize)=\"true\"></textarea>\n <mat-hint *ngIf=\"paymentRequest && paymentDecodedHint !== ''\">{{paymentDecodedHint}}</mat-hint>\n <mat-error *ngIf=\"!paymentRequest\">Payment request is required.</mat-error>\n <mat-error *ngIf=\"paymentReq.errors?.decodeError\">{{paymentDecodedHint}}</mat-error>\n </mat-form-field>\n <mat-form-field *ngIf=\"zeroAmtInvoice\" fxFlex=\"100\">\n <input #paymentAmt=\"ngModel\" matInput placeholder=\"Amount (Sats)\" name=\"amount\" tabindex=\"2\" required [(ngModel)]=\"paymentAmount\" (change)=\"onAmountChange($event)\">\n <mat-hint>It is a zero amount invoice, enter amount to be paid.</mat-hint>\n <mat-error *ngIf=\"!paymentAmount\">Payment amount is required.</mat-error>\n </mat-form-field>\n <mat-expansion-panel fxFlex=\"100\" class=\"flat-expansion-panel mt-2\" expanded=\"false\" (closed)=\"onAdvancedPanelToggle(true, false)\" (opened)=\"onAdvancedPanelToggle(false, false)\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <span>{{advancedTitle}}</span>\n </mat-panel-title>\n </mat-expansion-panel-header>\n <div fxFlex=\"100\" fxLayout=\"column\" fxLayoutAlign=\"space-between stretch\" fxLayout.gt-sm=\"row wrap\">\n <mat-form-field fxFlex=\"30\" fxLayoutAlign=\"start end\">\n <mat-select tabindex=\"5\" Placeholder=\"Fee Limits\" [(value)]=\"selFeeLimitType\">\n <mat-option *ngFor=\"let feeLimitType of feeLimitTypes\" [value]=\"feeLimitType\">\n {{feeLimitType?.name}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field fxFlex=\"26\">\n <input #fLmt=\"ngModel\" matInput type=\"number\" name=\"feeLmt\" required tabindex=\"6\" [placeholder]=\"selFeeLimitType?.placeholder\" [step]=\"1\" [min]=\"0\" [disabled]=\"selFeeLimitType === feeLimitTypes[0]\" [(ngModel)]=\"feeLimit\">\n <mat-error *ngIf=\"selFeeLimitType !== feeLimitTypes[0] && !feeLimit\">{{selFeeLimitType?.placeholder}} is required.</mat-error>\n </mat-form-field>\n <mat-form-field fxFlex=\"40\" fxLayoutAlign=\"start end\">\n <input type=\"text\" placeholder=\"First Outgoing Channel\" aria-label=\"First Outgoing Channel\" matInput tabindex=\"7\" [formControl]=\"selectedChannelCtrl\" [matAutocomplete]=\"auto\">\n <mat-autocomplete #auto=\"matAutocomplete\" [displayWith]=\"displayFn\" (optionSelected)=\"onSelectedChannelChanged()\">\n <mat-option *ngFor=\"let activeChannel of filteredMinAmtActvChannels\" [value]=\"activeChannel\">{{activeChannel?.remote_alias || activeChannel?.chan_id}}</mat-option>\n </mat-autocomplete>\n <mat-error *ngIf=\"selectedChannelCtrl.errors?.notfound\">Channel not found in the list.</mat-error>\n </mat-form-field>\n </div>\n </mat-expansion-panel>\n <div *ngIf=\"paymentError !== ''\" fxFlex=\"100\" class=\"alert alert-danger mt-1\">\n <fa-icon class=\"mr-1 alert-icon\" [icon]=\"faExclamationTriangle\"></fa-icon>\n <span *ngIf=\"paymentError !== ''\">{{paymentError}}</span>\n </div>\n <div class=\"mt-2\" fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button class=\"mr-1\" mat-button color=\"primary\" tabindex=\"2\" type=\"reset\" (click)=\"resetData()\">Clear Fields</button>\n <button mat-button id=\"sendBtn\" color=\"primary\" tabindex=\"3\" (click)=\"onSendPayment()\">Send Payment</button>\n </div>\n </form>\n </mat-card-content>\n </div>\n</div>\n","import { Component, OnInit, OnDestroy, ViewChild } from '@angular/core';\nimport { UntypedFormControl, NgModel } from '@angular/forms';\nimport { DecimalPipe } from '@angular/common';\nimport { Subject } from 'rxjs';\nimport { take, takeUntil, filter } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { Actions } from '@ngrx/effects';\nimport { MatDialogRef } from '@angular/material/dialog';\nimport { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';\n\nimport { SelNodeChild } from '../../../shared/models/RTLconfig';\nimport { PayRequest, Channel, ChannelsSummary, LightningBalance } from '../../../shared/models/lndModels';\nimport { APICallStatusEnum, CurrencyUnitEnum, CURRENCY_UNIT_FORMATS, FEE_LIMIT_TYPES, LNDActions, UI_MESSAGES } from '../../../shared/services/consts-enums-functions';\nimport { CommonService } from '../../../shared/services/common.service';\nimport { LoggerService } from '../../../shared/services/logger.service';\nimport { DataService } from '../../../shared/services/data.service';\n\nimport { RTLState } from '../../../store/rtl.state';\nimport { sendPayment } from '../../store/lnd.actions';\nimport { channels, lndNodeSettings } from '../../store/lnd.selector';\nimport { ApiCallStatusPayload } from '../../../shared/models/apiCallsPayload';\n\n@Component({\n selector: 'rtl-lightning-send-payments',\n templateUrl: './send-payment.component.html',\n styleUrls: ['./send-payment.component.scss']\n})\nexport class LightningSendPaymentsComponent implements OnInit, OnDestroy {\n\n @ViewChild('paymentReq', { static: false }) paymentReq: NgModel;\n public faExclamationTriangle = faExclamationTriangle;\n public selNode: SelNodeChild | null = {};\n public paymentDecoded: PayRequest = {};\n public zeroAmtInvoice = false;\n public paymentAmount: number | null = null;\n public paymentRequest = '';\n public paymentDecodedHint = '';\n public showAdvanced = false;\n public activeChannels: Channel[] = [];\n public filteredMinAmtActvChannels: Channel[] = [];\n public selectedChannelCtrl = new UntypedFormControl();\n public feeLimit: number | null = null;\n public selFeeLimitType = FEE_LIMIT_TYPES[0];\n public feeLimitTypes = FEE_LIMIT_TYPES;\n public advancedTitle = 'Advanced Options';\n public paymentError = '';\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject(), new Subject(), new Subject()];\n\n constructor(public dialogRef: MatDialogRef<LightningSendPaymentsComponent>, private store: Store<RTLState>, private logger: LoggerService, private commonService: CommonService, private decimalPipe: DecimalPipe, private actions: Actions, private dataService: DataService) { }\n\n ngOnInit() {\n this.store.select(lndNodeSettings).pipe(takeUntil(this.unSubs[0])).subscribe((nodeSettings: SelNodeChild | null) => { this.selNode = nodeSettings; });\n this.store.select(channels).pipe(takeUntil(this.unSubs[1])).\n subscribe((channelsSelector: { channels: Channel[], channelsSummary: ChannelsSummary, lightningBalance: LightningBalance, apiCallStatus: ApiCallStatusPayload }) => {\n this.activeChannels = channelsSelector.channels && channelsSelector.channels.length ? channelsSelector.channels?.filter((channel) => channel.active) : [];\n this.filteredMinAmtActvChannels = this.activeChannels;\n if (this.filteredMinAmtActvChannels.length && this.filteredMinAmtActvChannels.length > 0) {\n this.selectedChannelCtrl.enable();\n } else {\n this.selectedChannelCtrl.disable();\n }\n this.logger.info(channelsSelector);\n });\n this.actions.pipe(\n takeUntil(this.unSubs[2]),\n filter((action) => action.type === LNDActions.UPDATE_API_CALL_STATUS_LND || action.type === LNDActions.SEND_PAYMENT_STATUS_LND)).\n subscribe((action: any) => {\n if (action.type === LNDActions.SEND_PAYMENT_STATUS_LND) {\n this.dialogRef.close();\n }\n if (action.type === LNDActions.UPDATE_API_CALL_STATUS_LND && action.payload.status === APICallStatusEnum.ERROR && action.payload.action === 'SendPayment') {\n delete this.paymentDecoded.num_satoshis;\n this.paymentError = action.payload.message;\n }\n });\n let x = '';\n let y = '';\n this.activeChannels = this.activeChannels.sort((c1: Channel, c2: Channel) => {\n x = c1.remote_alias ? c1.remote_alias.toLowerCase() : c1.chan_id ? c1.chan_id.toLowerCase() : '';\n y = c2.remote_alias ? c2.remote_alias.toLowerCase() : c2.chan_id ? c2.chan_id.toLowerCase() : '';\n return ((x < y) ? -1 : ((x > y) ? 1 : 0));\n });\n this.selectedChannelCtrl.valueChanges.pipe(takeUntil(this.unSubs[3])).\n subscribe((channel) => {\n if (typeof channel === 'string') {\n this.filteredMinAmtActvChannels = this.filterChannels();\n }\n });\n }\n\n private filterChannels(): Channel[] {\n return this.activeChannels && this.activeChannels.length ? this.activeChannels?.filter((channel) => {\n const alias = channel.remote_alias ? channel.remote_alias.toLowerCase() : channel.chan_id ? channel.chan_id.toLowerCase() : '';\n return alias.indexOf(this.selectedChannelCtrl.value ? this.selectedChannelCtrl.value.toLowerCase() : '') === 0 && (channel.local_balance || 0) >= +(this.paymentDecoded.num_satoshis ? this.paymentDecoded.num_satoshis : 0);\n }) : [];\n }\n\n displayFn(channel: Channel): string {\n return (channel && channel.remote_alias) ? channel.remote_alias : (channel && channel.chan_id) ? channel.chan_id : '';\n }\n\n onSelectedChannelChanged() {\n if (this.selectedChannelCtrl.value && this.selectedChannelCtrl.value.length > 0 && typeof this.selectedChannelCtrl.value === 'string') {\n const foundChannels = this.activeChannels && this.activeChannels.length ? this.activeChannels?.filter((channel) => {\n const alias = channel.remote_alias ? channel.remote_alias.toLowerCase() : channel.chan_id ? channel.chan_id.toLowerCase() : '';\n return alias.length === this.selectedChannelCtrl.value.length && alias.indexOf(this.selectedChannelCtrl.value ? this.selectedChannelCtrl.value.toLowerCase() : '') === 0;\n }) : [];\n if (foundChannels && foundChannels.length > 0) {\n this.selectedChannelCtrl.setValue(foundChannels[0]);\n this.selectedChannelCtrl.setErrors(null);\n } else {\n this.selectedChannelCtrl.setErrors({ notfound: true });\n }\n }\n }\n\n onSendPayment(): boolean | void {\n if (this.selectedChannelCtrl.value && typeof this.selectedChannelCtrl.value === 'string') {\n this.onSelectedChannelChanged();\n }\n if (!this.paymentRequest || (this.zeroAmtInvoice && (!this.paymentAmount || this.paymentAmount <= 0)) || typeof this.selectedChannelCtrl.value === 'string') {\n return true;\n }\n if (this.paymentDecoded.timestamp) {\n this.sendPayment();\n } else {\n this.onPaymentRequestEntry(this.paymentRequest);\n }\n }\n\n sendPayment(): boolean | void {\n if (this.selFeeLimitType !== this.feeLimitTypes[0] && !this.feeLimit) {\n return true;\n }\n if (this.paymentDecoded.num_msat && !this.paymentDecoded.num_satoshis) {\n this.paymentDecoded.num_satoshis = (+this.paymentDecoded.num_msat / 1000).toString();\n }\n if (!this.paymentDecoded.num_satoshis || this.paymentDecoded.num_satoshis === '' || this.paymentDecoded.num_satoshis === '0') {\n this.zeroAmtInvoice = true;\n this.paymentDecoded.num_satoshis = this.paymentAmount?.toString() || '';\n this.store.dispatch(sendPayment({ payload: { uiMessage: UI_MESSAGES.SEND_PAYMENT, paymentReq: this.paymentRequest, paymentAmount: this.paymentAmount || 0, outgoingChannel: this.selectedChannelCtrl.value, feeLimitType: this.selFeeLimitType.id, feeLimit: this.feeLimit, fromDialog: true } }));\n } else {\n this.zeroAmtInvoice = false;\n this.store.dispatch(sendPayment({ payload: { uiMessage: UI_MESSAGES.SEND_PAYMENT, paymentReq: this.paymentRequest, outgoingChannel: this.selectedChannelCtrl.value, feeLimitType: this.selFeeLimitType.id, feeLimit: this.feeLimit, fromDialog: true } }));\n }\n }\n\n onAmountChange(event: any) {\n delete this.paymentDecoded.num_satoshis;\n }\n\n onPaymentRequestEntry(event: any) {\n this.paymentRequest = event;\n this.paymentAmount = null;\n this.paymentError = '';\n this.paymentDecodedHint = '';\n this.zeroAmtInvoice = false;\n if (this.paymentRequest && this.paymentRequest.length > 100) {\n this.paymentReq.control.setErrors(null);\n this.zeroAmtInvoice = false;\n this.dataService.decodePayment(this.paymentRequest, true).\n pipe(take(1)).subscribe({\n next: (decodedPayment: PayRequest) => {\n this.paymentDecoded = decodedPayment;\n this.selectedChannelCtrl.setValue(null);\n this.onAdvancedPanelToggle(true, true);\n if (this.paymentDecoded.num_msat && !this.paymentDecoded.num_satoshis) {\n this.paymentDecoded.num_satoshis = (+this.paymentDecoded.num_msat / 1000).toString();\n }\n if (this.paymentDecoded.num_satoshis && this.paymentDecoded.num_satoshis !== '' && this.paymentDecoded.num_satoshis !== '0') {\n this.filteredMinAmtActvChannels = this.filterChannels();\n if (this.filteredMinAmtActvChannels.length && this.filteredMinAmtActvChannels.length > 0) {\n this.selectedChannelCtrl.enable();\n } else {\n this.selectedChannelCtrl.disable();\n }\n this.zeroAmtInvoice = false;\n if (this.selNode && this.selNode.fiatConversion) {\n this.commonService.convertCurrency(+this.paymentDecoded.num_satoshis, CurrencyUnitEnum.SATS, CurrencyUnitEnum.OTHER, (this.selNode.currencyUnits && this.selNode.currencyUnits.length > 2 ? this.selNode.currencyUnits[2] : 'BTC'), this.selNode.fiatConversion).\n pipe(takeUntil(this.unSubs[4])).\n subscribe({\n next: (data) => {\n this.paymentDecodedHint = 'Sending: ' + this.decimalPipe.transform(this.paymentDecoded.num_satoshis) +\n ' Sats (' + data.symbol + ' ' + this.decimalPipe.transform((data.OTHER ? data.OTHER : 0), CURRENCY_UNIT_FORMATS.OTHER) + ') | Memo: ' +\n (this.paymentDecoded.description ? this.paymentDecoded.description : 'None');\n }, error: (error) => {\n this.paymentDecodedHint = 'Sending: ' + this.decimalPipe.transform(this.paymentDecoded.num_satoshis) + ' Sats | Memo: ' + (this.paymentDecoded.description ? this.paymentDecoded.description : 'None') + '. Unable to convert currency.';\n }\n });\n } else {\n this.paymentDecodedHint = 'Sending: ' + this.decimalPipe.transform(this.paymentDecoded.num_satoshis) + ' Sats | Memo: ' + (this.paymentDecoded.description ? this.paymentDecoded.description : 'None');\n }\n } else {\n this.zeroAmtInvoice = true;\n this.filteredMinAmtActvChannels = this.activeChannels;\n if (this.filteredMinAmtActvChannels.length && this.filteredMinAmtActvChannels.length > 0) {\n this.selectedChannelCtrl.enable();\n } else {\n this.selectedChannelCtrl.disable();\n }\n this.paymentDecodedHint = 'Memo: ' + (this.paymentDecoded.description ? this.paymentDecoded.description : 'None');\n }\n }, error: (err) => {\n this.logger.error(err);\n this.paymentDecodedHint = 'ERROR: ' + err.message;\n this.paymentReq.control.setErrors({ decodeError: true });\n }\n });\n }\n }\n\n onAdvancedPanelToggle(isClosed: boolean, isReset: boolean) {\n if (isClosed && !isReset) {\n const alias = (this.selectedChannelCtrl.value && this.selectedChannelCtrl.value.remote_alias) ? this.selectedChannelCtrl.value.remote_alias : (this.selectedChannelCtrl.value && this.selectedChannelCtrl.value.chan_id) ? this.selectedChannelCtrl.value.chan_id : '';\n this.advancedTitle = 'Advanced Options | ' + this.selFeeLimitType.name + (this.selFeeLimitType.id === 'none' ? '' : (': ' + this.feeLimit)) + ((alias !== '') ? ' | First Outgoing Channel: ' + alias : '');\n } else {\n this.advancedTitle = 'Advanced Options';\n }\n }\n\n resetData() {\n this.paymentDecoded = {};\n this.paymentRequest = '';\n this.selectedChannelCtrl.setValue(null);\n this.filteredMinAmtActvChannels = this.activeChannels;\n if (this.filteredMinAmtActvChannels.length && this.filteredMinAmtActvChannels.length > 0) {\n this.selectedChannelCtrl.enable();\n } else {\n this.selectedChannelCtrl.disable();\n }\n this.feeLimit = null;\n this.selFeeLimitType = FEE_LIMIT_TYPES[0];\n this.advancedTitle = 'Advanced Options';\n this.zeroAmtInvoice = false;\n this.paymentReq.control.setErrors(null);\n this.paymentError = '';\n this.paymentDecodedHint = '';\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between stretch\" class=\"padding-gap-x\">\n <form *ngIf=\"calledFrom === 'home'\" #sendPaymentForm=\"ngForm\" fxLayoutAlign=\"space-between stretch\" fxLayout=\"row wrap\">\n <mat-form-field fxFlex=\"100\">\n <textarea #paymentReq=\"ngModel\" matInput placeholder=\"Payment Request\" name=\"paymentRequest\" tabindex=\"1\" required [perfectScrollbar] [ngModel]=\"paymentRequest\" (ngModelChange)=\"onPaymentRequestEntry($event)\" (matTextareaAutosize)=\"true\"></textarea>\n <mat-hint *ngIf=\"paymentRequest && paymentDecodedHint !== ''\">{{paymentDecodedHint}}</mat-hint>\n <mat-error *ngIf=\"!paymentRequest\">Payment request is required.</mat-error>\n </mat-form-field>\n <div fxLayout=\"row\" class=\"mt-1\">\n <button class=\"mr-1\" mat-stroked-button color=\"primary\" tabindex=\"2\" type=\"reset\" (click)=\"resetData()\">Clear Field</button>\n <button mat-flat-button color=\"primary\" tabindex=\"3\" (click)=\"onSendPayment()\">Send Payment</button>\n </div>\n </form>\n <div *ngIf=\"calledFrom === 'transactions'\" fxLayout=\"row\">\n <button mat-flat-button color=\"primary\" tabindex=\"4\" (click)=\"openSendPaymentModal()\">Send Payment</button>\n </div>\n <div *ngIf=\"calledFrom === 'transactions'\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\">\n <div fxLayout=\"column\" fxLayoutAlign=\"start stretch\" fxLayout.gt-sm=\"row wrap\" class=\"page-sub-title-container mt-1\">\n <div fxFlex=\"70\" fxLayoutAlign=\"start start\" fxLayoutAlign.gt-sm=\"start center\">\n <fa-icon class=\"page-title-img mr-1\" [icon]=\"faHistory\"></fa-icon>\n <span class=\"page-title\">Payments History</span>\n </div>\n <div fxFlex.gt-xs=\"30\" fxLayoutAlign.gt-xs=\"space-between center\" fxLayout=\"row\" fxLayoutAlign=\"space-between stretch\">\n <mat-form-field fxFlex=\"49\">\n <mat-select placeholder=\"Filter By\" tabindex=\"1\" name=\"filterBy\" [(ngModel)]=\"selFilterBy\" (selectionChange)=\"selFilter=''; applyFilter()\">\n <mat-option *ngFor=\"let column of ['all'].concat(displayedColumns.slice(0, -1))\" [value]=\"column\">{{getLabel(column)}}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field fxFlex=\"49\">\n <input matInput name=\"filter\" placeholder=\"Filter\" [(ngModel)]=\"selFilter\" (input)=\"applyFilter()\" (keyup)=\"applyFilter()\">\n </mat-form-field>\n </div>\n </div>\n <div fxLayout=\"row\" fxLayoutAlign=\"start start\">\n <div fxLayout=\"column\" fxLayoutAlign=\"start end\" fxFlex=\"100\" class=\"table-container\" [perfectScrollbar]>\n <mat-progress-bar *ngIf=\"apiCallStatus.status === apiCallStatusEnum.INITIATED\" mode=\"indeterminate\"></mat-progress-bar>\n <table #table mat-table fxFlex=\"100\" matSort [dataSource]=\"payments\" [ngClass]=\"{'error-border': errorMessage !== ''}\">\n <ng-container matColumnDef=\"status\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\" matTooltip=\"Status\"></th>\n <td *matCellDef=\"let payment\" mat-cell>\n <span *ngIf=\"payment?.status === 'SUCCEEDED'\" class=\"dot green\" matTooltip=\"Succeeded\" matTooltipPosition=\"right\" [ngClass]=\"{'mr-0': screenSize === screenSizeEnum.XS}\"></span>\n <span *ngIf=\"payment?.status !== 'SUCCEEDED'\" class=\"dot red\" matTooltip=\"Failed\" matTooltipPosition=\"right\" [ngClass]=\"{'mr-0': screenSize === screenSizeEnum.XS}\"></span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"creation_date\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Creation Date</th>\n <td *matCellDef=\"let payment\" mat-cell>\n {{(payment?.creation_date * 1000) | date:'dd/MMM/y HH:mm'}}\n </td>\n </ng-container>\n <ng-container matColumnDef=\"payment_hash\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Payment Hash</th>\n <td *matCellDef=\"let payment\" mat-cell>\n <span fxLayout=\"row\" class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{payment?.payment_hash}}</span>\n </span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"payment_request\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Payment Request</th>\n <td *matCellDef=\"let payment\" mat-cell>\n <span fxLayout=\"row\" class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{payment?.payment_request}}</span>\n </span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"payment_preimage\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Payment Preimage</th>\n <td *matCellDef=\"let payment\" mat-cell>\n <span fxLayout=\"row\" class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{payment?.payment_preimage}}</span>\n </span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"description\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Description</th>\n <td *matCellDef=\"let payment\" mat-cell>\n <span fxLayout=\"row\" class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{payment?.description}}</span>\n </span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"description_hash\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Description Hash</th>\n <td *matCellDef=\"let payment\" mat-cell>\n <span fxLayout=\"row\" class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{payment?.description_hash}}</span>\n </span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"failure_reason\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Failure Reason</th>\n <td *matCellDef=\"let payment\" mat-cell>\n {{payment?.failure_reason | camelcaseWithReplace:'failure_reason':'_'}}\n </td>\n </ng-container>\n <ng-container matColumnDef=\"payment_index\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Payment Index</th>\n <td *matCellDef=\"let payment\" mat-cell><span fxLayoutAlign=\"end center\">{{payment?.payment_index | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"fee\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Fee (Sats)</th>\n <td *matCellDef=\"let payment\" mat-cell><span fxLayoutAlign=\"end center\">{{payment?.fee | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"value\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Value (Sats)</th>\n <td *matCellDef=\"let payment\" mat-cell><span fxLayoutAlign=\"end center\">{{payment?.value | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"hops\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Hops</th>\n <td *matCellDef=\"let payment\" mat-cell><span fxLayoutAlign=\"end center\">{{payment?.htlcs[0]?.route?.hops?.length || 0}}</span></td>\n </ng-container> \n <ng-container matColumnDef=\"actions\">\n <th *matHeaderCellDef mat-header-cell>\n <div class=\"bordered-box table-actions-select\" fxLayoutAlign=\"center center\">\n <mat-select placeholder=\"Actions\" tabindex=\"1\" class=\"mr-0\">\n <mat-select-trigger></mat-select-trigger>\n <mat-option (click)=\"onDownloadCSV()\">Download CSV</mat-option>\n </mat-select>\n </div>\n </th>\n <td *matCellDef=\"let payment\" mat-cell fxLayoutAlign=\"end center\">\n <button mat-stroked-button color=\"primary\" type=\"button\" tabindex=\"4\" class=\"table-actions-button\" (click)=\"onPaymentClick(payment)\">View Info</button> \n </td>\n </ng-container>\n <ng-container matColumnDef=\"no_payment\">\n <td *matFooterCellDef mat-footer-cellcolspan=\"4\">\n <p *ngIf=\"(!payments?.data || payments?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.COMPLETED\">No payment available.</p>\n <p *ngIf=\"(!payments?.data || payments?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.INITIATED\">Getting payments...</p>\n <p *ngIf=\"(!payments?.data || payments?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.ERROR\">{{errorMessage}}</p>\n </td>\n </ng-container>\n <!-- Payment Group Row Start -->\n <ng-container matColumnDef=\"group_status\">\n <td *matCellDef=\"let payment\" mat-cell>\n <span fxLayoutAlign=\"start center\" class=\"htlc-row-span\">\n <span *ngIf=\"payment?.status === 'SUCCEEDED'\" class=\"dot green\" matTooltip=\"Succeeded\" matTooltipPosition=\"right\" [ngClass]=\"{'mr-0': screenSize === screenSizeEnum.XS}\"></span>\n <span *ngIf=\"payment?.status !== 'SUCCEEDED'\" class=\"dot red\" matTooltip=\"Failed\" matTooltipPosition=\"right\" [ngClass]=\"{'mr-0': screenSize === screenSizeEnum.XS}\"></span>\n </span>\n <ng-container *ngIf=\"payment?.is_expanded\">\n <span *ngFor=\"let htlc of payment?.htlcs\" fxLayoutAlign=\"start center\" class=\"htlc-row-span\">\n <span *ngIf=\"htlc.status === 'SUCCEEDED'\" class=\"dot green\" matTooltip=\"Succeeded\" matTooltipPosition=\"right\" [ngClass]=\"{'mr-0': screenSize === screenSizeEnum.XS}\"></span>\n <span *ngIf=\"htlc.status !== 'SUCCEEDED'\" class=\"dot red\" matTooltip=\"Failed\" matTooltipPosition=\"right\" [ngClass]=\"{'mr-0': screenSize === screenSizeEnum.XS}\"></span>\n </span>\n </ng-container>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"group_creation_date\">\n <td *matCellDef=\"let payment\" mat-cell>\n <span fxLayoutAlign=\"start center\" class=\"htlc-row-span\">\n Total Attempts: {{payment?.htlcs?.length}}\n </span>\n <ng-container *ngIf=\"payment?.is_expanded\">\n <span *ngFor=\"let htlc of payment?.htlcs\" fxLayoutAlign=\"start center\" class=\"htlc-row-span\">\n {{(htlc.attempt_time_ns / 1000000) | date:'dd/MMM/y HH:mm'}}\n </span>\n </ng-container>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"group_payment_hash\">\n <td *matCellDef=\"let payment\" mat-cell>\n <span fxLayout=\"row\" class=\"ellipsis-parent htlc-row-span\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{payment?.payment_hash}}</span>\n </span>\n <span *ngIf=\"payment?.is_expanded\">\n <span *ngFor=\"let htlc of payment?.htlcs; index as i\" fxLayoutAlign=\"start center\" class=\"htlc-row-span\">\n HTLC {{i + 1}}\n </span>\n </span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"group_payment_request\">\n <td *matCellDef=\"let payment\" mat-cell>\n <span fxLayout=\"row\" class=\"ellipsis-parent htlc-row-span\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{payment?.payment_request}}</span>\n </span>\n <span *ngIf=\"payment?.is_expanded\">\n <span *ngFor=\"let htlc of payment?.htlcs\" fxLayoutAlign=\"start center\" class=\"htlc-row-span\">\n </span>\n </span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"group_payment_preimage\">\n <td *matCellDef=\"let payment\" mat-cell>\n <span fxLayout=\"row\" class=\"ellipsis-parent htlc-row-span\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{payment?.payment_preimage}}</span>\n </span>\n <span *ngIf=\"payment?.is_expanded\">\n <span *ngFor=\"let htlc of payment?.htlcs; index as i\" fxLayoutAlign=\"start center\" class=\"htlc-row-span\">\n {{htlc?.preimage}}\n </span>\n </span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"group_description\">\n <td *matCellDef=\"let payment\" mat-cell>\n <span fxLayout=\"row\" class=\"ellipsis-parent htlc-row-span\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{payment?.description}}</span>\n </span>\n <span *ngIf=\"payment?.is_expanded\">\n <span *ngFor=\"let htlc of payment?.htlcs\" fxLayoutAlign=\"start center\" class=\"htlc-row-span\">\n </span>\n </span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"group_description_hash\">\n <td *matCellDef=\"let payment\" mat-cell>\n <span fxLayout=\"row\" class=\"ellipsis-parent htlc-row-span\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{payment?.description_hash}}</span>\n </span>\n <span *ngIf=\"payment?.is_expanded\">\n <span *ngFor=\"let htlc of payment?.htlcs\" fxLayoutAlign=\"start center\" class=\"htlc-row-span\">\n </span>\n </span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"group_failure_reason\">\n <td *matCellDef=\"let payment\" mat-cell>\n <span fxLayoutAlign=\"start center\" class=\"htlc-row-span\">\n {{payment?.failure_reason | camelcaseWithReplace:'failure_reason':'_'}}\n </span>\n <span *ngIf=\"payment?.is_expanded\">\n <span *ngFor=\"let htlc of payment?.htlcs\" fxLayoutAlign=\"start center\" class=\"htlc-row-span\">\n </span>\n </span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"group_payment_index\">\n <td *matCellDef=\"let payment\" mat-cell>\n <span fxLayoutAlign=\"end center\" class=\"htlc-row-span\">{{payment?.payment_index | number}}</span>\n <span *ngIf=\"payment?.is_expanded\">\n <span *ngFor=\"let htlc of payment?.htlcs\" fxLayoutAlign=\"end center\" class=\"htlc-row-span\">\n {{htlc.attempt_id | number}}\n </span>\n </span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"group_fee\">\n <td *matCellDef=\"let payment\" mat-cell>\n <span fxLayoutAlign=\"end center\" class=\"htlc-row-span\">{{payment?.fee | number:'1.0-0'}}</span>\n <span *ngIf=\"payment?.is_expanded\">\n <span *ngFor=\"let htlc of payment?.htlcs\" fxLayoutAlign=\"end center\" class=\"htlc-row-span\">\n {{htlc.route?.total_fees | number:'1.0-0'}}\n </span>\n </span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"group_value\">\n <td *matCellDef=\"let payment\" mat-cell>\n <span fxLayoutAlign=\"end center\" class=\"htlc-row-span\">{{payment?.value | number:'1.0-0'}}</span>\n <span *ngIf=\"payment?.is_expanded\">\n <span *ngFor=\"let htlc of payment?.htlcs\" fxLayoutAlign=\"end center\" class=\"htlc-row-span\">\n {{htlc.route?.total_amt | number:'1.0-0'}}\n </span>\n </span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"group_hops\">\n <td *matCellDef=\"let payment\" mat-cell>\n <span fxLayoutAlign=\"end center\" class=\"htlc-row-span\">-</span>\n <span *ngIf=\"payment?.is_expanded\">\n <span *ngFor=\"let htlc of payment?.htlcs\" fxLayoutAlign=\"end center\" class=\"htlc-row-span\">\n {{(htlc.route?.hops?.length || 0) | number:'1.0-0'}}\n </span>\n </span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"group_actions\">\n <td *matCellDef=\"let payment\" mat-cell>\n <span fxLayoutAlign=\"end center\">\n <button mat-flat-button class=\"btn-htlc-expand\" color=\"primary\" type=\"button\" tabindex=\"5\" (click)=\"payment.is_expanded = !payment?.is_expanded\">{{payment?.is_expanded ? 'Hide' : 'Show'}}</button>\n </span>\n <div *ngIf=\"payment?.is_expanded\">\n <div *ngFor=\"let htlc of payment?.htlcs; index as i\" fxLayoutAlign=\"end center\">\n <button mat-stroked-button class=\"btn-htlc-info\" color=\"primary\" type=\"button\" tabindex=\"6\" (click)=\"onHTLCClick(htlc, payment)\">View {{i + 1}}</button>\n </div>\n </div>\n </td>\n </ng-container>\n <tr *matRowDef=\"let row; columns: htlcColumns; when: is_group;\" mat-row></tr>\n <!-- Payment Group Row End -->\n <tr *matFooterRowDef=\"['no_payment']\" mat-footer-row [ngClass]=\"{'display-none': payments?.data && payments?.data?.length>0}\"></tr>\n <tr *matHeaderRowDef=\"displayedColumns\" mat-header-row></tr>\n <tr *matRowDef=\"let row; columns: displayedColumns;\" mat-row></tr>\n </table>\n <mat-paginator class=\"mb-1\" [length]=\"totalPayments\" [pageSize]=\"pageSize\" [pageSizeOptions]=\"pageSizeOptions\" [showFirstLastButtons]=\"screenSize === screenSizeEnum.XS ? false : true\" (page)=\"onPageChange($event)\"></mat-paginator>\n </div>\n </div>\n </div>\n</div>\n","import { Component, OnInit, OnDestroy, ViewChild, Input, AfterViewInit } from '@angular/core';\nimport { DatePipe, DecimalPipe } from '@angular/common';\nimport { Subject } from 'rxjs';\nimport { takeUntil, take } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { faHistory } from '@fortawesome/free-solid-svg-icons';\n\nimport { MatPaginator, MatPaginatorIntl } from '@angular/material/paginator';\nimport { MatSort } from '@angular/material/sort';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { GetInfo, Payment, PayRequest, PaymentHTLC, Peer, Hop, ListPayments } from '../../../shared/models/lndModels';\nimport { PAGE_SIZE, PAGE_SIZE_OPTIONS, getPaginatorLabel, AlertTypeEnum, DataTypeEnum, ScreenSizeEnum, CurrencyUnitEnum, CURRENCY_UNIT_FORMATS, APICallStatusEnum, UI_MESSAGES, LND_DEFAULT_PAGE_SETTINGS, SortOrderEnum, LND_PAGE_DEFS } from '../../../shared/services/consts-enums-functions';\nimport { LoggerService } from '../../../shared/services/logger.service';\nimport { CommonService } from '../../../shared/services/common.service';\nimport { DataService } from '../../../shared/services/data.service';\n\nimport { ApiCallStatusPayload } from '../../../shared/models/apiCallsPayload';\nimport { SelNodeChild } from '../../../shared/models/RTLconfig';\nimport { LightningSendPaymentsComponent } from '../send-payment-modal/send-payment.component';\n\nimport { RTLEffects } from '../../../store/rtl.effects';\nimport { RTLState } from '../../../store/rtl.state';\nimport { openAlert, openConfirmation } from '../../../store/rtl.actions';\nimport { sendPayment } from '../../store/lnd.actions';\nimport { lndNodeInformation, lndNodeSettings, lndPageSettings, payments, peers } from '../../store/lnd.selector';\nimport { ColumnDefinition, PageSettings, TableSetting } from '../../../shared/models/pageSettings';\nimport { CamelCaseWithReplacePipe } from '../../../shared/pipes/app.pipe';\n\n@Component({\n selector: 'rtl-lightning-payments',\n templateUrl: './lightning-payments.component.html',\n styleUrls: ['./lightning-payments.component.scss'],\n providers: [\n { provide: MatPaginatorIntl, useValue: getPaginatorLabel('Payments') }\n ]\n})\nexport class LightningPaymentsComponent implements OnInit, AfterViewInit, OnDestroy {\n\n @Input() calledFrom = 'transactions'; // Transactions/home\n @ViewChild('sendPaymentForm', { static: false }) form; // Static should be false due to ngIf on form element\n @ViewChild(MatSort, { static: false }) sort: MatSort | undefined;\n @ViewChild(MatPaginator, { static: false }) paginator: MatPaginator | undefined;\n public faHistory = faHistory;\n public nodePageDefs = LND_PAGE_DEFS;\n public selFilterBy = 'all';\n public colWidth = '20rem';\n public PAGE_ID = 'transactions';\n public tableSetting: TableSetting = { tableId: 'payments', recordsPerPage: PAGE_SIZE, sortBy: 'creation_date', sortOrder: SortOrderEnum.DESCENDING };\n public newlyAddedPayment = '';\n public selNode: SelNodeChild | null = {};\n public information: GetInfo = {};\n public peers: Peer[] = [];\n public payments: any = new MatTableDataSource([]);\n public totalPayments = 100;\n public paymentJSONArr: Payment[] = [];\n public displayedColumns: any[] = [];\n public htlcColumns: any[] = [];\n public paymentDecoded: PayRequest = {};\n public paymentRequest = '';\n public paymentDecodedHint = '';\n private firstOffset = -1;\n private lastOffset = -1;\n public selFilter = '';\n public pageSize = PAGE_SIZE;\n public pageSizeOptions = PAGE_SIZE_OPTIONS;\n public screenSize = '';\n public screenSizeEnum = ScreenSizeEnum;\n public errorMessage = '';\n public apiCallStatus: ApiCallStatusPayload | null = null;\n public apiCallStatusEnum = APICallStatusEnum;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject(), new Subject(), new Subject(), new Subject(), new Subject(), new Subject(), new Subject()];\n\n constructor(private logger: LoggerService, private commonService: CommonService, private dataService: DataService, private store: Store<RTLState>, private rtlEffects: RTLEffects, private decimalPipe: DecimalPipe, private datePipe: DatePipe, private camelCaseWithReplace: CamelCaseWithReplacePipe) {\n this.screenSize = this.commonService.getScreenSize();\n }\n\n ngOnInit() {\n this.store.select(lndNodeSettings).pipe(takeUntil(this.unSubs[0])).subscribe((nodeSettings: SelNodeChild | null) => { this.selNode = nodeSettings; });\n this.store.select(lndNodeInformation).pipe(takeUntil(this.unSubs[1])).subscribe((nodeInfo: GetInfo) => { this.information = nodeInfo; });\n this.store.select(peers).pipe(takeUntil(this.unSubs[2])).\n subscribe((peersSelector: { peers: Peer[], apiCallStatus: ApiCallStatusPayload }) => {\n this.peers = peersSelector.peers;\n });\n this.store.select(lndPageSettings).pipe(takeUntil(this.unSubs[3])).\n subscribe((settings: { pageSettings: PageSettings[], apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessage = '';\n this.apiCallStatus = settings.apiCallStatus;\n if (this.apiCallStatus.status === APICallStatusEnum.ERROR) {\n this.errorMessage = this.apiCallStatus.message || '';\n }\n this.tableSetting = settings.pageSettings.find((page) => page.pageId === this.PAGE_ID)?.tables.find((table) => table.tableId === this.tableSetting.tableId) || LND_DEFAULT_PAGE_SETTINGS.find((page) => page.pageId === this.PAGE_ID)?.tables.find((table) => table.tableId === this.tableSetting.tableId)!;\n if (this.screenSize === ScreenSizeEnum.XS || this.screenSize === ScreenSizeEnum.SM) {\n this.displayedColumns = JSON.parse(JSON.stringify(this.tableSetting.columnSelectionSM));\n } else {\n this.displayedColumns = JSON.parse(JSON.stringify(this.tableSetting.columnSelection));\n }\n this.displayedColumns.unshift('status');\n this.displayedColumns.push('actions');\n this.htlcColumns = [];\n this.displayedColumns.map((col) => this.htlcColumns.push('group_' + col));\n this.pageSize = this.tableSetting.recordsPerPage ? +this.tableSetting.recordsPerPage : PAGE_SIZE;\n this.colWidth = this.displayedColumns.length ? ((this.commonService.getContainerSize().width / this.displayedColumns.length) / 10) + 'rem' : '20rem';\n this.logger.info(this.displayedColumns);\n });\n this.store.select(payments).pipe(takeUntil(this.unSubs[5])).\n subscribe((paymentsSelector: { listPayments: ListPayments, apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessage = '';\n this.apiCallStatus = paymentsSelector.apiCallStatus;\n if (this.apiCallStatus.status === APICallStatusEnum.ERROR) {\n this.errorMessage = !this.apiCallStatus.message ? '' : (typeof (this.apiCallStatus.message) === 'object') ? JSON.stringify(this.apiCallStatus.message) : this.apiCallStatus.message;\n }\n this.paymentJSONArr = paymentsSelector.listPayments.payments || [];\n this.totalPayments = this.paymentJSONArr.length;\n this.firstOffset = +(paymentsSelector.listPayments.first_index_offset || -1);\n this.lastOffset = +(paymentsSelector.listPayments.last_index_offset || -1);\n if (this.paymentJSONArr && this.paymentJSONArr.length > 0 && this.sort && this.paginator && this.displayedColumns.length > 0) {\n // this.loadPaymentsTable(this.paymentJSONArr);\n this.loadPaymentsTable(this.paymentJSONArr.slice(0, this.pageSize));\n }\n this.logger.info(paymentsSelector);\n });\n }\n\n ngAfterViewInit() {\n if (this.paymentJSONArr && this.paymentJSONArr.length > 0) {\n // this.loadPaymentsTable(this.paymentJSONArr);\n this.loadPaymentsTable(this.paymentJSONArr.slice(0, this.pageSize));\n }\n }\n\n onSendPayment(): boolean | void {\n if (!this.paymentRequest) {\n return true;\n }\n if (this.paymentDecoded.timestamp) {\n this.sendPayment();\n } else {\n this.dataService.decodePayment(this.paymentRequest, false).\n pipe(take(1)).subscribe((decodedPayment: PayRequest) => {\n this.paymentDecoded = decodedPayment;\n if (this.paymentDecoded.timestamp) {\n if (this.paymentDecoded.num_msat && !this.paymentDecoded.num_satoshis) {\n this.paymentDecoded.num_satoshis = (+this.paymentDecoded.num_msat / 1000).toString();\n } else {\n this.paymentDecoded.num_satoshis = '0';\n }\n this.sendPayment();\n } else {\n this.resetData();\n }\n });\n }\n }\n\n sendPayment() {\n this.newlyAddedPayment = this.paymentDecoded.payment_hash || '';\n if (this.paymentDecoded.num_msat && !this.paymentDecoded.num_satoshis) {\n this.paymentDecoded.num_satoshis = (+this.paymentDecoded.num_msat / 1000).toString();\n }\n if (!this.paymentDecoded.num_satoshis || this.paymentDecoded.num_satoshis === '' || this.paymentDecoded.num_satoshis === '0') {\n const reorderedPaymentDecoded = [\n [{ key: 'payment_hash', value: this.paymentDecoded.payment_hash, title: 'Payment Hash', width: 100 }],\n [{ key: 'destination', value: this.paymentDecoded.destination, title: 'Destination', width: 100 }],\n [{ key: 'description', value: this.paymentDecoded.description, title: 'Description', width: 100 }],\n [{ key: 'timestamp', value: this.paymentDecoded.timestamp, title: 'Creation Date', width: 40, type: DataTypeEnum.DATE_TIME },\n { key: 'expiry', value: this.paymentDecoded.expiry, title: 'Expiry', width: 30, type: DataTypeEnum.NUMBER },\n { key: 'cltv_expiry', value: this.paymentDecoded.cltv_expiry, title: 'CLTV Expiry', width: 30 }]\n ];\n const titleMsg = 'It is a zero amount invoice. Enter the amount (Sats) to pay.';\n this.store.dispatch(openConfirmation({\n payload: {\n data: {\n type: AlertTypeEnum.CONFIRM,\n alertTitle: 'Enter Amount and Confirm Send Payment',\n titleMessage: titleMsg,\n message: reorderedPaymentDecoded,\n noBtnText: 'Cancel',\n yesBtnText: 'Send Payment',\n flgShowInput: true,\n getInputs: [\n { placeholder: 'Amount (Sats)', inputType: DataTypeEnum.NUMBER, inputValue: '', width: 30 }\n ]\n }\n }\n }));\n this.rtlEffects.closeConfirm.\n pipe(take(1)).\n subscribe((confirmRes) => {\n if (confirmRes) {\n this.paymentDecoded.num_satoshis = confirmRes[0].inputValue;\n this.store.dispatch(sendPayment({ payload: { uiMessage: UI_MESSAGES.SEND_PAYMENT, paymentReq: this.paymentRequest, paymentAmount: confirmRes[0].inputValue, fromDialog: false } }));\n this.resetData();\n }\n });\n } else {\n const reorderedPaymentDecoded = [\n [{ key: 'payment_hash', value: this.paymentDecoded.payment_hash, title: 'Payment Hash', width: 100 }],\n [{ key: 'destination', value: this.paymentDecoded.destination, title: 'Destination', width: 100 }],\n [{ key: 'description', value: this.paymentDecoded.description, title: 'Description', width: 100 }],\n [{ key: 'timestamp', value: this.paymentDecoded.timestamp, title: 'Creation Date', width: 50, type: DataTypeEnum.DATE_TIME },\n { key: 'num_satoshis', value: this.paymentDecoded.num_satoshis, title: 'Amount (Sats)', width: 50, type: DataTypeEnum.NUMBER }],\n [{ key: 'expiry', value: this.paymentDecoded.expiry, title: 'Expiry', width: 50, type: DataTypeEnum.NUMBER },\n { key: 'cltv_expiry', value: this.paymentDecoded.cltv_expiry, title: 'CLTV Expiry', width: 50 }]\n ];\n this.store.dispatch(openConfirmation({\n payload: {\n data: {\n type: AlertTypeEnum.CONFIRM,\n alertTitle: 'Confirm Send Payment',\n noBtnText: 'Cancel',\n yesBtnText: 'Send Payment',\n message: reorderedPaymentDecoded\n }\n }\n }));\n this.rtlEffects.closeConfirm.\n pipe(take(1)).\n subscribe((confirmRes) => {\n if (confirmRes) {\n this.store.dispatch(sendPayment({ payload: { uiMessage: UI_MESSAGES.SEND_PAYMENT, paymentReq: this.paymentRequest, fromDialog: false } }));\n this.resetData();\n }\n });\n }\n }\n\n openSendPaymentModal() {\n this.store.dispatch(openAlert({\n payload: {\n data: {\n component: LightningSendPaymentsComponent\n }\n }\n }));\n }\n\n onPaymentRequestEntry(event: any) {\n this.paymentRequest = event;\n this.paymentDecodedHint = '';\n if (this.paymentRequest && this.paymentRequest.length > 100) {\n this.dataService.decodePayment(this.paymentRequest, false).\n pipe(take(1)).subscribe((decodedPayment: PayRequest) => {\n this.paymentDecoded = decodedPayment;\n if (this.paymentDecoded.num_msat && !this.paymentDecoded.num_satoshis) {\n this.paymentDecoded.num_satoshis = (+this.paymentDecoded.num_msat / 1000).toString();\n }\n if (this.paymentDecoded.num_satoshis) {\n if (this.selNode && this.selNode.fiatConversion) {\n this.commonService.convertCurrency(+this.paymentDecoded.num_satoshis, CurrencyUnitEnum.SATS, CurrencyUnitEnum.OTHER, (this.selNode.currencyUnits && this.selNode.currencyUnits.length > 2 ? this.selNode.currencyUnits[2] : ''), this.selNode.fiatConversion).\n pipe(takeUntil(this.unSubs[6])).\n subscribe({\n next: (data) => {\n this.paymentDecodedHint = 'Sending: ' + this.decimalPipe.transform(this.paymentDecoded.num_satoshis ? this.paymentDecoded.num_satoshis : 0) + ' Sats (' + data.symbol +\n this.decimalPipe.transform((data.OTHER ? data.OTHER : 0), CURRENCY_UNIT_FORMATS.OTHER) + ') | Memo: ' + this.paymentDecoded.description;\n }, error: (error) => {\n this.paymentDecodedHint = 'Sending: ' + this.decimalPipe.transform(this.paymentDecoded.num_satoshis ? this.paymentDecoded.num_satoshis : 0) + ' Sats | Memo: ' + this.paymentDecoded.description + '. Unable to convert currency.';\n }\n });\n } else {\n this.paymentDecodedHint = 'Sending: ' + this.decimalPipe.transform(this.paymentDecoded.num_satoshis ? this.paymentDecoded.num_satoshis : 0) + ' Sats | Memo: ' + this.paymentDecoded.description;\n }\n } else {\n this.paymentDecodedHint = 'Zero Amount Invoice | Memo: ' + this.paymentDecoded.description;\n }\n });\n }\n }\n\n onPageChange(event: any) {\n let reverse = true;\n let index_offset = this.lastOffset;\n this.pageSize = event.pageSize;\n if (event.pageIndex === 0) {\n reverse = true;\n index_offset = 0;\n } else if (event.pageIndex < event.previousPageIndex) {\n reverse = false;\n index_offset = this.lastOffset;\n } else if (event.pageIndex > event.previousPageIndex && (event.length > ((event.pageIndex + 1) * event.pageSize))) {\n reverse = true;\n index_offset = this.firstOffset;\n } else if (event.length <= ((event.pageIndex + 1) * event.pageSize)) {\n reverse = false;\n index_offset = 0;\n }\n const starting_index = event.pageIndex * this.pageSize;\n this.loadPaymentsTable(this.paymentJSONArr.slice(starting_index, (starting_index + this.pageSize)));\n // this.store.dispatch(fetchPayments({ payload: { max_payments: page_size, index_offset: index_offset, reversed: reverse } }));\n }\n\n is_group(index: number, payment: Payment) {\n return payment.htlcs && payment.htlcs.length > 1;\n }\n\n resetData() {\n this.paymentDecoded = {};\n this.paymentRequest = '';\n this.form.resetForm();\n }\n\n getHopDetails(currentHop: Hop) {\n const self = this;\n return new Promise((resolve, reject) => {\n const peerFound = self.peers.find((peer) => peer.pub_key === currentHop.pub_key);\n if (peerFound && peerFound.alias) {\n resolve('<pre>Channel: ' + peerFound.alias.padEnd(20) + '&Tab;&Tab;&Tab;Amount (Sats): ' + self.decimalPipe.transform(currentHop.amt_to_forward) + '</pre>');\n } else {\n self.dataService.getAliasesFromPubkeys((currentHop.pub_key || ''), false).\n pipe(takeUntil(self.unSubs[7])).\n subscribe({\n next: (res: any) => resolve('<pre>Channel: ' + (res.node && res.node.alias ? res.node.alias.padEnd(20) : (currentHop.pub_key?.substring(0, 17) + '...')) + '&Tab;&Tab;&Tab;Amount (Sats): ' + self.decimalPipe.transform(currentHop.amt_to_forward) + '</pre>'),\n error: (error) => resolve('<pre>Channel: ' + (currentHop.pub_key ? (currentHop.pub_key?.substring(0, 17) + '...') : '') + '&Tab;&Tab;&Tab;Amount (Sats): ' + self.decimalPipe.transform(currentHop.amt_to_forward) + '</pre>')\n });\n }\n });\n }\n\n onHTLCClick(selHtlc: PaymentHTLC, selPayment: Payment) {\n if (selPayment.payment_request && selPayment.payment_request.trim() !== '') {\n this.dataService.decodePayment(selPayment.payment_request, false).\n pipe(take(1)).subscribe({\n next: (decodedPayment: PayRequest) => {\n setTimeout(() => {\n this.showHTLCView(selHtlc, selPayment, decodedPayment);\n }, 0);\n }, error: (error) => {\n this.showHTLCView(selHtlc, selPayment);\n }\n });\n } else {\n this.showHTLCView(selHtlc, selPayment);\n }\n }\n\n showHTLCView(selHtlc: PaymentHTLC, selPayment: Payment, decodedPayment?: PayRequest) {\n if (selHtlc.route && selHtlc.route.hops && selHtlc.route.hops.length) {\n Promise.all(selHtlc.route.hops.map((hop) => this.getHopDetails(hop))).then((detailsAll: any) => {\n this.store.dispatch(openAlert({\n payload: {\n data: {\n type: AlertTypeEnum.INFORMATION,\n alertTitle: 'HTLC Information',\n message: this.prepareData(selHtlc, selPayment, decodedPayment, detailsAll),\n scrollable: selHtlc.route && selHtlc.route.hops && selHtlc.route.hops.length > 1\n }\n }\n }));\n });\n } else {\n this.store.dispatch(openAlert({\n payload: {\n data: {\n type: AlertTypeEnum.INFORMATION,\n alertTitle: 'HTLC Information',\n message: this.prepareData(selHtlc, selPayment, decodedPayment, []),\n scrollable: selHtlc.route && selHtlc.route.hops && selHtlc.route.hops.length > 1\n }\n }\n }));\n }\n }\n\n prepareData(selHtlc: PaymentHTLC, selPayment: Payment, decodedPayment?: PayRequest, hopsDetails?: any) {\n const modifiedData = [\n [{ key: 'payment_hash', value: selPayment.payment_hash, title: 'Payment Hash', width: 100, type: DataTypeEnum.STRING }],\n [{ key: 'preimage', value: selHtlc.preimage, title: 'Preimage', width: 100, type: DataTypeEnum.STRING }],\n [{ key: 'payment_request', value: selPayment.payment_request, title: 'Payment Request', width: 100, type: DataTypeEnum.STRING }],\n [{ key: 'status', value: selHtlc.status, title: 'Status', width: 33, type: DataTypeEnum.STRING },\n { key: 'attempt_time_ns', value: +(selHtlc.attempt_time_ns || 0) / 1000000000, title: 'Attempt Time', width: 33, type: DataTypeEnum.DATE_TIME },\n { key: 'resolve_time_ns', value: +(selHtlc.resolve_time_ns || 0) / 1000000000, title: 'Resolve Time', width: 34, type: DataTypeEnum.DATE_TIME }],\n [{ key: 'total_amt', value: selHtlc.route?.total_amt, title: 'Amount (Sats)', width: 33, type: DataTypeEnum.NUMBER },\n { key: 'total_fees', value: selHtlc.route?.total_fees, title: 'Fee (Sats)', width: 33, type: DataTypeEnum.NUMBER },\n { key: 'total_time_lock', value: selHtlc.route?.total_time_lock, title: 'Total Time Lock', width: 34, type: DataTypeEnum.NUMBER }],\n [{ key: 'hops', value: hopsDetails, title: 'Hops', width: 100, type: DataTypeEnum.ARRAY }]\n ];\n if (decodedPayment && decodedPayment.description && decodedPayment.description !== '') {\n modifiedData.splice(3, 0, [{ key: 'description', value: decodedPayment.description, title: 'Description', width: 100, type: DataTypeEnum.STRING }]);\n }\n return modifiedData;\n }\n\n onPaymentClick(selPayment: Payment) {\n if (selPayment.htlcs && selPayment.htlcs[0] && selPayment.htlcs[0].route && selPayment.htlcs[0].route.hops && selPayment.htlcs[0].route.hops.length > 0) {\n const nodePubkeys = selPayment.htlcs[0].route.hops?.reduce((pubkeys, hop) => (hop.pub_key && pubkeys === '' ? hop.pub_key : pubkeys + ',' + hop.pub_key), '');\n this.dataService.getAliasesFromPubkeys(nodePubkeys, true).pipe(takeUntil(this.unSubs[8])).\n subscribe((nodes: any) => {\n this.showPaymentView(selPayment, nodes?.reduce((pathAliases, node) => (pathAliases === '' ? node : pathAliases + '\\n' + node), ''));\n });\n } else {\n this.showPaymentView(selPayment, '');\n }\n }\n\n showPaymentView(selPayment: Payment, pathAliases: string) {\n const reorderedPayment = [\n [{ key: 'payment_hash', value: selPayment.payment_hash, title: 'Payment Hash', width: 100, type: DataTypeEnum.STRING }],\n [{ key: 'payment_preimage', value: selPayment.payment_preimage, title: 'Payment Preimage', width: 100, type: DataTypeEnum.STRING }],\n [{ key: 'payment_request', value: selPayment.payment_request, title: 'Payment Request', width: 100, type: DataTypeEnum.STRING }],\n [{ key: 'status', value: selPayment.status, title: 'Status', width: 50, type: DataTypeEnum.STRING },\n { key: 'creation_date', value: selPayment.creation_date, title: 'Creation Date', width: 50, type: DataTypeEnum.DATE_TIME }],\n [{ key: 'value_msat', value: selPayment.value_msat, title: 'Value (mSats)', width: 50, type: DataTypeEnum.NUMBER },\n { key: 'fee_msat', value: selPayment.fee_msat, title: 'Fee (mSats)', width: 50, type: DataTypeEnum.NUMBER }],\n [{ key: 'path', value: pathAliases, title: 'Path', width: 100, type: DataTypeEnum.STRING }]\n ];\n if (selPayment.payment_request && selPayment.payment_request.trim() !== '') {\n this.dataService.decodePayment(selPayment.payment_request, false).\n pipe(take(1)).subscribe((decodedPayment: PayRequest) => {\n if (decodedPayment && decodedPayment.description && decodedPayment.description !== '') {\n reorderedPayment.splice(3, 0, [{ key: 'description', value: decodedPayment.description, title: 'Description', width: 100, type: DataTypeEnum.STRING }]);\n }\n setTimeout(() => {\n this.openPaymentAlert(reorderedPayment, !!(selPayment.htlcs && selPayment.htlcs[0] && selPayment.htlcs[0].route && selPayment.htlcs[0].route.hops && selPayment.htlcs[0].route.hops.length > 1));\n }, 0);\n });\n } else {\n this.openPaymentAlert(reorderedPayment, false);\n }\n }\n\n openPaymentAlert(data: any, shouldScroll: boolean) {\n this.store.dispatch(openAlert({\n payload: {\n data: {\n type: AlertTypeEnum.INFORMATION,\n alertTitle: 'Payment Information',\n message: data,\n scrollable: shouldScroll\n }\n }\n }));\n }\n\n applyFilter() {\n this.payments.filter = this.selFilter.trim().toLowerCase();\n }\n\n getLabel(column: string) {\n const returnColumn: ColumnDefinition = this.nodePageDefs[this.PAGE_ID][this.tableSetting.tableId].allowedColumns.find((col) => col.column === column);\n return returnColumn ? returnColumn.label ? returnColumn.label : this.camelCaseWithReplace.transform(returnColumn.column, '_') : this.commonService.titleCase(column);\n }\n\n setFilterPredicate() {\n this.payments.filterPredicate = (rowData: Payment, fltr: string) => {\n let rowToFilter = '';\n switch (this.selFilterBy) {\n case 'all':\n rowToFilter = ((rowData.creation_date) ? this.datePipe.transform(new Date(rowData.creation_date * 1000), 'dd/MMM/y HH:mm')?.toLowerCase() : '') + JSON.stringify(rowData).toLowerCase();\n break;\n\n case 'status':\n case 'group_status':\n rowToFilter = rowData?.status === 'SUCCEEDED' ? 'succeeded' : 'failed';\n break;\n\n case 'creation_date':\n rowToFilter = this.datePipe.transform(new Date((rowData[this.selFilterBy] || 0) * 1000), 'dd/MMM/y HH:mm')?.toLowerCase() || '';\n break;\n\n case 'failure_reason':\n case 'group_failure_reason':\n rowToFilter = this.camelCaseWithReplace.transform((rowData.failure_reason || ''), 'failure_reason', '_').trim().toLowerCase();\n break;\n\n case 'hops':\n rowToFilter = rowData.htlcs && rowData.htlcs[0] && rowData.htlcs[0].route && rowData.htlcs[0].route.hops && rowData.htlcs[0].route.hops.length ? rowData.htlcs[0].route.hops.length.toString() : '0';\n break;\n\n default:\n rowToFilter = typeof rowData[this.selFilterBy] === 'undefined' ? '' : typeof rowData[this.selFilterBy] === 'string' ? rowData[this.selFilterBy].toLowerCase() : typeof rowData[this.selFilterBy] === 'boolean' ? (rowData[this.selFilterBy] ? 'yes' : 'no') : rowData[this.selFilterBy].toString();\n break;\n }\n return (this.selFilterBy === 'failure_reason' || this.selFilterBy === 'group_failure_reason') ? rowToFilter.indexOf(fltr) === 0 : rowToFilter.includes(fltr);\n };\n }\n\n loadPaymentsTable(payms) {\n this.payments = payms ? new MatTableDataSource<Payment>([...payms]) : new MatTableDataSource([]);\n this.payments.sortingDataAccessor = (data: any, sortHeaderId: string) => {\n switch (sortHeaderId) {\n case 'hops':\n return (data.htlcs.length && data.htlcs[0] && data.htlcs[0].route && data.htlcs[0].route.hops && data.htlcs[0].route.hops.length) ? data.htlcs[0].route.hops.length : 0;\n\n default:\n return (data[sortHeaderId] && isNaN(data[sortHeaderId])) ? data[sortHeaderId].toLocaleLowerCase() : data[sortHeaderId] ? +data[sortHeaderId] : null;\n }\n };\n this.payments.sort = this.sort;\n this.payments.sort?.sort({ id: this.tableSetting.sortBy, start: this.tableSetting.sortOrder, disableClear: true });\n this.setFilterPredicate();\n this.applyFilter();\n }\n\n onDownloadCSV() {\n if (this.payments.data && this.payments.data.length > 0) {\n const paymentsDataCopy = JSON.parse(JSON.stringify(this.payments.data));\n const paymentRequests = paymentsDataCopy?.reduce((paymentReqs, payment) => {\n if (payment.payment_request && payment.payment_request.trim() !== '') {\n paymentReqs = (paymentReqs === '') ? payment.payment_request : paymentReqs + ',' + payment.payment_request;\n }\n return paymentReqs;\n }, '');\n this.dataService.decodePayments(paymentRequests).\n pipe(takeUntil(this.unSubs[9])).\n subscribe((decodedPayments: PayRequest[]) => {\n let increament = 0;\n decodedPayments.forEach((decodedPayment, idx) => {\n if (decodedPayment) {\n while (paymentsDataCopy[idx + increament].payment_hash !== decodedPayment.payment_hash) {\n increament = increament + 1;\n }\n paymentsDataCopy[idx + increament].description = decodedPayment.description;\n }\n });\n const flattenedPayments = paymentsDataCopy?.reduce((acc, curr) => acc.concat(curr), []);\n this.commonService.downloadFile(flattenedPayments, 'Payments');\n });\n }\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between stretch\">\n <div>\n <h4 class=\"dashboard-info-title\">Alias</h4>\n <div class=\"overflow-wrap dashboard-info-value\">\n {{information?.alias}}\n <span *ngIf=\"!showColorFieldSeparately\" class=\"dashboard-node-dot dot\" [ngStyle]=\"{'backgroundColor': information?.color}\"></span>\n </div>\n </div>\n <div *ngIf=\"showColorFieldSeparately\">\n <h4 class=\"dashboard-info-title\">Color</h4>\n <div class=\"overflow-wrap dashboard-info-value\">\n <span class=\"dashboard-node-square\" [ngStyle]=\"{'backgroundColor': information?.color}\"></span>\n {{information?.color | uppercase}}\n </div>\n </div>\n <div>\n <h4 class=\"dashboard-info-title\">Implementation</h4>\n <div class=\"overflow-wrap dashboard-info-value\">{{(information?.lnImplementation || information?.version) ? information?.lnImplementation + ' ' + information?.version : ''}}</div>\n </div>\n <div>\n <h4 class=\"dashboard-info-title\">Chain</h4>\n <span *ngIf=\"information?.synced_to_chain\" class=\"dot green mr-1\" matTooltip=\"Synced to Chain\" matTooltipPosition=\"right\"></span>\n <span *ngIf=\"!information?.synced_to_chain\" class=\"dot red mr-1\" matTooltip=\"Not Synced to Chain\" matTooltipPosition=\"right\"></span>\n <span *ngFor=\"let chain of chains\" class=\"overflow-wrap dashboard-info-value\">{{chain}}</span>\n </div>\n</div>\n","import { Component, OnChanges, Input } from '@angular/core';\nimport { GetInfo } from '../../../shared/models/lndModels';\nimport { CommonService } from '../../../shared/services/common.service';\n\n@Component({\n selector: 'rtl-node-info',\n templateUrl: './node-info.component.html',\n styleUrls: ['./node-info.component.scss']\n})\nexport class NodeInfoComponent implements OnChanges {\n\n @Input() information: GetInfo;\n @Input() showColorFieldSeparately: boolean;\n public chains: Array<string> = [''];\n\n constructor(private commonService: CommonService) { }\n\n ngOnChanges() {\n if (this.information && this.information.chains && this.information.chains.length > 0) {\n this.chains = [''];\n this.information.chains.forEach((chain) => {\n this.chains.push(this.commonService.titleCase(chain.chain) + ' ' + this.commonService.titleCase(chain.network));\n });\n }\n }\n\n}\n","<div *ngIf=\"errorMessage === ' '; else errorBlock\" fxLayout=\"column\" fxFlex=\"100\"fxLayoutAlign=\"space-between stretch\">\n <div>\n <h4 fxLayoutAlign=\"start\" class=\"dashboard-info-title\">Lightning</h4>\n <div class=\"overflow-wrap dashboard-info-value\">{{balances?.lightning | number}} Sats</div>\n <mat-progress-bar class=\"dashboard-progress-bar\" mode=\"determinate\" value=\"{{balances?.lightning/balances?.total*100}}\"></mat-progress-bar>\n </div>\n <div>\n <h4 fxLayoutAlign=\"start\" class=\"dashboard-info-title\">On-chain</h4>\n <div class=\"overflow-wrap dashboard-info-value\">{{balances?.onchain | number}} Sats</div>\n <mat-progress-bar class=\"dashboard-progress-bar\" mode=\"determinate\" value=\"{{balances?.onchain/balances?.total*100}}\"></mat-progress-bar>\n </div>\n <div>\n <h4 fxLayoutAlign=\"start\" class=\"dashboard-info-title\">Total</h4>\n <div class=\"overflow-wrap dashboard-info-value\">{{balances?.total | number}} Sats</div>\n </div>\n</div>\n<ng-template #errorBlock>\n <div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between\" class=\"p-2\">\n <p>{{errorMessage}}</p>\n </div>\n</ng-template>\n","import { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'rtl-balances-info',\n templateUrl: './balances-info.component.html',\n styleUrls: ['./balances-info.component.scss']\n})\nexport class BalancesInfoComponent {\n\n @Input() balances = { onchain: 0, lightning: 0, total: 0 };\n @Input() errorMessage: string;\n\n constructor() {}\n\n}\n","<div *ngIf=\"errorMessage?.trim() === ''; else errorBlock\" fxLayout=\"row\" fxFlex=\"100\" fxLayoutAlign=\"start stretch\">\n <div fxLayout=\"column\" fxFlex=\"50\" fxLayoutAlign=\"space-between stretch\">\n <div>\n <h4 fxLayoutAlign=\"start\" class=\"dashboard-info-title\">Daily</h4>\n <div class=\"overflow-wrap dashboard-info-value\">{{fees?.day_fee_sum | number}} Sats</div>\n </div>\n <div>\n <h4 fxLayoutAlign=\"start\" class=\"dashboard-info-title\">Weekly</h4>\n <div class=\"overflow-wrap dashboard-info-value\">{{fees?.week_fee_sum | number}} Sats</div>\n </div>\n <div>\n <h4 fxLayoutAlign=\"start\" class=\"dashboard-info-title\">Monthly</h4>\n <div class=\"overflow-wrap dashboard-info-value\">{{fees?.month_fee_sum | number}} Sats</div>\n </div>\n <div fxFlex=\"20\">\n <h4 class=\"dashboard-info-title\"></h4>\n <span class=\"overflow-wrap dashboard-info-value\"></span>\n </div> \n </div>\n <div fxLayout=\"column\" fxFlex=\"50\" fxLayoutAlign=\"space-between stretch\">\n <div>\n <h4 fxLayoutAlign=\"start\" class=\"dashboard-info-title\">Transactions</h4>\n <div class=\"overflow-wrap dashboard-info-value\">{{fees?.daily_tx_count | number}}</div>\n </div>\n <div>\n <h4 fxLayoutAlign=\"start\" class=\"dashboard-info-title\">Transactions</h4>\n <div class=\"overflow-wrap dashboard-info-value\">{{fees?.weekly_tx_count | number}}</div>\n </div>\n <div>\n <h4 fxLayoutAlign=\"start\" class=\"dashboard-info-title\">Transactions</h4>\n <div class=\"overflow-wrap dashboard-info-value\">{{fees?.monthly_tx_count | number}}</div>\n </div>\n <div fxFlex=\"20\">\n <h4 class=\"dashboard-info-title\"></h4>\n <span class=\"overflow-wrap dashboard-info-value\"></span>\n </div>\n </div>\n</div>\n<ng-template #errorBlock>\n <div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between\" class=\"p-2\">\n <p>{{errorMessage}}</p>\n </div>\n</ng-template>\n","import { Component, OnChanges, Input } from '@angular/core';\nimport { Fees } from '../../../shared/models/lndModels';\n\n@Component({\n selector: 'rtl-fee-info',\n templateUrl: './fee-info.component.html',\n styleUrls: ['./fee-info.component.scss']\n})\nexport class FeeInfoComponent implements OnChanges {\n\n @Input() fees: Fees;\n @Input() errorMessage: string;\n totalFees = [{ name: 'Monthly', value: 0 }, { name: 'Weekly', value: 0 }, { name: 'Daily', value: 0 }];\n maxFeeValue = 100;\n\n constructor() { }\n\n ngOnChanges() {\n if (this.fees.month_fee_sum) {\n this.totalFees = [{ name: 'Monthly', value: this.fees.month_fee_sum }, { name: 'Weekly', value: (this.fees.week_fee_sum || 0) }, { name: 'Daily ', value: (this.fees.day_fee_sum || 0) }];\n const e = Math.ceil(Math.log(this.fees.month_fee_sum + 1) / Math.LN10);\n const m = 10 ** (e - 1);\n this.maxFeeValue = (Math.ceil(this.fees.month_fee_sum / m) * m) / 5 || 100;\n Object.assign(this, this.totalFees);\n } else {\n this.totalFees = [{ name: 'Monthly', value: 0 }, { name: 'Weekly', value: 0 }, { name: 'Daily', value: 0 }];\n this.maxFeeValue = 100;\n Object.assign(this, this.totalFees);\n }\n }\n\n}\n","<div *ngIf=\"errorMessage === ' '; else errorBlock\" fxLayout=\"row\" fxFlex=\"100\" fxLayoutAlign=\"start stretch\">\n <div fxLayout=\"column\" fxFlex=\"50\" fxLayoutAlign=\"space-between stretch\">\n <div>\n <h4 fxLayoutAlign=\"start\" class=\"dashboard-info-title\">Active</h4>\n <div class=\"overflow-wrap dashboard-info-value\"><span class=\"dot tiny-dot green\"></span>{{(channelsStatus?.active?.num_channels || 0) | number}}</div>\n </div>\n <div>\n <h4 fxLayoutAlign=\"start\" class=\"dashboard-info-title\">Pending</h4>\n <div class=\"overflow-wrap dashboard-info-value\"><span class=\"dot tiny-dot yellow\"></span>{{(channelsStatus?.pending?.num_channels || 0) | number}}</div>\n </div>\n <div>\n <h4 fxLayoutAlign=\"start\" class=\"dashboard-info-title\">Inactive</h4>\n <div class=\"overflow-wrap dashboard-info-value\"><span class=\"dot tiny-dot grey\"></span>{{(channelsStatus?.inactive?.num_channels || 0) | number}}</div>\n </div>\n <div>\n <h4 fxLayoutAlign=\"start\" class=\"dashboard-info-title\">Closing</h4>\n <div class=\"overflow-wrap dashboard-info-value\"><span class=\"dot tiny-dot red\"></span>{{(channelsStatus?.closing?.num_channels || 0) | number}}</div>\n </div>\n </div>\n <div fxLayout=\"column\" fxFlex=\"50\" fxLayoutAlign=\"space-between stretch\">\n <div>\n <h4 fxLayoutAlign=\"start\" class=\"dashboard-info-title\">Capacity</h4>\n <div class=\"overflow-wrap dashboard-info-value\">{{(channelsStatus?.active?.capacity || 0) | number}} Sats</div>\n </div>\n <div>\n <h4 fxLayoutAlign=\"start\" class=\"dashboard-info-title\">Capacity</h4>\n <div class=\"overflow-wrap dashboard-info-value\">{{(channelsStatus?.pending?.capacity || 0) | number}} Sats</div>\n </div>\n <div>\n <h4 fxLayoutAlign=\"start\" class=\"dashboard-info-title\">Capacity</h4>\n <div class=\"overflow-wrap dashboard-info-value\">{{(channelsStatus?.inactive?.capacity || 0) | number}} Sats</div>\n </div>\n <div>\n <h4 fxLayoutAlign=\"start\" class=\"dashboard-info-title\">Capacity</h4>\n <div class=\"overflow-wrap dashboard-info-value\">{{(channelsStatus?.closing?.capacity || 0) | number}} Sats</div>\n </div>\n </div>\n</div>\n<ng-template #errorBlock>\n <div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between\" class=\"p-2\">\n <p>{{errorMessage}}</p>\n </div>\n</ng-template>\n","import { Component, Input } from '@angular/core';\nimport { ChannelsStatus } from '../../../shared/models/lndModels';\n\n@Component({\n selector: 'rtl-channel-status-info',\n templateUrl: './channel-status-info.component.html',\n styleUrls: ['./channel-status-info.component.scss']\n})\nexport class ChannelStatusInfoComponent {\n\n @Input() channelsStatus: ChannelsStatus = {};\n @Input() errorMessage: string;\n\n constructor() {}\n\n}\n","<div *ngIf=\"errorMessage?.trim() === ''; else errorBlock\" fxLayout=\"column\" fxLayoutAlign=\"space-between stretch\"fxFlex=\"100\">\n <div fxLayout=\"column\" fxFlex=\"9\" fxLayoutAlign=\"end start\">\n <span class=\"dashboard-capacity-header this-channel-capacity\">Total Capacity</span>\n <div fxLayout=\"row\" fxLayoutAlign=\"space-between start\" class=\"w-100\">\n <mat-hint fxFlex=\"40\" fxLayoutAlign=\"start center\" class=\"font-size-90\"><strong class=\"font-weight-900 mr-5px\">Local:</strong>{{channelBalances?.localBalance || 0 | number}} Sats</mat-hint>\n <mat-hint fxFlex=\"20\" fxLayoutAlign=\"center center\" class=\"font-size-90\">\n <fa-icon class=\"mr-3px\" matTooltip=\"Balance Score\" [icon]=\"faBalanceScale\"></fa-icon>\n ({{channelBalances?.balancedness || 0 | number}})\n </mat-hint>\n <mat-hint fxFlex=\"40\" fxLayoutAlign=\"end center\" class=\"font-size-90\"><strong class=\"font-weight-900 mr-5px\">Remote:</strong>{{channelBalances?.remoteBalance || 0 | number}} Sats</mat-hint>\n </div>\n <mat-progress-bar class=\"dashboard-progress-bar this-channel-bar\" mode=\"determinate\" color=\"accent\" value=\"{{channelBalances?.localBalance && channelBalances?.localBalance > 0 ? ((+channelBalances?.localBalance/((+channelBalances?.localBalance)+(+channelBalances?.remoteBalance)))*100) : 0}}\"></mat-progress-bar>\n </div>\n <div fxLayout=\"column\" fxFlex=\"3\" fxLayoutAlign=\"end stretch\"><mat-divider class=\"dashboard-divider\"></mat-divider></div>\n <div class=\"channels-capacity-scroll\" [perfectScrollbar]>\n <div *ngIf=\"allChannels && allChannels.length > 0; else noChannelBlock\" fxLayout=\"column\"fxFlex=\"100\">\n <div *ngFor=\"let channel of allChannels\" class=\"mt-2\">\n <a class=\"dashboard-capacity-header\" [routerLink]=\"['../connections/channels/open']\" [state]=\"{filter: channel.chan_id}\" matTooltip=\"{{channel.remote_alias || channel.remote_pubkey}}\" matTooltipDisabled=\"{{(channel.remote_alias || channel.remote_pubkey).length < 26}}\">\n {{(channel.remote_alias || channel.remote_pubkey) | slice:0:24}}{{(channel.remote_alias || channel.remote_pubkey).length > 25 ? '...' : ''}}\n </a>\n <div fxLayout=\"row\" fxLayoutAlign=\"space-between start\" class=\"w-100\">\n <mat-hint fxFlex=\"40\" fxLayoutAlign=\"start center\" class=\"font-size-90 color-primary\"><strong class=\"font-weight-900 mr-5px\">Local:</strong>{{channel.local_balance || 0 | number}} Sats</mat-hint>\n <mat-hint fxFlex=\"20\" fxLayoutAlign=\"center center\" class=\"font-size-90 color-primary\">\n <fa-icon class=\"color-primary mr-3px\" matTooltip=\"Balance Score\" [icon]=\"faBalanceScale\"></fa-icon>\n ({{channel.balancedness || 0 | number}})\n </mat-hint>\n <mat-hint fxFlex=\"40\" fxLayoutAlign=\"end center\" class=\"font-size-90 color-primary\"><strong class=\"font-weight-900 mr-5px\">Remote:</strong>{{channel.remote_balance || 0 | number}} Sats</mat-hint>\n </div>\n <mat-progress-bar class=\"dashboard-progress-bar\" mode=\"determinate\" value=\"{{channel.local_balance && channel.local_balance > 0 ? ((+channel.local_balance/((+channel.local_balance)+(+channel.remote_balance)))*100) : 0}}\"></mat-progress-bar>\n </div>\n </div>\n </div>\n</div>\n<ng-template #noChannelBlock>\n <div fxLayout=\"row\" fxFlex=\"100\" fxLayoutAlign=\"space-between start\" class=\"mt-1 w-100\">\n No channels available.\n <button mat-stroked-button color=\"primary\" tabindex=\"1\" (click)=\"goToChannels()\">Open Channel</button>\n </div>\n</ng-template>\n<ng-template #errorBlock>\n <div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between\" class=\"p-2\">\n <p>{{errorMessage}}</p>\n </div>\n</ng-template>\n","import { Component, Input } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { faBalanceScale, faDumbbell } from '@fortawesome/free-solid-svg-icons';\n\nimport { Channel } from '../../../shared/models/lndModels';\n\n@Component({\n selector: 'rtl-channel-capacity-info',\n templateUrl: './channel-capacity-info.component.html',\n styleUrls: ['./channel-capacity-info.component.scss']\n})\nexport class ChannelCapacityInfoComponent {\n\n public faBalanceScale = faBalanceScale;\n public faDumbbell = faDumbbell;\n @Input() channelBalances: {localBalance: number, remoteBalance: number, balancedness: number};\n @Input() allChannels: Channel[];\n @Input() sortBy = 'Balance Score';\n @Input() errorMessage: string;\n\n constructor(private router: Router) {}\n\n goToChannels() {\n this.router.navigateByUrl('/lnd/connections');\n }\n\n}\n","<div *ngIf=\"errorMessage?.trim() === ''; else errorBlock\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\" fxFlex=\"100\" [ngClass]=\"{'mb-4': screenSize === screenSizeEnum.XS || screenSize === screenSizeEnum.SM, 'mb-2': screenSize === screenSizeEnum.MD, 'mb-1': screenSize === screenSizeEnum.LG || screenSize === screenSizeEnum.XL}\">\n <div fxLayout=\"column\" fxFlex=\"9\" fxLayoutAlign=\"end start\">\n <span class=\"dashboard-capacity-header this-channel-capacity\">Total Capacity</span>\n <mat-hint class=\"font-size-90\">{{totalLiquidity | number}} Sats</mat-hint>\n <mat-progress-bar class=\"dashboard-progress-bar this-channel-bar\" mode=\"determinate\" color=\"accent\" value=\"100\"></mat-progress-bar>\n </div>\n <div fxLayout=\"column\" fxFlex=\"3\" fxLayoutAlign=\"end stretch\"><mat-divider class=\"dashboard-divider\"></mat-divider></div>\n <div *ngIf=\"allChannels && allChannels.length > 0; else noChannelBlock\"[perfectScrollbar]>\n <div *ngFor=\"let channel of allChannels\" fxLayout=\"column\">\n <a class=\"dashboard-capacity-header mt-2\" [routerLink]=\"['../connections/channels/open']\" [state]=\"{filter: channel.chan_id}\" matTooltip=\"{{channel.remote_alias || channel.remote_pubkey}}\" matTooltipDisabled=\"{{(channel.remote_alias || channel.remote_pubkey).length < 26}}\">\n {{(channel.remote_alias || channel.remote_pubkey) | slice:0:24}}{{(channel.remote_alias || channel.remote_pubkey).length > 25 ? '...' : ''}}\n </a>\n <div fxLayout=\"row\" fxFlex=\"100\" fxLayoutAlign=\"space-between start\">\n <mat-hint *ngIf=\"direction === 'In'\" class=\"font-size-90 color-primary\"><strong class=\"font-weight-900 mr-5px\">Capacity: </strong>{{channel.remote_balance || 0 | number}} Sats</mat-hint>\n <div *ngIf=\"direction === 'Out'\" fxLayout=\"row\" fxFlex=\"100\" fxLayoutAlign=\"start center\">\n <mat-hint fxFlex=\"85\" fxLayoutAlign=\"start start\" class=\"font-size-90 color-primary\"><strong class=\"font-weight-900 mr-5px\">Capacity: </strong>{{channel.local_balance || 0 | number}} Sats</mat-hint>\n <button *ngIf=\"showLoop\" fxFlex=\"15\" fxLayoutAlign=\"end start\" class=\"button-link-dashboard\" color=\"primary\" mat-button aria-label=\"Loop Out\" (click)=\"onLoopOut(channel)\">Loop Out</button>\n </div>\n </div>\n <mat-progress-bar *ngIf=\"direction === 'In'\" class=\"dashboard-progress-bar\" mode=\"determinate\" value=\"{{(totalLiquidity > 0) ? ((+channel.remote_balance || 0)/(totalLiquidity) * 100) : 0}}\"></mat-progress-bar>\n <mat-progress-bar *ngIf=\"direction === 'Out'\" class=\"dashboard-progress-bar\" mode=\"determinate\" value=\"{{(totalLiquidity > 0) ? ((+channel.local_balance || 0)/(totalLiquidity) * 100) : 0}}\"></mat-progress-bar>\n </div>\n </div>\n</div>\n<ng-template #noChannelBlock>\n <div fxLayout=\"row\" fxFlex=\"100\" fxLayoutAlign=\"space-between start\" class=\"mt-1\">\n No channels available.\n <button *ngIf=\"direction === 'Out'\" mat-stroked-button color=\"primary\" tabindex=\"1\" (click)=\"goToChannels()\">Open Channel</button>\n </div>\n</ng-template>\n<ng-template #errorBlock>\n <div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between\" class=\"p-2\">\n <p>{{errorMessage}}</p>\n </div>\n</ng-template>\n","import { Component, Input, OnInit, OnDestroy } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\n\nimport { ScreenSizeEnum, LoopTypeEnum } from '../../../shared/services/consts-enums-functions';\nimport { Channel } from '../../../shared/models/lndModels';\nimport { LoopModalComponent } from '../../../shared/components/ln-services/loop/loop-modal/loop-modal.component';\nimport { LoopService } from '../../../shared/services/loop.service';\nimport { CommonService } from '../../../shared/services/common.service';\n\nimport { RTLState } from '../../../store/rtl.state';\nimport { openAlert } from '../../../store/rtl.actions';\nimport { SelNodeChild } from '../../../shared/models/RTLconfig';\nimport { lndNodeSettings } from '../../store/lnd.selector';\n\n@Component({\n selector: 'rtl-channel-liquidity-info',\n templateUrl: './channel-liquidity-info.component.html',\n styleUrls: ['./channel-liquidity-info.component.scss']\n})\nexport class ChannelLiquidityInfoComponent implements OnInit, OnDestroy {\n\n @Input() direction: string;\n @Input() totalLiquidity: number;\n @Input() allChannels: Channel[];\n @Input() errorMessage: string;\n public showLoop: boolean;\n private targetConf = 6;\n public screenSize = '';\n public screenSizeEnum = ScreenSizeEnum;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject()];\n\n constructor(private router: Router, private loopService: LoopService, private commonService: CommonService, private store: Store<RTLState>) { }\n\n ngOnInit() {\n this.screenSize = this.commonService.getScreenSize();\n this.store.select(lndNodeSettings).pipe(takeUntil(this.unSubs[0])).subscribe((nodeSettings: SelNodeChild | null) => {\n this.showLoop = !!((nodeSettings?.swapServerUrl && nodeSettings.swapServerUrl.trim() !== ''));\n });\n }\n\n goToChannels() {\n this.router.navigateByUrl('/lnd/connections');\n }\n\n onLoopOut(channel: Channel) {\n this.loopService.getLoopOutTermsAndQuotes(this.targetConf).\n pipe(takeUntil(this.unSubs[1])).\n subscribe((response) => {\n this.store.dispatch(openAlert({\n payload: {\n minHeight: '56rem', data: {\n channel: channel,\n minQuote: response[0],\n maxQuote: response[1],\n direction: LoopTypeEnum.LOOP_OUT,\n component: LoopModalComponent\n }\n }\n }));\n });\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div *ngIf=\"selNode?.userPersona === userPersonaEnum.OPERATOR; else merchantDashboard\"fxLayout=\"column\">\n <div fxLayout=\"row\" fxLayoutAlign=\"start end\" class=\"page-title-container mb-2\">\n <fa-icon class=\"page-title-img mr-1\" [icon]=\"apiCallStatusNodeInfo.status === apiCallStatusEnum.ERROR ? faFrown : faSmile\"></fa-icon>\n <span class=\"page-title\">{{apiCallStatusNodeInfo.status === apiCallStatusEnum.COMPLETED ? 'Welcome ' + information.alias + '! Your node is up and running.' : apiCallStatusNodeInfo.status === apiCallStatusEnum.INITIATED ? 'Wait! Getting your node information...' : 'Error! Please check the server connection.'}}</span>\n </div>\n <mat-grid-list cols=\"10\" gutterSize=\"20px\" [rowHeight]=\"operatorCardHeight\">\n <mat-grid-tile *ngFor=\"let card of operatorCards\" fxFlex=\"100\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\" [colspan]=\"card.cols\" [rowspan]=\"card.rows\">\n <mat-card fxFlex=\"100\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\" class=\"h-100 dashboard-card\">\n <mat-card-header>\n <mat-card-title fxLayoutAlign=\"space-between center\">\n <div>\n <fa-icon class=\"mr-1\" [icon]=\"card.icon\"></fa-icon>\n <span>{{card.title}}</span>\n </div>\n <div>\n <button *ngIf=\"card.links[0]\" mat-icon-button class=\"more-button\" aria-label=\"Toggle menu\" [matMenuTriggerFor]=\"menuOperator\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menuOperator=\"matMenu\" class=\"dashboard-vert-menu\" xPosition=\"before\">\n <button *ngFor=\"let goToOption of card.goToOptions; index as i\" mat-menu-item (click)=\"onNavigateTo(card.links[i])\">{{goToOption}}</button>\n <button *ngIf=\"card.id === 'capacity'\" mat-menu-item (click)=\"onsortChannelsBy()\">Sort By {{sortField === 'Balance Score' ? 'Capacity' : 'Balance Score'}}</button>\n </mat-menu>\n </div>\n </mat-card-title>\n </mat-card-header>\n <mat-card-content fxLayout=\"column\" fxFlex=\"{{card.id === 'node' || card.id === 'balance' ? 70 : card.id === 'fee' || card.id === 'status' ? 78 : 90}}\"\n [ngClass]=\"{'dashboard-card-content': true, \n 'error-border': (card.id === 'node' && apiCallStatusNodeInfo.status === apiCallStatusEnum.ERROR) ||\n (card.id === 'balance' && (apiCallStatusChannels.status === apiCallStatusEnum.ERROR || apiCallStatusBlockchainBalance.status === apiCallStatusEnum.ERROR)) ||\n (card.id === 'capacity' && apiCallStatusChannels.status === apiCallStatusEnum.ERROR) ||\n (card.id === 'fee' && apiCallStatusFees.status === apiCallStatusEnum.ERROR) ||\n (card.id === 'status' && (apiCallStatusChannels.status === apiCallStatusEnum.ERROR || apiCallStatusPendingChannels.status === apiCallStatusEnum.ERROR))}\">\n <mat-progress-bar *ngIf=\"(card.id === 'node' && apiCallStatusNodeInfo.status === apiCallStatusEnum.INITIATED) ||\n (card.id === 'balance' && (apiCallStatusChannels.status === apiCallStatusEnum.INITIATED || apiCallStatusBlockchainBalance.status === apiCallStatusEnum.INITIATED)) ||\n (card.id === 'capacity' && apiCallStatusChannels.status === apiCallStatusEnum.INITIATED) ||\n (card.id === 'fee' && apiCallStatusFees.status === apiCallStatusEnum.INITIATED) ||\n (card.id === 'status' && (apiCallStatusChannels.status === apiCallStatusEnum.INITIATED || apiCallStatusPendingChannels.status === apiCallStatusEnum.INITIATED))\"\n mode=\"indeterminate\"\n ></mat-progress-bar>\n <div fxLayout=\"column\" fxFlex=\"100\" [ngSwitch]=\"card.id\">\n <rtl-node-info *ngSwitchCase=\"'node'\" fxFlex=\"100\" [information]=\"information\" [showColorFieldSeparately]=\"false\"></rtl-node-info>\n <rtl-balances-info *ngSwitchCase=\"'balance'\" fxFlex=\"100\" [balances]=\"balances\" [errorMessage]=\"errorMessages[3] + ' ' + errorMessages[2]\"></rtl-balances-info>\n <rtl-channel-capacity-info *ngSwitchCase=\"'capacity'\" fxFlex=\"100\" [sortBy]=\"sortField\" [channelBalances]=\"channelBalances\" [allChannels]=\"allChannelsCapacity\" [errorMessage]=\"errorMessages[3]\"></rtl-channel-capacity-info>\n <rtl-fee-info *ngSwitchCase=\"'fee'\" fxFlex=\"100\" [fees]=\"fees\" [errorMessage]=\"errorMessages[1]\"></rtl-fee-info>\n <rtl-channel-status-info *ngSwitchCase=\"'status'\" fxFlex=\"100\" [channelsStatus]=\"channelsStatus\" [errorMessage]=\"errorMessages[3] + ' ' + errorMessages[4]\"></rtl-channel-status-info>\n <h3 *ngSwitchDefault>Error! Unable to find information!</h3>\n </div>\n </mat-card-content>\n </mat-card>\n </mat-grid-tile>\n </mat-grid-list>\n</div>\n<ng-template #merchantDashboard>\n <div fxLayout=\"row\" fxLayoutAlign=\"start end\" class=\"page-title-container mb-2\">\n <fa-icon class=\"page-title-img mr-1\" [icon]=\"faSmile\"></fa-icon>\n <span class=\"page-title\">Welcome {{information.alias}}! Your node is up and running.</span>\n </div>\n <mat-grid-list cols=\"6\" gutterSize=\"20px\" [rowHeight]=\"merchantCardHeight\">\n <mat-grid-tile *ngFor=\"let card of merchantCards\" fxFlex=\"100\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\" [colspan]=\"card.cols\" [rowspan]=\"card.rows\">\n <mat-card fxFlex=\"100\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\" class=\"h-100 dashboard-card\" [ngClass]=\"{'p-0': card.id === 'transactions'}\">\n <mat-card-header *ngIf=\"card.id !== 'transactions'\">\n <mat-card-title fxLayoutAlign=\"space-between center\">\n <div>\n <fa-icon class=\"mr-1\" [icon]=\"card.icon\"></fa-icon>\n <span>{{card.title}}</span>\n </div>\n <div>\n <button *ngIf=\"card.links[0]\" mat-icon-button class=\"more-button\" aria-label=\"Toggle menu\" [matMenuTriggerFor]=\"menuMerchant\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menuMerchant=\"matMenu\" class=\"dashboard-vert-menu\" xPosition=\"before\">\n <button *ngFor=\"let goToOption of card.goToOptions; index as i\" mat-menu-item (click)=\"onNavigateTo(card.links[i])\">{{goToOption}}</button>\n </mat-menu>\n </div>\n </mat-card-title>\n </mat-card-header>\n <mat-card-content fxLayout=\"column\" fxLayoutAlign=\"start stretch\" fxFlex=\"{{card.id === 'transactions' ? 100 : card.id === 'balance' ? 70: 90}}\"\n [ngClass]=\"{'dashboard-card-content': true, \n 'error-border': (card.id === 'node' && apiCallStatusNodeInfo.status === apiCallStatusEnum.ERROR) ||\n (card.id === 'balance' && (apiCallStatusChannels.status === apiCallStatusEnum.ERROR || apiCallStatusBlockchainBalance.status === apiCallStatusEnum.ERROR)) ||\n ((card.id === 'inboundLiq' || card.id === 'outboundLiq') && apiCallStatusChannels.status === apiCallStatusEnum.ERROR)}\">\n <mat-progress-bar *ngIf=\"(card.id === 'node' && apiCallStatusNodeInfo.status === apiCallStatusEnum.INITIATED) ||\n (card.id === 'balance' && (apiCallStatusChannels.status === apiCallStatusEnum.INITIATED || apiCallStatusBlockchainBalance.status === apiCallStatusEnum.INITIATED)) ||\n ((card.id === 'inboundLiq' || card.id === 'outboundLiq') && apiCallStatusChannels.status === apiCallStatusEnum.INITIATED)\"\n mode=\"indeterminate\"\n ></mat-progress-bar>\n <div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"start stretch\" [ngSwitch]=\"card.id\">\n <rtl-node-info *ngSwitchCase=\"'node'\" fxFlex=\"100\" [information]=\"information\"></rtl-node-info>\n <rtl-balances-info *ngSwitchCase=\"'balance'\" fxFlex=\"100\" [balances]=\"balances\" [errorMessage]=\"errorMessages[3] + ' ' + errorMessages[2]\"></rtl-balances-info>\n <rtl-channel-liquidity-info *ngSwitchCase=\"'inboundLiq'\" fxFlex=\"100\" [direction]=\"'In'\" [totalLiquidity]=\"totalInboundLiquidity\" [allChannels]=\"allInboundChannels\" [errorMessage]=\"errorMessages[3]\"></rtl-channel-liquidity-info>\n <rtl-channel-liquidity-info *ngSwitchCase=\"'outboundLiq'\" fxFlex=\"100\" [direction]=\"'Out'\" [totalLiquidity]=\"totalOutboundLiquidity\" [allChannels]=\"allOutboundChannels\" [errorMessage]=\"errorMessages[3]\"></rtl-channel-liquidity-info>\n <span *ngSwitchCase=\"'transactions'\" fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"start start\" [perfectScrollbar]>\n <mat-tab-group mat-stretch-tabs=\"false\" mat-align-tabs=\"start\" fxLayout=\"column\" fxFlex=\"100\" class=\"w-100 dashboard-tabs-group\">\n <mat-tab label=\"Receive\"><rtl-lightning-invoices [calledFrom]=\"'home'\"></rtl-lightning-invoices></mat-tab>\n <mat-tab label=\"Pay\"><rtl-lightning-payments [calledFrom]=\"'home'\"></rtl-lightning-payments></mat-tab>\n <mat-tab [disabled]=\"true\">\n <ng-template mat-tab-label>\n <button mat-icon-button class=\"more-button\" aria-label=\"Toggle menu\" [matMenuTriggerFor]=\"menuTransactions\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menuTransactions=\"matMenu\" class=\"dashboard-vert-menu\" xPosition=\"before\">\n <button *ngFor=\"let goToOption of card.goToOptions; index as i\" mat-menu-item (click)=\"onNavigateTo(card.links[i])\">{{goToOption}}</button>\n </mat-menu>\n </ng-template>\n </mat-tab>\n </mat-tab-group>\n </span>\n <h3 *ngSwitchDefault>Error! Unable to find information!</h3>\n </div>\n </mat-card-content>\n </mat-card>\n </mat-grid-tile>\n </mat-grid-list>\n</ng-template>","import { Component, OnInit, OnDestroy } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Subject } from 'rxjs';\nimport { takeUntil, filter } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { Actions } from '@ngrx/effects';\nimport { faSmile, faFrown } from '@fortawesome/free-regular-svg-icons';\nimport { faAngleDoubleDown, faAngleDoubleUp, faChartPie, faBolt, faServer, faNetworkWired } from '@fortawesome/free-solid-svg-icons';\n\nimport { LoggerService } from '../../shared/services/logger.service';\nimport { CommonService } from '../../shared/services/common.service';\nimport { UserPersonaEnum, ScreenSizeEnum, APICallStatusEnum, LNDActions } from '../../shared/services/consts-enums-functions';\nimport { ApiCallStatusPayload } from '../../shared/models/apiCallsPayload';\nimport { ChannelsStatus, GetInfo, Fees, Channel, BlockchainBalance, PendingChannels, PendingChannelsSummary, ChannelsSummary, LightningBalance } from '../../shared/models/lndModels';\nimport { SelNodeChild } from '../../shared/models/RTLconfig';\n\nimport { RTLState } from '../../store/rtl.state';\nimport { blockchainBalance, channels, fees, nodeInfoAndNodeSettingsAndAPIStatus, pendingChannels } from '../store/lnd.selector';\n\nexport interface Tile {\n id: string;\n title: string;\n cols: number;\n rows: number;\n goToOptions?: string[];\n links?: string[];\n icon?: any;\n}\n\n@Component({\n selector: 'rtl-home',\n templateUrl: './home.component.html',\n styleUrls: ['./home.component.scss']\n})\nexport class HomeComponent implements OnInit, OnDestroy {\n\n public faSmile = faSmile;\n public faFrown = faFrown;\n public faAngleDoubleDown = faAngleDoubleDown;\n public faAngleDoubleUp = faAngleDoubleUp;\n public faChartPie = faChartPie;\n public faBolt = faBolt;\n public faServer = faServer;\n public faNetworkWired = faNetworkWired;\n public flgChildInfoUpdated = false;\n public userPersonaEnum = UserPersonaEnum;\n public activeChannels = 0;\n public inactiveChannels = 0;\n public channelBalances = { localBalance: 0, remoteBalance: 0, balancedness: 0 };\n public selNode: SelNodeChild | null = {};\n public fees: Fees;\n public information: GetInfo = {};\n public balances = { onchain: -1, lightning: -1, total: 0 };\n public allChannels: Channel[] = [];\n public channelsStatus: ChannelsStatus = {};\n public allChannelsCapacity: Channel[] = [];\n public allInboundChannels: Channel[] = [];\n public allOutboundChannels: Channel[] = [];\n public totalInboundLiquidity = 0;\n public totalOutboundLiquidity = 0;\n public operatorCards: Tile[] = [];\n public merchantCards: Tile[] = [];\n public screenSize = '';\n public operatorCardHeight = '390px';\n public merchantCardHeight = '62px';\n public sortField = 'Balance Score';\n public screenSizeEnum = ScreenSizeEnum;\n public errorMessages = ['', '', '', '', ''];\n public apiCallStatusNodeInfo: ApiCallStatusPayload | null = null;\n public apiCallStatusFees: ApiCallStatusPayload | null = null;\n public apiCallStatusBlockchainBalance: ApiCallStatusPayload | null = null;\n public apiCallStatusChannels: ApiCallStatusPayload | null = null;\n public apiCallStatusPendingChannels: ApiCallStatusPayload | null = null;\n public apiCallStatusEnum = APICallStatusEnum;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject(), new Subject(), new Subject(), new Subject(), new Subject(), new Subject()];\n\n constructor(private logger: LoggerService, private store: Store<RTLState>, private actions: Actions, private commonService: CommonService, private router: Router) {\n this.screenSize = this.commonService.getScreenSize();\n switch (this.screenSize) {\n case ScreenSizeEnum.XS:\n this.operatorCards = [\n { id: 'node', goToOptions: [], links: [], icon: this.faServer, title: 'Node Information', cols: 10, rows: 1 },\n { id: 'balance', goToOptions: ['On-Chain'], links: ['onchain'], icon: this.faChartPie, title: 'Balances', cols: 10, rows: 1 },\n { id: 'fee', goToOptions: ['Routing', 'Fees Summary'], links: ['routing', 'reports'], icon: this.faBolt, title: 'Routing Fee', cols: 10, rows: 1 },\n { id: 'status', goToOptions: ['Channels', 'Inactive Channels'], links: ['connections', 'inactive'], icon: this.faNetworkWired, title: 'Channels', cols: 10, rows: 1 },\n { id: 'capacity', goToOptions: ['Channels'], links: ['connections'], icon: this.faNetworkWired, title: 'Channels Capacity', cols: 10, rows: 2 }\n ];\n this.merchantCards = [\n { id: 'balance', goToOptions: ['On-Chain'], links: ['onchain'], icon: this.faChartPie, title: 'Balances', cols: 6, rows: 4 },\n { id: 'transactions', goToOptions: ['Transactions', 'Transactions Summary'], links: ['transactions', 'reports/transactions'], title: '', cols: 6, rows: 6 },\n { id: 'inboundLiq', goToOptions: ['Channels'], links: ['connections'], icon: this.faAngleDoubleDown, title: 'In-Bound Liquidity', cols: 6, rows: 8 },\n { id: 'outboundLiq', goToOptions: ['Channels'], links: ['connections'], icon: this.faAngleDoubleUp, title: 'Out-Bound Liquidity', cols: 6, rows: 8 }\n ];\n break;\n\n case ScreenSizeEnum.SM:\n this.operatorCards = [\n { id: 'node', goToOptions: [], links: [], icon: this.faServer, title: 'Node Information', cols: 5, rows: 1 },\n { id: 'balance', goToOptions: ['On-Chain'], links: ['onchain'], icon: this.faChartPie, title: 'Balances', cols: 5, rows: 1 },\n { id: 'fee', goToOptions: ['Routing', 'Fees Summary'], links: ['routing', 'reports'], icon: this.faBolt, title: 'Routing Fee', cols: 5, rows: 1 },\n { id: 'status', goToOptions: ['Channels', 'Inactive Channels'], links: ['connections', 'inactive'], icon: this.faNetworkWired, title: 'Channels', cols: 5, rows: 1 },\n { id: 'capacity', goToOptions: ['Channels'], links: ['connections'], icon: this.faNetworkWired, title: 'Channels Capacity', cols: 10, rows: 2 }\n ];\n this.merchantCards = [\n { id: 'balance', goToOptions: ['On-Chain'], links: ['onchain'], icon: this.faChartPie, title: 'Balances', cols: 3, rows: 4 },\n { id: 'transactions', goToOptions: ['Transactions', 'Transactions Summary'], links: ['transactions', 'reports/transactions'], title: '', cols: 3, rows: 4 },\n { id: 'inboundLiq', goToOptions: ['Channels'], links: ['connections'], icon: this.faAngleDoubleDown, title: 'In-Bound Liquidity', cols: 3, rows: 8 },\n { id: 'outboundLiq', goToOptions: ['Channels'], links: ['connections'], icon: this.faAngleDoubleUp, title: 'Out-Bound Liquidity', cols: 3, rows: 8 }\n ];\n break;\n\n case ScreenSizeEnum.MD:\n this.operatorCards = [\n { id: 'node', goToOptions: [], links: [], icon: this.faServer, title: 'Node Information', cols: 5, rows: 1 },\n { id: 'balance', goToOptions: ['On-Chain'], links: ['onchain'], icon: this.faChartPie, title: 'Balances', cols: 5, rows: 1 },\n { id: 'fee', goToOptions: ['Routing', 'Fees Summary'], links: ['routing', 'reports'], icon: this.faBolt, title: 'Routing Fee', cols: 5, rows: 1 },\n { id: 'status', goToOptions: ['Channels', 'Inactive Channels'], links: ['connections', 'inactive'], icon: this.faNetworkWired, title: 'Channels', cols: 5, rows: 1 },\n { id: 'capacity', goToOptions: ['Channels'], links: ['connections'], icon: this.faNetworkWired, title: 'Channels Capacity', cols: 10, rows: 2 }\n ];\n this.merchantCards = [\n { id: 'balance', goToOptions: ['On-Chain'], links: ['onchain'], icon: this.faChartPie, title: 'Balances', cols: 3, rows: 4 },\n { id: 'transactions', goToOptions: ['Transactions', 'Transactions Summary'], links: ['transactions', 'reports/transactions'], title: '', cols: 3, rows: 4 },\n { id: 'inboundLiq', goToOptions: ['Channels'], links: ['connections'], icon: this.faAngleDoubleDown, title: 'In-Bound Liquidity', cols: 3, rows: 8 },\n { id: 'outboundLiq', goToOptions: ['Channels'], links: ['connections'], icon: this.faAngleDoubleUp, title: 'Out-Bound Liquidity', cols: 3, rows: 8 }\n ];\n break;\n\n default:\n this.operatorCards = [\n { id: 'node', goToOptions: [], links: [], icon: this.faServer, title: 'Node Information', cols: 3, rows: 1 },\n { id: 'balance', goToOptions: ['On-Chain'], links: ['onchain'], icon: this.faChartPie, title: 'Balances', cols: 3, rows: 1 },\n { id: 'capacity', goToOptions: ['Channels'], links: ['connections'], icon: this.faNetworkWired, title: 'Channels Capacity', cols: 4, rows: 2 },\n { id: 'fee', goToOptions: ['Routing', 'Fees Summary'], links: ['routing', 'reports'], icon: this.faBolt, title: 'Routing Fee', cols: 3, rows: 1 },\n { id: 'status', goToOptions: ['Channels', 'Inactive Channels'], links: ['connections', 'inactive'], icon: this.faNetworkWired, title: 'Channels', cols: 3, rows: 1 }\n ];\n this.merchantCards = [\n { id: 'balance', goToOptions: ['On-Chain'], links: ['onchain'], icon: this.faChartPie, title: 'Balances', cols: 2, rows: 5 },\n { id: 'inboundLiq', goToOptions: ['Channels'], links: ['connections'], icon: this.faAngleDoubleDown, title: 'In-Bound Liquidity', cols: 2, rows: 10 },\n { id: 'outboundLiq', goToOptions: ['Channels'], links: ['connections'], icon: this.faAngleDoubleUp, title: 'Out-Bound Liquidity', cols: 2, rows: 10 },\n { id: 'transactions', goToOptions: ['Transactions', 'Transactions Summary'], links: ['transactions', 'reports/transactions'], title: '', cols: 2, rows: 5 }\n ];\n break;\n }\n }\n\n ngOnInit() {\n this.store.select(nodeInfoAndNodeSettingsAndAPIStatus).pipe(takeUntil(this.unSubs[0])).\n subscribe((infoSettingsStatusSelector: { information: GetInfo, nodeSettings: SelNodeChild | null, apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessages[0] = '';\n this.apiCallStatusNodeInfo = infoSettingsStatusSelector.apiCallStatus;\n if (this.apiCallStatusNodeInfo.status === APICallStatusEnum.ERROR) {\n this.errorMessages[0] = (typeof (this.apiCallStatusNodeInfo.message) === 'object') ? JSON.stringify(this.apiCallStatusNodeInfo.message) : this.apiCallStatusNodeInfo.message ? this.apiCallStatusNodeInfo.message : '';\n }\n this.selNode = infoSettingsStatusSelector.nodeSettings;\n this.information = infoSettingsStatusSelector.information;\n });\n this.store.select(fees).pipe(takeUntil(this.unSubs[1])).\n subscribe((feesSelector: { fees: Fees, apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessages[1] = '';\n this.apiCallStatusFees = feesSelector.apiCallStatus;\n if (this.apiCallStatusFees.status === APICallStatusEnum.ERROR) {\n this.errorMessages[1] = (typeof (this.apiCallStatusFees.message) === 'object') ? JSON.stringify(this.apiCallStatusFees.message) : this.apiCallStatusFees.message ? this.apiCallStatusFees.message : '';\n }\n this.fees = feesSelector.fees;\n });\n this.store.select(blockchainBalance).pipe(takeUntil(this.unSubs[2])).\n subscribe((bcBalanceSelector: { blockchainBalance: BlockchainBalance, apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessages[2] = '';\n this.apiCallStatusBlockchainBalance = bcBalanceSelector.apiCallStatus;\n if (this.apiCallStatusBlockchainBalance.status === APICallStatusEnum.ERROR) {\n this.errorMessages[2] = (typeof (this.apiCallStatusBlockchainBalance.message) === 'object') ? JSON.stringify(this.apiCallStatusBlockchainBalance.message) : this.apiCallStatusBlockchainBalance.message ? this.apiCallStatusBlockchainBalance.message : '';\n }\n this.balances.onchain = (bcBalanceSelector.blockchainBalance.total_balance && +bcBalanceSelector.blockchainBalance.total_balance >= 0) ? +bcBalanceSelector.blockchainBalance.total_balance : 0;\n this.balances.total = this.balances.lightning + this.balances.onchain;\n this.balances = Object.assign({}, this.balances);\n });\n this.store.select(pendingChannels).pipe(takeUntil(this.unSubs[3])).\n subscribe((pendingChannelsSelector: { pendingChannels: PendingChannels, pendingChannelsSummary: PendingChannelsSummary, apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessages[4] = '';\n this.apiCallStatusPendingChannels = pendingChannelsSelector.apiCallStatus;\n if (this.apiCallStatusPendingChannels.status === APICallStatusEnum.ERROR) {\n this.errorMessages[4] = (typeof (this.apiCallStatusPendingChannels.message) === 'object') ? JSON.stringify(this.apiCallStatusPendingChannels.message) : this.apiCallStatusPendingChannels.message ? this.apiCallStatusPendingChannels.message : '';\n }\n this.channelsStatus.pending = { num_channels: pendingChannelsSelector.pendingChannelsSummary.open?.num_channels, capacity: pendingChannelsSelector.pendingChannelsSummary.open?.limbo_balance };\n this.channelsStatus.closing = {\n num_channels: (pendingChannelsSelector.pendingChannelsSummary.closing?.num_channels || 0) + (pendingChannelsSelector.pendingChannelsSummary.force_closing?.num_channels || 0) + (pendingChannelsSelector.pendingChannelsSummary.waiting_close?.num_channels || 0),\n capacity: pendingChannelsSelector.pendingChannelsSummary.total_limbo_balance\n };\n });\n this.store.select(channels).pipe(takeUntil(this.unSubs[4])).\n subscribe((channelsSelector: { channels: Channel[], channelsSummary: ChannelsSummary, lightningBalance: LightningBalance, apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessages[3] = '';\n this.apiCallStatusChannels = channelsSelector.apiCallStatus;\n if (this.apiCallStatusChannels.status === APICallStatusEnum.ERROR) {\n this.errorMessages[3] = (typeof (this.apiCallStatusChannels.message) === 'object') ? JSON.stringify(this.apiCallStatusChannels.message) : this.apiCallStatusChannels.message ? this.apiCallStatusChannels.message : '';\n }\n const local = (channelsSelector.lightningBalance && channelsSelector.lightningBalance.local) ? +channelsSelector.lightningBalance.local : 0;\n const remote = (channelsSelector.lightningBalance && channelsSelector.lightningBalance.remote) ? +channelsSelector.lightningBalance.remote : 0;\n const total = local + remote;\n this.channelBalances = { localBalance: local, remoteBalance: remote, balancedness: +(1 - Math.abs((local - remote) / total)).toFixed(3) };\n this.balances.lightning = channelsSelector.lightningBalance.local || 0;\n this.balances.total = this.balances.lightning + this.balances.onchain;\n this.balances = Object.assign({}, this.balances);\n this.activeChannels = channelsSelector.channelsSummary.active?.num_channels || 0;\n this.inactiveChannels = channelsSelector.channelsSummary.inactive?.num_channels || 0;\n this.channelsStatus.active = channelsSelector.channelsSummary.active;\n this.channelsStatus.inactive = channelsSelector.channelsSummary.inactive;\n this.totalInboundLiquidity = 0;\n this.totalOutboundLiquidity = 0;\n this.allChannels = channelsSelector.channels?.filter((channel) => channel.active === true);\n this.allChannelsCapacity = JSON.parse(JSON.stringify(this.commonService.sortDescByKey(this.allChannels, 'balancedness')));\n this.allInboundChannels = JSON.parse(JSON.stringify(this.commonService.sortDescByKey(this.allChannels?.filter((channel) => channel.remote_balance && channel.remote_balance > 0), 'remote_balance')));\n this.allOutboundChannels = JSON.parse(JSON.stringify(this.commonService.sortDescByKey(this.allChannels?.filter((channel) => channel.local_balance && channel.local_balance > 0), 'local_balance')));\n this.allChannels.forEach((channel) => {\n this.totalInboundLiquidity = this.totalInboundLiquidity + +(channel.remote_balance || 0);\n this.totalOutboundLiquidity = this.totalOutboundLiquidity + +(channel.local_balance || 0);\n });\n if (this.balances.lightning >= 0 && this.balances.onchain >= 0 && this.fees.month_fee_sum && this.fees.month_fee_sum >= 0) {\n this.flgChildInfoUpdated = true;\n } else {\n this.flgChildInfoUpdated = false;\n }\n this.logger.info(channelsSelector);\n });\n this.actions.pipe(\n takeUntil(this.unSubs[5]),\n filter((action) => action.type === LNDActions.FETCH_FEES_LND || action.type === LNDActions.SET_FEES_LND)).\n subscribe((action) => {\n if (action.type === LNDActions.FETCH_FEES_LND) {\n this.flgChildInfoUpdated = false;\n }\n if (action.type === LNDActions.SET_FEES_LND) {\n this.flgChildInfoUpdated = true;\n }\n });\n }\n\n onNavigateTo(link: string) {\n if (link === 'inactive') {\n this.router.navigateByUrl('/lnd/connections', { state: { filter: link } });\n } else {\n this.router.navigateByUrl('/lnd/' + link);\n }\n }\n\n onsortChannelsBy() {\n if (this.sortField === 'Balance Score') {\n this.sortField = 'Capacity';\n this.allChannelsCapacity = this.allChannels.sort((a, b) => {\n const x = +(a.local_balance || 0) + +(a.remote_balance || 0);\n const y = +(b.local_balance || 0) + +(b.remote_balance || 0);\n return ((x > y) ? -1 : ((x < y) ? 1 : 0));\n });\n } else {\n this.sortField = 'Balance Score';\n this.allChannelsCapacity = JSON.parse(JSON.stringify(this.commonService.sortDescByKey(this.allChannels, 'balancedness')));\n }\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"row\" fxLayoutAlign=\"start center\" class=\"page-title-container\">\n <fa-icon class=\"page-title-img mr-1\" [icon]=\"faChartPie\"></fa-icon>\n <span class=\"page-title\">On-chain Balance</span>\n</div>\n<div fxLayout=\"column\" class=\"padding-gap-x mb-4\">\n <mat-card>\n <mat-card-content fxLayout=\"column\">\n <rtl-currency-unit-converter [values]=\"balances\"></rtl-currency-unit-converter>\n </mat-card-content>\n </mat-card>\n</div>\n<div fxLayout=\"row\" fxLayoutAlign=\"start center\" class=\"page-title-container\">\n <fa-icon class=\"page-title-img mr-1\" [icon]=\"faUsers\"></fa-icon>\n <span class=\"page-title\">Connections</span>\n</div>\n<div fxLayout=\"column\" class=\"padding-gap-x\">\n <mat-card>\n <mat-card-content fxLayout=\"column\">\n <mat-tab-group mat-stretch-tabs=\"false\" mat-align-tabs=\"start\" [(selectedIndex)]=\"activeLink\" (selectedTabChange)=\"onSelectedTabChange($event)\">\n <mat-tab>\n <ng-template mat-tab-label>\n <span matBadgeOverlap=\"false\" class=\"tab-badge\" matBadge=\"{{activeChannels}}\">Channels</span>\n </ng-template>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>\n <span matBadgeOverlap=\"false\" class=\"tab-badge\" matBadge=\"{{activePeers}}\">Peers</span>\n </ng-template>\n </mat-tab>\n </mat-tab-group>\n <div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between stretch\" class=\"padding-gap-x-large\">\n <router-outlet></router-outlet>\n </div>\n </mat-card-content>\n </mat-card>\n</div>","import { Component, OnInit, OnDestroy } from '@angular/core';\nimport { Router, ResolveEnd, Event } from '@angular/router';\nimport { Subject } from 'rxjs';\nimport { takeUntil, filter } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { faUsers, faChartPie } from '@fortawesome/free-solid-svg-icons';\n\nimport { SelNodeChild } from '../../shared/models/RTLconfig';\nimport { LoggerService } from '../../shared/services/logger.service';\n\nimport { RTLState } from '../../store/rtl.state';\nimport { blockchainBalance, channels, lndNodeSettings, peers } from '../store/lnd.selector';\nimport { ApiCallStatusPayload } from '../../shared/models/apiCallsPayload';\nimport { BlockchainBalance, Channel, ChannelsSummary, LightningBalance, Peer } from '../../shared/models/lndModels';\n\n@Component({\n selector: 'rtl-connections',\n templateUrl: './connections.component.html',\n styleUrls: ['./connections.component.scss']\n})\nexport class ConnectionsComponent implements OnInit, OnDestroy {\n\n public selNode: SelNodeChild | null = {};\n public activePeers = 0;\n public activeChannels = 0;\n public faUsers = faUsers;\n public faChartPie = faChartPie;\n public balances = [{ title: 'Total Balance', dataValue: 0 }, { title: 'Confirmed', dataValue: 0 }, { title: 'Unconfirmed', dataValue: 0 }];\n public links = [{ link: 'channels', name: 'Channels' }, { link: 'peers', name: 'Peers' }];\n public activeLink = 0;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject(), new Subject(), new Subject()];\n\n constructor(private store: Store<RTLState>, private logger: LoggerService, private router: Router) { }\n\n ngOnInit() {\n this.activeLink = this.links.findIndex((link) => link.link === this.router.url.substring(this.router.url.lastIndexOf('/') + 1));\n this.router.events.pipe(takeUntil(this.unSubs[0]), filter((e) => e instanceof ResolveEnd)).\n subscribe({\n next: (value: ResolveEnd | Event) => {\n this.activeLink = this.links.findIndex((link) => link.link === (<ResolveEnd>value).urlAfterRedirects.substring((<ResolveEnd>value).urlAfterRedirects.lastIndexOf('/') + 1));\n }\n });\n this.store.select(lndNodeSettings).pipe(takeUntil(this.unSubs[1])).subscribe((nodeSettings: SelNodeChild | null) => { this.selNode = nodeSettings; });\n this.store.select(peers).pipe(takeUntil(this.unSubs[2])).\n subscribe((peersSelector: { peers: Peer[], apiCallStatus: ApiCallStatusPayload }) => {\n this.activePeers = (peersSelector.peers && peersSelector.peers.length) ? peersSelector.peers.length : 0;\n this.logger.info(peersSelector);\n });\n this.store.select(channels).pipe(takeUntil(this.unSubs[3])).\n subscribe((channelsSelector: { channels: Channel[], channelsSummary: ChannelsSummary, lightningBalance: LightningBalance, apiCallStatus: ApiCallStatusPayload }) => {\n this.activeChannels = channelsSelector.channelsSummary.active?.num_channels || 0;\n this.logger.info(channelsSelector);\n });\n this.store.select(blockchainBalance).pipe(takeUntil(this.unSubs[4])).\n subscribe((bcBalanceSelector: { blockchainBalance: BlockchainBalance, apiCallStatus: ApiCallStatusPayload }) => {\n this.balances = [{ title: 'Total Balance', dataValue: bcBalanceSelector.blockchainBalance.total_balance || 0 }, { title: 'Confirmed', dataValue: (bcBalanceSelector.blockchainBalance.confirmed_balance || 0) }, { title: 'Unconfirmed', dataValue: (bcBalanceSelector.blockchainBalance.unconfirmed_balance || 0) }];\n this.logger.info(bcBalanceSelector);\n });\n }\n\n onSelectedTabChange(event) {\n this.router.navigateByUrl('/lnd/connections/' + this.links[event.index].link);\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"row\" fxLayoutAlign=\"start center\">\n <div fxLayout=\"column\" fxFlex=\"100\">\n <mat-card-header fxLayout=\"row\" fxLayoutAlign=\"space-between center\" class=\"modal-info-header\">\n <div fxFlex=\"95\" fxLayoutAlign=\"start start\">\n <span class=\"page-title\">{{alertTitle}}</span>\n </div>\n <button tabindex=\"8\" fxFlex=\"5\" fxLayoutAlign=\"center\" class=\"btn-close-x p-0\" mat-button (click)=\"onClose()\">X</button>\n </mat-card-header>\n <mat-card-content class=\"padding-gap-x-large\">\n <form #form=\"ngForm\" fxLayout=\"column\" (submit)=\"onOpenChannel()\" (reset)=\"resetData()\">\n <div fxLayout=\"column\">\n <mat-form-field *ngIf=\"!peer && peers && peers.length > 0\" fxFlex=\"100\">\n <input type=\"text\" placeholder=\"Peer Alias\" aria-label=\"Peers\" matInput tabindex=\"1\" required [formControl]=\"selectedPeer\" [matAutocomplete]=\"auto\">\n <mat-autocomplete #auto=\"matAutocomplete\" [displayWith]=\"displayFn\" (optionSelected)=\"onSelectedPeerChanged()\">\n <mat-option *ngFor=\"let peer of filteredPeers | async\" [value]=\"peer\">{{peer.alias ? peer.alias : peer.pub_key ? peer.pub_key : ''}}</mat-option>\n </mat-autocomplete>\n <mat-error *ngIf=\"selectedPeer.errors?.required\">Peer alias is required.</mat-error>\n <mat-error *ngIf=\"selectedPeer.errors?.notfound\">Peer not found in the list.</mat-error>\n </mat-form-field>\n </div>\n <ng-container *ngTemplateOutlet=\"peerDetailsExpansionBlock\"></ng-container>\n <div fxLayout=\"column\">\n <div fxLayout=\"row\" fxFlex=\"100\" fxLayoutAlign=\"space-between center\">\n <mat-form-field fxFlex=\"60\" fxLayoutAlign=\"start end\">\n <input #amt=\"ngModel\" matInput placeholder=\"Amount\" type=\"number\" tabindex=\"1\" required name=\"amnt\" [step]=\"1000\" [min]=\"1\" [max]=\"totalBalance\" [(ngModel)]=\"fundingAmount\">\n <mat-hint>(Remaining Bal: {{totalBalance - ((fundingAmount) ? fundingAmount : 0) | number}})</mat-hint>\n <span matSuffix> Sats </span>\n <mat-error *ngIf=\"amount.errors?.required\">Amount is required.</mat-error>\n <mat-error *ngIf=\"amount.errors?.max\">Amount must be less than or equal to {{totalBalance}}.</mat-error>\n </mat-form-field>\n <div fxFlex=\"35\" fxLayoutAlign=\"start center\">\n <mat-slide-toggle tabindex=\"2\" color=\"primary\" name=\"isPrivate\" [(ngModel)]=\"isPrivate\">Private Channel</mat-slide-toggle>\n </div>\n </div>\n <mat-expansion-panel fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"start stretch\" class=\"flat-expansion-panel mt-2\" expanded=\"false\" (closed)=\"onAdvancedPanelToggle(true)\" (opened)=\"onAdvancedPanelToggle(false)\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <span>{{advancedTitle}}</span>\n </mat-panel-title>\n </mat-expansion-panel-header>\n <div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"start stretch\">\n <div fxLayout=\"row\" fxFlex=\"100\" fxLayoutAlign=\"space-between center\">\n <mat-form-field fxFlex=\"49\">\n <mat-select tabindex=\"3\" [(value)]=\"selTransType\">\n <mat-option *ngFor=\"let transType of transTypes\" [value]=\"transType.id\">\n {{transType.name}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field fxFlex=\"49\">\n <input #transTypeVal=\"ngModel\" matInput type=\"number\" tabindex=\"4\" name=\"transTpValue\" [required]=\"selTransType!=='0'\" [disabled]=\"selTransType==='0'\" [placeholder]=\"selTransType==='0' ? 'Default' : selTransType==='1' ? 'Target Confirmation Blocks' : 'Fee (Sats/vByte)'\" [step]=\"1\" [min]=\"0\" [(ngModel)]=\"transTypeValue\">\n <mat-error *ngIf=\"selTransType!=='0' && !transTypeValue\">{{selTransType === '1' ? 'Target Confirmation Blocks' : 'Fee'}} is required.</mat-error>\n </mat-form-field>\n </div>\n <div fxLayout=\"row\" fxFlex=\"100\" fxLayoutAlign=\"space-between center\">\n <div fxFlex=\"50\" fxLayoutAlign=\"start center\">\n <mat-slide-toggle tabindex=\"6\" color=\"primary\" name=\"spendUnconfirmed\" [(ngModel)]=\"spendUnconfirmed\">Spend Unconfirmed Output</mat-slide-toggle>\n </div>\n </div>\n </div>\n </mat-expansion-panel> \n </div>\n <div *ngIf=\"channelConnectionError !== ''\" fxFlex=\"100\" class=\"alert alert-danger mt-1\">\n <fa-icon class=\"mr-1 alert-icon\" [icon]=\"faExclamationTriangle\"></fa-icon>\n <span *ngIf=\"channelConnectionError !== ''\">{{channelConnectionError}}</span>\n </div>\n <div class=\"mt-2\" fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button mat-button color=\"primary\" class=\"mr-1\" tabindex=\"7\" type=\"reset\">Clear Fields</button>\n <button autoFocus mat-button color=\"primary\" type=\"submit\" tabindex=\"9\">Open Channel</button>\n </div>\n </form>\n </mat-card-content>\n </div>\n</div>\n\n<ng-template #peerDetailsExpansionBlock>\n <mat-expansion-panel *ngIf=\"peer\" class=\"flat-expansion-panel my-1\" expanded=\"false\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <span>Peer: &nbsp;</span><strong class=\"font-weight-900\">{{peer?.alias || peer?.address}}</strong>\n </mat-panel-title>\n </mat-expansion-panel-header>\n <div fxLayout=\"column\">\n <div fxLayout=\"row\">\n <div fxFlex=\"100\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Pubkey</h4>\n <span class=\"foreground-secondary-text\">{{peer.pub_key}}</span>\n </div>\n </div>\n <mat-divider class=\"w-100 my-1\"></mat-divider>\n <div fxLayout=\"row\">\n <div fxFlex=\"50\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Address</h4>\n <span class=\"overflow-wrap foreground-secondary-text\">{{peer?.address}}</span>\n </div>\n <div fxFlex=\"50\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Inbound</h4>\n <span class=\"overflow-wrap foreground-secondary-text\">{{peer?.inbound ? 'True' : 'False'}}</span>\n </div>\n </div>\n </div>\n </mat-expansion-panel>\n</ng-template>\n","import { Component, OnInit, OnDestroy, Inject, ViewChild } from '@angular/core';\nimport { UntypedFormControl } from '@angular/forms';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { Subject, Observable } from 'rxjs';\nimport { takeUntil, filter, startWith, map } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { Actions } from '@ngrx/effects';\nimport { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';\n\nimport { Peer, GetInfo } from '../../../../shared/models/lndModels';\nimport { OpenChannelAlert } from '../../../../shared/models/alertData';\nimport { APICallStatusEnum, LNDActions, TRANS_TYPES } from '../../../../shared/services/consts-enums-functions';\n\nimport { RTLState } from '../../../../store/rtl.state';\nimport { saveNewChannel } from '../../../store/lnd.actions';\nimport { SelNodeChild } from '../../../../shared/models/RTLconfig';\nimport { lndNodeSettings } from '../../../store/lnd.selector';\n\n@Component({\n selector: 'rtl-open-channel',\n templateUrl: './open-channel.component.html',\n styleUrls: ['./open-channel.component.scss']\n})\nexport class OpenChannelComponent implements OnInit, OnDestroy {\n\n @ViewChild('form', { static: true }) form: any;\n public selectedPeer = new UntypedFormControl();\n public selNode: SelNodeChild | null = {};\n public amount = new UntypedFormControl();\n public faExclamationTriangle = faExclamationTriangle;\n public alertTitle: string;\n public peer: Peer | null;\n public peers: Peer[];\n public sortedPeers: Peer[];\n public filteredPeers: Observable<Peer[]>;\n public channelConnectionError = '';\n public advancedTitle = 'Advanced Options';\n public information: GetInfo;\n public totalBalance = 0;\n public fundingAmount: number | null;\n public selectedPubkey = '';\n public isPrivate = false;\n public selTransType = '0';\n public spendUnconfirmed = false;\n public transTypeValue = '';\n public transTypes = TRANS_TYPES;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject()];\n\n constructor(public dialogRef: MatDialogRef<OpenChannelComponent>, @Inject(MAT_DIALOG_DATA) public data: OpenChannelAlert, private store: Store<RTLState>, private actions: Actions) { }\n\n ngOnInit() {\n if (this.data.message) {\n this.information = this.data.message.information;\n this.totalBalance = this.data.message.balance;\n this.peer = this.data.message.peer || null;\n this.peers = this.data.message.peers || [];\n } else {\n this.information = {};\n this.totalBalance = 0;\n this.peer = null;\n this.peers = [];\n }\n this.alertTitle = this.data.alertTitle || 'Alert';\n this.store.select(lndNodeSettings).pipe(takeUntil(this.unSubs[0])).\n subscribe((nodeSettings: SelNodeChild | null) => {\n this.selNode = nodeSettings;\n this.isPrivate = !!nodeSettings?.unannouncedChannels;\n });\n this.actions.pipe(\n takeUntil(this.unSubs[1]),\n filter((action) => action.type === LNDActions.UPDATE_API_CALL_STATUS_LND || action.type === LNDActions.FETCH_CHANNELS_LND)).\n subscribe((action: any) => {\n if (action.type === LNDActions.UPDATE_API_CALL_STATUS_LND && action.payload.status === APICallStatusEnum.ERROR && action.payload.action === 'SaveNewChannel') {\n this.channelConnectionError = action.payload.message;\n }\n if (action.type === LNDActions.FETCH_CHANNELS_LND) {\n this.dialogRef.close();\n }\n });\n let x = '';\n let y = '';\n this.sortedPeers = this.peers.sort((p1, p2) => {\n x = p1.alias ? p1.alias.toLowerCase() : p1.pub_key ? p1.pub_key.toLowerCase() : '';\n y = p2.alias ? p2.alias.toLowerCase() : p1.pub_key ? p1.pub_key.toLowerCase() : '';\n return ((x < y) ? -1 : ((x > y) ? 1 : 0));\n });\n this.filteredPeers = this.selectedPeer.valueChanges.pipe(\n takeUntil(this.unSubs[2]), startWith(''),\n map((peer) => (typeof peer === 'string' ? peer : peer.alias ? peer.alias : peer.pub_key)),\n map((alias) => (alias ? this.filterPeers(alias) : this.sortedPeers.slice()))\n );\n }\n\n private filterPeers(newlySelectedPeer: string): Peer[] {\n return this.sortedPeers?.filter((peer) => peer.alias?.toLowerCase().indexOf(newlySelectedPeer ? newlySelectedPeer.toLowerCase() : '') === 0);\n }\n\n displayFn(peer: Peer): string {\n return (peer && peer.alias) ? peer.alias : (peer && peer.pub_key) ? peer.pub_key : '';\n }\n\n onSelectedPeerChanged() {\n this.channelConnectionError = '';\n this.selectedPubkey = (this.selectedPeer.value && this.selectedPeer.value.pub_key) ? this.selectedPeer.value.pub_key : null;\n if (typeof this.selectedPeer.value === 'string') {\n const selPeer = this.peers?.filter((peer) => peer.alias?.length === this.selectedPeer.value.length && peer.alias?.toLowerCase().indexOf(this.selectedPeer.value ? this.selectedPeer.value.toLowerCase() : '') === 0);\n if (selPeer.length === 1 && selPeer[0].pub_key) {\n this.selectedPubkey = selPeer[0].pub_key;\n }\n }\n if (this.selectedPeer.value && !this.selectedPubkey) {\n this.selectedPeer.setErrors({ notfound: true });\n } else {\n this.selectedPeer.setErrors(null);\n }\n }\n\n onClose() {\n this.dialogRef.close(false);\n }\n\n resetData() {\n this.selectedPeer.setValue('');\n this.fundingAmount = null;\n this.isPrivate = !!this.selNode?.unannouncedChannels;\n this.spendUnconfirmed = false;\n this.selTransType = '0';\n this.transTypeValue = '';\n this.channelConnectionError = '';\n this.advancedTitle = 'Advanced Options';\n this.form.resetForm();\n }\n\n onOpenChannel(): boolean | void {\n if ((!this.peer && !this.selectedPubkey) || (!this.fundingAmount || ((this.totalBalance - this.fundingAmount) < 0) || ((this.selTransType === '1' || this.selTransType === '2') && !this.transTypeValue))) {\n return true;\n }\n this.store.dispatch(saveNewChannel({\n payload: {\n selectedPeerPubkey: ((!this.peer || !this.peer.pub_key) ? this.selectedPubkey : this.peer.pub_key), fundingAmount: this.fundingAmount, private: this.isPrivate,\n transType: this.selTransType, transTypeValue: this.transTypeValue, spendUnconfirmed: this.spendUnconfirmed\n }\n }));\n }\n\n onAdvancedPanelToggle(isClosed: boolean) {\n if (isClosed) {\n this.advancedTitle = 'Advanced Options | ' + (this.selTransType === '1' ? 'Target Confirmation Blocks: ' : this.selTransType === '2' ?\n 'Fee (Sats/vByte): ' : 'Default') + ((this.selTransType === '1' || this.selTransType === '2') ? this.transTypeValue : '') +\n ' | Spend Unconfirmed Output: ' + (this.spendUnconfirmed ? 'Yes' : 'No');\n } else {\n this.advancedTitle = 'Advanced Options';\n }\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"row\">\n <div fxFlex=\"100\">\n <mat-card-header fxLayout=\"row\" fxLayoutAlign=\"space-between center\" class=\"modal-info-header\">\n <div fxFlex=\"95\" fxLayoutAlign=\"start start\">\n <span class=\"page-title\">Connect to a new peer</span>\n </div>\n <button tabindex=\"8\" fxFlex=\"5\" fxLayoutAlign=\"center\" class=\"btn-close-x p-0\" mat-button (click)=\"onClose()\">X</button>\n </mat-card-header> \n <mat-card-content class=\"padding-gap-x-large\">\n <div fxLayout=\"column\">\n <mat-vertical-stepper #stepper [linear]=\"true\" (selectionChange)=\"stepSelectionChanged($event)\">\n <mat-step [stepControl]=\"peerFormGroup\" [editable]=\"flgEditable\">\n <form fxLayout=\"column\" fxLayout.gt-sm=\"row wrap\" fxLayoutAlign=\"start\" fxLayoutAlign.gt-sm=\"space-between\" class=\"my-1\" [formGroup]=\"peerFormGroup\">\n <ng-template matStepLabel>{{peerFormLabel}}</ng-template> \n <mat-form-field fxFlex=\"100\">\n <input autoFocus matInput placeholder=\"Lightning Address (pubkey OR pubkey@ip:port)\" formControlName=\"peerAddress\" tabindex=\"1\" required>\n <mat-error *ngIf=\"peerFormGroup.controls.peerAddress.errors?.required\">Address is required.</mat-error>\n </mat-form-field>\n <div *ngIf=\"peerConnectionError !== ''\" fxFlex=\"100\" class=\"alert alert-danger mt-1\">\n <fa-icon class=\"mr-1 alert-icon\" [icon]=\"faExclamationTriangle\"></fa-icon>\n <span>{{peerConnectionError}}</span>\n </div>\n <div class=\"mt-2\" fxLayout=\"row\" fxLayoutAlign=\"start center\" fxFlex=\"100\">\n <button mat-button color=\"primary\" tabindex=\"3\" type=\"button\" (click)=\"onConnectPeer()\">{{peerConnectionError !== '' ? 'Retry' : 'Add Peer'}}</button>\n </div>\n </form>\n </mat-step>\n <mat-step [stepControl]=\"channelFormGroup\" [editable]=\"flgEditable\">\n <form fxLayout=\"column\" fxLayout.gt-sm=\"row wrap\" fxLayoutAlign=\"start\" fxLayoutAlign.gt-sm=\"space-between\" class=\"mb-1\" [formGroup]=\"channelFormGroup\">\n <ng-template matStepLabel disabled=\"true\">{{channelFormLabel}}</ng-template>\n <div fxLayout=\"column\" fxLayout.gt-sm=\"row wrap\" fxFlex=\"100\" fxLayoutAlign=\"space-between stretch\">\n <div fxLayout=\"row\" fxFlex=\"100\" fxLayoutAlign=\"space-between center\">\n <mat-form-field fxFlex=\"60\" fxLayoutAlign=\"start end\">\n <input matInput formControlName=\"fundingAmount\" placeholder=\"Amount\" type=\"number\" tabindex=\"1\" required [step]=\"1000\">\n <mat-hint>Remaining Bal: {{totalBalance - ((channelFormGroup.controls.fundingAmount.value) ? channelFormGroup.controls.fundingAmount.value : 0)}}</mat-hint>\n <span matSuffix> Sats </span>\n <mat-error *ngIf=\"channelFormGroup.controls.fundingAmount.errors?.required\">Amount is required.</mat-error>\n <mat-error *ngIf=\"channelFormGroup.controls.fundingAmount.errors?.min\">Amount must be a positive number.</mat-error>\n <mat-error *ngIf=\"channelFormGroup.controls.fundingAmount.errors?.max\">Amount must be less than or equal to {{totalBalance}}.</mat-error>\n </mat-form-field>\n <div fxFlex=\"35\" fxLayoutAlign=\"start center\">\n <mat-slide-toggle tabindex=\"2\" color=\"primary\" formControlName=\"isPrivate\" name=\"isPrivate\">Private Channel</mat-slide-toggle>\n </div>\n </div>\n <div fxLayout=\"row\" fxFlex=\"100\" fxLayoutAlign=\"space-between center\" class=\"mt-1\">\n <mat-form-field fxFlex=\"30\" fxLayoutAlign=\"start end\">\n <mat-select tabindex=\"3\" formControlName=\"selTransType\" placeholder=\"Transaction Type\">\n <mat-option *ngFor=\"let transType of transTypes\" [value]=\"transType.id\">\n {{transType.name}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field fxFlex=\"30\">\n <input matInput formControlName=\"transTypeValue\" type=\"number\" name=\"transTypeValue\" tabindex=\"4\" [placeholder]=\"channelFormGroup.controls.selTransType.value === '0' ? 'Default' : channelFormGroup.controls.selTransType.value === '1' ? 'Target Confirmation Blocks' : 'Fee (Sats/vByte)'\" [step]=\"1\" [required]=\"channelFormGroup.controls.selTransType.value !== '0'\">\n <mat-error *ngIf=\"channelFormGroup.controls.transTypeValue.errors?.required\">{{channelFormGroup.controls.selTransType.value === '0' ? 'Default' : channelFormGroup.controls.selTransType.value === '1' ? 'Target Confirmation Blocks' : 'Fee (Sats/vByte)'}} is required.</mat-error>\n </mat-form-field>\n <div fxFlex=\"35\" fxLayoutAlign=\"start center\">\n <mat-slide-toggle tabindex=\"6\" color=\"primary\" formControlName=\"spendUnconfirmed\" name=\"spendUnconfirmed\">Spend Unconfirmed Output</mat-slide-toggle>\n </div>\n </div>\n </div>\n <div *ngIf=\"channelConnectionError !== ''\" fxFlex=\"100\" class=\"alert alert-danger mt-1\">\n <fa-icon class=\"mr-1 alert-icon\" [icon]=\"faExclamationTriangle\"></fa-icon>\n <span>{{channelConnectionError}}</span>\n </div>\n <div class=\"mt-2\" fxLayout=\"row\" fxLayoutAlign=\"start center\" fxFlex=\"100\">\n <button mat-button color=\"primary\" tabindex=\"8\" type=\"button\" (click)=\"onOpenChannel()\">{{channelConnectionError !== '' ? 'Retry' : 'Open Channel'}}</button>\n </div>\n </form>\n </mat-step>\n </mat-vertical-stepper>\n <div fxLayout=\"row\" fxFlex=\"100\" fxLayoutAlign=\"end center\"> \n <button mat-button color=\"primary\" tabindex=\"12\" type=\"button\" default [mat-dialog-close]=\"false\">{{newlyAddedPeer?.pub_key ? 'Do It Later' : 'Close'}}</button>\n </div>\n </div>\n </mat-card-content>\n </div>\n</div>\n","import { Component, OnInit, OnDestroy, ViewChild, Inject } from '@angular/core';\nimport { UntypedFormGroup, UntypedFormBuilder, Validators } from '@angular/forms';\nimport { Subject } from 'rxjs';\nimport { take, takeUntil, filter } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { Actions } from '@ngrx/effects';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { MatStepper } from '@angular/material/stepper';\nimport { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';\n\nimport { LoggerService } from '../../../shared/services/logger.service';\nimport { Peer } from '../../../shared/models/lndModels';\nimport { OpenChannelAlert } from '../../../shared/models/alertData';\nimport { APICallStatusEnum, LNDActions, TRANS_TYPES } from '../../../shared/services/consts-enums-functions';\n\nimport { LNDEffects } from '../../store/lnd.effects';\nimport { RTLState } from '../../../store/rtl.state';\nimport { fetchGraphNode, saveNewChannel, saveNewPeer } from '../../store/lnd.actions';\nimport { lndNodeSettings } from '../../store/lnd.selector';\nimport { SelNodeChild } from '../../../shared/models/RTLconfig';\n\n@Component({\n selector: 'rtl-connect-peer',\n templateUrl: './connect-peer.component.html',\n styleUrls: ['./connect-peer.component.scss']\n})\nexport class ConnectPeerComponent implements OnInit, OnDestroy {\n\n @ViewChild('peersForm', { static: false }) form: any;\n @ViewChild('stepper', { static: false }) stepper: MatStepper;\n public faExclamationTriangle = faExclamationTriangle;\n public selNode: SelNodeChild | null = {};\n public peerAddress = '';\n public totalBalance = 0;\n public transTypes = TRANS_TYPES;\n public flgChannelOpened = false;\n public channelOpenStatus = null;\n public newlyAddedPeer: Peer | null = null;\n public flgEditable = true;\n public peerConnectionError = '';\n public channelConnectionError = '';\n public peerFormLabel = 'Peer Details';\n public channelFormLabel = 'Open Channel (Optional)';\n peerFormGroup: UntypedFormGroup;\n channelFormGroup: UntypedFormGroup;\n statusFormGroup: UntypedFormGroup;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject()];\n\n constructor(public dialogRef: MatDialogRef<ConnectPeerComponent>, @Inject(MAT_DIALOG_DATA) public data: OpenChannelAlert, private store: Store<RTLState>, private lndEffects: LNDEffects, private formBuilder: UntypedFormBuilder, private actions: Actions, private logger: LoggerService) { }\n\n ngOnInit() {\n this.totalBalance = this.data.message?.balance || 0;\n this.peerFormGroup = this.formBuilder.group({\n hiddenAddress: ['', [Validators.required]],\n peerAddress: ['', [Validators.required]]\n });\n this.channelFormGroup = this.formBuilder.group({\n fundingAmount: ['', [Validators.required, Validators.min(1), Validators.max(this.totalBalance)]],\n isPrivate: [!!this.selNode?.unannouncedChannels],\n selTransType: [TRANS_TYPES[0].id],\n transTypeValue: [{ value: '', disabled: true }],\n spendUnconfirmed: [false],\n hiddenAmount: ['', [Validators.required]]\n });\n this.statusFormGroup = this.formBuilder.group({});\n this.store.select(lndNodeSettings).pipe(takeUntil(this.unSubs[0])).\n subscribe((nodeSettings: SelNodeChild | null) => {\n this.selNode = nodeSettings;\n this.channelFormGroup.controls.isPrivate.setValue(!!nodeSettings?.unannouncedChannels);\n });\n this.channelFormGroup.controls.selTransType.valueChanges.pipe(takeUntil(this.unSubs[1])).subscribe((transType) => {\n if (transType === TRANS_TYPES[0].id) {\n this.channelFormGroup.controls.transTypeValue.setValue('');\n this.channelFormGroup.controls.transTypeValue.disable();\n this.channelFormGroup.controls.transTypeValue.setValidators(null);\n this.channelFormGroup.controls.transTypeValue.setErrors(null);\n } else {\n this.channelFormGroup.controls.transTypeValue.setValue('');\n this.channelFormGroup.controls.transTypeValue.enable();\n this.channelFormGroup.controls.transTypeValue.setValidators([Validators.required]);\n }\n });\n this.actions.pipe(\n takeUntil(this.unSubs[2]),\n filter((action) => action.type === LNDActions.NEWLY_ADDED_PEER_LND || action.type === LNDActions.FETCH_PENDING_CHANNELS_LND || action.type === LNDActions.UPDATE_API_CALL_STATUS_LND)).\n subscribe((action: any) => {\n if (action.type === LNDActions.NEWLY_ADDED_PEER_LND) {\n this.logger.info(action.payload);\n this.flgEditable = false;\n this.newlyAddedPeer = action.payload.peer;\n this.peerFormGroup.controls.hiddenAddress.setValue(this.peerFormGroup.controls.peerAddress.value);\n this.stepper.next();\n }\n if (action.type === LNDActions.FETCH_PENDING_CHANNELS_LND) {\n this.dialogRef.close();\n }\n if (action.type === LNDActions.UPDATE_API_CALL_STATUS_LND && action.payload.status === APICallStatusEnum.ERROR) {\n if (action.payload.action === 'SaveNewPeer' || action.payload.action === 'FetchGraphNode') {\n this.peerConnectionError = action.payload.message;\n } else if (action.payload.action === 'SaveNewChannel') {\n this.channelConnectionError = action.payload.message;\n }\n }\n });\n }\n\n onConnectPeer(): boolean | void {\n if (!this.peerFormGroup.controls.peerAddress.value) {\n return true;\n }\n this.peerConnectionError = '';\n const deviderIndex = this.peerFormGroup.controls.peerAddress.value.search('@');\n let pubkey = '';\n let host = '';\n if (deviderIndex > -1) {\n pubkey = this.peerFormGroup.controls.peerAddress.value.substring(0, deviderIndex);\n host = this.peerFormGroup.controls.peerAddress.value.substring(deviderIndex + 1);\n this.connectPeerWithParams(pubkey, host);\n } else {\n this.store.dispatch(fetchGraphNode({ payload: { pubkey: this.peerFormGroup.controls.peerAddress.value } }));\n this.lndEffects.setGraphNode.pipe(take(1)).subscribe((graphNode) => {\n setTimeout(() => {\n host = (graphNode.node.addresses && graphNode.node.addresses.length && graphNode.node.addresses.length > 0 && graphNode.node.addresses[0].addr) ? graphNode.node.addresses[0].addr : '';\n this.connectPeerWithParams(this.peerFormGroup.controls.peerAddress.value, host);\n }, 0);\n });\n }\n }\n\n connectPeerWithParams(pubkey: string, host: string) {\n this.store.dispatch(saveNewPeer({ payload: { pubkey: pubkey, host: host, perm: false } }));\n }\n\n onOpenChannel(): boolean | void {\n if (!this.channelFormGroup.controls.fundingAmount.value || ((this.totalBalance - this.channelFormGroup.controls.fundingAmount.value) < 0) ||\n (this.channelFormGroup.controls.selTransType.value === '1' && !this.channelFormGroup.controls.transTypeValue.value) || (this.channelFormGroup.controls.selTransType.value === '2' && !this.channelFormGroup.controls.transTypeValue.value)) {\n return true;\n }\n this.channelConnectionError = '';\n this.store.dispatch(saveNewChannel({\n payload: {\n selectedPeerPubkey: this.newlyAddedPeer?.pub_key!, fundingAmount: this.channelFormGroup.controls.fundingAmount.value, private: this.channelFormGroup.controls.isPrivate.value,\n transType: this.channelFormGroup.controls.selTransType.value, transTypeValue: this.channelFormGroup.controls.transTypeValue.value, spendUnconfirmed: this.channelFormGroup.controls.spendUnconfirmed.value\n }\n }));\n }\n\n onClose() {\n this.dialogRef.close(false);\n }\n\n stepSelectionChanged(event: any) {\n switch (event.selectedIndex) {\n case 0:\n this.peerFormLabel = 'Peer Details';\n this.channelFormLabel = 'Open Channel (Optional)';\n break;\n\n case 1:\n if (this.peerFormGroup.controls.peerAddress.value) {\n this.peerFormLabel = 'Peer Added: ' + this.newlyAddedPeer?.alias;\n } else {\n this.peerFormLabel = 'Peer Details';\n }\n this.channelFormLabel = 'Open Channel (Optional)';\n break;\n\n case 2:\n if (this.peerFormGroup.controls.peerAddress.value) {\n this.peerFormLabel = 'Peer Added: ' + this.newlyAddedPeer?.alias;\n } else {\n this.peerFormLabel = 'Peer Details';\n }\n if (this.channelFormGroup.controls.fundingAmount.value) {\n this.channelFormLabel = 'Opening Channel for ' + this.channelFormGroup.controls.fundingAmount.value + ' Sats';\n } else {\n this.channelFormLabel = 'Open Channel (Optional)';\n }\n break;\n\n default:\n this.peerFormLabel = 'Peer Details';\n this.channelFormLabel = 'Open Channel (Optional)';\n break;\n }\n if (event.selectedIndex < event.previouslySelectedIndex) {\n if (event.selectedIndex === 0) {\n this.peerFormGroup.controls.hiddenAddress.setValue('');\n } else if (event.selectedIndex === 1) {\n this.channelFormGroup.controls.hiddenAmount.setValue('');\n }\n }\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between stretch\" class=\"padding-gap-x\">\n <div fxLayout=\"row\">\n <button mat-flat-button color=\"primary\" type=\"submit\" tabindex=\"1\" (click)=\"onConnectPeer()\">Add Peer</button>\n </div>\n <div fxLayout=\"column\">\n <div fxLayout=\"column\" fxLayoutAlign=\"start stretch\" fxLayout.gt-sm=\"row wrap\" class=\"page-sub-title-container mt-1\">\n <div fxFlex=\"70\" fxLayoutAlign=\"start start\" fxLayoutAlign.gt-sm=\"start center\">\n <fa-icon class=\"page-title-img mr-1\" [icon]=\"faUsers\"></fa-icon>\n <span class=\"page-title\">Connected Peers</span>\n </div>\n <div fxFlex.gt-xs=\"30\" fxLayoutAlign.gt-xs=\"space-between center\" fxLayout=\"row\" fxLayoutAlign=\"space-between stretch\">\n <mat-form-field fxFlex=\"49\">\n <mat-select placeholder=\"Filter By\" tabindex=\"1\" name=\"filterBy\" [(ngModel)]=\"selFilterBy\" (selectionChange)=\"selFilter=''; applyFilter()\">\n <mat-option *ngFor=\"let column of ['all'].concat(displayedColumns.slice(0, -1))\" [value]=\"column\">{{getLabel(column)}}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field fxFlex=\"49\">\n <input matInput name=\"filter\" placeholder=\"Filter\" [(ngModel)]=\"selFilter\" (input)=\"applyFilter()\" (keyup)=\"applyFilter()\">\n </mat-form-field>\n </div>\n </div>\n <div fxLayout=\"column\" fxFlex=\"100\" class=\"table-container\" [perfectScrollbar]>\n <mat-progress-bar *ngIf=\"apiCallStatus.status === apiCallStatusEnum.INITIATED\" mode=\"indeterminate\"></mat-progress-bar>\n <table #table mat-table matSort [dataSource]=\"peers\" [ngClass]=\"{'error-border': errorMessage !== ''}\">\n <ng-container matColumnDef=\"alias\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Alias</th>\n <td *matCellDef=\"let peer\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{peer?.alias}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"pub_key\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Public Key</th>\n <td *matCellDef=\"let peer\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{peer?.pub_key}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"address\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Address</th>\n <td *matCellDef=\"let peer\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{peer?.address}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"sync_type\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Sync Type</th>\n <td *matCellDef=\"let peer\" mat-cell>{{peer?.sync_type | camelcaseWithReplace:'sync':'_'}}</td>\n </ng-container>\n <ng-container matColumnDef=\"inbound\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Inbound</th>\n <td *matCellDef=\"let peer\" mat-cell>{{peer?.inbound ? 'Yes' : 'No'}}</td>\n </ng-container>\n <ng-container matColumnDef=\"bytes_sent\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Bytes Sent</th>\n <td *matCellDef=\"let peer\" mat-cell><span fxLayoutAlign=\"end center\">{{peer?.bytes_sent | number}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"bytes_recv\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Bytes Received</th>\n <td *matCellDef=\"let peer\" mat-cell><span fxLayoutAlign=\"end center\">{{peer?.bytes_recv | number}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"sat_sent\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Sats Sent</th>\n <td *matCellDef=\"let peer\" mat-cell><span fxLayoutAlign=\"end center\">{{peer?.sat_sent | number}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"sat_recv\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Sats Received</th>\n <td *matCellDef=\"let peer\" mat-cell><span fxLayoutAlign=\"end center\">{{peer?.sat_recv | number}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"ping_time\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Ping Time (<span>&#181;</span>s)</th>\n <td *matCellDef=\"let peer\" mat-cell><span fxLayoutAlign=\"end center\">{{peer?.ping_time | number}} </span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"actions\">\n <th *matHeaderCellDef mat-header-cell>\n <div class=\"bordered-box table-actions-select\" fxLayoutAlign=\"center center\">\n <mat-select placeholder=\"Actions\" tabindex=\"1\" class=\"mr-0\">\n <mat-select-trigger></mat-select-trigger>\n <mat-option (click)=\"onDownloadCSV()\">Download CSV</mat-option>\n </mat-select>\n </div>\n </th>\n <td *matCellDef=\"let peer\" mat-cell fxLayoutAlign=\"end center\">\n <div class=\"bordered-box table-actions-select\" fxLayoutAlign=\"center center\">\n <mat-select placeholder=\"Actions\" tabindex=\"1\" class=\"mr-0\">\n <mat-select-trigger></mat-select-trigger>\n <mat-option (click)=\"onPeerClick(peer, $event)\">View Info</mat-option>\n <mat-option (click)=\"onOpenChannel(peer)\">Open Channel</mat-option>\n <mat-option (click)=\"onPeerDetach(peer)\">Disconnect</mat-option>\n </mat-select>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"no_peer\">\n <td *matFooterCellDef mat-footer-cellcolspan=\"4\">\n <p *ngIf=\"(!peers?.data || peers.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.COMPLETED\">No connected peer.</p>\n <p *ngIf=\"(!peers?.data || peers.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.INITIATED\">Getting peers...</p>\n <p *ngIf=\"(!peers?.data || peers.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.ERROR\">{{errorMessage}}</p>\n </td>\n </ng-container>\n <tr *matFooterRowDef=\"['no_peer']\" mat-footer-row [ngClass]=\"{'display-none': peers?.data && peers?.data?.length>0}\"></tr>\n <tr *matHeaderRowDef=\"displayedColumns\" mat-header-row></tr>\n <tr *matRowDef=\"let row; columns: displayedColumns;\" mat-row></tr>\n </table>\n </div>\n <mat-paginator class=\"mb-1\" [pageSize]=\"pageSize\" [pageSizeOptions]=\"pageSizeOptions\" [showFirstLastButtons]=\"screenSize === screenSizeEnum.XS ? false : true\"></mat-paginator>\n </div>\n</div>","import { Component, OnInit, OnDestroy, ViewChild, AfterViewInit } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { faUsers } from '@fortawesome/free-solid-svg-icons';\n\nimport { MatPaginator, MatPaginatorIntl } from '@angular/material/paginator';\nimport { MatSort } from '@angular/material/sort';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { Peer, GetInfo, BlockchainBalance } from '../../../shared/models/lndModels';\nimport { PAGE_SIZE, PAGE_SIZE_OPTIONS, getPaginatorLabel, AlertTypeEnum, DataTypeEnum, ScreenSizeEnum, APICallStatusEnum, SortOrderEnum, LND_DEFAULT_PAGE_SETTINGS, LND_PAGE_DEFS } from '../../../shared/services/consts-enums-functions';\nimport { ApiCallStatusPayload } from '../../../shared/models/apiCallsPayload';\nimport { LoggerService } from '../../../shared/services/logger.service';\nimport { CommonService } from '../../../shared/services/common.service';\nimport { OpenChannelComponent } from '../channels/open-channel-modal/open-channel.component';\nimport { ConnectPeerComponent } from '../connect-peer/connect-peer.component';\n\nimport { RTLEffects } from '../../../store/rtl.effects';\nimport { RTLState } from '../../../store/rtl.state';\nimport { openAlert, openConfirmation } from '../../../store/rtl.actions';\nimport { detachPeer } from '../../store/lnd.actions';\nimport { blockchainBalance, lndNodeInformation, lndPageSettings, peers } from '../../store/lnd.selector';\nimport { ColumnDefinition, PageSettings, TableSetting } from '../../../shared/models/pageSettings';\nimport { CamelCaseWithReplacePipe } from '../../../shared/pipes/app.pipe';\n\n@Component({\n selector: 'rtl-peers',\n templateUrl: './peers.component.html',\n styleUrls: ['./peers.component.scss'],\n providers: [\n { provide: MatPaginatorIntl, useValue: getPaginatorLabel('Peers') }\n ]\n})\nexport class PeersComponent implements OnInit, AfterViewInit, OnDestroy {\n\n @ViewChild(MatSort, { static: false }) sort: MatSort | undefined;\n @ViewChild(MatPaginator, { static: false }) paginator: MatPaginator | undefined;\n public nodePageDefs = LND_PAGE_DEFS;\n public selFilterBy = 'all';\n public colWidth = '20rem';\n public PAGE_ID = 'peers_channels';\n public tableSetting: TableSetting = { tableId: 'peers', recordsPerPage: PAGE_SIZE, sortBy: 'alias', sortOrder: SortOrderEnum.DESCENDING };\n public availableBalance = 0;\n public faUsers = faUsers;\n public displayedColumns: any[] = [];\n public peersData: Peer[] = [];\n public peers: any = new MatTableDataSource([]);\n public information: GetInfo = {};\n public pageSize = PAGE_SIZE;\n public pageSizeOptions = PAGE_SIZE_OPTIONS;\n public screenSize = '';\n public screenSizeEnum = ScreenSizeEnum;\n public errorMessage = '';\n public selFilter = '';\n public apiCallStatus: ApiCallStatusPayload | null = null;\n public apiCallStatusEnum = APICallStatusEnum;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject(), new Subject(), new Subject(), new Subject()];\n\n constructor(private logger: LoggerService, private store: Store<RTLState>, private rtlEffects: RTLEffects, private commonService: CommonService, private camelCaseWithReplace: CamelCaseWithReplacePipe) {\n this.screenSize = this.commonService.getScreenSize();\n }\n\n ngOnInit() {\n this.store.select(lndNodeInformation).pipe(takeUntil(this.unSubs[0])).subscribe((nodeInfo: GetInfo) => { this.information = nodeInfo; });\n this.store.select(lndPageSettings).pipe(takeUntil(this.unSubs[1])).\n subscribe((settings: { pageSettings: PageSettings[], apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessage = '';\n this.apiCallStatus = settings.apiCallStatus;\n if (this.apiCallStatus.status === APICallStatusEnum.ERROR) {\n this.errorMessage = this.apiCallStatus.message || '';\n }\n this.tableSetting = settings.pageSettings.find((page) => page.pageId === this.PAGE_ID)?.tables.find((table) => table.tableId === this.tableSetting.tableId) || LND_DEFAULT_PAGE_SETTINGS.find((page) => page.pageId === this.PAGE_ID)?.tables.find((table) => table.tableId === this.tableSetting.tableId)!;\n if (this.screenSize === ScreenSizeEnum.XS || this.screenSize === ScreenSizeEnum.SM) {\n this.displayedColumns = JSON.parse(JSON.stringify(this.tableSetting.columnSelectionSM));\n } else {\n this.displayedColumns = JSON.parse(JSON.stringify(this.tableSetting.columnSelection));\n }\n this.displayedColumns.push('actions');\n this.pageSize = this.tableSetting.recordsPerPage ? +this.tableSetting.recordsPerPage : PAGE_SIZE;\n this.colWidth = this.displayedColumns.length ? ((this.commonService.getContainerSize().width / this.displayedColumns.length) / 10) + 'rem' : '20rem';\n this.logger.info(this.displayedColumns);\n });\n this.store.select(blockchainBalance).pipe(takeUntil(this.unSubs[2])).\n subscribe((bcBalanceSelector: { blockchainBalance: BlockchainBalance, apiCallStatus: ApiCallStatusPayload }) => {\n this.availableBalance = bcBalanceSelector.blockchainBalance.total_balance || 0;\n });\n this.store.select(peers).pipe(takeUntil(this.unSubs[3])).\n subscribe((peersSelector: { peers: Peer[], apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessage = '';\n this.apiCallStatus = peersSelector.apiCallStatus;\n if (this.apiCallStatus.status === APICallStatusEnum.ERROR) {\n this.errorMessage = !this.apiCallStatus.message ? '' : (typeof (this.apiCallStatus.message) === 'object') ? JSON.stringify(this.apiCallStatus.message) : this.apiCallStatus.message;\n }\n this.peersData = peersSelector.peers;\n if (this.peersData.length > 0) {\n this.loadPeersTable(this.peersData);\n }\n this.logger.info(peersSelector);\n });\n }\n\n ngAfterViewInit() {\n if (this.peersData.length > 0) {\n this.loadPeersTable(this.peersData);\n }\n }\n\n onPeerClick(selPeer: Peer, event: any) {\n // const encodedStr = encodeURIComponent('&#181;');\n const reorderedPeer = [\n [{ key: 'pub_key', value: selPeer.pub_key, title: 'Public Key', width: 100 }],\n [{ key: 'address', value: selPeer.address, title: 'Address', width: 100 }],\n [{ key: 'alias', value: selPeer.alias, title: 'Alias', width: 40 }, { key: 'inbound', value: selPeer.inbound ? 'True' : 'False', title: 'Inbound', width: 30 }, { key: 'ping_time', value: selPeer.ping_time, title: 'Ping Time (\\u00B5s)', width: 30, type: DataTypeEnum.NUMBER }],\n [{ key: 'sat_sent', value: selPeer.sat_sent, title: 'Satoshis Sent', width: 50, type: DataTypeEnum.NUMBER }, { key: 'sat_recv', value: selPeer.sat_recv, title: 'Satoshis Received', width: 50, type: DataTypeEnum.NUMBER }],\n [{ key: 'bytes_sent', value: selPeer.bytes_sent, title: 'Bytes Sent', width: 50, type: DataTypeEnum.NUMBER }, { key: 'bytes_recv', value: selPeer.bytes_recv, title: 'Bytes Received', width: 50, type: DataTypeEnum.NUMBER }]\n ];\n this.store.dispatch(openAlert({\n payload: {\n data: {\n type: AlertTypeEnum.INFORMATION,\n alertTitle: 'Peer Information',\n showQRName: 'Public Key',\n showQRField: selPeer.pub_key,\n message: reorderedPeer\n }\n }\n }));\n }\n\n onConnectPeer() {\n this.store.dispatch(openAlert({\n payload: {\n data: {\n message: { peer: null, information: this.information, balance: this.availableBalance },\n component: ConnectPeerComponent\n }\n }\n }));\n }\n\n onOpenChannel(peerToAddChannel: Peer) {\n const peerToAddChannelMessage = {\n peer: peerToAddChannel,\n information: this.information,\n balance: this.availableBalance\n };\n this.store.dispatch(openAlert({\n payload: {\n data: {\n alertTitle: 'Open Channel',\n message: peerToAddChannelMessage,\n component: OpenChannelComponent\n }\n }\n }));\n }\n\n onPeerDetach(peerToDetach: Peer) {\n const msg = 'Disconnect peer: ' + ((peerToDetach.alias) ? peerToDetach.alias : peerToDetach.pub_key);\n this.store.dispatch(openConfirmation({\n payload: {\n data: {\n type: AlertTypeEnum.CONFIRM,\n alertTitle: 'Disconnect Peer',\n titleMessage: msg,\n noBtnText: 'Cancel',\n yesBtnText: 'Disconnect'\n }\n }\n }));\n this.rtlEffects.closeConfirm.\n pipe(takeUntil(this.unSubs[4])).\n subscribe((confirmRes) => {\n if (confirmRes) {\n this.store.dispatch(detachPeer({ payload: { pubkey: peerToDetach.pub_key! } }));\n }\n });\n }\n\n applyFilter() {\n this.peers.filter = this.selFilter.trim().toLowerCase();\n }\n\n getLabel(column: string) {\n const returnColumn: ColumnDefinition = this.nodePageDefs[this.PAGE_ID][this.tableSetting.tableId].allowedColumns.find((col) => col.column === column);\n return returnColumn ? returnColumn.label ? returnColumn.label : this.camelCaseWithReplace.transform(returnColumn.column, '_') : this.commonService.titleCase(column);\n }\n\n setFilterPredicate() {\n this.peers.filterPredicate = (rowData: Peer, fltr: string) => {\n let rowToFilter = '';\n switch (this.selFilterBy) {\n case 'all':\n rowToFilter = JSON.stringify(rowData).toLowerCase();\n break;\n\n case 'sync_type':\n rowToFilter = this.camelCaseWithReplace.transform((rowData.sync_type || ''), 'sync', '_').trim().toLowerCase();\n break;\n\n default:\n rowToFilter = typeof rowData[this.selFilterBy] === 'undefined' ? '' : typeof rowData[this.selFilterBy] === 'string' ? rowData[this.selFilterBy].toLowerCase() : typeof rowData[this.selFilterBy] === 'boolean' ? (rowData[this.selFilterBy] ? 'yes' : 'no') : rowData[this.selFilterBy].toString();\n break;\n }\n return this.selFilterBy === 'sync_type' ? rowToFilter.indexOf(fltr) === 0 : rowToFilter.includes(fltr);\n };\n }\n\n loadPeersTable(peers: Peer[]) {\n this.peers = peers ? new MatTableDataSource<Peer>([...peers]) : new MatTableDataSource([]);\n this.peers.sort = this.sort;\n this.peers.sortingDataAccessor = (data: any, sortHeaderId: string) => ((data[sortHeaderId] && isNaN(data[sortHeaderId])) ? data[sortHeaderId].toLocaleLowerCase() : data[sortHeaderId] ? +data[sortHeaderId] : null);\n this.peers.sort?.sort({ id: this.tableSetting.sortBy, start: this.tableSetting.sortOrder, disableClear: true });\n this.peers.paginator = this.paginator;\n this.setFilterPredicate();\n this.applyFilter();\n }\n\n onDownloadCSV() {\n if (this.peers.data && this.peers.data.length > 0) {\n this.commonService.downloadFile(this.peers.data, 'Peers');\n }\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between stretch\" class=\"padding-gap-x\">\n <div fxLayout=\"row\">\n <button mat-flat-button color=\"primary\" type=\"submit\" tabindex=\"1\" (click)=\"onOpenChannel()\">Open Channel</button>\n </div>\n <div fxLayout=\"column\" fxFlex=\"100\" class=\"my-2 bordered-box\">\n <mat-tab-group mat-stretch-tabs=\"false\" mat-align-tabs=\"start\" [(selectedIndex)]=\"activeLink\" (selectedTabChange)=\"onSelectedTabChange($event)\">\n <mat-tab>\n <ng-template mat-tab-label>\n <span matBadgeOverlap=\"false\" class=\"tab-badge\" matBadge=\"{{numOpenChannels}}\">Open</span>\n </ng-template>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>\n <span matBadgeOverlap=\"false\" class=\"tab-badge\" matBadge=\"{{numPendingChannels}}\">Pending</span>\n </ng-template>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>\n <span matBadgeOverlap=\"false\" class=\"tab-badge\" matBadge=\"{{numClosedChannels}}\">Closed</span>\n </ng-template>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>\n <span matBadgeOverlap=\"false\" class=\"tab-badge\" matBadge=\"{{numActiveHTLCs}}\">Active HTLCs</span>\n </ng-template>\n </mat-tab>\n </mat-tab-group>\n <div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between stretch\" class=\"padding-gap-x-large\">\n <router-outlet></router-outlet>\n </div>\n </div>\n</div>\n","import { Component, OnInit, OnDestroy } from '@angular/core';\nimport { Router, ResolveEnd, Event } from '@angular/router';\nimport { Subject } from 'rxjs';\nimport { takeUntil, filter } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\n\nimport { OpenChannelComponent } from '../open-channel-modal/open-channel.component';\nimport { Peer, GetInfo, Channel, ChannelsSummary, LightningBalance, PendingChannelsSummary, PendingChannels, ClosedChannel, BlockchainBalance } from '../../../../shared/models/lndModels';\nimport { LoggerService } from '../../../../shared/services/logger.service';\n\nimport { RTLState } from '../../../../store/rtl.state';\nimport { openAlert } from '../../../../store/rtl.actions';\nimport { blockchainBalance, channels, closedChannels, lndNodeInformation, peers, pendingChannels } from '../../../store/lnd.selector';\nimport { ApiCallStatusPayload } from '../../../../shared/models/apiCallsPayload';\n\n@Component({\n selector: 'rtl-channels-tables',\n templateUrl: './channels-tables.component.html',\n styleUrls: ['./channels-tables.component.scss']\n})\nexport class ChannelsTablesComponent implements OnInit, OnDestroy {\n\n public numOpenChannels = 0;\n public numPendingChannels = 0;\n public numClosedChannels = 0;\n public numActiveHTLCs = 0;\n public peers: Peer[] = [];\n public information: GetInfo = {};\n public totalBalance = 0;\n public links = [{ link: 'open', name: 'Open' }, { link: 'pending', name: 'Pending' }, { link: 'closed', name: 'Closed' }, { link: 'activehtlcs', name: 'Active HTLCs' }];\n public activeLink = 0;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject(), new Subject(), new Subject(), new Subject(), new Subject()];\n\n constructor(private logger: LoggerService, private store: Store<RTLState>, private router: Router) { }\n\n ngOnInit() {\n this.activeLink = this.links.findIndex((link) => link.link === this.router.url.substring(this.router.url.lastIndexOf('/') + 1));\n this.router.events.pipe(takeUntil(this.unSubs[0]), filter((e) => e instanceof ResolveEnd)).\n subscribe({\n next: (value: ResolveEnd | Event) => {\n this.activeLink = this.links.findIndex((link) => link.link === (<ResolveEnd>value).urlAfterRedirects.substring((<ResolveEnd>value).urlAfterRedirects.lastIndexOf('/') + 1));\n }\n });\n this.store.select(lndNodeInformation).pipe(takeUntil(this.unSubs[1])).subscribe((nodeInfo: GetInfo) => { this.information = nodeInfo; });\n this.store.select(channels).pipe(takeUntil(this.unSubs[2])).\n subscribe((channelsSelector: { channels: Channel[], channelsSummary: ChannelsSummary, lightningBalance: LightningBalance, apiCallStatus: ApiCallStatusPayload }) => {\n this.numOpenChannels = (channelsSelector.channels && channelsSelector.channels.length) ? channelsSelector.channels.length : 0;\n this.numActiveHTLCs = channelsSelector.channels?.reduce((totalHTLCs, channel) => totalHTLCs + (channel.pending_htlcs && channel.pending_htlcs.length > 0 ? channel.pending_htlcs.length : 0), 0);\n this.logger.info(channelsSelector);\n });\n this.store.select(pendingChannels).pipe(takeUntil(this.unSubs[3])).\n subscribe((pendingChannelsSelector: { pendingChannels: PendingChannels, pendingChannelsSummary: PendingChannelsSummary, apiCallStatus: ApiCallStatusPayload }) => {\n this.numPendingChannels = (pendingChannelsSelector.pendingChannelsSummary.total_channels) ? pendingChannelsSelector.pendingChannelsSummary.total_channels : 0;\n });\n this.store.select(closedChannels).pipe(takeUntil(this.unSubs[4])).\n subscribe((closedChannelsSelector: { closedChannels: ClosedChannel[], apiCallStatus: ApiCallStatusPayload }) => {\n this.numClosedChannels = (closedChannelsSelector.closedChannels && closedChannelsSelector.closedChannels.length) ? closedChannelsSelector.closedChannels.length : 0;\n });\n this.store.select(blockchainBalance).pipe(takeUntil(this.unSubs[5])).\n subscribe((bcBalanceSelector: { blockchainBalance: BlockchainBalance, apiCallStatus: ApiCallStatusPayload }) => {\n this.totalBalance = +(bcBalanceSelector.blockchainBalance.total_balance || 0);\n });\n this.store.select(peers).pipe(takeUntil(this.unSubs[6])).\n subscribe((peersSelector: { peers: Peer[], apiCallStatus: ApiCallStatusPayload }) => {\n this.peers = peersSelector.peers;\n this.peers.forEach((peer) => {\n if (!peer.alias || peer.alias === '') {\n peer.alias = peer.pub_key?.substring(0, 20);\n }\n });\n this.logger.info(peersSelector);\n });\n }\n\n onOpenChannel() {\n const peerToAddChannelMessage = {\n peers: this.peers,\n information: this.information,\n balance: this.totalBalance\n };\n this.store.dispatch(openAlert({\n payload: {\n data: {\n alertTitle: 'Open Channel',\n message: peerToAddChannelMessage,\n component: OpenChannelComponent\n }\n }\n }));\n }\n\n onSelectedTabChange(event) {\n this.router.navigateByUrl('/lnd/connections/channels/' + this.links[event.index].link);\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"column\" fxLayout.gt-sm=\"row\" fxLayoutAlign=\"space-between stretch\">\n <div fxFlex=\"100\">\n <mat-card-header fxLayout=\"row\" fxLayoutAlign=\"space-between center\" class=\"modal-info-header\">\n <div fxFlex=\"95\" fxLayoutAlign=\"start start\">\n <fa-icon class=\"page-title-img mr-1\" [icon]=\"faReceipt\"></fa-icon>\n <span class=\"page-title\">Channel Information</span>\n </div>\n <button tabindex=\"3\" fxFlex=\"5\" fxLayoutAlign=\"center\" class=\"btn-close-x p-0\" mat-button (click)=\"onClose()\">X</button>\n </mat-card-header>\n <mat-card-content class=\"padding-gap-x-large\" [ngClass]=\"{'xs-scroll-y': screenSize === screenSizeEnum.XS}\">\n <div fxLayout=\"column\">\n <div fxLayout=\"row\">\n <div fxFlex=\"50\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Channel ID</h4>\n <span class=\"foreground-secondary-text\">{{channel.chan_id}}</span>\n </div>\n <div fxFlex=\"50\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Peer Alias</h4>\n <span class=\"foreground-secondary-text\">{{channel.remote_alias}}</span>\n </div>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"row\">\n <div fxFlex=\"100\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Channel Point</h4>\n <span class=\"foreground-secondary-text\">{{channel.channel_point}}</span>\n </div>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"row\">\n <div fxFlex=\"100\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Peer Public Key</h4>\n <span class=\"foreground-secondary-text\">{{channel.remote_pubkey}}</span>\n </div>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"row\">\n <div fxFlex=\"25\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Local Balance</h4>\n <span class=\"overflow-wrap foreground-secondary-text\">{{channel.local_balance | number}}</span>\n </div>\n <div fxFlex=\"25\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Remote Balance</h4>\n <span class=\"overflow-wrap foreground-secondary-text\">{{channel.remote_balance | number}}</span>\n </div>\n <div fxFlex=\"25\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Capacity</h4>\n <span class=\"overflow-wrap foreground-secondary-text\">{{channel.capacity | number}}</span>\n </div>\n <div fxFlex=\"25\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Uptime (Seconds)</h4>\n <span class=\"overflow-wrap foreground-secondary-text\">{{channel.uptime | number}}</span>\n </div>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"row\">\n <div fxFlex=\"25\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Active</h4>\n <span class=\"overflow-wrap foreground-secondary-text\">{{channel.active ? 'Yes' : 'No'}}</span>\n </div>\n <div fxFlex=\"25\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Private</h4>\n <span class=\"overflow-wrap foreground-secondary-text\">{{channel.private ? 'Yes' : 'No'}}</span>\n </div>\n <div fxFlex=\"25\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Initiator</h4>\n <span class=\"overflow-wrap foreground-secondary-text\">{{channel.initiator ? 'Yes' : 'No'}}</span>\n </div>\n <div fxFlex=\"25\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Number of Updates</h4>\n <span class=\"overflow-wrap foreground-secondary-text\">{{channel.num_updates | number}}</span>\n </div>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div *ngIf=\"showAdvanced\">\n <div fxLayout=\"row\">\n <div fxFlex=\"25\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Commit Fee</h4>\n <span class=\"overflow-wrap foreground-secondary-text\">{{channel.commit_fee | number}}</span>\n </div>\n <div fxFlex=\"25\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Commit Weight</h4>\n <span class=\"overflow-wrap foreground-secondary-text\">{{channel.commit_weight | number}}</span>\n </div>\n <div fxFlex=\"25\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Fee/KW</h4>\n <span class=\"overflow-wrap foreground-secondary-text\">{{channel.fee_per_kw | number}}</span>\n </div>\n <div fxFlex=\"25\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Static Remote Key</h4>\n <span class=\"overflow-wrap foreground-secondary-text\">{{channel.static_remote_key ? 'Yes' : 'No'}}</span>\n </div>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"row\">\n <div fxFlex=\"25\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">{{screenSize === screenSizeEnum.XS ? 'Total Sats Sent' : 'Total Satoshis Sent'}}</h4>\n <span class=\"overflow-wrap foreground-secondary-text\">{{channel.total_satoshis_sent | number}}</span>\n </div>\n <div fxFlex=\"25\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">{{screenSize === screenSizeEnum.XS ? 'Total Sats Recv' : 'Total Satoshis Received'}}</h4>\n <span class=\"overflow-wrap foreground-secondary-text\">{{channel.total_satoshis_received | number}}</span>\n </div>\n <div fxFlex=\"25\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Unsettled Balance</h4>\n <span class=\"overflow-wrap foreground-secondary-text\">{{channel.unsettled_balance | number}}</span>\n </div>\n <div fxFlex=\"25\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">CSV Delay</h4>\n <span class=\"overflow-wrap foreground-secondary-text\">{{channel.csv_delay | number}}</span>\n </div>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"row\">\n <div fxFlex=\"25\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Local Reserve (Sats)</h4>\n <span class=\"overflow-wrap foreground-secondary-text\">{{channel.local_chan_reserve_sat | number}}</span>\n </div>\n <div fxFlex=\"25\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Remote Reserve (Sats)</h4>\n <span class=\"overflow-wrap foreground-secondary-text\">{{channel.remote_chan_reserve_sat | number}}</span>\n </div>\n <div fxFlex=\"25\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Lifetime (Seconds)</h4>\n <span class=\"overflow-wrap foreground-secondary-text\">{{channel.lifetime | number}}</span>\n </div>\n <div fxFlex=\"25\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Pending HTLCs</h4>\n <span class=\"overflow-wrap foreground-secondary-text\">{{channel?.pending_htlcs?.length | number}}</span>\n </div>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n </div>\n <div class=\"mt-1\" fxLayout=\"row\" fxLayoutAlign=\"end center\" fxFlex=\"100\">\n <button mat-button color=\"primary\" type=\"reset\" tabindex=\"1\" class=\"mr-1\" (click)=\"onShowAdvanced()\">\n <p *ngIf=\"!showAdvanced; else hideAdvancedText\">Show Advanced</p>\n <ng-template #hideAdvancedText><p>Hide Advanced</p></ng-template>\n </button>\n <button *ngIf=\"showCopy\" autoFocus mat-button color=\"primary\" tabindex=\"2\" type=\"submit\" rtlClipboard [payload]=\"channel.chan_id\" (copied)=\"onCopyChanID($event)\">Copy Channel ID</button>\n <button *ngIf=\"!showCopy\" autoFocus mat-button color=\"primary\" tabindex=\"2\" type=\"button\" (click)=\"onClose()\">OK</button>\n </div>\n </div>\n </mat-card-content>\n </div>\n</div>\n","import { Component, OnInit, Inject } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { faReceipt } from '@fortawesome/free-solid-svg-icons';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\nimport { LoggerService } from '../../../../shared/services/logger.service';\nimport { CommonService } from '../../../../shared/services/common.service';\nimport { ChannelInformation } from '../../../../shared/models/alertData';\nimport { Channel } from '../../../../shared/models/lndModels';\nimport { ScreenSizeEnum } from '../../../../shared/services/consts-enums-functions';\n\n@Component({\n selector: 'rtl-channel-information',\n templateUrl: './channel-information.component.html',\n styleUrls: ['./channel-information.component.scss']\n})\nexport class ChannelInformationComponent implements OnInit {\n\n public faReceipt = faReceipt;\n public showAdvanced = false;\n public showCopy = true;\n public showCopyField = null;\n public channel: Channel;\n public screenSize = '';\n public screenSizeEnum = ScreenSizeEnum;\n\n constructor(public dialogRef: MatDialogRef<ChannelInformationComponent>, @Inject(MAT_DIALOG_DATA) public data: ChannelInformation, private logger: LoggerService, private commonService: CommonService, private snackBar: MatSnackBar) { }\n\n ngOnInit() {\n this.channel = this.data.channel;\n this.showCopy = !!this.data.showCopy;\n this.screenSize = this.commonService.getScreenSize();\n }\n\n onClose() {\n this.dialogRef.close(false);\n }\n\n onShowAdvanced() {\n this.showAdvanced = !this.showAdvanced;\n }\n\n onCopyChanID(payload: string) {\n this.snackBar.open('Channel ID ' + payload + ' copied.');\n this.logger.info('Copied Text: ' + payload);\n }\n\n}\n","<ng-container\n *ngTemplateOutlet=\"stepNumber === 1 ? infoStepBlock1: stepNumber === 2 ? infoStepBlock2 : stepNumber === 3 ? infoStepBlock3 : stepNumber === 4 ? infoStepBlock4 : infoStepBlock5\">\n</ng-container>\n<ng-template #infoStepBlock1>\n <div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between stretch\" [@sliderAnimation]=\"animationDirection\"\n (swipe)=\"onSwipe($event)\">\n <svg fxFlex=\"30\" viewBox=\"0 0 246 154\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/2000/svg\"\n [ngClass]=\"{'small-svg': screenSize === screenSizeEnum.XS, 'large-svg': screenSize !== screenSizeEnum.XS}\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M187.8 136C203.043 136 215.4 133.493 215.4 130.4C215.4 127.307 203.043 124.8 187.8 124.8C172.557 124.8 160.2 127.307 160.2 130.4C160.2 133.493 172.557 136 187.8 136Z\" stroke=\"#C4B7FF\" stroke-width=\"0.8\" stroke-dasharray=\"4 4\"/>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M128.6 148.8C143.843 148.8 156.2 146.293 156.2 143.2C156.2 140.107 143.843 137.6 128.6 137.6C113.357 137.6 101 140.107 101 143.2C101 146.293 113.357 148.8 128.6 148.8Z\" stroke=\"#C4B7FF\" stroke-width=\"0.8\" stroke-dasharray=\"4 4\"/>\n <path opacity=\"0.1\" d=\"M100.2 117.421C100.2 117.421 99.0633 117.494 99.4998 117.722C99.9363 117.95 100.2 117.421 100.2 117.421Z\" fill=\"black\"/>\n <path opacity=\"0.1\" d=\"M101 118.4C100.986 118.471 98.1102 119.483 98.673 119.933C99.2358 120.384 101 118.4 101 118.4Z\" fill=\"black\"/>\n <path opacity=\"0.1\" d=\"M97.8 128.98C98.0492 128.966 100.509 128.241 101 128.89L97.8 128.98Z\" fill=\"black\"/>\n <path opacity=\"0.1\" d=\"M100.2 129.709C100.2 129.709 100.563 129.362 100.926 129.543C101.289 129.725 100.2 129.709 100.2 129.709Z\" fill=\"black\"/>\n <path opacity=\"0.1\" d=\"M101.8 132C101.8 132 101.641 133.198 101 133.6L101.8 132Z\" fill=\"black\"/>\n <path d=\"M119.223 21.4239L123.102 22.0818L118.209 50.9111L114.33 50.2532L119.223 21.4239Z\" fill=\"#444053\"/>\n <path d=\"M127.4 137.844L128.262 144L129 137.6L127.4 137.844Z\" fill=\"#D0D2D5\"/>\n <path d=\"M100.2 134.349V138.226L101 141.6H101.571L102.258 137.976L102.6 133.6L100.2 134.349Z\" fill=\"#3F3D56\"/>\n <path d=\"M110.75 50.4L104.806 87.6521C104.806 87.6521 96.0162 127.358 99.3581 135.2H103.57L116.2 58.9791L110.75 50.4Z\" fill=\"#D0D2D5\"/>\n <path d=\"M125.308 45.6L129.979 83.02C129.979 83.02 133.381 130.691 129.656 138.4H125.976L119.4 53.9698L125.308 45.6Z\" fill=\"#D0D2D5\"/>\n <path d=\"M110.017 36.2213C110.634 34.1443 112.565 32.7417 114.724 32.8019C118.318 32.893 123.873 33.5496 126.77 36.5268C131.261 41.1521 123.736 56.731 123.736 56.731C123.736 56.731 116.69 69.7545 110.267 53.2022C110.258 53.2159 107.595 44.3527 110.017 36.2213Z\" fill=\"#444053\"/>\n <path opacity=\"0.1\" d=\"M110.017 36.2213C110.634 34.1443 112.565 32.7417 114.724 32.8019C118.318 32.893 123.873 33.5496 126.77 36.5268C131.261 41.1521 123.736 56.731 123.736 56.731C123.736 56.731 116.69 69.7545 110.267 53.2022C110.258 53.2159 107.595 44.3527 110.017 36.2213Z\" fill=\"black\"/>\n <path d=\"M112.922 39.2661C113.364 37.7699 114.731 36.7605 116.259 36.8012C118.804 36.8682 122.74 37.3423 124.787 39.4927C127.969 42.8316 122.638 54.0832 122.638 54.0832C122.638 54.0832 117.661 63.4872 113.092 51.5396C113.092 51.5327 111.203 45.1393 112.922 39.2661Z\" fill=\"#444053\"/>\n <path opacity=\"0.1\" d=\"M131.383 131.52C131.69 131.628 131.968 131.791 132.2 132C131.813 131.613 130.708 131.42 130.166 131.24C129.495 131.019 128.764 130.793 128.2 130.4C129.29 130.705 130.354 131.079 131.383 131.52Z\" fill=\"black\"/>\n <path opacity=\"0.1\" d=\"M94.2 24.8C96.1882 24.8 97.8 23.1882 97.8 21.2C97.8 19.2118 96.1882 17.6 94.2 17.6C92.2117 17.6 90.6 19.2118 90.6 21.2C90.6 23.1882 92.2117 24.8 94.2 24.8Z\" fill=\"#6C63FF\"/>\n <path opacity=\"0.1\" d=\"M107 12C110.314 12 113 9.31371 113 6C113 2.68629 110.314 0 107 0C103.686 0 101 2.68629 101 6C101 9.31371 103.686 12 107 12Z\" fill=\"#6C63FF\"/>\n <path opacity=\"0.1\" d=\"M99 40.8C102.314 40.8 105 38.1137 105 34.8C105 31.4863 102.314 28.8 99 28.8C95.6863 28.8 93 31.4863 93 34.8C93 38.1137 95.6863 40.8 99 40.8Z\" fill=\"#6C63FF\"/>\n <path opacity=\"0.1\" d=\"M223 67.2C224.988 67.2 226.6 65.5882 226.6 63.6C226.6 61.6118 224.988 60 223 60C221.012 60 219.4 61.6118 219.4 63.6C219.4 65.5882 221.012 67.2 223 67.2Z\" fill=\"#6C63FF\"/>\n <path opacity=\"0.1\" d=\"M210.2 54.4C213.514 54.4 216.2 51.7137 216.2 48.4C216.2 45.0863 213.514 42.4 210.2 42.4C206.886 42.4 204.2 45.0863 204.2 48.4C204.2 51.7137 206.886 54.4 210.2 54.4Z\" fill=\"#6C63FF\"/>\n <path opacity=\"0.1\" d=\"M218.2 83.2C221.514 83.2 224.2 80.5137 224.2 77.2C224.2 73.8863 221.514 71.2 218.2 71.2C214.886 71.2 212.2 73.8863 212.2 77.2C212.2 80.5137 214.886 83.2 218.2 83.2Z\" fill=\"#6C63FF\"/>\n <path opacity=\"0.1\" d=\"M23.8 72C24.9046 72 25.8 71.1046 25.8 70C25.8 68.8954 24.9046 68 23.8 68C22.6954 68 21.8 68.8954 21.8 70C21.8 71.1046 22.6954 72 23.8 72Z\" fill=\"#6C63FF\"/>\n <path opacity=\"0.1\" d=\"M33 65.6C34.7673 65.6 36.2 64.1673 36.2 62.4C36.2 60.6327 34.7673 59.2 33 59.2C31.2327 59.2 29.8 60.6327 29.8 62.4C29.8 64.1673 31.2327 65.6 33 65.6Z\" fill=\"#6C63FF\"/>\n <path opacity=\"0.1\" d=\"M17 71.2C18.7673 71.2 20.2 69.7673 20.2 68C20.2 66.2327 18.7673 64.8 17 64.8C15.2327 64.8 13.8 66.2327 13.8 68C13.8 69.7673 15.2327 71.2 17 71.2Z\" fill=\"#6C63FF\"/>\n <path opacity=\"0.1\" d=\"M171.8 60C172.905 60 173.8 59.1046 173.8 58C173.8 56.8954 172.905 56 171.8 56C170.695 56 169.8 56.8954 169.8 58C169.8 59.1046 170.695 60 171.8 60Z\" fill=\"#6C63FF\"/>\n <path opacity=\"0.1\" d=\"M180.2 53.6C181.967 53.6 183.4 52.1673 183.4 50.4C183.4 48.6327 181.967 47.2 180.2 47.2C178.433 47.2 177 48.6327 177 50.4C177 52.1673 178.433 53.6 180.2 53.6Z\" fill=\"#6C63FF\"/>\n <path opacity=\"0.1\" d=\"M164.2 59.2C165.967 59.2 167.4 57.7673 167.4 56C167.4 54.2327 165.967 52.8 164.2 52.8C162.433 52.8 161 54.2327 161 56C161 57.7673 162.433 59.2 164.2 59.2Z\" fill=\"#6C63FF\"/>\n <path opacity=\"0.1\" d=\"M51 40.8C55.6392 40.8 59.4 37.0392 59.4 32.4C59.4 27.7608 55.6392 24 51 24C46.3608 24 42.6 27.7608 42.6 32.4C42.6 37.0392 46.3608 40.8 51 40.8Z\" fill=\"#6C63FF\"/>\n <path opacity=\"0.1\" d=\"M98.6 64.8C101.251 64.8 103.4 62.651 103.4 60C103.4 57.349 101.251 55.2 98.6 55.2C95.949 55.2 93.8 57.349 93.8 60C93.8 62.651 95.949 64.8 98.6 64.8Z\" fill=\"#6C63FF\"/>\n <path opacity=\"0.1\" d=\"M145.8 96.8C148.451 96.8 150.6 94.651 150.6 92C150.6 89.349 148.451 87.2 145.8 87.2C143.149 87.2 141 89.349 141 92C141 94.651 143.149 96.8 145.8 96.8Z\" fill=\"#6C63FF\"/>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M59.8 136.8C75.0431 136.8 87.4 134.293 87.4 131.2C87.4 128.107 75.0431 125.6 59.8 125.6C44.557 125.6 32.2 128.107 32.2 131.2C32.2 134.293 44.557 136.8 59.8 136.8Z\" stroke=\"#C4B7FF\" stroke-width=\"0.8\" stroke-dasharray=\"4 4\"/>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M217.4 152.8C232.643 152.8 245 150.293 245 147.2C245 144.107 232.643 141.6 217.4 141.6C202.157 141.6 189.8 144.107 189.8 147.2C189.8 150.293 202.157 152.8 217.4 152.8Z\" stroke=\"#C4B7FF\" stroke-width=\"0.8\" stroke-dasharray=\"4 4\"/>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M28.6 152.8C43.8431 152.8 56.2 150.293 56.2 147.2C56.2 144.107 43.8431 141.6 28.6 141.6C13.3569 141.6 1 144.107 1 147.2C1 150.293 13.3569 152.8 28.6 152.8Z\" stroke=\"#C4B7FF\" stroke-width=\"0.8\" stroke-dasharray=\"4 4\"/>\n <path d=\"M122.425 44.7H119.162L120.372 41.0719C120.484 40.6219 120.147 40.2 119.725 40.2H115.675C115.337 40.2 115.028 40.4531 115 40.7906L114.1 47.5406C114.044 47.9625 114.353 48.3 114.775 48.3H118.094L116.8 53.7844C116.716 54.2063 117.025 54.6 117.447 54.6C117.7 54.6 117.925 54.4875 118.037 54.2625L122.987 45.7125C123.269 45.2906 122.931 44.7 122.425 44.7Z\" fill=\"white\"/>\n <path d=\"M23.5204 123.2C23.0498 123.2 22.6141 123.375 22.2807 123.669C21.9491 123.96 21.7189 124.369 21.6565 124.837L20.2164 135.712C20.1423 136.278 20.3237 136.811 20.6643 137.203C21.0076 137.598 21.5119 137.85 22.0804 137.85H26.4117L24.5687 145.68C24.4289 146.274 24.5836 146.851 24.9204 147.28C25.2626 147.716 25.7931 148 26.3959 148C26.7289 148 27.0539 147.911 27.3385 147.746C27.616 147.585 27.8553 147.351 28.0254 147.055L35.9453 133.28C36.3068 132.658 36.2644 131.95 35.9495 131.398C35.7868 131.113 35.551 130.871 35.2622 130.703C34.9905 130.544 34.6717 130.45 34.3203 130.45H30.1609L31.7043 124.49C31.5476 124.305 31.4051 124.176 31.278 124.085C31.004 123.89 30.5348 123.687 29.7238 123.539C28.6009 123.335 26.6977 123.2 23.5204 123.2Z\" fill=\"#5E4EA5\" stroke=\"white\" stroke-width=\"1.6\"/>\n <path d=\"M185.5 109.6C185.075 109.6 184.682 109.757 184.381 110.02C184.08 110.284 183.872 110.652 183.815 111.073L182.615 120.074C182.548 120.585 182.712 121.066 183.021 121.419C183.331 121.774 183.787 122 184.3 122H187.74L186.244 128.309C186.117 128.846 186.258 129.366 186.564 129.753C186.873 130.145 187.352 130.4 187.897 130.4C188.505 130.4 189.084 130.074 189.391 129.512L195.745 115.6H191.208L192.467 110.771C192.308 110.576 192.165 110.445 192.04 110.357C191.803 110.189 191.397 110.01 190.693 109.883C189.753 109.713 188.16 109.6 185.5 109.6Z\" fill=\"#5E4EA5\" stroke=\"white\" stroke-width=\"1.6\"/>\n <path d=\"M215.1 128C214.675 128 214.282 128.157 213.981 128.42C213.68 128.683 213.472 129.052 213.415 129.473L212.215 138.474C212.148 138.985 212.312 139.466 212.621 139.819C212.931 140.174 213.387 140.4 213.9 140.4H217.34L215.844 146.709C215.717 147.246 215.858 147.766 216.164 148.153C216.473 148.545 216.952 148.8 217.497 148.8C218.105 148.8 218.684 148.474 218.991 147.912L225.345 134H220.808L222.067 129.171C221.908 128.976 221.765 128.845 221.64 128.757C221.403 128.589 220.997 128.41 220.293 128.283C219.353 128.113 217.76 128 215.1 128Z\" fill=\"#5E4EA5\" stroke=\"white\" stroke-width=\"1.6\"/>\n <path d=\"M55.9003 111.2C55.4754 111.2 55.0822 111.357 54.7812 111.62C54.4802 111.883 54.2716 112.252 54.215 112.673L53.0149 121.674C52.9475 122.185 53.112 122.666 53.4214 123.019C53.7314 123.374 54.1868 123.6 54.7004 123.6H58.1398L56.6444 129.909C56.5174 130.446 56.6576 130.966 56.9637 131.353C57.2728 131.745 57.7518 132 58.2966 132C58.9052 132 59.4843 131.674 59.7907 131.112L66.1452 117.2H61.6081L62.8674 112.371C62.7082 112.176 62.5651 112.045 62.4402 111.957C62.2025 111.789 61.7969 111.61 61.0927 111.483C60.1529 111.313 58.5599 111.2 55.9003 111.2Z\" fill=\"#5E4EA5\" stroke=\"white\" stroke-width=\"1.6\"/>\n </svg>\n <div fxFlex=\"20\" fxLayoutAlign=\"center end\">\n <mat-card-title>Circular rebalancing explained.</mat-card-title>\n </div>\n <div fxFlex=\"40\">\n <mat-card-subtitle class=\"font-size-120\">\n Circular payments are a completely off-chain rebalancing strategy where a node makes a payment to itself across a circular path of chained payment channels.\n </mat-card-subtitle>\n </div>\n </div>\n</ng-template>\n<ng-template #infoStepBlock2>\n <div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between stretch\" [@sliderAnimation]=\"animationDirection\"\n (swipe)=\"onSwipe($event)\">\n <svg fxFlex=\"30\" viewBox=\"0 0 210 124\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/2000/svg\"\n [ngClass]=\"{'small-svg': screenSize === screenSizeEnum.XS, 'large-svg': screenSize !== screenSizeEnum.XS}\">\n <path d=\"M90.1491 0H0V100.616H90.1491V0Z\" fill=\"#E6E6E6\"/>\n <path d=\"M88.6575 67.1775H1.48926V98.4248H88.6575V67.1775Z\" fill=\"white\"/>\n <path d=\"M59.844 74.5891H8.64404V90.6009H59.844V74.5891Z\" fill=\"#C4B7FF\"/>\n <path d=\"M76.3172 90.6426C80.8187 90.6426 84.4679 86.9934 84.4679 82.4919C84.4679 77.9904 80.8187 74.3412 76.3172 74.3412C71.8157 74.3412 68.1665 77.9904 68.1665 82.4919C68.1665 86.9934 71.8157 90.6426 76.3172 90.6426Z\" fill=\"#6C63FF\"/>\n <path d=\"M88.6575 34.7129H1.48926V65.9602H88.6575V34.7129Z\" fill=\"white\"/>\n <path d=\"M59.844 42.1244H8.64404V58.1363H59.844V42.1244Z\" fill=\"#C4B7FF\"/>\n <path d=\"M76.3172 58.1801C80.8187 58.1801 84.4679 54.5309 84.4679 50.0294C84.4679 45.5279 80.8187 41.8787 76.3172 41.8787C71.8157 41.8787 68.1665 45.5279 68.1665 50.0294C68.1665 54.5309 71.8157 58.1801 76.3172 58.1801Z\" fill=\"#6C63FF\"/>\n <path d=\"M88.6575 2.24823H1.48926V33.4955H88.6575V2.24823Z\" fill=\"white\"/>\n <path d=\"M59.844 9.66199H8.64404V25.6739H59.844V9.66199Z\" fill=\"#C4B7FF\"/>\n <path d=\"M32.644 74.5891H8.64404V90.6009H32.644V74.5891Z\" fill=\"#5E4EA5\"/>\n <path d=\"M45.444 42.1244H8.64404V58.1363H45.444V42.1244Z\" fill=\"#5E4EA5\"/>\n <path d=\"M59.644 9.66199H8.64404V25.662H59.644V9.66199Z\" fill=\"#5E4EA5\"/>\n <path d=\"M76.3176 26.3516C81.1704 26.3516 85.1044 22.4176 85.1044 17.5648C85.1044 12.712 81.1704 8.77802 76.3176 8.77802C71.4648 8.77802 67.5308 12.712 67.5308 17.5648C67.5308 22.4176 71.4648 26.3516 76.3176 26.3516Z\" fill=\"url(#paint0_linear)\"/>\n <path d=\"M76.3176 59.0334C81.1704 59.0334 85.1044 55.0994 85.1044 50.2466C85.1044 45.3938 81.1704 41.4598 76.3176 41.4598C71.4648 41.4598 67.5308 45.3938 67.5308 50.2466C67.5308 55.0994 71.4648 59.0334 76.3176 59.0334Z\" fill=\"url(#paint1_linear)\"/>\n <path d=\"M76.3176 91.4958C81.1704 91.4958 85.1044 87.5618 85.1044 82.709C85.1044 77.8562 81.1704 73.9222 76.3176 73.9222C71.4648 73.9222 67.5308 77.8562 67.5308 82.709C67.5308 87.5618 71.4648 91.4958 76.3176 91.4958Z\" fill=\"url(#paint2_linear)\"/>\n <path d=\"M76.1507 25.3014C80.6522 25.3014 84.3014 21.6522 84.3014 17.1507C84.3014 12.6492 80.6522 9 76.1507 9C71.6492 9 68 12.6492 68 17.1507C68 21.6522 71.6492 25.3014 76.1507 25.3014Z\" fill=\"#5E4EA5\"/>\n <path d=\"M193.435 36.7899H142.709V35.7444H119.709V36.7899H68.7744C67.8644 36.7899 66.9917 37.1514 66.3482 37.7949C65.7048 38.4384 65.3433 39.3111 65.3433 40.2211V109.679C65.3433 110.589 65.7048 111.462 66.3482 112.106C66.9917 112.749 67.8644 113.111 68.7744 113.111H193.435C195.33 113.111 196.866 111.574 196.866 109.679V40.2211C196.866 39.3111 196.504 38.4384 195.861 37.7949C195.217 37.1514 194.345 36.7899 193.435 36.7899Z\" fill=\"#4A4A4A\"/>\n <path d=\"M192.266 42.8538H69.9434V111.856H192.266V42.8538Z\" fill=\"#CBCBCB\"/>\n <path opacity=\"0.1\" d=\"M157.284 111.856H69.9434V42.8538L157.284 111.856Z\" fill=\"black\"/>\n <path d=\"M89.0832 106.693C95.577 106.693 100.841 101.428 100.841 94.9346C100.841 88.4408 95.577 83.1766 89.0832 83.1766C82.5894 83.1766 77.3252 88.4408 77.3252 94.9346C77.3252 101.428 82.5894 106.693 89.0832 106.693Z\" fill=\"#F2F2F2\"/>\n <path d=\"M91.7005 103.772C85.7849 103.772 80.4518 100.208 78.188 94.7431C75.9242 89.2778 77.1755 82.987 81.3584 78.8041C85.5414 74.6211 91.8322 73.3698 97.2975 75.6336C102.763 77.8974 106.326 83.2305 106.326 89.1461C106.317 97.2199 99.7743 103.763 91.7005 103.772ZM91.7005 74.7115C83.7284 74.7115 77.2658 81.174 77.2658 89.1461C77.2658 97.1181 83.7284 103.581 91.7005 103.581C99.6725 103.581 106.135 97.1181 106.135 89.1461C106.126 81.1778 99.6687 74.7205 91.7005 74.7115Z\" fill=\"#3F3D56\"/>\n <path d=\"M170.967 80.0673H159.541V82.4548H170.967V80.0673Z\" fill=\"#4A4A4A\"/>\n <path d=\"M184.781 61.4783H145.727V62.5015H184.781V61.4783Z\" fill=\"#4A4A4A\"/>\n <path d=\"M184.781 64.7186H145.727V65.7418H184.781V64.7186Z\" fill=\"#4A4A4A\"/>\n <path d=\"M184.781 67.9589H145.727V68.9821H184.781V67.9589Z\" fill=\"#4A4A4A\"/>\n <path d=\"M184.781 71.1991H145.727V72.2224H184.781V71.1991Z\" fill=\"#4A4A4A\"/>\n <path d=\"M184.781 74.4394H145.727V75.4626H184.781V74.4394Z\" fill=\"#4A4A4A\"/>\n <path d=\"M184.781 44.2537H180.006V49.0288H184.781V44.2537Z\" fill=\"#F2F2F2\"/>\n <path d=\"M186.998 51.2458H181.2V45.4474H186.998V51.2458ZM181.452 50.9937H186.746V45.6996H181.452V50.9937Z\" fill=\"#4A4A4A\"/>\n <path d=\"M200.3 110.601H188.362V109.741C188.362 109.696 188.344 109.653 188.312 109.621C188.28 109.589 188.237 109.571 188.192 109.571H184.099C184.054 109.571 184.01 109.589 183.978 109.621C183.946 109.653 183.928 109.696 183.928 109.741V110.601H181.37V109.741C181.37 109.696 181.352 109.653 181.32 109.621C181.288 109.589 181.245 109.571 181.2 109.571H177.107C177.061 109.571 177.018 109.589 176.986 109.621C176.954 109.653 176.936 109.696 176.936 109.741V110.601H174.378V109.741C174.378 109.696 174.36 109.653 174.328 109.621C174.296 109.589 174.253 109.571 174.207 109.571H170.115C170.069 109.571 170.026 109.589 169.994 109.621C169.962 109.653 169.944 109.696 169.944 109.741V110.601H167.386V109.741C167.386 109.696 167.368 109.653 167.336 109.621C167.304 109.589 167.261 109.571 167.215 109.571H163.122C163.077 109.571 163.034 109.589 163.002 109.621C162.97 109.653 162.952 109.696 162.952 109.741V110.601H160.394V109.741C160.394 109.696 160.376 109.653 160.344 109.621C160.312 109.589 160.268 109.571 160.223 109.571H156.13C156.085 109.571 156.042 109.589 156.01 109.621C155.978 109.653 155.96 109.696 155.96 109.741V110.601H153.402V109.741C153.402 109.696 153.384 109.653 153.352 109.621C153.32 109.589 153.276 109.571 153.231 109.571H149.138C149.093 109.571 149.049 109.589 149.017 109.621C148.985 109.653 148.967 109.696 148.967 109.741V110.601H146.409V109.741C146.409 109.696 146.391 109.653 146.359 109.621C146.327 109.589 146.284 109.571 146.239 109.571H114.177C114.132 109.571 114.089 109.589 114.057 109.621C114.025 109.653 114.007 109.696 114.007 109.741V110.601H111.449V109.741C111.449 109.696 111.431 109.653 111.399 109.621C111.367 109.589 111.323 109.571 111.278 109.571H107.185C107.14 109.571 107.096 109.589 107.064 109.621C107.032 109.653 107.014 109.696 107.014 109.741V110.601H104.456V109.741C104.456 109.696 104.438 109.653 104.406 109.621C104.374 109.589 104.331 109.571 104.286 109.571H100.193C100.148 109.571 100.104 109.589 100.072 109.621C100.04 109.653 100.022 109.696 100.022 109.741V110.601H97.4642V109.741C97.4642 109.696 97.4462 109.653 97.4142 109.621C97.3822 109.589 97.3388 109.571 97.2936 109.571H93.2006C93.1554 109.571 93.112 109.589 93.08 109.621C93.048 109.653 93.0301 109.696 93.0301 109.741V110.601H90.472V109.741C90.472 109.696 90.454 109.653 90.422 109.621C90.39 109.589 90.3467 109.571 90.3014 109.571H86.2085C86.1632 109.571 86.1198 109.589 86.0879 109.621C86.0559 109.653 86.0379 109.696 86.0379 109.741V110.601H83.4798V109.741C83.4798 109.696 83.4618 109.653 83.4299 109.621C83.3979 109.589 83.3545 109.571 83.3093 109.571H79.2163C79.171 109.571 79.1277 109.589 79.0957 109.621C79.0637 109.653 79.0457 109.696 79.0457 109.741V110.601H76.4876V109.741C76.4876 109.696 76.4697 109.653 76.4377 109.621C76.4057 109.589 76.3623 109.571 76.3171 109.571H72.2241C72.1789 109.571 72.1355 109.589 72.1035 109.621C72.0715 109.653 72.0536 109.696 72.0536 109.741V110.601H64.2087C61.9482 110.601 60.1157 112.434 60.1157 114.694V116.545C60.1157 118.806 61.9482 120.638 64.2087 120.638H200.3C202.561 120.638 204.393 118.806 204.393 116.545V114.694C204.393 112.434 202.561 110.601 200.3 110.601Z\" fill=\"#4A4A4A\"/>\n <path d=\"M86.1131 103.322C86.3717 103.386 86.6518 103.312 86.8456 103.112L94.5986 95.1027C95.007 94.6845 94.8072 93.9773 94.2376 93.8353L90.6843 92.9494L92.9925 89.2798C93.2324 88.8425 92.9934 88.2924 92.51 88.1718L88.0762 87.0663C87.7067 86.9742 87.3243 87.17 87.1837 87.5241L84.3559 94.6682C84.1868 95.097 84.4334 95.5771 84.8799 95.6884L88.5347 96.5996L85.6221 102.235C85.3946 102.675 85.642 103.204 86.1131 103.322Z\" fill=\"#5B5B5B\"/>\n <path d=\"M90.1491 0H0V100.616H90.1491V0Z\" fill=\"#E6E6E6\"/>\n <path d=\"M88.6575 67.1775H1.48926V98.4248H88.6575V67.1775Z\" fill=\"white\"/>\n <path d=\"M59.844 74.5891H8.64404V90.6009H59.844V74.5891Z\" fill=\"#C4B7FF\"/>\n <path d=\"M76.3172 90.6426C80.8187 90.6426 84.4679 86.9934 84.4679 82.4919C84.4679 77.9904 80.8187 74.3412 76.3172 74.3412C71.8157 74.3412 68.1665 77.9904 68.1665 82.4919C68.1665 86.9934 71.8157 90.6426 76.3172 90.6426Z\" fill=\"#6C63FF\"/>\n <path d=\"M88.6575 34.7129H1.48926V65.9602H88.6575V34.7129Z\" fill=\"white\"/>\n <path d=\"M59.844 42.1244H8.64404V58.1363H59.844V42.1244Z\" fill=\"#C4B7FF\"/>\n <path d=\"M76.3172 58.1801C80.8187 58.1801 84.4679 54.5309 84.4679 50.0294C84.4679 45.5279 80.8187 41.8787 76.3172 41.8787C71.8157 41.8787 68.1665 45.5279 68.1665 50.0294C68.1665 54.5309 71.8157 58.1801 76.3172 58.1801Z\" fill=\"#6C63FF\"/>\n <path d=\"M88.6575 2.24823H1.48926V33.4955H88.6575V2.24823Z\" fill=\"white\"/>\n <path d=\"M59.844 9.66199H8.64404V25.6739H59.844V9.66199Z\" fill=\"#C4B7FF\"/>\n <path d=\"M42 75H9V91H42V75Z\" fill=\"#5E4EA5\"/>\n <path d=\"M42 42H9V58H42V42Z\" fill=\"#5E4EA5\"/>\n <path d=\"M59.644 9.66199H8.64404V25.662H59.644V9.66199Z\" fill=\"#5E4EA5\"/>\n <path d=\"M76.3176 26.3516C81.1704 26.3516 85.1044 22.4176 85.1044 17.5648C85.1044 12.712 81.1704 8.77802 76.3176 8.77802C71.4648 8.77802 67.5308 12.712 67.5308 17.5648C67.5308 22.4176 71.4648 26.3516 76.3176 26.3516Z\" fill=\"url(#paint3_linear)\"/>\n <path d=\"M76.3176 59.0334C81.1704 59.0334 85.1044 55.0994 85.1044 50.2466C85.1044 45.3938 81.1704 41.4598 76.3176 41.4598C71.4648 41.4598 67.5308 45.3938 67.5308 50.2466C67.5308 55.0994 71.4648 59.0334 76.3176 59.0334Z\" fill=\"url(#paint4_linear)\"/>\n <path d=\"M76.3176 91.4958C81.1704 91.4958 85.1044 87.5618 85.1044 82.709C85.1044 77.8562 81.1704 73.9222 76.3176 73.9222C71.4648 73.9222 67.5308 77.8562 67.5308 82.709C67.5308 87.5618 71.4648 91.4958 76.3176 91.4958Z\" fill=\"url(#paint5_linear)\"/>\n <path d=\"M76.1507 25.3014C80.6522 25.3014 84.3014 21.6522 84.3014 17.1507C84.3014 12.6492 80.6522 9 76.1507 9C71.6492 9 68 12.6492 68 17.1507C68 21.6522 71.6492 25.3014 76.1507 25.3014Z\" fill=\"#5E4EA5\"/>\n <path d=\"M193.435 36.7899H142.709V35.7444H119.709V36.7899H68.7744C67.8644 36.7899 66.9917 37.1514 66.3482 37.7949C65.7048 38.4384 65.3433 39.3111 65.3433 40.2211V109.679C65.3433 110.589 65.7048 111.462 66.3482 112.106C66.9917 112.749 67.8644 113.111 68.7744 113.111H193.435C195.33 113.111 196.866 111.574 196.866 109.679V40.2211C196.866 39.3111 196.504 38.4384 195.861 37.7949C195.217 37.1514 194.345 36.7899 193.435 36.7899Z\" fill=\"#4A4A4A\"/>\n <path d=\"M192.266 42.8538H69.9434V111.856H192.266V42.8538Z\" fill=\"#CBCBCB\"/>\n <path opacity=\"0.1\" d=\"M157.284 111.856H69.9434V42.8538L157.284 111.856Z\" fill=\"black\"/>\n <path d=\"M89.0832 106.693C95.577 106.693 100.841 101.428 100.841 94.9346C100.841 88.4408 95.577 83.1766 89.0832 83.1766C82.5894 83.1766 77.3252 88.4408 77.3252 94.9346C77.3252 101.428 82.5894 106.693 89.0832 106.693Z\" fill=\"#F2F2F2\"/>\n <path d=\"M91.7005 103.772C85.7849 103.772 80.4518 100.208 78.188 94.7431C75.9242 89.2778 77.1755 82.987 81.3584 78.8041C85.5414 74.6211 91.8322 73.3698 97.2975 75.6336C102.763 77.8974 106.326 83.2305 106.326 89.1461C106.317 97.2199 99.7743 103.763 91.7005 103.772ZM91.7005 74.7115C83.7284 74.7115 77.2658 81.174 77.2658 89.1461C77.2658 97.1181 83.7284 103.581 91.7005 103.581C99.6725 103.581 106.135 97.1181 106.135 89.1461C106.126 81.1778 99.6687 74.7205 91.7005 74.7115Z\" fill=\"#3F3D56\"/>\n <path d=\"M170.967 80.0673H159.541V82.4548H170.967V80.0673Z\" fill=\"#4A4A4A\"/>\n <path d=\"M184.781 61.4783H145.727V62.5015H184.781V61.4783Z\" fill=\"#4A4A4A\"/>\n <path d=\"M184.781 64.7186H145.727V65.7418H184.781V64.7186Z\" fill=\"#4A4A4A\"/>\n <path d=\"M184.781 67.9589H145.727V68.9821H184.781V67.9589Z\" fill=\"#4A4A4A\"/>\n <path d=\"M184.781 71.1991H145.727V72.2224H184.781V71.1991Z\" fill=\"#4A4A4A\"/>\n <path d=\"M184.781 74.4394H145.727V75.4626H184.781V74.4394Z\" fill=\"#4A4A4A\"/>\n <path d=\"M184.781 44.2537H180.006V49.0288H184.781V44.2537Z\" fill=\"#F2F2F2\"/>\n <path d=\"M186.998 51.2458H181.2V45.4474H186.998V51.2458ZM181.452 50.9937H186.746V45.6996H181.452V50.9937Z\" fill=\"#4A4A4A\"/>\n <path d=\"M205.185 113.031H193.247V112.171C193.247 112.125 193.229 112.082 193.197 112.05C193.165 112.018 193.121 112 193.076 112H188.983C188.938 112 188.895 112.018 188.863 112.05C188.831 112.082 188.813 112.125 188.813 112.171V113.031H186.254V112.171C186.254 112.125 186.237 112.082 186.205 112.05C186.173 112.018 186.129 112 186.084 112H181.991C181.946 112 181.902 112.018 181.87 112.05C181.838 112.082 181.82 112.125 181.82 112.171V113.031H179.262V112.171C179.262 112.125 179.244 112.082 179.212 112.05C179.18 112.018 179.137 112 179.092 112H174.999C174.954 112 174.91 112.018 174.878 112.05C174.846 112.082 174.828 112.125 174.828 112.171V113.031H172.27V112.171C172.27 112.125 172.252 112.082 172.22 112.05C172.188 112.018 172.145 112 172.1 112H168.007C167.961 112 167.918 112.018 167.886 112.05C167.854 112.082 167.836 112.125 167.836 112.171V113.031H165.278V112.171C165.278 112.125 165.26 112.082 165.228 112.05C165.196 112.018 165.153 112 165.107 112H161.014C160.969 112 160.926 112.018 160.894 112.05C160.862 112.082 160.844 112.125 160.844 112.171V113.031H158.286V112.171C158.286 112.125 158.268 112.082 158.236 112.05C158.204 112.018 158.16 112 158.115 112H154.022C153.977 112 153.934 112.018 153.902 112.05C153.87 112.082 153.852 112.125 153.852 112.171V113.031H151.294V112.171C151.294 112.125 151.276 112.082 151.244 112.05C151.212 112.018 151.168 112 151.123 112H119.061C119.016 112 118.973 112.018 118.941 112.05C118.909 112.082 118.891 112.125 118.891 112.171V113.031H116.333V112.171C116.333 112.125 116.315 112.082 116.283 112.05C116.251 112.018 116.207 112 116.162 112H112.069C112.024 112 111.981 112.018 111.949 112.05C111.917 112.082 111.899 112.125 111.899 112.171V113.031H109.341V112.171C109.341 112.125 109.323 112.082 109.291 112.05C109.259 112.018 109.215 112 109.17 112H105.077C105.032 112 104.988 112.018 104.956 112.05C104.924 112.082 104.907 112.125 104.907 112.171V113.031H102.348V112.171C102.348 112.125 102.33 112.082 102.298 112.05C102.266 112.018 102.223 112 102.178 112H98.0849C98.0397 112 97.9963 112.018 97.9643 112.05C97.9323 112.082 97.9144 112.125 97.9144 112.171V113.031H95.3563V112.171C95.3563 112.125 95.3383 112.082 95.3063 112.05C95.2743 112.018 95.2309 112 95.1857 112H91.0927C91.0475 112 91.0041 112.018 90.9721 112.05C90.9402 112.082 90.9222 112.125 90.9222 112.171V113.031H88.3641V112.171C88.3641 112.125 88.3461 112.082 88.3141 112.05C88.2822 112.018 88.2388 112 88.1935 112H84.1006C84.0553 112 84.0119 112.018 83.98 112.05C83.948 112.082 83.93 112.125 83.93 112.171V113.031H81.3719V112.171C81.3719 112.125 81.3539 112.082 81.322 112.05C81.29 112.018 81.2466 112 81.2014 112H77.1084C77.0632 112 77.0198 112.018 76.9878 112.05C76.9558 112.082 76.9378 112.125 76.9379 112.171V113.031H69.093C66.8325 113.031 65 114.863 65 117.124V118.974C65 121.235 66.8325 123.067 69.093 123.067H205.185C207.445 123.067 209.277 121.235 209.277 118.974V117.124C209.277 114.863 207.445 113.031 205.185 113.031Z\" fill=\"#4A4A4A\"/>\n <path d=\"M86.1131 103.322C86.3717 103.386 86.6518 103.312 86.8456 103.112L94.5986 95.1027C95.007 94.6845 94.8072 93.9773 94.2376 93.8353L90.6843 92.9494L92.9925 89.2798C93.2324 88.8425 92.9934 88.2924 92.51 88.1718L88.0762 87.0663C87.7067 86.9742 87.3243 87.17 87.1837 87.5241L84.3559 94.6682C84.1868 95.097 84.4334 95.5771 84.8799 95.6884L88.5347 96.5996L85.6221 102.235C85.3946 102.675 85.642 103.204 86.1131 103.322Z\" fill=\"#5B5B5B\"/>\n <path d=\"M78.375 20.625C78.375 19.5938 77.5312 18.75 76.5 18.75C75.4453 18.75 74.625 19.5938 74.625 20.625C74.625 21.6797 75.4453 22.5 76.5 22.5C77.5312 22.5 78.375 21.6797 78.375 20.625ZM74.8359 11.1094L75.1406 17.4844C75.1641 17.7656 75.4219 18 75.7031 18H77.2734C77.5547 18 77.8125 17.7656 77.8359 17.4844L78.1406 11.1094C78.1641 10.7812 77.9062 10.5 77.5781 10.5H75.3984C75.0703 10.5 74.8125 10.7812 74.8359 11.1094Z\" fill=\"white\"/>\n <defs>\n <linearGradient id=\"paint0_linear\" x1=\"76.3176\" y1=\"26.3516\" x2=\"76.3176\" y2=\"8.77802\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#808080\" stop-opacity=\"0.25\"/>\n <stop offset=\"0.54\" stop-color=\"#808080\" stop-opacity=\"0.12\"/>\n <stop offset=\"1\" stop-color=\"#808080\" stop-opacity=\"0.1\"/>\n </linearGradient>\n <linearGradient id=\"paint1_linear\" x1=\"76.3176\" y1=\"59.0334\" x2=\"76.3176\" y2=\"41.4598\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#808080\" stop-opacity=\"0.25\"/>\n <stop offset=\"0.54\" stop-color=\"#808080\" stop-opacity=\"0.12\"/>\n <stop offset=\"1\" stop-color=\"#808080\" stop-opacity=\"0.1\"/>\n </linearGradient>\n <linearGradient id=\"paint2_linear\" x1=\"76.3176\" y1=\"91.4958\" x2=\"76.3176\" y2=\"73.9222\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#808080\" stop-opacity=\"0.25\"/>\n <stop offset=\"0.54\" stop-color=\"#808080\" stop-opacity=\"0.12\"/>\n <stop offset=\"1\" stop-color=\"#808080\" stop-opacity=\"0.1\"/>\n </linearGradient>\n <linearGradient id=\"paint3_linear\" x1=\"76.3176\" y1=\"26.3516\" x2=\"76.3176\" y2=\"8.77802\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#808080\" stop-opacity=\"0.25\"/>\n <stop offset=\"0.54\" stop-color=\"#808080\" stop-opacity=\"0.12\"/>\n <stop offset=\"1\" stop-color=\"#808080\" stop-opacity=\"0.1\"/>\n </linearGradient>\n <linearGradient id=\"paint4_linear\" x1=\"76.3176\" y1=\"59.0334\" x2=\"76.3176\" y2=\"41.4598\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#808080\" stop-opacity=\"0.25\"/>\n <stop offset=\"0.54\" stop-color=\"#808080\" stop-opacity=\"0.12\"/>\n <stop offset=\"1\" stop-color=\"#808080\" stop-opacity=\"0.1\"/>\n </linearGradient>\n <linearGradient id=\"paint5_linear\" x1=\"76.3176\" y1=\"91.4958\" x2=\"76.3176\" y2=\"73.9222\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#808080\" stop-opacity=\"0.25\"/>\n <stop offset=\"0.54\" stop-color=\"#808080\" stop-opacity=\"0.12\"/>\n <stop offset=\"1\" stop-color=\"#808080\" stop-opacity=\"0.1\"/>\n </linearGradient>\n </defs>\n </svg>\n <div fxFlex=\"20\" fxLayoutAlign=\"center end\">\n <mat-card-title>Step 1: Unbalanced channel</mat-card-title>\n </div>\n <div fxFlex=\"40\">\n <mat-card-subtitle class=\"font-size-120\">\n It starts with an unbalanced channel, that needs to be rebalanced in order to continue to route payments.\n </mat-card-subtitle>\n </div>\n </div>\n</ng-template>\n<ng-template #infoStepBlock3>\n <div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between stretch\" [@sliderAnimation]=\"animationDirection\"\n (swipe)=\"onSwipe($event)\">\n <svg fxFlex=\"30\" viewBox=\"0 0 370 121\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/2000/svg\"\n [ngClass]=\"{'small-svg': screenSize === screenSizeEnum.XS, 'large-svg': screenSize !== screenSizeEnum.XS}\">\n <path d=\"M327.488 99.9755C350.953 99.9755 369.975 80.9531 369.975 57.4877C369.975 34.0224 350.953 15 327.488 15C304.022 15 285 34.0224 285 57.4877C285 80.9531 304.022 99.9755 327.488 99.9755Z\" fill=\"#F1F1F1\"/>\n <path d=\"M115.068 85.6077H349.8V86.5722H113L115.068 85.6077Z\" fill=\"#4A4A4A\"/>\n <path d=\"M236.776 84.376H226.024V91.544H236.776V84.376Z\" fill=\"#D0CDE1\"/>\n <path d=\"M218.856 87.96H233.192V79H218.856V87.96ZM232.569 87.5704H219.479V79.3896H232.569V87.5704Z\" fill=\"#4A4A4A\"/>\n <path d=\"M265 57.3624H357.392V120.307H265V57.3624Z\" fill=\"#CBCBCB\"/>\n <path d=\"M362.545 50H271.626C271.016 50.0009 270.521 50.495 270.521 51.1048V112.577C270.521 112.87 270.638 113.151 270.845 113.358C271.052 113.565 271.333 113.681 271.626 113.681H362.545C362.838 113.681 363.119 113.565 363.326 113.358C363.533 113.151 363.65 112.87 363.65 112.577V51.1048C363.65 50.495 363.155 50.0009 362.545 50ZM362.913 112.577C362.913 112.674 362.875 112.768 362.806 112.837C362.736 112.907 362.643 112.945 362.545 112.945H271.626C271.528 112.945 271.434 112.907 271.365 112.837C271.296 112.768 271.258 112.674 271.258 112.577V51.1048C271.258 50.9015 271.423 50.7365 271.626 50.7365H362.545C362.748 50.7365 362.913 50.9015 362.913 51.1048V112.577Z\" fill=\"#4A4A4A\"/>\n <path d=\"M316.364 93.4359H275.844C275.547 93.4359 275.307 93.6766 275.307 93.9735V97.6835C275.307 97.9804 275.547 98.2211 275.844 98.2211H316.364C316.661 98.2211 316.901 97.9804 316.901 97.6835V93.9735C316.901 93.6766 316.661 93.4359 316.364 93.4359Z\" fill=\"#4A4A4A\"/>\n <path d=\"M354.814 89.3873H341.565C341.272 89.3873 340.991 89.5036 340.784 89.7108C340.577 89.918 340.46 90.199 340.46 90.492V100.798C340.46 101.091 340.577 101.372 340.784 101.579C340.991 101.786 341.272 101.903 341.565 101.903H354.814C355.107 101.903 355.388 101.786 355.595 101.579C355.803 101.372 355.919 101.091 355.919 100.798V90.492C355.919 90.199 355.803 89.918 355.595 89.7108C355.388 89.5036 355.107 89.3873 354.814 89.3873ZM355.182 100.798C355.182 101.001 355.017 101.166 354.814 101.166H341.565C341.362 101.166 341.197 101.001 341.197 100.798V90.492C341.196 90.3943 341.235 90.3004 341.304 90.2313C341.373 90.1622 341.467 90.1235 341.565 90.1238H354.814C354.912 90.1235 355.006 90.1622 355.075 90.2313C355.144 90.3004 355.183 90.3943 355.182 90.492V100.798Z\" fill=\"#4A4A4A\"/>\n <path d=\"M352.168 91.7653H344.211C343.914 91.7653 343.673 92.006 343.673 92.3029V93.0965C343.673 93.3934 343.914 93.6341 344.211 93.6341H352.168C352.465 93.6341 352.706 93.3934 352.706 93.0965V92.3029C352.706 92.006 352.465 91.7653 352.168 91.7653Z\" fill=\"#4A4A4A\"/>\n <path d=\"M352.168 94.71H344.211C343.914 94.71 343.673 94.9507 343.673 95.2476V96.0412C343.673 96.3381 343.914 96.5788 344.211 96.5788H352.168C352.465 96.5788 352.706 96.3381 352.706 96.0412V95.2476C352.706 94.9507 352.465 94.71 352.168 94.71Z\" fill=\"#4A4A4A\"/>\n <path d=\"M352.168 97.6548H344.211C343.914 97.6548 343.673 97.8955 343.673 98.1924V98.986C343.673 99.2829 343.914 99.5236 344.211 99.5236H352.168C352.465 99.5236 352.706 99.2829 352.706 98.986V98.1924C352.706 97.8955 352.465 97.6548 352.168 97.6548Z\" fill=\"#4A4A4A\"/>\n <path d=\"M295.014 54.4177H276.949C276.652 54.4177 276.411 54.6584 276.411 54.9553V61.9782C276.411 62.2752 276.652 62.5158 276.949 62.5158H295.014C295.311 62.5158 295.552 62.2752 295.552 61.9782V54.9553C295.552 54.6584 295.311 54.4177 295.014 54.4177Z\" fill=\"#4A4A4A\"/>\n <path d=\"M312.293 105.198C319.455 105.198 325.261 99.3917 325.261 92.2295C325.261 85.0672 319.455 79.2611 312.293 79.2611C305.131 79.2611 299.325 85.0672 299.325 92.2295C299.325 99.3917 305.131 105.198 312.293 105.198Z\" fill=\"#F2F2F2\"/>\n <path d=\"M315.18 101.976C308.655 101.976 302.773 98.0462 300.276 92.0183C297.78 85.9904 299.16 79.052 303.773 74.4384C308.387 69.8249 315.325 68.4448 321.353 70.9416C327.381 73.4384 331.311 79.3205 331.311 85.8451C331.301 94.75 324.085 101.966 315.18 101.976ZM315.18 69.9245C306.387 69.9245 299.259 77.0524 299.259 85.8451C299.259 94.6377 306.387 101.766 315.18 101.766C323.973 101.766 331.1 94.6377 331.1 85.8451C331.09 77.0565 323.968 69.9345 315.18 69.9245Z\" fill=\"#4A4A4A\"/>\n <path d=\"M309.677 100.883C309.936 100.948 310.216 100.873 310.41 100.673L318.163 92.664C318.571 92.2458 318.371 91.5387 317.802 91.3966L314.249 90.5107L316.557 86.8411C316.797 86.4038 316.558 85.8537 316.074 85.7332L311.64 84.6277C311.271 84.5355 310.888 84.7313 310.748 85.0854L307.92 92.2295C307.751 92.6583 307.998 93.1384 308.444 93.2497L312.099 94.161L309.186 99.7958C308.959 100.236 309.206 100.766 309.677 100.883Z\" fill=\"#5B5B5B\"/>\n <path d=\"M90.1491 0H0V100.616H90.1491V0Z\" fill=\"#E6E6E6\"/>\n <path d=\"M88.6576 67.1775H1.48938V98.4248H88.6576V67.1775Z\" fill=\"white\"/>\n <path d=\"M59.8442 74.589H8.64417V90.6009H59.8442V74.589Z\" fill=\"#C4B7FF\"/>\n <path d=\"M76.3175 90.6426C80.819 90.6426 84.4682 86.9934 84.4682 82.4919C84.4682 77.9904 80.819 74.3412 76.3175 74.3412C71.8159 74.3412 68.1667 77.9904 68.1667 82.4919C68.1667 86.9934 71.8159 90.6426 76.3175 90.6426Z\" fill=\"#6C63FF\"/>\n <path d=\"M88.6576 34.7129H1.48938V65.9602H88.6576V34.7129Z\" fill=\"white\"/>\n <path d=\"M59.8442 42.1244H8.64417V58.1363H59.8442V42.1244Z\" fill=\"#C4B7FF\"/>\n <path d=\"M76.3175 58.1801C80.819 58.1801 84.4682 54.531 84.4682 50.0294C84.4682 45.5279 80.819 41.8787 76.3175 41.8787C71.8159 41.8787 68.1667 45.5279 68.1667 50.0294C68.1667 54.531 71.8159 58.1801 76.3175 58.1801Z\" fill=\"#6C63FF\"/>\n <path d=\"M88.6576 2.24824H1.48938V33.4955H88.6576V2.24824Z\" fill=\"white\"/>\n <path d=\"M59.8442 9.66196H8.64417V25.6738H59.8442V9.66196Z\" fill=\"#C4B7FF\"/>\n <path d=\"M42 75H9V91H42V75Z\" fill=\"#5E4EA5\"/>\n <path d=\"M42 42H9V58H42V42Z\" fill=\"#5E4EA5\"/>\n <path d=\"M59.8442 9.66196H8.64417V25.6738H59.8442V9.66196Z\" fill=\"#5E4EA5\"/>\n <path d=\"M76.7868 26.5736C81.6396 26.5736 85.5736 22.6396 85.5736 17.7868C85.5736 12.934 81.6396 9 76.7868 9C71.934 9 68 12.934 68 17.7868C68 22.6396 71.934 26.5736 76.7868 26.5736Z\" fill=\"url(#paint0_linear)\"/>\n <path d=\"M76.3174 59.0334C81.1702 59.0334 85.1042 55.0994 85.1042 50.2466C85.1042 45.3938 81.1702 41.4598 76.3174 41.4598C71.4646 41.4598 67.5306 45.3938 67.5306 50.2466C67.5306 55.0994 71.4646 59.0334 76.3174 59.0334Z\" fill=\"url(#paint1_linear)\"/>\n <path d=\"M76.3174 91.4958C81.1702 91.4958 85.1042 87.5618 85.1042 82.709C85.1042 77.8562 81.1702 73.9222 76.3174 73.9222C71.4646 73.9222 67.5306 77.8562 67.5306 82.709C67.5306 87.5618 71.4646 91.4958 76.3174 91.4958Z\" fill=\"url(#paint2_linear)\"/>\n <path d=\"M76.1507 25.3014C80.6522 25.3014 84.3014 21.6522 84.3014 17.1507C84.3014 12.6492 80.6522 9 76.1507 9C71.6492 9 68 12.6492 68 17.1507C68 21.6522 71.6492 25.3014 76.1507 25.3014Z\" fill=\"#5E4EA5\"/>\n <path d=\"M193.434 36.7899H142.709V35.7444H119.708V36.7899H68.7742C67.8642 36.7899 66.9915 37.1514 66.348 37.7949C65.7045 38.4384 65.343 39.3111 65.343 40.2211V109.679C65.343 110.589 65.7045 111.462 66.348 112.106C66.9915 112.749 67.8642 113.111 68.7742 113.111H193.434C195.329 113.111 196.866 111.574 196.866 109.679V40.2211C196.866 39.3111 196.504 38.4384 195.861 37.7949C195.217 37.1514 194.344 36.7899 193.434 36.7899Z\" fill=\"#4A4A4A\"/>\n <path d=\"M192.265 42.8538H69.9432V111.856H192.265V42.8538Z\" fill=\"#CBCBCB\"/>\n <path opacity=\"0.1\" d=\"M157.283 111.856H69.9432V42.8538L157.283 111.856Z\" fill=\"black\"/>\n <path d=\"M89.0829 106.693C95.5767 106.693 100.841 101.428 100.841 94.9346C100.841 88.4408 95.5767 83.1766 89.0829 83.1766C82.5892 83.1766 77.325 88.4408 77.325 94.9346C77.325 101.428 82.5892 106.693 89.0829 106.693Z\" fill=\"#F2F2F2\"/>\n <path d=\"M91.7004 103.772C85.7849 103.772 80.4518 100.208 78.188 94.7431C75.9242 89.2778 77.1755 82.987 81.3584 78.8041C85.5414 74.6211 91.8322 73.3698 97.2975 75.6336C102.763 77.8974 106.326 83.2305 106.326 89.1461C106.317 97.2199 99.7743 103.763 91.7004 103.772ZM91.7004 74.7115C83.7284 74.7115 77.2658 81.174 77.2658 89.1461C77.2658 97.1181 83.7284 103.581 91.7004 103.581C99.6725 103.581 106.135 97.1181 106.135 89.1461C106.126 81.1778 99.6687 74.7205 91.7004 74.7115Z\" fill=\"#3F3D56\"/>\n <path d=\"M170.967 80.0672H159.541V82.4548H170.967V80.0672Z\" fill=\"#4A4A4A\"/>\n <path d=\"M184.781 61.4783H145.727V62.5015H184.781V61.4783Z\" fill=\"#4A4A4A\"/>\n <path d=\"M184.781 64.7186H145.727V65.7418H184.781V64.7186Z\" fill=\"#4A4A4A\"/>\n <path d=\"M184.781 67.9588H145.727V68.9821H184.781V67.9588Z\" fill=\"#4A4A4A\"/>\n <path d=\"M184.781 71.1991H145.727V72.2224H184.781V71.1991Z\" fill=\"#4A4A4A\"/>\n <path d=\"M184.781 74.4394H145.727V75.4626H184.781V74.4394Z\" fill=\"#4A4A4A\"/>\n <path d=\"M184.781 44.2537H180.006V49.0288H184.781V44.2537Z\" fill=\"#F2F2F2\"/>\n <path d=\"M186.998 51.2458H181.2V45.4474H186.998V51.2458ZM181.452 50.9937H186.746V45.6996H181.452V50.9937Z\" fill=\"#4A4A4A\"/>\n <path d=\"M200.3 110.601H188.362V109.741C188.362 109.696 188.344 109.653 188.312 109.621C188.28 109.589 188.237 109.571 188.192 109.571H184.099C184.054 109.571 184.01 109.589 183.978 109.621C183.946 109.653 183.928 109.696 183.928 109.741V110.601H181.37V109.741C181.37 109.696 181.352 109.653 181.32 109.621C181.288 109.589 181.245 109.571 181.2 109.571H177.107C177.061 109.571 177.018 109.589 176.986 109.621C176.954 109.653 176.936 109.696 176.936 109.741V110.601H174.378V109.741C174.378 109.696 174.36 109.653 174.328 109.621C174.296 109.589 174.253 109.571 174.207 109.571H170.114C170.069 109.571 170.026 109.589 169.994 109.621C169.962 109.653 169.944 109.696 169.944 109.741V110.601H167.386V109.741C167.386 109.696 167.368 109.653 167.336 109.621C167.304 109.589 167.26 109.571 167.215 109.571H163.122C163.077 109.571 163.034 109.589 163.002 109.621C162.97 109.653 162.952 109.696 162.952 109.741V110.601H160.394V109.741C160.394 109.696 160.376 109.653 160.344 109.621C160.312 109.589 160.268 109.571 160.223 109.571H156.13C156.085 109.571 156.041 109.589 156.009 109.621C155.977 109.653 155.96 109.696 155.96 109.741V110.601H153.401V109.741C153.401 109.696 153.383 109.653 153.351 109.621C153.319 109.589 153.276 109.571 153.231 109.571H149.138C149.093 109.571 149.049 109.589 149.017 109.621C148.985 109.653 148.967 109.696 148.967 109.741V110.601H146.409V109.741C146.409 109.696 146.391 109.653 146.359 109.621C146.327 109.589 146.284 109.571 146.239 109.571H114.177C114.132 109.571 114.088 109.589 114.056 109.621C114.024 109.653 114.006 109.696 114.006 109.741V110.601H111.448V109.741C111.448 109.696 111.43 109.653 111.398 109.621C111.366 109.589 111.323 109.571 111.278 109.571H107.185C107.14 109.571 107.096 109.589 107.064 109.621C107.032 109.653 107.014 109.696 107.014 109.741V110.601H104.456V109.741C104.456 109.696 104.438 109.653 104.406 109.621C104.374 109.589 104.331 109.571 104.286 109.571H100.193C100.147 109.571 100.104 109.589 100.072 109.621C100.04 109.653 100.022 109.696 100.022 109.741V110.601H97.464V109.741C97.464 109.696 97.4461 109.653 97.4141 109.621C97.3821 109.589 97.3387 109.571 97.2935 109.571H93.2005C93.1553 109.571 93.1119 109.589 93.0799 109.621C93.0479 109.653 93.03 109.696 93.03 109.741V110.601H90.4719V109.741C90.4719 109.696 90.4539 109.653 90.4219 109.621C90.3899 109.589 90.3465 109.571 90.3013 109.571H86.2083C86.1631 109.571 86.1197 109.589 86.0877 109.621C86.0558 109.653 86.0378 109.696 86.0378 109.741V110.601H83.4797V109.741C83.4797 109.696 83.4617 109.653 83.4297 109.621C83.3978 109.589 83.3544 109.571 83.3091 109.571H79.2162C79.1709 109.571 79.1276 109.589 79.0956 109.621C79.0636 109.653 79.0456 109.696 79.0456 109.741V110.601H76.4875V109.741C76.4875 109.696 76.4695 109.653 76.4376 109.621C76.4056 109.589 76.3622 109.571 76.317 109.571H72.224C72.1788 109.571 72.1354 109.589 72.1034 109.621C72.0714 109.653 72.0535 109.696 72.0535 109.741V110.601H64.2086C61.9481 110.601 60.1156 112.434 60.1156 114.694V116.545C60.1156 118.806 61.9481 120.638 64.2086 120.638H200.3C202.561 120.638 204.393 118.806 204.393 116.545V114.694C204.393 112.434 202.561 110.601 200.3 110.601Z\" fill=\"#4A4A4A\"/>\n <path d=\"M86.1131 103.322C86.3717 103.386 86.6518 103.312 86.8457 103.112L94.5986 95.1027C95.007 94.6845 94.8072 93.9774 94.2376 93.8353L90.6843 92.9494L92.9925 89.2798C93.2324 88.8425 92.9934 88.2924 92.51 88.1719L88.0762 87.0664C87.7067 86.9742 87.3243 87.17 87.1837 87.5241L84.3559 94.6682C84.1868 95.097 84.4334 95.5771 84.8799 95.6884L88.5348 96.5997L85.6221 102.235C85.3946 102.675 85.642 103.204 86.1131 103.322Z\" fill=\"#5B5B5B\"/>\n <path d=\"M78.125 21.625C78.125 20.5938 77.2812 19.75 76.25 19.75C75.1953 19.75 74.375 20.5938 74.375 21.625C74.375 22.6797 75.1953 23.5 76.25 23.5C77.2812 23.5 78.125 22.6797 78.125 21.625ZM74.5859 12.1094L74.8906 18.4844C74.9141 18.7656 75.1719 19 75.4531 19H77.0234C77.3047 19 77.5625 18.7656 77.5859 18.4844L77.8906 12.1094C77.9141 11.7812 77.6562 11.5 77.3281 11.5H75.1484C74.8203 11.5 74.5625 11.7812 74.5859 12.1094Z\" fill=\"white\"/>\n <defs>\n <linearGradient id=\"paint0_linear\" x1=\"76.7868\" y1=\"26.5736\" x2=\"76.7868\" y2=\"9\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#808080\" stop-opacity=\"0.25\"/>\n <stop offset=\"0.54\" stop-color=\"#808080\" stop-opacity=\"0.12\"/>\n <stop offset=\"1\" stop-color=\"#808080\" stop-opacity=\"0.1\"/>\n </linearGradient>\n <linearGradient id=\"paint1_linear\" x1=\"76.3174\" y1=\"59.0334\" x2=\"76.3174\" y2=\"41.4598\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#808080\" stop-opacity=\"0.25\"/>\n <stop offset=\"0.54\" stop-color=\"#808080\" stop-opacity=\"0.12\"/>\n <stop offset=\"1\" stop-color=\"#808080\" stop-opacity=\"0.1\"/>\n </linearGradient>\n <linearGradient id=\"paint2_linear\" x1=\"76.3174\" y1=\"91.4958\" x2=\"76.3174\" y2=\"73.9222\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#808080\" stop-opacity=\"0.25\"/>\n <stop offset=\"0.54\" stop-color=\"#808080\" stop-opacity=\"0.12\"/>\n <stop offset=\"1\" stop-color=\"#808080\" stop-opacity=\"0.1\"/>\n </linearGradient>\n </defs>\n </svg>\n <div fxFlex=\"20\" fxLayoutAlign=\"center end\">\n <mat-card-title>Step 2: Invoice/Payment</mat-card-title>\n </div>\n <div fxFlex=\"40\">\n <mat-card-subtitle class=\"font-size-120\">\n All you have to do is make a payment to yourself in a favorable direction by generating and paying an invoice. This is taken care automatically by your node.\n </mat-card-subtitle>\n </div>\n </div>\n</ng-template>\n<ng-template #infoStepBlock4>\n <div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between stretch\" [@sliderAnimation]=\"animationDirection\"\n (swipe)=\"onSwipe($event)\">\n <svg fxFlex=\"30\" viewBox=\"0 0 153 200\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/2000/svg\"\n [ngClass]=\"{'small-svg': screenSize === screenSizeEnum.XS, 'large-svg': screenSize !== screenSizeEnum.XS}\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M76.25 191C114.91 191 146.25 158.541 146.25 118.5C146.25 78.4594 114.91 46 76.25 46C37.5901 46 6.25 78.4594 6.25 118.5C6.25 158.541 37.5901 191 76.25 191Z\" stroke=\"#C4B7FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-dasharray=\"7 7\"/>\n <path d=\"M76.25 191C114.91 191 146.25 158.541 146.25 118.5C146.25 78.4594 114.91 46 76.25 46\" stroke=\"#5E4EA5\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-dasharray=\"7 7\"/>\n <path d=\"M122.399 37H32.25V137.616H122.399V37Z\" fill=\"#E6E6E6\"/>\n <path d=\"M120.908 104.178H33.7394V135.425H120.908V104.178Z\" fill=\"white\"/>\n <path d=\"M92.0943 111.589H40.8943V127.601H92.0943V111.589Z\" fill=\"#C4B7FF\"/>\n <path d=\"M108.567 127.643C113.069 127.643 116.718 123.993 116.718 119.492C116.718 114.99 113.069 111.341 108.567 111.341C104.066 111.341 100.417 114.99 100.417 119.492C100.417 123.993 104.066 127.643 108.567 127.643Z\" fill=\"#6C63FF\"/>\n <path d=\"M120.908 71.7129H33.7394V102.96H120.908V71.7129Z\" fill=\"white\"/>\n <path d=\"M92.0943 79.1244H40.8943V95.1363H92.0943V79.1244Z\" fill=\"#C4B7FF\"/>\n <path d=\"M108.567 95.1801C113.069 95.1801 116.718 91.531 116.718 87.0294C116.718 82.5279 113.069 78.8787 108.567 78.8787C104.066 78.8787 100.417 82.5279 100.417 87.0294C100.417 91.531 104.066 95.1801 108.567 95.1801Z\" fill=\"#6C63FF\"/>\n <path d=\"M120.908 39.2482H33.7394V70.4955H120.908V39.2482Z\" fill=\"white\"/>\n <path d=\"M92.0943 46.662H40.8943V62.6738H92.0943V46.662Z\" fill=\"#C4B7FF\"/>\n <path d=\"M74.5 112H40.5V128H74.5V112Z\" fill=\"#5E4EA5\"/>\n <path d=\"M74.5 79H40.5V95H74.5V79Z\" fill=\"#5E4EA5\"/>\n <path d=\"M91.8943 46.662H40.8943V62.662H91.8943V46.662Z\" fill=\"#5E4EA5\"/>\n <path d=\"M108.567 63.3516C113.42 63.3516 117.354 59.4176 117.354 54.5648C117.354 49.712 113.42 45.778 108.567 45.778C103.715 45.778 99.7806 49.712 99.7806 54.5648C99.7806 59.4176 103.715 63.3516 108.567 63.3516Z\" fill=\"url(#paint0_linear)\"/>\n <path d=\"M108.567 96.0334C113.42 96.0334 117.354 92.0994 117.354 87.2466C117.354 82.3938 113.42 78.4598 108.567 78.4598C103.715 78.4598 99.7806 82.3938 99.7806 87.2466C99.7806 92.0994 103.715 96.0334 108.567 96.0334Z\" fill=\"#5E4EA5\"/>\n <path d=\"M108.567 128.496C113.42 128.496 117.354 124.562 117.354 119.709C117.354 114.856 113.42 110.922 108.567 110.922C103.715 110.922 99.7806 114.856 99.7806 119.709C99.7806 124.562 103.715 128.496 108.567 128.496Z\" fill=\"#5E4EA5\"/>\n <path d=\"M108.401 62.3014C112.902 62.3014 116.551 58.6522 116.551 54.1507C116.551 49.6492 112.902 46 108.401 46C103.899 46 100.25 49.6492 100.25 54.1507C100.25 58.6522 103.899 62.3014 108.401 62.3014Z\" fill=\"#5E4EA5\"/>\n <path d=\"M110.625 57.625C110.625 56.5938 109.781 55.75 108.75 55.75C107.695 55.75 106.875 56.5938 106.875 57.625C106.875 58.6797 107.695 59.5 108.75 59.5C109.781 59.5 110.625 58.6797 110.625 57.625ZM107.086 48.1094L107.391 54.4844C107.414 54.7656 107.672 55 107.953 55H109.523C109.805 55 110.062 54.7656 110.086 54.4844L110.391 48.1094C110.414 47.7812 110.156 47.5 109.828 47.5H107.648C107.32 47.5 107.062 47.7812 107.086 48.1094Z\" fill=\"white\"/>\n <path d=\"M141.711 111C141.008 111 140.656 111.859 141.164 112.367L146.164 117.367C146.477 117.68 146.984 117.68 147.297 117.367L152.297 112.367C152.805 111.859 152.453 111 151.75 111H141.711Z\" fill=\"#5E4EA5\"/>\n <path d=\"M84.25 185.461C84.25 184.758 83.3906 184.406 82.8828 184.914L77.8828 189.914C77.5703 190.227 77.5703 190.734 77.8828 191.047L82.8828 196.047C83.3906 196.555 84.25 196.203 84.25 195.5V185.461Z\" fill=\"#C4B7FF\"/>\n <path d=\"M11.7891 120C12.4922 120 12.8437 119.141 12.3359 118.633L7.33593 113.633C7.02343 113.32 6.51562 113.32 6.20312 113.633L1.20312 118.633C0.695303 119.141 1.04687 120 1.74999 120H11.7891Z\" fill=\"#C4B7FF\"/>\n <path d=\"M133.75 174C142.31 174 149.25 167.06 149.25 158.5C149.25 149.94 142.31 143 133.75 143C125.19 143 118.25 149.94 118.25 158.5C118.25 167.06 125.19 174 133.75 174Z\" fill=\"#F2F2F2\"/>\n <path d=\"M129.872 169.64C130.214 169.726 130.584 169.628 130.84 169.363L141.093 158.771C141.633 158.218 141.369 157.283 140.616 157.095L135.917 155.924L138.969 151.071C139.286 150.493 138.97 149.765 138.331 149.606L132.468 148.144C131.979 148.022 131.473 148.281 131.287 148.749L127.548 158.197C127.324 158.764 127.65 159.399 128.241 159.546L133.074 160.751L129.222 168.203C128.921 168.785 129.249 169.485 129.872 169.64Z\" fill=\"#5B5B5B\"/>\n <path d=\"M133.75 174C142.31 174 149.25 167.06 149.25 158.5C149.25 149.94 142.31 143 133.75 143C125.19 143 118.25 149.94 118.25 158.5C118.25 167.06 125.19 174 133.75 174Z\" fill=\"#F2F2F2\"/>\n <path d=\"M19.75 174C28.3104 174 35.25 167.06 35.25 158.5C35.25 149.94 28.3104 143 19.75 143C11.1896 143 4.25 149.94 4.25 158.5C4.25 167.06 11.1896 174 19.75 174Z\" fill=\"#F2F2F2\"/>\n <path d=\"M19.3208 167.769C23.2973 167.769 26.5208 164.545 26.5208 160.569C26.5208 156.592 23.2973 153.369 19.3208 153.369C15.3444 153.369 12.1208 156.592 12.1208 160.569C12.1208 164.545 15.3444 167.769 19.3208 167.769Z\" fill=\"#CBCBCB\"/>\n <path d=\"M13.7656 153.188L12.4676 152.716C12.4676 152.716 15.1815 150.002 18.9572 150.238L17.8953 149.177C17.8953 149.177 20.4911 148.233 22.851 150.71C24.0915 152.013 25.5268 153.544 26.4216 155.269H27.8116L27.2314 156.429L29.2619 157.589L27.1778 157.381C27.3752 158.383 27.3073 159.418 26.9807 160.386L26.5087 161.684C26.5087 161.684 24.6208 157.908 24.6208 157.436V158.616C24.6208 158.616 23.3229 157.554 23.3229 156.846L22.615 157.672L22.261 156.374L17.8953 157.672L18.6032 156.61L15.8894 156.964L16.9514 155.666C16.9514 155.666 13.8836 157.2 13.7656 158.498C13.6476 159.796 12.1137 161.448 12.1137 161.448L11.4058 160.268C11.4058 160.268 10.3438 154.958 13.7656 153.188Z\" fill=\"#595959\"/>\n <path d=\"M76.75 31C68.1896 31 61.25 24.0604 61.25 15.5C61.25 6.93959 68.1896 0 76.75 0C85.3104 0 92.25 6.93959 92.25 15.5C92.25 24.0604 85.3104 31 76.75 31Z\" fill=\"#F2F2F2\"/>\n <path d=\"M77.1792 24.7687C73.2027 24.7687 69.9792 21.5452 69.9792 17.5687C69.9792 13.5923 73.2027 10.3687 77.1792 10.3687C81.1556 10.3687 84.3792 13.5923 84.3792 17.5687C84.3792 21.5452 81.1556 24.7687 77.1792 24.7687Z\" fill=\"#CBCBCB\"/>\n <path d=\"M82.7344 10.1883L84.0324 9.71628C84.0324 9.71628 81.3185 7.00246 77.5428 7.23845L78.6047 6.17651C78.6047 6.17651 76.0089 5.23258 73.649 7.71041C72.4085 9.01295 70.9732 10.544 70.0784 12.2687H68.6884L69.2686 13.429L67.2381 14.5893L69.3222 14.3808C69.1248 15.3825 69.1927 16.4184 69.5193 17.3858L69.9913 18.6837C69.9913 18.6837 71.8792 14.9079 71.8792 14.4359V15.6159C71.8792 15.6159 73.1771 14.5539 73.1771 13.846L73.885 14.6719L74.239 13.374L78.6047 14.6719L77.8968 13.61L80.6106 13.964L79.5486 12.6661C79.5486 12.6661 82.6164 14.2 82.7344 15.4979C82.8524 16.7958 84.3863 18.4477 84.3863 18.4477L85.0942 17.2678C85.0942 17.2678 86.1562 11.9581 82.7344 10.1883Z\" fill=\"#595959\"/>\n <path d=\"M141.365 153.936C139.147 150.189 134.759 150.014 134.759 150.014C134.759 150.014 130.483 149.467 127.74 155.175C125.183 160.495 121.655 165.632 127.172 166.877L128.168 163.776L128.786 167.108C129.571 167.165 130.359 167.178 131.146 167.149C137.055 166.958 142.681 167.204 142.5 165.084C142.259 162.266 143.499 157.542 141.365 153.936Z\" fill=\"#595959\"/>\n <path d=\"M140.968 160.376C141.521 160.376 141.968 159.928 141.968 159.376C141.968 158.823 141.521 158.376 140.968 158.376C140.416 158.376 139.968 158.823 139.968 159.376C139.968 159.928 140.416 160.376 140.968 160.376Z\" fill=\"#CBCBCB\"/>\n <path d=\"M129.168 160.376C129.721 160.376 130.168 159.928 130.168 159.376C130.168 158.823 129.721 158.376 129.168 158.376C128.616 158.376 128.168 158.823 128.168 159.376C128.168 159.928 128.616 160.376 129.168 160.376Z\" fill=\"#CBCBCB\"/>\n <path d=\"M135.068 165.276C138.272 165.276 140.868 162.679 140.868 159.476C140.868 156.272 138.272 153.676 135.068 153.676C131.865 153.676 129.268 156.272 129.268 159.476C129.268 162.679 131.865 165.276 135.068 165.276Z\" fill=\"#CBCBCB\"/>\n <path d=\"M140.384 153.575L136.049 151.304L130.062 152.233L128.824 157.704L131.907 157.585L132.768 155.576V157.552L134.191 157.498L135.017 154.298L135.533 157.704L140.591 157.601L140.384 153.575Z\" fill=\"#595959\"/>\n <path d=\"M79.4007 199.301C83.9022 199.301 87.5514 195.652 87.5514 191.151C87.5514 186.649 83.9022 183 79.4007 183C74.8992 183 71.25 186.649 71.25 191.151C71.25 195.652 74.8992 199.301 79.4007 199.301Z\" fill=\"#5E4EA5\"/>\n <path d=\"M82.9375 189.25H80.2188L81.2266 186.227C81.3203 185.852 81.0391 185.5 80.6875 185.5H77.3125C77.0313 185.5 76.7735 185.711 76.75 185.992L76 191.617C75.9531 191.969 76.211 192.25 76.5625 192.25H79.3281L78.25 196.82C78.1797 197.172 78.4375 197.5 78.7891 197.5C79 197.5 79.1875 197.406 79.2813 197.219L83.4063 190.094C83.6406 189.742 83.3594 189.25 82.9375 189.25Z\" fill=\"white\"/>\n <path d=\"M106.555 91.8125C106.789 92.0469 107.188 92.0469 107.422 91.8125L114.312 84.9219C114.547 84.6875 114.547 84.2891 114.312 84.0547L113.469 83.2109C113.234 82.9766 112.859 82.9766 112.625 83.2109L107 88.8359L104.352 86.2109C104.117 85.9766 103.742 85.9766 103.508 86.2109L102.664 87.0547C102.43 87.2891 102.43 87.6875 102.664 87.9219L106.555 91.8125Z\" fill=\"white\"/>\n <path d=\"M106.555 124.812C106.789 125.047 107.188 125.047 107.422 124.812L114.312 117.922C114.547 117.688 114.547 117.289 114.312 117.055L113.469 116.211C113.234 115.977 112.859 115.977 112.625 116.211L107 121.836L104.352 119.211C104.117 118.977 103.742 118.977 103.508 119.211L102.664 120.055C102.43 120.289 102.43 120.688 102.664 120.922L106.555 124.812Z\" fill=\"white\"/>\n <defs>\n <linearGradient id=\"paint0_linear\" x1=\"108.567\" y1=\"63.3516\" x2=\"108.567\" y2=\"45.778\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#808080\" stop-opacity=\"0.25\"/>\n <stop offset=\"0.54\" stop-color=\"#808080\" stop-opacity=\"0.12\"/>\n <stop offset=\"1\" stop-color=\"#808080\" stop-opacity=\"0.1\"/>\n </linearGradient>\n </defs>\n </svg>\n <div fxFlex=\"20\" fxLayoutAlign=\"center end\">\n <mat-card-title>Step 3: Rebalance amount</mat-card-title>\n </div>\n <div fxFlex=\"40\">\n <mat-card-subtitle class=\"font-size-120\">\n You will be moving part or all of the local balance to the remote side. For the route to be circular, there should be at least 3 nodes involved.\n </mat-card-subtitle>\n </div>\n </div>\n</ng-template>\n<ng-template #infoStepBlock5>\n <div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between stretch\" [@sliderAnimation]=\"animationDirection\"\n (swipe)=\"onSwipe($event)\">\n <svg fxFlex=\"30\" viewBox=\"0 0 153 200\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/2000/svg\"\n [ngClass]=\"{'small-svg': screenSize === screenSizeEnum.XS, 'large-svg': screenSize !== screenSizeEnum.XS}\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M76.25 191C114.91 191 146.25 158.541 146.25 118.5C146.25 78.4594 114.91 46 76.25 46C37.5901 46 6.25 78.4594 6.25 118.5C6.25 158.541 37.5901 191 76.25 191Z\" stroke=\"#5E4EA5\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-dasharray=\"7 7\"/>\n <path d=\"M122.399 37H32.25V137.616H122.399V37Z\" fill=\"#E6E6E6\"/>\n <path d=\"M120.908 104.177H33.7393V135.425H120.908V104.177Z\" fill=\"white\"/>\n <path d=\"M92.0943 111.589H40.8943V127.601H92.0943V111.589Z\" fill=\"#C4B7FF\"/>\n <path d=\"M108.567 127.643C113.069 127.643 116.718 123.993 116.718 119.492C116.718 114.99 113.069 111.341 108.567 111.341C104.066 111.341 100.417 114.99 100.417 119.492C100.417 123.993 104.066 127.643 108.567 127.643Z\" fill=\"#6C63FF\"/>\n <path d=\"M120.908 71.7129H33.7393V102.96H120.908V71.7129Z\" fill=\"white\"/>\n <path d=\"M92.0943 79.1244H40.8943V95.1363H92.0943V79.1244Z\" fill=\"#C4B7FF\"/>\n <path d=\"M108.567 95.1801C113.069 95.1801 116.718 91.5309 116.718 87.0294C116.718 82.5279 113.069 78.8787 108.567 78.8787C104.066 78.8787 100.417 82.5279 100.417 87.0294C100.417 91.5309 104.066 95.1801 108.567 95.1801Z\" fill=\"#6C63FF\"/>\n <path d=\"M120.908 39.2482H33.7393V70.4955H120.908V39.2482Z\" fill=\"white\"/>\n <path d=\"M92.0943 46.662H40.8943V62.6739H92.0943V46.662Z\" fill=\"#C4B7FF\"/>\n <path d=\"M76 112H41V128H76V112Z\" fill=\"#5E4EA5\"/>\n <path d=\"M70 79H41V95H70V79Z\" fill=\"#5E4EA5\"/>\n <path d=\"M70 47H41V63H70V47Z\" fill=\"#5E4EA5\"/>\n <path d=\"M108.568 63.3516C113.42 63.3516 117.354 59.4176 117.354 54.5648C117.354 49.712 113.42 45.778 108.568 45.778C103.715 45.778 99.7808 49.712 99.7808 54.5648C99.7808 59.4176 103.715 63.3516 108.568 63.3516Z\" fill=\"url(#paint0_linear)\"/>\n <path d=\"M108.568 96.0334C113.42 96.0334 117.354 92.0994 117.354 87.2466C117.354 82.3938 113.42 78.4598 108.568 78.4598C103.715 78.4598 99.7808 82.3938 99.7808 87.2466C99.7808 92.0994 103.715 96.0334 108.568 96.0334Z\" fill=\"#5E4EA5\"/>\n <path d=\"M108.568 129.496C113.42 129.496 117.354 125.562 117.354 120.709C117.354 115.856 113.42 111.922 108.568 111.922C103.715 111.922 99.7808 115.856 99.7808 120.709C99.7808 125.562 103.715 129.496 108.568 129.496Z\" fill=\"#5E4EA5\"/>\n <path d=\"M108.401 62.3014C112.902 62.3014 116.551 58.6522 116.551 54.1507C116.551 49.6492 112.902 46 108.401 46C103.899 46 100.25 49.6492 100.25 54.1507C100.25 58.6522 103.899 62.3014 108.401 62.3014Z\" fill=\"#5E4EA5\"/>\n <path d=\"M106.805 91.8125C107.039 92.0469 107.438 92.0469 107.672 91.8125L114.562 84.9219C114.797 84.6875 114.797 84.2891 114.562 84.0547L113.719 83.2109C113.484 82.9766 113.109 82.9766 112.875 83.2109L107.25 88.8359L104.602 86.2109C104.367 85.9766 103.992 85.9766 103.758 86.2109L102.914 87.0547C102.68 87.2891 102.68 87.6875 102.914 87.9219L106.805 91.8125Z\" fill=\"white\"/>\n <path d=\"M106.805 58.8125C107.039 59.0469 107.438 59.0469 107.672 58.8125L114.562 51.9219C114.797 51.6875 114.797 51.2891 114.562 51.0547L113.719 50.2109C113.484 49.9766 113.109 49.9766 112.875 50.2109L107.25 55.8359L104.602 53.2109C104.367 52.9766 103.992 52.9766 103.758 53.2109L102.914 54.0547C102.68 54.2891 102.68 54.6875 102.914 54.9219L106.805 58.8125Z\" fill=\"white\"/>\n <path d=\"M106.555 124.812C106.789 125.047 107.188 125.047 107.422 124.812L114.312 117.922C114.547 117.688 114.547 117.289 114.312 117.055L113.469 116.211C113.234 115.977 112.859 115.977 112.625 116.211L107 121.836L104.352 119.211C104.117 118.977 103.742 118.977 103.508 119.211L102.664 120.055C102.43 120.289 102.43 120.688 102.664 120.922L106.555 124.812Z\" fill=\"white\"/>\n <path d=\"M141.711 111C141.008 111 140.656 111.859 141.164 112.367L146.164 117.367C146.477 117.68 146.984 117.68 147.297 117.367L152.297 112.367C152.805 111.859 152.453 111 151.75 111H141.711Z\" fill=\"#5E4EA5\"/>\n <path d=\"M84.25 185.461C84.25 184.758 83.3906 184.406 82.8828 184.914L77.8828 189.914C77.5703 190.227 77.5703 190.734 77.8828 191.047L82.8828 196.047C83.3906 196.555 84.25 196.203 84.25 195.5V185.461Z\" fill=\"#C4B7FF\"/>\n <path d=\"M11.7891 120C12.4922 120 12.8437 119.141 12.3359 118.633L7.33593 113.633C7.02343 113.32 6.51562 113.32 6.20312 113.633L1.20312 118.633C0.695303 119.141 1.04687 120 1.74999 120H11.7891Z\" fill=\"#5E4EA5\"/>\n <path d=\"M133.75 174C142.31 174 149.25 167.06 149.25 158.5C149.25 149.94 142.31 143 133.75 143C125.19 143 118.25 149.94 118.25 158.5C118.25 167.06 125.19 174 133.75 174Z\" fill=\"#F2F2F2\"/>\n <path d=\"M129.872 169.64C130.214 169.726 130.584 169.628 130.84 169.363L141.093 158.771C141.633 158.218 141.369 157.283 140.616 157.095L135.917 155.924L138.969 151.071C139.286 150.493 138.97 149.765 138.331 149.606L132.468 148.144C131.979 148.022 131.473 148.281 131.287 148.749L127.548 158.197C127.324 158.764 127.65 159.399 128.241 159.546L133.074 160.751L129.222 168.203C128.921 168.785 129.249 169.485 129.872 169.64Z\" fill=\"#5B5B5B\"/>\n <path d=\"M133.75 174C142.31 174 149.25 167.06 149.25 158.5C149.25 149.94 142.31 143 133.75 143C125.19 143 118.25 149.94 118.25 158.5C118.25 167.06 125.19 174 133.75 174Z\" fill=\"#F2F2F2\"/>\n <path d=\"M19.75 174C28.3104 174 35.25 167.06 35.25 158.5C35.25 149.94 28.3104 143 19.75 143C11.1896 143 4.25 149.94 4.25 158.5C4.25 167.06 11.1896 174 19.75 174Z\" fill=\"#F2F2F2\"/>\n <path d=\"M19.3208 167.769C23.2973 167.769 26.5208 164.545 26.5208 160.569C26.5208 156.592 23.2973 153.369 19.3208 153.369C15.3444 153.369 12.1208 156.592 12.1208 160.569C12.1208 164.545 15.3444 167.769 19.3208 167.769Z\" fill=\"#CBCBCB\"/>\n <path d=\"M13.7656 153.188L12.4676 152.716C12.4676 152.716 15.1815 150.002 18.9572 150.238L17.8953 149.177C17.8953 149.177 20.4911 148.233 22.851 150.71C24.0915 152.013 25.5268 153.544 26.4216 155.269H27.8116L27.2314 156.429L29.2619 157.589L27.1778 157.381C27.3752 158.383 27.3073 159.418 26.9807 160.386L26.5087 161.684C26.5087 161.684 24.6208 157.908 24.6208 157.436V158.616C24.6208 158.616 23.3229 157.554 23.3229 156.846L22.615 157.672L22.261 156.374L17.8953 157.672L18.6032 156.61L15.8894 156.964L16.9514 155.666C16.9514 155.666 13.8836 157.2 13.7656 158.498C13.6476 159.796 12.1137 161.448 12.1137 161.448L11.4058 160.268C11.4058 160.268 10.3438 154.958 13.7656 153.188Z\" fill=\"#595959\"/>\n <path d=\"M76.75 31C68.1896 31 61.25 24.0604 61.25 15.5C61.25 6.93959 68.1896 0 76.75 0C85.3104 0 92.25 6.93959 92.25 15.5C92.25 24.0604 85.3104 31 76.75 31Z\" fill=\"#F2F2F2\"/>\n <path d=\"M77.1792 24.7688C73.2027 24.7688 69.9792 21.5452 69.9792 17.5688C69.9792 13.5923 73.2027 10.3688 77.1792 10.3688C81.1556 10.3688 84.3792 13.5923 84.3792 17.5688C84.3792 21.5452 81.1556 24.7688 77.1792 24.7688Z\" fill=\"#CBCBCB\"/>\n <path d=\"M82.7344 10.1883L84.0324 9.71628C84.0324 9.71628 81.3185 7.00246 77.5428 7.23845L78.6047 6.17651C78.6047 6.17651 76.0089 5.23258 73.649 7.71041C72.4085 9.01295 70.9732 10.544 70.0784 12.2687H68.6884L69.2686 13.429L67.2381 14.5893L69.3222 14.3808C69.1248 15.3825 69.1927 16.4184 69.5193 17.3858L69.9913 18.6837C69.9913 18.6837 71.8792 14.9079 71.8792 14.4359V15.6159C71.8792 15.6159 73.1771 14.5539 73.1771 13.846L73.885 14.6719L74.239 13.374L78.6047 14.6719L77.8968 13.61L80.6106 13.964L79.5486 12.6661C79.5486 12.6661 82.6164 14.2 82.7344 15.4979C82.8524 16.7958 84.3863 18.4477 84.3863 18.4477L85.0942 17.2678C85.0942 17.2678 86.1562 11.9581 82.7344 10.1883Z\" fill=\"#595959\"/>\n <path d=\"M141.365 153.936C139.147 150.189 134.759 150.014 134.759 150.014C134.759 150.014 130.483 149.467 127.74 155.175C125.183 160.495 121.655 165.632 127.172 166.877L128.168 163.776L128.785 167.108C129.571 167.165 130.359 167.178 131.146 167.149C137.055 166.958 142.681 167.204 142.5 165.084C142.259 162.266 143.499 157.543 141.365 153.936Z\" fill=\"#595959\"/>\n <path d=\"M140.968 160.376C141.521 160.376 141.968 159.928 141.968 159.376C141.968 158.823 141.521 158.376 140.968 158.376C140.416 158.376 139.968 158.823 139.968 159.376C139.968 159.928 140.416 160.376 140.968 160.376Z\" fill=\"#CBCBCB\"/>\n <path d=\"M129.168 160.376C129.721 160.376 130.168 159.928 130.168 159.376C130.168 158.823 129.721 158.376 129.168 158.376C128.616 158.376 128.168 158.823 128.168 159.376C128.168 159.928 128.616 160.376 129.168 160.376Z\" fill=\"#CBCBCB\"/>\n <path d=\"M135.068 165.276C138.272 165.276 140.868 162.679 140.868 159.476C140.868 156.272 138.272 153.676 135.068 153.676C131.865 153.676 129.268 156.272 129.268 159.476C129.268 162.679 131.865 165.276 135.068 165.276Z\" fill=\"#CBCBCB\"/>\n <path d=\"M140.384 153.575L136.049 151.304L130.062 152.233L128.824 157.704L131.907 157.585L132.768 155.576V157.552L134.191 157.498L135.017 154.298L135.533 157.704L140.591 157.601L140.384 153.575Z\" fill=\"#595959\"/>\n <path d=\"M79.4007 199.301C83.9022 199.301 87.5514 195.652 87.5514 191.151C87.5514 186.649 83.9022 183 79.4007 183C74.8992 183 71.25 186.649 71.25 191.151C71.25 195.652 74.8992 199.301 79.4007 199.301Z\" fill=\"#5E4EA5\"/>\n <path d=\"M82.9374 189.25H80.2186L81.2265 186.227C81.3202 185.852 81.039 185.5 80.6874 185.5H77.3124C77.0311 185.5 76.7733 185.711 76.7499 185.992L75.9999 191.617C75.953 191.969 76.2108 192.25 76.5624 192.25H79.328L78.2499 196.82C78.1796 197.172 78.4374 197.5 78.789 197.5C78.9999 197.5 79.1874 197.406 79.2811 197.219L83.4061 190.094C83.6405 189.742 83.3593 189.25 82.9374 189.25Z\" fill=\"white\"/>\n <defs>\n <linearGradient id=\"paint0_linear\" x1=\"108.568\" y1=\"63.3516\" x2=\"108.568\" y2=\"45.778\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#808080\" stop-opacity=\"0.25\"/>\n <stop offset=\"0.54\" stop-color=\"#808080\" stop-opacity=\"0.12\"/>\n <stop offset=\"1\" stop-color=\"#808080\" stop-opacity=\"0.1\"/>\n </linearGradient>\n </defs>\n </svg>\n <div fxFlex=\"20\" fxLayoutAlign=\"center end\">\n <mat-card-title>Rebalance successful!</mat-card-title>\n </div>\n <div fxFlex=\"40\">\n <mat-card-subtitle class=\"font-size-120\">\n Your channel is successfully rebalanced and is able to continue to route payments.\n </mat-card-subtitle>\n </div>\n </div>\n</ng-template>","import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';\nimport { ScreenSizeEnum } from '../../../../shared/services/consts-enums-functions';\n\nimport { sliderAnimation } from '../../../../shared/animation/slider-animation';\nimport { CommonService } from '../../../../shared/services/common.service';\n\n@Component({\n selector: 'rtl-channel-rebalance-infographics',\n templateUrl: './channel-rebalance-infographics.component.html',\n styleUrls: ['./channel-rebalance-infographics.component.scss'],\n animations: [sliderAnimation]\n})\nexport class ChannelRebalanceInfographicsComponent implements OnInit {\n\n @Input() animationDirection = 'forward';\n @Input() stepNumber = 1;\n @Output() readonly stepNumberChange = new EventEmitter();\n public screenSize = '';\n public screenSizeEnum = ScreenSizeEnum;\n\n constructor(private commonService: CommonService) { }\n\n ngOnInit() {\n this.screenSize = this.commonService.getScreenSize();\n }\n\n onSwipe(event: any) {\n if (event.direction === 2 && this.stepNumber < 5) {\n this.stepNumber++;\n this.animationDirection = 'forward';\n this.stepNumberChange.emit(this.stepNumber);\n } else if (event.direction === 4 && this.stepNumber > 1) {\n this.stepNumber--;\n this.animationDirection = 'backward';\n this.stepNumberChange.emit(this.stepNumber);\n }\n }\n\n}\n","<div *ngIf=\"!flgShowInfo\" fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"start stretch\" [@opacityAnimation]>\n <div fxFlex=\"100\">\n <mat-card-header fxLayout=\"row\" fxLayoutAlign=\"space-between center\" class=\"modal-info-header\">\n <div fxLayoutAlign=\"start start\" [fxFlex]=\"screenSize === screenSizeEnum.XS || screenSize === screenSizeEnum.SM ? '83' : '91'\"><span class=\"page-title\">{{channel ? ('Channel ' + loopDirectionCaption) : loopDirectionCaption}}</span></div>\n <div fxLayoutAlign=\"space-between end\" [fxFlex]=\"screenSize === screenSizeEnum.XS || screenSize === screenSizeEnum.SM ? '17' : '9'\">\n <button tabindex=\"21\" class=\"btn-close-x p-0\" mat-button (click)=\"showInfo()\">?</button>\n <button tabindex=\"22\" class=\"btn-close-x p-0\" mat-button (click)=\"onClose()\">X</button>\n </div>\n </mat-card-header>\n <mat-card-content class=\"padding-gap-x-large\">\n <div fxLayout=\"column\">\n <div fxLayout=\"column\" fxLayout.gt-sm=\"row wrap\" fxLayoutAlign=\"space-between stretch\">\n <div fxFlex=\"100\" class=\"alert alert-info\">\n <fa-icon class=\"mr-1 alert-icon\" [icon]=\"faInfoCircle\"></fa-icon>\n <span>Circular Rebalance is a payment you make to *yourselves* to affect a relative change in the balances of two channels.\n This is accomplished by sending payment out from the selected channel and receiving it back on the channel with the selected peer.\n Please note, you will be paying routing fee to balance the channels in this manner.</span>\n </div>\n </div>\n <div class=\"padding-gap-large\" fxLayout=\"column\" fxLayout.gt-sm=\"row wrap\" fxLayoutAlign=\"space-between stretch\">\n <p fxFlex=\"46\"><strong>Channel Peer:&nbsp;</strong>{{selChannel.remote_alias | titlecase}}</p>\n <p fxFlex=\"46\"><strong>Channel ID:&nbsp;</strong>{{selChannel.chan_id}}</p>\n </div>\n <mat-vertical-stepper #stepper [linear]=\"true\" (selectionChange)=\"stepSelectionChanged($event)\">\n <mat-step [stepControl]=\"inputFormGroup\" [editable]=\"flgEditable\">\n <form fxLayout=\"column\" fxLayout.gt-sm=\"row wrap\" fxLayoutAlign=\"start\" fxLayoutAlign.gt-sm=\"space-between\" class=\"my-1\" [formGroup]=\"inputFormGroup\">\n <ng-template matStepLabel>{{inputFormLabel}}</ng-template>\n <div fxLayout=\"column\" fxLayout.gt-sm=\"row wrap\" fxFlex=\"100\" fxLayoutAlign=\"space-between stretch\"> \n <mat-form-field fxFlex=\"48\">\n <input autoFocus matInput placeholder=\"Amount\" type=\"number\" tabindex=\"1\" formControlName=\"rebalanceAmount\" required [step]=\"100\">\n <mat-hint>(Local Bal: {{selChannel?.local_balance}}, Remaining: {{selChannel?.local_balance - ((inputFormGroup.controls.rebalanceAmount.value) ? inputFormGroup.controls.rebalanceAmount.value : 0)}})</mat-hint>\n <span matSuffix>Sats</span>\n <mat-error *ngIf=\"inputFormGroup.controls.rebalanceAmount.errors?.required\">Amount is required.</mat-error>\n <mat-error *ngIf=\"inputFormGroup.controls.rebalanceAmount.errors?.min\">Amount must be a positive number.</mat-error>\n <mat-error *ngIf=\"inputFormGroup.controls.rebalanceAmount.errors?.max\">Amount must be less than or equal to {{selChannel?.local_balance}}.</mat-error>\n </mat-form-field>\n <mat-form-field fxFlex=\"48\" fxLayoutAlign=\"start end\">\n <input type=\"text\" placeholder=\"Receive from Peer\" aria-label=\"Receive from Peer\" matInput formControlName=\"selRebalancePeer\" tabindex=\"2\" required [matAutocomplete]=\"auto\" (change)=\"onSelectedPeerChanged()\">\n <mat-autocomplete #auto=\"matAutocomplete\" [displayWith]=\"displayFn\" (optionSelected)=\"onSelectedPeerChanged()\">\n <mat-option *ngFor=\"let activeChannel of filteredActiveChannels | async\" [value]=\"activeChannel\">{{activeChannel.remote_alias}} - {{activeChannel.chan_id}}</mat-option>\n </mat-autocomplete>\n <mat-error *ngIf=\"inputFormGroup.controls.selRebalancePeer.errors?.required\">Receive from Peer is required.</mat-error>\n <mat-error *ngIf=\"inputFormGroup.controls.selRebalancePeer.errors?.notfound\">Receive from Peer not found in the list.</mat-error>\n </mat-form-field>\n </div>\n <div class=\"mt-2\" fxLayout=\"row\" fxLayoutAlign=\"start center\" fxFlex=\"100\">\n <button mat-button color=\"primary\" tabindex=\"3\" type=\"submit\" (click)=\"onSelectFee()\">Select Fee</button>\n </div>\n </form>\n </mat-step>\n <mat-step [stepControl]=\"feeFormGroup\" [editable]=\"flgEditable\">\n <form fxLayout=\"column\" fxLayout.gt-sm=\"row wrap\" fxLayoutAlign=\"start\" fxLayoutAlign.gt-sm=\"space-between\" class=\"my-1\" [formGroup]=\"feeFormGroup\">\n <ng-template matStepLabel disabled=\"true\">{{feeFormLabel}}</ng-template>\n <div fxLayout=\"column\" fxLayout.gt-sm=\"row wrap\" fxFlex=\"100\" fxLayoutAlign=\"space-between stretch\">\n <div fxLayout=\"column\" fxLayout.gt-sm=\"row wrap\" fxFlex=\"100\" fxLayoutAlign=\"space-between stretch\">\n <mat-form-field fxFlex=\"48\" fxLayoutAlign=\"start end\">\n <mat-select tabindex=\"6\" formControlName=\"selFeeLimitType\" Placeholder=\"Fee Limits\" required>\n <mat-option *ngFor=\"let feeLimitType of feeLimitTypes\" [value]=\"feeLimitType\">\n {{feeLimitType.name}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field fxFlex=\"48\">\n <input matInput formControlName=\"feeLimit\" type=\"number\" tabindex=\"7\" required placeholder=\"{{feeFormGroup.controls.selFeeLimitType.value ? feeFormGroup.controls.selFeeLimitType.value.placeholder : feeLimitTypes[0].placeholder}}\" [step]=\"1\">\n <mat-error *ngIf=\"feeFormGroup.controls.feeLimit.errors?.required\">{{feeFormGroup.controls.selFeeLimitType.value ? feeFormGroup.controls.selFeeLimitType.value.placeholder : feeLimitTypes[0].placeholder}} is required.</mat-error>\n <mat-error *ngIf=\"feeFormGroup.controls.feeLimit.errors?.min\">{{feeFormGroup.controls.selFeeLimitType.value ? feeFormGroup.controls.selFeeLimitType.value.placeholder : feeLimitTypes[0].placeholder}} must be a positive number.</mat-error>\n </mat-form-field>\n </div> \n </div>\n <div class=\"mt-2\" fxLayout=\"row\" fxLayoutAlign=\"start center\" fxFlex=\"100\">\n <button mat-button color=\"primary\" tabindex=\"8\" type=\"submit\" (click)=\"onRebalance()\">Rebalance</button>\n </div>\n </form>\n </mat-step>\n <mat-step [stepControl]=\"statusFormGroup\">\n <form fxLayout=\"column\" fxLayout.gt-sm=\"row wrap\" fxLayoutAlign=\"start\" fxLayoutAlign.gt-sm=\"space-between\" class=\"my-1\" [formGroup]=\"statusFormGroup\">\n <ng-template matStepLabel>Invoice/Payment</ng-template>\n <div fxLayout=\"row wrap\" fxFlex=\"100\" fxLayoutAlign=\"space-between stretch\">\n <mat-expansion-panel class=\"flat-expansion-panel mb-2\" fxFlex=\"100\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <span fxLayoutAlign=\"start center\" fxFlex=\"100\">{{!flgInvoiceGenerated ? 'Generating invoice...' : flgReusingInvoice ? 'Invoice re-used' : 'Invoice generated'}}<mat-icon *ngIf=\"flgInvoiceGenerated\" class=\"ml-1 icon-small\">check</mat-icon></span>\n </mat-panel-title>\n </mat-expansion-panel-header>\n <div fxLayout=\"column\"><span class=\"foreground-secondary-text\">{{paymentRequest}}</span></div>\n </mat-expansion-panel>\n <mat-progress-bar *ngIf=\"!flgInvoiceGenerated\" fxFlex=\"100\" color=\"primary\" mode=\"indeterminate\"></mat-progress-bar>\n <mat-expansion-panel class=\"flat-expansion-panel\" fxFlex=\"100\" [expanded]=\"(flgInvoiceGenerated || flgReusingInvoice) && flgPaymentSent\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <span fxLayoutAlign=\"start center\" fxFlex=\"100\">{{!flgInvoiceGenerated && !flgPaymentSent ? 'Payment waiting for Invoice' : (!flgPaymentSent ? 'Processing payment...' : (paymentStatus?.error ? 'Payment failed' : 'Payment successful'))}}<mat-icon *ngIf=\"flgPaymentSent\" class=\"ml-1 icon-small\">{{paymentStatus?.error ? 'close' : 'check'}}</mat-icon></span>\n </mat-panel-title>\n </mat-expansion-panel-header>\n <div *ngIf=\"!paymentStatus; else paymentStatusBlock\"fxLayout=\"column\"></div>\n </mat-expansion-panel>\n <mat-progress-bar *ngIf=\"flgInvoiceGenerated && !flgPaymentSent\" fxFlex=\"100\" color=\"primary\" mode=\"indeterminate\"></mat-progress-bar>\n </div>\n <h4 *ngIf=\"flgInvoiceGenerated && flgPaymentSent\" fxLayoutAlign=\"start\" class=\"font-bold-500 mt-1\">{{paymentStatus && paymentStatus.payment_hash ? 'Rebalance Successful.' : 'Rebalance Failed.'}}</h4>\n <div class=\"mt-1\" fxLayout=\"row\" fxLayoutAlign=\"start center\" fxFlex=\"100\">\n <button *ngIf=\"paymentStatus && paymentStatus.error\" mat-button color=\"primary\" tabindex=\"11\" type=\"button\" (click)=\"onRestart()\">Start Again</button>\n </div>\n </form>\n </mat-step>\n </mat-vertical-stepper>\n <div fxLayout=\"row\" fxFlex=\"100\" fxLayoutAlign=\"end center\"> \n <button mat-button color=\"primary\" tabindex=\"12\" type=\"button\" default [mat-dialog-close]=\"false\">Close</button>\n </div>\n </div>\n </mat-card-content>\n </div>\n</div>\n<ng-template #paymentStatusBlock>\n <ng-container *ngTemplateOutlet=\"paymentStatus.error ? paymentFailedBlock : paymentSuccessfulBlock\"></ng-container>\n</ng-template>\n<ng-template #paymentFailedBlock>\n <div fxLayout=\"column\"><span class=\"foreground-secondary-text\">Error: {{paymentStatus.error}}</span></div>\n</ng-template>\n<ng-template #paymentSuccessfulBlock>\n <div fxLayout=\"column\">\n <div fxLayout=\"row\">\n <div fxFlex=\"100\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Payment Hash</h4>\n <span class=\"foreground-secondary-text\">{{paymentStatus.payment_hash}}</span>\n </div>\n </div>\n <mat-divider class=\"w-100 my-1\"></mat-divider>\n <div fxLayout=\"row\">\n <div fxFlex=\"50\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Total Fees ({{paymentStatus.payment_route.total_fees_msat ? 'mSats' : 'Sats'}})</h4>\n <span class=\"foreground-secondary-text\">{{paymentStatus.payment_route.total_fees_msat ? paymentStatus.payment_route.total_fees_msat : paymentStatus.payment_route.total_fees ? paymentStatus.payment_route.total_fees : 0}}</span>\n </div>\n <div fxFlex=\"50\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Number of Hops</h4>\n <span class=\"foreground-secondary-text\">{{paymentStatus && paymentStatus.payment_route && paymentStatus.payment_route.hops && paymentStatus.payment_route.hops.length ? paymentStatus.payment_route.hops.length : 0}}</span>\n </div>\n </div>\n </div>\n</ng-template>\n<div *ngIf=\"flgShowInfo\" fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"start stretch\" class=\"info-graphics-container\" [@opacityAnimation]>\n <div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between stretch\">\n <mat-card-header fxLayout=\"row\" fxFlex=\"8\" fxLayoutAlign=\"space-between center\" class=\"modal-info-header\">\n <div fxFlex=\"95\" fxLayoutAlign=\"start start\"><span class=\"page-title\"></span></div>\n <div fxFlex=\"5\" fxLayoutAlign=\"end center\">\n <button tabindex=\"19\" class=\"btn-close-x p-0\" mat-button (click)=\"flgShowInfo=false;stepNumber=1;\">X</button>\n </div>\n </mat-card-header>\n <mat-card-content fxLayout=\"column\" fxFlex=\"70\" fxLayoutAlign=\"space-between center\" class=\"padding-gap-x-large\">\n <rtl-channel-rebalance-infographics fxFlex=\"100\" [animationDirection]=\"animationDirection\" [(stepNumber)]=\"stepNumber\"></rtl-channel-rebalance-infographics>\n </mat-card-content>\n <div fxLayout=\"row\" fxFlex=\"10\" fxLayoutAlign=\"center end\" class=\"padding-gap-x-large padding-gap-bottom-large\">\n <span *ngFor=\"let i of [1, 2, 3, 4, 5];\" fxLayoutAlign=\"center center\" class=\"dots-stepper-block\" (click) = \"onStepChanged(i)\">\n <p class=\"dot tiny-dot mr-0\" [ngClass]=\"{'dot-primary': stepNumber === i, 'dot-primary-lighter': stepNumber !== i}\"></p>\n </span>\n </div>\n <div fxLayout=\"row\" fxFlex=\"10\" fxLayoutAlign=\"end end\" class=\"padding-gap-x-large padding-gap-bottom-large\">\n <button *ngIf=\"stepNumber === 5\" mat-button class=\"mr-1\" color=\"primary\" tabindex=\"16\" type=\"button\" (click)=\"onStepChanged(4)\">Back</button>\n <button *ngIf=\"stepNumber === 5\" mat-button color=\"primary\" tabindex=\"17\" type=\"button\" (click)=\"flgShowInfo=false;stepNumber=1;\">Close</button>\n <button *ngIf=\"stepNumber < 5\" mat-button class=\"mr-1\" color=\"primary\" tabindex=\"18\" type=\"button\" (click)=\"flgShowInfo=false;stepNumber=1;\">Close</button>\n <button *ngIf=\"stepNumber > 1 && stepNumber < 5\" mat-button class=\"mr-1\" color=\"primary\" tabindex=\"19\" type=\"button\" (click)=\"onStepChanged(stepNumber - 1)\">Back</button>\n <button *ngIf=\"stepNumber < 5\" mat-button color=\"primary\" tabindex=\"20\" type=\"button\" (click)=\"onStepChanged(stepNumber + 1)\">Next</button>\n </div>\n </div>\n</div>\n","import { Component, OnInit, Inject, OnDestroy, ViewChild } from '@angular/core';\nimport { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';\nimport { DecimalPipe } from '@angular/common';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { MatStepper } from '@angular/material/stepper';\nimport { Subject, Observable, of } from 'rxjs';\nimport { takeUntil, filter, startWith, map } from 'rxjs/operators';\nimport { Actions } from '@ngrx/effects';\nimport { Store } from '@ngrx/store';\nimport { faInfoCircle } from '@fortawesome/free-solid-svg-icons';\n\nimport { ChannelRebalanceAlert } from '../../../../shared/models/alertData';\nimport { LoggerService } from '../../../../shared/services/logger.service';\nimport { CommonService } from '../../../../shared/services/common.service';\nimport { Channel, QueryRoutes, ListInvoices } from '../../../../shared/models/lndModels';\nimport { FEE_LIMIT_TYPES, LNDActions, PAGE_SIZE, ScreenSizeEnum, UI_MESSAGES } from '../../../../shared/services/consts-enums-functions';\n\nimport { RTLState } from '../../../../store/rtl.state';\nimport { saveNewInvoice, sendPayment } from '../../../store/lnd.actions';\nimport { invoices } from '../../../store/lnd.selector';\nimport { ApiCallStatusPayload } from '../../../../shared/models/apiCallsPayload';\nimport { opacityAnimation } from '../../../../shared/animation/opacity-animation';\n\n@Component({\n selector: 'rtl-channel-rebalance',\n templateUrl: './channel-rebalance.component.html',\n styleUrls: ['./channel-rebalance.component.scss'],\n animations: [opacityAnimation]\n})\nexport class ChannelRebalanceComponent implements OnInit, OnDestroy {\n\n @ViewChild('stepper', { static: false }) stepper: MatStepper;\n public faInfoCircle = faInfoCircle;\n public invoices: ListInvoices = {};\n public selChannel: Channel = {};\n public activeChannels: Channel[] = [];\n public filteredActiveChannels: Observable<Channel[]>;\n public feeLimitTypes: any[] = [];\n public queryRoute: QueryRoutes | null = {};\n public paymentRequest = '';\n public paymentStatus: any = null;\n public flgReusingInvoice = false;\n public flgInvoiceGenerated = false;\n public flgPaymentSent = false;\n public inputFormLabel = 'Amount to rebalance';\n public feeFormLabel = 'Select rebalance fee';\n public flgEditable = true;\n public flgShowInfo = false;\n public stepNumber = 1;\n public screenSize = '';\n public screenSizeEnum = ScreenSizeEnum;\n public animationDirection = 'forward';\n inputFormGroup: UntypedFormGroup;\n feeFormGroup: UntypedFormGroup;\n statusFormGroup: UntypedFormGroup;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject()];\n\n constructor(\n public dialogRef: MatDialogRef<ChannelRebalanceComponent>,\n @Inject(MAT_DIALOG_DATA) public data: ChannelRebalanceAlert,\n private logger: LoggerService,\n private store: Store<RTLState>,\n private actions: Actions,\n private formBuilder: UntypedFormBuilder,\n private decimalPipe: DecimalPipe,\n private commonService: CommonService) { }\n\n ngOnInit() {\n this.screenSize = this.commonService.getScreenSize();\n let x = '';\n let y = '';\n this.selChannel = this.data.message?.selChannel || {};\n this.activeChannels = this.data.message?.channels?.filter((channel) => channel.active && channel.chan_id !== this.selChannel.chan_id && channel.remote_balance && channel.remote_balance > 0) || [];\n this.activeChannels = this.activeChannels.sort((c1: Channel, c2: Channel) => {\n x = c1.remote_alias ? c1.remote_alias.toLowerCase() : c1.chan_id ? c1.chan_id.toLowerCase() : '';\n y = c2.remote_alias ? c2.remote_alias.toLowerCase() : c1.chan_id ? c1.chan_id.toLowerCase() : '';\n return ((x < y) ? -1 : ((x > y) ? 1 : 0));\n });\n FEE_LIMIT_TYPES.forEach((FEE_LIMIT_TYPE, i) => {\n if (i > 0) {\n this.feeLimitTypes.push(FEE_LIMIT_TYPE);\n }\n });\n // HiddenAmount & hiddenFeeLimit are temporary hacks to overcome material steppers stepChanged event shortcoming.\n // User should be able to go to next step only by clicking the action button on the step.\n this.inputFormGroup = this.formBuilder.group({\n hiddenAmount: ['', [Validators.required]],\n rebalanceAmount: ['', [Validators.required, Validators.min(1), Validators.max(this.selChannel.local_balance || 0)]],\n selRebalancePeer: [null, Validators.required]\n });\n this.feeFormGroup = this.formBuilder.group({\n selFeeLimitType: [this.feeLimitTypes[0], Validators.required],\n feeLimit: ['', [Validators.required, Validators.min(0)]],\n hiddenFeeLimit: ['', [Validators.required]]\n });\n this.statusFormGroup = this.formBuilder.group({});\n this.store.select(invoices).pipe(takeUntil(this.unSubs[0])).\n subscribe((invoicesSelector: { listInvoices: ListInvoices, apiCallStatus: ApiCallStatusPayload }) => {\n this.invoices = invoicesSelector.listInvoices;\n this.logger.info(invoicesSelector);\n });\n this.actions.pipe(\n takeUntil(this.unSubs[1]),\n filter((action) => action.type === LNDActions.SET_QUERY_ROUTES_LND || action.type === LNDActions.SEND_PAYMENT_STATUS_LND || action.type === LNDActions.NEWLY_SAVED_INVOICE_LND)).\n subscribe((action: any) => {\n if (action.type === LNDActions.SET_QUERY_ROUTES_LND) {\n this.queryRoute = action.payload;\n }\n if (action.type === LNDActions.SEND_PAYMENT_STATUS_LND) {\n this.logger.info(action.payload);\n this.flgPaymentSent = true;\n this.paymentStatus = action.payload;\n this.flgEditable = true;\n }\n if (action.type === LNDActions.NEWLY_SAVED_INVOICE_LND) {\n this.logger.info(action.payload);\n this.flgInvoiceGenerated = true;\n this.sendPayment(action.payload.paymentRequest);\n }\n });\n this.inputFormGroup.get('rebalanceAmount')?.valueChanges.pipe(\n takeUntil(this.unSubs[2]), startWith(0)).\n subscribe((amount) => {\n this.inputFormGroup.controls.selRebalancePeer.setValue('');\n this.inputFormGroup.controls.selRebalancePeer.setErrors(null);\n this.filteredActiveChannels = of(amount ? this.filterActiveChannels() : this.activeChannels.slice());\n });\n this.inputFormGroup.get('selRebalancePeer')?.valueChanges.pipe(\n takeUntil(this.unSubs[3]), startWith('')).\n subscribe((alias) => {\n if (typeof alias === 'string') {\n this.filteredActiveChannels = of(this.filterActiveChannels());\n }\n });\n }\n\n onSelectFee(): boolean | void {\n if (this.inputFormGroup.controls.selRebalancePeer.value && typeof this.inputFormGroup.controls.selRebalancePeer.value === 'string') {\n this.onSelectedPeerChanged();\n }\n if (!this.inputFormGroup.controls.selRebalancePeer.value || typeof this.inputFormGroup.controls.selRebalancePeer.value === 'string') {\n this.inputFormGroup.controls.selRebalancePeer.setErrors({ required: true });\n return true;\n }\n if (!this.inputFormGroup.controls.rebalanceAmount.value) {\n return true;\n }\n if (this.stepper.selectedIndex === 0) {\n this.inputFormGroup.controls.hiddenAmount.setValue(this.inputFormGroup.controls.rebalanceAmount.value);\n this.stepper.next();\n }\n this.queryRoute = null;\n this.feeFormGroup.reset();\n this.feeFormGroup.controls.selFeeLimitType.setValue(this.feeLimitTypes[0]);\n }\n\n stepSelectionChanged(event: any) {\n switch (event.selectedIndex) {\n case 0:\n this.inputFormLabel = 'Amount to rebalance';\n this.feeFormLabel = 'Select rebalance fee';\n break;\n\n case 1:\n if (this.inputFormGroup.controls.rebalanceAmount.value || this.inputFormGroup.controls.selRebalancePeer.value.remote_alias) {\n this.inputFormLabel = 'Rebalancing Amount: ' +\n (this.decimalPipe.transform(this.inputFormGroup.controls.rebalanceAmount.value ? this.inputFormGroup.controls.rebalanceAmount.value : 0)) +\n ' Sats | Peer: ' + (this.inputFormGroup.controls.selRebalancePeer.value.remote_alias ? this.inputFormGroup.controls.selRebalancePeer.value.remote_alias :\n (this.inputFormGroup.controls.selRebalancePeer.value.remote_pubkey.substring(0, 15) + '...'));\n } else {\n this.inputFormLabel = 'Amount to rebalance';\n }\n this.feeFormLabel = 'Select rebalance fee';\n break;\n\n case 2:\n if (this.inputFormGroup.controls.rebalanceAmount.value || this.inputFormGroup.controls.selRebalancePeer.value.remote_alias) {\n this.inputFormLabel = 'Rebalancing Amount: ' +\n (this.decimalPipe.transform(this.inputFormGroup.controls.rebalanceAmount.value ? this.inputFormGroup.controls.rebalanceAmount.value : 0)) +\n ' Sats | Peer: ' + (this.inputFormGroup.controls.selRebalancePeer.value.remote_alias ? this.inputFormGroup.controls.selRebalancePeer.value.remote_alias :\n (this.inputFormGroup.controls.selRebalancePeer.value.remote_pubkey.substring(0, 15) + '...'));\n } else {\n this.inputFormLabel = 'Amount to rebalance';\n }\n if (this.queryRoute && this.queryRoute.routes && this.queryRoute.routes.length > 0 && (this.queryRoute.routes[0].total_fees_msat || (this.queryRoute.routes[0].hops && this.queryRoute.routes[0].hops.length))) {\n this.feeFormLabel = this.feeFormGroup.controls.selFeeLimitType.value.placeholder + ': ' + this.decimalPipe.transform(this.feeFormGroup.controls.feeLimit.value ? this.feeFormGroup.controls.feeLimit.value : 0) + ' | Hops: ' + this.queryRoute.routes[0].hops?.length;\n } else {\n this.feeFormLabel = 'Select rebalance fee';\n }\n break;\n\n default:\n this.inputFormLabel = 'Amount to rebalance';\n this.feeFormLabel = 'Select rebalance fee';\n break;\n }\n if (event.selectedIndex < event.previouslySelectedIndex) {\n if (event.selectedIndex === 0) {\n this.inputFormGroup.controls.hiddenAmount.setValue('');\n } else if (event.selectedIndex === 1) {\n this.feeFormGroup.controls.hiddenFeeLimit.setValue('');\n }\n }\n }\n\n onRebalance(): boolean | void {\n if (!this.inputFormGroup.controls.rebalanceAmount.value || this.inputFormGroup.controls.rebalanceAmount.value <= 0 ||\n (this.selChannel.local_balance && this.inputFormGroup.controls.rebalanceAmount.value > +this.selChannel.local_balance) ||\n !this.feeFormGroup.controls.feeLimit.value || this.feeFormGroup.controls.feeLimit.value < 0 ||\n !this.inputFormGroup.controls.selRebalancePeer.value.remote_pubkey) {\n return true;\n }\n this.feeFormGroup.controls.hiddenFeeLimit.setValue(this.feeFormGroup.controls.feeLimit.value);\n this.stepper.next();\n this.flgEditable = false;\n this.paymentRequest = '';\n this.paymentStatus = null;\n this.flgReusingInvoice = false;\n this.flgInvoiceGenerated = false;\n this.flgPaymentSent = false;\n const unsettledInvoice = this.findUnsettledInvoice();\n if (unsettledInvoice) {\n this.flgReusingInvoice = true;\n this.sendPayment(unsettledInvoice.payment_request || '');\n } else {\n this.store.dispatch(saveNewInvoice({\n payload: {\n uiMessage: UI_MESSAGES.NO_SPINNER, memo: 'Local-Rebalance-' + this.inputFormGroup.controls.rebalanceAmount.value + '-Sats', value: this.inputFormGroup.controls.rebalanceAmount.value, private: false, expiry: 3600, is_amp: false, pageSize: PAGE_SIZE, openModal: false\n }\n }));\n }\n }\n\n findUnsettledInvoice() {\n return this.invoices.invoices?.find((invoice) => (!invoice.settle_date || +invoice.settle_date === 0) && invoice.memo === 'Local-Rebalance-' + this.inputFormGroup.controls.rebalanceAmount.value + '-Sats' && invoice.state !== 'CANCELED');\n }\n\n sendPayment(payReq: string) {\n this.flgInvoiceGenerated = true;\n this.paymentRequest = payReq;\n if (this.feeFormGroup.controls.selFeeLimitType.value.id === 'percent' && !(+this.feeFormGroup.controls.feeLimit.value % 1 === 0)) {\n this.store.dispatch(sendPayment({ payload: { uiMessage: UI_MESSAGES.NO_SPINNER, paymentReq: payReq, outgoingChannel: this.selChannel,\n feeLimitType: 'fixed', feeLimit: Math.ceil((+this.feeFormGroup.controls.feeLimit.value * +this.inputFormGroup.controls.rebalanceAmount.value) / 100),\n allowSelfPayment: true, lastHopPubkey: this.inputFormGroup.controls.selRebalancePeer.value.remote_pubkey, fromDialog: true } }));\n } else {\n this.store.dispatch(sendPayment({ payload: { uiMessage: UI_MESSAGES.NO_SPINNER, paymentReq: payReq, outgoingChannel: this.selChannel,\n feeLimitType: this.feeFormGroup.controls.selFeeLimitType.value.id, feeLimit: this.feeFormGroup.controls.feeLimit.value, allowSelfPayment: true,\n lastHopPubkey: this.inputFormGroup.controls.selRebalancePeer.value.remote_pubkey, fromDialog: true } }));\n }\n }\n\n filterActiveChannels() {\n return this.activeChannels?.filter((channel) => channel.remote_balance && channel.remote_balance >= this.inputFormGroup.controls.rebalanceAmount.value &&\n channel.chan_id !== this.selChannel.chan_id && ((channel.remote_alias?.toLowerCase().indexOf(this.inputFormGroup.controls.selRebalancePeer.value ? this.inputFormGroup.controls.selRebalancePeer.value.toLowerCase() : '') === 0) ||\n (channel.chan_id?.toLowerCase().indexOf(this.inputFormGroup.controls.selRebalancePeer.value ? this.inputFormGroup.controls.selRebalancePeer.value.toLowerCase() : '') === 0)));\n }\n\n onSelectedPeerChanged() {\n if (this.inputFormGroup.controls.selRebalancePeer.value && this.inputFormGroup.controls.selRebalancePeer.value.length > 0 && typeof this.inputFormGroup.controls.selRebalancePeer.value === 'string') {\n const foundChannels = this.activeChannels?.filter((channel) => channel.remote_alias?.length === this.inputFormGroup.controls.selRebalancePeer.value.length &&\n channel.remote_alias?.toLowerCase().indexOf(this.inputFormGroup.controls.selRebalancePeer.value ? this.inputFormGroup.controls.selRebalancePeer.value.toLowerCase() : '') === 0);\n if (foundChannels && foundChannels.length > 0) {\n this.inputFormGroup.controls.selRebalancePeer.setValue(foundChannels[0]);\n this.inputFormGroup.controls.selRebalancePeer.setErrors(null);\n } else {\n this.inputFormGroup.controls.selRebalancePeer.setErrors({ notfound: true });\n }\n }\n }\n\n displayFn(channel: Channel): string {\n return (channel && channel.remote_alias) ? channel.remote_alias : (channel && channel.chan_id) ? channel.chan_id : '';\n }\n\n showInfo() {\n this.flgShowInfo = true;\n }\n\n onStepChanged(index: number) {\n this.animationDirection = index < this.stepNumber ? 'backward' : 'forward';\n this.stepNumber = index;\n }\n\n onClose() {\n this.dialogRef.close(false);\n }\n\n onRestart() {\n this.flgInvoiceGenerated = false;\n this.flgPaymentSent = false;\n this.flgEditable = true;\n this.stepper.reset();\n this.inputFormGroup.reset();\n this.feeFormGroup.reset();\n this.statusFormGroup.reset();\n this.inputFormGroup.controls.hiddenAmount.setValue('');\n this.inputFormGroup.controls.hiddenAmount.setErrors(null);\n this.inputFormGroup.controls.rebalanceAmount.setValue('');\n this.inputFormGroup.controls.rebalanceAmount.setErrors(null);\n this.inputFormGroup.controls.selRebalancePeer.setValue('');\n this.inputFormGroup.controls.selRebalancePeer.setErrors(null);\n this.filteredActiveChannels = of(this.activeChannels);\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"row\">\n <div fxFlex=\"100\">\n <mat-card-header fxLayout=\"row\" fxLayoutAlign=\"space-between center\" class=\"modal-info-header\">\n <div fxFlex=\"95\" fxLayoutAlign=\"start start\">\n <span class=\"page-title\">{{channelToClose.active ? 'Close Channel' : 'Force Close Channel'}}</span>\n </div>\n <button tabindex=\"8\" fxFlex=\"5\" fxLayoutAlign=\"center\" class=\"btn-close-x p-0\" mat-button (click)=\"onClose()\">X</button>\n </mat-card-header> \n <mat-card-content class=\"padding-gap-x-large\">\n <form fxLayout=\"column\">\n <div fxLayout=\"column\" class=\"bordered-box mb-1 p-2\">\n <p fxLayoutAlign=\"start center\" class=\"pb-1 word-break\">{{\n channelToClose.active ? \n ('Closing channel: ' + ((!channelToClose.remote_alias && !channelToClose.chan_id) ? channelToClose.channel_point : (channelToClose.remote_alias && channelToClose.chan_id) ? channelToClose.remote_alias + ' (' + channelToClose.chan_id + ')' : channelToClose.remote_alias ? channelToClose.remote_alias : channelToClose.chan_id)) : \n ('Force closing channel: ' + ((!channelToClose.remote_alias && !channelToClose.chan_id) ? channelToClose.channel_point : (channelToClose.remote_alias && channelToClose.chan_id) ? channelToClose.remote_alias + ' (' + channelToClose.chan_id + ')' : channelToClose.remote_alias ? channelToClose.remote_alias : channelToClose.chan_id))}}\n </p>\n <div *ngIf=\"flgPendingHtlcs\" fxLayoutAlign=\"start center\">\n <p fxFlex=\"100\" fxLayoutAlign=\"start center\" class=\"color-warn\"><mat-icon class=\"mr-1 icon-small\">close</mat-icon>{{errorMsg}}</p>\n </div>\n <div *ngIf=\"!flgPendingHtlcs\" fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between stretch\">\n <div *ngIf=\"!channelToClose.active\" fxFlex=\"100\" class=\"alert alert-info\">\n <fa-icon class=\"mr-1 alert-icon\" [icon]=\"faInfoCircle\"></fa-icon>\n <span>Priority/Fee for force closing inactive channels cannot be modified.</span>\n </div>\n <div fxLayout=\"row\" fxFlex=\"100\" fxLayoutAlign=\"space-between center\">\n <mat-form-field fxFlex.gt-sm=\"48\">\n <mat-select tabindex=\"1\" [disabled]=\"!channelToClose.active\" [(value)]=\"selTransType\">\n <mat-option *ngFor=\"let transType of transTypes\" [value]=\"transType.id\">\n {{transType.name}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field *ngIf=\"selTransType === '0'\" fxFlex=\"48\">\n <input matInput placeholder=\"Default\" disabled>\n </mat-form-field>\n <mat-form-field *ngIf=\"selTransType === '1'\" fxFlex.gt-sm=\"48\" fxLayoutAlign=\"start end\">\n <input #blcks=\"ngModel\" matInput placeholder=\"Number of Blocks\" type=\"number\" name=\"blocks\" required\n tabindex=\"2\" [step]=\"1\" [min]=\"0\" [(ngModel)]=\"blocks\">\n <mat-error *ngIf=\"!blocks\">Number of blocks is required.</mat-error>\n </mat-form-field>\n <mat-form-field *ngIf=\"selTransType === '2'\" fxFlex.gt-sm=\"48\" fxLayoutAlign=\"start end\">\n <input #clchfee=\"ngModel\" matInput placeholder=\"Fees (Sats/vByte)\"\n type=\"number\" name=\"ccfees\" required tabindex=\"3\" [step]=\"1\" [min]=\"0\" [(ngModel)]=\"fees\">\n <mat-error *ngIf=\"!fees\">Fees is required.</mat-error>\n </mat-form-field>\n </div>\n </div> \n </div>\n <div fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button *ngIf=\"channelToClose.active && !flgPendingHtlcs\" mat-button color=\"primary\" type=\"reset\" class=\"mr-1\" tabindex=\"3\" default (click)=\"resetData()\">Clear</button>\n <button *ngIf=\"!flgPendingHtlcs\" mat-button color=\"primary\" type=\"submit\" tabindex=\"4\" (click)=\"onCloseChannel()\">{{channelToClose.active ? 'Close Channel' : 'Force Close'}}</button>\n <button *ngIf=\"flgPendingHtlcs\" mat-button color=\"primary\" type=\"submit\" tabindex=\"5\" (click)=\"onClose()\">Ok</button>\n </div>\n </form>\n </mat-card-content>\n </div>\n</div>\n","import { Component, OnInit, Inject, OnDestroy } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { Subject } from 'rxjs';\nimport { filter, takeUntil } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { Actions } from '@ngrx/effects';\nimport { faExclamationTriangle, faInfoCircle } from '@fortawesome/free-solid-svg-icons';\n\nimport { LoggerService } from '../../../../shared/services/logger.service';\nimport { Channel } from '../../../../shared/models/lndModels';\nimport { ChannelInformation } from '../../../../shared/models/alertData';\nimport { APICallStatusEnum, LNDActions, TRANS_TYPES } from '../../../../shared/services/consts-enums-functions';\n\nimport { RTLState } from '../../../../store/rtl.state';\nimport { closeChannel } from '../../../store/lnd.actions';\n\n@Component({\n selector: 'rtl-close-channel',\n templateUrl: './close-channel.component.html',\n styleUrls: ['./close-channel.component.scss']\n})\nexport class CloseChannelComponent implements OnInit, OnDestroy {\n\n public channelToClose: Channel;\n public transTypes = TRANS_TYPES;\n public selTransType = '0';\n public blocks = null;\n public fees = null;\n public faExclamationTriangle = faExclamationTriangle;\n public faInfoCircle = faInfoCircle;\n public flgPendingHtlcs = false;\n public errorMsg = 'Please wait for pending HTLCs to settle before attempting channel closure.';\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject()];\n\n constructor(public dialogRef: MatDialogRef<CloseChannelComponent>, @Inject(MAT_DIALOG_DATA) public data: ChannelInformation, private store: Store<RTLState>, private actions: Actions, private logger: LoggerService) { }\n\n ngOnInit() {\n this.channelToClose = this.data.channel;\n this.actions.pipe(\n takeUntil(this.unSubs[0]),\n filter((action) => action.type === LNDActions.UPDATE_API_CALL_STATUS_LND || action.type === LNDActions.SET_CHANNELS_LND)).\n subscribe((action: any) => {\n if (action.type === LNDActions.SET_CHANNELS_LND) {\n const filteredChannel = action.payload.find((channel) => channel.chan_id === this.data.channel.chan_id);\n if (filteredChannel && filteredChannel.pending_htlcs && filteredChannel.pending_htlcs.length && filteredChannel.pending_htlcs.length > 0) {\n this.flgPendingHtlcs = true;\n }\n }\n if (action.type === LNDActions.UPDATE_API_CALL_STATUS_LND && action.payload.status === APICallStatusEnum.ERROR && action.payload.action === 'FetchAllChannels') {\n this.logger.error('Fetching latest channel information failed!\\n' + action.payload.message);\n }\n });\n }\n\n onCloseChannel(): boolean | void {\n if ((this.selTransType === '1' && (!this.blocks || this.blocks === 0)) || (this.selTransType === '2' && (!this.fees || this.fees === 0))) {\n return true;\n }\n const closeChannelParams: any = { channelPoint: this.channelToClose.channel_point, forcibly: !this.channelToClose.active };\n if (this.blocks) {\n closeChannelParams.targetConf = this.blocks;\n }\n if (this.fees) {\n closeChannelParams.satPerByte = this.fees;\n }\n this.store.dispatch(closeChannel({ payload: closeChannelParams }));\n this.dialogRef.close(false);\n }\n\n resetData() {\n this.selTransType = '0';\n this.blocks = null;\n this.fees = null;\n }\n\n onClose() {\n this.dialogRef.close(false);\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"column\" class=\"padding-gap-x\">\n <div fxLayout=\"column\" fxLayout.gt-xs=\"row\" fxLayoutAlign.gt-xs=\"start center\" fxLayoutAlign=\"start stretch\" class=\"page-sub-title-container\">\n <div fxFlex=\"70\"></div>\n <div fxFlex.gt-xs=\"30\" fxLayoutAlign.gt-xs=\"space-between center\" fxLayout=\"row\" fxLayoutAlign=\"space-between stretch\">\n <mat-form-field fxFlex=\"49\">\n <mat-select placeholder=\"Filter By\" tabindex=\"1\" name=\"filterBy\" [(ngModel)]=\"selFilterBy\" (selectionChange)=\"selFilter=''; applyFilter()\">\n <mat-option *ngFor=\"let column of ['all'].concat(displayedColumns.slice(0, -1))\" [value]=\"column\">{{getLabel(column)}}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field fxFlex=\"49\">\n <input matInput name=\"filter\" placeholder=\"Filter\" [(ngModel)]=\"selFilter\" (input)=\"applyFilter()\" (keyup)=\"applyFilter()\">\n </mat-form-field>\n </div>\n </div>\n <div fxLayout=\"column\" fxFlex=\"100\" class=\"table-container\" [perfectScrollbar]>\n <mat-progress-bar *ngIf=\"apiCallStatus?.status === apiCallStatusEnum.INITIATED\" mode=\"indeterminate\"></mat-progress-bar>\n <table #table mat-table fxFlex=\"100\" matSort [dataSource]=\"channels\" [ngClass]=\"{'error-border': errorMessage !== ''}\">\n <ng-container matColumnDef=\"active\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\" matTooltip=\"Active\"></th>\n <td *matCellDef=\"let channel\" mat-cell>\n <span *ngIf=\"channel.active\" class=\"dot green\" matTooltip=\"Active\" matTooltipPosition=\"right\"></span>\n <span *ngIf=\"!channel.active\" class=\"dot yellow\" matTooltip=\"Inactive\" matTooltipPosition=\"right\"></span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"private\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\" matTooltip=\"Private\"></th>\n <td *matCellDef=\"let channel\" mat-cell>\n <span *ngIf=\"channel.private\" class=\"mr-1\" matTooltip=\"Private\" matTooltipPosition=\"right\"><fa-icon [icon]=\"faEyeSlash\"></fa-icon></span>\n <span *ngIf=\"!channel.private\" class=\"mr-1\" matTooltip=\"Public\" matTooltipPosition=\"right\"><fa-icon [icon]=\"faEye\"></fa-icon></span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"remote_alias\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Peer</th>\n <td *matCellDef=\"let channel\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{channel.remote_alias}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"remote_pubkey\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Pubkey</th>\n <td *matCellDef=\"let channel\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{channel.remote_pubkey}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"channel_point\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Channel Point</th>\n <td *matCellDef=\"let channel\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{channel.channel_point}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"chan_id\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Channel ID</th>\n <td *matCellDef=\"let channel\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{channel.chan_id}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"initiator\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Initiator</th>\n <td *matCellDef=\"let channel\" mat-cell>{{channel.initiator ? 'Yes' : 'No'}}</td>\n </ng-container>\n <ng-container matColumnDef=\"static_remote_key\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Static Remote Key</th>\n <td *matCellDef=\"let channel\" mat-cell>{{channel.static_remote_key ? 'Yes' : 'No'}}</td>\n </ng-container>\n <ng-container matColumnDef=\"uptime_str\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Uptime ({{timeUnit}})</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.uptime_str}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"lifetime_str\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Lifetime ({{timeUnit}})</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.lifetime_str}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"commit_fee\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Commit Fee (Sats)</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.commit_fee | number}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"commit_weight\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Commit Weight</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.commit_weight | number}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"fee_per_kw\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Fee/KW</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.fee_per_kw | number}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"num_updates\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Updates</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.num_updates | number}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"unsettled_balance\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Unsettled Balance (Sats)</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.unsettled_balance | number}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"capacity\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Capacity (Sats)</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.capacity | number}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"local_chan_reserve_sat\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Local Reserve (Sats)</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.local_chan_reserve_sat | number}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"remote_chan_reserve_sat\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Remote Reserve (Sats)</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.remote_chan_reserve_sat | number}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"total_satoshis_sent\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Sats Sent</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.total_satoshis_sent | number}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"total_satoshis_received\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Sats Received</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.total_satoshis_received | number}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"local_balance\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Local Balance (Sats)</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.local_balance | number}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"remote_balance\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Remote Balance (Sats)</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.remote_balance | number}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"balancedness\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Balance Score</th>\n <td *matCellDef=\"let channel\" mat-cell>\n <div fxLayout=\"row\">\n <mat-hint fxFlex=\"100\" fxLayoutAlign=\"center center\" class=\"font-size-80\">{{channel.balancedness || 0 | number}}</mat-hint>\n </div>\n <mat-progress-bar mode=\"determinate\" value=\"{{channel.local_balance && channel.local_balance > 0 ? ((+channel.local_balance/((+channel.local_balance)+(+channel.remote_balance)))*100) : 0}}\"></mat-progress-bar>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"actions\">\n <th *matHeaderCellDef mat-header-cell>\n <div class=\"bordered-box table-actions-select\" fxLayoutAlign=\"center center\">\n <mat-select placeholder=\"Actions\" tabindex=\"1\" class=\"mr-0\">\n <mat-select-trigger></mat-select-trigger>\n <mat-option (click)=\"onChannelUpdate('all')\">Update Fee Policy</mat-option>\n <mat-option (click)=\"onDownloadCSV()\">Download CSV</mat-option>\n </mat-select>\n </div>\n </th> \n <td *matCellDef=\"let channel\" mat-cell fxLayoutAlign=\"end center\">\n <div class=\"bordered-box table-actions-select\" fxLayoutAlign=\"center center\">\n <mat-select placeholder=\"Actions\" tabindex=\"2\" class=\"mr-0\">\n <mat-select-trigger></mat-select-trigger>\n <mat-option (click)=\"onChannelClick(channel, $event)\">View Info</mat-option>\n <mat-option (click)=\"onViewRemotePolicy(channel)\">View Remote Fee </mat-option>\n <mat-option (click)=\"onChannelUpdate(channel)\">Update Fee Policy</mat-option>\n <mat-option *ngIf=\"+versionsArr[0] > 0 || +versionsArr[1] >= 9\" (click)=\"onCircularRebalance(channel)\">Circular Rebalance</mat-option>\n <mat-option *ngIf=\"selNode.swapServerUrl\" (click)=\"onLoopOut(channel)\">Loop Out</mat-option>\n <mat-option (click)=\"onChannelClose(channel)\">Close Channel</mat-option>\n </mat-select>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"no_channel\">\n <td *matFooterCellDef mat-footer-cellcolspan=\"4\">\n <p *ngIf=\"numPeers<1 && (!channels?.data || channels?.data?.length<1) && apiCallStatus?.status === apiCallStatusEnum.COMPLETED\">No peers connected. Add a peer in order to open a channel.</p>\n <p *ngIf=\"numPeers>0 && (!channels?.data || channels?.data?.length<1) && apiCallStatus?.status === apiCallStatusEnum.COMPLETED\">No channel available.</p>\n <p *ngIf=\"(!channels?.data || channels?.data?.length<1) && apiCallStatus?.status === apiCallStatusEnum.INITIATED\">Getting channels...</p>\n <p *ngIf=\"(!channels?.data || channels?.data?.length<1) && apiCallStatus?.status === apiCallStatusEnum.ERROR\">{{errorMessage}}</p>\n </td>\n </ng-container>\n <tr *matFooterRowDef=\"['no_channel']\" mat-footer-row [ngClass]=\"{'display-none': channels?.data && channels?.data?.length>0}\"></tr>\n <tr *matHeaderRowDef=\"displayedColumns\" mat-header-row></tr>\n <tr *matRowDef=\"let row; columns: displayedColumns;\" mat-row></tr>\n </table>\n </div>\n <mat-paginator class=\"mb-1\" [pageSize]=\"pageSize\" [pageSizeOptions]=\"pageSizeOptions\" [showFirstLastButtons]=\"screenSize === screenSizeEnum.XS ? false : true\"></mat-paginator>\n</div>\n","import { Component, OnInit, OnDestroy, ViewChild, AfterViewInit } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { DecimalPipe } from '@angular/common';\nimport { Subject } from 'rxjs';\nimport { take, takeUntil } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { MatPaginator, MatPaginatorIntl } from '@angular/material/paginator';\nimport { MatSort } from '@angular/material/sort';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { faEye, faEyeSlash } from '@fortawesome/free-solid-svg-icons';\n\nimport { ChannelInformationComponent } from '../../channel-information-modal/channel-information.component';\nimport { SelNodeChild } from '../../../../../shared/models/RTLconfig';\nimport { BlockchainBalance, Channel, ChannelsSummary, GetInfo, LightningBalance, Peer } from '../../../../../shared/models/lndModels';\nimport { PAGE_SIZE, PAGE_SIZE_OPTIONS, getPaginatorLabel, AlertTypeEnum, DataTypeEnum, ScreenSizeEnum, UserPersonaEnum, LoopTypeEnum, APICallStatusEnum, UI_MESSAGES, SortOrderEnum, LND_DEFAULT_PAGE_SETTINGS, LND_PAGE_DEFS } from '../../../../../shared/services/consts-enums-functions';\nimport { ApiCallStatusPayload } from '../../../../../shared/models/apiCallsPayload';\nimport { LoggerService } from '../../../../../shared/services/logger.service';\nimport { LoopService } from '../../../../../shared/services/loop.service';\nimport { CommonService } from '../../../../../shared/services/common.service';\nimport { ChannelRebalanceComponent } from '../../channel-rebalance-modal/channel-rebalance.component';\nimport { CloseChannelComponent } from '../../close-channel-modal/close-channel.component';\nimport { LoopModalComponent } from '../../../../../shared/components/ln-services/loop/loop-modal/loop-modal.component';\n\nimport { LNDEffects } from '../../../../store/lnd.effects';\nimport { RTLEffects } from '../../../../../store/rtl.effects';\nimport { RTLState } from '../../../../../store/rtl.state';\nimport { openAlert, openConfirmation } from '../../../../../store/rtl.actions';\nimport { channelLookup, fetchChannels, updateChannel } from '../../../../store/lnd.actions';\nimport { blockchainBalance, channels, lndNodeInformation, lndNodeSettings, lndPageSettings, peers } from '../../../../store/lnd.selector';\nimport { ColumnDefinition, PageSettings, TableSetting } from '../../../../../shared/models/pageSettings';\nimport { CamelCaseWithReplacePipe } from '../../../../../shared/pipes/app.pipe';\n\n@Component({\n selector: 'rtl-channel-open-table',\n templateUrl: './channel-open-table.component.html',\n styleUrls: ['./channel-open-table.component.scss'],\n providers: [\n { provide: MatPaginatorIntl, useValue: getPaginatorLabel('Channels') }\n ]\n})\nexport class ChannelOpenTableComponent implements OnInit, AfterViewInit, OnDestroy {\n\n @ViewChild(MatSort, { static: false }) sort: MatSort | undefined;\n @ViewChild(MatPaginator, { static: false }) paginator: MatPaginator | undefined;\n public nodePageDefs = LND_PAGE_DEFS;\n public selFilterBy = 'all';\n public colWidth = '20rem';\n public PAGE_ID = 'peers_channels';\n public tableSetting: TableSetting = { tableId: 'open', recordsPerPage: PAGE_SIZE, sortBy: 'balancedness', sortOrder: SortOrderEnum.DESCENDING };\n public timeUnit = 'mins:secs';\n public userPersonaEnum = UserPersonaEnum;\n public selNode: SelNodeChild | null = {};\n public totalBalance = 0;\n public displayedColumns: any[] = [];\n public channelsData: Channel[] = [];\n public channels: any = new MatTableDataSource([]);\n public myChanPolicy: any = {};\n public information: GetInfo = {};\n public numPeers = -1;\n public selFilter = '';\n public pageSize = PAGE_SIZE;\n public pageSizeOptions = PAGE_SIZE_OPTIONS;\n public screenSize = '';\n public screenSizeEnum = ScreenSizeEnum;\n public versionsArr: string[] = [];\n public faEye = faEye;\n public faEyeSlash = faEyeSlash;\n private targetConf = 6;\n public errorMessage = '';\n public apiCallStatus: ApiCallStatusPayload | null = null;\n public apiCallStatusEnum = APICallStatusEnum;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject(), new Subject(), new Subject(), new Subject(), new Subject(), new Subject()];\n\n constructor(\n private logger: LoggerService,\n private store: Store<RTLState>,\n private lndEffects: LNDEffects,\n private commonService: CommonService,\n private rtlEffects: RTLEffects,\n private decimalPipe: DecimalPipe,\n private loopService: LoopService,\n private router: Router,\n private camelCaseWithReplace: CamelCaseWithReplacePipe) {\n this.screenSize = this.commonService.getScreenSize();\n this.selFilter = this.router.getCurrentNavigation()?.extras?.state?.filter ? this.router.getCurrentNavigation()?.extras?.state?.filter : '';\n }\n\n ngOnInit() {\n this.store.select(lndNodeSettings).pipe(takeUntil(this.unSubs[0])).\n subscribe((nodeSettings) => {\n this.selNode = nodeSettings;\n });\n this.store.select(lndNodeInformation).pipe(takeUntil(this.unSubs[1])).\n subscribe((nodeInfo: GetInfo) => {\n this.information = nodeInfo;\n if (this.information && this.information.version) {\n this.versionsArr = this.information.version.split('.');\n }\n });\n this.store.select(lndPageSettings).pipe(takeUntil(this.unSubs[2])).\n subscribe((settings: { pageSettings: PageSettings[], apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessage = '';\n this.apiCallStatus = settings.apiCallStatus;\n if (this.apiCallStatus.status === APICallStatusEnum.ERROR) {\n this.errorMessage = this.apiCallStatus.message || '';\n }\n this.tableSetting = settings.pageSettings.find((page) => page.pageId === this.PAGE_ID)?.tables.find((table) => table.tableId === this.tableSetting.tableId) || LND_DEFAULT_PAGE_SETTINGS.find((page) => page.pageId === this.PAGE_ID)?.tables.find((table) => table.tableId === this.tableSetting.tableId)!;\n if (this.screenSize === ScreenSizeEnum.XS || this.screenSize === ScreenSizeEnum.SM) {\n this.displayedColumns = JSON.parse(JSON.stringify(this.tableSetting.columnSelectionSM));\n } else {\n this.displayedColumns = JSON.parse(JSON.stringify(this.tableSetting.columnSelection));\n }\n this.displayedColumns.unshift('private');\n this.displayedColumns.unshift('active');\n this.displayedColumns.push('actions');\n this.pageSize = this.tableSetting.recordsPerPage ? +this.tableSetting.recordsPerPage : PAGE_SIZE;\n this.colWidth = this.displayedColumns.length ? ((this.commonService.getContainerSize().width / this.displayedColumns.length) / 10) + 'rem' : '20rem';\n this.logger.info(this.displayedColumns);\n });\n this.store.select(peers).pipe(takeUntil(this.unSubs[3])).\n subscribe((peersSelector: { peers: Peer[], apiCallStatus: ApiCallStatusPayload }) => {\n this.numPeers = (peersSelector.peers && peersSelector.peers.length) ? peersSelector.peers.length : 0;\n });\n this.store.select(blockchainBalance).pipe(takeUntil(this.unSubs[4])).\n subscribe((bcBalanceSelector: { blockchainBalance: BlockchainBalance, apiCallStatus: ApiCallStatusPayload }) => {\n this.totalBalance = bcBalanceSelector.blockchainBalance?.total_balance ? +bcBalanceSelector.blockchainBalance?.total_balance : 0;\n });\n this.store.select(channels).pipe(takeUntil(this.unSubs[5])).\n subscribe((channelsSelector: { channels: Channel[], channelsSummary: ChannelsSummary, lightningBalance: LightningBalance, apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessage = '';\n this.apiCallStatus = channelsSelector.apiCallStatus;\n if (this.apiCallStatus.status === APICallStatusEnum.ERROR) {\n this.errorMessage = !this.apiCallStatus.message ? '' : (typeof (this.apiCallStatus.message) === 'object') ? JSON.stringify(this.apiCallStatus.message) : this.apiCallStatus.message;\n }\n this.channelsData = this.calculateUptime(channelsSelector.channels);\n if (this.channelsData.length > 0) {\n this.loadChannelsTable(this.channelsData);\n }\n this.logger.info(channelsSelector);\n });\n }\n\n ngAfterViewInit() {\n if (this.channelsData.length > 0) {\n this.loadChannelsTable(this.channelsData);\n }\n }\n\n onViewRemotePolicy(selChannel: Channel) {\n this.store.dispatch(channelLookup({ payload: { uiMessage: UI_MESSAGES.GET_REMOTE_POLICY, channelID: selChannel.chan_id?.toString() + '/' + this.information.identity_pubkey } }));\n this.lndEffects.setLookup.pipe(take(1)).subscribe((resLookup): boolean | void => {\n if (!resLookup.fee_base_msat && !resLookup.fee_rate_milli_msat && !resLookup.time_lock_delta) {\n return false;\n }\n const reorderedChannelPolicy = [\n [{ key: 'fee_base_msat', value: resLookup.fee_base_msat, title: 'Base Fees (mSats)', width: 25, type: DataTypeEnum.NUMBER },\n { key: 'fee_rate_milli_msat', value: resLookup.fee_rate_milli_msat, title: 'Fee Rate (milli mSats)', width: 25, type: DataTypeEnum.NUMBER },\n { key: 'fee_rate_milli_msat', value: resLookup.fee_rate_milli_msat / 10000, title: 'Fee Rate (%)', width: 25, type: DataTypeEnum.NUMBER, digitsInfo: '1.0-8' },\n { key: 'time_lock_delta', value: resLookup.time_lock_delta, title: 'Time Lock Delta', width: 25, type: DataTypeEnum.NUMBER }]\n ];\n const titleMsg = 'Remote policy for Channel: ' + ((!selChannel.remote_alias && !selChannel.chan_id) ? selChannel.channel_point : (selChannel.remote_alias && selChannel.chan_id) ? selChannel.remote_alias + ' (' + selChannel.chan_id + ')' : selChannel.remote_alias ? selChannel.remote_alias : selChannel.chan_id);\n setTimeout(() => {\n this.store.dispatch(openAlert({\n payload: {\n data: {\n type: AlertTypeEnum.INFORMATION,\n alertTitle: 'Remote Channel Policy',\n titleMessage: titleMsg,\n message: reorderedChannelPolicy\n }\n }\n }));\n }, 0);\n });\n }\n\n onCircularRebalance(selChannel: any) {\n const channelsToRebalanceMessage = {\n channels: this.channelsData,\n selChannel: selChannel\n };\n this.store.dispatch(openAlert({\n payload: {\n data: {\n message: channelsToRebalanceMessage,\n component: ChannelRebalanceComponent\n }\n }\n }));\n }\n\n onChannelUpdate(channelToUpdate: any) {\n if (channelToUpdate === 'all') {\n const confirmationMsg = [];\n this.store.dispatch(openConfirmation({\n payload: {\n data: {\n type: AlertTypeEnum.CONFIRM,\n alertTitle: 'Update Fee Policy',\n noBtnText: 'Cancel',\n yesBtnText: 'Update All Channels',\n message: confirmationMsg,\n titleMessage: 'Update fee policy for all channels',\n flgShowInput: true,\n getInputs: [\n { placeholder: 'Base Fee (mSat)', inputType: DataTypeEnum.NUMBER, inputValue: 1000, step: 100, width: 32 },\n { placeholder: 'Fee Rate (mili mSat)', inputType: DataTypeEnum.NUMBER, inputValue: 1, min: 1, width: 32, hintFunction: this.percentHintFunction },\n { placeholder: 'Time Lock Delta', inputType: DataTypeEnum.NUMBER, inputValue: 40, width: 32 }\n ]\n }\n }\n }));\n this.rtlEffects.closeConfirm.\n pipe(takeUntil(this.unSubs[6])).\n subscribe((confirmRes) => {\n if (confirmRes) {\n const base_fee = confirmRes[0].inputValue;\n const fee_rate = confirmRes[1].inputValue;\n const time_lock_delta = confirmRes[2].inputValue;\n this.store.dispatch(updateChannel({ payload: { baseFeeMsat: base_fee, feeRate: fee_rate, timeLockDelta: time_lock_delta, chanPoint: 'all' } }));\n }\n });\n } else {\n this.myChanPolicy = { fee_base_msat: 0, fee_rate_milli_msat: 0, time_lock_delta: 0, min_htlc_msat: 0, max_htlc_msat: 0 };\n this.store.dispatch(channelLookup({ payload: { uiMessage: UI_MESSAGES.GET_CHAN_POLICY, channelID: channelToUpdate.chan_id.toString() } }));\n this.lndEffects.setLookup.pipe(take(1)).subscribe((resLookup) => {\n if (resLookup.node1_pub === this.information.identity_pubkey) {\n this.myChanPolicy = resLookup.node1_policy;\n } else if (resLookup.node2_pub === this.information.identity_pubkey) {\n this.myChanPolicy = resLookup.node2_policy;\n } else {\n this.myChanPolicy = { fee_base_msat: 0, fee_rate_milli_msat: 0, time_lock_delta: 0 };\n }\n this.logger.info(this.myChanPolicy);\n const titleMsg = 'Update fee policy for Channel: ' + ((!channelToUpdate.remote_alias && !channelToUpdate.chan_id) ?\n channelToUpdate.channel_point : (channelToUpdate.remote_alias && channelToUpdate.chan_id) ? channelToUpdate.remote_alias +\n ' (' + channelToUpdate.chan_id + ')' : channelToUpdate.remote_alias ? channelToUpdate.remote_alias : channelToUpdate.chan_id);\n const confirmationMsg = [];\n setTimeout(() => {\n this.store.dispatch(openConfirmation({\n payload: {\n data: {\n type: AlertTypeEnum.CONFIRM,\n alertTitle: 'Update Fee Policy',\n titleMessage: titleMsg,\n noBtnText: 'Cancel',\n yesBtnText: 'Update Channel',\n message: confirmationMsg,\n flgShowInput: true,\n hasAdvanced: true,\n getInputs: [\n { placeholder: 'Base Fee (mSat)', inputType: DataTypeEnum.NUMBER, inputValue: (this.myChanPolicy.fee_base_msat === '') ? 0 : this.myChanPolicy.fee_base_msat, step: 100, width: 32 },\n { placeholder: 'Fee Rate (mili mSat)', inputType: DataTypeEnum.NUMBER, inputValue: this.myChanPolicy.fee_rate_milli_msat, min: 1, width: 32, hintFunction: this.percentHintFunction },\n { placeholder: 'Time Lock Delta', inputType: DataTypeEnum.NUMBER, inputValue: this.myChanPolicy.time_lock_delta, width: 32 },\n { placeholder: 'Minimum HTLC (mSat)', inputType: DataTypeEnum.NUMBER, inputValue: (this.myChanPolicy.min_htlc === '') ? 0 : this.myChanPolicy.min_htlc, width: 49, advancedField: true },\n { placeholder: 'Maximum HTLC (mSat)', inputType: DataTypeEnum.NUMBER, inputValue: (this.myChanPolicy.max_htlc_msat === '') ? 0 : this.myChanPolicy.max_htlc_msat, width: 49, advancedField: true }\n ]\n }\n }\n }));\n }, 0);\n });\n this.rtlEffects.closeConfirm.\n pipe(takeUntil(this.unSubs[7])).\n subscribe((confirmRes: boolean | any[]) => {\n if (confirmRes) {\n const updateChanPayload = {\n baseFeeMsat: confirmRes[0].inputValue,\n feeRate: confirmRes[1].inputValue,\n timeLockDelta: confirmRes[2].inputValue,\n chanPoint: channelToUpdate.channel_point\n };\n if ((<any[]>confirmRes).length > 3 && confirmRes[3] && confirmRes[4]) {\n updateChanPayload['minHtlcMsat'] = confirmRes[3].inputValue;\n updateChanPayload['maxHtlcMsat'] = confirmRes[4].inputValue;\n }\n this.store.dispatch(updateChannel({ payload: updateChanPayload }));\n }\n });\n }\n this.applyFilter();\n }\n\n onChannelClose(channelToClose: Channel) {\n if (channelToClose.active) {\n this.store.dispatch(fetchChannels()); // To get latest pending htlc status\n }\n this.store.dispatch(openAlert({\n payload: {\n data: {\n channel: channelToClose,\n component: CloseChannelComponent\n }\n }\n }));\n }\n\n onChannelClick(selChannel: Channel, event: any) {\n this.store.dispatch(openAlert({\n payload: {\n data: {\n channel: selChannel,\n showCopy: true,\n component: ChannelInformationComponent\n }\n }\n }));\n }\n\n applyFilter() {\n this.channels.filter = this.selFilter.trim().toLowerCase();\n }\n\n getLabel(column: string) {\n const returnColumn: ColumnDefinition = this.nodePageDefs[this.PAGE_ID][this.tableSetting.tableId].allowedColumns.find((col) => col.column === column);\n return returnColumn ? returnColumn.label ? returnColumn.label : this.camelCaseWithReplace.transform(returnColumn.column, '_') : this.commonService.titleCase(column);\n }\n\n setFilterPredicate() {\n this.channels.filterPredicate = (rowData: Channel, fltr: string) => {\n let rowToFilter = '';\n switch (this.selFilterBy) {\n case 'all':\n rowToFilter = ((rowData.active) ? 'active' : 'inactive') + (rowData.chan_id ? rowData.chan_id.toLowerCase() : '') +\n (rowData.remote_pubkey ? rowData.remote_pubkey.toLowerCase() : '') + (rowData.remote_alias ? rowData.remote_alias.toLowerCase() : '') +\n (rowData.capacity ? rowData.capacity : '') + (rowData.local_balance ? rowData.local_balance : '') +\n (rowData.remote_balance ? rowData.remote_balance : '') + (rowData.total_satoshis_sent ? rowData.total_satoshis_sent : '') +\n (rowData.total_satoshis_received ? rowData.total_satoshis_received : '') + (rowData.commit_fee ? rowData.commit_fee : '') +\n (rowData.private ? 'private' : 'public');\n break;\n\n case 'active':\n rowToFilter = rowData?.active ? 'active' : 'inactive';\n break;\n\n case 'private':\n rowToFilter = rowData?.private ? 'private' : 'public';\n break;\n\n default:\n rowToFilter = typeof rowData[this.selFilterBy] === 'undefined' ? '' : typeof rowData[this.selFilterBy] === 'string' ? rowData[this.selFilterBy].toLowerCase() : typeof rowData[this.selFilterBy] === 'boolean' ? (rowData[this.selFilterBy] ? 'yes' : 'no') : rowData[this.selFilterBy].toString();\n break;\n }\n return this.selFilterBy === 'active' ? rowToFilter.indexOf(fltr) === 0 : rowToFilter.includes(fltr);\n };\n }\n\n loadChannelsTable(mychannels: Channel[]) {\n this.channels = new MatTableDataSource<Channel>([...mychannels]);\n this.channels.sort = this.sort;\n this.channels.sortingDataAccessor = (data: any, sortHeaderId: string) => ((data[sortHeaderId] && isNaN(data[sortHeaderId])) ? data[sortHeaderId].toLocaleLowerCase() : data[sortHeaderId] ? +data[sortHeaderId] : null);\n this.channels.sort?.sort({ id: this.tableSetting.sortBy, start: this.tableSetting.sortOrder, disableClear: true });\n this.channels.paginator = this.paginator;\n this.setFilterPredicate();\n this.applyFilter();\n this.logger.info(this.channels);\n }\n\n calculateUptime(channels: Channel[]) {\n const minutesDivider = 60;\n const hoursDivider = minutesDivider * 60;\n const daysDivider = hoursDivider * 24;\n const yearsDivider = daysDivider * 365;\n let maxDivider = minutesDivider;\n let minDivider = 1;\n let max_uptime = 0;\n channels.forEach((channel) => {\n if (channel.uptime && +channel.uptime > max_uptime) {\n max_uptime = +channel.uptime;\n }\n });\n switch (true) {\n case max_uptime < hoursDivider:\n this.timeUnit = 'Mins:Secs';\n maxDivider = minutesDivider;\n minDivider = 1;\n break;\n\n case max_uptime >= hoursDivider && max_uptime < daysDivider:\n this.timeUnit = 'Hrs:Mins';\n maxDivider = hoursDivider;\n minDivider = minutesDivider;\n break;\n\n case max_uptime >= daysDivider && max_uptime < yearsDivider:\n this.timeUnit = 'Days:Hrs';\n maxDivider = daysDivider;\n minDivider = hoursDivider;\n break;\n\n case max_uptime > yearsDivider:\n this.timeUnit = 'Yrs:Days';\n maxDivider = yearsDivider;\n minDivider = daysDivider;\n break;\n\n default:\n this.timeUnit = 'Mins:Secs';\n maxDivider = minutesDivider;\n minDivider = 1;\n break;\n }\n channels.forEach((channel) => {\n channel.uptime_str = channel.uptime ? (this.decimalPipe.transform(Math.floor(+channel.uptime / maxDivider), '2.0-0') + ':' + this.decimalPipe.transform(Math.round((+channel.uptime % maxDivider) / minDivider), '2.0-0')) : '---';\n channel.lifetime_str = channel.lifetime ? (this.decimalPipe.transform(Math.floor(+channel.lifetime / maxDivider), '2.0-0') + ':' + this.decimalPipe.transform(Math.round((+channel.lifetime % maxDivider) / minDivider), '2.0-0')) : '---';\n });\n return channels;\n }\n\n onLoopOut(selChannel: Channel) {\n this.loopService.getLoopOutTermsAndQuotes(this.targetConf).\n pipe(takeUntil(this.unSubs[8])).\n subscribe((response) => {\n this.store.dispatch(openAlert({\n payload: {\n minHeight: '56rem', data: {\n channel: selChannel,\n minQuote: response[0],\n maxQuote: response[1],\n direction: LoopTypeEnum.LOOP_OUT,\n component: LoopModalComponent\n }\n }\n }));\n });\n }\n\n onDownloadCSV() {\n if (this.channels.data && this.channels.data.length > 0) {\n this.commonService.downloadFile(this.channels.data, 'Open-channels');\n }\n }\n\n percentHintFunction(fee_rate_milli_msat) {\n return (fee_rate_milli_msat / 10000).toString() + '%';\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"row\">\n <div fxFlex=\"100\">\n <mat-card-header fxLayout=\"row\" fxLayoutAlign=\"space-between center\" class=\"modal-info-header\">\n <div fxFlex=\"95\" fxLayoutAlign=\"start start\">\n <span class=\"page-title\">Bump Fee</span>\n </div>\n <button tabindex=\"8\" fxFlex=\"5\" fxLayoutAlign=\"center\" class=\"btn-close-x p-0\" mat-button (click)=\"onClose()\">X</button>\n </mat-card-header> \n <mat-card-content class=\"padding-gap-x-large\">\n <form fxLayout=\"column\">\n <div fxLayout=\"column\" class=\"bordered-box mb-1 p-2\">\n <p fxLayoutAlign=\"start center\" class=\"pb-1 word-break\">Bump fee for channel point: {{bumpFeeChannel?.channel?.channel_point}}\n <fa-icon class=\"ml-1\" matSuffix rtlClipboard matTooltip=\"Copy transaction ID\" [icon]=\"faCopy\" [payload]=\"bumpFeeChannel?.channel?.txid_str\" (copied)=\"onCopyID($event)\"></fa-icon>\n </p>\n <div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between stretch\">\n <div fxFlex=\"100\" class=\"alert alert-info\">\n <fa-icon class=\"mr-1 alert-icon\" [icon]=\"faInfoCircle\"></fa-icon>\n <span fxLayout=\"column\" fxFlex=\"100\">Bumping fee on pending open channels is an advanced feature, attempt it only if you are familiar with the functionality of Bitcoin transactions.\n <div>Before attempting fee bump ensure the following:</div>\n <div class=\"pl-1\">1: Use a Bitcoin block explorer to ensure that channel opening transaction is not confirmed.</div>\n <div class=\"pl-1\">2: The channel opening transaction must have a sizable change output, which can be spent further. The fee cannot be bumped without the change output.</div>\n <div class=\"pl-1\">3: Find the index value of the change output via a block explorer.</div>\n <div class=\"pl-1\">4: Enter the index value of the change output in the form below and the desired fee rate.</div>\n <div class=\"pl-1\">5: Upon successful fee bump, use your block explorer to track the child transaction in the mempool, which should be linked with the change output transaction.</div>\n </span>\n </div>\n <div fxLayout=\"row\" fxFlex=\"100\" fxLayoutAlign=\"space-between center\">\n <mat-form-field fxFlex.gt-sm=\"32\" fxLayoutAlign=\"start end\">\n <input #outputIdx=\"ngModel\" matInput placeholder=\"Index for Change Output\" type=\"number\" tabindex=\"1\" required name=\"outputIdx\" [step]=\"1\" [min]=\"0\" [(ngModel)]=\"outputIndex\">\n <mat-error *ngIf=\"outputIdx.errors?.required\">Index for change output is required.</mat-error>\n <mat-error *ngIf=\"outputIdx.errors?.pendingChannelOutputIndex\">Invalid index value.</mat-error>\n </mat-form-field>\n <mat-form-field fxFlex.gt-sm=\"32\">\n <mat-select tabindex=\"2\" [(value)]=\"selTransType\" (selectionChange)=\"blocks = null;fees = null;\">\n <mat-option *ngFor=\"let transType of transTypes\" [value]=\"transType.id\">\n {{transType.name}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field *ngIf=\"selTransType === '1'\" fxFlex.gt-sm=\"32\" fxLayoutAlign=\"start end\">\n <input #blcks=\"ngModel\" matInput placeholder=\"Number of Blocks\" type=\"number\" name=\"blocks\" required\n tabindex=\"3\" [step]=\"1\" [min]=\"0\" [(ngModel)]=\"blocks\">\n <mat-error *ngIf=\"!blocks\">Number of blocks is required.</mat-error>\n </mat-form-field>\n <mat-form-field *ngIf=\"selTransType === '2'\" fxFlex.gt-sm=\"32\" fxLayoutAlign=\"start end\">\n <input #fee=\"ngModel\" matInput placeholder=\"Fees (Sats/vByte)\"\n type=\"number\" name=\"fees\" required tabindex=\"4\" [step]=\"1\" [min]=\"0\" [(ngModel)]=\"fees\">\n <mat-error *ngIf=\"!fees\">Fees is required.</mat-error>\n </mat-form-field>\n </div>\n <div *ngIf=\"bumpFeeError !== ''\" fxFlex=\"100\" class=\"alert alert-danger mt-1\">\n <fa-icon class=\"mr-1 alert-icon\" [icon]=\"faExclamationTriangle\"></fa-icon>\n <span>{{bumpFeeError}}</span>\n </div>\n </div>\n </div>\n <div fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button mat-button color=\"primary\" type=\"reset\" class=\"mr-1\" tabindex=\"5\" default (click)=\"resetData()\">Clear</button>\n <button mat-button color=\"primary\" type=\"submit\" tabindex=\"6\" (click)=\"onBumpFee()\">{{bumpFeeError !== '' ? 'Retry Bump Fee' : 'Bump Fee'}}</button>\n </div>\n </form>\n </mat-card-content>\n </div>\n</div>\n","import { Component, OnInit, OnDestroy, ViewChild, Inject } from '@angular/core';\nimport { NgModel } from '@angular/forms';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { faCopy, faInfoCircle, faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';\n\nimport { PendingOpenChannel } from '../../../../shared/models/lndModels';\nimport { PendingOpenChannelInformation } from '../../../../shared/models/alertData';\nimport { TRANS_TYPES } from '../../../../shared/services/consts-enums-functions';\nimport { DataService } from '../../../../shared/services/data.service';\nimport { LoggerService } from '../../../../shared/services/logger.service';\n\n@Component({\n selector: 'rtl-bump-fee',\n templateUrl: './bump-fee.component.html',\n styleUrls: ['./bump-fee.component.scss']\n})\nexport class BumpFeeComponent implements OnInit, OnDestroy {\n\n private outputIdx: NgModel;\n @ViewChild('outputIdx') set payReq(outIdx: NgModel) {\n if (outIdx) {\n this.outputIdx = outIdx;\n }\n }\n public bumpFeeChannel: PendingOpenChannel;\n public transTypes = [...TRANS_TYPES];\n public selTransType = '2';\n public blocks: number | null = null;\n public fees: number | null = null;\n public outputIndex: number | null = null;\n public faCopy = faCopy;\n public faInfoCircle = faInfoCircle;\n public faExclamationTriangle = faExclamationTriangle;\n public bumpFeeError = '';\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject()];\n\n constructor(public dialogRef: MatDialogRef<BumpFeeComponent>, @Inject(MAT_DIALOG_DATA) public data: PendingOpenChannelInformation, private logger: LoggerService, private dataService: DataService, private snackBar: MatSnackBar) { }\n\n ngOnInit() {\n this.transTypes = this.transTypes.splice(1);\n this.bumpFeeChannel = this.data.pendingChannel;\n const channelPointArr = this.bumpFeeChannel.channel?.channel_point?.split(':') || [];\n if (this.bumpFeeChannel && this.bumpFeeChannel.channel) {\n this.bumpFeeChannel.channel.txid_str = channelPointArr[0] || (this.bumpFeeChannel.channel && this.bumpFeeChannel.channel.channel_point ? this.bumpFeeChannel.channel.channel_point : '');\n this.bumpFeeChannel.channel.output_index = +channelPointArr[1] || null;\n }\n }\n\n onBumpFee(): boolean | void {\n if (this.outputIndex === this.bumpFeeChannel.channel?.output_index) {\n this.outputIdx.control.setErrors({ pendingChannelOutputIndex: true });\n return true;\n }\n if ((!this.outputIndex && this.outputIndex !== 0) || (this.selTransType === '1' && (!this.blocks || this.blocks === 0)) || (this.selTransType === '2' && (!this.fees || this.fees === 0))) {\n return true;\n }\n this.dataService.bumpFee((this.bumpFeeChannel && this.bumpFeeChannel.channel && this.bumpFeeChannel.channel.txid_str ? this.bumpFeeChannel.channel.txid_str : ''), this.outputIndex, (this.blocks || null), (this.fees || null)).pipe(takeUntil(this.unSubs[0])).\n subscribe({\n next: (res) => {\n this.dialogRef.close(false);\n }, error: (err) => {\n this.logger.error(err);\n this.bumpFeeError = err.message ? err.message : err;\n }\n });\n }\n\n onCopyID(payload: string) {\n this.snackBar.open('Transaction ID copied.');\n }\n\n resetData() {\n this.bumpFeeError = '';\n this.selTransType = '2';\n this.blocks = null;\n this.fees = null;\n this.outputIdx.control.setErrors(null);\n }\n\n onClose() {\n this.dialogRef.close(false);\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"column\" class=\"mb-2\">\n <span class=\"page-title\">Total Limbo Balance: {{pendingChannels.total_limbo_balance | number}} Sats</span>\n <mat-accordion displayMode=\"flat\" class=\"mt-1\">\n <mat-progress-bar *ngIf=\"apiCallStatus.status === apiCallStatusEnum.INITIATED\" mode=\"indeterminate\"></mat-progress-bar>\n <mat-expansion-panel fxLayout=\"column\" class=\"flat-expansion-panel\">\n <mat-expansion-panel-header>\n <mat-panel-title>Pending Open ({{pendingOpenChannelsLength}})</mat-panel-title>\n </mat-expansion-panel-header>\n <div fxLayout=\"column\" fxFlex=\"100\" class=\"table-container\" [perfectScrollbar]>\n <mat-progress-bar *ngIf=\"apiCallStatus.status === apiCallStatusEnum.INITIATED\" mode=\"indeterminate\"></mat-progress-bar>\n <table #table mat-table fxFlex=\"100\" matSort [dataSource]=\"pendingOpenChannels\" [ngClass]=\"{'error-border bordered-box': errorMessage !== '','bordered-box': true}\">\n <ng-container matColumnDef=\"remote_alias\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Peer</th>\n <td *matCellDef=\"let channel\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{channel.channel.remote_alias}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"remote_node_pub\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Pubkey</th>\n <td *matCellDef=\"let channel\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{channel.channel.remote_node_pub}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"channel_point\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Channel Point</th>\n <td *matCellDef=\"let channel\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{channel.channel.channel_point}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"initiator\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Initiator</th>\n <td *matCellDef=\"let channel\" mat-cell>{{channel.channel.initiator | camelcaseWithReplace:'initiator_'}}</td>\n </ng-container>\n <ng-container matColumnDef=\"commitment_type\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Commitment Type</th>\n <td *matCellDef=\"let channel\" mat-cell>{{channel.channel.commitment_type | camelcaseWithReplace:'commitment_type':'_'}}</td>\n </ng-container>\n <ng-container matColumnDef=\"confirmation_height\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Confirmation Height</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.confirmation_height | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"commit_fee\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Commit Fee (Sats)</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.commit_fee | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"commit_weight\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Commit Weight</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.commit_weight | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"fee_per_kw\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Fee/KW</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.fee_per_kw | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"capacity\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Capacity (Sats)</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.channel.capacity | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"local_balance\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Local Balance (Sats)</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.channel.local_balance | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"remote_balance\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Remote Balance (Sats)</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.channel.remote_balance | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"actions\">\n <th *matHeaderCellDef mat-header-cell>\n <div class=\"bordered-box table-actions-select\" fxLayoutAlign=\"center center\">Actions</div>\n </th>\n <td *matCellDef=\"let channel\" mat-cell fxLayoutAlign=\"end center\">\n <div class=\"bordered-box table-actions-select\" fxLayoutAlign=\"center center\">\n <mat-select placeholder=\"Actions\" tabindex=\"1\" class=\"mr-0\">\n <mat-select-trigger></mat-select-trigger>\n <mat-option (click)=\"onOpenClick(channel)\">View Info</mat-option>\n <mat-option (click)=\"onBumpFee(channel)\">Bump Fee</mat-option>\n </mat-select>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"no_pending_open\">\n <td *matFooterCellDef mat-footer-cellcolspan=\"4\">\n <p *ngIf=\"(!pendingOpenChannels || !pendingOpenChannels?.data || pendingOpenChannels?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.COMPLETED\">No pending channel.</p>\n <p *ngIf=\"(!pendingOpenChannels || !pendingOpenChannels?.data || pendingOpenChannels?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.INITIATED\">Getting pending channels...</p>\n <p *ngIf=\"(!pendingOpenChannels || !pendingOpenChannels?.data || pendingOpenChannels?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.ERROR\">{{errorMessage}}</p>\n </td>\n </ng-container>\n <tr *matFooterRowDef=\"['no_pending_open']\" mat-footer-row fxLayoutAlign=\"start center\" [ngClass]=\"{'display-none': pendingOpenChannels && pendingOpenChannels?.data && pendingOpenChannels?.data?.length>0}\"></tr>\n <tr *matHeaderRowDef=\"displayedOpenColumns\" mat-header-row></tr>\n <tr *matRowDef=\"let row; columns: displayedOpenColumns;\" mat-row></tr>\n </table>\n </div>\n </mat-expansion-panel>\n <mat-progress-bar *ngIf=\"apiCallStatus.status === apiCallStatusEnum.INITIATED\" mode=\"indeterminate\"></mat-progress-bar>\n <mat-expansion-panel fxLayout=\"column\" class=\"flat-expansion-panel\">\n <mat-expansion-panel-header>\n <mat-panel-title>Pending Force Closing ({{pendingForceClosingChannelsLength}})</mat-panel-title>\n </mat-expansion-panel-header>\n <div fxLayout=\"column\" fxFlex=\"100\" class=\"table-container\" [perfectScrollbar]>\n <table #table mat-table matSort [dataSource]=\"pendingForceClosingChannels\" [ngClass]=\"{'error-border bordered-box': errorMessage !== '','bordered-box': true}\">\n <ng-container matColumnDef=\"closing_txid\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Closing Tx ID</th>\n <td *matCellDef=\"let channel\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{channel.closing_txid}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"remote_alias\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Peer</th>\n <td *matCellDef=\"let channel\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{channel.channel.remote_alias}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"remote_node_pub\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Pubkey</th>\n <td *matCellDef=\"let channel\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{channel.channel.remote_node_pub}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"channel_point\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Channel Point</th>\n <td *matCellDef=\"let channel\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{channel.channel.channel_point}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"initiator\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Initiator</th>\n <td *matCellDef=\"let channel\" mat-cell>{{channel.channel.initiator | camelcaseWithReplace:'initiator_'}}</td>\n </ng-container>\n <ng-container matColumnDef=\"commitment_type\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Commitment Type</th>\n <td *matCellDef=\"let channel\" mat-cell>{{channel.channel.commitment_type | camelcaseWithReplace:'commitment_type':'_'}}</td>\n </ng-container>\n <ng-container matColumnDef=\"limbo_balance\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Limbo Balance (Sats)</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.limbo_balance | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"maturity_height\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Maturity Height</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.maturity_height | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"blocks_til_maturity\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Blocks till Maturity</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.blocks_til_maturity | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"recovered_balance\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Recovered Balance (Sats)</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.recovered_balance | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"capacity\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Capacity (Sats)</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.channel.capacity | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"local_balance\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Local Balance (Sats)</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.channel.local_balance | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"remote_balance\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Remote Balance (Sats)</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.channel.remote_balance | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"actions\">\n <th *matHeaderCellDef mat-header-cell>\n <div class=\"bordered-box table-actions-select\" fxLayoutAlign=\"center center\">Actions</div>\n </th>\n <td *matCellDef=\"let channel\" mat-cell fxLayoutAlign=\"end center\">\n <button mat-stroked-button color=\"primary\" type=\"button\" tabindex=\"2\" class=\"table-actions-button\" (click)=\"onForceClosingClick(channel)\">View Info</button> \n </td>\n </ng-container>\n <ng-container matColumnDef=\"no_pending_force_closing\">\n <td *matFooterCellDef mat-footer-cellcolspan=\"4\">\n <p *ngIf=\"(!pendingForceClosingChannels || !pendingForceClosingChannels?.data || pendingForceClosingChannels?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.COMPLETED\">No pending channel.</p>\n <p *ngIf=\"(!pendingForceClosingChannels || !pendingForceClosingChannels?.data || pendingForceClosingChannels?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.INITIATED\">Getting pending channels...</p>\n <p *ngIf=\"(!pendingForceClosingChannels || !pendingForceClosingChannels?.data || pendingForceClosingChannels?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.ERROR\">{{errorMessage}}</p>\n </td>\n </ng-container>\n <tr *matFooterRowDef=\"['no_pending_force_closing']\" mat-footer-row fxLayoutAlign=\"start center\" [ngClass]=\"{'display-none': pendingForceClosingChannels && pendingForceClosingChannels?.data && pendingForceClosingChannels?.data?.length>0}\"></tr>\n <tr *matHeaderRowDef=\"displayedForceClosingColumns\" mat-header-row></tr>\n <tr *matRowDef=\"let row; columns: displayedForceClosingColumns;\" mat-row></tr>\n </table>\n </div>\n </mat-expansion-panel>\n <mat-progress-bar *ngIf=\"apiCallStatus.status === apiCallStatusEnum.INITIATED\" mode=\"indeterminate\"></mat-progress-bar>\n <mat-expansion-panel fxLayout=\"column\" class=\"flat-expansion-panel\">\n <mat-expansion-panel-header>\n <mat-panel-title>Pending Closing ({{pendingClosingChannelsLength}})</mat-panel-title>\n </mat-expansion-panel-header>\n <div fxLayout=\"column\" fxFlex=\"100\" class=\"table-container\" [perfectScrollbar]>\n <table #table mat-table matSort [dataSource]=\"pendingClosingChannels\" [ngClass]=\"{'error-border bordered-box': errorMessage !== '','bordered-box': true}\">\n <ng-container matColumnDef=\"closing_txid\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Closing Tx ID</th>\n <td *matCellDef=\"let channel\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{channel.closing_txid}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"remote_alias\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Peer</th>\n <td *matCellDef=\"let channel\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{channel.channel.remote_alias}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"remote_node_pub\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Pubkey</th>\n <td *matCellDef=\"let channel\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{channel.channel.remote_node_pub}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"channel_point\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Channel Point</th>\n <td *matCellDef=\"let channel\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{channel.channel.channel_point}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"initiator\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Initiator</th>\n <td *matCellDef=\"let channel\" mat-cell>{{channel.channel.initiator | camelcaseWithReplace:'initiator_'}}</td>\n </ng-container>\n <ng-container matColumnDef=\"commitment_type\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Commitment Type</th>\n <td *matCellDef=\"let channel\" mat-cell>{{channel.channel.commitment_type | camelcaseWithReplace:'commitment_type':'_'}}</td>\n </ng-container>\n <ng-container matColumnDef=\"capacity\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Capacity (Sats)</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.channel.capacity | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"local_balance\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Local Balance (Sats)</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.channel.local_balance | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"remote_balance\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Remote Balance (Sats)</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.channel.remote_balance | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"actions\">\n <th *matHeaderCellDef mat-header-cell>\n <div class=\"bordered-box table-actions-select\" fxLayoutAlign=\"center center\">Actions</div>\n </th>\n <td *matCellDef=\"let channel\" mat-cell fxLayoutAlign=\"end center\">\n <button mat-stroked-button color=\"primary\" type=\"button\" tabindex=\"3\" class=\"table-actions-button\" (click)=\"onClosingClick(channel)\">View Info</button> \n </td>\n </ng-container>\n <ng-container matColumnDef=\"no_pending_closing\">\n <td *matFooterCellDef mat-footer-cellcolspan=\"4\">\n <p *ngIf=\"(!pendingClosingChannels || !pendingClosingChannels?.data || pendingClosingChannels?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.COMPLETED\">No pending channel.</p>\n <p *ngIf=\"(!pendingClosingChannels || !pendingClosingChannels?.data || pendingClosingChannels?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.INITIATED\">Getting pending channels...</p>\n <p *ngIf=\"(!pendingClosingChannels || !pendingClosingChannels?.data || pendingClosingChannels?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.ERROR\">{{errorMessage}}</p>\n </td>\n </ng-container>\n <tr *matFooterRowDef=\"['no_pending_closing']\" mat-footer-row fxLayoutAlign=\"start center\" [ngClass]=\"{'display-none': pendingClosingChannels && pendingClosingChannels?.data && pendingClosingChannels?.data?.length>0}\"></tr>\n <tr *matHeaderRowDef=\"displayedClosingColumns\" mat-header-row></tr>\n <tr *matRowDef=\"let row; columns: displayedClosingColumns;\" mat-row></tr>\n </table>\n </div>\n </mat-expansion-panel>\n <mat-progress-bar *ngIf=\"apiCallStatus.status === apiCallStatusEnum.INITIATED\" mode=\"indeterminate\"></mat-progress-bar>\n <mat-expansion-panel fxLayout=\"column\" class=\"flat-expansion-panel\">\n <mat-expansion-panel-header>\n <mat-panel-title>Waiting Close ({{pendingWaitClosingChannelsLength}})</mat-panel-title>\n </mat-expansion-panel-header>\n <div fxLayout=\"column\" fxFlex=\"100\" class=\"table-container\" [perfectScrollbar]>\n <table #table mat-table matSort [dataSource]=\"pendingWaitClosingChannels\" [ngClass]=\"{'error-border bordered-box': errorMessage !== '','bordered-box': true}\">\n <ng-container matColumnDef=\"closing_txid\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Closing Tx ID</th>\n <td *matCellDef=\"let channel\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{channel.closing_txid}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"remote_alias\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Peer</th>\n <td *matCellDef=\"let channel\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{channel.channel.remote_alias}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"remote_node_pub\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Pubkey</th>\n <td *matCellDef=\"let channel\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{channel.channel.remote_node_pub}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"channel_point\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Channel Point</th>\n <td *matCellDef=\"let channel\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{channel.channel.channel_point}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"initiator\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Initiator</th>\n <td *matCellDef=\"let channel\" mat-cell>{{channel.channel.initiator | camelcaseWithReplace:'initiator_'}}</td>\n </ng-container>\n <ng-container matColumnDef=\"commitment_type\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Commitment Type</th>\n <td *matCellDef=\"let channel\" mat-cell>{{channel.channel.commitment_type | camelcaseWithReplace:'commitment_type':'_'}}</td>\n </ng-container>\n <ng-container matColumnDef=\"limbo_balance\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Limbo Balance (Sats)</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.limbo_balance | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"capacity\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Capacity (Sats)</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.channel.capacity | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"local_balance\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Local Balance (Sats)</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.channel.local_balance | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"remote_balance\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Remote Balance (Sats)</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.channel.remote_balance | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"actions\">\n <th *matHeaderCellDef mat-header-cell> fxLayoutAlign=\"end center\"\n <div class=\"bordered-box table-actions-select\" fxLayoutAlign=\"center center\">Actions</div> \n </th>\n <td *matCellDef=\"let channel\" mat-cell fxLayoutAlign=\"end center\">\n <button mat-stroked-button color=\"primary\" type=\"button\" tabindex=\"4\" class=\"table-actions-button\" (click)=\"onWaitClosingClick(channel)\">View Info</button> \n </td>\n </ng-container>\n <ng-container matColumnDef=\"no_pending_wait_closing\">\n <td *matFooterCellDef mat-footer-cellcolspan=\"4\">\n <p *ngIf=\"(!pendingWaitClosingChannels || !pendingWaitClosingChannels?.data || pendingWaitClosingChannels?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.COMPLETED\">No pending channel.</p>\n <p *ngIf=\"(!pendingWaitClosingChannels || !pendingWaitClosingChannels?.data || pendingWaitClosingChannels?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.INITIATED\">Getting pending channels...</p>\n <p *ngIf=\"(!pendingWaitClosingChannels || !pendingWaitClosingChannels?.data || pendingWaitClosingChannels?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.ERROR\">{{errorMessage}}</p>\n </td>\n </ng-container>\n <tr *matFooterRowDef=\"['no_pending_wait_closing']\" mat-footer-row fxLayoutAlign=\"start center\" [ngClass]=\"{'py-0': true, 'display-none': pendingWaitClosingChannels && pendingWaitClosingChannels?.data && pendingWaitClosingChannels?.data?.length>0}\"></tr>\n <tr *matHeaderRowDef=\"displayedWaitClosingColumns\" mat-header-row></tr>\n <tr *matRowDef=\"let row; columns: displayedWaitClosingColumns;\" mat-row></tr>\n </table>\n </div>\n </mat-expansion-panel>\n </mat-accordion>\n</div>","import { Component, OnInit, OnDestroy, ViewChild, AfterViewInit } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\n\nimport { MatSort } from '@angular/material/sort';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { Channel, GetInfo, PendingChannels, PendingClosingChannel, PendingForceClosingChannel, PendingOpenChannel, WaitingCloseChannel } from '../../../../../shared/models/lndModels';\nimport { AlertTypeEnum, APICallStatusEnum, DataTypeEnum, LND_DEFAULT_PAGE_SETTINGS, PAGE_SIZE, ScreenSizeEnum, SortOrderEnum } from '../../../../../shared/services/consts-enums-functions';\nimport { ApiCallStatusPayload } from '../../../../../shared/models/apiCallsPayload';\nimport { SelNodeChild } from '../../../../../shared/models/RTLconfig';\nimport { LoggerService } from '../../../../../shared/services/logger.service';\nimport { CommonService } from '../../../../../shared/services/common.service';\nimport { BumpFeeComponent } from '../../bump-fee-modal/bump-fee.component';\n\nimport { openAlert } from '../../../../../store/rtl.actions';\nimport { RTLState } from '../../../../../store/rtl.state';\nimport { lndNodeInformation, lndNodeSettings, lndPageSettings, pendingChannels } from '../../../../store/lnd.selector';\nimport { PageSettings, TableSetting } from '../../../../../shared/models/pageSettings';\n\n@Component({\n selector: 'rtl-channel-pending-table',\n templateUrl: './channel-pending-table.component.html',\n styleUrls: ['./channel-pending-table.component.scss']\n})\nexport class ChannelPendingTableComponent implements OnInit, AfterViewInit, OnDestroy {\n\n @ViewChild(MatSort, { static: false }) sort: MatSort | undefined;\n public PAGE_ID = 'peers_channels';\n public openTableSetting: TableSetting = { tableId: 'pending_open', recordsPerPage: PAGE_SIZE, sortBy: 'capacity', sortOrder: SortOrderEnum.DESCENDING };\n public forceClosingTableSetting: TableSetting = { tableId: 'pending_force_closing', recordsPerPage: PAGE_SIZE, sortBy: 'limbo_balance', sortOrder: SortOrderEnum.DESCENDING };\n public closingTableSetting: TableSetting = { tableId: 'pending_closing', recordsPerPage: PAGE_SIZE, sortBy: 'capacity', sortOrder: SortOrderEnum.DESCENDING };\n public waitingCloseTableSetting: TableSetting = { tableId: 'pending_waiting_close', recordsPerPage: PAGE_SIZE, sortBy: 'limbo_balance', sortOrder: SortOrderEnum.DESCENDING };\n public selNode: SelNodeChild | null = {};\n public information: GetInfo = {};\n public pendingChannels: PendingChannels = {};\n public displayedOpenColumns: any[] = [];\n public pendingOpenChannelsLength = 0;\n public pendingOpenChannels: any = new MatTableDataSource<PendingOpenChannel>([]);\n public displayedForceClosingColumns: any[] = [];\n public pendingForceClosingChannelsLength = 0;\n public pendingForceClosingChannels: any = new MatTableDataSource<PendingForceClosingChannel>([]);\n public displayedClosingColumns: any[] = [];\n public pendingClosingChannelsLength = 0;\n public pendingClosingChannels: any = new MatTableDataSource<PendingClosingChannel>([]);\n public displayedWaitClosingColumns: any[] = [];\n public pendingWaitClosingChannelsLength = 0;\n public pendingWaitClosingChannels: any = new MatTableDataSource<WaitingCloseChannel>([]);\n public screenSize = '';\n public screenSizeEnum = ScreenSizeEnum;\n public errorMessage = '';\n public apiCallStatus: ApiCallStatusPayload | null = null;\n public apiCallStatusEnum = APICallStatusEnum;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject(), new Subject(), new Subject()];\n\n constructor(private logger: LoggerService, private store: Store<RTLState>, private commonService: CommonService) {\n this.screenSize = this.commonService.getScreenSize();\n }\n\n ngOnInit() {\n this.store.select(lndNodeSettings).pipe(takeUntil(this.unSubs[0])).subscribe((nodeSettings: SelNodeChild | null) => { this.selNode = nodeSettings; });\n this.store.select(lndNodeInformation).pipe(takeUntil(this.unSubs[1])).subscribe((nodeInfo: GetInfo) => { this.information = nodeInfo; });\n this.store.select(lndPageSettings).pipe(takeUntil(this.unSubs[2])).\n subscribe((settings: { pageSettings: PageSettings[], apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessage = '';\n this.apiCallStatus = settings.apiCallStatus;\n if (this.apiCallStatus.status === APICallStatusEnum.ERROR) {\n this.errorMessage = this.apiCallStatus.message || '';\n }\n this.openTableSetting = settings.pageSettings.find((page) => page.pageId === this.PAGE_ID)?.tables.find((table) => table.tableId === this.openTableSetting.tableId) || LND_DEFAULT_PAGE_SETTINGS.find((page) => page.pageId === this.PAGE_ID)?.tables.find((table) => table.tableId === this.openTableSetting.tableId)!;\n if (this.screenSize === ScreenSizeEnum.XS || this.screenSize === ScreenSizeEnum.SM) {\n this.displayedOpenColumns = JSON.parse(JSON.stringify(this.openTableSetting.columnSelectionSM));\n } else {\n this.displayedOpenColumns = JSON.parse(JSON.stringify(this.openTableSetting.columnSelection));\n }\n this.displayedOpenColumns.push('actions');\n this.logger.info(this.displayedOpenColumns);\n this.forceClosingTableSetting = settings.pageSettings.find((page) => page.pageId === this.PAGE_ID)?.tables.find((table) => table.tableId === this.forceClosingTableSetting.tableId) ||\n LND_DEFAULT_PAGE_SETTINGS.find((page) => page.pageId === this.PAGE_ID)?.tables.find((table) => table.tableId === this.forceClosingTableSetting.tableId)!;\n if (this.screenSize === ScreenSizeEnum.XS || this.screenSize === ScreenSizeEnum.SM) {\n this.displayedForceClosingColumns = JSON.parse(JSON.stringify(this.forceClosingTableSetting.columnSelectionSM));\n } else {\n this.displayedForceClosingColumns = JSON.parse(JSON.stringify(this.forceClosingTableSetting.columnSelection));\n }\n this.displayedForceClosingColumns.push('actions');\n this.logger.info(this.displayedForceClosingColumns);\n this.closingTableSetting = settings.pageSettings.find((page) => page.pageId === this.PAGE_ID)?.tables.find((table) => table.tableId === this.closingTableSetting.tableId) ||\n LND_DEFAULT_PAGE_SETTINGS.find((page) => page.pageId === this.PAGE_ID)?.tables.find((table) => table.tableId === this.closingTableSetting.tableId)!;\n if (this.screenSize === ScreenSizeEnum.XS || this.screenSize === ScreenSizeEnum.SM) {\n this.displayedClosingColumns = JSON.parse(JSON.stringify(this.closingTableSetting.columnSelectionSM));\n } else {\n this.displayedClosingColumns = JSON.parse(JSON.stringify(this.closingTableSetting.columnSelection));\n }\n this.displayedClosingColumns.push('actions');\n this.logger.info(this.displayedClosingColumns);\n this.waitingCloseTableSetting = settings.pageSettings.find((page) => page.pageId === this.PAGE_ID)?.tables.find((table) => table.tableId === this.waitingCloseTableSetting.tableId) ||\n LND_DEFAULT_PAGE_SETTINGS.find((page) => page.pageId === this.PAGE_ID)?.tables.find((table) => table.tableId === this.waitingCloseTableSetting.tableId)!;\n if (this.screenSize === ScreenSizeEnum.XS || this.screenSize === ScreenSizeEnum.SM) {\n this.displayedWaitClosingColumns = JSON.parse(JSON.stringify(this.waitingCloseTableSetting.columnSelectionSM));\n } else {\n this.displayedWaitClosingColumns = JSON.parse(JSON.stringify(this.waitingCloseTableSetting.columnSelection));\n }\n this.displayedWaitClosingColumns.push('actions');\n this.logger.info(this.displayedWaitClosingColumns);\n });\n this.store.select(pendingChannels).pipe(takeUntil(this.unSubs[3])).\n subscribe((pendingChannelsSelector: { pendingChannels: PendingChannels, apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessage = '';\n this.apiCallStatus = pendingChannelsSelector.apiCallStatus;\n if (this.apiCallStatus.status === APICallStatusEnum.ERROR) {\n this.errorMessage = !this.apiCallStatus.message ? '' : (typeof (this.apiCallStatus.message) === 'object') ? JSON.stringify(this.apiCallStatus.message) : this.apiCallStatus.message;\n }\n this.pendingChannels = pendingChannelsSelector.pendingChannels;\n if (this.pendingChannels.pending_open_channels && this.pendingChannels.pending_open_channels.length && this.pendingChannels.pending_open_channels.length > 0) {\n this.loadOpenChannelsTable(this.pendingChannels.pending_open_channels);\n }\n if (this.pendingChannels.pending_force_closing_channels && this.pendingChannels.pending_force_closing_channels.length && this.pendingChannels.pending_force_closing_channels.length > 0) {\n this.loadForceClosingChannelsTable(this.pendingChannels.pending_force_closing_channels);\n }\n if (this.pendingChannels.pending_closing_channels && this.pendingChannels.pending_closing_channels.length && this.pendingChannels.pending_closing_channels.length > 0) {\n this.loadClosingChannelsTable(this.pendingChannels.pending_closing_channels);\n }\n if (this.pendingChannels.waiting_close_channels && this.pendingChannels.waiting_close_channels.length && this.pendingChannels.waiting_close_channels.length > 0) {\n this.loadWaitClosingChannelsTable(this.pendingChannels.waiting_close_channels);\n }\n this.logger.info(pendingChannelsSelector);\n });\n }\n\n ngAfterViewInit() {\n if (this.pendingChannels.pending_open_channels && this.pendingChannels.pending_open_channels.length && this.pendingChannels.pending_open_channels.length > 0) {\n this.loadOpenChannelsTable(this.pendingChannels.pending_open_channels);\n }\n if (this.pendingChannels.pending_force_closing_channels && this.pendingChannels.pending_force_closing_channels.length && this.pendingChannels.pending_force_closing_channels.length > 0) {\n this.loadForceClosingChannelsTable(this.pendingChannels.pending_force_closing_channels);\n }\n if (this.pendingChannels.pending_closing_channels && this.pendingChannels.pending_closing_channels.length && this.pendingChannels.pending_closing_channels.length > 0) {\n this.loadClosingChannelsTable(this.pendingChannels.pending_closing_channels);\n }\n if (this.pendingChannels.waiting_close_channels && this.pendingChannels.waiting_close_channels.length && this.pendingChannels.waiting_close_channels.length > 0) {\n this.loadWaitClosingChannelsTable(this.pendingChannels.waiting_close_channels);\n }\n }\n\n onOpenClick(selChannel: any) {\n const fcChannelObj1 = JSON.parse(JSON.stringify(selChannel, ['commit_weight', 'confirmation_height', 'fee_per_kw', 'commit_fee'], 2));\n const fcChannelObj2 = JSON.parse(JSON.stringify(selChannel.channel, ['remote_alias', 'channel_point', 'remote_balance', 'local_balance', 'remote_node_pub', 'capacity'], 2));\n const preOrderedChannel: any = {};\n Object.assign(preOrderedChannel, fcChannelObj1, fcChannelObj2);\n const reorderedChannel = [\n [{ key: 'channel_point', value: preOrderedChannel.channel_point, title: 'Channel Point', width: 100, type: DataTypeEnum.STRING }],\n [{ key: 'remote_node_pub', value: preOrderedChannel.remote_node_pub, title: 'Peer Node Pubkey', width: 100, type: DataTypeEnum.STRING }],\n [{ key: 'remote_alias', value: preOrderedChannel.remote_alias, title: 'Peer Alias', width: 100, type: DataTypeEnum.STRING }],\n [{ key: 'capacity', value: preOrderedChannel.capacity, title: 'Capacity', width: 25, type: DataTypeEnum.NUMBER },\n { key: 'confirmation_height', value: preOrderedChannel.confirmation_height, title: 'Confirmation Height', width: 25, type: DataTypeEnum.NUMBER },\n { key: 'local_balance', value: preOrderedChannel.local_balance, title: 'Local Balance', width: 25, type: DataTypeEnum.NUMBER },\n { key: 'remote_balance', value: preOrderedChannel.remote_balance, title: 'Remote Balance', width: 25, type: DataTypeEnum.NUMBER }],\n [{ key: 'fee_per_kw', value: preOrderedChannel.fee_per_kw, title: 'Fee/KW', width: 25, type: DataTypeEnum.NUMBER },\n { key: 'commit_weight', value: preOrderedChannel.commit_weight, title: 'Commit Weight', width: 25, type: DataTypeEnum.NUMBER },\n { key: 'commit_fee', value: preOrderedChannel.commit_fee, title: 'Commit Fee', width: 50, type: DataTypeEnum.NUMBER }]\n ];\n this.store.dispatch(openAlert({\n payload: {\n data: {\n type: AlertTypeEnum.INFORMATION,\n alertTitle: 'Opening Channel Information',\n message: reorderedChannel\n }\n }\n }));\n }\n\n onBumpFee(selChannel: PendingOpenChannel) {\n this.store.dispatch(openAlert({\n payload: {\n data: {\n pendingChannel: selChannel,\n component: BumpFeeComponent\n }\n }\n }));\n }\n\n onForceClosingClick(selChannel: any) {\n const fcChannelObj1 = JSON.parse(JSON.stringify(selChannel, ['closing_txid', 'limbo_balance', 'maturity_height', 'blocks_til_maturity', 'recovered_balance'], 2));\n const fcChannelObj2 = JSON.parse(JSON.stringify(selChannel.channel, ['remote_alias', 'channel_point', 'remote_balance', 'local_balance', 'remote_node_pub', 'capacity'], 2));\n const preOrderedChannel: any = {};\n Object.assign(preOrderedChannel, fcChannelObj1, fcChannelObj2);\n const reorderedChannel = [\n [{ key: 'closing_txid', value: preOrderedChannel.closing_txid, title: 'Closing Transaction ID', width: 100, type: DataTypeEnum.STRING }],\n [{ key: 'channel_point', value: preOrderedChannel.channel_point, title: 'Channel Point', width: 100, type: DataTypeEnum.STRING }],\n [{ key: 'remote_alias', value: preOrderedChannel.remote_alias, title: 'Peer Alias', width: 25, type: DataTypeEnum.STRING },\n { key: 'remote_node_pub', value: preOrderedChannel.remote_node_pub, title: 'Peer Node Pubkey', width: 75, type: DataTypeEnum.STRING }],\n [{ key: 'capacity', value: preOrderedChannel.capacity, title: 'Capacity', width: 25, type: DataTypeEnum.NUMBER },\n { key: 'limbo_balance', value: preOrderedChannel.limbo_balance, title: 'Limbo Balance', width: 25, type: DataTypeEnum.NUMBER },\n { key: 'local_balance', value: preOrderedChannel.local_balance, title: 'Local Balance', width: 25, type: DataTypeEnum.NUMBER },\n { key: 'remote_balance', value: preOrderedChannel.remote_balance, title: 'Remote Balance', width: 25, type: DataTypeEnum.NUMBER }],\n [{ key: 'maturity_height', value: preOrderedChannel.maturity_height, title: 'Maturity Height', width: 25, type: DataTypeEnum.NUMBER },\n { key: 'blocks_til_maturity', value: preOrderedChannel.blocks_til_maturity, title: 'Blocks Till Maturity', width: 25, type: DataTypeEnum.NUMBER },\n { key: 'recovered_balance', value: preOrderedChannel.recovered_balance, title: 'Recovered Balance', width: 50, type: DataTypeEnum.NUMBER }]\n ];\n this.store.dispatch(openAlert({\n payload: {\n data: {\n type: AlertTypeEnum.INFORMATION,\n alertTitle: 'Force Closing Channel Information',\n message: reorderedChannel\n }\n }\n }));\n }\n\n onClosingClick(selChannel: any) {\n const fcChannelObj1 = JSON.parse(JSON.stringify(selChannel, ['closing_txid'], 2));\n const fcChannelObj2 = JSON.parse(JSON.stringify(selChannel.channel, ['remote_alias', 'channel_point', 'remote_balance', 'local_balance', 'remote_node_pub', 'capacity'], 2));\n const preOrderedChannel: any = {};\n Object.assign(preOrderedChannel, fcChannelObj1, fcChannelObj2);\n const reorderedChannel = [\n [{ key: 'closing_txid', value: preOrderedChannel.closing_txid, title: 'Closing Transaction ID', width: 50, type: DataTypeEnum.STRING }],\n [{ key: 'channel_point', value: preOrderedChannel.channel_point, title: 'Channel Point', width: 100, type: DataTypeEnum.STRING }],\n [{ key: 'remote_alias', value: preOrderedChannel.remote_alias, title: 'Peer Alias', width: 25, type: DataTypeEnum.STRING },\n { key: 'remote_node_pub', value: preOrderedChannel.remote_node_pub, title: 'Peer Node Pubkey', width: 75, type: DataTypeEnum.STRING }],\n [{ key: 'capacity', value: preOrderedChannel.capacity, title: 'Capacity', width: 25, type: DataTypeEnum.NUMBER },\n { key: 'local_balance', value: preOrderedChannel.local_balance, title: 'Local Balance', width: 25, type: DataTypeEnum.NUMBER },\n { key: 'remote_balance', value: preOrderedChannel.remote_balance, title: 'Remote Balance', width: 50, type: DataTypeEnum.NUMBER }]\n ];\n this.store.dispatch(openAlert({\n payload: {\n data: {\n type: AlertTypeEnum.INFORMATION,\n alertTitle: 'Closing Channel Information',\n message: reorderedChannel\n }\n }\n }));\n }\n\n onWaitClosingClick(selChannel: any) {\n const fcChannelObj1 = JSON.parse(JSON.stringify(selChannel, ['limbo_balance'], 2));\n const fcChannelObj2 = JSON.parse(JSON.stringify(selChannel.channel, ['remote_alias', 'channel_point', 'remote_balance', 'local_balance', 'remote_node_pub', 'capacity'], 2));\n const fcChannelObj3 = JSON.parse(JSON.stringify(selChannel.commitments, ['local_txid'], 2));\n const preOrderedChannel: any = {};\n Object.assign(preOrderedChannel, fcChannelObj1, fcChannelObj2, fcChannelObj3);\n const reorderedChannel = [\n [{ key: 'local_txid', value: preOrderedChannel.local_txid, title: 'Transaction ID', width: 100, type: DataTypeEnum.STRING }],\n [{ key: 'channel_point', value: preOrderedChannel.channel_point, title: 'Channel Point', width: 100, type: DataTypeEnum.STRING }],\n [{ key: 'remote_alias', value: preOrderedChannel.remote_alias, title: 'Peer Alias', width: 25, type: DataTypeEnum.STRING },\n { key: 'remote_node_pub', value: preOrderedChannel.remote_node_pub, title: 'Peer Node Pubkey', width: 75, type: DataTypeEnum.STRING }],\n [{ key: 'capacity', value: preOrderedChannel.capacity, title: 'Capacity', width: 25, type: DataTypeEnum.NUMBER },\n { key: 'limbo_balance', value: preOrderedChannel.limbo_balance, title: 'Limbo Balance', width: 25, type: DataTypeEnum.NUMBER },\n { key: 'local_balance', value: preOrderedChannel.local_balance, title: 'Local Balance', width: 25, type: DataTypeEnum.NUMBER },\n { key: 'remote_balance', value: preOrderedChannel.remote_balance, title: 'Remote Balance', width: 25, type: DataTypeEnum.NUMBER }]\n ];\n this.store.dispatch(openAlert({\n payload: {\n data: {\n type: AlertTypeEnum.INFORMATION,\n alertTitle: 'Wait Closing Channel Information',\n message: reorderedChannel\n }\n }\n }));\n }\n\n loadOpenChannelsTable(channels) {\n this.pendingOpenChannelsLength = (channels.length) ? channels.length : 0;\n this.pendingOpenChannels = new MatTableDataSource<Channel>([...channels]);\n this.pendingOpenChannels.sort = this.sort;\n this.pendingOpenChannels.sortingDataAccessor = (data: any, sortHeaderId: string) => ((data[sortHeaderId] && isNaN(data[sortHeaderId])) ? data[sortHeaderId].toLocaleLowerCase() : data[sortHeaderId] ? +data[sortHeaderId] : null);\n this.pendingOpenChannels.sort?.sort({ id: this.openTableSetting.sortBy, start: this.openTableSetting.sortOrder, disableClear: true });\n this.logger.info(this.pendingOpenChannels);\n }\n\n loadForceClosingChannelsTable(channels) {\n this.pendingForceClosingChannelsLength = (channels.length) ? channels.length : 0;\n this.pendingForceClosingChannels = new MatTableDataSource<Channel>([...channels]);\n this.pendingForceClosingChannels.sort = this.sort;\n this.pendingForceClosingChannels.sortingDataAccessor = (data: any, sortHeaderId: string) => ((data[sortHeaderId] && isNaN(data[sortHeaderId])) ? data[sortHeaderId].toLocaleLowerCase() : data[sortHeaderId] ? +data[sortHeaderId] : null);\n this.pendingForceClosingChannels.sort?.sort({ id: this.forceClosingTableSetting.sortBy, start: this.forceClosingTableSetting.sortOrder, disableClear: true });\n this.logger.info(this.pendingForceClosingChannels);\n }\n\n loadClosingChannelsTable(channels) {\n this.pendingClosingChannelsLength = (channels.length) ? channels.length : 0;\n this.pendingClosingChannels = new MatTableDataSource<Channel>([...channels]);\n this.pendingClosingChannels.sort = this.sort;\n this.pendingClosingChannels.sortingDataAccessor = (data: any, sortHeaderId: string) => ((data[sortHeaderId] && isNaN(data[sortHeaderId])) ? data[sortHeaderId].toLocaleLowerCase() : data[sortHeaderId] ? +data[sortHeaderId] : null);\n this.pendingClosingChannels.sort?.sort({ id: this.closingTableSetting.sortBy, start: this.closingTableSetting.sortOrder, disableClear: true });\n this.logger.info(this.pendingClosingChannels);\n }\n\n loadWaitClosingChannelsTable(channels) {\n this.pendingWaitClosingChannelsLength = (channels.length) ? channels.length : 0;\n this.pendingWaitClosingChannels = new MatTableDataSource<Channel>([...channels]);\n this.pendingWaitClosingChannels.sort = this.sort;\n this.pendingWaitClosingChannels.sortingDataAccessor = (data: any, sortHeaderId: string) => ((data[sortHeaderId] && isNaN(data[sortHeaderId])) ? data[sortHeaderId].toLocaleLowerCase() : data[sortHeaderId] ? +data[sortHeaderId] : null);\n this.pendingWaitClosingChannels.sort?.sort({ id: this.waitingCloseTableSetting.sortBy, start: this.waitingCloseTableSetting.sortOrder, disableClear: true });\n this.logger.info(this.pendingWaitClosingChannels);\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"column\">\n <div fxLayout=\"column\" fxLayout.gt-xs=\"row\" fxLayoutAlign.gt-xs=\"start center\" fxLayoutAlign=\"start stretch\" class=\"page-sub-title-container\">\n <div fxFlex=\"70\"></div>\n <div fxFlex.gt-xs=\"30\" fxLayoutAlign.gt-xs=\"space-between center\" fxLayout=\"row\" fxLayoutAlign=\"space-between stretch\">\n <mat-form-field fxFlex=\"49\">\n <mat-select placeholder=\"Filter By\" tabindex=\"1\" name=\"filterBy\" [(ngModel)]=\"selFilterBy\" (selectionChange)=\"selFilter=''; applyFilter()\">\n <mat-option *ngFor=\"let column of ['all'].concat(displayedColumns.slice(0, -1))\" [value]=\"column\">{{getLabel(column)}}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field fxFlex=\"49\">\n <input matInput name=\"filter\" placeholder=\"Filter\" [(ngModel)]=\"selFilter\" (input)=\"applyFilter()\" (keyup)=\"applyFilter()\">\n </mat-form-field>\n </div>\n </div>\n <div fxLayout=\"column\" fxFlex=\"100\" class=\"table-container\" [perfectScrollbar]>\n <mat-progress-bar *ngIf=\"apiCallStatus.status === apiCallStatusEnum.INITIATED\" mode=\"indeterminate\"></mat-progress-bar>\n <table #table mat-table fxFlex=\"100\" matSort [dataSource]=\"closedChannels\" [ngClass]=\"{'error-border': errorMessage !== '', 'overflow-auto': true}\">\n <ng-container matColumnDef=\"close_type\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Close Type</th>\n <td *matCellDef=\"let channel\" mat-cell>\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\">\n <mat-icon class=\"info-icon info-icon-text\" [matTooltip]=\"channelClosureType[channel.close_type].tooltip\">info_outline</mat-icon>\n {{channelClosureType[channel.close_type].name}}\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"remote_alias\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Peer</th>\n <td *matCellDef=\"let channel\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{channel?.remote_alias}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"remote_pubkey\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Pubkey</th>\n <td *matCellDef=\"let channel\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{channel?.remote_pubkey}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"channel_point\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Channel Point</th>\n <td *matCellDef=\"let channel\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{channel?.channel_point}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"chan_id\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Channel ID</th>\n <td *matCellDef=\"let channel\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{channel?.chan_id}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"closing_tx_hash\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Closing Tx Hash</th>\n <td *matCellDef=\"let channel\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{channel?.closing_tx_hash}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"chain_hash\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Chain Hash</th>\n <td *matCellDef=\"let channel\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{channel?.chain_hash}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"open_initiator\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Open Initiator</th>\n <td *matCellDef=\"let channel\" mat-cell>{{channel.open_initiator | camelcaseWithReplace:'initiator_'}}</td>\n </ng-container>\n <ng-container matColumnDef=\"close_initiator\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Close Initiator</th>\n <td *matCellDef=\"let channel\" mat-cell>{{channel.close_initiator | camelcaseWithReplace:'initiator_'}}</td>\n </ng-container>\n <ng-container matColumnDef=\"time_locked_balance\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Timelocked Balance (Sats)</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.time_locked_balance | number}} </span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"capacity\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Capacity (Sats)</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.capacity | number}} </span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"close_height\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Close Height</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.close_height | number}}\n </span></td>\n </ng-container>\n <ng-container matColumnDef=\"settled_balance\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Settled Balance (Sats)</th>\n <td *matCellDef=\"let channel\" mat-cell><span fxLayoutAlign=\"end center\">{{channel.settled_balance | number}}\n </span></td>\n </ng-container>\n <ng-container matColumnDef=\"actions\">\n <th *matHeaderCellDef mat-header-cell>\n <div class=\"bordered-box table-actions-select\" fxLayoutAlign=\"center center\">\n <mat-select placeholder=\"Actions\" tabindex=\"1\" class=\"mr-0\">\n <mat-select-trigger></mat-select-trigger>\n <mat-option (click)=\"onDownloadCSV()\">Download CSV</mat-option>\n </mat-select>\n </div>\n </th>\n <td *matCellDef=\"let channel\" mat-cell>\n <span fxLayoutAlign=\"end center\">\n <button mat-stroked-button color=\"primary\" type=\"button\" tabindex=\"4\" class=\"table-actions-button\" (click)=\"onClosedChannelClick(channel,$event)\">View Info</button> \n </span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"no_closed_channel\">\n <td *matFooterCellDef mat-footer-cellcolspan=\"4\">\n <p *ngIf=\"(!closedChannels?.data || closedChannels?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.COMPLETED\">No closed channel available.</p>\n <p *ngIf=\"(!closedChannels?.data || closedChannels?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.INITIATED\">Getting closed channels...</p>\n <p *ngIf=\"(!closedChannels?.data || closedChannels?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.ERROR\">{{errorMessage}}</p>\n </td>\n </ng-container>\n <tr *matFooterRowDef=\"['no_closed_channel']\" mat-footer-row [ngClass]=\"{'display-none': closedChannels?.data && closedChannels?.data?.length>0}\"></tr>\n <tr *matHeaderRowDef=\"displayedColumns\" mat-header-row></tr>\n <tr *matRowDef=\"let row; columns: displayedColumns;\" mat-row></tr>\n </table>\n </div>\n <mat-paginator class=\"mb-1\" [pageSize]=\"pageSize\" [pageSizeOptions]=\"pageSizeOptions\" [showFirstLastButtons]=\"screenSize === screenSizeEnum.XS ? false : true\"></mat-paginator>\n</div>\n","import { Component, OnInit, OnDestroy, ViewChild, AfterViewInit } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { faHistory } from '@fortawesome/free-solid-svg-icons';\n\nimport { MatPaginator, MatPaginatorIntl } from '@angular/material/paginator';\nimport { MatSort } from '@angular/material/sort';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { ClosedChannel } from '../../../../../shared/models/lndModels';\nimport { PAGE_SIZE, PAGE_SIZE_OPTIONS, getPaginatorLabel, AlertTypeEnum, DataTypeEnum, ScreenSizeEnum, CHANNEL_CLOSURE_TYPE, APICallStatusEnum, SortOrderEnum, LND_DEFAULT_PAGE_SETTINGS, LND_PAGE_DEFS } from '../../../../../shared/services/consts-enums-functions';\nimport { ApiCallStatusPayload } from '../../../../../shared/models/apiCallsPayload';\nimport { LoggerService } from '../../../../../shared/services/logger.service';\nimport { CommonService } from '../../../../../shared/services/common.service';\n\nimport { openAlert } from '../../../../../store/rtl.actions';\nimport { RTLState } from '../../../../../store/rtl.state';\nimport { closedChannels, lndPageSettings } from '../../../../store/lnd.selector';\nimport { ColumnDefinition, PageSettings, TableSetting } from '../../../../../shared/models/pageSettings';\nimport { CamelCaseWithReplacePipe } from '../../../../../shared/pipes/app.pipe';\n\n@Component({\n selector: 'rtl-channel-closed-table',\n templateUrl: './channel-closed-table.component.html',\n styleUrls: ['./channel-closed-table.component.scss'],\n providers: [\n { provide: MatPaginatorIntl, useValue: getPaginatorLabel('Channels') }\n ]\n})\nexport class ChannelClosedTableComponent implements OnInit, AfterViewInit, OnDestroy {\n\n @ViewChild(MatSort, { static: false }) sort: MatSort | undefined;\n @ViewChild(MatPaginator, { static: false }) paginator: MatPaginator | undefined;\n public nodePageDefs = LND_PAGE_DEFS;\n public selFilterBy = 'all';\n public colWidth = '20rem';\n public PAGE_ID = 'peers_channels';\n public tableSetting: TableSetting = { tableId: 'closed', recordsPerPage: PAGE_SIZE, sortBy: 'close_type', sortOrder: SortOrderEnum.DESCENDING };\n public channelClosureType = CHANNEL_CLOSURE_TYPE;\n public faHistory = faHistory;\n public displayedColumns: any[] = [];\n public closedChannelsData: ClosedChannel[] = [];\n public closedChannels: any = new MatTableDataSource([]);\n public pageSize = PAGE_SIZE;\n public pageSizeOptions = PAGE_SIZE_OPTIONS;\n public screenSize = '';\n public screenSizeEnum = ScreenSizeEnum;\n public errorMessage = '';\n public selFilter = '';\n public apiCallStatus: ApiCallStatusPayload | null = null;\n public apiCallStatusEnum = APICallStatusEnum;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject()];\n\n constructor(private logger: LoggerService, private store: Store<RTLState>, private commonService: CommonService, private camelCaseWithReplace: CamelCaseWithReplacePipe) {\n this.screenSize = this.commonService.getScreenSize();\n }\n\n ngOnInit() {\n this.store.select(lndPageSettings).pipe(takeUntil(this.unSubs[0])).\n subscribe((settings: { pageSettings: PageSettings[], apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessage = '';\n this.apiCallStatus = settings.apiCallStatus;\n if (this.apiCallStatus.status === APICallStatusEnum.ERROR) {\n this.errorMessage = this.apiCallStatus.message || '';\n }\n this.tableSetting = settings.pageSettings.find((page) => page.pageId === this.PAGE_ID)?.tables.find((table) => table.tableId === this.tableSetting.tableId) || LND_DEFAULT_PAGE_SETTINGS.find((page) => page.pageId === this.PAGE_ID)?.tables.find((table) => table.tableId === this.tableSetting.tableId)!;\n if (this.screenSize === ScreenSizeEnum.XS || this.screenSize === ScreenSizeEnum.SM) {\n this.displayedColumns = JSON.parse(JSON.stringify(this.tableSetting.columnSelectionSM));\n } else {\n this.displayedColumns = JSON.parse(JSON.stringify(this.tableSetting.columnSelection));\n }\n this.displayedColumns.push('actions');\n this.pageSize = this.tableSetting.recordsPerPage ? +this.tableSetting.recordsPerPage : PAGE_SIZE;\n this.colWidth = this.displayedColumns.length ? ((this.commonService.getContainerSize().width / this.displayedColumns.length) / 10) + 'rem' : '20rem';\n this.logger.info(this.displayedColumns);\n });\n this.store.select(closedChannels).pipe(takeUntil(this.unSubs[1])).\n subscribe((closedChannelsSelector: { closedChannels: ClosedChannel[], apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessage = '';\n this.apiCallStatus = closedChannelsSelector.apiCallStatus;\n if (this.apiCallStatus.status === APICallStatusEnum.ERROR) {\n this.errorMessage = !this.apiCallStatus.message ? '' : (typeof (this.apiCallStatus.message) === 'object') ? JSON.stringify(this.apiCallStatus.message) : this.apiCallStatus.message;\n }\n this.closedChannelsData = closedChannelsSelector.closedChannels;\n if (this.closedChannelsData.length > 0) {\n this.loadClosedChannelsTable(this.closedChannelsData);\n }\n this.logger.info(closedChannelsSelector);\n });\n }\n\n ngAfterViewInit() {\n if (this.closedChannelsData.length > 0) {\n this.loadClosedChannelsTable(this.closedChannelsData);\n }\n }\n\n applyFilter() {\n this.closedChannels.filter = this.selFilter.trim().toLowerCase();\n }\n\n getLabel(column: string) {\n const returnColumn: ColumnDefinition = this.nodePageDefs[this.PAGE_ID][this.tableSetting.tableId].allowedColumns.find((col) => col.column === column);\n return returnColumn ? returnColumn.label ? returnColumn.label : this.camelCaseWithReplace.transform(returnColumn.column, '_') : this.commonService.titleCase(column);\n }\n\n setFilterPredicate() {\n this.closedChannels.filterPredicate = (rowData: ClosedChannel, fltr: string) => {\n let rowToFilter = '';\n switch (this.selFilterBy) {\n case 'all':\n rowToFilter = JSON.stringify(rowData).toLowerCase();\n break;\n\n case 'close_type':\n rowToFilter = (rowData.close_type && this.channelClosureType[rowData.close_type] && this.channelClosureType[rowData.close_type].name ? this.channelClosureType[rowData.close_type].name.toLowerCase() : '');\n break;\n\n case 'open_initiator':\n case 'close_initiator':\n rowToFilter = this.camelCaseWithReplace.transform((rowData[this.selFilterBy] || ''), 'initiator_').trim().toLowerCase();\n break;\n\n default:\n rowToFilter = typeof rowData[this.selFilterBy] === 'undefined' ? '' : typeof rowData[this.selFilterBy] === 'string' ? rowData[this.selFilterBy].toLowerCase() : typeof rowData[this.selFilterBy] === 'boolean' ? (rowData[this.selFilterBy] ? 'yes' : 'no') : rowData[this.selFilterBy].toString();\n break;\n }\n return (this.selFilterBy === 'close_type' || this.selFilterBy === 'open_initiator' || this.selFilterBy === 'close_initiator') ? rowToFilter.indexOf(fltr) === 0 : rowToFilter.includes(fltr);\n };\n }\n\n onClosedChannelClick(selChannel: ClosedChannel, event: any) {\n const reorderedChannel = [\n [{ key: 'close_type', value: this.channelClosureType[selChannel.close_type].name, title: 'Close Type', width: 30, type: DataTypeEnum.STRING },\n { key: 'settled_balance', value: selChannel.settled_balance, title: 'Settled Balance', width: 30, type: DataTypeEnum.NUMBER },\n { key: 'time_locked_balance', value: selChannel.time_locked_balance, title: 'Time Locked Balance', width: 40, type: DataTypeEnum.NUMBER }],\n [{ key: 'chan_id', value: selChannel.chan_id, title: 'Channel ID', width: 30 },\n { key: 'capacity', value: selChannel.capacity, title: 'Capacity', width: 30, type: DataTypeEnum.NUMBER },\n { key: 'close_height', value: selChannel.close_height, title: 'Close Height', width: 40, type: DataTypeEnum.NUMBER }],\n [{ key: 'remote_alias', value: selChannel.remote_alias, title: 'Peer Alias', width: 30 },\n { key: 'remote_pubkey', value: selChannel.remote_pubkey, title: 'Peer Public Key', width: 70 }],\n [{ key: 'channel_point', value: selChannel.channel_point, title: 'Channel Point', width: 100 }],\n [{ key: 'closing_tx_hash', value: selChannel.closing_tx_hash, title: 'Closing Transaction Hash', width: 100, type: DataTypeEnum.STRING }]\n ];\n this.store.dispatch(openAlert({\n payload: {\n data: {\n type: AlertTypeEnum.INFORMATION,\n alertTitle: 'Closed Channel Information',\n message: reorderedChannel\n }\n }\n }));\n }\n\n loadClosedChannelsTable(closedChannels) {\n this.closedChannels = new MatTableDataSource<ClosedChannel>([...closedChannels]);\n this.closedChannels.sort = this.sort;\n this.closedChannels.sortingDataAccessor = (data: any, sortHeaderId: string) => ((data[sortHeaderId] && isNaN(data[sortHeaderId])) ? data[sortHeaderId].toLocaleLowerCase() : data[sortHeaderId] ? +data[sortHeaderId] : null);\n this.closedChannels.sort?.sort({ id: this.tableSetting.sortBy, start: this.tableSetting.sortOrder, disableClear: true });\n this.closedChannels.paginator = this.paginator;\n this.setFilterPredicate();\n this.applyFilter();\n this.logger.info(this.closedChannels);\n }\n\n onDownloadCSV() {\n if (this.closedChannels.data && this.closedChannels.data.length > 0) {\n this.commonService.downloadFile(this.closedChannels.data, 'Closed-channels');\n }\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"column\" class=\"padding-gap\">\n <div fxLayout=\"column\" fxLayout.gt-xs=\"row\" fxLayoutAlign.gt-xs=\"start center\" fxLayoutAlign=\"start stretch\" class=\"page-sub-title-container\">\n <div fxFlex=\"70\"></div>\n <div fxFlex.gt-xs=\"30\" fxLayoutAlign.gt-xs=\"space-between center\" fxLayout=\"row\" fxLayoutAlign=\"space-between stretch\">\n <mat-form-field fxFlex=\"49\">\n <mat-select placeholder=\"Filter By\" tabindex=\"1\" name=\"filterBy\" [(ngModel)]=\"selFilterBy\" (selectionChange)=\"selFilter=''; applyFilter()\">\n <mat-option *ngFor=\"let column of ['all'].concat(displayedColumns.slice(0, -1))\" [value]=\"column\">{{getLabel(column)}}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field fxFlex=\"49\">\n <input matInput name=\"filter\" placeholder=\"Filter\" [(ngModel)]=\"selFilter\" (input)=\"applyFilter()\" (keyup)=\"applyFilter()\">\n </mat-form-field>\n </div>\n </div>\n <div fxLayout=\"column\" fxFlex=\"100\" class=\"table-container\" [perfectScrollbar]>\n <mat-progress-bar *ngIf=\"apiCallStatus.status === apiCallStatusEnum.INITIATED\" mode=\"indeterminate\"></mat-progress-bar>\n <table #table mat-table fxFlex=\"100\" matSort [dataSource]=\"channels\" [ngClass]=\"{'error-border': errorMessage !== ''}\">\n <!-- Channel Group Row Start -->\n <ng-container matColumnDef=\"amount\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Amount (Sats)</th>\n <td *matCellDef=\"let channel\" mat-cell>\n <span fxLayoutAlign=\"start center\" class=\"htlc-row-span\">\n Active HTLCs: {{channel?.pending_htlcs?.length}}\n </span>\n <ng-container *ngIf=\"channel.is_expanded\">\n <span *ngFor=\"let htlc of channel?.pending_htlcs; index as i\" fxLayoutAlign=\"end center\" class=\"htlc-row-span\">\n {{htlc?.amount | number}}\n </span>\n </ng-container>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"incoming\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Alias/Incoming</th>\n <td *matCellDef=\"let channel\" mat-cell>\n <span fxLayoutAlign=\"start center\" class=\"htlc-row-span\">{{channel?.remote_alias}}</span>\n <ng-container *ngIf=\"channel.is_expanded\">\n <span *ngFor=\"let htlc of channel?.pending_htlcs\" fxLayoutAlign=\"start center\" class=\"htlc-row-span\">\n {{htlc?.incoming ? 'Yes' : 'No'}}\n </span>\n </ng-container>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"forwarding_channel\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Forwarding Channel</th>\n <td *matCellDef=\"let channel\" mat-cell>\n <span fxLayoutAlign=\"start center\" class=\"htlc-row-span\">{{' '}}</span>\n <ng-container *ngIf=\"channel.is_expanded\">\n <span *ngFor=\"let htlc of channel?.pending_htlcs\" fxLayoutAlign=\"start center\" class=\"htlc-row-span\">\n {{htlc?.forwarding_channel}}\n </span>\n </ng-container>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"htlc_index\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">\n <span fxLayoutAlign=\"end center\" class=\"htlc-row-span\">HTLC Index</span>\n </th>\n <td *matCellDef=\"let channel\" mat-cell>\n <span fxLayoutAlign=\"end center\" class=\"htlc-row-span\">{{' '}}</span>\n <span *ngIf=\"channel.is_expanded\">\n <span *ngFor=\"let htlc of channel?.pending_htlcs\" fxLayoutAlign=\"end center\" class=\"htlc-row-span\">\n {{htlc?.htlc_index | number}}\n </span>\n </span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"forwarding_htlc_index\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">\n <span fxLayoutAlign=\"end center\" class=\"htlc-row-span\">Forwarding HTLC Index</span>\n </th>\n <td *matCellDef=\"let channel\" mat-cell>\n <span fxLayoutAlign=\"end center\" class=\"htlc-row-span\">{{' '}}</span>\n <span *ngIf=\"channel.is_expanded\">\n <span *ngFor=\"let htlc of channel?.pending_htlcs\" fxLayoutAlign=\"end center\" class=\"htlc-row-span\">\n {{htlc?.forwarding_htlc_index | number}}\n </span>\n </span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"expiration_height\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">\n <span fxLayoutAlign=\"end center\" class=\"htlc-row-span\">Expiration Height</span>\n </th>\n <td *matCellDef=\"let channel\" mat-cell>\n <span fxLayoutAlign=\"end center\" class=\"htlc-row-span\">{{' '}}</span>\n <span *ngIf=\"channel.is_expanded\">\n <span *ngFor=\"let htlc of channel?.pending_htlcs\" fxLayoutAlign=\"end center\" class=\"htlc-row-span\">\n {{htlc?.expiration_height | number:'1.0-0'}}\n </span>\n </span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"hash_lock\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\" class=\"pl-3 htlc-row-span\">\n <span fxLayoutAlign=\"end center\" class=\"htlc-row-span\">Hash Lock</span>\n </th>\n <td *matCellDef=\"let channel\" mat-cell class=\"pl-3\">\n <span fxLayoutAlign=\"end center\" class=\"htlc-row-span\">{{' '}}</span>\n <span *ngIf=\"channel.is_expanded\">\n <span *ngFor=\"let htlc of channel?.pending_htlcs\" fxLayoutAlign=\"end center\" class=\"htlc-row-span\">\n {{htlc?.hash_lock}}\n </span>\n </span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"actions\">\n <th *matHeaderCellDef mat-header-cellclass=\"px-2\">\n <div class=\"bordered-box table-actions-select\" fxLayoutAlign=\"center center\">\n <mat-select placeholder=\"Actions\" tabindex=\"1\" class=\"mr-0\">\n <mat-select-trigger></mat-select-trigger>\n <mat-option (click)=\"onDownloadCSV()\">Download CSV</mat-option>\n </mat-select>\n </div>\n </th>\n <td *matCellDef=\"let channel\" mat-cell class=\"px-2\">\n <span fxLayoutAlign=\"end center\">\n <button mat-flat-button class=\"btn-htlc-expand\" color=\"primary\" type=\"button\" tabindex=\"5\" (click)=\"channel.is_expanded = !channel.is_expanded\">{{channel.is_expanded ? 'Hide' : 'Show'}}</button>\n </span>\n <div *ngIf=\"channel.is_expanded\">\n <div *ngFor=\"let htlc of channel?.pending_htlcs; index as i\" fxLayoutAlign=\"end center\">\n <button mat-stroked-button class=\"btn-htlc-info\" color=\"primary\" type=\"button\" tabindex=\"6\" (click)=\"onHTLCClick(htlc, channel)\">View {{i + 1}}</button>\n </div>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"no_channel\">\n <td *matFooterCellDef mat-footer-cellcolspan=\"4\">\n <p *ngIf=\"(!channels?.data || channels?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.COMPLETED\">No active htlc available.</p>\n <p *ngIf=\"(!channels?.data || channels?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.INITIATED\">Getting active htlcs...</p>\n <p *ngIf=\"(!channels?.data || channels?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.ERROR\">{{errorMessage}}</p>\n </td>\n </ng-container>\n <!-- channel Group Row End -->\n <tr *matFooterRowDef=\"['no_channel']\" mat-footer-row [ngClass]=\"{'display-none': channels?.data && channels?.data?.length>0}\"></tr>\n <tr *matHeaderRowDef=\"displayedColumns\" mat-header-row></tr>\n <tr *matRowDef=\"let row; columns: displayedColumns;\" mat-row></tr>\n </table>\n </div>\n <mat-paginator class=\"mb-1\" [pageSize]=\"pageSize\" [pageSizeOptions]=\"pageSizeOptions\" [showFirstLastButtons]=\"screenSize === screenSizeEnum.XS ? false : true\"></mat-paginator>\n</div>\n","import { Component, OnInit, OnDestroy, ViewChild, AfterViewInit } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { MatPaginator, MatPaginatorIntl } from '@angular/material/paginator';\nimport { MatSort } from '@angular/material/sort';\nimport { MatTableDataSource } from '@angular/material/table';\n\nimport { ChannelInformationComponent } from '../../channel-information-modal/channel-information.component';\nimport { Channel, ChannelHTLC, ChannelsSummary, LightningBalance } from '../../../../../shared/models/lndModels';\nimport { PAGE_SIZE, PAGE_SIZE_OPTIONS, getPaginatorLabel, AlertTypeEnum, DataTypeEnum, ScreenSizeEnum, APICallStatusEnum, SortOrderEnum, LND_DEFAULT_PAGE_SETTINGS, LND_PAGE_DEFS } from '../../../../../shared/services/consts-enums-functions';\nimport { ApiCallStatusPayload } from '../../../../../shared/models/apiCallsPayload';\nimport { LoggerService } from '../../../../../shared/services/logger.service';\nimport { CommonService } from '../../../../../shared/services/common.service';\n\nimport { openAlert } from '../../../../../store/rtl.actions';\nimport { RTLState } from '../../../../../store/rtl.state';\nimport { channels, lndPageSettings } from '../../../../store/lnd.selector';\nimport { ColumnDefinition, PageSettings, TableSetting } from '../../../../../shared/models/pageSettings';\nimport { CamelCaseWithReplacePipe } from '../../../../../shared/pipes/app.pipe';\n\n@Component({\n selector: 'rtl-channel-active-htlcs-table',\n templateUrl: './channel-active-htlcs-table.component.html',\n styleUrls: ['./channel-active-htlcs-table.component.scss'],\n providers: [\n { provide: MatPaginatorIntl, useValue: getPaginatorLabel('HTLCs') }\n ]\n})\nexport class ChannelActiveHTLCsTableComponent implements OnInit, AfterViewInit, OnDestroy {\n\n @ViewChild(MatSort, { static: false }) sort: MatSort | undefined;\n @ViewChild(MatPaginator, { static: false }) paginator: MatPaginator | undefined;\n public nodePageDefs = LND_PAGE_DEFS;\n public selFilterBy = 'all';\n public colWidth = '20rem';\n public PAGE_ID = 'peers_channels';\n public tableSetting: TableSetting = { tableId: 'active_HTLCs', recordsPerPage: PAGE_SIZE, sortBy: 'expiration_height', sortOrder: SortOrderEnum.DESCENDING };\n public channels: any = new MatTableDataSource([]);\n public channelsJSONArr: Channel[] = [];\n public displayedColumns: any[] = [];\n public htlcColumns = [];\n public pageSize = PAGE_SIZE;\n public pageSizeOptions = PAGE_SIZE_OPTIONS;\n public screenSize = '';\n public screenSizeEnum = ScreenSizeEnum;\n public errorMessage = '';\n public selFilter = '';\n public apiCallStatus: ApiCallStatusPayload | null = null;\n public apiCallStatusEnum = APICallStatusEnum;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject()];\n\n constructor(private logger: LoggerService, private commonService: CommonService, private store: Store<RTLState>, private camelCaseWithReplace: CamelCaseWithReplacePipe) {\n this.screenSize = this.commonService.getScreenSize();\n }\n\n ngOnInit() {\n this.store.select(lndPageSettings).pipe(takeUntil(this.unSubs[0])).\n subscribe((settings: { pageSettings: PageSettings[], apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessage = '';\n this.apiCallStatus = settings.apiCallStatus;\n if (this.apiCallStatus.status === APICallStatusEnum.ERROR) {\n this.errorMessage = this.apiCallStatus.message || '';\n }\n this.tableSetting = settings.pageSettings.find((page) => page.pageId === this.PAGE_ID)?.tables.find((table) => table.tableId === this.tableSetting.tableId) || LND_DEFAULT_PAGE_SETTINGS.find((page) => page.pageId === this.PAGE_ID)?.tables.find((table) => table.tableId === this.tableSetting.tableId)!;\n if (this.screenSize === ScreenSizeEnum.XS || this.screenSize === ScreenSizeEnum.SM) {\n this.displayedColumns = JSON.parse(JSON.stringify(this.tableSetting.columnSelectionSM));\n } else {\n this.displayedColumns = JSON.parse(JSON.stringify(this.tableSetting.columnSelection));\n }\n this.displayedColumns.push('actions');\n this.pageSize = this.tableSetting.recordsPerPage ? +this.tableSetting.recordsPerPage : PAGE_SIZE;\n this.colWidth = this.displayedColumns.length ? ((this.commonService.getContainerSize().width / this.displayedColumns.length) / 10) + 'rem' : '20rem';\n this.logger.info(this.displayedColumns);\n });\n this.store.select(channels).pipe(takeUntil(this.unSubs[1])).\n subscribe((channelsSelector: { channels: Channel[], channelsSummary: ChannelsSummary, lightningBalance: LightningBalance, apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessage = '';\n this.apiCallStatus = channelsSelector.apiCallStatus;\n if (this.apiCallStatus.status === APICallStatusEnum.ERROR) {\n this.errorMessage = !this.apiCallStatus.message ? '' : (typeof (this.apiCallStatus.message) === 'object') ? JSON.stringify(this.apiCallStatus.message) : this.apiCallStatus.message;\n }\n this.channelsJSONArr = channelsSelector.channels?.filter((channel) => channel.pending_htlcs && channel.pending_htlcs.length > 0) || [];\n if (this.channelsJSONArr.length > 0 && this.sort && this.paginator && this.displayedColumns.length > 0) {\n this.loadHTLCsTable(this.channelsJSONArr);\n }\n this.logger.info(channelsSelector);\n });\n }\n\n ngAfterViewInit() {\n if (this.channelsJSONArr.length > 0) {\n this.loadHTLCsTable(this.channelsJSONArr);\n }\n }\n\n onHTLCClick(selHtlc: ChannelHTLC, selChannel: Channel) {\n const reorderedHTLC = [\n [{ key: 'remote_alias', value: selChannel.remote_alias, title: 'Alias', width: 100, type: DataTypeEnum.STRING }],\n [{ key: 'amount', value: selHtlc.amount, title: 'Amount (Sats)', width: 50, type: DataTypeEnum.NUMBER },\n { key: 'incoming', value: (selHtlc.incoming ? 'Yes' : 'No'), title: 'Incoming', width: 50, type: DataTypeEnum.STRING }],\n [{ key: 'expiration_height', value: selHtlc.expiration_height, title: 'Expiration Height', width: 50, type: DataTypeEnum.NUMBER },\n { key: 'hash_lock', value: selHtlc.hash_lock, title: 'Hash Lock', width: 50, type: DataTypeEnum.STRING }]\n ];\n this.store.dispatch(openAlert({\n payload: {\n data: {\n type: AlertTypeEnum.INFORMATION,\n alertTitle: 'HTLC Information',\n message: reorderedHTLC\n }\n }\n }));\n }\n\n onChannelClick(selChannel: Channel, event: any) {\n this.store.dispatch(openAlert({\n payload: {\n data: {\n channel: selChannel,\n showCopy: true,\n component: ChannelInformationComponent\n }\n }\n }));\n }\n\n applyFilter() {\n this.channels.filter = this.selFilter.trim().toLowerCase();\n }\n\n getLabel(column: string) {\n const returnColumn: ColumnDefinition = this.nodePageDefs[this.PAGE_ID][this.tableSetting.tableId].allowedColumns.find((col) => col.column === column);\n return returnColumn ? returnColumn.label ? returnColumn.label : this.camelCaseWithReplace.transform(returnColumn.column, '_') : this.commonService.titleCase(column);\n }\n\n setFilterPredicate() {\n this.channels.filterPredicate = (rowData: Channel, fltr: string) => {\n let rowToFilter = '';\n switch (this.selFilterBy) {\n case 'all':\n rowToFilter = (rowData.remote_alias ? rowData.remote_alias.toLowerCase() : '') +\n rowData.pending_htlcs?.map((htlc) => JSON.stringify(htlc) + (htlc.incoming ? 'yes' : 'no'));\n break;\n\n default:\n rowToFilter = typeof rowData[this.selFilterBy] === 'undefined' ? '' : typeof rowData[this.selFilterBy] === 'string' ? rowData[this.selFilterBy].toLowerCase() : typeof rowData[this.selFilterBy] === 'boolean' ? (rowData[this.selFilterBy] ? 'yes' : 'no') : rowData[this.selFilterBy].toString();\n break;\n }\n return rowToFilter.includes(fltr);\n };\n }\n\n loadHTLCsTable(channels: Channel[]) {\n this.channels = (channels) ? new MatTableDataSource<Channel>([...channels]) : new MatTableDataSource([]);\n this.channels.sort = this.sort;\n this.channels.sortingDataAccessor = (data: any, sortHeaderId: string) => {\n switch (sortHeaderId) {\n case 'amount':\n this.commonService.sortByKey(data.pending_htlcs, sortHeaderId, 'number', this.sort?.direction);\n return data.pending_htlcs && data.pending_htlcs.length ? data.pending_htlcs.length : null;\n\n case 'incoming':\n this.commonService.sortByKey(data.pending_htlcs, sortHeaderId, 'boolean', this.sort?.direction);\n return data.remote_alias ? data.remote_alias : data.remote_pubkey ? data.remote_pubkey : null;\n\n case 'expiration_height':\n this.commonService.sortByKey(data.pending_htlcs, sortHeaderId, 'number', this.sort?.direction);\n return data;\n\n case 'hash_lock':\n this.commonService.sortByKey(data.pending_htlcs, sortHeaderId, 'number', this.sort?.direction);\n return data;\n\n default:\n return (data[sortHeaderId] && isNaN(data[sortHeaderId])) ? data[sortHeaderId].toLocaleLowerCase() : data[sortHeaderId] ? +data[sortHeaderId] : null;\n }\n };\n this.channels.sort?.sort({ id: this.tableSetting.sortBy, start: this.tableSetting.sortOrder, disableClear: true });\n this.channels.paginator = this.paginator;\n this.setFilterPredicate();\n this.applyFilter();\n }\n\n onDownloadCSV() {\n if (this.channels.data && this.channels.data.length > 0) {\n this.commonService.downloadFile(this.flattenHTLCs(), 'ActiveHTLCs');\n }\n }\n\n flattenHTLCs() {\n const channelsDataCopy = JSON.parse(JSON.stringify(this.channels.data));\n const flattenedHTLCs = channelsDataCopy?.reduce((acc, curr) => {\n if (curr.pending_htlcs) {\n return acc.concat(curr.pending_htlcs);\n } else {\n return acc.concat(curr);\n }\n }, []);\n return flattenedHTLCs;\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"column\" class=\"padding-gap mb-2\">\n <form fxLayout=\"column\" fxLayout.gt-sm=\"row wrap\" fxLayoutAlign=\"start\" fxLayoutAlign.gt-sm=\"space-between\">\n <mat-form-field fxFlex=\"100\" fxLayoutAlign=\"start\">\n <input autoFocus matInput type=\"password\" placeholder=\"Password\" name=\"walletPassword\" tabindex=\"1\" required [(ngModel)]=\"walletPassword\">\n <mat-hint>Enter Wallet Password</mat-hint>\n <mat-error *ngIf=\"!walletPassword\">Wallet password is required.</mat-error>\n </mat-form-field>\n <div fxLayout=\"row\" class=\"mt-2\">\n <button class=\"mr-1\" mat-stroked-button color=\"primary\" tabindex=\"2\" type=\"reset\" (click)=\"resetData()\">Clear Field</button>\n <button mat-flat-button color=\"primary\" type=\"submit\" tabindex=\"3\" (click)=\"onUnlockWallet()\">Unlock Wallet</button>\n </div> \n </form>\n</div>\n","import { Component, OnInit } from '@angular/core';\nimport { Store } from '@ngrx/store';\n\nimport { RTLState } from '../../../store/rtl.state';\nimport { unlockWallet } from '../../store/lnd.actions';\n\n@Component({\n selector: 'rtl-unlock-wallet',\n templateUrl: './unlock.component.html',\n styleUrls: ['./unlock.component.scss']\n})\nexport class UnlockWalletComponent implements OnInit {\n\n walletPassword = '';\n\n constructor(private store: Store<RTLState>) { }\n\n ngOnInit() {\n this.walletPassword = '';\n }\n\n onUnlockWallet(): boolean | void {\n if (!this.walletPassword) {\n return true;\n }\n this.store.dispatch(unlockWallet({ payload: { pwd: window.btoa(this.walletPassword) } }));\n }\n\n resetData() {\n this.walletPassword = '';\n }\n\n}\n","<div fxLayout=\"column\" class=\"padding-gap mb-4\">\n<div *ngIf=\"insecureLND && !warnRes\">\n <form fxLayout=\"column\" fxLayout.gt-sm=\"row wrap\" fxLayoutAlign=\"start\" fxLayoutAlign.gt-sm=\"space-between\" class=\"mt-2\">\n <div fxFlex=\"100\" fxLayoutAlign=\"start\">Warning: Your connection is unsecure, it's not safe to generate private keys over this connection.Are you sure you want to proceed?</div>\n <div fxLayout=\"row\" class=\"mt-2\">\n <button class=\"mr-1\" mat-stroked-button color=\"primary\" tabindex=\"1\" type=\"reset\" (click)=\"proceed=false;warnRes=true\">Do Not Proceed</button>\n <button mat-flat-button color=\"primary\" type=\"submit\" tabindex=\"2\" (click)=\"proceed=true;warnRes=true\">Proceed</button>\n </div>\n </form>\n</div>\n<div *ngIf=\"warnRes && !proceed\" fxLayout=\"column\" fxLayout.gt-sm=\"row wrap\" fxLayoutAlign=\"start\" fxLayoutAlign.gt-sm=\"stretch stretch\">\n <div fxFlex=\"100\" class=\"mt-2\">Please re-configure & re-start RTL after securing your LND connction. You can close this window now.</div>\n <div fxLayout=\"row\" class=\"mt-2\">\n <button mat-stroked-button color=\"primary\" tabindex=\"3\" type=\"reset\" (click)=\"warnRes=false\">Go Back</button>\n </div>\n</div>\n<mat-vertical-stepper *ngIf=\"(!insecureLND || (warnRes && proceed)) && genSeedResponse.length <= 0 && initWalletResponse === ''\" #stepper [linear]=\"true\">\n <mat-step label=\"Wallet Password\" state=\"password\" [stepControl]=\"passwordFormGroup\">\n <form fxLayout=\"column\" fxLayout.gt-sm=\"row wrap\" fxLayoutAlign=\"start\" fxLayoutAlign.gt-sm=\"space-between\" class=\"mt-1\" [formGroup]=\"passwordFormGroup\">\n <mat-form-field fxFlex=\"49\" fxLayoutAlign=\"start\">\n <input matInput type=\"password\" placeholder=\"Password\" name=\"initWalletPassword\" formControlName=\"initWalletPassword\" tabindex=\"5\" required>\n <mat-hint>Enter Wallet Password</mat-hint>\n <mat-error *ngIf=\"passwordFormGroup.controls.initWalletPassword.errors?.required\">Password is required.</mat-error>\n <mat-error *ngIf=\"passwordFormGroup.controls.initWalletPassword.errors?.minlength\">Password must be at least 8 characters in length.</mat-error>\n </mat-form-field>\n <mat-form-field fxFlex=\"49\" fxLayoutAlign=\"start\">\n <input matInput type=\"password\" placeholder=\"Confirm Password\" name=\"initWalletConfirmPassword\" formControlName=\"initWalletConfirmPassword\" tabindex=\"6\" required>\n <mat-hint>Confirm Wallet Password</mat-hint>\n <mat-error *ngIf=\"passwordFormGroup.controls.initWalletConfirmPassword.errors?.required\">Confirm password is required.</mat-error>\n <mat-error *ngIf=\"passwordFormGroup.controls.initWalletConfirmPassword.errors?.minlength\">Confirm password must be at least 8 characters in length.</mat-error>\n </mat-form-field>\n <div *ngIf=\"passwordFormGroup.errors?.unmatchedPasswords && (passwordFormGroup.controls.initWalletPassword.touched || passwordFormGroup.controls.initWalletPassword.dirty) && (passwordFormGroup.controls.initWalletConfirmPassword.touched || passwordFormGroup.controls.initWalletConfirmPassword.dirty)\" class=\"validation-error-message\">\n <mat-icon class=\"validation-error-icon red\">cancel</mat-icon>Passwords do not match.\n </div>\n <div fxLayout=\"row\" class=\"my-2\">\n <button mat-flat-button color=\"primary\" tabindex=\"7\" type=\"submit\" matStepperNext>Next</button>\n </div>\n </form>\n </mat-step>\n <mat-step label=\"Cipher\" state=\"cipher\" [stepControl]=\"cipherFormGroup\">\n <form fxLayout=\"column\" fxLayout.gt-sm=\"row wrap\" fxLayoutAlign=\"start stretch\" fxLayoutAlign.gt-sm=\"space-between start\" class=\"mt-1\" [formGroup]=\"cipherFormGroup\">\n <div fxFlex=\"100\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\">\n <mat-slide-toggle fxFlex=\"20\" tabindex=\"8\" color=\"primary\" class=\"chkbox-wallet\" formControlName=\"existingCipher\" name=\"existingCipher\" [labelPosition]=\"'before'\">Existing Cipher</mat-slide-toggle>\n <mat-form-field fxFlex=\"75\" fxLayoutAlign=\"start\" class=\"my-1\">\n <input autofocus matInput type=\"input\" placeholder=\"Comma separated array of 24 words cipher seed\" name=\"cipherSeed\" formControlName=\"cipherSeed\" tabindex=\"9\" required>\n <mat-hint>Cipher Seed</mat-hint>\n <mat-error *ngIf=\"cipherFormGroup.controls.cipherSeed.errors?.required\">Cipher seed is required.</mat-error>\n <mat-error *ngIf=\"!cipherFormGroup.controls.cipherSeed.errors?.required && cipherFormGroup.controls.cipherSeed.errors?.invalidCipher\">Invalid Cipher. Enter comma separated 24 words cipher seed.</mat-error>\n </mat-form-field>\n </div>\n <div fxLayout=\"row\" class=\"mb-2\">\n <button mat-stroked-button color=\"primary\" class=\"mr-1 mt-1\" type=\"reset\" tabindex=\"10\" matStepperPrevious>Back</button>\n <button mat-flat-button color=\"primary\" tabindex=\"11\" type=\"submit\" matStepperNext class=\"mt-1\">Next</button>\n </div>\n </form>\n </mat-step>\n <mat-step label=\"Passphrase\" state=\"passphrase\" [stepControl]=\"passphraseFormGroup\">\n <form fxLayout=\"column\" fxLayout.gt-sm=\"row wrap\" fxLayoutAlign=\"start stretch\" fxLayoutAlign.gt-sm=\"space-between start\" class=\"mt-1\" [formGroup]=\"passphraseFormGroup\">\n <div fxFlex=\"100\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\">\n <mat-slide-toggle fxFlex=\"20\" tabindex=\"10\" color=\"primary\" class=\"chkbox-wallet\" formControlName=\"enterPassphrase\" name=\"enterPassphrase\" [labelPosition]=\"'before'\">Existing Passphrase</mat-slide-toggle>\n <mat-form-field fxFlex=\"75\" fxLayoutAlign=\"start\">\n <input matInput type=\"password\" placeholder=\"Passphrase\" name=\"passphrase\" formControlName=\"passphrase\" tabindex=\"12\" required>\n <mat-hint>Enter Passphrase</mat-hint>\n <mat-error *ngIf=\"passphraseFormGroup.controls.passphrase.errors?.required\">Passphrase is required.</mat-error>\n </mat-form-field>\n </div>\n <div fxLayout=\"row\" class=\"mb-2\">\n <button class=\"mr-1 mt-1\" mat-stroked-button color=\"warn\" tabindex=\"13\" type=\"reset\" (click)=\"resetData()\">Clear</button>\n <button class=\"mr-1 mt-1\" mat-stroked-button tabindex=\"14\" color=\"primary\" type=\"button\" matStepperPrevious>Back</button>\n <button class=\"mt-1\" mat-flat-button color=\"primary\" tabindex=\"15\" type=\"submit\" (click)=\"onInitWallet()\">Initialize Wallet</button>\n </div>\n </form>\n </mat-step>\n <ng-template matStepperIcon=\"password\">\n <mat-icon>vpn_key</mat-icon>\n </ng-template>\n <ng-template matStepperIcon=\"cipher\">\n <mat-icon>swap_calls</mat-icon>\n </ng-template>\n <ng-template matStepperIcon=\"passphrase\">\n <mat-icon>fingerprint</mat-icon>\n </ng-template>\n</mat-vertical-stepper>\n<div *ngIf=\"genSeedResponse.length > 0 && initWalletResponse !== ''\">\n <form fxLayout=\"column\" fxLayout.gt-sm=\"row wrap\" fxLayoutAlign=\"start\" fxLayoutAlign.gt-sm=\"space-between\" class=\"mt-2\">\n <div fxFlex=\"100\" fxLayoutAlign=\"start\" class=\"blinker\">YOU MUST WRITE DOWN THIS SEED TO BE ABLE TO RESTORE THE WALLET!</div>\n <div fxFlex=\"40\" fxLayout=\"row wrap\" class=\"mt-2\">\n <span *ngFor=\"let genSeed of genSeedResponse; index as i;\" fxFlex=\"25\" fxLayoutAlign=\"start\" class=\"genseed-message\">{{genSeed}}</span>\n </div>\n <div fxFlex=\"100\" fxLayoutAlign=\"start\" class=\"mt-2\">Wallet initialization is done.</div>\n <div fxFlex=\"100\" fxLayoutAlign=\"start\" class=\"mt-2\">The node will be usable only after LND has synced completely with the network.</div>\n <div fxFlex=\"100\" fxLayoutAlign=\"start\" class=\"mt-2\">Click continue only after writing down the seed.</div>\n <div fxLayout=\"row\" class=\"mt-2\">\n <button mat-flat-button color=\"primary\" type=\"submit\" tabindex=\"16\" (click)=\"onGoToHome()\">Go To Home</button>\n </div>\n </form>\n</div>\n<div *ngIf=\"genSeedResponse.length > 0 && initWalletResponse === ''\">\n <form fxLayout=\"column\" fxLayout.gt-sm=\"row wrap\" fxLayoutAlign=\"start\" fxLayoutAlign.gt-sm=\"space-between\" class=\"mt-2\">\n <div fxFlex=\"100\" fxLayoutAlign=\"start\" class=\"mt-2\">Something went wrong! Unable to initialize wallet!</div>\n <div fxLayout=\"row\" class=\"mt-2\">\n <button mat-stroked-button color=\"primary\" tabindex=\"17\" type=\"reset\" (click)=\"resetData()\">Restart</button>\n </div>\n </form>\n</div>\n<div *ngIf=\"genSeedResponse.length <= 0 && initWalletResponse !== ''\">\n <form fxLayout=\"column\" fxLayout.gt-sm=\"row wrap\" fxLayoutAlign=\"start\" fxLayoutAlign.gt-sm=\"space-between\" class=\"mt-2\">\n <div fxFlex=\"100\" fxLayoutAlign=\"start\" class=\"mt-2\">Wallet recovery is done.</div>\n <div fxFlex=\"100\" fxLayoutAlign=\"start\" class=\"mt-2\">The node will be usable only after LND has synced completely with the network.</div>\n <div fxLayout=\"row\" class=\"mt-2\">\n <button mat-flat-button color=\"primary\" type=\"submit\" tabindex=\"18\" (click)=\"onGoToHome()\">Go To Home</button>\n </div>\n </form>\n</div>\n","import { Component, OnInit, OnDestroy, ViewChild } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { UntypedFormBuilder, UntypedFormGroup, Validators, ValidatorFn, ValidationErrors } from '@angular/forms';\nimport { STEPPER_GLOBAL_OPTIONS } from '@angular/cdk/stepper';\nimport { MatStepper } from '@angular/material/stepper';\n\nimport { LNDEffects } from '../../store/lnd.effects';\nimport { RTLState } from '../../../store/rtl.state';\nimport { updateSelectedNodeOptions } from '../../../store/rtl.actions';\nimport { fetchInfoLND, genSeed, initWallet } from '../../store/lnd.actions';\n\nexport function matchedPasswords(control: UntypedFormGroup): ValidationErrors | null {\n const initWalletPassword = control.get('initWalletPassword');\n const initWalletConfirmPassword = control.get('initWalletConfirmPassword');\n return initWalletPassword && initWalletConfirmPassword && initWalletPassword.value !== initWalletConfirmPassword.value ? { unmatchedPasswords: true } : null;\n}\n\nexport function cipherSeedLength(control: UntypedFormGroup): ValidationErrors | null {\n const cipherArr = control.value.toString().trim().split(',') || [];\n return cipherArr && cipherArr.length !== 24 ? { invalidCipher: true } : null;\n}\n\n@Component({\n selector: 'rtl-initialize-wallet',\n templateUrl: './initialize.component.html',\n styleUrls: ['./initialize.component.scss'],\n providers: [{\n provide: STEPPER_GLOBAL_OPTIONS, useValue: { displayDefaultIndicatorType: false }\n }]\n})\nexport class InitializeWalletComponent implements OnInit, OnDestroy {\n\n @ViewChild(MatStepper, { static: false }) stepper: MatStepper;\n public insecureLND = false;\n public genSeedResponse: string[] = [];\n public initWalletResponse = '';\n passwordFormGroup: UntypedFormGroup;\n cipherFormGroup: UntypedFormGroup;\n passphraseFormGroup: UntypedFormGroup;\n proceed = true;\n warnRes = false;\n private unsubs = [new Subject(), new Subject(), new Subject(), new Subject(), new Subject()];\n\n constructor(private store: Store<RTLState>, private formBuilder: UntypedFormBuilder, private lndEffects: LNDEffects) { }\n\n ngOnInit() {\n this.passwordFormGroup = this.formBuilder.group({\n initWalletPassword: ['', [Validators.required, Validators.minLength(8)]],\n initWalletConfirmPassword: ['', [Validators.required, Validators.minLength(8)]]\n }, { validators: matchedPasswords });\n this.cipherFormGroup = this.formBuilder.group({\n existingCipher: [false],\n cipherSeed: [{ value: '', disabled: true }, [cipherSeedLength]]\n });\n this.passphraseFormGroup = this.formBuilder.group({\n enterPassphrase: [false],\n passphrase: [{ value: '', disabled: true }]\n });\n\n this.cipherFormGroup.controls.existingCipher.valueChanges.pipe(takeUntil(this.unsubs[0])).subscribe((checked) => {\n if (checked) {\n this.cipherFormGroup.controls.cipherSeed.setValue('');\n this.cipherFormGroup.controls.cipherSeed.enable();\n } else {\n this.cipherFormGroup.controls.cipherSeed.setValue('');\n this.cipherFormGroup.controls.cipherSeed.disable();\n }\n });\n\n this.passphraseFormGroup.controls.enterPassphrase.valueChanges.pipe(takeUntil(this.unsubs[1])).subscribe((checked) => {\n if (checked) {\n this.passphraseFormGroup.controls.passphrase.setValue('');\n this.passphraseFormGroup.controls.passphrase.enable();\n } else {\n this.passphraseFormGroup.controls.passphrase.setValue('');\n this.passphraseFormGroup.controls.passphrase.disable();\n }\n });\n\n this.insecureLND = !window.location.protocol.includes('https:');\n\n this.lndEffects.initWalletRes.pipe(takeUntil(this.unsubs[2])).subscribe((initWalletResponse) => {\n this.initWalletResponse = initWalletResponse;\n });\n\n this.lndEffects.genSeedResponse.pipe(takeUntil(this.unsubs[3])).subscribe((genSeedRes) => {\n this.genSeedResponse = genSeedRes;\n if (this.passphraseFormGroup.controls.enterPassphrase.value) {\n this.store.dispatch(initWallet({\n payload: {\n pwd: window.btoa(this.passwordFormGroup.controls.initWalletPassword.value),\n cipher: this.genSeedResponse,\n passphrase: window.btoa(this.passphraseFormGroup.controls.passphrase.value)\n }\n }));\n } else {\n this.store.dispatch(initWallet({\n payload: {\n pwd: window.btoa(this.passwordFormGroup.controls.initWalletPassword.value),\n cipher: this.genSeedResponse\n }\n }));\n }\n });\n }\n\n onInitWallet(): boolean | void {\n if (this.passwordFormGroup.invalid || this.cipherFormGroup.invalid || this.passphraseFormGroup.invalid) {\n return true;\n }\n if (this.cipherFormGroup.controls.existingCipher.value) {\n const cipherArr = this.cipherFormGroup.controls.cipherSeed.value.toString().trim().split(',');\n if (this.passphraseFormGroup.controls.enterPassphrase.value) {\n this.store.dispatch(initWallet({\n payload: {\n pwd: window.btoa(this.passwordFormGroup.controls.initWalletPassword.value),\n cipher: cipherArr,\n passphrase: window.btoa(this.passphraseFormGroup.controls.passphrase.value)\n }\n }));\n } else {\n this.store.dispatch(initWallet({\n payload: {\n pwd: window.btoa(this.passwordFormGroup.controls.initWalletPassword.value),\n cipher: cipherArr\n }\n }));\n }\n } else {\n if (this.passphraseFormGroup.controls.enterPassphrase.value) {\n this.store.dispatch(genSeed({ payload: window.btoa(this.passphraseFormGroup.controls.passphrase.value) }));\n } else {\n this.store.dispatch(genSeed({ payload: '' }));\n }\n }\n }\n\n onGoToHome() {\n setTimeout(() => {\n this.store.dispatch(updateSelectedNodeOptions());\n this.store.dispatch(fetchInfoLND({ payload: { loadPage: 'HOME' } }));\n }, 1000 * 1);\n }\n\n resetData() {\n this.genSeedResponse = [];\n this.initWalletResponse = '';\n }\n\n ngOnDestroy() {\n this.unsubs.forEach((unsub) => {\n unsub.next(null);\n unsub.complete();\n });\n }\n\n}\n","import { Component } from '@angular/core';\nimport { faWallet } from '@fortawesome/free-solid-svg-icons';\n\n\n@Component({\n selector: 'rtl-wallet',\n templateUrl: './wallet.component.html',\n styleUrls: ['./wallet.component.scss']\n})\nexport class WalletComponent {\n\n public faWallet = faWallet;\n\n constructor() {}\n\n}\n","<div fxLayout=\"row\" fxLayoutAlign=\"start center\" class=\"page-title-container\">\n <fa-icon class=\"page-title-img mr-1\" [icon]=\"faWallet\"></fa-icon>\n <span class=\"page-title\">Wallet</span>\n</div>\n<div fxLayout=\"column\" class=\"padding-gap-x\">\n <mat-card>\n <mat-card-content fxLayout=\"column\">\n <mat-tab-group mat-stretch-tabs=\"false\" mat-align-tabs=\"start\">\n <mat-tab label=\"Unlock\"><rtl-unlock-wallet></rtl-unlock-wallet></mat-tab>\n <mat-tab label=\"Initialize\"><rtl-initialize-wallet></rtl-initialize-wallet></mat-tab>\n </mat-tab-group>\n </mat-card-content>\n </mat-card>\n</div>\n","<div fxLayout=\"row wrap\" fxLayoutAlign=\"start center\" class=\"page-title-container\">\n <fa-icon class=\"page-title-img mr-1\" [icon]=\"faChartPie\"></fa-icon>\n <span class=\"page-title\">Lightning Balance</span>\n</div>\n<div fxLayout=\"column\" class=\"padding-gap-x mb-4\">\n <mat-card>\n <mat-card-content fxLayout=\"column\">\n <rtl-currency-unit-converter [values]=\"balances\"></rtl-currency-unit-converter>\n </mat-card-content>\n </mat-card>\n</div>\n<div fxLayout=\"row\" fxLayoutAlign=\"start center\" class=\"page-title-container\">\n <fa-icon class=\"page-title-img mr-1\" [icon]=\"faExchangeAlt\"></fa-icon>\n <span class=\"page-title\">Lightning Transactions</span>\n</div>\n<div fxLayout=\"column\" class=\"padding-gap-x\">\n <mat-card>\n <mat-card-content fxLayout=\"column\">\n <nav mat-tab-nav-bar mat-stretch-tabs=\"false\" mat-align-tabs=\"start\" [tabPanel]=\"tabPanel\">\n <div *ngFor=\"let link of links\" mat-tab-link class=\"mat-tab-label\" [active]=\"activeLink === link.link\" routerLink=\"{{link.link}}\" (click)=\"activeLink = link.link\">{{link.name}}</div>\n </nav>\n <mat-tab-nav-panel #tabPanel></mat-tab-nav-panel>\n <div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between stretch\" class=\"mat-tab-body-wrapper\">\n <router-outlet></router-outlet>\n </div>\n </mat-card-content>\n </mat-card>\n</div>\n ","import { Component, OnInit, OnDestroy } from '@angular/core';\nimport { Router, ResolveEnd, Event } from '@angular/router';\nimport { Subject } from 'rxjs';\nimport { takeUntil, filter, withLatestFrom } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { faExchangeAlt, faChartPie } from '@fortawesome/free-solid-svg-icons';\n\nimport { UserPersonaEnum } from '../../shared/services/consts-enums-functions';\nimport { LoggerService } from '../../shared/services/logger.service';\nimport { RTLState } from '../../store/rtl.state';\nimport { channels, lndNodeSettings } from '../store/lnd.selector';\nimport { Channel, ChannelsSummary, LightningBalance } from '../../shared/models/lndModels';\nimport { ApiCallStatusPayload } from '../../shared/models/apiCallsPayload';\nimport { SelNodeChild } from '../../shared/models/RTLconfig';\n\n@Component({\n selector: 'rtl-transactions',\n templateUrl: './transactions.component.html',\n styleUrls: ['./transactions.component.scss']\n})\nexport class TransactionsComponent implements OnInit, OnDestroy {\n\n faExchangeAlt = faExchangeAlt;\n faChartPie = faChartPie;\n currencyUnits: string[] = [];\n balances = [{ title: 'Local Capacity', dataValue: 0, tooltip: 'Amount you can send' }, { title: 'Remote Capacity', dataValue: 0, tooltip: 'Amount you can receive' }];\n public links = [{ link: 'payments', name: 'Payments' }, { link: 'invoices', name: 'Invoices' }, { link: 'lookuptransactions', name: 'Lookup' }];\n public activeLink = this.links[0].link;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject()];\n\n constructor(private logger: LoggerService, private store: Store<RTLState>, private router: Router) { }\n\n ngOnInit() {\n const linkFound = this.links.find((link) => this.router.url.includes(link.link));\n this.activeLink = linkFound ? linkFound.link : this.links[0].link;\n this.router.events.pipe(takeUntil(this.unSubs[0]), filter((e) => e instanceof ResolveEnd)).\n subscribe({\n next: (value: ResolveEnd | Event) => {\n const linkFound = this.links.find((link) => (<ResolveEnd>value).urlAfterRedirects.includes(link.link));\n this.activeLink = linkFound ? linkFound.link : this.links[0].link;\n }\n });\n this.store.select(channels).pipe(takeUntil(this.unSubs[1]),\n withLatestFrom(this.store.select(lndNodeSettings))).\n subscribe(([channelsSelector, nodeSettings]: [{ channels: Channel[], channelsSummary: ChannelsSummary, lightningBalance: LightningBalance, apiCallStatus: ApiCallStatusPayload }, (SelNodeChild | null)]) => {\n this.currencyUnits = nodeSettings?.currencyUnits || [];\n if (nodeSettings?.userPersona === UserPersonaEnum.OPERATOR) {\n this.balances = [{ title: 'Local Capacity', dataValue: (channelsSelector.lightningBalance.local || 0), tooltip: 'Amount you can send' }, { title: 'Remote Capacity', dataValue: (channelsSelector.lightningBalance.remote || 0), tooltip: 'Amount you can receive' }];\n } else {\n this.balances = [{ title: 'Outbound Capacity', dataValue: (channelsSelector.lightningBalance.local || 0), tooltip: 'Amount you can send' }, { title: 'Inbound Capacity', dataValue: (channelsSelector.lightningBalance.remote || 0), tooltip: 'Amount you can receive' }];\n }\n this.logger.info(channelsSelector);\n });\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"row wrap\" fxLayoutAlign=\"start center\" class=\"page-title-container\">\n <fa-icon class=\"page-title-img mr-1\" [icon]=\"faSearch\"></fa-icon>\n <span class=\"page-title\">Graph Lookups</span>\n</div>\n<div fxLayout=\"column\" class=\"padding-gap-x\">\n <mat-card>\n <mat-card-content fxLayout=\"column\">\n <nav mat-tab-nav-bar mat-stretch-tabs=\"false\" mat-align-tabs=\"start\" [tabPanel]=\"tabPanel\">\n <div *ngFor=\"let link of links\" mat-tab-link class=\"mat-tab-label\" [active]=\"activeLink === link.link\" routerLink=\"{{link.link}}\" (click)=\"activeLink = link.link\">{{link.name}}</div>\n </nav>\n <mat-tab-nav-panel #tabPanel></mat-tab-nav-panel>\n <div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between stretch\" class=\"mat-tab-body-wrapper\">\n <router-outlet></router-outlet>\n </div>\n </mat-card-content>\n </mat-card>\n</div>\n ","import { Component, OnInit, OnDestroy } from '@angular/core';\nimport { Router, ResolveEnd, Event } from '@angular/router';\nimport { Subject } from 'rxjs';\nimport { takeUntil, filter } from 'rxjs/operators';\nimport { faSearch } from '@fortawesome/free-solid-svg-icons';\n\n@Component({\n selector: 'rtl-graph',\n templateUrl: './graph.component.html',\n styleUrls: ['./graph.component.scss']\n})\nexport class GraphComponent implements OnInit, OnDestroy {\n\n faSearch = faSearch;\n public links = [{ link: 'lookups', name: 'Lookup' }, { link: 'queryroutes', name: 'Query Routes' }];\n public activeLink = this.links[0].link;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject()];\n\n constructor(private router: Router) { }\n\n ngOnInit() {\n const linkFound = this.links.find((link) => this.router.url.includes(link.link));\n this.activeLink = linkFound ? linkFound.link : this.links[0].link;\n this.router.events.pipe(takeUntil(this.unSubs[0]), filter((e) => e instanceof ResolveEnd)).\n subscribe({\n next: (value: ResolveEnd | Event) => {\n const linkFound = this.links.find((link) => (<ResolveEnd>value).urlAfterRedirects.includes(link.link));\n this.activeLink = linkFound ? linkFound.link : this.links[0].link;\n }\n });\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"column\" fxFlex=\"100\" class=\"padding-gap\">\n <form #queryRoutesForm=\"ngForm\" fxLayout=\"column\" fxLayoutAlign=\"space-between stretch\" fxLayout.gt-sm=\"row wrap\" (ngSubmit)=\"queryRoutesForm.form.valid && onQueryRoutes()\">\n <div fxFlex=\"100\" class=\"alert alert-warn\">\n <fa-icon class=\"mr-1 alert-icon\" [icon]=\"faExclamationTriangle\"></fa-icon>\n <span>The actual routing fee on a payment can be different from the fee shown on query routes.</span>\n </div>\n <mat-form-field fxFlex=\"69\" fxLayoutAlign=\"start end\">\n <input #destPubkey=\"ngModel\" matInput placeholder=\"Destination Pubkey\" name=\"destinationPubkey\" tabindex=\"1\" required [(ngModel)]=\"destinationPubkey\">\n <mat-error *ngIf=\"!destinationPubkey\">Destination pubkey is required.</mat-error>\n </mat-form-field>\n <mat-form-field fxFlex=\"29\" fxLayoutAlign=\"start end\">\n <input matInput placeholder=\"Amount (Sats)\" name=\"amount\" tabindex=\"2\" type=\"number\" required [step]=\"1000\" [min]=\"0\" [(ngModel)]=\"amount\">\n <mat-error *ngIf=\"!amount\">Amount is required.</mat-error>\n </mat-form-field>\n <div fxLayout=\"row\" class=\"mt-1\">\n <button class=\"mr-1\" mat-stroked-button color=\"primary\" tabindex=\"3\" type=\"reset\" (click)=\"resetData()\">Clear</button>\n <button mat-flat-button color=\"primary\" type=\"submit\" tabindex=\"4\">Query Route</button>\n </div>\n </form>\n <div fxLayout=\"column\" fxLayoutAlign=\"start stretch\" fxLayout.gt-sm=\"row wrap\" class=\"page-sub-title-container mt-3 mb-1\">\n <div fxFlex=\"70\" fxLayoutAlign=\"start center\">\n <fa-icon class=\"page-title-img mr-1\" [icon]=\"faRoute\"></fa-icon>\n <span class=\"page-title\">Transaction Route</span>\n </div>\n </div>\n <div class=\"table-container mb-6\" [perfectScrollbar]>\n <mat-progress-bar *ngIf=\"flgLoading[0]===true\" mode=\"indeterminate\"></mat-progress-bar>\n <table #table mat-table matSort [dataSource]=\"qrHops\" [ngClass]=\"{'overflow-auto error-border': flgLoading[0]==='error','overflow-auto': true}\">\n <ng-container matColumnDef=\"hop_sequence\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Hop</th>\n <td *matCellDef=\"let hop\" mat-cell>{{hop?.hop_sequence}}</td>\n </ng-container>\n <ng-container matColumnDef=\"pubkey_alias\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Peer</th>\n <td *matCellDef=\"let hop\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{hop?.pubkey_alias}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"pub_key\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Peer Pubkey</th>\n <td *matCellDef=\"let hop\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{hop?.pub_key}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"chan_id\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Channel ID</th>\n <td *matCellDef=\"let hop\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{hop?.chan_id}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"tlv_payload\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>TLV Payload</th>\n <td *matCellDef=\"let hop\" mat-cell>{{hop?.tlv_payload ? 'Yes' : 'No'}}</td>\n </ng-container>\n <ng-container matColumnDef=\"expiry\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Expiry</th>\n <td *matCellDef=\"let hop\" mat-cell><span fxLayoutAlign=\"end center\">{{hop?.expiry | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"chan_capacity\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Capacity (Sats)</th>\n <td *matCellDef=\"let hop\" mat-cell><span fxLayoutAlign=\"end center\">{{hop?.chan_capacity | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"amt_to_forward_msat\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Amount To Fwd (Sats)</th>\n <td *matCellDef=\"let hop\" mat-cell><span fxLayoutAlign=\"end center\">{{hop?.amt_to_forward | number}}\n </span></td>\n </ng-container>\n <ng-container matColumnDef=\"fee_msat\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Fee (mSats)</th>\n <td *matCellDef=\"let hop\" mat-cell><span fxLayoutAlign=\"end center\">{{hop?.fee_msat | number}} </span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"actions\">\n <th *matHeaderCellDef mat-header-cell>\n <div class=\"bordered-box table-actions-select\" fxLayoutAlign=\"center center\">Actions</div> \n </th>\n <td *matCellDef=\"let hop\" mat-cell fxLayoutAlign=\"end center\">\n <button mat-stroked-button color=\"primary\" type=\"button\" tabindex=\"4\" class=\"table-actions-button\" (click)=\"onHopClick(hop, $event)\">View Info</button> \n </td>\n </ng-container>\n <tr *matHeaderRowDef=\"displayedColumns\" mat-header-row></tr>\n <tr *matRowDef=\"let row; columns: displayedColumns;\" mat-row></tr>\n </table>\n </div>\n</div>\n","import { Component, OnInit, OnDestroy, ViewChild } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { faRoute, faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';\nimport { CommonService } from '../../../shared/services/common.service';\nimport { MatSort } from '@angular/material/sort';\nimport { MatTableDataSource } from '@angular/material/table';\n\nimport { Hop } from '../../../shared/models/lndModels';\nimport { AlertTypeEnum, DataTypeEnum, LND_DEFAULT_PAGE_SETTINGS, PAGE_SIZE, ScreenSizeEnum, SortOrderEnum } from '../../../shared/services/consts-enums-functions';\n\nimport { LNDEffects } from '../../store/lnd.effects';\nimport { RTLState } from '../../../store/rtl.state';\nimport { openAlert } from '../../../store/rtl.actions';\nimport { getQueryRoutes } from '../../store/lnd.actions';\nimport { PageSettings, TableSetting } from '../../../shared/models/pageSettings';\nimport { lndPageSettings } from '../../store/lnd.selector';\nimport { ApiCallStatusPayload } from '../../../shared/models/apiCallsPayload';\nimport { LoggerService } from '../../../shared/services/logger.service';\n\n@Component({\n selector: 'rtl-query-routes',\n templateUrl: './query-routes.component.html',\n styleUrls: ['./query-routes.component.scss']\n})\nexport class QueryRoutesComponent implements OnInit, OnDestroy {\n\n @ViewChild(MatSort, { static: false }) sort: MatSort | undefined;\n public colWidth = '20rem';\n public PAGE_ID = 'graph_lookup';\n public tableSetting: TableSetting = { tableId: 'query_routes', recordsPerPage: PAGE_SIZE, sortBy: 'hop_sequence', sortOrder: SortOrderEnum.ASCENDING };\n public destinationPubkey = '';\n public amount = null;\n public qrHops: any = new MatTableDataSource([]);\n public displayedColumns: any[] = [];\n public flgLoading: Array<Boolean | 'error'> = [false]; // 0: peers\n public faRoute = faRoute;\n public faExclamationTriangle = faExclamationTriangle;\n public screenSize = '';\n public screenSizeEnum = ScreenSizeEnum;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject()];\n\n constructor(private logger: LoggerService, private store: Store<RTLState>, private lndEffects: LNDEffects, private commonService: CommonService) {\n this.screenSize = this.commonService.getScreenSize();\n }\n\n ngOnInit() {\n this.store.select(lndPageSettings).pipe(takeUntil(this.unSubs[0])).\n subscribe((settings: { pageSettings: PageSettings[], apiCallStatus: ApiCallStatusPayload }) => {\n this.tableSetting = settings.pageSettings.find((page) => page.pageId === this.PAGE_ID)?.tables.find((table) => table.tableId === this.tableSetting.tableId) || LND_DEFAULT_PAGE_SETTINGS.find((page) => page.pageId === this.PAGE_ID)?.tables.find((table) => table.tableId === this.tableSetting.tableId)!;\n if (this.screenSize === ScreenSizeEnum.XS || this.screenSize === ScreenSizeEnum.SM) {\n this.displayedColumns = JSON.parse(JSON.stringify(this.tableSetting.columnSelectionSM));\n } else {\n this.displayedColumns = JSON.parse(JSON.stringify(this.tableSetting.columnSelection));\n }\n this.displayedColumns.push('actions');\n this.colWidth = this.displayedColumns.length ? ((this.commonService.getContainerSize().width / this.displayedColumns.length) / 10) + 'rem' : '20rem';\n this.logger.info(this.displayedColumns);\n });\n this.lndEffects.setQueryRoutes.pipe(takeUntil(this.unSubs[1])).subscribe((queryRoute) => {\n this.qrHops = new MatTableDataSource([]);\n if (queryRoute.routes && queryRoute.routes.length && queryRoute.routes.length > 0 && queryRoute.routes[0].hops) {\n this.flgLoading[0] = false;\n this.qrHops = new MatTableDataSource<Hop>([...queryRoute.routes[0].hops]);\n this.qrHops.data = queryRoute.routes[0].hops;\n } else {\n this.flgLoading[0] = 'error';\n }\n this.qrHops.sort = this.sort;\n this.qrHops.sortingDataAccessor = (data: any, sortHeaderId: string) => ((data[sortHeaderId] && isNaN(data[sortHeaderId])) ? data[sortHeaderId].toLocaleLowerCase() : data[sortHeaderId] ? +data[sortHeaderId] : null);\n this.qrHops.sort?.sort({ id: this.tableSetting.sortBy, start: this.tableSetting.sortOrder, disableClear: true });\n });\n }\n\n onQueryRoutes(): boolean | void {\n if (!this.destinationPubkey || !this.amount) {\n return true;\n }\n this.qrHops = new MatTableDataSource([]);\n this.flgLoading[0] = true;\n this.store.dispatch(getQueryRoutes({ payload: { destPubkey: this.destinationPubkey, amount: this.amount } }));\n }\n\n resetData() {\n this.destinationPubkey = '';\n this.amount = null;\n this.flgLoading[0] = false;\n }\n\n onHopClick(selHop: Hop, event: any) {\n const reorderedHop = [\n [{ key: 'hop_sequence', value: selHop.hop_sequence, title: 'Sequence', width: 33, type: DataTypeEnum.NUMBER },\n { key: 'amt_to_forward', value: selHop.amt_to_forward, title: 'Amount To Forward (Sats)', width: 33, type: DataTypeEnum.NUMBER },\n { key: 'fee_msat', value: selHop.fee_msat, title: 'Fee (mSats)', width: 34, type: DataTypeEnum.NUMBER }],\n [{ key: 'chan_capacity', value: selHop.chan_capacity, title: 'Channel Capacity (Sats)', width: 50, type: DataTypeEnum.NUMBER },\n { key: 'expiry', value: selHop.expiry, title: 'Expiry', width: 50, type: DataTypeEnum.NUMBER }],\n [{ key: 'pubkey_alias', value: selHop.pubkey_alias, title: 'Peer Alias', width: 50, type: DataTypeEnum.STRING },\n { key: 'chan_id', value: selHop.chan_id, title: 'Channel ID', width: 50, type: DataTypeEnum.STRING }],\n [{ key: 'pub_key', value: selHop.pub_key, title: 'Peer Pubkey', width: 100, type: DataTypeEnum.STRING }]\n ];\n this.store.dispatch(openAlert({\n payload: {\n data: {\n type: AlertTypeEnum.INFORMATION,\n alertTitle: 'Route Information',\n message: reorderedHop\n }\n }\n }));\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div *ngIf=\"lookupResult\" fxLayout=\"column\" class=\"mt-1\">\n <mat-divider class=\"mb-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"row\">\n <div fxLayout=\"column\" fxFlex=\"30\" fxLayoutAlign=\"end start\">\n <h4 class=\"font-bold-500\">Channel ID</h4>\n <span class=\"foreground-secondary-text\">{{lookupResult.channel_id}}</span>\n </div>\n <div fxLayout=\"column\" fxFlex=\"70\" fxLayoutAlign=\"end start\">\n <h4 class=\"font-bold-500\">Channel Point</h4>\n <span class=\"foreground-secondary-text\">{{lookupResult.chan_point}}</span>\n </div>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"row\">\n <div fxLayout=\"column\" fxFlex=\"30\" fxLayoutAlign=\"end start\">\n <h4 class=\"font-bold-500\">Last Update</h4>\n <span class=\"foreground-secondary-text\">{{(lookupResult.last_update * 1000) | date:'dd/MMM/y HH:mm'}}</span>\n </div>\n <div fxLayout=\"column\" fxFlex=\"70\" fxLayoutAlign=\"end start\">\n <h4 class=\"font-bold-500\">Capacity (Sats)</h4>\n <span class=\"foreground-secondary-text\">{{lookupResult.capacity | number}}</span>\n </div>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"column\" fxLayoutAlign=\"space-between stretch\" fxLayout.gt-sm=\"row\">\n <div fxLayout=\"column\" fxFlex=\"49\" fxLayoutAlign=\"start start\" class=\"mt-1 bordered-box padding-gap-large\">\n <div fxLayout=\"column\">\n <h3 *ngIf=\"!node1_match\" class=\"page-title font-bold-500\">Node 1</h3>\n <h3 *ngIf=\"node1_match\" class=\"page-title font-bold-500\">Node 1 (Your Node)</h3>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"column\" fxFlex=\"20\">\n <h4 class=\"font-bold-500\">Pubkey</h4>\n <span class=\"foreground-secondary-text\">{{lookupResult.node1_pub}}</span>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"column\" fxFlex=\"10\">\n <h4 class=\"font-bold-500\">Time Lock Delta</h4>\n <span class=\"foreground-secondary-text\">{{lookupResult.node1_policy?.time_lock_delta}}</span>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"column\" fxFlex=\"10\">\n <h4 class=\"font-bold-500\">Min HTLC</h4>\n <span class=\"foreground-secondary-text\">{{lookupResult.node1_policy?.min_htlc}}</span>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"column\" fxFlex=\"10\">\n <h4 class=\"font-bold-500\">Max HTLC</h4>\n <span class=\"foreground-secondary-text\">{{lookupResult.node1_policy?.max_htlc_msat}}</span>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"column\" fxFlex=\"10\">\n <h4 class=\"font-bold-500\">Fee Base Msat</h4>\n <span class=\"foreground-secondary-text\">{{lookupResult.node1_policy?.fee_base_msat}}</span>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"column\" fxFlex=\"10\">\n <h4 class=\"font-bold-500\">Fee Rate Milli Msat</h4>\n <span class=\"foreground-secondary-text\">{{lookupResult.node1_policy?.fee_rate_milli_msat}}</span>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"column\" fxFlex=\"10\">\n <h4 class=\"font-bold-500\">Disabled</h4>\n <span class=\"foreground-secondary-text\">{{lookupResult.node1_policy?.disabled ? 'Yes' : 'No'}}</span>\n </div>\n </div>\n <div fxLayout=\"column\" fxFlex=\"49\" fxLayoutAlign=\"start start\" class=\"mt-1 bordered-box padding-gap-large\">\n <div>\n <h3 *ngIf=\"!node2_match\" class=\"page-title font-bold-500\">Node 2</h3>\n <h3 *ngIf=\"node2_match\" class=\"page-title font-bold-500\">Node 2 (Your Node)</h3>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"column\" fxFlex=\"20\">\n <h4 class=\"font-bold-500\">Pubkey</h4>\n <span class=\"foreground-secondary-text\">{{lookupResult.node2_pub}}</span>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"column\" fxFlex=\"10\">\n <h4 class=\"font-bold-500\">Time Lock Delta</h4>\n <span class=\"foreground-secondary-text\">{{lookupResult.node2_policy?.time_lock_delta}}</span>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"column\" fxFlex=\"10\">\n <h4 class=\"font-bold-500\">Min HTLC</h4>\n <span class=\"foreground-secondary-text\">{{lookupResult.node2_policy?.min_htlc}}</span>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"column\" fxFlex=\"10\">\n <h4 class=\"font-bold-500\">Max HTLC</h4>\n <span class=\"foreground-secondary-text\">{{lookupResult.node2_policy?.max_htlc_msat}}</span>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"column\" fxFlex=\"10\">\n <h4 class=\"font-bold-500\">Fee Base Msat</h4>\n <span class=\"foreground-secondary-text\">{{lookupResult.node2_policy?.fee_base_msat}}</span>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"column\" fxFlex=\"10\">\n <h4 class=\"font-bold-500\">Fee Rate Milli Msat</h4>\n <span class=\"foreground-secondary-text\">{{lookupResult.node2_policy?.fee_rate_milli_msat}}</span>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"column\" fxFlex=\"10\">\n <h4 class=\"font-bold-500\">Disabled</h4>\n <span class=\"foreground-secondary-text\">{{lookupResult.node2_policy?.disabled ? 'Yes' : 'No'}}</span>\n </div>\n </div>\n </div>\n</div>\n","import { Component, OnInit, Input } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\n\nimport { ChannelEdge, GetInfo } from '../../../../shared/models/lndModels';\nimport { RTLState } from '../../../../store/rtl.state';\nimport { lndNodeInformation } from '../../../store/lnd.selector';\n\n@Component({\n selector: 'rtl-channel-lookup',\n templateUrl: './channel-lookup.component.html',\n styleUrls: ['./channel-lookup.component.scss']\n})\nexport class ChannelLookupComponent implements OnInit {\n\n @Input() lookupResult: ChannelEdge;\n public node1_match = false;\n public node2_match = false;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject()];\n\n constructor(private store: Store<RTLState>) { }\n\n ngOnInit() {\n this.store.select(lndNodeInformation).pipe(takeUntil(this.unSubs[0])).subscribe((nodeInfo: GetInfo) => {\n if (this.lookupResult.node1_pub === nodeInfo.identity_pubkey) {\n this.node1_match = true;\n }\n if (this.lookupResult.node2_pub === nodeInfo.identity_pubkey) {\n this.node2_match = true;\n }\n });\n }\n\n}\n","<div *ngIf=\"lookupResult\" fxLayout=\"column\" class=\"mt-1\">\n <mat-divider class=\"mb-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"row\">\n <div fxFlex=\"30\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Alias</h4>\n <span class=\"foreground-secondary-text\">{{lookupResult.node.alias}}<span class=\"ml-2\" [ngStyle]=\"{'background-color': lookupResult.node?.color}\">{{lookupResult.node?.color}}</span></span>\n </div>\n <div fxFlex=\"70\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Pub Key</h4>\n <span class=\"foreground-secondary-text w-100\">{{lookupResult.node.pub_key}}</span>\n </div>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"row\">\n <div fxFlex=\"30\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Last Update</h4>\n <span class=\"foreground-secondary-text\">{{(lookupResult.node.last_update * 1000) | date:'dd/MMM/y HH:mm'}}</span>\n </div>\n <div fxFlex=\"70\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Total Capacity (Sats)</h4>\n <span class=\"foreground-secondary-text\">{{lookupResult.total_capacity | number}}</span>\n </div>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"row\">\n <div fxFlex=\"30\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Number of Channels</h4>\n <span class=\"foreground-secondary-text\">{{lookupResult.num_channels | number}}</span>\n </div>\n <div fxLayout=\"column\" fxFlex=\"70\" fxLayoutAlign=\"end start\" class=\"my-1\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Features</h4>\n <span *ngFor=\"let feature of lookupResult.node.features | keyvalue\" class=\"foreground-secondary-text w-100\">{{nodeFeaturesEnum[feature.value.name] || feature.value.name}}: {{feature.value.is_required ? 'Mandatory' : 'Optional'}}</span>\n </div>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"column\">\n <h4 fxFlex=\"100\" fxLayoutAlign=\"start\" class=\"font-bold-500 mb-1\">Addresses</h4>\n <div fxLayout=\"row\" fxFlex=\"100\" class=\"table-container\" [perfectScrollbar]>\n <table #table mat-table matSort [dataSource]=\"lookupResult.node.addresses\">\n <ng-container matColumnDef=\"network\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Network</th>\n <td *matCellDef=\"let address\" mat-cell>{{address?.network}}</td>\n </ng-container>\n <ng-container matColumnDef=\"addr\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Address</th>\n <td *matCellDef=\"let address\" mat-cell>{{address?.addr}}</td>\n </ng-container>\n <ng-container matColumnDef=\"actions\">\n <th *matHeaderCellDef mat-header-cell>\n <div class=\"bordered-box table-actions-select btn-action\" fxLayoutAlign=\"center center\">Actions</div>\n </th>\n <td *matCellDef=\"let address\" mat-cell>\n <span fxLayoutAlign=\"end center\">\n <button mat-stroked-button class=\"btn-action-copy\" color=\"primary\" type=\"button\" tabindex=\"1\" rtlClipboard [payload]=\"lookupResult.node.pub_key + '@' + address.addr\" (copied)=\"onCopyNodeURI($event)\">Copy Node URI</button> \n </span>\n </td>\n </ng-container>\n <tr *matHeaderRowDef=\"displayedColumns;\" mat-header-row></tr>\n <tr *matRowDef=\"let row; columns: displayedColumns;\" mat-row></tr> \n </table>\n </div>\n </div>\n</div>\n","import { Component, Input } from '@angular/core';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\nimport { GraphNode } from '../../../../shared/models/lndModels';\nimport { NodeFeaturesLND } from '../../../../shared/services/consts-enums-functions';\nimport { LoggerService } from '../../../../shared/services/logger.service';\n\n@Component({\n selector: 'rtl-node-lookup',\n templateUrl: './node-lookup.component.html',\n styleUrls: ['./node-lookup.component.scss']\n})\nexport class NodeLookupComponent {\n\n @Input() lookupResult: GraphNode;\n public nodeFeaturesEnum = NodeFeaturesLND;\n public displayedColumns = ['network', 'addr', 'actions'];\n\n constructor(private logger: LoggerService, private snackBar: MatSnackBar) { }\n\n onCopyNodeURI(payload: string) {\n this.snackBar.open('Node URI copied.');\n this.logger.info('Copied Text: ' + payload);\n }\n\n}\n","<div fxLayout=\"column\">\n <div fxLayout=\"row\" fxFlex=\"100\" fxLayoutAlign=\"start start\" class=\"padding-gap\">\n <mat-card-content fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between stretch\">\n <form #form=\"ngForm\" fxFlex=\"100\" fxLayout=\"column\" fxLayout.gt-sm=\"row wrap\" fxLayoutAlign.gt-sm=\"space-between center\" fxLayoutAlign=\"start space-between\" class=\"w-100\">\n <div fxFlex=\"100\" fxLayoutAlign=\"start end\">\n <mat-radio-group color=\"primary\" tabindex=\"1\" name=\"lookupField\" [(ngModel)]=\"selectedFieldId\" (change)=\"onSelectChange($event)\">\n <mat-radio-button *ngFor=\"let lookupField of lookupFields\" class=\"mr-4\" [value]=\"lookupField.id\" [checked]=\"selectedFieldId === lookupField.id\">\n {{lookupField.name}}\n </mat-radio-button>\n </mat-radio-group>\n </div>\n <mat-form-field fxFlex=\"100\" fxLayoutAlign=\"start end\" [ngClass]=\"{'mt-1': true, 'mt-2': screenSize === screenSizeEnum.XS || screenSize === screenSizeEnum.SM}\">\n <input #key matInput name=\"lookupKey\" tabindex=\"2\" required [placeholder]=\"lookupFields[selectedFieldId]?.placeholder || 'Lookup Key'\" [(ngModel)]=\"lookupKey\" (change)=\"clearLookupValue()\">\n <mat-error *ngIf=\"!lookupKey\">{{lookupFields[selectedFieldId]?.placeholder}} is required.</mat-error>\n </mat-form-field>\n <div fxLayout=\"row\" fxFlex=\"100\" class=\"mt-1\">\n <button class=\"mr-1\" mat-stroked-button color=\"primary\" tabindex=\"3\" type=\"button\" (click)=\"resetData()\">Clear</button>\n <button mat-flat-button color=\"primary\" tabindex=\"4\" type=\"submit\" (click)=\"onLookup()\">Lookup</button>\n </div>\n </form>\n <div *ngIf=\"errorMessage !== ''\" fxFlex=\"100\" fxLayout=\"row wrap\" fxLayoutAlign=\"space-between center\" [ngClass]=\"{'w-100 mt-2 p-2 error-border': errorMessage !== '' && errorMessage !== 'Getting lookup details...', 'w-100 my-2 p-2': true}\">\n <mat-progress-bar *ngIf=\"errorMessage === 'Getting lookup details...'\" mode=\"indeterminate\"></mat-progress-bar>\n {{errorMessage}}\n </div>\n <div *ngIf=\"errorMessage === '' && lookupValue && flgSetLookupValue\" fxFlex=\"100\" fxLayout=\"column\" fxLayout.gt-sm=\"row wrap\" fxLayoutAlign.gt-sm=\"space-between center\" fxLayoutAlign=\"start stretch\" class=\"w-100 mt-2\">\n <div fxLayout=\"row\" fxFlex=\"100\" fxLayoutAlign=\"start center\">\n <span class=\"page-title font-bold-500\">{{lookupFields[selectedFieldId].name}} Details</span>\n </div>\n <div fxLayout=\"row\" fxFlex=\"100\" fxLayoutAlign=\"start center\" [ngSwitch]=\"selectedFieldId\">\n <span *ngSwitchCase=\"0\" fxFlex=\"100\"><rtl-node-lookup [lookupResult]=\"lookupValue\"></rtl-node-lookup></span>\n <span *ngSwitchCase=\"1\" fxFlex=\"100\"><rtl-channel-lookup [lookupResult]=\"lookupValue\"></rtl-channel-lookup></span>\n <span *ngSwitchDefault> fxFlex=\"100\"<h3>Error! Unable to find details!</h3></span>\n </div>\n </div> \n </mat-card-content>\n </div>\n</div>\n","import { Component, OnInit, OnDestroy } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil, filter } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { Actions } from '@ngrx/effects';\nimport { faSearch } from '@fortawesome/free-solid-svg-icons';\n\nimport { APICallStatusEnum, LNDActions, ScreenSizeEnum, UI_MESSAGES } from '../../../shared/services/consts-enums-functions';\nimport { CommonService } from '../../../shared/services/common.service';\nimport { LoggerService } from '../../../shared/services/logger.service';\n\nimport { RTLState } from '../../../store/rtl.state';\nimport { channelLookup, peerLookup } from '../../store/lnd.actions';\n\n@Component({\n selector: 'rtl-lookups',\n templateUrl: './lookups.component.html',\n styleUrls: ['./lookups.component.scss']\n})\nexport class LookupsComponent implements OnInit, OnDestroy {\n\n public lookupKey = '';\n public lookupValue = {};\n public flgSetLookupValue = false;\n public messageObj = [];\n public selectedFieldId = 0;\n public lookupFields = [\n { id: 0, name: 'Node', placeholder: 'Pubkey' },\n { id: 1, name: 'Channel', placeholder: 'Channel ID' }\n ];\n public faSearch = faSearch;\n public screenSize = '';\n public screenSizeEnum = ScreenSizeEnum;\n public errorMessage = '';\n public apiCallStatusEnum = APICallStatusEnum;\n private unSubs: Array<Subject<void>> = [new Subject()];\n\n constructor(private logger: LoggerService, private commonService: CommonService, private store: Store<RTLState>, private actions: Actions) {\n this.screenSize = this.commonService.getScreenSize();\n }\n\n ngOnInit() {\n this.actions.pipe(takeUntil(this.unSubs[0]), filter((action) => (action.type === LNDActions.SET_LOOKUP_LND || action.type === LNDActions.UPDATE_API_CALL_STATUS_LND))).\n subscribe((resLookup: any) => {\n if (resLookup.type === LNDActions.SET_LOOKUP_LND) {\n this.errorMessage = (this.selectedFieldId === 0 && resLookup.payload.hasOwnProperty('node')) ? '' : (this.selectedFieldId === 1 && resLookup.payload.hasOwnProperty('channel_id')) ? '' : this.errorMessage;\n this.lookupValue = JSON.parse(JSON.stringify(resLookup.payload));\n this.flgSetLookupValue = (this.selectedFieldId === 0 && resLookup.payload.hasOwnProperty('node')) ? true : !!((this.selectedFieldId === 1 && resLookup.payload.hasOwnProperty('channel_id')));\n this.logger.info(this.lookupValue);\n }\n if (resLookup.type === LNDActions.UPDATE_API_CALL_STATUS_LND && resLookup.payload.action === 'Lookup') {\n this.errorMessage = '';\n if (resLookup.payload.status === APICallStatusEnum.ERROR) {\n this.errorMessage = (typeof (resLookup.payload.message) === 'object') ? JSON.stringify(resLookup.payload.message) : resLookup.payload.message;\n }\n if (resLookup.payload.status === APICallStatusEnum.INITIATED) {\n this.errorMessage = UI_MESSAGES.GET_LOOKUP_DETAILS;\n }\n }\n });\n }\n\n onLookup(): boolean | void {\n if (!this.lookupKey) {\n return true;\n }\n this.flgSetLookupValue = false;\n this.lookupValue = {};\n switch (this.selectedFieldId) {\n case 0:\n this.store.dispatch(peerLookup({ payload: this.lookupKey.trim() }));\n break;\n case 1:\n this.store.dispatch(channelLookup({ payload: { uiMessage: UI_MESSAGES.SEARCHING_CHANNEL, channelID: this.lookupKey.trim() } }));\n break;\n default:\n break;\n }\n }\n\n onSelectChange(event: any) {\n this.resetData();\n this.selectedFieldId = event.value;\n }\n\n resetData() {\n this.flgSetLookupValue = false;\n this.selectedFieldId = 0;\n this.lookupKey = '';\n this.lookupValue = {};\n this.errorMessage = '';\n }\n\n clearLookupValue() {\n this.lookupValue = {};\n this.flgSetLookupValue = false;\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"column\">\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" class=\"page-title-container\">\n <fa-icon class=\"page-title-img mr-1\" [icon]=\"faMapSigns\"></fa-icon>\n <span class=\"page-title\">Routing</span>\n </div>\n <div fxLayout=\"row\" fxFlex=\"100\" fxLayoutAlign=\"start start\" class=\"padding-gap-x\">\n <mat-card fxLayout=\"row\" fxFlex=\"100\" fxLayoutAlign=\"start start\">\n <mat-card-content fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"start stretch\" class=\"card-content-gap mt-1\">\n <form #routingForm=\"ngForm\" fxFlex=\"100\" fxLayout=\"column\" fxLayout.gt-sm=\"row wrap\" fxLayoutAlign.gt-sm=\"space-between center\" fxLayoutAlign=\"start stretch\" class=\"w-100 mb-1\" (ngSubmit)=\"onEventsFetch()\">\n <div fxFlex=\"100\" fxLayoutAlign=\"space-between stretch\">\n <mat-form-field fxFlex=\"49\" fxLayoutAlign=\"start\">\n <input #strtDate=\"ngModel\" matInput placeholder=\"Start Date\" name=\"startDate\"\n tabindex=\"1\" [matDatepicker]=\"startDatepicker\" [max]=\"today\" [(ngModel)]=\"startDate\">\n <mat-datepicker-toggle matSuffix [for]=\"startDatepicker\"></mat-datepicker-toggle>\n <mat-datepicker #startDatepicker [startAt]=\"startDate\"></mat-datepicker>\n <mat-error *ngIf=\"strtDate.errors\">Invalid date format.</mat-error>\n </mat-form-field>\n <mat-form-field fxFlex=\"49\" fxLayoutAlign=\"start\">\n <input #enDate=\"ngModel\" matInput placeholder=\"End Date\" name=\"endDate\" tabindex=\"2\" [matDatepicker]=\"endDatepicker\"\n [min]=\"startDate\" [max]=\"today\" [(ngModel)]=\"endDate\">\n <mat-datepicker-toggle matSuffix [for]=\"endDatepicker\"></mat-datepicker-toggle>\n <mat-datepicker #endDatepicker [startAt]=\"endDate\"></mat-datepicker>\n <mat-error *ngIf=\"enDate.errors\">Invalid date format.</mat-error>\n </mat-form-field>\n </div>\n <div fxLayout=\"row\" class=\"mt-2\">\n <button class=\"mr-1\" mat-stroked-button color=\"primary\" tabindex=\"3\" type=\"reset\" (click)=\"resetData()\">Clear</button>\n <button mat-flat-button color=\"primary\" type=\"submit\" tabindex=\"4\">Fetch Events</button>\n </div>\n </form>\n <div fxLayout=\"row\" fxFlex=\"100\">\n <nav mat-tab-nav-bar mat-stretch-tabs=\"false\" mat-align-tabs=\"start\" fxFlex=\"100\" [tabPanel]=\"tabPanel\">\n <div *ngFor=\"let link of links\" mat-tab-link class=\"mat-tab-label\" [active]=\"activeLink === link.link\" routerLink=\"{{link.link}}\" (click)=\"activeLink = link.link\">{{link.name}}</div>\n </nav>\n <mat-tab-nav-panel #tabPanel></mat-tab-nav-panel>\n <!-- <nav mat-tab-nav-bar mat-stretch-tabs=\"false\" mat-align-tabs=\"start\" fxFlex=\"100\">\n <div role=\"tab\" mat-tab-link *ngFor=\"let link of links\" class=\"mat-tab-label\" [active]=\"activeLink === link.link\" (click)=\"activeLink = link.link\" routerLink=\"{{link.link}}\">{{link.name}}</div>\n </nav> -->\n </div>\n <div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"start stretch\">\n <router-outlet></router-outlet>\n </div>\n </mat-card-content>\n </mat-card>\n </div>\n</div>\n","import { Component, OnInit, OnDestroy } from '@angular/core';\nimport { Router, ResolveEnd, Event } from '@angular/router';\nimport { Subject } from 'rxjs';\nimport { takeUntil, filter } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { faMapSigns } from '@fortawesome/free-solid-svg-icons';\n\nimport { RTLState } from '../../store/rtl.state';\nimport { getForwardingHistory, setForwardingHistory } from '../store/lnd.actions';\nimport { LoggerService } from '../../shared/services/logger.service';\n\n@Component({\n selector: 'rtl-routing',\n templateUrl: './routing.component.html',\n styleUrls: ['./routing.component.scss']\n})\nexport class RoutingComponent implements OnInit, OnDestroy {\n\n public faMapSigns = faMapSigns;\n public today = new Date(Date.now());\n public lastMonthDay = new Date(this.today.getFullYear(), this.today.getMonth() - 1, this.today.getDate() + 1, 0, 0, 0);\n public yesterday = new Date(this.today.getFullYear(), this.today.getMonth(), this.today.getDate() - 1, 0, 0, 0);\n public endDate = this.today;\n public startDate = this.lastMonthDay;\n public links = [{ link: 'forwardinghistory', name: 'Forwarding History' }, { link: 'peers', name: 'Routing Peers' }, { link: 'nonroutingprs', name: 'Non Routing Peers' }];\n public activeLink = this.links[0].link;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject()];\n\n constructor(private logger: LoggerService, private store: Store<RTLState>, private router: Router) { }\n\n ngOnInit() {\n this.onEventsFetch();\n const linkFound = this.links.find((link) => this.router.url.includes(link.link));\n this.activeLink = linkFound ? linkFound.link : this.links[0].link;\n this.router.events.pipe(takeUntil(this.unSubs[0]), filter((e) => e instanceof ResolveEnd)).\n subscribe({\n next: (value: ResolveEnd | Event) => {\n const linkFound = this.links.find((link) => (<ResolveEnd>value).urlAfterRedirects.includes(link.link));\n this.activeLink = linkFound ? linkFound.link : this.links[0].link;\n }\n });\n }\n\n onEventsFetch() {\n this.store.dispatch(setForwardingHistory({ payload: { forwarding_events: [] } }));\n if (!this.endDate) {\n this.endDate = this.today;\n }\n if (!this.startDate) {\n this.startDate = new Date(this.endDate.getFullYear(), this.endDate.getMonth() - 1, this.endDate.getDate() + 1, 0, 0, 0);\n }\n this.store.dispatch(getForwardingHistory({\n payload: {\n end_time: Math.round(this.endDate.getTime() / 1000).toString(),\n start_time: Math.round(this.startDate.getTime() / 1000).toString()\n }\n }));\n }\n\n resetData() {\n this.endDate = this.today;\n this.startDate = this.lastMonthDay;\n }\n\n ngOnDestroy() {\n this.resetData();\n this.store.dispatch(setForwardingHistory({ payload: { forwarding_events: [] } }));\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"column\" fxLayoutAlign=\"start stretch\" class=\"padding-gap-x\">\n <div *ngIf=\"errorMessage !== ''\" class=\"p-2 error-border my-2\">{{errorMessage}}</div>\n <div *ngIf=\"errorMessage === ''\" fxLayout=\"column\" fxLayout.gt-xs=\"row\" fxLayoutAlign.gt-xs=\"start center\" fxLayoutAlign=\"start stretch\" class=\"page-sub-title-container\">\n <div fxFlex=\"70\"></div>\n <div fxFlex.gt-xs=\"30\" fxLayoutAlign.gt-xs=\"space-between center\" fxLayout=\"row\" fxLayoutAlign=\"space-between stretch\">\n <mat-form-field fxFlex=\"49\">\n <mat-select placeholder=\"Filter By\" tabindex=\"1\" name=\"filterBy\" [(ngModel)]=\"selFilterBy\" (selectionChange)=\"selFilter=''; applyFilter()\">\n <mat-option *ngFor=\"let column of ['all'].concat(displayedColumns.slice(0, -1))\" [value]=\"column\">{{getLabel(column)}}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field fxFlex=\"49\">\n <input matInput name=\"filter\" placeholder=\"Filter\" [(ngModel)]=\"selFilter\" (input)=\"applyFilter()\" (keyup)=\"applyFilter()\">\n </mat-form-field>\n </div>\n </div>\n <div *ngIf=\"errorMessage === ''\" fxLayout=\"column\" fxLayoutAlign=\"start center\" fxFlex=\"100\" class=\"table-container\" [perfectScrollbar]>\n <mat-progress-bar *ngIf=\"apiCallStatus.status === apiCallStatusEnum.INITIATED\" mode=\"indeterminate\"></mat-progress-bar>\n <table #table mat-table fxFlex=\"100\" matSort class=\"overflow-auto\" [dataSource]=\"forwardingHistoryEvents\">\n <ng-container matColumnDef=\"timestamp\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Timestamp</th>\n <td *matCellDef=\"let fhEvent\" mat-cell>{{(fhEvent.timestamp * 1000) | date:'dd/MMM/y HH:mm'}}</td>\n </ng-container>\n <ng-container matColumnDef=\"alias_in\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Inbound Alias</th>\n <td *matCellDef=\"let fhEvent\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{fhEvent?.alias_in}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"chan_id_in\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Inbound Channel</th>\n <td *matCellDef=\"let fhEvent\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{fhEvent?.chan_id_in}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"alias_out\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Outbound Alias</th>\n <td *matCellDef=\"let fhEvent\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{fhEvent?.alias_out}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"chan_id_out\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Outbound Channel</th>\n <td *matCellDef=\"let fhEvent\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{fhEvent?.chan_id_out}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"amt_in\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Inbound Amount (Sats)</th>\n <td *matCellDef=\"let fhEvent\" mat-cell><span fxLayoutAlign=\"end center\">{{fhEvent.amt_in | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"amt_out\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Outbound Amount (Sats)</th>\n <td *matCellDef=\"let fhEvent\" mat-cell><span fxLayoutAlign=\"end center\">{{fhEvent.amt_out | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"fee_msat\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Fee (mSats)</th>\n <td *matCellDef=\"let fhEvent\" mat-cell><span fxLayoutAlign=\"end center\">{{fhEvent.fee_msat | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"actions\">\n <th *matHeaderCellDef mat-header-cell>\n <div class=\"bordered-box table-actions-select\" fxLayoutAlign=\"center center\">\n <mat-select placeholder=\"Actions\" tabindex=\"1\" class=\"mr-0\">\n <mat-select-trigger></mat-select-trigger>\n <mat-option (click)=\"onDownloadCSV()\">Download CSV</mat-option>\n </mat-select>\n </div>\n </th>\n <td *matCellDef=\"let fhEvent\" mat-cell fxLayoutAlign=\"end center\">\n <button mat-stroked-button color=\"primary\" type=\"button\" tabindex=\"4\" class=\"table-actions-button\" (click)=\"onForwardingEventClick(fhEvent,$event)\">View Info</button> \n </td>\n </ng-container>\n <ng-container matColumnDef=\"no_event\">\n <td *matFooterCellDef mat-footer-cellcolspan=\"4\">\n <p *ngIf=\"(!forwardingHistoryEvents?.data || forwardingHistoryEvents?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.COMPLETED\">No forwarding history available.</p>\n <p *ngIf=\"(!forwardingHistoryEvents?.data || forwardingHistoryEvents?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.INITIATED\">Getting forwarding history...</p>\n <p *ngIf=\"(!forwardingHistoryEvents?.data || forwardingHistoryEvents?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.ERROR\">{{errorMessage}}</p>\n </td>\n </ng-container>\n <tr *matFooterRowDef=\"['no_event']\" mat-footer-row [ngClass]=\"{'display-none': forwardingHistoryEvents?.data && forwardingHistoryEvents?.data?.length>0}\"></tr>\n <tr *matHeaderRowDef=\"displayedColumns\" mat-header-row></tr>\n <tr *matRowDef=\"let row; columns: displayedColumns;\" mat-row></tr>\n </table>\n </div>\n <mat-paginator *ngIf=\"errorMessage === ''\" class=\"mb-1\" [pageSize]=\"pageSize\" [pageSizeOptions]=\"pageSizeOptions\" [showFirstLastButtons]=\"screenSize === screenSizeEnum.XS ? false : true\"></mat-paginator>\n</div>\n","import { Component, OnInit, OnChanges, ViewChild, Input, SimpleChanges, OnDestroy, AfterViewInit } from '@angular/core';\nimport { DatePipe } from '@angular/common';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { MatPaginator, MatPaginatorIntl } from '@angular/material/paginator';\nimport { MatSort } from '@angular/material/sort';\nimport { MatTableDataSource } from '@angular/material/table';\n\nimport { ForwardingEvent, SwitchRes } from '../../../shared/models/lndModels';\nimport { PAGE_SIZE, PAGE_SIZE_OPTIONS, getPaginatorLabel, AlertTypeEnum, DataTypeEnum, ScreenSizeEnum, APICallStatusEnum, SortOrderEnum, LND_DEFAULT_PAGE_SETTINGS, LND_PAGE_DEFS } from '../../../shared/services/consts-enums-functions';\nimport { ApiCallStatusPayload } from '../../../shared/models/apiCallsPayload';\nimport { LoggerService } from '../../../shared/services/logger.service';\nimport { CommonService } from '../../../shared/services/common.service';\nimport { openAlert } from '../../../store/rtl.actions';\n\nimport { RTLState } from '../../../store/rtl.state';\nimport { forwardingHistory, lndPageSettings } from '../../store/lnd.selector';\nimport { ColumnDefinition, PageSettings, TableSetting } from '../../../shared/models/pageSettings';\nimport { CamelCaseWithReplacePipe } from '../../../shared/pipes/app.pipe';\n\n@Component({\n selector: 'rtl-forwarding-history',\n templateUrl: './forwarding-history.component.html',\n styleUrls: ['./forwarding-history.component.scss'],\n providers: [\n { provide: MatPaginatorIntl, useValue: getPaginatorLabel('Events') }\n ]\n})\nexport class ForwardingHistoryComponent implements OnInit, AfterViewInit, OnChanges, OnDestroy {\n\n @ViewChild(MatSort, { static: false }) sort: MatSort | undefined;\n @ViewChild(MatPaginator, { static: false }) paginator: MatPaginator | undefined;\n @Input() pageId = 'routing';\n @Input() tableId = 'forwarding_history';\n @Input() eventsData = [];\n @Input() selFilter = '';\n public nodePageDefs = LND_PAGE_DEFS;\n public selFilterBy = 'all';\n public colWidth = '20rem';\n public tableSetting: TableSetting = { tableId: 'forwarding_history', recordsPerPage: PAGE_SIZE, sortBy: 'timestamp', sortOrder: SortOrderEnum.DESCENDING };\n public forwardingHistoryData: ForwardingEvent[] = [];\n public displayedColumns: any[] = [];\n public forwardingHistoryEvents: any = new MatTableDataSource([]);\n public pageSize = PAGE_SIZE;\n public pageSizeOptions = PAGE_SIZE_OPTIONS;\n public screenSize = '';\n public screenSizeEnum = ScreenSizeEnum;\n public errorMessage = '';\n public apiCallStatus: ApiCallStatusPayload | null = null;\n public apiCallStatusEnum = APICallStatusEnum;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject()];\n\n constructor(private logger: LoggerService, private commonService: CommonService, private store: Store<RTLState>, private datePipe: DatePipe, private camelCaseWithReplace: CamelCaseWithReplacePipe) {\n this.screenSize = this.commonService.getScreenSize();\n }\n\n ngOnInit() {\n this.store.select(lndPageSettings).pipe(takeUntil(this.unSubs[0])).\n subscribe((settings: { pageSettings: PageSettings[], apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessage = '';\n this.apiCallStatus = settings.apiCallStatus;\n if (this.apiCallStatus.status === APICallStatusEnum.ERROR) {\n this.errorMessage = this.apiCallStatus.message || '';\n }\n this.tableSetting.tableId = this.tableId;\n this.tableSetting = settings.pageSettings.find((page) => page.pageId === this.pageId)?.tables.find((table) => table.tableId === this.tableSetting.tableId) || LND_DEFAULT_PAGE_SETTINGS.find((page) => page.pageId === this.pageId)?.tables.find((table) => table.tableId === this.tableSetting.tableId)!;\n if (this.screenSize === ScreenSizeEnum.XS || this.screenSize === ScreenSizeEnum.SM) {\n this.displayedColumns = JSON.parse(JSON.stringify(this.tableSetting.columnSelectionSM));\n } else {\n this.displayedColumns = JSON.parse(JSON.stringify(this.tableSetting.columnSelection));\n }\n this.displayedColumns.push('actions');\n this.pageSize = this.tableSetting.recordsPerPage ? +this.tableSetting.recordsPerPage : PAGE_SIZE;\n this.colWidth = this.displayedColumns.length ? ((this.commonService.getContainerSize().width / this.displayedColumns.length) / 10) + 'rem' : '20rem';\n this.logger.info(this.displayedColumns);\n });\n this.store.select(forwardingHistory).pipe(takeUntil(this.unSubs[1])).\n subscribe((fhSelector: { forwardingHistory: SwitchRes, apiCallStatus: ApiCallStatusPayload }) => {\n if (this.eventsData.length <= 0) {\n this.errorMessage = '';\n this.apiCallStatus = fhSelector.apiCallStatus;\n if (fhSelector.apiCallStatus?.status === APICallStatusEnum.ERROR) {\n this.errorMessage = !this.apiCallStatus.message ? '' : (typeof (this.apiCallStatus.message) === 'object') ? JSON.stringify(this.apiCallStatus.message) : this.apiCallStatus.message;\n }\n this.forwardingHistoryData = fhSelector.forwardingHistory.forwarding_events || [];\n this.loadForwardingEventsTable(this.forwardingHistoryData);\n this.logger.info(fhSelector.apiCallStatus);\n this.logger.info(fhSelector.forwardingHistory);\n }\n });\n }\n\n ngAfterViewInit() {\n setTimeout(() => {\n if (this.forwardingHistoryData.length > 0) {\n this.loadForwardingEventsTable(this.forwardingHistoryData);\n }\n }, 0);\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes.eventsData) {\n this.apiCallStatus = { status: APICallStatusEnum.COMPLETED, action: 'FetchForwardingHistory' };\n this.eventsData = changes.eventsData.currentValue;\n this.forwardingHistoryData = this.eventsData;\n if (!changes.eventsData.firstChange) {\n this.loadForwardingEventsTable(this.forwardingHistoryData);\n }\n }\n if (changes.selFilter && !changes.selFilter.firstChange) {\n this.selFilterBy = 'all';\n this.applyFilter();\n }\n }\n\n onForwardingEventClick(selFEvent: ForwardingEvent, event: any) {\n const reorderedFHEvent = [\n [{ key: 'timestamp', value: selFEvent.timestamp, title: 'Timestamp', width: 25, type: DataTypeEnum.DATE_TIME },\n { key: 'amt_in', value: selFEvent.amt_in, title: 'Inbound Amount (Sats)', width: 25, type: DataTypeEnum.NUMBER },\n { key: 'amt_out', value: selFEvent.amt_out, title: 'Outbound Amount (Sats)', width: 25, type: DataTypeEnum.NUMBER },\n { key: 'fee_msat', value: selFEvent.fee_msat, title: 'Fee (mSats)', width: 25, type: DataTypeEnum.NUMBER }],\n [{ key: 'alias_in', value: selFEvent.alias_in, title: 'Inbound Peer Alias', width: 25, type: DataTypeEnum.STRING },\n { key: 'chan_id_in', value: selFEvent.chan_id_in, title: 'Inbound Channel ID', width: 25, type: DataTypeEnum.STRING },\n { key: 'alias_out', value: selFEvent.alias_out, title: 'Outbound Peer Alias', width: 25, type: DataTypeEnum.STRING },\n { key: 'chan_id_out', value: selFEvent.chan_id_out, title: 'Outbound Channel ID', width: 25, type: DataTypeEnum.STRING }]\n ];\n this.store.dispatch(openAlert({\n payload: {\n data: {\n type: AlertTypeEnum.INFORMATION,\n alertTitle: 'Event Information',\n message: reorderedFHEvent\n }\n }\n }));\n }\n\n applyFilter() {\n if (this.forwardingHistoryEvents) {\n this.forwardingHistoryEvents.filter = this.selFilter.trim().toLowerCase();\n }\n }\n\n getLabel(column: string) {\n const returnColumn: ColumnDefinition = this.nodePageDefs[this.pageId][this.tableSetting.tableId].allowedColumns.find((col) => col.column === column);\n return returnColumn ? returnColumn.label ? returnColumn.label : this.camelCaseWithReplace.transform(returnColumn.column, '_') : this.commonService.titleCase(column);\n }\n\n setFilterPredicate() {\n this.forwardingHistoryEvents.filterPredicate = (rowData: ForwardingEvent, fltr: string) => {\n let rowToFilter = '';\n switch (this.selFilterBy) {\n case 'all':\n rowToFilter = ((rowData.timestamp) ? this.datePipe.transform(new Date(rowData.timestamp * 1000), 'dd/MMM/y HH:mm')?.toLowerCase() : '') + JSON.stringify(rowData).toLowerCase();\n break;\n\n case 'timestamp':\n rowToFilter = this.datePipe.transform(new Date((rowData[this.selFilterBy] || 0) * 1000), 'dd/MMM/y HH:mm')?.toLowerCase() || '';\n break;\n\n default:\n rowToFilter = typeof rowData[this.selFilterBy] === 'undefined' ? '' : typeof rowData[this.selFilterBy] === 'string' ? rowData[this.selFilterBy].toLowerCase() : typeof rowData[this.selFilterBy] === 'boolean' ? (rowData[this.selFilterBy] ? 'yes' : 'no') : rowData[this.selFilterBy].toString();\n break;\n }\n return rowToFilter.includes(fltr);\n };\n }\n\n loadForwardingEventsTable(forwardingEvents: ForwardingEvent[]) {\n this.forwardingHistoryEvents = forwardingEvents ? new MatTableDataSource<ForwardingEvent>([...forwardingEvents]) : new MatTableDataSource([]);\n this.forwardingHistoryEvents.sort = this.sort;\n this.forwardingHistoryEvents.sortingDataAccessor = (data: any, sortHeaderId: string) => ((data[sortHeaderId] && isNaN(data[sortHeaderId])) ? data[sortHeaderId].toLocaleLowerCase() : data[sortHeaderId] ? +data[sortHeaderId] : null);\n this.forwardingHistoryEvents.sort?.sort({ id: this.tableSetting.sortBy, start: this.tableSetting.sortOrder, disableClear: true });\n this.forwardingHistoryEvents.paginator = this.paginator;\n this.setFilterPredicate();\n this.applyFilter();\n this.logger.info(this.forwardingHistoryEvents);\n }\n\n onDownloadCSV() {\n if (this.forwardingHistoryEvents && this.forwardingHistoryEvents.data && this.forwardingHistoryEvents.data.length > 0) {\n this.commonService.downloadFile(this.forwardingHistoryEvents.data, 'Forwarding-history');\n }\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"column\" fxLayoutAlign=\"start stretch\" class=\"padding-gap-x\">\n <div *ngIf=\"errorMessage !== ''\" class=\"p-2 error-border my-2\">{{errorMessage}}</div>\n <div *ngIf=\"errorMessage === ''\" fxLayout=\"column\" fxLayout.gt-md=\"row\" fxFlex=\"100\" fxLayoutAlign=\"space-between start\" class=\"page-sub-title-container mt-2\">\n <div fxLayout=\"column\" fxFlex=\"49\" fxLayoutAlign=\"start stretch\" class=\"mb-4\">\n <div fxLayout=\"column\" fxLayout.gt-sm=\"row\" fxLayoutAlign.gt-sm=\"space-between center\" fxLayoutAlign=\"start stretch\" class=\"page-sub-title-container w-100\" [ngClass]=\"{'mt-2': screenSize === screenSizeEnum.XS, 'mt-1': screenSize === screenSizeEnum.SM}\">\n <div fxFlex=\"70\">Incoming</div>\n <div fxFlex.gt-xs=\"30\" fxLayoutAlign.gt-xs=\"space-between center\" fxLayout=\"row\" fxLayoutAlign=\"space-between stretch\">\n <!-- <mat-form-field fxFlex=\"49\">\n <mat-select placeholder=\"Filter By\" tabindex=\"1\" [(ngModel)]=\"selFilterByIn\" (selectionChange)=\"selFilterIn=''; applyFilterIncoming()\" name=\"filterByIn\">\n <mat-option *ngFor=\"let column of ['all'].concat(displayedColumns)\" [value]=\"column\">{{getLabel(column)}}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field fxFlex=\"49\">\n <input matInput [(ngModel)]=\"selFilterIn\" (input)=\"applyFilterIncoming()\" (keyup)=\"applyFilterIncoming()\" name=\"filterin\" placeholder=\"Filter\">\n </mat-form-field> -->\n </div>\n </div>\n <div fxLayout=\"column\" fxLayoutAlign=\"start start\" fxFlex=\"100\" class=\"table-container\" [perfectScrollbar]>\n <mat-progress-bar *ngIf=\"apiCallStatus.status === apiCallStatusEnum.INITIATED\" mode=\"indeterminate\"></mat-progress-bar>\n <table #tableIn mat-table matSort class=\"overflow-auto incoming-table\" [dataSource]=\"routingPeersIncoming\">\n <ng-container matColumnDef=\"chan_id\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Channel ID</th>\n <td *matCellDef=\"let rPeer\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{rPeer?.chan_id}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"alias\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Peer Alias</th>\n <td *matCellDef=\"let rPeer\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{rPeer?.alias}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"events\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Events</th>\n <td *matCellDef=\"let rPeer\" mat-cell><span fxLayoutAlign=\"end center\">{{rPeer.events | number}}</span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"total_amount\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Total Amount (Sats)</th>\n <td *matCellDef=\"let rPeer\" mat-cell><span fxLayoutAlign=\"end center\">{{rPeer.total_amount | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"actions\">\n <th *matHeaderCellDef mat-header-cell>\n <div class=\"bordered-box table-actions-select\" fxLayoutAlign=\"center center\">Actions</div> \n </th>\n <td *matCellDef=\"let rPeer\" mat-cell fxLayoutAlign=\"end center\">\n <button mat-stroked-button color=\"primary\" type=\"button\" tabindex=\"4\" class=\"table-actions-button\" (click)=\"onRoutingPeerClick(rPeer, $event, 'in')\">View Info</button>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"no_incoming_event\">\n <td *matFooterCellDef mat-footer-cellcolspan=\"4\">\n <p *ngIf=\"(!routingPeersIncoming?.data || routingPeersIncoming?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.COMPLETED\">No incoming routing peer available.</p>\n <p *ngIf=\"(!routingPeersIncoming?.data || routingPeersIncoming?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.INITIATED\">Getting incoming routing peers...</p>\n <p *ngIf=\"(!routingPeersIncoming?.data || routingPeersIncoming?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.ERROR\">{{errorMessage}}</p>\n </td>\n </ng-container>\n <tr *matFooterRowDef=\"['no_incoming_event']\" mat-footer-row [ngClass]=\"{'display-none': routingPeersIncoming?.data?.length>0}\"></tr>\n <tr *matHeaderRowDef=\"displayedColumns\" mat-header-row></tr>\n <tr *matRowDef=\"let row; columns: displayedColumns;\" mat-row></tr>\n </table>\n </div>\n <mat-paginator #paginatorIn class=\"mb-1\" [pageSize]=\"pageSize\" [pageSizeOptions]=\"pageSizeOptions\" [showFirstLastButtons]=\"screenSize === screenSizeEnum.XS ? false : true\"></mat-paginator>\n </div>\n <div fxLayout=\"column\" fxFlex=\"49\" fxLayoutAlign=\"start stretch\" class=\"mb-4\">\n <div fxLayout=\"column\" fxLayout.gt-sm=\"row\" fxLayoutAlign.gt-sm=\"space-between center\" fxLayoutAlign=\"start stretch\" class=\"page-sub-title-container w-100\" [ngClass]=\"{'mt-2': screenSize !== screenSizeEnum.LG}\">\n <div fxFlex=\"70\">Outgoing</div>\n <div fxFlex.gt-xs=\"30\" fxLayoutAlign.gt-xs=\"space-between center\" fxLayout=\"row\" fxLayoutAlign=\"space-between stretch\">\n <!-- <mat-form-field fxFlex=\"49\">\n <mat-select placeholder=\"Filter By\" tabindex=\"1\" [(ngModel)]=\"selFilterByOut\" (selectionChange)=\"selFilterOut=''; applyFilterOutgoing()\" name=\"filterByOut\">\n <mat-option *ngFor=\"let column of ['all'].concat(displayedColumns.slice(0, -1))\" [value]=\"column\">{{getLabel(column)}}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field fxFlex=\"49\">\n <input matInput [(ngModel)]=\"selFilterOut\" (input)=\"applyFilterOutgoing()\" (keyup)=\"applyFilterOutgoing()\" name=\"filterout\" placeholder=\"Filter\">\n </mat-form-field> -->\n </div>\n </div>\n <div fxLayout=\"column\" fxLayoutAlign=\"start start\" fxFlex=\"100\" class=\"table-container\" [perfectScrollbar]>\n <mat-progress-bar *ngIf=\"apiCallStatus.status === apiCallStatusEnum.INITIATED\" mode=\"indeterminate\"></mat-progress-bar>\n <table #tableOut mat-table matSort class=\"overflow-auto outgoing-table\" [dataSource]=\"routingPeersOutgoing\">\n <ng-container matColumnDef=\"chan_id\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Channel ID</th>\n <td *matCellDef=\"let rPeer\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{rPeer?.chan_id}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"alias\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Peer Alias</th>\n <td *matCellDef=\"let rPeer\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{rPeer?.alias}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"events\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Events</th>\n <td *matCellDef=\"let rPeer\" mat-cell><span fxLayoutAlign=\"end center\">{{rPeer.events | number}}</span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"total_amount\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Total Amount (Sats)</th>\n <td *matCellDef=\"let rPeer\" mat-cell><span fxLayoutAlign=\"end center\">{{rPeer.total_amount | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"no_outgoing_event\">\n <td *matFooterCellDef mat-footer-cellcolspan=\"4\">\n <p *ngIf=\"(!routingPeersOutgoing?.data || routingPeersOutgoing?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.COMPLETED\">No outgoing routing peer available.</p>\n <p *ngIf=\"(!routingPeersOutgoing?.data || routingPeersOutgoing?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.INITIATED\">Getting outgoing routing peers...</p>\n <p *ngIf=\"(!routingPeersOutgoing?.data || routingPeersOutgoing?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.ERROR\">{{errorMessage}}</p>\n </td>\n </ng-container>\n <tr *matFooterRowDef=\"['no_outgoing_event']\" mat-footer-row [ngClass]=\"{'display-none': routingPeersOutgoing?.data?.length>0}\"></tr>\n <tr *matHeaderRowDef=\"displayedColumns\" mat-header-row></tr>\n <tr *matRowDef=\"let row; columns: displayedColumns;\" mat-row></tr>\n </table>\n </div>\n <mat-paginator #paginatorOut class=\"mb-1\" [pageSize]=\"pageSize\" [pageSizeOptions]=\"pageSizeOptions\" [showFirstLastButtons]=\"screenSize === screenSizeEnum.XS ? false : true\"></mat-paginator>\n </div>\n </div>\n</div>\n","import { Component, OnInit, ViewChild, OnDestroy, AfterViewInit } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { MatSort } from '@angular/material/sort';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { MatPaginator, MatPaginatorIntl } from '@angular/material/paginator';\n\nimport { ForwardingEvent, RoutingPeers, SwitchRes } from '../../../shared/models/lndModels';\nimport { AlertTypeEnum, APICallStatusEnum, DataTypeEnum, getPaginatorLabel, LND_DEFAULT_PAGE_SETTINGS, LND_PAGE_DEFS, PAGE_SIZE, PAGE_SIZE_OPTIONS, ScreenSizeEnum, SortOrderEnum } from '../../../shared/services/consts-enums-functions';\nimport { ApiCallStatusPayload } from '../../../shared/models/apiCallsPayload';\nimport { LoggerService } from '../../../shared/services/logger.service';\nimport { CommonService } from '../../../shared/services/common.service';\nimport { openAlert } from '../../../store/rtl.actions';\nimport { RTLState } from '../../../store/rtl.state';\nimport { forwardingHistory, lndPageSettings } from '../../store/lnd.selector';\nimport { ColumnDefinition, PageSettings, TableSetting } from '../../../shared/models/pageSettings';\nimport { CamelCaseWithReplacePipe } from '../../../shared/pipes/app.pipe';\n\n@Component({\n selector: 'rtl-routing-peers',\n templateUrl: './routing-peers.component.html',\n styleUrls: ['./routing-peers.component.scss'],\n providers: [\n { provide: MatPaginatorIntl, useValue: getPaginatorLabel('Routing peers') }\n ]\n})\nexport class RoutingPeersComponent implements OnInit, AfterViewInit, OnDestroy {\n\n @ViewChild('tableIn', { read: MatSort, static: false }) sortIn: MatSort;\n @ViewChild('tableOut', { read: MatSort, static: false }) sortOut: MatSort;\n @ViewChild('paginatorIn', { static: false }) paginatorIn: MatPaginator | undefined;\n @ViewChild('paginatorOut', { static: false }) paginatorOut: MatPaginator | undefined;\n public nodePageDefs = LND_PAGE_DEFS;\n public selFilterByIn = 'all';\n public selFilterByOut = 'all';\n public colWidth = '20rem';\n public PAGE_ID = 'routing';\n public tableSetting: TableSetting = { tableId: 'routing_peers', recordsPerPage: PAGE_SIZE, sortBy: 'total_amount', sortOrder: SortOrderEnum.DESCENDING };\n public routingPeersData: any[] = [];\n public displayedColumns: any[] = [];\n public routingPeersIncoming = new MatTableDataSource<RoutingPeers>([]);\n public routingPeersOutgoing = new MatTableDataSource<RoutingPeers>([]);\n public pageSize = PAGE_SIZE;\n public pageSizeOptions = PAGE_SIZE_OPTIONS;\n public screenSize = '';\n public screenSizeEnum = ScreenSizeEnum;\n public errorMessage = '';\n public filterIn = '';\n public filterOut = '';\n public apiCallStatus: ApiCallStatusPayload | null = null;\n public apiCallStatusEnum = APICallStatusEnum;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject()];\n\n constructor(private logger: LoggerService, private commonService: CommonService, private store: Store<RTLState>, private camelCaseWithReplace: CamelCaseWithReplacePipe) {\n this.screenSize = this.commonService.getScreenSize();\n }\n\n ngOnInit() {\n this.store.select(lndPageSettings).pipe(takeUntil(this.unSubs[0])).\n subscribe((settings: { pageSettings: PageSettings[], apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessage = '';\n this.apiCallStatus = settings.apiCallStatus;\n if (this.apiCallStatus.status === APICallStatusEnum.ERROR) {\n this.errorMessage = this.apiCallStatus.message || '';\n }\n this.tableSetting = settings.pageSettings.find((page) => page.pageId === this.PAGE_ID)?.tables.find((table) => table.tableId === this.tableSetting.tableId) || LND_DEFAULT_PAGE_SETTINGS.find((page) => page.pageId === this.PAGE_ID)?.tables.find((table) => table.tableId === this.tableSetting.tableId)!;\n if (this.screenSize === ScreenSizeEnum.XS || this.screenSize === ScreenSizeEnum.SM) {\n this.displayedColumns = JSON.parse(JSON.stringify(this.tableSetting.columnSelectionSM));\n } else {\n this.displayedColumns = JSON.parse(JSON.stringify(this.tableSetting.columnSelection));\n }\n this.pageSize = this.tableSetting.recordsPerPage ? +this.tableSetting.recordsPerPage : PAGE_SIZE;\n this.colWidth = this.displayedColumns.length ? ((this.commonService.getContainerSize().width / (this.displayedColumns.length * 2)) / 10) + 'rem' : '20rem';\n this.logger.info(this.displayedColumns);\n });\n this.store.select(forwardingHistory).pipe(takeUntil(this.unSubs[1])).\n subscribe((fhSelector: { forwardingHistory: SwitchRes, apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessage = '';\n this.apiCallStatus = fhSelector.apiCallStatus;\n if (fhSelector.apiCallStatus?.status === APICallStatusEnum.ERROR) {\n this.errorMessage = !this.apiCallStatus.message ? '' : (typeof (this.apiCallStatus.message) === 'object') ? JSON.stringify(this.apiCallStatus.message) : this.apiCallStatus.message;\n }\n if (fhSelector.forwardingHistory.forwarding_events) {\n this.routingPeersData = fhSelector.forwardingHistory.forwarding_events;\n } else {\n this.routingPeersData = [];\n }\n if (this.routingPeersData.length > 0 && this.sortIn && this.paginatorIn && this.sortOut && this.paginatorOut) {\n this.loadRoutingPeersTable(this.routingPeersData);\n }\n this.logger.info(fhSelector.apiCallStatus);\n this.logger.info(fhSelector.forwardingHistory);\n });\n }\n\n ngAfterViewInit() {\n if (this.routingPeersData.length > 0) {\n this.loadRoutingPeersTable(this.routingPeersData);\n }\n }\n\n onRoutingPeerClick(selRPeer: RoutingPeers, event: any, direction: string) {\n let alertTitle = ' Routing Information';\n if (direction === 'in') {\n alertTitle = 'Incoming' + alertTitle;\n } else {\n alertTitle = 'Outgoing' + alertTitle;\n }\n const reorderedRoutingPeer = [\n [{ key: 'chan_id', value: selRPeer.chan_id, title: 'Channel ID', width: 50, type: DataTypeEnum.STRING },\n { key: 'alias', value: selRPeer.alias, title: 'Peer Alias', width: 50, type: DataTypeEnum.STRING }],\n [{ key: 'events', value: selRPeer.events, title: 'Events', width: 50, type: DataTypeEnum.NUMBER },\n { key: 'total_amount', value: selRPeer.total_amount, title: 'Total Amount (Sats)', width: 50, type: DataTypeEnum.NUMBER }]\n ];\n this.store.dispatch(openAlert({\n payload: {\n data: {\n type: AlertTypeEnum.INFORMATION,\n alertTitle: alertTitle,\n message: reorderedRoutingPeer\n }\n }\n }));\n }\n\n applyFilterIncoming() {\n this.routingPeersIncoming.filter = this.filterIn.trim().toLowerCase();\n }\n\n applyFilterOutgoing() {\n this.routingPeersOutgoing.filter = this.filterOut.trim().toLowerCase();\n }\n\n getLabel(column: string) {\n const returnColumn: ColumnDefinition = this.nodePageDefs[this.PAGE_ID][this.tableSetting.tableId].allowedColumns.find((col) => col.column === column);\n return returnColumn ? returnColumn.label ? returnColumn.label : this.camelCaseWithReplace.transform(returnColumn.column, '_') : this.commonService.titleCase(column);\n }\n\n setFilterPredicate() {\n this.routingPeersIncoming.filterPredicate = (rowDataIn: RoutingPeers, fltr: string) => {\n let rowToFilterIn = '';\n switch (this.selFilterByIn) {\n case 'all':\n rowToFilterIn = JSON.stringify(rowDataIn).toLowerCase();\n break;\n\n default:\n rowToFilterIn = typeof rowDataIn[this.selFilterByIn] === 'string' ? rowDataIn[this.selFilterByIn].toLowerCase() : typeof rowDataIn[this.selFilterByIn] === 'boolean' ? (rowDataIn[this.selFilterByIn] ? 'yes' : 'no') : rowDataIn[this.selFilterByIn].toString();\n break;\n }\n return rowToFilterIn.includes(fltr);\n };\n\n this.routingPeersOutgoing.filterPredicate = (rowDataOut: RoutingPeers, fltr: string) => {\n let rowToFilterOut = '';\n switch (this.selFilterByOut) {\n case 'all':\n rowToFilterOut = JSON.stringify(rowDataOut).toLowerCase();\n break;\n\n case 'total_amount':\n case 'total_fee':\n rowToFilterOut = ((+(rowDataOut[this.selFilterByOut] || 0)) / 1000)?.toString() || '';\n break;\n\n default:\n rowToFilterOut = typeof rowDataOut[this.selFilterByOut] === 'string' ? rowDataOut[this.selFilterByOut].toLowerCase() : typeof rowDataOut[this.selFilterByOut] === 'boolean' ? (rowDataOut[this.selFilterByOut] ? 'yes' : 'no') : rowDataOut[this.selFilterByOut].toString();\n break;\n }\n return rowToFilterOut.includes(fltr);\n };\n }\n\n loadRoutingPeersTable(forwardingEvents: ForwardingEvent[]) {\n if (forwardingEvents.length > 0) {\n const results = this.groupRoutingPeers(forwardingEvents);\n this.routingPeersIncoming = new MatTableDataSource<RoutingPeers>(results[0]);\n this.routingPeersIncoming.sort = this.sortIn;\n this.routingPeersIncoming.sort.sort({ id: this.tableSetting.sortBy || 'total_amount', start: this.tableSetting.sortOrder || SortOrderEnum.DESCENDING, disableClear: true });\n this.routingPeersIncoming.paginator = this.paginatorIn!;\n this.logger.info(this.routingPeersIncoming);\n this.routingPeersOutgoing = new MatTableDataSource<RoutingPeers>(results[1]);\n this.routingPeersOutgoing.sort = this.sortOut;\n this.routingPeersOutgoing.sort.sort({ id: this.tableSetting.sortBy || 'total_amount', start: this.tableSetting.sortOrder || SortOrderEnum.DESCENDING, disableClear: true });\n this.routingPeersOutgoing.paginator = this.paginatorOut!;\n this.logger.info(this.routingPeersOutgoing);\n } else {\n // To reset table after other Forwarding history calls\n this.routingPeersIncoming = new MatTableDataSource<RoutingPeers>([]);\n this.routingPeersOutgoing = new MatTableDataSource<RoutingPeers>([]);\n }\n this.setFilterPredicate();\n this.applyFilterIncoming();\n this.applyFilterOutgoing();\n }\n\n groupRoutingPeers(forwardingEvents: ForwardingEvent[]) {\n const incomingResults: any = [];\n const outgoingResults: any = [];\n forwardingEvents.forEach((event) => {\n const incoming: any = incomingResults.find((result) => result.chan_id === event.chan_id_in);\n const outgoing: any = outgoingResults.find((result) => result.chan_id === event.chan_id_out);\n if (!incoming) {\n incomingResults.push({ chan_id: event.chan_id_in, alias: event.alias_in, events: 1, total_amount: +(event.amt_in || 0) });\n } else {\n incoming.events++;\n incoming.total_amount = +incoming.total_amount + +(event.amt_in || 0);\n }\n if (!outgoing) {\n outgoingResults.push({ chan_id: event.chan_id_out, alias: event.alias_out, events: 1, total_amount: +(event.amt_out || 0) });\n } else {\n outgoing.events++;\n outgoing.total_amount = +outgoing.total_amount + +(event.amt_out || 0);\n }\n });\n return [this.commonService.sortDescByKey(incomingResults, 'total_amount'), this.commonService.sortDescByKey(outgoingResults, 'total_amount')];\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"row\" fxLayoutAlign=\"start center\" class=\"page-title-container\">\n <fa-icon class=\"page-title-img mr-1\" [icon]=\"faChartBar\"></fa-icon>\n <span class=\"page-title\">Reports</span>\n</div>\n<div fxLayout=\"column\" class=\"padding-gap-x\">\n <mat-card>\n <mat-card-content fxLayout=\"column\">\n <nav mat-tab-nav-bar mat-stretch-tabs=\"false\" mat-align-tabs=\"start\" [tabPanel]=\"tabPanel\">\n <div *ngFor=\"let link of links\" mat-tab-link class=\"mat-tab-label\" [active]=\"activeLink === link.link\" routerLink=\"{{link.link}}\" (click)=\"activeLink = link.link\">{{link.name}}</div>\n </nav>\n <mat-tab-nav-panel #tabPanel></mat-tab-nav-panel>\n <router-outlet></router-outlet> \n </mat-card-content>\n </mat-card>\n</div>\n ","import { Component, OnDestroy, OnInit } from '@angular/core';\nimport { Router, ResolveEnd, Event } from '@angular/router';\nimport { Subject } from 'rxjs';\nimport { takeUntil, filter } from 'rxjs/operators';\nimport { faChartBar } from '@fortawesome/free-solid-svg-icons';\n\n@Component({\n selector: 'rtl-reports',\n templateUrl: './reports.component.html',\n styleUrls: ['./reports.component.scss']\n})\nexport class ReportsComponent implements OnInit, OnDestroy {\n\n public faChartBar = faChartBar;\n public links = [{ link: 'routingreport', name: 'Routing' }, { link: 'transactions', name: 'Transactions' }];\n public activeLink = this.links[0].link;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject()];\n\n constructor(private router: Router) { }\n\n ngOnInit() {\n const linkFound = this.links.find((link) => this.router.url.includes(link.link));\n this.activeLink = linkFound ? linkFound.link : this.links[0].link;\n this.router.events.pipe(takeUntil(this.unSubs[0]), filter((e) => e instanceof ResolveEnd)).\n subscribe({\n next: (value: ResolveEnd | Event) => {\n const linkFound = this.links.find((link) => (<ResolveEnd>value).urlAfterRedirects.includes(link.link));\n this.activeLink = linkFound ? linkFound.link : this.links[0].link;\n }\n });\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"column\" fxLayoutAlign=\"start stretch\" fxFlex=\"100\" class=\"padding-gap-x-large\">\n <rtl-horizontal-scroller (stepChanged)=\"onSelectionChange($event)\"></rtl-horizontal-scroller>\n <div fxLayout=\"column\" fxLayoutAlign=\"center center\" class=\"padding-gap-x\">\n <mat-radio-group class=\"my-1\" color=\"primary\" name=\"selReportBy\" fxFlex=\"100\" fxLayoutAlign=\"start start\" [(ngModel)]=\"selReportBy\" (change)=\"onSelReportByChange()\">\n <span class=\"mr-2\">Report By: </span>\n <mat-radio-button class=\"mr-2\" tabindex=\"1\" value=\"{{reportBy.FEES}}\">Fees</mat-radio-button>\n <mat-radio-button tabindex=\"2\" value=\"{{reportBy.EVENTS}}\">Events</mat-radio-button>\n </mat-radio-group>\n </div>\n <mat-progress-bar *ngIf=\"errorMessage === 'Getting Forwarding History...'\" mode=\"indeterminate\" class=\"mt-2\"></mat-progress-bar>\n <div fxLayout=\"column\" fxLayoutAlign=\"start stretch\" fxFlex=\"100\" class=\"padding-gap-x my-1\">\n <div *ngIf=\"routingReportData.length > 0 && events.forwarding_events && events.forwarding_events.length && events.forwarding_events.length > 0\" fxLayout=\"column\" fxLayoutAlign=\"center center\" fxFlex=\"100\" class=\"font-size-120 font-bold-700 mt-1\"\n [@fadeIn]=\"events.total_fee_msat\">{{(events.total_fee_msat / 1000 || 0) | number:'1.0-2'}} Sats/{{(events?.forwarding_events?.length || 0) | number}} Events</div>\n <div *ngIf=\"(routingReportData.length <= 0 || events.forwarding_events.length <= 0) && errorMessage === ''\" fxLayout=\"column\" fxLayoutAlign=\"center center\" fxFlex=\"100\" class=\"font-size-120 mt-1\">No routing report for the selected period</div>\n <div *ngIf=\"errorMessage !== ''\" fxLayout=\"column\" fxLayoutAlign=\"center center\" fxFlex=\"100\" class=\"font-size-120 mt-1\" [ngClass]=\"{'error-border': errorMessage !== 'Getting Forwarding History...' && errorMessage !== ''}\">{{errorMessage}}</div>\n <div class=\"mt-1\">\n <ngx-charts-bar-vertical\n *ngIf=\"routingReportData.length > 0 && events.forwarding_events && events.forwarding_events.length && events.forwarding_events.length > 0\"\n class=\"one-color\"\n [view]=\"view\"\n [results]=\"routingReportData\"\n [gradient]=\"false\"\n [xAxis]=\"true\"\n [yAxis]=\"true\"\n [showXAxisLabel]=\"true\"\n [showYAxisLabel]=\"showYAxisLabel\"\n [xAxisLabel]=\"xAxisLabel\"\n [yAxisLabel]=\"yAxisLabel\"\n [showGridLines]=\"false\"\n [showDataLabel]=\"false\"\n (select)=\"onChartBarSelected($event)\"\n (mouseup)=\"onChartMouseUp($event)\">\n <ng-template #tooltipTemplate let-model=\"model\">\n <span>\n <span class=\"tooltip-label\">Events: {{((selReportBy === reportBy.EVENTS ? model.value : model.extra.totalEvents) || 0) | number}}</span>\n <span class=\"tooltip-label\">Fee: {{((selReportBy === reportBy.EVENTS ? model.extra.totalFees : model.value) || 0) | number:'1.0-2'}}</span>\n </span>\n </ng-template>\n </ngx-charts-bar-vertical>\n </div>\n </div>\n <div fxLayout=\"column\" fxLayoutAlign=\"start stretch\" fxFlex=\"100\" class=\"padding-gap-x\">\n <div class=\"mt-1\">\n <rtl-forwarding-history *ngIf=\"events && events?.forwarding_events && events.forwarding_events.length && events.forwarding_events.length > 0\" [pageId]=\"'reports'\" [tableId]=\"'routing'\" [eventsData]=\"events?.forwarding_events\" [selFilter]=\"eventFilterValue\"></rtl-forwarding-history>\n </div>\n </div>\n</div>\n","import { Component, OnInit, OnDestroy, HostListener } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\n\nimport { SwitchRes } from '../../../shared/models/lndModels';\nimport { CommonService } from '../../../shared/services/common.service';\nimport { MONTHS, ReportBy, ScreenSizeEnum, SCROLL_RANGES, UI_MESSAGES } from '../../../shared/services/consts-enums-functions';\nimport { DataService } from '../../../shared/services/data.service';\nimport { fadeIn } from '../../../shared/animation/opacity-animation';\n\nimport { RTLState } from '../../../store/rtl.state';\nimport { lndNodeInformation } from '../../store/lnd.selector';\nimport { LoggerService } from '../../../shared/services/logger.service';\n\n@Component({\n selector: 'rtl-routing-report',\n templateUrl: './routing-report.component.html',\n styleUrls: ['./routing-report.component.scss'],\n animations: [fadeIn]\n})\nexport class RoutingReportComponent implements OnInit, OnDestroy {\n\n public reportPeriod = SCROLL_RANGES[0];\n public secondsInADay = 24 * 60 * 60;\n public events: SwitchRes = {};\n public eventFilterValue = '';\n public reportBy = ReportBy;\n public selReportBy = ReportBy.FEES;\n public today = new Date(Date.now());\n public startDate = new Date(this.today.getFullYear(), this.today.getMonth(), 1, 0, 0, 0);\n public endDate = new Date(this.today.getFullYear(), this.today.getMonth(), this.getMonthDays(this.today.getMonth(), this.today.getFullYear()), 23, 59, 59);\n public routingReportData: any = [];\n public view: [number, number] = [350, 350];\n public screenPaddingX = 100;\n public gradient = true;\n public xAxisLabel = 'Date';\n public yAxisLabel = 'Fee (Sats)';\n public showYAxisLabel = true;\n public screenSize = '';\n public screenSizeEnum = ScreenSizeEnum;\n public errorMessage = '';\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject()];\n\n constructor(private logger: LoggerService, private dataService: DataService, private commonService: CommonService, private store: Store<RTLState>) { }\n\n ngOnInit() {\n this.screenSize = this.commonService.getScreenSize();\n this.showYAxisLabel = !(this.screenSize === ScreenSizeEnum.XS || this.screenSize === ScreenSizeEnum.SM);\n this.store.select(lndNodeInformation).pipe(takeUntil(this.unSubs[0])).subscribe((info) => {\n if (info.identity_pubkey) {\n setTimeout(() => {\n this.fetchEvents(this.startDate, this.endDate);\n }, 10); // To avoid fetchEvents call on selectedNode change and dashboard load\n }\n });\n this.commonService.containerSizeUpdated.pipe(takeUntil(this.unSubs[1])).subscribe((CONTAINER_SIZE) => {\n switch (this.screenSize) {\n case ScreenSizeEnum.MD:\n this.screenPaddingX = CONTAINER_SIZE.width / 10;\n break;\n\n case ScreenSizeEnum.LG:\n this.screenPaddingX = CONTAINER_SIZE.width / 16;\n break;\n\n default:\n this.screenPaddingX = CONTAINER_SIZE.width / 20;\n break;\n }\n this.view = [CONTAINER_SIZE.width - this.screenPaddingX, CONTAINER_SIZE.height / 2.2];\n this.logger.info('Container Size: ' + JSON.stringify(CONTAINER_SIZE));\n this.logger.info('View: ' + JSON.stringify(this.view));\n });\n }\n\n fetchEvents(start: Date, end: Date) {\n this.errorMessage = UI_MESSAGES.GET_FORWARDING_HISTORY;\n const startDateInSeconds = Math.round(start.getTime() / 1000).toString();\n const endDateInSeconds = Math.round(end.getTime() / 1000).toString();\n this.dataService.getForwardingHistory('LND', startDateInSeconds, endDateInSeconds).\n pipe(takeUntil(this.unSubs[2])).subscribe({\n next: (res) => {\n this.errorMessage = '';\n if (res.forwarding_events && res.forwarding_events.length) {\n res.forwarding_events = res.forwarding_events.reverse();\n this.events = res;\n this.routingReportData = this.selReportBy === this.reportBy.EVENTS ? this.prepareEventsReport(start) : this.prepareFeeReport(start);\n } else {\n this.events = { forwarding_events: [], total_fee_msat: 0 };\n this.routingReportData = [];\n }\n }, error: (err) => {\n this.errorMessage = err;\n }\n });\n }\n\n @HostListener('mouseup', ['$event']) onChartMouseUp(e) {\n if (e.srcElement.tagName === 'svg' && e.srcElement.classList.length > 0 && e.srcElement.classList[0] === 'ngx-charts') {\n this.eventFilterValue = '';\n }\n }\n\n onChartBarSelected(event) {\n if (this.reportPeriod === SCROLL_RANGES[1]) {\n this.eventFilterValue = event.name + '/' + this.startDate.getFullYear();\n } else {\n this.eventFilterValue = event.name.toString().padStart(2, '0') + '/' + MONTHS[this.startDate.getMonth()].name + '/' + this.startDate.getFullYear();\n }\n }\n\n prepareFeeReport(start: Date) {\n const startDateInSeconds = Math.round(start.getTime() / 1000);\n const feeReport: any[] = [];\n this.events.total_fee_msat = 0;\n if (this.reportPeriod === SCROLL_RANGES[1]) {\n for (let i = 0; i < 12; i++) {\n feeReport.push({ name: MONTHS[i].name, value: 0.0, extra: { totalEvents: 0 } });\n }\n this.events.forwarding_events?.map((event) => {\n const monthNumber = new Date(+(event.timestamp || 0) * 1000).getMonth();\n feeReport[monthNumber].value = feeReport[monthNumber].value + (+(event.fee_msat || 0) / 1000);\n feeReport[monthNumber].extra.totalEvents = feeReport[monthNumber].extra.totalEvents + 1;\n this.events.total_fee_msat = (this.events.total_fee_msat ? this.events.total_fee_msat : 0) + +(event.fee_msat || 0);\n return this.events;\n });\n } else {\n for (let i = 0; i < this.getMonthDays(start.getMonth(), start.getFullYear()); i++) {\n feeReport.push({ name: i + 1, value: 0.0, extra: { totalEvents: 0 } });\n }\n this.events.forwarding_events?.map((event) => {\n const dateNumber = Math.floor((+(event.timestamp || 0) - startDateInSeconds) / this.secondsInADay);\n feeReport[dateNumber].value = feeReport[dateNumber].value + (+(event.fee_msat || 0) / 1000);\n feeReport[dateNumber].extra.totalEvents = feeReport[dateNumber].extra.totalEvents + 1;\n this.events.total_fee_msat = (this.events.total_fee_msat ? this.events.total_fee_msat : 0) + +(event.fee_msat || 0);\n return this.events;\n });\n }\n return feeReport;\n }\n\n prepareEventsReport(start: Date) {\n const startDateInSeconds = Math.round(start.getTime() / 1000);\n const eventsReport: any[] = [];\n this.events.total_fee_msat = 0;\n if (this.reportPeriod === SCROLL_RANGES[1]) {\n for (let i = 0; i < 12; i++) {\n eventsReport.push({ name: MONTHS[i].name, value: 0, extra: { totalFees: 0.0 } });\n }\n this.events.forwarding_events?.map((event) => {\n const monthNumber = new Date(+(event.timestamp || 0) * 1000).getMonth();\n eventsReport[monthNumber].value = eventsReport[monthNumber].value + 1;\n eventsReport[monthNumber].extra.totalFees = eventsReport[monthNumber].extra.totalFees + (+(event.fee_msat || 0) / 1000);\n this.events.total_fee_msat = (this.events.total_fee_msat ? this.events.total_fee_msat : 0) + +(event.fee_msat || 0);\n return this.events;\n });\n } else {\n for (let i = 0; i < this.getMonthDays(start.getMonth(), start.getFullYear()); i++) {\n eventsReport.push({ name: i + 1, value: 0, extra: { totalFees: 0.0 } });\n }\n this.events.forwarding_events?.map((event) => {\n const dateNumber = Math.floor((+(event.timestamp || 0) - startDateInSeconds) / this.secondsInADay);\n eventsReport[dateNumber].value = eventsReport[dateNumber].value + 1;\n eventsReport[dateNumber].extra.totalFees = eventsReport[dateNumber].extra.totalFees + (+(event.fee_msat || 0) / 1000);\n this.events.total_fee_msat = (this.events.total_fee_msat ? this.events.total_fee_msat : 0) + +(event.fee_msat || 0);\n return this.events;\n });\n }\n return eventsReport;\n }\n\n onSelectionChange(selectedValues: { selDate: Date, selScrollRange: string }) {\n const selMonth = selectedValues.selDate.getMonth();\n const selYear = selectedValues.selDate.getFullYear();\n this.reportPeriod = selectedValues.selScrollRange;\n if (this.reportPeriod === SCROLL_RANGES[1]) {\n this.startDate = new Date(selYear, 0, 1, 0, 0, 0);\n this.endDate = new Date(selYear, 11, 31, 23, 59, 59);\n } else {\n this.startDate = new Date(selYear, selMonth, 1, 0, 0, 0);\n this.endDate = new Date(selYear, selMonth, this.getMonthDays(selMonth, selYear), 23, 59, 59);\n }\n this.fetchEvents(this.startDate, this.endDate);\n this.eventFilterValue = '';\n }\n\n getMonthDays(selMonth: number, selYear: number) {\n return (selMonth === 1 && selYear % 4 === 0) ? (MONTHS[selMonth].days + 1) : MONTHS[selMonth].days;\n }\n\n onSelReportByChange() {\n this.yAxisLabel = this.selReportBy === this.reportBy.EVENTS ? 'Events' : 'Fee (Sats)';\n this.routingReportData = this.selReportBy === this.reportBy.EVENTS ? this.prepareEventsReport(this.startDate) : this.prepareFeeReport(this.startDate);\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"column\" fxLayoutAlign=\"start stretch\" fxFlex=\"100\" class=\"padding-gap-x-large\">\n <div fxLayout=\"column\" fxLayoutAlign=\"start stretch\" fxFlex=\"100\" class=\"padding-gap-x\">\n <div fxLayout=\"column\" fxLayoutAlign=\"start stretch\" fxFlex=\"100\">\n <rtl-horizontal-scroller (stepChanged)=\"onSelectionChange($event)\"></rtl-horizontal-scroller>\n <div *ngIf=\"apiCallStatus.status === apiCallStatusEnum.INITIATED\" class=\"p-2\">\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n <span>Getting transactions data...</span>\n </div>\n <div *ngIf=\"apiCallStatus.status === apiCallStatusEnum.ERROR\" class=\"p-2 error-border my-2\">{{errorMessage}}</div>\n <div *ngIf=\"transactionsNonZeroReportData.length > 0 && apiCallStatus.status === apiCallStatusEnum.COMPLETED\" fxLayout=\"column\" fxLayoutAlign=\"center center\" fxFlex=\"100\" class=\"font-size-120 font-bold-700 mt-1\" [@fadeIn]=\"transactionsReportSummary\">\n <div *ngIf=\"transactionsReportSummary.paymentsSelectedPeriod > 0\" fxLayout=\"row\" fxLayoutAlign=\"start stretch\" fxFlex=\"100\">\n Paid {{(transactionsReportSummary.amountPaidSelectedPeriod / 1000 || 0) | number:'1.0-2'}} Sats/{{transactionsReportSummary.paymentsSelectedPeriod | number}} Payments\n </div>\n <div *ngIf=\"transactionsReportSummary.invoicesSelectedPeriod\" fxLayout=\"row\" fxLayoutAlign=\"start stretch\" fxFlex=\"100\">\n Received {{(transactionsReportSummary.amountReceivedSelectedPeriod / 1000 || 0) | number:'1.0-2'}} Sats/{{transactionsReportSummary.invoicesSelectedPeriod | number}} Invoices\n </div>\n </div>\n <div *ngIf=\"transactionsNonZeroReportData.length <= 0 && apiCallStatus.status === apiCallStatusEnum.COMPLETED\" fxLayout=\"column\" fxLayoutAlign=\"center center\" fxFlex=\"100\" class=\"font-size-120 mt-1\">No transactions report for the selected period</div>\n <div *ngIf=\"transactionsNonZeroReportData.length > 0 && apiCallStatus.status === apiCallStatusEnum.COMPLETED\" class=\"mt-1\">\n <ngx-charts-bar-vertical-2d\n *ngIf=\"transactionsReportData.length > 0 && transactionsNonZeroReportData.length > 0\"\n class=\"two-color\"\n [view]=\"view\"\n [results]=\"transactionsReportData\"\n [noBarWhenZero]=\"false\"\n [gradient]=\"false\"\n [xAxis]=\"true\"\n [yAxis]=\"true\"\n [showXAxisLabel]=\"true\"\n [showYAxisLabel]=\"showYAxisLabel\"\n [xAxisLabel]=\"xAxisLabel\"\n [yAxisLabel]=\"yAxisLabel\"\n [showGridLines]=\"false\"\n [showDataLabel]=\"false\"\n [groupPadding]=\"(reportPeriod === scrollRanges[0]) ? 2 : 8\"\n (select)=\"onChartBarSelected($event)\"\n (mouseup)=\"onChartMouseUp($event)\">\n <ng-template #tooltipTemplate let-model=\"model\">\n <span class=\"tooltip-label\">{{model.name}}: {{(model.value || 0) | number:'1.0-2'}}/# {{model.name === 'Paid' ? 'Payments' : 'Invoices'}}: {{(model.extra?.total || 0) | number}}</span>\n </ng-template>\n </ngx-charts-bar-vertical-2d> \n </div>\n <div class=\"mt-1\">\n <rtl-transactions-report-table *ngIf=\"transactionsNonZeroReportData.length > 0 && apiCallStatus.status === apiCallStatusEnum.COMPLETED\" [displayedColumns]=\"displayedColumns\" [tableSetting]=\"tableSetting\" [dataList]=\"transactionsNonZeroReportData\" [dataRange]=\"reportPeriod\" [selFilter]=\"transactionFilterValue\"></rtl-transactions-report-table>\n </div>\n </div>\n </div>\n</div>\n","import { Component, OnInit, OnDestroy, HostListener } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\n\nimport { Payment, Invoice, ListInvoices, ListPayments } from '../../../shared/models/lndModels';\nimport { CommonService } from '../../../shared/services/common.service';\nimport { LoggerService } from '../../../shared/services/logger.service';\nimport { APICallStatusEnum, LND_DEFAULT_PAGE_SETTINGS, MONTHS, PAGE_SIZE, ScreenSizeEnum, SCROLL_RANGES, SortOrderEnum } from '../../../shared/services/consts-enums-functions';\nimport { ApiCallStatusPayload } from '../../../shared/models/apiCallsPayload';\nimport { fadeIn } from '../../../shared/animation/opacity-animation';\n\nimport { RTLState } from '../../../store/rtl.state';\nimport { allLightningTransactions } from '../../store/lnd.selector';\nimport { getAllLightningTransactions } from '../../store/lnd.actions';\nimport { PageSettings, TableSetting } from '../../../shared/models/pageSettings';\nimport { clnPageSettings } from '../../../cln/store/cln.selector';\n\n@Component({\n selector: 'rtl-transactions-report',\n templateUrl: './transactions-report.component.html',\n styleUrls: ['./transactions-report.component.scss'],\n animations: [fadeIn]\n})\nexport class TransactionsReportComponent implements OnInit, OnDestroy {\n\n public scrollRanges = SCROLL_RANGES;\n public reportPeriod = SCROLL_RANGES[0];\n public secondsInADay = 24 * 60 * 60;\n public payments: Payment[] = [];\n public invoices: Invoice[] = [];\n public colWidth = '20rem';\n public PAGE_ID = 'reports';\n public tableSetting: TableSetting = { tableId: 'transactions', recordsPerPage: PAGE_SIZE, sortBy: 'date', sortOrder: SortOrderEnum.DESCENDING };\n public displayedColumns: any[] = ['date', 'amount_paid', 'num_payments', 'amount_received', 'num_invoices'];\n public transactionsReportSummary = { paymentsSelectedPeriod: 0, invoicesSelectedPeriod: 0, amountPaidSelectedPeriod: 0, amountReceivedSelectedPeriod: 0 };\n public transactionFilterValue = '';\n public today = new Date(Date.now());\n public startDate = new Date(this.today.getFullYear(), this.today.getMonth(), 1, 0, 0, 0);\n public endDate = new Date(this.today.getFullYear(), this.today.getMonth(), this.getMonthDays(this.today.getMonth(), this.today.getFullYear()), 23, 59, 59);\n public transactionsReportData: any = [{ date: '', name: '1', series: [{ extra: { total: 0.0 }, name: 'Paid', value: 0.0 }, { extra: { total: 0.0 }, name: 'Received', value: 0.0 }] }];\n public transactionsNonZeroReportData: any = [{ amount_paid: 0.0, amount_received: 0.0, date: '', num_invoices: 0, num_payments: 0 }];\n public view: [number, number] = [350, 350];\n public screenPaddingX = 100;\n public gradient = true;\n public xAxisLabel = 'Date';\n public yAxisLabel = 'Amount (Sats)';\n public showYAxisLabel = true;\n public screenSize = '';\n public screenSizeEnum = ScreenSizeEnum;\n public errorMessage = '';\n public apiCallStatus: ApiCallStatusPayload | null = null;\n public apiCallStatusEnum = APICallStatusEnum;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject()];\n\n constructor(private logger: LoggerService, private commonService: CommonService, private store: Store<RTLState>) { }\n\n ngOnInit() {\n this.screenSize = this.commonService.getScreenSize();\n this.showYAxisLabel = !(this.screenSize === ScreenSizeEnum.XS || this.screenSize === ScreenSizeEnum.SM);\n this.store.select(clnPageSettings).pipe(takeUntil(this.unSubs[0])).\n subscribe((settings: { pageSettings: PageSettings[], apiCallStatus: ApiCallStatusPayload }) => {\n this.tableSetting = settings.pageSettings.find((page) => page.pageId === this.PAGE_ID)?.tables.find((table) => table.tableId === this.tableSetting.tableId) || LND_DEFAULT_PAGE_SETTINGS.find((page) => page.pageId === this.PAGE_ID)?.tables.find((table) => table.tableId === this.tableSetting.tableId)!;\n if (this.screenSize === ScreenSizeEnum.XS || this.screenSize === ScreenSizeEnum.SM) {\n this.displayedColumns = JSON.parse(JSON.stringify(this.tableSetting.columnSelectionSM));\n } else {\n this.displayedColumns = JSON.parse(JSON.stringify(this.tableSetting.columnSelection));\n }\n this.displayedColumns.push('actions');\n this.colWidth = this.displayedColumns.length ? ((this.commonService.getContainerSize().width / this.displayedColumns.length) / 10) + 'rem' : '20rem';\n this.logger.info(this.displayedColumns);\n });\n\n this.store.select(allLightningTransactions).pipe(takeUntil(this.unSubs[1])).\n subscribe((allLTSelector: { allLightningTransactions: { listPaymentsAll: ListPayments, listInvoicesAll: ListInvoices }, apiCallStatus: ApiCallStatusPayload }) => {\n if (allLTSelector.apiCallStatus.status === APICallStatusEnum.UN_INITIATED) {\n this.store.dispatch(getAllLightningTransactions());\n }\n this.errorMessage = '';\n this.apiCallStatus = allLTSelector.apiCallStatus;\n if (this.apiCallStatus.status === APICallStatusEnum.ERROR) {\n this.errorMessage = !this.apiCallStatus.message ? '' : (typeof (this.apiCallStatus.message) === 'object') ? JSON.stringify(this.apiCallStatus.message) : this.apiCallStatus.message;\n }\n this.payments = allLTSelector.allLightningTransactions.listPaymentsAll.payments || [];\n this.invoices = allLTSelector.allLightningTransactions.listInvoicesAll.invoices || [];\n if (this.payments.length > 0 || this.invoices.length > 0) {\n this.transactionsReportData = this.filterTransactionsForSelectedPeriod(this.startDate, this.endDate);\n this.transactionsNonZeroReportData = this.prepareTableData();\n }\n this.logger.info(allLTSelector);\n });\n this.commonService.containerSizeUpdated.pipe(takeUntil(this.unSubs[2])).subscribe((CONTAINER_SIZE) => {\n switch (this.screenSize) {\n case ScreenSizeEnum.MD:\n this.screenPaddingX = CONTAINER_SIZE.width / 10;\n break;\n\n case ScreenSizeEnum.LG:\n this.screenPaddingX = CONTAINER_SIZE.width / 16;\n break;\n\n default:\n this.screenPaddingX = CONTAINER_SIZE.width / 20;\n break;\n }\n this.view = [CONTAINER_SIZE.width - this.screenPaddingX, CONTAINER_SIZE.height / 2.2];\n this.logger.info('Container Size: ' + JSON.stringify(CONTAINER_SIZE));\n this.logger.info('View: ' + JSON.stringify(this.view));\n });\n }\n\n @HostListener('mouseup', ['$event']) onChartMouseUp(e) {\n if (e.srcElement.tagName === 'svg' && e.srcElement.classList.length > 0 && e.srcElement.classList[0] === 'ngx-charts') {\n this.transactionFilterValue = '';\n }\n }\n\n onChartBarSelected(event) {\n if (this.reportPeriod === SCROLL_RANGES[1]) {\n this.transactionFilterValue = event.series + '/' + this.startDate.getFullYear();\n } else {\n this.transactionFilterValue = event.series.toString().padStart(2, '0') + '/' + MONTHS[this.startDate.getMonth()].name + '/' + this.startDate.getFullYear();\n }\n }\n\n filterTransactionsForSelectedPeriod(start: Date, end: Date) {\n const startDateInSeconds = Math.round(start.getTime() / 1000);\n const endDateInSeconds = Math.round(end.getTime() / 1000);\n const transactionsReport: any[] = [];\n this.transactionsNonZeroReportData = [];\n this.transactionsReportSummary = { paymentsSelectedPeriod: 0, invoicesSelectedPeriod: 0, amountPaidSelectedPeriod: 0, amountReceivedSelectedPeriod: 0 };\n const filteredPayments = this.payments?.filter((payment) => payment.status === 'SUCCEEDED' && payment.creation_date && payment.creation_date >= startDateInSeconds && payment.creation_date < endDateInSeconds);\n const filteredInvoices = this.invoices?.filter((invoice) => invoice.settled && invoice.creation_date && +invoice.creation_date >= startDateInSeconds && +invoice.creation_date < endDateInSeconds);\n this.transactionsReportSummary.paymentsSelectedPeriod = filteredPayments.length;\n this.transactionsReportSummary.invoicesSelectedPeriod = filteredInvoices.length;\n if (this.reportPeriod === SCROLL_RANGES[1]) {\n for (let i = 0; i < 12; i++) {\n transactionsReport.push({ name: MONTHS[i].name, date: new Date(start.getFullYear(), i, 1, 0, 0, 0, 0), series: [{ name: 'Paid', value: 0, extra: { total: 0 } }, { name: 'Received', value: 0, extra: { total: 0 } }] });\n }\n filteredPayments?.map((payment) => {\n const monthNumber = new Date(+(payment.creation_date || 0) * 1000).getMonth();\n this.transactionsReportSummary.amountPaidSelectedPeriod = this.transactionsReportSummary.amountPaidSelectedPeriod + (+(payment.value_msat || 0)) + (+(payment.fee_msat || 0));\n transactionsReport[monthNumber].series[0].value = transactionsReport[monthNumber].series[0].value + ((+(payment.value_msat || 0) + +(payment.fee_msat || 0)) / 1000);\n transactionsReport[monthNumber].series[0].extra.total = transactionsReport[monthNumber].series[0].extra.total + 1;\n return this.transactionsReportSummary;\n });\n filteredInvoices?.map((invoice) => {\n const monthNumber = new Date(+(invoice.creation_date || 0) * 1000).getMonth();\n this.transactionsReportSummary.amountReceivedSelectedPeriod = this.transactionsReportSummary.amountReceivedSelectedPeriod + (+(invoice.amt_paid_msat || 0));\n transactionsReport[monthNumber].series[1].value = transactionsReport[monthNumber].series[1].value + (+(invoice.amt_paid_msat || 0) / 1000);\n transactionsReport[monthNumber].series[1].extra.total = transactionsReport[monthNumber].series[1].extra.total + 1;\n return this.transactionsReportSummary;\n });\n } else {\n for (let i = 0; i < this.getMonthDays(start.getMonth(), start.getFullYear()); i++) {\n transactionsReport.push({ name: (i + 1).toString(), date: new Date((((i) * this.secondsInADay) + startDateInSeconds) * 1000), series: [{ name: 'Paid', value: 0, extra: { total: 0 } }, { name: 'Received', value: 0, extra: { total: 0 } }] });\n }\n filteredPayments?.map((payment) => {\n const dateNumber = Math.floor((+(payment.creation_date || 0) - startDateInSeconds) / this.secondsInADay);\n this.transactionsReportSummary.amountPaidSelectedPeriod = this.transactionsReportSummary.amountPaidSelectedPeriod + (+(payment.value_msat || 0)) + (+(payment.fee_msat || 0));\n transactionsReport[dateNumber].series[0].value = transactionsReport[dateNumber].series[0].value + ((+(payment.value_msat || 0) + +(payment.fee_msat || 0)) / 1000);\n transactionsReport[dateNumber].series[0].extra.total = transactionsReport[dateNumber].series[0].extra.total + 1;\n return this.transactionsReportSummary;\n });\n filteredInvoices?.map((invoice) => {\n const dateNumber = Math.floor((+(invoice.creation_date || 0) - startDateInSeconds) / this.secondsInADay);\n this.transactionsReportSummary.amountReceivedSelectedPeriod = this.transactionsReportSummary.amountReceivedSelectedPeriod + (+(invoice.amt_paid_msat || 0));\n transactionsReport[dateNumber].series[1].value = transactionsReport[dateNumber].series[1].value + (+(invoice.amt_paid_msat || 0) / 1000);\n transactionsReport[dateNumber].series[1].extra.total = transactionsReport[dateNumber].series[1].extra.total + 1;\n return this.transactionsReportSummary;\n });\n }\n return transactionsReport;\n }\n\n prepareTableData() {\n return this.transactionsReportData?.reduce((acc, curr) => {\n if (curr.series[0].extra.total > 0 || curr.series[1].extra.total > 0) {\n return acc.concat({ date: curr.date, amount_paid: curr.series[0].value, num_payments: curr.series[0].extra.total, amount_received: curr.series[1].value, num_invoices: curr.series[1].extra.total });\n }\n return acc;\n }, []);\n }\n\n onSelectionChange(selectedValues: { selDate: Date, selScrollRange: string }) {\n const selMonth = selectedValues.selDate.getMonth();\n const selYear = selectedValues.selDate.getFullYear();\n this.reportPeriod = selectedValues.selScrollRange;\n if (this.reportPeriod === SCROLL_RANGES[1]) {\n this.startDate = new Date(selYear, 0, 1, 0, 0, 0);\n this.endDate = new Date(selYear, 11, 31, 23, 59, 59);\n } else {\n this.startDate = new Date(selYear, selMonth, 1, 0, 0, 0);\n this.endDate = new Date(selYear, selMonth, this.getMonthDays(selMonth, selYear), 23, 59, 59);\n }\n this.transactionsReportData = this.filterTransactionsForSelectedPeriod(this.startDate, this.endDate);\n this.transactionsNonZeroReportData = this.prepareTableData();\n this.transactionFilterValue = '';\n }\n\n getMonthDays(selMonth: number, selYear: number) {\n return (selMonth === 1 && selYear % 4 === 0) ? (MONTHS[selMonth].days + 1) : MONTHS[selMonth].days;\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n\n","<div fxLayout=\"row\">\n <div fxFlex=\"100\">\n <mat-card-header fxLayout=\"row\" fxLayoutAlign=\"space-between center\" class=\"modal-info-header\">\n <div fxFlex=\"95\" fxLayoutAlign=\"start start\">\n <span class=\"page-title\">Label UTXO</span>\n </div>\n <button tabindex=\"8\" fxFlex=\"5\" fxLayoutAlign=\"center\" class=\"btn-close-x p-0\" default mat-button [mat-dialog-close]=\"false\">X</button>\n </mat-card-header>\n <mat-card-content class=\"padding-gap-x-large\">\n <form #form=\"ngForm\" fxLayout=\"row wrap\" fxLayoutAlign=\"space-between start\" fxFlex=\"100\" class=\"overflow-x-hidden\" (submit)=\"onLabelUTXO()\" (reset)=\"resetData()\">\n <mat-form-field fxFlex.gt-sm=\"100\">\n <input autoFocus matInput placeholder=\"UTXO Label\" name=\"label\" tabindex=\"1\" required [(ngModel)]=\"label\">\n <mat-error *ngIf=\"!label\">UTXO Label is required.</mat-error>\n </mat-form-field>\n <div *ngIf=\"labelError !== ''\" fxFlex=\"100\" class=\"alert alert-danger mt-1\">\n <fa-icon class=\"mr-1 alert-icon\" [icon]=\"faExclamationTriangle\"></fa-icon>\n <span *ngIf=\"labelError !== ''\">{{labelError}}</span>\n </div>\n <div fxLayout=\"row\" fxFlex=\"100\" class=\"mt-2\" fxLayoutAlign=\"end center\">\n <button class=\"mr-1\" mat-button color=\"primary\" tabindex=\"7\" type=\"reset\">Clear</button>\n <button mat-button color=\"primary\" type=\"submit\" tabindex=\"8\">Label UTXO</button>\n </div>\n </form>\n </mat-card-content>\n </div>\n</div>\n","import { Component, OnInit, OnDestroy, ViewChild, Inject } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';\nimport { Store } from '@ngrx/store';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\nimport { UTXO } from '../../../shared/models/lndModels';\nimport { OnChainLabelUTXO } from '../../../shared/models/alertData';\nimport { DataService } from '../../../shared/services/data.service';\n\nimport { RTLState } from '../../../store/rtl.state';\nimport { CommonService } from '../../../shared/services/common.service';\nimport { fetchTransactions, fetchUTXOs } from '../../store/lnd.actions';\n\n@Component({\n selector: 'rtl-on-chain-lebel-modal',\n templateUrl: './on-chain-label-modal.component.html',\n styleUrls: ['./on-chain-label-modal.component.scss']\n})\nexport class OnChainLabelModalComponent implements OnInit, OnDestroy {\n\n @ViewChild('form', { static: true }) form: any;\n public faExclamationTriangle = faExclamationTriangle;\n public utxo: UTXO | null = null;\n public label = '';\n public labelError = '';\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject(), new Subject()];\n\n constructor(public dialogRef: MatDialogRef<OnChainLabelModalComponent>, @Inject(MAT_DIALOG_DATA) public data: OnChainLabelUTXO, private dataService: DataService, private store: Store<RTLState>, private snackBar: MatSnackBar, private commonService: CommonService) { }\n\n ngOnInit() {\n this.utxo = this.data.utxo;\n this.label = this.utxo.label || '';\n }\n\n onLabelUTXO(): boolean | void {\n if (!this.label || this.label === '') {\n return true;\n }\n this.labelError = '';\n this.dataService.labelUTXO((this.utxo && this.utxo.outpoint && this.utxo.outpoint.txid_bytes ? this.utxo.outpoint.txid_bytes : ''), this.label, true).\n pipe(takeUntil(this.unSubs[0])).\n subscribe({\n next: (res) => {\n this.store.dispatch(fetchTransactions());\n this.store.dispatch(fetchUTXOs());\n this.snackBar.open('Successfully labelled the UTXO.');\n this.dialogRef.close();\n }, error: (err) => {\n this.labelError = err;\n }\n });\n }\n\n resetData() {\n this.labelError = '';\n this.label = '';\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"start stretch\" class=\"padding-gap-x-large\">\n <div fxLayout=\"column\" fxLayout.gt-xs=\"row wrap\" fxLayoutAlign.gt-xs=\"end stretch\" fxLayoutAlign=\"start stretch\" class=\"page-sub-title-container\">\n <div fxFlex.gt-xs=\"30\" fxLayoutAlign.gt-xs=\"space-between center\" fxLayout=\"row\" fxLayoutAlign=\"space-between stretch\">\n <mat-form-field fxFlex=\"49\">\n <mat-select placeholder=\"Filter By\" tabindex=\"1\" name=\"filterBy\" [(ngModel)]=\"selFilterBy\" (selectionChange)=\"selFilter=''; applyFilter()\">\n <mat-option *ngFor=\"let column of (utxos && utxos.length > 0 && dustUtxos && dustUtxos.length > 0 && !isDustUTXO ? ['all'].concat(displayedColumns.slice(0, -1)) : ['all'].concat(displayedColumns.slice(0, -1)))\" [value]=\"column\">{{getLabel(column)}}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field fxFlex=\"49\">\n <input matInput name=\"filter\" placeholder=\"Filter\" [(ngModel)]=\"selFilter\" (input)=\"applyFilter()\" (keyup)=\"applyFilter()\">\n </mat-form-field>\n </div>\n </div>\n <div fxLayout=\"row\" fxLayoutAlign=\"start start\">\n <div fxLayout=\"column\" fxLayoutAlign=\"start end\" fxFlex=\"100\" class=\"table-container\" [perfectScrollbar]>\n <mat-progress-bar *ngIf=\"apiCallStatus.status === apiCallStatusEnum.INITIATED\" mode=\"indeterminate\"></mat-progress-bar>\n <table #table mat-table fxFlex=\"100\" matSort [dataSource]=\"listUTXOs\" [ngClass]=\"{'error-border': errorMessage !== ''}\">\n <ng-container matColumnDef=\"is_dust\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header matTooltip=\"Dust/Nondust\"></th>\n <td *matCellDef=\"let utxo\" mat-cell>\n <span *ngIf=\"utxo.amount_sat < dustAmount; else emptySpace\" matTooltip=\"Risk of dust attack\" matTooltipPosition=\"right\">\n <mat-icon fxLayoutAlign=\"start center\" color=\"warn\" class=\"small-icon\">warning</mat-icon>\n </span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"tx_id\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Transaction ID</th>\n <td *matCellDef=\"let utxo\" mat-cell>\n <span fxLayout=\"row\" class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{utxo.outpoint.txid_str}}</span>\n </span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"output\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Output</th>\n <td *matCellDef=\"let utxo\" mat-cell>\n <span fxLayoutAlign=\"end center\">{{utxo.outpoint.output_index}}</span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"label\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Label</th>\n <td *matCellDef=\"let utxo\" mat-cell>\n <span fxLayout=\"row\" class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{utxo.label}}</span>\n </span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"address_type\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Address Type</th>\n <td *matCellDef=\"let utxo\" mat-cell>\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\">\n {{addressType[utxo.address_type].name}} \n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"address\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Address</th>\n <td *matCellDef=\"let utxo\" mat-cell>\n <span fxLayout=\"row\" class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{utxo?.address}}</span>\n </span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"amount_sat\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Amount (Sats)</th>\n <td *matCellDef=\"let utxo\" mat-cell>\n <span fxLayoutAlign=\"end center\">{{(utxo.amount_sat || 0) | number}}</span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"confirmations\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Confirmations</th>\n <td *matCellDef=\"let utxo\" mat-cell><span fxLayoutAlign=\"end center\">{{(utxo.confirmations || 0) | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"actions\">\n <th *matHeaderCellDef mat-header-cell>\n <div class=\"bordered-box table-actions-select\" fxLayoutAlign=\"center center\">\n <mat-select placeholder=\"Actions\" tabindex=\"1\" class=\"mr-0\">\n <mat-select-trigger></mat-select-trigger>\n <mat-option (click)=\"onDownloadCSV()\">Download CSV</mat-option>\n </mat-select>\n </div>\n </th>\n <td *matCellDef=\"let utxo\" mat-cell fxLayoutAlign=\"end center\">\n <div class=\"bordered-box table-actions-select\" fxLayoutAlign=\"center center\">\n <mat-select placeholder=\"Actions\" tabindex=\"2\" class=\"mr-0\">\n <mat-select-trigger></mat-select-trigger>\n <mat-option (click)=\"onUTXOClick(utxo)\">View Info</mat-option>\n <mat-option (click)=\"onLabelUTXO(utxo)\">Label</mat-option>\n <mat-option (click)=\"onLeaseUTXO(utxo)\">Lease</mat-option>\n </mat-select>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"no_utxo\">\n <td *matFooterCellDef mat-footer-cellcolspan=\"4\">\n <p *ngIf=\"(!listUTXOs?.data || listUTXOs?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.COMPLETED\">No UTXO available.</p>\n <p *ngIf=\"(!listUTXOs?.data || listUTXOs?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.INITIATED\">Getting UTXOs...</p>\n <p *ngIf=\"(!listUTXOs?.data || listUTXOs?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.ERROR\">{{errorMessage}}</p>\n </td>\n </ng-container>\n <tr *matFooterRowDef=\"['no_utxo']\" mat-footer-row [ngClass]=\"{'display-none': listUTXOs?.data && listUTXOs?.data?.length>0}\"></tr>\n <tr *matHeaderRowDef=\"displayedColumns\" mat-header-row></tr>\n <tr *matRowDef=\"let row; columns: displayedColumns;\" mat-row></tr>\n </table>\n <mat-paginator class=\"mb-1\" [pageSize]=\"pageSize\" [pageSizeOptions]=\"pageSizeOptions\" [showFirstLastButtons]=\"screenSize === screenSizeEnum.XS ? false : true\"></mat-paginator>\n </div>\n </div>\n</div>\n<ng-template #emptySpace>\n <mat-icon fxLayoutAlign=\"start center\" color=\"warn\" class=\"small-icon\"></mat-icon>\n</ng-template>\n","import { Component, ViewChild, Input, OnChanges, OnDestroy, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { DecimalPipe } from '@angular/common';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { faMoneyBillWave } from '@fortawesome/free-solid-svg-icons';\n\nimport { MatPaginator, MatPaginatorIntl } from '@angular/material/paginator';\nimport { MatSort } from '@angular/material/sort';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { UTXO } from '../../../../shared/models/lndModels';\nimport { PAGE_SIZE, PAGE_SIZE_OPTIONS, getPaginatorLabel, AlertTypeEnum, DataTypeEnum, ScreenSizeEnum, WALLET_ADDRESS_TYPE, APICallStatusEnum, SortOrderEnum, LND_DEFAULT_PAGE_SETTINGS, LND_PAGE_DEFS } from '../../../../shared/services/consts-enums-functions';\nimport { ApiCallStatusPayload } from '../../../../shared/models/apiCallsPayload';\nimport { LoggerService } from '../../../../shared/services/logger.service';\nimport { CommonService } from '../../../../shared/services/common.service';\nimport { DataService } from '../../../../shared/services/data.service';\nimport { OnChainLabelModalComponent } from '../../on-chain-label-modal/on-chain-label-modal.component';\n\nimport { RTLEffects } from '../../../../store/rtl.effects';\nimport { RTLState } from '../../../../store/rtl.state';\nimport { openAlert, openConfirmation } from '../../../../store/rtl.actions';\nimport { lndPageSettings, utxos } from '../../../store/lnd.selector';\nimport { ColumnDefinition, PageSettings, TableSetting } from '../../../../shared/models/pageSettings';\nimport { CamelCaseWithReplacePipe } from '../../../../shared/pipes/app.pipe';\n\n@Component({\n selector: 'rtl-on-chain-utxos',\n templateUrl: './utxos.component.html',\n styleUrls: ['./utxos.component.scss'],\n providers: [\n { provide: MatPaginatorIntl, useValue: getPaginatorLabel('UTXOs') }\n ]\n})\nexport class OnChainUTXOsComponent implements OnInit, OnChanges, OnDestroy {\n\n @ViewChild(MatSort, { static: false }) sort: MatSort | undefined;\n @ViewChild(MatPaginator, { static: false }) paginator: MatPaginator | undefined;\n @Input() isDustUTXO = false;\n @Input() dustAmount = 1000;\n public faMoneyBillWave = faMoneyBillWave;\n public nodePageDefs = LND_PAGE_DEFS;\n public selFilterBy = 'all';\n public colWidth = '20rem';\n public PAGE_ID = 'on_chain';\n public tableSetting: TableSetting = { tableId: 'utxos', recordsPerPage: PAGE_SIZE, sortBy: 'tx_id', sortOrder: SortOrderEnum.DESCENDING };\n public utxos: UTXO[];\n public dustUtxos: UTXO[];\n public addressType = WALLET_ADDRESS_TYPE;\n public displayedColumns: any[] = [];\n public listUTXOs: any = new MatTableDataSource([]);\n public pageSize = PAGE_SIZE;\n public pageSizeOptions = PAGE_SIZE_OPTIONS;\n public screenSize = '';\n public screenSizeEnum = ScreenSizeEnum;\n public errorMessage = '';\n public selFilter = '';\n public apiCallStatus: ApiCallStatusPayload | null = null;\n public apiCallStatusEnum = APICallStatusEnum;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject(), new Subject()];\n\n constructor(private logger: LoggerService, private commonService: CommonService, private dataService: DataService, private store: Store<RTLState>, private rtlEffects: RTLEffects, private decimalPipe: DecimalPipe, private camelCaseWithReplace: CamelCaseWithReplacePipe) {\n this.screenSize = this.commonService.getScreenSize();\n }\n\n ngOnInit() {\n this.tableSetting.tableId = this.isDustUTXO ? 'dust_utxos' : 'utxos';\n this.store.select(lndPageSettings).pipe(takeUntil(this.unSubs[0])).\n subscribe((settings: { pageSettings: PageSettings[], apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessage = '';\n this.apiCallStatus = settings.apiCallStatus;\n if (this.apiCallStatus.status === APICallStatusEnum.ERROR) {\n this.errorMessage = this.apiCallStatus.message || '';\n }\n this.tableSetting = settings.pageSettings.find((page) => page.pageId === this.PAGE_ID)?.tables.find((table) => table.tableId === this.tableSetting.tableId) || LND_DEFAULT_PAGE_SETTINGS.find((page) => page.pageId === this.PAGE_ID)?.tables.find((table) => table.tableId === this.tableSetting.tableId)!;\n if (this.screenSize === ScreenSizeEnum.XS || this.screenSize === ScreenSizeEnum.SM) {\n this.displayedColumns = JSON.parse(JSON.stringify(this.tableSetting.columnSelectionSM));\n } else {\n this.displayedColumns = JSON.parse(JSON.stringify(this.tableSetting.columnSelection));\n }\n this.displayedColumns.push('actions');\n this.pageSize = this.tableSetting.recordsPerPage ? +this.tableSetting.recordsPerPage : PAGE_SIZE;\n this.colWidth = this.displayedColumns.length ? ((this.commonService.getContainerSize().width / this.displayedColumns.length) / 10) + 'rem' : '20rem';\n this.logger.info(this.displayedColumns);\n });\n this.store.select(utxos).pipe(takeUntil(this.unSubs[1])).\n subscribe((utxosSelector: { utxos: UTXO[], apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessage = '';\n this.apiCallStatus = utxosSelector.apiCallStatus;\n if (this.apiCallStatus.status === APICallStatusEnum.ERROR) {\n this.errorMessage = !this.apiCallStatus.message ? '' : (typeof (this.apiCallStatus.message) === 'object') ? JSON.stringify(this.apiCallStatus.message) : this.apiCallStatus.message;\n }\n if (utxosSelector.utxos && utxosSelector.utxos.length > 0) {\n this.dustUtxos = utxosSelector.utxos?.filter((utxo) => +(utxo.amount_sat || 0) < this.dustAmount);\n this.utxos = utxosSelector.utxos;\n if (this.utxos.length > 0 && this.dustUtxos.length > 0 && !this.isDustUTXO) {\n this.displayedColumns.unshift('is_dust');\n }\n this.loadUTXOsTable((this.isDustUTXO) ? this.dustUtxos : this.utxos);\n }\n this.logger.info(utxosSelector);\n });\n }\n\n ngOnChanges() {\n if (!this.isDustUTXO && this.utxos && this.utxos.length > 0) {\n this.loadUTXOsTable(this.utxos);\n }\n if (this.isDustUTXO && this.dustUtxos && this.dustUtxos.length > 0) {\n this.loadUTXOsTable(this.dustUtxos);\n }\n }\n\n applyFilter() {\n this.listUTXOs.filter = this.selFilter.trim().toLowerCase();\n }\n\n getLabel(column: string) {\n const returnColumn: ColumnDefinition = this.nodePageDefs[this.PAGE_ID][this.tableSetting.tableId].allowedColumns.find((col) => col.column === column);\n return returnColumn ? returnColumn.label ? returnColumn.label : this.camelCaseWithReplace.transform(returnColumn.column, '_') : column === 'is_dust' ? 'Dust' : this.commonService.titleCase(column);\n }\n\n setFilterPredicate() {\n this.listUTXOs.filterPredicate = (rowData: UTXO, fltr: string) => {\n let rowToFilter = '';\n switch (this.selFilterBy) {\n case 'all':\n rowToFilter = ((rowData.label ? rowData.label.toLowerCase() : '') + (rowData.outpoint?.txid_str ? rowData.outpoint.txid_str.toLowerCase() : '') + (rowData.outpoint?.output_index ? rowData.outpoint?.output_index : '') +\n (rowData.outpoint?.txid_bytes ? rowData.outpoint?.txid_bytes.toLowerCase() : '') + (rowData.address ? rowData.address.toLowerCase() : '') + (rowData.address_type ? this.addressType[rowData.address_type].name.toLowerCase() : '') +\n (rowData.amount_sat ? rowData.amount_sat : '') + (rowData.confirmations ? rowData.confirmations : ''));\n break;\n\n case 'is_dust':\n rowToFilter = (rowData?.amount_sat || 0) < this.dustAmount ? 'dust' : 'nondust';\n break;\n\n case 'tx_id':\n rowToFilter = (rowData.outpoint && rowData.outpoint.txid_str ? rowData.outpoint.txid_str.toLowerCase() : '');\n break;\n\n case 'output':\n rowToFilter = (rowData.outpoint && rowData.outpoint.output_index ? rowData.outpoint.output_index.toString() : '0');\n break;\n\n case 'address_type':\n rowToFilter = (rowData.address_type && this.addressType[rowData.address_type] && this.addressType[rowData.address_type].name ? this.addressType[rowData.address_type].name.toLowerCase() : '');\n break;\n\n default:\n rowToFilter = typeof rowData[this.selFilterBy] === 'undefined' ? '' : typeof rowData[this.selFilterBy] === 'string' ? rowData[this.selFilterBy].toLowerCase() : typeof rowData[this.selFilterBy] === 'boolean' ? (rowData[this.selFilterBy] ? 'yes' : 'no') : rowData[this.selFilterBy].toString();\n break;\n }\n return (this.selFilterBy === 'is_dust' || this.selFilterBy === 'address_type') ? rowToFilter.indexOf(fltr) === 0 : rowToFilter.includes(fltr);\n };\n }\n\n onUTXOClick(selUTXO: UTXO) {\n const reorderedUTXOs = [\n [{ key: 'txid', value: selUTXO.outpoint?.txid_str, title: 'Transaction ID', width: 100, type: DataTypeEnum.STRING }],\n [{ key: 'label', value: selUTXO.label, title: 'Label', width: 100, type: DataTypeEnum.STRING }],\n [{ key: 'output_index', value: selUTXO.outpoint?.output_index, title: 'Output Index', width: 34, type: DataTypeEnum.NUMBER },\n { key: 'amount_sat', value: selUTXO.amount_sat, title: 'Amount (Sats)', width: 33, type: DataTypeEnum.NUMBER },\n { key: 'confirmations', value: selUTXO.confirmations, title: 'Confirmations', width: 33, type: DataTypeEnum.NUMBER }],\n [{ key: 'address_type', value: (selUTXO.address_type ? this.addressType[selUTXO.address_type].name : ''), title: 'Address Type', width: 34 },\n { key: 'address', value: selUTXO.address, title: 'Address', width: 66 }],\n [{ key: 'pk_script', value: selUTXO.pk_script, title: 'PK Script', width: 100, type: DataTypeEnum.STRING }]\n ];\n this.store.dispatch(openAlert({\n payload: {\n data: {\n type: AlertTypeEnum.INFORMATION,\n alertTitle: 'UTXO Information',\n message: reorderedUTXOs\n }\n }\n }));\n }\n\n loadUTXOsTable(UTXOs: UTXO[]) {\n this.listUTXOs = new MatTableDataSource<UTXO>([...UTXOs]);\n this.listUTXOs.sortingDataAccessor = (data: any, sortHeaderId: string) => {\n switch (sortHeaderId) {\n case 'is_dust': return +(data.amount_sat || 0) < this.dustAmount;\n case 'tx_id': return data.outpoint.txid_str.toLocaleLowerCase();\n case 'output': return +data.outpoint.output_index;\n default: return (data[sortHeaderId] && isNaN(data[sortHeaderId])) ? data[sortHeaderId].toLocaleLowerCase() : data[sortHeaderId] ? +data[sortHeaderId] : null;\n }\n };\n this.listUTXOs.sort = this.sort;\n this.listUTXOs.sort?.sort({ id: this.tableSetting.sortBy, start: this.tableSetting.sortOrder, disableClear: true });\n this.listUTXOs.paginator = this.paginator;\n this.setFilterPredicate();\n this.applyFilter();\n this.logger.info(this.listUTXOs);\n }\n\n onLabelUTXO(utxo: UTXO) {\n this.store.dispatch(openAlert({\n payload: {\n data: {\n utxo: utxo,\n component: OnChainLabelModalComponent\n }\n }\n }));\n }\n\n onLeaseUTXO(utxo: UTXO) {\n const utxoDetails = [\n [{ key: 'txid_str', value: utxo.outpoint?.txid_str, title: 'Transaction ID', width: 100 }],\n [{ key: 'amount_sat', value: this.decimalPipe.transform(utxo.amount_sat), title: 'Amount (Sats)', width: 100 }]\n ];\n if (utxo.label) {\n utxoDetails.splice(1, 0, [{ key: 'label', value: utxo.label, title: 'Label', width: 100 }]);\n }\n this.store.dispatch(openConfirmation({\n payload: {\n data: {\n type: AlertTypeEnum.CONFIRM,\n alertTitle: 'Lease UTXO',\n informationMessage: 'The UTXO will be leased for 10 minutes.',\n message: utxoDetails,\n noBtnText: 'Cancel',\n yesBtnText: 'Lease UTXO'\n }\n }\n }));\n this.rtlEffects.closeConfirm.\n pipe(takeUntil(this.unSubs[2])).\n subscribe((confirmRes) => {\n if (confirmRes) {\n this.dataService.leaseUTXO((utxo.outpoint?.txid_bytes || ''), (utxo.outpoint?.output_index || 0));\n }\n });\n }\n\n onDownloadCSV() {\n if (this.listUTXOs.data && this.listUTXOs.data.length > 0) {\n this.commonService.downloadFile(this.listUTXOs.data, 'UTXOs');\n }\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"start stretch\" class=\"padding-gap-x-large\">\n <div fxLayout=\"column\" fxLayout.gt-xs=\"row wrap\" fxLayoutAlign.gt-xs=\"end stretch\" fxLayoutAlign=\"start stretch\" class=\"page-sub-title-container\">\n <div fxFlex.gt-xs=\"30\" fxLayoutAlign.gt-xs=\"space-between center\" fxLayout=\"row\" fxLayoutAlign=\"space-between stretch\">\n <mat-form-field fxFlex=\"49\">\n <mat-select placeholder=\"Filter By\" tabindex=\"1\" name=\"filterBy\" [(ngModel)]=\"selFilterBy\" (selectionChange)=\"selFilter=''; applyFilter()\">\n <mat-option *ngFor=\"let column of ['all'].concat(displayedColumns.slice(0, -1))\" [value]=\"column\">{{getLabel(column)}}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field fxFlex=\"49\">\n <input matInput name=\"filter\" placeholder=\"Filter\" [(ngModel)]=\"selFilter\" (input)=\"applyFilter()\" (keyup)=\"applyFilter()\">\n </mat-form-field>\n </div>\n </div>\n <div fxLayout=\"row\" fxLayoutAlign=\"start start\">\n <div fxLayout=\"column\" fxLayoutAlign=\"start end\" fxFlex=\"100\" class=\"table-container\" [perfectScrollbar]>\n <mat-progress-bar *ngIf=\"apiCallStatus.status === apiCallStatusEnum.INITIATED\" mode=\"indeterminate\"></mat-progress-bar>\n <table #table mat-table fxFlex=\"100\" matSort [dataSource]=\"listTransactions\" [ngClass]=\"{'error-border': errorMessage !== ''}\">\n <ng-container matColumnDef=\"time_stamp\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Date/Time</th>\n <td *matCellDef=\"let transaction\" mat-cell>{{(transaction.time_stamp * 1000) | date:'dd/MMM/y HH:mm'}}</td>\n </ng-container>\n <ng-container matColumnDef=\"label\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Label</th>\n <td *matCellDef=\"let transaction\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{transaction?.label}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"block_hash\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Block Hash</th>\n <td *matCellDef=\"let transaction\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{transaction?.block_hash}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"tx_hash\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Transaction Hash</th>\n <td *matCellDef=\"let transaction\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{transaction?.tx_hash}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"amount\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Amount (Sats)</th>\n <td *matCellDef=\"let transaction\" mat-cell>\n <span *ngIf=\"transaction.amount > 0 || transaction.amount === 0\" fxLayoutAlign=\"end center\">{{transaction.amount | number}}</span>\n <span *ngIf=\"transaction.amount < 0\" fxLayoutAlign=\"end center\" class=\"red\">({{transaction.amount * -1 | number}})</span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"total_fees\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Fees (Sats)</th>\n <td *matCellDef=\"let transaction\" mat-cell><span fxLayoutAlign=\"end center\">{{transaction.total_fees | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"block_height\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Block Height</th>\n <td *matCellDef=\"let transaction\" mat-cell><span fxLayoutAlign=\"end center\">{{transaction.block_height | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"num_confirmations\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Confirmations</th>\n <td *matCellDef=\"let transaction\" mat-cell><span fxLayoutAlign=\"end center\">\n {{transaction?.num_confirmations | number}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"actions\">\n <th *matHeaderCellDef mat-header-cell>\n <div class=\"bordered-box table-actions-select\" fxLayoutAlign=\"center center\">\n <mat-select placeholder=\"Actions\" tabindex=\"1\" class=\"mr-0\">\n <mat-select-trigger></mat-select-trigger>\n <mat-option (click)=\"onDownloadCSV()\">Download CSV</mat-option>\n </mat-select>\n </div>\n </th>\n <td *matCellDef=\"let transaction\" mat-cell fxLayoutAlign=\"end center\">\n <button mat-stroked-button color=\"primary\" type=\"button\" tabindex=\"4\" class=\"table-actions-button\" (click)=\"onTransactionClick(transaction)\">View Info</button>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"no_transaction\">\n <td *matFooterCellDef mat-footer-cellcolspan=\"4\">\n <p *ngIf=\"(!listTransactions?.data || listTransactions?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.COMPLETED\">No transaction available.</p>\n <p *ngIf=\"(!listTransactions?.data || listTransactions?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.INITIATED\">Getting transactions...</p>\n <p *ngIf=\"(!listTransactions?.data || listTransactions?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.ERROR\">{{errorMessage}}</p>\n </td>\n </ng-container>\n <tr *matFooterRowDef=\"['no_transaction']\" mat-footer-row [ngClass]=\"{'display-none': listTransactions?.data && listTransactions?.data?.length>0}\"></tr>\n <tr *matHeaderRowDef=\"displayedColumns\" mat-header-row></tr>\n <tr *matRowDef=\"let row; columns: displayedColumns;\" mat-row></tr>\n </table>\n <mat-paginator class=\"mb-1\" [pageSize]=\"pageSize\" [pageSizeOptions]=\"pageSizeOptions\" [showFirstLastButtons]=\"screenSize === screenSizeEnum.XS ? false : true\"></mat-paginator>\n </div>\n </div>\n</div>","import { Component, ViewChild, Input, OnChanges, OnInit, OnDestroy } from '@angular/core';\nimport { DatePipe } from '@angular/common';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { faHistory } from '@fortawesome/free-solid-svg-icons';\n\nimport { MatPaginator, MatPaginatorIntl } from '@angular/material/paginator';\nimport { MatSort } from '@angular/material/sort';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { Transaction } from '../../../../shared/models/lndModels';\nimport { PAGE_SIZE, PAGE_SIZE_OPTIONS, getPaginatorLabel, AlertTypeEnum, DataTypeEnum, ScreenSizeEnum, APICallStatusEnum, SortOrderEnum, LND_DEFAULT_PAGE_SETTINGS, LND_PAGE_DEFS } from '../../../../shared/services/consts-enums-functions';\nimport { ApiCallStatusPayload } from '../../../../shared/models/apiCallsPayload';\nimport { LoggerService } from '../../../../shared/services/logger.service';\nimport { CommonService } from '../../../../shared/services/common.service';\n\nimport { RTLState } from '../../../../store/rtl.state';\nimport { openAlert } from '../../../../store/rtl.actions';\nimport { lndPageSettings, transactions } from '../../../store/lnd.selector';\nimport { ColumnDefinition, PageSettings, TableSetting } from '../../../../shared/models/pageSettings';\nimport { CamelCaseWithReplacePipe } from '../../../../shared/pipes/app.pipe';\n\n@Component({\n selector: 'rtl-on-chain-transaction-history',\n templateUrl: './on-chain-transaction-history.component.html',\n styleUrls: ['./on-chain-transaction-history.component.scss'],\n providers: [\n { provide: MatPaginatorIntl, useValue: getPaginatorLabel('Transactions') }\n ]\n})\nexport class OnChainTransactionHistoryComponent implements OnInit, OnChanges, OnDestroy {\n\n @ViewChild(MatSort, { static: false }) sort: MatSort | undefined;\n @ViewChild(MatPaginator, { static: false }) paginator: MatPaginator | undefined;\n public nodePageDefs = LND_PAGE_DEFS;\n public selFilterBy = 'all';\n public colWidth = '20rem';\n public PAGE_ID = 'on_chain';\n public tableSetting: TableSetting = { tableId: 'transactions', recordsPerPage: PAGE_SIZE, sortBy: 'time_stamp', sortOrder: SortOrderEnum.DESCENDING };\n public transactions: Transaction[];\n public faHistory = faHistory;\n public displayedColumns: any[] = [];\n public listTransactions: any = new MatTableDataSource([]);\n public pageSize = PAGE_SIZE;\n public pageSizeOptions = PAGE_SIZE_OPTIONS;\n public screenSize = '';\n public screenSizeEnum = ScreenSizeEnum;\n public errorMessage = '';\n public selFilter = '';\n public apiCallStatus: ApiCallStatusPayload | null = null;\n public apiCallStatusEnum = APICallStatusEnum;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject()];\n\n constructor(private logger: LoggerService, private commonService: CommonService, private store: Store<RTLState>, private datePipe: DatePipe, private camelCaseWithReplace: CamelCaseWithReplacePipe) {\n this.screenSize = this.commonService.getScreenSize();\n }\n\n ngOnInit() {\n this.store.select(lndPageSettings).pipe(takeUntil(this.unSubs[0])).\n subscribe((settings: { pageSettings: PageSettings[], apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessage = '';\n this.apiCallStatus = settings.apiCallStatus;\n if (this.apiCallStatus.status === APICallStatusEnum.ERROR) {\n this.errorMessage = this.apiCallStatus.message || '';\n }\n this.tableSetting = settings.pageSettings.find((page) => page.pageId === this.PAGE_ID)?.tables.find((table) => table.tableId === this.tableSetting.tableId) || LND_DEFAULT_PAGE_SETTINGS.find((page) => page.pageId === this.PAGE_ID)?.tables.find((table) => table.tableId === this.tableSetting.tableId)!;\n if (this.screenSize === ScreenSizeEnum.XS || this.screenSize === ScreenSizeEnum.SM) {\n this.displayedColumns = JSON.parse(JSON.stringify(this.tableSetting.columnSelectionSM));\n } else {\n this.displayedColumns = JSON.parse(JSON.stringify(this.tableSetting.columnSelection));\n }\n this.displayedColumns.push('actions');\n this.pageSize = this.tableSetting.recordsPerPage ? +this.tableSetting.recordsPerPage : PAGE_SIZE;\n this.colWidth = this.displayedColumns.length ? ((this.commonService.getContainerSize().width / this.displayedColumns.length) / 10) + 'rem' : '20rem';\n this.logger.info(this.displayedColumns);\n });\n this.store.select(transactions).pipe(takeUntil(this.unSubs[1])).\n subscribe((transactionsSelector: { transactions: Transaction[], apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessage = '';\n this.apiCallStatus = transactionsSelector.apiCallStatus;\n if (this.apiCallStatus.status === APICallStatusEnum.ERROR) {\n this.errorMessage = !this.apiCallStatus.message ? '' : (typeof (this.apiCallStatus.message) === 'object') ? JSON.stringify(this.apiCallStatus.message) : this.apiCallStatus.message;\n }\n if (transactionsSelector.transactions && transactionsSelector.transactions.length > 0) {\n this.transactions = transactionsSelector.transactions;\n this.loadTransactionsTable(this.transactions);\n }\n this.logger.info(transactionsSelector);\n });\n }\n\n ngOnChanges() {\n if (this.transactions && this.transactions.length > 0) {\n this.loadTransactionsTable(this.transactions);\n }\n }\n\n onTransactionClick(selTransaction: Transaction) {\n const reorderedTransactions = [\n [{ key: 'block_hash', value: selTransaction.block_hash, title: 'Block Hash', width: 100 }],\n [{ key: 'tx_hash', value: selTransaction.tx_hash, title: 'Transaction Hash', width: 100 }],\n [{ key: 'label', value: selTransaction.label, title: 'Label', width: 100, type: DataTypeEnum.STRING }],\n [{ key: 'time_stamp', value: selTransaction.time_stamp, title: 'Date/Time', width: 50, type: DataTypeEnum.DATE_TIME },\n { key: 'block_height', value: selTransaction.block_height, title: 'Block Height', width: 50, type: DataTypeEnum.NUMBER }],\n [{ key: 'num_confirmations', value: selTransaction.num_confirmations, title: 'Number of Confirmations', width: 34, type: DataTypeEnum.NUMBER },\n { key: 'total_fees', value: selTransaction.total_fees, title: 'Total Fees (Sats)', width: 33, type: DataTypeEnum.NUMBER },\n { key: 'amount', value: selTransaction.amount, title: 'Amount (Sats)', width: 33, type: DataTypeEnum.NUMBER }],\n [{ key: 'dest_addresses', value: selTransaction.dest_addresses, title: 'Destination Addresses', width: 100, type: DataTypeEnum.ARRAY }]\n ];\n this.store.dispatch(openAlert({\n payload: {\n data: {\n type: AlertTypeEnum.INFORMATION,\n alertTitle: 'Transaction Information',\n message: reorderedTransactions,\n scrollable: selTransaction.dest_addresses && selTransaction.dest_addresses.length > 5\n }\n }\n }));\n }\n\n applyFilter() {\n this.listTransactions.filter = this.selFilter.trim().toLowerCase();\n }\n\n getLabel(column: string) {\n const returnColumn: ColumnDefinition = this.nodePageDefs[this.PAGE_ID][this.tableSetting.tableId].allowedColumns.find((col) => col.column === column);\n return returnColumn ? returnColumn.label ? returnColumn.label : this.camelCaseWithReplace.transform(returnColumn.column, '_') : this.commonService.titleCase(column);\n }\n\n setFilterPredicate() {\n this.listTransactions.filterPredicate = (rowData: Transaction, fltr: string) => {\n let rowToFilter = '';\n switch (this.selFilterBy) {\n case 'all':\n rowToFilter = ((rowData.time_stamp) ? this.datePipe.transform(new Date(rowData.time_stamp * 1000), 'dd/MMM/y HH:mm')?.toLowerCase() : '') + JSON.stringify(rowData).toLowerCase();\n break;\n\n case 'time_stamp':\n rowToFilter = this.datePipe.transform(new Date((rowData?.time_stamp || 0) * 1000), 'dd/MMM/YYYY HH:mm')?.toLowerCase() || '';\n break;\n\n default:\n rowToFilter = typeof rowData[this.selFilterBy] === 'undefined' ? '' : typeof rowData[this.selFilterBy] === 'string' ? rowData[this.selFilterBy].toLowerCase() : typeof rowData[this.selFilterBy] === 'boolean' ? (rowData[this.selFilterBy] ? 'yes' : 'no') : rowData[this.selFilterBy].toString();\n break;\n }\n return rowToFilter.includes(fltr);\n };\n }\n\n loadTransactionsTable(transactions) {\n this.listTransactions = new MatTableDataSource<Transaction>([...transactions]);\n this.listTransactions.sort = this.sort;\n this.listTransactions.sortingDataAccessor = (data: any, sortHeaderId: string) => ((data[sortHeaderId] && isNaN(data[sortHeaderId])) ? data[sortHeaderId].toLocaleLowerCase() : data[sortHeaderId] ? +data[sortHeaderId] : null);\n this.listTransactions.sort?.sort({ id: this.tableSetting.sortBy, start: this.tableSetting.sortOrder, disableClear: true });\n this.listTransactions.paginator = this.paginator;\n this.setFilterPredicate();\n this.applyFilter();\n this.logger.info(this.listTransactions);\n }\n\n onDownloadCSV() {\n if (this.listTransactions.data && this.listTransactions.data.length > 0) {\n this.commonService.downloadFile(this.listTransactions.data, 'Transactions');\n }\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"start stretch\" class=\"bordered-box\">\n <mat-tab-group mat-stretch-tabs=\"false\" mat-align-tabs=\"start\" [selectedIndex]=\"selectedTableIndex\" (selectedIndexChange)=\"onSelectedIndexChanged($event)\">\n <mat-tab>\n <ng-template mat-tab-label>\n <span matBadgeOverlap=\"false\" class=\"tab-badge\" matBadge=\"{{numUtxos}}\">UTXOs</span>\n </ng-template>\n <rtl-on-chain-utxos fxLayout=\"row\" fxFlex=\"100\" [isDustUTXO]=\"false\" [dustAmount]=\"DUST_AMOUNT\"></rtl-on-chain-utxos>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>\n <span matBadgeOverlap=\"false\" class=\"tab-badge\" matBadge=\"{{numTransactions}}\">Transactions</span>\n </ng-template>\n <rtl-on-chain-transaction-history fxLayout=\"row\" fxFlex=\"100\"></rtl-on-chain-transaction-history>\n </mat-tab>\n <mat-tab>\n <ng-template mat-tab-label>\n <span matBadgeOverlap=\"false\" class=\"tab-badge\" matBadge=\"{{numDustUtxos}}\">Dust UTXOs</span>\n </ng-template>\n <rtl-on-chain-utxos fxLayout=\"row\" fxFlex=\"100\" [isDustUTXO]=\"true\" [dustAmount]=\"DUST_AMOUNT\"></rtl-on-chain-utxos>\n </mat-tab>\n </mat-tab-group>\n</div>\n","import { Component, OnInit, OnDestroy, Input, Output, EventEmitter } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\n\nimport { LoggerService } from '../../../shared/services/logger.service';\n\nimport { RTLState } from '../../../store/rtl.state';\nimport { fetchTransactions, fetchUTXOs } from '../../store/lnd.actions';\nimport { transactions, utxos } from '../../store/lnd.selector';\nimport { Transaction, UTXO } from '../../../shared/models/lndModels';\nimport { ApiCallStatusPayload } from '../../../shared/models/apiCallsPayload';\n\n@Component({\n selector: 'rtl-utxo-tables',\n templateUrl: './utxo-tables.component.html',\n styleUrls: ['./utxo-tables.component.scss']\n})\nexport class UTXOTablesComponent implements OnInit, OnDestroy {\n\n @Input() selectedTableIndex = 0;\n @Output() readonly selectedTableIndexChange = new EventEmitter<number>();\n public DUST_AMOUNT = 1000;\n public numTransactions = 0;\n public numUtxos = 0;\n public numDustUtxos = 0;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject()];\n\n constructor(private logger: LoggerService, private store: Store<RTLState>) { }\n\n ngOnInit() {\n this.store.dispatch(fetchTransactions());\n this.store.dispatch(fetchUTXOs());\n this.store.select(utxos).pipe(takeUntil(this.unSubs[0])).\n subscribe((utxosSelector: { utxos: UTXO[], apiCallStatus: ApiCallStatusPayload }) => {\n if (utxosSelector.utxos && utxosSelector.utxos.length > 0) {\n this.numUtxos = utxosSelector.utxos.length;\n this.numDustUtxos = utxosSelector.utxos?.filter((utxo) => utxo.amount_sat && +utxo.amount_sat < this.DUST_AMOUNT).length;\n }\n this.logger.info(utxosSelector);\n });\n this.store.select(transactions).pipe(takeUntil(this.unSubs[1])).\n subscribe((transactionsSelector: { transactions: Transaction[], apiCallStatus: ApiCallStatusPayload }) => {\n if (transactionsSelector.transactions && transactionsSelector.transactions.length > 0) {\n this.numTransactions = transactionsSelector.transactions.length;\n }\n this.logger.info(transactionsSelector);\n });\n }\n\n onSelectedIndexChanged(event) {\n this.selectedTableIndexChange.emit(event);\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"row\" fxLayoutAlign=\"start center\" class=\"page-title-container\">\n <fa-icon class=\"page-title-img mr-1\" [icon]=\"faChartPie\"></fa-icon>\n <span class=\"page-title\">On-chain Balance</span>\n</div>\n<div fxLayout=\"column\" class=\"padding-gap-x mb-4\">\n <mat-card>\n <mat-card-content fxLayout=\"column\">\n <rtl-currency-unit-converter [values]=\"balances\"></rtl-currency-unit-converter>\n </mat-card-content>\n </mat-card>\n</div>\n<div fxLayout=\"row\" fxLayoutAlign=\"start center\" class=\"page-title-container\">\n <fa-icon class=\"page-title-img mr-1\" [icon]=\"faExchangeAlt\"></fa-icon>\n <span class=\"page-title\">On-chain Transactions</span>\n</div>\n<div fxLayout=\"column\" class=\"padding-gap-x\">\n <mat-card>\n <mat-card-content fxLayout=\"column\">\n <nav mat-tab-nav-bar mat-stretch-tabs=\"false\" mat-align-tabs=\"start\" [tabPanel]=\"tabPanel\">\n <div *ngFor=\"let link of links\" mat-tab-link class=\"mat-tab-label\" [active]=\"activeLink === link?.link\" [routerLink]=\"[link?.link, selectedTable?.name]\" (click)=\"activeLink = link?.link\">{{link?.name}}</div>\n </nav>\n <mat-tab-nav-panel #tabPanel></mat-tab-nav-panel>\n <div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between stretch\" class=\"mat-tab-body-wrapper\">\n <router-outlet></router-outlet>\n </div>\n <div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between stretch\" class=\"padding-gap-x-large\">\n <rtl-utxo-tables fxLayout=\"row\" fxFlex=\"100\" [selectedTableIndex]=\"selectedTable?.id\" (selectedTableIndexChange)=\"onSelectedTableIndexChanged($event)\"></rtl-utxo-tables>\n </div>\n </mat-card-content>\n </mat-card>\n</div>\n","import { Component, OnInit, OnDestroy } from '@angular/core';\nimport { Router, ResolveEnd, ActivatedRoute, Event } from '@angular/router';\nimport { Subject } from 'rxjs';\nimport { takeUntil, filter } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { faExchangeAlt, faChartPie } from '@fortawesome/free-solid-svg-icons';\n\nimport { SelNodeChild } from '../../shared/models/RTLconfig';\nimport { RTLState } from '../../store/rtl.state';\nimport { blockchainBalance, lndNodeSettings } from '../store/lnd.selector';\nimport { ApiCallStatusPayload } from '../../shared/models/apiCallsPayload';\nimport { BlockchainBalance } from '../../shared/models/lndModels';\n\n@Component({\n selector: 'rtl-on-chain',\n templateUrl: './on-chain.component.html',\n styleUrls: ['./on-chain.component.scss']\n})\nexport class OnChainComponent implements OnInit, OnDestroy {\n\n public selNode: SelNodeChild | null = {};\n public faExchangeAlt = faExchangeAlt;\n public faChartPie = faChartPie;\n public balances = [{ title: 'Total Balance', dataValue: 0 }, { title: 'Confirmed', dataValue: 0 }, { title: 'Unconfirmed', dataValue: 0 }];\n public links = [{ link: 'receive', name: 'Receive' }, { link: 'send', name: 'Send' }, { link: 'sweep', name: 'Sweep All' }];\n public activeLink = this.links[0].link;\n public tables = [{ id: 0, name: 'utxos' }, { id: 1, name: 'trans' }, { id: 2, name: 'dustUtxos' }];\n public selectedTable = this.tables[0];\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject()];\n\n constructor(private store: Store<RTLState>, private router: Router, private activatedRoute: ActivatedRoute) { }\n\n ngOnInit() {\n const linkFound = this.links.find((link) => this.router.url.includes(link.link));\n this.activeLink = linkFound ? linkFound.link : this.links[0].link;\n this.selectedTable = this.tables.find((table) => table.name === this.router.url.substring(this.router.url.lastIndexOf('/') + 1)) || this.tables[0];\n this.router.events.pipe(takeUntil(this.unSubs[0]), filter((e) => e instanceof ResolveEnd)).\n subscribe({\n next: (value: ResolveEnd | Event) => {\n const linkFound = this.links.find((link) => (<ResolveEnd>value).urlAfterRedirects.includes(link.link));\n this.activeLink = linkFound ? linkFound.link : this.links[0].link;\n this.selectedTable = this.tables.find((table) => table.name === (<ResolveEnd>value).urlAfterRedirects.substring((<ResolveEnd>value).urlAfterRedirects.lastIndexOf('/') + 1)) || this.tables[0];\n }\n });\n this.store.select(lndNodeSettings).pipe(takeUntil(this.unSubs[1])).\n subscribe((nodeSettings: SelNodeChild | null) => {\n this.selNode = nodeSettings;\n });\n this.store.select(blockchainBalance).pipe(takeUntil(this.unSubs[2])).\n subscribe((bcBalanceSelector: { blockchainBalance: BlockchainBalance, apiCallStatus: ApiCallStatusPayload }) => {\n this.balances = [{ title: 'Total Balance', dataValue: bcBalanceSelector.blockchainBalance.total_balance || 0 }, { title: 'Confirmed', dataValue: (bcBalanceSelector.blockchainBalance.confirmed_balance || 0) }, { title: 'Unconfirmed', dataValue: (bcBalanceSelector.blockchainBalance.unconfirmed_balance || 0) }];\n });\n }\n\n onSelectedTableIndexChanged(event: number) {\n this.selectedTable = this.tables.find((table) => table.id === event) || this.tables[0];\n this.router.navigate(['./', this.activeLink, this.selectedTable.name], { relativeTo: this.activatedRoute });\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"column\">\n <div fxLayout=\"row\" fxLayoutAlign=\"start end\">\n <mat-form-field fxFlex=\"48\" fxFlex.gt-md=\"25\" fxLayoutAlign=\"start end\" class=\"mr-2\">\n <mat-select placeholder=\"Address Type\" name=\"address_type\" tabindex=\"1\" [(ngModel)]=\"selectedAddressType\">\n <mat-option *ngFor=\"let addressType of addressTypes\" [value]=\"addressType\">\n {{addressType.addressTp}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <div class=\"mt-2\">\n <button mat-flat-button color=\"primary\" tabindex=\"2\" class=\"top-minus-15px\" (click)=\"onGenerateAddress()\">Generate Address</button>\n </div>\n </div>\n</div>\n","import { Component, OnDestroy, OnInit } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil, take } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\n\nimport { AddressType, GetInfo } from '../../../shared/models/lndModels';\nimport { ADDRESS_TYPES } from '../../../shared/services/consts-enums-functions';\nimport { OnChainGeneratedAddressComponent } from '../../../shared/components/data-modal/on-chain-generated-address/on-chain-generated-address.component';\n\nimport { LNDEffects } from '../../store/lnd.effects';\nimport { RTLState } from '../../../store/rtl.state';\nimport { openAlert } from '../../../store/rtl.actions';\nimport { getNewAddress } from '../../store/lnd.actions';\nimport { lndNodeInformation } from '../../store/lnd.selector';\nimport { CommonService } from '../../../shared/services/common.service';\n\n@Component({\n selector: 'rtl-on-chain-receive',\n templateUrl: './on-chain-receive.component.html',\n styleUrls: ['./on-chain-receive.component.scss']\n})\nexport class OnChainReceiveComponent implements OnInit, OnDestroy {\n\n public addressTypes = <any>[];\n public selectedAddressType: AddressType = ADDRESS_TYPES[0];\n public newAddress = '';\n public flgVersionCompatible = true;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject(), new Subject()];\n\n constructor(private store: Store<RTLState>, private lndEffects: LNDEffects, private commonService: CommonService) { }\n\n ngOnInit() {\n this.store.select(lndNodeInformation).pipe(takeUntil(this.unSubs[0])).\n subscribe((nodeInfo: GetInfo) => {\n this.flgVersionCompatible = this.commonService.isVersionCompatible(nodeInfo.version, '0.15.0');\n this.addressTypes = (this.flgVersionCompatible) ? ADDRESS_TYPES : ADDRESS_TYPES.filter((at) => at.addressId !== '4');\n });\n }\n\n onGenerateAddress() {\n this.store.dispatch(getNewAddress({ payload: this.selectedAddressType }));\n this.lndEffects.setNewAddress.pipe(take(1)).subscribe((newAddress) => {\n this.newAddress = newAddress;\n setTimeout(() => {\n this.store.dispatch(openAlert({\n payload: {\n data: {\n address: this.newAddress,\n addressType: this.selectedAddressType.addressTp,\n component: OnChainGeneratedAddressComponent\n }\n }\n }));\n }, 0);\n });\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"row\">\n <div fxFlex=\"100\">\n <mat-card-header fxLayout=\"row\" fxLayoutAlign=\"space-between center\" class=\"modal-info-header\">\n <div fxFlex=\"95\" fxLayoutAlign=\"start start\">\n <span class=\"page-title\">{{sweepAll ? 'Sweep All Funds' : 'Send Funds'}}</span>\n </div>\n <button tabindex=\"8\" fxFlex=\"5\" fxLayoutAlign=\"center\" class=\"btn-close-x p-0\" default mat-button [mat-dialog-close]=\"false\">X</button>\n </mat-card-header>\n <mat-card-content class=\"padding-gap-x-large\">\n <form *ngIf=\"!sweepAll; else sweepAllBlock;\" #form=\"ngForm\" fxLayout=\"row wrap\"fxLayoutAlign=\"space-between start\" fxFlex=\"100\" class=\"overflow-x-hidden\" (submit)=\"onSendFunds()\" (reset)=\"resetData()\">\n <mat-form-field fxFlex.gt-sm=\"55\">\n <input #address=\"ngModel\" autoFocus matInput placeholder=\"Bitcoin Address\" tabindex=\"1\" name=\"address\" required [(ngModel)]=\"transactionAddress\">\n <mat-error *ngIf=\"!transactionAddress\">Bitcoin address is required.</mat-error>\n </mat-form-field>\n <mat-form-field fxFlex.gt-sm=\"30\">\n <input #amnt=\"ngModel\" matInput placeholder=\"Amount\" name=\"amt\" type=\"number\" tabindex=\"2\" required [step]=\"100\" [min]=\"0\" [(ngModel)]=\"transactionAmount\">\n <span matSuffix>{{selAmountUnit}} </span>\n <mat-error *ngIf=\"!transactionAmount\">{{amountError}}</mat-error>\n </mat-form-field>\n <mat-form-field fxFlex.gt-sm=\"10\" fxLayoutAlign=\"start end\">\n <mat-select tabindex=\"3\" required name=\"amountUnit\" [value]=\"selAmountUnit\" (selectionChange)=\"onAmountUnitChange($event)\">\n <mat-option *ngFor=\"let amountUnit of amountUnits\" [value]=\"amountUnit\">{{amountUnit}}</mat-option>\n </mat-select>\n </mat-form-field>\n <div fxLayout=\"column\" fxFlex=\"100\" fxFlex.gt-sm=\"60\" fxLayout.gt-sm=\"row wrap\" fxLayoutAlign=\"start stretch\" fxLayoutAlign.gt-sm=\"space-between start\"> \n <mat-form-field fxFlex=\"48\">\n <mat-select tabindex=\"4\" [(value)]=\"selTransType\">\n <mat-option *ngFor=\"let transType of transTypes\" [value]=\"transType.id\">\n {{transType.name}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field *ngIf=\"selTransType === '1'\" fxFlex=\"48\">\n <input #blocks=\"ngModel\" matInput placeholder=\"Number of Blocks\" type=\"number\" name=\"blcks\" required tabindex=\"5\" [step]=\"1\" [min]=\"0\" [(ngModel)]=\"transactionBlocks\">\n <mat-error *ngIf=\"!transactionBlocks\">Number of blocks is required.</mat-error>\n </mat-form-field>\n <mat-form-field *ngIf=\"selTransType === '2'\" fxFlex=\"48\">\n <input #fees=\"ngModel\" matInput placeholder=\"Fees (Sats/vByte)\" type=\"number\" name=\"chainFees\" required tabindex=\"6\" [step]=\"1\" [min]=\"0\" [(ngModel)]=\"transactionFees\">\n <mat-error *ngIf=\"!transactionFees\">Fees is required.</mat-error>\n </mat-form-field>\n </div>\n <div fxLayout=\"column\" fxFlex=\"100\" fxFlex.gt-sm=\"40\" fxLayout.gt-sm=\"row wrap\" fxLayoutAlign=\"start stretch\" fxLayoutAlign.gt-sm=\"space-between start\"></div>\n <div *ngIf=\"sendFundError !== ''\" fxFlex=\"100\" class=\"alert alert-danger mt-1\">\n <fa-icon class=\"mr-1 alert-icon\" [icon]=\"faExclamationTriangle\"></fa-icon>\n <span *ngIf=\"sendFundError !== ''\">{{sendFundError}}</span>\n </div>\n <div fxLayout=\"row\" fxFlex=\"100\" class=\"mt-2\" fxLayoutAlign=\"end center\">\n <button class=\"mr-1\" mat-button color=\"primary\" tabindex=\"7\" type=\"reset\">Clear Fields</button>\n <button mat-button color=\"primary\" type=\"submit\" tabindex=\"8\">Send Funds</button>\n </div>\n </form>\n </mat-card-content>\n </div>\n</div>\n\n<ng-template #sweepAllBlock>\n <div fxLayout=\"column\">\n <mat-vertical-stepper #stepper [linear]=\"true\" (selectionChange)=\"stepSelectionChanged($event)\">\n <mat-step *ngIf=\"!appConfig.sso.rtlSSO\" [stepControl]=\"passwordFormGroup\" [editable]=\"flgEditable\">\n <form fxLayout=\"column\" fxLayoutAlign=\"space-between\" class=\"my-1 pr-1\" [formGroup]=\"passwordFormGroup\">\n <ng-template matStepLabel>{{passwordFormLabel}}</ng-template>\n <div fxLayout=\"row\">\n <mat-form-field fxFlex=\"100\">\n <input autoFocus matInput placeholder=\"Password\" type=\"password\" tabindex=\"1\" formControlName=\"password\" required>\n <mat-error *ngIf=\"passwordFormGroup.controls.password.errors?.required\">Password is required.</mat-error>\n </mat-form-field>\n </div>\n <div class=\"mt-2\" fxLayout=\"row\">\n <button mat-button color=\"primary\" tabindex=\"3\" type=\"button\" (click)=\"onAuthenticate()\">Confirm</button>\n </div>\n </form>\n </mat-step>\n <mat-step [stepControl]=\"sendFundFormGroup\" [editable]=\"flgEditable\">\n <form fxLayout=\"column\" class=\"my-1 pr-1\" [formGroup]=\"sendFundFormGroup\">\n <ng-template matStepLabel disabled=\"true\">{{sendFundFormLabel}}</ng-template>\n <div fxLayout=\"column\" fxFlex=\"98\" fxLayout.gt-sm=\"row wrap\" fxLayoutAlign=\"start stretch\" fxLayoutAlign.gt-sm=\"space-between start\">\n <mat-form-field fxFlex.gt-sm=\"45\">\n <input matInput formControlName=\"transactionAddress\" placeholder=\"Bitcoin Address\" tabindex=\"4\" name=\"address\" required>\n <mat-error *ngIf=\"sendFundFormGroup.controls.transactionAddress.errors?.required\">Bitcoin address is required.</mat-error>\n </mat-form-field>\n <mat-form-field fxFlex.gt-sm=\"25\">\n <mat-select formControlName=\"selTransType\" tabindex=\"5\">\n <mat-option *ngFor=\"let transType of transTypes\" [value]=\"transType.id\">\n {{transType.name}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field *ngIf=\"sendFundFormGroup.controls.selTransType.value === '1'\" fxFlex.gt-sm=\"25\" fxLayoutAlign=\"start end\">\n <input matInput formControlName=\"transactionBlocks\" placeholder=\"Number of Blocks\" type=\"number\" name=\"blcks\" required tabindex=\"6\" [step]=\"1\" [min]=\"0\">\n <mat-error *ngIf=\"sendFundFormGroup.controls.transactionBlocks.errors?.required\">Number of blocks is required.</mat-error>\n </mat-form-field>\n <mat-form-field *ngIf=\"sendFundFormGroup.controls.selTransType.value === '2'\" fxFlex.gt-sm=\"25\" fxLayoutAlign=\"start end\">\n <input matInput formControlName=\"transactionFees\" placeholder=\"Fees (Sats/vByte)\" type=\"number\" name=\"chainFees\" required tabindex=\"7\" [step]=\"1\" [min]=\"0\">\n <mat-error *ngIf=\"sendFundFormGroup.controls.transactionFees.errors?.required\">Fees is required.</mat-error>\n </mat-form-field>\n </div>\n <div class=\"mt-2\" fxLayout=\"row\" fxLayoutAlign=\"start center\" fxFlex=\"100\">\n <button mat-button color=\"primary\" tabindex=\"8\" type=\"button\" matStepperNext>Next</button>\n </div>\n </form>\n </mat-step>\n <mat-step [stepControl]=\"confirmFormGroup\">\n <form fxLayout=\"column\" fxLayoutAlign=\"start\" class=\"my-1 pr-1\" [formGroup]=\"confirmFormGroup\">\n <ng-template matStepLabel>{{confirmFormLabel}}</ng-template>\n <div fxLayout=\"column\">\n <div fxFlex=\"100\" class=\"w-100 alert alert-warn\">\n <fa-icon class=\"mt-1 mr-1 alert-icon\" [icon]=\"faExclamationTriangle\"></fa-icon>\n <span>You are about to sweep all funds from RTL. Are you sure?</span>\n </div>\n <div *ngIf=\"sendFundError !== ''\" fxFlex=\"100\" class=\"alert alert-danger mt-1\">\n <fa-icon class=\"mr-1 alert-icon\" [icon]=\"faExclamationTriangle\"></fa-icon>\n <span *ngIf=\"sendFundError !== ''\">{{sendFundError}}</span>\n </div>\n <div class=\"mt-2\" fxLayout=\"row\" fxLayoutAlign=\"start center\" fxFlex=\"100\">\n <button mat-button color=\"primary\" tabindex=\"9\" type=\"button\" (click)=\"onSendFunds()\">Sweep All Funds</button>\n </div>\n </div>\n </form>\n </mat-step>\n </mat-vertical-stepper>\n <div fxLayout=\"row\" fxFlex=\"100\" fxLayoutAlign=\"end center\"> \n <button mat-button color=\"primary\" tabindex=\"12\" type=\"button\" default [mat-dialog-close]=\"false\">{{flgValidated ? 'Close' : 'Cancel'}}</button>\n </div>\n </div>\n</ng-template>\n","import { Component, OnInit, OnDestroy, ViewChild, Inject } from '@angular/core';\nimport { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';\nimport { DecimalPipe } from '@angular/common';\nimport { Subject } from 'rxjs';\nimport { filter, takeUntil, take } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { Actions } from '@ngrx/effects';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { MatStepper } from '@angular/material/stepper';\nimport { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';\n\nimport { OnChainSendFunds } from '../../../shared/models/alertData';\nimport { SelNodeChild, RTLConfiguration } from '../../../shared/models/RTLconfig';\nimport { GetInfo, AddressType, BlockchainBalance } from '../../../shared/models/lndModels';\nimport { CURRENCY_UNITS, CurrencyUnitEnum, CURRENCY_UNIT_FORMATS, APICallStatusEnum, LNDActions } from '../../../shared/services/consts-enums-functions';\nimport { CommonService } from '../../../shared/services/common.service';\nimport { LoggerService } from '../../../shared/services/logger.service';\nimport * as sha256 from 'sha256';\n\nimport { RTLEffects } from '../../../store/rtl.effects';\nimport { RTLState } from '../../../store/rtl.state';\nimport { isAuthorized, openSnackBar } from '../../../store/rtl.actions';\nimport { setChannelTransaction } from '../../store/lnd.actions';\nimport { rootAppConfig, rootSelectedNode } from '../../../store/rtl.selector';\n\n@Component({\n selector: 'rtl-on-chain-send-modal',\n templateUrl: './on-chain-send-modal.component.html',\n styleUrls: ['./on-chain-send-modal.component.scss']\n})\nexport class OnChainSendModalComponent implements OnInit, OnDestroy {\n\n @ViewChild('form', { static: true }) form: any;\n @ViewChild('formSweepAll', { static: false }) formSweepAll: any;\n @ViewChild('stepper', { static: false }) stepper: MatStepper;\n public faExclamationTriangle = faExclamationTriangle;\n public sweepAll = false;\n public selNode: SelNodeChild | null = {};\n public appConfig: RTLConfiguration;\n public addressTypes = [];\n public selectedAddress: AddressType = {};\n public blockchainBalance: BlockchainBalance = {};\n public information: GetInfo = {};\n public newAddress = '';\n public transactionAddress = '';\n public transactionAmount: number | null = null;\n public transactionFees: number | null = null;\n public transactionBlocks: number | null = null;\n public transTypes = [{ id: '1', name: 'Target Confirmation Blocks' }, { id: '2', name: 'Fee' }];\n public selTransType = '1';\n public fiatConversion = false;\n public amountUnits = CURRENCY_UNITS;\n public selAmountUnit = CURRENCY_UNITS[0];\n public currConvertorRate = {};\n public unitConversionValue = 0;\n public currencyUnitFormats = CURRENCY_UNIT_FORMATS;\n public sendFundError = '';\n public flgValidated = false;\n public flgEditable = true;\n public passwordFormLabel = 'Authenticate with your RTL password';\n public sendFundFormLabel = 'Sweep funds';\n public confirmFormLabel = 'Confirm sweep';\n public amountError = 'Amount is Required.';\n passwordFormGroup: UntypedFormGroup;\n sendFundFormGroup: UntypedFormGroup;\n confirmFormGroup: UntypedFormGroup;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject(), new Subject(), new Subject()];\n\n constructor(\n public dialogRef: MatDialogRef<OnChainSendModalComponent>,\n @Inject(MAT_DIALOG_DATA) public data: OnChainSendFunds,\n private logger: LoggerService,\n private store: Store<RTLState>,\n private rtlEffects: RTLEffects,\n private commonService: CommonService,\n private decimalPipe: DecimalPipe,\n private snackBar: MatSnackBar,\n private actions: Actions,\n private formBuilder: UntypedFormBuilder) { }\n\n ngOnInit() {\n this.sweepAll = this.data.sweepAll;\n this.passwordFormGroup = this.formBuilder.group({\n hiddenPassword: ['', [Validators.required]],\n password: ['', [Validators.required]]\n });\n this.sendFundFormGroup = this.formBuilder.group({\n transactionAddress: ['', Validators.required],\n transactionBlocks: [null],\n transactionFees: [null],\n selTransType: ['1', Validators.required]\n });\n this.confirmFormGroup = this.formBuilder.group({});\n this.sendFundFormGroup.controls.selTransType.valueChanges.pipe(takeUntil(this.unSubs[0])).subscribe((transType) => {\n if (transType === '1') {\n this.sendFundFormGroup.controls.transactionBlocks.setValidators([Validators.required]);\n this.sendFundFormGroup.controls.transactionBlocks.setValue(null);\n this.sendFundFormGroup.controls.transactionFees.setValidators(null);\n this.sendFundFormGroup.controls.transactionFees.setValue(null);\n } else {\n this.sendFundFormGroup.controls.transactionBlocks.setValidators(null);\n this.sendFundFormGroup.controls.transactionBlocks.setValue(null);\n this.sendFundFormGroup.controls.transactionFees.setValidators([Validators.required]);\n this.sendFundFormGroup.controls.transactionFees.setValue(null);\n }\n });\n this.store.select(rootAppConfig).pipe(takeUntil(this.unSubs[1])).subscribe((appConfig) => {\n this.appConfig = appConfig;\n });\n this.store.select(rootSelectedNode).pipe(takeUntil(this.unSubs[2])).subscribe((selNode) => {\n this.fiatConversion = selNode.settings.fiatConversion;\n this.amountUnits = selNode.settings.currencyUnits;\n this.logger.info(selNode);\n });\n this.actions.pipe(\n takeUntil(this.unSubs[3]),\n filter((action) => action.type === LNDActions.UPDATE_API_CALL_STATUS_LND || action.type === LNDActions.SET_CHANNEL_TRANSACTION_RES_LND)).\n subscribe((action: any) => {\n if (action.type === LNDActions.SET_CHANNEL_TRANSACTION_RES_LND) {\n this.store.dispatch(openSnackBar({ payload: (this.sweepAll ? 'All Funds Sent Successfully!' : 'Fund Sent Successfully!') }));\n this.dialogRef.close();\n }\n if (action.type === LNDActions.UPDATE_API_CALL_STATUS_LND && action.payload.status === APICallStatusEnum.ERROR && action.payload.action === 'SetChannelTransaction') {\n this.sendFundError = action.payload.message;\n }\n });\n }\n\n onAuthenticate(): boolean | void {\n if (!this.passwordFormGroup.controls.password.value) {\n return true;\n }\n this.flgValidated = false;\n this.store.dispatch(isAuthorized({ payload: sha256(this.passwordFormGroup.controls.password.value).toString() }));\n this.rtlEffects.isAuthorizedRes.pipe(take(1)).\n subscribe((authRes) => {\n if (authRes !== 'ERROR') {\n this.passwordFormGroup.controls.hiddenPassword.setValue(this.passwordFormGroup.controls.password.value);\n this.stepper.next();\n } else {\n this.dialogRef.close();\n this.snackBar.open('Unauthorized User. Logging out from RTL.');\n }\n });\n }\n\n onSendFunds(): boolean | void {\n if (this.invalidValues) {\n return true;\n }\n this.sendFundError = '';\n const postTransaction = {\n amount: this.transactionAmount ? this.transactionAmount : 0,\n sendAll: this.sweepAll\n };\n if (this.sweepAll) {\n postTransaction['address'] = this.sendFundFormGroup.controls.transactionAddress.value;\n if (this.sendFundFormGroup.controls.selTransType.value === '1') {\n postTransaction['blocks'] = this.sendFundFormGroup.controls.transactionBlocks.value;\n }\n if (this.sendFundFormGroup.controls.selTransType.value === '2') {\n postTransaction['fees'] = this.sendFundFormGroup.controls.transactionFees.value;\n }\n } else {\n postTransaction['address'] = this.transactionAddress;\n if (this.selTransType === '1') {\n postTransaction['blocks'] = this.transactionBlocks;\n }\n if (this.selTransType === '2') {\n postTransaction['fees'] = this.transactionFees;\n }\n }\n if (this.transactionAmount && this.selAmountUnit !== CurrencyUnitEnum.SATS) {\n this.commonService.convertCurrency(this.transactionAmount, this.selAmountUnit === this.amountUnits[2] ? CurrencyUnitEnum.OTHER : this.selAmountUnit, CurrencyUnitEnum.SATS, this.amountUnits[2], this.fiatConversion).\n pipe(takeUntil(this.unSubs[4])).\n subscribe({\n next: (data) => {\n this.selAmountUnit = CurrencyUnitEnum.SATS;\n postTransaction.amount = +(this.decimalPipe.transform(data[this.amountUnits[0]], this.currencyUnitFormats[this.amountUnits[0]])?.replace(/,/g, '') || 0);\n this.store.dispatch(setChannelTransaction({ payload: postTransaction }));\n }, error: (err) => {\n this.transactionAmount = null;\n this.selAmountUnit = CurrencyUnitEnum.SATS;\n this.amountError = 'Conversion Error: ' + err;\n }\n });\n } else {\n this.store.dispatch(setChannelTransaction({ payload: postTransaction }));\n }\n }\n\n get invalidValues(): boolean {\n if (this.sweepAll) {\n return (!this.sendFundFormGroup.controls.transactionAddress.value || this.sendFundFormGroup.controls.transactionAddress.value === '') ||\n (this.sendFundFormGroup.controls.selTransType.value === '1' &&\n (!this.sendFundFormGroup.controls.transactionBlocks.value || this.sendFundFormGroup.controls.transactionBlocks.value <= 0)) ||\n (this.sendFundFormGroup.controls.selTransType.value === '2' && (!this.sendFundFormGroup.controls.transactionFees.value ||\n this.sendFundFormGroup.controls.transactionFees.value <= 0));\n } else {\n return (!this.transactionAddress || this.transactionAddress === '') || (!this.transactionAmount || this.transactionAmount <= 0) ||\n (this.selTransType === '1' && (!this.transactionBlocks || this.transactionBlocks <= 0)) || (this.selTransType === '2' && (!this.transactionFees || this.transactionFees <= 0));\n }\n }\n\n resetData() {\n this.sendFundError = '';\n this.selTransType = '1';\n this.transactionAddress = '';\n this.transactionBlocks = null;\n this.transactionFees = null;\n if (!this.sweepAll) {\n this.transactionAmount = null;\n }\n }\n\n stepSelectionChanged(event: any) {\n this.sendFundError = '';\n switch (event.selectedIndex) {\n case 0:\n this.passwordFormLabel = 'Authenticate with your RTL password';\n this.sendFundFormLabel = 'Sweep funds';\n break;\n\n case 1:\n this.passwordFormLabel = 'User authenticated successfully';\n this.sendFundFormLabel = 'Sweep funds';\n break;\n\n case 2:\n this.passwordFormLabel = 'User authenticated successfully';\n this.sendFundFormLabel = 'Sweep funds | Address: ' + this.sendFundFormGroup.controls.transactionAddress.value + ' | ' +\n this.transTypes[this.sendFundFormGroup.controls.selTransType.value - 1].name +\n (this.sendFundFormGroup.controls.selTransType.value === '2' ? ' (Sats/vByte)' : '') + ': ' +\n (this.sendFundFormGroup.controls.selTransType.value === '1' ? this.sendFundFormGroup.controls.transactionBlocks.value : this.sendFundFormGroup.controls.transactionFees.value);\n break;\n\n default:\n this.passwordFormLabel = 'Authenticate with your RTL password';\n this.sendFundFormLabel = 'Sweep funds';\n break;\n }\n if (event.selectedIndex < event.previouslySelectedIndex) {\n if (event.selectedIndex === 0) {\n this.passwordFormGroup.controls.hiddenPassword.setValue('');\n }\n }\n }\n\n onAmountUnitChange(event: any) {\n const self = this;\n const prevSelectedUnit = (this.sweepAll) ? CurrencyUnitEnum.SATS : (this.selAmountUnit === this.amountUnits[2]) ? CurrencyUnitEnum.OTHER : this.selAmountUnit;\n let currSelectedUnit = event.value === this.amountUnits[2] ? CurrencyUnitEnum.OTHER : event.value;\n if (this.transactionAmount && this.selAmountUnit !== event.value) {\n const amount = this.transactionAmount ? this.transactionAmount : 0;\n this.commonService.convertCurrency(amount, prevSelectedUnit, currSelectedUnit, this.amountUnits[2], this.fiatConversion).\n pipe(takeUntil(this.unSubs[5])).\n subscribe({\n next: (data) => {\n this.selAmountUnit = event.value;\n self.transactionAmount = +(self.decimalPipe.transform(data[currSelectedUnit], self.currencyUnitFormats[currSelectedUnit])?.replace(/,/g, '') || 0);\n }, error: (err) => {\n self.transactionAmount = null;\n this.amountError = 'Conversion Error: ' + err;\n this.selAmountUnit = prevSelectedUnit;\n currSelectedUnit = prevSelectedUnit;\n }\n });\n }\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","import { Component, OnDestroy, OnInit } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\n\nimport { OnChainSendModalComponent } from '../on-chain-send-modal/on-chain-send-modal.component';\n\nimport { RTLState } from '../../../store/rtl.state';\nimport { openAlert } from '../../../store/rtl.actions';\n\n@Component({\n selector: 'rtl-on-chain-send',\n templateUrl: './on-chain-send.component.html',\n styleUrls: ['./on-chain-send.component.scss']\n})\nexport class OnChainSendComponent implements OnInit, OnDestroy {\n\n public sweepAll = false;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject()];\n\n constructor(private store: Store<RTLState>, private activatedRoute: ActivatedRoute) { }\n\n ngOnInit() {\n this.activatedRoute.data.pipe(takeUntil(this.unSubs[0])).subscribe((routeData) => {\n this.sweepAll = routeData.sweepAll;\n });\n }\n\n openSendFundsModal() {\n this.store.dispatch(openAlert({\n payload: {\n data: {\n sweepAll: this.sweepAll,\n component: OnChainSendModalComponent\n }\n }\n }));\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between stretch\">\n <div fxLayout=\"row\">\n <button mat-flat-button color=\"primary\" type=\"button\" tabindex=\"1\" (click)=\"openSendFundsModal()\">{{sweepAll ? 'Sweep All' : 'Send Funds'}}</button>\n </div>\n</div>\n","<div fxLayout=\"column\" fxLayoutAlign=\"space-between stretch\" class=\"mb-4\">\n <mat-grid-list *ngIf=\"selNode.userPersona !== userPersonaEnum.OPERATOR\" cols=\"3\" rowHeight=\"330px\">\n <mat-grid-tile *ngFor=\"let card of nodeCards\" class=\"node-grid-tile\" [colspan]=\"card.cols\" [rowspan]=\"card.rows\">\n <div fxLayout=\"column\" fxLayoutAlign=\"stretch start\" fxFlex=\"100\" class=\"h-100\">\n <div fxLayout=\"row\" fxLayoutAlign=\"start start\" class=\"w-100\">\n <div fxLayout=\"row\" fxLayoutAlign=\"start start\" class=\"page-title-container\">\n <fa-icon class=\"mr-1\" [icon]=\"card.icon\"></fa-icon>\n <span>{{card.title}}</span>\n </div>\n </div>\n <div fxLayout=\"column\" fxLayoutAlign=\"stretch center\" fxLayout.gt-sm=\"row\" fxLayoutAlign.gt-sm=\"center stretch\" class=\"w-100 h-93\">\n <mat-card fxLayout=\"row\" fxFlex=\"95\" fxLayoutAlign=\"start stretch\" class=\"dashboard-card w-96 h-93\">\n <mat-card-content fxLayout=\"column\" fxFlex=\"100\"\n [ngClass]=\"{'dashboard-card-content': true, \n 'error-border': (card.id === 'node' && apiCallStatusNodeInfo.status === apiCallStatusEnum.ERROR) ||\n (card.id === 'status' && (apiCallStatusChannels.status === apiCallStatusEnum.ERROR || apiCallStatusPendingChannels.status === apiCallStatusEnum.ERROR)) ||\n (card.id === 'fee' && apiCallStatusFees.status === apiCallStatusEnum.ERROR)}\">\n <mat-progress-bar *ngIf=\"(card.id === 'node' && apiCallStatusNodeInfo.status === apiCallStatusEnum.INITIATED) ||\n (card.id === 'status' && (apiCallStatusChannels.status === apiCallStatusEnum.INITIATED || apiCallStatusPendingChannels.status === apiCallStatusEnum.INITIATED)) ||\n (card.id === 'fee' && apiCallStatusFees.status === apiCallStatusEnum.INITIATED)\"\n mode=\"indeterminate\"></mat-progress-bar>\n <div fxLayout=\"column\" fxFlex=\"100\" [ngSwitch]=\"card.id\">\n <rtl-node-info *ngSwitchCase=\"'node'\" fxFlex=\"100\" [information]=\"information\" [showColorFieldSeparately]=\"true\"></rtl-node-info>\n <rtl-channel-status-info *ngSwitchCase=\"'status'\" fxFlex=\"100\" [channelsStatus]=\"channelsStatus\" [errorMessage]=\"errorMessages[3] + ' ' + errorMessages[4]\"></rtl-channel-status-info>\n <rtl-fee-info *ngSwitchCase=\"'fee'\" fxFlex=\"100\" [fees]=\"fees\" [errorMessage]=\"errorMessages[2]\"></rtl-fee-info>\n </div>\n </mat-card-content>\n </mat-card>\n </div> \n </div>\n </mat-grid-tile>\n </mat-grid-list>\n <div fxLayout=\"row\" fxLayoutAlign=\"start end\" class=\"page-title-container\" [ngClass]=\"{'mt-1': screenSize !== screenSizeEnum.XS}\">\n <fa-icon class=\"page-title-img mr-1\" [icon]=\"faProjectDiagram\"></fa-icon>\n <span class=\"page-title\">Network</span>\n </div>\n <mat-grid-list cols=\"3\" rowHeight=\"250px\">\n <mat-grid-tile *ngFor=\"let card of networkCards\" fxLayout=\"row\" [colspan]=\"card.cols\" [rowspan]=\"card.rows\">\n <mat-card fxLayout=\"row\" fxFlex=\"95\" fxLayoutAlign=\"start stretch\" class=\"dashboard-card h-93\">\n <mat-card-content fxLayout=\"column\" fxFlex=\"100\" [ngClass]=\"{'dashboard-card-content': true, 'error-border': apiCallStatusNetwork.status === apiCallStatusEnum.ERROR}\">\n <mat-progress-bar *ngIf=\"apiCallStatusNetwork.status === apiCallStatusEnum.INITIATED\" mode=\"indeterminate\"></mat-progress-bar>\n <div fxLayout=\"column\" fxFlex=\"100\" [ngSwitch]=\"card.id\">\n <div *ngSwitchCase=\"'general'\" fxFlex=\"100\"><ng-container *ngTemplateOutlet=\"apiCallStatusNetwork.status === apiCallStatusEnum.ERROR ? errorBlock : generalBlock\"></ng-container></div>\n <div *ngSwitchCase=\"'channels'\" fxFlex=\"100\"><ng-container *ngTemplateOutlet=\"apiCallStatusNetwork.status === apiCallStatusEnum.ERROR ? errorBlock : channelsBlock\"></ng-container></div>\n <div *ngSwitchCase=\"'degrees'\" fxFlex=\"100\"><ng-container *ngTemplateOutlet=\"apiCallStatusNetwork.status === apiCallStatusEnum.ERROR ? errorBlock : degreesBlock\"></ng-container></div>\n </div>\n </mat-card-content>\n </mat-card>\n </mat-grid-tile>\n </mat-grid-list>\n</div>\n\n<ng-template #errorBlock>\n <div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between\" class=\"p-2\">\n <p>{{errorMessages[1]}}</p>\n </div>\n</ng-template>\n<ng-template #generalBlock>\n <div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between\">\n <div>\n <h4 class=\"dashboard-info-title\">Network Capacity</h4>\n <div class=\"overflow-wrap dashboard-info-value\">{{networkInfo.total_network_capacity | number}} Sats</div>\n </div>\n <div>\n <h4 class=\"dashboard-info-title\">Number of Nodes</h4>\n <div class=\"overflow-wrap dashboard-info-value\">{{networkInfo.num_nodes | number}}</div>\n </div>\n <div>\n <h4 class=\"dashboard-info-title\">Number of Channels</h4>\n <span class=\"overflow-wrap dashboard-info-value\">{{networkInfo.num_channels | number}}</span>\n </div>\n </div>\n</ng-template>\n<ng-template #channelsBlock>\n <div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between\">\n <div>\n <h4 class=\"dashboard-info-title\">Max Channel Size</h4>\n <div class=\"overflow-wrap dashboard-info-value\">{{networkInfo.max_channel_size | number}}</div>\n </div>\n <div>\n <h4 class=\"dashboard-info-title\">Avg Channel Size</h4>\n <div class=\"overflow-wrap dashboard-info-value\">{{networkInfo.avg_channel_size | number}}</div>\n </div>\n <div>\n <h4 class=\"dashboard-info-title\">Min Channel Size</h4>\n <span class=\"overflow-wrap dashboard-info-value\">{{networkInfo.min_channel_size | number}}</span>\n </div>\n </div>\n</ng-template>\n<ng-template #degreesBlock>\n <div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between\">\n <div>\n <h4 class=\"dashboard-info-title\">Max Out Degree</h4>\n <div class=\"overflow-wrap dashboard-info-value\">{{networkInfo.max_out_degree | number}}</div>\n </div>\n <div>\n <h4 class=\"dashboard-info-title\">Avg Out Degree</h4>\n <div class=\"overflow-wrap dashboard-info-value\">{{networkInfo.avg_out_degree | number:'1.0-2'}}</div>\n </div>\n <div fxFlex=\"20\">\n <h4 class=\"dashboard-info-title\"></h4>\n <span class=\"overflow-wrap dashboard-info-value\"></span>\n </div>\n </div>\n</ng-template>\n","import { Component, OnInit, OnDestroy } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { faProjectDiagram, faBolt, faServer, faNetworkWired } from '@fortawesome/free-solid-svg-icons';\n\nimport { LoggerService } from '../../shared/services/logger.service';\nimport { GetInfo, NetworkInfo, Fees, ChannelsStatus, PendingChannels, PendingChannelsSummary, Channel, ChannelsSummary, LightningBalance } from '../../shared/models/lndModels';\nimport { SelNodeChild } from '../../shared/models/RTLconfig';\nimport { CommonService } from '../../shared/services/common.service';\nimport { APICallStatusEnum, ScreenSizeEnum, UserPersonaEnum } from '../../shared/services/consts-enums-functions';\nimport { ApiCallsListLND, ApiCallStatusPayload } from '../../shared/models/apiCallsPayload';\n\nimport { RTLState } from '../../store/rtl.state';\nimport { channels, fees, networkInfo, nodeInfoAndNodeSettingsAndAPIStatus, pendingChannels } from '../store/lnd.selector';\n\n@Component({\n selector: 'rtl-network-info',\n templateUrl: './network-info.component.html',\n styleUrls: ['./network-info.component.scss']\n})\nexport class NetworkInfoComponent implements OnInit, OnDestroy {\n\n public faProjectDiagram = faProjectDiagram;\n public faBolt = faBolt;\n public faServer = faServer;\n public faNetworkWired = faNetworkWired;\n public selNode: SelNodeChild | null = {};\n public information: GetInfo = {};\n public fees: Fees;\n public channelsStatus: ChannelsStatus = {};\n public networkInfo: NetworkInfo = {};\n public networkCards: any[] = [];\n public nodeCards: any[] = [];\n public screenSize = '';\n public screenSizeEnum = ScreenSizeEnum;\n public userPersonaEnum = UserPersonaEnum;\n public errorMessages = ['', '', '', '', ''];\n public apiCallStatusNodeInfo: ApiCallStatusPayload | null = null;\n public apiCallStatusNetwork: ApiCallStatusPayload | null = null;\n public apiCallStatusFees: ApiCallStatusPayload | null = null;\n public apiCallStatusChannels: ApiCallStatusPayload | null = null;\n public apiCallStatusPendingChannels: ApiCallStatusPayload | null = null;\n public apiCallStatusEnum = APICallStatusEnum;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject(), new Subject(), new Subject(), new Subject()];\n\n constructor(private logger: LoggerService, private commonService: CommonService, private store: Store<RTLState>) {\n this.screenSize = this.commonService.getScreenSize();\n if (this.screenSize === ScreenSizeEnum.XS) {\n this.networkCards = [\n { id: 'general', cols: 3, rows: 1 },\n { id: 'channels', cols: 3, rows: 1 },\n { id: 'degrees', cols: 3, rows: 1 }\n ];\n this.nodeCards = [\n { id: 'node', icon: this.faServer, title: 'Node Information', cols: 3, rows: 1 },\n { id: 'status', icon: this.faNetworkWired, title: 'Channels', cols: 3, rows: 1 },\n { id: 'fee', icon: this.faBolt, title: 'Routing Fee', cols: 3, rows: 1 }\n ];\n } else {\n this.networkCards = [\n { id: 'general', cols: 1, rows: 1 },\n { id: 'channels', cols: 1, rows: 1 },\n { id: 'degrees', cols: 1, rows: 1 }\n ];\n this.nodeCards = [\n { id: 'node', icon: this.faServer, title: 'Node Information', cols: 1, rows: 1 },\n { id: 'status', icon: this.faNetworkWired, title: 'Channels', cols: 1, rows: 1 },\n { id: 'fee', icon: this.faBolt, title: 'Routing Fee', cols: 1, rows: 1 }\n ];\n }\n }\n\n ngOnInit() {\n this.store.select(nodeInfoAndNodeSettingsAndAPIStatus).pipe(takeUntil(this.unSubs[0])).\n subscribe((infoSettingsStatusSelector: { information: GetInfo, nodeSettings: SelNodeChild | null, apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessages[0] = '';\n this.apiCallStatusNodeInfo = infoSettingsStatusSelector.apiCallStatus;\n if (this.apiCallStatusNodeInfo.status === APICallStatusEnum.ERROR) {\n this.errorMessages[0] = (typeof (this.apiCallStatusNodeInfo.message) === 'object') ? JSON.stringify(this.apiCallStatusNodeInfo.message) : this.apiCallStatusNodeInfo.message ? this.apiCallStatusNodeInfo.message : '';\n }\n this.selNode = infoSettingsStatusSelector.nodeSettings;\n this.information = infoSettingsStatusSelector.information;\n });\n this.store.select(networkInfo).pipe(takeUntil(this.unSubs[1])).\n subscribe((networkInfoSelector: { networkInfo: NetworkInfo, apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessages[1] = '';\n this.apiCallStatusNetwork = networkInfoSelector.apiCallStatus;\n if (this.apiCallStatusNetwork.status === APICallStatusEnum.ERROR) {\n this.errorMessages[1] = (typeof (this.apiCallStatusNetwork.message) === 'object') ? JSON.stringify(this.apiCallStatusNetwork.message) : this.apiCallStatusNetwork.message ? this.apiCallStatusNetwork.message : '';\n }\n this.networkInfo = networkInfoSelector.networkInfo;\n });\n this.store.select(fees).pipe(takeUntil(this.unSubs[2])).\n subscribe((feesSelector: { fees: Fees, apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessages[2] = '';\n this.apiCallStatusFees = feesSelector.apiCallStatus;\n if (this.apiCallStatusFees.status === APICallStatusEnum.ERROR) {\n this.errorMessages[2] = (typeof (this.apiCallStatusFees.message) === 'object') ? JSON.stringify(this.apiCallStatusFees.message) : this.apiCallStatusFees.message ? this.apiCallStatusFees.message : '';\n }\n this.fees = feesSelector.fees;\n });\n this.store.select(pendingChannels).pipe(takeUntil(this.unSubs[3])).\n subscribe((pendingChannelsSelector: { pendingChannels: PendingChannels, pendingChannelsSummary: PendingChannelsSummary, apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessages[4] = '';\n this.apiCallStatusPendingChannels = pendingChannelsSelector.apiCallStatus;\n if (this.apiCallStatusPendingChannels.status === APICallStatusEnum.ERROR) {\n this.errorMessages[4] = (typeof (this.apiCallStatusPendingChannels.message) === 'object') ? JSON.stringify(this.apiCallStatusPendingChannels.message) : this.apiCallStatusPendingChannels.message ? this.apiCallStatusPendingChannels.message : '';\n }\n this.channelsStatus.pending = { num_channels: pendingChannelsSelector.pendingChannelsSummary.open?.num_channels, capacity: pendingChannelsSelector.pendingChannelsSummary.open?.limbo_balance };\n this.channelsStatus.closing = {\n num_channels: (pendingChannelsSelector.pendingChannelsSummary.closing?.num_channels || 0) + (pendingChannelsSelector.pendingChannelsSummary.force_closing?.num_channels || 0) + (pendingChannelsSelector.pendingChannelsSummary.waiting_close?.num_channels || 0),\n capacity: pendingChannelsSelector.pendingChannelsSummary.total_limbo_balance\n };\n });\n this.store.select(channels).pipe(takeUntil(this.unSubs[4])).\n subscribe((channelsSelector: { channels: Channel[], channelsSummary: ChannelsSummary, lightningBalance: LightningBalance, apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessages[3] = '';\n this.apiCallStatusChannels = channelsSelector.apiCallStatus;\n if (this.apiCallStatusChannels.status === APICallStatusEnum.ERROR) {\n this.errorMessages[3] = (typeof (this.apiCallStatusChannels.message) === 'object') ? JSON.stringify(this.apiCallStatusChannels.message) : this.apiCallStatusChannels.message ? this.apiCallStatusChannels.message : '';\n }\n this.channelsStatus.active = channelsSelector.channelsSummary.active;\n this.channelsStatus.inactive = channelsSelector.channelsSummary.inactive;\n this.logger.info(channelsSelector);\n });\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"row\" fxLayoutAlign=\"start center\" class=\"page-title-container\">\n <fa-icon class=\"page-title-img mr-1\" [icon]=\"faDownload\"></fa-icon>\n <span class=\"page-title\">Channels Backup</span>\n</div>\n<div fxLayout=\"column\" class=\"padding-gap-x\">\n <mat-card>\n <mat-card-content fxLayout=\"column\">\n <nav mat-tab-nav-bar mat-stretch-tabs=\"false\" mat-align-tabs=\"start\" [tabPanel]=\"tabPanel\">\n <div *ngFor=\"let link of links\" mat-tab-link class=\"mat-tab-label\" [active]=\"activeLink === link.link\" routerLink=\"{{link.link}}\" (click)=\"activeLink = link.link\">{{link.name}}</div>\n </nav>\n <mat-tab-nav-panel #tabPanel></mat-tab-nav-panel>\n <div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between stretch\" class=\"mat-tab-body-wrapper\">\n <router-outlet></router-outlet>\n </div>\n </mat-card-content>\n </mat-card>\n</div>\n ","import { Component, OnInit, OnDestroy } from '@angular/core';\nimport { Router, ResolveEnd, Event } from '@angular/router';\nimport { Subject } from 'rxjs';\nimport { takeUntil, filter } from 'rxjs/operators';\nimport { faDownload } from '@fortawesome/free-solid-svg-icons';\n\n@Component({\n selector: 'rtl-backup',\n templateUrl: './backup.component.html',\n styleUrls: ['./backup.component.scss']\n})\nexport class BackupComponent implements OnInit, OnDestroy {\n\n public faDownload = faDownload;\n public links = [{ link: 'bckup', name: 'Backup' }, { link: 'restore', name: 'Restore' }];\n public activeLink = this.links[0].link;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject()];\n\n constructor(private router: Router) { }\n\n ngOnInit() {\n const linkFound = this.links.find((link) => this.router.url.includes(link.link));\n this.activeLink = linkFound ? linkFound.link : this.links[0].link;\n this.router.events.pipe(takeUntil(this.unSubs[0]), filter((e) => e instanceof ResolveEnd)).\n subscribe({\n next: (value: ResolveEnd | Event) => {\n const linkFound = this.links.find((link) => (<ResolveEnd>value).urlAfterRedirects.includes(link.link));\n this.activeLink = linkFound ? linkFound.link : this.links[0].link;\n }\n });\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"column\" class=\"mt-2\">\n <div *ngIf=\"allRestoreExists\" fxLayout=\"column\" fxLayoutAlign=\"space-between stretch\" fxLayout.gt-sm=\"row wrap\">\n <h4 fxFlex=\"100\">Restore folder location: {{selNode.channelBackupPath}}/restore</h4>\n <div fxLayout=\"row\" class=\"mt-2\">\n <button mat-flat-button color=\"primary\" tabindex=\"1\" (click)=\"onRestoreChannels({})\">Restore All</button>\n </div>\n </div>\n <div *ngIf=\"!allRestoreExists && (!channels || channels?.data?.length<=0)\" fxLayout=\"column\" fxLayoutAlign=\"space-between start\" fxLayout.gt-md=\"row wrap\">\n <h4 fxFlex=\"100\">Restore folder location: {{selNode.channelBackupPath}}/restore</h4>\n <h4 fxFlex=\"100\" class=\"mt-1\">All channel backup file not found! To perform channel restoration, channel backup file/s must be placed at the above location.</h4>\n </div>\n <div *ngIf=\"!allRestoreExists && channels && channels?.data?.length && channels?.data?.length>0\" fxLayout=\"column\" fxLayoutAlign=\"space-between start\" fxLayout.gt-md=\"row wrap\">\n <h4 fxFlex=\"100\">Restore folder location: {{selNode.channelBackupPath}}/restore</h4>\n </div>\n <div fxLayout=\"column\" fxLayout.gt-xs=\"row\" fxLayoutAlign.gt-xs=\"start center\" fxLayoutAlign=\"start stretch\" class=\"page-sub-title-container mt-2\">\n <div fxFlex=\"70\"></div>\n <div fxFlex.gt-xs=\"30\" fxLayoutAlign.gt-xs=\"space-between center\" fxLayout=\"row\" fxLayoutAlign=\"space-between stretch\">\n <div fxFlex=\"49\"></div>\n <mat-form-field fxFlex=\"49\">\n <input matInput name=\"filter\" placeholder=\"Filter\" [(ngModel)]=\"selFilter\" (input)=\"applyFilter()\" (keyup)=\"applyFilter()\">\n </mat-form-field>\n </div>\n </div>\n <div fxLayout=\"row\" fxFlex=\"100\" class=\"table-container\" [perfectScrollbar]>\n <mat-progress-bar *ngIf=\"flgLoading[0]===true\" mode=\"indeterminate\"></mat-progress-bar>\n <table #table mat-table matSort [dataSource]=\"channels\" [ngClass]=\"{'overflow-auto error-border': flgLoading[0]==='error','overflow-auto': true}\">\n <ng-container matColumnDef=\"channel_point\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Channel Point</th>\n <td *matCellDef=\"let channel\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'max-width': (screenSize === screenSizeEnum.XS) ? '25rem' : '60rem'}\">\n <span class=\"ellipsis-child\">{{channel?.channel_point}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"actions\">\n <th *matHeaderCellDef mat-header-cell>\n <div class=\"bordered-box table-actions-select\" fxLayoutAlign=\"center center\">Actions</div> \n </th>\n <td *matCellDef=\"let channel\" mat-cell>\n <span fxLayoutAlign=\"end center\">\n <button mat-stroked-button color=\"primary\" type=\"button\" tabindex=\"1\" (click)=\"onRestoreChannels(channel)\">Restore</button> \n </span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"no_channel\">\n <td *matFooterCellDef mat-footer-cellcolspan=\"4\">\n <p *ngIf=\"!channels || !channels.data || channels?.data?.length<1\">No singular channel backups available.</p>\n </td>\n </ng-container>\n <tr *matFooterRowDef=\"['no_channel']\" mat-footer-row [ngClass]=\"{'display-none': channels && channels.data && channels?.data?.length>0}\"></tr>\n <tr *matHeaderRowDef=\"displayedColumns\" mat-header-row></tr>\n <tr *matRowDef=\"let row; columns: displayedColumns;\" mat-row></tr>\n </table>\n </div>\n <mat-paginator class=\"mb-1\" [pageSize]=\"pageSize\" [pageSizeOptions]=\"pageSizeOptions\" [showFirstLastButtons]=\"screenSize === screenSizeEnum.XS ? false : true\"></mat-paginator>\n</div>\n","import { AfterViewInit, Component, OnDestroy, OnInit, ViewChild } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\n\nimport { MatPaginator, MatPaginatorIntl } from '@angular/material/paginator';\nimport { MatSort } from '@angular/material/sort';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { SelNodeChild } from '../../../shared/models/RTLconfig';\nimport { Channel } from '../../../shared/models/lndModels';\nimport { PAGE_SIZE, PAGE_SIZE_OPTIONS, getPaginatorLabel, ScreenSizeEnum } from '../../../shared/services/consts-enums-functions';\nimport { LoggerService } from '../../../shared/services/logger.service';\nimport { CommonService } from '../../../shared/services/common.service';\n\nimport { LNDEffects } from '../../store/lnd.effects';\nimport { RTLState } from '../../../store/rtl.state';\nimport { restoreChannels, restoreChannelsList } from '../../store/lnd.actions';\nimport { lndNodeSettings } from '../../store/lnd.selector';\n\n@Component({\n selector: 'rtl-channel-restore-table',\n templateUrl: './channel-restore-table.component.html',\n styleUrls: ['./channel-restore-table.component.scss'],\n providers: [\n { provide: MatPaginatorIntl, useValue: getPaginatorLabel('Channels') }\n ]\n})\nexport class ChannelRestoreTableComponent implements OnInit, AfterViewInit, OnDestroy {\n\n @ViewChild(MatSort, { static: false }) sort: MatSort | undefined;\n @ViewChild(MatPaginator, { static: false }) paginator: MatPaginator | undefined;\n public pageSize = PAGE_SIZE;\n public pageSizeOptions = PAGE_SIZE_OPTIONS;\n public selNode: SelNodeChild | null = {};\n public displayedColumns = ['channel_point', 'actions'];\n public selChannel: Channel;\n public channelsData = [];\n public channels: any = new MatTableDataSource([]);\n public allRestoreExists = false;\n public flgLoading: Array<Boolean | 'error'> = [true]; // 0: channels\n public selFilter = '';\n public screenSize = '';\n public screenSizeEnum = ScreenSizeEnum;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject()];\n\n constructor(private logger: LoggerService, private store: Store<RTLState>, private lndEffects: LNDEffects, private commonService: CommonService) {\n this.screenSize = this.commonService.getScreenSize();\n }\n\n ngOnInit() {\n this.store.dispatch(restoreChannelsList());\n this.store.select(lndNodeSettings).pipe(takeUntil(this.unSubs[0])).subscribe((nodeSettings: SelNodeChild | null) => { this.selNode = nodeSettings; });\n this.lndEffects.setRestoreChannelList.pipe(takeUntil(this.unSubs[1])).\n subscribe((resRCList) => {\n this.allRestoreExists = resRCList.all_restore_exists;\n this.channelsData = resRCList.files;\n if (this.channelsData.length > 0) {\n this.loadRestoreTable(this.channelsData);\n }\n if (this.flgLoading[0] !== 'error' || (resRCList && resRCList.files)) {\n this.flgLoading[0] = false;\n }\n this.logger.info(resRCList);\n });\n }\n\n ngAfterViewInit() {\n if (this.channelsData && this.channelsData.length > 0) {\n this.loadRestoreTable(this.channelsData);\n }\n }\n\n onRestoreChannels(selChannel: Channel) {\n this.store.dispatch(restoreChannels({ payload: { channelPoint: (selChannel.channel_point) ? selChannel.channel_point : 'ALL' } }));\n }\n\n applyFilter() {\n this.channels.filter = this.selFilter.trim().toLowerCase();\n }\n\n loadRestoreTable(channels: any[]) {\n this.channels = new MatTableDataSource([...channels]);\n this.channels.sort = this.sort;\n this.channels.sortingDataAccessor = (data: any, sortHeaderId: string) => ((data[sortHeaderId] && isNaN(data[sortHeaderId])) ? data[sortHeaderId].toLocaleLowerCase() : data[sortHeaderId] ? +data[sortHeaderId] : null);\n this.channels.paginator = this.paginator;\n this.channels.filterPredicate = (rowData: Channel, fltr: string) => (rowData.channel_point ? rowData.channel_point.toLowerCase() : '').includes(fltr);\n this.applyFilter();\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"column\">\n <div fxLayout=\"column\" fxLayoutAlign=\"space-between stretch\" fxLayout.gt-sm=\"row wrap\">\n <div fxFlex=\"100\" class=\"alert alert-warn\">\n <fa-icon class=\"mr-1 alert-icon\" [icon]=\"faExclamationTriangle\"></fa-icon>\n <span>Save your backup files in a redundant location.</span>\n </div>\n <div fxFlex=\"100\" class=\"alert alert-info\">\n <fa-icon class=\"mr-1 alert-icon\" [icon]=\"faInfoCircle\"></fa-icon>\n <span><strong>Backup Folder Location: </strong>{{selNode.channelBackupPath}}.</span>\n </div>\n <div fxLayout=\"row\" class=\"mt-2\">\n <button mat-stroked-button class=\"mr-1\" color=\"primary\" tabindex=\"1\" (click)=\"onVerifyChannels({})\">Verify All</button>\n <button mat-flat-button class=\"mr-1\" color=\"primary\" tabindex=\"2\" (click)=\"onBackupChannels({})\">Backup All</button>\n <button mat-flat-button color=\"primary\" tabindex=\"3\" (click)=\"onDownloadBackup({})\">Download Backup</button>\n </div>\n </div>\n <div fxLayout=\"column\" fxLayout.gt-xs=\"row\" fxLayoutAlign.gt-xs=\"start center\" fxLayoutAlign=\"start stretch\" class=\"page-sub-title-container mt-2\">\n <div fxFlex=\"70\">\n <fa-icon class=\"page-title-img mr-1\" [icon]=\"faArchive\"></fa-icon>\n <span class=\"page-title\">Backups</span>\n </div>\n <div fxFlex.gt-xs=\"30\" fxLayoutAlign.gt-xs=\"space-between center\" fxLayout=\"row\" fxLayoutAlign=\"space-between stretch\">\n <div fxFlex=\"49\"></div>\n <mat-form-field fxFlex=\"49\">\n <input matInput name=\"filter\" placeholder=\"Filter\" [(ngModel)]=\"selFilter\" (input)=\"applyFilter()\" (keyup)=\"applyFilter()\">\n </mat-form-field>\n </div>\n </div>\n <div fxLayout=\"column\" fxFlex=\"100\" class=\"table-container\" [perfectScrollbar]>\n <mat-progress-bar *ngIf=\"apiCallStatus.status === apiCallStatusEnum.INITIATED\" mode=\"indeterminate\"></mat-progress-bar>\n <table #table mat-table fxFlex=\"100\" matSort [dataSource]=\"channels\" [ngClass]=\"{'error-border': errorMessage !== ''}\">\n <ng-container matColumnDef=\"channel_point\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Channel Point</th>\n <td *matCellDef=\"let channel\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'max-width': (screenSize === screenSizeEnum.XS) ? '25rem' : '60rem'}\">\n <span class=\"ellipsis-child\">{{channel?.channel_point}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"actions\">\n <th *matHeaderCellDef mat-header-cell>\n <div class=\"bordered-box table-actions-select\" fxLayoutAlign=\"center center\">Actions</div>\n </th>\n <td *matCellDef=\"let channel\" mat-cell fxLayoutAlign=\"end center\">\n <div class=\"bordered-box table-actions-select\" fxLayoutAlign=\"center center\">\n <mat-select placeholder=\"Actions\" tabindex=\"1\" class=\"mr-0\">\n <mat-select-trigger></mat-select-trigger>\n <mat-option (click)=\"onChannelClick(channel, $event)\">View Info</mat-option>\n <mat-option (click)=\"onBackupChannels(channel)\">Backup</mat-option>\n <mat-option (click)=\"onDownloadBackup(channel)\">Download Backup</mat-option>\n <mat-option (click)=\"onVerifyChannels(channel)\">Verify</mat-option>\n </mat-select>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"no_channel\">\n <td *matFooterCellDef mat-footer-cellcolspan=\"4\">\n <p *ngIf=\"(!channels?.data || channels?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.COMPLETED\">No channel available.</p>\n <p *ngIf=\"(!channels?.data || channels?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.INITIATED\">Getting channels...</p>\n <p *ngIf=\"(!channels?.data || channels?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.ERROR\">{{errorMessage}}</p>\n </td>\n </ng-container>\n <tr *matFooterRowDef=\"['no_channel']\" mat-footer-row [ngClass]=\"{'display-none': channels?.data && channels?.data?.length>0}\"></tr>\n <tr *matHeaderRowDef=\"displayedColumns\" mat-header-row></tr>\n <tr *matRowDef=\"let row; columns: displayedColumns;\" mat-row></tr>\n </table>\n </div>\n <mat-paginator class=\"mb-1\" [pageSize]=\"pageSize\" [pageSizeOptions]=\"pageSizeOptions\" [showFirstLastButtons]=\"screenSize === screenSizeEnum.XS ? false : true\"></mat-paginator>\n</div>\n","import { Component, OnInit, OnDestroy, ViewChild, AfterViewInit } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil, filter } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { Actions } from '@ngrx/effects';\nimport { faInfoCircle, faExclamationTriangle, faArchive } from '@fortawesome/free-solid-svg-icons';\n\nimport { ChannelInformationComponent } from '../../peers-channels/channels/channel-information-modal/channel-information.component';\nimport { MatPaginator, MatPaginatorIntl } from '@angular/material/paginator';\nimport { MatSort } from '@angular/material/sort';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { SelNodeChild } from '../../../shared/models/RTLconfig';\nimport { Channel, ChannelsSummary, LightningBalance } from '../../../shared/models/lndModels';\nimport { PAGE_SIZE, PAGE_SIZE_OPTIONS, getPaginatorLabel, ScreenSizeEnum, APICallStatusEnum, UI_MESSAGES, LNDActions, RTLActions } from '../../../shared/services/consts-enums-functions';\nimport { ApiCallStatusPayload } from '../../../shared/models/apiCallsPayload';\nimport { LoggerService } from '../../../shared/services/logger.service';\nimport { CommonService } from '../../../shared/services/common.service';\n\nimport { RTLState } from '../../../store/rtl.state';\nimport { fetchFile, openAlert } from '../../../store/rtl.actions';\nimport { backupChannels, verifyChannel } from '../../store/lnd.actions';\nimport { channels, lndNodeSettings } from '../../store/lnd.selector';\n\n@Component({\n selector: 'rtl-channel-backup-table',\n templateUrl: './channel-backup-table.component.html',\n styleUrls: ['./channel-backup-table.component.scss'],\n providers: [\n { provide: MatPaginatorIntl, useValue: getPaginatorLabel('Channels') }\n ]\n})\nexport class ChannelBackupTableComponent implements OnInit, AfterViewInit, OnDestroy {\n\n @ViewChild(MatSort, { static: false }) sort: MatSort | undefined;\n @ViewChild(MatPaginator, { static: false }) paginator: MatPaginator | undefined;\n public faInfoCircle = faInfoCircle;\n public faExclamationTriangle = faExclamationTriangle;\n public faArchive = faArchive;\n public pageSize = PAGE_SIZE;\n public pageSizeOptions = PAGE_SIZE_OPTIONS;\n public selNode: SelNodeChild | null = {};\n public displayedColumns = ['channel_point', 'actions'];\n public selectedChannel: Channel | null;\n public channelsData: Channel[] = [];\n public channels: any = new MatTableDataSource([]);\n public screenSize = '';\n public screenSizeEnum = ScreenSizeEnum;\n public errorMessage = '';\n public selFilter = '';\n public apiCallStatus: ApiCallStatusPayload | null = null;\n public apiCallStatusEnum = APICallStatusEnum;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject()];\n\n constructor(private logger: LoggerService, private store: Store<RTLState>, private actions: Actions, private commonService: CommonService) {\n this.screenSize = this.commonService.getScreenSize();\n }\n\n ngOnInit() {\n this.store.select(lndNodeSettings).pipe(takeUntil(this.unSubs[0])).subscribe((nodeSettings: SelNodeChild | null) => { this.selNode = nodeSettings; });\n this.store.select(channels).pipe(takeUntil(this.unSubs[1])).\n subscribe((channelsSeletor: { channels: Channel[], channelsSummary: ChannelsSummary, lightningBalance: LightningBalance, apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessage = '';\n this.apiCallStatus = channelsSeletor.apiCallStatus;\n if (this.apiCallStatus.status === APICallStatusEnum.ERROR) {\n this.errorMessage = !this.apiCallStatus.message ? '' : (typeof (this.apiCallStatus.message) === 'object') ? JSON.stringify(this.apiCallStatus.message) : this.apiCallStatus.message;\n }\n this.channelsData = channelsSeletor.channels;\n if (this.channelsData.length > 0) {\n this.loadBackupTable(this.channelsData);\n }\n this.logger.info(channelsSeletor);\n });\n this.actions.pipe(takeUntil(this.unSubs[2]), filter((action) => action.type === LNDActions.SET_CHANNELS_LND || action.type === RTLActions.SHOW_FILE)).subscribe((action: any) => {\n if (action.type === LNDActions.SET_CHANNELS_LND) {\n this.selectedChannel = null;\n }\n if (action.type === RTLActions.SHOW_FILE) {\n this.commonService.downloadFile(action.payload, 'channel-' + (this.selectedChannel?.channel_point ? this.selectedChannel.channel_point : 'all'), '.bak', '.bak');\n this.selectedChannel = null;\n }\n });\n }\n\n ngAfterViewInit() {\n if (this.channelsData.length > 0) {\n this.loadBackupTable(this.channelsData);\n }\n }\n\n onBackupChannels(selChannel: Channel) {\n this.store.dispatch(backupChannels({ payload: { uiMessage: UI_MESSAGES.BACKUP_CHANNEL, channelPoint: (selChannel.channel_point) ? selChannel.channel_point : 'ALL', showMessage: '' } }));\n }\n\n onVerifyChannels(selChannel: Channel) {\n this.store.dispatch(verifyChannel({ payload: { channelPoint: (selChannel.channel_point) ? selChannel.channel_point : 'ALL' } }));\n }\n\n onDownloadBackup(selChannel: Channel) {\n this.selectedChannel = selChannel;\n this.store.dispatch(fetchFile({ payload: { channelPoint: selChannel.channel_point ? selChannel.channel_point : 'all' } }));\n }\n\n onChannelClick(selChannel: Channel, event: any) {\n this.store.dispatch(openAlert({\n payload: {\n data: {\n channel: selChannel,\n showCopy: false,\n component: ChannelInformationComponent\n }\n }\n }));\n }\n\n applyFilter() {\n this.channels.filter = this.selFilter.trim().toLowerCase();\n }\n\n loadBackupTable(channels: any[]) {\n this.channels = channels ? new MatTableDataSource<Channel>([...channels]) : new MatTableDataSource([]);\n this.channels.sort = this.sort;\n this.channels.sortingDataAccessor = (data: any, sortHeaderId: string) => ((data[sortHeaderId] && isNaN(data[sortHeaderId])) ? data[sortHeaderId].toLocaleLowerCase() : data[sortHeaderId] ? +data[sortHeaderId] : null);\n this.channels.paginator = this.paginator;\n this.channels.filterPredicate = (rowData: Channel, fltr: string) => (rowData.channel_point ? rowData.channel_point.toLowerCase() : '').includes(fltr);\n this.applyFilter();\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"row\" fxLayoutAlign=\"start center\" class=\"page-title-container\">\n <fa-icon class=\"page-title-img mr-1\" [icon]=\"faUserCheck\"></fa-icon>\n <span class=\"page-title\">Sign/Verify Message</span>\n</div>\n<div fxLayout=\"column\" class=\"padding-gap-x\">\n <mat-card>\n <mat-card-content fxLayout=\"column\">\n <nav mat-tab-nav-bar mat-stretch-tabs=\"false\" mat-align-tabs=\"start\" [tabPanel]=\"tabPanel\">\n <div *ngFor=\"let link of links\" mat-tab-link class=\"mat-tab-label\" [active]=\"activeLink === link.link\" routerLink=\"{{link.link}}\" (click)=\"activeLink = link.link\">{{link.name}}</div>\n </nav>\n <mat-tab-nav-panel #tabPanel></mat-tab-nav-panel>\n <div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between stretch\" class=\"mat-tab-body-wrapper\">\n <router-outlet></router-outlet>\n </div>\n </mat-card-content>\n </mat-card>\n</div>\n ","import { Component, OnInit, OnDestroy } from '@angular/core';\nimport { Router, ResolveEnd, Event } from '@angular/router';\nimport { Subject } from 'rxjs';\nimport { takeUntil, filter } from 'rxjs/operators';\nimport { faUserCheck } from '@fortawesome/free-solid-svg-icons';\n\n@Component({\n selector: 'rtl-sign-verify-message',\n templateUrl: './sign-verify-message.component.html',\n styleUrls: ['./sign-verify-message.component.scss']\n})\nexport class SignVerifyMessageComponent implements OnInit, OnDestroy {\n\n public faUserCheck = faUserCheck;\n public links = [{ link: 'sign', name: 'Sign' }, { link: 'verify', name: 'Verify' }];\n public activeLink = this.links[0].link;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject()];\n\n constructor(private router: Router) { }\n\n ngOnInit() {\n const linkFound = this.links.find((link) => this.router.url.includes(link.link));\n this.activeLink = linkFound ? linkFound.link : this.links[0].link;\n this.router.events.pipe(takeUntil(this.unSubs[0]), filter((e) => e instanceof ResolveEnd)).\n subscribe({\n next: (value: ResolveEnd | Event) => {\n const linkFound = this.links.find((link) => (<ResolveEnd>value).urlAfterRedirects.includes(link.link));\n this.activeLink = linkFound ? linkFound.link : this.links[0].link;\n }\n });\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between stretch\">\n <form #form=\"ngForm\" fxLayout=\"column\" fxLayoutAlign=\"space-between stretch\" fxLayout.gt-sm=\"row wrap\">\n <mat-form-field fxLayout=\"row\" fxFlex=\"100\" fxLayoutAlign=\"start end\">\n <textarea autoFocus matInput rows=\"1\" placeholder=\"Message to sign\" required tabindex=\"1\" name=\"message\" [(ngModel)]=\"message\" (keyup)=\"onMessageChange()\"></textarea>\n <mat-error *ngIf=\"!message\">Message is required.</mat-error>\n </mat-form-field>\n <div fxLayout=\"row\" class=\"my-1\">\n <button class=\"mr-1\" mat-stroked-button color=\"primary\" tabindex=\"2\" type=\"reset\" (click)=\"resetData()\">Clear Field</button>\n <button mat-flat-button color=\"primary\" tabindex=\"3\" type=\"submit\" (click)=\"onSign()\">Sign</button>\n </div>\n <mat-divider class=\"my-2\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"row\" fxFlex=\"100\" fxLayoutAlign=\"start center\"><p>Generated Signature</p></div>\n <div fxLayout=\"row\" fxFlex=\"100\" fxLayoutAlign=\"start center\" class=\"bordered-box read-only h-4 padding-gap\">{{signature}}</div>\n <div fxLayout=\"row\" class=\"mt-2\">\n <button mat-stroked-button color=\"primary\" tabindex=\"4\" rtlClipboard type=\"button\" [payload]=\"signature\" (copied)=\"onCopyField($event)\">Copy Signature</button>\n </div>\n </form> \n</div>\n","import { Component, OnDestroy } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\nimport { DataService } from '../../../shared/services/data.service';\nimport { LoggerService } from '../../../shared/services/logger.service';\n\n@Component({\n selector: 'rtl-sign',\n templateUrl: './sign.component.html',\n styleUrls: ['./sign.component.scss']\n})\nexport class SignComponent implements OnDestroy {\n\n public message = '';\n public signedMessage = '';\n public signature = '';\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject()];\n\n constructor(private dataService: DataService, private snackBar: MatSnackBar, private logger: LoggerService) { }\n\n onSign(): boolean | void {\n if (!this.message || this.message === '') {\n return true;\n }\n this.dataService.signMessage(this.message).pipe(takeUntil(this.unSubs[0])).subscribe((res) => {\n this.signedMessage = this.message;\n this.signature = res.signature;\n });\n }\n\n onMessageChange() {\n if (this.signedMessage !== this.message) {\n this.signature = '';\n }\n }\n\n onCopyField(payload: string) {\n this.snackBar.open('Signature copied.');\n this.logger.info('Copied Text: ' + payload);\n }\n\n resetData() {\n this.message = '';\n this.signature = '';\n this.signedMessage = '';\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between stretch\">\n <form #form=\"ngForm\" fxLayout=\"column\" fxLayoutAlign=\"space-between stretch\" fxLayout.gt-sm=\"row wrap\">\n <mat-form-field fxFlex=\"100\" fxLayoutAlign=\"start end\">\n <textarea autoFocus matInput rows=\"1\" placeholder=\"Message to verify\" required tabindex=\"1\" name=\"message\" [(ngModel)]=\"message\" (keyup)=\"onChange()\"></textarea>\n <mat-error *ngIf=\"!message\">Message is required.</mat-error>\n </mat-form-field>\n <mat-form-field fxFlex=\"100\" fxLayoutAlign=\"start end\">\n <input #sign=\"ngModel\" matInput placeholder=\"Signature provided\" name=\"signature\" tabindex=\"2\" required [(ngModel)]=\"signature\" (keyup)=\"onChange()\">\n <mat-error *ngIf=\"!signature\">Signature is required.</mat-error>\n </mat-form-field>\n <p *ngIf=\"showVerifyStatus && !verifyRes.valid\" fxFlex=\"100\" class=\"color-warn\" fxLayoutAlign=\"start center\"><mat-icon class=\"mr-1 icon-small\">close</mat-icon>Verification failed, please double check message and signature</p>\n <div fxLayout=\"row\" class=\"my-1\">\n <button mat-stroked-button class=\"mr-1\" color=\"primary\" tabindex=\"3\" type=\"reset\" (click)=\"resetData()\">Clear Fields</button>\n <button mat-flat-button color=\"primary\" tabindex=\"4\" type=\"submit\" (click)=\"onVerify()\">Verify</button>\n </div>\n <div *ngIf=\"showVerifyStatus && verifyRes.valid\" fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between stretch\" fxLayout.gt-sm=\"row wrap\">\n <mat-divider class=\"my-2\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"row\" fxFlex=\"100\" fxLayoutAlign=\"start center\">\n <p *ngIf=\"verifyRes.valid\">Pubkey Used</p>\n </div>\n <div *ngIf=\"verifyRes.valid\" fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"start start\" class=\"bordered-box read-only h-4 padding-gap\">\n <p>{{verifyRes?.pubkey}}</p> \n </div>\n <div *ngIf=\"verifyRes.valid\" fxLayout=\"row\" class=\"mt-2\">\n <button mat-stroked-button color=\"primary\" tabindex=\"5\" rtlClipboard type=\"button\" [payload]=\"verifyRes?.pubkey\" (copied)=\"onCopyField($event)\">Copy Pubkey</button>\n </div>\n </div>\n </form> \n</div>\n","import { Component, OnDestroy } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n\nimport { DataService } from '../../../shared/services/data.service';\nimport { LoggerService } from '../../../shared/services/logger.service';\n\n@Component({\n selector: 'rtl-verify',\n templateUrl: './verify.component.html',\n styleUrls: ['./verify.component.scss']\n})\nexport class VerifyComponent implements OnDestroy {\n\n public message = '';\n public verifiedMessage = '';\n public signature = '';\n public verifiedSignature = '';\n public showVerifyStatus = false;\n public verifyRes: any = { pubkey: '', valid: null };\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject()];\n\n constructor(private dataService: DataService, private snackBar: MatSnackBar, private logger: LoggerService) { }\n\n onVerify(): boolean | void {\n if ((!this.message || this.message === '') || (!this.signature || this.signature === '')) {\n return true;\n }\n this.dataService.verifyMessage(this.message, this.signature).pipe(takeUntil(this.unSubs[0])).\n subscribe((res) => {\n this.verifyRes = res;\n this.showVerifyStatus = true;\n this.verifiedMessage = this.message;\n this.verifiedSignature = this.signature;\n });\n }\n\n onChange() {\n if (this.verifiedMessage !== this.message || this.verifiedSignature !== this.signature) {\n this.showVerifyStatus = false;\n this.verifyRes = { pubkey: '', valid: null };\n }\n }\n\n resetData() {\n this.message = '';\n this.signature = '';\n this.verifyRes = null;\n this.showVerifyStatus = false;\n }\n\n onCopyField(payload: string) {\n this.snackBar.open('Pubkey copied.');\n this.logger.info('Copied Text: ' + payload);\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"start stretch\" class=\"padding-gap-x-large\">\n <div *ngIf=\"errorMessage !== ''\" class=\"p-2 error-border my-2\">{{errorMessage}}</div>\n <div *ngIf=\"errorMessage === ''\" fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"start stretch\">\n <div *ngIf=\"errorMessage === ''\" fxLayout=\"column\" fxLayout.gt-xs=\"row\" fxLayoutAlign.gt-xs=\"start center\" fxLayoutAlign=\"start stretch\" class=\"page-sub-title-container\">\n <div fxFlex=\"70\">Non Routing Peers</div>\n <div fxFlex.gt-xs=\"30\" fxLayoutAlign.gt-xs=\"space-between center\" fxLayout=\"row\" fxLayoutAlign=\"space-between stretch\">\n <mat-form-field fxFlex=\"49\">\n <mat-select placeholder=\"Filter By\" tabindex=\"1\" name=\"filterBy\" [(ngModel)]=\"selFilterBy\" (selectionChange)=\"selFilter=''; applyFilter()\">\n <mat-option *ngFor=\"let column of ['all'].concat(displayedColumns.slice(0, -1))\" [value]=\"column\">{{getLabel(column)}}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field fxFlex=\"49\">\n <input matInput name=\"filter\" placeholder=\"Filter\" [(ngModel)]=\"selFilter\" (input)=\"applyFilter()\" (keyup)=\"applyFilter()\">\n </mat-form-field>\n </div>\n </div>\n <div *ngIf=\"errorMessage === ''\" fxLayout=\"column\" fxLayoutAlign=\"start center\" fxFlex=\"100\" class=\"table-container\" [perfectScrollbar]>\n <mat-progress-bar *ngIf=\"apiCallStatus.status === apiCallStatusEnum.INITIATED\" mode=\"indeterminate\"></mat-progress-bar>\n <table #table mat-table matSort class=\"overflow-auto\" [dataSource]=\"nonRoutingPeers\">\n <ng-container matColumnDef=\"chan_id\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Channel ID</th>\n <td *matCellDef=\"let nonRPeer\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'max-width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{nonRPeer?.chan_id}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"remote_alias\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Peer Alias</th>\n <td *matCellDef=\"let nonRPeer\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'max-width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{nonRPeer?.remote_alias}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"remote_pubkey\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Peer Pubkey</th>\n <td *matCellDef=\"let nonRPeer\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'max-width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{nonRPeer?.remote_pubkey}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"channel_point\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header>Channel Point</th>\n <td *matCellDef=\"let nonRPeer\" mat-cell>\n <div class=\"ellipsis-parent\" [ngStyle]=\"{'max-width': (screenSize === screenSizeEnum.XS) ? '10rem' : colWidth}\">\n <span class=\"ellipsis-child\">{{nonRPeer?.channel_point}}</span>\n </div>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"uptime_str\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Uptime ({{timeUnit}})</th>\n <td *matCellDef=\"let nonRPeer\" mat-cell><span fxLayoutAlign=\"end center\">{{nonRPeer.uptime_str}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"lifetime_str\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Lifetime ({{timeUnit}})</th>\n <td *matCellDef=\"let nonRPeer\" mat-cell><span fxLayoutAlign=\"end center\">{{nonRPeer.lifetime_str}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"commit_fee\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Commit Fee (Sats)</th>\n <td *matCellDef=\"let nonRPeer\" mat-cell><span fxLayoutAlign=\"end center\">{{nonRPeer.commit_fee | number}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"commit_weight\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Commit Weight</th>\n <td *matCellDef=\"let nonRPeer\" mat-cell><span fxLayoutAlign=\"end center\">{{nonRPeer.commit_weight | number}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"fee_per_kw\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Fee/KW</th>\n <td *matCellDef=\"let nonRPeer\" mat-cell><span fxLayoutAlign=\"end center\">{{nonRPeer.fee_per_kw | number}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"num_updates\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Updates</th>\n <td *matCellDef=\"let nonRPeer\" mat-cell><span fxLayoutAlign=\"end center\">{{nonRPeer.num_updates | number}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"unsettled_balance\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Unsettled Balance (Sats)</th>\n <td *matCellDef=\"let nonRPeer\" mat-cell><span fxLayoutAlign=\"end center\">{{nonRPeer.unsettled_balance | number}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"capacity\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Capacity (Sats)</th>\n <td *matCellDef=\"let nonRPeer\" mat-cell><span fxLayoutAlign=\"end center\">{{nonRPeer.capacity | number}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"local_chan_reserve_sat\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Local Reserve (Sats)</th>\n <td *matCellDef=\"let nonRPeer\" mat-cell><span fxLayoutAlign=\"end center\">{{nonRPeer.local_chan_reserve_sat | number}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"remote_chan_reserve_sat\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Remote Reserve (Sats)</th>\n <td *matCellDef=\"let nonRPeer\" mat-cell><span fxLayoutAlign=\"end center\">{{nonRPeer.remote_chan_reserve_sat | number}} </span></td>\n </ng-container>\n <ng-container matColumnDef=\"total_satoshis_sent\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Sats Sent</th>\n <td *matCellDef=\"let nonRPeer\" mat-cell><span fxLayoutAlign=\"end center\">{{nonRPeer.total_satoshis_sent | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"total_satoshis_received\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Sats Received</th>\n <td *matCellDef=\"let nonRPeer\" mat-cell><span fxLayoutAlign=\"end center\">{{nonRPeer.total_satoshis_received | number}}</span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"local_balance\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Local Balance (Sats)</th>\n <td *matCellDef=\"let nonRPeer\" mat-cell><span fxLayoutAlign=\"end center\">{{nonRPeer.local_balance | number}}</span>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"remote_balance\">\n <th *matHeaderCellDef mat-header-cell mat-sort-header arrowPosition=\"before\">Remote Balance (Sats)</th>\n <td *matCellDef=\"let nonRPeer\" mat-cell><span fxLayoutAlign=\"end center\">{{nonRPeer.remote_balance | number}}</span></td>\n </ng-container>\n <ng-container matColumnDef=\"actions\">\n <th *matHeaderCellDef mat-header-cell>\n <div class=\"bordered-box table-actions-select\" fxLayoutAlign=\"center center\">Actions</div>\n </th>\n <td *matCellDef=\"let nonRPeer\" mat-cell fxLayoutAlign=\"end center\">\n <button mat-stroked-button color=\"primary\" type=\"button\" tabindex=\"4\" (click)=\"onManagePeer(nonRPeer)\">Manage</button>\n </td>\n </ng-container>\n <ng-container matColumnDef=\"no_non_routing_event\">\n <td *matFooterCellDef mat-footer-cellcolspan=\"4\">\n <p *ngIf=\"(!nonRoutingPeers?.data || nonRoutingPeers?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.COMPLETED\">All peers are routing.</p>\n <p *ngIf=\"(!nonRoutingPeers?.data || nonRoutingPeers?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.INITIATED\">Getting non routing peers...</p>\n <p *ngIf=\"(!nonRoutingPeers?.data || nonRoutingPeers?.data?.length<1) && apiCallStatus.status === apiCallStatusEnum.ERROR\">{{errorMessage}}</p>\n </td>\n </ng-container>\n <tr *matFooterRowDef=\"['no_non_routing_event']\" mat-footer-row [ngClass]=\"{'display-none': nonRoutingPeers?.data?.length>0}\"></tr>\n <tr *matHeaderRowDef=\"displayedColumns\" mat-header-row></tr>\n <tr *matRowDef=\"let row; columns: displayedColumns;\" mat-row></tr>\n </table>\n </div>\n <mat-paginator #paginator class=\"mb-1\" [pageSize]=\"pageSize\" [pageSizeOptions]=\"pageSizeOptions\" [showFirstLastButtons]=\"screenSize === screenSizeEnum.XS ? false : true\"></mat-paginator>\n </div>\n</div>\n","import { Component, OnInit, ViewChild, OnDestroy, AfterViewInit } from '@angular/core';\nimport { DecimalPipe } from '@angular/common';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { MatSort } from '@angular/material/sort';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { MatPaginator, MatPaginatorIntl } from '@angular/material/paginator';\n\nimport { ForwardingEvent, SwitchRes, Channel, ChannelsSummary, LightningBalance } from '../../../shared/models/lndModels';\nimport { APICallStatusEnum, getPaginatorLabel, LND_DEFAULT_PAGE_SETTINGS, LND_PAGE_DEFS, PAGE_SIZE, PAGE_SIZE_OPTIONS, ScreenSizeEnum, SortOrderEnum } from '../../../shared/services/consts-enums-functions';\nimport { ApiCallStatusPayload } from '../../../shared/models/apiCallsPayload';\nimport { LoggerService } from '../../../shared/services/logger.service';\nimport { CommonService } from '../../../shared/services/common.service';\nimport { RTLState } from '../../../store/rtl.state';\nimport { channels, forwardingHistory, lndPageSettings } from '../../store/lnd.selector';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { ColumnDefinition, PageSettings, TableSetting } from '../../../shared/models/pageSettings';\nimport { CamelCaseWithReplacePipe } from '../../../shared/pipes/app.pipe';\n\n@Component({\n selector: 'rtl-non-routing-peers',\n templateUrl: './non-routing-peers.component.html',\n styleUrls: ['./non-routing-peers.component.scss'],\n providers: [\n { provide: MatPaginatorIntl, useValue: getPaginatorLabel('Non routing peers') }\n ]\n})\nexport class NonRoutingPeersComponent implements OnInit, AfterViewInit, OnDestroy {\n\n @ViewChild(MatSort, { static: false }) sort: MatSort | undefined;\n @ViewChild(MatPaginator, { static: false }) paginator: MatPaginator | undefined;\n public nodePageDefs = LND_PAGE_DEFS;\n public selFilterBy = 'all';\n public colWidth = '20rem';\n public PAGE_ID = 'routing';\n public tableSetting: TableSetting = { tableId: 'non_routing_peers', recordsPerPage: PAGE_SIZE, sortBy: 'remote_alias', sortOrder: SortOrderEnum.DESCENDING };\n public routingPeersData: any[] = [];\n public displayedColumns: any[] = [];\n public nonRoutingPeers: any = new MatTableDataSource<any>([]);\n public pageSize = PAGE_SIZE;\n public pageSizeOptions = PAGE_SIZE_OPTIONS;\n public screenSize = '';\n public screenSizeEnum = ScreenSizeEnum;\n public errorMessage = '';\n public selFilter = '';\n public activeChannels: Channel[] = [];\n public timeUnit = 'mins:secs';\n public apiCallStatus: ApiCallStatusPayload | null = null;\n public apiCallStatusEnum = APICallStatusEnum;\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject(), new Subject()];\n\n constructor(private logger: LoggerService, private commonService: CommonService, private store: Store<RTLState>, private router: Router, private activatedRoute: ActivatedRoute, private decimalPipe: DecimalPipe, private camelCaseWithReplace: CamelCaseWithReplacePipe) {\n this.screenSize = this.commonService.getScreenSize();\n }\n\n ngOnInit() {\n this.store.select(lndPageSettings).pipe(takeUntil(this.unSubs[0])).\n subscribe((settings: { pageSettings: PageSettings[], apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessage = '';\n this.apiCallStatus = settings.apiCallStatus;\n if (this.apiCallStatus.status === APICallStatusEnum.ERROR) {\n this.errorMessage = this.apiCallStatus.message || '';\n }\n this.tableSetting = settings.pageSettings.find((page) => page.pageId === this.PAGE_ID)?.tables.find((table) => table.tableId === this.tableSetting.tableId) || LND_DEFAULT_PAGE_SETTINGS.find((page) => page.pageId === this.PAGE_ID)?.tables.find((table) => table.tableId === this.tableSetting.tableId)!;\n if (this.screenSize === ScreenSizeEnum.XS || this.screenSize === ScreenSizeEnum.SM) {\n this.displayedColumns = JSON.parse(JSON.stringify(this.tableSetting.columnSelectionSM));\n } else {\n this.displayedColumns = JSON.parse(JSON.stringify(this.tableSetting.columnSelection));\n }\n this.displayedColumns.push('actions');\n this.pageSize = this.tableSetting.recordsPerPage ? +this.tableSetting.recordsPerPage : PAGE_SIZE;\n this.colWidth = this.displayedColumns.length ? ((this.commonService.getContainerSize().width / this.displayedColumns.length) / 10) + 'rem' : '20rem';\n this.logger.info(this.displayedColumns);\n });\n this.store.select(forwardingHistory).pipe(takeUntil(this.unSubs[1])).\n subscribe((fhSelector: { forwardingHistory: SwitchRes, apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessage = '';\n this.apiCallStatus = fhSelector.apiCallStatus;\n if (fhSelector.apiCallStatus?.status === APICallStatusEnum.ERROR) {\n this.errorMessage = !this.apiCallStatus.message ? '' : (typeof (this.apiCallStatus.message) === 'object') ? JSON.stringify(this.apiCallStatus.message) : this.apiCallStatus.message;\n }\n if (fhSelector.forwardingHistory.forwarding_events) {\n this.routingPeersData = fhSelector.forwardingHistory.forwarding_events;\n } else {\n this.routingPeersData = [];\n }\n if (this.routingPeersData.length > 0 && this.sort && this.paginator && this.displayedColumns.length > 0) {\n this.loadNonRoutingPeersTable(this.routingPeersData);\n }\n this.logger.info(fhSelector.apiCallStatus);\n this.logger.info(fhSelector.forwardingHistory);\n });\n this.store.select(channels).pipe(takeUntil(this.unSubs[2])).\n subscribe((channelsSelector: { channels: Channel[], channelsSummary: ChannelsSummary, lightningBalance: LightningBalance, apiCallStatus: ApiCallStatusPayload }) => {\n this.errorMessage = '';\n this.apiCallStatus = channelsSelector.apiCallStatus;\n if (this.apiCallStatus.status === APICallStatusEnum.ERROR) {\n this.errorMessage = !this.apiCallStatus.message ? '' : (typeof (this.apiCallStatus.message) === 'object') ? JSON.stringify(this.apiCallStatus.message) : this.apiCallStatus.message;\n }\n this.activeChannels = channelsSelector.channels;\n this.logger.info(channelsSelector);\n });\n }\n\n ngAfterViewInit() {\n if (this.routingPeersData.length > 0) {\n this.loadNonRoutingPeersTable(this.routingPeersData);\n }\n }\n\n calculateUptime(channels: Channel[]) {\n const minutesDivider = 60;\n const hoursDivider = minutesDivider * 60;\n const daysDivider = hoursDivider * 24;\n const yearsDivider = daysDivider * 365;\n let maxDivider = minutesDivider;\n let minDivider = 1;\n let max_uptime = 0;\n channels.forEach((channel) => {\n if (channel.uptime && +channel.uptime > max_uptime) {\n max_uptime = +channel.uptime;\n }\n });\n switch (true) {\n case max_uptime < hoursDivider:\n this.timeUnit = 'Mins:Secs';\n maxDivider = minutesDivider;\n minDivider = 1;\n break;\n\n case max_uptime >= hoursDivider && max_uptime < daysDivider:\n this.timeUnit = 'Hrs:Mins';\n maxDivider = hoursDivider;\n minDivider = minutesDivider;\n break;\n\n case max_uptime >= daysDivider && max_uptime < yearsDivider:\n this.timeUnit = 'Days:Hrs';\n maxDivider = daysDivider;\n minDivider = hoursDivider;\n break;\n\n case max_uptime > yearsDivider:\n this.timeUnit = 'Yrs:Days';\n maxDivider = yearsDivider;\n minDivider = daysDivider;\n break;\n\n default:\n this.timeUnit = 'Mins:Secs';\n maxDivider = minutesDivider;\n minDivider = 1;\n break;\n }\n channels.forEach((channel) => {\n channel.uptime_str = channel.uptime ? (this.decimalPipe.transform(Math.floor(+channel.uptime / maxDivider), '2.0-0') + ':' + this.decimalPipe.transform(Math.round((+channel.uptime % maxDivider) / minDivider), '2.0-0')) : '---';\n channel.lifetime_str = channel.lifetime ? (this.decimalPipe.transform(Math.floor(+channel.lifetime / maxDivider), '2.0-0') + ':' + this.decimalPipe.transform(Math.round((+channel.lifetime % maxDivider) / minDivider), '2.0-0')) : '---';\n });\n return channels;\n }\n\n onManagePeer(selNonRoutingChannel: Channel) {\n this.router.navigate(['../../', 'connections', 'channels', 'open'], { relativeTo: this.activatedRoute, state: { filter: selNonRoutingChannel.chan_id } });\n }\n\n // groupRoutingPeers(forwardingEvents: ForwardingEvent[]) {\n // const results: any[] = [];\n // forwardingEvents.forEach((event: ForwardingEvent) => {\n // const foundEntryInIdx = results.findIndex((result) => result.chan_id === event.chan_id_in);\n // const foundEntryOutIdx = results.findIndex((result) => result.chan_id === event.chan_id_out);\n // if (foundEntryInIdx < 0 && foundEntryOutIdx < 0) {\n // results.push({ chan_id: event.chan_id_in, alias: event.alias_in, amt_in_msat: +event.amt_in_msat, amt_out_msat: 0 });\n // results.push({ chan_id: event.chan_id_out, alias: event.alias_out, amt_out_msat: +event.amt_out_msat, amt_in_msat: 0 });\n // }\n // if (foundEntryInIdx < 0 && foundEntryOutIdx > -1) {\n // results.push({ chan_id: event.chan_id_in, alias: event.alias_in, amt_in_msat: +event.amt_in_msat, amt_out_msat: 0 });\n // results[foundEntryOutIdx].amt_out_msat = results[foundEntryOutIdx].amt_out_msat + +event.amt_out_msat;\n // }\n // if (foundEntryInIdx > -1 && foundEntryOutIdx < 0) {\n // results.push({ chan_id: event.chan_id_out, alias: event.alias_out, amt_out_msat: +event.amt_out_msat, amt_in_msat: 0 });\n // results[foundEntryInIdx].amt_in_msat = results[foundEntryInIdx].amt_in_msat + +event.amt_in_msat;\n // }\n // if (foundEntryInIdx > -1 && foundEntryOutIdx > -1) {\n // results[foundEntryInIdx].amt_in_msat = results[foundEntryInIdx].amt_in_msat + +event.amt_in_msat;\n // results[foundEntryOutIdx].amt_out_msat = results[foundEntryOutIdx].amt_out_msat + +event.amt_out_msat;\n // }\n // });\n // return this.commonService.sortDescByKey(results, 'alias');\n // }\n\n applyFilter() {\n this.nonRoutingPeers.filter = this.selFilter.toLowerCase();\n }\n\n getLabel(column: string) {\n const returnColumn: ColumnDefinition = this.nodePageDefs[this.PAGE_ID][this.tableSetting.tableId].allowedColumns.find((col) => col.column === column);\n return returnColumn ? returnColumn.label ? returnColumn.label : this.camelCaseWithReplace.transform(returnColumn.column, '_') : this.commonService.titleCase(column);\n }\n\n setFilterPredicate() {\n this.nonRoutingPeers.filterPredicate = (rowData: Channel, fltr: string) => {\n let rowToFilter = '';\n switch (this.selFilterBy) {\n case 'all':\n rowToFilter = JSON.stringify(rowData).toLowerCase();\n break;\n\n default:\n rowToFilter = typeof rowData[this.selFilterBy] === 'undefined' ? '' : typeof rowData[this.selFilterBy] === 'string' ? rowData[this.selFilterBy].toLowerCase() : typeof rowData[this.selFilterBy] === 'boolean' ? (rowData[this.selFilterBy] ? 'yes' : 'no') : rowData[this.selFilterBy].toString();\n break;\n }\n return rowToFilter.includes(fltr);\n };\n }\n\n loadNonRoutingPeersTable(forwardingEvents: ForwardingEvent[]) {\n if (forwardingEvents.length > 0) {\n // const grpdRoutingPeers = this.groupRoutingPeers(forwardingEvents);\n const filteredNonRoutingChannels = this.calculateUptime(this.activeChannels?.filter((actvChnl) => forwardingEvents.findIndex((evnt) => (evnt.chan_id_in === actvChnl.chan_id || evnt.chan_id_out === actvChnl.chan_id)) < 0));\n this.nonRoutingPeers = new MatTableDataSource<Channel>(filteredNonRoutingChannels);\n this.nonRoutingPeers.sort = this.sort;\n this.nonRoutingPeers.sort?.sort({ id: this.tableSetting.sortBy, start: this.tableSetting.sortOrder, disableClear: true });\n this.nonRoutingPeers.paginator = this.paginator;\n this.setFilterPredicate();\n this.applyFilter();\n this.logger.info(this.nonRoutingPeers);\n } else {\n this.nonRoutingPeers = new MatTableDataSource<Channel>([]);\n }\n this.applyFilter();\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","import { Component, Input, OnInit, OnDestroy } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil, take } from 'rxjs/operators';\n\nimport { Payment, PayRequest } from '../../../../shared/models/lndModels';\nimport { DataService } from '../../../../shared/services/data.service';\n\n@Component({\n selector: 'rtl-payment-lookup',\n templateUrl: './payment-lookup.component.html',\n styleUrls: ['./payment-lookup.component.scss']\n})\nexport class PaymentLookupComponent implements OnInit, OnDestroy {\n\n @Input() payment: Payment;\n public paths = '';\n private unSubs: Array<Subject<void>> = [new Subject(), new Subject()];\n\n constructor(private dataService: DataService) { }\n\n ngOnInit() {\n if (this.payment.htlcs && this.payment.htlcs[0] && this.payment.htlcs[0].route && this.payment.htlcs[0].route.hops && this.payment.htlcs[0].route.hops.length > 0) {\n const nodePubkeys = this.payment.htlcs[0].route.hops?.reduce((pubkeys, hop) => (pubkeys === '' && hop.pub_key ? hop.pub_key : pubkeys + ',' + hop.pub_key), '');\n this.dataService.getAliasesFromPubkeys(nodePubkeys, true).pipe(takeUntil(this.unSubs[0])).\n subscribe((nodes: any) => {\n this.paths = nodes?.reduce((pathAliases, node) => (pathAliases === '' ? node : pathAliases + '\\n' + node), '');\n });\n }\n if (this.payment.payment_request && this.payment.payment_request.trim() !== '') {\n this.dataService.decodePayment(this.payment.payment_request, false).\n pipe(take(1)).subscribe((decodedPayment: PayRequest) => {\n if (decodedPayment && decodedPayment.description && decodedPayment.description !== '') {\n this.payment.description = decodedPayment.description;\n }\n });\n }\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","<div fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between stretch\">\n <mat-card-content class=\"padding-gap-x-large\" fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between stretch\">\n <div fxFlex=\"100\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Payment Hash</h4>\n <span class=\"foreground-secondary-text\">{{payment?.payment_hash}}</span>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxFlex=\"100\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Payment Preimage</h4>\n <span class=\"foreground-secondary-text\">\n <div>{{payment?.payment_preimage}}</div>\n </span>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxFlex=\"100\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Payment Request</h4>\n <span class=\"foreground-secondary-text\">\n <div>{{payment?.payment_request}}</div>\n </span>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxFlex=\"100\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Description</h4>\n <span class=\"foreground-secondary-text\">\n <div>{{payment?.description}}</div>\n </span>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"row\">\n <div fxFlex=\"50\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Status</h4>\n <span class=\"foreground-secondary-text\">\n <div>{{payment?.status}}</div>\n </span>\n </div>\n <div fxFlex=\"50\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Creation Date</h4>\n <span class=\"foreground-secondary-text\">\n <div>{{payment?.creation_date}}</div>\n </span>\n </div>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"row\">\n <div fxFlex=\"50\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Value (mSats)</h4>\n <span class=\"foreground-secondary-text\">\n <div>{{payment?.value_msat | number}}</div>\n </span>\n </div>\n <div fxFlex=\"50\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Fee (mSats)</h4>\n <span class=\"foreground-secondary-text\">\n <div>{{payment?.fee_msat | number}}</div>\n </span>\n </div>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxFlex=\"100\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Path</h4>\n <span class=\"foreground-secondary-text\">\n <div>{{paths}}</div>\n </span>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n </mat-card-content>\n</div>\n","<div fxLayout=\"column\" fxLayout.gt-sm=\"row\" fxLayoutAlign.gt-sm=\"space-between stretch\">\n <div fxFlex=\"20\" class=\"modal-qr-code-container padding-gap-large\" [fxLayoutAlign]=\"invoice?.payment_request && invoice?.payment_request !== '' ? 'center start' : 'center center'\" [ngClass]=\"{'display-none': screenSize === screenSizeEnum.XS || screenSize === screenSizeEnum.SM}\">\n <qr-code *ngIf=\"invoice?.payment_request && invoice?.payment_request !== ''\" [value]=\"invoice?.payment_request\" [size]=\"qrWidth\" [errorCorrectionLevel]=\"'L'\"></qr-code>\n <span *ngIf=\"!invoice?.payment_request || invoice?.payment_request === ''\" class=\"font-size-300\">N/A</span>\n </div>\n <div fxLayout=\"column\" fxFlex=\"80\">\n <mat-card-content class=\"padding-gap-x-large\">\n <div fxLayout=\"column\">\n <div fxFlex=\"30\" class=\"modal-qr-code-container padding-gap\" [fxLayoutAlign]=\"invoice?.payment_request && invoice?.payment_request !== '' ? 'center start' : 'center center'\" [ngClass]=\"{'display-none': screenSize !== screenSizeEnum.XS && screenSize !== screenSizeEnum.SM}\">\n <qr-code *ngIf=\"invoice?.payment_request && invoice?.payment_request !== ''\" [value]=\"invoice?.payment_request\" [size]=\"qrWidth\" [errorCorrectionLevel]=\"'L'\"></qr-code>\n <span *ngIf=\"!invoice?.payment_request || invoice?.payment_request === ''\" class=\"font-size-120\">QR Code Not Applicable</span>\n </div>\n <mat-divider *ngIf=\"screenSize === screenSizeEnum.XS || screenSize === screenSizeEnum.SM\" class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div [perfectScrollbar]>\n <div fxLayout=\"row\">\n <div fxFlex=\"50\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">{{screenSize === screenSizeEnum.XS ? 'Amount' : 'Amount Requested'}}</h4>\n <span class=\"foreground-secondary-text\">{{(invoice?.value || 0) | number}} Sats<ng-container *ngIf=\"!invoice?.value || invoice?.value === '0'\"> (zero amount) </ng-container></span>\n </div>\n <div fxFlex=\"50\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Amount Settled</h4>\n <span class=\"foreground-secondary-text\">\n <div>{{invoice?.amt_paid_sat | number}} Sats</div>\n </span>\n </div>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"row\">\n <div fxFlex=\"50\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Date Created</h4>\n <span class=\"foreground-secondary-text\">{{invoice?.creation_date * 1000 | date:'dd/MMM/y HH:mm'}}</span>\n </div>\n <div fxFlex=\"50\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Date Settled</h4>\n <span class=\"foreground-secondary-text\">{{(+invoice?.settle_date !== 0 ? ((+invoice?.settle_date * 1000) | date:'dd/MMM/y HH:mm') : '-')}}</span>\n </div>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"row\">\n <div fxFlex=\"100\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Memo</h4>\n <span class=\"foreground-secondary-text\">{{invoice?.memo}}</span>\n </div>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"row\">\n <div fxFlex=\"100\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Payment Request</h4>\n <span class=\"overflow-wrap foreground-secondary-text\">{{invoice?.payment_request || 'N/A'}}</span>\n </div>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"row\">\n <div fxFlex=\"100\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Payment Hash</h4>\n <span class=\"overflow-wrap foreground-secondary-text\">{{invoice?.r_hash || ''}}</span>\n </div>\n </div>\n <div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"row\">\n <div fxFlex=\"100\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Preimage</h4>\n <span class=\"overflow-wrap foreground-secondary-text\">{{invoice?.r_preimage || '-'}}</span>\n </div>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div fxLayout=\"row\">\n <div fxFlex=\"34\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">State</h4>\n <span class=\"overflow-wrap foreground-secondary-text\">{{invoice?.state}}</span>\n </div>\n <div fxFlex=\"33\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Expiry</h4>\n <span class=\"overflow-wrap foreground-secondary-text\">{{invoice?.expiry}}</span>\n </div>\n <div fxFlex=\"33\">\n <h4 fxLayoutAlign=\"start\" class=\"font-bold-500\">Private Routing Hints</h4>\n <span class=\"overflow-wrap foreground-secondary-text\">{{invoice?.private ? 'Yes' : 'No'}}</span>\n </div>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div *ngIf=\"invoice?.htlcs && invoice?.htlcs.length > 0\" fxLayout=\"row\">\n <mat-expansion-panel class=\"flat-expansion-panel\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\" fxFlex=\"100\" (opened)=\"flgOpened = true\" (closed)=\"onExpansionClosed()\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <h4 fxLayoutAlign=\"start center\" fxFlex=\"100\" class=\"font-bold-500\">HTLCs</h4>\n </mat-panel-title>\n </mat-expansion-panel-header>\n <div fxLayout=\"column\" fxLayoutAlign=\"start stretch\" fxFlex=\"100\">\n <div fxLayout=\"row\" fxLayoutAlign=\"start start\" fxFlex=\"100\" class=\"mt-minus-1\">\n <span fxFlex=\"60\" class=\"foreground-secondary-text font-bold-500\">Channel ID</span>\n <span fxFlex=\"40\" class=\"foreground-secondary-text font-bold-500\">Amount (Sats)</span>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n <div *ngFor=\"let htlc of invoice?.htlcs\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\" fxFlex=\"100\">\n <div fxLayout=\"row\" fxLayoutAlign=\"start start\" fxFlex=\"100\">\n <span fxFlex=\"60\" class=\"foreground-secondary-text\">\n <span *ngIf=\"htlc.state === 'SETTLED'\" class=\"dot green\" matTooltip=\"Settled\" matTooltipPosition=\"right\" [ngClass]=\"{'mr-0': screenSize === screenSizeEnum.XS}\"></span>\n <span *ngIf=\"htlc.state === 'ACCEPTED'\" class=\"dot yellow\" matTooltip=\"Accepted\" matTooltipPosition=\"right\" [ngClass]=\"{'mr-0': screenSize === screenSizeEnum.XS}\"></span>\n <span *ngIf=\"htlc.state === 'CANCELED'\" class=\"dot red\" matTooltip=\"Cancelled\" matTooltipPosition=\"right\" [ngClass]=\"{'mr-0': screenSize === screenSizeEnum.XS}\"></span>\n {{htlc.chan_id}}\n </span>\n <span fxFlex=\"40\" class=\"foreground-secondary-text\">{{((+htlc.amt_msat/1000) || 0) | number:getDecimalFormat(htlc)}}</span>\n </div>\n <mat-divider class=\"my-1\" [inset]=\"true\"></mat-divider>\n </div>\n </div>\n </mat-expansion-panel>\n </div>\n <mat-divider *ngIf=\"invoice?.htlcs && invoice?.htlcs.length > 0\" class=\"my-1\" [inset]=\"true\"></mat-divider>\n </div>\n </div>\n </div>\n </mat-card-content>\n </div>\n</div>\n","import { Component, OnInit, Input } from '@angular/core';\n\nimport { CommonService } from '../../../../shared/services/common.service';\nimport { Invoice } from '../../../../shared/models/lndModels';\nimport { ScreenSizeEnum } from '../../../../shared/services/consts-enums-functions';\n\n@Component({\n selector: 'rtl-invoice-lookup',\n templateUrl: './invoice-lookup.component.html',\n styleUrls: ['./invoice-lookup.component.scss']\n})\nexport class InvoiceLookupComponent implements OnInit {\n\n @Input() invoice: Invoice;\n public qrWidth = 240;\n public screenSize = '';\n public screenSizeEnum = ScreenSizeEnum;\n\n constructor(private commonService: CommonService) { }\n\n ngOnInit() {\n this.screenSize = this.commonService.getScreenSize();\n if (this.screenSize === ScreenSizeEnum.XS) {\n this.qrWidth = 220;\n }\n }\n\n getDecimalFormat(htlc: any): string {\n return htlc.amt_msat < 1000 ? '1.0-4' : '1.0-0';\n }\n\n}\n","<div fxLayout=\"column\">\n <div fxLayout=\"row\" fxFlex=\"100\" fxLayoutAlign=\"start start\" class=\"padding-gap\">\n <mat-card-content fxLayout=\"column\" fxFlex=\"100\" fxLayoutAlign=\"space-between stretch\">\n <form #form=\"ngForm\" fxFlex=\"100\" fxLayout=\"column\" fxLayout.gt-sm=\"row wrap\" fxLayoutAlign.gt-sm=\"space-between center\" fxLayoutAlign=\"start space-between\" class=\"w-100\">\n <div fxFlex=\"100\" fxLayoutAlign=\"start end\">\n <mat-radio-group color=\"primary\" tabindex=\"1\" name=\"lookupField\" [(ngModel)]=\"selectedFieldId\" (change)=\"onSelectChange($event)\">\n <mat-radio-button *ngFor=\"let lookupField of lookupFields\" class=\"mr-4\" [value]=\"lookupField.id\" [checked]=\"selectedFieldId === lookupField.id\">\n {{lookupField.name}}\n </mat-radio-button>\n </mat-radio-group>\n </div>\n <mat-form-field fxFlex=\"100\" fxLayoutAlign=\"start end\" [ngClass]=\"{'mt-1': true, 'mt-2': screenSize === screenSizeEnum.XS || screenSize === screenSizeEnum.SM}\">\n <input #key matInput name=\"lookupKey\" tabindex=\"2\" required [placeholder]=\"lookupFields[selectedFieldId]?.placeholder || 'Lookup Key'\" [(ngModel)]=\"lookupKey\" (change)=\"clearLookupValue()\">\n <mat-error *ngIf=\"!lookupKey\">{{lookupFields[selectedFieldId]?.placeholder}} is required.</mat-error>\n </mat-form-field>\n <div fxLayout=\"row\" fxFlex=\"100\" class=\"mt-1\">\n <button class=\"mr-1\" mat-stroked-button color=\"primary\" tabindex=\"3\" type=\"button\" (click)=\"resetData()\">Clear</button>\n <button mat-flat-button color=\"primary\" tabindex=\"4\" type=\"submit\" (click)=\"onLookup()\">Lookup</button>\n </div>\n </form>\n <div *ngIf=\"errorMessage !== ''\" fxFlex=\"100\" fxLayout=\"row wrap\" fxLayoutAlign=\"space-between center\" [ngClass]=\"{'w-100 mt-2 p-2 error-border': errorMessage !== '' && errorMessage !== 'Getting lookup details...', 'w-100 my-2 p-2': true}\">\n <mat-progress-bar *ngIf=\"errorMessage === 'Getting lookup details...'\" mode=\"indeterminate\"></mat-progress-bar>\n {{errorMessage}}\n </div>\n <div *ngIf=\"errorMessage === '' && lookupValue && flgSetLookupValue\" fxFlex=\"100\" fxLayout=\"column\" fxLayout.gt-sm=\"row wrap\" fxLayoutAlign.gt-sm=\"space-between center\" fxLayoutAlign=\"start stretch\" class=\"w-100 mt-2\">\n <div fxLayout=\"row\" fxFlex=\"100\" fxLayoutAlign=\"start center\" class=\"mb-2\">\n <span class=\"page-title font-bold-500\">{{lookupFields[selectedFieldId].name}} Details</span>\n </div>\n <div fxLayout=\"row\" fxFlex=\"100\" fxLayoutAlign=\"start center\" [ngSwitch]=\"selectedFieldId\">\n <span *ngSwitchCase=\"0\" fxFlex=\"100\"><rtl-payment-lookup [payment]=\"lookupValue\"></rtl-payment-lookup></span>\n <span *ngSwitchCase=\"1\" fxFlex=\"100\"><rtl-invoice-lookup [invoice]=\"lookupValue\"></rtl-invoice-lookup></span>\n <span *ngSwitchDefault> fxFlex=\"100\"<h3>Error! Unable to find details!</h3></span>\n </div>\n </div> \n </mat-card-content>\n </div>\n</div>\n","import { Component, OnInit, OnDestroy } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil, filter } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { Actions } from '@ngrx/effects';\nimport { faSearch } from '@fortawesome/free-solid-svg-icons';\n\nimport { APICallStatusEnum, LNDActions, ScreenSizeEnum } from '../../../shared/services/consts-enums-functions';\nimport { CommonService } from '../../../shared/services/common.service';\nimport { LoggerService } from '../../../shared/services/logger.service';\n\nimport { RTLState } from '../../../store/rtl.state';\nimport { invoiceLookup, paymentLookup } from '../../store/lnd.actions';\n\n@Component({\n selector: 'rtl-lookup-transactions',\n templateUrl: './lookup-transactions.component.html',\n styleUrls: ['./lookup-transactions.component.scss']\n})\nexport class LookupTransactionsComponent implements OnInit, OnDestroy {\n\n public lookupKey = '';\n public lookupValue = {};\n public flgSetLookupValue = false;\n public messageObj = [];\n public selectedFieldId = 0;\n public lookupFields = [\n { id: 0, name: 'Payment', placeholder: 'Payment Hash' },\n { id: 1, name: 'Invoice', placeholder: 'Payment Hash' }\n ];\n public faSearch = faSearch;\n public screenSize = '';\n public screenSizeEnum = ScreenSizeEnum;\n public errorMessage = '';\n public apiCallStatusEnum = APICallStatusEnum;\n private unSubs: Array<Subject<void>> = [new Subject()];\n\n constructor(private logger: LoggerService, private commonService: CommonService, private store: Store<RTLState>, private actions: Actions) {\n this.screenSize = this.commonService.getScreenSize();\n }\n\n ngOnInit() {\n this.actions.pipe(takeUntil(this.unSubs[0]), filter((action) => (action.type === LNDActions.SET_LOOKUP_LND))).\n subscribe((resLookup: any) => {\n this.flgSetLookupValue = !resLookup.payload.error;\n this.lookupValue = JSON.parse(JSON.stringify(resLookup.payload));\n this.errorMessage = resLookup.payload.error ? this.commonService.extractErrorMessage(resLookup.payload.error) : '';\n this.logger.info(this.lookupValue);\n });\n }\n\n onLookup(): boolean | void {\n if (!this.lookupKey) {\n return true;\n }\n this.errorMessage = '';\n this.flgSetLookupValue = false;\n this.lookupValue = {};\n switch (this.selectedFieldId) {\n case 0:\n this.store.dispatch(paymentLookup({ payload: Buffer.from(this.lookupKey.trim(), 'hex').toString('base64')?.replace(/\\+/g, '-')?.replace(/[/]/g, '_') }));\n break;\n case 1:\n this.store.dispatch(invoiceLookup({ payload: { openSnackBar: false, paymentHash: Buffer.from(this.lookupKey.trim(), 'hex').toString('base64')?.replace(/\\+/g, '-')?.replace(/[/]/g, '_') } }));\n // if (this.lookupKey.trim().length < 45) {\n // this.store.dispatch(invoiceLookup({ payload: { openSnackBar: false, paymentAddress: this.lookupKey.trim()?.replace(/\\+/g, '-')?.replace(/[/]/g, '_') } }));\n // }\n // if (this.lookupKey.trim().length > 45 && this.lookupKey.trim().length < 70) {\n // this.store.dispatch(invoiceLookup({ payload: { openSnackBar: false, paymentHash: Buffer.from(this.lookupKey.trim(), 'hex').toString('base64')?.replace(/\\+/g, '-')?.replace(/[/]/g, '_') } }));\n // }\n break;\n default:\n break;\n }\n }\n\n onSelectChange(event: any) {\n this.resetData();\n this.selectedFieldId = event.value;\n }\n\n resetData() {\n this.flgSetLookupValue = false;\n this.selectedFieldId = 0;\n this.lookupKey = '';\n this.lookupValue = {};\n this.errorMessage = '';\n }\n\n clearLookupValue() {\n this.lookupValue = {};\n this.flgSetLookupValue = false;\n }\n\n ngOnDestroy() {\n this.unSubs.forEach((completeSub) => {\n completeSub.next(<any>null);\n completeSub.complete();\n });\n }\n\n}\n","import { Routes, RouterModule } from '@angular/router';\nimport { ModuleWithProviders } from '@angular/core';\n\nimport { LNDRootComponent } from './lnd-root.component';\nimport { HomeComponent } from './home/home.component';\nimport { ConnectionsComponent } from './peers-channels/connections.component';\nimport { PeersComponent } from './peers-channels/peers/peers.component';\nimport { ChannelsTablesComponent } from './peers-channels/channels/channels-tables/channels-tables.component';\nimport { ChannelOpenTableComponent } from './peers-channels/channels/channels-tables/channel-open-table/channel-open-table.component';\nimport { ChannelPendingTableComponent } from './peers-channels/channels/channels-tables/channel-pending-table/channel-pending-table.component';\nimport { ChannelClosedTableComponent } from './peers-channels/channels/channels-tables/channel-closed-table/channel-closed-table.component';\nimport { ChannelActiveHTLCsTableComponent } from './peers-channels/channels/channels-tables/channel-active-htlcs-table/channel-active-htlcs-table.component';\nimport { WalletComponent } from './wallet/wallet.component';\nimport { TransactionsComponent } from './transactions/transactions.component';\nimport { LightningPaymentsComponent } from './transactions/payments/lightning-payments.component';\nimport { LightningInvoicesComponent } from './transactions/invoices/lightning-invoices.component';\nimport { GraphComponent } from './graph/graph.component';\nimport { QueryRoutesComponent } from './graph/query-routes/query-routes.component';\nimport { LookupsComponent } from './graph/lookups/lookups.component';\nimport { RoutingComponent } from './routing/routing.component';\nimport { ForwardingHistoryComponent } from './routing/forwarding-history/forwarding-history.component';\nimport { RoutingPeersComponent } from './routing/routing-peers/routing-peers.component';\nimport { ReportsComponent } from './reports/reports.component';\nimport { RoutingReportComponent } from './reports/routing/routing-report.component';\nimport { TransactionsReportComponent } from './reports/transactions/transactions-report.component';\nimport { OnChainComponent } from './on-chain/on-chain.component';\nimport { OnChainReceiveComponent } from './on-chain/on-chain-receive/on-chain-receive.component';\nimport { OnChainSendComponent } from './on-chain/on-chain-send/on-chain-send.component';\nimport { NetworkInfoComponent } from './network-info/network-info.component';\nimport { BackupComponent } from './backup/backup.component';\nimport { ChannelRestoreTableComponent } from './backup/channel-restore-table/channel-restore-table.component';\nimport { ChannelBackupTableComponent } from './backup/channel-backup-table/channel-backup-table.component';\nimport { SignVerifyMessageComponent } from './sign-verify-message/sign-verify-message.component';\nimport { SignComponent } from './sign-verify-message/sign/sign.component';\nimport { VerifyComponent } from './sign-verify-message/verify/verify.component';\nimport { NotFoundComponent } from '../shared/components/not-found/not-found.component';\n\nimport { AuthGuard, LNDUnlockedGuard } from '../shared/services/auth.guard';\nimport { NonRoutingPeersComponent } from './routing/non-routing-peers/non-routing-peers.component';\nimport { LookupTransactionsComponent } from './transactions/lookup-transactions/lookup-transactions.component';\n\ntype PathMatch = 'full' | 'prefix' | undefined;\n\nexport const LndRoutes: Routes = [\n {\n path: '', component: LNDRootComponent,\n children: [\n { path: '', pathMatch: <PathMatch>'full', redirectTo: 'home' },\n { path: 'home', component: HomeComponent, canActivate: [LNDUnlockedGuard] },\n { path: 'wallet', component: WalletComponent, canActivate: [AuthGuard] },\n {\n path: 'onchain', component: OnChainComponent, canActivate: [LNDUnlockedGuard], children: [\n { path: '', pathMatch: <PathMatch>'full', redirectTo: 'receive/utxos' },\n { path: 'receive/:selTab', component: OnChainReceiveComponent, canActivate: [LNDUnlockedGuard] },\n { path: 'send/:selTab', component: OnChainSendComponent, data: { sweepAll: false }, canActivate: [LNDUnlockedGuard] },\n { path: 'sweep/:selTab', component: OnChainSendComponent, data: { sweepAll: true }, canActivate: [LNDUnlockedGuard] }\n ]\n },\n {\n path: 'connections', component: ConnectionsComponent, canActivate: [LNDUnlockedGuard], children: [\n { path: '', pathMatch: <PathMatch>'full', redirectTo: 'channels' },\n {\n path: 'channels', component: ChannelsTablesComponent, canActivate: [LNDUnlockedGuard], children: [\n { path: '', pathMatch: <PathMatch>'full', redirectTo: 'open' },\n { path: 'open', component: ChannelOpenTableComponent, canActivate: [LNDUnlockedGuard] },\n { path: 'pending', component: ChannelPendingTableComponent, canActivate: [LNDUnlockedGuard] },\n { path: 'closed', component: ChannelClosedTableComponent, canActivate: [LNDUnlockedGuard] },\n { path: 'activehtlcs', component: ChannelActiveHTLCsTableComponent, canActivate: [LNDUnlockedGuard] }\n ]\n },\n { path: 'peers', component: PeersComponent, data: { sweepAll: false }, canActivate: [LNDUnlockedGuard] }\n ]\n },\n {\n path: 'transactions', component: TransactionsComponent, canActivate: [LNDUnlockedGuard], children: [\n { path: '', pathMatch: <PathMatch>'full', redirectTo: 'payments' },\n { path: 'payments', component: LightningPaymentsComponent, canActivate: [LNDUnlockedGuard] },\n { path: 'invoices', component: LightningInvoicesComponent, canActivate: [LNDUnlockedGuard] },\n { path: 'lookuptransactions', component: LookupTransactionsComponent, canActivate: [LNDUnlockedGuard] }\n ]\n },\n {\n path: 'messages', component: SignVerifyMessageComponent, canActivate: [LNDUnlockedGuard], children: [\n { path: '', pathMatch: <PathMatch>'full', redirectTo: 'sign' },\n { path: 'sign', component: SignComponent, canActivate: [LNDUnlockedGuard] },\n { path: 'verify', component: VerifyComponent, canActivate: [LNDUnlockedGuard] }\n ]\n },\n {\n path: 'channelbackup', component: BackupComponent, canActivate: [LNDUnlockedGuard], children: [\n { path: '', pathMatch: <PathMatch>'full', redirectTo: 'bckup' },\n { path: 'bckup', component: ChannelBackupTableComponent, canActivate: [LNDUnlockedGuard] },\n { path: 'restore', component: ChannelRestoreTableComponent, canActivate: [LNDUnlockedGuard] }\n ]\n },\n {\n path: 'routing', component: RoutingComponent, canActivate: [LNDUnlockedGuard], children: [\n { path: '', pathMatch: <PathMatch>'full', redirectTo: 'forwardinghistory' },\n { path: 'forwardinghistory', component: ForwardingHistoryComponent, canActivate: [LNDUnlockedGuard] },\n { path: 'peers', component: RoutingPeersComponent, canActivate: [LNDUnlockedGuard] },\n { path: 'nonroutingprs', component: NonRoutingPeersComponent, canActivate: [LNDUnlockedGuard] }\n ]\n },\n {\n path: 'reports', component: ReportsComponent, canActivate: [LNDUnlockedGuard], children: [\n { path: '', pathMatch: <PathMatch>'full', redirectTo: 'routingreport' },\n { path: 'routingreport', component: RoutingReportComponent, canActivate: [LNDUnlockedGuard] },\n { path: 'transactions', component: TransactionsReportComponent, canActivate: [LNDUnlockedGuard] }\n ]\n },\n {\n path: 'graph', component: GraphComponent, canActivate: [LNDUnlockedGuard], children: [\n { path: '', pathMatch: <PathMatch>'full', redirectTo: 'lookups' },\n { path: 'lookups', component: LookupsComponent, canActivate: [LNDUnlockedGuard] },\n { path: 'queryroutes', component: QueryRoutesComponent, canActivate: [LNDUnlockedGuard] }\n ]\n },\n { path: 'lookups', component: LookupsComponent, canActivate: [LNDUnlockedGuard] },\n { path: 'network', component: NetworkInfoComponent, canActivate: [LNDUnlockedGuard] },\n { path: '**', component: NotFoundComponent },\n { path: 'rates', redirectTo: 'network' }\n ]\n }\n];\n\nexport const LNDRouting: ModuleWithProviders<RouterModule> = RouterModule.forChild(LndRoutes);\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { LNDRouting } from './lnd.routing';\nimport { SharedModule } from '../shared/shared.module';\n\nimport { LNDRootComponent } from './lnd-root.component';\nimport { HomeComponent } from './home/home.component';\nimport { ConnectionsComponent } from './peers-channels/connections.component';\nimport { ChannelsTablesComponent } from './peers-channels/channels/channels-tables/channels-tables.component';\nimport { PeersComponent } from './peers-channels/peers/peers.component';\nimport { LightningInvoicesComponent } from './transactions/invoices/lightning-invoices.component';\nimport { LookupTransactionsComponent } from './transactions/lookup-transactions/lookup-transactions.component';\nimport { PaymentLookupComponent } from './transactions/lookup-transactions/payment-lookup/payment-lookup.component';\nimport { InvoiceLookupComponent } from './transactions/lookup-transactions/invoice-lookup/invoice-lookup.component';\nimport { OnChainReceiveComponent } from './on-chain/on-chain-receive/on-chain-receive.component';\nimport { OnChainComponent } from './on-chain/on-chain.component';\nimport { UTXOTablesComponent } from './on-chain/utxo-tables/utxo-tables.component';\nimport { OnChainUTXOsComponent } from './on-chain/utxo-tables/utxos/utxos.component';\nimport { OnChainTransactionHistoryComponent } from './on-chain/utxo-tables/on-chain-transaction-history/on-chain-transaction-history.component';\nimport { WalletComponent } from './wallet/wallet.component';\nimport { LightningPaymentsComponent } from './transactions/payments/lightning-payments.component';\nimport { ChannelPendingTableComponent } from './peers-channels/channels/channels-tables/channel-pending-table/channel-pending-table.component';\nimport { BumpFeeComponent } from './peers-channels/channels/bump-fee-modal/bump-fee.component';\nimport { ChannelClosedTableComponent } from './peers-channels/channels/channels-tables/channel-closed-table/channel-closed-table.component';\nimport { TransactionsComponent } from './transactions/transactions.component';\nimport { LookupsComponent } from './graph/lookups/lookups.component';\nimport { ReportsComponent } from './reports/reports.component';\nimport { RoutingReportComponent } from './reports/routing/routing-report.component';\nimport { TransactionsReportComponent } from './reports/transactions/transactions-report.component';\nimport { RoutingComponent } from './routing/routing.component';\nimport { ForwardingHistoryComponent } from './routing/forwarding-history/forwarding-history.component';\nimport { RoutingPeersComponent } from './routing/routing-peers/routing-peers.component';\nimport { NonRoutingPeersComponent } from './routing/non-routing-peers/non-routing-peers.component';\nimport { ChannelLookupComponent } from './graph/lookups/channel-lookup/channel-lookup.component';\nimport { NodeLookupComponent } from './graph/lookups/node-lookup/node-lookup.component';\nimport { BackupComponent } from './backup/backup.component';\nimport { ChannelBackupTableComponent } from './backup/channel-backup-table/channel-backup-table.component';\nimport { ChannelRestoreTableComponent } from './backup/channel-restore-table/channel-restore-table.component';\nimport { SignVerifyMessageComponent } from './sign-verify-message/sign-verify-message.component';\nimport { SignComponent } from './sign-verify-message/sign/sign.component';\nimport { VerifyComponent } from './sign-verify-message/verify/verify.component';\nimport { QueryRoutesComponent } from './graph/query-routes/query-routes.component';\nimport { GraphComponent } from './graph/graph.component';\nimport { ChannelOpenTableComponent } from './peers-channels/channels/channels-tables/channel-open-table/channel-open-table.component';\nimport { ChannelActiveHTLCsTableComponent } from './peers-channels/channels/channels-tables/channel-active-htlcs-table/channel-active-htlcs-table.component';\nimport { UnlockWalletComponent } from './wallet/unlock/unlock.component';\nimport { InitializeWalletComponent } from './wallet/initialize/initialize.component';\nimport { NodeInfoComponent } from './home/node-info/node-info.component';\nimport { BalancesInfoComponent } from './home/balances-info/balances-info.component';\nimport { FeeInfoComponent } from './home/fee-info/fee-info.component';\nimport { ChannelStatusInfoComponent } from './home/channel-status-info/channel-status-info.component';\nimport { ChannelCapacityInfoComponent } from './home/channel-capacity-info/channel-capacity-info.component';\nimport { ChannelLiquidityInfoComponent } from './home/channel-liquidity-info/channel-liquidity-info.component';\nimport { NetworkInfoComponent } from './network-info/network-info.component';\nimport { InvoiceInformationComponent } from './transactions/invoice-information-modal/invoice-information.component';\nimport { ChannelRebalanceComponent } from './peers-channels/channels/channel-rebalance-modal/channel-rebalance.component';\nimport { ChannelRebalanceInfographicsComponent } from './peers-channels/channels/channel-rebalance-infographics/channel-rebalance-infographics.component';\nimport { CloseChannelComponent } from './peers-channels/channels/close-channel-modal/close-channel.component';\nimport { OpenChannelComponent } from './peers-channels/channels/open-channel-modal/open-channel.component';\nimport { ChannelInformationComponent } from './peers-channels/channels/channel-information-modal/channel-information.component';\nimport { OnChainLabelModalComponent } from './on-chain/on-chain-label-modal/on-chain-label-modal.component';\nimport { OnChainSendModalComponent } from './on-chain/on-chain-send-modal/on-chain-send-modal.component';\nimport { OnChainSendComponent } from './on-chain/on-chain-send/on-chain-send.component';\nimport { LightningSendPaymentsComponent } from './transactions/send-payment-modal/send-payment.component';\nimport { CreateInvoiceComponent } from './transactions/create-invoice-modal/create-invoice.component';\nimport { ConnectPeerComponent } from './peers-channels/connect-peer/connect-peer.component';\n\nimport { LNDUnlockedGuard } from '../shared/services/auth.guard';\n\n@NgModule({\n imports: [\n CommonModule,\n SharedModule,\n LNDRouting\n ],\n declarations: [\n LNDRootComponent,\n HomeComponent,\n PeersComponent,\n ConnectionsComponent,\n LightningInvoicesComponent,\n LookupTransactionsComponent,\n PaymentLookupComponent,\n InvoiceLookupComponent,\n WalletComponent,\n LightningPaymentsComponent,\n ChannelPendingTableComponent,\n BumpFeeComponent,\n ChannelClosedTableComponent,\n TransactionsComponent,\n LookupsComponent,\n RoutingComponent,\n ForwardingHistoryComponent,\n RoutingPeersComponent,\n NonRoutingPeersComponent,\n ChannelLookupComponent,\n NodeLookupComponent,\n BackupComponent,\n ChannelBackupTableComponent,\n ChannelRestoreTableComponent,\n SignVerifyMessageComponent,\n SignComponent,\n VerifyComponent,\n ReportsComponent,\n RoutingReportComponent,\n TransactionsReportComponent,\n QueryRoutesComponent,\n GraphComponent,\n OnChainReceiveComponent,\n OnChainComponent,\n UTXOTablesComponent,\n OnChainUTXOsComponent,\n OnChainTransactionHistoryComponent,\n ChannelsTablesComponent,\n ChannelOpenTableComponent,\n ChannelActiveHTLCsTableComponent,\n UnlockWalletComponent,\n InitializeWalletComponent,\n NodeInfoComponent,\n BalancesInfoComponent,\n FeeInfoComponent,\n ChannelStatusInfoComponent,\n ChannelCapacityInfoComponent,\n ChannelLiquidityInfoComponent,\n NetworkInfoComponent,\n InvoiceInformationComponent,\n ChannelRebalanceComponent,\n ChannelRebalanceInfographicsComponent,\n OpenChannelComponent,\n ChannelInformationComponent,\n LightningSendPaymentsComponent,\n ConnectPeerComponent,\n CloseChannelComponent,\n CreateInvoiceComponent,\n OnChainSendComponent,\n OnChainSendModalComponent,\n OnChainLabelModalComponent\n ],\n providers: [\n LNDUnlockedGuard\n ],\n bootstrap: [LNDRootComponent]\n})\nexport class LNDModule { }\n"],"x_google_ignoreList":[]}