lnlink-server 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/README.md +461 -0
  2. package/dist/app.js +11165 -0
  3. package/dist/binaries.json +20 -0
  4. package/dist/build-info.json +41 -0
  5. package/dist/config.default.js +19 -0
  6. package/dist/index.js +19002 -0
  7. package/dist/index.js.map +7 -0
  8. package/dist/package.json +61 -0
  9. package/dist/prisma/migrations/20250918020814_/migration.sql +188 -0
  10. package/dist/prisma/migrations/20251114105314_auto_update/migration.sql +2 -0
  11. package/dist/prisma/migrations/migration_lock.toml +3 -0
  12. package/dist/prisma/schema.prisma +181 -0
  13. package/dist/proto/chainkit.proto +74 -0
  14. package/dist/proto/lightning.proto +5411 -0
  15. package/dist/proto/lit-status.proto +36 -0
  16. package/dist/proto/looprpc/client.proto +1435 -0
  17. package/dist/proto/price_oracle.proto +243 -0
  18. package/dist/proto/rfqrpc/rfq.proto +436 -0
  19. package/dist/proto/routerrpc/router.proto +1136 -0
  20. package/dist/proto/signrpc/signer.proto +709 -0
  21. package/dist/proto/stateservice.proto +73 -0
  22. package/dist/proto/swapserverrpc/common.proto +37 -0
  23. package/dist/proto/tapchannel.proto +306 -0
  24. package/dist/proto/tapcommon.proto +36 -0
  25. package/dist/proto/taprootassets.proto +1959 -0
  26. package/dist/proto/universe.proto +1063 -0
  27. package/dist/proto/walletkit.proto +1594 -0
  28. package/dist/proto/walletunlocker.proto +338 -0
  29. package/dist/public/css/initOwner.css +553 -0
  30. package/dist/public/favicon.ico +0 -0
  31. package/dist/public/init.html +70 -0
  32. package/dist/public/js/init.js +454 -0
  33. package/dist/setting.mainnet.json +22 -0
  34. package/dist/setting.regtest.json +22 -0
  35. package/dist/setting.testnet.json +22 -0
  36. package/package.json +91 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../config.default.js", "../business/utils/linkLogger.js", "../business/service/prisma/prismaService.js", "../business/service/prisma/repositories/lnlinkConfigRepository.js", "../business/utils/dataUtils.js", "../business/service/prisma/db/utils.js", "../business/service/prisma/db/config.js", "../constants/index.js", "../business/service/prisma/repositories/nostrEventRepository.js", "../business/service/prisma/db/events.js", "../business/service/prisma/repositories/orderRepository.js", "../business/service/prisma/db/orders.js", "../business/service/prisma/repositories/transactionRepository.js", "../business/service/prisma/db/transactions.js", "../business/service/prisma/repositories/lnlinkUserRepository.js", "../business/service/prisma/db/users.js", "../business/service/prisma/dbService.js", "../business/utils/linkCache.js", "../business/common/getConfig.js", "../business/utils/path.js", "../business/utils/macaroonUtils.js", "../business/utils/responseUtils.js", "../business/utils/timeUtils.js", "../business/utils/index.js", "../business/service/rpc/lnd/chainkitService.js", "../business/service/rpc/lnd/client.js", "../business/service/rpc/lnd/lightningService.js", "../business/service/rpc/lnd/litStatusService.js", "../business/service/rpc/lnd/routerService.js", "../business/service/rpc/lnd/singerService.js", "../business/service/rpc/lnd/walletkitService.js", "../business/service/rpc/lnd/index.js", "../business/service/rpc/lnd/instance.js", "../business/service/rpc/taprootAssets/client.js", "../business/service/rpc/taprootAssets/priceOracleService.js", "../business/service/rpc/taprootAssets/tapchannelService.js", "../business/service/rpc/taprootAssets/taprootAssetService.js", "../business/service/rpc/taprootAssets/universeService.js", "../business/service/rpc/taprootAssets/index.js", "../business/service/rpc/taprootAssets/instance.js", "../business/service/rpc/walletUnlocker/client.js", "../business/service/rpc/walletUnlocker/walletStateService.js", "../business/service/rpc/walletUnlocker/walletUnlockerService.js", "../business/service/rpc/walletUnlocker/index.js", "../business/service/rpc/walletUnlocker/instance.js", "../business/common/index.js", "../business/service/report/request.js", "../business/service/report/reportService.js", "../business/service/nodeManage/config.js", "../business/service/nodeManage/processManager.js", "../business/service/rgb/client.js", "../business/service/rgb/node.js", "../business/service/nodeManage/statusChecker.js", "../business/service/nodeManage/index.js", "../business/service/proxy/apiProxy.js", "../business/utils/linkEvent.js", "../api/index.js", "../business/utils/lnlink.js", "../constants/bigint.js", "../business/service/accountService.js", "../business/utils/executeWithRetry.js", "../package.json", "../business/service/lndService.js", "../business/service/tapdService.js", "../nostr/config/constants.js", "../business/service/rpc/lightspark/instance.js", "../business/service/lightsparkService.js", "../business/service/nwcService.js", "../business/service/proxy/lndProxy.js", "../business/service/buyFlashAccountService.js", "../business/service/proxy/nwcProxy.js", "../business/service/rgb/info.js", "../business/service/rgb/lightning.js", "../business/service/rgb/onchain.js", "../business/service/rgb/index.js", "../business/service/proxy/rgbProxy.js", "../nostr/nostrPool.js", "../nostr/utils/nostrUtils.js", "../nostr/auth/authService.js", "../nostr/events/eventProcessor.js", "../nostr/events/eventLoop.js", "../nostr/connection/connectionManager.js", "../business/job/lnd/addFederationServer.js", "../business/job/lnd/checkChannelState.js", "../business/job/lnd/connectPeer.js", "../business/common/mempool.js", "../business/job/lnd/pollBtcTransfers.js", "../business/job/lnd/invoiceChange.js", "../business/job/lnd/paymentChange.js", "../business/job/lnd/pollInvoiceTransfers.js", "../business/job/rgb/connectPeer.js", "../business/job/rgb/pollBtcTransfers.js", "../business/job/rgb/pollLightningTransfers.js", "../business/job/rgb/pollRgbTransfers.js", "../business/job/rgb/refreshTransfers.js", "../business/job/tapd/taprootOnchainTransChange.js", "../business/job/tapd/pollTaprootAssetTransfers.js", "../business/job/config/tasks.js", "../business/job/core/EventBus.js", "../business/job/core/Gates.js", "../business/job/core/Scheduler.js", "../business/job/core/StateManager.js", "../business/job/core/SubscriptionManager.js", "../business/job/core/TaskRegistry.js", "../business/job/core/JobManager.js", "../business/job/index.js", "../business/job/compatibility.js", "../business/job/startLitd.js", "../business/job/startRGB.js", "../setting.mainnet.json", "../setting.regtest.json", "../setting.testnet.json", "../business/init/initLinkConfig.js", "../business/init/index.js", "../lnlink.js"],
4
+ "sourcesContent": ["const defaultConfig = {\n LINK_LND_RPC_PORT: 10009,\n LINK_LND_PEER_LISTEN_PORT: 9735,\n LINK_RGB_LISTENING_PORT: 3001,\n LINK_RGB_LDK_PEER_LISTENING_PORT: 9736,\n LINK_HTTP_PORT: 8090,\n LINK_NAME: \"link\",\n LINK_DEBUG: true,\n LINK_ENABLE_TOR: true,\n LINK_BINARY_PATH: \"\",\n LINK_DATA_PATH: \"\",\n LINK_FLASH_SITE_BASE_URL: \"https://devofflash.unift.xyz\",\n LINK_LNFI_NODE_SITE_URL: \"https://devoflnnode.unift.xyz\",\n LINK_OWNER: \"\",\n LINK_SETTING_FILE_PATH: \"\",\n // LINK_SETTING_FILE_PATH: \"\",\n}\n\nmodule.exports = defaultConfig\n", "const fs = require(\"node:fs\")\nconst path = require(\"node:path\")\nconst pino = require(\"pino\")\n\n// Lazy initialization to ensure environment variables are set\nlet baseLogger = null\n\nfunction getLogsPath() {\n const dataPath = process.env.LINK_DATA_PATH\n // console.log(\"\uD83D\uDE80 Starting LNLink with source code...\", dataPath)\n if (!dataPath) {\n // Fallback to current directory if LINK_DATA_PATH is not set\n return path.join(process.cwd(), \".logs\")\n }\n if(process.env.LINK_NODE_ENV==='development' || process.env.LINK_NODE_ENV==='app'){\n return path.join(dataPath, \".logs\")\n }\n return \"/root/.logs\"\n \n}\n\nfunction ensureLogsDirectory() {\n const logsPath = getLogsPath()\n if (!fs.existsSync(logsPath)) {\n fs.mkdirSync(logsPath, { recursive: true })\n }\n return logsPath\n}\n\nfunction createPinoConfig() {\n const logsPath = ensureLogsDirectory()\n const isDev = process.env.LINK_NODE_ENV === \"development\"\n\n return isDev\n ? {\n level: \"info\",\n timestamp: pino.stdTimeFunctions.isoTime,\n formatters: {\n level: label => ({ level: label.toUpperCase() }),\n },\n transport: {\n target: \"pino-pretty\",\n options: {\n colorize: true,\n translateTime: \"yyyy-mm-dd HH:MM:ss\",\n ignore: \"pid,hostname\",\n messageFormat: \"[{logType}] {msg}\",\n },\n },\n }\n : {\n level: \"info\",\n timestamp: pino.stdTimeFunctions.isoTime,\n // Remove custom formatters when using transport.targets\n transport: {\n targets: [\n {\n target: \"pino-pretty\",\n level: \"info\",\n options: {\n colorize: true,\n translateTime: \"yyyy-mm-dd HH:MM:ss\",\n ignore: \"pid,hostname\",\n messageFormat: \"[{logType}] {msg}\",\n },\n },\n {\n target: \"pino-roll\",\n level: \"info\",\n options: {\n file: path.join(logsPath, \"ln-link.log\"),\n frequency: \"daily\",\n size: \"5m\",\n dateFormat: \"yyyy-MM-dd\",\n limit: {\n count: 7,\n },\n },\n },\n ],\n },\n }\n}\n\nfunction getBaseLogger() {\n if (!baseLogger) {\n const pinoConfig = createPinoConfig()\n baseLogger = pino(pinoConfig)\n }\n return baseLogger\n}\n\nclass Logger {\n // Cache for logger instances to avoid creating multiple instances with the same logType\n static instances = new Map()\n\n constructor(logType) {\n // Check if logger instance already exists for this logType\n if (Logger.instances.has(logType)) {\n return Logger.instances.get(logType)\n }\n\n this.logType = logType\n // Lazy initialization - get baseLogger when creating child logger\n this.logger = getBaseLogger().child({ logType })\n\n // Cache the instance\n Logger.instances.set(logType, this)\n }\n\n debug(message, ...args) {\n this.logger.debug({ msg: message }, ...args)\n }\n\n info(message, ...args) {\n this.logger.info({ msg: message }, ...args)\n }\n\n warn(message, ...args) {\n this.logger.warn({ msg: message }, ...args)\n }\n\n error(message, ...args) {\n this.logger.error({ msg: message }, ...args)\n }\n\n fatal(message, ...args) {\n this.logger.fatal({ msg: message }, ...args)\n }\n\n logWithData(level, message, data) {\n this.logger[level]({ ...data, msg: message })\n }\n}\n\nmodule.exports = Logger\n", "const { PrismaClient } = require(\"@prisma/client\")\n\nconst Logger = require(\"../../utils/linkLogger.js\")\n\nclass PrismaService {\n static instance = null\n\n constructor() {\n const logger = new Logger(\"PrismaService\")\n this.prisma = new PrismaClient({\n log: [\n { level: \"query\", emit: \"event\" },\n { level: \"error\", emit: \"event\" },\n { level: \"info\", emit: \"event\" },\n { level: \"warn\", emit: \"event\" },\n ],\n errorFormat: \"minimal\",\n })\n\n // Log queries in development\n if (process.env.LINK_NODE_ENV === \"development\") {\n this.prisma.$on(\"query\", (e) => {\n logger.debug(`Query: ${e.query}`)\n logger.debug(`Params: ${e.params}`)\n logger.debug(`Duration: ${e.duration}ms`)\n })\n }\n\n this.prisma.$on(\"error\", (e) => {\n logger.warn(`Database error: ${e.message}`)\n })\n }\n\n static getInstance() {\n if (!PrismaService.instance) {\n PrismaService.instance = new PrismaService()\n }\n return PrismaService.instance\n }\n\n /**\n * Force reinitialize the PrismaService instance\n * This is useful after generating new Prisma client\n */\n static forceReinitialize() {\n const logger = new Logger(\"PrismaService\")\n if (PrismaService.instance) {\n // Disconnect existing client\n PrismaService.instance.prisma.$disconnect().catch((err) => {\n logger.warn(`Error disconnecting old Prisma client: ${err.message}`)\n })\n }\n // Clear the cached instance\n PrismaService.instance = null\n // Create new instance with fresh client\n PrismaService.instance = new PrismaService()\n logger.debug(\"PrismaService instance reinitialized\")\n }\n\n /**\n * Execute operation with retry mechanism\n * @param {Function} operation - The operation to execute\n * @param {number} maxRetries - Maximum number of retries\n * @param {number} delay - Delay between retries in ms\n * @returns {Promise} Result of the operation\n */\n async withRetry(operation, maxRetries = 3, delay = 1000) {\n const logger = new Logger(\"PrismaService\")\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n return await operation()\n }\n catch (error) {\n logger.warn(`Attempt ${attempt} failed: ${error.message}`)\n\n if (attempt === maxRetries) {\n logger.error(`Operation failed after ${maxRetries} attempts`)\n throw error\n }\n\n // Exponential backoff\n const waitTime = delay * 2 ** (attempt - 1)\n await new Promise(resolve => setTimeout(resolve, waitTime))\n }\n }\n }\n\n /**\n * Execute operation within transaction\n * @param {Function} operation - The operation to execute\n * @returns {Promise} Result of the transaction\n */\n async withTransaction(operation) {\n return this.prisma.$transaction(operation, {\n maxWait: 5000, // 5 seconds max wait\n timeout: 10000, // 10 seconds timeout\n })\n }\n\n /**\n * Health check for database connection\n * @returns {Promise<boolean>} Connection status\n */\n async healthCheck() {\n const logger = new Logger(\"PrismaService\")\n try {\n await this.prisma.$queryRaw`SELECT 1`\n return true\n }\n catch (error) {\n logger.error(`Database health check failed: ${error.message}`)\n return false\n }\n }\n\n /**\n * Get Prisma client instance\n * @returns {PrismaClient} Prisma client\n */\n getClient() {\n return this.prisma\n }\n\n /**\n * Close database connection gracefully\n */\n async disconnect() {\n const logger = new Logger(\"PrismaService\")\n try {\n logger.info(\"Disconnecting from database...\")\n await this.prisma.$disconnect()\n logger.info(\"Database disconnected successfully\")\n }\n catch (error) {\n logger.error(`Error disconnecting from database: ${error.message}`)\n }\n finally {\n PrismaService.instance = null\n }\n }\n\n /**\n * Static method to disconnect the singleton instance\n */\n static async disconnect() {\n if (PrismaService.instance) {\n await PrismaService.instance.disconnect()\n }\n }\n}\n\nmodule.exports = PrismaService\n", "const PrismaService = require(\"../prismaService\")\n\nclass LnlinkConfigRepository {\n constructor() {\n this.prisma = PrismaService.getInstance().getClient()\n }\n\n /**\n * Create new LnLink config\n * @param {object} configData - Config data\n * @returns {Promise<object>} Created config\n */\n async createConfig(configData) {\n const {\n owner_npub,\n node_encrypted_sk,\n node_npub,\n node_name,\n settings,\n create_at,\n update_at,\n } = configData\n\n return this.prisma.lnlinkConfig.create({\n data: {\n owner_npub,\n node_encrypted_sk,\n node_npub,\n node_name,\n settings: typeof settings === \"string\" ? settings : JSON.stringify(settings),\n create_at: create_at || Math.floor(Date.now() / 1000),\n update_at: update_at || Math.floor(Date.now() / 1000),\n },\n })\n }\n\n /**\n * Get config by ID\n * @param {number} id - Config ID\n * @returns {Promise<object | null>} Config or null\n */\n async getConfigById(id) {\n return this.prisma.lnlinkConfig.findUnique({\n where: { id },\n })\n }\n\n /**\n * Get config by owner npub\n * @param {string} ownerNpub - Owner npub\n * @returns {Promise<object | null>} Config or null\n */\n async getConfigByOwnerNpub(ownerNpub) {\n return this.prisma.lnlinkConfig.findFirst({\n where: { owner_npub: ownerNpub },\n })\n }\n\n /**\n * Get config by node npub\n * @param {string} nodeNpub - Node npub\n * @returns {Promise<object | null>} Config or null\n */\n async getConfigByNodeNpub(nodeNpub) {\n return this.prisma.lnlinkConfig.findFirst({\n where: { node_npub: nodeNpub },\n })\n }\n\n /**\n * Get the first/main config\n * @returns {Promise<object | null>} Config or null\n */\n async getMainConfig() {\n return this.prisma.lnlinkConfig.findFirst({\n orderBy: { id: \"asc\" },\n })\n }\n\n /**\n * Get all configs\n * @returns {Promise<Array>} Array of configs\n */\n async getAllConfigs() {\n return this.prisma.lnlinkConfig.findMany({\n orderBy: { create_at: \"desc\" },\n })\n }\n\n /**\n * Update config\n * @param {number} id - Config ID\n * @param {object} updateData - Data to update\n * @returns {Promise<object>} Updated config\n */\n async updateConfig(id, updateData) {\n const {\n owner_npub,\n node_encrypted_sk,\n node_npub,\n node_name,\n settings,\n } = updateData\n\n const data = {\n update_at: Math.floor(Date.now() / 1000),\n }\n\n if (owner_npub !== undefined)\n data.owner_npub = owner_npub\n if (node_encrypted_sk !== undefined)\n data.node_encrypted_sk = node_encrypted_sk\n if (node_npub !== undefined)\n data.node_npub = node_npub\n if (node_name !== undefined)\n data.node_name = node_name\n if (settings !== undefined) {\n data.settings = typeof settings === \"string\" ? settings : JSON.stringify(settings)\n }\n\n return this.prisma.lnlinkConfig.update({\n where: { id },\n data,\n })\n }\n\n /**\n * Update or create config (upsert)\n * @param {object} configData - Config data\n * @returns {Promise<object>} Config\n */\n async upsertConfig(configData) {\n const {\n owner_npub,\n node_encrypted_sk,\n node_npub,\n node_name,\n settings,\n } = configData\n\n const now = Math.floor(Date.now() / 1000)\n const data = {\n owner_npub,\n node_encrypted_sk,\n node_npub,\n node_name,\n settings: typeof settings === \"string\" ? settings : JSON.stringify(settings),\n update_at: now,\n }\n\n // Try to find existing config first\n const existingConfig = await this.getMainConfig()\n\n if (existingConfig) {\n return this.updateConfig(existingConfig.id, data)\n }\n else {\n return this.createConfig({\n ...data,\n create_at: now,\n })\n }\n }\n\n /**\n * Delete config\n * @param {number} id - Config ID\n * @returns {Promise<object>} Deleted config\n */\n async deleteConfig(id) {\n return this.prisma.lnlinkConfig.delete({\n where: { id },\n })\n }\n\n /**\n * Check if config exists\n * @returns {Promise<boolean>} True if exists\n */\n async configExists(id) {\n const config = await this.prisma.lnlinkConfig.findUnique({\n where: { id },\n select: { id: true },\n })\n return !!config\n }\n}\n\nmodule.exports = LnlinkConfigRepository\n", "const { Buffer } = require(\"node:buffer\")\nconst CryptoJS = require(\"crypto-js\")\nconst Decimal = require(\"decimal.js\")\nconst Long = require(\"long\")\n\nfunction isHex(str) {\n return /^[0-9A-F]+$/i.test(str)\n}\nfunction isNumeric(n) {\n return !Number.isNaN(Number(n))\n}\nfunction isBase64(str) {\n try {\n return Buffer.from(str, \"base64\").toString(\"base64\") === str\n }\n catch {\n return false\n }\n}\nfunction isBuffer(obj) {\n return Buffer.isBuffer(obj)\n}\nfunction hexToBase64(hexStr) {\n return Buffer.from(hexStr, \"hex\").toString(\"base64\")\n}\nfunction base64ToHex(base64Str) {\n return Buffer.from(base64Str, \"base64\").toString(\"hex\")\n}\nfunction bytesToTxHash(bytes) {\n if (!bytes.length) {\n return \"\"\n }\n const hexString = bytes.reduce(\n (result, byte) => result + byte.toString(16).padStart(2, \"0\"),\n \"\",\n )\n const txHash = hexString\n .match(/.{1,2}/g)\n .reverse()\n .join(\"\")\n return txHash\n}\nfunction convertBuffers(obj, key) {\n if (Array.isArray(obj)) {\n return obj.map(item => convertBuffers(item))\n }\n else if (typeof obj === \"object\" && obj) {\n if (Buffer.isBuffer(obj)) {\n if (typeof key === \"string\" && key.includes(\"txid\")) {\n const buffer = Buffer.from(obj)\n return bytesToTxHash(Array.from(buffer))\n }\n const buffer = Buffer.from(obj)\n return buffer.toString(\"hex\")\n }\n if (obj.low !== undefined) {\n return new Long(obj.low, obj.high).toString()\n }\n else {\n const result = {}\n Object.keys(obj).forEach((key) => {\n result[key] = convertBuffers(obj[key], key)\n })\n return result\n }\n }\n else {\n return obj\n }\n}\nfunction convertHexObjToBase64Obj(obj) {\n if (Array.isArray(obj)) {\n return obj.map(convertHexObjToBase64Obj)\n }\n else if (obj) {\n if (typeof obj === \"string\") {\n if (isNumeric(obj)) {\n return Number(obj)\n }\n if (isHex(obj)) {\n const buffer = Buffer.from(obj, \"hex\")\n return buffer\n }\n if (isBase64(obj)) {\n return obj\n }\n return obj\n }\n if (typeof obj === \"object\") {\n const result = {}\n Object.keys(obj).forEach((key) => {\n result[key] = convertHexObjToBase64Obj(obj[key])\n })\n return result\n }\n return obj\n }\n else {\n return obj\n }\n}\nfunction formatJson(json) {\n let formatted = \"\"\n let indent = 0\n let inString = false\n for (let i = 0; i < json.length; i++) {\n const char = json[i]\n if (inString && char === inString && json[i - 1] !== \"\\\\\") {\n inString = false\n }\n else if (!inString && (char === \"\\\"\" || char === \"'\")) {\n inString = char\n }\n else if (!inString && (char === \" \" || char === \"\\t\")) {\n continue\n }\n if (!inString && char === \"{\") {\n indent++\n formatted += `${char}\\n${\"\\t\".repeat(indent)}`\n }\n else if (!inString && char === \"}\") {\n indent--\n formatted += `\\n${\"\\t\".repeat(indent)}${char}`\n }\n else if (!inString && char === \",\") {\n formatted += `${char}\\n${\"\\t\".repeat(indent)}`\n }\n else {\n formatted += char\n }\n }\n return formatted\n}\n\nfunction aesEncrypt(data, secret) {\n return CryptoJS.AES.encrypt(data, secret).toString()\n}\n\nfunction aesDecrypt(cipherText, secret) {\n const bytes = CryptoJS.AES.decrypt(cipherText, secret)\n const originalText = bytes.toString(CryptoJS.enc.Utf8)\n return originalText\n}\nfunction filterParams(params) {\n const requestParams = {}\n\n for (const key in params) {\n if (params[key] !== undefined) {\n requestParams[key] = params[key]\n }\n }\n\n return requestParams\n}\nfunction satsToTaprootAssetByRate(sats, feeRate) {\n const coefficient = feeRate.coefficient\n const scale = feeRate.scale\n\n const satsToBTC = new Decimal(sats).div(100000000)\n\n const tprAssetAmt = satsToBTC.mul(new Decimal(coefficient).div(10 ** scale))\n\n return tprAssetAmt.toString()\n}\nmodule.exports = {\n isHex,\n isNumeric,\n isBase64,\n isBuffer,\n hexToBase64,\n base64ToHex,\n bytesToTxHash,\n convertBuffers,\n convertHexObjToBase64Obj,\n formatJson,\n aesEncrypt,\n aesDecrypt,\n filterParams,\n satsToTaprootAssetByRate,\n}\n", "const { aesDecrypt, aesEncrypt } = require(\"@business/utils/dataUtils\")\nconst PrismaService = require(\"../prismaService\")\n\nmodule.exports = {\n withTransaction: async (operations) => {\n const prismaService = PrismaService.getInstance()\n return prismaService.withTransaction(operations)\n },\n withRetry: async (operation, maxRetries) => {\n const prismaService = PrismaService.getInstance()\n return prismaService.withRetry(operation, maxRetries)\n },\n healthCheck: async () => {\n const prismaService = PrismaService.getInstance()\n return prismaService.healthCheck()\n },\n close: async () => {\n const prismaService = PrismaService.getInstance()\n return prismaService.disconnect()\n },\n\n encryptWrapperSK: (sk, secret = \"link\") => {\n return aesEncrypt(sk, secret)\n },\n decyptWrapperSK: (cipherSk, secret = \"link\") => {\n return aesDecrypt(cipherSk, secret)\n },\n}\n", "const LnlinkConfigRepository = require(\"../repositories/lnlinkConfigRepository\")\n\n// Lazy initialization of repository to avoid early PrismaService creation\nlet configRepo = null\nfunction getConfigRepo() {\n if (!configRepo) {\n configRepo = new LnlinkConfigRepository()\n }\n return configRepo\n}\n\nconst { getPublicKey, nip04 } = require(\"nostr-tools\")\nconst { decyptWrapperSK, encryptWrapperSK } = require(\"./utils\")\n\nmodule.exports = {\n /**\n * Get main/first config\n * @returns {Promise<object | null>} Main config or null\n */\n getMainLnlinkConfig: async () => {\n const mainConfig = await getConfigRepo().getMainConfig()\n if (!mainConfig) {\n return null\n }\n const cloneConfig = { ...mainConfig }\n if (mainConfig?.node_encrypted_sk) {\n cloneConfig.node_sk = decyptWrapperSK(mainConfig.node_encrypted_sk)\n }\n if (mainConfig?.settings) {\n cloneConfig.settings = JSON.parse(mainConfig.settings)\n }\n return cloneConfig\n },\n /**\n * Update LnLink config\n * @param {object} data - Update data with id\n * @returns {Promise<number>} 1 if success, 0 if failed\n */\n updateMainLnlinkConfig: async (data) => {\n try {\n const mainConfig = await getConfigRepo().getMainConfig()\n const cloneData = { ...data }\n if (data?.node_sk) {\n cloneData.node_encrypted_sk = encryptWrapperSK(data.node_sk)\n }\n if (!mainConfig) {\n const result = await getConfigRepo().createConfig(cloneData)\n return result ? 1 : 0\n }\n else {\n const id = mainConfig.id\n const { ...updateData } = cloneData\n await getConfigRepo().updateConfig(id, updateData)\n return 1\n }\n }\n catch (error) {\n console.error(\"Error updating config:\", error)\n return 0\n }\n },\n\n /**\n * Check if config exists\n * @returns {Promise<boolean>} True if exists\n */\n configExists: async () => {\n const config = await getConfigRepo().getMainConfig()\n if (!config) {\n return false\n }\n return getConfigRepo().configExists(config.id)\n },\n\n decryptNostrString: async (enctryptStr) => {\n const config = await module.exports.getMainLnlinkConfig()\n const sk = config.node_sk\n const from = getPublicKey(getPublicKey(sk))\n const decodeStr = await nip04.decrypt(sk, from, enctryptStr)\n return `${decodeStr}`\n },\n\n}\n", "const dayjs = require(\"dayjs\")\n\nconst ASSET_TYPE = {\n NORMAL: 0,\n COLLECTIBLE: 1,\n}\nconst CLIENT_TYPE = {\n LN: 1,\n WALLET_UNLOCKER: 2,\n STATE: 3,\n WALLET_KIT: 4,\n SINGER: 5,\n CHANIN_KIT: 6,\n TAPRPC: 7,\n UNIVERSE: 8,\n TAPCHANNEL: 9,\n PRICE_ORACLE: 10,\n LIT_STATUS: 11,\n ROUTER_RPC: 12,\n}\nconst WALLET_STATE = {\n 0: {\n code: 0,\n label: \"NON_EXISTING\",\n },\n 1: {\n code: 1,\n label: \"LOCKED\",\n },\n 2: {\n code: 2,\n label: \"UNLOCKED\",\n },\n 3: {\n code: 3,\n label: \"RPC_ACTIVE\",\n },\n 4: {\n code: 4,\n label: \"SERVER_ACTIVE\",\n },\n 255: {\n code: 255,\n label: \"WAITING_TO_START\",\n },\n}\nconst WALLET_STATE_CODE = {\n NON_EXISTING: 0,\n LOCKED: 1,\n UNLOCKED: 2,\n RPC_ACTIVE: 3,\n SERVER_ACTIVE: 4,\n WAITING_TO_START: 255,\n}\nconst EVENT_HANDLE_STATUS = {\n NO_HANDLE: 0,\n REPLYING: 1,\n SUCCESS: 2,\n ERROR: 255,\n}\nconst REISTE_ROBOT_ADDR\n = \"npub1me48869w43j30cfry9ayz9dsdl4gj54xppgk9krrv7g6hsq7psuqp3yusn\"\n\nconst NWC_PERMISSIONS = [\n \"get_info\",\n \"get_balance\",\n \"make_invoice\",\n \"pay_invoice\",\n \"lookup_invoice\",\n \"list_transactions\",\n \"create_flash_account\",\n \"list_flash_accounts\",\n \"toggle_enable_flash_account\",\n]\n\nconst FLASH_REGISTER_PERMISSIONS = [\n \"get_buy_flash_account_info\",\n \"buy_flash_account\",\n \"get_mine_flash_account\",\n \"get_mine_transaction\",\n]\nconst READ_ONLY_PERMISSIONS = [\n \"get_info\",\n \"get_state\",\n \"list_peers\",\n \"wallet_balance\",\n \"new_address\",\n \"decode_pay_req\",\n \"list_channels\",\n \"list_assets\",\n \"query_rate_tick\",\n \"decode_asset_pay_req\",\n \"get_lnlink_info\",\n \"get_lnlink_user_list\",\n \"get_transactions\",\n \"get_light_spark_balance\",\n \"lightning_spark_receive\",\n \"get_lightning_spark_test_invoice\",\n \"link_status\",\n \"list_unspents\",\n \"decode_rgb_invoice\",\n \"decode_ln_invoice\",\n]\nconst OWNER_PERMISSIONS = [\n \"genseed\",\n \"init_wallet\",\n \"unlock\",\n \"send_coins\",\n \"sign_message\",\n \"verify_message\",\n \"bake_node\",\n \"decode_addr\",\n \"stop_litd\",\n \"restart_litd\",\n \"add_invoice\",\n \"send_payment\",\n \"open_channel\",\n \"close_channel\",\n \"connect_peer\",\n \"send\",\n \"receive\",\n \"enable_tapd\",\n \"sync_universe\",\n \"new_tapd_addr\",\n \"send_tapd_assets\",\n \"create_tapd_channel\",\n \"add_tapd_invoice\",\n \"send_tapd_payment\",\n \"generate_lnlink\",\n \"change_lnlink_user_status\",\n \"light_spark_add_funds\",\n \"light_spark_withdraw\",\n \"lightning_spark_send\",\n \"config_link\",\n \"start_link\",\n \"start_rgb\",\n \"stop_rgb\",\n \"restart_rgb\",\n \"create_utxos\",\n \"create_rgb_invoice\",\n \"pay_rgb_invoice\",\n \"disconnect_peer\",\n \"create_invoice\",\n \"pay_invoice\",\n \"backup_node\",\n \"restore_node\",\n \"update_node_name\",\n ...READ_ONLY_PERMISSIONS,\n]\n\nconst SOCILA_TYPE = {\n EVM: 1,\n BTC: 2,\n X: 3,\n}\nconst USER_STATUS = {\n RUNNING: 1,\n DISABLED: 0,\n}\n// read_only \u6743\u9650.\n\nconst FUNDING_CHANNEL_STATUS = {\n DELETE: -1,\n PENDING_PAYMENT: 0,\n PAYMENT_COMPLETE: 1,\n OPEN_CHANNEL_COMPLETE: 2,\n OPEN_CHANNEL_ERR: 254,\n DISABLED: 255,\n}\nconst ACCOUNT_TYPE = {\n NWC: 1,\n FLASH: 2,\n FLASH_REGISTER: 3,\n OWNER: 4,\n READ_ONLY: 5,\n}\nconst EXPIRE_TIME_MAP = {\n \"1w\": dayjs().unix() + 7 * 24 * 60 * 60,\n \"1m\": dayjs().unix() + 30 * 24 * 60 * 60,\n \"never\": Number(\"2147483647\"),\n}\nconst AUTH_LIMIT_MAP = {\n \"10k\": 10000,\n \"25k\": 25000,\n \"50k\": 50000,\n \"100k\": 100000,\n \"1m\": 1000000,\n // 'unlimited': Number.MAX_SAFE_INTEGER\n}\nconst INVOICE_STATUS = {\n OPEN: \"OPEN\",\n SETTLED: \"SETTLED\",\n CANCELED: \"CANCELED\",\n ACCEPTED: \"ACCEPTED\",\n EXPIRED: \"EXPIRED\",\n FAILED: \"FAILED\",\n ERROR: \"ERROR\",\n}\n\nconst PAYMENT_STATUS = {\n IN_FLIGHT: 1,\n SUCCEEDED: 2,\n FAILED: 3,\n INITIATED: 4,\n}\n\nconst TRANSACTION_STATUS = {\n PENDING: 0,\n CONFIRMED: 1,\n FAILED: 2,\n CANCELED: 3,\n SETTLED: 10,\n EXPIRED: 11,\n UNKNOWN: 255,\n}\n\nconst NODE_TYPE = {\n LITD: \"litd\",\n RGB: \"rgb\",\n}\nconst TRANSACTION_KIND = {\n ONCHAIN: \"onchain\",\n LIGHTNING: \"lightning\",\n}\n\nconst TRANSACTION_DIRECTION = {\n IN: \"in\",\n OUT: \"out\",\n}\n\nconst TRANSACTION_ASSET_TYPE = {\n BTC: \"btc\",\n TAPROOT_ASSET: \"taproot\",\n RGB_ASSET: \"rgb\",\n}\n\nconst SATS_ID = \"0x000000000000000000000000000000000000000\"\n\nconst WHITE_PUBKEY_LIST = {\n mainnet: [],\n regtest: [],\n}\n\nconst TASKS = {\n EnableTaprootAssetNode: \"EnableTaprootAssetNode\",\n ClaimToTaprootNode: \"ClaimToTaprootNode\",\n TaprootAssetMainnetWithdraw: \"TaprootAssetMainnetWithdraw\",\n CreateBTCChannel: \"CreateBTCChannel\",\n CreateTaprootAssetChannel: \"CreateTaprootAssetChannel\",\n TaprootAssetChannelWithdraw: \"TaprootAssetChannelWithdraw\",\n CloseTaprootChannel: \"CloseTaprootChannel\",\n StopTaprootAssetNode: \"StopTaprootAssetNode\",\n EnableRGBNode: \"EnableRGBNode\",\n ClaimBTCToRGBNode: \"ClaimBTCToRGBNode\",\n ClaimRGBToken: \"ClaimRGBToken\",\n RGBAssetMainnetWithdraw: \"RGBAssetMainnetWithdraw\",\n CreateRGBChannel: \"CreateRGBChannel\",\n RGBChannelWithdraw: \"RGBChannelWithdraw\",\n CloseRGBChannel: \"CloseRGBChannel\",\n StopRGBNode: \"StopRGBNode\",\n CreateZapperEVMAccount: \"CreateZapperEVMAccount\",\n}\n\nconst INVOICE_EXPIRY_TIME = {\n \"10m\": 600,\n \"1h\": 3600,\n \"24h\": 86400,\n}\n\nmodule.exports = {\n ASSET_TYPE,\n CLIENT_TYPE,\n WALLET_STATE,\n EVENT_HANDLE_STATUS,\n REISTE_ROBOT_ADDR,\n NWC_PERMISSIONS,\n ACCOUNT_TYPE,\n FUNDING_CHANNEL_STATUS,\n WALLET_STATE_CODE,\n EXPIRE_TIME_MAP,\n AUTH_LIMIT_MAP,\n INVOICE_STATUS,\n PAYMENT_STATUS,\n SATS_ID,\n WHITE_PUBKEY_LIST,\n FLASH_REGISTER_PERMISSIONS,\n SOCILA_TYPE,\n USER_STATUS,\n OWNER_PERMISSIONS,\n READ_ONLY_PERMISSIONS,\n TRANSACTION_STATUS,\n NODE_TYPE,\n TRANSACTION_KIND,\n TRANSACTION_DIRECTION,\n TRANSACTION_ASSET_TYPE,\n TASKS,\n INVOICE_EXPIRY_TIME,\n}\n", "const { EVENT_HANDLE_STATUS } = require(\"@constants/index.js\")\nconst dayjs = require(\"dayjs\")\nconst { nip19 } = require(\"nostr-tools\")\nconst PrismaService = require(\"../prismaService\")\n\nclass NostrEventRepository {\n constructor() {\n this.prisma = PrismaService.getInstance().getClient()\n }\n\n /**\n * Insert new Nostr event\n * @param {object} event - Event data\n * @returns {Promise<object>} Created event or existing event\n */\n async insertEvent(event) {\n const {\n kind,\n created_at,\n tags,\n content,\n pubkey,\n id,\n } = event\n\n // Check if event already exists\n const existingEvent = await this.getEventByEventId(id)\n if (existingEvent) {\n return existingEvent\n }\n\n const to = tags?.find(item => item[0] === \"p\")?.[1]\n const from_npub = nip19.npubEncode(pubkey)\n const to_npub = to ? nip19.npubEncode(to) : null\n return this.prisma.lnlinkNostrEvent.create({\n data: {\n event_id: id,\n content,\n kind,\n create_at: created_at,\n tags: JSON.stringify(tags),\n from_npub,\n to_npub,\n },\n })\n }\n\n /**\n * Update event status and related fields\n * @param {number} id - Event ID\n * @param {object} updateData - Update data\n * @returns {Promise<object>} Updated event\n */\n async updateEvent(id, updateData) {\n const {\n reply_event_id,\n status,\n reply_err,\n } = updateData\n\n const data = {\n status,\n reply_at: dayjs().unix(),\n }\n\n if (reply_event_id) {\n data.reply_event_id = reply_event_id\n }\n\n if (reply_err) {\n data.reply_err = reply_err\n }\n\n return this.prisma.lnlinkNostrEvent.update({\n where: { id },\n data,\n })\n }\n\n /**\n * Get unprocessed events\n * @param {number} limit - Number of events to fetch\n * @returns {Promise<Array>} List of unprocessed events\n */\n async getUnReplyEvents(limit = 5) {\n return this.prisma.lnlinkNostrEvent.findMany({\n where: {\n status: EVENT_HANDLE_STATUS.NO_HANDLE,\n },\n take: limit,\n orderBy: {\n create_at: \"asc\",\n },\n })\n }\n\n /**\n * Get event by eventId\n * @param {string} eventId - Event ID\n * @returns {Promise<object | null>} Event or null\n */\n async getEventByEventId(eventId) {\n return this.prisma.lnlinkNostrEvent.findFirst({\n where: { event_id: eventId },\n })\n }\n\n /**\n * Delete old processed events\n * @param {object} options - Delete options\n * @param {number} options.olderThanDays - Delete events older than X days\n * @param {number} options.startTime - Start time (unix timestamp)\n * @param {number} options.endTime - End time (unix timestamp)\n * @returns {Promise<object>} Delete result\n */\n async cleanupOldEvents(options = {}) {\n const {\n olderThanDays = 30,\n startTime,\n endTime,\n } = options\n\n let timeCondition = {}\n\n if (startTime && endTime) {\n // Use specific time range\n timeCondition = {\n create_at: {\n gte: startTime,\n lte: endTime,\n },\n }\n }\n else {\n // Use olderThanDays\n const cutoffTime = Date.now() - (olderThanDays * 24 * 60 * 60 * 1000)\n timeCondition = {\n create_at: {\n lt: Math.floor(cutoffTime / 1000),\n },\n }\n }\n\n return this.prisma.lnlinkNostrEvent.deleteMany({\n where: {\n status: {\n in: [EVENT_HANDLE_STATUS.SUCCESS, EVENT_HANDLE_STATUS.ERROR],\n },\n ...timeCondition,\n },\n })\n }\n}\n\nmodule.exports = NostrEventRepository\n", "const NostrEventRepository = require(\"../repositories/nostrEventRepository\")\n\n// Lazy initialization of repository to avoid early PrismaService creation\nlet nostrEventRepo = null\nfunction getNostrEventRepo() {\n if (!nostrEventRepo) {\n nostrEventRepo = new NostrEventRepository()\n }\n return nostrEventRepo\n}\n\nconst { nip19 } = require(\"nostr-tools\")\n\nmodule.exports = {\n insertEvent: async (event) => {\n try {\n const result = await getNostrEventRepo().insertEvent(event)\n return result ? 1 : 0\n }\n catch (error) {\n console.error(\"Error inserting event:\", error)\n return 0\n }\n },\n updateEvent: async (id, updateData) => {\n try {\n await getNostrEventRepo().updateEvent(id, updateData)\n return 1\n }\n catch (error) {\n console.error(\"Error updating event:\", error)\n return 0\n }\n },\n getUnReplyEvents: async (limit) => {\n try {\n const events = await getNostrEventRepo().getUnReplyEvents(limit)\n\n return events.map((event) => {\n const processedEvent = { ...event }\n\n if (event.from_npub) {\n try {\n const decoded = nip19.decode(event.from_npub)\n processedEvent.from = decoded.data\n }\n catch (error) {\n console.error(\"Error decoding from_npub:\", error)\n }\n }\n\n if (event.to_npub) {\n try {\n const decoded = nip19.decode(event.to_npub)\n processedEvent.to = decoded.data\n }\n catch (error) {\n console.error(\"Error decoding to_npub:\", error)\n }\n }\n\n return processedEvent\n })\n }\n catch (error) {\n console.error(\"Error getting unreply events:\", error)\n return []\n }\n },\n}\n", "const PrismaService = require(\"../prismaService\")\n\nclass OrderRepository {\n constructor() {\n this.prisma = PrismaService.getInstance().getClient()\n }\n\n /**\n * Create new LnLink order\n * @param {object} orderData - Order data\n * @returns {Promise<object>} Created order\n */\n async createOrder(orderData) {\n const { transaction_id, user_id } = orderData\n\n return this.prisma.lnlinkOrder.create({\n data: {\n transaction_id,\n user_id,\n },\n })\n }\n\n /**\n * Get user by invoice through order relationship\n * @param {string} invoice - Invoice string\n * @returns {Promise<object | null>} User with transaction info or null\n */\n async getUserByInvoiceAndOrder(invoice) {\n // First, find the transaction through the invoice\n const transaction = await this.prisma.lnlinkTransaction.findFirst({\n where: { invoice },\n select: {\n id: true,\n invoice: true,\n amount: true,\n type: true,\n status: true,\n settled_at: true,\n },\n })\n\n if (!transaction)\n return null\n\n // Then find the order through transaction_id\n const order = await this.prisma.lnlinkOrder.findFirst({\n where: {\n transaction_id: transaction.id,\n },\n })\n\n if (!order)\n return null\n\n const user = await this.prisma.lnlinkUser.findUnique({\n where: { id: order.user_id },\n select: {\n id: true,\n name: true,\n pubkey: true,\n sk: true,\n node_pubkey: true,\n relay: true,\n account_type: true,\n social_id: true,\n auth_limit: true,\n permissions: true,\n expire_time: true,\n create_at: true,\n status: true,\n asset_id: true,\n },\n })\n\n if (!user)\n return null\n\n // Flatten the response to match the original query structure\n return {\n ...user,\n invoice: transaction.invoice,\n amount: transaction.amount,\n type: transaction.type,\n lt_status: transaction.status,\n settled_at: transaction.settled_at,\n }\n }\n\n /**\n * Get orders with pagination\n * @param {object} options - Query options\n * @returns {Promise<object>} Paginated orders\n */\n async getOrdersWithPagination(options) {\n const {\n page = 1,\n pageSize = 20,\n userId,\n transactionId,\n } = options\n\n const where = {}\n if (userId)\n where.user_id = userId\n if (transactionId)\n where.transaction_id = transactionId\n\n const [orders, total] = await Promise.all([\n this.prisma.lnlinkOrder.findMany({\n where,\n orderBy: {\n create_at: \"desc\",\n },\n skip: (page - 1) * pageSize,\n take: pageSize,\n }),\n this.prisma.lnlinkOrder.count({ where }),\n ])\n\n // Manually fetch related user and transaction information\n const userIds = orders.map(order => order.user_id)\n const transactionIds = orders.map(order => order.transaction_id)\n\n const [users, transactions] = await Promise.all([\n this.prisma.lnlinkUser.findMany({\n where: { id: { in: userIds } },\n select: {\n id: true,\n name: true,\n pubkey: true,\n social_id: true,\n },\n }),\n this.prisma.lnlinkTransaction.findMany({\n where: { id: { in: transactionIds } },\n select: {\n id: true,\n invoice: true,\n amount: true,\n type: true,\n status: true,\n create_at: true,\n },\n }),\n ])\n\n // Create lookup maps\n const userMap = users.reduce((acc, user) => {\n acc[user.id] = user\n return acc\n }, {})\n\n const transactionMap = transactions.reduce((acc, transaction) => {\n acc[transaction.id] = transaction\n return acc\n }, {})\n\n // Combine results\n const ordersWithRelations = orders.map(order => ({\n ...order,\n user: userMap[order.user_id] || null,\n transaction: transactionMap[order.transaction_id] || null,\n }))\n\n return { count: total, list: ordersWithRelations }\n }\n\n /**\n * Delete order by ID\n * @param {number} orderId - Order ID\n * @returns {Promise<object>} Delete result\n */\n async deleteOrder(orderId) {\n return this.prisma.lnlinkOrder.delete({\n where: { id: orderId },\n })\n }\n\n /**\n * Get order statistics\n * @returns {Promise<object>} Order statistics\n */\n async getOrderStatistics() {\n const [totalOrders, ordersByType] = await Promise.all([\n this.prisma.lnlinkOrder.count(),\n this.prisma.lnlinkOrder.groupBy({\n by: [\"user_id\"],\n _count: {\n id: true,\n },\n orderBy: {\n _count: {\n id: \"desc\",\n },\n },\n take: 10,\n }),\n ])\n\n return {\n totalOrders,\n topUsersByOrders: ordersByType,\n }\n }\n}\n\nmodule.exports = OrderRepository\n", "const OrderRepository = require(\"../repositories/orderRepository\")\n\n// Lazy initialization of repository to avoid early PrismaService creation\nlet orderRepo = null\nfunction getOrderRepo() {\n if (!orderRepo) {\n orderRepo = new OrderRepository()\n }\n return orderRepo\n}\n\nmodule.exports = {\n insertLnLinkOrder: async (data) => {\n try {\n const result = await getOrderRepo().createOrder(data)\n return result ? 1 : 0\n }\n catch (error) {\n console.error(\"Error inserting order:\", error)\n return 0\n }\n },\n getLnlinkUserByInvoiceAndOrder: async (data) => {\n const { invoice } = data\n return getOrderRepo().getUserByInvoiceAndOrder(invoice)\n },\n}\n", "const {\n TRANSACTION_STATUS,\n TRANSACTION_KIND,\n NODE_TYPE,\n TRANSACTION_DIRECTION,\n} = require(\"@constants/index.js\")\nconst dayjs = require(\"dayjs\")\nconst PrismaService = require(\"../prismaService\")\n\nclass TransactionRepository {\n constructor() {\n this.prisma = PrismaService.getInstance().getClient()\n }\n\n /**\n * Create new transaction\n * @param {object} transactionData - Transaction data\n * @returns {Promise<object>} Created transaction\n */\n async createTransaction(transactionData) {\n const {\n event_id,\n user_npub,\n asset_type,\n asset_id,\n asset_amount,\n fees_paid,\n invoice,\n status,\n node_type,\n transaction_kind,\n direction,\n add_index,\n payment_hash,\n preimage,\n description,\n description_hash,\n create_at = dayjs().unix(),\n update_at = dayjs().unix(),\n expire_at,\n settled_at,\n tx_hash,\n tx_type,\n block_height,\n confirmations,\n } = transactionData\n\n return this.prisma.lnlinkTransaction.create({\n data: {\n event_id,\n user_npub,\n asset_type,\n asset_id,\n asset_amount,\n fees_paid,\n invoice,\n status,\n node_type,\n transaction_kind,\n direction,\n add_index,\n payment_hash,\n preimage,\n description,\n description_hash,\n create_at,\n update_at,\n expire_at,\n settled_at,\n tx_hash,\n tx_type,\n block_height,\n confirmations,\n },\n })\n }\n\n /**\n * Upsert transaction by event_id\n * @param {object} transactionData - Transaction data\n * @returns {Promise<object>} Upserted transaction\n */\n async upsertTransaction(transactionData) {\n const {\n event_id,\n user_npub,\n asset_type,\n asset_id,\n asset_amount,\n fees_paid,\n invoice,\n status,\n node_type,\n transaction_kind,\n direction,\n add_index,\n payment_hash,\n preimage,\n description,\n description_hash,\n create_at = dayjs().unix(),\n update_at = dayjs().unix(),\n expire_at,\n settled_at,\n tx_hash,\n tx_type,\n target_address,\n block_height,\n confirmations,\n } = transactionData\n\n return this.prisma.lnlinkTransaction.upsert({\n where: { event_id },\n update: {\n user_npub,\n asset_type,\n asset_id,\n asset_amount,\n fees_paid,\n invoice,\n status,\n node_type,\n transaction_kind,\n direction,\n add_index,\n payment_hash,\n preimage,\n description,\n description_hash,\n update_at,\n expire_at,\n settled_at,\n tx_hash,\n tx_type,\n target_address,\n block_height,\n confirmations,\n },\n create: {\n event_id,\n user_npub,\n asset_type,\n asset_id,\n asset_amount,\n fees_paid,\n invoice,\n status,\n node_type,\n transaction_kind,\n direction,\n add_index,\n payment_hash,\n preimage,\n description,\n description_hash,\n create_at,\n update_at,\n expire_at,\n settled_at,\n tx_hash,\n tx_type,\n target_address,\n block_height,\n confirmations,\n },\n })\n }\n\n /**\n * Upsert transaction by invoice (when invoice exists)\n * @param {object} transactionData - Transaction data\n * @returns {Promise<object>} Upserted transaction\n */\n async upsertTransactionByFilter(transactionData, filter = {}) {\n // const { invoice, ...otherData } = transactionData\n\n if (!Object.keys(filter).length) {\n throw new Error(\"filter is required for upsert by invoice\")\n }\n\n // First, try to find existing transaction by invoice\n const existing = await this.prisma.lnlinkTransaction.findFirst({\n where: filter,\n })\n\n if (existing) {\n // Update existing transaction\n return this.prisma.lnlinkTransaction.update({\n where: { id: existing.id },\n data: {\n ...transactionData,\n update_at: dayjs().unix(),\n },\n })\n }\n else {\n // Create new transaction\n return this.prisma.lnlinkTransaction.create({\n data: {\n ...transactionData,\n create_at: transactionData.create_at || dayjs().unix(),\n update_at: dayjs().unix(),\n },\n })\n }\n }\n\n /**\n * Get transactions with filters\n * @param {object} filters - Filter criteria\n * @returns {Promise<object>} Transactions list and total count\n */\n async getTransactions(filters) {\n const {\n limit,\n offset,\n type,\n } = filters\n\n const where = {}\n if (type)\n where.type = type\n\n const [list, total] = await Promise.all([\n this.prisma.lnlinkTransaction.findMany({\n where,\n select: {\n id: true,\n event_id: true,\n amount: true,\n type: true,\n invoice: true,\n payment_hash: true,\n create_at: true,\n expire_at: true,\n settled_at: true,\n status: true,\n link_user_id: true,\n add_index: true,\n },\n take: limit,\n skip: offset,\n orderBy: { create_at: \"desc\" },\n }),\n this.prisma.lnlinkTransaction.count({ where }),\n ])\n\n return { total, list }\n }\n\n /**\n * Get transaction by invoice\n * @param {string} invoice - Invoice string\n * @returns {Promise<object | null>} Transaction or null\n */\n async getTransactionByInvoice(invoice) {\n return this.prisma.lnlinkTransaction.findFirst({\n where: { invoice },\n select: {\n id: true,\n event_id: true,\n asset_id: true,\n asset_amount: true,\n asset_type: true,\n invoice: true,\n payment_hash: true,\n create_at: true,\n expire_at: true,\n settled_at: true,\n status: true,\n user_npub: true,\n add_index: true,\n },\n })\n }\n\n /**\n * Get transaction with user info by invoice\n * @param {string} invoice - Invoice string\n * @returns {Promise<object | null>} Transaction with user info or null\n */\n async getTransactionUser(invoice) {\n // First get the transaction record\n const transaction = await this.prisma.lnlinkTransaction.findFirst({\n where: { invoice },\n })\n\n if (!transaction || !transaction.link_user_id) {\n return null\n }\n\n // Then get the user information\n const user = await this.prisma.lnlinkUser.findUnique({\n where: { id: transaction.link_user_id },\n select: {\n account_type: true,\n social_id: true,\n },\n })\n\n // Return combined result\n return {\n ...transaction,\n user,\n }\n }\n\n /**\n * Get transactions by filter with advanced options\n * @param {object} filters - Filter criteria\n * @returns {Promise<object>} Filtered transactions\n */\n async getTransactionsByFilter(filters) {\n const {\n user_npub,\n node_type,\n transaction_kind,\n asset_type,\n direction,\n status,\n from,\n until,\n limit,\n offset = 0,\n unpaid,\n addIndex,\n paymentHash,\n invoice,\n asset_id,\n tx_hash,\n target_address,\n } = filters\n\n const where = {}\n\n if (user_npub)\n where.user_npub = user_npub\n if (node_type)\n where.node_type = node_type\n if (transaction_kind)\n where.transaction_kind = transaction_kind\n if (direction)\n where.direction = direction\n if (addIndex)\n where.add_index = Number.parseInt(addIndex)\n if (paymentHash)\n where.payment_hash = paymentHash\n if (invoice)\n where.invoice = invoice\n if (tx_hash)\n where.tx_hash = tx_hash\n if (target_address)\n where.target_address = target_address\n\n // Handle status filtering\n if (status !== \"undefined\" && status !== null && status !== \"\" && !Array.isArray(status)) {\n where.status = status\n }\n if (Array.isArray(status)) {\n where.status = { in: status }\n }\n if (unpaid) {\n where.status = TRANSACTION_STATUS.PENDING\n }\n\n // Date range filtering\n if (from)\n where.create_at = { gte: from }\n if (until) {\n where.create_at = where.create_at ? { ...where.create_at, lte: until } : { lte: until }\n }\n if (asset_id) {\n where.asset_id = asset_id\n }\n if (asset_type) {\n where.asset_type = asset_type\n }\n\n const [list, total] = await Promise.all([\n this.prisma.lnlinkTransaction.findMany({\n where,\n orderBy: { create_at: \"desc\" },\n take: limit,\n skip: offset,\n }),\n this.prisma.lnlinkTransaction.count({ where }),\n ])\n\n return { list, total }\n }\n\n /**\n * Get minimum open invoice index\n * @returns {Promise<number|null>} Minimum index or null\n */\n\n async getMinOpenInvoiceIndex() {\n const result = await this.prisma.lnlinkTransaction.findFirst({\n where: {\n status: TRANSACTION_STATUS.PENDING,\n direction: TRANSACTION_DIRECTION.IN,\n node_type: NODE_TYPE.LITD,\n transaction_kind: TRANSACTION_KIND.LIGHTNING,\n },\n select: {\n id: true,\n add_index: true,\n invoice: true,\n },\n orderBy: {\n add_index: \"asc\",\n },\n })\n\n if (!result) {\n return null\n }\n\n return {\n id: result.id,\n invoice: result.invoice,\n add_index: result.add_index,\n }\n }\n\n /**\n * Get minimum open payment index\n * @returns {Promise<number|null>} Minimum index or null\n */\n async getMinOpenPaymentIndex() {\n const result = await this.prisma.lnlinkTransaction.findFirst({\n where: {\n status: TRANSACTION_STATUS.PENDING,\n direction: TRANSACTION_DIRECTION.OUT,\n node_type: NODE_TYPE.LITD,\n transaction_kind: TRANSACTION_KIND.LIGHTNING,\n },\n select: {\n id: true,\n add_index: true,\n invoice: true,\n },\n orderBy: {\n add_index: \"asc\",\n },\n })\n\n return result\n }\n\n /**\n * Get transaction by payment hash\n * @param {string} payment_hash - Payment hash\n * @returns {Promise<object|null>} Transaction or null\n */\n async getTransactionByPaymentHash(payment_hash) {\n return this.prisma.lnlinkTransaction.findFirst({\n where: {\n payment_hash,\n node_type: NODE_TYPE.LITD,\n transaction_kind: TRANSACTION_KIND.LIGHTNING,\n },\n })\n }\n\n /**\n * Get transactions by network type\n * @param {object} args - Query arguments\n * @returns {Promise<object>} Transactions for network\n */\n async getTransactionsByNetwork(args) {\n const {\n transaction_kind,\n page_index,\n page_size,\n node_type,\n direction,\n } = args\n\n console.log(\"args==>\", args)\n return this.getTransactionsByFilter({\n limit: page_size,\n offset: (page_index - 1) * page_size,\n node_type,\n transaction_kind,\n direction,\n })\n }\n\n /**\n * Get user transaction statistics\n * @param {number} userId - User ID\n * @returns {Promise<object>} Transaction statistics\n */\n async getUserTransactionStats(userId) {\n const stats = await this.prisma.lnlinkTransaction.groupBy({\n by: [\"type\", \"status\"],\n where: {\n link_user_id: userId,\n },\n _sum: {\n amount: true,\n },\n _count: {\n id: true,\n },\n })\n\n return stats\n }\n}\n\nmodule.exports = TransactionRepository\n", "const TransactionRepository = require(\"../repositories/transactionRepository\")\n\n// Lazy initialization of repository to avoid early PrismaService creation\nlet repo = null\nfunction getTransactionRepo() {\n if (!repo) {\n repo = new TransactionRepository()\n }\n return repo\n}\n\nconst Logger = require(\"@business/utils/linkLogger.js\")\n\nmodule.exports = {\n insertTransaction: async (transactionData) => {\n const logger = new Logger(\"transactionDB\")\n try {\n const result = await getTransactionRepo().createTransaction(transactionData)\n return result ? 1 : 0\n }\n catch (error) {\n logger.error(\"Error inserting transaction:\", error.message)\n return 0\n }\n },\n upsertTransactionByFilter: async (transactionData, filter) => {\n const logger = new Logger(\"transactionDB\")\n try {\n const result = await getTransactionRepo().upsertTransactionByFilter(transactionData, filter)\n return result ? 1 : 0\n }\n catch (error) {\n logger.error(\"Error upserting transaction:\", error.message)\n return 0\n }\n },\n\n getTransactions: async (filters) => {\n return getTransactionRepo().getTransactions(filters)\n },\n getTransactionByInvoice: async (data) => {\n const { invoice } = data\n return getTransactionRepo().getTransactionByInvoice(invoice)\n },\n getTransactionUser: async (data) => {\n const { invoice } = data\n const result = await getTransactionRepo().getTransactionUser(invoice)\n if (!result)\n return null\n const { user, ...transaction } = result\n return {\n ...transaction,\n account_type: user?.account_type,\n social_id: user?.social_id,\n }\n },\n getTransactionsByFilter: async (filters) => {\n return getTransactionRepo().getTransactionsByFilter(filters)\n },\n getMinOpendInvoiveIndex: async () => {\n const result = await getTransactionRepo().getMinOpenInvoiceIndex()\n return result\n },\n getMinOpendPaymentIndex: async () => {\n const logger = new Logger(\"transactionDB\")\n try {\n const result = await getTransactionRepo().getMinOpenPaymentIndex()\n return result\n }\n catch (error) {\n logger.error(\"Error getting min open payment index:\", error.message)\n return { minIndex: null }\n }\n },\n getTransactionByPaymentHash: async (data) => {\n const logger = new Logger(\"transactionDB\")\n try {\n const { payment_hash } = data\n return await getTransactionRepo().getTransactionByPaymentHash(payment_hash)\n }\n catch (error) {\n logger.error(\"Error getting transaction by payment hash:\", error.message)\n return null\n }\n },\n getTransactionsByNetwork: async (args) => {\n return getTransactionRepo().getTransactionsByNetwork(args)\n },\n}\n", "const {\n ACCOUNT_TYPE,\n INVOICE_STATUS,\n TRANSACTION_STATUS,\n USER_STATUS,\n TRANSACTION_KIND,\n NODE_TYPE,\n TRANSACTION_DIRECTION,\n} = require(\"@constants/index.js\")\nconst dayjs = require(\"dayjs\")\nconst Decimal = require(\"decimal.js\")\nconst { nip19 } = require(\"nostr-tools\")\nconst PrismaService = require(\"../prismaService\")\n\nclass LnlinkUserRepository {\n constructor() {\n this.prisma = PrismaService.getInstance().getClient()\n }\n\n /**\n * Create new LnLink user\n * @param {object} userData - User data\n * @returns {Promise<object>} Created user\n */\n async createUser(userData) {\n const {\n name,\n pubkey,\n sk,\n node_pubkey,\n relay,\n asset_id,\n account_type,\n social_id,\n social_type,\n auth_limit,\n permissions,\n status = USER_STATUS.RUNNING,\n create_at,\n expire_time,\n parent_pubkey = null,\n } = userData\n\n // Check if user already exists\n const existingUser = await this.getUserByPubkey(pubkey, true)\n if (existingUser) {\n throw new Error(`User with pubkey ${pubkey} already exists`)\n }\n return this.prisma.lnlinkUser.create({\n data: {\n name,\n pubkey,\n npub: nip19.npubEncode(pubkey),\n sk,\n node_pubkey,\n node_npub: nip19.npubEncode(node_pubkey),\n relay,\n asset_id,\n account_type,\n social_id,\n social_type,\n auth_limit,\n permissions: JSON.stringify(permissions),\n status,\n create_at,\n expire_time,\n parent_pubkey,\n },\n })\n }\n\n /**\n * Get user by various filters\n * @param {object} filters - Filter criteria\n * @returns {Promise<object | null>} User or null\n */\n async getUser(filters) {\n const {\n social_id,\n pubkey,\n id,\n name,\n asset_id,\n account_type,\n include_expired = false,\n } = filters\n\n const where = {}\n\n if (id)\n where.id = id\n if (social_id)\n where.social_id = social_id\n if (pubkey)\n where.pubkey = pubkey\n if (name)\n where.name = name\n if (account_type) {\n where.account_type = account_type\n }\n if (asset_id)\n where.asset_id = asset_id\n\n if (!include_expired) {\n where.expire_time = {\n gt: dayjs().unix(),\n }\n }\n\n return this.prisma.lnlinkUser.findFirst({\n where,\n })\n }\n\n /**\n * Get user by pubkey\n * @param {string} pubkey - User pubkey\n * @param {boolean} includeExpired - Include expired users\n * @returns {Promise<object | null>} User or null\n */\n async getUserByPubkey(pubkey, includeExpired = false) {\n return this.getUser({ pubkey, include_expired: includeExpired })\n }\n\n /**\n * Get LND owner\n * @returns {Promise<object | null>} Owner user or null\n */\n async getLNDOwner() {\n return this.prisma.lnlinkUser.findFirst({\n where: {\n account_type: ACCOUNT_TYPE.OWNER,\n },\n })\n }\n\n /**\n * Get Flash register account\n * @returns {Promise<object | null>} Flash register user or null\n */\n async getFlashRegister() {\n return this.prisma.lnlinkUser.findFirst({\n where: {\n account_type: ACCOUNT_TYPE.FLASH_REGISTER,\n },\n })\n }\n\n async getReadOnly() {\n return this.prisma.lnlinkUser.findFirst({\n where: {\n account_type: ACCOUNT_TYPE.READ_ONLY,\n },\n })\n }\n\n /**\n * Get total auth limit by parent\n * @param {string} parentPubkey - Parent pubkey\n * @param {string} assetId - Asset ID\n * @returns {Promise<number>} Total auth limit\n */\n async getTotalAuthLimitByParent(parentPubkey, assetId) {\n const users = await this.prisma.lnlinkUser.findMany({\n where: {\n parent_pubkey: parentPubkey,\n asset_id: assetId,\n },\n select: {\n auth_limit: true,\n },\n })\n\n // Sum auth_limit values (convert string to number)\n return users.reduce((sum, user) => {\n const limit = new Decimal(user.auth_limit || \"0\")\n return sum + limit.toNumber()\n }, 0)\n }\n\n /**\n * Get users with pagination and filters\n * @param {object} options - Query options\n * @returns {Promise<object>} Paginated users\n */\n async getUsersWithPagination(options) {\n const {\n page = 1,\n pageSize = 20,\n type,\n onlyRunning,\n parent_pubkey,\n search,\n } = options\n\n const where = {\n account_type: {\n in: [ACCOUNT_TYPE.NWC, ACCOUNT_TYPE.FLASH],\n },\n }\n\n if (type) {\n where.account_type = type\n }\n\n if (onlyRunning) {\n where.expire_time = { gt: dayjs().unix() }\n where.status = 1\n }\n\n if (parent_pubkey) {\n where.parent_pubkey = parent_pubkey\n }\n\n if (search) {\n where.OR = [\n { name: { contains: search } },\n { social_id: { contains: search } },\n { pubkey: { contains: search } },\n ]\n }\n\n const [users, total] = await Promise.all([\n this.prisma.lnlinkUser.findMany({\n where,\n orderBy: {\n create_at: \"desc\",\n },\n skip: (page - 1) * pageSize,\n take: pageSize,\n }),\n this.prisma.lnlinkUser.count({ where }),\n ])\n\n // Get all user npubs for batch transaction query\n const userNpubs = users.map(user => user.npub).filter(npub => npub)\n\n // Batch fetch user transactions\n const userTransactions = await this.prisma.lnlinkTransaction.findMany({\n where: {\n user_npub: { in: userNpubs },\n },\n select: {\n user_npub: true,\n asset_amount: true,\n direction: true,\n status: true,\n transaction_kind: true,\n node_type: true,\n },\n })\n\n // Group transactions by user npub\n const transactionsByUser = userTransactions.reduce((acc, transaction) => {\n const userNpub = transaction.user_npub\n if (!acc[userNpub]) {\n acc[userNpub] = []\n }\n acc[userNpub].push(transaction)\n return acc\n }, {})\n\n // Calculate budget spent and available budget for each user\n const usersWithBudget = users.map((user) => {\n const userTxs = transactionsByUser[user.npub] || []\n\n // Outgoing transactions (payments made by user) - using Decimal for precision\n const outgoingAmount = userTxs\n .filter(t =>\n t.direction === TRANSACTION_DIRECTION.OUT\n && t.status === TRANSACTION_STATUS.SETTLED\n && t.transaction_kind === TRANSACTION_KIND.LIGHTNING\n && t.node_type === NODE_TYPE.LITD,\n )\n .reduce((sum, t) => {\n const amount = new Decimal(t.asset_amount || \"0\")\n return sum.plus(amount)\n }, new Decimal(\"0\"))\n\n // Incoming transactions (payments received by user) - using Decimal for precision\n const incomingAmount = userTxs\n .filter(t =>\n t.direction === TRANSACTION_DIRECTION.IN\n && t.status === TRANSACTION_STATUS.SETTLED\n && t.transaction_kind === TRANSACTION_KIND.LIGHTNING\n && t.node_type === NODE_TYPE.LITD,\n )\n .reduce((sum, t) => {\n const amount = new Decimal(t.asset_amount || \"0\")\n return sum.plus(amount)\n }, new Decimal(\"0\"))\n\n // Net budget spent = outgoing - incoming (refunds reduce budget spent)\n const budgetSpent = outgoingAmount.minus(incomingAmount)\n\n // User's authorized limit\n const authLimit = new Decimal(user.auth_limit || \"0\")\n\n // Available budget = auth_limit - budget_spent\n const availableBudget = authLimit.minus(budgetSpent)\n\n return {\n ...user,\n budget_spent: budgetSpent.toString(),\n available_budget: availableBudget.toString(),\n auth_limit_decimal: authLimit.toString(), // Keep original as string for precision\n // Calculate usage percentage\n budget_usage_percentage: authLimit.isZero() ? \"0\" : budgetSpent.dividedBy(authLimit).times(100).toFixed(2),\n }\n })\n\n return {\n count: total,\n list: usersWithBudget,\n }\n }\n\n /**\n * Update user status\n * @param {number} id - User ID\n * @param {number} status - New status\n * @returns {Promise<object>} Updated user\n */\n async updateUserStatus(id, status) {\n return this.prisma.lnlinkUser.update({\n where: { id },\n data: { status },\n })\n }\n\n /**\n * Get available user sum auth limit\n * @param {string} assetId - Asset ID\n * @param {string} parentPubkey - Parent pubkey (optional)\n * @returns {Promise<number>} Total auth limit\n */\n async getAvailableUserSumAuthLimit(assetId, parentPubkey) {\n const where = { asset_id: assetId }\n\n if (parentPubkey) {\n where.parent_pubkey = parentPubkey\n }\n\n const users = await this.prisma.lnlinkUser.findMany({\n where,\n select: {\n auth_limit: true,\n },\n })\n\n // Sum auth_limit values (convert string to number)\n return users.reduce((sum, user) => {\n const limit = new Decimal(user.auth_limit || \"0\")\n return new Decimal(sum).plus(limit).toString()\n }, 0)\n }\n\n async getNWCOrFlashList() {\n return this.prisma.lnlinkUser.findMany({\n where: {\n account_type: { in: [ACCOUNT_TYPE.NWC, ACCOUNT_TYPE.FLASH] },\n },\n })\n }\n\n /**\n * Get user statistics including auth budget and budget spent\n * @returns {Promise<object>} User statistics\n */\n async getUserStatistics() {\n // Get all users with their auth_limit grouped by asset_id\n const users = await this.prisma.lnlinkUser.findMany({\n select: {\n asset_id: true,\n auth_limit: true,\n },\n })\n\n // Group by asset_id and sum auth_limit manually\n const authBudgetMap = users.reduce((acc, user) => {\n const assetId = user.asset_id || \"default\"\n const limit = new Decimal(user.auth_limit || \"0\")\n\n if (!acc[assetId]) {\n acc[assetId] = 0\n }\n acc[assetId] = new Decimal(acc[assetId]).plus(limit).toNumber()\n return acc\n }, {})\n\n const totalAuthBudget = Object.entries(authBudgetMap).map(([assetId, total]) => ({\n asset_id: assetId,\n total: new Decimal(total).toString(),\n }))\n\n // Get total budget spent across all transactions - using new transaction structure\n const transactions = await this.prisma.lnlinkTransaction.findMany({\n where: {\n direction: { in: [TRANSACTION_DIRECTION.IN, TRANSACTION_DIRECTION.OUT] },\n transaction_kind: \"lightning\", // Only count lightning transactions\n status: TRANSACTION_STATUS.SETTLED, // Only count settled transactions\n node_type: NODE_TYPE.LITD, // Only count transactions from litd nodes\n },\n select: {\n direction: true,\n status: true,\n asset_amount: true,\n asset_id: true,\n },\n })\n\n // Calculate budget spent by asset_id\n const budgetSpentByAsset = transactions.reduce((acc, transaction) => {\n const assetId = transaction.asset_id || \"default\"\n const amount = new Decimal(transaction.asset_amount || \"0\")\n\n if (!acc[assetId]) {\n acc[assetId] = new Decimal(\"0\")\n }\n\n if (transaction.direction === \"out\") {\n // Outgoing transactions increase budget spent\n acc[assetId] = acc[assetId].plus(amount)\n }\n else if (transaction.direction === \"in\") {\n // Incoming transactions decrease budget spent (refunds/receipts)\n acc[assetId] = acc[assetId].minus(amount)\n }\n\n return acc\n }, {})\n\n // Convert to array format and calculate total\n const budgetSpentByAssetArray = Object.entries(budgetSpentByAsset).map(([assetId, total]) => ({\n asset_id: assetId,\n total: total.toString(),\n }))\n\n // Calculate overall budget spent (sum across all assets)\n const totalBudgetSpent = Object.values(budgetSpentByAsset)\n .reduce((total, assetTotal) => total.plus(assetTotal), new Decimal(\"0\"))\n\n return {\n total_auth_budget: totalAuthBudget,\n budget_spent: totalBudgetSpent.toString(),\n budget_spent_by_asset: budgetSpentByAssetArray,\n }\n }\n}\n\nmodule.exports = LnlinkUserRepository\n", "const { ACCOUNT_TYPE } = require(\"@constants/index.js\")\nconst LnlinkUserRepository = require(\"../repositories/lnlinkUserRepository\")\n\n// Lazy initialization of repository to avoid early PrismaService creation\nlet userRepo = null\nfunction getUserRepo() {\n if (!userRepo) {\n userRepo = new LnlinkUserRepository()\n }\n return userRepo\n}\n\nmodule.exports = {\n insertLnlinkUser: async (userData) => {\n try {\n const result = await getUserRepo().createUser(userData)\n return result ? 1 : 0\n }\n catch (error) {\n console.error(\"Error inserting user:\", error)\n return 0\n }\n },\n getLnlinkUser: async (filters) => {\n return getUserRepo().getUser(filters)\n },\n getLNDOwner: async () => {\n return getUserRepo().getLNDOwner()\n },\n getFlashRegister: async () => {\n return getUserRepo().getFlashRegister()\n },\n getReadOnly: async () => {\n return getUserRepo().getReadOnly()\n },\n updateLnlinkUser: async (data) => {\n try {\n const { id, status } = data\n await getUserRepo().updateUserStatus(id, status)\n return 1\n }\n catch (error) {\n console.error(\"Error updating user:\", error)\n return 0\n }\n },\n getLnLinkUserListByPage: async (options) => {\n return getUserRepo().getUsersWithPagination(options)\n },\n getTotalAuthLimitByParent: async (data) => {\n const { parent_pubkey, asset_id } = data\n return getUserRepo().getTotalAuthLimitByParent(parent_pubkey, asset_id)\n },\n getAvailableUserSumAuthLimit: async (assetId, parentPubkey) => {\n return getUserRepo().getAvailableUserSumAuthLimit(assetId, parentPubkey)\n },\n statLnLinkUserData: async () => {\n return getUserRepo().getUserStatistics()\n },\n\n // Legacy Support\n insertNWC: async (data) => {\n const {\n pubkey,\n sk,\n relay,\n } = data\n return getUserRepo().createUser({\n pubkey,\n sk,\n relay,\n account_type: ACCOUNT_TYPE.NWC,\n })\n },\n getNWCList: async () => {\n const users = await getUserRepo().getNWCOrFlashList()\n return users\n },\n\n}\n", "const config = require(\"./db/config\")\nconst events = require(\"./db/events\")\nconst orders = require(\"./db/orders\")\nconst transactions = require(\"./db/transactions\")\nconst users = require(\"./db/users\")\nconst utils = require(\"./db/utils\")\n\nmodule.exports = {\n ...config,\n ...events,\n ...users,\n ...transactions,\n ...orders,\n ...utils,\n}\n", "const NodeCache = require(\"node-cache\")\n\nconst linkCache = new NodeCache()\n\nmodule.exports = linkCache\n", "const fs = require(\"node:fs\")\nconst net = require(\"node:net\")\nconst DEFAULT_ENV = require(\"../../config.default.js\")\n// Lazy import dbService to avoid early Prisma initialization before env is set\nasync function getMainLnlinkConfigLazy() {\n const dbService = require(\"../service/prisma/dbService.js\")\n return await dbService.getMainLnlinkConfig()\n}\nconst linkCache = require(\"../utils/linkCache\")\n\nconst REQUIRED_CONFIG_KEYS = [\n \"LINK_LND_RPC_PORT\",\n \"LINK_HTTP_PORT\",\n \"LINK_NAME\",\n]\n\nlet configInitialized = false\nlet configInitPromise = null\nfunction isRemoteUrl(url) {\n return url.startsWith(\"http\") || url.startsWith(\"https\")\n}\nfunction isJsonString(str) {\n try {\n JSON.parse(str)\n return true\n }\n catch {\n return false\n }\n}\nfunction getDefaultConfig() {\n const defaultConfig = DEFAULT_ENV\n // defaultConfig. = `localhost:${defaultConfig.LINK_LND_RPC_PORT}`\n return defaultConfig\n}\nasync function getSettingFileData(pathOrSettingJson) {\n if (!pathOrSettingJson) {\n return {}\n }\n\n try {\n let settingFileData = {}\n\n if (isJsonString(pathOrSettingJson)) {\n settingFileData = JSON.parse(pathOrSettingJson)\n }\n else if (\n typeof pathOrSettingJson === \"string\"\n && isRemoteUrl(pathOrSettingJson)\n ) {\n try {\n const response = await fetch(pathOrSettingJson)\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n const data = await response.json()\n if (data.code === 0 && data.data && Object.keys(data.data).length > 0) {\n settingFileData = data.data\n }\n }\n catch (fetchError) {\n console.error(\n `Error fetching remote config from ${pathOrSettingJson}:`,\n fetchError.message,\n )\n return {}\n }\n }\n else if (\n typeof pathOrSettingJson === \"string\"\n && fs.existsSync(pathOrSettingJson)\n ) {\n try {\n const fileContent = fs.readFileSync(pathOrSettingJson, \"utf-8\")\n settingFileData = JSON.parse(fileContent)\n }\n catch (fileError) {\n console.error(\n `Error reading config file ${pathOrSettingJson}:`,\n fileError.message,\n )\n return {}\n }\n }\n else if (typeof pathOrSettingJson === \"object\") {\n settingFileData = pathOrSettingJson\n }\n\n if (settingFileData && Object.keys(settingFileData).length > 0) {\n const {\n bitcoindIndex,\n bitcoindPass,\n bitcoindRpcHost,\n bitcoindRpcPort,\n bitcoindUser,\n bitcoindZmqBlock,\n bitcoindZmqRawTx,\n network,\n nostrRelays,\n officialLndPeer,\n officialLndPeerHost,\n officialNostrPubKey,\n officialRgbPeer,\n officialRgbPeerHost,\n officialUniverseServer,\n priceOracle,\n rgbProxy,\n } = settingFileData\n\n const litdRgbConfig = {\n LINK_NETWORK: network,\n LINK_NOSTR_NODE_HOST: officialLndPeerHost,\n LINK_NOSTR_NODE_NPUBKEY: officialLndPeer,\n LINK_UNIVERSE_HOST: officialUniverseServer,\n LINK_ORACLE_SERVER_HOST: priceOracle ? `${priceOracle}:443` : undefined,\n LINK_NOSTR_RELAY_URI: nostrRelays,\n LINK_NOSTR_NPUBKEY: officialNostrPubKey,\n\n LINK_RGB_BITCOIND_RPCHOST:\n bitcoindRpcHost && bitcoindRpcPort\n ? `${bitcoindRpcHost}:${bitcoindRpcPort}`\n : undefined,\n LINK_RGB_BITCOIND_RPCUSER: bitcoindUser,\n LINK_RGB_BITCOIND_RPCPASS: bitcoindPass,\n LINK_RGB_ELECTRS_HOST: bitcoindIndex,\n LINK_RGB_PROXY_ENDPOINT: rgbProxy,\n LINK_RGB_REMOTE_NODE_PUBKEY: officialRgbPeer,\n LINK_RGB_REMOTE_NODE_HOST: officialRgbPeerHost,\n\n LINK_BITCOIND_RPCHOST:\n bitcoindRpcHost && bitcoindRpcPort\n ? `${bitcoindRpcHost}:${bitcoindRpcPort}`\n : undefined,\n LINK_BITCOIND_RPCUSER: bitcoindUser,\n LINK_BITCOIND_RPCPASS: bitcoindPass,\n LINK_BITCOIND_ZMQBLOCK: bitcoindZmqBlock,\n LINK_BITCOIND_ZMQRAWTX: bitcoindZmqRawTx,\n }\n return Object.fromEntries(\n Object.entries(litdRgbConfig).filter(\n ([_, value]) => value !== undefined,\n ),\n )\n }\n\n return settingFileData\n }\n catch (error) {\n console.error(\"Error processing setting file data:\", error.message)\n return {}\n }\n}\nasync function getLnLinkConfig() {\n try {\n const lnlinkConfig = await getMainLnlinkConfigLazy()\n if (!lnlinkConfig)\n return {}\n\n const {\n owner_npub,\n node_npub,\n node_name,\n settings,\n } = lnlinkConfig\n\n // Base fields from LnlinkConfig table (owner, node address, optional node name)\n const baseConfig = {\n LINK_OWNER: owner_npub,\n LINK_NODE_ADDR: node_npub,\n LINK_NAME: node_name,\n }\n\n // Network profile fields mapped from settings JSON\n const networkProfileConfig = await getSettingFileData(settings)\n const isLinkReady = !!settings && Object.keys(settings).length > 0 && !!owner_npub && !!node_npub\n return {\n ...baseConfig,\n ...networkProfileConfig,\n LINK_READY: isLinkReady,\n }\n }\n catch (error) {\n console.error(\"Error getting LnLink config:\", error.message)\n return {}\n }\n}\n\nfunction getProcessConfig() {\n const ENV_KEYS = [\n \"LINK_DATA_PATH\",\n \"LINK_BINARY_PATH\",\n \"LINK_NAME\",\n \"LINK_NODE_ADDR\",\n \"LINK_OWNER\",\n \"LINK_NETWORK\",\n \"LINK_FLASH_SITE_BASE_URL\",\n \"LINK_LNFI_NODE_SITE_URL\",\n \"LINK_LND_RPC_PORT\",\n \"LINK_LND_PEER_LISTEN_PORT\",\n \"LINK_RGB_LISTENING_PORT\",\n \"LINK_RGB_LDK_PEER_LISTENING_PORT\",\n \"LINK_HTTP_PORT\",\n \"LINK_DEBUG\",\n \"LINK_ENABLE_TOR\",\n \"LINK_NODE_ENV\",\n \"LINK_AUTO_ASSIGN_PORTS\",\n \"LINK_HTTPS_PROXY\",\n \"LINK_DATABASE_URL\",\n \"LINK_REPORT_BASE_URL\",\n \"LINK_REPORT_ADDRESS\",\n \"LINK_RGB_HOST\",\n ]\n const processConfig = {}\n ENV_KEYS.forEach((key) => {\n if (process.env[key] !== undefined) {\n processConfig[key] = process.env[key]\n }\n })\n if (\n processConfig.LINK_NOSTR_RELAY_URI\n && typeof processConfig.LINK_NOSTR_RELAY_URI === \"string\"\n ) {\n processConfig.LINK_NOSTR_RELAY_URI\n = processConfig.LINK_NOSTR_RELAY_URI.split(\",\")\n }\n\n return processConfig\n}\n\n// Check if a port is available\nfunction isPortAvailable(port) {\n return new Promise((resolve) => {\n const server = net.createServer()\n\n server.on(\"error\", () => {\n resolve(false)\n })\n\n server.on(\"listening\", () => {\n server.close(() => {\n resolve(true)\n })\n })\n\n try {\n server.listen(port, \"0.0.0.0\")\n }\n catch {\n resolve(false)\n }\n })\n}\n\n// Find next available port based on port range rules\nasync function findAvailablePort(basePort) {\n const portRanges = {\n 10009: [10009, 20009, 30009, 40009, 50009], // LINK_LND_RPC_PORT: 10009 -> 20009 -> 30009...\n 9735: [9735, 9736, 9737, 9738, 9739, 9740], // LINK_LND_PEER_LISTEN_PORT: 9735 -> 9736...\n 3001: [3001, 3002, 3003, 3004, 3005, 3006], // LINK_RGB_LISTENING_PORT: 3001 -> 3002...\n 9736: [9736, 9737, 9738, 9739, 9740, 9741], // LINK_RGB_LDK_PEER_LISTENING_PORT: 9736 -> 9737...\n 8090: [8090, 8091, 8092, 8093, 8094, 8095], // LINK_HTTP_PORT: 8090 -> 8091...\n }\n\n // If port has specific range rules\n if (portRanges[basePort]) {\n for (const port of portRanges[basePort]) {\n if (await isPortAvailable(port)) {\n return port\n }\n }\n // If all predefined ports are taken, continue with +1 increment\n let port = portRanges[basePort][portRanges[basePort].length - 1] + 1\n while (port < 65535) {\n if (await isPortAvailable(port)) {\n return port\n }\n port++\n }\n }\n else {\n // For other ports, just increment by 1\n let port = basePort\n while (port < 65535) {\n if (await isPortAvailable(port)) {\n return port\n }\n port++\n }\n }\n\n throw new Error(`No available port found starting from ${basePort}`)\n}\n\n// Automatically assign available ports for key services\nasync function assignAvailablePorts(config) {\n const portKeys = [\n \"LINK_LND_RPC_PORT\",\n \"LINK_LND_PEER_LISTEN_PORT\",\n \"LINK_RGB_LISTENING_PORT\",\n \"LINK_RGB_LDK_PEER_LISTENING_PORT\",\n ]\n\n const updatedConfig = { ...config }\n const linkCacheConfig = linkCache.get(\"config\")\n for (const key of portKeys) {\n if (linkCacheConfig && linkCacheConfig[key]) {\n updatedConfig[key] = linkCacheConfig[key]\n continue\n }\n if (updatedConfig[key]) {\n const basePort = Number.parseInt(updatedConfig[key])\n if (!Number.isNaN(basePort)) {\n try {\n const availablePort = await findAvailablePort(basePort)\n if (availablePort !== basePort) {\n // logger.info(`Port ${basePort} for ${key} is occupied, using ${availablePort} instead`)\n updatedConfig[key] = availablePort\n }\n }\n catch {\n // logger.error(`Failed to find available port for ${key}: ${error?.message}`)\n }\n }\n }\n }\n\n return updatedConfig\n}\n\nfunction validateConfig(config) {\n const missingKeys = REQUIRED_CONFIG_KEYS.filter(key => !config[key])\n if (missingKeys.length > 0) {\n throw new Error(\n `Missing required configuration keys: ${missingKeys.join(\", \")}`,\n )\n }\n\n const portKeys = [\n \"LINK_LND_RPC_PORT\",\n \"LINK_HTTP_PORT\",\n \"LINK_LND_PEER_LISTEN_PORT\",\n \"LINK_RGB_LISTENING_PORT\",\n ]\n for (const key of portKeys) {\n if (config[key]) {\n const port = Number.parseInt(config[key])\n if (Number.isNaN(port) || port < 1 || port > 65535) {\n throw new Error(`Invalid port number for ${key}: ${config[key]}`)\n }\n }\n }\n\n return true\n}\n\nasync function initConfig() {\n if (configInitialized) {\n return linkCache.get(\"config\")\n }\n\n if (configInitPromise) {\n return configInitPromise\n }\n\n configInitPromise = (async () => {\n try {\n console.log(\"Initializing configuration...\")\n const defaultConfig = getDefaultConfig()\n const processConfig = getProcessConfig()\n const lnlinkConfig = await getLnLinkConfig()\n\n let combinedConfig = {\n ...defaultConfig,\n ...processConfig,\n ...lnlinkConfig,\n }\n\n // Finalize LINK_NAME / LINK_OWNER with clear precedence:\n // LINK_NAME: DB (node_name) > env(.env.*) > default\n combinedConfig.LINK_NAME\n = lnlinkConfig.LINK_NAME\n || processConfig.LINK_NAME\n || defaultConfig.LINK_NAME\n\n // LINK_OWNER: env(.env.*) > DB(owner_npub) > default\n combinedConfig.LINK_OWNER\n = processConfig.LINK_OWNER\n || lnlinkConfig.LINK_OWNER\n || defaultConfig.LINK_OWNER\n\n try {\n if (\n processConfig.LINK_AUTO_ASSIGN_PORTS === \"true\"\n && processConfig.LINK_NODE_ENV !== \"production\"\n ) {\n combinedConfig = await assignAvailablePorts(combinedConfig)\n }\n }\n catch (portError) {\n console.warn(\n \"Port assignment failed, using default ports:\",\n portError.message,\n )\n }\n\n combinedConfig.LINK_GRPC_HOST = `localhost:${combinedConfig.LINK_LND_RPC_PORT}`\n combinedConfig.LINK_ENABLE_TOR\n = combinedConfig.LINK_ENABLE_TOR === \"true\"\n || combinedConfig.LINK_ENABLE_TOR === true\n combinedConfig.LINK_TOR_SOCKS_PORT\n = combinedConfig.LINK_TOR_SOCKS_PORT || 9050\n combinedConfig.LINK_TOR_CONTROL_PORT\n = combinedConfig.LINK_TOR_CONTROL_PORT || 9051\n validateConfig(combinedConfig)\n\n console.log(`Configuration initialized successfully`)\n console.log(`finalConfig, ${JSON.stringify(combinedConfig, null, 2)}`)\n\n linkCache.set(\"config\", combinedConfig)\n configInitialized = true\n\n return combinedConfig\n }\n catch (error) {\n console.error(\"Configuration initialization failed:\", error.message)\n configInitPromise = null\n throw error\n }\n })()\n\n return configInitPromise\n}\n\nfunction getConfig() {\n const config = linkCache.get(\"config\")\n if (!config || Object.keys(config).length === 0) {\n if (!configInitialized) {\n console.warn(\"Configuration not initialized yet, returning empty config\")\n }\n return {}\n }\n return config\n}\n\nasync function reloadConfig() {\n configInitialized = false\n configInitPromise = null\n linkCache.del(\"config\")\n return await initConfig()\n}\n\nfunction getConfigValue(key, defaultValue = undefined) {\n const config = getConfig()\n return config[key] !== undefined ? config[key] : defaultValue\n}\n\nfunction isConfigInitialized() {\n return configInitialized && !!linkCache.get(\"config\")\n}\n\nmodule.exports = {\n getConfig,\n initConfig,\n reloadConfig,\n getConfigValue,\n isConfigInitialized,\n validateConfig,\n}\n", "function getConfigFilePath() {\n const LINK_DATA_PATH = process.env.LINK_DATA_PATH\n\n const loopMacaroonPath = `${LINK_DATA_PATH}/.link/loop.macaroon`\n\n const taprootMacaroonPath = `${LINK_DATA_PATH}/.link/taproot.macaroon`\n\n const macaroonPath = `${LINK_DATA_PATH}/.link/admin.macaroon`\n\n const certFilePath = `${LINK_DATA_PATH}/.lnd/tls.cert`\n\n const channelBackupPath = `${LINK_DATA_PATH}/.link/channel-all.bak`\n const logsPath = `${LINK_DATA_PATH}/.logs`\n\n const lndNodeOriginPath = `${LINK_DATA_PATH}/.lnd`\n\n const targetNodeBackupPath = `${LINK_DATA_PATH}/.link/lnd_backup.tar.gz`\n\n const basePath = `${LINK_DATA_PATH}`\n\n const rgbBackupPath = `${LINK_DATA_PATH}/.rgb/backup`\n\n return {\n macaroonPath,\n taprootMacaroonPath,\n loopMacaroonPath,\n certFilePath,\n channelBackupPath,\n lndNodeOriginPath,\n targetNodeBackupPath,\n basePath,\n logsPath,\n rgbBackupPath,\n }\n}\n\nmodule.exports = {\n getConfigFilePath,\n}\n", "const { Buffer } = require(\"node:buffer\")\nconst fs = require(\"node:fs\")\nconst { aesDecrypt, aesEncrypt } = require(\"./dataUtils\")\nconst linkCache = require(\"./linkCache\")\nconst { getConfigFilePath } = require(\"./path\")\n\nfunction storeEnctryptAdminMacaroon(bufferMacaroon, secret) {\n linkCache.set(\"adminMacaroon\", bufferMacaroon)\n const { macaroonPath } = getConfigFilePath()\n const encryptMacarron = aesEncrypt(\n bufferMacaroon.toString(\"base64\"),\n secret,\n ).toString()\n fs.writeFileSync(macaroonPath, encryptMacarron)\n}\nfunction storeEnctryptLoopMacaroon(bufferMacaroon, secret) {\n linkCache.set(\"loopMacaroon\", bufferMacaroon)\n const { loopMacaroonPath } = getConfigFilePath()\n const encryptMacarron = aesEncrypt(\n bufferMacaroon.toString(\"base64\"),\n secret,\n ).toString()\n fs.writeFileSync(loopMacaroonPath, encryptMacarron)\n}\nfunction storeEnctryptTaprMacaroon(bufferMacaroon, secret) {\n linkCache.set(\"taprootMacaroon\", bufferMacaroon)\n const { taprootMacaroonPath } = getConfigFilePath()\n const encryptMacarron = aesEncrypt(\n bufferMacaroon.toString(\"base64\"),\n secret,\n ).toString()\n fs.writeFileSync(taprootMacaroonPath, encryptMacarron)\n}\nfunction isTaprMacaroonExist() {\n const { taprootMacaroonPath } = getConfigFilePath()\n return fs.existsSync(taprootMacaroonPath)\n}\nfunction getTaprMacaroon(secret) {\n const { taprootMacaroonPath } = getConfigFilePath()\n if (!fs.existsSync(taprootMacaroonPath)) {\n return null\n }\n const encryptedMacaroon = fs.readFileSync(taprootMacaroonPath, \"utf8\")\n const decryptedMacaroon = aesDecrypt(encryptedMacaroon, secret)\n return Buffer.from(decryptedMacaroon, \"base64\")\n}\nfunction getMacaroon(secret) {\n const { macaroonPath } = getConfigFilePath()\n if (!fs.existsSync(macaroonPath)) {\n return null\n }\n const encryptedMacaroon = fs.readFileSync(macaroonPath, \"utf8\")\n const decryptedMacaroon = aesDecrypt(encryptedMacaroon, secret)\n return Buffer.from(decryptedMacaroon, \"base64\")\n}\nfunction getLoopMacaroon(secret) {\n const { loopMacaroonPath } = getConfigFilePath()\n if (!fs.existsSync(loopMacaroonPath)) {\n return null\n }\n const encryptedMacaroon = fs.readFileSync(loopMacaroonPath, \"utf8\")\n const decryptedMacaroon = aesDecrypt(encryptedMacaroon, secret)\n return Buffer.from(decryptedMacaroon, \"base64\")\n}\nfunction setCacheMacaroon(secret) {\n const macaroon = getMacaroon(secret)\n const loopMacaroon = getLoopMacaroon(secret)\n const taprootMacaroon = getTaprMacaroon(secret)\n\n linkCache.set(\"adminMacaroon\", macaroon)\n linkCache.set(\"loopMacaroon\", loopMacaroon)\n linkCache.set(\"taprootMacaroon\", taprootMacaroon)\n}\nfunction getCacheMacaroon() {\n const adminMacaroon = linkCache.get(\"adminMacaroon\")\n const loopMacaroon = linkCache.get(\"loopMacaroon\")\n const taprootMacaroon = linkCache.get(\"taprootMacaroon\")\n return {\n isMacaroonDecrypted: !!adminMacaroon?.toString(\"hex\"),\n adminMacaroon: adminMacaroon?.toString(\"hex\") ? adminMacaroon : \"\",\n loopMacaroon: loopMacaroon?.toString(\"hex\") ? loopMacaroon : \"\",\n taprootMacaroon: taprootMacaroon?.toString(\"hex\") ? taprootMacaroon : \"\",\n }\n}\n\nmodule.exports = {\n storeEnctryptAdminMacaroon,\n storeEnctryptLoopMacaroon,\n storeEnctryptTaprMacaroon,\n getTaprMacaroon,\n getMacaroon,\n getLoopMacaroon,\n setCacheMacaroon,\n getCacheMacaroon,\n isTaprMacaroonExist,\n}\n", "function sendResponse(res, code, message, data) {\n const response = {\n code,\n message,\n data,\n }\n res.json(response)\n}\nmodule.exports = {\n sendResponse,\n}\n", "function sleep(time = 1000) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(true)\n }, Number(time))\n })\n}\nmodule.exports = {\n sleep,\n}\n", "const {\n isHex,\n isNumeric,\n isBase64,\n isBuffer,\n hexToBase64,\n base64ToHex,\n bytesToTxHash,\n convertBuffers,\n convertHexObjToBase64Obj,\n formatJson,\n aesEncrypt,\n aesDecrypt,\n filterParams,\n satsToTaprootAssetByRate,\n} = require(\"./dataUtils\")\nconst {\n storeEnctryptAdminMacaroon,\n storeEnctryptLoopMacaroon,\n storeEnctryptTaprMacaroon,\n getTaprMacaroon,\n getMacaroon,\n getLoopMacaroon,\n setCacheMacaroon,\n getCacheMacaroon,\n} = require(\"./macaroonUtils\")\nconst {\n getConfigFilePath,\n getMempoolBaseUrl,\n} = require(\"./path\")\nconst { sendResponse } = require(\"./responseUtils\")\nconst { sleep } = require(\"./timeUtils\")\n\nmodule.exports = {\n convertBuffers,\n sendResponse,\n isHex,\n isBase64,\n hexToBase64,\n base64ToHex,\n convertHexObjToBase64Obj,\n sleep,\n isNumeric,\n bytesToTxHash,\n formatJson,\n getConfigFilePath,\n getMempoolBaseUrl,\n getCacheMacaroon,\n aesEncrypt,\n aesDecrypt,\n storeEnctryptAdminMacaroon,\n storeEnctryptLoopMacaroon,\n storeEnctryptTaprMacaroon,\n getMacaroon,\n setCacheMacaroon,\n getTaprMacaroon,\n getLoopMacaroon,\n isBuffer,\n filterParams,\n satsToTaprootAssetByRate,\n}\n", "const { convertBuffers } = require(\"../../../utils/index\")\n\nfunction chainkitService(client) {\n const getBestBlock = (request) => {\n return new Promise((resolve, reject) => {\n client.getBestBlock(request, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n return {\n getBestBlock,\n }\n}\nmodule.exports = chainkitService\n", "const fs = require(\"node:fs\")\n// @ts-nocheck\nconst path = require(\"node:path\")\nconst grpc = require(\"@grpc/grpc-js\")\nconst protoLoader = require(\"@grpc/proto-loader\")\n\n// Handle both development and production paths\nfunction getProtoPath(filename) {\n // In development: __dirname points to business/service/rpc/lnd/\n // In production: __dirname points to dist/ (after bundling)\n const devPath = path.join(__dirname, \"../../../../proto\", filename)\n const prodPath = path.join(__dirname, \"proto\", filename)\n\n // Check if we're in development or production\n if (fs.existsSync(devPath)) {\n return devPath\n }\n else if (fs.existsSync(prodPath)) {\n return prodPath\n }\n else {\n // Fallback: try relative to process.cwd()\n const fallbackPath = path.join(process.cwd(), \"proto\", filename)\n if (fs.existsSync(fallbackPath)) {\n return fallbackPath\n }\n throw new Error(`Proto file not found: ${filename}. Tried paths: ${devPath}, ${prodPath}, ${fallbackPath}`)\n }\n}\n\nconst protoLightning = getProtoPath(\"lightning.proto\")\nconst walletkitProto = getProtoPath(\"walletkit.proto\")\nconst signerProto = getProtoPath(\"signrpc/signer.proto\")\nconst chainkitProto = getProtoPath(\"chainkit.proto\")\nconst protoClient = getProtoPath(\"looprpc/client.proto\")\nconst litStatusProto = getProtoPath(\"lit-status.proto\")\nconst routerProto = getProtoPath(\"routerrpc/router.proto\")\nconst { CLIENT_TYPE } = require(\"../../../../constants/index.js\")\n\nconst loaderOptions = {\n keepCase: true,\n longs: String,\n enums: String,\n defaults: true,\n oneofs: true,\n}\nprocess.env.GRPC_SSL_CIPHER_SUITES = \"HIGH+ECDSA\"\n\n// Cache for proto package definitions to avoid repeated loadSync calls\nconst packageDefinitionCache = {}\n// Cache for grpc package definitions to avoid repeated loadPackageDefinition calls\nconst grpcPackageCache = {}\nconst clientCache = {}\n\nfunction getClient(clientType = CLIENT_TYPE.LN, {\n host,\n macaroonFilePath,\n macaroonStr,\n certFilePath,\n}) {\n const cacheKey = `${clientType}:${host}`\n if (clientCache[cacheKey]) {\n return clientCache[cacheKey]\n }\n const tlsCert\n = certFilePath && fs.existsSync(certFilePath)\n ? fs.readFileSync(certFilePath)\n : \"\"\n const sslCreds = grpc.credentials.createSsl(tlsCert)\n if (!macaroonFilePath && !macaroonStr) {\n throw new Error(\"macaroonFilePath or macaroonStr is required\")\n }\n const macaroon = macaroonStr || fs.readFileSync(macaroonFilePath).toString(\"hex\")\n\n const macaroonCreds = grpc.credentials.createFromMetadataGenerator((\n args,\n callback,\n ) => {\n const metadata = new grpc.Metadata()\n metadata.add(\"macaroon\", macaroon)\n callback(null, metadata)\n })\n const creds = grpc.credentials.combineChannelCredentials(\n sslCreds,\n macaroonCreds,\n )\n\n let client\n switch (clientType) {\n case CLIENT_TYPE.LN:\n { if (!packageDefinitionCache.LN) {\n packageDefinitionCache.LN = protoLoader.loadSync(\n [protoLightning, protoClient],\n loaderOptions,\n )\n grpcPackageCache.LN = grpc.loadPackageDefinition(packageDefinitionCache.LN)\n }\n client = new grpcPackageCache.LN.lnrpc.Lightning(host, creds)\n break }\n case CLIENT_TYPE.ROUTER_RPC:\n { if (!packageDefinitionCache.ROUTER_RPC) {\n packageDefinitionCache.ROUTER_RPC = protoLoader.loadSync(\n [protoLightning, routerProto],\n loaderOptions,\n )\n grpcPackageCache.ROUTER_RPC = grpc.loadPackageDefinition(packageDefinitionCache.ROUTER_RPC)\n }\n client = new grpcPackageCache.ROUTER_RPC.routerrpc.Router(host, creds)\n break }\n\n case CLIENT_TYPE.WALLET_KIT:\n { if (!packageDefinitionCache.WALLET_KIT) {\n packageDefinitionCache.WALLET_KIT = protoLoader.loadSync(\n [protoLightning, walletkitProto, signerProto],\n loaderOptions,\n )\n grpcPackageCache.WALLET_KIT = grpc.loadPackageDefinition(packageDefinitionCache.WALLET_KIT)\n }\n client = new grpcPackageCache.WALLET_KIT.walletrpc.WalletKit(host, creds)\n break }\n case CLIENT_TYPE.SINGER:\n { if (!packageDefinitionCache.SINGER) {\n packageDefinitionCache.SINGER = protoLoader.loadSync(\n [protoLightning, signerProto],\n loaderOptions,\n )\n grpcPackageCache.SINGER = grpc.loadPackageDefinition(packageDefinitionCache.SINGER)\n }\n client = new grpcPackageCache.SINGER.signrpc.Signer(host, creds)\n break }\n case CLIENT_TYPE.CHANIN_KIT:\n { if (!packageDefinitionCache.CHANIN_KIT) {\n packageDefinitionCache.CHANIN_KIT = protoLoader.loadSync(\n [protoLightning, chainkitProto],\n loaderOptions,\n )\n grpcPackageCache.CHANIN_KIT = grpc.loadPackageDefinition(packageDefinitionCache.CHANIN_KIT)\n }\n client = new grpcPackageCache.CHANIN_KIT.chainrpc.ChainKit(host, creds)\n break }\n case CLIENT_TYPE.LIT_STATUS:\n { if (!packageDefinitionCache.LIT_STATUS) {\n packageDefinitionCache.LIT_STATUS = protoLoader.loadSync(\n [litStatusProto],\n loaderOptions,\n )\n grpcPackageCache.LIT_STATUS = grpc.loadPackageDefinition(packageDefinitionCache.LIT_STATUS)\n }\n client = new grpcPackageCache.LIT_STATUS.litrpc.Status(host, creds)\n break }\n default:\n throw new Error(\"clientType is required\")\n }\n clientCache[cacheKey] = client\n return client\n}\nmodule.exports = { getClient }\n", "const { convertBuffers, convertHexObjToBase64Obj } = require(\"../../../utils/index\")\n\nfunction lightningService(client) {\n /**\n * AddInvoice attempts to add a new invoice to the invoice database. Any duplicated invoices are rejected, therefore all invoices must have a unique payment preimage.\n * @param {import('./lightning.d.ts').Invoice} invoice - The invoice to be added.\n * @example\n * const invoice = {memo:'test',value:1000}\n * await addInvoice(invoice)\n * @returns {Promise<object>} A promise that resolves with the added invoice.\n */\n const addInvoice = (invoice) => {\n return new Promise((resolve, reject) => {\n client.addInvoice(invoice, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n /**\n * Retrieves a list of invoices.\n * @param {object} listInvoicesRequest - The request object for listing invoices.\n * @param {boolean} listInvoicesRequest.pending_only - Whether to retrieve only pending invoices.\n * @param {number} listInvoicesRequest.index_offset - The index offset.\n * @param {number} listInvoicesRequest.num_max_invoices - The maximum number of invoices.\n * @param {boolean} listInvoicesRequest.reversed - Whether to return the invoices in reverse order.\n * @param {number} listInvoicesRequest.creation_date_start - The start date for invoice creation.\n * @param {number} listInvoicesRequest.creation_date_end - The end date for invoice creation.\n * @returns {Promise<object>} - A promise that resolves to an object containing the list of invoices.\n */\n const listInvoices = (listInvoicesRequest) => {\n const request = listInvoicesRequest || {}\n return new Promise((resolve, reject) => {\n client.listInvoices(request, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n /**\n * Generates a new address.\n *\n * @param {object} options - The options for generating a new address.\n * @param {number} options.type - The type of the address. Valid values are:\n * - 0: WITNESS_PUBKEY_HASH\n * - 1: NESTED_PUBKEY_HASH\n * - 2: UNUSED_WITNESS_PUBKEY_HASH\n * - 3: UNUSED_NESTED_PUBKEY_HASH\n * - 4: TAPROOT_PUBKEY\n * - 5: UNUSED_TAPROOT_PUBKEY\n * @param {string} [options.account] - The name of the account to generate a new address for. If empty, the default wallet account is used.\n * @returns {Promise<object>} A promise that resolves with the generated address.\n */\n const newAddress = ({ type = 0, account }) => {\n return new Promise((resolve, reject) => {\n client.newAddress({ type, account }, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(convertBuffers(response))\n })\n })\n }\n /**\n * Decodes a payment request.\n *\n * @param {string} payReq - The payment request to decode.\n * @example\n * const payReq = 'lnbc1234567890...'\n * @returns {Promise<object>} A promise that resolves with the decoded payment request.\n */\n const decodePayReq = ({ pay_req }) => {\n const request = { pay_req }\n return new Promise((resolve, reject) => {\n client.decodePayReq(request, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(convertBuffers(response))\n })\n })\n }\n /**\n * Looks up an invoice by its r_hash.\n *\n * @param {string} r_hash - The r_hash of the invoice.\n * @returns {Promise<object>} A promise that resolves with the invoice object.\n */\n const lookupInvoice = ({ r_hash }) => {\n const request = convertHexObjToBase64Obj({ r_hash })\n return new Promise((resolve, reject) => {\n client.lookupInvoice(request, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(convertBuffers(response))\n })\n })\n }\n /**\n * Retrieves information about the Lightning Network node.\n * @returns {Promise<import('./lightning.d.ts').GetInfoResponse>} A promise that resolves to the information GetInfoResponse.\n */\n const getInfo = () => {\n const request = {}\n return new Promise((resolve, reject) => {\n client.getInfo(request, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n const getNodeInfo = (nodeInfoRequest) => {\n return new Promise((resolve, reject) => {\n client.getNodeInfo(nodeInfoRequest, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(convertBuffers(response))\n })\n })\n }\n /**\n * Retrieves the channel balance.\n * @returns {Promise<object>} A promise that resolves to the channel balance.\n */\n const channelBalance = () => {\n const request = {}\n return new Promise((resolve, reject) => {\n client.channelBalance(request, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(convertBuffers(response))\n })\n })\n }\n /**\n * Retrieves the wallet balance.\n * @returns {Promise<object>} A promise that resolves to the wallet balance object.\n */\n const walletBalance = () => {\n const request = {}\n return new Promise((resolve, reject) => {\n client.walletBalance(request, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(convertBuffers(response))\n })\n })\n }\n /**\n * ListChannels returns a description of all the open channels that this node is a participant in\n *\n * @param {object} options - The options for filtering the channels.\n * @param {boolean} [options.active_only] - Whether to include only active channels.\n * @param {boolean} [options.inactive_only] - Whether to include only inactive channels.\n * @param {boolean} [options.public_only] - Whether to include only public channels.\n * @param {boolean} [options.private_only] - Whether to include only private channels.\n * @param {string|null} [options.peer] - Filters the response for channels with a target peer's pubkey. If peer is empty, all channels will be returned..\n * @param {boolean} [options.peer_alias_lookup] - Whether to perform a peer alias lookup.\n * @returns {Promise<Array<object>>} A promise that resolves with an array of channel objects.\n * @throws {Error} If an error occurs while retrieving the channels.\n */\n const listChannels = ({\n active_only = false,\n inactive_only = false,\n public_only = false,\n private_only = false,\n peer = null,\n peer_alias_lookup = true,\n }) => {\n const request = {\n active_only,\n inactive_only,\n public_only,\n private_only,\n peer,\n peer_alias_lookup,\n }\n return new Promise((resolve, reject) => {\n client.listChannels(request, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(convertBuffers(response))\n })\n })\n }\n /**\n * Retrieves channel information for a given channel ID.\n * @param {object} chanInfoRequest - The channel ID.\n * @returns {Promise<object>} - A promise that resolves with the channel information.\n */\n const getChanInfo = (chanInfoRequest = {}) => {\n const request = chanInfoRequest\n return new Promise((resolve, reject) => {\n client.getChanInfo(request, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(convertBuffers(response))\n })\n })\n }\n /**\n * Retrieves a list of payments.\n *\n * @param {object} listPaymentsRequest - The request object for listing payments.\n * @param {boolean} listPaymentsRequest.include_incomplete - Whether to include incomplete payments. Default is true.\n * @param {number} listPaymentsRequest.index_offset - The index offset for pagination. Default is 0.\n * @param {number} listPaymentsRequest.max_payments - The maximum number of payments to retrieve. Default is 20.\n * @param {boolean} listPaymentsRequest.reversed - Whether to retrieve payments in reversed order. Default is false.\n * @param {boolean} listPaymentsRequest.count_total_payments - Whether to count the total number of payments. Default is true.\n * @param {number} listPaymentsRequest.creation_date_start - The start date for filtering payments. Default is 10 seconds ago.\n * @returns {Promise<Array<object>>} - A promise that resolves to an array of payment objects.\n */\n const listPayments = (listPaymentsRequest) => {\n return new Promise((resolve, reject) => {\n client.listPayments(listPaymentsRequest, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n /**\n * Sends a payment synchronously.\n *\n * @param {import('./lightning.d.ts').SendRequest} paymentRequest - The payment request.\n * @example\n * const paymentRequest = {\n * payment_request: 'lnbc1234567890...'\n * }\n * await sendPaymentSync(paymentRequest)\n * @returns {Promise<object>} - A promise that resolves with the response object.\n */\n const sendPaymentSync = (paymentRequest) => {\n return new Promise((resolve, reject) => {\n client.sendPaymentSync(paymentRequest, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n /**\n * Closes a channel.\n *\n * @param {object} options - The options for closing the channel.\n * @param {string} options.channel_point_str - The channel point string in the format \"funding_txid:output_index\".\n * @returns {Promise<object>} A promise that resolves with the result of closing the channel.\n */\n const closeChannel = ({\n channel_point_str,\n force = false,\n no_wait = false,\n delivery_address,\n sat_per_vbyte,\n target_conf,\n }) => {\n const [funding_txid_str, output_index] = channel_point_str.split(\":\")\n const request = {\n channel_point: { funding_txid_str, output_index: Number.parseInt(output_index) },\n force,\n no_wait,\n }\n if (sat_per_vbyte & !force) {\n request.sat_per_vbyte = sat_per_vbyte\n }\n if (delivery_address && delivery_address !== \"undefined\") {\n request.delivery_address = delivery_address\n }\n if (target_conf) {\n request.target_conf = target_conf\n }\n request.force = !!force\n const call = client.closeChannel(request)\n return new Promise((resolve, reject) => {\n const ret = {\n code: -1,\n message: \"\",\n data: null,\n }\n call.on(\"data\", (response) => {\n ret.data = convertBuffers(response)\n if (response.update === \"close_instant\") {\n ret.code = 0\n ret.message = \"success\"\n resolve(ret.data)\n }\n })\n call.on(\"status\", (status) => {\n if (status.code === 0) {\n ret.code = 0\n ret.message = \"success\"\n }\n })\n call.on(\"error\", (err) => {\n ret.code = err.code\n ret.message = err.message\n reject(err)\n })\n call.on(\"end\", () => {\n if (ret.code === 0) {\n resolve(ret.data)\n }\n else {\n reject(ret.message)\n }\n })\n })\n }\n\n const connectPeer = (connectPeerRequest) => {\n // const request = convertHexObjToBase64Obj(connectPeerRequest)\n return new Promise((resolve, reject) => {\n client.connectPeer(connectPeerRequest, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(convertBuffers(response))\n })\n })\n }\n const listPeers = ({ latest_error = false }) => {\n // const request = convertHexObjToBase64Obj(connectPeerRequest)\n return new Promise((resolve, reject) => {\n client.listPeers({\n latest_error,\n }, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n /**\n * Opens a channel synchronously.\n *\n * @param {import('./lightning').OpenChannelRequest} openChannelRequest - The request object for opening a channel.\n * @example\n * const openChannelRequest = {node_pubkey:'033bd7f4cc2269e91792c5f7b25c183f7d52c19b8e1a1da2bc936742a18b231985', local_funding_amount:300000}\n * await openChannelSync(openChannelRequest)\n * @returns {Promise<object>} - A promise that resolves with the response object.\n */\n const openChannelSync = (openChannelRequest) => {\n const request = convertHexObjToBase64Obj(openChannelRequest)\n return new Promise((resolve, reject) => {\n client.openChannelSync(request, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(convertBuffers(response))\n })\n })\n }\n const openChannel = (openChannelRequest) => {\n // const request = convertHexObjToBase64Obj(openChannelRequest)\n return client.openChannel(openChannelRequest)\n }\n\n const estimateFee = (estimateFeeRequest) => {\n const request = convertHexObjToBase64Obj(estimateFeeRequest)\n return new Promise((resolve, reject) => {\n client.estimateFee(request, (err, response) => {\n if (err) {\n reject(err)\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n /**\n * Retrieves information about pending channels.\n *\n * @param {object} request - The request object.\n * @param {boolean} request.include_raw_tx - Whether to include raw transaction details.\n * @returns {Promise<object>} - A promise that resolves with the response object containing information about pending channels.\n */\n const pendingChannels = (request = { include_raw_tx: true }) => {\n return new Promise((resolve, reject) => {\n client.pendingChannels(request, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n const closedChannels = (request = { include_raw_tx: true }) => {\n return new Promise((resolve, reject) => {\n client.closedChannels(request, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n /**\n * Opens multiple channels in batch.\n *\n * @param {import('./lightning').BatchOpenChannelRequest} batchOpenChannelRequest - The request object for batch opening channels.\n * @returns {Promise<import('./lightning').BatchOpenChannelResponse>} - A promise that resolves with the response object.\n */\n const batchOpenChannel = (batchOpenChannelRequest) => {\n const request = convertHexObjToBase64Obj(batchOpenChannelRequest)\n return new Promise((resolve, reject) => {\n client.batchOpenChannel(request, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(convertBuffers(response))\n })\n })\n }\n /**\n * ListPermissions lists all RPC method URIs and their required macaroon permissions to access them.\n *\n * @returns {Promise<import('./lightning').ListPermissionsResponse>} - A promise that resolves with the response object.\n */\n const listPermissions = () => {\n return new Promise((resolve, reject) => {\n client.listPermissions({}, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n const getTransactions = () => {\n return new Promise((resolve, reject) => {\n client.getTransactions({}, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(convertBuffers(response))\n })\n })\n }\n /**\n * bakeMacarnoon allows the creation of a new macaroon with custom read and write permissions. No first-party caveats are added since this can be done offline.\n *\n * @param {import('./lightning').BakeMacaroonRequest} bakeMacaroonRequest - The request object for batch opening channels.\n * @returns {Promise<import('./lightning').BakeMacaroonResponse>} - A promise that resolves with the response object.\n */\n const bakeMacaroon = (bakeMacaroonRequest) => {\n return new Promise((resolve, reject) => {\n client.bakeMacaroon(bakeMacaroonRequest, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(response)\n })\n })\n }\n\n const stopDaemon = () => {\n return new Promise((resolve, reject) => {\n client.stopDaemon({}, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(convertBuffers(response))\n })\n })\n }\n const signMessage = (request) => {\n return new Promise((resolve, reject) => {\n client.signMessage(request, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n const verifyMessage = (request) => {\n return new Promise((resolve, reject) => {\n client.verifyMessage(request, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n const sendCoins = (request) => {\n return new Promise((resolve, reject) => {\n client.sendCoins(request, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n const fundingStateStep = (request) => {\n return new Promise((resolve, reject) => {\n client.fundingStateStep(request, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n const exportAllChannelBackups = () => {\n return new Promise((resolve, reject) => {\n client.exportAllChannelBackups({}, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(response)\n })\n })\n }\n const restoreChannelBackups = (request) => {\n return new Promise((resolve, reject) => {\n client.restoreChannelBackups(request, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(response)\n })\n })\n }\n\n const listMacaroonIDs = () => {\n return new Promise((resolve, reject) => {\n client.listMacaroonIDs({}, (err, response) => {\n if (err) {\n reject(err)\n }\n resolve(response)\n })\n })\n }\n const subscribeInvoices = (request) => {\n return client.subscribeInvoices(request)\n }\n const subscribeTransactions = (request) => {\n return client.subscribeTransactions(request)\n }\n return {\n addInvoice,\n listInvoices,\n newAddress,\n decodePayReq,\n listPayments,\n sendPaymentSync,\n lookupInvoice,\n getInfo,\n getNodeInfo,\n channelBalance,\n walletBalance,\n listChannels,\n getChanInfo,\n estimateFee,\n closeChannel,\n openChannel,\n openChannelSync,\n connectPeer,\n listPeers,\n batchOpenChannel,\n pendingChannels,\n closedChannels,\n bakeMacaroon,\n listPermissions,\n stopDaemon,\n getTransactions,\n signMessage,\n verifyMessage,\n sendCoins,\n fundingStateStep,\n exportAllChannelBackups,\n restoreChannelBackups,\n listMacaroonIDs,\n subscribeInvoices,\n subscribeTransactions,\n }\n}\nmodule.exports = lightningService\n", "const { convertBuffers } = require(\"../../../utils/index\")\n\nfunction litStatusService(client) {\n const subServerStatus = (request) => {\n return new Promise((resolve, reject) => {\n client.subServerStatus(request, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(convertBuffers(response))\n })\n })\n }\n return {\n subServerStatus,\n }\n}\nmodule.exports = litStatusService\n", "function routerService(client) {\n const trackPayments = () => {\n const trackPayments = client.trackPayments({ no_inflight_updates: true })\n return trackPayments\n }\n return {\n trackPayments,\n }\n}\nmodule.exports = routerService\n", "const { convertBuffers } = require(\"../../../utils/index\")\n\nfunction walletKitService(client) {\n const signMessage = (request) => {\n return new Promise((resolve, reject) => {\n client.signMessage(request, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n const verifyMessage = (request) => {\n return new Promise((resolve, reject) => {\n client.verifyMessage(request, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(convertBuffers(response))\n })\n })\n }\n return {\n signMessage,\n verifyMessage,\n }\n}\nmodule.exports = walletKitService\n", "const { convertBuffers } = require(\"../../../utils/index\")\n\nfunction walletKitService(client) {\n const getTransaction = (request) => {\n return new Promise((resolve, reject) => {\n client.listAddresses(request, (err, response) => {\n if (err) {\n reject(err)\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n const deriveKey = (request) => {\n return new Promise((resolve, reject) => {\n client.deriveKey(request, (err, response) => {\n if (err) {\n reject(err)\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n const listUnspent = (request) => {\n return new Promise((resolve, reject) => {\n client.listUnspent(request, (err, response) => {\n if (err) {\n reject(err)\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n const importPublicKey = (request) => {\n return new Promise((resolve, reject) => {\n client.importPublicKey(request, (err, response) => {\n if (err) {\n reject(err)\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n return {\n getTransaction,\n deriveKey,\n importPublicKey,\n listUnspent,\n }\n}\nmodule.exports = walletKitService\n", "const { CLIENT_TYPE } = require(\"../../../../constants/index.js\")\nconst chainkitService = require(\"./chainkitService.js\")\nconst { getClient } = require(\"./client.js\")\nconst lightningService = require(\"./lightningService.js\")\nconst litStatusService = require(\"./litStatusService.js\")\nconst routerService = require(\"./routerService.js\")\nconst singerService = require(\"./singerService.js\")\nconst walletKitService = require(\"./walletkitService.js\")\n\nclass LND {\n constructor({\n host,\nmacaroonFilePath,\nmacaroonStr,\ncertFilePath,\n }) {\n this.host = host\n this.macaroonFilePath = macaroonFilePath\n this.certFilePath = certFilePath\n this.macaroonStr = macaroonStr\n }\n\n getCurrentClient(clientType) {\n const host = this.host\n const macaroonFilePath = this.macaroonFilePath\n const certFilePath = this.certFilePath\n const macaroonStr = this.macaroonStr\n return getClient(clientType, {\n host,\n macaroonFilePath,\n macaroonStr,\n certFilePath,\n })\n }\n\n getLightningService() {\n const client = this.getCurrentClient(CLIENT_TYPE.LN)\n return lightningService(client)\n }\n\n getWalletKitService() {\n const client = this.getCurrentClient(CLIENT_TYPE.WALLET_KIT)\n return walletKitService(client)\n }\n\n getSingerService() {\n const client = this.getCurrentClient(CLIENT_TYPE.SINGER)\n return singerService(client)\n }\n\n getChainkitService() {\n const client = this.getCurrentClient(CLIENT_TYPE.CHANIN_KIT)\n return chainkitService(client)\n }\n\n getLitStatusService() {\n const client = this.getCurrentClient(CLIENT_TYPE.LIT_STATUS)\n return litStatusService(client)\n }\n\n getRouterService() {\n const client = this.getCurrentClient(CLIENT_TYPE.ROUTER_RPC)\n return routerService(client)\n }\n}\n\nmodule.exports = LND\n", "const { getConfig } = require(\"@business/common/getConfig.js\")\n\nconst Logger = require(\"@business/utils/linkLogger.js\")\nconst { getConfigFilePath, getCacheMacaroon } = require(\"../../../utils/index.js\")\nconst LND = require(\"./index.js\")\n\nclass LndInstance {\n static lndInstance = null\n\n static getLndInstance() {\n const { isMacaroonDecrypted, adminMacaroon } = getCacheMacaroon()\n const logger = new Logger(\"lnd\")\n const macaroonStr = isMacaroonDecrypted\n ? adminMacaroon.toString(\"hex\")\n : \"\"\n if (!macaroonStr) {\n throw new Error(\"Lnd service not available.\")\n }\n if (!LndInstance.lndInstance && macaroonStr) {\n const host = getConfig().LINK_GRPC_HOST\n const { certFilePath } = getConfigFilePath()\n logger.info(`start new LND instance... ${host} ${certFilePath}`)\n LndInstance.lndInstance = new LND({\n host,\n certFilePath,\n macaroonStr,\n })\n }\n\n return LndInstance.lndInstance\n }\n\n static getLightningService() {\n return LndInstance.getLndInstance().getLightningService()\n }\n\n static getWalletKitService() {\n return LndInstance.getLndInstance().getWalletKitService()\n }\n\n static getLitStatusService() {\n return LndInstance.getLndInstance().getLitStatusService()\n }\n\n static getRouterService() {\n return LndInstance.getLndInstance().getRouterService()\n }\n}\n\nmodule.exports = LndInstance\n", "const fs = require(\"node:fs\")\n// @ts-nocheck\nconst path = require(\"node:path\")\nconst { getConfig } = require(\"@business/common/getConfig.js\")\n\nconst grpc = require(\"@grpc/grpc-js\")\nconst protoLoader = require(\"@grpc/proto-loader\")\n\n// Handle both development and production paths\nfunction getProtoPath(filename) {\n // In development: __dirname points to business/service/rpc/taprootAssets/\n // In production: __dirname points to dist/ (after bundling)\n const devPath = path.join(__dirname, \"../../../../proto\", filename)\n const prodPath = path.join(__dirname, \"proto\", filename)\n\n // Check if we're in development or production\n if (fs.existsSync(devPath)) {\n return devPath\n }\n else if (fs.existsSync(prodPath)) {\n return prodPath\n }\n else {\n // Fallback: try relative to process.cwd()\n const fallbackPath = path.join(process.cwd(), \"proto\", filename)\n if (fs.existsSync(fallbackPath)) {\n return fallbackPath\n }\n throw new Error(`Proto file not found: ${filename}. Tried paths: ${devPath}, ${prodPath}, ${fallbackPath}`)\n }\n}\n\nconst protoTaprootAssets = getProtoPath(\"taprootassets.proto\")\nconst protoUniverse = getProtoPath(\"universe.proto\")\nconst protoTapchannel = getProtoPath(\"tapchannel.proto\")\nconst protoPriceOracle = getProtoPath(\"price_oracle.proto\")\nconst { CLIENT_TYPE } = require(\"../../../../constants/index.js\")\n\nconst loaderOptions = {\n keepCase: true,\n longs: String,\n enums: String,\n defaults: true,\n oneofs: true,\n}\nprocess.env.GRPC_SSL_CIPHER_SUITES = \"HIGH+ECDSA\"\n\n// Cache for proto package definitions to avoid repeated loadSync calls\nconst packageDefinitionCache = {}\n// Cache for grpc package definitions to avoid repeated loadPackageDefinition calls\nconst grpcPackageCache = {}\nconst clientCache = {}\n\nfunction getClient(clientType = CLIENT_TYPE.TAPRPC, {\n host,\n macaroonFilePath,\n macaroonStr,\n certFilePath,\n}) {\n const { LINK_ORACLE_SERVER_HOST } = getConfig()\n const cacheKey = `${clientType}:${host}`\n if (clientCache[cacheKey]) {\n return clientCache[cacheKey]\n }\n const tlsCert\n = certFilePath && fs.existsSync(certFilePath)\n ? fs.readFileSync(certFilePath)\n : \"\"\n const sslCreds = grpc.credentials.createSsl(tlsCert)\n if (!macaroonFilePath && !macaroonStr) {\n throw new Error(\"macaroonFilePath or macaroonStr is required\")\n }\n const macaroon = macaroonStr || fs.readFileSync(macaroonFilePath).toString(\"hex\")\n\n const macaroonCreds = grpc.credentials.createFromMetadataGenerator((\n args,\n callback,\n ) => {\n const metadata = new grpc.Metadata()\n metadata.add(\"macaroon\", macaroon)\n callback(null, metadata)\n })\n const creds = grpc.credentials.combineChannelCredentials(\n sslCreds,\n macaroonCreds,\n )\n\n let client\n switch (clientType) {\n case CLIENT_TYPE.TAPRPC:\n { if (!packageDefinitionCache.TAPRPC) {\n packageDefinitionCache.TAPRPC = protoLoader.loadSync(\n [protoTaprootAssets],\n loaderOptions,\n )\n grpcPackageCache.TAPRPC = grpc.loadPackageDefinition(packageDefinitionCache.TAPRPC)\n }\n client = new grpcPackageCache.TAPRPC.taprpc.TaprootAssets(host, creds)\n break }\n case CLIENT_TYPE.UNIVERSE:\n { if (!packageDefinitionCache.UNIVERSE) {\n packageDefinitionCache.UNIVERSE = protoLoader.loadSync(\n protoUniverse,\n loaderOptions,\n )\n grpcPackageCache.UNIVERSE = grpc.loadPackageDefinition(packageDefinitionCache.UNIVERSE)\n }\n client = new grpcPackageCache.UNIVERSE.universerpc.Universe(host, creds)\n break }\n case CLIENT_TYPE.TAPCHANNEL:\n { if (!packageDefinitionCache.TAPCHANNEL) {\n packageDefinitionCache.TAPCHANNEL = protoLoader.loadSync(\n protoTapchannel,\n loaderOptions,\n )\n grpcPackageCache.TAPCHANNEL = grpc.loadPackageDefinition(packageDefinitionCache.TAPCHANNEL)\n }\n client = new grpcPackageCache.TAPCHANNEL.tapchannelrpc.TaprootAssetChannels(host, creds)\n break }\n case CLIENT_TYPE.PRICE_ORACLE:\n { if (!packageDefinitionCache.PRICE_ORACLE) {\n packageDefinitionCache.PRICE_ORACLE = protoLoader.loadSync(\n protoPriceOracle,\n loaderOptions,\n )\n grpcPackageCache.PRICE_ORACLE = grpc.loadPackageDefinition(packageDefinitionCache.PRICE_ORACLE)\n }\n const temCreds = grpc.credentials.combineChannelCredentials(\n grpc.credentials.createSsl(\"\"),\n macaroonCreds,\n )\n client = new grpcPackageCache.PRICE_ORACLE.priceoraclerpc.PriceOracle(\n LINK_ORACLE_SERVER_HOST,\n temCreds,\n )\n break }\n }\n clientCache[cacheKey] = client\n return client\n}\n\nmodule.exports = { getClient }\n", "const { convertBuffers } = require(\"../../../utils/index\")\n\nfunction priceOracleService(client) {\n const queryRateTick = (request) => {\n return new Promise((resolve, reject) => {\n client.QueryAssetRates(request, (err, response) => {\n if (err) {\n reject(err)\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n return {\n queryRateTick,\n }\n}\nmodule.exports = priceOracleService\n", "const { convertBuffers } = require(\"../../../utils/index\")\n\nfunction tapchannelService(client) {\n const fundChannel = (request) => {\n return new Promise((resolve, reject) => {\n client.fundChannel(request, (err, response) => {\n if (err) {\n reject(err)\n }\n resolve(convertBuffers(response))\n })\n })\n }\n /**\n * SendPaymentRequest message.\n *\n * @typedef {object} SendPaymentRequest\n * @property {Uint8Array} asset_id - The asset ID to use for the invoice.\n * @property {number} asset_amount - The asset amount to receive.\n * @property {Uint8Array} peer_pubkey - The node identity public key of the peer to ask for a quote for receiving assets and converting them from satoshis.\n * @property {object} payment_request - The full lnd invoice request to send.\n */\n const sendPayment = (request) => {\n const call = client.sendPayment(request)\n return new Promise((resolve) => {\n const ret = {\n payment_result: null,\n failure_reason: null,\n assepted_sell_order: null,\n }\n call.on(\"data\", (response) => {\n if (response?.accepted_sell_order) {\n ret.assepted_sell_order = convertBuffers(\n response.accepted_sell_order,\n )\n }\n if (response?.payment_result) {\n ret.payment_result = convertBuffers(response?.payment_result)\n }\n })\n call.on(\"status\", (status) => {\n if (status === 6) {\n ret.failure_reason = status.details\n }\n })\n call.on(\"error\", (err) => {\n if (err?.details.indexOf(\"EOF\") === -1) {\n ret.failure_reason = err?.details\n }\n })\n call.on(\"end\", () => {\n resolve(ret)\n })\n })\n }\n\n /**\n * AddInvoiceRequest message.\n *\n * @typedef {object} addInvoiceRequest\n * @property {Uint8Array} asset_id - The asset ID to use for the invoice.\n * @property {number} asset_amount - The asset amount to receive.\n * @property {Uint8Array} peer_pubkey - The node identity public key of the peer to ask for a quote for receiving assets and converting them from satoshis.\n * @property {object} invoice_request - The full lnd invoice request to send.\n */\n const addInvoice = (request) => {\n return new Promise((resolve, reject) => {\n client.addInvoice(request, (err, response) => {\n if (err) {\n reject(err)\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n const decodeAssetPayReq = (request) => {\n return new Promise((resolve, reject) => {\n client.decodeAssetPayReq(request, (err, response) => {\n if (err) {\n reject(err)\n }\n resolve(convertBuffers(response))\n })\n })\n }\n return {\n fundChannel,\n sendPayment,\n addInvoice,\n decodeAssetPayReq,\n }\n}\nmodule.exports = tapchannelService\n", "const { convertBuffers } = require(\"../../../utils/index\")\n\nfunction taprootAssetService(client) {\n const getInfo = (request) => {\n return new Promise((resolve, reject) => {\n client.getInfo(request, (err, response) => {\n if (err) {\n reject(err)\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n /**\n * Retrieves the list of balances.\n * @param {object} request - The request object.\n * @param {boolean} request.asset_id - The asset ID flag.\n * @param {boolean} request.group_key - The group key flag.\n * @param {Buffer} request.asset_filter - The asset filter.\n * @param {Buffer} request.group_key_filter - The group key filter.\n * @returns {Promise<object>} The response object.\n */\n const listBalances = (request) => {\n return new Promise((resolve, reject) => {\n client.listBalances(request, (err, response) => {\n if (err) {\n reject(err)\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n /**\n * Generates a new address.\n * @param {object} request - The request object.\n * @param {Buffer} request.asset_id - The asset ID.\n * @param {number} request.amt - The amount.\n * @param {ScriptKey} request.script_key - The script key.\n * @param {KeyDescriptor} request.internal_key - The internal key.\n * @param {Buffer} request.tapscript_sibling - The tapscript sibling.\n * @param {string} request.proof_courier_addr - The proof courier address.\n * @param {AssetVersion} request.asset_version - The asset version.\n * @param {AddrVersion} request.address_version - The address version.\n * @returns {Promise<object>} The response object.\n */\n const newAddr = (request) => {\n return new Promise((resolve, reject) => {\n client.newAddr(request, (err, response) => {\n if (err) {\n reject(err)\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n /**\n * DecodeAddr decode a Taproot Asset address into a partial asset message that\n * represents the asset it wants to receive.\n * @param {object} request - The request object.\n * @param {string} request.addr - The address.\n * @returns {Promise<object>} The response object.\n */\n const decodeAddr = (request) => {\n return new Promise((resolve, reject) => {\n client.decodeAddr(request, (err, response) => {\n if (err) {\n reject(err)\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n /**\n * Sends an asset.\n * @param {object} request - The request object.\n * @param {string} request.tap_addrs - The tap addresses.\n * @param {number} request.fee_rate - The fee rate.\n * @returns {Promise<AssetTransfer>} The response object.\n */\n const sendAsset = (request) => {\n return new Promise((resolve, reject) => {\n client.sendAsset(request, (err, response) => {\n if (err) {\n reject(err)\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n const listAssets = (request) => {\n return new Promise((resolve, reject) => {\n client.listAssets(request, (err, response) => {\n if (err) {\n reject(err)\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n const fetchAssetMeta = (request) => {\n return new Promise((resolve, reject) => {\n client.fetchAssetMeta(request, (err, response) => {\n if (err) {\n reject(err)\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n const listUtxos = (request) => {\n return new Promise((resolve, reject) => {\n client.listUtxos(request, (err, response) => {\n if (err) {\n reject(err)\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n /**\n * Subscribe to send events for outgoing asset transfers.\n * @param {object} request - The request object.\n * @param {Buffer} request.filter_script_key - Filter send events by a specific recipient script key.\n * @returns {Promise<EventEmitter>} The response stream.\n */\n const subscribeSendEvents = (request) => {\n return client.subscribeSendEvents(request)\n }\n\n const subscribeReceiveEvents = (request) => {\n return client.subscribeReceiveEvents(request)\n }\n\n const listTransfers = (request) => {\n return new Promise((resolve, reject) => {\n client.listTransfers(request, (err, response) => {\n if (err) {\n reject(err)\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n const addrReceives = (request) => {\n return new Promise((resolve, reject) => {\n client.addrReceives(request, (err, response) => {\n if (err) {\n reject(err)\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n return {\n getInfo,\n listBalances,\n newAddr,\n decodeAddr,\n sendAsset,\n listAssets,\n fetchAssetMeta,\n listUtxos,\n subscribeSendEvents,\n subscribeReceiveEvents,\n listTransfers,\n addrReceives,\n }\n}\n\nmodule.exports = taprootAssetService\n", "const { convertBuffers } = require(\"../../../utils/index\")\n\nfunction universeService(client) {\n const syncUniverse = (request) => {\n return new Promise((resolve, reject) => {\n client.syncUniverse(request, (err, response) => {\n if (err) {\n reject(err)\n }\n resolve(convertBuffers(response))\n })\n })\n }\n const info = (request) => {\n return new Promise((resolve, reject) => {\n client.info(request, (err, response) => {\n if (err) {\n reject(err)\n }\n resolve(convertBuffers(response))\n })\n })\n }\n const addFederationServer = (request) => {\n return new Promise((resolve, reject) => {\n client.addFederationServer(request, (err, response) => {\n if (err) {\n reject(err)\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n const listFederationServers = (request) => {\n return new Promise((resolve, reject) => {\n client.listFederationServers(request, (err, response) => {\n if (err) {\n reject(err)\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n const queryAssetStats = (request) => {\n return new Promise((resolve, reject) => {\n client.queryAssetStats(request, (err, response) => {\n if (err) {\n reject(err)\n }\n resolve(convertBuffers(response))\n })\n })\n }\n const queryAssetRoots = (request) => {\n return new Promise((resolve, reject) => {\n client.queryAssetRoots(request, (err, response) => {\n if (err) {\n reject(err)\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n const assetRoots = (request) => {\n return new Promise((resolve, reject) => {\n client.assetRoots(request, (err, response) => {\n if (err) {\n reject(err)\n }\n resolve(convertBuffers(response))\n })\n })\n }\n\n const assetLeaves = (request) => {\n return new Promise((resolve, reject) => {\n client.assetLeaves(request, (err, response) => {\n if (err) {\n reject(err)\n }\n resolve(response)\n })\n })\n }\n\n return {\n syncUniverse,\n info,\n addFederationServer,\n listFederationServers,\n queryAssetStats,\n assetLeaves,\n assetRoots,\n queryAssetRoots,\n }\n}\nmodule.exports = universeService\n", "const { CLIENT_TYPE } = require(\"../../../../constants/index.js\")\nconst { getClient } = require(\"./client.js\")\nconst priceOracleService = require(\"./priceOracleService.js\")\nconst tapchannelService = require(\"./tapchannelService.js\")\nconst taprootAssetService = require(\"./taprootAssetService.js\")\nconst universeService = require(\"./universeService.js\")\n\nclass TaprootAsset {\n constructor({\n host,\nmacaroonFilePath,\nmacaroonStr,\ncertFilePath,\n }) {\n this.host = host\n this.macaroonFilePath = macaroonFilePath\n this.certFilePath = certFilePath\n this.macaroonStr = macaroonStr\n }\n\n getCurrentClient(clientType) {\n const host = this.host\n const macaroonFilePath = this.macaroonFilePath\n const certFilePath = this.certFilePath\n const macaroonStr = this.macaroonStr\n return getClient(clientType, {\n host,\n macaroonFilePath,\n macaroonStr,\n certFilePath,\n })\n }\n\n getTaprootAssetService() {\n const client = this.getCurrentClient(CLIENT_TYPE.TAPRPC)\n return taprootAssetService(client)\n }\n\n getUniverseService() {\n const client = this.getCurrentClient(CLIENT_TYPE.UNIVERSE)\n return universeService(client)\n }\n\n getTapchannelService() {\n const client = this.getCurrentClient(CLIENT_TYPE.TAPCHANNEL)\n return tapchannelService(client)\n }\n\n getPriceOracleService() {\n const client = this.getCurrentClient(CLIENT_TYPE.PRICE_ORACLE)\n return priceOracleService(client)\n }\n}\n\nmodule.exports = TaprootAsset\n", "const { getConfig } = require(\"@business/common/getConfig.js\")\n\nconst { getConfigFilePath, getCacheMacaroon } = require(\"../../../utils/index.js\")\nconst TaprootAsset = require(\"./index.js\")\n\nclass TaprootAssetsInstance {\n static instance = null\n static currentMacaroonStr = null // Store the current macaroonStr\n\n static getInstance() {\n const { isMacaroonDecrypted, taprootMacaroon } = getCacheMacaroon()\n const macaroonStr = isMacaroonDecrypted && taprootMacaroon\n ? taprootMacaroon.toString(\"hex\")\n : \"\"\n if (!macaroonStr) {\n throw new Error(\"Taproot Asset Service not available.\")\n }\n\n // Check if the macaroonStr has changed or if the instance is not initialized\n if (!TaprootAssetsInstance.instance || TaprootAssetsInstance.currentMacaroonStr !== macaroonStr) {\n const host = getConfig().LINK_GRPC_HOST\n const { certFilePath } = getConfigFilePath()\n TaprootAssetsInstance.instance = new TaprootAsset({\n host,\n certFilePath,\n macaroonStr,\n })\n TaprootAssetsInstance.currentMacaroonStr = macaroonStr // Update the stored macaroonStr\n }\n\n return TaprootAssetsInstance.instance\n }\n\n static reloadInstance() {\n // Delegate to getInstance to ensure the instance is up-to-date\n return TaprootAssetsInstance.getInstance()\n }\n\n static getTaprootAssetService() {\n const tapRootAssetService\n = TaprootAssetsInstance.getInstance().getTaprootAssetService()\n\n if (!tapRootAssetService) {\n throw new Error(\"Taproot Asset Service not available\")\n }\n return tapRootAssetService\n }\n\n static getUniverseService() {\n const universeService\n = TaprootAssetsInstance.getInstance().getUniverseService()\n\n if (!universeService) {\n throw new Error(\"Universe Service not available\")\n }\n return universeService\n }\n\n static getTapchannelService() {\n const tapchannelService\n = TaprootAssetsInstance.getInstance().getTapchannelService()\n\n if (!tapchannelService) {\n throw new Error(\"Tapchannel Service not available\")\n }\n return tapchannelService\n }\n\n static getPriceOracleService() {\n const priceOracleService\n = TaprootAssetsInstance.getInstance().getPriceOracleService()\n\n if (!priceOracleService) {\n throw new Error(\"Price Oracle Service not available\")\n }\n return priceOracleService\n }\n}\n\nmodule.exports = TaprootAssetsInstance\n", "const fs = require(\"node:fs\")\n// @ts-nocheck\nconst path = require(\"node:path\")\nconst grpc = require(\"@grpc/grpc-js\")\nconst protoLoader = require(\"@grpc/proto-loader\")\n\n// Handle both development and production paths\nfunction getProtoPath(filename) {\n // In development: __dirname points to business/service/rpc/walletUnlocker/\n // In production: __dirname points to dist/ (after bundling)\n const devPath = path.join(__dirname, \"../../../../proto\", filename)\n const prodPath = path.join(__dirname, \"proto\", filename)\n\n // Check if we're in development or production\n if (fs.existsSync(devPath)) {\n return devPath\n }\n else if (fs.existsSync(prodPath)) {\n return prodPath\n }\n else {\n // Fallback: try relative to process.cwd()\n const fallbackPath = path.join(process.cwd(), \"proto\", filename)\n if (fs.existsSync(fallbackPath)) {\n return fallbackPath\n }\n throw new Error(`Proto file not found: ${filename}. Tried paths: ${devPath}, ${prodPath}, ${fallbackPath}`)\n }\n}\n\nconst protoLightning = getProtoPath(\"lightning.proto\")\nconst protoWallet = getProtoPath(\"walletunlocker.proto\")\nconst protoState = getProtoPath(\"stateservice.proto\")\nconst { CLIENT_TYPE } = require(\"../../../../constants/index.js\")\n\nconst loaderOptions = {\n keepCase: true,\n longs: \"\",\n enums: \"\",\n defaults: true,\n oneofs: true,\n}\nprocess.env.GRPC_SSL_CIPHER_SUITES = \"HIGH+ECDSA\"\n\n// Cache for proto package definitions to avoid repeated loadSync calls\nlet packageDefinitionCache = null\n// Cache for grpc package definitions to avoid repeated loadPackageDefinition calls\nlet grpcPackageCache = null\nconst clientCache = {}\nfunction getClient(clientType, { host, certFilePath }) {\n const cacheKey = `${clientType}:${host}`\n if (clientCache[cacheKey]) {\n return clientCache[cacheKey]\n }\n const tlsCert = certFilePath && fs.existsSync(certFilePath) ? fs.readFileSync(certFilePath) : \"\"\n const sslCreds = grpc.credentials.createSsl(tlsCert)\n\n if (!packageDefinitionCache) {\n packageDefinitionCache = protoLoader.loadSync([protoLightning, protoWallet, protoState], loaderOptions)\n grpcPackageCache = grpc.loadPackageDefinition(packageDefinitionCache)\n }\n let client\n if (clientType === CLIENT_TYPE.WALLET_UNLOCKER) {\n client = new grpcPackageCache.lnrpc.WalletUnlocker(host, sslCreds)\n }\n else if (clientType === CLIENT_TYPE.STATE) {\n client = new grpcPackageCache.lnrpc.State(host, sslCreds)\n }\n clientCache[cacheKey] = client\n return client\n}\nmodule.exports = getClient\n", "const {\n convertBuffers,\n} = require(\"../../../utils/index\")\n// return 0:NON_EXISTING,1:LOCKED,2:UNLOCKED,3:RPC_ACTIVE,4:SERVER_ACTIVE,255:WAITING_TO_START\nfunction walletStateService(client) {\n const getState = () => {\n return new Promise((resolve, reject) => {\n client.getState({}, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(convertBuffers(response))\n })\n })\n }\n const subscribeState = () => {\n return client.subscribeState({})\n }\n\n return {\n getState,\n subscribeState,\n }\n}\nmodule.exports = walletStateService\n", "function walletUnlockerService(client) {\n const genSeed = ({\n aezeed_passphrase,\n seed_entropy,\n }) => {\n return new Promise((resolve, reject) => {\n client.genSeed({\n aezeed_passphrase,\n seed_entropy,\n }, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(response)\n })\n })\n }\n const initWallet = (initWalletRequest) => {\n return new Promise((resolve, reject) => {\n client.initWallet(initWalletRequest, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(response)\n })\n })\n }\n const unlockWallet = (unlockWalletRequest) => {\n return new Promise((resolve, reject) => {\n client.unlockWallet(unlockWalletRequest, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n resolve(response)\n })\n })\n }\n\n const changePassword = (changePasswordRequest) => {\n return new Promise((resolve, reject) => {\n client.changePassword(changePasswordRequest, (err, response) => {\n if (err) {\n reject(err)\n return\n }\n\n resolve(response)\n })\n })\n }\n\n return {\n initWallet,\n unlockWallet,\n changePassword,\n genSeed,\n }\n}\nmodule.exports = walletUnlockerService\n", "const { CLIENT_TYPE } = require(\"../../../../constants/index.js\")\nconst getClient = require(\"./client.js\")\nconst walletStateService = require(\"./walletStateService.js\")\nconst walletUnlockerService = require(\"./walletUnlockerService.js\")\n\nclass WalletUnlocker {\n constructor({ host, certFilePath }) {\n this.host = host\n this.certFilePath = certFilePath\n }\n\n _setClientType(clientType) {\n const host = this.host\n const certFilePath = this.certFilePath\n this.client = getClient(clientType, { host, certFilePath })\n }\n\n getWalletUnlockerService() {\n this._setClientType(CLIENT_TYPE.WALLET_UNLOCKER)\n return walletUnlockerService(this.client)\n }\n\n getStateService() {\n this._setClientType(CLIENT_TYPE.STATE)\n return walletStateService(this.client)\n }\n}\n\nmodule.exports = WalletUnlocker\n", "const fs = require(\"node:fs\")\nconst { getConfig } = require(\"@business/common/getConfig.js\")\nconst { getConfigFilePath } = require(\"../../../utils/index.js\")\nconst WalletUnlocker = require(\"./index\")\n\nlet walletInstance = null\nfunction getWalletInstance() {\n const { certFilePath } = getConfigFilePath()\n const isCertFileExist = certFilePath && fs.existsSync(certFilePath)\n // console.log(\" getConfig().LINK_GRPC_HOST\", getConfig().LINK_GRPC_HOST, certFilePath)\n if (!walletInstance && isCertFileExist) {\n walletInstance = new WalletUnlocker({\n host: getConfig().LINK_GRPC_HOST,\n certFilePath,\n })\n }\n return walletInstance\n}\n\nmodule.exports = getWalletInstance\n", "const { Buffer } = require(\"node:buffer\")\nconst fs = require(\"node:fs\")\n\nconst { WALLET_STATE_CODE, WALLET_STATE } = require(\"@constants/index.js\")\n\nconst LndInstance = require(\"../service/rpc/lnd/instance.js\")\nconst TaprootAssetsInstance = require(\"../service/rpc/taprootAssets/instance.js\")\nconst getWalletInstance = require(\"../service/rpc/walletUnlocker/instance.js\")\nconst {\n getConfigFilePath,\n getCacheMacaroon,\n satsToTaprootAssetByRate,\n} = require(\"../utils/index\")\nconst linkCache = require(\"../utils/linkCache.js\")\nconst Logger = require(\"../utils/linkLogger.js\")\n\nconst { getConfig } = require(\"./getConfig.js\")\n\nfunction withTimeout(task, timeoutMs, options = {}) {\n if (typeof timeoutMs !== \"number\" || Number.isNaN(timeoutMs) || timeoutMs <= 0) {\n throw new Error(\"withTimeout requires a positive timeout in milliseconds\")\n }\n\n const { fallback, onTimeout } = options\n\n return new Promise((resolve, reject) => {\n let settled = false\n let timerId\n const cleanup = () => {\n settled = true\n if (timerId) {\n clearTimeout(timerId)\n }\n }\n\n const resolveSafe = (value) => {\n if (!settled) {\n cleanup()\n resolve(value)\n }\n }\n\n const rejectSafe = (error) => {\n if (!settled) {\n cleanup()\n reject(error)\n }\n }\n\n Promise.resolve(typeof task === \"function\" ? task() : task)\n .then(resolveSafe)\n .catch(rejectSafe)\n\n timerId = setTimeout(async () => {\n if (settled) {\n return\n }\n\n if (typeof onTimeout === \"function\") {\n try {\n onTimeout()\n }\n catch {\n // Swallow logging errors\n }\n }\n\n if (fallback !== undefined) {\n try {\n const fallbackValue\n = typeof fallback === \"function\" ? await fallback() : fallback\n resolveSafe(fallbackValue)\n }\n catch (error) {\n rejectSafe(error)\n }\n }\n else {\n rejectSafe(new Error(`Operation timed out after ${timeoutMs} ms`))\n }\n }, timeoutMs)\n })\n}\n\nfunction getWalletService() {\n const walletInstance = getWalletInstance()\n if (!walletInstance) {\n throw new Error(\"Wallet is not initialized yet.\")\n }\n const walletUnlockerService = walletInstance.getWalletUnlockerService()\n const walletStateService = walletInstance.getStateService()\n return { walletUnlockerService, walletStateService }\n}\nasync function getWalletState(isFromCache = false) {\n if (!isFromCache) {\n const { walletStateService } = getWalletService()\n const walletState = await walletStateService.getState()\n linkCache.set(\"walletState\", walletState.state)\n return walletState?.state || 0\n }\n return linkCache.get(\"walletState\") ?? 255\n}\nfunction getLightningService() {\n return LndInstance.getLightningService()\n}\nfunction getRouterService() {\n return LndInstance.getRouterService()\n}\n\nfunction getTprService() {\n return TaprootAssetsInstance.getTaprootAssetService()\n}\nfunction getUniverseService() {\n return TaprootAssetsInstance.getUniverseService()\n}\nfunction getTapchannelService() {\n return TaprootAssetsInstance.getTapchannelService()\n}\nfunction getPriceOracleService() {\n return TaprootAssetsInstance.getPriceOracleService()\n}\nasync function checkWalletState(expectState = WALLET_STATE_CODE.SERVER_ACTIVE) {\n const state = await getWalletState(true)\n\n if (Array.isArray(expectState)) {\n if (expectState.includes(state)) {\n return true\n }\n else {\n throw new Error(`Only ${expectState.map(item => WALLET_STATE[item].label).join(\",\")} can perform this operation, current state: ${WALLET_STATE[state].label}`)\n }\n }\n else {\n if (state !== expectState) {\n throw new Error(`Only ${WALLET_STATE[expectState].label} can perform this operation, current state: ${WALLET_STATE[state].label}`)\n }\n }\n return true\n}\nasync function checkTprEnabled() {\n const { taprootMacaroonPath }\n = getConfigFilePath()\n const state = await getWalletState(true)\n const { taprootMacaroon } = getCacheMacaroon()\n if (\n !taprootMacaroon\n || !fs.existsSync(taprootMacaroonPath)\n || state !== WALLET_STATE_CODE.SERVER_ACTIVE\n ) {\n return false\n }\n return true\n}\n\nasync function isConnectPeer({ node_pubkey }) {\n const { LINK_NOSTR_NODE_NPUBKEY } = getConfig()\n const NODE_PUBKEY = node_pubkey || LINK_NOSTR_NODE_NPUBKEY\n const lightningService = getLightningService()\n const retListpeers = await lightningService.listPeers({})\n return (\n retListpeers?.peers?.findIndex(peer => peer.pub_key === NODE_PUBKEY) > -1\n )\n}\nasync function getPayFeeLimit({ invoice, fixedLimit = 100 }) {\n const lightningService = getLightningService()\n const decodeInvoice = await lightningService.decodePayReq({\n pay_req: invoice,\n })\n const invoiceAmount = decodeInvoice.num_satoshis\n const computedFee = Number.parseInt(invoiceAmount * 0.01)\n if (computedFee < fixedLimit) {\n return fixedLimit\n }\n return computedFee\n}\nfunction combineResult({\n result_type,\n result = {},\n error,\n}) {\n const ret = {\n result_type,\n }\n if (error) {\n ret.error = error\n }\n else {\n ret.result = result\n }\n return ret\n}\n\nfunction withChecks(fn) {\n return async (...args) => {\n const checkTprEnabledRet = await checkTprEnabled()\n const checkStateRet = await checkWalletState(WALLET_STATE_CODE.SERVER_ACTIVE)\n if (checkTprEnabledRet && checkStateRet) {\n return await fn(...args)\n }\n else {\n if (!checkTprEnabledRet) {\n throw new Error(\"TaprootAssets not enabled\")\n }\n if (!checkStateRet) {\n throw new Error(\"Wallet state is not active\")\n }\n }\n }\n}\n\nconst queryRateTick = withChecks(async (args) => {\n const priceOracleService = getPriceOracleService()\n const {\n transaction_type, // 0 buy 1 sell\n subject_asset_id,\n subject_asset_mount,\n payment_asset_id = \"0000000000000000000000000000000000000000000000000000000000000000\",\n } = args\n const request = {\n transaction_type,\n subject_asset: {\n asset_id: Buffer.from(subject_asset_id, \"hex\"),\n },\n subject_asset_max_amount: subject_asset_mount,\n payment_asset: {\n asset_id: Buffer.from(payment_asset_id, \"hex\"),\n },\n }\n const retQueryRateTick = await priceOracleService.queryRateTick(request)\n return retQueryRateTick\n})\n\nasync function getAssetAmt(assetId, satsAmt) {\n const logger = new Logger(\"lnd\")\n try {\n const rateRet = await queryRateTick({\n transaction_type: 1,\n subject_asset_id: assetId,\n subject_asset_mount: 1,\n })\n const feeRate = rateRet?.ok?.asset_rates?.subjectAssetRate\n const estimateAssetAmount = satsToTaprootAssetByRate(satsAmt, feeRate)\n return estimateAssetAmount\n }\n catch (e) {\n logger.error(`getAssetAmt error, ${e?.message}`)\n }\n}\nasync function isLndRPCActive() {\n const state = await getWalletState(true)\n const { adminMacaroon } = getCacheMacaroon()\n return (state === WALLET_STATE_CODE.RPC_ACTIVE || state === WALLET_STATE_CODE.SERVER_ACTIVE) && adminMacaroon\n}\nasync function isLndInitialized() {\n const state = await getWalletState(true)\n const { adminMacaroon } = getCacheMacaroon()\n if (state !== WALLET_STATE_CODE.SERVER_ACTIVE) {\n throw new Error(\"LND is not server-active yet.\")\n }\n if (!adminMacaroon) {\n throw new Error(\"LND is locked, please unlock first.\")\n }\n return state === WALLET_STATE_CODE.SERVER_ACTIVE && adminMacaroon\n}\nasync function isTapdInitialized() {\n const state = await getWalletState(true)\n const { taprootMacaroon } = getCacheMacaroon()\n if (state !== WALLET_STATE_CODE.SERVER_ACTIVE) {\n throw new Error(\"LND is not server-active yet.\")\n }\n\n if (!taprootMacaroon) {\n throw new Error(\"TaprootAssets not enabled\")\n }\n return state === WALLET_STATE_CODE.SERVER_ACTIVE && taprootMacaroon\n}\nfunction isExistLitd() {\n const { certFilePath } = getConfigFilePath()\n\n return fs.existsSync(certFilePath)\n}\nasync function getOpenedChannelList() {\n const lightningService = getLightningService()\n const channelListRet = await lightningService.listChannels({})\n const list = channelListRet?.channels?.map((channel) => {\n let tempCustomChannelData = \"\"\n if (channel.custom_channel_data) {\n tempCustomChannelData = JSON.parse(\n Buffer.from(channel.custom_channel_data, \"hex\").toString(\"utf-8\"),\n )\n }\n const peer_alias = channel?.peer_alias ? channel.peer_alias.includes(\"not found\") ? \"\" : channel?.peer_alias : \"\"\n const obj = {\n channel_id: channel.chan_id,\n remote_pubkey: channel.remote_pubkey,\n channel_point: channel.channel_point,\n capacity: channel.capacity,\n local_balance: channel.local_balance,\n remote_balance: channel.remote_balance,\n active: channel.active,\n local_chan_reserve_sat: channel.local_chan_reserve_sat,\n remote_chan_reserve_sat: channel.remote_chan_reserve_sat,\n commit_fee: channel.commit_fee,\n commitment_type: channel.commitment_type,\n custom_channel_data: tempCustomChannelData,\n zero_conf: channel.zero_conf,\n zero_conf_confirmed_scid: channel.zero_conf_confirmed_scid,\n peer_alias,\n }\n if (obj.zero_conf) {\n obj.channel_id = channel.zero_conf_confirmed_scid\n }\n return obj\n })\n const channelList = list\n return channelList\n}\n\nfunction checkObjectArgs(obj, requiredKeys = []) {\n for (const key of requiredKeys) {\n if (obj[key] === undefined) {\n throw new Error(`${key} is required`)\n }\n }\n return true\n}\nmodule.exports = {\n getWalletService,\n getWalletState,\n getLightningService,\n getRouterService,\n getTprService,\n checkWalletState,\n checkTprEnabled,\n getUniverseService,\n getTapchannelService,\n getPriceOracleService,\n isConnectPeer,\n getPayFeeLimit,\n withTimeout,\n combineResult,\n withChecks,\n getAssetAmt,\n isLndInitialized,\n isLndRPCActive,\n isTapdInitialized,\n getOpenedChannelList,\n isExistLitd,\n checkObjectArgs,\n}\n", "const { getConfig } = require(\"@business/common/getConfig.js\")\nconst axios = require(\"axios\")\n\nconst client = axios.create()\n\nasync function request(config) {\n const { LINK_REPORT_BASE_URL } = getConfig()\n if (!LINK_REPORT_BASE_URL) {\n throw new Error(\"LINK_REPORT_BASE_URL is not configured\")\n }\n\n const response = await client.request({\n ...config,\n baseURL: LINK_REPORT_BASE_URL,\n })\n\n return response.data\n}\n\nmodule.exports = request\n", "const { getConfig } = require(\"@business/common/getConfig.js\")\nconst {\n getMainLnlinkConfig,\n} = require(\"@business/service/prisma/dbService\")\nconst { nip04, nip19 } = require(\"nostr-tools\")\nconst Logger = require(\"../../utils/linkLogger.js\")\nconst request = require(\"./request.js\")\n\nasync function getSignature(data) {\n const lndConfig = await getMainLnlinkConfig()\n const { LINK_REPORT_ADDRESS } = getConfig()\n if (!LINK_REPORT_ADDRESS) {\n throw new Error(\"LINK_REPORT_ADDRESS is required\")\n }\n const pubkey = nip19.decode(LINK_REPORT_ADDRESS).data\n const sk = lndConfig.node_sk\n const message = JSON.stringify(data)\n const signature = await nip04.encrypt(sk, pubkey, message)\n return signature\n}\n\nasync function reportTaskCompletion({\n nostrAddress,\n tag,\n}) {\n const logger = new Logger(\"report\")\n try {\n const data = {\n nostrAddress,\n tag,\n }\n const signature = await getSignature(data)\n const ret = await request({\n url: \"/api/tasks/complete\",\n method: \"post\",\n data: {\n ...data,\n signature,\n },\n })\n if (ret?.code === 0) {\n logger.info(`reportTaskCompletion tag: ${tag},user: ${nostrAddress} success`)\n }\n else {\n logger.warn(`reportTaskCompletion tag: ${tag},user: ${nostrAddress} failed`)\n }\n return ret\n }\n catch (error) {\n logger.error(\"reportTaskCompletion error:\", error?.message)\n return false\n }\n}\n\nasync function registerNode({ nostrAddress, lnlinkNpub }) {\n const logger = new Logger(\"register\")\n try {\n const data = {\n nostrAddress,\n lnlinkNpub,\n }\n const signature = await getSignature(data)\n const ret = await request({\n url: \"/api/register\",\n method: \"post\",\n data: {\n ...data,\n signature,\n },\n })\n\n if (ret?.code === 0) {\n logger.info(`registerNode nostrAddress: ${nostrAddress},lnlinkNpub: ${lnlinkNpub} success`)\n }\n else {\n logger.warn(`registerNode nostrAddress: ${nostrAddress},lnlinkNpub: ${lnlinkNpub} failed`)\n }\n return ret\n }\n catch (error) {\n logger.error(error?.message)\n return false\n }\n}\n\nmodule.exports = {\n reportTaskCompletion,\n registerNode,\n}\n", "const { getConfig } = require(\"@business/common/getConfig.js\")\n\n/**\n * Get binary name (add .exe suffix on Windows)\n */\nfunction getBinaryName(baseName) {\n const isWindows = process.platform === \"win32\"\n return isWindows ? `${baseName}.exe` : baseName\n}\n\n/**\n * Build Litd startup arguments\n * @param {boolean} includeTor - Whether to include Tor configuration\n * @returns {string[]} Array of startup arguments\n */\nfunction buildLitdArgs(includeTor = false) {\n const config = getConfig()\n\n const {\n LINK_NETWORK,\n LINK_NAME,\n LINK_DEBUG,\n LINK_NOSTR_NODE_NPUBKEY,\n LINK_NOSTR_NODE_HOST,\n LINK_BITCOIND_RPCHOST,\n LINK_ORACLE_SERVER_HOST,\n LINK_BITCOIND_RPCUSER,\n LINK_BITCOIND_RPCPASS,\n LINK_BITCOIND_ZMQBLOCK,\n LINK_BITCOIND_ZMQRAWTX,\n LINK_DATA_PATH,\n LINK_LND_RPC_PORT,\n LINK_UNIVERSE_HOST,\n LINK_LND_PEER_LISTEN_PORT,\n LINK_TOR_SOCKS_PORT = 9050,\n LINK_TOR_CONTROL_PORT = 9051,\n } = config\n\n const args = [\n // Basic configuration\n \"--disableui\",\n \"--httpslisten=\",\n `--network=${LINK_NETWORK}`,\n `--tlsextradomain=${LINK_NAME}-litd-${LINK_NETWORK}`,\n `--tlsextradomain=localhost`,\n `--tlsextraip=127.0.0.1`,\n \"--lnd-mode=integrated\",\n `--lit-dir=${LINK_DATA_PATH}/.litd`,\n\n // LND data and certificate configuration\n `--lnd.datadir=${LINK_DATA_PATH}/.lnd/data`,\n `--lnd.tlscertpath=${LINK_DATA_PATH}/.lnd/tls.cert`,\n `--lnd.tlskeypath=${LINK_DATA_PATH}/.lnd/tls.key`,\n\n // LND network configuration\n \"--lnd.bitcoin.active\",\n `--lnd.bitcoin.${LINK_NETWORK}`,\n \"--lnd.bitcoin.node=bitcoind\",\n `--lnd.alias=${LINK_NAME || \"lnlink\"}`,\n `--lnd.tlsextradomain=${LINK_NAME}-litd-${LINK_NETWORK}`,\n `--lnd.tlsextradomain=localhost`,\n \"--lnd.tlsextraip=127.0.0.1\",\n\n // LND listening configuration\n `--lnd.rpclisten=0.0.0.0:${LINK_LND_RPC_PORT}`,\n `--lnd.listen=0.0.0.0:${LINK_LND_PEER_LISTEN_PORT}`,\n `--lnd.debuglevel=${LINK_DEBUG ? \"debug\" : \"info\"}`,\n\n // LND protocol features\n \"--lnd.rpcmiddleware.enable\",\n \"--lnd.protocol.wumbo-channels\",\n \"--lnd.maxpendingchannels=10\",\n \"--lnd.protocol.option-scid-alias\",\n \"--lnd.protocol.zero-conf\",\n \"--lnd.protocol.simple-taproot-chans\",\n \"--lnd.protocol.simple-taproot-overlay-chans\",\n \"--lnd.protocol.custom-message=17\",\n \"--lnd.allow-circular-route\",\n \"--lnd.accept-keysend\",\n \"--lnd.accept-amp\",\n \"--lnd.gc-canceled-invoices-on-startup\",\n \"--lnd.gc-canceled-invoices-on-the-fly\",\n\n // Node connection and Bitcoin configuration\n `--lnd.addpeer=${LINK_NOSTR_NODE_NPUBKEY}@${LINK_NOSTR_NODE_HOST}`,\n `--lnd.bitcoind.rpchost=${LINK_BITCOIND_RPCHOST}`,\n `--lnd.bitcoind.rpcuser=${LINK_BITCOIND_RPCUSER}`,\n `--lnd.bitcoind.rpcpass=${LINK_BITCOIND_RPCPASS}`,\n `--lnd.bitcoind.zmqpubrawblock=${LINK_BITCOIND_ZMQBLOCK}`,\n `--lnd.bitcoind.zmqpubrawtx=${LINK_BITCOIND_ZMQRAWTX}`,\n \"--autopilot.disable\",\n\n // Taproot Assets configuration\n `--taproot-assets.datadir=${LINK_DATA_PATH}/.tapd/data`,\n \"--taproot-assets-mode=integrated\",\n `--taproot-assets.tlsextradomain=localhost`,\n `--taproot-assets.tlsextraip=127.0.0.1`,\n \"--taproot-assets.tlsextraip=127.0.0.1\",\n \"--taproot-assets.universe.public-access=rw\",\n \"--taproot-assets.universe.sync-all-assets\",\n \"--taproot-assets.allow-public-uni-proof-courier\",\n \"--taproot-assets.allow-public-stats\",\n `--taproot-assets.proofcourieraddr=universerpc://${LINK_UNIVERSE_HOST}`,\n `--taproot-assets.experimental.rfq.priceoracleaddress=rfqrpc://${LINK_ORACLE_SERVER_HOST}`,\n\n // Disabled services\n \"--faraday-mode=disable\",\n \"--loop-mode=disable\",\n \"--pool-mode=disable\",\n ]\n\n // Add Tor configuration\n if (includeTor) {\n const torArgs = [\n \"--lnd.tor.active\",\n \"--lnd.tor.v3\",\n \"--lnd.tor.skip-proxy-for-clearnet-targets\",\n `--lnd.tor.socks=127.0.0.1:${LINK_TOR_SOCKS_PORT}`,\n `--lnd.tor.control=127.0.0.1:${LINK_TOR_CONTROL_PORT}`,\n ]\n args.push(...torArgs)\n }\n\n return args\n}\n\n/**\n * Build Tor startup arguments\n * @returns {string[]} Array of Tor startup arguments\n */\nfunction buildTorArgs() {\n const config = getConfig()\n const {\n LINK_DATA_PATH,\n LINK_TOR_SOCKS_PORT,\n LINK_TOR_CONTROL_PORT,\n LINK_HTTPS_PROXY,\n } = config\n\n const dataDirectory = `${LINK_DATA_PATH}/.tor`\n\n const args = [\n \"SOCKSPort\",\n `127.0.0.1:${LINK_TOR_SOCKS_PORT}`,\n \"ControlPort\",\n `127.0.0.1:${LINK_TOR_CONTROL_PORT}`,\n \"CookieAuthentication\",\n \"1\",\n \"CookieAuthFileGroupReadable\",\n \"1\",\n \"DataDirectory\",\n dataDirectory,\n \"Log\",\n \"notice stdout\",\n ]\n\n if (LINK_HTTPS_PROXY) {\n args.push(\"HTTPSProxy\", LINK_HTTPS_PROXY)\n }\n\n return args\n}\n\n/**\n * Build RGB startup arguments\n * @param {string[]} injectArgs - Additional arguments to inject\n * @returns {string[]} Array of RGB startup arguments\n */\nfunction buildRgbArgs(injectArgs = []) {\n const config = getConfig()\n const {\n LINK_NETWORK,\n LINK_RGB_LDK_PEER_LISTENING_PORT = 9736,\n LINK_DATA_PATH,\n LINK_RGB_LISTENING_PORT\n } = config\n\n const baseArgs = [`${LINK_DATA_PATH}/.rgb`]\n\n const args = [\n `--daemon-listening-port=${LINK_RGB_LISTENING_PORT}`,\n `--network=${LINK_NETWORK}`,\n `--ldk-peer-listening-port=${LINK_RGB_LDK_PEER_LISTENING_PORT}`,\n \"--max-media-upload-size-mb=5\",\n \"--disable-authentication\",\n ]\n\n return [...baseArgs, ...args, ...injectArgs]\n}\n\n/**\n * Get service configuration\n * @returns {object} Service configuration object\n */\nfunction getServiceConfig() {\n const config = getConfig()\n const { LINK_BINARY_PATH } = config\n\n return {\n litd: {\n command: `${LINK_BINARY_PATH}/${getBinaryName(\"litd\")}`,\n args: null, // Generated dynamically\n process: null,\n },\n tor: {\n command: `${LINK_BINARY_PATH}/${getBinaryName(\"tor\")}`,\n args: buildTorArgs(),\n process: null,\n },\n rgb: {\n command: `${LINK_BINARY_PATH}/${getBinaryName(\"rgb-lightning-node\")}`,\n args: null, // Generated dynamically\n process: null,\n },\n }\n}\n\nmodule.exports = {\n getBinaryName,\n buildLitdArgs,\n buildTorArgs,\n buildRgbArgs,\n getServiceConfig,\n}\n", "const { spawn, exec } = require(\"node:child_process\")\nconst { getLightningService } = require(\"@business/common\")\nconst Logger = require(\"../../utils/linkLogger.js\")\nconst { sleep } = require(\"../../utils/timeUtils.js\")\nconst { getServiceConfig } = require(\"./config.js\")\n\n// Platform detection\nconst isWindows = process.platform === \"win32\"\n\n/**\n * Cross-platform process finding\n * @param {string} processName - Process name or command pattern\n * @returns {Promise<string[]>} Array of process IDs\n */\nfunction findProcesses(processName) {\n return new Promise((resolve) => {\n let command\n\n if (isWindows) {\n // Windows: use tasklist and findstr\n command = `tasklist /FO CSV | findstr /I \"${processName}\"`\n }\n else {\n // Unix/Linux: use pgrep\n command = `pgrep -f '${processName}'`\n }\n\n exec(command, (err, stdout) => {\n if (err) {\n // No processes found is not an error\n resolve([])\n return\n }\n\n let pids = []\n\n if (isWindows) {\n // Parse Windows tasklist output\n const lines = stdout.trim().split(\"\\n\")\n for (const line of lines) {\n if (line.includes(processName)) {\n // CSV format: \"Image Name\",\"PID\",\"Session Name\",\"Session#\",\"Mem Usage\"\n const match = line.match(/\"[^\"]*\",\"(\\d+)\",/)\n if (match) {\n pids.push(match[1])\n }\n }\n }\n }\n else {\n // Parse Unix/Linux pgrep output\n pids = stdout.trim().split(\"\\n\").filter(Boolean)\n }\n\n resolve(pids)\n })\n })\n}\n\n/**\n * Cross-platform process termination\n * @param {string} pid - Process ID\n * @param {boolean} force - Whether to force kill\n * @returns {Promise<boolean>} Whether successfully terminated\n */\nfunction terminateProcess(pid, force = false) {\n const logger = new Logger(\"processManager\")\n return new Promise((resolve) => {\n let command\n\n if (isWindows) {\n // Windows: use taskkill\n command = force ? `taskkill /F /PID ${pid}` : `taskkill /PID ${pid}`\n }\n else {\n // Unix/Linux: use kill\n const signal = force ? \"-9\" : \"-15\"\n command = `kill ${signal} ${pid}`\n }\n\n exec(command, (err) => {\n if (err) {\n logger.error(`Failed to terminate process ${pid}: ${err.message}`)\n resolve(false)\n }\n else {\n logger.info(`Process ${pid} terminated successfully`)\n resolve(true)\n }\n })\n })\n}\n\n// Service state management\nconst serviceState = {\n services: null, // Will be initialized when needed\n}\n\nfunction initializeServices() {\n if (!serviceState.services) {\n serviceState.services = getServiceConfig()\n }\n return serviceState.services\n}\n\n/**\n * Get service configuration\n * @param {string} name - Service name\n * @returns {object | null} Service configuration\n */\nfunction getService(name) {\n const services = initializeServices()\n return services[name] || null\n}\n\n/**\n * Update service process reference\n * @param {string} name - Service name\n * @param {object} process - Process object\n */\nfunction setServiceProcess(name, process) {\n const services = initializeServices()\n if (services[name]) {\n services[name].process = process\n }\n}\n\n/**\n * Start Litd service\n * @param {string[]} args - Startup arguments\n * @returns {Promise<boolean>} Whether startup was successful\n */\nfunction startLitdService(args) {\n const logger = new Logger(\"processManager\")\n return new Promise((resolve, reject) => {\n const service = getService(\"litd\")\n if (!service) {\n return reject(new Error(\"litd service not found\"))\n }\n\n let settled = false\n const settleResolve = (value) => {\n if (!settled) {\n settled = true\n resolve(value)\n }\n }\n const settleReject = (error) => {\n if (!settled) {\n settled = true\n reject(error)\n }\n }\n\n const proc = spawn(service.command, args, {\n stdio: \"pipe\",\n })\n\n setServiceProcess(\"litd\", proc)\n\n proc.once(\"exit\", (code, signal) => {\n logger.info(`litd process exited with code ${code ?? \"null\"}, signal ${signal ?? \"null\"}`)\n const currentService = getService(\"litd\")\n if (currentService?.process === proc) {\n setServiceProcess(\"litd\", null)\n }\n if (!settled) {\n settleReject(new Error(`litd exited before startup completed (code: ${code ?? \"null\"}, signal: ${signal ?? \"null\"})`))\n }\n })\n\n proc.stdout.on(\"data\", (data) => {\n const output = data.toString().replace(/\\n+/g, \"\\n\").trim()\n if (output.includes(\"Lightning Terminal (LiT) by Lightning Labs\")) {\n logger.info(\"litd is ready\")\n settleResolve(true)\n }\n })\n\n proc.on(\"error\", (err) => {\n logger.error(`Start litd failed: ${err?.message}`)\n settleReject(err)\n })\n\n proc.stderr.on(\"data\", (data) => {\n logger.error(`[litd] ${data}`)\n })\n })\n}\n\n/**\n * Start Tor service\n * @param {string[]} args - Startup arguments\n * @returns {Promise<boolean>} Whether startup was successful\n */\nfunction startTorService(args) {\n const logger = new Logger(\"processManager\")\n return new Promise((resolve, reject) => {\n const service = getService(\"tor\")\n if (!service) {\n return reject(new Error(\"tor service not found\"))\n }\n\n let settled = false\n const settleResolve = (value) => {\n if (!settled) {\n settled = true\n resolve(value)\n }\n }\n const settleReject = (error) => {\n if (!settled) {\n settled = true\n reject(error)\n }\n }\n\n logger.info(`Tor config: ${JSON.stringify(args, null, 2)}`)\n\n const proc = spawn(service.command, args, {\n stdio: \"pipe\",\n })\n\n setServiceProcess(\"tor\", proc)\n\n proc.once(\"exit\", (code, signal) => {\n logger.info(`tor process exited with code ${code ?? \"null\"}, signal ${signal ?? \"null\"}`)\n const currentService = getService(\"tor\")\n if (currentService?.process === proc) {\n setServiceProcess(\"tor\", null)\n }\n if (!settled) {\n settleReject(new Error(`tor exited before startup completed (code: ${code ?? \"null\"}, signal: ${signal ?? \"null\"})`))\n }\n })\n\n proc.stdout.on(\"data\", (data) => {\n const output = data.toString().replace(/\\n+/g, \"\\n\").trim()\n if (output) {\n logger.info(`[tor] ${output}`)\n }\n if (output.includes(\"100%\")) {\n logger.info(\"[tor] is ready\")\n settleResolve(true)\n }\n })\n\n proc.stderr.on(\"data\", (data) => {\n const errorOutput = data.toString()\n logger.error(`[tor] ${errorOutput}`)\n if (errorOutput.includes(\"User option\") || errorOutput.includes(\"setuid\")) {\n logger.info(\"[tor] Detected User permission issue, this is normal in Docker\")\n }\n })\n\n proc.on(\"error\", (err) => {\n logger.error(`Start tor failed: ${err?.message}`)\n settleReject(err)\n })\n })\n}\n\n/**\n * Start RGB service\n * @param {string[]} args - Startup arguments\n * @returns {Promise<boolean>} Whether startup was successful\n */\nfunction startRgbService(args) {\n const logger = new Logger(\"processManager\")\n return new Promise((resolve, reject) => {\n const service = getService(\"rgb\")\n if (!service) {\n return reject(new Error(\"rgb service not found\"))\n }\n let settled = false\n const settleResolve = (value) => {\n if (!settled) {\n settled = true\n resolve(value)\n }\n }\n const settleReject = (error) => {\n if (!settled) {\n settled = true\n reject(error)\n }\n }\n const proc = spawn(service.command, args, {\n stdio: \"pipe\",\n })\n\n setServiceProcess(\"rgb\", proc)\n\n proc.once(\"exit\", (code, signal) => {\n logger.info(`rgb process exited with code ${code ?? \"null\"}, signal ${signal ?? \"null\"}`)\n const currentService = getService(\"rgb\")\n if (currentService?.process === proc) {\n setServiceProcess(\"rgb\", null)\n }\n if (!settled) {\n settleReject(new Error(`rgb exited before startup completed (code: ${code ?? \"null\"}, signal: ${signal ?? \"null\"})`))\n }\n })\n\n proc.stdout.on(\"data\", (data) => {\n const output = data.toString().replace(/\\n+/g, \"\\n\").trim()\n // if (output) {\n // logger.info(`[rgb] ${output}`)\n // }\n if (output.includes(\"Listening on\")) {\n logger.info(\"rgb is ready\")\n settleResolve(true)\n }\n })\n\n proc.on(\"error\", (err) => {\n logger.error(`Start rgb failed: ${err?.message}`)\n settleReject(err)\n })\n\n proc.stderr.on(\"data\", (data) => {\n const errorOutput = data.toString()\n logger.error(`[rgb] ${errorOutput}`)\n // Only reject on critical errors, not warnings\n if (errorOutput.toLowerCase().includes(\"fatal\")\n || errorOutput.toLowerCase().includes(\"cannot\")\n || errorOutput.toLowerCase().includes(\"failed to start\")) {\n settleReject(new Error(`Start rgb failed: ${errorOutput}`))\n }\n })\n })\n}\n\n/**\n * Generic process termination function\n * @param {object} process - Process object\n * @param {string} name - Service name\n * @param {number} timeout - Timeout in milliseconds\n * @returns {Promise<boolean>} Whether successfully stopped\n */\nfunction killProcess(process, name, timeout = 10000) {\n const logger = new Logger(\"processManager\")\n let resolved = false\n let timeoutId = null\n const targetProcess = process\n\n return new Promise((resolve) => {\n const safeResolve = (value) => {\n if (!resolved) {\n resolved = true\n if (timeoutId) {\n clearTimeout(timeoutId)\n }\n resolve(value)\n }\n }\n\n process.kill(\"SIGTERM\")\n\n process.on(\"exit\", (code) => {\n logger.info(`${name} exited with code ${code}`)\n const currentService = getService(name)\n if (currentService?.process === targetProcess) {\n setServiceProcess(name, null)\n }\n safeResolve(true)\n })\n\n timeoutId = setTimeout(() => {\n const currentService = getService(name)\n const currentProcess = currentService?.process\n if (currentProcess && currentProcess === targetProcess) {\n logger.info(`${name} did not exit in time, forcing shutdown...`)\n currentProcess.kill(\"SIGKILL\")\n setServiceProcess(name, null)\n }\n safeResolve(true)\n }, timeout)\n })\n}\n\n/**\n * Find and terminate process by command (cross-platform)\n * @param {string} command - Command string\n * @param {string} name - Service name\n * @returns {Promise<boolean>} Whether successfully stopped\n */\nasync function findAndKillProcess(command, name) {\n const logger = new Logger(\"processManager\")\n try {\n // Extract process name for Windows compatibility\n const processName = isWindows ? command.split(/[/\\\\]/).pop().replace(\".exe\", \"\") : command\n\n logger.info(`Looking for ${name} processes matching: ${processName}`)\n\n const pids = await findProcesses(processName)\n if (pids.length === 0) {\n logger.info(`No ${name} processes found`)\n return false\n }\n\n logger.info(`Found ${pids.length} ${name} process(es): ${pids.join(\", \")}`)\n\n // Try graceful termination first\n await Promise.all(\n pids.map(pid => terminateProcess(pid, false)),\n )\n\n // Wait a bit for graceful shutdown\n await sleep(2000)\n\n // Check if any processes are still running\n const remainingPids = await findProcesses(processName)\n\n if (remainingPids.length > 0) {\n logger.warn(`${remainingPids.length} ${name} process(es) still running, force killing...`)\n\n // Force kill remaining processes\n await Promise.all(\n remainingPids.map(pid => terminateProcess(pid, true)),\n )\n }\n\n logger.info(`${name} processes terminated successfully`)\n return true\n }\n catch (error) {\n logger.error(`Failed to find and kill ${name} processes: ${error.message}`)\n return false\n }\n}\n\n/**\n * Stop Litd service (includes graceful shutdown)\n * @returns {Promise<boolean>} Whether successfully stopped\n */\nasync function stopLitdService() {\n const initialService = getService(\"litd\")\n const logger = new Logger(\"processManager\")\n if (!initialService) {\n throw new Error(\"litd service not found\")\n }\n\n try {\n logger.info(\"Attempting graceful shutdown via RPC...\")\n\n // Try graceful shutdown via RPC\n const lightningService = getLightningService()\n await lightningService.stopDaemon()\n\n logger.info(\"LND daemon stopped gracefully via RPC\")\n\n // Wait for process to exit naturally\n let waitCount = 0\n const maxWait = 30\n\n while (waitCount < maxWait) {\n const currentProcess = getService(\"litd\")?.process ?? initialService.process\n if (!currentProcess || currentProcess.killed) {\n setServiceProcess(\"litd\", null)\n return true\n }\n\n await sleep(1000)\n waitCount++\n }\n\n logger.warn(\"Process did not exit after RPC shutdown, proceeding with fallback...\")\n }\n catch (error) {\n logger.warn(`RPC shutdown failed: ${error.message}, falling back to process termination`)\n }\n\n // Fallback to process termination\n const fallbackService = getService(\"litd\") ?? initialService\n if (fallbackService.process) {\n return await killProcess(fallbackService.process, \"litd\")\n }\n\n return await findAndKillProcess(fallbackService.command, \"litd\")\n}\n\n/**\n * Stop Tor service\n * @returns {Promise<boolean>} Whether successfully stopped\n */\nasync function stopTorService() {\n const service = getService(\"tor\")\n if (!service) {\n throw new Error(\"tor service not found\")\n }\n\n if (service.process) {\n return await killProcess(service.process, \"tor\", 5000)\n }\n else {\n return await findAndKillProcess(service.command, \"tor\")\n }\n}\n\n/**\n * Stop RGB service (includes graceful shutdown)\n * @returns {Promise<boolean>} Whether successfully stopped\n */\nasync function stopRgbService() {\n const logger = new Logger(\"processManager\")\n const service = getService(\"rgb\")\n if (!service) {\n throw new Error(\"rgb service not found\")\n }\n\n try {\n logger.info(\"Attempting graceful shutdown of RGB via SIGTERM...\")\n\n // Try graceful shutdown first using pkill\n const gracefulShutdown = new Promise((resolve) => {\n exec(`pkill -SIGTERM -f 'rgb-lightning-node'`, (err, stdout) => {\n if (!err) {\n logger.info(`RGB stopped gracefully: ${stdout}`)\n resolve(true)\n }\n else {\n logger.warn(`Graceful shutdown of RGB failed: ${err?.message}`)\n resolve(false)\n }\n })\n })\n\n const gracefulResult = await gracefulShutdown\n if (gracefulResult) {\n // Wait a bit for graceful shutdown\n await sleep(2000)\n setServiceProcess(\"rgb\", null)\n return true\n }\n\n logger.info(\"Graceful shutdown failed, proceeding with process termination...\")\n }\n catch (error) {\n logger.warn(`RGB graceful shutdown failed: ${error.message}, falling back to process termination`)\n }\n\n // Fallback to process termination\n if (service.process) {\n return await killProcess(service.process, \"rgb\")\n }\n else {\n return await findAndKillProcess(\"rgb-lightning-node\", \"rgb\")\n }\n}\n\n/**\n * Stop specified service\n * @param {string} name - Service name\n * @returns {Promise<boolean>} Whether successfully stopped\n */\nasync function stopService(name) {\n switch (name) {\n case \"litd\":\n return await stopLitdService()\n case \"tor\":\n return await stopTorService()\n case \"rgb\":\n return await stopRgbService()\n default:\n throw new Error(`Unknown service: ${name}`)\n }\n}\n\n/**\n * Start specified service\n * @param {string} name - Service name\n * @param {string[]} args - Startup arguments\n * @returns {Promise<boolean>} Whether successfully started\n */\nasync function startService(name, args) {\n switch (name) {\n case \"litd\":\n return await startLitdService(args)\n case \"tor\":\n return await startTorService(args)\n case \"rgb\":\n return await startRgbService(args)\n default:\n throw new Error(`Unknown service: ${name}`)\n }\n}\n\n/**\n * Get all services state\n * @returns {object} Services state object\n */\nfunction getServicesState() {\n const services = initializeServices()\n return {\n litd: {\n hasProcess: !!services.litd?.process,\n command: services.litd?.command,\n },\n tor: {\n hasProcess: !!services.tor?.process,\n command: services.tor?.command,\n },\n rgb: {\n hasProcess: !!services.rgb?.process,\n command: services.rgb?.command,\n },\n }\n}\n\nmodule.exports = {\n startService,\n stopService,\n stopLitdService,\n stopTorService,\n stopRgbService,\n getServicesState,\n}\n", "const { getConfig } = require(\"@business/common/getConfig.js\")\nconst { RgbApiClient } = require(\"@lnfi-network/rgb-api-js-sdk\")\n\nlet rgbClient = null\n\nfunction getRgbClient() {\n if (!rgbClient) {\n const config = getConfig()\n if (!config.LINK_RGB_LISTENING_PORT) {\n throw new Error(\"RGB configuration not available\")\n }\n rgbClient = new RgbApiClient({\n baseUrl: `http://127.0.0.1:${config.LINK_RGB_LISTENING_PORT}`,\n })\n }\n return rgbClient\n}\n\nmodule.exports = getRgbClient\n", "const { checkObjectArgs } = require(\"@business/common\")\nconst { getConfig } = require(\"@business/common/getConfig.js\")\n\nconst { decryptNostrString } = require(\"@business/service/prisma/dbService\")\n\nconst { getConfigFilePath } = require(\"@business/utils/path\")\nconst { TASKS } = require(\"@constants/index\")\nconst { reportTaskCompletion } = require(\"../report/reportService\")\nconst getRgbClient = require(\"./client\")\n\nasync function getNodeState() {\n const stateResult = await getRgbClient().node.getNodeState()\n const status = {}\n switch (stateResult) {\n case \"None\":\n status.state = 0\n break\n case \"Locked\":\n status.state = 1\n break\n case \"Changing\":\n status.state = 3\n break\n case \"Running\":\n status.state = 4\n break\n case \"NonExisting\":\n status.state = 255\n break\n default:\n status.state = 0\n }\n\n return status\n}\n\nasync function getRGBAssetsList() {\n const rgbClient = getRgbClient()\n const ret = await rgbClient.rgb.listAssets({\n filter_asset_schemas: [],\n })\n return ret?.nia ?? []\n}\n\nasync function genSeed({ password }) {\n if (!password) {\n throw new Error(\"password is required\")\n }\n const rgbClient = getRgbClient()\n const decodeWalletPassword = await decryptNostrString(password)\n const ret = await rgbClient.node.initNode({\n password: decodeWalletPassword,\n })\n return ret\n}\nasync function unlockNode({ password, lnlinkUser }) {\n if (!password) {\n throw new Error(\"password is required\")\n }\n const rgbClient = getRgbClient()\n const {\n LINK_BITCOIND_RPCHOST,\n LINK_BITCOIND_RPCUSER,\n LINK_BITCOIND_RPCPASS,\n LINK_RGB_LDK_PEER_LISTENING_PORT = 9735,\n LINK_NAME,\n LINK_RGB_ELECTRS_HOST,\n LINK_RGB_PROXY_ENDPOINT,\n } = getConfig()\n const decodeWalletPassword = await decryptNostrString(password)\n const bitcoindRpcHost = LINK_BITCOIND_RPCHOST?.split(\":\")[0]\n\n const bitcoindRpcPort = Number(LINK_BITCOIND_RPCHOST?.split(\":\")[1])\n\n const unlockNodeParams = {\n bitcoind_rpc_username: LINK_BITCOIND_RPCUSER,\n bitcoind_rpc_password: LINK_BITCOIND_RPCPASS,\n bitcoind_rpc_host: bitcoindRpcHost,\n bitcoind_rpc_port: bitcoindRpcPort,\n indexer_url: LINK_RGB_ELECTRS_HOST,\n proxy_endpoint: LINK_RGB_PROXY_ENDPOINT,\n password: decodeWalletPassword,\n announce_addresses: [`0.0.0.0:${LINK_RGB_LDK_PEER_LISTENING_PORT}`],\n announce_alias: `${LINK_NAME}`,\n }\n if (lnlinkUser) {\n reportTaskCompletion({\n nostrAddress: lnlinkUser?.npub,\n tag: TASKS.EnableRGBNode,\n })\n }\n\n const unlockPromise = rgbClient.node.unlockNode(unlockNodeParams)\n\n const timeoutMs = 30_000\n let timeoutId\n\n const timeoutPromise = new Promise((resolve) => {\n timeoutId = setTimeout(async () => {\n const status = await getNodeState()\n resolve({\n message: \"Request submitted, current node status:\",\n status,\n })\n }, timeoutMs)\n })\n\n const result = await Promise.race([unlockPromise, timeoutPromise])\n clearTimeout(timeoutId)\n\n return result || true\n}\nasync function backupNode({ password }) {\n const { rgbBackupPath } = getConfigFilePath()\n const args = {\n password,\n backup_path: rgbBackupPath,\n }\n const rgbClient = getRgbClient()\n checkObjectArgs(args, [\"password\", \"backup_path\"])\n const state = await getNodeState()\n if (state.state === 4) {\n await rgbClient.node.lockNode()\n }\n const decodeWalletPassword = await decryptNostrString(password)\n args.password = decodeWalletPassword\n const ret = await rgbClient.node.backupNode(args)\n return ret || true\n}\n\nasync function restoreNode({ password }) {\n const { rgbBackupPath } = getConfigFilePath()\n const args = {\n password,\n backup_path: rgbBackupPath,\n }\n const rgbClient = getRgbClient()\n const state = await getNodeState()\n if (state.state === 4) {\n await rgbClient.node.lockNode()\n }\n checkObjectArgs(args, [\"password\", \"backup_path\"])\n const decodeWalletPassword = await decryptNostrString(password)\n args.password = decodeWalletPassword\n const ret = await rgbClient.node.restoreNode(args)\n return ret || true\n}\nmodule.exports = {\n getNodeState,\n genSeed,\n unlockNode,\n backupNode,\n restoreNode,\n getRGBAssetsList,\n}\n", "const findProcess = require(\"find-process\").default\nconst { getWalletState } = require(\"@business/common\")\nconst { WALLET_STATE_CODE } = require(\"@constants/index.js\")\nconst Logger = require(\"../../utils/linkLogger.js\")\nconst { getNodeState } = require(\"../rgb/node\")\nconst { getServiceConfig } = require(\"./config.js\")\nconst { getServicesState } = require(\"./processManager.js\")\n\n\n\n/**\n * Service status enumeration\n */\nconst ServiceStatus = {\n RUNNING: \"Running\",\n STOPPED: \"Stopped\",\n}\n\nfunction mapWalletStateToServiceStatus(state) {\n if (state >= WALLET_STATE_CODE.NON_EXISTING && state <= WALLET_STATE_CODE.SERVER_ACTIVE) {\n return ServiceStatus.RUNNING\n }\n return ServiceStatus.STOPPED\n}\n\n/**\n * Check Tor process status\n * @returns {Promise<string>} Service status\n */\nasync function checkTorProcess() {\n const logger = new Logger(\"statusChecker\")\n try {\n const servicesState = getServicesState()\n const hasTrackedProcess = servicesState?.tor?.hasProcess\n\n return hasTrackedProcess ? ServiceStatus.RUNNING : ServiceStatus.STOPPED\n }\n catch (error) {\n logger.error(`Error checking tor process: ${error.message}`)\n return ServiceStatus.STOPPED\n }\n}\n\n/**\n * Check Litd process status\n * \u4F7F\u7528 find-process \u4F18\u5148\u68C0\u67E5\u7CFB\u7EDF\u8FDB\u7A0B\uFF0C\u907F\u514D RPC \u8D85\u65F6\u5BFC\u81F4\u8BEF\u5224\n * @returns {Promise<string>} Service status\n */\nasync function checkLitdProcess() {\n const logger = new Logger(\"statusChecker\")\n try {\n // 1. \u4F18\u5148\u68C0\u67E5\u7CFB\u7EDF\u4E2D\u662F\u5426\u6709 litd \u8FDB\u7A0B\n const processList = await findProcess(\"name\", \"litd\")\n if (processList.length > 0) {\n logger.info(`Found litd process(es): ${processList.map(p => p.pid).join(\", \")}`)\n return ServiceStatus.RUNNING\n }\n\n // 2. \u6CA1\u6709\u7CFB\u7EDF\u8FDB\u7A0B\uFF0C\u8FD4\u56DE STOPPED\n return ServiceStatus.STOPPED\n }\n catch (error) {\n logger.warn(`Failed to check litd process: ${error.message}`)\n return ServiceStatus.STOPPED\n }\n}\n\n/**\n * Check RGB process status\n * \u4F7F\u7528 find-process \u4F18\u5148\u68C0\u67E5\u7CFB\u7EDF\u8FDB\u7A0B\uFF0C\u907F\u514D SDK \u8D85\u65F6\u5BFC\u81F4\u8BEF\u5224\n * @returns {Promise<string>} Service status\n */\nasync function checkRgbProcess() {\n const logger = new Logger(\"statusChecker\")\n try {\n // 1. \u4F18\u5148\u68C0\u67E5\u7CFB\u7EDF\u4E2D\u662F\u5426\u6709 rgb-lightning-node \u8FDB\u7A0B\n const processList = await findProcess(\"name\", \"rgb-lightning-node\")\n if (processList.length > 0) {\n logger.info(`Found rgb-lightning-node process(es): ${processList.map(p => p.pid).join(\", \")}`)\n return ServiceStatus.RUNNING\n }\n\n // 2. \u6CA1\u6709\u7CFB\u7EDF\u8FDB\u7A0B\uFF0C\u8FD4\u56DE STOPPED\n return ServiceStatus.STOPPED\n }\n catch (error) {\n logger.warn(`Failed to check rgb process: ${error.message}`)\n return ServiceStatus.STOPPED\n }\n}\n\n/**\n * Check single service process status\n * @param {string} name - Service name\n * @returns {Promise<string>} Service status\n */\nasync function checkProcess(name) {\n const logger = new Logger(\"statusChecker\")\n try {\n const services = getServiceConfig()\n\n if (!services[name]) {\n throw new Error(`${name} does not exist.`)\n }\n\n switch (name) {\n case \"tor\": {\n return await checkTorProcess()\n }\n case \"litd\": {\n return await checkLitdProcess()\n }\n case \"rgb\": {\n return await checkRgbProcess()\n }\n default: {\n // Generic process check using find-process\n const service = services[name]\n const processName = service.command.split(/[\\/\\\\]/).pop().replace(\".exe\", \"\")\n \n const processList = await findProcess(\"name\", processName)\n return processList.length > 0 ? ServiceStatus.RUNNING : ServiceStatus.STOPPED\n }\n }\n }\n catch (error) {\n logger.error(`Error checking ${name} process: ${error.message}`)\n throw error\n }\n}\n\n/**\n * Get status of all services\n * @returns {Promise<Array>} Array of service statuses\n */\nfunction getTerminalStatus(filter = \"\") {\n const services = getServiceConfig()\n const logger = new Logger(\"statusChecker\")\n const shouldInclude = name => name !== \"rgb\" && (!filter || name.includes(filter))\n const filteredServices = Object.keys(services).filter(shouldInclude)\n return Promise.all(\n filteredServices.map(async (name) => {\n try {\n const state = await checkProcess(name)\n return { service_name: name, status: state }\n }\n catch (error) {\n logger.error(`Error checking ${name} status: ${error.message}`)\n return {\n service_name: name,\n status: ServiceStatus.STOPPED,\n error: error.message,\n }\n }\n }),\n )\n}\n\nasync function getRGBStatus() {\n const logger = new Logger(\"statusChecker\")\n try {\n const state = await checkRgbProcess()\n return { service_name: \"rgb\", status: state }\n }\n catch (error) {\n logger.error(`Error checking rgb status: ${error.message}`)\n return {\n service_name: \"rgb\",\n status: ServiceStatus.STOPPED,\n error: error.message,\n }\n }\n}\n\n/**\n * Check if specific service is running\n * @param {string} name - Service name\n * @returns {Promise<boolean>} Whether service is running\n */\nasync function isServiceRunning(name) {\n const logger = new Logger(\"statusChecker\")\n try {\n const status = await checkProcess(name)\n return status === ServiceStatus.RUNNING\n }\n catch (error) {\n logger.error(`Error checking if ${name} is running: ${error.message}`)\n return false\n }\n}\n\n/**\n * Wait for service to reach specified status\n * @param {string} name - Service name\n * @param {string} expectedStatus - Expected status\n * @param {number} timeout - Timeout in milliseconds\n * @param {number} interval - Check interval in milliseconds\n * @returns {Promise<boolean>} Whether expected status was reached\n */\nfunction waitForServiceStatus(name, expectedStatus, timeout = 30000, interval = 1000) {\n const logger = new Logger(\"statusChecker\")\n return new Promise((resolve) => {\n const startTime = Date.now()\n\n const checkStatus = async () => {\n try {\n const status = await checkProcess(name)\n if (status === expectedStatus) {\n resolve(true)\n return\n }\n }\n catch (error) {\n logger.error(`Error waiting for ${name} status: ${error.message}`)\n }\n\n if (Date.now() - startTime >= timeout) {\n logger.warn(`Timeout waiting for ${name} to reach status: ${expectedStatus}`)\n resolve(false)\n return\n }\n\n setTimeout(checkStatus, interval)\n }\n\n checkStatus()\n })\n}\n\nmodule.exports = {\n ServiceStatus,\n checkProcess,\n getRGBStatus,\n getTerminalStatus,\n isServiceRunning,\n waitForServiceStatus,\n}\n", "const { getConfig, reloadConfig } = require(\"@business/common/getConfig.js\")\nconst { TASKS } = require(\"@constants/index.js\")\nconst Logger = require(\"../../utils/linkLogger.js\")\n\nconst { sleep } = require(\"../../utils/timeUtils.js\")\nconst {\n updateMainLnlinkConfig,\n} = require(\"../prisma/dbService.js\")\nconst { reportTaskCompletion } = require(\"../report/reportService.js\")\nconst {\n buildLitdArgs,\n buildTorArgs,\n buildRgbArgs,\n} = require(\"./config.js\")\n\nconst { startService, stopService } = require(\"./processManager.js\")\n\nconst {\n getTerminalStatus,\n isServiceRunning,\n getRGBStatus,\n ServiceStatus,\n} = require(\"./statusChecker.js\")\n\n/**\n * Wait for Litd to reach target status with polling\n * @param {string} targetStatus - Target status to wait for (e.g., ServiceStatus.STOPPED or ServiceStatus.RUNNING)\n * @param {object} options - Polling options\n * @param {number} options.timeoutMs - Maximum time to wait in milliseconds\n * @param {number} options.pollIntervalMs - Polling interval in milliseconds\n * @returns {Promise<{matched: boolean, statuses: Array}>} Result with matched flag and final statuses\n */\nasync function waitForLitdStatus(targetStatus, {\n timeoutMs = 15000,\n pollIntervalMs = 1000,\n} = {}) {\n const logger = new Logger(\"litdService\")\n const deadline = Date.now() + timeoutMs\n let lastStatuses = []\n\n while (true) {\n lastStatuses = await getTerminalStatus(\"litd\")\n const litdStatus = lastStatuses.find(item => item.service_name === \"litd\")?.status\n\n if (litdStatus === targetStatus) {\n logger.info(`Litd reached target status: ${targetStatus}`)\n return { matched: true, statuses: lastStatuses }\n }\n\n const now = Date.now()\n if (now >= deadline) {\n break\n }\n\n const sleepDuration = Math.min(pollIntervalMs, Math.max(0, deadline - now))\n if (sleepDuration > 0) {\n await sleep(sleepDuration)\n }\n }\n\n const lastStatus = lastStatuses.find(item => item.service_name === \"litd\")?.status || \"Unknown\"\n logger.warn(`Timed out waiting for Litd status \"${targetStatus}\". Last observed status: ${lastStatus}`)\n return { matched: false, statuses: lastStatuses }\n}\n\n/**\n * Wait for RGB to reach target status with polling\n * @param {string} targetStatus - Target status to wait for (e.g., ServiceStatus.STOPPED or ServiceStatus.RUNNING)\n * @param {object} options - Polling options\n * @param {number} options.timeoutMs - Maximum time to wait in milliseconds\n * @param {number} options.pollIntervalMs - Polling interval in milliseconds\n * @returns {Promise<{matched: boolean, statuses: Array}>} Result with matched flag and final statuses\n */\nasync function waitForRgbStatus(targetStatus, {\n timeoutMs = 15000,\n pollIntervalMs = 1000,\n} = {}) {\n const logger = new Logger(\"rgbService\")\n const deadline = Date.now() + timeoutMs\n let lastStatuses = null\n\n while (true) {\n lastStatuses = await getRGBStatus()\n const rgbStatus = lastStatuses?.status\n\n if (rgbStatus === targetStatus) {\n logger.info(`RGB reached target status: ${targetStatus}`)\n return { matched: true, statuses: lastStatuses }\n }\n\n const now = Date.now()\n if (now >= deadline) {\n break\n }\n\n const sleepDuration = Math.min(pollIntervalMs, Math.max(0, deadline - now))\n if (sleepDuration > 0) {\n await sleep(sleepDuration)\n }\n }\n\n const lastStatus = lastStatuses?.status || \"Unknown\"\n logger.warn(`Timed out waiting for RGB status \"${targetStatus}\". Last observed status: ${lastStatus}`)\n return { matched: false, statuses: lastStatuses }\n}\n\n/**\n * Start terminal services (Litd and optional Tor)\n * @param {object} options\n * @param {boolean} [options.waitForRunning] Whether to wait until Litd reports RUNNING\n * @returns {Promise<Array>} Array of service statuses\n */\nasync function startTerminal({ waitForRunning = true } = {}) {\n const logger = new Logger(\"litdService\")\n const { LINK_ENABLE_TOR } = getConfig()\n const isStartTor = LINK_ENABLE_TOR === \"true\" || LINK_ENABLE_TOR === true\n\n logger.info(\"Starting terminal services...\")\n\n // Get current status\n const startStatus = await getTerminalStatus()\n const litdStatus = startStatus.find(item => item.service_name === \"litd\")\n const torStatus = startStatus.find(item => item.service_name === \"tor\")\n\n logger.info(`Current status - Litd: ${litdStatus?.status}, Tor: ${torStatus?.status}`)\n\n try {\n // Start Tor (if needed and not running)\n if (isStartTor && torStatus?.status === ServiceStatus.STOPPED) {\n logger.info(\"Starting Tor service...\")\n const torArgs = buildTorArgs()\n await startService(\"tor\", torArgs)\n logger.info(\"Tor service started successfully\")\n }\n\n // Start Litd (if not running)\n if (litdStatus?.status === ServiceStatus.STOPPED) {\n logger.info(\"Starting Litd service...\")\n const litdArgs = buildLitdArgs(isStartTor)\n await startService(\"litd\", litdArgs)\n logger.info(\"Litd service started successfully\")\n }\n\n const endStatus = await getTerminalStatus()\n const litdCurrentStatus = endStatus.find(item => item.service_name === \"litd\")?.status\n\n if (waitForRunning && litdCurrentStatus !== ServiceStatus.RUNNING) {\n logger.info(\"Waiting for Litd to reach running state after start...\")\n const { matched: litdRunning, statuses } = await waitForLitdStatus(ServiceStatus.RUNNING, {\n timeoutMs: 20000,\n pollIntervalMs: 1000,\n })\n\n if (!litdRunning) {\n throw new Error(\"Litd failed to reach RUNNING state after start\")\n }\n\n logger.info(\"Terminal services started and Litd is running\")\n return statuses\n }\n\n logger.info(\"Terminal services started successfully\")\n return endStatus\n }\n catch (error) {\n logger.error(`Failed to start terminal services: ${error.message}`)\n throw error\n }\n}\n\n/**\n * Stop terminal services\n * @param {object} args\n * @param {object} [args.lnlinkUser]\n * @param {boolean} [args.waitForStopped] Whether to wait until Litd reports STOPPED\n * @param {object} [args.waitOptions] Optional overrides for wait timeout/poll interval\n * @returns {Promise<boolean>} Whether successfully stopped\n */\nasync function stopTerminal(args = {}) {\n const logger = new Logger(\"litdService\")\n const {\n lnlinkUser,\n waitForStopped = true,\n waitOptions = {},\n } = args || {}\n\n logger.info(\"Stopping terminal services...\")\n\n try {\n const stopRet = await stopService(\"litd\")\n if (!stopRet) {\n logger.warn(\"stopService returned a falsy result\")\n return false\n }\n\n if (lnlinkUser) {\n reportTaskCompletion({\n nostrAddress: lnlinkUser.npub,\n tag: TASKS.StopTaprootAssetNode,\n })\n }\n\n if (!waitForStopped) {\n logger.info(\"Terminal services stopped (waiting for STOPPED state skipped)\")\n return true\n }\n\n logger.info(\"Waiting for Litd to confirm STOPPED state...\")\n const { matched: litdStopped } = await waitForLitdStatus(ServiceStatus.STOPPED, {\n timeoutMs: 15000,\n pollIntervalMs: 1000,\n ...waitOptions,\n })\n\n if (!litdStopped) {\n throw new Error(\"Litd did not stop within the expected time window\")\n }\n\n logger.info(\"Terminal services stopped successfully and Litd is confirmed STOPPED\")\n return true\n }\n catch (error) {\n logger.error(`Failed to stop terminal services: ${error.message}`)\n throw error\n }\n}\n\n/**\n * Restart terminal services\n * @returns {Promise<Array|boolean>} Array of service statuses or false\n */\nasync function restartTerminal(args = {}) {\n const logger = new Logger(\"litdService\")\n logger.info(\"Restarting terminal services...\")\n\n try {\n // Step 1: Stop Litd (includes wait for STOPPED)\n const stopRet = await stopTerminal({ ...args, waitForStopped: true })\n if (!stopRet) {\n logger.warn(\"Stopping Litd returned a falsy result, aborting restart.\")\n return false\n }\n\n // Step 2: Start Litd (includes wait for RUNNING)\n logger.info(\"Starting Litd...\")\n const startRet = await startTerminal({ waitForRunning: true })\n logger.info(\"Terminal services restarted successfully\")\n return startRet\n }\n catch (error) {\n logger.error(`Failed to restart terminal services: ${error.message}`)\n throw error\n }\n}\n\n/**\n * Configure terminal services (restart to apply new configuration)\n * @param {object} config - Configuration object\n * @returns {Promise<Array|boolean>} Array of service statuses or false\n */\nasync function configTerminal(config = {}) {\n const logger = new Logger(\"litdService\")\n if (Object.keys(config).length === 0) {\n throw new Error(\"config is empty\")\n }\n\n logger.info(\"Applying new configuration...\")\n const startRet = await restartTerminal()\n return startRet\n}\n\n/**\n * Check if services are running healthily\n * @returns {Promise<object>} Health check results\n */\nasync function healthCheck() {\n const logger = new Logger(\"litdService\")\n try {\n const status = await getTerminalStatus()\n const litdRunning = await isServiceRunning(\"litd\")\n const torRunning = await isServiceRunning(\"tor\")\n\n return {\n healthy: litdRunning,\n services: {\n litd: {\n running: litdRunning,\n status: status.find(s => s.service_name === \"litd\")?.status || \"Unknown\",\n },\n tor: {\n running: torRunning,\n status: status.find(s => s.service_name === \"tor\")?.status || \"Unknown\",\n },\n },\n timestamp: new Date().toISOString(),\n }\n }\n catch (error) {\n logger.error(`Health check failed: ${error.message}`)\n return {\n healthy: false,\n error: error.message,\n timestamp: new Date().toISOString(),\n }\n }\n}\n\n/**\n * Start RGB service\n * @returns {Promise<Array>} Array of service statuses\n */\nasync function startRGB(args) {\n const logger = new Logger(\"rgbService\")\n logger.info(\"Starting RGB service...\")\n\n try {\n // Get current status\n const startStatus = await getRGBStatus()\n if (startStatus?.status === ServiceStatus.STOPPED) {\n logger.info(\"RGB service is stopped, starting...\")\n const rgbArgs = buildRgbArgs()\n await startService(\"rgb\", rgbArgs)\n if (args?.lnlinkUser) {\n reportTaskCompletion({\n nostrAddress: args?.lnlinkUser?.npub,\n tag: TASKS.EnableRGBNode,\n })\n }\n logger.info(\"RGB service started successfully\")\n }\n else {\n logger.info(`RGB service is already ${startStatus?.status}`)\n }\n // Get final status\n const endStatus = await getRGBStatus()\n return endStatus\n }\n catch (error) {\n logger.error(`Failed to start RGB service: ${error.message}`)\n throw error\n }\n}\n\n/**\n * Stop RGB service\n * @returns {Promise<boolean>} Whether successfully stopped\n */\nasync function stopRGB(args) {\n const logger = new Logger(\"rgbService\")\n logger.info(\"Stopping RGB service...\")\n const lnlinkUser = args?.lnlinkUser\n\n try {\n const stopRet = await stopService(\"rgb\")\n logger.info(\"RGB service stopped successfully\")\n if (lnlinkUser) {\n reportTaskCompletion({\n nostrAddress: lnlinkUser.npub,\n tag: TASKS.StopRGBNode,\n })\n }\n return stopRet\n }\n catch (error) {\n logger.error(`Failed to stop RGB service: ${error.message}`)\n throw error\n }\n}\n\n/**\n * Restart RGB service\n * @param {object} args - Optional arguments\n * @returns {Promise<Array>} Array of service statuses\n */\nasync function restartRGB(args = {}) {\n const logger = new Logger(\"rgbService\")\n logger.info(\"Restarting RGB service...\")\n\n try {\n // Step 1: Check if RGB is running and stop it\n const startStatus = await getRGBStatus()\n const hasStatusError = Boolean(startStatus?.error)\n const needsStop = startStatus?.status === ServiceStatus.RUNNING || hasStatusError\n\n if (needsStop) {\n logger.info(\n hasStatusError\n ? \"RGB status check failed; forcing stop before restart...\"\n : \"Stopping RGB service...\",\n )\n const stopRet = await stopRGB(args)\n if (!stopRet) {\n logger.warn(\"Stopping RGB returned a falsy result, aborting restart.\")\n return false\n }\n\n // Step 2: Wait and verify RGB has stopped\n logger.info(\"Waiting for RGB to stop...\")\n const { matched: rgbStopped } = await waitForRgbStatus(ServiceStatus.STOPPED, {\n timeoutMs: 15000,\n pollIntervalMs: 1000,\n })\n\n if (!rgbStopped) {\n throw new Error(\"RGB did not stop within the expected time window\")\n }\n }\n\n // Step 3: Start RGB\n logger.info(\"Starting RGB...\")\n const startRet = await startRGB(args)\n const finalRgbStatus = startRet?.status\n\n // Step 4: Verify RGB is running\n if (finalRgbStatus === ServiceStatus.RUNNING) {\n logger.info(\"RGB service restarted successfully\")\n return startRet\n }\n\n // If not immediately running, wait and verify\n logger.info(\"Waiting for RGB to reach running state...\")\n const { matched: rgbRunning, statuses: confirmedStatuses } = await waitForRgbStatus(ServiceStatus.RUNNING, {\n timeoutMs: 20000,\n pollIntervalMs: 1000,\n })\n\n if (!rgbRunning) {\n throw new Error(\"RGB failed to reach RUNNING state after restart\")\n }\n\n logger.info(\"RGB service restarted successfully\")\n return confirmedStatuses\n }\n catch (error) {\n logger.error(`Failed to restart RGB service: ${error.message}`)\n throw error\n }\n}\n\n// updateNodeName\nasync function updateNodeName(args = {}) {\n const logger = new Logger(\"nodeManage\")\n logger.info(\"Updating node name...\")\n try {\n const { node_name: requestedNodeName } = args\n if (!requestedNodeName) {\n throw new Error(\"node_name is required\")\n }\n\n const updateRet = await updateMainLnlinkConfig({ node_name: requestedNodeName })\n if (updateRet !== 1) {\n throw new Error(\"Failed to update node name in DB\")\n }\n\n await reloadConfig()\n const latestConfig = getConfig()\n const resolvedNodeName = latestConfig?.LINK_NAME || requestedNodeName\n\n const litdStatuses = await restartTerminal(args)\n if (!litdStatuses) {\n throw new Error(\"Failed to restart litd after updating node name\")\n }\n const litdStatusEntry = Array.isArray(litdStatuses)\n ? litdStatuses.find(item => item.service_name === \"litd\")\n : null\n const litdStatus = litdStatusEntry?.status || (Array.isArray(litdStatuses) ? \"Unknown\" : litdStatuses?.status || \"Unknown\")\n\n const rgbStatusResult = await restartRGB(args)\n const rgbStatus = Array.isArray(rgbStatusResult)\n ? rgbStatusResult.find(item => item.service_name === \"rgb\")?.status || \"Unknown\"\n : rgbStatusResult?.status || \"Unknown\"\n\n return {\n update_status: updateRet === 1,\n node_name: resolvedNodeName,\n litd_status: litdStatus,\n litd_details: litdStatuses,\n rgb_status: rgbStatus,\n rgb_details: rgbStatusResult,\n }\n }\n catch (error) {\n logger.error(`Failed to update nodename: ${error.message}`)\n throw error\n }\n}\n\n// Register cleanup function for graceful shutdown\nif (globalThis.addCleanupFunction) {\n const logger = new Logger(\"nodeManage\")\n globalThis.addCleanupFunction(async () => {\n logger.info(\"Cleaning up node processes...\")\n try {\n // Stop litd process\n const litdRunning = await isServiceRunning(\"litd\")\n if (litdRunning) {\n await stopService(\"litd\")\n logger.info(\"litd process stopped\")\n }\n\n // Stop tor process\n const torRunning = await isServiceRunning(\"tor\")\n if (torRunning) {\n await stopService(\"tor\")\n logger.info(\"tor process stopped\")\n }\n\n // Stop RGB process\n const rgbRunning = await isServiceRunning(\"rgb\")\n if (rgbRunning) {\n await stopService(\"rgb\")\n logger.info(\"RGB process stopped\")\n }\n }\n catch (error) {\n logger.error(`Error during node cleanup: ${error.message}`)\n }\n })\n}\n\nmodule.exports = {\n // Terminal (Litd + Tor) management\n startTerminal,\n stopTerminal,\n restartTerminal,\n configTerminal,\n getTerminalStatus,\n healthCheck,\n\n // RGB service management\n startRGB,\n stopRGB,\n restartRGB,\n getRGBStatus,\n\n // Export sub-module functionality for direct use\n startService,\n stopService,\n isServiceRunning,\n ServiceStatus,\n updateNodeName,\n}\n", "const { getConfig } = require(\"@business/common/getConfig\")\nconst { getWalletState } = require(\"@business/common/index.js\")\nconst { getMainLnlinkConfig, updateMainLnlinkConfig } = require(\"@business/service/prisma/dbService\")\n\nconst {\n nip19,\n getPublicKey,\n generatePrivateKey,\n} = require(\"nostr-tools\")\nconst { getRGBStatus, getTerminalStatus } = require(\"../nodeManage/index.js\")\n\nasync function initConfig({\n owner,\n settings,\n nodeName,\n}) {\n if (!owner) {\n throw new Error(`ownerNostrAddr is null`)\n }\n if (!/^npub[a-z0-9]{59,}$/.test(owner)) {\n throw new Error(\"owner nostr address format error\")\n }\n const lndConfig = await getMainLnlinkConfig()\n\n if (lndConfig && lndConfig.node_sk && lndConfig.owner_npub) {\n const data = {\n settings,\n }\n if (nodeName) {\n data.node_name = nodeName\n }\n await updateMainLnlinkConfig(data)\n }\n else {\n const sk = generatePrivateKey()\n const pubkey = nip19.npubEncode(getPublicKey(sk))\n const data = {\n owner_npub: owner,\n node_sk: sk,\n node_npub: pubkey,\n settings,\n }\n if (nodeName) {\n data.node_name = nodeName\n }\n await updateMainLnlinkConfig(data)\n }\n\n const ret = await getMainLnlinkConfig()\n return ret\n}\n\nasync function getInfo() {\n const config = getConfig()\n const linkStatus = []\n // Use cached wallet state instead of triggering gRPC call during LND initialization\n\n const walletState = await getWalletState(true) // Get from cache\n\n // Only check terminal status if LND is stable (state 4 = SERVER_ACTIVE)\n if (walletState === 4) {\n const retTerminalStatus = await getTerminalStatus()\n const retRGBStatus = await getRGBStatus()\n const combineStatus = [...new Set([retRGBStatus, ...retTerminalStatus])]\n linkStatus.push(...combineStatus)\n }\n else {\n // During LND initialization, return RGB status and cached litd status\n const retRGBStatus = await getRGBStatus()\n linkStatus.push(retRGBStatus)\n // Add litd status from cache without triggering gRPC check\n // state 0-4: litd is running, state 255 or -1: litd stopped/waiting\n const isLitdRunning = walletState >= 0 && walletState <= 4\n linkStatus.push({\n service_name: \"litd\",\n status: isLitdRunning ? \"Running\" : \"Stopped\",\n })\n }\n\n const ret = await getMainLnlinkConfig()\n return {\n linkName: config?.LINK_NAME,\n owner: config?.LINK_OWNER,\n nodeAddr: config?.LINK_NODE_ADDR,\n relayUri: config?.LINK_RELAY_URI,\n settings: ret?.settings,\n linkStatus,\n }\n}\n\nmodule.exports = {\n initConfig,\n getInfo,\n\n}\n", "const EventEmitter = require(\"node:events\")\n\nconst linkEvent = new EventEmitter()\nmodule.exports = linkEvent\n", "const express = require(\"express\")\n\nconst router = express.Router()\nconst { getConfig, reloadConfig } = require(\"@business/common/getConfig.js\")\nconst {\n getInfo,\n initConfig,\n updateNodeName,\n} = require(\"@business/service/proxy/apiProxy.js\")\nconst {\n sendResponse,\n} = require(\"@business/utils/index\")\n\nconst linkEvent = require(\"@business/utils/linkEvent\")\n\n// Health check endpoint\nrouter.get(\"/health\", async (_, res) => {\n try {\n // Simple health check - return server status\n const healthData = {\n status: \"healthy\",\n timestamp: new Date().toISOString(),\n uptime: process.uptime(),\n memory: process.memoryUsage(),\n }\n\n sendResponse(res, 200, \"Server is healthy\", healthData)\n }\n catch (e) {\n sendResponse(res, 500, \"Server health check failed\", { error: e.message })\n }\n})\nrouter.post(\"/update-name\", async (req, res) => {\n try {\n const { nodeName } = req?.body\n\n const ret = await updateNodeName(nodeName)\n await reloadConfig()\n\n sendResponse(res, 200, \"lnlink node_name update success\", ret)\n }\n catch (e) {\n sendResponse(res, 500, e.message, null)\n }\n})\n\nrouter.post(\"/init\", async (req, res) => {\n try {\n const {\n owner,\n settings,\n nodeName,\n } = req?.body\n\n const ret = await initConfig({\n owner,\n settings,\n nodeName,\n })\n await reloadConfig()\n linkEvent.emit(\"initAccount\")\n linkEvent.emit(\"listenNostrEvent\")\n sendResponse(res, 200, \"lnlink config init success\", ret)\n }\n catch (e) {\n sendResponse(res, 500, e.message, null)\n }\n})\nrouter.get(\"/info\", async (_, res) => {\n try {\n const {\n owner,\n nodeAddr,\n relayUri,\n linkStatus,\n settings,\n } = await getInfo()\n\n const linkStatusObj = {}\n linkStatus.forEach((item) => {\n linkStatusObj[item.service_name] = item.status\n })\n const { LINK_LNFI_NODE_SITE_URL } = getConfig()\n\n sendResponse(res, 200, \"success\", {\n owner,\n nodeAddr,\n relayUri,\n ...linkStatusObj,\n manageUrl: `${LINK_LNFI_NODE_SITE_URL.replace(/\\/#\\/|\\/#|\\/$/, \"\")}/#/?owner=${owner}&npub=${nodeAddr}`,\n settings,\n })\n }\n catch (e) {\n sendResponse(res, 500, e.message, null)\n }\n})\nmodule.exports = router\n", "const { Buffer } = require(\"node:buffer\")\nconst crypto = require(\"node:crypto\")\n\nfunction stringToFixedBytes(str, length) {\n const hash = crypto.createHash(\"sha256\")\n hash.update(str)\n const hashBytes = hash.digest()\n if (length < hashBytes.length) {\n return hashBytes.slice(0, length)\n }\n else if (length > hashBytes.length) {\n const padding = Buffer.alloc(length - hashBytes.length)\n return Buffer.concat([hashBytes, padding])\n }\n return hashBytes\n}\n\nmodule.exports = {\n stringToFixedBytes,\n}\n", "/**\n * BigInt Constants Definition\n * Used for handling large numeric values such as token precision, timestamps, and authorization limits.\n *\n * Note: Token asset precision values can be very large, exceeding standard database INTEGER limits.\n * Prisma's BigInt type can handle arbitrarily large integer values, but for cross-database compatibility (e.g., PostgreSQL),\n * we often store these values as String in the database schema.\n */\n\n// Maximum safe integer value in JavaScript (2^53 - 1)\nconst MAX_SAFE_INTEGER = BigInt(Number.MAX_SAFE_INTEGER) // 9007199254740991\n\n// Maximum value for SQLite INTEGER type (2^63 - 1) - primarily for timestamp scenarios\nconst MAX_SQLITE_INTEGER = BigInt(\"9223372036854775807\")\n\n// Very large numeric constant for token assets\n// Represents approximate maximum supply of Ethereum (10^18 * 10^9 = 10^27, approx 2^89.7)\nconst MAX_TOKEN_AMOUNT = BigInt(\"1000000000000000000000000000\") // 10^27\n\n// Represents an \"unlimited\" authorization limit - uses token-level large numbers\nconst UNLIMITED_AUTH_LIMIT = MAX_TOKEN_AMOUNT\n\n// Represents a \"never expires\" timestamp - uses a realistic future date (not max value)\n// Option 1: A distant but practical future date (UTC 2100-01-01 00:00:00)\nconst NEVER_EXPIRE_2100 = Number(\"4102444800\")\n\n// Option 2: A closer future date (UTC 2050-01-01 00:00:00)\nconst NEVER_EXPIRE_2038 = Number(\"2147483647\")\n\n// Option 3: Use SQLite max value as \"never expires\" (only for timestamps)\nconst NEVER_EXPIRE_MAX = MAX_SQLITE_INTEGER\n\n// Recommended constants (choose based on business requirements)\nconst UNLIMITED_AMOUNT = UNLIMITED_AUTH_LIMIT // For authorization limits, supports token-level large numbers\nconst NEVER_EXPIRE = NEVER_EXPIRE_2038 // For expiration times, uses INT-safe timestamp (2038-01-19)\n\n// Utility functions for BigInt operations // 2038-01-19\nconst BigIntUtils = {\n /**\n * Checks if a value represents an \"unlimited\" authorization limit (supports BigInt and String types).\n */\n isUnlimited: (value) => {\n if (!value)\n return false\n\n // Handle BigInt type\n if (typeof value === \"bigint\") {\n return value === UNLIMITED_AMOUNT || value === MAX_TOKEN_AMOUNT || value === UNLIMITED_AUTH_LIMIT\n }\n\n // Handle String type\n if (typeof value === \"string\") {\n const unlimitedStr = UNLIMITED_AMOUNT.toString()\n const maxTokenStr = MAX_TOKEN_AMOUNT.toString()\n const unlimitedAuthStr = UNLIMITED_AUTH_LIMIT.toString()\n return value === unlimitedStr || value === maxTokenStr || value === unlimitedAuthStr\n }\n\n return false\n },\n\n /**\n * Checks if a value represents a \"never expires\" timestamp (supports BigInt and String types).\n */\n isNeverExpire: (value) => {\n if (!value)\n return false\n\n return value === NEVER_EXPIRE || value === NEVER_EXPIRE_MAX || value === NEVER_EXPIRE_2100 || value === NEVER_EXPIRE_2038\n },\n\n /**\n * Checks if a numeric value is within JavaScript's safe integer range.\n */\n isSafeInteger: (value) => {\n return value <= MAX_SAFE_INTEGER && value >= -MAX_SAFE_INTEGER\n },\n\n /**\n * Converts a BigInt value to a string suitable for database storage.\n */\n toDbString: (value) => {\n if (!value)\n return null\n if (typeof value === \"string\")\n return value\n if (typeof value === \"bigint\")\n return value.toString()\n return String(value)\n },\n\n /**\n * Creates a BigInt from a database string for computations.\n */\n fromDbString: (str) => {\n if (!str)\n return null\n try {\n return BigInt(str)\n }\n catch (e) {\n console.warn(`Failed to convert string to BigInt: ${str} ${e.message}`)\n return null\n }\n },\n\n /**\n * @deprecated Use toDbString instead.\n * Converts a BigInt to a safe string for JSON serialization.\n */\n toSafeString: (value) => {\n return value ? value.toString() : null\n },\n\n /**\n * @deprecated Use fromDbString instead.\n * Creates a BigInt from a string for deserialization.\n */\n fromString: (str) => {\n return str ? BigInt(str) : null\n },\n\n /**\n * Formats a large number into a human-readable string (e.g., 1.5M, 2.3B, 4.7T).\n */\n formatLargeNumber: (value) => {\n if (!value)\n return \"0\"\n\n const num = value.toString()\n const length = num.length\n\n if (length <= 6)\n return num\n if (length <= 9)\n return `${(Number(num) / 1000000).toFixed(1)}M`\n if (length <= 12)\n return `${(Number(num) / 1000000000).toFixed(1)}B`\n if (length <= 15)\n return `${(Number(num) / 1000000000000).toFixed(1)}T`\n\n // For extremely large values, display in scientific notation\n return Number(num).toExponential(2)\n },\n\n /**\n * Creates a token amount BigInt with specified decimals (e.g., for an 18-decimal token).\n */\n createTokenAmount: (amount, decimals = 18) => {\n const multiplier = BigInt(10) ** BigInt(decimals)\n return BigInt(amount) * multiplier\n },\n}\n\nmodule.exports = {\n // Core constants\n MAX_SAFE_INTEGER,\n MAX_SQLITE_INTEGER,\n MAX_TOKEN_AMOUNT,\n\n // Authorization-related constants\n UNLIMITED_AUTH_LIMIT,\n UNLIMITED_AMOUNT,\n\n // Time-related constants\n NEVER_EXPIRE_MAX,\n NEVER_EXPIRE_2100,\n NEVER_EXPIRE_2038,\n NEVER_EXPIRE,\n\n // Utility functions\n BigIntUtils,\n}\n", "const { getMainLnlinkConfig } = require(\"@business/service/prisma/dbService\")\nconst {\n insertLnlinkUser,\n getLNDOwner,\n getFlashRegister,\n getReadOnly,\n} = require(\"@business/service/prisma/dbService.js\")\nconst Logger = require(\"@business/utils/linkLogger.js\")\nconst { stringToFixedBytes } = require(\"@business/utils/lnlink.js\")\nconst {\n UNLIMITED_AMOUNT,\n NEVER_EXPIRE,\n BigIntUtils,\n} = require(\"@constants/bigint.js\")\nconst {\n ACCOUNT_TYPE,\n FLASH_REGISTER_PERMISSIONS,\n OWNER_PERMISSIONS,\n READ_ONLY_PERMISSIONS,\n} = require(\"@constants/index.js\")\nconst dayjs = require(\"dayjs\")\nconst { nip19, getPublicKey } = require(\"nostr-tools\")\n\nasync function initOwner() {\n const logger = new Logger(\"init\")\n try {\n const lndOwner = await getLNDOwner()\n if (!lndOwner) {\n const lnLinkConfig = await getMainLnlinkConfig()\n const name = \"owner\"\n const {\n owner_npub,\n settings,\n node_npub,\n } = lnLinkConfig\n const relay = settings?.nostrRelays ? settings?.nostrRelays?.[0] : null\n\n const ownerRef = await insertLnlinkUser({\n name,\n pubkey: nip19.decode(owner_npub).data,\n sk: null,\n node_pubkey: nip19.decode(node_npub).data,\n relay,\n asset_id: null,\n account_type: ACCOUNT_TYPE.OWNER,\n social_id: null,\n auth_limit: BigIntUtils.toDbString(UNLIMITED_AMOUNT),\n permissions: JSON.stringify(OWNER_PERMISSIONS),\n create_at: dayjs().unix(),\n expire_time: NEVER_EXPIRE,\n parent_pubkey: null,\n })\n\n if (ownerRef) {\n logger.info(`init owner to DB owner ${owner_npub} init success.`)\n }\n }\n }\n catch (e) {\n logger.error(`init owner error: ${e.message}`)\n }\n}\n\nasync function initFlashRegister() {\n const logger = new Logger(\"init\")\n try {\n const lnLinkConfig = await getMainLnlinkConfig()\n const { node_npub, settings } = lnLinkConfig\n const relay = settings?.nostrRelays ? settings?.nostrRelays?.[0] : null\n const sk = stringToFixedBytes(`${node_npub}`).toString(\n \"hex\",\n )\n const pk = getPublicKey(sk)\n const npub = nip19.npubEncode(pk)\n const isFlashRegisterExist = await getFlashRegister()\n if (!isFlashRegisterExist) {\n // init flash register\n const flashRet = await insertLnlinkUser({\n name: \"flash_register\",\n pubkey: pk,\n sk,\n node_pubkey: nip19.decode(node_npub).data,\n relay,\n asset_id: null,\n account_type: ACCOUNT_TYPE.FLASH_REGISTER,\n social_id: null,\n social_type: null,\n auth_limit: \"0\",\n permissions: JSON.stringify(FLASH_REGISTER_PERMISSIONS),\n create_at: dayjs().unix(),\n expire_time: NEVER_EXPIRE,\n parent_pubkey: null,\n })\n if (flashRet) {\n logger.info(`init flash_register to DB flash_register ${npub} init success.`)\n }\n }\n }\n catch (e) {\n logger.error(`init flash_register error: ${e.message}`)\n }\n}\n// init readonly\nasync function initReadOnly() {\n const logger = new Logger(\"init\")\n try {\n const lnLinkConfig = await getMainLnlinkConfig()\n const {\n node_npub,\n settings,\n npub: owner_npub,\n } = lnLinkConfig\n const relay = settings?.nostrRelays ? settings?.nostrRelays?.[0] : null\n const sk = stringToFixedBytes(`${owner_npub}`).toString(\n \"hex\",\n )\n const pk = getPublicKey(sk)\n const npub = nip19.npubEncode(pk)\n\n const isReadonlyExist = await getReadOnly()\n if (!isReadonlyExist) {\n // init readonly\n const readonlyRet = await insertLnlinkUser({\n name: \"readonly\",\n pubkey: pk,\n sk,\n node_pubkey: nip19.decode(node_npub).data,\n relay,\n asset_id: null,\n account_type: ACCOUNT_TYPE.READ_ONLY,\n social_id: null,\n social_type: null,\n auth_limit: \"0\",\n permissions: JSON.stringify(READ_ONLY_PERMISSIONS),\n create_at: dayjs().unix(),\n expire_time: NEVER_EXPIRE,\n parent_pubkey: null,\n })\n if (readonlyRet) {\n logger.info(`init readonly to DB readonly ${npub} init success.`)\n }\n }\n }\n catch (e) {\n logger.error(`init readonly error: ${e.message}`)\n }\n}\n\nasync function initAccount() {\n const lndConfig = await getMainLnlinkConfig()\n if (lndConfig?.owner_npub) {\n await initOwner()\n await initReadOnly()\n await initFlashRegister()\n }\n}\n\nmodule.exports = {\n initAccount,\n}\n", "const timersMap = new Map()\nasync function executeWithRetry(fn, args = [], funcName, delay = 60 * 1000, logger) {\n const retry = async () => {\n try {\n await fn(...args)\n logger.info(`\u2705 Attempt ${funcName} succeeded`)\n }\n catch (e) {\n logger.error(`Attempt ${funcName} failed with: ${e.message}, retrying in ${delay / 1000} seconds`)\n }\n finally {\n setTimeout(retry, delay) // Schedule next call after delay\n }\n }\n retry()\n}\nasync function terminateableRetryExecute(fn, args, taskName, maxRetries = 0, delay = 60 * 1000, logger) {\n if (timersMap.has(taskName)) {\n clearTimeout(timersMap.get(taskName))\n timersMap.delete(taskName)\n }\n const retry = async (attempt = 1) => {\n try {\n Array.isArray(args) ? await fn(...args) : await fn(args)\n logger.info(`\u2705 Attempt ${taskName} succeeded`)\n }\n catch (e) {\n logger.warn(`Attempt ${taskName} failed with: ${e.message}, retrying in ${delay / 1000} seconds`)\n if (maxRetries && attempt >= maxRetries) {\n logger.error(`Attempt ${taskName} failed after ${attempt} attempts`)\n return false\n }\n const timer = setTimeout(() => retry(attempt + 1), delay)\n timersMap.set(taskName, timer)\n }\n }\n retry()\n}\n\nasync function retryUntilSuccess(fn, args, taskName, maxRetries = 10, delay = 1000, logger) {\n return new Promise((resolve, reject) => {\n const retry = async (attempt = 1) => {\n try {\n const ret = await fn(...args)\n if (ret !== undefined) {\n logger.info(`\u2705 Attempt ${taskName} succeeded`)\n resolve(ret)\n return\n }\n throw new Error(`${taskName} returned falsy value`)\n }\n catch (error) {\n logger.warn(`Attempt ${attempt}/${maxRetries} for ${taskName} failed: ${error.message}`)\n\n if (attempt >= maxRetries) {\n logger.error(`\u274C ${taskName} failed after ${maxRetries} attempts`)\n reject(error)\n return\n }\n\n setTimeout(() => {\n retry(attempt + 1).catch(reject)\n }, delay)\n }\n }\n retry(1).catch(reject)\n })\n}\n\nmodule.exports = {\n executeWithRetry,\n terminateableRetryExecute,\n retryUntilSuccess,\n}\n", "{\n \"name\": \"ln-link\",\n \"version\": \"1.0.9-alpha\",\n \"private\": false,\n \"main\": \"dist/index.js\",\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"scripts\": {\n \"build\": \"node build.js && node build.js --mode development --external all --entry electron\",\n \"start:bin\": \"dotenv -e .env.bin -- sh -c \\\"prisma generate && (prisma migrate dev --name auto_update || prisma db push) && node ./scripts/binSetup.js && node ./app.js\\\"\",\n \"start:docker:dev\": \"dotenv -e .env.dev -- docker compose -f ./docker-compose.dev.yml up --build\",\n \"start:dev\": \"dotenv -e .env.dev -- sh -c \\\"prisma generate && (prisma migrate dev --name auto_update || prisma db push) && clinic heapprof -- node ./app.js\\\"\",\n \"start:regtest\": \"docker compose --env-file ./.env.regtest -f ./docker-compose-lnlink.yml up --build\",\n \"start:testnet\": \"docker compose --env-file ./.env.testnet -f ./docker-compose-lnlink.yml up --build\",\n \"start:mainnet\": \"docker compose --env-file ./.env.mainnet -f ./docker-compose-lnlink.yml up --build\",\n \"start:bin:dist\": \"dotenv -e .env.bin -- sh -c \\\"prisma generate && prisma migrate deploy && node ./scripts/binSetup.js && node ./dist/index.js\\\"\",\n \"lint\": \"eslint .\",\n \"lint:fix\": \"eslint . --fix\",\n \"lint:staged\": \"lint-staged\",\n \"preinstall\": \"npx husky\"\n },\n \"_moduleAliases\": {\n \"@api\": \"api\",\n \"@constants\": \"constants\",\n \"@business\": \"business\",\n \"@nostr\": \"nostr\",\n \"@package.json\": \"./package.json\"\n },\n \"dependencies\": {\n \"@grpc/grpc-js\": \"^1.10.8\",\n \"@grpc/proto-loader\": \"^0.7.9\",\n \"@lightsparkdev/lightspark-sdk\": \"^1.8.9\",\n \"@lnfi-network/rgb-api-js-sdk\": \"^1.0.7\",\n \"@prisma/client\": \"6.14.0\",\n \"axios\": \"^1.7.2\",\n \"bitcoin-core\": \"^4.2.0\",\n \"body-parser\": \"^1.20.2\",\n \"cookie-parser\": \"~1.4.4\",\n \"crypto-js\": \"^4.2.0\",\n \"dayjs\": \"^1.11.10\",\n \"debug\": \"~2.6.9\",\n \"decimal.js\": \"^10.4.3\",\n \"ethers\": \"^6.15.0\",\n \"express\": \"^4.18.2\",\n \"express-rate-limit\": \"^8.0.1\",\n \"find-process\": \"^2.0.0\",\n \"form-data\": \"^4.0.2\",\n \"http-errors\": \"~1.6.3\",\n \"jest\": \"^29.6.2\",\n \"long\": \"^5.2.3\",\n \"module-alias\": \"^2.2.3\",\n \"morgan\": \"~1.9.1\",\n \"node-cache\": \"^5.1.2\",\n \"node-cron\": \"^3.0.3\",\n \"nostr-tools\": \"1.17.0\",\n \"pino\": \"^9.9.0\",\n \"pino-pretty\": \"^13.1.1\",\n \"pino-roll\": \"^3.1.0\",\n \"prisma\": \"^6.14.0\",\n \"typescript\": \"^5.7.3\",\n \"ws\": \"^8.18.0\"\n },\n \"lint-staged\": {\n \"*.ts\": [\n \"eslint --fix\",\n \"git add\"\n ],\n \"*.js\": [\n \"eslint --fix\",\n \"git add\"\n ]\n },\n \"devDependencies\": {\n \"@antfu/eslint-config\": \"^4.3.0\",\n \"@commitlint/cli\": \"^19.7.1\",\n \"@commitlint/config-conventional\": \"^19.7.1\",\n \"dotenv-cli\": \"^10.0.0\",\n \"electron-rebuild\": \"^3.2.9\",\n \"esbuild\": \"^0.25.9\",\n \"eslint\": \"^9.20.1\",\n \"husky\": \"^9.1.7\",\n \"lint-staged\": \"^15.4.3\",\n \"nodemon\": \"^3.0.3\",\n \"protobufjs\": \"^7.2.5\"\n },\n \"engines\": {\n \"node\": \">=19.0.0\"\n }\n}", "const { Buffer } = require(\"node:buffer\")\nconst fs = require(\"node:fs\")\nconst path = require(\"node:path\")\nconst { getConfig } = require(\"@business/common/getConfig.js\")\n\nconst {\n getMainLnlinkConfig,\n getLnlinkUser,\n upsertTransactionByFilter,\n} = require(\"@business/service/prisma/dbService\")\n\nconst { retryUntilSuccess } = require(\"@business/utils/executeWithRetry.js\")\n\nconst { ACCOUNT_TYPE, INVOICE_EXPIRY_TIME } = require(\"@constants/index\")\nconst {\n WALLET_STATE_CODE,\n SATS_ID,\n NODE_TYPE,\n TRANSACTION_KIND,\n TRANSACTION_DIRECTION,\n TRANSACTION_ASSET_TYPE,\n TRANSACTION_STATUS,\n} = require(\"@constants/index.js\")\nconst packageJSON = require(\"@package.json\")\nconst {\n nip04,\n getPublicKey,\n} = require(\"nostr-tools\")\nconst {\n getWalletService,\n getWalletState,\n getLightningService,\n checkWalletState,\n checkTprEnabled,\n getOpenedChannelList,\n} = require(\"../common/index.js\")\nconst {\n getConfigFilePath,\n sleep,\n getCacheMacaroon,\n storeEnctryptAdminMacaroon,\n setCacheMacaroon,\n storeEnctryptLoopMacaroon,\n} = require(\"../utils/index.js\")\nconst linkCache = require(\"../utils/linkCache.js\")\n\nconst Logger = require(\"../utils/linkLogger.js\")\n\nconst {\n getTerminalStatus,\n startTerminal,\n} = require(\"./nodeManage\")\n\nconst { getTransactionsByFilter, decryptNostrString } = require(\"./prisma/dbService.js\")\n\nconst exec = require(\"node:child_process\").exec\n\nconst { TASKS } = require(\"@constants/index.js\")\nconst { reportTaskCompletion } = require(\"./report/reportService\")\n\nasync function newAddress(args) {\n const logger = new Logger(\"lnd\")\n const {\n type,\n event_id,\n lnlinkUser,\n } = args\n\n // const { LINK_NETWORK } = getConfig()\n if (type === null || type === undefined) {\n throw new Error(\"type is required\")\n }\n\n const lightningService = getLightningService()\n const address = await lightningService.newAddress({\n type,\n })\n\n if (event_id && lnlinkUser) {\n await upsertTransactionByFilter({\n event_id,\n user_npub: lnlinkUser.npub,\n asset_type: TRANSACTION_ASSET_TYPE.BTC,\n asset_id: SATS_ID,\n asset_amount: \"0\",\n node_type: NODE_TYPE.LITD,\n transaction_kind: TRANSACTION_KIND.ONCHAIN,\n direction: TRANSACTION_DIRECTION.IN,\n target_address: address.address,\n status: TRANSACTION_STATUS.PENDING,\n description: `BTC deposit address generated for ${lnlinkUser.npub}`,\n tx_type: \"deposit\",\n create_at: Math.floor(Date.now() / 1000),\n update_at: Math.floor(Date.now() / 1000),\n }, {\n event_id,\n })\n\n logger.info(`Generated BTC address: ${address.address} for user: ${lnlinkUser.npub}, event: ${event_id}`)\n }\n else {\n logger.info(`Generated BTC address: ${address.address}`)\n }\n\n return address\n}\n\nasync function sendCoins(args) {\n const logger = new Logger(\"lnd\")\n const {\n addr,\n amount,\n sat_per_vbyte,\n send_all,\n withinfo,\n event_id,\n lnlinkUser,\n } = args\n\n const lightningService = getLightningService()\n\n const req = {\n addr,\n }\n if (amount) {\n req.amount = amount\n }\n if (sat_per_vbyte) {\n req.sat_per_vbyte = Number(sat_per_vbyte)\n }\n if (send_all) {\n req.send_all = send_all\n }\n\n const ret = await lightningService.sendCoins(req)\n\n if (ret?.txid && event_id && lnlinkUser) {\n const estimatedAmount = send_all ? \"0\" : amount?.toString() || \"0\" // send_all \u65F6\u91D1\u989D\u672A\u77E5\n await upsertTransactionByFilter({\n event_id,\n user_npub: lnlinkUser.npub,\n asset_type: TRANSACTION_ASSET_TYPE.BTC,\n asset_id: SATS_ID,\n asset_amount: estimatedAmount,\n node_type: NODE_TYPE.LITD,\n transaction_kind: TRANSACTION_KIND.ONCHAIN,\n direction: TRANSACTION_DIRECTION.OUT,\n target_address: addr,\n status: TRANSACTION_STATUS.PENDING,\n description: `BTC withdrawal for ${lnlinkUser.npub} to ${addr}`,\n tx_type: \"withdraw\",\n tx_hash: ret.txid,\n create_at: Math.floor(Date.now() / 1000),\n update_at: Math.floor(Date.now() / 1000),\n\n }, {\n tx_hash: ret.txid,\n })\n\n logger.info(`Created outgoing transaction record: ${ret.txid}, user: ${lnlinkUser.npub}, event: ${event_id}`)\n }\n\n if (withinfo) {\n const nodeinfo = await getNodeInfo()\n ret.nodeInfo = nodeinfo\n }\n return ret\n}\nasync function getClosedChannelList() {\n const lightningService = getLightningService()\n const channelClosedListRet = await lightningService.closedChannels({})\n const list = channelClosedListRet?.channels?.map((channel) => {\n const obj = {\n channelId: channel.chan_id,\n closeTx: channel.closing_tx_hash,\n remotePubkey: channel.remote_pubkey,\n channelPoint: channel.channel_point,\n capacity: channel.capacity,\n close_type: channel.close_type,\n settledBalance: channel.settled_balance,\n open_initiator: channel.open_initiator,\n close_initiator: channel.close_initiator,\n }\n\n return obj\n })\n const channelList = list\n return channelList\n}\n\nfunction covertChannel({ channel }) {\n let tempCustomChannelData = \"\"\n if (channel.custom_channel_data) {\n tempCustomChannelData = JSON.parse(\n Buffer.from(channel.custom_channel_data, \"hex\").toString(\"utf-8\"),\n )\n }\n return {\n channel: {\n ...channel,\n custom_channel_data: tempCustomChannelData,\n },\n }\n}\nasync function getChannelList() {\n const nodeState = await getWalletState(true)\n const logger = new Logger(\"lnd\")\n const { isMacaroonDecrypted } = getCacheMacaroon()\n if (nodeState !== 4 || !isMacaroonDecrypted) {\n return {\n open_channel_list: [],\n pending_channel_list: [],\n closed_channel_list: [],\n }\n }\n const lightningService = getLightningService()\n const rets = await Promise.allSettled([\n getOpenedChannelList(),\n lightningService.pendingChannels({}),\n getClosedChannelList(),\n ])\n const errors = rets\n ?.filter(p => p.status === \"rejected\")\n ?.map(p => p.reason)\n if (errors && errors.length > 0) {\n logger.error(`getChannelList ~ errors:${JSON.stringify(errors)}`)\n }\n const channelList = rets[0].value\n const channelPendingListRet = rets[1].value\n const closedChannelList = rets[2].value\n\n const {\n pending_open_channels,\n pending_closing_channels,\n waiting_close_channels,\n pending_force_closing_channels,\n } = channelPendingListRet\n\n const mapPendingOpenChannels = pending_open_channels?.map(covertChannel)\n const mapPendingClosingChannels\n = pending_closing_channels?.map(covertChannel)\n const mapWaitingCloseChannels = waiting_close_channels?.map(covertChannel)\n const mapPendingForceClosingChannels\n = pending_force_closing_channels?.map(covertChannel)\n const channelPendingList = {\n pending_open_channels: mapPendingOpenChannels,\n pending_closing_channels: mapPendingClosingChannels,\n waiting_close_channels: mapWaitingCloseChannels,\n pending_force_closing_channels: mapPendingForceClosingChannels,\n }\n\n return {\n open_channel_list: channelList,\n pending_channel_list: channelPendingList,\n closed_channel_list: closedChannelList,\n }\n}\n\nasync function getNodeInfo() {\n const {\n LINK_NAME,\n LINK_NETWORK,\n LINK_OWNER,\n LINK_NODE_ADDR,\n } = getConfig()\n\n const currentWalletState = await getWalletState(true)\n\n const terminalStatus = await getTerminalStatus()\n const linkStatusObj = {}\n terminalStatus.forEach((item) => {\n linkStatusObj[item.service_name] = item.status\n })\n\n const logger = new Logger(\"lnd\")\n const timeoutMs = 15_000\n const fallbackCombineInfo = linkCache.get(\"combineNodeInfo\") || {}\n let timeoutId\n\n const timeoutPromise = new Promise((resolve) => {\n timeoutId = setTimeout(() => {\n logger.warn(\"combineNodeInfoAsync timed out after 15s, using cached result if available\")\n resolve({\n fromCache: true,\n data: fallbackCombineInfo,\n })\n }, timeoutMs)\n })\n\n const result = await Promise.race([\n combineNodeInfoAsync(currentWalletState).then(data => ({ fromCache: false, data })),\n timeoutPromise,\n ])\n\n clearTimeout(timeoutId)\n\n const combineInfo = result.data || {}\n\n const version = packageJSON.version\n\n const taprootAssetsEnabled = await checkTprEnabled().catch(() => false)\n\n const readOnlyAccount = await getLnlinkUser({\n account_type: ACCOUNT_TYPE.READ_ONLY,\n })\n\n const uri = combineInfo?.uris?.[0]\n const data = {\n pubkey: combineInfo?.identity_pubkey,\n name: LINK_NAME,\n status: {\n state: currentWalletState,\n ...linkStatusObj,\n },\n owner: LINK_OWNER,\n node_addr: LINK_NODE_ADDR,\n balance: combineInfo?.balance,\n version,\n uri, // \"024a61fd2207563a0c6e1f46eb1e18bf6d1e7b16eeca694a362c7f2c9899f04464@vtardzpdeidswfahct4usr4u2towc7hug3eo7ct5pp3skmlf246ugwyd.onion:9735\"\n host: uri ? uri.split(\"@\")[1] : null,\n peers: combineInfo?.peers,\n network: LINK_NETWORK,\n taproot_assets_enabled: taprootAssetsEnabled,\n read_only_account_sk: readOnlyAccount?.sk,\n }\n return data\n}\n\nasync function decodePayReq({ pay_req }) {\n const lightningService = getLightningService()\n const ret = await lightningService.decodePayReq({\n pay_req,\n })\n return ret\n}\n\nasync function getNodeState() {\n // First check wallet state from cache to avoid interfering with LND initialization\n const cachedWalletState = await getWalletState(true)\n\n // Only query terminal status if LND is stable (state 4 = SERVER_ACTIVE)\n if (cachedWalletState === 4) {\n const terminalStatus = await getTerminalStatus()\n const linkStatusObj = {}\n terminalStatus.forEach((item) => {\n linkStatusObj[item.service_name] = item.status\n })\n return {\n state: cachedWalletState,\n ...linkStatusObj,\n }\n }\n else {\n // During initialization, return cached state without checking terminal status\n // state 0-4: litd is running, state 255 or -1: litd stopped/waiting\n const isLitdRunning = cachedWalletState >= 0 && cachedWalletState <= 4\n return {\n state: cachedWalletState,\n litd: isLitdRunning ? \"Running\" : \"Stopped\",\n }\n }\n}\n\nasync function getPendingChannelList() {\n const lightningService = getLightningService()\n const channelPendingListRet = await lightningService.pendingChannels({})\n return channelPendingListRet\n}\n\nasync function isConnectPeer({ node_pubkey }) {\n const { LINK_NOSTR_NODE_NPUBKEY } = getConfig()\n const NODE_PUBKEY = node_pubkey || LINK_NOSTR_NODE_NPUBKEY\n const lightningService = getLightningService()\n const retListpeers = await lightningService.listPeers({})\n return (\n retListpeers?.peers?.findIndex(peer => peer.pub_key === NODE_PUBKEY) > -1\n )\n}\n\nasync function sendPaymentSync(args) {\n const {\n invoice,\n withinfo,\n outgoing_chan_id = \"\",\n event_id,\n lnlinkUser,\n } = args\n const lightningService = getLightningService()\n const paymentRequest = {\n payment_request: invoice,\n allow_self_payment: true,\n fee_limit: {\n fixed: 1000,\n },\n }\n if (outgoing_chan_id) {\n paymentRequest.outgoing_chan_id = `${outgoing_chan_id}` // deprecated\n paymentRequest.outgoing_chan_ids = [`${outgoing_chan_id}`]\n }\n const ret = await lightningService.sendPaymentSync(paymentRequest)\n\n if (ret?.payment_hash) {\n await sleep(300)\n const decodedPayReq = await lightningService.decodePayReq({\n pay_req: invoice,\n })\n const asset_amount = decodedPayReq?.num_satoshis\n await upsertTransactionByFilter({\n event_id,\n user_npub: lnlinkUser.npub,\n asset_id: SATS_ID,\n asset_amount: `${asset_amount}`,\n asset_type: TRANSACTION_ASSET_TYPE.BTC,\n invoice,\n node_type: NODE_TYPE.LITD,\n transaction_kind: TRANSACTION_KIND.LIGHTNING,\n direction: TRANSACTION_DIRECTION.OUT,\n }, {\n payment_hash: ret.payment_hash,\n })\n }\n if (withinfo) {\n const nodeinfo = await getNodeInfo()\n ret.nodeInfo = nodeinfo\n }\n return ret\n}\nasync function createLnInvoice(args) {\n const {\n memo,\n value,\n event_id,\n lnlinkUser,\n expiry = INVOICE_EXPIRY_TIME[\"10m\"],\n } = args\n\n const lightningService = getLightningService()\n const invoice = await lightningService.addInvoice({\n memo,\n value,\n expiry,\n })\n if (invoice?.payment_request) {\n await sleep(500)\n await upsertTransactionByFilter({\n event_id,\n user_npub: lnlinkUser.npub,\n asset_id: SATS_ID,\n asset_amount: `${value}`,\n asset_type: TRANSACTION_ASSET_TYPE.BTC,\n invoice: invoice?.payment_request,\n node_type: NODE_TYPE.LITD,\n transaction_kind: TRANSACTION_KIND.LIGHTNING,\n direction: TRANSACTION_DIRECTION.IN,\n description: memo,\n add_index: Number.parseInt(invoice?.add_index),\n }, {\n invoice: invoice.payment_request,\n })\n }\n\n return {\n ...invoice,\n }\n}\n\nasync function openChannel(args) {\n const {\n node_pubkey,\n amount,\n sat_per_vbyte,\n fund_max,\n zero_conf_enable,\n withinfo,\n push_sat,\n lnlinkUser,\n } = args\n\n const lightningService = getLightningService()\n\n const { LINK_NOSTR_NODE_NPUBKEY } = getConfig()\n const NODE_PUBKEY = node_pubkey || LINK_NOSTR_NODE_NPUBKEY\n const logger = new Logger(\"lnd\")\n const hadConnect = await isConnectPeer({ node_pubkey: NODE_PUBKEY })\n let ret\n if (!hadConnect) {\n ret = {\n isConnected: false,\n }\n }\n else {\n const request = {\n node_pubkey: NODE_PUBKEY,\n local_funding_amount: amount,\n min_confs: 1,\n }\n if (zero_conf_enable) {\n request.target_conf = 0\n request.zero_conf = true\n request.commitment_type = 3\n request.push_sat = 100000\n }\n if (sat_per_vbyte) {\n request.sat_per_vbyte = sat_per_vbyte\n }\n if (fund_max) {\n request.fund_max = fund_max\n request.local_funding_amount = \"0\"\n }\n if (push_sat) {\n request.push_sat = push_sat\n }\n ret = await lightningService.openChannelSync(request)\n ret.isConnected = true\n logger.info(`openChannelSync ret--->, ${JSON.stringify(request)}, ${JSON.stringify(ret)}`)\n if (lnlinkUser) {\n reportTaskCompletion({\n nostrAddress: lnlinkUser.npub,\n tag: TASKS.CreateBTCChannel,\n })\n }\n }\n\n if (withinfo) {\n const nodeinfo = await getNodeInfo()\n ret.nodeInfo = nodeinfo\n }\n return ret\n}\n\nasync function listPeers() {\n const lightningService = getLightningService()\n const { settings } = await getMainLnlinkConfig()\n const peersResult = await lightningService.listPeers({})\n const peers = peersResult?.peers || []\n const mapPeers = peers.map((peer) => {\n const isLnfiPeer = peer.pub_key === settings?.officialLndPeer\n return {\n pub_key: peer.pub_key,\n alias: isLnfiPeer ? \"Lnfi\" : `${peer.pub_key}@${peer.address}`,\n address: peer.address,\n }\n })\n return mapPeers\n}\nasync function combineNodeInfoAsync(walletState) {\n let retInfo = {}\n const logger = new Logger(\"lnd\")\n try {\n const { isMacaroonDecrypted } = getCacheMacaroon()\n // Use provided walletState instead of querying again to avoid gRPC interference\n let state = walletState\n // logger.info(`LND lndService combineNodeInfoAsync state:${state}`)\n if (state > WALLET_STATE_CODE.UNLOCKED && state !== WALLET_STATE_CODE.WAITING_TO_START) {\n if (!isMacaroonDecrypted) {\n state = WALLET_STATE_CODE.LOCKED\n }\n }\n\n // Only call gRPC methods when LND RPC is active (state >= 3)\n // During state 2->3 transition, gRPC calls can cause LND to crash\n // Once state reaches 3 (RPC_ACTIVE) or 4 (SERVER_ACTIVE), it's safe\n if (\n state >= WALLET_STATE_CODE.RPC_ACTIVE\n && isMacaroonDecrypted && state !== WALLET_STATE_CODE.WAITING_TO_START\n ) {\n const lightningService = getLightningService()\n const { settings } = await getMainLnlinkConfig()\n const ret = await Promise.allSettled([\n lightningService.getInfo(),\n lightningService.walletBalance(),\n lightningService.listPeers({}),\n ])\n\n const [infoResult, balanceResult, peersResult] = ret\n const nodeInfo = infoResult.value\n const balance = balanceResult.value\n const retListpeers = peersResult.value\n const peers = retListpeers?.peers || []\n const mapPeers = peers.map((peer) => {\n const isLnfiPeer = peer.pub_key === settings?.officialLndPeer\n return {\n pub_key: peer.pub_key,\n alias: isLnfiPeer ? \"Lnfi\" : `${peer.pub_key}@${peer.address}`,\n address: peer.address,\n }\n })\n\n logger.info(\n `LND lndService combineNodeInfoAsync peer:${peers.map(item => item.pub_key)}`,\n )\n\n const errors = ret\n ?.filter(p => p.status === \"rejected\")\n ?.map(p => p.reason)\n if (errors && errors.length > 0) {\n logger.error(\n `LND lndService combineNodeInfoAsync errors:${JSON.stringify(errors)}`,\n )\n }\n\n retInfo = {\n identity_pubkey: nodeInfo?.identity_pubkey,\n ...nodeInfo,\n balance,\n peers: mapPeers,\n }\n }\n\n retInfo = {\n ...retInfo,\n state,\n }\n linkCache.set(\"combineNodeInfo\", retInfo)\n return retInfo\n }\n catch (e) {\n logger.warn(`LND lndService combineNodeInfoAsync peer combineNodeInfo warn--->${e.message}`)\n }\n}\n\nasync function getInfo() {\n const lightningService = getLightningService()\n const nodeInfo = await lightningService.getInfo()\n linkCache.set(\"nodeInfo\", nodeInfo)\n return nodeInfo\n}\nasync function getCacheNodeInfo(refresh = true) {\n const logger = new Logger(\"lnd\")\n try {\n const cacheInfo = linkCache.get(\"nodeInfo\")\n if (cacheInfo?.identity_pubkey) {\n if (refresh) {\n getInfo()\n }\n return cacheInfo\n }\n const retInfo = await getInfo()\n return retInfo\n }\n catch (e) {\n logger.error(`LND lndService getCacheInfo err--->${e.message}`)\n }\n}\n\n// async function registerLnd() {\n\n// }\n\n// async function registerNode() {\n// let registerRet = null\n// registerRet = await registerLnd().catch((e) => {\n// logger.warn(`LND lndService registerNode error ${e.message}`)\n// })\n// logger.info(`LND lndService registerNode ${registerRet ? JSON.stringify(registerRet) : \"\"}`)\n// if (!registerRet) {\n// registerRet = {\n// code: 500,\n// message: \"Wallet not ready or locked\",\n// }\n// }\n// return registerRet\n// }\nasync function bakeLoopMacaroon(args) {\n await checkWalletState(WALLET_STATE_CODE.RPC_ACTIVE)\n const { secret, origin_secret } = args\n if (!secret && !origin_secret) {\n throw new Error(\"secret is required.\")\n }\n const password = origin_secret || await decryptNostrString(secret)\n\n const lightningService = getLightningService()\n\n const permissions = [\n { entity: \"uri\", action: \"/looprpc.SwapClient/GetInfo\" },\n { entity: \"uri\", action: \"/looprpc.SwapClient/LoopOut\" },\n { entity: \"uri\", action: \"/looprpc.SwapClient/LoopIn\" },\n { entity: \"uri\", action: \"/looprpc.SwapClient/ListSwaps\" },\n { entity: \"uri\", action: \"/looprpc.SwapClient/SwapInfo\" },\n { entity: \"uri\", action: \"/looprpc.SwapClient/AbandonSwap\" },\n { entity: \"uri\", action: \"/looprpc.SwapClient/Monitor\" },\n { entity: \"uri\", action: \"/looprpc.SwapClient/LoopOutTerms\" },\n { entity: \"uri\", action: \"/looprpc.SwapClient/LoopOutQuote\" },\n { entity: \"uri\", action: \"/looprpc.SwapClient/GetLoopInTerms\" },\n { entity: \"uri\", action: \"/looprpc.SwapClient/GetLoopInQuote\" },\n ]\n const bakeMacaroonRequest = {\n permissions,\n root_key_id: \"18441921392371827000\",\n }\n const bakeMacarnoonRet = await lightningService.bakeMacaroon(\n bakeMacaroonRequest,\n )\n if (bakeMacarnoonRet?.macaroon) {\n const bufferBakeMacaroon = Buffer.from(bakeMacarnoonRet?.macaroon, \"hex\")\n\n storeEnctryptLoopMacaroon(bufferBakeMacaroon, password)\n }\n}\n\nasync function wrapperInitWallet(args) {\n const { walletUnlockerService } = getWalletService()\n const logger = new Logger(\"lnd\")\n const { wallet_password, cipher_seed_mnemonic } = args\n if (!cipher_seed_mnemonic) {\n const genSeedRet = await walletUnlockerService.genSeed({})\n if (genSeedRet?.cipher_seed_mnemonic) {\n const seedMnemonic = genSeedRet?.cipher_seed_mnemonic\n linkCache.set(\"cipherSeedMnemonic\", seedMnemonic)\n }\n }\n else {\n linkCache.set(\"cipherSeedMnemonic\", cipher_seed_mnemonic)\n }\n const seed = linkCache.get(\"cipherSeedMnemonic\")\n if (!seed) {\n throw new Error(\"Get seed error.\")\n }\n\n const { LINK_DEBUG } = getConfig()\n const ret = await walletUnlockerService.initWallet({\n wallet_password: Buffer.from(wallet_password),\n cipher_seed_mnemonic: seed,\n stateless_init: !(LINK_DEBUG === \"true\" || LINK_DEBUG === true),\n })\n logger.info(\n `LND lndService initWallet RPC response ->macaroon length:${ret?.admin_macaroon?.length}`,\n )\n if (ret?.admin_macaroon) {\n storeEnctryptAdminMacaroon(ret?.admin_macaroon, wallet_password)\n }\n return ret\n}\n\nasync function genseed() {\n const { walletUnlockerService } = getWalletService()\n const cacheSeed = linkCache.get(\"cipherSeedMnemonic\")\n if (cacheSeed) {\n return { cipherSeedMnemonic: cacheSeed }\n }\n\n const genSeedRet = await walletUnlockerService.genSeed({})\n\n if (genSeedRet?.cipher_seed_mnemonic) {\n const cipher_seed_mnemonic = genSeedRet?.cipher_seed_mnemonic\n linkCache.set(\"cipherSeedMnemonic\", cipher_seed_mnemonic)\n return { cipherSeedMnemonic: cipher_seed_mnemonic }\n }\n throw new Error(\"Get seed error.\")\n}\nasync function initWallet(args) {\n const {\n password,\n withinfo,\n cipher_seed_mnemonic,\n origin_password,\n lnlinkUser,\n } = args\n if (!password && !origin_password) {\n throw new Error(\"Password is null.\")\n }\n\n let passwordToStr = \"\"\n let seed\n\n if (password) {\n const decodeWalletPassword = await decryptNostrString(password)\n passwordToStr = decodeWalletPassword.toString()\n }\n if (origin_password) {\n passwordToStr = `${origin_password}`\n }\n if (cipher_seed_mnemonic) {\n seed = JSON.parse(await decryptNostrString(cipher_seed_mnemonic))\n }\n\n if (passwordToStr && passwordToStr.length < 8) {\n throw new Error(\"Password length must be at least 8 characters.\")\n }\n const { isMacaroonDecrypted } = getCacheMacaroon()\n\n if (isMacaroonDecrypted) {\n throw new Error(\"You have already initialized.\")\n }\n await wrapperInitWallet({\n wallet_password: passwordToStr,\n cipher_seed_mnemonic: seed,\n })\n linkCache.set(\"tempPassword\", password)\n\n const cipherSeedMnemonic = linkCache.get(\"cipherSeedMnemonic\")\n const ret = {\n message: \"Init wallet success.\",\n cipherSeedMnemonic,\n }\n if (lnlinkUser) {\n reportTaskCompletion({\n nostrAddress: lnlinkUser.npub,\n tag: TASKS.EnableTaprootAssetNode,\n })\n }\n\n if (withinfo) {\n ret.nodeInfo = await getNodeInfo()\n }\n return ret\n}\n\nasync function closeChannel(args) {\n const lightningService = getLightningService()\n const {\n withinfo,\n lnlinkUser,\n ...params\n } = args\n\n const closeRequest = {\n ...params,\n }\n const closeRet = await lightningService.closeChannel(closeRequest)\n if (lnlinkUser) {\n reportTaskCompletion({\n nostrAddress: lnlinkUser.npub,\n tag: TASKS.CloseTaprootChannel,\n })\n }\n if (withinfo) {\n const nodeinfo = await getNodeInfo()\n closeRet.nodeInfo = nodeinfo\n }\n return closeRet\n}\n\nasync function connectPeer(args) {\n const {\n pubkey,\n host,\n perm,\n timeout,\n withinfo,\n } = args\n const logger = new Logger(\"lnd\")\n const { LINK_NOSTR_NODE_NPUBKEY, LINK_NOSTR_NODE_HOST } = getConfig()\n const NODE_PUBKEY = pubkey || LINK_NOSTR_NODE_NPUBKEY\n const HOST = host || LINK_NOSTR_NODE_HOST\n\n const lightningService = getLightningService()\n let ret = false\n const retryMax = 20\n const ifConnected = await isConnectPeer({ node_pubkey: NODE_PUBKEY })\n\n if (ifConnected) {\n ret = {\n isConnected: true,\n }\n }\n else {\n logger.info(\"Lnd lndService connectPeer\")\n await lightningService\n .connectPeer({\n addr: {\n pubkey: NODE_PUBKEY,\n host: HOST,\n },\n perm: perm || false,\n timeout: timeout || 30,\n })\n .catch((e) => {\n logger.error(`Lnd lndService connectPeer error ${e.message}`)\n })\n\n let cur = 0\n while (true) {\n cur++\n if (cur > retryMax) {\n ret = {\n isConnected: false,\n }\n break\n }\n const isConnected = await isConnectPeer({ node_pubkey: NODE_PUBKEY })\n if (isConnected) {\n ret = {\n isConnected: true,\n }\n break\n }\n else {\n await sleep(1000)\n continue\n }\n }\n }\n\n if (withinfo) {\n const nodeinfo = await getNodeInfo()\n ret.nodeInfo = nodeinfo\n }\n return ret\n}\n\nasync function unlock(args) {\n const {\n wallet_password,\n recovery_window,\n withinfo,\n } = args\n\n const { LINK_DEBUG } = getConfig()\n const lndConfig = await getMainLnlinkConfig()\n\n const sk = lndConfig.node_sk\n const from = getPublicKey(getPublicKey(sk))\n\n const password = await nip04.decrypt(sk, from, wallet_password)\n const decodeWalletPassword = password\n const { walletUnlockerService } = getWalletService()\n\n const state = await getWalletState(true)\n if (\n state > WALLET_STATE_CODE.UNLOCKED\n && state < WALLET_STATE_CODE.WAITING_TO_START\n ) {\n setCacheMacaroon(decodeWalletPassword)\n }\n else {\n const unlockArgs = {\n wallet_password: Buffer.from(decodeWalletPassword),\n\n stateless_init: !(LINK_DEBUG === \"true\" || LINK_DEBUG === true),\n }\n if (recovery_window) {\n unlockArgs.recovery_window = Number(recovery_window)\n }\n await walletUnlockerService.unlockWallet(unlockArgs)\n setCacheMacaroon(decodeWalletPassword)\n linkCache.set(\"tempPassword\", wallet_password)\n }\n const ret = {\n msg: \"Unlock success.\",\n }\n if (withinfo) {\n const nodeinfo = await getNodeInfo()\n ret.nodeInfo = nodeinfo\n }\n return ret\n}\n\nasync function unlockForce(args) {\n const { wallet_password, recovery_window } = args\n const { walletUnlockerService } = getWalletService()\n const recovery_window_number = Number(recovery_window) || 2500\n\n const { LINK_DEBUG } = getConfig()\n await walletUnlockerService.unlockWallet({\n wallet_password: Buffer.from(wallet_password),\n recovery_window: recovery_window_number,\n stateless_init: !(LINK_DEBUG === \"true\" || LINK_DEBUG === true),\n })\n\n setCacheMacaroon(wallet_password)\n return {\n msg: \"Unlock success.\",\n }\n}\n\nasync function bakeNode(args) {\n const { withinfo } = args\n const {\n channelBackupPath,\n lndNodeOriginPath,\n targetNodeBackupPath,\n }\n = getConfigFilePath()\n const lightningService = getLightningService()\n const response = await lightningService.exportAllChannelBackups({})\n fs.writeFileSync(\n channelBackupPath,\n response.multi_chan_backup.multi_chan_backup,\n )\n await lightningService.stopDaemon({})\n const dir = path.dirname(lndNodeOriginPath)\n const base = path.basename(lndNodeOriginPath)\n const cmdStr = `cd ${dir} && tar -zcvf ${targetNodeBackupPath} ${base}`\n const promiseTar = new Promise((resolve, reject) => {\n exec(cmdStr, (err) => {\n if (err) {\n reject(err)\n }\n else {\n resolve(\"success.\")\n }\n })\n })\n\n const bakeNodeFile = await promiseTar\n const ret = {\n channelBakeup: \"success.\",\n nodeBackup: bakeNodeFile,\n }\n if (withinfo) {\n await sleep(3000)\n\n const nodeinfo = await getNodeInfo()\n ret.nodeInfo = nodeinfo\n }\n return ret\n}\n\nasync function restoreNode(args) {\n const { withinfo } = args\n const lightningService = getLightningService()\n // const { channelBackupPath } = getConfigFilePath();\n // const channelBackup = fs.readFileSync(channelBackupPath);\n\n // const hex = channelBackup.toString('hex')\n\n /* const response = await lightningService.restoreChannelBackups({\n multi_chan_backup: Buffer.from(hex, 'hex')\n });\n logger.info('response', response) */\n // stop node\n await lightningService.stopDaemon({}).catch((e) => {\n const logger = new Logger(\"lnd\")\n logger.error(`Lnd lndService stopDaemon error ${e?.message}`)\n })\n\n const { basePath, targetNodeBackupPath } = getConfigFilePath()\n\n const cmdStr = `tar -zxvf ${targetNodeBackupPath} -C ${basePath}`\n\n const promiseTar = new Promise((resolve, reject) => {\n exec(cmdStr, (err) => {\n if (err) {\n reject(err)\n }\n else {\n resolve(\"success.\")\n }\n })\n })\n\n const tarRet = await promiseTar\n const ret = {\n // channelRestore: response,\n nodeRestore: tarRet,\n }\n if (withinfo) {\n const nodeinfo = await getNodeInfo()\n ret.nodeInfo = nodeinfo\n }\n return ret\n}\n\nasync function restoreChannels() {\n const lightningService = getLightningService()\n const { channelBackupPath } = getConfigFilePath()\n const channelBackup = fs.readFileSync(channelBackupPath)\n const hex = channelBackup.toString(\"hex\")\n const response = await lightningService.restoreChannelBackups({\n multi_chan_backup: Buffer.from(hex, \"hex\"),\n })\n return {\n channelRestore: response,\n }\n}\n\nasync function signMessage(args) {\n const { msg } = args\n const lightningService = getLightningService()\n const ret = await lightningService.signMessage({\n msg: Buffer.from(`${msg}`),\n })\n return ret\n}\nasync function nstVerifyMessage(args) {\n const { msg, signature } = args\n const lightningService = getLightningService()\n const ret = await lightningService.verifyMessage({\n msg: Buffer.from(`${msg}`),\n signature,\n })\n return ret\n}\n\nasync function getTransactions(args) {\n const {\n node_type, // lnd, litd or rgb\n transaction_kind, // onchain or lightning\n status, // pending, confirmed, failed, canceled, settled, expired\n direction, // in or out\n asset_type, // btc or taproot or rgb\n page_index = 1,\n page_size = 20,\n asset_id,\n } = args\n\n return await getTransactionsByFilter({\n transaction_kind,\n direction: direction ? /out/.test(direction) ? TRANSACTION_DIRECTION.OUT : TRANSACTION_DIRECTION.IN : \"\",\n node_type: node_type ? /litd|lnd/.test(node_type) ? NODE_TYPE.LITD : NODE_TYPE.RGB : \"\",\n asset_type,\n status,\n limit: page_size,\n offset: (page_index - 1) * page_size,\n asset_id,\n })\n}\n\nasync function startLink(args) {\n const { lnlinkUser } = args\n const { LINK_ENABLE_TOR } = getConfig()\n const logger = new Logger(\"lnd\")\n const isStartTor = LINK_ENABLE_TOR\n const ret = {}\n if (lnlinkUser) {\n reportTaskCompletion({\n nostrAddress: lnlinkUser?.npub,\n tag: TASKS.EnableTaprootAssetNode,\n })\n }\n const linkStatus = await startTerminal(isStartTor)\n ret.linkStatus = linkStatus\n const stateRet = await retryUntilSuccess(getWalletState, [false], \"getWalletState\", 10, 3000, logger)\n if (stateRet !== undefined) {\n const nodeinfo = await getNodeInfo()\n ret.nodeInfo = nodeinfo\n }\n return ret\n}\n\nmodule.exports = {\n startLink,\n getWalletState,\n sendPaymentSync,\n createLnInvoice,\n getNodeInfo,\n getNodeState,\n getChannelList,\n getOpenedChannelList,\n getPendingChannelList,\n getClosedChannelList,\n openChannel,\n listPeers,\n decodePayReq,\n // registerNode,\n wrapperInitWallet,\n initWallet,\n genseed,\n isConnectPeer,\n sendCoins,\n closeChannel,\n connectPeer,\n unlock,\n unlockForce,\n bakeNode,\n restoreNode,\n restoreChannels,\n // registerLnd,\n bakeLoopMacaroon,\n signMessage,\n nstVerifyMessage,\n getCacheNodeInfo,\n getTransactions,\n newAddress,\n}\n", "const { Buffer } = require(\"node:buffer\")\nconst { getConfig } = require(\"@business/common/getConfig.js\")\n\nconst {\n WALLET_STATE_CODE,\n SATS_ID,\n NODE_TYPE,\n TRANSACTION_KIND,\n TRANSACTION_DIRECTION,\n TRANSACTION_ASSET_TYPE,\n TRANSACTION_STATUS,\n INVOICE_EXPIRY_TIME,\n} = require(\"@constants/index.js\")\nconst { TASKS } = require(\"@constants/index.js\")\nconst Decimal = require(\"decimal.js\")\nconst {\n getTprService,\n getTapchannelService,\n getLightningService,\n checkWalletState,\n getUniverseService,\n getPriceOracleService,\n isConnectPeer,\n getPayFeeLimit,\n withChecks,\n getOpenedChannelList,\n} = require(\"../common/index.js\")\nconst { storeEnctryptTaprMacaroon, sleep } = require(\"../utils/index.js\")\nconst linkCache = require(\"../utils/linkCache.js\")\nconst Logger = require(\"../utils/linkLogger.js\")\nconst {\n upsertTransactionByFilter,\n decryptNostrString,\n} = require(\"./prisma/dbService.js\")\nconst { reportTaskCompletion } = require(\"./report/reportService\")\nconst TaprootAssetsInstance = require(\"./rpc/taprootAssets/instance.js\")\n// Configuration will be loaded when needed\n\nconst syncUniverse = withChecks(async (args) => {\n const { LINK_UNIVERSE_HOST } = getConfig()\n const {\n universe_host = LINK_UNIVERSE_HOST,\n sync_mode = 1,\n sync_targets,\n } = args\n const universeService = getUniverseService()\n const retSyncUniverse = await universeService.syncUniverse({\n universe_host,\n sync_mode: Number(sync_mode),\n sync_targets,\n })\n return retSyncUniverse\n})\n\nasync function bakeTaprootMacaroon(args) {\n const checkStateRet = await checkWalletState(WALLET_STATE_CODE.SERVER_ACTIVE)\n const logger = new Logger(\"tapd\")\n const { secret, origin_secret } = args\n let enabled = true\n if (!secret && !origin_secret) {\n throw new Error(\"secret is required.\")\n }\n const password = origin_secret || (await decryptNostrString(secret))\n\n if (checkStateRet) {\n const lightningService = getLightningService()\n const permissions = [\n { entity: \"uri\", action: \"/taprpc.TaprootAssets/GetInfo\" },\n { entity: \"uri\", action: \"/taprpc.TaprootAssets/ListBalances\" },\n { entity: \"uri\", action: \"/taprpc.TaprootAssets/NewAddr\" },\n { entity: \"uri\", action: \"/taprpc.TaprootAssets/DecodeAddr\" },\n { entity: \"uri\", action: \"/taprpc.TaprootAssets/SendAsset\" },\n { entity: \"uri\", action: \"/taprpc.TaprootAssets/ListAssets\" },\n { entity: \"uri\", action: \"/taprpc.TaprootAssets/FetchAssetMeta\" },\n { entity: \"uri\", action: \"/taprpc.TaprootAssets/QueryAddrs\" },\n { entity: \"uri\", action: \"/taprpc.TaprootAssets/AddrReceives\" },\n { entity: \"uri\", action: \"/taprpc.TaprootAssets/ListUtxos\" },\n { entity: \"uri\", action: \"/taprpc.TaprootAssets/SubscribeReceiveEvents\" },\n { entity: \"uri\", action: \"/taprpc.TaprootAssets/SubscribeSendEvents\" },\n { entity: \"uri\", action: \"/taprpc.TaprootAssets/ListTransfers\" },\n { entity: \"uri\", action: \"/universerpc.Universe/SyncUniverse\" },\n { entity: \"uri\", action: \"/universerpc.Universe/QueryAssetStats\" },\n { entity: \"uri\", action: \"/universerpc.Universe/Info\" },\n { entity: \"uri\", action: \"/universerpc.Universe/MultiverseRoot\" },\n { entity: \"uri\", action: \"/universerpc.Universe/AssetRoots\" },\n { entity: \"uri\", action: \"/universerpc.Universe/QueryAssetRoots\" },\n { entity: \"uri\", action: \"/universerpc.Universe/DeleteAssetRoot\" },\n { entity: \"uri\", action: \"/universerpc.Universe/AssetLeafKeys\" },\n { entity: \"uri\", action: \"/universerpc.Universe/AssetLeaves\" },\n { entity: \"uri\", action: \"/universerpc.Universe/QueryProof\" },\n { entity: \"uri\", action: \"/universerpc.Universe/InsertProof\" },\n { entity: \"uri\", action: \"/universerpc.Universe/PushProof\" },\n { entity: \"uri\", action: \"/universerpc.Universe/ListFederationServers\" },\n { entity: \"uri\", action: \"/universerpc.Universe/AddFederationServer\" },\n { entity: \"uri\", action: \"/universerpc.Universe/DeleteFederationServer\" },\n { entity: \"uri\", action: \"/universerpc.Universe/UniverseStats\" },\n { entity: \"uri\", action: \"/universerpc.Universe/QueryAssetStats\" },\n { entity: \"uri\", action: \"/universerpc.Universe/QueryEvents\" },\n {\n entity: \"uri\",\n action: \"/tapchannelrpc.TaprootAssetChannels/FundChannel\",\n },\n {\n entity: \"uri\",\n action: \"/tapchannelrpc.TaprootAssetChannels/EncodeCustomRecords\",\n },\n {\n entity: \"uri\",\n action: \"/tapchannelrpc.TaprootAssetChannels/SendPayment\",\n },\n {\n entity: \"uri\",\n action: \"/tapchannelrpc.TaprootAssetChannels/AddInvoice\",\n },\n {\n entity: \"uri\",\n action: \"/tapchannelrpc.TaprootAssetChannels/DecodeAssetPayReq\",\n },\n {\n entity: \"uri\",\n action: \"/priceoraclerpc.PriceOracle/QueryRateTick\",\n },\n ]\n const bakeMacaroonRequest = {\n permissions,\n root_key_id: \"18441921392371827000\",\n allow_external_permissions: true,\n }\n const bakeMacarnoonRet = await lightningService\n .bakeMacaroon(bakeMacaroonRequest)\n .catch((e) => {\n logger.error(`TapdService.bakeMacaroon error:${e.message}`)\n enabled = false\n })\n if (bakeMacarnoonRet?.macaroon) {\n const bufferBakeMacaroon = Buffer.from(bakeMacarnoonRet?.macaroon, \"hex\")\n\n logger.info(\n `TapdService bufferBakeMacaroon length:${bufferBakeMacaroon?.length}`,\n )\n storeEnctryptTaprMacaroon(bufferBakeMacaroon, `${password}`)\n TaprootAssetsInstance.reloadInstance() // reload taproot assets instance\n if (bufferBakeMacaroon.length) {\n enabled = true\n linkCache.del(\"tempPassword\")\n }\n return {\n enabled,\n }\n }\n else {\n enabled = false\n }\n }\n else {\n enabled = false\n linkCache.del(\"tempPassword\")\n }\n return {\n enabled,\n }\n}\nconst getAssetDecimal = withChecks(async (assetId) => {\n const universeService = getUniverseService()\n const cacheAssetDecimal = linkCache.get(\"assetDecimal\") || {}\n if (assetId === SATS_ID) {\n return 0\n }\n if (cacheAssetDecimal[assetId]) {\n return cacheAssetDecimal[assetId]\n }\n const assetRoot = await universeService.queryAssetRoots({\n id: {\n asset_id: Buffer.from(assetId, \"hex\"),\n },\n })\n\n const groupKey = assetRoot?.issuance_root?.id?.group_key\n\n let retDecimal = 0\n if (groupKey) {\n const retLevels = await universeService.assetLeaves({\n group_key: Buffer.from(groupKey, \"hex\"),\n proof_type: 1,\n })\n\n retDecimal\n = retLevels?.leaves?.[0]?.asset?.decimal_display?.decimal_display\n }\n else {\n const retLevels = await universeService.assetLeaves({\n asset_id: Buffer.from(assetId, \"hex\"),\n proof_type: 1,\n })\n retDecimal\n = retLevels?.leaves?.[0]?.asset?.decimal_display?.decimal_display\n }\n cacheAssetDecimal[assetId] = retDecimal\n linkCache.set(\"cacheAssetDecimal\", cacheAssetDecimal)\n\n return retDecimal\n})\n\nconst sendTprAsset = withChecks(async (args) => {\n const tprService = getTprService()\n const logger = new Logger(\"tapd\")\n const {\n tap_addrs,\n event_id,\n lnlinkUser,\n } = args\n\n const sendAssetArgs = {\n tap_addrs,\n }\n\n const retSendAsset = await tprService.sendAsset(sendAssetArgs)\n\n // After a successful send, record the transaction using the authoritative\n // response from the RPC.\n const { transfer } = retSendAsset\n if (transfer && event_id && lnlinkUser) {\n try {\n const tx_hash = transfer.anchor_tx_hash\n ? transfer.anchor_tx_hash.toString(\"hex\")\n : null\n\n // The response contains a list of inputs that were spent from the wallet.\n // We use this as the source of truth for what was sent.\n const inputs = transfer.inputs || []\n if (tx_hash && inputs.length > 0) {\n // Assuming a single asset type is sent per transaction, we can use the\n // first input to identify the asset.\n const asset_id = inputs[0].asset_id.toString(\"hex\")\n\n // Sum up all inputs of the same asset type to get the total amount sent.\n const { amount: asset_amount } = await decodeAddr({ addr: tap_addrs[0] })\n const currentTimestamp = Math.floor(Date.now() / 1000)\n const firstAddr = tap_addrs[0]\n\n const transactionData = {\n event_id,\n user_npub: lnlinkUser.npub,\n asset_type: TRANSACTION_ASSET_TYPE.TAPROOT_ASSET,\n asset_id,\n asset_amount,\n node_type: NODE_TYPE.LITD,\n transaction_kind: TRANSACTION_KIND.ONCHAIN,\n direction: TRANSACTION_DIRECTION.OUT,\n tx_type: \"withdraw\",\n target_address: firstAddr,\n tx_hash,\n status: TRANSACTION_STATUS.PENDING,\n block_height: transfer.anchor_tx_height_hint || 0,\n confirmations: 0,\n fees_paid: transfer.anchor_tx_chain_fees\n ? transfer.anchor_tx_chain_fees.toString()\n : null,\n create_at: currentTimestamp,\n update_at: currentTimestamp,\n description: `Taproot Asset send to ${firstAddr.substring(\n 0,\n 20,\n )}... (${tx_hash.substring(0, 8)}...)`,\n }\n\n const filter = { tx_hash }\n await upsertTransactionByFilter(transactionData, filter)\n\n logger.info(\n `Created send transaction record with tx_hash: ${tx_hash}, user: ${lnlinkUser.npub}, asset: ${asset_id}, amount: ${asset_amount}, event: ${event_id}`,\n )\n reportTaskCompletion({\n nostrAddress: lnlinkUser.npub,\n tag: TASKS.TaprootAssetMainnetWithdraw,\n })\n }\n else {\n logger.warn(`Missing tx_hash or inputs in sendTprAsset response`, {\n transfer,\n })\n }\n }\n catch (error) {\n logger.error(\n `Failed to create send transaction record: ${error.message}`,\n { transfer },\n )\n // Don't throw error here, just log it - the send was successful\n }\n }\n\n return retSendAsset\n})\n\nconst calculateBalanceFromUtxos = withChecks(async () => {\n const logger = new Logger(\"tapd\")\n try {\n const tprService = getTprService()\n let utxos\n try {\n const requestWithScriptType = {\n include_leased: true,\n script_key_type: {\n all_types: true,\n },\n }\n\n utxos = await tprService.listUtxos(requestWithScriptType)\n }\n catch (error) {\n logger.error(\n `TapdService.calculateBalanceFromUtxos error:${error.message}`,\n )\n const fallbackRequest = {\n include_leased: true,\n }\n\n utxos = await tprService.listUtxos(fallbackRequest)\n }\n\n const balanceMap = {}\n\n if (utxos && utxos.managed_utxos) {\n Object.entries(utxos.managed_utxos).forEach(([outpoint, utxo]) => {\n if (utxo.assets && Array.isArray(utxo.assets)) {\n utxo.assets.forEach((asset) => {\n const assetId = asset.asset_genesis?.asset_id\n const amount = new Decimal(asset.amount || 0)\n const scriptKeyType = asset.script_key_type || \"UNKNOWN\"\n const isSpent = asset.is_spent\n const isLeased = !!asset.lease_owner\n\n const isChannelRelated\n = scriptKeyType === \"SCRIPT_KEY_CHANNEL\"\n || scriptKeyType === \"SCRIPT_KEY_CHANNEL_COMMITMENT\"\n || scriptKeyType === \"SCRIPT_KEY_CHANNEL_HTLC\"\n || (scriptKeyType === \"UNKNOWN\" && asset.script_key_has_script_path)\n\n const isPendingState\n = isLeased\n && !isChannelRelated\n && (scriptKeyType === \"UNKNOWN\"\n || scriptKeyType === \"SCRIPT_KEY_PENDING\")\n\n if (assetId) {\n if (!balanceMap[assetId]) {\n balanceMap[assetId] = {\n totalBalance: new Decimal(0),\n availableBalance: new Decimal(0),\n channelBalance: new Decimal(0),\n pendingBalance: new Decimal(0),\n utxos: [],\n scriptKeyTypes: new Set(),\n }\n }\n\n balanceMap[assetId].totalBalance\n = balanceMap[assetId].totalBalance.plus(amount)\n\n if (isChannelRelated) {\n balanceMap[assetId].channelBalance\n = balanceMap[assetId].channelBalance.plus(amount)\n }\n else if (isPendingState) {\n balanceMap[assetId].pendingBalance\n = balanceMap[assetId].pendingBalance.plus(amount)\n }\n else {\n balanceMap[assetId].availableBalance\n = balanceMap[assetId].availableBalance.plus(amount)\n }\n\n balanceMap[assetId].utxos.push({\n outpoint,\n amount: amount.toString(),\n scriptKeyType,\n isSpent,\n isLeased,\n isChannelRelated,\n isPendingState,\n hasScriptPath: asset.script_key_has_script_path,\n })\n balanceMap[assetId].scriptKeyTypes.add(scriptKeyType)\n }\n })\n }\n })\n }\n\n return balanceMap\n }\n catch (error) {\n logger.error(\n `TapdService.calculateBalanceFromUtxos error:${error.message}`,\n )\n return {}\n }\n})\n\nconst listTprBalances = withChecks(async (args) => {\n const tprService = getTprService()\n const { asset_id, include_channel_assets = true } = args\n const logger = new Logger(\"tapd\")\n const request\n = typeof asset_id === \"boolean\"\n ? {\n asset_id,\n\n script_key_type: include_channel_assets\n ? {\n all_types: true,\n }\n : undefined,\n }\n : {\n asset_id: Boolean(asset_id),\n asset_filter: Buffer.from(asset_id, \"hex\"),\n script_key_type: include_channel_assets\n ? {\n all_types: true,\n }\n : undefined,\n }\n\n const retListBalances = await tprService.listBalances(request)\n\n const apiBalances = retListBalances?.asset_balances || {}\n\n if (include_channel_assets) {\n try {\n const utxoBalances = await calculateBalanceFromUtxos()\n\n const combinedBalances = {}\n\n Object.entries(utxoBalances).forEach(([assetId, balanceInfo]) => {\n combinedBalances[assetId] = {\n asset_genesis: {\n asset_id: assetId,\n },\n balance: {\n available: balanceInfo.availableBalance.toString(),\n channel: balanceInfo.channelBalance.toString(),\n pending: balanceInfo.pendingBalance.toString(),\n total: balanceInfo.totalBalance.toString(),\n },\n dataSource: \"utxo-calculated\",\n }\n })\n\n Object.entries(apiBalances).forEach(([assetId, apiBalance]) => {\n if (combinedBalances[assetId]) {\n const apiBalanceValue = new Decimal(apiBalance.balance || 0)\n const utxoTotal = new Decimal(\n combinedBalances[assetId].balance.total,\n )\n\n if (apiBalanceValue.gt(utxoTotal)) {\n const newDeposit = apiBalanceValue.minus(utxoTotal)\n const currentAvailable = new Decimal(\n combinedBalances[assetId].balance.available,\n )\n const currentChannel = new Decimal(\n combinedBalances[assetId].balance.channel,\n )\n const currentPending = new Decimal(\n combinedBalances[assetId].balance.pending,\n )\n\n combinedBalances[assetId].balance.available = currentAvailable\n .plus(newDeposit)\n .toString()\n combinedBalances[assetId].balance.total = currentAvailable\n .plus(newDeposit)\n .plus(currentChannel)\n .plus(currentPending)\n .toString()\n }\n combinedBalances[assetId].dataSource = \"combined\"\n combinedBalances[assetId].apiBalance = apiBalanceValue.toString()\n }\n else {\n const apiBalanceValue = new Decimal(apiBalance.balance || 0)\n\n combinedBalances[assetId] = {\n asset_genesis: {\n asset_id: assetId,\n },\n balance: {\n available: apiBalanceValue.toString(),\n channel: \"0\",\n pending: \"0\",\n total: apiBalanceValue.toString(),\n },\n dataSource: \"api-only\",\n }\n }\n })\n\n return combinedBalances\n }\n catch (error) {\n logger.error(`TapdService.listTprBalances error:${error.message}`)\n\n return apiBalances\n }\n }\n\n return apiBalances\n})\n\nconst getAssetName = withChecks(async (asset_id) => {\n const universeService = getUniverseService()\n const assetInfo = await universeService.queryAssetRoots({\n id: {\n asset_id: Buffer.from(asset_id, \"hex\"),\n },\n })\n\n if (assetInfo?.issuance_root?.asset_name) {\n return assetInfo.issuance_root.asset_name\n }\n})\n\nconst getTprInfo = withChecks(async () => {\n const tprService = getTprService()\n const retGetInfo = await tprService.getInfo()\n return retGetInfo\n})\n\nconst getUniverseInfo = withChecks(async () => {\n const universeService = getUniverseService()\n const retGetInfo = await universeService.info()\n return retGetInfo\n})\n\nconst fundChannel = withChecks(async (args) => {\n const tapChannelService = getTapchannelService()\n\n const {\n asset_amount,\n asset_id,\n fee_rate_sat_per_vbyte,\n push_sat,\n node_pubkey,\n lnlinkUser,\n } = args\n\n const { LINK_NOSTR_NODE_NPUBKEY } = getConfig()\n const NODE_PUBKEY = node_pubkey || LINK_NOSTR_NODE_NPUBKEY\n if (!NODE_PUBKEY) {\n throw new Error(\"NODE_PUBKEY is not set\")\n }\n\n const retIsConnectPeer = await isConnectPeer({ node_pubkey: NODE_PUBKEY })\n if (!retIsConnectPeer) {\n throw new Error(\"Peer not connected\")\n }\n const peerPubkey = Buffer.from(NODE_PUBKEY, \"hex\")\n const fundChannelArgs = {\n asset_amount,\n asset_id: Buffer.from(asset_id, \"hex\"),\n fee_rate_sat_per_vbyte,\n peer_pubkey: peerPubkey,\n }\n if (push_sat) {\n fundChannelArgs.push_sat = push_sat\n }\n const retFundChannel = await tapChannelService.fundChannel(fundChannelArgs)\n if (lnlinkUser) {\n reportTaskCompletion({\n nostrAddress: lnlinkUser.npub,\n tag: TASKS.CreateTaprootAssetChannel,\n })\n }\n return retFundChannel\n})\n// todo: getRemotePubkeyByAssetId\nasync function getRemotePubkeyByChanId(chanId) {\n const openedChannelList = await getOpenedChannelList()\n // eslint-disable-next-line eqeqeq\n const checkedChannel = openedChannelList.find(channel => channel.channel_id == chanId)\n if (checkedChannel) {\n return checkedChannel.remote_pubkey\n }\n return null\n}\n\nconst decodeAssetPayReq = withChecks(async (args) => {\n const tapChannelService = getTapchannelService()\n const { invoice, asset_id } = args\n const retDecodeAssetPayReq = await tapChannelService.decodeAssetPayReq({\n pay_req_string: invoice,\n asset_id: Buffer.from(asset_id, \"hex\"),\n })\n return retDecodeAssetPayReq\n})\n\nconst sendPayment = withChecks(async (args) => {\n const tapChannelService = getTapchannelService()\n const {\n asset_amount,\n asset_id,\n payment_request,\n outgoing_chan_id,\n event_id,\n lnlinkUser,\n } = args\n const remotePubkey = await getRemotePubkeyByChanId(outgoing_chan_id)\n if (!remotePubkey) {\n throw new Error(\"NODE_PUBKEY is not set\")\n }\n const retIsConnectPeer = await isConnectPeer({ node_pubkey: remotePubkey })\n if (!retIsConnectPeer) {\n throw new Error(\"Peer not connected\")\n }\n const peerPubkey = Buffer.from(remotePubkey, \"hex\")\n const fee_limit_sat = await getPayFeeLimit({ invoice: payment_request })\n const paymentRequest = {\n payment_request,\n timeout_seconds: 60 * 2,\n fee_limit_sat,\n allow_self_payment: true,\n }\n\n if (outgoing_chan_id) {\n // paymentRequest.outgoing_chan_ids = [Number(outgoing_chan_id)]\n paymentRequest.outgoing_chan_id = `${outgoing_chan_id}`\n }\n\n const sendParams = {\n asset_amount,\n asset_id: Buffer.from(asset_id, \"hex\"),\n peer_pubkey: peerPubkey,\n payment_request: paymentRequest,\n }\n\n const retSendPayment = await tapChannelService.sendPayment(sendParams)\n const payment_hash = retSendPayment?.payment_result?.payment_hash\n if (payment_hash) {\n await sleep(500)\n const decodedAssetPayReq = await decodeAssetPayReq({ invoice: payment_request, asset_id })\n const amount = decodedAssetPayReq?.asset_amount || asset_amount\n await upsertTransactionByFilter({\n event_id,\n user_npub: lnlinkUser.npub,\n payment_hash,\n asset_id,\n asset_amount: `${amount}`,\n asset_type: TRANSACTION_ASSET_TYPE.TAPROOT_ASSET,\n invoice: payment_request,\n node_type: NODE_TYPE.LITD,\n transaction_kind: TRANSACTION_KIND.LIGHTNING,\n direction: TRANSACTION_DIRECTION.OUT,\n add_index: Number.parseInt(retSendPayment.payment_result.payment_index),\n }, {\n payment_hash,\n })\n if (lnlinkUser) {\n reportTaskCompletion({\n nostrAddress: lnlinkUser.npub,\n tag: TASKS.TaprootAssetChannelWithdraw,\n })\n }\n }\n return retSendPayment\n})\n\nconst queryRateTick = withChecks(async (args) => {\n const priceOracleService = getPriceOracleService()\n const {\n transaction_type, // 0 buy 1 sell\n subject_asset_id,\n subject_asset_mount,\n payment_asset_id = \"0000000000000000000000000000000000000000000000000000000000000000\",\n } = args\n const request = {\n transaction_type,\n subject_asset: {\n asset_id: Buffer.from(subject_asset_id, \"hex\"),\n },\n subject_asset_max_amount: subject_asset_mount,\n payment_asset: {\n asset_id: Buffer.from(payment_asset_id, \"hex\"),\n },\n }\n const retQueryRateTick = await priceOracleService.queryRateTick(request)\n return retQueryRateTick\n})\n\nconst listAssets = withChecks(\n async (args = { page_index: 0, page_size: 20 }) => {\n const { page_index, page_size } = args\n const limit = page_size\n const offset = page_index * page_size\n const universeService = getUniverseService()\n const balances = await listTprBalances({ asset_id: true })\n\n const retListAsset = await universeService.assetRoots({\n offset,\n limit,\n with_amounts_by_id: true,\n })\n const universeRoots = retListAsset.universe_roots || []\n\n const assetsList = Object.entries(universeRoots).map(async ([, value]) => {\n const assetId\n = value.id?.asset_id || Object.keys(value.amounts_by_asset_id)[0]\n\n const decimal = await getAssetDecimal(assetId)\n\n const balanceInfo = balances?.[assetId]?.balance\n const availableBalance = new Decimal(balanceInfo?.available || 0)\n const channelBalance = new Decimal(balanceInfo?.channel || 0)\n const pendingBalance = new Decimal(balanceInfo?.pending || 0)\n const totalBalance = new Decimal(balanceInfo?.total || 0)\n\n return {\n id: assetId,\n asset_name: value?.asset_name,\n decimal,\n balance: availableBalance.toString(),\n balance_details: {\n available: availableBalance.toString(),\n channel: channelBalance.toString(),\n pending: pendingBalance.toString(),\n total: totalBalance.toString(),\n },\n }\n })\n const assetsRet = await Promise.allSettled(assetsList)\n\n const retAssetsList = assetsRet\n .filter(item => item.status === \"fulfilled\")\n .map(item => item.value)\n\n const uniqueAssetsMap = new Map()\n retAssetsList.forEach((asset) => {\n if (!uniqueAssetsMap.has(asset.id)) {\n uniqueAssetsMap.set(asset.id, asset)\n }\n })\n const dedupedAssetsList = Array.from(uniqueAssetsMap.values())\n\n const cacheAssetDecimal = linkCache.get(\"assetDecimal\") || {}\n dedupedAssetsList.forEach((asset) => {\n cacheAssetDecimal[asset.id] = asset.decimal\n })\n\n linkCache.set(\"assetDecimal\", cacheAssetDecimal)\n\n const sortedAssets = dedupedAssetsList.sort((a, b) => {\n const balanceA = new Decimal(a.balance)\n const balanceB = new Decimal(b.balance)\n\n if (!balanceB.equals(balanceA)) {\n return balanceB.minus(balanceA).toNumber()\n }\n\n const nameA = a.asset_name || \"\"\n const nameB = b.asset_name || \"\"\n return nameA.localeCompare(nameB, undefined, { sensitivity: \"base\" })\n })\n\n return sortedAssets\n },\n)\n\nconst newTprAddr = withChecks(async (args) => {\n const tprService = getTprService()\n const logger = new Logger(\"tapd\")\n const {\n asset_id,\n amt,\n event_id,\n lnlinkUser,\n } = args\n\n const assetList = await listAssets({\n page_index: 0,\n page_size: 30,\n })\n const isAssetExist = assetList.find(asset => asset.id === asset_id)\n if (!isAssetExist) {\n throw new Error(\"Asset not exist,wait for sync universe\")\n }\n const retNewAddr = await tprService.newAddr({\n asset_id: Buffer.from(asset_id, \"hex\"),\n amt,\n })\n\n // Pre-store waiting transaction record for Taproot Assets address\n if (retNewAddr && retNewAddr.encoded && event_id && lnlinkUser) {\n try {\n const currentTimestamp = Math.floor(Date.now() / 1000)\n\n // Create waiting transaction record\n const transactionData = {\n event_id,\n user_npub: lnlinkUser.npub,\n asset_type: TRANSACTION_ASSET_TYPE.TAPROOT_ASSET,\n asset_id,\n asset_amount: amt ? amt.toString() : \"0\",\n node_type: NODE_TYPE.LITD,\n transaction_kind: TRANSACTION_KIND.ONCHAIN,\n direction: TRANSACTION_DIRECTION.IN,\n tx_type: \"deposit\",\n target_address: retNewAddr.encoded,\n create_at: currentTimestamp,\n update_at: currentTimestamp,\n description: `Waiting for Taproot Asset deposit to ${retNewAddr.encoded.substring(0, 20)}...`,\n\n // Null fields for onchain waiting records\n tx_hash: null,\n block_height: 0,\n confirmations: 0,\n fees_paid: null,\n invoice: null,\n payment_hash: null,\n preimage: null,\n add_index: null,\n description_hash: null,\n expire_at: null,\n settled_at: null,\n }\n\n // Use target_address as unique identifier for waiting records\n const filter = {\n target_address: retNewAddr.encoded,\n direction: TRANSACTION_DIRECTION.IN,\n node_type: NODE_TYPE.LITD,\n transaction_kind: TRANSACTION_KIND.ONCHAIN,\n }\n await upsertTransactionByFilter(transactionData, filter)\n\n logger.info(`Created waiting transaction record for Taproot address: ${retNewAddr.encoded}, user: ${lnlinkUser.npub}, event: ${event_id}`)\n }\n catch (error) {\n logger.error(`Failed to create waiting transaction record: ${error.message}`)\n // Don't throw error here, just log it - the address generation was successful\n }\n }\n\n return retNewAddr\n})\n\nconst addInvoice = withChecks(async (args) => {\n const tapChannelService = getTapchannelService()\n const {\n asset_amount,\n asset_id,\n chan_id,\n description = \"\",\n description_hash = \"\",\n expiry = INVOICE_EXPIRY_TIME[\"10m\"],\n lnlinkUser,\n event_id,\n } = args\n if (!chan_id) {\n throw new Error(\"chan_id is required\")\n }\n const remotePubkey = await getRemotePubkeyByChanId(chan_id)\n if (!remotePubkey) {\n throw new Error(\"NODE_PUBKEY is not set\")\n }\n const retIsConnectPeer = await isConnectPeer({ node_pubkey: remotePubkey })\n if (!retIsConnectPeer) {\n throw new Error(\"Peer not connected\")\n }\n\n const invoice = await tapChannelService.addInvoice({\n asset_amount,\n asset_id: Buffer.from(asset_id, \"hex\"),\n peer_pubkey: Buffer.from(remotePubkey, \"hex\"),\n invoice_request: {\n memo: description || asset_id,\n expiry,\n description_hash: description_hash\n ? Buffer.from(description_hash, \"hex\")\n : undefined,\n },\n })\n const payment_req = invoice?.invoice_result?.payment_request\n if (payment_req) {\n await sleep(500)\n await upsertTransactionByFilter({\n event_id,\n user_npub: lnlinkUser.npub,\n asset_id,\n asset_amount: `${asset_amount}`,\n asset_type: TRANSACTION_ASSET_TYPE.TAPROOT_ASSET,\n invoice: payment_req,\n node_type: NODE_TYPE.LITD,\n transaction_kind: TRANSACTION_KIND.LIGHTNING,\n direction: TRANSACTION_DIRECTION.IN,\n description,\n add_index: Number.parseInt(invoice.invoice_result.add_index),\n }, {\n invoice: payment_req,\n })\n }\n return invoice\n})\n\nasync function decodeAddr(args) {\n const tprService = getTprService()\n const { addr } = args\n const retDecodeAddr = await tprService.decodeAddr({\n addr,\n })\n return retDecodeAddr\n}\n\nconst listTransfers = withChecks(async () => {\n const tprService = getTprService()\n const response = await tprService.listTransfers({})\n return response.transfers || []\n})\n\nconst addrReceives = withChecks(async (addr) => {\n const tprService = getTprService()\n const response = await tprService.addrReceives({ filter_addr: addr })\n return response.events || []\n})\n\nmodule.exports = {\n bakeTaprootMacaroon,\n newTprAddr,\n decodeAddr,\n listTprBalances,\n listAssets,\n sendTprAsset,\n getTprInfo,\n syncUniverse,\n getUniverseInfo,\n fundChannel,\n addInvoice,\n sendPayment,\n queryRateTick,\n getAssetDecimal,\n getAssetName,\n decodeAssetPayReq,\n calculateBalanceFromUtxos,\n listTransfers,\n addrReceives,\n}\n", "/**\n * Nostr module constants configuration\n */\n\n// Event processing related constants\nconst EVENT_PROCESSING_CONSTANTS = {\n // Error handling\n MAX_CONSECUTIVE_ERRORS: 5,\n ERROR_BACKOFF_TIME: 5000,\n MAX_FATAL_ERRORS: 10,\n MAX_BACKOFF_TIME: 60000, // 60 seconds max backoff\n\n // Timeout settings\n EVENT_PROCESSING_TIMEOUT: 60 * 1000, // 60 seconds\n\n // Concurrent processing settings\n MAX_CONCURRENT_EVENTS: 3, // Maximum concurrent event processing\n CONCURRENT_BATCH_SIZE: 5, // How many events to fetch at once\n\n // Batch processing settings\n BATCH_SIZE: 2,\n\n // Sleep intervals\n NORMAL_SLEEP: 300, // Normal processing interval\n IDLE_SLEEP: 500, // Idle sleep time\n ERROR_SLEEP: 1000, // Sleep time after error\n FATAL_ERROR_SLEEP: 3000, // Sleep time after fatal error\n}\n\n// Connection management related constants\nconst CONNECTION_CONSTANTS = {\n MAX_RECONNECT_ATTEMPTS: 100,\n RECONNECT_DELAY_BASE: 2000, // Base reconnect delay in milliseconds\n MAX_RECONNECT_DELAY: 60000, // Maximum reconnect delay\n LONG_TERM_RECONNECT_DELAY: 300000, // Long-term reconnect delay (5 minutes)\n SUBSCRIPTION_SINCE_OFFSET: 60, // Subscription time offset in seconds\n}\n\n// Ping related constants\nconst PING_CONSTANTS = {\n PING_MESSAGE: \"ping\",\n PING_KIND: 4,\n}\n\n// Supported event kinds\nconst SUPPORTED_EVENT_KINDS = [4, 23194, 24133]\n\n// NWC related constants\nconst NWC_CONSTANTS = {\n INFO_KIND: 13194,\n REQUEST_KIND: 23194,\n RESPONSE_KIND: 23195,\n}\n\n// Event kinds that need encryption\nconst ENCRYPTED_EVENT_KINDS = [4, 23195, 24133]\n\n// Error codes\nconst ERROR_CODES = {\n INVALID_JSON: 400,\n MISSING_METHOD: 400,\n METHOD_NOT_SUPPORTED: 404,\n FORBIDDEN: 403,\n INTERNAL_ERROR: 500,\n}\n\n// Response messages\nconst RESPONSE_MESSAGES = {\n INVALID_JSON: \"Invalid JSON format\",\n MISSING_METHOD: \"Missing method parameter\",\n METHOD_NOT_SUPPORTED: \"Method not supported\",\n READONLY_FORBIDDEN: \"Read-only account cannot execute this method\",\n NOT_ALLOWED: \"You are not allowed to use this service.\",\n SUCCESS: \"success\",\n}\n\n// NWC error types\nconst NWC_ERROR_TYPES = {\n RESTRICTED: \"RESTRICTED\",\n NOT_IMPLEMENTED: \"NOT_IMPLEMENTED\",\n}\n\n// NWC error messages\nconst NWC_ERROR_MESSAGES = {\n ACCOUNT_NOT_AVAILABLE: \"Account not available\",\n NO_PERMISSION: \"No permission\",\n ACCOUNT_NOT_ACTIVE: \"Account not active\",\n ACCOUNT_EXPIRED: \"Account expired\",\n SOCIAL_ID_MISMATCH: \"Social id don't match\",\n METHOD_NOT_SUPPORTED: \"Method not supported\",\n}\n\n// Methods that require special permission checks\nconst PRIVILEGED_METHODS = [\"make_invoice\", \"pay_invoice\"]\n\n// Flash account related methods\nconst FLASH_ACCOUNT_METHODS = [\n \"make_invoice\",\n \"pay_invoice\",\n \"buy_flash_account\",\n \"create_flash_account\",\n]\n\n// Taproot method mapping\nconst TAPROOT_METHOD_MAPPING = {\n get_balance: \"get_taproot_balance\",\n make_invoice: \"make_taproot_invoice\",\n pay_invoice: \"pay_taproot_invoice\",\n}\n\nmodule.exports = {\n EVENT_PROCESSING_CONSTANTS,\n CONNECTION_CONSTANTS,\n PING_CONSTANTS,\n SUPPORTED_EVENT_KINDS,\n NWC_CONSTANTS,\n ENCRYPTED_EVENT_KINDS,\n ERROR_CODES,\n RESPONSE_MESSAGES,\n NWC_ERROR_TYPES,\n NWC_ERROR_MESSAGES,\n PRIVILEGED_METHODS,\n FLASH_ACCOUNT_METHODS,\n TAPROOT_METHOD_MAPPING,\n}\n", "const { getMainLnlinkConfig } = require(\"@business/service/prisma/dbService\")\nconst {\n AccountTokenAuthProvider,\n LightsparkClient,\n} = require(\"@lightsparkdev/lightspark-sdk\")\n\nclass LightsparkClientInstance {\n static instance\n async getInstance() {\n if (!this.instance) {\n const lndConfig = await getMainLnlinkConfig()\n const API_TOKEN_CLIENT_ID = lndConfig.settings.lightspark.client_id\n const API_TOKEN_CLIENT_SECRET = lndConfig.settings.lightspark.client_secret\n\n const client = new LightsparkClient(\n new AccountTokenAuthProvider(\n API_TOKEN_CLIENT_ID,\n API_TOKEN_CLIENT_SECRET,\n ),\n )\n this.instance = client\n }\n return this.instance\n }\n}\n\nmodule.exports = LightsparkClientInstance\n", "const { getMainLnlinkConfig, updateMainLnlinkConfig } = require(\"@business/service/prisma/dbService\")\nconst {\n WithdrawalMode,\n BitcoinNetwork,\n InvoiceType,\n} = require(\"@lightsparkdev/lightspark-sdk\")\nconst Logger = require(\"../utils/linkLogger.js\")\nconst LightsparkClientInstance = require(\"./rpc/lightspark/instance\")\n\nasync function setClientIdAndSecret(args) {\n const logger = new Logger(\"lnd\")\n const {\n client_id,\n node_id,\n client_secret,\n node_password,\n } = args\n if (!client_id || !client_secret) {\n throw new Error(\"client_id and client_secret are required.\")\n }\n\n const lndConfig = await getMainLnlinkConfig()\n const spark_config = {\n client_id,\n client_secret,\n node_id,\n node_password,\n }\n\n await updateMainLnlinkConfig({\n settings: {\n ...lndConfig.settings,\n spark_config,\n },\n })\n try {\n const instance = new LightsparkClientInstance()\n const client = await instance.getInstance()\n const account = await client.getCurrentAccount()\n const accountName = account.name\n\n return {\n connected: true,\n account_name: accountName,\n }\n }\n catch (e) {\n logger.error(`setClientIdAndSecret, ${e?.message}`)\n return {\n connected: false,\n error: \"Could not connect to Lightspark.\",\n }\n }\n}\n\nasync function getLightSparkClient(withSigningKey = false) {\n const instance = new LightsparkClientInstance()\n const client = await instance.getInstance()\n const lndConfig = await getMainLnlinkConfig()\n const NODE_ID = lndConfig.settings.spark_config.node_id\n if (withSigningKey) {\n const NODE_PASSWORD = lndConfig.settings.spark_config.node_password\n await client.loadNodeSigningKey(NODE_ID, {\n password: NODE_PASSWORD,\n })\n }\n return {\n NODE_ID,\n client,\n }\n}\n\nasync function getLightSparkBalance() {\n const { NODE_ID, client } = await getLightSparkClient(false)\n const account = await client.getCurrentAccount()\n const node = await account.getNodes(\n client,\n 1,\n [BitcoinNetwork.REGTEST],\n [NODE_ID],\n )\n const nodeEntityBalance = node?.entities[0]?.balances\n if (nodeEntityBalance) {\n const ownedBalance = Math.floor(\n nodeEntityBalance.ownedBalance.originalValue / 1000,\n )\n const usdValue\n = nodeEntityBalance.ownedBalance.preferredCurrencyValueRounded\n return {\n ownedBalance,\n usdValue,\n }\n }\n return {\n ownedBalance: 0,\n usdValue: 0,\n }\n}\n\nasync function lightsparkAddFunds() {\n const { NODE_ID, client } = await getLightSparkClient(false)\n const fundingAddress = await client.createNodeWalletAddress(NODE_ID)\n return {\n address: fundingAddress,\n }\n}\n\nasync function lightsparkWithdraw(args) {\n const { withdraw_sats_amt } = args\n const { NODE_ID, client } = await getLightSparkClient(true)\n const withdrawal = await client.requestWithdrawal(\n NODE_ID,\n withdraw_sats_amt,\n \"bcrt1qnuyejmm2l4kavspq0jqaw0fv07lg6zv3z9z3te\",\n WithdrawalMode.WALLET_THEN_CHANNELS,\n )\n return withdrawal\n}\n\nasync function lightSparkSend(args) {\n const { invoice } = args\n if (!invoice) {\n throw new Error(\"Payment invoice is required.\")\n }\n const { NODE_ID, client } = await getLightSparkClient(false)\n const payment = await client.payInvoice(NODE_ID, invoice, 50_000)\n return {\n status: payment?.status,\n paymentRequestData: {\n paymentHash: payment?.paymentRequestData?.paymentHash,\n amount: payment?.paymentRequestData?.amount?.originalValue,\n amountUnit: payment?.paymentRequestData?.amount?.originalUnit,\n },\n }\n}\nasync function lightsparkReceive(args) {\n const { sats_amt } = args\n const { NODE_ID, client } = await getLightSparkClient(true)\n const invoice = await client.createInvoice(\n NODE_ID,\n sats_amt,\n \"\",\n InvoiceType.STANDARD,\n )\n return invoice\n}\n\nasync function generateTestWithdrawAddr() {\n return {\n address: \"bcrt1qnuyejmm2l4kavspq0jqaw0fv07lg6zv3z9z3te\",\n }\n}\n\nasync function generateTestSendInvoice(args) {\n const { sats_amt } = args\n const m_sats_amt = sats_amt * 1000\n const { NODE_ID, client } = await getLightSparkClient(true)\n const testInvoice = await client.createTestModeInvoice(\n NODE_ID,\n m_sats_amt,\n \"\",\n InvoiceType.STANDARD,\n )\n return testInvoice\n}\n\nmodule.exports = {\n setClientIdAndSecret,\n getLightSparkBalance,\n lightsparkAddFunds,\n lightsparkWithdraw,\n lightSparkSend,\n lightsparkReceive,\n generateTestWithdrawAddr,\n generateTestSendInvoice,\n}\n", "const { Buffer } = require(\"node:buffer\")\nconst { getConfig } = require(\"@business/common/getConfig.js\")\n\nconst { getMainLnlinkConfig } = require(\"@business/service/prisma/dbService\")\nconst {\n ACCOUNT_TYPE,\n EXPIRE_TIME_MAP,\n AUTH_LIMIT_MAP,\n NWC_PERMISSIONS,\n SATS_ID,\n TASKS,\n} = require(\"@constants/index.js\")\nconst dayjs = require(\"dayjs\")\nconst Decimal = require(\"decimal.js\")\n\nconst {\n nip19,\n getPublicKey,\n generatePrivateKey,\n} = require(\"nostr-tools\")\nconst Logger = require(\"../utils/linkLogger.js\")\nconst { stringToFixedBytes } = require(\"../utils/lnlink.js\")\nconst { getOpenedChannelList } = require(\"./lndService.js\")\nconst {\n getLnlinkUser,\n insertLnlinkUser,\n getLnLinkUserListByPage,\n updateLnlinkUser,\n statLnLinkUserData,\n getAvailableUserSumAuthLimit,\n getTotalAuthLimitByParent,\n} = require(\"./prisma/dbService.js\")\nconst { reportTaskCompletion } = require(\"./report/reportService.js\")\nconst { getAssetDecimal } = require(\"./tapdService.js\")\n// Configuration will be loaded when needed\n\nasync function getLnlinkInfo(args) {\n const permissions = NWC_PERMISSIONS\n const auth_limit = Object.keys(AUTH_LIMIT_MAP)\n const expire_time = Object.keys(EXPIRE_TIME_MAP)\n const { total_auth_budget, budget_spent } = await statLnLinkUserData()\n let link_info = {}\n const { pubkey } = args\n if (pubkey) {\n link_info = await getLnlinkUser({ pubkey, include_expired: true })\n }\n return {\n permissions,\n auth_limit,\n expire_time,\n link_info,\n total_auth_budget,\n budget_spent,\n }\n}\n\nasync function getNodeOwnerBalanceByAssetId(assetId) {\n const sumAuthLimit = await getAvailableUserSumAuthLimit(assetId)\n const listChannels = await getOpenedChannelList()\n\n if (assetId === SATS_ID) {\n const satsChannels = listChannels.filter(\n item =>\n item.active === true && item.commitment_type?.indexOf(\"TAPROOT\") === -1,\n )\n const satsBalance = satsChannels.reduce((total, item) => {\n const totalBalance = new Decimal(total)\n .plus(item.local_balance)\n .minus(item.local_chan_reserve_sat)\n .toNumber()\n return totalBalance\n }, 0)\n\n return {\n ownerBalance: new Decimal(satsBalance).minus(sumAuthLimit).toNumber(),\n }\n }\n\n if (assetId !== SATS_ID) {\n const tprChannels = listChannels.map((item) => {\n if (item.active) {\n if (\n item?.custom_channel_data?.assets?.[0]?.asset_utxo?.asset_genesis\n ?.asset_id === assetId\n ) {\n const customChannel = item?.custom_channel_data?.assets?.[0]\n return {\n ...customChannel,\n }\n }\n }\n return {\n local_balance: 0,\n }\n })\n const assetBalance = tprChannels.reduce((total, item) => {\n total = new Decimal(total).plus(item.local_balance).toNumber()\n return total\n }, 0)\n\n return {\n ownerBalance: new Decimal(assetBalance).minus(sumAuthLimit).toNumber(),\n }\n }\n}\n\nasync function isEnoughBalance(assetId, formatAuthLimit, parent_pubkey) {\n if (!parent_pubkey) {\n let channelsBalance = 0\n const listChannels = await getOpenedChannelList()\n const usedAmount = await getAvailableUserSumAuthLimit(assetId)\n if (assetId === SATS_ID) {\n const satsChannels = listChannels.filter(\n item =>\n item.active === true\n && item.commitment_type?.indexOf(\"TAPROOT\") === -1,\n )\n channelsBalance = satsChannels.reduce((total, item) => {\n const totalBalance = new Decimal(total)\n .plus(item.local_balance)\n .minus(item.local_chan_reserve_sat)\n .toNumber()\n return totalBalance\n }, 0)\n }\n if (assetId !== SATS_ID) {\n const tprChannels = listChannels.map((item) => {\n if (item.active) {\n const asset_genesis = item?.custom_channel_data?.assets?.[0]?.asset_utxo?.asset_genesis || item?.custom_channel_data?.funding_assets?.[0]?.asset_genesis\n const custom_channel_asset_id = asset_genesis?.asset_id\n if (\n custom_channel_asset_id === assetId\n ) {\n const customChannel = item?.custom_channel_data?.assets?.[0] || item?.custom_channel_data\n return {\n ...customChannel,\n }\n }\n }\n return {\n local_balance: 0,\n }\n })\n\n channelsBalance = tprChannels.reduce((total, item) => {\n const sum_total = new Decimal(total)\n .plus(item.local_balance)\n .toNumber()\n return sum_total\n }, 0)\n }\n const n = new Decimal(usedAmount).plus(formatAuthLimit).toNumber()\n\n return new Decimal(channelsBalance).gte(n)\n }\n else {\n const parent = await getLnlinkUser({\n pubkey: parent_pubkey,\n asset_id: assetId,\n })\n const parentAuthLimit = parent?.auth_limit || 0\n const usedAmount\n = (await getTotalAuthLimitByParent({ parent_pubkey, asset_id: assetId })\n ?.total) || 0\n\n const n = new Decimal(usedAmount).plus(formatAuthLimit).toNumber()\n\n return new Decimal(parentAuthLimit).gt(n)\n }\n}\n\nasync function generateLnlink(args) {\n const {\n permissions = [],\n account_type,\n social_id,\n auth_limit,\n decimal_auth_limit,\n expire_time,\n name,\n asset_id,\n parent_pubkey,\n social_type,\n lnlinkUser,\n } = args\n if (Number(account_type) === ACCOUNT_TYPE.FLASH && !social_id) {\n throw new Error(\"SocialId is required for flash account\")\n }\n const lndConfig = await getMainLnlinkConfig()\n\n const { node_npub } = lndConfig\n\n const decimal = asset_id === SATS_ID ? 0 : await getAssetDecimal(asset_id)\n\n const format_auth_limit = decimal_auth_limit || new Decimal(auth_limit).mul(10 ** decimal).toString()\n\n const isEnough = await isEnoughBalance(\n asset_id,\n format_auth_limit,\n parent_pubkey,\n )\n if (!isEnough) {\n throw new Error(\"Available balance is not enough\")\n }\n const p = nip19.decode(node_npub).data\n const { LINK_NOSTR_RELAY_URI } = getConfig()\n const relay = LINK_NOSTR_RELAY_URI?.[0]\n const skSalt = `${social_id}${name}${node_npub}${dayjs().unix()}`\n const skBuffer = stringToFixedBytes(skSalt, 32)\n const sk\n = Number(account_type) === ACCOUNT_TYPE.NWC\n ? generatePrivateKey()\n : Buffer.from(skBuffer).toString(\"hex\")\n const pubkey = getPublicKey(sk)\n\n const generateParams = {\n name,\n pubkey,\n npub: nip19.npubEncode(pubkey),\n sk,\n relay,\n node_npub,\n node_pubkey: p,\n account_type: Number(account_type),\n asset_id: !asset_id ? SATS_ID : asset_id,\n social_id,\n social_type,\n auth_limit: format_auth_limit,\n permissions: JSON.stringify(permissions),\n create_at: dayjs().unix(),\n expire_time,\n parent_pubkey,\n }\n const logger = new Logger(\"nwc\")\n const retInsert = await insertLnlinkUser(generateParams).catch((e) => {\n logger.info(`NWC: Get nwc error ${e.message}`)\n throw new Error(`Get nwc error ${e.message}`)\n })\n\n if (retInsert !== 1) {\n throw new Error(\"Get nwc error\")\n }\n else {\n logger.info(\"NWC: generateLnlink success\")\n if (lnlinkUser && social_id) {\n reportTaskCompletion({\n nostrAddress: lnlinkUser.npub,\n tag: TASKS.CreateZapperEVMAccount,\n })\n }\n const { LINK_FLASH_SITE_BASE_URL } = getConfig()\n const connect_str = `nostr+walletconnect://${p}?relay=${relay}&secret=${sk}`\n return {\n pubkey,\n connect_str,\n flash_account_url: `${LINK_FLASH_SITE_BASE_URL}?lnlink=${connect_str}`,\n }\n }\n}\nasync function getLnlinkUserList(args) {\n const {\n page = 1,\n page_size = 20,\n type,\n only_runing = false,\n parent_pubkey,\n search = \"\",\n } = args\n const { LINK_NOSTR_RELAY_URI, LINK_FLASH_SITE_BASE_URL } = getConfig()\n const ret = await getLnLinkUserListByPage({\n page,\n pageSize: page_size,\n type,\n onlyRuning: only_runing,\n parent_pubkey,\n search,\n })\n\n const mapUserList = ret?.list?.map((item) => {\n const temItem = { ...item }\n if (Number(item.account_type) === ACCOUNT_TYPE.FLASH) {\n temItem.connect_str = `nostr+walletconnect://${item.node_pubkey}?relay=${LINK_NOSTR_RELAY_URI?.[0]}&secret=${item.sk}`\n temItem.flash_account_url = `${LINK_FLASH_SITE_BASE_URL}?lnlink=${temItem.connect_str}`\n }\n return temItem\n })\n ret.list = mapUserList\n // const { total_auth_budget, budget_spent } = await statLnLinkUserData()\n return {\n ...ret,\n // total_auth_budget,\n // budget_spent,\n }\n}\nasync function updateLnlinkUserStatus(args) {\n const {\n id,\n status,\n page = 1,\n page_size = 20,\n type,\n only_runing = false,\n parent_pubkey,\n search = \"\",\n } = args\n const updateRet = await updateLnlinkUser({ id, status })\n const ret = { success: updateRet === 1 }\n const retList = await getLnLinkUserListByPage({\n page,\n page_size,\n type,\n onlyRuning: only_runing,\n parent_pubkey,\n search,\n })\n const { LINK_NOSTR_RELAY_URI, LINK_FLASH_SITE_BASE_URL } = getConfig()\n const mapUserList = retList?.list?.map((item) => {\n const temItem = { ...item }\n if (Number(item.account_type) === ACCOUNT_TYPE.FLASH) {\n temItem.connect_str = `nostr+walletconnect://${item.node_pubkey}?relay=${LINK_NOSTR_RELAY_URI?.[0]}&secret=${item.sk}`\n temItem.flash_account_url = `${LINK_FLASH_SITE_BASE_URL}?lnlink=${temItem.connect_str}`\n }\n return temItem\n })\n retList.list = mapUserList\n return {\n ...ret,\n ...retList,\n }\n}\nmodule.exports = {\n generateLnlink,\n getLnlinkInfo,\n getLnlinkUserList,\n updateLnlinkUserStatus,\n getNodeOwnerBalanceByAssetId,\n}\n", "const { WALLET_STATE_CODE } = require(\"@constants/index.js\")\nconst { getLightningService, checkWalletState } = require(\"../../common/index.js\")\n\n// const { sendMsgToAgent } = require(\"../aiService.js\")\n\nconst {\n getLightSparkBalance,\n lightsparkAddFunds,\n lightsparkWithdraw,\n lightSparkSend,\n lightsparkReceive,\n generateTestSendInvoice,\n} = require(\"../lightsparkService.js\")\n\nconst {\n createLnInvoice,\n sendPaymentSync,\n getNodeInfo,\n getNodeState,\n getChannelList,\n openChannel,\n genseed,\n initWallet,\n sendCoins,\n closeChannel,\n listPeers,\n connectPeer,\n unlock,\n bakeNode,\n signMessage,\n decodePayReq,\n nstVerifyMessage,\n getTransactions,\n newAddress,\n startLink,\n} = require(\"../lndService.js\")\n\nconst {\n getTerminalStatus,\n configTerminal,\n stopTerminal,\n restartTerminal,\n updateNodeName,\n} = require(\"../nodeManage/index.js\")\n\nconst {\n generateLnlink,\n getLnlinkInfo,\n getLnlinkUserList,\n updateLnlinkUserStatus,\n} = require(\"../nwcService.js\")\n\n// taprootassets\nconst {\n newTprAddr,\n decodeAddr,\n listAssets,\n bakeTaprootMacaroon,\n sendTprAsset,\n syncUniverse,\n fundChannel,\n addInvoice: addTprInvoice,\n sendPayment: sendTprPayment,\n queryRateTick,\n decodeAssetPayReq,\n} = require(\"../tapdService.js\")\n\nfunction withCheckWallet(method, expectState) {\n return async (...args) => {\n await checkWalletState(expectState)\n return await method(...args)\n }\n}\n\nfunction lndProxy() {\n return {\n // -----node\n get_info: async () => {\n return {\n method: getNodeInfo,\n argNames: [],\n readonly: true,\n }\n },\n get_state: async () => {\n return {\n method: getNodeState,\n argNames: [],\n readonly: true,\n }\n },\n genseed: withCheckWallet(() => {\n return {\n method: genseed,\n argNames: [],\n readonly: false,\n }\n }, WALLET_STATE_CODE.NON_EXISTING),\n init_wallet: withCheckWallet(() => {\n return {\n method: initWallet,\n argNames: [\"password\", \"withinfo\", \"cipher_seed_mnemonic\"],\n readonly: false,\n }\n }, WALLET_STATE_CODE.NON_EXISTING),\n unlock: async () => {\n return {\n method: unlock,\n argNames: [\"wallet_password\"],\n readonly: false,\n }\n },\n send_coins: withCheckWallet (() => {\n return {\n method: sendCoins,\n argNames: [\"addr\", \"amount\", \"sat_per_vbyte\", \"send_all\"],\n readonly: false,\n }\n }, WALLET_STATE_CODE.SERVER_ACTIVE),\n sign_message: withCheckWallet(() => {\n return {\n method: signMessage,\n argNames: [\"msg\"],\n readonly: false,\n }\n }, [WALLET_STATE_CODE.RPC_ACTIVE, WALLET_STATE_CODE.SERVER_ACTIVE]),\n verify_message: withCheckWallet(() => {\n return {\n method: nstVerifyMessage,\n argNames: [\"msg\", \"signature\"],\n readonly: false,\n }\n }, [WALLET_STATE_CODE.RPC_ACTIVE, WALLET_STATE_CODE.SERVER_ACTIVE]),\n bake_node: async () => {\n return {\n method: bakeNode,\n argNames: [],\n readonly: false,\n }\n },\n list_peers: withCheckWallet(() => {\n return {\n method: listPeers,\n argNames: [],\n readonly: true,\n }\n }, WALLET_STATE_CODE.SERVER_ACTIVE),\n wallet_balance: withCheckWallet(() => {\n return {\n method: getLightningService().walletBalance,\n argNames: [],\n readonly: true,\n }\n }, [WALLET_STATE_CODE.RPC_ACTIVE, WALLET_STATE_CODE.SERVER_ACTIVE]),\n new_address: withCheckWallet(() => {\n return {\n method: newAddress,\n argNames: [\"type\"],\n readonly: true,\n }\n }, WALLET_STATE_CODE.SERVER_ACTIVE),\n decode_addr: withCheckWallet(() => {\n return {\n method: decodeAddr,\n argNames: [\"addr\"],\n readonly: false,\n }\n }, WALLET_STATE_CODE.SERVER_ACTIVE),\n\n stop_litd: async () => {\n return {\n method: stopTerminal,\n argNames: [],\n readonly: false,\n }\n },\n restart_litd: async () => {\n return {\n method: restartTerminal,\n argNames: [],\n readonly: false,\n }\n },\n // -------channel\n add_invoice: withCheckWallet(() => {\n return {\n method: getLightningService().addInvoice,\n argNames: [\"invoice\"],\n readonly: false,\n }\n }, WALLET_STATE_CODE.SERVER_ACTIVE),\n decode_pay_req: withCheckWallet(() => {\n return {\n method: decodePayReq,\n argNames: [\"pay_req\"],\n readonly: true,\n }\n }, [WALLET_STATE_CODE.RPC_ACTIVE, WALLET_STATE_CODE.SERVER_ACTIVE]),\n send_payment: withCheckWallet(() => {\n return {\n method: getLightningService().sendPaymentSync,\n argNames: [\"payment_request\"],\n readonly: false,\n }\n }, WALLET_STATE_CODE.SERVER_ACTIVE),\n list_channels: withCheckWallet(() => {\n return {\n method: getChannelList,\n argNames: [],\n readonly: true,\n }\n }, [WALLET_STATE_CODE.RPC_ACTIVE, WALLET_STATE_CODE.SERVER_ACTIVE]),\n open_channel: withCheckWallet(() => {\n return {\n method: openChannel,\n argNames: [\n \"host\",\n \"node_pubkey\",\n \"amount\",\n \"push_sat\",\n \"private\",\n \"close_address\",\n \"sat_per_vbyte\",\n \"fund_max\",\n ],\n readonly: false,\n }\n }, WALLET_STATE_CODE.SERVER_ACTIVE),\n close_channel: withCheckWallet(() => {\n return {\n method: closeChannel,\n argNames: [\n \"channel_point_str\",\n \"force\",\n \"no_wait\",\n \"delivery_address\",\n \"sat_per_vbyte\",\n ],\n readonly: false,\n }\n }, WALLET_STATE_CODE.SERVER_ACTIVE),\n connect_peer: withCheckWallet(() => {\n return {\n method: connectPeer,\n argNames: [\"pubkey\", \"host\", \"perm\", \"timeout\"],\n readonly: false,\n }\n }, WALLET_STATE_CODE.SERVER_ACTIVE),\n // send to nostrassets\n send: withCheckWallet(() => {\n return {\n method: sendPaymentSync,\n argNames: [\"invoice\"],\n readonly: false,\n }\n }, WALLET_STATE_CODE.SERVER_ACTIVE),\n // receive from nostrassets\n receive: withCheckWallet(() => {\n return {\n method: createLnInvoice,\n argNames: [\"memo\", \"value\"],\n readonly: false,\n }\n }, WALLET_STATE_CODE.SERVER_ACTIVE),\n\n // taprootassets\n enable_tapd: withCheckWallet(() => {\n return {\n method: bakeTaprootMacaroon,\n argNames: [\"secret\", \"origin_secret\"],\n readonly: false,\n }\n }, WALLET_STATE_CODE.SERVER_ACTIVE),\n list_assets: withCheckWallet(() => {\n return {\n method: listAssets,\n argNames: [\"page_index\", \"page_size\"],\n readonly: true,\n }\n }, WALLET_STATE_CODE.SERVER_ACTIVE),\n\n sync_universe: withCheckWallet(() => {\n return {\n method: syncUniverse,\n argNames: [],\n readonly: false,\n }\n }, WALLET_STATE_CODE.SERVER_ACTIVE),\n new_tapd_addr: withCheckWallet(() => {\n return {\n method: newTprAddr,\n argNames: [\"asset_id\", \"amt\"],\n readonly: false,\n }\n }, WALLET_STATE_CODE.SERVER_ACTIVE),\n send_tapd_assets: withCheckWallet(() => {\n return {\n method: sendTprAsset,\n argNames: [\"tap_addrs\", \"sat_per_vbyte\"],\n readonly: false,\n }\n }, WALLET_STATE_CODE.SERVER_ACTIVE),\n create_tapd_channel: withCheckWallet(() => {\n return {\n method: fundChannel,\n argNames: [\"asset_amount\", \"asset_id\"],\n readonly: false,\n }\n }, WALLET_STATE_CODE.SERVER_ACTIVE),\n add_tapd_invoice: withCheckWallet(() => {\n return {\n method: addTprInvoice,\n argNames: [\"asset_amount\", \"asset_id\"],\n readonly: false,\n }\n }, WALLET_STATE_CODE.SERVER_ACTIVE),\n send_tapd_payment: withCheckWallet(() => {\n return {\n method: sendTprPayment,\n argNames: [\"asset_amount\", \"asset_id\", \"payment_request\"],\n readonly: false,\n }\n }, WALLET_STATE_CODE.SERVER_ACTIVE),\n query_rate_tick: withCheckWallet(() => {\n return {\n method: queryRateTick,\n argNames: [\n \"transaction_type\",\n \"subject_asset_id\",\n \"subject_asset_mount\",\n ],\n readonly: true,\n }\n }, WALLET_STATE_CODE.SERVER_ACTIVE),\n\n decode_asset_pay_req: withCheckWallet(() => {\n return {\n method: decodeAssetPayReq,\n argNames: [\"invoice\", \"asset_id\"],\n readonly: true,\n }\n }, WALLET_STATE_CODE.SERVER_ACTIVE),\n\n // nwc\n generate_lnlink: withCheckWallet(() => {\n return {\n method: generateLnlink,\n argNames: [\n \"name\",\n \"permissions\",\n \"account_type\",\n \"social_id\",\n \"auth_limit\",\n \"expire_time\",\n ],\n readonly: false,\n }\n }, WALLET_STATE_CODE.SERVER_ACTIVE),\n get_lnlink_info: withCheckWallet(() => {\n return {\n method: getLnlinkInfo,\n argNames: [],\n readonly: true,\n }\n }, [WALLET_STATE_CODE.SERVER_ACTIVE, WALLET_STATE_CODE.RPC_ACTIVE]),\n get_lnlink_user_list: withCheckWallet(() => {\n return {\n method: getLnlinkUserList,\n argNames: [\"page\", \"page_size\"],\n readonly: true,\n }\n }, [WALLET_STATE_CODE.SERVER_ACTIVE, WALLET_STATE_CODE.RPC_ACTIVE]),\n change_lnlink_user_status: withCheckWallet(() => {\n return {\n method: updateLnlinkUserStatus,\n argNames: [\"id\", \"status\"],\n readonly: false,\n }\n }, [WALLET_STATE_CODE.SERVER_ACTIVE, WALLET_STATE_CODE.RPC_ACTIVE]),\n get_transactions: async () => {\n return {\n method: getTransactions,\n argNames: [],\n readonly: true,\n }\n },\n // lightspark\n get_light_spark_balance: async () => {\n return {\n method: getLightSparkBalance,\n argNames: [],\n readonly: true,\n }\n },\n light_spark_add_funds: async () => {\n return {\n method: lightsparkAddFunds,\n argNames: [],\n readonly: false,\n }\n },\n light_spark_withdraw: async () => {\n return {\n method: lightsparkWithdraw,\n argNames: [\"withdraw_sats_amt\", \"to_address\"],\n readonly: false,\n }\n },\n lightning_spark_receive: async () => {\n return {\n method: lightsparkReceive,\n argNames: [\"sats_amt\"],\n readonly: true,\n }\n },\n lightning_spark_send: async () => {\n return {\n method: lightSparkSend,\n argNames: [\"invoice\"],\n readonly: false,\n }\n },\n get_lightning_spark_test_invoice: async () => {\n return {\n method: generateTestSendInvoice,\n argNames: [\"sats_amt\"],\n readonly: true,\n }\n },\n // litd\n link_status: async () => {\n return {\n method: getTerminalStatus,\n argNames: [],\n readonly: true,\n }\n },\n config_link: async () => {\n return {\n method: configTerminal,\n argNames: [],\n readonly: false,\n }\n },\n start_link: async () => {\n return {\n method: startLink,\n argNames: [],\n readonly: false,\n }\n },\n update_node_name: async () => {\n return {\n method: updateNodeName,\n argNames: [\"node_name\"],\n readonly: false,\n }\n },\n }\n}\nmodule.exports = lndProxy\n", "const { getConfig } = require(\"@business/common/getConfig.js\")\n\nconst { SATS_ID, INVOICE_STATUS } = require(\"@constants/index\")\nconst {\n combineResult,\n getLightningService,\n getAssetAmt,\n} = require(\"../common/index.js\")\nconst Logger = require(\"../utils/linkLogger.js\")\n\nconst { getNodeOwnerBalanceByAssetId } = require(\"./nwcService.js\")\nconst {\n insertTransaction,\n getLnlinkUserByInvoiceAndOrder,\n getTransactionByInvoice,\n} = require(\"./prisma/dbService.js\")\n\nconst {\n addInvoice,\n listAssets,\n queryRateTick,\n} = require(\"./tapdService.js\")\n\nasync function getBuyFlashAccountAsset() {\n const { LINK_NETWORK } = getConfig()\n\n const assetRet = await listAssets({})\n\n let asset = {}\n if (LINK_NETWORK === \"mainnet\") {\n asset = await assetRet.find(item => item.asset_name === \"USDT\")\n }\n else {\n asset = await assetRet.find(\n item =>\n item.id\n === \"5bd129d549bd68cad64f2c2db141732a523e4546a49662c390e8c14294aa7e84\",\n )\n }\n return asset\n}\nasync function get_buy_flash_account_info() {\n try {\n const asset = await getBuyFlashAccountAsset()\n\n const { id: asset_id } = asset\n const logger = new Logger(\"nwc\")\n const rateRet\n = asset_id === SATS_ID\n ? 1\n : await queryRateTick({\n transaction_type: 1,\n subject_asset_id: asset_id,\n subject_asset_mount: 1,\n }).catch((e) => {\n logger.error(`queryRateTick:, ${e?.message}`)\n })\n\n const feeRate = rateRet?.ok?.asset_rates?.subjectAssetRate\n\n const availableAssetLeft = await getNodeOwnerBalanceByAssetId(asset_id)\n return combineResult({\n result_type: \"get_buy_flash_account_info\",\n result: {\n id: asset.id,\n decimal: asset.decimal,\n asset_name: asset.asset_name,\n fee_rate: feeRate,\n available: availableAssetLeft.ownerBalance,\n },\n })\n }\n catch (e) {\n return combineResult({\n result_type: \"get_buy_flash_account_info\",\n error: { code: \"INTERNAL\", message: e.message },\n })\n }\n}\nasync function buy_flash_account(args) {\n try {\n const {\n asset_amount,\n asset_id,\n social_id,\n name,\n account_type,\n // expiry = 60 * 5,\n event_id,\n lnlinkUser,\n pay_asset_type,\n } = args\n const lightningService = getLightningService()\n\n if (pay_asset_type === \"sats\") {\n const invoice = await lightningService.addInvoice({\n memo: JSON.stringify({\n social_id,\n account_type,\n name,\n }),\n value: asset_amount,\n })\n const amount = await getAssetAmt(asset_id, asset_amount)\n\n if (invoice) {\n const linkUserId = lnlinkUser.id\n const transaction = {\n event_id,\n amount,\n type: \"incoming\",\n invoice: invoice?.payment_request,\n payment_hash: null,\n create_at: null,\n expire_at: null,\n status: INVOICE_STATUS.OPEN,\n link_user_id: linkUserId,\n description: null,\n description_hash: null,\n preimage: null,\n fees_paid: null,\n settled_at: null,\n add_index: invoice?.add_index,\n }\n await insertTransaction(transaction)\n return combineResult({\n result_type: \"buy_flash_account\",\n result: { invoice: invoice?.payment_request },\n })\n }\n }\n else if (pay_asset_type === \"asset\") {\n const invoice = await addInvoice({\n asset_id,\n asset_amount,\n lnlinkUser,\n event_id,\n description: JSON.stringify({\n social_id,\n account_type,\n name,\n }),\n })\n if (invoice) {\n return combineResult({\n result_type: \"buy_flash_account\",\n result: { invoice: invoice?.invoice_result?.payment_request },\n })\n }\n }\n }\n catch (e) {\n return combineResult({\n result_type: \"buy_flash_account\",\n error: { code: \"INTERNAL\", message: e.message },\n })\n }\n}\nasync function get_mine_flash_account(args) {\n try {\n const { invoice } = args\n const lnlink_user = await getLnlinkUserByInvoiceAndOrder({ invoice })\n if (!lnlink_user) {\n throw new Error(\n \"Payment information not received yet. If you haven't paid, please make the payment first. If you have already paid, please retry after a moment.\",\n )\n }\n const p = lnlink_user?.node_pubkey\n const sk = lnlink_user?.sk\n\n const { LINK_NOSTR_RELAY_URI, LINK_FLASH_SITE_BASE_URL } = getConfig()\n const relay = LINK_NOSTR_RELAY_URI?.[0]\n const connect_str = `nostr+walletconnect://${p}?relay=${relay}&secret=${sk}`\n const social_id = lnlink_user?.social_id\n const ret = {\n connect_str,\n flash_account_url: `${LINK_FLASH_SITE_BASE_URL}?lnlink=${connect_str}`,\n social_id,\n }\n return combineResult({\n result_type: \"get_mine_flash_account\",\n result: ret,\n })\n }\n catch (e) {\n return combineResult({\n result_type: \"get_mine_flash_account\",\n error: { code: \"INTERNAL\", message: e.message },\n })\n }\n}\n\nasync function get_mine_transaction(args) {\n try {\n const { invoice } = args\n const ret = await getTransactionByInvoice({ invoice })\n return combineResult({\n result_type: \"get_flash_account_transaction\",\n result: ret,\n })\n }\n catch (e) {\n return combineResult({\n result_type: \"get_flash_account_transaction\",\n error: { code: \"INTERNAL\", message: e.message },\n })\n }\n}\nmodule.exports = {\n getBuyFlashAccountAsset,\n get_buy_flash_account_info,\n buy_flash_account,\n get_mine_flash_account,\n get_mine_transaction,\n}\n", "const { Buffer } = require(\"node:buffer\")\nconst { getConfig } = require(\"@business/common/getConfig.js\")\n\nconst Decimal = require(\"decimal.js\")\n\nconst {\n NWC_PERMISSIONS,\n SATS_ID,\n WHITE_PUBKEY_LIST,\n TRANSACTION_ASSET_TYPE,\n NODE_TYPE,\n TRANSACTION_KIND,\n TRANSACTION_DIRECTION,\n TRANSACTION_STATUS,\n} = require(\"../../../constants/index.js\")\nconst { getLightningService, combineResult } = require(\"../../common/index\")\nconst { sleep } = require(\"../../utils/index.js\")\nconst linkCache = require(\"../../utils/linkCache.js\")\nconst Logger = require(\"../../utils/linkLogger\")\nconst {\n get_buy_flash_account_info,\n buy_flash_account,\n get_mine_flash_account,\n get_mine_transaction,\n} = require(\"../buyFlashAccountService.js\")\n\nconst { getCacheNodeInfo, getOpenedChannelList } = require(\"../lndService.js\")\nconst {\n generateLnlink,\n getLnlinkUserList,\n updateLnlinkUserStatus,\n} = require(\"../nwcService.js\")\n\nconst {\n upsertTransactionByFilter,\n getTransactionsByFilter,\n getAvailableUserSumAuthLimit,\n} = require(\"../prisma/dbService.js\")\n\nconst {\n addInvoice,\n sendPayment,\n queryRateTick,\n getAssetDecimal,\n listAssets,\n getAssetName,\n decodeAssetPayReq,\n} = require(\"../tapdService.js\")\n\nasync function getBalance(lnlinkUser) {\n const logger = new Logger(\"nwc\")\n try {\n const { list: incomingTxns } = await getTransactionsByFilter({\n user_npub: lnlinkUser.npub,\n asset_id: lnlinkUser.asset_id,\n status: TRANSACTION_STATUS.SETTLED,\n direction: TRANSACTION_DIRECTION.IN,\n node_type: NODE_TYPE.LITD,\n transaction_kind: TRANSACTION_KIND.LIGHTNING,\n })\n\n const { list: outgoingTxns } = await getTransactionsByFilter({\n user_npub: lnlinkUser.npub,\n asset_id: lnlinkUser.asset_id,\n status: [TRANSACTION_STATUS.SETTLED, TRANSACTION_STATUS.PENDING],\n direction: TRANSACTION_DIRECTION.OUT,\n node_type: NODE_TYPE.LITD,\n transaction_kind: TRANSACTION_KIND.LIGHTNING,\n })\n\n const incomingBalance = incomingTxns.reduce(\n (acc, item) => new Decimal(acc).plus(item.asset_amount).toString(),\n 0,\n )\n const outgoingBalance = outgoingTxns.reduce((acc, item) => {\n const feesPaid = 0\n return new Decimal(acc).plus(item.asset_amount).plus(feesPaid).toString()\n }, 0)\n let assetName = \"\"\n const sumChildAuthLimit = await getAvailableUserSumAuthLimit(\n lnlinkUser.asset_id,\n lnlinkUser.pubkey,\n )\n\n const balance = new Decimal(lnlinkUser.auth_limit)\n .minus(sumChildAuthLimit)\n .plus(incomingBalance)\n .minus(outgoingBalance)\n .toDecimalPlaces(0, Decimal.ROUND_DOWN)\n .toString()\n\n if (lnlinkUser?.asset_id !== SATS_ID) {\n const asset_name = await getAssetName(lnlinkUser.asset_id)\n\n assetName = asset_name\n }\n else {\n assetName = \"sats\"\n }\n return {\n balance: new Decimal(balance).lt(0) ? 0 : balance.toString(),\n incomingBalance,\n outgoingBalance,\n assetName,\n }\n }\n catch (e) {\n logger.error(`nwcProxy getBalance error: ${e.message}`)\n throw new Error(e.message)\n }\n}\n\nasync function getBestOutgoingChainId(assetId) {\n const channelList = await getOpenedChannelList()\n if (assetId === SATS_ID) {\n const filterChannelList = channelList.filter((item) => {\n return (\n !item.commitment_type.includes(\"TAPROOT\") && item.active === true\n )\n })\n if (filterChannelList.length > 0) {\n return filterChannelList.sort((a, b) => {\n return Number(b.local_balance) - Number(a.local_balance)\n })[0].channel_id\n }\n }\n else {\n const filterChannelList = channelList.filter((item) => {\n const itemAsset = item?.custom_channel_data?.assets?.[0]\n\n return (\n item.commitment_type.includes(\"TAPROOT\")\n && item.active === true\n && itemAsset?.asset_utxo?.asset_genesis?.asset_id === assetId\n )\n })\n\n if (filterChannelList.length > 0) {\n return filterChannelList.sort((a, b) => {\n return Number(b.local_balance) - Number(a.local_balance)\n })[0].channel_id\n }\n }\n}\n\nfunction nwcProxy() {\n return {\n get_info: async (params = {}) => {\n const logger = new Logger(\"nwc\")\n try {\n const { lnlinkUser } = params\n const { LINK_NOSTR_NODE_NPUBKEY } = getConfig()\n const nodeInfo = await getCacheNodeInfo(false)\n\n const {\n outgoingBalance,\n balance,\n incomingBalance,\n assetName,\n }\n = await getBalance(lnlinkUser)\n\n if (nodeInfo) {\n const rateRet\n = lnlinkUser.asset_id === SATS_ID\n ? 1\n : await queryRateTick({\n transaction_type: 1,\n subject_asset_id: lnlinkUser.asset_id,\n subject_asset_mount: 1,\n }).catch((e) => {\n logger.error(`queryRateTick: ~ e, ${e?.message}`)\n })\n\n const decimal\n = lnlinkUser.asset_id === SATS_ID\n ? 0\n : await getAssetDecimal(lnlinkUser.asset_id)\n\n const result = {\n alias: nodeInfo.alias,\n color: nodeInfo.color,\n pubkey: nodeInfo.identity_pubkey,\n network: nodeInfo.chains?.[0]?.network,\n block_height: nodeInfo.block_height,\n block_hash: nodeInfo.block_hash,\n methods: NWC_PERMISSIONS,\n nwc_user: {\n name: lnlinkUser.name,\n pubkey: lnlinkUser.pubkey,\n official_pubkey: LINK_NOSTR_NODE_NPUBKEY,\n account_type: lnlinkUser.account_type,\n social_id: lnlinkUser.social_id,\n auth_limit: lnlinkUser.auth_limit,\n auth_balance: balance,\n outgoing_balance: outgoingBalance,\n incoming_balance: incomingBalance,\n permissions: JSON.parse(lnlinkUser.permissions),\n expire_time: lnlinkUser.expire_time,\n create_time: lnlinkUser.create_time,\n status: lnlinkUser.status,\n asset_name: assetName,\n asset_id: lnlinkUser.asset_id,\n rate: rateRet?.ok?.asset_rates?.subjectAssetRate,\n decimal,\n node_state: linkCache.get(\"walletState\"),\n },\n }\n\n return combineResult({ result_type: \"get_info\", result })\n }\n }\n catch (e) {\n return combineResult({\n result_type: \"get_info\",\n error: { code: \"INTERNAL\", message: e.message },\n })\n }\n },\n get_balance: async (params = {}) => {\n // msats\n try {\n const { lnlinkUser } = params\n // const authLimit = lnlinkUser.auth_limit\n // balance is sats\n const { balance } = await getBalance(lnlinkUser)\n\n const msatsBalance = balance * 1000 < 0 ? 0 : balance * 1000\n\n return combineResult({\n result_type: \"get_balance\",\n result: {\n // msats\n balance: msatsBalance,\n },\n })\n }\n catch (e) {\n return combineResult({\n result_type: \"get_balance\",\n error: { code: \"INTERNAL\", message: e.message },\n })\n }\n },\n get_taproot_balance: async (params = {}) => {\n try {\n const { lnlinkUser, asset_id } = params\n\n const { balance } = await getBalance(lnlinkUser)\n\n return combineResult({\n result_type: \"get_taproot_balance\",\n result: {\n balance,\n asset_id,\n },\n })\n }\n catch (e) {\n return combineResult({\n result_type: \"get_taproot_balance\",\n error: { code: \"INTERNAL\", message: e.message },\n })\n }\n },\n make_taproot_invoice: async (params = {}) => {\n try {\n const {\n event_id,\n amount,\n description,\n description_hash,\n expiry,\n lnlinkUser,\n } = params\n const asset_id = lnlinkUser.asset_id\n\n if (!amount) {\n return combineResult({\n result_type: \"make_taproot_invoice\",\n error: { code: \"OTHER\", message: \"amount is required\" },\n })\n }\n if (!asset_id) {\n return combineResult({\n result_type: \"make_taproot_invoice\",\n error: { code: \"OTHER\", message: \"asset_id is required\" },\n })\n }\n // const decimal = await getAssetDecimal(asset_id)\n const create_at = Math.floor(Date.now() / 1000)\n const expire_at = create_at + (expiry ?? 5 * 60)\n // const decimalAmount = new Decimal(amount).mul(10 ** decimal).toNumber();\n const invoice = await addInvoice({\n asset_amount: amount,\n asset_id,\n description,\n description_hash,\n expiry,\n event_id,\n lnlinkUser,\n })\n\n if (invoice) {\n return combineResult({\n result_type: \"make_taproot_invoice\",\n result: {\n invoice: invoice?.invoice_result?.payment_request,\n asset_id,\n create_at,\n expire_at,\n amount,\n },\n })\n }\n }\n catch (e) {\n return combineResult({\n result_type: \"make_taproot_invoice\",\n error: { code: \"INTERNAL\", message: e.message },\n })\n }\n },\n make_invoice: async (params = {}) => {\n try {\n const {\n amount,\n event_id,\n lnlinkUser,\n expiry,\n } = params\n if (!amount) {\n return combineResult({\n result_type: \"make_invoice\",\n error: { code: \"OTHER\", message: \"amount is required\" },\n })\n }\n const lightningService = getLightningService()\n // const expiry = expiry || 5 * 60;\n const create_at = Math.floor(Date.now() / 1000)\n const expire_at = create_at + (expiry ?? 5 * 60)\n // amount is msat\n const value = new Decimal(amount).div(1000).toString()\n const memo = lnlinkUser?.pubkey\n const invoice = await lightningService.addInvoice({\n value,\n expiry,\n memo,\n })\n if (invoice) {\n await sleep(500)\n await upsertTransactionByFilter({\n event_id,\n user_npub: lnlinkUser.npub,\n asset_id: SATS_ID,\n asset_amount: `${value}`,\n asset_type: TRANSACTION_ASSET_TYPE.BTC,\n invoice: invoice?.payment_request,\n node_type: NODE_TYPE.LITD,\n transaction_kind: TRANSACTION_KIND.LIGHTNING,\n direction: TRANSACTION_DIRECTION.IN,\n description: memo,\n add_index: Number.parseInt(invoice?.add_index),\n }, {\n invoice: invoice.payment_request,\n })\n return combineResult({\n result_type: \"make_invoice\",\n result: {\n invoice: invoice.payment_request,\n create_at,\n expire_at,\n amount,\n fees_paid: invoice.fees_paid,\n },\n })\n }\n }\n catch (e) {\n return combineResult({\n result_type: \"make_invoice\",\n error: { code: \"INTERNAL\", message: e.message },\n })\n }\n },\n pay_taproot_invoice: async (params = {}) => {\n const {\n invoice,\n event_id,\n lnlinkUser,\n } = params\n\n try {\n if (!invoice) {\n return combineResult({\n result_type: \"pay_taproot_invoice\",\n error: { code: \"OTHER\", message: \"Invoice is required\" },\n })\n }\n\n // get transaction by payment_hash\n const transaction = await getTransactionsByFilter({\n invoice,\n })\n if (transaction.list.length > 0) {\n return combineResult({\n result_type: \"pay_taproot_invoice\",\n error: {\n code: \"PAYMENT_FAILED\",\n message: \"Payment already exists.\",\n },\n })\n }\n const outgoing_chan_id = await getBestOutgoingChainId(\n lnlinkUser?.asset_id,\n ).catch(() => {\n return false\n })\n if (!outgoing_chan_id) {\n throw new Error(\"There is no suitable channel available\")\n }\n const decodedAssetPayReq = await decodeAssetPayReq({ invoice, asset_id: lnlinkUser?.asset_id })\n const amount = decodedAssetPayReq?.asset_amount\n\n const { balance } = await getBalance(lnlinkUser)\n\n if (new Decimal(balance).lt(new Decimal(amount))) {\n throw new Error(\"Insufficient balance.\")\n }\n\n const payment = await sendPayment({\n asset_id: lnlinkUser.asset_id,\n payment_request: invoice,\n outgoing_chan_id,\n event_id,\n lnlinkUser,\n })\n if (payment?.payment_result?.payment_hash) {\n return combineResult({\n result_type: \"pay_invoice\",\n result: {\n preimage: payment?.payment_result?.payment_preimage,\n payment_hash: payment?.payment_result?.payment_hash,\n asset_id: lnlinkUser.asset_id,\n },\n })\n }\n }\n catch (e) {\n return combineResult({\n result_type: \"pay_invoice\",\n error: { code: \"PAYMENT_FAILED\", message: e.message },\n })\n }\n },\n pay_invoice: async (params = {}) => {\n const {\n invoice,\n event_id,\n lnlinkUser,\n } = params\n try {\n if (!invoice) {\n return combineResult({\n result_type: \"pay_invoice\",\n error: { code: \"OTHER\", message: \"Invoice is required\" },\n })\n }\n const lightningService = getLightningService()\n const { balance } = await getBalance(lnlinkUser)\n const decodeInvoice = await lightningService.decodePayReq({\n pay_req: invoice,\n })\n const destination = decodeInvoice.destination\n const NETWORK = getConfig().LINK_NETWORK\n const destinationPubkeys = WHITE_PUBKEY_LIST[NETWORK]\n\n if (\n destinationPubkeys.length > 0\n && !destinationPubkeys.includes(destination)\n ) {\n throw new Error(\"Invoice is not supported.\")\n }\n const invoicePaymentHash = decodeInvoice.payment_hash\n // get transaction by payment_hash\n const transaction = await getTransactionsByFilter({\n paymentHash: invoicePaymentHash,\n })\n\n if (transaction.list.length > 0) {\n return combineResult({\n result_type: \"pay_invoice\",\n error: {\n code: \"PAYMENT_FAILED\",\n message: \"Payment already exists.\",\n },\n })\n }\n\n const invoiceAmount = decodeInvoice.num_satoshis\n if (new Decimal(balance).lt(invoiceAmount)) {\n return combineResult({\n result_type: \"pay_invoice\",\n error: {\n code: \"INSUFFICIENT_BALANCE\",\n message: \"Insufficient balance.\",\n },\n })\n }\n const outgoing_chan_id = await getBestOutgoingChainId(\n lnlinkUser?.asset_id,\n ).catch(() => {\n return false\n })\n if (!outgoing_chan_id) {\n throw new Error(\"There is no suitable channel available\")\n }\n const payment = await lightningService.sendPaymentSync({\n payment_request: invoice,\n allow_self_payment: true,\n outgoing_chan_id: `${outgoing_chan_id}`,\n })\n\n if (payment?.payment_hash) {\n await sleep(300)\n const decodedPayReq = await lightningService.decodePayReq({\n pay_req: invoice,\n })\n const asset_amount = decodedPayReq?.num_satoshis\n\n await upsertTransactionByFilter({\n event_id,\n user_npub: lnlinkUser.npub,\n asset_id: SATS_ID,\n asset_amount: `${asset_amount}`,\n asset_type: TRANSACTION_ASSET_TYPE.BTC,\n invoice,\n node_type: NODE_TYPE.LITD,\n transaction_kind: TRANSACTION_KIND.LIGHTNING,\n direction: TRANSACTION_DIRECTION.OUT,\n }, {\n payment_hash: payment.payment_hash,\n })\n\n if (payment?.payment_preimage) {\n return combineResult({\n result_type: \"pay_invoice\",\n result: {\n preimage: payment?.payment_preimage,\n payment_hash: payment?.payment_hash,\n },\n })\n }\n }\n }\n catch (e) {\n return combineResult({\n result_type: \"pay_invoice\",\n error: { code: \"PAYMENT_FAILED\", message: e.message },\n })\n }\n },\n lookup_invoice: async (params = {}) => {\n try {\n const { payment_hash } = params\n\n const lightningService = getLightningService()\n\n const retInvoice = await lightningService.lookupInvoice({\n r_hash: payment_hash,\n })\n if (!retInvoice) {\n throw new Error(\"invoice not found\")\n }\n if (retInvoice) {\n const result = {\n type: retInvoice.payment_request ? \"incoming\" : \"outgoing\", // \"incoming\" for invoices, \"outgoing\" for payments\n invoice: retInvoice.payment_request, // encoded invoice, optional\n description: retInvoice.memo, // invoice's description, optional\n description_hash: retInvoice.description_hash, // invoice's description hash, optional\n preimage: retInvoice.r_preimage, // payment's preimage, optional if unpaid\n payment_hash: retInvoice.description_hash, // Payment hash for the payment\n amount: retInvoice.value_msat, // value in msats\n fees_paid: \"\", // value in msats\n created_at: retInvoice.creation_date, // invoice/payment creation time\n expires_at: \"\", // invoice expiration time, optional if not applicable\n settled_at:\n Number(retInvoice.settle_date) > 0 ? retInvoice.settle_date : \"\", // invoice/payment settlement time, optional if unpaid\n metadata: {},\n }\n return combineResult({ result_type: \"lookup_invoice\", result })\n }\n }\n catch (e) {\n return combineResult({\n result_type: \"lookup_invoice\",\n error: { code: \"INTERNAL\", message: e.message },\n })\n }\n },\n list_transactions: async (params = {}) => {\n const {\n from,\n until,\n limit,\n offset = 0,\n // unpaid = false,\n type,\n lnlinkUser,\n asset_id = SATS_ID,\n } = params\n try {\n let total = 0\n\n const getTransactions = async () => {\n const { list: allList, total: allTotal }\n = await getTransactionsByFilter({\n limit,\n from,\n until,\n offset,\n // unpaid,\n direction: type && /in|receive/.test(type) ? /in/.test(type) ? TRANSACTION_DIRECTION.IN : TRANSACTION_DIRECTION.OUT : undefined,\n user_npub: lnlinkUser.npub,\n node_type: NODE_TYPE.LITD,\n transaction_kind: TRANSACTION_KIND.LIGHTNING,\n asset_id,\n })\n total = allTotal\n return allList.map(item => ({\n ...item,\n amount_sats: item.amount,\n user_pubkey: lnlinkUser.pubkey,\n }))\n }\n\n const transactions = await getTransactions()\n\n return combineResult({\n result_type: \"list_transactions\",\n result: { transactions, total },\n })\n }\n catch (e) {\n return {\n result_type: \"list_transactions\",\n error: { code: \"INTERNAL\", message: e.message },\n }\n }\n },\n sign_message: async (params = {}) => {\n try {\n const msg = params.msg\n if (!msg) {\n throw new Error(\"msg is required\")\n }\n const lightningService = getLightningService()\n const signRet = await lightningService.signMessage({\n msg: Buffer.from(msg),\n })\n return combineResult({\n result_type: \"sign_message\",\n result: {\n signature: signRet.signature,\n },\n })\n }\n catch (e) {\n return combineResult({\n result_type: \"sign_message\",\n error: { code: \"INTERNAL\", message: e.message },\n })\n }\n },\n verify_message: async (params = {}) => {\n try {\n const { msg, signature } = params\n if (!msg) {\n throw new Error(\"msg is required.\")\n }\n if (!signature) {\n throw new Error(\"signature is required.\")\n }\n const lightningService = getLightningService()\n const verifyRet = await lightningService.verifyMessage({\n msg: Buffer.from(msg),\n signature,\n })\n return combineResult({\n result_type: \"verify_message\",\n result: {\n valid: verifyRet.valid,\n pubkey: verifyRet.pubkey,\n },\n })\n }\n catch (e) {\n return combineResult({\n result_type: \"verify_message\",\n error: { code: \"INTERNAL\", message: e.message },\n })\n }\n },\n create_flash_account: async (params = {}) => {\n try {\n const {\n permissions = [],\n account_type,\n social_id,\n auth_limit,\n expire_time,\n name,\n lnlinkUser,\n } = params\n\n if (auth_limit > lnlinkUser.authLimit) {\n throw new Error(\n `auth_limit cannot greater than ${lnlinkUser.authLimit}`,\n )\n }\n if (expire_time > lnlinkUser.expireTime) {\n throw new Error(\n `expire_time cannot greater than ${lnlinkUser.expireTime}`,\n )\n }\n const ret = await generateLnlink({\n permissions,\n account_type,\n social_id,\n auth_limit,\n expire_time,\n name,\n asset_id: lnlinkUser.asset_id,\n parent_pubkey: lnlinkUser.pubkey,\n })\n // const { connectStr } = ret;\n return combineResult({\n result_type: \"create_flash_account\",\n result: {\n ...ret,\n },\n })\n }\n catch (e) {\n return combineResult({\n result_type: \"create_flash_account\",\n error: { code: \"INTERNAL\", message: e.message },\n })\n }\n },\n list_flash_accounts: async (params = {}) => {\n try {\n const {\n page = 1,\n pageSize = 20,\n type,\n only_runing = false,\n lnlinkUser,\n search = \"\",\n } = params\n const retSubAccounts = await getLnlinkUserList({\n page,\n pageSize,\n type,\n only_runing,\n parent_pubkey: lnlinkUser.pubkey,\n search,\n })\n return combineResult({\n result_type: \"list_flash_accounts\",\n result: {\n sub_accounts: retSubAccounts,\n },\n })\n }\n catch (e) {\n return combineResult({\n result_type: \"list_flash_accounts\",\n error: { code: \"INTERNAL\", message: e.message },\n })\n }\n },\n toggle_enable_flash_account: async (params = {}) => {\n try {\n const {\n id,\n status,\n page = 1,\n pageSize = 20,\n type,\n only_runing = false,\n lnlinkUser,\n search = \"\",\n } = params\n const retSubAccount = await updateLnlinkUserStatus({\n id,\n status,\n page,\n pageSize,\n type,\n only_runing,\n parent_pubkey: lnlinkUser.pubkey,\n search,\n })\n\n return combineResult({\n result_type: \"toggle_enable_sub_account\",\n result: {\n ...retSubAccount,\n },\n })\n }\n catch (e) {\n return combineResult({\n result_type: \"toggle_enable_sub_account\",\n error: { code: \"INTERNAL\", message: e.message },\n })\n }\n },\n get_assets: async () => {\n try {\n const assets = await listAssets({})\n const mapAssets = assets.map(asset => ({\n asset_id: asset.asset_id,\n asset_name: asset.asset_name,\n amount: asset.balance,\n decimal: asset.decimal,\n }))\n return combineResult({\n result_type: \"get_assets\",\n result: mapAssets,\n })\n }\n catch (e) {\n return combineResult({\n result_type: \"get_assets\",\n error: { code: \"INTERNAL\", message: e.message },\n })\n }\n },\n get_buy_flash_account_info,\n buy_flash_account,\n get_mine_flash_account,\n get_mine_transaction,\n }\n}\nmodule.exports = nwcProxy\n", "const { getConfig } = require(\"@business/common/getConfig.js\")\nconst { getLnlinkUser } = require(\"@business/service/prisma/dbService\")\nconst linkCache = require(\"@business/utils/linkCache.js\")\nconst Logger = require(\"@business/utils/linkLogger.js\")\nconst { ACCOUNT_TYPE } = require(\"@constants/index\")\nconst packageJSON = require(\"@package.json\")\nconst { getRGBStatus } = require(\"../nodeManage/index.js\")\nconst { ServiceStatus } = require(\"../nodeManage/index.js\")\nconst getRgbClient = require(\"./client\")\nconst { getNodeState } = require(\"./node\")\n\nasync function getCombinedNodeInfo() {\n const {\n LINK_NAME,\n LINK_OWNER,\n LINK_NODE_ADDR,\n LINK_RGB_HOST,\n LINK_RGB_LDK_PEER_LISTENING_PORT,\n } = getConfig()\n\n const logger = new Logger(\"rgb\")\n\n let statusEntries = []\n try {\n statusEntries = await getRGBStatus()\n }\n catch (error) {\n logger.warn(`getCombinedNodeInfo - getRGBStatus failed: ${error.message}`)\n }\n\n const serviceRunning = statusEntries.status === ServiceStatus.RUNNING\n\n let nodeInfo = null\n let balance = {\n colored: {\n settled: 0,\n spendable: 0,\n future: 0,\n },\n vanilla: {\n settled: 0,\n spendable: 0,\n future: 0,\n },\n }\n let peers = []\n let stateValue = null\n\n if (serviceRunning) {\n const rgbClient = getRgbClient()\n\n const [\n nodeInfoResult,\n stateResult,\n balanceResult,\n peersResult,\n ] = await Promise.allSettled([\n rgbClient.node.getNodeInfo(),\n getNodeState(),\n rgbClient.onchain.getBtcBalance({\n skip_sync: false,\n }),\n rgbClient.lightning.listPeers({}),\n ])\n\n if (stateResult.status === \"fulfilled\") {\n stateValue = stateResult.value?.state ?? null\n }\n else {\n logger.warn(`getCombinedNodeInfo - getNodeState failed: ${stateResult.reason?.message || stateResult.reason}`)\n }\n\n if (nodeInfoResult.status === \"fulfilled\") {\n nodeInfo = nodeInfoResult.value\n }\n else {\n logger.warn(`getCombinedNodeInfo - getNodeInfo failed: ${nodeInfoResult.reason?.message || nodeInfoResult.reason}`)\n }\n\n if (balanceResult.status === \"fulfilled\") {\n balance = balanceResult.value\n }\n else {\n logger.warn(`getCombinedNodeInfo - getBtcBalance failed: ${balanceResult.reason?.message || balanceResult.reason}`)\n }\n\n if (peersResult.status === \"fulfilled\") {\n peers = peersResult.value?.peers ?? []\n }\n else {\n logger.warn(`getCombinedNodeInfo - listPeers failed: ${peersResult.reason?.message || peersResult.reason}`)\n }\n\n rgbClient.rgb.refreshTransfers({ skip_sync: false }).catch((error) => {\n logger.warn(`getCombinedNodeInfo - refreshTransfers failed: ${error.message}`)\n })\n }\n\n const readOnlyAccount = await getLnlinkUser({\n account_type: ACCOUNT_TYPE.READ_ONLY,\n })\n\n const data = {\n pubkey: nodeInfo?.pubkey ?? null,\n host: `${LINK_RGB_HOST}:${LINK_RGB_LDK_PEER_LISTENING_PORT}`,\n rgb_assets_enabled: true,\n name: LINK_NAME,\n status: {\n rgb: statusEntries.status,\n state: stateValue,\n },\n owner: LINK_OWNER,\n node_addr: LINK_NODE_ADDR,\n balance,\n peers,\n version: packageJSON.version,\n read_only_account_sk: readOnlyAccount?.sk,\n }\n\n if (serviceRunning) {\n linkCache.set(\"rgbNodeInfo\", data)\n }\n\n return data\n}\n\nmodule.exports = {\n getCombinedNodeInfo,\n}\n", "const crypto = require(\"node:crypto\")\nconst { checkObjectArgs } = require(\"@business/common\")\nconst { getConfig } = require(\"@business/common/getConfig\")\nconst Logger = require(\"@business/utils/linkLogger\")\nconst {\n TRANSACTION_STATUS,\n NODE_TYPE,\n TRANSACTION_KIND,\n TRANSACTION_DIRECTION,\n TRANSACTION_ASSET_TYPE,\n SATS_ID,\n TASKS,\n INVOICE_EXPIRY_TIME,\n} = require(\"@constants/index\")\nconst {\n upsertTransactionByFilter,\n} = require(\"../prisma/db/transactions\")\nconst { reportTaskCompletion } = require(\"../report/reportService\")\nconst getRgbClient = require(\"./client\")\nconst { getCombinedNodeInfo } = require(\"./info\")\n\nconst MIN_CAPACITY_SAT = 30 * 10000\nconst DEFAULT_PUSH_MSAT = 15 * 10000 * 1000\n\nasync function listPeers() {\n const rgbClient = getRgbClient()\n const ret = await rgbClient.lightning.listPeers()\n return ret\n}\n\nasync function connectPeer({\n pubkey = getConfig().LINK_RGB_REMOTE_NODE_PUBKEY,\n host = getConfig().LINK_RGB_REMOTE_NODE_HOST,\n withinfo = false,\n}) {\n const rgbClient = getRgbClient()\n const connectPeerArgs = {\n pubkey,\n host,\n }\n checkObjectArgs(connectPeerArgs, [\"pubkey\", \"host\"])\n\n const peer_pubkey_and_addr = `${pubkey}@${host}`\n const ret = await rgbClient.lightning.connectPeer({\n peer_pubkey_and_addr,\n })\n if (withinfo) {\n const nodeInfo = await getCombinedNodeInfo()\n ret.node_info = nodeInfo\n }\n return ret\n}\n\nasync function disconnectPeer({\n peer_pubkey,\n}) {\n const rgbClient = getRgbClient()\n const disconnectPeerArgs = {\n peer_pubkey,\n }\n checkObjectArgs(disconnectPeerArgs, [\"peer_pubkey\"])\n const ret = await rgbClient.lightning.disconnectPeer(disconnectPeerArgs)\n return ret\n}\n\nasync function listChannels() {\n const rgbClient = getRgbClient()\n const ret = await rgbClient.lightning.listChannels()\n return ret\n}\nasync function isConnectPeer({\n pubkey,\n}) {\n const { peers = [] } = await listPeers()\n const peer = peers.find(peer => peer.pubkey === pubkey)\n return {\n is_connected: !!peer,\n peer,\n }\n}\nasync function openChannel({\n pubkey = getConfig().LINK_RGB_REMOTE_NODE_PUBKEY,\n host = getConfig().LINK_RGB_REMOTE_NODE_HOST,\n capacity_sat = MIN_CAPACITY_SAT,\n push_msat,\n asset_amount,\n asset_id,\n isPublic = true,\n with_anchors = true,\n fee_base_msat = 1000,\n fee_proportional_millionths = 0,\n withinfo = false,\n lnlinkUser,\n}) {\n const openChannelArgs = {\n pubkey,\n host,\n capacity_sat,\n push_msat,\n asset_amount,\n asset_id,\n public: isPublic,\n with_anchors,\n fee_base_msat: Number(fee_base_msat),\n fee_proportional_millionths,\n }\n const { is_connected, peer } = await isConnectPeer({\n pubkey,\n })\n if (!is_connected) {\n throw new Error(`peer ${pubkey} is not connected`)\n }\n openChannelArgs.host = peer.host\n openChannelArgs.push_msat = asset_id ? (push_msat || DEFAULT_PUSH_MSAT) : 0\n checkObjectArgs(openChannelArgs, [\"capacity_sat\"])\n\n if (capacity_sat < MIN_CAPACITY_SAT) {\n throw new Error(`capacity_sat must be greater than ${MIN_CAPACITY_SAT}`)\n }\n\n openChannelArgs.peer_pubkey_and_opt_addr = `${pubkey}@${host}`\n const randomBytes = crypto.randomBytes(32)\n const temporary_channel_id = openChannelArgs.temporary_channel_id || randomBytes.toString(\"hex\")\n openChannelArgs.temporary_channel_id = temporary_channel_id\n const rgbClient = getRgbClient()\n const ret = await rgbClient.lightning.openChannel(openChannelArgs)\n if (withinfo) {\n const nodeInfo = await getCombinedNodeInfo()\n ret.node_info = nodeInfo\n }\n if (lnlinkUser) {\n reportTaskCompletion({\n nostrAddress: lnlinkUser.npub,\n tag: TASKS.CreateRGBChannel,\n })\n }\n return ret\n}\n\nasync function closeChannel({\n channel_id,\n peer_pubkey,\n force = false,\n lnlinkUser,\n}) {\n const closeChannelArgs = {\n channel_id,\n peer_pubkey,\n force,\n }\n const rgbClient = getRgbClient()\n checkObjectArgs(closeChannelArgs, [\"channel_id\", \"peer_pubkey\"])\n const ret = await rgbClient.lightning.closeChannel(closeChannelArgs)\n if (lnlinkUser) {\n reportTaskCompletion({\n nostrAddress: lnlinkUser.npub,\n tag: TASKS.CloseRGBChannel,\n })\n }\n return ret\n}\n\nasync function createInvoice({\n amt_msat = 3 * 1000 * 1000,\n expiry_sec = INVOICE_EXPIRY_TIME[\"10m\"],\n asset_id,\n asset_amount,\n memo = \"\",\n preimage = \"\",\n event_id,\n lnlinkUser,\n}) {\n const logger = new Logger(\"rgb-lightning\")\n try {\n const createInvoiceArgs = {\n amt_msat,\n expiry_sec,\n asset_id,\n asset_amount,\n memo,\n preimage,\n }\n if (!memo) {\n delete createInvoiceArgs.memo\n }\n if (!preimage) {\n delete createInvoiceArgs.preimage\n }\n if (!asset_id) {\n delete createInvoiceArgs.asset_id\n }\n if (!asset_amount) {\n delete createInvoiceArgs.asset_amount\n }\n const rgbClient = getRgbClient()\n const ret = await rgbClient.lightning.createInvoice(createInvoiceArgs)\n\n if (lnlinkUser && lnlinkUser.npub && event_id) {\n const assetType = asset_id ? TRANSACTION_ASSET_TYPE.RGB_ASSET : TRANSACTION_ASSET_TYPE.BTC\n\n const filter = {\n node_type: NODE_TYPE.RGB,\n transaction_kind: TRANSACTION_KIND.LIGHTNING,\n direction: TRANSACTION_DIRECTION.IN,\n asset_type: assetType,\n invoice: ret?.invoice,\n }\n\n const now = Math.floor(Date.now() / 1000)\n const expireAt = now + expiry_sec\n\n await upsertTransactionByFilter({\n event_id,\n user_npub: lnlinkUser.npub,\n node_type: NODE_TYPE.RGB,\n transaction_kind: TRANSACTION_KIND.LIGHTNING,\n direction: TRANSACTION_DIRECTION.IN,\n asset_type: assetType,\n asset_id: asset_id || SATS_ID,\n asset_amount: asset_id ? (asset_amount ? asset_amount.toString() : \"0\") : (amt_msat / 1000).toString(),\n invoice: ret.invoice,\n payment_hash: ret?.payment_hash,\n status: TRANSACTION_STATUS.PENDING,\n create_at: now,\n update_at: now,\n expire_at: expireAt,\n }, filter)\n\n logger.info(`Lightning invoice created successfully with transaction record, payment_hash: ${ret.payment_hash}`)\n }\n else {\n logger.info(`Lightning invoice created successfully, payment_hash: ${ret.payment_hash}`)\n }\n\n return ret\n }\n catch (error) {\n logger.error(`Error in createInvoice: ${error.message}`)\n throw error\n }\n}\n\nasync function payInvoice({\n invoice,\n event_id,\n lnlinkUser,\n}) {\n const logger = new Logger(\"rgb-lightning\")\n try {\n const payInvoiceArgs = { invoice }\n checkObjectArgs(payInvoiceArgs, [\"invoice\"])\n\n const decodedInvoice = await decodeLnInvoice({ invoice })\n const rgbClient = getRgbClient()\n const ret = await rgbClient.lightning.payInvoice(payInvoiceArgs)\n\n if (lnlinkUser && lnlinkUser.npub && event_id) {\n const assetType = decodedInvoice.asset_id ? TRANSACTION_ASSET_TYPE.RGB_ASSET : TRANSACTION_ASSET_TYPE.BTC\n\n const filter = {\n node_type: NODE_TYPE.RGB,\n transaction_kind: TRANSACTION_KIND.LIGHTNING,\n direction: TRANSACTION_DIRECTION.OUT,\n asset_type: assetType,\n payment_hash: ret.payment_hash,\n }\n\n const now = Math.floor(Date.now() / 1000)\n\n await upsertTransactionByFilter({\n event_id,\n user_npub: lnlinkUser.npub,\n node_type: NODE_TYPE.RGB,\n transaction_kind: TRANSACTION_KIND.LIGHTNING,\n direction: TRANSACTION_DIRECTION.OUT,\n asset_type: assetType,\n asset_id: decodedInvoice.asset_id || SATS_ID,\n asset_amount: decodedInvoice.asset_id\n ? (decodedInvoice.asset_amount ? decodedInvoice.asset_amount.toString() : \"0\")\n : (decodedInvoice.amt_msat / 1000).toString(),\n invoice,\n payment_hash: ret.payment_hash,\n status: TRANSACTION_STATUS.PENDING,\n create_at: now,\n update_at: now,\n }, filter)\n\n logger.info(`Lightning payment sent successfully with transaction record, payment_hash: ${ret.payment_hash}`)\n if (lnlinkUser) {\n reportTaskCompletion({\n nostrAddress: lnlinkUser.npub,\n tag: TASKS.RGBChannelWithdraw,\n })\n }\n }\n else {\n logger.info(`Lightning payment sent successfully, payment_hash: ${ret.payment_hash}`)\n }\n\n return ret\n }\n catch (error) {\n logger.error(`Error in payInvoice: ${error.message}`)\n throw error\n }\n}\n\nasync function decodeLnInvoice({\n invoice,\n}) {\n const decodeInvoiceArgs = { invoice }\n checkObjectArgs(decodeInvoiceArgs, [\"invoice\"])\n const rgbClient = getRgbClient()\n const ret = await rgbClient.lightning.decodeLnInvoice(decodeInvoiceArgs)\n return ret\n}\n\nasync function getInvoiceStatus({\n invoice,\n}) {\n const rgbClient = getRgbClient()\n const getInvoiceStatusArgs = { invoice }\n checkObjectArgs(getInvoiceStatusArgs, [\"invoice\"])\n const ret = await rgbClient.lightning.getInvoiceStatus(getInvoiceStatusArgs)\n return ret\n}\n\nasync function getPayment({\n payment_hash,\n}) {\n const rgbClient = getRgbClient()\n const getPaymentArgs = { payment_hash }\n checkObjectArgs(getPaymentArgs, [\"payment_hash\"])\n const ret = await rgbClient.lightning.getPayment(getPaymentArgs)\n return ret\n}\n\nasync function listInvoices() {\n const rgbClient = getRgbClient()\n const ret = await rgbClient.lightning.listInvoices()\n return ret\n}\n\nasync function listPayments() {\n const rgbClient = getRgbClient()\n const ret = await rgbClient.lightning.listPayments()\n return ret\n}\n\nmodule.exports = {\n connectPeer,\n listChannels,\n openChannel,\n closeChannel,\n listPeers,\n disconnectPeer,\n createInvoice,\n payInvoice,\n decodeLnInvoice,\n isConnectPeer,\n getInvoiceStatus,\n getPayment,\n listInvoices,\n listPayments,\n}\n", "const { checkObjectArgs } = require(\"@business/common\")\nconst { getConfig } = require(\"@business/common/getConfig.js\")\nconst Logger = require(\"@business/utils/linkLogger\")\nconst {\n TRANSACTION_STATUS,\n NODE_TYPE,\n TRANSACTION_KIND,\n TRANSACTION_DIRECTION,\n TRANSACTION_ASSET_TYPE,\n SATS_ID,\n TASKS,\n INVOICE_EXPIRY_TIME,\n} = require(\"@constants/index\")\nconst {\n upsertTransactionByFilter,\n getTransactionsByFilter,\n} = require(\"../prisma/db/transactions\")\nconst { reportTaskCompletion } = require(\"../report/reportService\")\n\nconst getRgbClient = require(\"./client\")\n\nasync function sendBTC({\n address,\n amount,\n fee_rate = 5,\n skip_sync = false,\n event_id,\n lnlinkUser,\n}) {\n const logger = new Logger(\"rgb-onchain\")\n if (!address) {\n throw new Error(\"address is required\")\n }\n if (!amount) {\n throw new Error(\"amount is required\")\n }\n if (amount <= 0) {\n throw new Error(\"amount must be greater than 0\")\n }\n if (fee_rate <= 0) {\n throw new Error(\"fee_rate must be greater than 0\")\n }\n\n try {\n const pendingTxs = await getTransactionsByFilter({\n node_type: NODE_TYPE.RGB,\n transaction_kind: TRANSACTION_KIND.ONCHAIN,\n direction: TRANSACTION_DIRECTION.OUT,\n status: TRANSACTION_STATUS.PENDING,\n })\n const rgbClient = getRgbClient()\n\n if (pendingTxs && pendingTxs.length > 0) {\n throw new Error(\n `There is already a pending BTC transaction to address ${pendingTxs[0].target_address}. Please wait for it to complete.`,\n )\n }\n\n const ret = await rgbClient.onchain.sendBtc({\n address,\n amount,\n fee_rate,\n skip_sync,\n })\n\n const filter = {\n tx_hash: ret.txid,\n }\n\n await upsertTransactionByFilter(\n {\n event_id,\n user_npub: lnlinkUser.npub,\n node_type: NODE_TYPE.RGB,\n transaction_kind: TRANSACTION_KIND.ONCHAIN,\n direction: TRANSACTION_DIRECTION.OUT,\n asset_type: TRANSACTION_ASSET_TYPE.BTC,\n target_address: address,\n asset_amount: amount.toString(),\n fees_paid: fee_rate.toString(),\n status: TRANSACTION_STATUS.PENDING,\n create_at: Math.floor(Date.now() / 1000),\n update_at: Math.floor(Date.now() / 1000),\n tx_hash: ret.txid,\n },\n filter,\n )\n\n refreshTransfers({ skip_sync: false })\n logger.info(`BTC sent successfully, tx_hash: ${ret.txid}`)\n return ret\n }\n catch (error) {\n logger.error(`Error in sendBTC: ${error.message}`)\n throw error\n }\n}\n\nasync function newAddress({ event_id, lnlinkUser }) {\n const logger = new Logger(\"rgb-onchain\")\n try {\n const rgbClient = getRgbClient()\n const ret = await rgbClient.onchain.getAddress()\n const address = ret.address\n\n // Create or update transaction record for the new address\n const filter = {\n target_address: address,\n node_type: NODE_TYPE.RGB,\n transaction_kind: TRANSACTION_KIND.ONCHAIN,\n direction: TRANSACTION_DIRECTION.IN,\n asset_type: TRANSACTION_ASSET_TYPE.BTC,\n asset_id: SATS_ID,\n }\n\n await upsertTransactionByFilter(\n {\n event_id,\n user_npub: lnlinkUser.npub,\n node_type: NODE_TYPE.RGB,\n transaction_kind: TRANSACTION_KIND.ONCHAIN,\n direction: TRANSACTION_DIRECTION.IN,\n asset_type: TRANSACTION_ASSET_TYPE.BTC,\n target_address: address,\n asset_id: SATS_ID,\n status: TRANSACTION_STATUS.PENDING,\n create_at: Math.floor(Date.now() / 1000),\n update_at: Math.floor(Date.now() / 1000),\n },\n filter,\n )\n\n logger.info(`Created transaction record for new address: ${address}`)\n /* if (lnlinkUser) {\n reportTaskCompletion({\n nostrAddress: lnlinkUser.npub,\n tag: TASKS.RGBAssetMainnetWithdraw,\n })\n } */\n return ret\n }\n catch (error) {\n logger.error(`Error in newAddress: ${error.message}`)\n throw error\n }\n}\n\nasync function getBTCBalance() {\n const rgbClient = getRgbClient()\n const ret = await rgbClient.onchain.getBtcBalance({\n skip_sync: false,\n })\n return ret\n}\n// rgb\nasync function createRgbInvoice({\n asset_id,\n duration_seconds = INVOICE_EXPIRY_TIME[\"10m\"],\n min_confirmations = 1,\n event_id,\n lnlinkUser,\n}) {\n const logger = new Logger(\"rgb-onchain\")\n try {\n const rgbClient = getRgbClient()\n const ret = await rgbClient.rgb.createRgbInvoice({\n asset_id,\n duration_seconds,\n min_confirmations,\n witness: false,\n })\n\n // Only create transaction record if user_npub is provided\n if (lnlinkUser && lnlinkUser.npub && event_id) {\n // Create or update transaction record for the RGB invoice\n const filter = {\n node_type: NODE_TYPE.RGB,\n transaction_kind: TRANSACTION_KIND.ONCHAIN,\n direction: TRANSACTION_DIRECTION.IN,\n asset_type: TRANSACTION_ASSET_TYPE.RGB_ASSET,\n asset_id,\n target_address: ret.recipient_id,\n }\n\n await upsertTransactionByFilter(\n {\n event_id,\n user_npub: lnlinkUser.npub,\n node_type: NODE_TYPE.RGB,\n transaction_kind: TRANSACTION_KIND.ONCHAIN,\n direction: TRANSACTION_DIRECTION.IN,\n asset_type: TRANSACTION_ASSET_TYPE.RGB_ASSET,\n asset_id,\n target_address: ret.recipient_id,\n invoice: ret.invoice,\n status: TRANSACTION_STATUS.PENDING,\n create_at: Math.floor(Date.now() / 1000),\n update_at: Math.floor(Date.now() / 1000),\n expire_at: ret.expiration_timestamp,\n },\n filter,\n )\n\n logger.info(\n `RGB invoice created successfully with transaction record, invoice: ${ret.invoice}`,\n )\n }\n else {\n logger.info(`RGB invoice created successfully, invoice: ${ret.invoice}`)\n }\n\n refreshTransfers({ skip_sync: false })\n return ret\n }\n catch (error) {\n logger.error(`Error in createRgbInvoice: ${error.message}`)\n throw error\n }\n}\n\nasync function payRgbInvoice({\n invoice,\n asset_id,\n amount,\n fee_rate = 5,\n skip_sync = false,\n transport_endpoints = [getConfig().LINK_RGB_PROXY_ENDPOINT],\n event_id,\n lnlinkUser,\n}) {\n const logger = new Logger(\"rgb-onchain\")\n try {\n checkObjectArgs(\n {\n invoice,\n asset_id,\n amount,\n },\n [\"invoice\", \"asset_id\", \"amount\"],\n )\n\n // Check for pending transactions\n /* const pendingTxs = await getTransactionsByFilter({\n node_type: NODE_TYPE.RGB,\n transaction_kind: TRANSACTION_KIND.ONCHAIN,\n direction: TRANSACTION_DIRECTION.OUT,\n status: TRANSACTION_STATUS.PENDING,\n asset_id,\n })\n\n if (pendingTxs && pendingTxs.list && pendingTxs.list.length > 0) {\n throw new Error(`There is already a pending RGB asset transaction for asset ${asset_id}. Please wait for it to complete.`)\n } */\n\n const decodedInvoice = await decodeRgbInvoice({ invoice })\n const targetAddress = decodedInvoice.recipient_id\n\n const filter = {\n node_type: NODE_TYPE.RGB,\n transaction_kind: TRANSACTION_KIND.ONCHAIN,\n direction: TRANSACTION_DIRECTION.OUT,\n asset_type: TRANSACTION_ASSET_TYPE.RGB_ASSET,\n asset_id,\n target_address: targetAddress,\n }\n const txnsByTargetAddress = await getTransactionsByFilter(filter)\n if (\n txnsByTargetAddress\n && txnsByTargetAddress.list\n && txnsByTargetAddress.list.length > 0\n ) {\n throw new Error(\n `recipient_id ${targetAddress} already exists in database`,\n )\n }\n const rgbClient = getRgbClient()\n const ret = await rgbClient.rgb.payRgbInvoice({\n invoice,\n asset_id,\n amount,\n fee_rate,\n skip_sync,\n transport_endpoints,\n })\n\n // Create or update transaction record if user info is provided\n if (lnlinkUser && lnlinkUser.npub) {\n const filter = {\n node_type: NODE_TYPE.RGB,\n transaction_kind: TRANSACTION_KIND.ONCHAIN,\n direction: TRANSACTION_DIRECTION.OUT,\n asset_type: TRANSACTION_ASSET_TYPE.RGB_ASSET,\n asset_id,\n invoice,\n }\n\n await upsertTransactionByFilter(\n {\n event_id,\n user_npub: lnlinkUser.npub,\n node_type: NODE_TYPE.RGB,\n transaction_kind: TRANSACTION_KIND.ONCHAIN,\n direction: TRANSACTION_DIRECTION.OUT,\n asset_type: TRANSACTION_ASSET_TYPE.RGB_ASSET,\n asset_id,\n asset_amount: `${amount}`,\n invoice,\n target_address: targetAddress,\n status: TRANSACTION_STATUS.PENDING,\n create_at: Math.floor(Date.now() / 1000),\n update_at: Math.floor(Date.now() / 1000),\n tx_hash: ret.txid,\n },\n filter,\n )\n\n logger.info(\n `RGB payment sent successfully with transaction record, txid: ${ret.txid}`,\n )\n reportTaskCompletion({\n nostrAddress: lnlinkUser.npub,\n tag: TASKS.RGBAssetMainnetWithdraw,\n })\n }\n else {\n logger.info(`RGB payment sent successfully, txid: ${ret.txid}`)\n }\n\n refreshTransfers({ skip_sync: false })\n return ret\n }\n catch (error) {\n logger.error(`Error in payRgbInvoice: ${error.message}`)\n throw error\n }\n}\n\nasync function decodeRgbInvoice({ invoice }) {\n checkObjectArgs({ invoice }, [\"invoice\"])\n const rgbClient = getRgbClient()\n const ret = await rgbClient.rgb.decodeRgbInvoice({ invoice })\n return ret\n}\n\nasync function refreshTransfers({ skip_sync = false }) {\n const rgbClient = getRgbClient()\n const ret = await rgbClient.rgb.refreshTransfers({ skip_sync })\n return ret\n}\n\nasync function getAssetBalance({ asset_id }) {\n const getAssetBalanceArgs = {\n asset_id,\n }\n checkObjectArgs(getAssetBalanceArgs, [\"asset_id\"])\n const rgbClient = getRgbClient()\n const ret = await rgbClient.rgb.getAssetBalance(getAssetBalanceArgs)\n return ret\n}\n/*\n\"up_to\": true,\n \"num\": 100,\n \"size\": 300000,\n \"fee_rate\": 5,\n \"skip_sync\": false\n*/\nasync function createUtxos({\n up_to = true,\n num,\n size,\n fee_rate = 5,\n skip_sync = false,\n}) {\n const createUtxosArgs = {\n up_to,\n num,\n size,\n fee_rate,\n skip_sync,\n }\n checkObjectArgs(createUtxosArgs, [\n \"up_to\",\n \"num\",\n \"size\",\n \"fee_rate\",\n \"skip_sync\",\n ])\n const rgbClient = getRgbClient()\n const ret = await rgbClient.onchain.createUtxos(createUtxosArgs)\n refreshTransfers({ skip_sync: false })\n return ret\n}\n\nasync function listUnspents({ skip_sync = false }) {\n const listUnspentsArgs = {\n skip_sync,\n }\n const rgbClient = getRgbClient()\n const ret = await rgbClient.onchain.listUnspents(listUnspentsArgs)\n return ret\n}\n\nasync function listTransfers({ asset_id }) {\n const rgbClient = getRgbClient()\n const ret = await rgbClient.rgb.listTransfers(asset_id)\n return ret\n}\n\nasync function listTransactions({ skip_sync = false }) {\n const listTransactionsArgs = {\n skip_sync,\n }\n const rgbClient = getRgbClient()\n const ret = await rgbClient.rgb.listTransactions(listTransactionsArgs)\n return ret\n}\n\nasync function getTransaction({ tx_hash, skip_sync = false }) {\n checkObjectArgs({ tx_hash }, [\"tx_hash\"])\n const logger = new Logger(\"rgb-onchain\")\n try {\n const listResult = await listTransactions({ skip_sync })\n if (listResult && listResult.transactions) {\n const transaction = listResult.transactions.find(\n tx => tx.txid === tx_hash,\n )\n return transaction || null\n }\n\n return null\n }\n catch (error) {\n logger.error(`Error in getTransaction: ${error.message}`)\n throw error\n }\n}\n\nmodule.exports = {\n payRgbInvoice,\n newAddress,\n sendBTC,\n getBTCBalance,\n createRgbInvoice,\n decodeRgbInvoice,\n refreshTransfers,\n getAssetBalance,\n createUtxos,\n listUnspents,\n listTransfers,\n listTransactions,\n getTransaction,\n}\n", "const { getCombinedNodeInfo } = require(\"./info\")\n\nconst {\n closeChannel,\n connectPeer,\n createInvoice,\n decodeLnInvoice,\n disconnectPeer,\n listPeers,\n openChannel,\n payInvoice,\n listChannels,\n isConnectPeer,\n} = require(\"./lightning\")\nconst {\n genSeed,\n getNodeState,\n unlockNode,\n backupNode,\n restoreNode,\n getRGBAssetsList,\n} = require(\"./node\")\n\nconst {\n createRgbInvoice,\n decodeRgbInvoice,\n getAssetBalance,\n getBTCBalance,\n newAddress,\n payRgbInvoice,\n refreshTransfers,\n sendBTC,\n createUtxos,\n listUnspents,\n listTransactions,\n listTransfers,\n} = require(\"./onchain\")\n\nmodule.exports = {\n getCombinedNodeInfo,\n getNodeState,\n genSeed,\n unlockNode,\n listPeers,\n openChannel,\n closeChannel,\n connectPeer,\n disconnectPeer,\n createInvoice,\n payInvoice,\n decodeLnInvoice,\n createRgbInvoice,\n payRgbInvoice,\n decodeRgbInvoice,\n refreshTransfers,\n getAssetBalance,\n\n getBTCBalance,\n newAddress,\n sendBTC,\n listChannels,\n createUtxos,\n listUnspents,\n listTransactions,\n listTransfers,\n isConnectPeer,\n backupNode,\n restoreNode,\n getRGBAssetsList,\n}\n", "const {\n startRGB,\n stopRGB,\n restartRGB,\n} = require(\"../nodeManage\")\n\nconst {\n closeChannel,\n connectPeer,\n createInvoice,\n createRgbInvoice,\n decodeLnInvoice,\n decodeRgbInvoice,\n disconnectPeer,\n genSeed,\n getBTCBalance,\n getCombinedNodeInfo,\n getNodeState,\n listChannels,\n listPeers,\n newAddress,\n openChannel,\n payInvoice,\n payRgbInvoice,\n sendBTC,\n unlockNode,\n createUtxos,\n listUnspents,\n backupNode,\n restoreNode,\n getRGBAssetsList,\n} = require(\"../rgb\")\n\nfunction rgbProxy() {\n return {\n // ---node manager\n start_rgb: async () => {\n return {\n method: startRGB,\n argNames: [],\n readonly: false,\n }\n },\n stop_rgb: async () => {\n return {\n method: stopRGB,\n argNames: [],\n readonly: false,\n }\n },\n restart_rgb: async () => {\n return {\n method: restartRGB,\n argNames: [],\n readonly: false,\n }\n },\n get_state: async () => {\n return {\n method: getNodeState,\n argNames: [],\n readonly: true,\n }\n },\n // ---onchain\n get_info: async () => {\n return {\n method: getCombinedNodeInfo,\n argNames: [],\n readonly: true,\n }\n },\n list_assets: async () => {\n return {\n method: getRGBAssetsList,\n argNames: [],\n readonly: true,\n }\n },\n genseed: async () => {\n return {\n method: genSeed,\n argNames: [\"password\"],\n readonly: false,\n }\n },\n unlock: async () => {\n return {\n method: unlockNode,\n argNames: [\"password\"],\n readonly: false,\n }\n },\n init_wallet: async () => {\n return {\n method: unlockNode,\n argNames: [\"password\"],\n readonly: false,\n }\n },\n wallet_balance: async () => {\n return {\n method: getBTCBalance,\n argNames: [],\n readonly: true,\n }\n },\n new_address: async () => {\n return {\n method: newAddress,\n argNames: [],\n readonly: false,\n }\n },\n send_coins: async () => {\n return {\n method: sendBTC,\n argNames: [\"address\", \"amount\"],\n readonly: false,\n }\n },\n create_utxos: async () => {\n return {\n method: createUtxos,\n argNames: [\"up_to\", \"num\", \"size\", \"fee_rate\"],\n readonly: false,\n }\n },\n list_unspents: async () => {\n return {\n method: listUnspents,\n argNames: [],\n readonly: true,\n }\n },\n // ---assets & channels\n create_rgb_invoice: async () => {\n return {\n method: createRgbInvoice,\n argNames: [\"asset_id\"],\n readonly: false,\n }\n },\n pay_rgb_invoice: async () => {\n return {\n method: payRgbInvoice,\n argNames: [\"invoice\"],\n readonly: false,\n }\n },\n decode_rgb_invoice: async () => {\n return {\n method: decodeRgbInvoice,\n argNames: [\"invoice\"],\n readonly: true,\n }\n },\n // peer_pubkey_and_opt_addr is a string, like \"030000000000000000000000000000000000000000000000000000000000000000@127.0.0.1:9735\"\n connect_peer: async () => {\n return {\n method: connectPeer,\n argNames: [],\n readonly: false,\n }\n },\n disconnect_peer: async () => {\n return {\n method: disconnectPeer,\n argNames: [\"peer_pubkey\"],\n readonly: false,\n }\n },\n list_peers: async () => {\n return {\n method: listPeers,\n argNames: [],\n readonly: true,\n }\n },\n list_channels: async () => {\n return {\n method: listChannels,\n argNames: [],\n readonly: true,\n }\n },\n open_channel: async () => {\n return {\n method: openChannel,\n argNames: [\"fee_base_msat\", \"capacity_sat\"],\n readonly: false,\n }\n },\n close_channel: async () => {\n return {\n method: closeChannel,\n argNames: [\"channel_id\", \"peer_pubkey\"],\n readonly: false,\n }\n },\n // ---lightning\n create_invoice: async () => {\n return {\n method: createInvoice,\n argNames: [],\n readonly: false,\n }\n },\n pay_invoice: async () => {\n return {\n method: payInvoice,\n argNames: [\"invoice\"],\n readonly: false,\n }\n },\n decode_ln_invoice: async () => {\n return {\n method: decodeLnInvoice,\n argNames: [\"invoice\"],\n readonly: true,\n }\n },\n backup_node: async () => {\n return {\n method: backupNode,\n argNames: [\"password\"],\n readonly: false,\n }\n },\n restore_node: async () => {\n return {\n method: restoreNode,\n argNames: [\"password\"],\n readonly: false,\n }\n },\n }\n}\n\nmodule.exports = rgbProxy\n", "const {\n nip04,\n finishEvent: finalizeEvent,\n SimplePool,\n getPublicKey,\n} = require(\"nostr-tools\")\nconst ws = require(\"ws\")\n\nglobalThis.WebSocket = ws\nconst dayjs = require(\"dayjs\")\n\n// Enhanced pool configuration with better connection management\nconst pool = new SimplePool({\n getTimeout: 20 * 1000,\n // Add connection verification options\n verifyEvent: true,\n // IMPORTANT: Disable seenOn cache to prevent memory leak\n // The _seenOn object stores event IDs indefinitely and is never cleaned up\n // This causes memory to grow continuously as more events are received\n seenOnEnabled: false,\n})\nconst { getConfig } = require(\"@business/common/getConfig.js\")\nconst Logger = require(\"@business/utils/linkLogger.js\")\n\nlet relays = null\n\n// Enhanced connection health monitoring\nconst connectionHealth = new Map()\nlet lastConnectionCheck = null\n\nfunction getRelays() {\n if (!relays) {\n const { LINK_NOSTR_RELAY_URI } = getConfig()\n if (!LINK_NOSTR_RELAY_URI || !Array.isArray(LINK_NOSTR_RELAY_URI)) {\n throw new Error(\"LINK_NOSTR_RELAY_URI configuration not available or not an array\")\n }\n relays = [...LINK_NOSTR_RELAY_URI]\n }\n return relays\n}\n\nfunction closeRelayConnection(relayUrl) {\n try {\n const normalizedUrl = normalizeURL(relayUrl)\n const conn = pool._conn?.[normalizedUrl]\n if (conn && typeof conn.close === \"function\") {\n conn.close()\n }\n if (pool._conn && normalizedUrl in pool._conn) {\n delete pool._conn[normalizedUrl]\n }\n }\n catch (error) {\n const logger = new Logger(\"nostr\")\n logger.debug(`Error closing relay connection for ${relayUrl}: ${error.message}`)\n }\n}\n\nfunction refreshRelayConnection(relayUrl) {\n const logger = new Logger(\"nostr\")\n closeRelayConnection(relayUrl)\n connectionHealth.delete(relayUrl)\n logger.info(`Relay ${relayUrl} marked for reconnect`)\n}\n\nasync function buildEvent({\n message,\n kind = 4,\n targetPubkey,\n privateKey,\n tags,\n}) {\n if (!message) {\n throw new Error(\"No message provided.\")\n }\n let ciphertext = \"\"\n if (kind === 4 || kind === 23195 || kind === 24133) {\n ciphertext = await nip04.encrypt(privateKey, targetPubkey, message)\n }\n else {\n ciphertext = message\n }\n const created_at = dayjs().unix()\n const event = {\n content: ciphertext,\n kind,\n tags,\n created_at,\n }\n\n return finalizeEvent(event, privateKey)\n}\nasync function execSendMessage({\n message,\n sendToNostrAddress,\n robotPrivatekey,\n kind = 4,\n replyEventId,\n}) {\n const logger = new Logger(\"nostr\")\n const tags = sendToNostrAddress\n ? [\n [\"p\", sendToNostrAddress],\n ]\n : []\n if (replyEventId) {\n tags.push([\"e\", replyEventId])\n }\n const event = await buildEvent({\n message,\n kind,\n targetPubkey: sendToNostrAddress,\n privateKey: robotPrivatekey,\n tags,\n })\n await publishEventToRelays(event, logger)\n return event\n}\n\nasync function execSendMessageAndReturn({\n message,\n sendToNostrAddress,\n robotPrivatekey,\n kind = 4,\n}) {\n const logger = new Logger(\"nostr\")\n const tags = sendToNostrAddress\n ? [\n [\"p\", sendToNostrAddress],\n [\"r\", \"json\"],\n ]\n : []\n const event = await buildEvent({\n message,\n kind,\n targetPubkey: sendToNostrAddress,\n privateKey: robotPrivatekey,\n tags,\n })\n\n await publishEventToRelays(event, logger)\n\n const p = getPublicKey(robotPrivatekey)\n\n const filter = {\n \"since\": event.created_at - 50,\n \"kinds\": [4],\n \"#e\": [event.id],\n \"#p\": [p],\n }\n const retEvent = await pool.get(getRelays(), filter, { maxWait: 5000 }).catch((e) => {\n logger.error(`e.message----> ${e?.message}`)\n return null\n })\n\n if (!retEvent) {\n return null\n }\n const content = retEvent.content\n let result = null\n const decryptContent = await nip04.decrypt(robotPrivatekey, sendToNostrAddress, content).catch((e) => {\n logger.error(`decryptContent error ${e?.message}`)\n })\n\n if (decryptContent) {\n try {\n result = JSON.parse(decryptContent)\n }\n catch (error) {\n logger.error(`execSendMessageAndReturn ~ error: ${error?.message}`)\n return null\n }\n return result\n }\n}\n\nasync function publishEventToRelays(event, logger = new Logger(\"nostr\")) {\n const relays = getRelays()\n const publishPromises = pool.publish(relays, event)\n const results = await Promise.allSettled(publishPromises)\n\n const failedRelays = []\n const successfulRelays = []\n\n results.forEach((result, index) => {\n const relay = relays[index]\n if (result.status === \"fulfilled\") {\n successfulRelays.push(relay)\n }\n else {\n const reason = result.reason?.message || String(result.reason)\n failedRelays.push({ relay, reason })\n }\n })\n\n if (failedRelays.length > 0) {\n for (const { relay, reason } of failedRelays) {\n logger.warn(`Failed to publish event to relay ${relay}: ${reason}`)\n\n const reasonStr = typeof reason === \"string\" ? reason.toLowerCase() : \"\"\n if (reasonStr.includes(\"rate-limited\")) {\n // Relay is only asking us to slow down; keep the connection so subscriptions stay alive\n continue\n }\n\n closeRelayConnection(relay)\n }\n }\n\n if (successfulRelays.length === 0) {\n throw new Error(\"Failed to publish event on all configured relays\")\n }\n\n return { successfulRelays, failedRelays }\n}\n\nasync function setProfile({ name, wrappersk }) {\n await execSendMessage({\n message: JSON.stringify({\n name,\n // picture: 'https://image.nostr.build/b7625112f6c55f096f79eb23faa21e5c10d5e0c3dc63d9fc91f821186a7a029e.png',\n }),\n kind: 0,\n robotPrivatekey: wrappersk,\n })\n}\n\nfunction publish(newEvent) {\n return pool.publish(getRelays(), newEvent)\n}\n\n/**\n * Enhanced connection health check for the pool\n */\nfunction checkPoolHealth() {\n const logger = new Logger(\"nostr\")\n const now = Date.now()\n let healthyConnections = 0\n let totalConnections = 0\n\n for (const relay of getRelays()) {\n totalConnections++\n try {\n // Normalize URL to match pool's internal format\n const normalizedUrl = normalizeURL(relay)\n const connection = pool._conn?.[normalizedUrl]\n\n if (connection && connection.status === ws.OPEN) {\n healthyConnections++\n connectionHealth.set(relay, {\n status: \"healthy\",\n lastCheck: now,\n connectionStatus: connection.status,\n })\n }\n else {\n connectionHealth.set(relay, {\n status: \"unhealthy\",\n lastCheck: now,\n connectionStatus: connection?.status || \"unknown\",\n })\n }\n }\n catch (error) {\n logger.debug(`Error checking connection health for ${relay}: ${error.message}`)\n connectionHealth.set(relay, {\n status: \"error\",\n lastCheck: now,\n error: error.message,\n })\n }\n }\n\n lastConnectionCheck = now\n return {\n healthy: healthyConnections,\n total: totalConnections,\n ratio: totalConnections > 0 ? healthyConnections / totalConnections : 0,\n }\n}\n\n/**\n * Normalize URL function to match pool's internal format\n */\nfunction normalizeURL(url) {\n const logger = new Logger(\"nostr\")\n try {\n const p = new URL(url)\n p.pathname = p.pathname.replace(/\\/+/g, \"/\")\n if (p.pathname.endsWith(\"/\"))\n p.pathname = p.pathname.slice(0, -1)\n if ((p.port === \"80\" && p.protocol === \"ws:\") || (p.port === \"443\" && p.protocol === \"wss:\"))\n p.port = \"\"\n p.searchParams.sort()\n p.hash = \"\"\n return p.toString()\n }\n catch (error) {\n logger.warn(`Failed to normalize URL ${url}: ${error.message}`)\n return url\n }\n}\n\n/**\n * Force close all connections and recreate the pool\n * FIX #5: Enhanced pool reset to clear subscriptions and internal state\n */\nfunction resetPool() {\n const logger = new Logger(\"nostr\")\n logger.warn(\"Resetting nostr pool due to connection issues\")\n\n try {\n // Close all existing connections\n if (pool._conn) {\n for (const [url, conn] of Object.entries(pool._conn)) {\n try {\n if (conn && typeof conn.close === \"function\") {\n conn.close()\n }\n }\n catch (error) {\n logger.debug(`Error closing connection to ${url}: ${error.message}`)\n }\n }\n // FIX #5: Clear the connection map to force recreation\n pool._conn = {}\n }\n\n // FIX #5: Clear subscription tracking if it exists\n if (pool._subscriptions) {\n try {\n // Unsubscribe all active subscriptions\n for (const [subId, sub] of Object.entries(pool._subscriptions)) {\n try {\n if (sub && typeof sub.unsub === \"function\") {\n sub.unsub()\n }\n }\n catch (error) {\n logger.debug(`Error unsubscribing ${subId}: ${error.message}`)\n }\n }\n pool._subscriptions = {}\n }\n catch (error) {\n logger.debug(`Error clearing subscriptions: ${error.message}`)\n }\n }\n\n // Clear _seenOn cache to prevent memory leak (even if seenOnEnabled is false)\n if (pool._seenOn) {\n pool._seenOn = {}\n }\n\n // Clear connection tracking\n connectionHealth.clear()\n\n // Note: We don't recreate the pool here as it's a singleton\n // The pool will recreate connections as needed\n logger.info(\"Pool reset completed - all connections and subscriptions cleared\")\n }\n catch (error) {\n logger.error(`Error during pool reset: ${error.message}`)\n }\n}\n\n/**\n * Get current connection health status\n */\nfunction getConnectionHealth() {\n return {\n connections: Object.fromEntries(connectionHealth),\n lastCheck: lastConnectionCheck,\n summary: checkPoolHealth(),\n }\n}\n\nmodule.exports = {\n getRelays,\n pool,\n publish,\n execSendMessage,\n execSendMessageAndReturn,\n setProfile,\n checkPoolHealth,\n getConnectionHealth,\n resetPool,\n refreshRelayConnection,\n}\n", "const { NWC_PERMISSIONS } = require(\"../../constants/index.js\")\nconst {\n\n NWC_CONSTANTS,\n} = require(\"../config/constants.js\")\nconst { execSendMessage } = require(\"../nostrPool.js\")\n\n/**\n * Send service information\n * @param {string} sk - Private key\n */\nasync function sendInfo(sk) {\n await execSendMessage({\n message: NWC_PERMISSIONS.join(\" \"),\n kind: NWC_CONSTANTS.INFO_KIND,\n robotPrivatekey: sk,\n })\n}\n\nfunction toLine(name) {\n return name.replace(/([A-Z])/g, \"_$1\").toLowerCase()\n}\n\nmodule.exports = {\n sendInfo,\n toLine,\n}\n", "const { getLnlinkUser } = require(\"@business/service/prisma/dbService.js\")\n\nconst Logger = require(\"@business/utils/linkLogger.js\")\nconst dayjs = require(\"dayjs\")\nconst { ethers } = require(\"ethers\")\n\nconst { ACCOUNT_TYPE } = require(\"../../constants/index.js\")\nconst {\n NWC_ERROR_TYPES,\n NWC_ERROR_MESSAGES,\n PRIVILEGED_METHODS,\n FLASH_ACCOUNT_METHODS,\n} = require(\"../config/constants.js\")\n\n/**\n * Combine NWC error response\n * @param {string} method - Method name\n * @param {string} code - Error code\n * @param {string} msg - Error message\n * @returns {object} NWC error object\n */\nfunction constructNWCErr(method, code, msg) {\n return {\n result_type: method,\n error: {\n code,\n message: msg,\n },\n result: null,\n }\n}\n\n/**\n * Pre-call authentication check\n * @param {string} methodName - Method name\n * @param {string} code - Signature code\n * @param {string} subFrom - Source public key\n * @param {string} social_args_id - Social ID parameter\n * @returns {object} Authentication result\n */\nasync function preCallAuth(methodName, code, subFrom, social_args_id) {\n let authValid = true\n let ret = null\n const logger = new Logger(\"nostr-auth\")\n const lnlinkUser = await getLnlinkUser({\n pubkey: subFrom,\n include_expired: true,\n })\n\n if (!lnlinkUser) {\n authValid = false\n ret = constructNWCErr(methodName, NWC_ERROR_TYPES.RESTRICTED, NWC_ERROR_MESSAGES.ACCOUNT_NOT_AVAILABLE)\n }\n\n if (!authValid) {\n return {\n ret,\n authValid,\n lnlinkUser,\n }\n }\n\n const {\n account_type,\n social_id,\n permissions,\n npub,\n } = lnlinkUser\n\n logger.info(`Nostr preCallAuth User ${npub} accountType ${account_type} social_id ${social_id} call ${methodName}`)\n const jsonPermissions = JSON.parse(permissions)\n // Check permissions\n if (!jsonPermissions.includes(methodName)) {\n authValid = false\n ret = constructNWCErr(methodName, NWC_ERROR_TYPES.RESTRICTED, NWC_ERROR_MESSAGES.NO_PERMISSION)\n }\n if (\n account_type === ACCOUNT_TYPE.NWC\n || account_type === ACCOUNT_TYPE.FLASH\n || account_type === ACCOUNT_TYPE.FLASH_REGISTER\n ) {\n // Check additional restrictions for privileged methods\n if (PRIVILEGED_METHODS.includes(methodName)) {\n if (lnlinkUser.status === 0) {\n authValid = false\n ret = constructNWCErr(methodName, NWC_ERROR_TYPES.RESTRICTED, NWC_ERROR_MESSAGES.ACCOUNT_NOT_ACTIVE)\n }\n if (lnlinkUser.expire_time < dayjs().unix()) {\n authValid = false\n ret = constructNWCErr(methodName, NWC_ERROR_TYPES.RESTRICTED, NWC_ERROR_MESSAGES.ACCOUNT_EXPIRED)\n }\n }\n\n // Social ID verification for Flash accounts\n if (\n (account_type === ACCOUNT_TYPE.FLASH || account_type === ACCOUNT_TYPE.FLASH_REGISTER)\n && FLASH_ACCOUNT_METHODS.includes(methodName)\n ) {\n if (methodName === \"buy_flash_account\") {\n if (social_args_id && code) {\n try {\n const recoveredAddress = ethers.verifyMessage(social_args_id, code)\n\n if (recoveredAddress.toLowerCase() !== social_id?.toLowerCase()) {\n authValid = false\n ret = constructNWCErr(methodName, NWC_ERROR_TYPES.RESTRICTED, NWC_ERROR_MESSAGES.SOCIAL_ID_MISMATCH)\n }\n }\n catch (error) {\n logger.error(`Error recovering signature: ${error.message}`)\n authValid = false\n ret = constructNWCErr(methodName, NWC_ERROR_TYPES.RESTRICTED, NWC_ERROR_MESSAGES.SOCIAL_ID_MISMATCH)\n }\n }\n }\n else {\n try {\n const recoveredAddress = ethers.verifyMessage(social_args_id, code)\n console.log(\"recoveredAddress\", recoveredAddress, social_args_id)\n if (recoveredAddress.toLowerCase() !== social_id?.toLowerCase()) {\n authValid = false\n ret = constructNWCErr(methodName, NWC_ERROR_TYPES.RESTRICTED, NWC_ERROR_MESSAGES.SOCIAL_ID_MISMATCH)\n }\n }\n catch (error) {\n logger.error(`Error recovering signature: ${error.message}`)\n authValid = false\n ret = constructNWCErr(methodName, NWC_ERROR_TYPES.RESTRICTED, NWC_ERROR_MESSAGES.SOCIAL_ID_MISMATCH)\n }\n }\n }\n }\n\n return {\n ret,\n authValid,\n lnlinkUser,\n }\n}\n\nmodule.exports = {\n constructNWCErr,\n preCallAuth,\n}\n", "const { updateEvent } = require(\"@business/service/prisma/dbService.js\")\nconst lndProxy = require(\"@business/service/proxy/lndProxy.js\")\nconst nwcProxy = require(\"@business/service/proxy/nwcProxy.js\")\nconst rgbProxy = require(\"@business/service/proxy/rgbProxy.js\")\nconst Logger = require(\"@business/utils/linkLogger.js\")\nconst { toLine } = require(\"@nostr/utils/nostrUtils.js\")\nconst {\n nip19,\n nip04,\n} = require(\"nostr-tools\")\nconst { EVENT_HANDLE_STATUS, SATS_ID } = require(\"../../constants/index.js\")\nconst { constructNWCErr, preCallAuth } = require(\"../auth/authService.js\")\nconst {\n ERROR_CODES,\n RESPONSE_MESSAGES,\n NWC_ERROR_TYPES,\n NWC_ERROR_MESSAGES,\n NWC_CONSTANTS,\n TAPROOT_METHOD_MAPPING,\n} = require(\"../config/constants.js\")\nconst { execSendMessage } = require(\"../nostrPool.js\")\n\n/**\n * Parse and execute message\n * @param {string} message - Message content\n * @param {string} subFrom - Source public key\n * @param {string} eventId - Event ID\n * @returns {string} Execution result JSON string\n */\nasync function parseAndExecute(message, subFrom, eventId) {\n try {\n const lndProxies = lndProxy()\n const rgbProxies = rgbProxy()\n const logger = new Logger(\"nostr-events\")\n let obj\n try {\n obj = JSON.parse(message)\n }\n catch {\n return JSON.stringify({\n code: ERROR_CODES.INVALID_JSON,\n data: null,\n msg: RESPONSE_MESSAGES.INVALID_JSON,\n })\n }\n\n if (!obj.method) {\n return JSON.stringify({\n code: ERROR_CODES.MISSING_METHOD,\n data: null,\n msg: RESPONSE_MESSAGES.MISSING_METHOD,\n })\n }\n\n const {\n method,\n params,\n node_type = \"lnd\",\n } = obj\n const toLineMethod = toLine(method)\n logger.info(`parseAndExecute method: ${method} node_type: ${node_type},from: ${nip19.npubEncode(subFrom)}`)\n\n const { authValid, lnlinkUser } = await preCallAuth(toLineMethod, \"\", subFrom, \"\")\n if (!authValid) {\n return JSON.stringify({\n code: ERROR_CODES.FORBIDDEN,\n data: null,\n msg: RESPONSE_MESSAGES.READONLY_FORBIDDEN,\n })\n }\n const callParams = {\n ...params,\n event_id: eventId,\n lnlinkUser,\n }\n\n let proxy = null\n if (node_type === \"lnd\") {\n if (!lndProxies[toLineMethod]) {\n return JSON.stringify({\n code: ERROR_CODES.METHOD_NOT_SUPPORTED,\n data: null,\n msg: `Method '${toLineMethod}' not supported`,\n })\n }\n proxy = await lndProxies[toLineMethod]()\n }\n else if (node_type === \"rgb\") {\n proxy = await rgbProxies[toLineMethod]()\n }\n\n const ret = await proxy.method(callParams)\n\n return JSON.stringify({\n code: 0,\n data: ret,\n msg: RESPONSE_MESSAGES.SUCCESS,\n })\n }\n catch (e) {\n const code = e.code || ERROR_CODES.INTERNAL_ERROR\n return JSON.stringify({\n code,\n data: null,\n msg: e.message,\n })\n }\n}\n\n/**\n * Parse event (assumes event is already claimed)\n * @param {object} event - Event object\n * @param {string} sk - Private key\n * @returns {object} Parse result\n */\nasync function parseEvent(event, sk) {\n const content = event.content\n const subFrom = event.from\n\n const decryptContent = await nip04.decrypt(sk, subFrom, content)\n if (event.kind === NWC_CONSTANTS.REQUEST_KIND) {\n await handleNWCRequest(event, sk, subFrom, decryptContent)\n }\n else if (event.kind === 4) {\n await handleDirectMessage(event, sk, subFrom, decryptContent)\n }\n\n return { result: true }\n}\n\n/**\n * Handle NWC request\n * @param {object} event - Event object\n * @param {string} sk - Private key\n * @param {string} subFrom - Source public key\n * @param {string} decryptContent - Decrypted content\n */\nasync function handleNWCRequest(event, sk, subFrom, decryptContent) {\n const objDecrypt = JSON.parse(decryptContent)\n const { method, params } = objDecrypt\n\n if (!method) {\n throw new Error(\"error decryptContent\")\n }\n\n const nwcProxies = nwcProxy()\n let ret = null\n\n if (!nwcProxies[method]) {\n ret = constructNWCErr(method, NWC_ERROR_TYPES.NOT_IMPLEMENTED, NWC_ERROR_MESSAGES.METHOD_NOT_SUPPORTED)\n }\n else {\n const {\n ret: preCallRet,\n authValid,\n lnlinkUser,\n } = await preCallAuth(method, params?.code, subFrom, params?.social_id)\n\n ret = preCallRet\n\n if (authValid) {\n const combinParams = {\n ...params,\n event_id: event.event_id,\n lnlinkUser,\n }\n\n let tempMethod = method\n if (lnlinkUser.asset_id === SATS_ID) {\n tempMethod = method\n }\n else {\n tempMethod = TAPROOT_METHOD_MAPPING[method] || method\n }\n\n ret = await nwcProxies[tempMethod](combinParams)\n }\n }\n\n const replyEvent = await execSendMessage({\n message: JSON.stringify(ret),\n sendToNostrAddress: subFrom,\n robotPrivatekey: sk,\n replyEventId: event.event_id,\n kind: NWC_CONSTANTS.RESPONSE_KIND,\n })\n\n const updateSuccess = await safeUpdateEvent(event.id, {\n status: EVENT_HANDLE_STATUS.SUCCESS,\n reply_event_id: replyEvent.id,\n })\n\n if (!updateSuccess) {\n throw new Error(\"Failed to update event status to success\")\n }\n}\n\n/**\n * Handle direct message\n * @param {object} event - Event object\n * @param {string} sk - Private key\n * @param {string} subFrom - Source public key\n * @param {string} decryptContent - Decrypted content\n */\nasync function handleDirectMessage(event, sk, subFrom, decryptContent) {\n const tags = JSON.parse(event.tags)\n const replyProxyAddr = tags?.find(item => item?.[0] === \"a\")?.[1]\n const replyTo = replyProxyAddr || subFrom\n const content = decryptContent\n\n const retMsg = await parseAndExecute(content, subFrom, event.event_id)\n\n if (retMsg) {\n const replyEvent = await execSendMessage({\n message: retMsg,\n sendToNostrAddress: replyTo,\n robotPrivatekey: sk,\n replyEventId: event.event_id,\n })\n\n const updateSuccess = await safeUpdateEvent(event.id, {\n status: EVENT_HANDLE_STATUS.SUCCESS,\n reply_event_id: replyEvent.id,\n })\n\n if (!updateSuccess) {\n throw new Error(\"Failed to update event status to success\")\n }\n }\n}\n\n/**\n * Safe database update with retry mechanism\n * @param {string} eventId - Event ID\n * @param {object} updateData - Update data\n * @param {number} maxRetries - Maximum retry attempts\n * @returns {boolean} Whether update was successful\n */\nasync function safeUpdateEvent(eventId, updateData, maxRetries = 3) {\n const logger = new Logger(\"nostr-events\")\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n const result = await updateEvent(eventId, updateData)\n if (result > 0) {\n return true\n }\n\n // If no rows affected, the event might not exist or already processed\n logger.warn(`Event ${eventId} update affected 0 rows (attempt ${attempt})`)\n\n if (attempt < maxRetries) {\n // Wait before retry with exponential backoff\n await new Promise(resolve => setTimeout(resolve, 2 ** attempt * 100))\n }\n }\n catch (error) {\n logger.error(`Database update error for event ${eventId} (attempt ${attempt}): ${error.message}`)\n\n // Check if it's a database corruption error\n if (error.code === \"SQLITE_CORRUPT\") {\n logger.error(`Database corruption detected for event ${eventId}`)\n throw new Error(`Database corruption: ${error.message}`)\n }\n\n // Check if it's a busy/locked error\n if (error.code === \"SQLITE_BUSY\" || error.code === \"SQLITE_LOCKED\") {\n if (attempt < maxRetries) {\n // Wait longer for busy/locked errors\n const delay = 2 ** attempt * 200 + Math.random() * 100\n logger.warn(`Database busy, retrying in ${delay}ms (attempt ${attempt})`)\n await new Promise(resolve => setTimeout(resolve, delay))\n continue\n }\n }\n\n if (attempt === maxRetries) {\n throw error\n }\n }\n }\n\n return false\n}\n\n/**\n * Process single event with database safety\n * @param {object} event - Event object\n * @param {string} sk - Private key\n * @returns {boolean} Whether processing was successful\n */\nasync function processSingleEvent(event, sk) {\n const eventId = event.id\n const logger = new Logger(\"nostr-events\")\n try {\n // First, try to claim the event by updating its status\n const claimed = await safeUpdateEvent(eventId, {\n status: EVENT_HANDLE_STATUS.REPLYING,\n })\n\n if (!claimed) {\n logger.debug(`Event ${eventId} could not be claimed, possibly already processing`)\n return false\n }\n\n logger.debug(`Successfully claimed event ${eventId} for processing`)\n\n // Process the event\n await parseEvent(event, sk)\n return true\n }\n catch (e) {\n logger.error(`Error processing event ${eventId}: ${e.message}`)\n\n // Try to update status to error, but don't fail if it doesn't work\n try {\n await safeUpdateEvent(eventId, {\n status: EVENT_HANDLE_STATUS.ERROR,\n reply_err: e.message,\n })\n }\n catch (updateError) {\n logger.error(`Failed to update event ${eventId} status to error: ${updateError.message}`)\n }\n\n return false\n }\n}\n\nmodule.exports = {\n parseAndExecute,\n parseEvent,\n processSingleEvent,\n}\n", "const {\n getUnReplyEvents,\n updateEvent,\n getMainLnlinkConfig,\n} = require(\"@business/service/prisma/dbService.js\")\nconst { sleep } = require(\"@business/utils/index.js\")\nconst Logger = require(\"@business/utils/linkLogger.js\")\nconst { EVENT_HANDLE_STATUS } = require(\"@constants/index.js\")\nconst { EVENT_PROCESSING_CONSTANTS } = require(\"../config/constants.js\")\nconst { processSingleEvent } = require(\"./eventProcessor.js\")\n\n/**\n * Rate limiter for Nostr requests - ensures max requests per second\n */\nclass RateLimiter {\n constructor(maxRequests = 3, timeWindow = 1000) {\n this.maxRequests = maxRequests\n this.timeWindow = timeWindow\n this.requests = []\n }\n\n async throttle() {\n const now = Date.now()\n this.requests = this.requests.filter(time => now - time < this.timeWindow)\n\n if (this.requests.length >= this.maxRequests) {\n const oldestRequest = this.requests[0]\n const waitTime = this.timeWindow - (now - oldestRequest) + 50 // 50ms buffer\n await sleep(waitTime)\n return this.throttle()\n }\n\n this.requests.push(now)\n }\n}\n\n/**\n * Concurrent event processor class\n */\nclass ConcurrentEventProcessor {\n constructor(maxConcurrent = 3, rateLimiter) {\n this.maxConcurrent = maxConcurrent\n this.rateLimiter = rateLimiter\n this.processingEvents = new Map() // eventId -> Promise\n this.maxQueueSize = Math.max(maxConcurrent * 2, 10)\n this.consecutiveErrors = 0\n this.recentErrors = [] // Track recent errors with timestamps\n this.logger = new Logger(\"concurrent-processor\")\n }\n\n /**\n * Process a single event with timeout and error handling\n * @param {object} event - Event to process\n * @param {string} sk - Private key\n * @returns {Promise<boolean>} Success status\n */\n async processEventAsync(event, sk) {\n const eventId = event.id\n\n try {\n // Rate limit before processing\n await this.rateLimiter.throttle()\n\n // Process with timeout and ensure timer cleanup to avoid leaks\n let timeoutId\n const timeoutPromise = new Promise((_, reject) => {\n timeoutId = setTimeout(\n () => reject(new Error(\"Event processing timeout\")),\n EVENT_PROCESSING_CONSTANTS.EVENT_PROCESSING_TIMEOUT,\n )\n })\n\n try {\n await Promise.race([\n processSingleEvent(event, sk),\n timeoutPromise,\n ])\n }\n finally {\n clearTimeout(timeoutId)\n }\n\n this.logger.debug(`Successfully processed event ${eventId}`)\n this.recordSuccess()\n return true\n }\n catch (error) {\n this.logger.error(`Failed to process event ${eventId}: ${error.message}`)\n this.recordError()\n if (error.message.includes(\"timeout\")) {\n try {\n await updateEvent(event.id, {\n status: EVENT_HANDLE_STATUS.ERROR,\n reply_err: error.message,\n })\n this.logger.debug(`Marked event ${eventId} as ERROR due to timeout`)\n }\n catch (updateError) {\n this.logger.error(`Failed to update event ${eventId} status to ERROR: ${updateError.message}`)\n }\n }\n\n return false\n }\n finally {\n // Remove from processing map\n this.processingEvents.delete(eventId)\n }\n }\n\n /**\n * Add event to processing queue\n * @param {object} event - Event to process\n * @param {string} sk - Private key\n */\n addEvent(event, sk) {\n const eventId = event.id\n\n if (this.processingEvents.has(eventId)) {\n this.logger.debug(`Event ${eventId} already being processed`)\n return\n }\n\n if (this.processingEvents.size >= this.maxConcurrent) {\n this.logger.debug(`Max concurrent limit reached (${this.maxConcurrent}), skipping event ${eventId}`)\n return\n }\n\n if (this.processingEvents.size >= this.maxQueueSize) {\n const oldestKey = this.processingEvents.keys().next().value\n if (oldestKey) {\n this.logger.warn(`Processing queue full (${this.processingEvents.size}), dropping oldest event ${oldestKey}`)\n this.processingEvents.delete(oldestKey)\n }\n }\n\n // Start processing asynchronously\n const processingPromise = this.processEventAsync(event, sk)\n this.processingEvents.set(eventId, processingPromise)\n\n this.logger.debug(`Added event ${eventId} to processing queue (${this.processingEvents.size}/${this.maxConcurrent})`)\n }\n\n /**\n * Get current processing status\n * @returns {object} Status information\n */\n getStatus() {\n // Clean up old errors (older than 5 minutes)\n const fiveMinutesAgo = Date.now() - 5 * 60 * 1000\n this.recentErrors = this.recentErrors.filter(timestamp => timestamp > fiveMinutesAgo)\n\n return {\n processing: this.processingEvents.size,\n maxConcurrent: this.maxConcurrent,\n consecutiveErrors: this.consecutiveErrors,\n recentErrorCount: this.recentErrors.length,\n }\n }\n\n /**\n * Record an error occurrence\n */\n recordError() {\n this.consecutiveErrors++\n this.recentErrors.push(Date.now())\n const MAX_RECENT_ERRORS = 100\n if (this.recentErrors.length > MAX_RECENT_ERRORS) {\n this.recentErrors.splice(0, this.recentErrors.length - MAX_RECENT_ERRORS)\n }\n }\n\n /**\n * Record a successful processing\n */\n recordSuccess() {\n this.consecutiveErrors = 0\n // Keep recent errors for trend analysis, but don't clear them on single success\n }\n\n /**\n * Wait for all processing to complete (for graceful shutdown)\n * @param {number} timeoutMs - Maximum wait time\n */\n async waitForCompletion(timeoutMs = 30000) {\n const startTime = Date.now()\n\n while (this.processingEvents.size > 0 && (Date.now() - startTime) < timeoutMs) {\n this.logger.info(`Waiting for ${this.processingEvents.size} events to complete...`)\n await sleep(1000)\n }\n\n if (this.processingEvents.size > 0) {\n this.logger.warn(`Timeout waiting for ${this.processingEvents.size} events to complete`)\n // Force cleanup remaining events to prevent memory leaks\n this.processingEvents.clear()\n }\n else {\n this.logger.info(\"All events processing completed\")\n }\n }\n\n /**\n * Get detailed statistics for monitoring\n * @returns {object} Detailed statistics\n */\n getDetailedStats() {\n const status = this.getStatus()\n return {\n ...status,\n processingEventIds: Array.from(this.processingEvents.keys()),\n errorRate: this.recentErrors.length > 0\n ? (this.recentErrors.length / (this.recentErrors.length + Math.max(1, this.processingEvents.size))).toFixed(3)\n : \"0.000\",\n lastErrorTime: this.recentErrors.length > 0\n ? new Date(this.recentErrors[this.recentErrors.length - 1]).toISOString()\n : null,\n }\n }\n}\n\n/**\n * Enhanced event processing loop with concurrent processing\n * @param {object} stopSignal - Stop signal object\n */\nasync function intervalParseEvent(stopSignal = { stop: false }) {\n const rateLimiter = new RateLimiter(2, 1000) // 2 requests per second\n const processor = new ConcurrentEventProcessor(\n EVENT_PROCESSING_CONSTANTS.MAX_CONCURRENT_EVENTS,\n rateLimiter,\n )\n\n let fatalErrorCount = 0\n let backoffTime = EVENT_PROCESSING_CONSTANTS.ERROR_BACKOFF_TIME\n\n const {\n MAX_FATAL_ERRORS,\n MAX_BACKOFF_TIME,\n MAX_CONSECUTIVE_ERRORS,\n CONCURRENT_BATCH_SIZE,\n } = EVENT_PROCESSING_CONSTANTS\n\n const logger = new Logger(\"nostr-event-loop\")\n logger.info(\"Enhanced concurrent event processing loop started\")\n\n while (!stopSignal.stop) {\n try {\n const { node_sk: sk } = await getMainLnlinkConfig()\n\n if (fatalErrorCount > 0) {\n logger.info(\"Recovered from fatal error state, resetting counters\")\n fatalErrorCount = 0\n }\n\n while (!stopSignal.stop) {\n try {\n // Calculate how many events we can fetch\n const availableSlots = EVENT_PROCESSING_CONSTANTS.MAX_CONCURRENT_EVENTS - processor.processingEvents.size\n const batchSize = Math.min(CONCURRENT_BATCH_SIZE, Math.max(1, availableSlots))\n\n const events = await getUnReplyEvents(batchSize)\n\n if (events.length === 0) {\n await sleep(EVENT_PROCESSING_CONSTANTS.IDLE_SLEEP)\n continue\n }\n\n logger.debug(`Fetched ${events.length} events, processing slots available: ${availableSlots}`)\n\n // Add events to concurrent processing\n for (const event of events) {\n processor.addEvent(event, sk)\n\n // If we've reached max concurrent, break to avoid overwhelming\n if (processor.processingEvents.size >= EVENT_PROCESSING_CONSTANTS.MAX_CONCURRENT_EVENTS) {\n break\n }\n }\n\n // Check if we need to back off due to consecutive errors\n const status = processor.getStatus()\n if (status.consecutiveErrors >= MAX_CONSECUTIVE_ERRORS) {\n logger.warn(`Too many consecutive errors (${status.consecutiveErrors}), backing off ${backoffTime}ms`)\n await sleep(backoffTime)\n backoffTime = Math.min(backoffTime * 1.5 + Math.random() * 500, MAX_BACKOFF_TIME)\n }\n else {\n // Reset backoff time on successful batch\n backoffTime = EVENT_PROCESSING_CONSTANTS.ERROR_BACKOFF_TIME\n }\n\n // Brief pause between batches\n if (!stopSignal.stop) {\n await sleep(EVENT_PROCESSING_CONSTANTS.NORMAL_SLEEP)\n }\n\n // Log detailed status periodically\n if (Math.random() < 0.05) { // 5% chance to log detailed status\n const detailedStats = processor.getDetailedStats()\n logger.info(`Processing stats: ${JSON.stringify(detailedStats)}`)\n }\n }\n catch (loopError) {\n logger.error(`Loop error: ${loopError.message}`)\n const loopBackoff = Math.min(\n EVENT_PROCESSING_CONSTANTS.ERROR_SLEEP * 2 ** Math.min(processor.consecutiveErrors, 4),\n MAX_BACKOFF_TIME,\n )\n await sleep(loopBackoff)\n }\n }\n\n break\n }\n catch (fatalError) {\n fatalErrorCount++\n logger.error(`Fatal error (${fatalErrorCount}/${MAX_FATAL_ERRORS}): ${fatalError.message}`)\n\n if (fatalErrorCount >= MAX_FATAL_ERRORS) {\n logger.error(\"Max fatal errors reached, but keeping loop alive to auto-recover\")\n fatalErrorCount = 0\n }\n\n const fatalBackoff = Math.min(\n EVENT_PROCESSING_CONSTANTS.FATAL_ERROR_SLEEP * 2 ** Math.min(fatalErrorCount, MAX_FATAL_ERRORS - 1),\n MAX_BACKOFF_TIME,\n )\n\n logger.info(`Waiting ${fatalBackoff}ms before retry`)\n await sleep(fatalBackoff)\n }\n }\n\n // Graceful shutdown - wait for ongoing processing to complete\n logger.info(\"Event processing loop stopping, waiting for ongoing events to complete...\")\n await processor.waitForCompletion()\n logger.info(\"Event processing loop terminated\")\n}\n\nmodule.exports = {\n intervalParseEvent,\n}\n", "const { getConfig } = require(\"@business/common/getConfig.js\")\nconst {\n getMainLnlinkConfig,\n insertEvent,\n getLnlinkUser,\n} = require(\"@business/service/prisma/dbService\")\n\n// const { sendInfo } = require(\"../utils/nostrUtils.js\")\nconst { registerNode } = require(\"@business/service/report/reportService.js\")\nconst Logger = require(\"@business/utils/linkLogger.js\")\nconst dayjs = require(\"dayjs\")\n\nconst { nip19, getPublicKey } = require(\"nostr-tools\")\nconst {\n SUPPORTED_EVENT_KINDS,\n ERROR_CODES,\n RESPONSE_MESSAGES,\n PING_CONSTANTS,\n CONNECTION_CONSTANTS,\n} = require(\"../config/constants.js\")\nconst { intervalParseEvent } = require(\"../events/eventLoop.js\")\nconst {\n getRelays,\n execSendMessage,\n pool,\n resetPool,\n getConnectionHealth,\n refreshRelayConnection,\n} = require(\"../nostrPool.js\")\n\nconst RELAY_REFRESH_COOLDOWN = 60 * 1000\nconst RELAY_REFRESH_HISTORY_LIMIT = 200\nconst RELAY_REFRESH_HISTORY_TTL = 10 * 60 * 1000\n\n// Subscription refresh interval to prevent _knownIds memory leak in nostr-tools\n// The _knownIds Set in pool.sub() accumulates event IDs indefinitely\nconst SUBSCRIPTION_REFRESH_INTERVAL = 10 * 60 * 1000 // 10 minutes\n\nclass NostrManager {\n constructor() {\n this.subscription = null\n this.isConnected = false\n this.heartbeatInterval = null\n this.isShuttingDown = false\n this.services = []\n this.lastEventReceived = null\n this.lastUserMessageReceived = null // Separate user messages from heartbeats\n this.connectionStartTime = null\n this.reconnectCount = 0\n this.lastHeartbeatReceived = null\n this.currentHeartbeatId = null\n this.reconnectTimer = null\n this.currentReconnectDelay = CONNECTION_CONSTANTS.RECONNECT_DELAY_BASE\n this.connectionAttempt = 0\n this.isConnecting = false\n this.relayRefreshTimestamps = new Map()\n this.subscriptionHandlers = null\n this.lastSubscriptionRefresh = Date.now() // Track when subscription was last refreshed\n }\n\n handlePassiveDisconnect(reason, pubkey, eventHandler) {\n if (this.isShuttingDown) {\n return\n }\n const logger = new Logger(\"nostr\")\n logger.warn(`Subscription degraded: ${reason}`)\n this.isConnected = false\n this.teardownSubscription()\n this.scheduleReconnect(pubkey, eventHandler)\n }\n\n recordRelayRefreshTimestamp(relay, timestamp = Date.now()) {\n const ttlThreshold = timestamp - RELAY_REFRESH_HISTORY_TTL\n for (const [key, value] of this.relayRefreshTimestamps.entries()) {\n if (value < ttlThreshold) {\n this.relayRefreshTimestamps.delete(key)\n }\n }\n\n while (this.relayRefreshTimestamps.size >= RELAY_REFRESH_HISTORY_LIMIT) {\n const oldestKey = this.relayRefreshTimestamps.keys().next().value\n if (oldestKey === undefined) {\n break\n }\n this.relayRefreshTimestamps.delete(oldestKey)\n }\n\n this.relayRefreshTimestamps.set(relay, timestamp)\n }\n\n teardownSubscription() {\n if (!this.subscription) {\n return\n }\n\n const logger = new Logger(\"nostr\")\n\n if (this.subscriptionHandlers) {\n for (const [eventName, handler] of Object.entries(this.subscriptionHandlers)) {\n try {\n if (typeof this.subscription.off === \"function\") {\n this.subscription.off(eventName, handler)\n }\n }\n catch (error) {\n logger.debug(`Failed to detach '${eventName}' handler: ${error.message}`)\n }\n }\n }\n\n try {\n if (typeof this.subscription.unsub === \"function\") {\n this.subscription.unsub()\n }\n }\n catch (error) {\n logger.warn(`Error unsubscribing from nostr relays: ${error.message}`)\n }\n\n this.subscription = null\n this.subscriptionHandlers = null\n }\n\n async connect(pubkey, eventHandler, { isRefresh = false } = {}) {\n const logger = new Logger(\"nostr\")\n if (this.isShuttingDown) {\n logger.warn(\"Skip connect: manager is shutting down\")\n return\n }\n\n if (this.isConnecting) {\n logger.debug(\"Connect already in progress, skipping duplicate call\")\n return\n }\n\n this.isConnecting = true\n this.connectionAttempt += 1\n try {\n this.teardownSubscription()\n const relays = getRelays()\n // For refresh: use current time to avoid re-fetching old events\n // For reconnect: use lastUserMessageReceived to catch up on missed events\n const since = isRefresh ? dayjs().unix() - 10 : this.calculateSubscriptionSince()\n logger.info(`Connecting to relays: ${relays.join(\", \")} (since=${since}, isRefresh=${isRefresh})`)\n\n this.subscription = pool.sub(relays, [{\n \"kinds\": SUPPORTED_EVENT_KINDS,\n \"since\": since,\n \"#p\": [pubkey],\n }])\n\n const onEose = () => {\n this.isConnected = true\n this.connectionStartTime = Date.now()\n logger.info(`Connected to Nostr relays successfully (attempt #${this.connectionAttempt})`)\n this.reconnectCount = 0\n this.currentReconnectDelay = CONNECTION_CONSTANTS.RECONNECT_DELAY_BASE\n this.connectionAttempt = 0\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer)\n this.reconnectTimer = null\n }\n }\n\n const onError = (error) => {\n logger.error(`Subscription error: ${error.message}`)\n this.isConnected = false\n this.scheduleReconnect(pubkey, eventHandler)\n }\n\n // FIX #1: Register all event handlers BEFORE events start flowing\n // This prevents race condition where 'eose' fires before handler is registered\n const onNotice = (msg) => {\n logger.warn(`Relay notice received: ${msg}`)\n this.handlePassiveDisconnect(`notice: ${msg}`, pubkey, eventHandler)\n }\n\n const onOk = (okPayload) => {\n if (Array.isArray(okPayload) && okPayload[1] === false) {\n logger.warn(`Relay reported failure via 'ok': ${JSON.stringify(okPayload)}`)\n this.handlePassiveDisconnect(\"ok failure\", pubkey, eventHandler)\n }\n }\n\n const onClose = () => {\n this.handlePassiveDisconnect(\"relay closed connection\", pubkey, eventHandler)\n }\n\n const handlers = {\n eose: onEose,\n error: onError,\n notice: onNotice,\n ok: onOk,\n close: onClose,\n event: eventHandler,\n }\n\n for (const [eventName, handler] of Object.entries(handlers)) {\n this.subscription.on(eventName, handler)\n }\n\n this.subscriptionHandlers = handlers\n\n logger.info(\"Subscription created successfully\")\n }\n catch (error) {\n logger.error(`Connection failed: ${error.message}`)\n this.scheduleReconnect(pubkey, eventHandler)\n }\n finally {\n this.isConnecting = false\n }\n }\n\n startHeartbeat(privateKey, pubkey, eventHandler) {\n const logger = new Logger(\"nostr\")\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval)\n }\n\n this.lastHeartbeatReceived = Date.now()\n\n this.heartbeatInterval = setInterval(async () => {\n if (this.isShuttingDown) {\n return\n }\n\n try {\n this.currentHeartbeatId = `ping_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`\n\n await execSendMessage({\n message: this.currentHeartbeatId,\n kind: PING_CONSTANTS.PING_KIND,\n robotPrivatekey: privateKey,\n sendToNostrAddress: getPublicKey(privateKey),\n })\n\n // logger.info(`Heartbeat sent: ${this.currentHeartbeatId}`)\n\n await new Promise(resolve => setTimeout(resolve, 3000))\n\n // FIX #2: Increase timeout threshold from 15s to 30s for better tolerance\n // Heartbeat runs every 15s, but we allow up to 30s gap before declaring failure\n const timeSinceLastReceived = Date.now() - this.lastHeartbeatReceived\n if (timeSinceLastReceived > 30000) {\n throw new Error(`No heartbeat received for ${Math.round(timeSinceLastReceived / 1000)}s`)\n }\n // logger.info(\"Heartbeat check passed\")\n }\n catch (error) {\n logger.warn(`Heartbeat failed: ${error.message}`)\n this.isConnected = false\n const heartbeatGap = this.lastHeartbeatReceived ? Date.now() - this.lastHeartbeatReceived : Infinity\n if (heartbeatGap > 60000) {\n resetPool()\n this.teardownSubscription()\n this.isConnected = false\n }\n this.scheduleReconnect(pubkey, eventHandler, heartbeatGap > 60000 ? CONNECTION_CONSTANTS.LONG_TERM_RECONNECT_DELAY : 0)\n }\n }, 15 * 1000)\n }\n\n scheduleReconnect(pubkey, eventHandler, delay = 0) {\n if (this.isShuttingDown) {\n return\n }\n const logger = new Logger(\"nostr\")\n\n // FIX #3: Check both reconnectTimer AND isConnecting to prevent concurrent reconnects\n if (this.reconnectTimer) {\n logger.debug(\"Reconnect already scheduled, skipping\")\n return\n }\n\n if (this.isConnecting) {\n logger.debug(\"Connection already in progress, skipping reconnect schedule\")\n return\n }\n\n this.reconnectCount++\n const connectionUptime = this.connectionStartTime ? Date.now() - this.connectionStartTime : 0\n const baseDelay = CONNECTION_CONSTANTS.RECONNECT_DELAY_BASE\n const maxDelay = CONNECTION_CONSTANTS.MAX_RECONNECT_DELAY\n const longDelay = CONNECTION_CONSTANTS.LONG_TERM_RECONNECT_DELAY\n\n if (this.reconnectCount === 1) {\n this.currentReconnectDelay = baseDelay\n }\n else if (this.reconnectCount > CONNECTION_CONSTANTS.MAX_RECONNECT_ATTEMPTS) {\n this.currentReconnectDelay = longDelay\n }\n else {\n this.currentReconnectDelay = Math.min(this.currentReconnectDelay * 2, maxDelay)\n }\n\n const effectiveDelay = delay || this.currentReconnectDelay\n\n logger.warn(`Connection lost after ${Math.round(connectionUptime / 1000)}s uptime, scheduling reconnect #${this.reconnectCount} in ${effectiveDelay}ms`)\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null\n // FIX #3: Double-check isConnecting before reconnecting\n if (!this.isShuttingDown && !this.isConnecting) {\n logger.info(`Attempting to reconnect... (attempt #${this.reconnectCount})`)\n this.connect(pubkey, eventHandler)\n }\n else if (this.isConnecting) {\n logger.debug(\"Skipping reconnect: connection already in progress\")\n }\n }, effectiveDelay)\n }\n\n addService(service) {\n this.services.push(service)\n }\n\n async cleanup() {\n this.isShuttingDown = true\n const logger = new Logger(\"nostr\")\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval)\n this.heartbeatInterval = null\n }\n\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer)\n this.reconnectTimer = null\n }\n\n this.relayRefreshTimestamps.clear()\n\n for (const service of this.services) {\n try {\n if (typeof service.stop === \"function\") {\n await service.stop()\n }\n }\n catch (error) {\n logger.error(`Error stopping service: ${error.message}`)\n }\n }\n\n this.teardownSubscription()\n\n this.isConnected = false\n logger.info(\"Cleanup completed\")\n }\n\n calculateSubscriptionSince() {\n const now = dayjs().unix()\n // FIX #7: Use lastUserMessageReceived instead of lastEventReceived to avoid missing events\n // lastEventReceived includes heartbeats, but we want to track actual user messages\n const lastUserMessageSeconds = this.lastUserMessageReceived\n ? Math.floor(this.lastUserMessageReceived / 1000)\n : null\n\n if (lastUserMessageSeconds) {\n return Math.max(0, lastUserMessageSeconds - CONNECTION_CONSTANTS.SUBSCRIPTION_SINCE_OFFSET)\n }\n\n // Fallback to current time if no user messages received yet\n return Math.max(0, now - CONNECTION_CONSTANTS.SUBSCRIPTION_SINCE_OFFSET)\n }\n}\n\nfunction createEventHandler(lndConfig, manager) {\n const logger = new Logger(\"nostr\")\n return async (event) => {\n try {\n manager.lastEventReceived = Date.now()\n\n // FIX #8: Heartbeat detection (content is encrypted, so we can't validate ID directly)\n if (event.kind === PING_CONSTANTS.PING_KIND && event.pubkey === getPublicKey(lndConfig.node_sk)) {\n // Accept any heartbeat from our own pubkey\n // Note: event.content is encrypted, so we can't compare with currentHeartbeatId\n manager.lastHeartbeatReceived = Date.now()\n // logger.debug(`Heartbeat received from self`)\n return\n }\n\n // This is a real user message, update user message timestamp\n manager.lastUserMessageReceived = Date.now()\n logger.info(`Received user message: kind=${event.kind}, from=${event.pubkey.slice(0, 8)}...`)\n\n if (SUPPORTED_EVENT_KINDS.slice(0, 2).includes(event.kind)) {\n const user = await getLnlinkUser({\n pubkey: event.pubkey,\n })\n\n if (user) {\n const ret = await insertEvent(event).catch((e) => {\n logger.error(`Nostr eventHandler ${event.id} error: ${e.message}`)\n return 0\n })\n logger.info(\n `Nostr event:${event.id} stored ${ret > 0 ? \"success\" : \"failed\"}`,\n )\n }\n else {\n const tags = event.tags\n const replyProxyAddr = tags?.find(item => item?.[0] === \"a\")?.[1]\n const replyTo = replyProxyAddr || event.pubkey\n\n await execSendMessage({\n message: JSON.stringify({\n code: ERROR_CODES.FORBIDDEN,\n data: null,\n msg: RESPONSE_MESSAGES.NOT_ALLOWED,\n }),\n sendToNostrAddress: replyTo,\n robotPrivatekey: lndConfig.node_sk,\n replyEventId: event.id,\n }).catch((e) => {\n // FIX #6: Catch send errors to prevent handler crash\n logger.error(`Failed to send forbidden message: ${e.message}`)\n })\n logger.debug(`Received event from non-whitelisted pubkey: ${event.pubkey}`)\n }\n }\n }\n catch (handlerError) {\n // FIX #6: Log error but don't let it crash the handler\n logger.error(`Error in event handler: ${handlerError.message}`)\n }\n }\n}\n\nasync function listenerNostrEvent() {\n const manager = new NostrManager()\n const logger = new Logger(\"nostr\")\n try {\n const lndConfig = await getMainLnlinkConfig()\n logger.info(\"listenerNostrEvent start\")\n\n const {\n LINK_READY,\n LINK_HTTP_PORT,\n LINK_LNFI_NODE_SITE_URL,\n LINK_OWNER,\n LINK_NODE_ADDR,\n } = getConfig()\n\n if (!LINK_READY) {\n logger.info(`\n Nostr listenerNostrEvent: click 'http://127.0.0.1:${LINK_HTTP_PORT}' to init lnlink config.\n `)\n return { cleanup: () => { } }\n }\n\n logger.info(`\n Nostr listenerNostrEvent: click ${LINK_LNFI_NODE_SITE_URL.replace(/\\/#\\/|\\/#|\\/$/, \"\")}/#/?owner=${LINK_OWNER}&npub=${LINK_NODE_ADDR} to manager.\n `)\n\n registerNode({\n nostrAddress: LINK_OWNER,\n lnlinkNpub: LINK_NODE_ADDR,\n })\n /* await sendInfo(lndConfig.node_sk).catch((e) => {\n logger.error(`Nostr listenerNostrEvent->sendInfo error: ${e.message}`)\n }) */\n\n const pubkey = nip19.decode(lndConfig.node_npub).data\n const eventHandler = createEventHandler(lndConfig, manager)\n\n await manager.connect(pubkey, eventHandler)\n\n manager.startHeartbeat(lndConfig.node_sk, pubkey, eventHandler)\n\n // Heartbeat: 15s interval, 30s timeout\n // Monitor: 45s interval (3x heartbeat), 90s timeout (allows 2 missed heartbeats)\n const monitorInterval = setInterval(async () => {\n if (manager.isShuttingDown) {\n clearInterval(monitorInterval)\n return\n }\n\n try {\n // Only check user messages, not heartbeats\n const timeSinceLastUserMessage = manager.lastUserMessageReceived ? Date.now() - manager.lastUserMessageReceived : null\n const timeSinceLastHeartbeat = manager.lastHeartbeatReceived ? Date.now() - manager.lastHeartbeatReceived : Infinity\n\n // This prevents conflict with heartbeat's own 30s timeout\n const heartbeatStale = timeSinceLastHeartbeat > 90000\n\n const healthStatus = getConnectionHealth()\n let relayReconnectNeeded = false\n if (healthStatus) {\n const { connections, summary } = healthStatus\n if (summary && summary.total > 0 && summary.healthy < summary.total) {\n logger.warn(`Relay health degraded: ${summary.healthy}/${summary.total} healthy`)\n }\n if (connections && Object.keys(connections).length) {\n logger.info(`Relay connections==>${JSON.stringify(connections)}`)\n for (const [relay, info] of Object.entries(connections)) {\n if (info.status !== \"healthy\") {\n const nowTs = Date.now()\n const lastRefresh = manager.relayRefreshTimestamps.get(relay) || 0\n if (nowTs - lastRefresh >= RELAY_REFRESH_COOLDOWN) {\n logger.warn(`Relay ${relay} status ${info.status || \"unknown\"}, refreshing connection`)\n refreshRelayConnection(relay)\n manager.recordRelayRefreshTimestamp(relay, nowTs)\n relayReconnectNeeded = true\n }\n }\n }\n }\n }\n\n if (relayReconnectNeeded && !manager.isShuttingDown && !manager.isConnecting) {\n await manager.connect(pubkey, eventHandler)\n }\n else if (heartbeatStale) {\n logger.warn(`No heartbeats for ${Math.round(timeSinceLastHeartbeat / 1000)}s, recreating subscription with pool reset`)\n resetPool()\n manager.teardownSubscription()\n manager.isConnected = false\n await manager.connect(pubkey, eventHandler)\n }\n else if (timeSinceLastUserMessage && timeSinceLastUserMessage > 300000) { // 5 minutes no user messages\n logger.info(`No user messages for ${Math.round(timeSinceLastUserMessage / 1000)}s, heartbeats healthy`) // informational only\n }\n\n // Ensure subscription exists and connection state is correct\n if (manager.isConnected && !manager.subscription) {\n logger.warn(\"Connected but no subscription, recreating...\")\n await manager.connect(pubkey, eventHandler)\n }\n\n // Periodically refresh subscription to clear _knownIds memory leak in nostr-tools\n // The _knownIds Set accumulates event IDs indefinitely and is never cleaned up\n const timeSinceLastRefresh = Date.now() - manager.lastSubscriptionRefresh\n if (timeSinceLastRefresh > SUBSCRIPTION_REFRESH_INTERVAL && manager.isConnected && !manager.isConnecting) {\n logger.info(`Refreshing subscription to clear _knownIds cache (last refresh: ${Math.round(timeSinceLastRefresh / 1000)}s ago)`)\n manager.teardownSubscription()\n await manager.connect(pubkey, eventHandler, { isRefresh: true })\n manager.lastSubscriptionRefresh = Date.now()\n }\n }\n catch (error) {\n logger.error(`Relay monitor error: ${error.message}`)\n }\n }, 45000)\n\n const stopSignal = { stop: false }\n intervalParseEvent(stopSignal)\n\n manager.addService({\n stop: () => {\n stopSignal.stop = true\n clearInterval(monitorInterval)\n },\n })\n\n return {\n cleanup: async () => {\n logger.info(\"Starting Nostr connection cleanup...\")\n await manager.cleanup()\n logger.info(\"Nostr connection cleanup completed\")\n },\n isHealthy: () => manager.isConnected,\n getConnectionStatus: () => {\n const now = Date.now()\n const uptime = manager.connectionStartTime ? now - manager.connectionStartTime : 0\n const timeSinceLastEvent = manager.lastEventReceived ? now - manager.lastEventReceived : null\n\n return {\n connected: manager.isConnected,\n hasSubscription: !!manager.subscription,\n uptime: Math.round(uptime / 1000),\n reconnectCount: manager.reconnectCount,\n timeSinceLastEvent: timeSinceLastEvent ? Math.round(timeSinceLastEvent / 1000) : null,\n relayCount: getRelays().length,\n }\n },\n\n }\n }\n catch (error) {\n logger.error(`Failed to start Nostr event listener: ${error.message}`)\n await manager.cleanup()\n throw error\n }\n}\n\nmodule.exports = {\n listenerNostrEvent,\n}\n", "const { getConfig } = require(\"@business/common/getConfig.js\")\n\nconst { isTapdInitialized, getUniverseService } = require(\"@business/common/index\")\nconst Logger = require(\"@business/utils/linkLogger\")\n\nasync function addFederationServer() {\n const logger = new Logger(\"job\")\n try {\n const { LINK_UNIVERSE_HOST } = getConfig()\n const isInitialized = await isTapdInitialized()\n\n if (isInitialized) {\n logger.info(`Job addFederationServer started`)\n const universeService = getUniverseService()\n const listUniverses = await universeService.listFederationServers({})\n const isAdded = listUniverses?.servers?.find(\n item => item.host === LINK_UNIVERSE_HOST,\n )\n if (isAdded) {\n logger.info(\n `Job addFederationServer result: ${!!isAdded}`,\n )\n }\n else {\n await universeService\n .addFederationServer({\n servers: [\n {\n host: LINK_UNIVERSE_HOST,\n },\n ],\n })\n .catch((err) => {\n logger.error(`Job addFederationServer error: ${err.message}`)\n })\n\n logger.info(\n `Job addFederationServer result: true`,\n )\n }\n logger.info(`Job addFederationServer starting syncUniverse, universe_host: ${LINK_UNIVERSE_HOST}`)\n const syncUniverseRet = await universeService\n .syncUniverse({\n universe_host: LINK_UNIVERSE_HOST,\n sync_mode: 1,\n })\n .catch((err) => {\n logger.error(`syncUniverse error: ${err.message}`)\n })\n logger.info(\n `Job addFederationServer syncUniverse result:${syncUniverseRet?.synced_universes?.length}`,\n )\n }\n }\n catch (e) {\n logger.error(`Job addFederationServer error: ${e.message}`)\n }\n}\n\nmodule.exports = addFederationServer\n", "const { isLndInitialized, getLightningService } = require(\"@business/common/index\")\nconst Logger = require(\"@business/utils/linkLogger\")\n\nasync function checkChannelState() {\n const logger = new Logger(\"checkChannelState\")\n const isInitialized = await isLndInitialized()\n if (!isInitialized) {\n logger.info(\"Job checkChannelState skip reason: LND not initialized yet.\")\n return\n }\n\n const lightningService = getLightningService()\n\n let channelList\n try {\n channelList = await lightningService.listChannels({ inactive_only: true })\n }\n catch (err) {\n logger.error(`Job checkChannelState failed to list channels: ${err.message}`)\n return\n }\n const inactiveChannels = channelList?.channels?.filter(channel => channel && !channel.active) || []\n if (!inactiveChannels.length) {\n logger.debug(\"Job checkChannelState: no inactive channels detected.\")\n return\n }\n\n let peersList\n try {\n peersList = await lightningService.listPeers({ latest_error: true })\n }\n catch (err) {\n logger.error(`Job checkChannelState failed to list peers: ${err.message}`)\n return\n }\n const onlinePeerPubKeys = new Set(peersList?.peers?.map(peer => peer.pub_key))\n\n const peerChannelMap = inactiveChannels.reduce((map, channel) => {\n if (!channel?.remote_pubkey) {\n return map\n }\n if (!map.has(channel.remote_pubkey)) {\n map.set(channel.remote_pubkey, [])\n }\n map.get(channel.remote_pubkey).push(channel)\n return map\n }, new Map())\n\n for (const [remotePubKey, peerChannels] of peerChannelMap.entries()) {\n if (onlinePeerPubKeys.has(remotePubKey)) {\n logger.debug(`Peer ${remotePubKey} already online, skip reconnect.`)\n continue\n }\n\n logger.info(\n `Peer ${remotePubKey} offline with ${peerChannels.length} inactive channel(s). Attempting reconnect...`,\n )\n\n let nodeInfo\n try {\n nodeInfo = await lightningService.getNodeInfo({ pub_key: remotePubKey })\n }\n catch (err) {\n logger.error(`Failed to fetch node info for ${remotePubKey}: ${err.message}`)\n continue\n }\n const addresses = nodeInfo?.node?.addresses || []\n if (!addresses.length) {\n logger.warn(`No advertised addresses for peer ${remotePubKey}, skipping reconnect.`)\n continue\n }\n\n let connected = false\n for (const address of addresses) {\n const host = address?.addr\n if (!host) {\n continue\n }\n try {\n await lightningService.connectPeer({\n addr: {\n pubkey: remotePubKey,\n host,\n },\n perm: false,\n timeout: 15,\n })\n logger.info(`Reconnect attempt to peer ${remotePubKey} via ${host} succeeded.`)\n connected = true\n break\n }\n catch (err) {\n logger.warn(`Reconnect attempt to peer ${remotePubKey} via ${host} failed: ${err.message}`)\n }\n }\n\n if (!connected) {\n logger.error(`All reconnect attempts failed for peer ${remotePubKey}.`)\n }\n }\n}\n\nmodule.exports = checkChannelState\n", "const { getConfig } = require(\"@business/common/getConfig.js\")\n\nconst { isLndInitialized, getLightningService } = require(\"@business/common/index\")\nconst { isConnectPeer } = require(\"@business/service/lndService\")\nconst Logger = require(\"@business/utils/linkLogger\")\n\nasync function connectPeer() {\n const logger = new Logger(\"job\")\n const isInitialized = await isLndInitialized()\n if (!isInitialized) {\n logger.info(\"Job connectPeer skip reason: LND not initialized yet.\")\n return\n }\n\n const { LINK_NOSTR_NODE_NPUBKEY, LINK_NOSTR_NODE_HOST } = getConfig()\n if (!LINK_NOSTR_NODE_NPUBKEY || !LINK_NOSTR_NODE_HOST) {\n throw new Error(\"Remote peer info is not set yet.\")\n }\n const isConnected = await isConnectPeer({})\n\n logger.info(`Job connectPeer status: ${isConnected}`)\n if (!isConnected) {\n const lightningService = getLightningService()\n await lightningService.connectPeer({\n addr: {\n pubkey: LINK_NOSTR_NODE_NPUBKEY,\n host: LINK_NOSTR_NODE_HOST,\n },\n perm: true,\n timeout: 30,\n })\n logger.info(`Job connectPeer successful.`)\n }\n else {\n logger.info(`Job connectPeer successful.`)\n }\n}\n\nmodule.exports = connectPeer\n", "const { getConfig } = require(\"@business/common/getConfig.js\")\n\n/**\n * Return mempool base URLs according to LINK_NETWORK.\n * - regtest: http://34.84.66.29:8889\n * - mainnet (default): https://mempool.space\n */\nfunction getMempoolBase() {\n const { LINK_NETWORK } = getConfig()\n if ((LINK_NETWORK || \"\").toLowerCase() === \"regtest\") {\n return {\n apiBase: \"http://34.84.66.29:8889/api\",\n pageBase: \"http://34.84.66.29:8889/zh\",\n }\n }\n // default: mainnet\n return {\n apiBase: \"https://mempool.space/api\",\n pageBase: \"https://mempool.space\",\n }\n}\n\nmodule.exports = {\n getMempoolBase,\n}\n", "const { getMempoolBase } = require(\"@business/common/mempool.js\")\nconst {\n getTransactionsByFilter,\n upsertTransactionByFilter,\n} = require(\"@business/service/prisma/db/transactions\")\nconst Logger = require(\"@business/utils/linkLogger\")\nconst {\n TRANSACTION_STATUS,\n NODE_TYPE,\n TRANSACTION_KIND,\n TRANSACTION_ASSET_TYPE,\n TRANSACTION_DIRECTION,\n} = require(\"@constants/index\")\n\nasync function fetchAddressChainTxs(address, apiBase) {\n const url = `${apiBase}/address/${address}/txs`\n const rsp = await fetch(url)\n if (!rsp.ok) {\n throw new Error(`HTTP ${rsp.status}`)\n }\n return await rsp.json()\n}\n\nfunction txPaysToAddress(tx, address) {\n if (!tx || !tx.vout)\n return false\n return tx.vout.some(o => Array.isArray(o.scriptpubkey_address ? [o.scriptpubkey_address] : [])\n ? (o.scriptpubkey_address === address)\n : (o.scriptpubkey_address === address))\n}\n\nfunction sumReceivedToAddress(tx, address) {\n if (!tx || !Array.isArray(tx.vout))\n return 0\n let total = 0\n for (const o of tx.vout) {\n if (o && o.scriptpubkey_address === address) {\n const v = typeof o.value === \"number\" ? o.value : Number.parseInt(o.value || \"0\", 10)\n if (!Number.isNaN(v))\n total += v\n }\n }\n return total\n}\n\nasync function pollBtcInTxns() {\n const logger = new Logger(\"poll-litd-btc-transfers\")\n try {\n logger.info(\"Starting litd incoming BTC address polling (mempool)\")\n\n const { apiBase } = getMempoolBase()\n\n const ret = await getTransactionsByFilter({\n node_type: NODE_TYPE.LITD,\n transaction_kind: TRANSACTION_KIND.ONCHAIN,\n asset_type: TRANSACTION_ASSET_TYPE.BTC,\n direction: TRANSACTION_DIRECTION.IN,\n status: TRANSACTION_STATUS.PENDING,\n })\n const incomingPending = ret?.list\n\n if (!incomingPending || incomingPending.length === 0) {\n logger.info(\"No pending litd incoming BTC transactions to reconcile\")\n return\n }\n\n let processed = 0\n let confirmed = 0\n let expired = 0\n\n const now = Math.floor(Date.now() / 1000)\n const timeoutThreshold = 24 * 60 * 60 // 24h\n\n for (const tx of incomingPending) {\n try {\n if (now - tx.create_at > timeoutThreshold) {\n const filter = {\n id: tx.id,\n }\n const updateData = {\n status: TRANSACTION_STATUS.EXPIRED,\n update_at: now,\n }\n await upsertTransactionByFilter(updateData, filter)\n expired++\n processed++\n continue\n }\n\n const address = tx.target_address\n if (!address) {\n logger.warn(`Transaction ${tx.id} has no target_address, skip`)\n processed++\n continue\n }\n\n const chainTxs = await fetchAddressChainTxs(address, apiBase).catch((e) => {\n logger.error(`Fetch mempool address txs failed for ${address}: ${e.message}`)\n return []\n })\n\n if (!Array.isArray(chainTxs) || chainTxs.length === 0) {\n logger.debug(`No chain txs found for address ${address}`)\n processed++\n continue\n }\n\n // Pick latest confirmed tx paying to the address\n const matched = chainTxs.find((t) => {\n const confirmed = (t.status && t.status.confirmed) || (t.status === true)\n return confirmed && txPaysToAddress(t, address)\n })\n\n if (!matched) {\n logger.debug(`No confirmed tx paying to ${address} yet`)\n processed++\n continue\n }\n\n const txid = matched.txid || matched.tx_hash || matched.id\n const blockHeight = matched.status?.block_height\n\n const receivedSats = sumReceivedToAddress(matched, address)\n const updateData = {\n tx_hash: txid,\n status: TRANSACTION_STATUS.CONFIRMED,\n confirmations: 1,\n block_height: blockHeight,\n update_at: now,\n asset_amount: receivedSats > 0 ? String(receivedSats) : undefined,\n }\n const filter = {\n id: tx.id,\n }\n await upsertTransactionByFilter(updateData, filter)\n\n confirmed++\n processed++\n logger.info(`Incoming ${address} confirmed by ${txid} at height ${blockHeight}`)\n }\n catch (err) {\n logger.error(`Error handling incoming tx id=${tx.id}: ${err.message}`)\n processed++\n }\n }\n\n logger.info(`Incoming polling done: processed=${processed}, confirmed=${confirmed}, expired=${expired}`)\n }\n catch (error) {\n logger.error(`pollBtcInTxns error: ${error.message}`)\n throw error\n }\n}\nasync function pollBtcOutTxns() {\n const logger = new Logger(\"poll-litd-btc-transfers\")\n try {\n logger.info(\"Starting litd outgoing BTC transaction polling task\")\n\n const { apiBase } = getMempoolBase()\n\n // OUTGOING: pending transactions that have tx_hash\n const ret = await getTransactionsByFilter({\n node_type: NODE_TYPE.LITD,\n transaction_kind: TRANSACTION_KIND.ONCHAIN,\n asset_type: TRANSACTION_ASSET_TYPE.BTC,\n direction: TRANSACTION_DIRECTION.OUT,\n status: TRANSACTION_STATUS.PENDING,\n })\n const outgoingTxs = ret?.list\n\n if (!outgoingTxs || outgoingTxs.length === 0) {\n logger.info(\"No litd outgoing BTC transactions to reconcile\")\n return\n }\n\n let processedCount = 0\n let confirmedCount = 0\n let failedCount = 0\n\n // Process OUTGOING transactions by tx_hash using mempool API\n for (const tx of (outgoingTxs || [])) {\n try {\n const now = Math.floor(Date.now() / 1000)\n const timeoutThreshold = 24 * 60 * 60 // 24\u5C0F\u65F6\n\n if (now - tx.create_at > timeoutThreshold) {\n const filter = {\n tx_hash: tx.tx_hash,\n node_type: NODE_TYPE.LITD,\n transaction_kind: TRANSACTION_KIND.ONCHAIN,\n }\n const updateData = {\n status: TRANSACTION_STATUS.EXPIRED,\n update_at: now,\n }\n await upsertTransactionByFilter(updateData, filter)\n\n logger.warn(`Outgoing litd transaction ${tx.tx_hash} expired`)\n failedCount++\n continue\n }\n let isConfirmed = false\n let blockHeightVal\n if (tx.tx_hash) {\n const url = `${apiBase}/tx/${tx.tx_hash}/status`\n try {\n const rsp = await fetch(url)\n if (rsp.ok) {\n const js = await rsp.json()\n isConfirmed = !!js.confirmed\n blockHeightVal = js.block_height\n }\n else {\n logger.debug(`litd status not ok for ${tx.tx_hash}: HTTP ${rsp.status}`)\n }\n }\n catch (e) {\n logger.error(`Fetch litd status failed for ${tx.tx_hash}: ${e.message}`)\n }\n }\n\n if (isConfirmed) {\n const filter = {\n tx_hash: tx.tx_hash,\n node_type: NODE_TYPE.LITD,\n transaction_kind: TRANSACTION_KIND.ONCHAIN,\n }\n const updateData = {\n status: TRANSACTION_STATUS.CONFIRMED,\n confirmations: 1,\n block_height: blockHeightVal,\n update_at: now,\n }\n await upsertTransactionByFilter(updateData, filter)\n\n logger.info(`Outgoing litd transaction ${tx.tx_hash} confirmed by litd at height ${blockHeightVal}`)\n confirmedCount++\n }\n else {\n logger.debug(`Outgoing litd transaction ${tx.tx_hash} still pending per litd`)\n }\n\n processedCount++\n }\n catch (error) {\n logger.error(`Error processing transaction ${tx.tx_hash}: ${error.message}`)\n failedCount++\n }\n }\n\n logger.info(`litd BTC transaction polling completed (OUT only): ${processedCount} processed, ${confirmedCount} confirmed, ${failedCount} failed`)\n }\n catch (error) {\n logger.error(`Error in pollBtcOutTxns: ${error.message}`)\n throw error\n }\n}\n\nasync function pollBtcTransfers() {\n pollBtcInTxns()\n pollBtcOutTxns()\n}\n\nmodule.exports = pollBtcTransfers\n", "const {\n INVOICE_STATUS,\n ACCOUNT_TYPE,\n NWC_PERMISSIONS,\n TRANSACTION_STATUS,\n TRANSACTION_DIRECTION,\n TRANSACTION_KIND,\n NODE_TYPE,\n} = require(\"@constants/index\")\nconst dayjs = require(\"dayjs\")\nconst {\n getBuyFlashAccountAsset,\n} = require(\"../../service/buyFlashAccountService\")\nconst { generateLnlink } = require(\"../../service/nwcService\")\nconst {\n upsertTransactionByFilter,\n getTransactionUser,\n insertLnLinkOrder,\n getLnlinkUser,\n} = require(\"../../service/prisma/dbService\")\nconst { sleep } = require(\"../../utils\")\n\nconst Logger = require(\"../../utils/linkLogger.js\")\n\n// Maximum retry attempts for operations\nconst MAX_RETRIES = 3\nconst OPERATION_TIMEOUT = 30 * 1000 // 30 seconds timeout for operations\n\n/**\n * Process invoice and create flash account for user\n * @param {object} invoice - The invoice object\n * @param {number} retryCount - Current retry count\n * @returns {Promise<boolean>} Success status\n */\nasync function createFlashAccountForUser(invoice, retryCount = 0) {\n const logger = new Logger(\"create_flash_account_for_user\")\n try {\n const transactionUser = await getTransactionUser({\n invoice: invoice.payment_request,\n })\n if (!transactionUser) {\n logger.info(`Job listenerInvoice: Invoice with add_index ${invoice.add_index} not found.`)\n return false\n }\n if (transactionUser.account_type !== ACCOUNT_TYPE.FLASH_REGISTER) {\n return false\n }\n\n if (\n transactionUser.status !== INVOICE_STATUS.SETTLED\n ) {\n logger.warn(`Job listenerInvoice createFlashAccountForUser: Transaction invoice ${invoice.payment_request} is not paid yet.`)\n return false\n }\n\n const amount = transactionUser.amount\n const { id: asset_id } = await getBuyFlashAccountAsset()\n const memo = JSON.parse(invoice.memo || \"{}\")\n\n const { pubkey, flash_account_url } = await generateLnlink({\n asset_id,\n permissions: NWC_PERMISSIONS,\n account_type: memo.account_type,\n social_id: memo.social_id,\n name: memo.name,\n decimal_auth_limit: amount,\n expire_time: dayjs().add(1, \"month\").unix(),\n parent_pubkey: null,\n })\n\n if (!pubkey) {\n throw new Error(\"Failed to generate pubkey\")\n }\n\n const insertUserInfo = await getLnlinkUser({\n pubkey,\n include_expired: true,\n })\n\n const insertRet = await insertLnLinkOrder({\n transaction_id: transactionUser.id,\n user_id: insertUserInfo.id,\n })\n\n if (!insertRet) {\n throw new Error(\"Failed to insert LnLink order\")\n }\n\n // Create tweet text\n const tweetText = `I\\'ve created a Flash account for you using LN Node and authorized a budget. Come and experience it!~@${\n memo.social_id || memo.name\n } ${flash_account_url}`\n\n logger.info(\n `Job listenerInvoice createFlashAccountForUser successful: ${tweetText}`,\n )\n\n return true\n }\n catch (e) {\n logger.error(\n `Job listenerInvoice createFlashAccountForUser error: ${e.message}`,\n )\n\n if (retryCount < MAX_RETRIES) {\n const backoffTime = 2 ** retryCount * 1000\n logger.info(\n `Retrying createFlashAccountForUser in ${backoffTime}ms (attempt ${\n retryCount + 1\n }/${MAX_RETRIES})`,\n )\n await sleep(backoffTime)\n return createFlashAccountForUser(invoice, retryCount + 1)\n }\n\n return false\n }\n}\n\n/**\n * Adds timeout to a promise\n * @param {Promise} promise - The promise to add timeout to\n * @param {number} ms - Timeout in milliseconds\n * @param {string} errorMessage - Error message on timeout\n * @returns {Promise} Promise with timeout\n */\nfunction promiseWithTimeout(promise, ms, errorMessage) {\n const timeout = new Promise((_, reject) => {\n const id = setTimeout(() => {\n clearTimeout(id)\n reject(new Error(errorMessage))\n }, ms)\n })\n return Promise.race([promise, timeout])\n}\n\nasync function invoiceChange(invoice) {\n const logger = new Logger(\"invoice_change\")\n try {\n logger.info(`Received invoice event: ${invoice.add_index}, state: ${invoice.state}`)\n const invoiceState = invoice.state\n let transactionState = TRANSACTION_STATUS.PENDING\n if ([INVOICE_STATUS.OPEN, INVOICE_STATUS.ACCEPTED].includes(invoiceState)) {\n transactionState = TRANSACTION_STATUS.PENDING\n }\n else if (INVOICE_STATUS.SETTLED === invoiceState) {\n transactionState = TRANSACTION_STATUS.SETTLED\n }\n else if (INVOICE_STATUS.CANCELED === invoiceState) {\n transactionState = TRANSACTION_STATUS.CANCELED\n }\n else if (INVOICE_STATUS.EXPIRED === invoiceState) {\n transactionState = TRANSACTION_STATUS.EXPIRED\n }\n else if (INVOICE_STATUS.FAILED === invoiceState) {\n transactionState = TRANSACTION_STATUS.FAILED\n }\n const updateParams = {\n invoice: invoice?.payment_request,\n status: transactionState,\n node_type: NODE_TYPE.LITD,\n transaction_kind: TRANSACTION_KIND.LIGHTNING,\n direction: TRANSACTION_DIRECTION.IN,\n description: invoice.memo,\n description_hash: invoice.description_hash?.toString(\"hex\"),\n add_index: Number.parseInt(invoice?.add_index),\n expire_at: Number.parseInt(invoice?.creation_date) + Number.parseInt(invoice?.expiry),\n preimage: invoice.r_preimage?.toString(\"hex\"),\n }\n\n if (invoice.state === \"SETTLED\") {\n updateParams.settled_at = Number(invoice.settle_date)\n }\n\n // Use Promise.all to wait for both operations to complete\n await Promise.all([\n promiseWithTimeout(\n upsertTransactionByFilter(updateParams, { invoice: invoice?.payment_request }),\n OPERATION_TIMEOUT,\n \"Update transaction operation timed out\",\n ).catch((e) => {\n logger.error(\n `Job listenerInvoice updateTransactionByFilter error: ${e.message}`,\n )\n }),\n invoice.state === \"SETTLED\"\n ? promiseWithTimeout(\n createFlashAccountForUser(invoice),\n OPERATION_TIMEOUT * 2, // Longer timeout for account creation\n \"Create flash account operation timed out\",\n )\n : Promise.resolve(false),\n ])\n }\n catch (err) {\n logger.error(`Error processing invoice data: ${err.message}`)\n }\n}\n\nmodule.exports = invoiceChange\n", "const {\n TRANSACTION_STATUS,\n TRANSACTION_DIRECTION,\n TRANSACTION_KIND,\n NODE_TYPE,\n} = require(\"@constants/index\")\nconst {\n upsertTransactionByFilter,\n} = require(\"../../service/prisma/dbService\")\nconst Logger = require(\"../../utils/linkLogger.js\")\n\n/**\n * Maps LND payment status to internal transaction status\n * @param {string} lndStatus - LND payment status\n * @returns {number} Internal transaction status code\n */\nfunction mapLndPaymentStatusToTransactionStatus(lndStatus) {\n const logger = new Logger(\"payment_change\")\n switch (lndStatus) {\n case \"IN_FLIGHT\":\n case \"INITIATED\":\n return TRANSACTION_STATUS.PENDING\n case \"SUCCEEDED\":\n return TRANSACTION_STATUS.SETTLED\n case \"FAILED\":\n return TRANSACTION_STATUS.FAILED\n default:\n logger.warn(`Unknown payment status: ${lndStatus}`)\n return TRANSACTION_STATUS.PENDING\n }\n}\n\n/**\n * Handles payment status changes from LND\n * @param {object} payment - Payment object from LND\n */\nasync function paymentChange(payment) {\n const logger = new Logger(\"payment_change\")\n try {\n logger.info(`Received payment event: ${payment.payment_hash}, status: ${payment.status}`)\n\n const paymentStatus = payment.status\n const transactionState = mapLndPaymentStatusToTransactionStatus(paymentStatus)\n\n const updateParams = {\n payment_hash: payment.payment_hash,\n status: transactionState,\n node_type: NODE_TYPE.LITD,\n transaction_kind: TRANSACTION_KIND.LIGHTNING,\n direction: TRANSACTION_DIRECTION.OUT,\n fees_paid: payment.fee_sat ? payment.fee_sat.toString() : (payment.fee_msat ? (payment.fee_msat / 1000).toString() : null),\n invoice: payment.payment_request || null,\n preimage: payment.payment_preimage ? payment.payment_preimage.toString(\"hex\") : null,\n create_at: payment.creation_date ? Number.parseInt(payment.creation_date) : null,\n add_index: Number.parseInt(payment.payment_index),\n }\n\n // Add settled_at timestamp for successful payments\n if (payment.status === \"SUCCEEDED\") {\n updateParams.settled_at = payment.creation_date ? Number.parseInt(payment.creation_date) : Math.floor(Date.now() / 1000)\n }\n\n await upsertTransactionByFilter(updateParams, {\n payment_hash: payment.payment_hash,\n })\n\n logger.info(`Payment transaction processed: ${payment.payment_hash}, status: ${paymentStatus}`)\n }\n catch (error) {\n logger.error(`Error processing payment change: ${error.message}`)\n logger.error(`Payment data: ${JSON.stringify(payment, null, 2)}`)\n }\n}\n\nmodule.exports = paymentChange\n", "const { getLightningService } = require(\"@business/common/index\")\n\nconst { decodePayReq } = require(\"@business/service/lndService\")\nconst {\n getMinOpendInvoiveIndex,\n getTransactionByInvoice,\n getMinOpendPaymentIndex,\n getTransactionByPaymentHash,\n upsertTransactionByFilter,\n} = require(\"@business/service/prisma/dbService\")\nconst Logger = require(\"@business/utils/linkLogger\")\nconst { TRANSACTION_STATUS } = require(\"@constants/index\")\n\nconst invoiceChange = require(\"./invoiceChange\")\nconst paymentChange = require(\"./paymentChange\")\n\nasync function isInvoiceExpired(invoice) {\n const decodedInvoice = await decodePayReq({ pay_req: invoice })\n const invoiceExpiry = decodedInvoice.expiry\n const createdAt = decodedInvoice.timestamp\n const now = Math.floor(Date.now() / 1000)\n return now > Number(createdAt) + Number(invoiceExpiry)\n}\n\n/**\n * Poll LND invoice and payment transfers for status changes\n * This is a backup mechanism to catch updates that might be missed by subscriptions\n */\nasync function pollInvoiceTransfers() {\n const logger = new Logger(\"poll-lnd-invoice-transfers\")\n try {\n logger.info(\"Starting poll lnd invoice and payment transfers polling task\")\n\n // Get lightning service\n const lightningService = getLightningService()\n if (!lightningService) {\n logger.warn(\"Lightning service not available, skipping polling\")\n return\n }\n\n // Poll both invoices and payments\n await pollInvoices(lightningService)\n await pollPayments(lightningService)\n\n logger.info(\"Poll LND invoice and payment transfers polling completed\")\n }\n catch (error) {\n logger.error(`Error in poll lnd invoice and payment transfers polling: ${error.message}`)\n throw error\n }\n}\n\n/**\n * Poll invoices for status changes\n * @param {object} lightningService - Lightning service instance\n */\nasync function pollInvoices(lightningService) {\n const logger = new Logger(\"poll-lnd-invoice-transfers\")\n try {\n logger.debug(\"Polling lnd invoices for status changes\")\n\n // Get minimum open invoice index from database\n const ret = await getMinOpendInvoiveIndex()\n if (!ret || ret.add_index === null) {\n logger.debug(\"No open invoices found in database\")\n return\n }\n const isExpired = await isInvoiceExpired(ret.invoice)\n\n if (isExpired) {\n await upsertTransactionByFilter({\n status: TRANSACTION_STATUS.EXPIRED,\n update_at: Math.floor(Date.now() / 1000),\n }, {\n id: ret.id,\n })\n logger.info(`Marked invoice as EXPIRED: ${ret.id}`)\n return\n }\n const startIndex = ret.add_index\n logger.info(`Polling invoices from index: ${startIndex}`)\n\n // List invoices from LND starting from the minimum index\n const response = await lightningService.listInvoices({\n index_offset: startIndex - 1,\n num_max_invoices: 50,\n reversed: true,\n })\n if (!response.invoices || response.invoices.length === 0) {\n logger.debug(\"No invoices returned from LND\")\n return\n }\n\n let updatedCount = 0\n\n // Check each invoice for status changes\n for (const invoice of response.invoices) {\n const payment_req = invoice.payment_request\n\n // Check if this invoice exists in our database\n const isInDB = await getTransactionByInvoice({ invoice: payment_req })\n\n if (isInDB) {\n // Check if invoice status has changed to a final state\n if (invoice.state === \"SETTLED\" || invoice.state === \"CANCELED\" || invoice.state === \"EXPIRED\") {\n logger.info(`Found invoice status change: add_index=${invoice.add_index}, state=${invoice.state}`)\n\n // Handle the invoice update\n await invoiceChange(invoice)\n updatedCount++\n }\n }\n }\n\n logger.debug(`Invoice polling completed. Updated ${updatedCount} invoices`)\n }\n catch (error) {\n logger.error(`Error polling invoices: ${error.message}`)\n throw error\n }\n}\n\n/**\n * Poll payments for status changes\n * @param {object} lightningService - Lightning service instance\n */\nasync function pollPayments(lightningService) {\n const logger = new Logger(\"poll-lnd-invoice-transfers\")\n try {\n logger.debug(\"Polling payments for status changes\")\n\n // Get minimum open payment index from database\n const ret = await getMinOpendPaymentIndex()\n if (!ret || ret.add_index === null) {\n logger.debug(\"No open payments found in database\")\n return\n }\n\n const isExpired = await isInvoiceExpired(ret.invoice)\n if (isExpired) {\n await upsertTransactionByFilter({\n status: TRANSACTION_STATUS.EXPIRED,\n }, {\n id: ret.id,\n })\n logger.info(`Marked invoice as EXPIRED: ${ret.id}`)\n return\n }\n const startIndex = ret.add_index\n logger.debug(`Polling payments from index: ${startIndex}`)\n\n // List payments from LND starting from the minimum index\n const response = await lightningService.listPayments({\n index_offset: startIndex - 1,\n max_payments: 50,\n reversed: false,\n include_incomplete: true, // Include pending and failed payments\n })\n\n if (!response.payments || response.payments.length === 0) {\n logger.debug(\"No payments returned from LND\")\n return\n }\n\n let updatedCount = 0\n\n // Check each payment for status changes\n for (const payment of response.payments) {\n const payment_hash = payment.payment_hash\n\n // Check if this payment exists in our database\n const isInDB = await getTransactionByPaymentHash({ payment_hash })\n\n if (isInDB) {\n // Check if payment status has changed to a final state\n if (payment.status === \"SUCCEEDED\" || payment.status === \"FAILED\" || payment.status === \"UNKNOWN\") {\n logger.info(`Found payment status change: payment_index=${payment.payment_index}, status=${payment.status}`)\n\n // Handle the payment update\n await paymentChange(payment)\n updatedCount++\n }\n }\n }\n\n logger.debug(`Payment polling completed. Updated ${updatedCount} payments`)\n }\n catch (error) {\n logger.error(`Error polling payments: ${error.message}`)\n throw error\n }\n}\n\nmodule.exports = pollInvoiceTransfers\n", "const { getConfig } = require(\"@business/common/getConfig.js\")\n\nconst {\n isConnectPeer,\n getNodeState,\n connectPeer,\n} = require(\"@business/service/rgb\")\nconst Logger = require(\"@business/utils/linkLogger\")\nconst { WALLET_STATE_CODE } = require(\"@constants/index\")\n\nasync function callConnectPeer() {\n const logger = new Logger(\"job\")\n try {\n const { LINK_RGB_REMOTE_NODE_PUBKEY, LINK_RGB_REMOTE_NODE_HOST } = getConfig()\n if (!LINK_RGB_REMOTE_NODE_PUBKEY || !LINK_RGB_REMOTE_NODE_HOST) {\n throw new Error(\n \"LINK_RGB_REMOTE_NODE_PUBKEY or LINK_RGB_REMOTE_NODE_HOST is not set\",\n )\n }\n const nodeState = await getNodeState()\n if (nodeState.state !== WALLET_STATE_CODE.SERVER_ACTIVE) {\n logger.info(`RGB node state is ${nodeState.state}, will try to connect peer after state is ${WALLET_STATE_CODE.SERVER_ACTIVE}`)\n return\n }\n const { is_connected } = await isConnectPeer({\n pubkey: LINK_RGB_REMOTE_NODE_PUBKEY,\n host: LINK_RGB_REMOTE_NODE_HOST,\n })\n if (!is_connected) {\n await connectPeer({\n pubkey: LINK_RGB_REMOTE_NODE_PUBKEY,\n host: LINK_RGB_REMOTE_NODE_HOST,\n })\n }\n logger.info(`Job connectPeer successful.`)\n }\n catch (error) {\n logger.error(`Job connectPeer error: ${error}`)\n }\n}\n\nmodule.exports = callConnectPeer\n", "const { getMempoolBase } = require(\"@business/common/mempool.js\")\nconst {\n getTransactionsByFilter,\n upsertTransactionByFilter,\n} = require(\"@business/service/prisma/db/transactions\")\nconst Logger = require(\"@business/utils/linkLogger\")\nconst {\n TRANSACTION_STATUS,\n NODE_TYPE,\n TRANSACTION_KIND,\n TRANSACTION_ASSET_TYPE,\n TRANSACTION_DIRECTION,\n} = require(\"@constants/index\")\n\nasync function fetchAddressChainTxs(address, apiBase) {\n const url = `${apiBase}/address/${address}/txs`\n const rsp = await fetch(url)\n if (!rsp.ok) {\n throw new Error(`HTTP ${rsp.status}`)\n }\n return await rsp.json()\n}\n\nfunction txPaysToAddress(tx, address) {\n if (!tx || !tx.vout)\n return false\n return tx.vout.some(o => Array.isArray(o.scriptpubkey_address ? [o.scriptpubkey_address] : [])\n ? (o.scriptpubkey_address === address)\n : (o.scriptpubkey_address === address))\n}\n\nfunction sumReceivedToAddress(tx, address) {\n if (!tx || !Array.isArray(tx.vout))\n return 0\n let total = 0\n for (const o of tx.vout) {\n if (o && o.scriptpubkey_address === address) {\n const v = typeof o.value === \"number\" ? o.value : Number.parseInt(o.value || \"0\", 10)\n if (!Number.isNaN(v))\n total += v\n }\n }\n return total\n}\n\nasync function pollBtcInTxns() {\n const logger = new Logger(\"poll-rgb-btc-in-transfers\")\n try {\n logger.info(\"Starting incoming BTC address polling (mempool)\")\n\n const { apiBase } = getMempoolBase()\n\n const ret = await getTransactionsByFilter({\n node_type: NODE_TYPE.RGB,\n transaction_kind: TRANSACTION_KIND.ONCHAIN,\n asset_type: TRANSACTION_ASSET_TYPE.BTC,\n direction: TRANSACTION_DIRECTION.IN,\n status: TRANSACTION_STATUS.PENDING,\n })\n const incomingPending = ret?.list\n\n if (!incomingPending || incomingPending.length === 0) {\n logger.info(\"No pending incoming BTC transactions to reconcile\")\n return\n }\n\n let processed = 0\n let confirmed = 0\n let expired = 0\n\n const now = Math.floor(Date.now() / 1000)\n const timeoutThreshold = 24 * 60 * 60 // 24h\n\n for (const tx of incomingPending) {\n try {\n if (now - tx.create_at > timeoutThreshold) {\n const filter = {\n id: tx.id,\n }\n const updateData = {\n status: TRANSACTION_STATUS.EXPIRED,\n update_at: now,\n }\n await upsertTransactionByFilter(updateData, filter)\n expired++\n processed++\n continue\n }\n\n const address = tx.target_address\n if (!address) {\n logger.warn(`Transaction ${tx.id} has no target_address, skip`)\n processed++\n continue\n }\n\n const chainTxs = await fetchAddressChainTxs(address, apiBase).catch((e) => {\n logger.error(`Fetch mempool address txs failed for ${address}: ${e.message}`)\n return []\n })\n\n if (!Array.isArray(chainTxs) || chainTxs.length === 0) {\n logger.debug(`No chain txs found for address ${address}`)\n processed++\n continue\n }\n\n // Pick latest confirmed tx paying to the address\n const matched = chainTxs.find((t) => {\n const confirmed = (t.status && t.status.confirmed) || (t.status === true)\n return confirmed && txPaysToAddress(t, address)\n })\n\n if (!matched) {\n logger.debug(`No confirmed tx paying to ${address} yet`)\n processed++\n continue\n }\n\n const txid = matched.txid || matched.tx_hash || matched.id\n const blockHeight = matched.status?.block_height\n\n const receivedSats = sumReceivedToAddress(matched, address)\n const updateData = {\n tx_hash: txid,\n status: TRANSACTION_STATUS.CONFIRMED,\n confirmations: 1,\n block_height: blockHeight,\n update_at: now,\n asset_amount: receivedSats > 0 ? String(receivedSats) : undefined,\n }\n const filter = {\n id: tx.id,\n }\n await upsertTransactionByFilter(updateData, filter)\n\n confirmed++\n processed++\n logger.info(`Incoming ${address} confirmed by ${txid} at height ${blockHeight}`)\n }\n catch (err) {\n logger.error(`Error handling incoming tx id=${tx.id}: ${err.message}`)\n processed++\n }\n }\n\n logger.info(`Incoming polling done: processed=${processed}, confirmed=${confirmed}, expired=${expired}`)\n }\n catch (error) {\n logger.error(`pollBtcInTxns error: ${error.message}`)\n throw error\n }\n}\nasync function pollBtcOutTxns() {\n const logger = new Logger(\"poll-rgb-btc-out-transfers\")\n try {\n logger.info(\"Starting BTC transaction polling task\")\n\n const { apiBase } = getMempoolBase()\n\n // OUTGOING: pending transactions that have tx_hash\n const ret = await getTransactionsByFilter({\n node_type: NODE_TYPE.RGB,\n transaction_kind: TRANSACTION_KIND.ONCHAIN,\n asset_type: TRANSACTION_ASSET_TYPE.BTC,\n direction: TRANSACTION_DIRECTION.OUT,\n status: TRANSACTION_STATUS.PENDING,\n })\n const outgoingTxs = ret?.list\n\n if (!outgoingTxs || outgoingTxs.length === 0) {\n logger.info(\"No BTC outgoing transactions to reconcile\")\n return\n }\n\n let processedCount = 0\n let confirmedCount = 0\n let failedCount = 0\n\n // Process OUTGOING transactions by tx_hash using mempool API\n for (const tx of (outgoingTxs || [])) {\n try {\n const now = Math.floor(Date.now() / 1000)\n const timeoutThreshold = 24 * 60 * 60 // 24\u5C0F\u65F6\n\n if (now - tx.create_at > timeoutThreshold) {\n const filter = {\n tx_hash: tx.tx_hash,\n node_type: NODE_TYPE.RGB,\n transaction_kind: TRANSACTION_KIND.ONCHAIN,\n }\n const updateData = {\n status: TRANSACTION_STATUS.EXPIRED,\n update_at: now,\n }\n await upsertTransactionByFilter(updateData, filter)\n\n logger.warn(`Outgoing transaction ${tx.tx_hash} expired`)\n failedCount++\n continue\n }\n let isConfirmed = false\n let blockHeightVal\n if (tx.tx_hash) {\n const url = `${apiBase}/tx/${tx.tx_hash}/status`\n try {\n const rsp = await fetch(url)\n if (rsp.ok) {\n const js = await rsp.json()\n isConfirmed = !!js.confirmed\n blockHeightVal = js.block_height\n }\n else {\n logger.debug(`mempool status not ok for ${tx.tx_hash}: HTTP ${rsp.status}`)\n }\n }\n catch (e) {\n logger.error(`Fetch mempool status failed for ${tx.tx_hash}: ${e.message}`)\n }\n }\n\n if (isConfirmed) {\n const filter = {\n tx_hash: tx.tx_hash,\n node_type: NODE_TYPE.RGB,\n transaction_kind: TRANSACTION_KIND.ONCHAIN,\n }\n const updateData = {\n status: TRANSACTION_STATUS.CONFIRMED,\n confirmations: 1,\n block_height: blockHeightVal,\n update_at: now,\n }\n await upsertTransactionByFilter(updateData, filter)\n\n logger.info(`Outgoing ${tx.tx_hash} confirmed by mempool at height ${blockHeightVal}`)\n confirmedCount++\n }\n else {\n logger.debug(`Outgoing ${tx.tx_hash} still pending per mempool`)\n }\n\n processedCount++\n }\n catch (error) {\n logger.error(`Error processing transaction ${tx.tx_hash}: ${error.message}`)\n failedCount++\n }\n }\n\n logger.info(`BTC transaction polling completed (OUT only): ${processedCount} processed, ${confirmedCount} confirmed, ${failedCount} failed`)\n }\n catch (error) {\n logger.error(`Error in pollBtcOutTxns: ${error.message}`)\n throw error\n }\n}\n\nasync function pollBtcTransfers() {\n pollBtcInTxns()\n pollBtcOutTxns()\n}\n\nmodule.exports = pollBtcTransfers\n", "const { upsertTransactionByFilter, getTransactionsByFilter } = require(\"@business/service/prisma/db/transactions\")\nconst {\n getInvoiceStatus,\n getPayment,\n decodeLnInvoice,\n} = require(\"@business/service/rgb/lightning\")\nconst Logger = require(\"@business/utils/linkLogger\")\nconst {\n TRANSACTION_STATUS,\n NODE_TYPE,\n TRANSACTION_KIND,\n TRANSACTION_DIRECTION,\n} = require(\"@constants/index\")\n\n/**\n * Poll RGB Lightning transfers status and update database\n * First, find Lightning transaction records with pending status in database\n * Then get latest status from RGB API and update database\n */\nasync function pollLightningTransfers() {\n const logger = new Logger(\"poll-rgb-lightning-transfers\")\n try {\n logger.info(\"Starting RGB Lightning transfers polling task\")\n\n await pollLightningInvoices()\n\n await pollLightningPayments()\n\n logger.info(\"RGB Lightning transfers polling task completed\")\n }\n catch (error) {\n logger.error(`Error in pollLightningTransfers: ${error.message}`)\n throw error\n }\n}\n\n/**\n * Poll Lightning invoices status and update database\n */\nasync function pollLightningInvoices() {\n const logger = new Logger(\"poll-rgb-lightning-transfers\")\n try {\n const pendingInvoices = await getTransactionsByFilter({\n node_type: NODE_TYPE.RGB,\n transaction_kind: TRANSACTION_KIND.LIGHTNING,\n direction: TRANSACTION_DIRECTION.IN,\n status: TRANSACTION_STATUS.PENDING,\n })\n\n if (!pendingInvoices || !pendingInvoices.list || pendingInvoices.list.length === 0) {\n logger.info(\"No pending Lightning invoices found in database\")\n return\n }\n\n logger.info(`Found ${pendingInvoices.list.length} pending Lightning invoices in database`)\n\n let updatedCount = 0\n let unchangedCount = 0\n let errorCount = 0\n let expiredCount = 0\n\n for (const invoice of pendingInvoices.list) {\n try {\n if (!invoice.invoice) {\n logger.warn(`Invoice record ${invoice.id} has no invoice string, skipping`)\n continue\n }\n\n // Check if invoice has expired by decoding it\n const isExpired = await isInvoiceExpired(invoice.invoice)\n if (isExpired) {\n await updateTransaction(invoice, {\n status: TRANSACTION_STATUS.EXPIRED,\n update_at: Math.floor(Date.now() / 1000),\n })\n logger.info(`Marked invoice as EXPIRED: ${formatTransactionLog(invoice)}`)\n expiredCount++\n continue\n }\n\n const statusResult = await getInvoiceStatus({ invoice: invoice.invoice })\n\n if (!statusResult) {\n logger.warn(`No status result for invoice: ${formatTransactionLog(invoice)}`)\n continue\n }\n\n const newStatus = mapInvoiceStatus(statusResult.status)\n\n if (newStatus !== invoice.status) {\n await updateTransaction(invoice, {\n status: newStatus,\n update_at: Math.floor(Date.now() / 1000),\n })\n\n logger.info(`Updated invoice status from ${invoice.status} to ${newStatus}: ${formatTransactionLog(invoice)}`)\n updatedCount++\n }\n else {\n unchangedCount++\n }\n }\n catch (error) {\n logger.error(`Error processing invoice ${invoice.id}: ${error.message}`)\n errorCount++\n }\n }\n\n logger.info(`Lightning invoices polling completed: ${pendingInvoices.list.length} processed, ${updatedCount} updated, ${unchangedCount} unchanged, ${errorCount} errors, ${expiredCount} expired`)\n }\n catch (error) {\n logger.error(`Error in pollLightningInvoices: ${error.message}`)\n throw error\n }\n}\n\n/**\n * Poll Lightning payments status and update database\n */\nasync function pollLightningPayments() {\n const logger = new Logger(\"poll-rgb-lightning-transfers\")\n try {\n const pendingPayments = await getTransactionsByFilter({\n node_type: NODE_TYPE.RGB,\n transaction_kind: TRANSACTION_KIND.LIGHTNING,\n direction: TRANSACTION_DIRECTION.OUT,\n status: TRANSACTION_STATUS.PENDING,\n })\n\n if (!pendingPayments || !pendingPayments.list || pendingPayments.list.length === 0) {\n logger.info(\"No pending Lightning payments found in database\")\n return\n }\n\n logger.info(`Found ${pendingPayments.list.length} pending Lightning payments in database`)\n\n let updatedCount = 0\n let unchangedCount = 0\n let errorCount = 0\n\n for (const payment of pendingPayments.list) {\n try {\n if (!payment.payment_hash) {\n logger.warn(`Payment record ${payment.id} has no payment_hash, skipping`)\n continue\n }\n\n const paymentResult = await getPayment({ payment_hash: payment.payment_hash })\n\n if (!paymentResult || !paymentResult.payment) {\n logger.warn(`No payment result for payment_hash: ${payment.payment_hash}`)\n continue\n }\n\n const newStatus = mapPaymentStatus(paymentResult.payment.status)\n\n if (newStatus !== payment.status) {\n const updateData = {\n status: newStatus,\n update_at: Math.floor(Date.now() / 1000),\n }\n\n if (newStatus === TRANSACTION_STATUS.CONFIRMED && paymentResult.payment.asset_amount) {\n updateData.asset_amount = paymentResult.payment.asset_amount.toString()\n }\n\n await updateTransaction(payment, updateData)\n\n logger.info(`Updated payment status from ${payment.status} to ${newStatus}: ${formatTransactionLog(payment)}`)\n updatedCount++\n }\n else {\n unchangedCount++\n }\n }\n catch (error) {\n logger.error(`Error processing payment ${payment.id}: ${error.message}`)\n errorCount++\n }\n }\n\n logger.info(`Lightning payments polling completed: ${pendingPayments.list.length} processed, ${updatedCount} updated, ${unchangedCount} unchanged, ${errorCount} errors`)\n }\n catch (error) {\n logger.error(`Error in pollLightningPayments: ${error.message}`)\n throw error\n }\n}\n\n/**\n * Check if Lightning invoice has expired\n * @param {string} invoiceString - Lightning invoice string\n * @returns {Promise<boolean>} True if invoice has expired\n */\nasync function isInvoiceExpired(invoiceString) {\n const logger = new Logger(\"poll-rgb-lightning-transfers\")\n try {\n const decoded = await decodeLnInvoice({ invoice: invoiceString })\n\n if (!decoded || !decoded.timestamp || !decoded.expiry_sec) {\n logger.warn(`Failed to decode invoice or missing timestamp/expiry: ${invoiceString.substring(0, 20)}...`)\n return false\n }\n\n const now = Math.floor(Date.now() / 1000)\n const expiryTime = Number(decoded.timestamp) + Number(decoded.expiry_sec)\n\n return now > expiryTime\n }\n catch (error) {\n logger.error(`Error decoding invoice ${invoiceString.substring(0, 20)}...: ${error.message}`)\n return false\n }\n}\n\n/**\n * Map invoice status from RGB API to database status\n * @param {string} invoiceStatus - RGB API invoice status\n * @returns {number} Database transaction status\n */\nfunction mapInvoiceStatus(invoiceStatus) {\n switch (invoiceStatus) {\n case \"Pending\":\n return TRANSACTION_STATUS.PENDING\n case \"Succeeded\":\n return TRANSACTION_STATUS.SETTLED\n case \"Failed\":\n return TRANSACTION_STATUS.FAILED\n case \"Expired\":\n return TRANSACTION_STATUS.EXPIRED\n default:\n return TRANSACTION_STATUS.PENDING\n }\n}\n\n/**\n * Map payment status from RGB API to database status\n * @param {string} paymentStatus - RGB API payment status\n * @returns {number} Database transaction status\n */\nfunction mapPaymentStatus(paymentStatus) {\n switch (paymentStatus) {\n case \"Pending\":\n case \"InFlight\":\n return TRANSACTION_STATUS.PENDING\n case \"Succeeded\":\n return TRANSACTION_STATUS.SETTLED\n case \"Failed\":\n return TRANSACTION_STATUS.FAILED\n default:\n return TRANSACTION_STATUS.PENDING\n }\n}\n\n/**\n * Format transaction log information\n * @param {object} transaction - Database transaction record\n * @returns {string} Formatted log information\n */\nfunction formatTransactionLog(transaction) {\n return JSON.stringify({\n id: transaction.id,\n asset_id: transaction.asset_id,\n invoice: transaction.invoice ? `${transaction.invoice.substring(0, 20)}...` : undefined,\n payment_hash: transaction.payment_hash,\n status: transaction.status,\n })\n}\n\n/**\n * Update transaction record\n * @param {object} transaction - Database transaction record\n * @param {object} updateData - Update data\n * @returns {Promise<void>}\n */\nasync function updateTransaction(transaction, updateData) {\n const filter = { id: transaction.id }\n await upsertTransactionByFilter(updateData, filter)\n}\n\nmodule.exports = pollLightningTransfers\n", "const { upsertTransactionByFilter, getTransactionsByFilter } = require(\"@business/service/prisma/db/transactions\")\nconst { getRGBAssetsList } = require(\"@business/service/rgb/node\")\nconst { listTransfers } = require(\"@business/service/rgb/onchain\")\nconst Logger = require(\"@business/utils/linkLogger\")\nconst {\n TRANSACTION_STATUS,\n NODE_TYPE,\n TRANSACTION_KIND,\n TRANSACTION_ASSET_TYPE,\n TRANSACTION_DIRECTION,\n} = require(\"@constants/index\")\n\n/**\n * Poll RGB asset transfer status and update database\n * First, find RGB transaction records with pending status in database\n * Then get latest status from RGB API and update database\n */\nasync function pollRgbTransfers() {\n const logger = new Logger(\"poll-rgb-transfers\")\n try {\n logger.info(\"Starting RGB asset transfers polling task\")\n\n // 1. Get all pending RGB asset transaction records from database\n const pendingTransactions = await getTransactionsByFilter({\n node_type: NODE_TYPE.RGB,\n transaction_kind: TRANSACTION_KIND.ONCHAIN,\n asset_type: TRANSACTION_ASSET_TYPE.RGB_ASSET,\n status: TRANSACTION_STATUS.PENDING,\n })\n\n if (!pendingTransactions || !pendingTransactions.list || pendingTransactions.list.length === 0) {\n logger.info(\"No pending RGB transactions found in database\")\n return\n }\n\n logger.info(`Found ${pendingTransactions.list.length} pending RGB transactions in database`)\n\n // 2. Process each pending transaction\n let updatedCount = 0\n let unchangedCount = 0\n let notFoundCount = 0\n let expiredCount = 0\n\n for (const transaction of pendingTransactions.list) {\n try {\n // Check if transaction has expired (older than 24 hours)\n if (isTransactionExpired(transaction)) {\n await updateTransaction(transaction, {\n status: TRANSACTION_STATUS.EXPIRED,\n update_at: Math.floor(Date.now() / 1000),\n })\n logger.info(`Marked transaction as EXPIRED: ${formatTransactionLog(transaction)}`)\n expiredCount++\n continue\n }\n\n if (!transaction.asset_id) {\n logger.info(`Processing transaction without asset_id: ${formatTransactionLog(transaction)}`)\n\n const matchedAssetId = await getAssetIdForTransaction(transaction)\n\n if (matchedAssetId) {\n await updateTransaction(transaction, {\n asset_id: matchedAssetId,\n update_at: Math.floor(Date.now() / 1000),\n })\n\n logger.info(`Updated transaction with matched asset_id: ${formatTransactionLog({ ...transaction, asset_id: matchedAssetId })}`)\n updatedCount++\n continue\n }\n else {\n logger.info(`No matching asset ID found for transaction: ${formatTransactionLog(transaction)}`)\n notFoundCount++\n continue\n }\n }\n\n // 3. Get transfers for this specific asset_id\n const result = await listTransfers({ asset_id: transaction.asset_id })\n const transfers = result?.transfers || []\n\n if (!transfers || transfers.length === 0) {\n logger.info(`No transfers found for asset_id ${transaction.asset_id}`)\n notFoundCount++\n continue\n }\n\n // 4. Filter relevant transfers (ReceiveBlind and Send)\n const relevantTransfers = transfers.filter(t => t.kind === \"ReceiveBlind\" || t.kind === \"Send\")\n\n if (relevantTransfers.length === 0) {\n logger.info(`No relevant transfers found for asset_id ${transaction.asset_id}`)\n notFoundCount++\n continue\n }\n\n // 5. Match transaction by invoice or target_address\n const matchedTransfer = findMatchingTransfer(transaction, relevantTransfers)\n\n if (!matchedTransfer) {\n logger.info(`No matching transfer found for transaction: ${formatTransactionLog(transaction)}`)\n notFoundCount++\n continue\n }\n\n // 6. Get new status\n const newStatus = getStatus(matchedTransfer.status)\n\n // 7. Update database if status changed\n if (newStatus !== transaction.status) {\n const updateData = {\n status: newStatus,\n update_at: Math.floor(Date.now() / 1000),\n }\n\n // If transaction is confirmed, add confirmation time\n if (newStatus === TRANSACTION_STATUS.CONFIRMED && matchedTransfer.confirmed_at) {\n updateData.confirm_at = matchedTransfer.confirmed_at\n }\n\n // If transaction hash exists, add transaction hash\n if (matchedTransfer.txid && !transaction.tx_hash) {\n updateData.tx_hash = matchedTransfer.txid\n }\n\n // If asset amount exists, update asset amount\n const assetAmount = calculateAssetAmount(matchedTransfer)\n if (assetAmount !== \"0\" && (!transaction.asset_amount || transaction.asset_amount === \"0\")) {\n updateData.asset_amount = assetAmount\n }\n\n // Update database\n await updateTransaction(transaction, updateData)\n\n logger.info(`Updated transaction status from ${transaction.status} to ${newStatus}: ${formatTransactionLog(transaction)}`)\n updatedCount++\n }\n else {\n unchangedCount++\n }\n }\n catch (error) {\n logger.error(`Error processing transaction ${transaction.id}: ${error.message}`)\n }\n }\n\n logger.info(`RGB transfers polling completed: ${pendingTransactions.list.length} processed, ${updatedCount} updated, ${unchangedCount} unchanged, ${notFoundCount} not found, ${expiredCount} expired`)\n }\n catch (error) {\n logger.error(`Error in pollRgbTransfers: ${error.message}`)\n throw error\n }\n}\n\n/**\n * Check if transaction has expired (older than 24 hours)\n * @param {object} transaction - Database transaction record\n * @returns {boolean} True if transaction has expired\n */\nfunction isTransactionExpired(transaction) {\n if (!transaction.create_at) {\n return false\n }\n\n const now = Math.floor(Date.now() / 1000)\n const EXPIRY_THRESHOLD = 24 * 60 * 60 // 24 hours in seconds\n\n return (now - transaction.create_at) > EXPIRY_THRESHOLD\n}\n\n/**\n * Determine direction based on transaction type\n * @param {string} kind - Transaction type\n * @returns {string} Transaction direction\n */\nfunction getDirection(kind) {\n switch (kind) {\n case \"Send\":\n return TRANSACTION_DIRECTION.OUT\n case \"ReceiveBlind\":\n case \"Issuance\":\n return TRANSACTION_DIRECTION.IN\n default:\n return null\n }\n}\n\n/**\n * Map RGB status to database status\n * @param {string} rgbStatus - RGB transaction status\n * @returns {number} Database transaction status\n */\nfunction getStatus(rgbStatus) {\n switch (rgbStatus) {\n case \"Settled\":\n return TRANSACTION_STATUS.CONFIRMED\n case \"WaitingCounterparty\":\n return TRANSACTION_STATUS.PENDING\n case \"Failed\":\n return TRANSACTION_STATUS.FAILED\n case \"Expired\":\n return TRANSACTION_STATUS.EXPIRED\n default:\n return TRANSACTION_STATUS.PENDING\n }\n}\n\n/**\n * Calculate asset amount\n * @param {object} transfer - Transfer object\n * @returns {string} Asset amount\n */\nfunction calculateAssetAmount(transfer) {\n if (transfer.requested_assignment && transfer.requested_assignment.type === \"Fungible\") {\n return transfer.requested_assignment.value.toString()\n }\n\n if (transfer.assignments && transfer.assignments.length > 0) {\n return transfer.assignments[0].value.toString()\n }\n\n return \"0\"\n}\n\n/**\n * Find matching RGB transfer for database transaction record\n * @param {object} transaction - Database transaction record\n * @param {Array} transfers - RGB API transfer list\n * @returns {object | null} Matching transfer or null\n */\nfunction findMatchingTransfer(transaction, transfers) {\n // Return null if no transfers list\n if (!transfers || transfers.length === 0) {\n return null\n }\n\n // 1. Match by transaction hash first\n if (transaction.tx_hash) {\n const txMatch = transfers.find(t => t.txid === transaction.tx_hash)\n if (txMatch)\n return txMatch\n }\n\n // 2. If invoice exists, match by invoice\n if (transaction.invoice) {\n const invoiceMatch = transfers.find(t => t.invoice === transaction.invoice)\n if (invoiceMatch)\n return invoiceMatch\n }\n\n // 3. If target address exists, match by target address (recipient_id)\n if (transaction.target_address) {\n const addressMatches = transfers.filter(t => t.recipient_id === transaction.target_address)\n\n // Filter further by asset ID if multiple matches exist\n if (addressMatches.length > 0 && transaction.asset_id) {\n const assetMatches = addressMatches.filter(t => t.asset_id === transaction.asset_id)\n if (assetMatches.length > 0) {\n // Return latest match\n return assetMatches.sort((a, b) => b.created_at - a.created_at)[0]\n }\n }\n\n // Return latest match if no asset ID match or no asset ID\n if (addressMatches.length > 0) {\n return addressMatches.sort((a, b) => b.created_at - a.created_at)[0]\n }\n }\n\n // 4. If asset ID exists, try to match by asset ID and transaction direction\n if (transaction.asset_id) {\n const assetMatches = transfers.filter(t => t.asset_id === transaction.asset_id)\n\n if (assetMatches.length > 0 && transaction.direction) {\n const directionMatches = assetMatches.filter((t) => {\n const direction = getDirection(t.kind)\n return direction === transaction.direction\n })\n\n if (directionMatches.length > 0) {\n return directionMatches.sort((a, b) => b.created_at - a.created_at)[0]\n }\n }\n\n // Return latest asset match if no direction match or no direction info\n if (assetMatches.length > 0) {\n return assetMatches.sort((a, b) => b.created_at - a.created_at)[0]\n }\n }\n\n // No match found\n return null\n}\n\n/**\n * Format transaction log information\n * @param {object} transaction - Database transaction record\n * @returns {string} Formatted log information\n */\nfunction formatTransactionLog(transaction) {\n return JSON.stringify({\n id: transaction.id,\n asset_id: transaction.asset_id,\n invoice: transaction.invoice ? `${transaction.invoice.substring(0, 20)}...` : undefined,\n tx_hash: transaction.tx_hash,\n target_address: transaction.target_address,\n })\n}\n\n/**\n * @param {object} transaction\n * @returns {string|null}\n */\nasync function getAssetIdForTransaction(transaction) {\n const logger = new Logger(\"poll-rgb-transfers\")\n if (!transaction.target_address) {\n logger.info(`Transaction has no target_address, cannot match asset_id: ${formatTransactionLog(transaction)}`)\n return null\n }\n\n let allRgbAssets = []\n try {\n allRgbAssets = await getRGBAssetsList()\n logger.info(`Retrieved ${allRgbAssets.length} RGB assets from node`)\n }\n catch (error) {\n logger.error(`Error getting RGB assets list: ${error.message}`)\n return null\n }\n\n if (allRgbAssets.length === 0) {\n logger.info(`No RGB assets found in node`)\n return null\n }\n\n for (const asset of allRgbAssets) {\n try {\n const assetId = asset.asset_id\n const result = await listTransfers({ asset_id: assetId })\n const transfers = result?.transfers || []\n\n if (transfers.length === 0) {\n continue\n }\n\n const addressMatch = transfers.find(t => t.recipient_id === transaction.target_address)\n if (addressMatch) {\n logger.info(`Found matching asset_id ${assetId} by target_address for transaction: ${formatTransactionLog(transaction)}`)\n return assetId\n }\n }\n catch (error) {\n logger.error(`Error processing asset ${asset.asset_id}: ${error.message}`)\n }\n }\n\n logger.info(`No matching asset found for transaction: ${formatTransactionLog(transaction)}`)\n return null\n}\n\n/**\n * Update transaction record\n * @param {object} transaction - Database transaction record\n * @param {object} updateData - Update data\n * @returns {Promise<void>}\n */\nasync function updateTransaction(transaction, updateData) {\n const filter = { id: transaction.id }\n await upsertTransactionByFilter(updateData, filter)\n}\n\nmodule.exports = pollRgbTransfers\n", "const {\n getNodeState,\n refreshTransfers,\n} = require(\"@business/service/rgb\")\nconst Logger = require(\"@business/utils/linkLogger\")\nconst { WALLET_STATE_CODE } = require(\"@constants/index\")\n\nasync function callRefreshTransfers() {\n const logger = new Logger(\"job\")\n try {\n const nodeState = await getNodeState()\n if (nodeState.state !== WALLET_STATE_CODE.SERVER_ACTIVE) {\n return\n }\n await refreshTransfers({ skip_sync: false })\n }\n catch (error) {\n logger.error(`Job refreshTransfers error: ${error}`)\n }\n}\n\nmodule.exports = callRefreshTransfers\n", "const {\n upsertTransactionByFilter,\n getTransactionsByFilter,\n} = require(\"@business/service/prisma/dbService\")\nconst Logger = require(\"@business/utils/linkLogger.js\")\nconst {\n TRANSACTION_STATUS,\n TRANSACTION_DIRECTION,\n} = require(\"@constants/index.js\")\n\n/**\n * Maps AddrEventStatus enum values to database status\n * @param {string} status - The status from ReceiveEvent\n * @returns {number} The corresponding status for the database\n */\nfunction mapReceiveEventStatusToTransactionStatus(status) {\n switch (status) {\n case \"ADDR_EVENT_STATUS_UNKNOWN\":\n return TRANSACTION_STATUS.PENDING\n case \"ADDR_EVENT_STATUS_TRANSACTION_DETECTED\":\n return TRANSACTION_STATUS.PENDING\n case \"ADDR_EVENT_STATUS_TRANSACTION_CONFIRMED\":\n return TRANSACTION_STATUS.CONFIRMED\n case \"ADDR_EVENT_STATUS_PROOF_RECEIVED\":\n return TRANSACTION_STATUS.CONFIRMED\n case \"ADDR_EVENT_STATUS_COMPLETED\":\n return TRANSACTION_STATUS.CONFIRMED\n default:\n return TRANSACTION_STATUS.PENDING\n }\n}\n\n/**\n * Maps SendState enum values to database status\n * @param {string} sendState - The send state from SendEvent\n * @returns {number} The corresponding status for the database\n */\nfunction mapSendStateToTransactionStatus(sendState) {\n switch (sendState) {\n case \"SendStateWaitTxConf\":\n case \"SendStateStorePostAnchorTxConf\":\n case \"SendStateTransferProofs\":\n return TRANSACTION_STATUS.PENDING\n case \"SendStateComplete\":\n return TRANSACTION_STATUS.CONFIRMED\n default:\n return TRANSACTION_STATUS.PENDING\n }\n}\n\n/**\n * Generates a descriptive transaction description for Taproot Assets\n * @param {string} assetId - Asset ID\n * @param {string} amount - Transaction amount\n * @param {string} direction - Transaction direction\n * @param {string} txHash - Transaction hash\n * @returns {string} Transaction description\n */\nfunction generateTaprootTransactionDescription(assetId, amount, direction, txHash) {\n const shortAssetId = `${assetId.substring(0, 8)}...${assetId.substring(assetId.length - 8)}`\n const shortHash = txHash ? `${txHash.substring(0, 8)}...${txHash.substring(txHash.length - 8)}` : \"pending\"\n const directionText = direction === TRANSACTION_DIRECTION.IN ? \"deposit\" : \"withdrawal\"\n\n return `Taproot Asset ${directionText} - ${amount} units of ${shortAssetId} (${shortHash})`\n}\n\n/**\n * Handles Taproot Asset receive events (incoming transactions)\n * @param {object} receiveEvent - ReceiveEvent object from tapd\n * @returns {Promise<object>} Processing result\n */\nasync function handleTaprootReceiveEvent(receiveEvent) {\n const logger = new Logger(\"taprootOnchainTransChange\")\n try {\n logger.info(`Processing Taproot receive event:`, receiveEvent?.address, receiveEvent.outpoint)\n\n if (!receiveEvent.address || !receiveEvent.outpoint) {\n throw new Error(\"Invalid receive event: missing address or outpoint\")\n }\n\n // Extract data from receive event\n const {\n address,\n outpoint,\n confirmation_height = 0,\n status = \"ADDR_EVENT_STATUS_UNKNOWN\",\n timestamp,\n } = receiveEvent\n\n // Extract asset information from address\n const asset_id = address.asset_id ? address.asset_id.toString(\"hex\") : null\n const asset_amount = address.amount ? address.amount.toString() : \"0\"\n const target_address = address.encoded || null\n\n if (!asset_id || !target_address) {\n throw new Error(\"Invalid receive event: missing asset_id or target_address\")\n }\n\n // Extract tx_hash from outpoint (format: \"txid:vout\")\n const tx_hash = outpoint.split(\":\")[0]\n\n // Map status to transaction status\n const transaction_status = mapReceiveEventStatusToTransactionStatus(status)\n\n const currentTimestamp = Math.floor(Date.now() / 1000)\n\n // Update the waiting record with actual transaction data\n const updateData = {\n tx_hash,\n status: transaction_status,\n block_height: confirmation_height || 0,\n confirmations: confirmation_height > 0 ? 1 : 0,\n update_at: currentTimestamp,\n settled_at: transaction_status === TRANSACTION_STATUS.CONFIRMED ? currentTimestamp : null,\n description: generateTaprootTransactionDescription(asset_id, asset_amount, TRANSACTION_DIRECTION.IN, tx_hash),\n }\n\n // Add timestamp if available\n if (timestamp) {\n updateData.create_at = Math.floor(timestamp / 1000000) // Convert microseconds to seconds\n }\n\n const filter = { target_address }\n const result = await upsertTransactionByFilter(updateData, filter)\n\n if (result) {\n logger.info(`Successfully updated Taproot receive record: ${tx_hash}, asset: ${asset_id}, amount: ${asset_amount}`)\n\n return {\n success: true,\n tx_hash,\n asset_id,\n asset_amount,\n direction: TRANSACTION_DIRECTION.IN,\n status: transaction_status,\n target_address,\n is_update: true,\n operation_type: \"update_waiting_record\",\n processed_at: currentTimestamp,\n }\n }\n else {\n throw new Error(`Database update failed for Taproot transaction ${tx_hash}`)\n }\n }\n catch (error) {\n logger.error(`Error processing Taproot receive event: ${error.message}`)\n throw error\n }\n}\n\n/**\n * Handles Taproot Asset send events (outgoing transactions)\n * @param {object} sendEvent - SendEvent object from tapd\n * @returns {Promise<object>} Processing result\n */\nasync function handleTaprootSendEvent(sendEvent) {\n const logger = new Logger(\"taprootOnchainTransChange\")\n try {\n logger.info(`Processing Taproot send event----------->:`, sendEvent?.send_state)\n\n if (!sendEvent.transfer) {\n logger.debug(\"Send event has no transfer data, skipping\")\n return {\n success: false,\n reason: \"No transfer data in send event\",\n }\n }\n\n // Extract data from send event\n const {\n send_state,\n transfer,\n } = sendEvent\n\n const {\n anchor_tx_hash,\n inputs = [],\n anchor_tx_chain_fees = 0,\n anchor_tx_height_hint = 0,\n } = transfer\n\n if (!anchor_tx_hash || inputs.length === 0) {\n throw new Error(\"Invalid send event: missing anchor_tx_hash or inputs\")\n }\n\n // Extract asset information from first input (assuming single asset transfer)\n const firstInput = inputs[0]\n const asset_id = firstInput.asset_id ? firstInput.asset_id.toString(\"hex\") : null\n // const asset_amount = firstInput.amount ? firstInput.amount.toString() : \"0\"\n\n if (!asset_id) {\n throw new Error(\"Invalid send event: missing asset_id in inputs\")\n }\n\n const tx_hash = anchor_tx_hash.toString(\"hex\")\n\n // Map send state to transaction status\n const transaction_status = mapSendStateToTransactionStatus(send_state)\n\n const currentTimestamp = Math.floor(Date.now() / 1000)\n\n // Update the most recent waiting send record for this asset\n const updateData = {\n tx_hash,\n status: transaction_status,\n fees_paid: anchor_tx_chain_fees ? anchor_tx_chain_fees.toString() : \"0\",\n block_height: anchor_tx_height_hint || 0,\n confirmations: anchor_tx_height_hint > 0 ? 1 : 0,\n update_at: currentTimestamp,\n settled_at: transaction_status === TRANSACTION_STATUS.CONFIRMED ? currentTimestamp : null,\n }\n\n // Simple approach: find record by tx_hash and update it\n logger.info(`Looking for existing record with tx_hash: ${tx_hash}`)\n\n const existingRecords = await getTransactionsByFilter({\n tx_hash,\n limit: 1,\n })\n\n if (!existingRecords.list || existingRecords.list.length === 0) {\n logger.warn(`No record found for tx_hash: ${tx_hash}. Will retry on next event.`)\n return {\n success: false,\n reason: \"Record not found, will retry later\",\n tx_hash,\n skipped: true,\n }\n }\n\n // Found the record, update it with new status\n logger.info(`Found existing record for tx_hash: ${tx_hash}, updating status to: ${transaction_status}`)\n\n const filter = { tx_hash }\n const result = await upsertTransactionByFilter(updateData, filter)\n\n if (result) {\n logger.info(`Successfully updated Taproot send record: ${tx_hash}, asset: ${asset_id}`)\n\n return {\n success: true,\n tx_hash,\n asset_id,\n direction: TRANSACTION_DIRECTION.OUT,\n status: transaction_status,\n fees_paid: anchor_tx_chain_fees,\n is_update: true,\n operation_type: \"update_waiting_record\",\n processed_at: currentTimestamp,\n }\n }\n else {\n throw new Error(`Database update failed for Taproot send transaction ${tx_hash}`)\n }\n }\n catch (error) {\n logger.error(`Error processing Taproot send event: ${error.message}`)\n throw error\n }\n}\n\nmodule.exports = {\n handleTaprootReceiveEvent,\n handleTaprootSendEvent,\n mapReceiveEventStatusToTransactionStatus,\n mapSendStateToTransactionStatus,\n generateTaprootTransactionDescription,\n}\n", "const { getTransactionsByFilter, upsertTransactionByFilter } = require(\"@business/service/prisma/dbService\")\nconst { addrReceives, listTransfers } = require(\"@business/service/tapdService\")\nconst Logger = require(\"@business/utils/linkLogger.js\")\nconst {\n TRANSACTION_STATUS,\n TRANSACTION_KIND,\n TRANSACTION_ASSET_TYPE,\n TRANSACTION_DIRECTION,\n} = require(\"@constants/index.js\")\nconst {\n mapReceiveEventStatusToTransactionStatus,\n generateTaprootTransactionDescription,\n} = require(\"./taprootOnchainTransChange\")\n\n// Set timeout thresholds\nconst INCOMING_PENDING_THRESHOLD_MINUTES = 20\nconst OUTGOING_PENDING_THRESHOLD_MINUTES = 15\n\n/**\n * Find the most definitive event from a list of receive events\n * Prefers events with status 'COMPLETED' or 'PROOF_RECEIVED'\n * @param {Array<object>} events - List of events returned by addrReceives\n * @returns {object|null} The most definitive event, or null if none are useful\n */\nfunction findMostDefinitiveReceiveEvent(events) {\n if (!events || events.length === 0) {\n return null\n }\n\n let bestEvent = events[0]\n for (const event of events) {\n // A completed or proof received event is always preferred\n if (event.status === \"ADDR_EVENT_STATUS_COMPLETED\" || event.status === \"ADDR_EVENT_STATUS_PROOF_RECEIVED\") {\n return event\n }\n // A confirmed event is better than a pending one\n if (event.status === \"ADDR_EVENT_STATUS_TRANSACTION_CONFIRMED\" && bestEvent.status !== \"ADDR_EVENT_STATUS_TRANSACTION_CONFIRMED\") {\n bestEvent = event\n }\n }\n\n // Only return events that have at least a detected transaction\n if (bestEvent.status === \"ADDR_EVENT_STATUS_UNKNOWN\") {\n return null\n }\n\n return bestEvent\n}\n\n/**\n * Poll and update the status of Taproot Asset transfers\n * Includes both incoming and outgoing transactions\n */\nasync function pollTaprootAssetTransfers() {\n const logger = new Logger(\"poll-taproot-transfers\")\n try {\n logger.info(\"Starting Taproot Asset transfers polling task\")\n\n // Check if TaprootAssets is enabled before proceeding\n const { checkTprEnabled } = require(\"@business/common/index\")\n const isTaprootEnabled = await checkTprEnabled()\n\n if (!isTaprootEnabled) {\n logger.warn(\"TaprootAssets not enabled, skipping polling task\")\n return\n }\n\n // Process incoming transactions\n await pollIncomingTransfers()\n\n // Process outgoing transactions\n await pollOutgoingTransfers()\n\n logger.info(\"Taproot Asset transfers polling task completed\")\n }\n catch (error) {\n // Handle TaprootAssets not enabled error gracefully\n if (error.message.includes(\"TaprootAssets not enabled\")) {\n logger.warn(\"TaprootAssets not enabled, skipping polling task\")\n return\n }\n\n logger.error(`Error in pollTaprootAssetTransfers: ${error.message}`, { stack: error.stack })\n throw error\n }\n}\n\n/**\n * Poll and update the status of incoming Taproot Asset transactions\n */\nasync function pollIncomingTransfers() {\n const logger = new Logger(\"poll-taproot-transfers\")\n logger.info(\"Polling pending Taproot Asset incoming on-chain transactions...\")\n\n try {\n const threshold = new Date()\n threshold.setMinutes(threshold.getMinutes() - INCOMING_PENDING_THRESHOLD_MINUTES)\n\n const pendingTxsResult = await getTransactionsByFilter({\n status: TRANSACTION_STATUS.PENDING,\n transaction_kind: TRANSACTION_KIND.ONCHAIN,\n direction: TRANSACTION_DIRECTION.IN,\n asset_type: TRANSACTION_ASSET_TYPE.TAPROOT_ASSET,\n from: Math.floor(threshold.getTime() / 1000),\n })\n\n const localPendingTxs = pendingTxsResult.list\n\n if (!localPendingTxs || localPendingTxs.length === 0) {\n logger.info(\"No pending incoming Taproot transactions found in database\")\n return\n }\n\n logger.info(`Found ${localPendingTxs.length} pending incoming Taproot transactions to check`)\n\n let reconciledCount = 0\n\n for (const tx of localPendingTxs) {\n if (!tx.target_address)\n continue\n\n try {\n const authoritativeEvents = await addrReceives(tx.target_address)\n const bestEvent = findMostDefinitiveReceiveEvent(authoritativeEvents)\n\n if (bestEvent) {\n const authoritativeStatus = mapReceiveEventStatusToTransactionStatus(bestEvent.status)\n\n if (authoritativeStatus === TRANSACTION_STATUS.CONFIRMED) {\n logger.info(`Updating incoming transaction for address ${tx.target_address}: status is ${bestEvent.status} on tapd`)\n\n const tx_hash = bestEvent.outpoint.split(\":\")[0]\n const updateData = {\n status: TRANSACTION_STATUS.CONFIRMED,\n tx_hash,\n block_height: bestEvent.confirmation_height || 0,\n confirmations: bestEvent.confirmation_height > 0 ? 1 : 0,\n settled_at: bestEvent.timestamp\n ? Math.floor(bestEvent.timestamp / 1000000) // Use authoritative timestamp\n : Math.floor(Date.now() / 1000),\n update_at: Math.floor(Date.now() / 1000),\n description: generateTaprootTransactionDescription(tx.asset_id, tx.asset_amount, TRANSACTION_DIRECTION.IN, tx_hash),\n }\n\n await upsertTransactionByFilter(updateData, { target_address: tx.target_address })\n reconciledCount++\n }\n }\n }\n catch (error) {\n logger.error(`Failed to update incoming transaction for address ${tx.target_address}: ${error.message}`)\n // Continue to next transaction\n }\n }\n\n logger.info(`Incoming Taproot transactions polling completed: ${reconciledCount} of ${localPendingTxs.length} transactions updated`)\n }\n catch (error) {\n logger.error(`Error in pollIncomingTransfers: ${error.message}`, { stack: error.stack })\n }\n}\n\n/**\n * Poll and update the status of outgoing Taproot Asset transactions\n */\nasync function pollOutgoingTransfers() {\n const logger = new Logger(\"poll-taproot-transfers\")\n logger.info(\"Polling pending Taproot Asset outgoing on-chain transactions...\")\n\n try {\n const authoritativeTransfers = await listTransfers()\n if (!authoritativeTransfers || authoritativeTransfers.length === 0) {\n logger.info(\"No transfers found from tapd, skipping outgoing transactions polling\")\n return\n }\n\n const transfersMap = new Map()\n for (const transfer of authoritativeTransfers) {\n if (transfer.anchor_tx_hash) {\n const txHash = transfer.anchor_tx_hash.toString(\"hex\")\n transfersMap.set(txHash, transfer)\n }\n }\n\n const threshold = new Date()\n threshold.setMinutes(threshold.getMinutes() - OUTGOING_PENDING_THRESHOLD_MINUTES)\n\n const pendingTxsResult = await getTransactionsByFilter({\n status: TRANSACTION_STATUS.PENDING,\n transaction_kind: TRANSACTION_KIND.ONCHAIN,\n direction: TRANSACTION_DIRECTION.OUT,\n asset_type: TRANSACTION_ASSET_TYPE.TAPROOT_ASSET,\n created_at: Math.floor(threshold.getTime() / 1000),\n })\n\n const localPendingTxs = pendingTxsResult.list\n\n if (!localPendingTxs || localPendingTxs.length === 0) {\n logger.info(\"No pending outgoing Taproot transactions found in database\")\n return\n }\n\n logger.info(`Found ${localPendingTxs.length} pending outgoing Taproot transactions to check`)\n\n let reconciledCount = 0\n\n for (const tx of localPendingTxs) {\n if (!tx.tx_hash)\n continue\n\n const authoritativeTransfer = transfersMap.get(tx.tx_hash)\n\n if (authoritativeTransfer) {\n const isConfirmed = Boolean(\n authoritativeTransfer.anchor_tx_block_hash\n && (authoritativeTransfer.anchor_tx_height_hint > 0\n || authoritativeTransfer.anchor_tx_block_height > 0),\n )\n\n if (isConfirmed) {\n logger.info(`Updating outgoing transaction ${tx.tx_hash}: confirmed on-chain via tapd transfer data`)\n\n await upsertTransactionByFilter({\n status: TRANSACTION_STATUS.CONFIRMED,\n block_height: authoritativeTransfer.anchor_tx_height_hint || authoritativeTransfer.anchor_tx_block_height || 0,\n confirmations: 1,\n settled_at: authoritativeTransfer.transfer_timestamp\n ? Math.floor(authoritativeTransfer.transfer_timestamp / 1000000)\n : Math.floor(Date.now() / 1000),\n fees_paid: authoritativeTransfer.anchor_tx_chain_fees\n ? authoritativeTransfer.anchor_tx_chain_fees.toString()\n : tx.fees_paid,\n update_at: Math.floor(Date.now() / 1000),\n }, { tx_hash: tx.tx_hash })\n reconciledCount++\n }\n }\n else {\n logger.warn(`Could not find tx ${tx.tx_hash} in recent tapd transfers. It might be too old or have failed before broadcasting.`)\n }\n }\n\n logger.info(`Outgoing Taproot transactions polling completed: ${reconciledCount} of ${localPendingTxs.length} transactions updated`)\n }\n catch (error) {\n logger.error(`Error in pollOutgoingTransfers: ${error.message}`, { stack: error.stack })\n }\n}\n\nmodule.exports = pollTaprootAssetTransfers\n", "// Import event handlers\nconst { initAccount } = require(\"@business/service/accountService.js\")\n\nconst { bakeLoopMacaroon } = require(\"@business/service/lndService.js\")\nconst { bakeTaprootMacaroon } = require(\"@business/service/tapdService.js\")\nconst linkCache = require(\"@business/utils/linkCache\")\nconst Logger = require(\"@business/utils/linkLogger.js\")\nconst { WALLET_STATE_CODE } = require(\"@constants/index\")\nconst { listenerNostrEvent } = require(\"@nostr/connection/connectionManager\")\n// Import existing task implementations for reuse\nconst addFederationServer = require(\"../lnd/addFederationServer\")\nconst checkChannelState = require(\"../lnd/checkChannelState\")\nconst connectPeer = require(\"../lnd/connectPeer\")\nconst pollLitdBtcTransfers = require(\"../lnd/pollBtcTransfers\")\nconst pollInvoiceTransfers = require(\"../lnd/pollInvoiceTransfers\")\nconst rgbConnectPeer = require(\"../rgb/connectPeer\")\nconst pollBtcTransfers = require(\"../rgb/pollBtcTransfers\")\n\nconst pollLightningTransfers = require(\"../rgb/pollLightningTransfers\")\nconst pollRgbTransfers = require(\"../rgb/pollRgbTransfers\")\nconst refreshTransfers = require(\"../rgb/refreshTransfers\")\nconst pollTaprootAssetTransfers = require(\"../tapd/pollTaprootAssetTransfers\")\n\n/**\n * Unified task configuration\n * All tasks are defined here with their implementation, schedule, and gate conditions\n */\nconst TASKS = {\n // LND-dependent scheduled tasks\n lnd_connect_peer: {\n type: \"cron\",\n schedule: \"*/3 * * * *\",\n implementation: connectPeer,\n gate: \"lndActive\",\n priority: 3,\n enabled: true,\n maxRetries: 3,\n timeout: 30000,\n description: \"Periodically connect to peer nodes\",\n },\n lnd_check_channel_state: {\n type: \"cron\",\n schedule: \"*/3 * * * *\",\n implementation: checkChannelState,\n gate: \"lndActive\",\n priority: 3,\n enabled: true,\n maxRetries: 3,\n timeout: 30000,\n description: \"Periodically check channel state\",\n },\n\n lnd_add_federation: {\n type: \"cron\",\n schedule: \"*/3 * * * *\",\n implementation: addFederationServer,\n gate: \"lndActive\",\n priority: 4,\n enabled: true,\n maxRetries: 3,\n timeout: 30000,\n description: \"Periodically add federation servers\",\n },\n\n lnd_poll_btc_transfers: {\n type: \"cron\",\n schedule: \"*/2 * * * *\",\n implementation: pollLitdBtcTransfers,\n gate: \"lndActive\",\n priority: 3,\n enabled: true,\n maxRetries: 3,\n timeout: 60000,\n description: \"Poll LND BTC transfers status and update the database\",\n },\n\n lnd_poll_invoice_transfers: {\n type: \"cron\",\n schedule: \"*/10 * * * * *\",\n implementation: pollInvoiceTransfers,\n gate: \"lndActive\",\n priority: 2,\n enabled: true,\n maxRetries: 3,\n timeout: 30000,\n description: \"Poll LND invoice transfers for status changes (backup mechanism)\",\n },\n\n tapd_poll_asset_transfers: {\n type: \"cron\",\n schedule: \"*/1 * * * *\",\n implementation: pollTaprootAssetTransfers,\n gate: \"lndActive\",\n priority: 5,\n enabled: true,\n maxRetries: 3,\n timeout: 60000,\n description: \"Poll Taproot Asset transfers status and update the database\",\n },\n\n // RGB scheduled tasks (dependent on RGB state)\n rgb_connect_peer: {\n type: \"cron\",\n schedule: \"*/3 * * * *\",\n implementation: rgbConnectPeer,\n gate: \"rgbActive\",\n priority: 3,\n enabled: true,\n maxRetries: 3,\n timeout: 30000,\n description: \"Periodically connect to RGB peer nodes\",\n },\n\n rgb_refresh_transfers: {\n type: \"cron\",\n schedule: \"*/10 * * * * *\",\n implementation: refreshTransfers,\n gate: \"rgbActive\",\n priority: 2,\n enabled: true,\n maxRetries: 3,\n timeout: 30000,\n description: \"Refresh RGB transfers status\",\n },\n\n rgb_poll_btc_transfers: {\n type: \"cron\",\n schedule: \"*/2 * * * *\",\n implementation: pollBtcTransfers,\n gate: \"rgbActive\",\n priority: 2,\n enabled: true,\n maxRetries: 3,\n timeout: 30000,\n description: \"Poll RGB BTC transfers\",\n },\n\n rgb_poll_rgb_transfers: {\n type: \"cron\",\n schedule: \"*/2 * * * *\",\n implementation: pollRgbTransfers,\n gate: \"rgbActive\",\n priority: 2,\n enabled: true,\n maxRetries: 3,\n timeout: 30000,\n description: \"Poll RGB asset transfers\",\n },\n\n rgb_poll_lightning_transfers: {\n type: \"cron\",\n schedule: \"*/30 * * * * *\",\n implementation: pollLightningTransfers,\n gate: \"rgbActive\",\n priority: 1,\n enabled: true,\n maxRetries: 3,\n timeout: 30000,\n description: \"Poll RGB Lightning transfers\",\n },\n\n // Event-driven tasks\n bake_tapd_macaroon: {\n type: \"event\",\n event: \"bakeTapdMacaroon\",\n implementation: async () => {\n const logger = new Logger(\"bake-tapd-macaroon\")\n const password = linkCache.get(\"tempPassword\")\n\n if (!password) {\n logger.warn(\"No password found in linkCache, skip bakeTapdMacaroon\")\n return\n }\n\n // Use direct call - task-level retry mechanism will handle failures\n await bakeTaprootMacaroon({ secret: password })\n logger.info(\"Taproot macaroon baked successfully\")\n },\n gate: \"always\",\n enabled: true,\n maxRetries: 10,\n description: \"Bake Taproot macaroon when server is active\",\n },\n\n bake_loop_macaroon: {\n type: \"event\",\n event: \"bakeLoopMacaroon\",\n implementation: async (password) => {\n const { terminateableRetryExecute } = require(\"@business/utils/executeWithRetry\")\n const Logger = require(\"@business/utils/linkLogger.js\")\n\n const logger = new Logger(\"bake-loop-macaroon\")\n\n await terminateableRetryExecute(\n bakeLoopMacaroon,\n { origin_secret: password },\n \"bakeLoopMacaroon\",\n 0,\n 60000,\n logger,\n )\n },\n gate: \"always\",\n enabled: true,\n maxRetries: 5,\n description: \"Bake Loop macaroon\",\n },\n\n listen_nostr_event: {\n type: \"event\",\n event: \"listenNostrEvent\",\n implementation: listenerNostrEvent,\n gate: \"always\",\n enabled: true,\n description: \"Start listening to Nostr events\",\n },\n\n init_account: {\n type: \"event\",\n event: \"initAccount\",\n implementation: initAccount,\n gate: \"always\",\n enabled: true,\n description: \"Initialize account\",\n },\n}\n\n/**\n * Gate definitions - conditions that control task execution\n */\nconst GATES = {\n always: () => true,\n lndActive: () => {\n const linkCache = require(\"@business/utils/linkCache\")\n const walletState = linkCache.get(\"walletState\")\n return walletState === WALLET_STATE_CODE.SERVER_ACTIVE\n },\n rgbActive: () => {\n const linkCache = require(\"@business/utils/linkCache\")\n const rgbState = linkCache.get(\"rgbState\")\n return rgbState === 4 // RGB Running state\n },\n}\n\nmodule.exports = {\n TASKS,\n GATES,\n}\n", "const EventEmitter = require(\"node:events\")\nconst Logger = require(\"@business/utils/linkLogger\")\n\n/**\n * Simplified Event Bus\n * Replaces the complex linkEvent + EventRegistry + EventHandlers system\n */\nclass EventBus extends EventEmitter {\n constructor() {\n super()\n this.logger = new Logger(\"EventBus\")\n this.handlers = new Map()\n this.stats = {\n eventsEmitted: 0,\n handlersRegistered: 0,\n errors: 0,\n }\n }\n\n /**\n * Register an event handler\n * @param {string} eventName - Event name\n * @param {Function} handler - Handler function\n * @param {object} options - Handler options\n */\n register(eventName, handler, options = {}) {\n if (this.handlers.has(eventName)) {\n this.logger.warn(`Event handler for '${eventName}' already exists, replacing...`)\n this.unregister(eventName)\n }\n\n const wrappedHandler = async (...args) => {\n try {\n this.logger.debug(`Event '${eventName}' triggered`)\n const startTime = Date.now()\n\n const result = await handler(...args)\n\n const duration = Date.now() - startTime\n this.logger.debug(`Event '${eventName}' completed in ${duration}ms`)\n\n return result\n }\n catch (error) {\n this.stats.errors++\n this.logger.error(`Event '${eventName}' handler failed: ${error.message}`)\n\n if (options.throwOnError) {\n throw error\n }\n }\n }\n\n this.on(eventName, wrappedHandler)\n this.handlers.set(eventName, {\n handler: wrappedHandler,\n originalHandler: handler,\n options,\n registeredAt: new Date(),\n })\n\n this.stats.handlersRegistered++\n this.logger.info(`Registered event handler: ${eventName}`)\n }\n\n /**\n * Unregister an event handler\n * @param {string} eventName - Event name\n */\n unregister(eventName) {\n const handlerInfo = this.handlers.get(eventName)\n if (handlerInfo) {\n this.removeListener(eventName, handlerInfo.handler)\n this.handlers.delete(eventName)\n this.logger.info(`Unregistered event handler: ${eventName}`)\n }\n }\n\n /**\n * Emit an event\n * @param {string} eventName - Event name\n * @param {...any} args - Event arguments\n */\n emit(eventName, ...args) {\n this.stats.eventsEmitted++\n this.logger.debug(`Emitting event: ${eventName}`)\n return super.emit(eventName, ...args)\n }\n\n /**\n * Get event bus statistics\n * @returns {object} Statistics\n */\n getStats() {\n return {\n ...this.stats,\n registeredHandlers: this.handlers.size,\n handlerNames: Array.from(this.handlers.keys()),\n }\n }\n\n /**\n * Clean up all handlers\n */\n cleanup() {\n this.logger.info(\"Cleaning up event bus...\")\n\n const handlerNames = Array.from(this.handlers.keys())\n handlerNames.forEach(eventName => this.unregister(eventName))\n\n this.removeAllListeners()\n this.logger.info(`Event bus cleanup completed. Removed ${handlerNames.length} handlers`)\n }\n}\n\nmodule.exports = EventBus\n", "const Logger = require(\"@business/utils/linkLogger\")\n\n/**\n * Gates - Task execution condition controller\n * Replaces complex state machine logic with simple condition functions\n */\nclass Gates {\n constructor(gateDefinitions = {}) {\n this.logger = new Logger(\"Gates\")\n this.gates = new Map()\n this.stats = {\n evaluations: 0,\n passedEvaluations: 0,\n failedEvaluations: 0,\n }\n\n this.loadGates(gateDefinitions)\n }\n\n /**\n * Load gate definitions\n * @param {object} gateDefinitions - Gate function definitions\n */\n loadGates(gateDefinitions) {\n Object.entries(gateDefinitions).forEach(([gateName, gateFunction]) => {\n this.registerGate(gateName, gateFunction)\n })\n this.logger.info(`Loaded ${this.gates.size} gates`)\n }\n\n /**\n * Register a gate\n * @param {string} gateName - Gate name\n * @param {Function} gateFunction - Gate evaluation function\n */\n registerGate(gateName, gateFunction) {\n if (typeof gateFunction !== \"function\") {\n throw new TypeError(`Gate '${gateName}' must be a function`)\n }\n\n this.gates.set(gateName, gateFunction)\n this.logger.debug(`Registered gate: ${gateName}`)\n }\n\n /**\n * Evaluate a gate condition\n * @param {string} gateName - Gate name\n * @returns {boolean} Whether the gate condition is met\n */\n evaluate(gateName) {\n const gateFunction = this.gates.get(gateName)\n if (!gateFunction) {\n this.logger.warn(`Gate '${gateName}' not found, defaulting to false`)\n return false\n }\n\n try {\n this.stats.evaluations++\n const result = gateFunction()\n\n if (result) {\n this.stats.passedEvaluations++\n }\n else {\n this.stats.failedEvaluations++\n }\n\n this.logger.debug(`Gate '${gateName}' evaluated to: ${result}`)\n return result\n }\n catch (error) {\n this.stats.failedEvaluations++\n this.logger.error(`Error evaluating gate '${gateName}': ${error.message}`)\n return false\n }\n }\n\n /**\n * Check if a gate exists\n * @param {string} gateName - Gate name\n * @returns {boolean} Whether the gate exists\n */\n hasGate(gateName) {\n return this.gates.has(gateName)\n }\n\n /**\n * Get all gate names\n * @returns {Array<string>} Array of gate names\n */\n getGateNames() {\n return Array.from(this.gates.keys())\n }\n\n /**\n * Evaluate multiple gates\n * @param {Array<string>} gateNames - Array of gate names\n * @param {string} operator - Logical operator ('and' or 'or')\n * @returns {boolean} Combined evaluation result\n */\n evaluateMultiple(gateNames, operator = \"and\") {\n if (!Array.isArray(gateNames) || gateNames.length === 0) {\n return true\n }\n\n const results = gateNames.map(gateName => this.evaluate(gateName))\n\n if (operator === \"or\") {\n return results.some(result => result)\n }\n else {\n return results.every(result => result)\n }\n }\n\n /**\n * Get gate statistics\n * @returns {object} Statistics\n */\n getStats() {\n return {\n ...this.stats,\n registeredGates: this.gates.size,\n gateNames: this.getGateNames(),\n successRate: this.stats.evaluations > 0\n ? `${(this.stats.passedEvaluations / this.stats.evaluations * 100).toFixed(2)}%`\n : \"0%\",\n }\n }\n\n /**\n * Reset statistics\n */\n resetStats() {\n this.stats = {\n evaluations: 0,\n passedEvaluations: 0,\n failedEvaluations: 0,\n }\n this.logger.info(\"Gate statistics reset\")\n }\n}\n\nmodule.exports = Gates\n", "const Logger = require(\"@business/utils/linkLogger\")\nconst cron = require(\"node-cron\")\n\n/**\n * Task Scheduler\n * Manages cron-based task scheduling with gate condition checking\n */\nclass Scheduler {\n constructor(gates, logger) {\n this.logger = logger || new Logger(\"Scheduler\")\n this.gates = gates\n this.scheduledTasks = new Map()\n this.pausedTasks = new Map() // Track paused tasks by gate\n this.stats = {\n tasksScheduled: 0,\n tasksExecuted: 0,\n tasksSkipped: 0,\n tasksFailed: 0,\n tasksPaused: 0,\n tasksResumed: 0,\n }\n }\n\n /**\n * Schedule a cron task\n * @param {string} taskId - Task identifier\n * @param {object} task - Task definition\n * @returns {object} Task controller\n */\n schedule(taskId, task) {\n if (this.scheduledTasks.has(taskId)) {\n this.logger.warn(`Task '${taskId}' already scheduled, removing old schedule`)\n this.unschedule(taskId)\n }\n\n const cronTask = cron.schedule(task.schedule, async () => {\n await this.executeTask(taskId, task)\n }, {\n scheduled: false, // Don't start immediately\n timezone: \"UTC\",\n })\n\n const controller = {\n start: () => {\n cronTask.start()\n this.logger.info(`Started scheduled task: ${taskId}`)\n },\n stop: () => {\n cronTask.stop()\n this.logger.info(`Stopped scheduled task: ${taskId}`)\n },\n destroy: () => {\n cronTask.stop()\n this.scheduledTasks.delete(taskId)\n this.logger.info(`Destroyed scheduled task: ${taskId}`)\n },\n }\n\n this.scheduledTasks.set(taskId, {\n cronTask,\n controller,\n task,\n scheduledAt: new Date(),\n })\n\n this.stats.tasksScheduled++\n this.logger.info(`Scheduled task '${taskId}' with schedule: ${task.schedule}`)\n\n return controller\n }\n\n /**\n * Execute a task with gate checking and error handling\n * @param {string} taskId - Task identifier\n * @param {object} task - Task definition\n */\n async executeTask(taskId, task) {\n try {\n // Check if task is enabled\n if (!task.enabled) {\n this.stats.tasksSkipped++\n this.logger.debug(`Task '${taskId}' is disabled, skipping`)\n return\n }\n\n // Check gate condition\n if (!this.gates.evaluate(task.gate)) {\n this.stats.tasksSkipped++\n this.logger.debug(`Task '${taskId}' gate '${task.gate}' not satisfied, skipping`)\n return\n }\n\n this.logger.debug(`Executing task: ${taskId}`)\n const startTime = Date.now()\n\n // Execute with timeout\n const result = await this.executeWithTimeout(task.implementation, task.timeout)\n\n const duration = Date.now() - startTime\n this.stats.tasksExecuted++\n\n this.logger.debug(`Task '${taskId}' completed in ${duration}ms`)\n\n // Emit success event if needed\n this.emit(\"task_success\", {\n taskId,\n result,\n duration,\n })\n }\n catch (error) {\n this.stats.tasksFailed++\n this.logger.error(`Task '${taskId}' failed: ${error.message}`)\n\n // Emit error event if needed\n this.emit(\"task_error\", {\n taskId,\n error,\n })\n }\n }\n\n /**\n * Execute function with timeout\n * @param {Function} fn - Function to execute\n * @param {number} timeout - Timeout in milliseconds\n * @param {...any} args - Function arguments\n * @returns {Promise} Execution result\n */\n async executeWithTimeout(fn, timeout = 30000, ...args) {\n return new Promise((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n reject(new Error(`Task execution timed out after ${timeout}ms`))\n }, timeout)\n\n // Execute the function and handle the result\n Promise.resolve(fn(...args))\n .then((result) => {\n clearTimeout(timeoutId)\n resolve(result)\n })\n .catch((error) => {\n clearTimeout(timeoutId)\n reject(error)\n })\n })\n }\n\n /**\n * Unschedule a task\n * @param {string} taskId - Task identifier\n */\n unschedule(taskId) {\n const scheduledTask = this.scheduledTasks.get(taskId)\n if (scheduledTask) {\n scheduledTask.controller.destroy()\n this.logger.info(`Unscheduled task: ${taskId}`)\n }\n\n // Remove task from any paused tracking sets\n this.pausedTasks.forEach((pausedTasksSet, gateName) => {\n if (pausedTasksSet.delete(taskId) && pausedTasksSet.size === 0) {\n this.pausedTasks.delete(gateName)\n }\n })\n }\n\n /**\n * Start a scheduled task\n * @param {string} taskId - Task identifier\n */\n start(taskId) {\n const scheduledTask = this.scheduledTasks.get(taskId)\n if (scheduledTask) {\n scheduledTask.controller.start()\n }\n }\n\n /**\n * Stop a scheduled task\n * @param {string} taskId - Task identifier\n */\n stop(taskId) {\n const scheduledTask = this.scheduledTasks.get(taskId)\n if (scheduledTask) {\n scheduledTask.controller.stop()\n }\n }\n\n /**\n * Start all scheduled tasks\n */\n startAll() {\n this.scheduledTasks.forEach((scheduledTask) => {\n scheduledTask.controller.start()\n })\n this.logger.info(`Started ${this.scheduledTasks.size} scheduled tasks`)\n }\n\n /**\n * Stop all scheduled tasks\n */\n stopAll() {\n this.scheduledTasks.forEach((scheduledTask) => {\n scheduledTask.controller.stop()\n })\n this.logger.info(`Stopped ${this.scheduledTasks.size} scheduled tasks`)\n }\n\n /**\n * Get scheduled task info\n * @param {string} taskId - Task identifier\n * @returns {object|null} Task info or null\n */\n getTaskInfo(taskId) {\n const scheduledTask = this.scheduledTasks.get(taskId)\n if (!scheduledTask) {\n return null\n }\n\n return {\n taskId,\n schedule: scheduledTask.task.schedule,\n gate: scheduledTask.task.gate,\n enabled: scheduledTask.task.enabled,\n scheduledAt: scheduledTask.scheduledAt,\n }\n }\n\n /**\n * Get all scheduled tasks info\n * @returns {Array} Array of task info\n */\n getAllTasksInfo() {\n return Array.from(this.scheduledTasks.keys()).map(taskId => this.getTaskInfo(taskId))\n }\n\n /**\n * Get scheduler statistics\n * @returns {object} Statistics\n */\n getStats() {\n return {\n ...this.stats,\n scheduledTasks: this.scheduledTasks.size,\n successRate: this.stats.tasksExecuted > 0\n ? `${((this.stats.tasksExecuted / (this.stats.tasksExecuted + this.stats.tasksFailed)) * 100).toFixed(2)}%`\n : \"0%\",\n }\n }\n\n /**\n * Simple event emitter functionality\n */\n emit(event, data) {\n // This is a simplified implementation\n // In a real scenario, you might want to integrate with the EventBus\n this.logger.debug(`Scheduler event: ${event}`, data)\n }\n\n /**\n * Pause tasks by gate\n * @param {string} gateName - Gate name to pause tasks for\n */\n async pauseTasksByGate(gateName) {\n const tasksToPause = []\n\n this.scheduledTasks.forEach((scheduledTask, taskId) => {\n if (scheduledTask.task.gate === gateName) {\n tasksToPause.push({ taskId, scheduledTask })\n }\n })\n\n if (tasksToPause.length === 0) {\n this.logger.debug(`No tasks found with gate '${gateName}' to pause`)\n return\n }\n\n // Initialize paused tasks map for this gate if not exists\n if (!this.pausedTasks.has(gateName)) {\n this.pausedTasks.set(gateName, new Set())\n }\n\n const pausedTasksSet = this.pausedTasks.get(gateName)\n\n tasksToPause.forEach(({ taskId, scheduledTask }) => {\n try {\n scheduledTask.controller.stop()\n pausedTasksSet.add(taskId)\n this.stats.tasksPaused++\n this.logger.debug(`Paused task '${taskId}' (gate: ${gateName})`)\n }\n catch (error) {\n this.logger.error(`Error pausing task '${taskId}': ${error.message}`)\n }\n })\n\n this.logger.info(`Paused ${tasksToPause.length} tasks with gate '${gateName}'`)\n }\n\n /**\n * Resume tasks by gate\n * @param {string} gateName - Gate name to resume tasks for\n */\n async resumeTasksByGate(gateName) {\n const pausedTasksSet = this.pausedTasks.get(gateName)\n\n if (!pausedTasksSet || pausedTasksSet.size === 0) {\n this.logger.debug(`No paused tasks found with gate '${gateName}' to resume`)\n return\n }\n\n const tasksToResume = []\n pausedTasksSet.forEach((taskId) => {\n const scheduledTask = this.scheduledTasks.get(taskId)\n if (scheduledTask) {\n tasksToResume.push({ taskId, scheduledTask })\n }\n })\n\n tasksToResume.forEach(({ taskId, scheduledTask }) => {\n try {\n scheduledTask.controller.start()\n pausedTasksSet.delete(taskId)\n this.stats.tasksResumed++\n this.logger.debug(`Resumed task '${taskId}' (gate: ${gateName})`)\n }\n catch (error) {\n this.logger.error(`Error resuming task '${taskId}': ${error.message}`)\n }\n })\n\n // Clean up empty paused tasks set\n if (pausedTasksSet.size === 0) {\n this.pausedTasks.delete(gateName)\n }\n\n this.logger.info(`Resumed ${tasksToResume.length} tasks with gate '${gateName}'`)\n }\n\n /**\n * Get paused tasks by gate\n * @param {string} gateName - Gate name\n * @returns {Array} Array of paused task IDs\n */\n getPausedTasksByGate(gateName) {\n const pausedTasksSet = this.pausedTasks.get(gateName)\n return pausedTasksSet ? Array.from(pausedTasksSet) : []\n }\n\n /**\n * Check if a task is paused\n * @param {string} taskId - Task identifier\n * @returns {boolean} Whether the task is paused\n */\n isTaskPaused(taskId) {\n for (const pausedTasksSet of this.pausedTasks.values()) {\n if (pausedTasksSet.has(taskId)) {\n return true\n }\n }\n return false\n }\n\n /**\n * Clean up all scheduled tasks\n */\n cleanup() {\n this.logger.info(\"Cleaning up scheduler...\")\n\n const taskIds = Array.from(this.scheduledTasks.keys())\n taskIds.forEach((taskId) => {\n const scheduledTask = this.scheduledTasks.get(taskId)\n if (scheduledTask) {\n try {\n // Stop the task first\n scheduledTask.controller.stop()\n // node-cron tasks don't have destroy method, just stop is enough\n // Remove from map\n this.scheduledTasks.delete(taskId)\n this.logger.debug(`Cleaned up scheduled task: ${taskId}`)\n }\n catch (error) {\n this.logger.error(`Error cleaning up task ${taskId}: ${error.message}`)\n }\n }\n })\n\n // Clear paused tasks tracking\n this.pausedTasks.clear()\n\n this.logger.info(`Scheduler cleanup completed. Removed ${taskIds.length} scheduled tasks`)\n }\n}\n\nmodule.exports = Scheduler\n", "const EventEmitter = require(\"node:events\")\n// const Logger = require(\"@business/utils/linkLogger\")\nconst { sleep } = require(\"@business/utils/timeUtils\")\nconst { WALLET_STATE_CODE } = require(\"@constants/index\")\n\n/**\n * State Manager\n * Handles LND wallet state monitoring and triggers appropriate actions\n */\nclass StateManager extends EventEmitter {\n constructor(subscriptionManager, eventBus, logger) {\n super()\n this.logger = logger\n this.subscriptionManager = subscriptionManager\n this.eventBus = eventBus\n this.currentState = null\n this.isMonitoring = false\n this.stateSubscription = null\n this.recoveryInterval = null\n\n // Initialize linkCache\n this.linkCache = require(\"@business/utils/linkCache\")\n\n // Recovery statistics\n this.recoveryStats = {\n totalNodeStops: 0,\n totalRecoveries: 0,\n totalDowntimeSeconds: 0,\n averageRecoveryAttempts: 0,\n longestDowntimeSeconds: 0,\n shortestDowntimeSeconds: Infinity,\n lastNodeStopTime: null,\n lastRecoveryTime: null,\n recoveryHistory: [],\n }\n\n // RGB state management\n this.currentRgbState = null\n this.rgbStatePollingInterval = null\n this.rgbPollingIntervalMs = 10000 // 10 seconds\n\n // Connection recovery management\n this.recoveryInterval = null\n this.recoveryCheckIntervalMs = 10000 // 10 seconds\n this.isInRecoveryMode = false\n\n // Retry timer tracking\n this.lndRetryTimeout = null\n this.subscriptionRetryTimeout = null\n }\n\n /**\n * Start state monitoring\n */\n async startStateMonitoring() {\n if (this.isMonitoring) {\n this.logger.warn(\"State monitoring already active\")\n return\n }\n\n this.isMonitoring = true\n\n // Always start RGB state polling first (independent of LND)\n this.startRgbStatePolling()\n\n // Try to start LND state monitoring with retry mechanism\n this.startLndStateMonitoring()\n\n this.logger.info(\"State monitoring started\")\n this.emit(\"monitoring_started\")\n }\n\n /**\n * Start LND state monitoring with retry mechanism\n */\n async startLndStateMonitoring() {\n const retryInterval = 5000 // 5 seconds\n let retryCount = 0\n\n const tryStartLndMonitoring = async () => {\n if (!this.isMonitoring) {\n this.logger.debug(\"Skipping LND state monitoring attempt because monitoring stopped\")\n return false\n }\n try {\n const { getWalletService } = require(\"@business/common/index\")\n const { walletStateService } = await getWalletService()\n this.walletStateService = walletStateService\n\n // Create state subscription\n this.stateSubscription = this.walletStateService.subscribeState()\n\n this.stateSubscription.on(\"data\", async (state) => {\n await this.handleStateChange(state)\n })\n\n this.stateSubscription.on(\"error\", (error) => {\n this.handleStateError(error)\n })\n\n this.logger.info(\"LND state monitoring started successfully\")\n return true\n }\n catch (error) {\n retryCount++\n\n if (error.message.includes(\"Wallet is not initialized yet\")\n || error.message.includes(\"connection\")\n || error.message.includes(\"UNAVAILABLE\")\n || error.message.includes(\"ECONNREFUSED\")\n ) {\n this.logger.warn(`LND not ready yet (attempt ${retryCount}): ${error.message}`)\n\n if (this.isMonitoring) {\n this.clearLndRetryTimeout()\n this.lndRetryTimeout = setTimeout(() => {\n this.lndRetryTimeout = null\n tryStartLndMonitoring()\n }, retryInterval)\n }\n }\n if (error.message.includes(\"Wallet is not initialized yet\")) {\n this.logger.info(`Failed to start LND state monitoring after ${retryCount} attempts: ${error.message}`)\n }\n else {\n this.logger.error(`Failed to start LND state monitoring after ${retryCount} attempts: ${error.message}`)\n }\n\n this.emit(\"lnd_monitoring_error\", error)\n return false\n }\n }\n\n // Start the retry process\n this.clearLndRetryTimeout()\n await tryStartLndMonitoring()\n }\n\n /**\n * Handle state changes\n */\n async handleStateChange(state) {\n const previousState = this.currentState\n this.currentState = state.state\n\n this.logger.info(`State changed from ${previousState} to ${state.state}`)\n\n // Update cache for gates\n const linkCache = require(\"@business/utils/linkCache\")\n linkCache.set(\"walletState\", state.state)\n\n // Emit state change event\n this.emit(\"state_changed\", state)\n\n // Handle specific state transitions\n if (state.state === WALLET_STATE_CODE.SERVER_ACTIVE) {\n await this.handleServerActive()\n }\n else {\n await this.handleServerInactive()\n }\n }\n\n /**\n * Handle server active state\n */\n async handleServerActive() {\n try {\n this.logger.info(\"Server became active, starting subscriptions and services\")\n\n // Add delay to allow LND services to fully initialize\n await sleep(5 * 1000)\n\n // Trigger macaroon baking first and wait for completion\n await this.triggerMacaroonBaking()\n\n // Wait additional time for macaroon to be available\n await sleep(3 * 1000)\n\n // Try to start LND subscriptions with retry\n await this.startSubscriptionsWithRetry()\n\n // Set up subscription event handlers\n this.setupSubscriptionHandlers()\n\n this.logger.info(\"Server active state handling completed\")\n }\n catch (error) {\n this.logger.error(`Error handling server active state: ${error.message}`)\n this.emit(\"state_error\", error)\n }\n }\n\n /**\n * Trigger macaroon baking and wait for completion\n */\n async triggerMacaroonBaking() {\n const fs = require(\"node:fs\")\n const { getConfigFilePath } = require(\"@business/utils/path\")\n\n this.logger.info(\"Triggering macaroon baking...\")\n this.eventBus.emit(\"bakeTapdMacaroon\")\n\n // Poll for macaroon file existence\n const { taprootMacaroonPath } = getConfigFilePath()\n const maxWaitTime = 30000 // 30 seconds\n const pollInterval = 1000 // 1 second\n const startTime = Date.now()\n\n while (Date.now() - startTime < maxWaitTime) {\n if (fs.existsSync(taprootMacaroonPath)) {\n this.logger.info(\"Macaroon file detected, baking completed successfully\")\n return\n }\n\n // Wait before next check\n await new Promise(resolve => setTimeout(resolve, pollInterval))\n }\n\n this.logger.warn(\"Macaroon baking timeout - proceeding anyway\")\n }\n\n /**\n * Start subscriptions with retry mechanism\n */\n async startSubscriptionsWithRetry() {\n const maxRetries = 5\n const retryInterval = 2000 // 2 seconds\n let retryCount = 0\n\n const tryStartSubscriptions = async () => {\n if (!this.isMonitoring) {\n this.logger.debug(\"Skipping subscription retry because monitoring stopped\")\n return false\n }\n try {\n await this.subscriptionManager.startSubscriptions()\n this.logger.info(\"LND subscriptions started successfully\")\n this.clearSubscriptionRetryTimeout()\n return true\n }\n catch (error) {\n retryCount++\n\n if (error.message.includes(\"not available\") && retryCount <= maxRetries) {\n this.logger.warn(`LND services not ready yet (attempt ${retryCount}/${maxRetries}): ${error.message}`)\n\n if (retryCount <= maxRetries) {\n if (this.isMonitoring) {\n this.clearSubscriptionRetryTimeout()\n this.subscriptionRetryTimeout = setTimeout(() => {\n this.subscriptionRetryTimeout = null\n tryStartSubscriptions()\n }, retryInterval)\n }\n return false\n }\n }\n\n this.logger.error(`Failed to start subscriptions after ${maxRetries} attempts: ${error.message}`)\n return false\n }\n }\n\n await tryStartSubscriptions()\n }\n\n /**\n * Handle server inactive state\n */\n async handleServerInactive() {\n this.logger.info(\"Server became inactive, stopping subscriptions\")\n\n this.clearSubscriptionRetryTimeout()\n\n // Stop subscriptions\n await this.subscriptionManager.stopSubscriptions()\n\n // Clear subscription handlers\n this.clearSubscriptionHandlers()\n }\n\n /**\n * Set up subscription event handlers\n */\n setupSubscriptionHandlers() {\n // Always clear previous handlers to avoid duplicate listeners when\n // handleServerActive is triggered multiple times without a full teardown.\n this.clearSubscriptionHandlers()\n\n // Invoice handlers\n this.subscriptionManager.on(\"invoice_update\", (invoice) => {\n this.handleInvoiceUpdate(invoice)\n })\n\n this.subscriptionManager.on(\"payment_update\", (payment) => {\n this.handlePaymentUpdate(payment)\n })\n\n // Taproot handlers\n this.subscriptionManager.on(\"taproot_receive_event\", (receiveEvent) => {\n this.handleTaprootReceiveEvent(receiveEvent)\n })\n\n this.subscriptionManager.on(\"taproot_send_event\", (sendEvent) => {\n this.handleTaprootSendEvent(sendEvent)\n })\n\n // Error handlers\n this.subscriptionManager.on(\"invoice_error\", (error) => {\n this.logger.error(`Invoice subscription error: ${error.message}`)\n this.emit(\"subscription_error\", { type: \"invoice\", error })\n })\n\n this.subscriptionManager.on(\"payment_error\", (error) => {\n this.logger.error(`Payment subscription error: ${error.message}`)\n this.emit(\"subscription_error\", { type: \"payment\", error })\n })\n\n this.subscriptionManager.on(\"taproot_receive_error\", (error) => {\n this.logger.error(`Taproot receive error: ${error.message}`)\n this.emit(\"subscription_error\", { type: \"taproot_receive\", error })\n })\n\n this.subscriptionManager.on(\"taproot_send_error\", (error) => {\n this.logger.error(`Taproot send error: ${error.message}`)\n this.emit(\"subscription_error\", { type: \"taproot_send\", error })\n })\n }\n\n /**\n * Clear subscription handlers\n */\n clearSubscriptionHandlers() {\n this.subscriptionManager.removeAllListeners(\"invoice_update\")\n this.subscriptionManager.removeAllListeners(\"payment_update\")\n this.subscriptionManager.removeAllListeners(\"taproot_receive_event\")\n this.subscriptionManager.removeAllListeners(\"taproot_send_event\")\n this.subscriptionManager.removeAllListeners(\"invoice_error\")\n this.subscriptionManager.removeAllListeners(\"payment_error\")\n this.subscriptionManager.removeAllListeners(\"taproot_receive_error\")\n this.subscriptionManager.removeAllListeners(\"taproot_send_error\")\n }\n\n /**\n * Handle invoice updates\n */\n handleInvoiceUpdate(invoice) {\n try {\n // Import and use existing invoice change handler\n const invoiceChange = require(\"../../job/lnd/invoiceChange\")\n invoiceChange(invoice)\n }\n catch (error) {\n this.logger.error(`Error handling invoice update: ${error.message}`)\n }\n }\n\n /**\n * Handle payment updates\n */\n handlePaymentUpdate(payment) {\n try {\n // Import and use existing payment change handler\n const paymentChange = require(\"../../job/lnd/paymentChange\")\n paymentChange(payment)\n }\n catch (error) {\n this.logger.error(`Error handling payment update: ${error.message}`)\n }\n }\n\n /**\n * Handle Taproot receive events\n */\n async handleTaprootReceiveEvent(receiveEvent) {\n try {\n const { handleTaprootReceiveEvent } = require(\"../../job/tapd/taprootOnchainTransChange\")\n await handleTaprootReceiveEvent(receiveEvent)\n }\n catch (error) {\n this.logger.error(`Error handling Taproot receive event: ${error.message}`)\n }\n }\n\n /**\n * Handle Taproot send events\n */\n async handleTaprootSendEvent(sendEvent) {\n try {\n const { handleTaprootSendEvent } = require(\"../../job/tapd/taprootOnchainTransChange\")\n await handleTaprootSendEvent(sendEvent)\n }\n catch (error) {\n this.logger.error(`Error handling Taproot send event: ${error.message}`)\n }\n }\n\n /**\n * Handle state errors\n */\n async handleStateError(error) {\n // Check if this is a node stopped error\n if (this.isNodeStoppedError(error)) {\n await this.handleNodeStopped(error)\n }\n else if (this.isConnectionError(error)) {\n this.handleConnectionError(error)\n }\n else {\n this.logger.error(`State monitoring error: ${error.message}`)\n this.emit(\"state_error\", error)\n }\n }\n\n /**\n * Check if error indicates node has stopped\n */\n isNodeStoppedError(error) {\n const nodeStoppedIndicators = [\n \"UNAVAILABLE\",\n \"ECONNREFUSED\",\n \"connection closed\",\n \"socket hang up\",\n \"ENOTFOUND\",\n \"network is unreachable\",\n ]\n\n return nodeStoppedIndicators.some(indicator =>\n error.message.includes(indicator),\n )\n }\n\n /**\n * Check if error is a connection issue during startup\n */\n isConnectionError(error) {\n return error.message.includes(\"Wallet is not initialized yet\")\n || error.message.includes(\"connection\")\n || error.message.includes(\"timeout\")\n }\n\n /**\n * Get error type for logging and debugging\n * @param {Error} error - The error object\n * @returns {string} Error type classification\n */\n getErrorType(error) {\n if (!error)\n return \"UNKNOWN\"\n\n const message = error.message || \"\"\n const code = error.code || \"\"\n\n // Network/Connection errors\n if (message.includes(\"UNAVAILABLE\") || code === 14)\n return \"CONNECTION_UNAVAILABLE\"\n if (message.includes(\"ECONNREFUSED\") || message.includes(\"connection refused\"))\n return \"CONNECTION_REFUSED\"\n if (message.includes(\"ENOTFOUND\") || message.includes(\"not found\"))\n return \"DNS_ERROR\"\n if (message.includes(\"timeout\") || message.includes(\"TIMEOUT\"))\n return \"TIMEOUT\"\n if (message.includes(\"socket hang up\"))\n return \"SOCKET_HANGUP\"\n if (message.includes(\"network is unreachable\"))\n return \"NETWORK_UNREACHABLE\"\n if (message.includes(\"connection closed\"))\n return \"CONNECTION_CLOSED\"\n\n // gRPC specific errors\n if (message.includes(\"shutting down\") || message.includes(\"server shutting down\"))\n return \"SERVER_SHUTDOWN\"\n if (message.includes(\"Cancelled\") || code === 1)\n return \"GRPC_CANCELLED\"\n if (message.includes(\"DeadlineExceeded\") || code === 4)\n return \"GRPC_DEADLINE_EXCEEDED\"\n if (message.includes(\"NotFound\") || code === 5)\n return \"GRPC_NOT_FOUND\"\n if (message.includes(\"PermissionDenied\") || code === 7)\n return \"GRPC_PERMISSION_DENIED\"\n if (message.includes(\"Unauthenticated\") || code === 16)\n return \"GRPC_UNAUTHENTICATED\"\n\n // LND specific errors\n if (message.includes(\"Wallet is not initialized\"))\n return \"WALLET_NOT_INITIALIZED\"\n if (message.includes(\"not available\"))\n return \"SERVICE_NOT_AVAILABLE\"\n if (message.includes(\"macaroon\"))\n return \"MACAROON_ERROR\"\n\n // Generic error types\n if (code)\n return `GRPC_CODE_${code}`\n\n return \"UNKNOWN\"\n }\n\n /**\n * Get current wallet state from LND\n * @returns {Promise<number>} Wallet state code\n */\n async getWalletState() {\n try {\n const { getWalletState } = require(\"@business/common/index\")\n return await getWalletState()\n }\n catch (error) {\n this.logger.debug(`Failed to get wallet state: ${error.message}`)\n const { WALLET_STATE_CODE } = require(\"@constants/index\")\n return WALLET_STATE_CODE.WAITING_TO_START\n }\n }\n\n /**\n * Handle node stopped event - clean up resources and start recovery monitoring\n * @param {Error} error - The error that triggered node stopped detection\n */\n async handleNodeStopped(error) {\n const timestamp = new Date().toISOString()\n const previousState = this.linkCache.get(\"walletState\")\n\n // Update recovery statistics\n this.recoveryStats.totalNodeStops++\n this.recoveryStats.lastNodeStopTime = timestamp\n\n this.logger.warn(`\uD83D\uDD34 NODE STOPPED DETECTED (#${this.recoveryStats.totalNodeStops})`)\n this.logger.warn(`\u251C\u2500 Error: ${error.message}`)\n this.logger.warn(`\u251C\u2500 Error Code: ${error.code || \"N/A\"}`)\n this.logger.warn(`\u251C\u2500 Error Type: ${this.getErrorType(error)}`)\n this.logger.warn(`\u251C\u2500 Previous State: ${previousState}`)\n this.logger.warn(`\u2514\u2500 Timestamp: ${timestamp}`)\n\n try {\n // Force update wallet state to indicate node is not active\n const { WALLET_STATE_CODE } = require(\"@constants/index\")\n this.linkCache.set(\"walletState\", WALLET_STATE_CODE.WAITING_TO_START)\n this.logger.info(\"\uD83D\uDCDD Updated walletState cache to WAITING_TO_START\")\n\n // Trigger server inactive handling to clean up subscriptions and tasks\n this.logger.info(\"\uD83E\uDDF9 Starting resource cleanup...\")\n await this.handleServerInactive()\n this.logger.info(\"\u2705 Resource cleanup completed\")\n\n // Start connection recovery monitoring\n this.logger.info(\"\uD83D\uDD04 Starting connection recovery monitoring...\")\n this.startConnectionRecoveryCheck()\n\n // Emit node stopped event for JobManager coordination\n this.emit(\"node_stopped\", {\n error,\n previousState,\n timestamp,\n errorCode: error.code,\n errorType: this.getErrorType(error),\n nodeStopCount: this.recoveryStats.totalNodeStops,\n })\n\n this.logger.info(\"\u2705 Node stopped handling completed successfully\")\n }\n catch (handlingError) {\n this.logger.error(`\u274C Error during node stopped handling: ${handlingError.message}`)\n this.logger.error(`Stack trace: ${handlingError.stack}`)\n this.emit(\"node_stopped_error\", handlingError)\n }\n }\n\n /**\n * Handle node stopped scenario\n */\n handleConnectionError(error) {\n this.logger.warn(`State monitoring connection issue: ${error.message}`)\n this.emit(\"connection_error\", error)\n }\n\n /**\n * Start connection recovery monitoring\n */\n startConnectionRecoveryCheck() {\n if (this.recoveryInterval) {\n this.logger.warn(\"Connection recovery check already active\")\n return\n }\n\n const startTime = new Date()\n let attemptCount = 0\n\n this.logger.info(\"\uD83D\uDD04 Starting connection recovery monitoring...\")\n this.logger.info(`\u251C\u2500 Check interval: 10 seconds`)\n this.logger.info(`\u2514\u2500 Started at: ${startTime.toISOString()}`)\n\n this.recoveryInterval = setInterval(async () => {\n attemptCount++\n const currentTime = new Date()\n const elapsedMinutes = Math.floor((currentTime - startTime) / 60000)\n\n this.logger.debug(`\uD83D\uDD0D Recovery attempt #${attemptCount} (${elapsedMinutes}m elapsed)`)\n\n try {\n // Try to get wallet state to check if node is back online\n const walletState = await this.getWalletState()\n const { WALLET_STATE_CODE } = require(\"@constants/index\")\n\n if (walletState && walletState !== WALLET_STATE_CODE.WAITING_TO_START) {\n const recoveryTime = new Date()\n const totalRecoveryTime = Math.floor((recoveryTime - startTime) / 1000)\n\n this.logger.info(`\uD83D\uDFE2 NODE RECOVERED!`)\n this.logger.info(`\u251C\u2500 Wallet state: ${walletState}`)\n this.logger.info(`\u251C\u2500 Recovery attempts: ${attemptCount}`)\n this.logger.info(`\u251C\u2500 Total downtime: ${totalRecoveryTime}s`)\n this.logger.info(`\u2514\u2500 Recovered at: ${recoveryTime.toISOString()}`)\n\n // Stop recovery monitoring\n this.stopConnectionRecoveryCheck()\n\n // Restart state monitoring and subscriptions\n await this.handleNodeRecovered(walletState, {\n attemptCount,\n downtimeSeconds: totalRecoveryTime,\n startTime: startTime.toISOString(),\n recoveryTime: recoveryTime.toISOString(),\n })\n }\n }\n catch (error) {\n // Still not recovered, continue monitoring\n this.logger.debug(`\u274C Recovery attempt #${attemptCount} failed: ${error.message}`)\n\n // Log periodic status updates\n if (attemptCount % 6 === 0) { // Every minute (6 attempts * 10s)\n this.logger.info(`\u23F3 Still recovering... ${attemptCount} attempts, ${elapsedMinutes}m elapsed`)\n }\n }\n }, 10000) // Check every 10 seconds\n }\n\n /**\n * Stop connection recovery monitoring\n */\n stopConnectionRecoveryCheck() {\n if (this.recoveryInterval) {\n clearInterval(this.recoveryInterval)\n this.recoveryInterval = null\n this.logger.info(\"Connection recovery monitoring stopped\")\n }\n }\n\n /**\n * Handle node recovery with detailed logging and statistics\n * @param {string} walletState - The recovered wallet state\n * @param {object} recoveryStats - Recovery statistics\n */\n async handleNodeRecovered(walletState, recoveryStats = {}) {\n const timestamp = new Date().toISOString()\n const downtimeSeconds = recoveryStats.downtimeSeconds || 0\n const attemptCount = recoveryStats.attemptCount || 0\n\n // Update recovery statistics\n this.recoveryStats.totalRecoveries++\n this.recoveryStats.lastRecoveryTime = timestamp\n this.recoveryStats.totalDowntimeSeconds += downtimeSeconds\n\n // Update downtime records\n if (downtimeSeconds > 0) {\n if (downtimeSeconds > this.recoveryStats.longestDowntimeSeconds) {\n this.recoveryStats.longestDowntimeSeconds = downtimeSeconds\n }\n if (downtimeSeconds < this.recoveryStats.shortestDowntimeSeconds) {\n this.recoveryStats.shortestDowntimeSeconds = downtimeSeconds\n }\n }\n\n // Update average recovery attempts\n if (this.recoveryStats.totalRecoveries > 0) {\n this.recoveryStats.averageRecoveryAttempts\n = (this.recoveryStats.averageRecoveryAttempts * (this.recoveryStats.totalRecoveries - 1) + attemptCount)\n / this.recoveryStats.totalRecoveries\n }\n\n // Add to recovery history (keep last 10 recoveries)\n this.recoveryStats.recoveryHistory.push({\n timestamp,\n walletState,\n attemptCount,\n downtimeSeconds,\n errorType: recoveryStats.errorType,\n })\n if (this.recoveryStats.recoveryHistory.length > 10) {\n this.recoveryStats.recoveryHistory.shift()\n }\n\n this.logger.info(\"\uD83D\uDFE2 NODE RECOVERY PROCESS STARTING\")\n this.logger.info(`\u251C\u2500 Recovery #${this.recoveryStats.totalRecoveries}`)\n this.logger.info(`\u251C\u2500 Recovered state: ${walletState}`)\n this.logger.info(`\u251C\u2500 Recovery attempts: ${attemptCount}`)\n this.logger.info(`\u251C\u2500 Downtime: ${downtimeSeconds}s`)\n this.logger.info(`\u251C\u2500 Avg recovery attempts: ${this.recoveryStats.averageRecoveryAttempts.toFixed(1)}`)\n this.logger.info(`\u2514\u2500 Recovery timestamp: ${timestamp}`)\n\n try {\n // Stop recovery monitoring\n this.stopConnectionRecoveryCheck()\n this.logger.info(\"\u2705 Recovery monitoring stopped\")\n\n // Update state cache\n this.linkCache.set(\"walletState\", walletState)\n this.logger.info(`\uD83D\uDCDD Updated walletState cache to: ${walletState}`)\n\n // Restart LND state monitoring\n this.logger.info(\"\uD83D\uDD04 Restarting LND state monitoring...\")\n await this.startLndStateMonitoring()\n this.logger.info(\"\u2705 LND state monitoring restarted\")\n\n // Emit recovery event for JobManager with detailed stats\n this.emit(\"node_recovered\", {\n timestamp,\n walletState,\n recoveryStats: {\n attemptCount,\n downtimeSeconds,\n startTime: recoveryStats.startTime,\n recoveryTime: recoveryStats.recoveryTime || timestamp,\n totalRecoveries: this.recoveryStats.totalRecoveries,\n averageRecoveryAttempts: this.recoveryStats.averageRecoveryAttempts,\n },\n })\n\n this.logger.info(\"\uD83C\uDF89 NODE RECOVERY COMPLETED SUCCESSFULLY\")\n this.logger.info(`\u2514\u2500 System is now fully operational`)\n }\n catch (error) {\n this.logger.error(`\u274C ERROR DURING NODE RECOVERY: ${error.message}`)\n this.logger.error(`Stack trace: ${error.stack}`)\n\n // Restart recovery monitoring if recovery failed\n this.logger.warn(\"\uD83D\uDD04 Restarting recovery monitoring due to error...\")\n this.startConnectionRecoveryCheck()\n\n this.emit(\"node_recovery_error\", {\n error,\n timestamp,\n recoveryStats,\n })\n }\n }\n\n /**\n * Get recovery statistics for monitoring\n * @returns {object} Recovery statistics\n */\n getRecoveryStats() {\n const avgDowntime = this.recoveryStats.totalRecoveries > 0\n ? this.recoveryStats.totalDowntimeSeconds / this.recoveryStats.totalRecoveries\n : 0\n\n return {\n ...this.recoveryStats,\n averageDowntimeSeconds: avgDowntime,\n shortestDowntimeSeconds: this.recoveryStats.shortestDowntimeSeconds === Infinity\n ? 0\n : this.recoveryStats.shortestDowntimeSeconds,\n uptime: {\n totalNodeStops: this.recoveryStats.totalNodeStops,\n totalRecoveries: this.recoveryStats.totalRecoveries,\n successRate: this.recoveryStats.totalNodeStops > 0\n ? `${(this.recoveryStats.totalRecoveries / this.recoveryStats.totalNodeStops * 100).toFixed(2)}%`\n : \"100%\",\n },\n }\n }\n\n /**\n * Reset recovery statistics\n */\n resetRecoveryStats() {\n this.logger.info(\"\uD83D\uDD04 Resetting recovery statistics...\")\n this.recoveryStats = {\n totalNodeStops: 0,\n totalRecoveries: 0,\n totalDowntimeSeconds: 0,\n averageRecoveryAttempts: 0,\n longestDowntimeSeconds: 0,\n shortestDowntimeSeconds: Infinity,\n lastNodeStopTime: null,\n lastRecoveryTime: null,\n recoveryHistory: [],\n }\n this.logger.info(\"\u2705 Recovery statistics reset completed\")\n }\n\n /**\n * Stop state monitoring\n */\n async stopStateMonitoring() {\n if (!this.isMonitoring) {\n return\n }\n\n try {\n // Stop state subscription\n if (this.stateSubscription) {\n this.stateSubscription.destroy()\n this.stateSubscription = null\n }\n\n // Stop RGB state polling\n this.stopRgbStatePolling()\n\n // Stop connection recovery if active\n this.stopConnectionRecoveryCheck()\n\n // Clear retry timers\n this.clearRetryTimeouts()\n\n this.isMonitoring = false\n this.logger.info(\"State monitoring stopped\")\n this.emit(\"monitoring_stopped\")\n }\n catch (error) {\n this.logger.error(`Error stopping state monitoring: ${error.message}`)\n throw error\n }\n }\n\n /**\n * Start RGB state polling\n */\n startRgbStatePolling() {\n if (this.rgbStatePollingInterval) {\n this.logger.warn(\"RGB state polling already active\")\n return\n }\n\n this.logger.info(`Starting RGB state polling (interval: ${this.rgbPollingIntervalMs}ms)`)\n\n // Initial check\n this.checkRgbState()\n\n // Set up polling interval\n this.rgbStatePollingInterval = setInterval(() => {\n this.checkRgbState()\n }, this.rgbPollingIntervalMs)\n }\n\n /**\n * Stop RGB state polling\n */\n stopRgbStatePolling() {\n if (this.rgbStatePollingInterval) {\n clearInterval(this.rgbStatePollingInterval)\n this.rgbStatePollingInterval = null\n this.logger.info(\"RGB state polling stopped\")\n }\n }\n\n clearLndRetryTimeout() {\n if (this.lndRetryTimeout) {\n clearTimeout(this.lndRetryTimeout)\n this.lndRetryTimeout = null\n }\n }\n\n clearSubscriptionRetryTimeout() {\n if (this.subscriptionRetryTimeout) {\n clearTimeout(this.subscriptionRetryTimeout)\n this.subscriptionRetryTimeout = null\n }\n }\n\n clearRetryTimeouts() {\n this.clearLndRetryTimeout()\n this.clearSubscriptionRetryTimeout()\n }\n\n /**\n * Check RGB state\n */\n async checkRgbState() {\n try {\n const { getNodeState } = require(\"@business/service/rgb/index\")\n const rgbState = await getNodeState()\n\n if (rgbState.state !== this.currentRgbState) {\n await this.handleRgbStateChange(rgbState)\n }\n }\n catch (error) {\n this.logger.error(`Error checking RGB state: ${error.message}`)\n }\n }\n\n /**\n * Handle RGB state changes\n */\n async handleRgbStateChange(rgbState) {\n const previousState = this.currentRgbState\n this.currentRgbState = rgbState.state\n\n this.logger.info(`RGB state changed from ${previousState} to ${rgbState.state}`)\n\n // Update cache\n const linkCache = require(\"@business/utils/linkCache\")\n linkCache.set(\"rgbState\", rgbState.state)\n\n // Emit state change event\n this.emit(\"rgb_state_changed\", rgbState)\n\n // Handle specific state transitions\n if (rgbState.state === 4) { // Running state\n await this.handleRgbActive()\n }\n else {\n await this.handleRgbInactive()\n }\n }\n\n /**\n * Handle RGB active state\n */\n async handleRgbActive() {\n this.logger.info(\"RGB became active\")\n // RGB specific activation logic can be added here\n }\n\n /**\n * Handle RGB inactive state\n */\n async handleRgbInactive() {\n this.logger.info(\"RGB became inactive\")\n // RGB specific deactivation logic can be added here\n }\n\n /**\n * Get state manager status\n * @returns {object} Status information\n */\n getStatus() {\n return {\n isMonitoring: this.isMonitoring,\n currentState: this.currentState,\n hasStateSubscription: !!this.stateSubscription,\n invoicePollingActive: !!this.invoicePollingInterval,\n subscriptionManager: this.subscriptionManager?.getStatus() || null,\n // RGB state info\n currentRgbState: this.currentRgbState,\n rgbPollingActive: !!this.rgbStatePollingInterval,\n rgbPollingInterval: this.rgbPollingIntervalMs,\n }\n }\n\n /**\n * Cleanup\n */\n cleanup() {\n this.logger.info(\"Cleaning up state manager...\")\n this.stopStateMonitoring()\n this.clearRetryTimeouts()\n this.removeAllListeners()\n this.logger.info(\"State manager cleanup completed\")\n }\n}\n\nmodule.exports = StateManager\n", "const EventEmitter = require(\"node:events\")\nconst Logger = require(\"@business/utils/linkLogger\")\n\n/**\n * Subscription Manager\n * Handles LND subscriptions (invoice, payment, taproot) with simplified logic\n */\nclass SubscriptionManager extends EventEmitter {\n constructor(gates, logger) {\n super()\n this.logger = logger || new Logger(\"SubscriptionManager\")\n this.gates = gates\n this.subscriptions = new Map()\n this.pausedSubscriptions = new Map() // Track paused subscriptions by gate\n this.services = {\n lightning: null,\n router: null,\n taproot: null,\n }\n this.isActive = false\n this.stats = {\n subscriptionsStarted: 0,\n subscriptionsStopped: 0,\n subscriptionsPaused: 0,\n subscriptionsResumed: 0,\n subscriptionErrors: 0,\n }\n }\n\n /**\n * Initialize services when LND becomes active\n */\n async initializeServices() {\n try {\n const {\n getLightningService,\n getRouterService,\n getTprService,\n } = require(\"@business/common/index\")\n\n // Check if services are available before initializing\n const lightning = getLightningService()\n const router = getRouterService()\n const taproot = getTprService()\n\n if (!lightning || !router || !taproot) {\n throw new Error(\"One or more LND services are not available\")\n }\n\n this.services.lightning = lightning\n this.services.router = router\n this.services.taproot = taproot\n\n this.logger.info(\"LND services initialized successfully\")\n }\n catch (error) {\n this.logger.error(`Failed to initialize LND services: ${error.message}`)\n throw error\n }\n }\n\n /**\n * Start all LND subscriptions\n */\n async startSubscriptions() {\n if (!this.gates.evaluate(\"lndActive\")) {\n this.logger.warn(\"LND not active, cannot start subscriptions\")\n return\n }\n\n if (this.isActive) {\n this.logger.warn(\"Subscriptions already active\")\n return\n }\n\n try {\n await this.initializeServices()\n\n // Start individual subscriptions\n await this.startInvoiceSubscription()\n await this.startPaymentSubscription()\n await this.startTaprootSubscriptions()\n\n this.isActive = true\n this.stats.subscriptionsStarted += this.subscriptions.size\n this.logger.info(\"All LND subscriptions started\")\n this.emit(\"subscriptions_started\")\n }\n catch (error) {\n this.logger.error(`Failed to start subscriptions: ${error.message}`)\n this.emit(\"subscriptions_error\", error)\n throw error\n }\n }\n\n /**\n * Stop all subscriptions\n */\n async stopSubscriptions() {\n if (!this.isActive) {\n return\n }\n\n this.logger.info(\"Stopping all LND subscriptions...\")\n\n // Stop all subscriptions\n const subscriptionNames = Array.from(this.subscriptions.keys())\n subscriptionNames.forEach(name => this.cancelSubscription(name))\n\n this.isActive = false\n this.stats.subscriptionsStopped += subscriptionNames.length\n this.logger.info(\"All LND subscriptions stopped\")\n this.emit(\"subscriptions_stopped\")\n }\n\n /**\n * Start invoice subscription\n */\n async startInvoiceSubscription() {\n if (!this.services.lightning) {\n throw new Error(\"Lightning service not available\")\n }\n\n const subscription = this.services.lightning.subscribeInvoices({\n add_index: 0,\n settle_index: 0,\n })\n\n subscription.on(\"data\", (invoice) => {\n this.logger.info(`Invoice update: add_index=${invoice.add_index}, state=${invoice.state}`)\n this.emit(\"invoice_update\", invoice)\n })\n\n subscription.on(\"error\", (error) => {\n this.stats.subscriptionErrors++\n this.logger.error(`Invoice subscription error: ${error.message}`)\n this.emit(\"invoice_error\", error)\n })\n\n subscription.on(\"end\", () => {\n this.logger.warn(\"Invoice subscription ended\")\n this.emit(\"invoice_ended\")\n })\n\n this.subscriptions.set(\"invoice\", subscription)\n this.logger.info(\"Invoice subscription started\")\n }\n\n /**\n * Start payment subscription\n */\n async startPaymentSubscription() {\n if (!this.services.router) {\n throw new Error(\"Router service not available\")\n }\n\n const subscription = this.services.router.trackPayments({\n no_inflight_updates: false,\n })\n\n subscription.on(\"data\", (payment) => {\n this.logger.debug(`Payment update: ${payment.payment_hash}`)\n this.emit(\"payment_update\", payment)\n })\n\n subscription.on(\"error\", (error) => {\n this.stats.subscriptionErrors++\n this.logger.error(`Payment subscription error: ${error.message}`)\n this.emit(\"payment_error\", error)\n })\n\n this.subscriptions.set(\"payment\", subscription)\n this.logger.info(\"Payment subscription started\")\n }\n\n /**\n * Start Taproot Asset subscriptions\n */\n async startTaprootSubscriptions() {\n if (!this.services.taproot) {\n throw new Error(\"Taproot service not available\")\n }\n\n // Receive events subscription\n const receiveSubscription = this.services.taproot.subscribeReceiveEvents({})\n\n receiveSubscription.on(\"data\", (receiveEvent) => {\n this.logger.debug(\"Taproot receive event received\")\n this.emit(\"taproot_receive_event\", receiveEvent)\n })\n\n receiveSubscription.on(\"error\", (error) => {\n this.logger.error(`Taproot receive subscription error: ${error.message}`)\n this.emit(\"taproot_receive_error\", error)\n })\n\n this.subscriptions.set(\"taproot_receive\", receiveSubscription)\n\n // Send events subscription\n const sendSubscription = this.services.taproot.subscribeSendEvents({})\n\n sendSubscription.on(\"data\", (event) => {\n this.logger.debug(`Taproot send event: ${JSON.stringify(event)}`)\n this.emit(\"taproot_send_event\", event)\n })\n\n sendSubscription.on(\"error\", (error) => {\n this.stats.subscriptionErrors++\n this.logger.error(`Taproot send subscription error: ${error.message}`)\n this.emit(\"taproot_send_error\", error)\n })\n\n this.subscriptions.set(\"taproot_send\", sendSubscription)\n this.logger.info(\"Taproot Asset subscriptions started\")\n }\n\n /**\n * Cancel a specific subscription\n */\n cancelSubscription(name) {\n const subscription = this.subscriptions.get(name)\n if (subscription) {\n if (typeof subscription.destroy === \"function\") {\n subscription.destroy()\n }\n else if (typeof subscription.cancel === \"function\") {\n subscription.cancel()\n }\n\n this.subscriptions.delete(name)\n this.pausedSubscriptions.delete(name)\n this.logger.info(`Cancelled subscription: ${name}`)\n }\n }\n\n /**\n * Get subscription status\n */\n getStatus() {\n return {\n isActive: this.isActive,\n subscriptionCount: this.subscriptions.size,\n activeSubscriptions: Array.from(this.subscriptions.keys()),\n servicesAvailable: {\n lightning: !!this.services.lightning,\n router: !!this.services.router,\n taproot: !!this.services.taproot,\n },\n }\n }\n\n /**\n * Pause subscriptions by gate\n * @param {string} gateName - Gate name to pause subscriptions for\n */\n async pauseSubscriptionsByGate(gateName) {\n this.logger.info(`Pausing subscriptions for gate: ${gateName}`)\n\n const subscriptionsToPause = []\n\n // All current subscriptions are gated by lndActive\n if (gateName === \"lndActive\") {\n this.subscriptions.forEach((subscription, name) => {\n subscriptionsToPause.push({ name, subscription })\n })\n }\n\n for (const { name, subscription } of subscriptionsToPause) {\n try {\n // Cancel the subscription\n if (typeof subscription.destroy === \"function\") {\n subscription.destroy()\n }\n else if (typeof subscription.cancel === \"function\") {\n subscription.cancel()\n }\n\n // Move to paused tracking\n this.pausedSubscriptions.set(name, {\n gate: gateName,\n pausedAt: new Date(),\n type: this.getSubscriptionType(name),\n })\n\n this.subscriptions.delete(name)\n this.stats.subscriptionsPaused++\n\n this.logger.info(`Paused subscription: ${name}`)\n }\n catch (error) {\n this.logger.error(`Failed to pause subscription ${name}: ${error.message}`)\n }\n }\n\n this.logger.info(`Paused ${subscriptionsToPause.length} subscriptions for gate: ${gateName}`)\n }\n\n /**\n * Resume subscriptions by gate\n * @param {string} gateName - Gate name to resume subscriptions for\n */\n async resumeSubscriptionsByGate(gateName) {\n this.logger.info(`Resuming subscriptions for gate: ${gateName}`)\n\n const subscriptionsToResume = []\n\n this.pausedSubscriptions.forEach((pausedInfo, name) => {\n if (pausedInfo.gate === gateName) {\n subscriptionsToResume.push({ name, pausedInfo })\n }\n })\n\n for (const { name, pausedInfo } of subscriptionsToResume) {\n try {\n // Restart the subscription based on its type\n await this.restartSubscription(name, pausedInfo.type)\n\n // Remove from paused tracking\n this.pausedSubscriptions.delete(name)\n this.stats.subscriptionsResumed++\n\n this.logger.info(`Resumed subscription: ${name}`)\n }\n catch (error) {\n this.logger.error(`Failed to resume subscription ${name}: ${error.message}`)\n }\n }\n\n this.logger.info(`Resumed ${subscriptionsToResume.length} subscriptions for gate: ${gateName}`)\n }\n\n /**\n * Get subscription type for restart\n * @param {string} name - Subscription name\n * @returns {string} Subscription type\n */\n getSubscriptionType(name) {\n if (name === \"invoice\")\n return \"invoice\"\n if (name === \"payment\")\n return \"payment\"\n if (name.startsWith(\"taproot_\"))\n return \"taproot\"\n return \"unknown\"\n }\n\n /**\n * Restart a specific subscription\n * @param {string} name - Subscription name\n * @param {string} type - Subscription type\n */\n async restartSubscription(name, type) {\n switch (type) {\n case \"invoice\":\n await this.startInvoiceSubscription()\n break\n case \"payment\":\n await this.startPaymentSubscription()\n break\n case \"taproot\":\n await this.startTaprootSubscriptions()\n break\n default:\n throw new Error(`Unknown subscription type: ${type}`)\n }\n }\n\n /**\n * Get paused subscriptions info\n * @returns {object} Paused subscriptions information\n */\n getPausedSubscriptionsInfo() {\n const pausedByGate = {}\n\n this.pausedSubscriptions.forEach((pausedInfo, name) => {\n const gate = pausedInfo.gate\n if (!pausedByGate[gate]) {\n pausedByGate[gate] = []\n }\n pausedByGate[gate].push({\n name,\n pausedAt: pausedInfo.pausedAt,\n type: pausedInfo.type,\n })\n })\n\n return {\n totalPaused: this.pausedSubscriptions.size,\n pausedByGate,\n stats: {\n subscriptionsPaused: this.stats.subscriptionsPaused,\n subscriptionsResumed: this.stats.subscriptionsResumed,\n },\n }\n }\n\n /**\n * Cleanup all subscriptions\n */\n cleanup() {\n this.logger.info(\"Cleaning up subscription manager...\")\n this.stopSubscriptions()\n\n // Clear paused subscriptions tracking\n this.pausedSubscriptions.clear()\n\n this.removeAllListeners()\n this.logger.info(\"Subscription manager cleanup completed\")\n }\n}\n\nmodule.exports = SubscriptionManager\n", "const Logger = require(\"@business/utils/linkLogger\")\n\n/**\n * Task Registry\n * Manages task definitions and provides task lookup functionality\n */\nclass TaskRegistry {\n constructor(tasks = {}) {\n this.logger = new Logger(\"TaskRegistry\")\n this.tasks = new Map()\n this.loadTasks(tasks)\n }\n\n /**\n * Load tasks from configuration\n * @param {object} tasks - Task definitions\n */\n loadTasks(tasks) {\n Object.entries(tasks).forEach(([taskId, taskDef]) => {\n this.registerTask(taskId, taskDef)\n })\n this.logger.info(`Loaded ${this.tasks.size} tasks`)\n }\n\n /**\n * Register a single task\n * @param {string} taskId - Task identifier\n * @param {object} taskDef - Task definition\n */\n registerTask(taskId, taskDef) {\n // Validate task definition\n const validation = this.validateTask(taskDef)\n if (!validation.valid) {\n throw new Error(`Invalid task definition for '${taskId}': ${validation.errors.join(\", \")}`)\n }\n\n // Set defaults\n const task = {\n enabled: true,\n maxRetries: 3,\n timeout: 30000,\n priority: 5,\n ...taskDef,\n id: taskId,\n }\n\n this.tasks.set(taskId, task)\n this.logger.debug(`Registered task: ${taskId}`)\n }\n\n /**\n * Get a task by ID\n * @param {string} taskId - Task identifier\n * @returns {object|null} Task definition or null\n */\n getTask(taskId) {\n return this.tasks.get(taskId) || null\n }\n\n /**\n * Get all tasks\n * @returns {Map} All tasks\n */\n getAllTasks() {\n return new Map(this.tasks)\n }\n\n /**\n * Get tasks by type\n * @param {string} type - Task type ('cron' or 'event')\n * @returns {Map} Filtered tasks\n */\n getTasksByType(type) {\n const filtered = new Map()\n this.tasks.forEach((task, taskId) => {\n if (task.type === type) {\n filtered.set(taskId, task)\n }\n })\n return filtered\n }\n\n /**\n * Get enabled tasks\n * @returns {Map} Enabled tasks\n */\n getEnabledTasks() {\n const enabled = new Map()\n this.tasks.forEach((task, taskId) => {\n if (task.enabled) {\n enabled.set(taskId, task)\n }\n })\n return enabled\n }\n\n /**\n * Get tasks by gate\n * @param {string} gateName - Gate name\n * @returns {Map} Tasks with the specified gate\n */\n getTasksByGate(gateName) {\n const filtered = new Map()\n this.tasks.forEach((task, taskId) => {\n if (task.gate === gateName) {\n filtered.set(taskId, task)\n }\n })\n return filtered\n }\n\n /**\n * Enable/disable a task\n * @param {string} taskId - Task identifier\n * @param {boolean} enabled - Whether to enable the task\n */\n setTaskEnabled(taskId, enabled) {\n const task = this.tasks.get(taskId)\n if (task) {\n task.enabled = enabled\n this.logger.info(`Task '${taskId}' ${enabled ? \"enabled\" : \"disabled\"}`)\n }\n }\n\n /**\n * Update task configuration\n * @param {string} taskId - Task identifier\n * @param {object} updates - Updates to apply\n */\n updateTask(taskId, updates) {\n const task = this.tasks.get(taskId)\n if (task) {\n Object.assign(task, updates)\n this.logger.info(`Updated task '${taskId}'`)\n }\n }\n\n /**\n * Validate task definition\n * @param {object} taskDef - Task definition\n * @returns {object} Validation result\n */\n validateTask(taskDef) {\n const errors = []\n\n if (!taskDef.type) {\n errors.push(\"Task type is required\")\n }\n else if (![\"cron\", \"event\"].includes(taskDef.type)) {\n errors.push(\"Task type must be 'cron' or 'event'\")\n }\n\n if (!taskDef.implementation || typeof taskDef.implementation !== \"function\") {\n errors.push(\"Task implementation must be a function\")\n }\n\n if (taskDef.type === \"cron\" && !taskDef.schedule) {\n errors.push(\"Cron tasks must have a schedule\")\n }\n\n if (taskDef.type === \"event\" && !taskDef.event) {\n errors.push(\"Event tasks must specify an event name\")\n }\n\n if (!taskDef.gate) {\n errors.push(\"Task must specify a gate\")\n }\n\n if (taskDef.maxRetries && (typeof taskDef.maxRetries !== \"number\" || taskDef.maxRetries < 0)) {\n errors.push(\"maxRetries must be a non-negative number\")\n }\n\n if (taskDef.timeout && (typeof taskDef.timeout !== \"number\" || taskDef.timeout <= 0)) {\n errors.push(\"timeout must be a positive number\")\n }\n\n return {\n valid: errors.length === 0,\n errors,\n }\n }\n\n /**\n * Get registry statistics\n * @returns {object} Statistics\n */\n getStats() {\n const stats = {\n totalTasks: this.tasks.size,\n enabledTasks: 0,\n cronTasks: 0,\n eventTasks: 0,\n gateDistribution: {},\n }\n\n this.tasks.forEach((task) => {\n if (task.enabled)\n stats.enabledTasks++\n if (task.type === \"cron\")\n stats.cronTasks++\n if (task.type === \"event\")\n stats.eventTasks++\n\n stats.gateDistribution[task.gate] = (stats.gateDistribution[task.gate] || 0) + 1\n })\n\n return stats\n }\n}\n\nmodule.exports = TaskRegistry\n", "const EventEmitter = require(\"node:events\")\nconst Logger = require(\"@business/utils/linkLogger\")\nconst EventBus = require(\"./EventBus\")\nconst Gates = require(\"./Gates\")\nconst Scheduler = require(\"./Scheduler\")\nconst StateManager = require(\"./StateManager\")\nconst SubscriptionManager = require(\"./SubscriptionManager\")\nconst TaskRegistry = require(\"./TaskRegistry\")\n\n/**\n * Unified Job Manager\n * Replaces the complex MainJobManager -> LndJobManager/RgbJobManager hierarchy\n * with a single, simplified manager\n */\nclass JobManager extends EventEmitter {\n constructor(options = {}) {\n super()\n this.logger = new Logger(\"JobManager\")\n this.options = {\n dryRun: true, // Default to dry-run mode to avoid impacting existing system\n ...options,\n }\n\n // Core components\n this.gates = null\n this.taskRegistry = null\n this.eventBus = null\n this.scheduler = null\n this.subscriptionManager = null\n this.stateManager = null\n\n // State\n this.isInitialized = false\n this.isRunning = false\n this.isShuttingDown = false\n\n // Statistics\n this.stats = {\n initializationTime: null,\n startTime: null,\n tasksRegistered: 0,\n eventsRegistered: 0,\n }\n }\n\n /**\n * Initialize the job manager with task and gate configurations\n * @param {object} tasks - Task definitions\n * @param {object} gates - Gate definitions\n */\n async initialize(tasks, gates) {\n if (this.isInitialized) {\n this.logger.warn(\"JobManager already initialized\")\n return\n }\n\n try {\n this.logger.info(\"Initializing JobManager...\")\n const startTime = Date.now()\n\n // Initialize core components\n this.gates = new Gates(gates)\n this.taskRegistry = new TaskRegistry(tasks)\n this.eventBus = new EventBus()\n this.scheduler = new Scheduler(this.gates, new Logger(\"Scheduler\"))\n this.subscriptionManager = new SubscriptionManager(this.gates, new Logger(\"SubscriptionManager\"))\n this.stateManager = new StateManager(this.subscriptionManager, this.eventBus, new Logger(\"StateManager\"))\n\n // Register event handlers\n await this.registerEventHandlers()\n\n // Schedule cron tasks\n await this.scheduleCronTasks()\n\n this.isInitialized = true\n this.stats.initializationTime = Date.now() - startTime\n this.stats.tasksRegistered = this.taskRegistry.getAllTasks().size\n this.stats.eventsRegistered = this.eventBus.handlers.size\n\n this.logger.info(`JobManager initialized successfully in ${this.stats.initializationTime}ms`)\n this.logger.info(`Registered ${this.stats.tasksRegistered} tasks and ${this.stats.eventsRegistered} event handlers`)\n\n if (this.options.dryRun) {\n this.logger.warn(\"JobManager is running in DRY-RUN mode - tasks will not execute\")\n }\n }\n catch (error) {\n this.logger.error(`Failed to initialize JobManager: ${error.message}`)\n throw error\n }\n }\n\n /**\n * Register event handlers from task registry\n */\n async registerEventHandlers() {\n const eventTasks = this.taskRegistry.getTasksByType(\"event\")\n\n eventTasks.forEach((task, taskId) => {\n if (!task.enabled) {\n this.logger.debug(`Event task '${taskId}' is disabled, skipping registration`)\n return\n }\n\n const wrappedHandler = async (...args) => {\n try {\n // Check gate condition\n if (!this.gates.evaluate(task.gate)) {\n this.logger.debug(`Event task '${taskId}' gate '${task.gate}' not satisfied, skipping`)\n return\n }\n\n if (this.options.dryRun) {\n this.logger.info(`[DRY-RUN] Would execute event task: ${taskId}`)\n return\n }\n\n this.logger.debug(`Executing event task: ${taskId}`)\n const startTime = Date.now()\n\n const result = await this.executeWithTimeout(task.implementation, task.timeout, ...args)\n\n const duration = Date.now() - startTime\n this.logger.debug(`Event task '${taskId}' completed in ${duration}ms`)\n\n this.emit(\"task_success\", {\n taskId,\n result,\n duration,\n })\n return result\n }\n catch (error) {\n this.logger.error(`Event task '${taskId}' failed: ${error.message}`)\n this.emit(\"task_error\", { taskId, error })\n throw error\n }\n }\n\n this.eventBus.register(task.event, wrappedHandler)\n this.logger.debug(`Registered event handler for '${task.event}' (task: ${taskId})`)\n })\n }\n\n /**\n * Schedule cron tasks\n */\n async scheduleCronTasks() {\n const cronTasks = this.taskRegistry.getTasksByType(\"cron\")\n\n cronTasks.forEach((task, taskId) => {\n if (!task.enabled) {\n this.logger.debug(`Cron task '${taskId}' is disabled, skipping scheduling`)\n return\n }\n\n // Wrap the task implementation for dry-run mode\n const wrappedImplementation = async () => {\n if (this.options.dryRun) {\n this.logger.info(`[DRY-RUN] Would execute cron task: ${taskId}`)\n return\n }\n return await task.implementation()\n }\n\n const wrappedTask = {\n ...task,\n implementation: wrappedImplementation,\n }\n\n this.scheduler.schedule(taskId, wrappedTask)\n this.logger.debug(`Scheduled cron task '${taskId}' with schedule: ${task.schedule}`)\n })\n }\n\n /**\n * Start the job manager\n */\n async start() {\n if (!this.isInitialized) {\n throw new Error(\"JobManager must be initialized before starting\")\n }\n\n if (this.isRunning) {\n this.logger.warn(\"JobManager already running\")\n return\n }\n\n try {\n this.logger.info(\"Starting JobManager...\")\n\n // Start all scheduled tasks\n this.scheduler.startAll()\n\n // Set up StateManager event listeners before starting\n this.setupStateManagerListeners()\n\n // Start state monitoring (which will handle LND subscriptions)\n await this.stateManager.startStateMonitoring()\n\n this.isRunning = true\n this.stats.startTime = Date.now()\n\n this.logger.info(\"JobManager started successfully\")\n this.emit(\"started\")\n }\n catch (error) {\n this.logger.error(`Failed to start JobManager: ${error.message}`)\n throw error\n }\n }\n\n /**\n * Stop the job manager\n */\n async stop() {\n if (!this.isRunning) {\n this.logger.warn(\"JobManager not running\")\n return\n }\n\n try {\n this.logger.info(\"Stopping JobManager...\")\n\n // Stop all scheduled tasks\n this.scheduler.stopAll()\n\n // Stop state monitoring\n this.stateManager.stopStateMonitoring()\n\n this.isRunning = false\n\n this.logger.info(\"JobManager stopped successfully\")\n this.emit(\"stopped\")\n }\n catch (error) {\n this.logger.error(`Failed to stop JobManager: ${error.message}`)\n throw error\n }\n }\n\n /**\n * Set up StateManager event listeners\n */\n setupStateManagerListeners() {\n // Listen for node stopped events\n this.stateManager.on(\"node_stopped\", async (eventData) => {\n await this.handleNodeStopped(eventData)\n })\n\n // Listen for node recovered events\n this.stateManager.on(\"node_recovered\", async (eventData) => {\n await this.handleNodeRecovered(eventData)\n })\n\n // Listen for general state errors\n this.stateManager.on(\"state_error\", (error) => {\n this.logger.error(`StateManager error: ${error.message}`)\n this.emit(\"state_manager_error\", error)\n })\n\n // Listen for connection errors (non-critical)\n this.stateManager.on(\"connection_error\", (error) => {\n this.logger.warn(`StateManager connection issue: ${error.message}`)\n })\n\n this.logger.debug(\"StateManager event listeners set up\")\n }\n\n /**\n * Handle node stopped event\n */\n async handleNodeStopped(eventData) {\n const {\n error,\n previousState,\n timestamp,\n } = eventData\n\n this.logger.warn(`Node stopped detected, pausing LND-dependent tasks`)\n this.logger.debug(`Previous state: ${previousState}, Error: ${error.message}`)\n\n try {\n // Pause all lndActive gate tasks\n await this.scheduler.pauseTasksByGate(\"lndActive\")\n\n // Pause subscriptions gated by lndActive\n await this.subscriptionManager.pauseSubscriptionsByGate(\"lndActive\")\n\n // Emit event for external listeners\n this.emit(\"tasks_paused\", {\n gate: \"lndActive\",\n reason: \"node_stopped\",\n timestamp,\n })\n\n this.logger.info(\"LND-dependent tasks paused successfully\")\n }\n catch (handlingError) {\n this.logger.error(`Error handling node stopped: ${handlingError.message}`)\n }\n }\n\n /**\n * Handle node recovered event\n */\n async handleNodeRecovered(eventData) {\n const { timestamp } = eventData\n\n this.logger.info(\"Node recovered, resuming LND-dependent tasks\")\n\n try {\n // Resume all lndActive gate tasks\n await this.scheduler.resumeTasksByGate(\"lndActive\")\n\n // Resume subscriptions gated by lndActive\n await this.subscriptionManager.resumeSubscriptionsByGate(\"lndActive\")\n\n // Emit event for external listeners\n this.emit(\"tasks_resumed\", {\n gate: \"lndActive\",\n reason: \"node_recovered\",\n timestamp,\n })\n\n this.logger.info(\"LND-dependent tasks resumed successfully\")\n }\n catch (handlingError) {\n this.logger.error(`Error handling node recovery: ${handlingError.message}`)\n this.emit(\"node_recovery_handling_error\", handlingError)\n }\n }\n\n /**\n * Execute function with timeout\n * @param {Function} fn - Function to execute\n * @param {number} timeout - Timeout in milliseconds\n * @param {...any} args - Function arguments\n * @returns {Promise} Execution result\n */\n async executeWithTimeout(fn, timeout = 30000, ...args) {\n return new Promise((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n reject(new Error(`Task execution timed out after ${timeout}ms`))\n }, timeout)\n\n // Execute the function and handle the result\n Promise.resolve(fn(...args))\n .then((result) => {\n clearTimeout(timeoutId)\n resolve(result)\n })\n .catch((error) => {\n clearTimeout(timeoutId)\n reject(error)\n })\n })\n }\n\n /**\n * Emit an event through the event bus\n * @param {string} eventName - Event name\n * @param {...any} args - Event arguments\n */\n emitEvent(eventName, ...args) {\n if (!this.eventBus) {\n this.logger.warn(\"EventBus not initialized, cannot emit event\")\n return\n }\n\n this.eventBus.emit(eventName, ...args)\n }\n\n /**\n * Enable/disable dry-run mode\n * @param {boolean} dryRun - Whether to enable dry-run mode\n */\n setDryRun(dryRun) {\n this.options.dryRun = dryRun\n this.logger.info(`Dry-run mode ${dryRun ? \"enabled\" : \"disabled\"}`)\n }\n\n /**\n * Get system status\n * @returns {object} System status\n */\n getStatus() {\n return {\n isInitialized: this.isInitialized,\n isRunning: this.isRunning,\n isShuttingDown: this.isShuttingDown,\n dryRun: this.options.dryRun,\n stats: this.stats,\n gates: this.gates?.getStats() || null,\n taskRegistry: this.taskRegistry?.getStats() || null,\n eventBus: this.eventBus?.getStats() || null,\n scheduler: this.scheduler?.getStats() || null,\n subscriptionManager: this.subscriptionManager?.getStatus() || null,\n stateManager: this.stateManager?.getStatus() || null,\n }\n }\n\n /**\n * Get detailed task information\n * @returns {object} Task information\n */\n getTaskInfo() {\n if (!this.isInitialized) {\n return null\n }\n\n return {\n allTasks: Array.from(this.taskRegistry.getAllTasks().entries()),\n cronTasks: Array.from(this.taskRegistry.getTasksByType(\"cron\").entries()),\n eventTasks: Array.from(this.taskRegistry.getTasksByType(\"event\").entries()),\n scheduledTasks: this.scheduler.getAllTasksInfo(),\n gateNames: this.gates.getGateNames(),\n }\n }\n\n /**\n * Graceful shutdown\n */\n async shutdown() {\n if (this.isShuttingDown) {\n this.logger.warn(\"JobManager already shutting down\")\n return\n }\n\n this.logger.info(\"Starting JobManager shutdown...\")\n this.isShuttingDown = true\n\n try {\n // Stop if running\n if (this.isRunning) {\n await this.stop()\n }\n\n // Cleanup components\n if (this.scheduler) {\n this.scheduler.cleanup()\n }\n\n if (this.eventBus) {\n this.eventBus.cleanup()\n }\n\n if (this.subscriptionManager) {\n this.subscriptionManager.cleanup()\n }\n\n if (this.stateManager) {\n this.stateManager.cleanup()\n }\n\n // Reset state\n this.isInitialized = false\n this.isRunning = false\n\n this.logger.info(\"JobManager shutdown completed\")\n this.emit(\"shutdown\")\n }\n catch (error) {\n this.logger.error(`Error during shutdown: ${error.message}`)\n throw error\n }\n }\n}\n\nmodule.exports = JobManager\n", "const Logger = require(\"@business/utils/linkLogger\")\nconst { TASKS, GATES } = require(\"./config/tasks\")\nconst JobManager = require(\"./core/JobManager\")\n\n// Global instance\nlet jobManager = null\n\n/**\n * Initialize the new job system\n * @param {object} options - Initialization options\n * @returns {JobManager} Job manager instance\n */\nasync function initJobSystem(options = {}) {\n const logger = new Logger(\"job\")\n\n try {\n if (jobManager) {\n logger.warn(\"Job system already initialized\")\n return jobManager\n }\n\n logger.info(\"Initializing new job system...\")\n\n // Create job manager instance\n jobManager = new JobManager(options)\n\n // Initialize with tasks and gates\n await jobManager.initialize(TASKS, GATES)\n\n // Set up event listeners for integration with existing system\n setupEventListeners(jobManager)\n\n logger.info(\"New job system initialized successfully\")\n return jobManager\n }\n catch (error) {\n logger.error(`Failed to initialize job system: ${error.message}`)\n throw error\n }\n}\n\n/**\n * Start the job system\n * @returns {Promise<void>}\n */\nasync function startJobSystem() {\n if (!jobManager) {\n throw new Error(\"Job system not initialized. Call initJobSystem() first.\")\n }\n\n await jobManager.start()\n}\n\n/**\n * Stop the job system\n * @returns {Promise<void>}\n */\nasync function stopJobSystem() {\n if (!jobManager) {\n return\n }\n\n await jobManager.stop()\n}\n\n/**\n * Get job system status\n * @returns {object|null} System status\n */\nfunction getJobSystemStatus() {\n return jobManager ? jobManager.getStatus() : null\n}\n\n/**\n * Get job system task information\n * @returns {object|null} Task information\n */\nfunction getJobSystemTaskInfo() {\n return jobManager ? jobManager.getTaskInfo() : null\n}\n\n/**\n * Enable/disable dry-run mode\n * @param {boolean} dryRun - Whether to enable dry-run mode\n */\nfunction setDryRun(dryRun) {\n if (jobManager) {\n jobManager.setDryRun(dryRun)\n }\n}\n\n/**\n * Emit an event through the job system\n * @param {string} eventName - Event name\n * @param {...any} args - Event arguments\n */\nfunction emitJobEvent(eventName, ...args) {\n if (jobManager) {\n jobManager.emitEvent(eventName, ...args)\n }\n}\n\n/**\n * Set up event listeners for integration with existing system\n * @param {JobManager} manager - Job manager instance\n */\nfunction setupEventListeners(manager) {\n const linkEvent = require(\"@business/utils/linkEvent\")\n const logger = new Logger(\"job\")\n // Forward existing linkEvent events to the new system\n const eventsToForward = [\n \"bakeTapdMacaroon\",\n \"bakeLoopMacaroon\",\n \"listenNostrEvent\",\n \"initAccount\",\n \"startJobs\",\n \"rgbStart\",\n ]\n\n eventsToForward.forEach((eventName) => {\n linkEvent.on(eventName, (...args) => {\n manager.emitEvent(eventName, ...args)\n })\n })\n\n // Set up manager event listeners\n manager.on(\"started\", () => {\n logger.info(\"Job system started\")\n })\n\n manager.on(\"stopped\", () => {\n logger.info(\"Job system stopped\")\n })\n\n manager.on(\"task_success\", ({ taskId, duration }) => {\n logger.debug(`Task '${taskId}' completed in ${duration}ms`)\n })\n\n manager.on(\"task_error\", ({ taskId, error }) => {\n logger.error(`Task '${taskId}' failed: ${error.message}`)\n })\n}\n\n/**\n * Graceful shutdown\n */\nasync function gracefulShutdown() {\n const logger = new Logger(\"job_shutdown\")\n logger.info(\"Received shutdown signal...\")\n\n if (jobManager) {\n await jobManager.shutdown()\n jobManager = null\n }\n\n logger.info(\"Job system graceful shutdown completed\")\n}\n\n// Register process signal handlers\nprocess.on(\"SIGINT\", gracefulShutdown)\nprocess.on(\"SIGTERM\", gracefulShutdown)\n\n// Uncaught exception handling\nprocess.on(\"uncaughtException\", (error) => {\n const logger = new Logger(\"job_uncaught\")\n logger.error(`Uncaught exception: ${error.message}`)\n gracefulShutdown()\n})\n\nprocess.on(\"unhandledRejection\", (reason, promise) => {\n const logger = new Logger(\"job_unhandled\")\n logger.error(`Unhandled rejection at: ${promise}, reason: ${reason}`)\n})\n\nmodule.exports = {\n initJobSystem,\n startJobSystem,\n stopJobSystem,\n getJobSystemStatus,\n getJobSystemTaskInfo,\n setDryRun,\n emitJobEvent,\n gracefulShutdown,\n}\n", "/**\n * Compatibility layer for the new job system\n * Provides the same interface as the original job system for seamless migration\n */\n\nconst Logger = require(\"@business/utils/linkLogger\")\nconst {\n initJobSystem,\n startJobSystem,\n stopJobSystem,\n getJobSystemStatus,\n emitJobEvent,\n} = require(\"./index\")\n\n/**\n * Compatibility wrapper that mimics the original initJobListener function\n * @returns {object} Job manager instance with compatible interface\n */\nasync function initJobListener() {\n const logger = new Logger(\"job_compatibility\")\n try {\n logger.info(\"Initializing job system via compatibility layer...\")\n\n // Initialize the new job system\n const jobManager = await initJobSystem({\n dryRun: false, // Production mode for compatibility\n })\n\n // Start the job system\n await startJobSystem()\n\n // Return a compatible interface\n return {\n // Original MainJobManager methods\n getSystemStatus: getJobSystemStatus,\n\n // Event emission compatibility\n emitEvent: emitJobEvent,\n\n // Shutdown compatibility\n shutdown: async () => {\n const { gracefulShutdown } = require(\"./index\")\n await gracefulShutdown()\n },\n\n // LND job manager compatibility\n startLndJobs: async () => {\n logger.info(\"LND jobs will be started automatically when LND becomes active\")\n emitJobEvent(\"startJobs\")\n },\n\n // RGB job manager compatibility\n startRgbJobs: async () => {\n logger.info(\"RGB jobs are running automatically\")\n emitJobEvent(\"rgbStart\")\n },\n\n // Stop job methods for compatibility\n stopLndJobs: async () => {\n logger.info(\"LND jobs will be stopped automatically when LND becomes inactive\")\n emitJobEvent(\"stopLndJobs\")\n },\n\n stopRgbJobs: async () => {\n logger.info(\"RGB jobs stopped\")\n emitJobEvent(\"stopRgbJobs\")\n },\n stopJobSystem,\n\n // Event emission methods for compatibility\n bakeTapdMacaroon: () => emitJobEvent(\"bakeTapdMacaroon\"),\n bakeLoopMacaroon: password => emitJobEvent(\"bakeLoopMacaroon\", password),\n listenNostrEvent: () => emitJobEvent(\"listenNostrEvent\"),\n initAccount: () => emitJobEvent(\"initAccount\"),\n\n // Internal reference to the actual job manager\n _jobManager: jobManager,\n }\n }\n catch (error) {\n logger.error(`Failed to initialize job system via compatibility layer: ${error.message}`)\n throw error\n }\n}\n\n/**\n * Graceful shutdown function for compatibility\n */\nasync function gracefulShutdown() {\n const { gracefulShutdown: shutdown } = require(\"./index\")\n await shutdown()\n}\n\nmodule.exports = {\n initJobListener,\n gracefulShutdown,\n}\n", "const { getConfig } = require(\"../common/getConfig\")\nconst { startTerminal } = require(\"../service/nodeManage\")\nconst Logger = require(\"../utils/linkLogger\")\n\nasync function startLitd() {\n const logger = new Logger(\"job\")\n try {\n if (!getConfig().LINK_READY) {\n logger.info(\"LND job startLitd not set, skipping.\")\n return false\n }\n const ret = await startTerminal()\n if (ret) {\n logger.info(`LND job startLitd complete:${JSON.stringify(ret)}`)\n }\n return true\n }\n catch (e) {\n logger.error(`LND job startLitd error--->${e.message}`)\n }\n}\nmodule.exports = startLitd\n", "const { getConfig } = require(\"../common/getConfig\")\n\nconst { startRGB: startRGBService } = require(\"../service/nodeManage\")\n\nconst Logger = require(\"../utils/linkLogger\")\n\nasync function startRGB() {\n const logger = new Logger(\"job\")\n try {\n if (!getConfig().LINK_READY) {\n logger.info(\"RGB job startRGB not set, skipping.\")\n return false\n }\n const ret = await startRGBService()\n logger.info(`RGB job startRGB complete:${JSON.stringify(ret)}`)\n }\n catch (e) {\n logger.error(`RGB job startRGB error--->${e.message}`)\n }\n}\nmodule.exports = startRGB\n", "{\n \"bitcoindIndex\": \"CHANGE_ME_MAINNET_ELECTRS_HOST:50001\",\n \"bitcoindPass\": \"CHANGE_ME_MAINNET_RPC_PASSWORD\",\n \"bitcoindRpcHost\": \"CHANGE_ME_MAINNET_BITCOIND_HOST\",\n \"bitcoindRpcPort\": \"8332\",\n \"bitcoindUser\": \"CHANGE_ME_MAINNET_RPC_USER\",\n \"bitcoindZmqBlock\": \"tcp://CHANGE_ME_MAINNET_BITCOIND_HOST:28334\",\n \"bitcoindZmqRawTx\": \"tcp://CHANGE_ME_MAINNET_BITCOIND_HOST:28335\",\n \"network\": \"mainnet\",\n \"nostrRelays\": [\n \"wss://CHANGE_ME_MAINNET_RELAY_1\",\n \"wss://CHANGE_ME_MAINNET_RELAY_2\"\n ],\n \"officialLndPeer\": \"\",\n \"officialLndPeerHost\": \"CHANGE_ME_MAINNET_LND_HOST:9735\",\n \"officialNostrPubKey\": \"\",\n \"officialRgbPeer\": \"\",\n \"officialRgbPeerHost\": \"CHANGE_ME_MAINNET_RGB_HOST:9736\",\n \"officialUniverseServer\": \"CHANGE_ME_MAINNET_UNIVERSE_HOST:10009\",\n \"priceOracle\": \"grpc-oracle.lnfi.network\",\n \"rgbProxy\": \"rpc://CHANGE_ME_MAINNET_RGB_PROXY_HOST:5000/json-rpc\"\n}\n", "{\n \"bitcoindIndex\": \"regtest.lnfi.network:50001\",\n \"bitcoindPass\": \"lnfi_pass12GA\",\n \"bitcoindRpcHost\": \"regtest.lnfi.network\",\n \"bitcoindRpcPort\": \"18443\",\n \"bitcoindUser\": \"lnfi_user\",\n \"bitcoindZmqBlock\": \"tcp://regtest.lnfi.network:28334\",\n \"bitcoindZmqRawTx\": \"tcp://regtest.lnfi.network:28335\",\n \"network\": \"regtest\",\n \"nostrRelays\": [\n \"wss://relay01.lnfi.network\",\n \"wss://dev-relay.lnfi.network\"\n ],\n \"officialLndPeer\": \"03b24a4bf911ffd26ac1d5e5f2440a3c2f6974e4cc85d2ef54e17ee6d3717433d3\",\n \"officialLndPeerHost\": \"34.84.66.29:7739\",\n \"officialNostrPubKey\": \"npub1me48869w43j30cfry9ayz9dsdl4gj54xppgk9krrv7g6hsq7psuqp3yusn\",\n \"officialRgbPeer\": \"03b7153e278882e48e690acd0743305cbada86b131ab3388ccd782b45b02f064ef\",\n \"officialRgbPeerHost\": \"regtest.lnfi.network:9736\",\n \"officialUniverseServer\": \"regtest.lnfi.network:10009\",\n \"priceOracle\": \"grpc-oracle.lnfi.network\",\n \"rgbProxy\": \"rpc://regtest.lnfi.network:5000/json-rpc\"\n}", "{\n \"bitcoindIndex\": \"CHANGE_ME_TESTNET_ELECTRS_HOST:50001\",\n \"bitcoindPass\": \"CHANGE_ME_TESTNET_RPC_PASSWORD\",\n \"bitcoindRpcHost\": \"CHANGE_ME_TESTNET_BITCOIND_HOST\",\n \"bitcoindRpcPort\": \"18332\",\n \"bitcoindUser\": \"CHANGE_ME_TESTNET_RPC_USER\",\n \"bitcoindZmqBlock\": \"tcp://CHANGE_ME_TESTNET_BITCOIND_HOST:28334\",\n \"bitcoindZmqRawTx\": \"tcp://CHANGE_ME_TESTNET_BITCOIND_HOST:28335\",\n \"network\": \"testnet\",\n \"nostrRelays\": [\n \"wss://CHANGE_ME_TESTNET_RELAY_1\",\n \"wss://CHANGE_ME_TESTNET_RELAY_2\"\n ],\n \"officialLndPeer\": \"\",\n \"officialLndPeerHost\": \"CHANGE_ME_TESTNET_LND_HOST:9735\",\n \"officialNostrPubKey\": \"\",\n \"officialRgbPeer\": \"\",\n \"officialRgbPeerHost\": \"CHANGE_ME_TESTNET_RGB_HOST:9736\",\n \"officialUniverseServer\": \"CHANGE_ME_TESTNET_UNIVERSE_HOST:10009\",\n \"priceOracle\": \"grpc-oracle.lnfi.network\",\n \"rgbProxy\": \"rpc://CHANGE_ME_TESTNET_RGB_PROXY_HOST:5000/json-rpc\"\n}\n", "const fs = require(\"node:fs\")\nconst { getConfig, reloadConfig } = require(\"@business/common/getConfig.js\")\nconst { getMainLnlinkConfig, updateMainLnlinkConfig } = require(\"@business/service/prisma/dbService\")\nconst Logger = require(\"@business/utils/linkLogger.js\")\nconst mainnetSettings = require(\"../../setting.mainnet.json\")\n// const {\n// nip19,\n// getPublicKey,\n// generatePrivateKey,\n// } = require(\"nostr-tools\")\nconst regtestSettings = require(\"../../setting.regtest.json\")\nconst testnetSettings = require(\"../../setting.testnet.json\")\nconst { initConfig } = require(\"../service/proxy/apiProxy\")\n\nasync function initLinkConfig() {\n const logger = new Logger(\"init\")\n try {\n const {\n LINK_NODE_ENV,\n LINK_OWNER,\n LINK_NETWORK,\n LINK_NAME,\n } = getConfig()\n\n // In Electron mode (nodeEnv = \"app\"), do not initialize DB from local setting templates\n if (LINK_NODE_ENV === \"app\") {\n return\n }\n\n const lndConfig = await getMainLnlinkConfig()\n // If DB already has non-empty settings, treat network configuration as initialized\n // If node_name is still empty but LINK_NAME is available, backfill node_name once\n if (lndConfig && lndConfig.settings && Object.keys(lndConfig.settings).length > 0) {\n if (!lndConfig.node_name && LINK_NAME) {\n await updateMainLnlinkConfig({ node_name: LINK_NAME })\n await reloadConfig()\n }\n return\n }\n\n let settings\n\n // Prefer external configuration file specified by LINK_SETTINGS_PATH (suitable for mainnet/production)\n const externalSettingsPath = process.env.LINK_SETTINGS_PATH\n if (externalSettingsPath) {\n try {\n if (fs.existsSync(externalSettingsPath)) {\n const raw = fs.readFileSync(externalSettingsPath, \"utf-8\")\n settings = JSON.parse(raw)\n }\n else {\n logger.warn(`LINK_SETTINGS_PATH is set but file does not exist: ${externalSettingsPath}`)\n }\n }\n catch (e) {\n logger.error(`Failed to load settings from LINK_SETTINGS_PATH: ${e.message}`)\n }\n }\n\n // If no external configuration is provided or loading failed, fall back to network-specific templates\n if (!settings) {\n if (LINK_NETWORK === \"testnet\") {\n settings = testnetSettings\n }\n else if (LINK_NETWORK === \"mainnet\") {\n settings = mainnetSettings\n }\n else {\n // Use regtest template as the default\n settings = regtestSettings\n }\n }\n\n await initConfig({\n owner: LINK_OWNER,\n settings,\n nodeName: LINK_NAME,\n })\n await reloadConfig()\n }\n catch (e) {\n logger.error(e?.message)\n }\n}\nmodule.exports = initLinkConfig\n", "const { getConfig } = require(\"@business/common/getConfig.js\")\nconst { initJobListener } = require(\"../job/compatibility\")\nconst startLitd = require(\"../job/startLitd\")\nconst startRGB = require(\"../job/startRGB\")\nconst { setCacheMacaroon } = require(\"../utils/index\")\nconst initLinkConfig = require(\"./initLinkConfig\")\n\nasync function init() {\n await initLinkConfig()\n const { listenNostrEvent, initAccount } = await initJobListener()\n await startLitd()\n startRGB()\n initAccount()\n listenNostrEvent()\n const { LINK_NODE_ENV } = getConfig()\n if (LINK_NODE_ENV === \"development\") {\n setCacheMacaroon(\"12345678\")\n }\n}\nmodule.exports = init\n", "#!/usr/bin/env node\n\n/**\n * Electron Entry Point for LN-Link\n * This file provides a clean API for Electron applications to integrate LN-Link\n */\n\nrequire(\"module-alias/register\")\nconst { EventEmitter } = require(\"node:events\")\nconst fs = require(\"node:fs\")\nconst http = require(\"node:http\")\nconst path = require(\"node:path\")\nconst bodyParser = require(\"body-parser\")\nconst cookieParser = require(\"cookie-parser\")\nconst express = require(\"express\")\nconst rateLimit = require(\"express-rate-limit\")\nconst createError = require(\"http-errors\")\nconst logger = require(\"morgan\")\n\n// Import LN-Link components\nconst lndRouter = require(\"./api/index.js\")\nconst { getConfig, initConfig } = require(\"./business/common/getConfig.js\")\nconst init = require(\"./business/init/index.js\")\n\nclass LnLink extends EventEmitter {\n constructor(options = {}) {\n super()\n\n this.options = {\n dataPath: options.dataPath || path.join(process.cwd(), \"lnlink-data\"),\n network: options.network || \"regtest\",\n debug: options.debug || false,\n httpPort: options.httpPort || 8090,\n name: options.name || \"electron-link\",\n enableTor: options.enableTor || false,\n owner: options.owner || \"\",\n binaryPath: options.binaryPath || \"\",\n nodeEnv: options.nodeEnv || \"app\",\n ...options,\n }\n\n this.isInitialized = false\n this.isRunning = false\n this.server = null\n this.app = null\n this.cleanupFunctions = []\n }\n\n /**\n * Ensure environment variables and Prisma are properly set up\n * @private\n */\n _ensureEnvironmentAndPrisma() {\n // Set database URL if not set\n if (!process.env.LINK_DATABASE_URL) {\n const dbPath = path.join(this.options.dataPath, \"link\", \"lnlink.db\")\n process.env.LINK_DATABASE_URL = `file:${dbPath}`\n console.log(`\uD83D\uDDC4\uFE0F Setting database URL: ${dbPath}`)\n }\n }\n\n /**\n * Ensure database is properly set up\n * @private\n */\n async _ensureDatabaseSetup() {\n try {\n // Ensure data directory exists\n const dataDir = path.dirname(process.env.LINK_DATABASE_URL.replace(\"file:\", \"\"))\n if (!fs.existsSync(dataDir)) {\n fs.mkdirSync(dataDir, { recursive: true })\n console.log(`\uD83D\uDCC1 Created data directory: ${dataDir}`)\n }\n\n // Prisma operations are now handled by startup scripts\n console.log(\"\uD83D\uDCE6 Prisma operations handled by startup scripts\")\n\n // Health check to verify database connection\n try {\n console.log(\"\uD83D\uDCE6 Checking database health...\")\n const PrismaService = require(\"./business/service/prisma/prismaService.js\")\n const prismaService = PrismaService.getInstance()\n await prismaService.healthCheck()\n console.log(\"\u2705 Database connection healthy\")\n }\n catch (error) {\n console.warn(\"\u26A0\uFE0F Database health check warning:\", error.message)\n // Do not throw; continue with application startup\n }\n }\n catch (error) {\n console.error(\"\u274C Database setup failed:\", error.message)\n throw error // Re-throw to prevent app startup with broken database\n }\n }\n\n /**\n * Initialize LN-Link with custom configuration\n * @param {object} config - Configuration overrides\n */\n async initialize(config = {}) {\n try {\n // Set environment variables for LN-Link\n process.env.LINK_DATA_PATH = this.options.dataPath\n process.env.LINK_NETWORK = this.options.network\n process.env.LINK_DEBUG = this.options.debug.toString()\n process.env.LINK_NODE_ENV = this.options.nodeEnv || \"app\"\n process.env.LINK_HTTP_PORT = this.options.httpPort.toString()\n process.env.LINK_NAME = this.options.name\n process.env.LINK_ENABLE_TOR = this.options.enableTor.toString()\n process.env.LINK_OWNER = this.options.owner\n\n // Set binary path if provided\n if (this.options.binaryPath) {\n process.env.LINK_BINARY_PATH = this.options.binaryPath\n }\n\n // Apply additional config\n Object.entries(config).forEach(([key, value]) => {\n process.env[key] = value.toString()\n })\n\n // Ensure environment and Prisma are properly set up\n this._ensureEnvironmentAndPrisma()\n\n // Ensure database is set up before initializing config\n await this._ensureDatabaseSetup()\n\n // Initialize configuration\n await initConfig()\n\n this.isInitialized = true\n this.emit(\"initialized\")\n\n return { success: true }\n }\n catch (error) {\n this.emit(\"error\", error)\n throw error\n }\n }\n\n /**\n * Start LN-Link services including Express server\n */\n async start() {\n if (!this.isInitialized) {\n throw new Error(\"LN-Link must be initialized before starting\")\n }\n\n try {\n const { LINK_HTTP_PORT } = getConfig()\n this.app = express()\n\n // Set up middleware\n const generalLimiter = rateLimit({\n windowMs: 15 * 60 * 1000,\n max: 100,\n message: {\n code: 429,\n message: \"Too many requests from this IP, please try again later.\",\n },\n standardHeaders: true,\n legacyHeaders: false,\n })\n\n const apiLimiter = rateLimit({\n windowMs: 15 * 60 * 1000,\n max: 50,\n message: {\n code: 429,\n message: \"Too many API requests from this IP, please try again later.\",\n },\n })\n\n this.app.use(logger(\"dev\"))\n this.app.use(bodyParser.urlencoded({ extended: true }))\n this.app.use(bodyParser.json())\n this.app.use(express.json())\n this.app.use(express.urlencoded({ extended: false }))\n this.app.use(cookieParser())\n\n this.app.use(express.static(path.join(__dirname, \"public\"), {\n setHeaders: (res, path) => {\n if (path.endsWith(\".html\") || path.endsWith(\".css\") || path.endsWith(\".js\")) {\n res.setHeader(\"Cache-Control\", \"public, max-age=3600\")\n }\n },\n }))\n\n this.app.use(generalLimiter)\n\n // Routes\n this.app.get(\"/\", (_, res) => {\n res.sendFile(path.join(__dirname, \"public/init.html\"))\n })\n\n // Health check endpoint\n this.app.get(\"/api/health\", (_, res) => {\n try {\n const healthData = {\n status: \"healthy\",\n timestamp: new Date().toISOString(),\n uptime: process.uptime(),\n memory: process.memoryUsage(),\n port: LINK_HTTP_PORT,\n electron: true,\n }\n\n res.status(200).json({\n code: 0,\n message: \"Server is healthy\",\n data: healthData,\n })\n }\n catch (e) {\n res.status(500).json({\n code: 500,\n message: \"Server health check failed\",\n data: { error: e.message },\n })\n }\n })\n\n this.app.use(\"/api/lnd\", apiLimiter, lndRouter)\n\n this.app.get(\"/api/debug/heap-snapshot\", (req, res) => {\n const v8 = require(\"node:v8\")\n const fileName = `${this.options.dataPath}/.link/heap-${Date.now()}.heapsnapshot`\n const snapshotPath = v8.writeHeapSnapshot(fileName)\n res.send(`Heap snapshot saved to ${snapshotPath}`)\n })\n\n // Error handling\n this.app.use((_req, _res, next) => {\n next(createError(404))\n })\n\n this.app.use((err, req, res) => {\n res.locals.message = err.message\n res.locals.error = req.app.get(\"env\") === \"development\" ? err : {}\n res.status(err.status || 500)\n res.json({ error: err.message })\n })\n\n this.app.set(\"port\", LINK_HTTP_PORT)\n\n // Create HTTP server\n this.server = http.createServer(this.app)\n\n // Start server\n await new Promise((resolve, reject) => {\n this.server.listen(LINK_HTTP_PORT, (error) => {\n if (error) {\n reject(error)\n }\n else {\n resolve()\n }\n })\n\n this.server.on(\"error\", (error) => {\n this.emit(\"error\", error)\n reject(error)\n })\n })\n\n // Ensure environment and Prisma are properly set up before business logic\n this._ensureEnvironmentAndPrisma()\n\n // Initialize LN-Link business logic\n await init()\n\n this.isRunning = true\n this.emit(\"started\", { port: LINK_HTTP_PORT })\n\n return { success: true, port: LINK_HTTP_PORT }\n }\n catch (error) {\n this.emit(\"error\", error)\n throw error\n }\n }\n\n /**\n * Stop LN-Link services\n */\n async stop() {\n try {\n if (this.server) {\n await new Promise((resolve) => {\n this.server.close(() => {\n resolve()\n })\n })\n this.server = null\n }\n\n // Run cleanup functions\n for (const cleanup of this.cleanupFunctions) {\n if (typeof cleanup === \"function\") {\n await cleanup()\n }\n }\n\n this.isRunning = false\n this.emit(\"stopped\")\n\n return { success: true }\n }\n catch (error) {\n this.emit(\"error\", error)\n throw error\n }\n }\n\n /**\n * Add cleanup function\n * @param {Function} fn - Cleanup function\n */\n addCleanupFunction(fn) {\n this.cleanupFunctions.push(fn)\n }\n\n /**\n * Get current status\n */\n getStatus() {\n return {\n initialized: this.isInitialized,\n running: this.isRunning,\n options: this.options,\n port: this.isRunning ? this.options.httpPort : null,\n }\n }\n\n /**\n * Get configuration\n */\n getConfig() {\n const { getConfig } = require(\"./business/common/getConfig.js\")\n return getConfig()\n }\n\n /**\n * Get Express app instance (for advanced usage)\n */\n getApp() {\n return this.app\n }\n\n /**\n * Get HTTP server instance (for advanced usage)\n */\n getServer() {\n return this.server\n }\n}\n\n// Export for CommonJS\nmodule.exports = LnLink\n\n// Export for ES modules\nmodule.exports.default = LnLink\n"],
5
+ "mappings": "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",
6
+ "names": ["exports", "module", "exports", "module", "fs", "path", "exports", "module", "logger", "exports", "module", "exports", "module", "Buffer", "buffer", "key", "exports", "module", "exports", "module", "exports", "module", "exports", "module", "exports", "module", "exports", "module", "exports", "module", "exports", "module", "exports", "module", "logger", "exports", "module", "exports", "module", "exports", "module", "exports", "module", "exports", "module", "fs", "port", "initConfig", "getConfig", "exports", "module", "exports", "module", "Buffer", "fs", "exports", "module", "exports", "module", "require_utils", "exports", "module", "exports", "module", "exports", "module", "fs", "path", "exports", "module", "exports", "module", "exports", "module", "trackPayments", "exports", "module", "exports", "module", "exports", "module", "exports", "module", "getConfig", "logger", "require_client", "exports", "module", "fs", "path", "getConfig", "exports", "module", "exports", "module", "exports", "module", "exports", "module", "exports", "module", "require_instance", "exports", "module", "getConfig", "require_client", "exports", "module", "fs", "path", "exports", "module", "exports", "module", "exports", "module", "require_instance", "exports", "module", "fs", "getConfig", "exports", "module", "Buffer", "fs", "getConfig", "logger", "exports", "module", "getConfig", "exports", "module", "getConfig", "logger", "require_config", "exports", "module", "getConfig", "exports", "module", "logger", "process", "require_client", "exports", "module", "getConfig", "exports", "module", "getConfig", "exports", "module", "logger", "exports", "module", "getConfig", "logger", "exports", "module", "getConfig", "initConfig", "exports", "module", "EventEmitter", "exports", "module", "express", "getConfig", "initConfig", "exports", "module", "Buffer", "exports", "module", "exports", "module", "logger", "exports", "module", "logger", "exports", "module", "exports", "module", "Buffer", "fs", "path", "getConfig", "logger", "data", "exports", "module", "Buffer", "getConfig", "logger", "require_constants", "exports", "module", "require_instance", "exports", "module", "exports", "module", "logger", "exports", "module", "Buffer", "getConfig", "logger", "exports", "module", "exports", "module", "getConfig", "logger", "exports", "module", "Buffer", "getConfig", "logger", "exports", "module", "getConfig", "logger", "exports", "module", "getConfig", "peer", "logger", "exports", "module", "getConfig", "logger", "filter", "exports", "module", "exports", "module", "exports", "module", "getConfig", "logger", "relays", "exports", "module", "exports", "module", "logger", "exports", "module", "logger", "exports", "module", "logger", "exports", "module", "getConfig", "logger", "exports", "module", "getConfig", "logger", "exports", "module", "logger", "exports", "module", "getConfig", "logger", "exports", "module", "getConfig", "exports", "module", "logger", "filter", "updateData", "confirmed", "exports", "module", "logger", "exports", "module", "logger", "exports", "module", "logger", "require_connectPeer", "exports", "module", "getConfig", "logger", "require_pollBtcTransfers", "exports", "module", "logger", "filter", "updateData", "confirmed", "exports", "module", "logger", "exports", "module", "logger", "exports", "module", "logger", "exports", "module", "logger", "exports", "module", "logger", "exports", "module", "logger", "Logger", "linkCache", "exports", "module", "EventEmitter", "exports", "module", "exports", "module", "logger", "exports", "module", "EventEmitter", "logger", "fs", "WALLET_STATE_CODE", "exports", "module", "EventEmitter", "logger", "exports", "module", "exports", "module", "EventEmitter", "exports", "module", "logger", "exports", "module", "logger", "gracefulShutdown", "exports", "module", "getConfig", "logger", "exports", "module", "getConfig", "logger", "exports", "module", "exports", "module", "exports", "module", "exports", "module", "fs", "getConfig", "initConfig", "logger", "exports", "module", "getConfig", "init", "path", "getConfig"]
7
+ }