UNPKG

ln-service

Version:

Interaction helper for your Lightning Network daemon

102 lines (91 loc) 2.87 kB
const asyncAuto = require('async/auto'); const asyncRetry = require('async/retry'); const {returnResult} = require('asyncjs-util'); const {addPeer} = require('./../../'); const {openChannel} = require('./../../'); const {getChainBalance} = require('./../../'); const waitForChannel = require('./wait_for_channel'); const waitForPendingChannel = require('./wait_for_pending_channel'); const channelCapacityTokens = 1e6; const confCount = 6; const count = 100; const defaultFee = 1e3; const interval = 100; const times = 1500; /** Setup channel { [capacity]: <Channel Capacity Tokens Number> generate: <Generate Blocks Promise> [generator]: <Generator Node Object> [give]: <Gift Tokens Number> [hidden]: <Channel Is Private Bool> lnd: <Authenticated LND gRPC API Object> [partner_csv_delay]: <Partner CSV Delay Number> to: { public_key: <Partner Public Key Hex String> socket: <Network Address String> } } @returns via cbk or Promise { id: <Standard Format Channel Id String> transaction_id: <Funding Transaction Id Hex String> transaction_vout: <Funding Transaction Output Index Number> } */ module.exports = (args, cbk) => { return new Promise((resolve, reject) => { return asyncAuto({ // Make sure the node is connected addPeer: cbk => { return addPeer({ lnd: args.lnd, public_key: args.to.id || args.to.public_key, socket: args.to.socket, }, cbk); }, // Make sure the node has funds generateFunds: async () => await args.generate({count}), // Open channel chanOpen: cbk => { return asyncRetry({interval, times}, cbk => { return openChannel({ chain_fee_tokens_per_vbyte: defaultFee, give_tokens: args.give, is_private: !!args.hidden, lnd: args.lnd, local_tokens: args.capacity || channelCapacityTokens, partner_csv_delay: args.partner_csv_delay, partner_public_key: args.to.public_key || args.to.id, socket: args.to.socket, }, cbk); }, cbk); }, // Wait for pending waitPending: ['chanOpen', ({chanOpen}, cbk) => { return waitForPendingChannel({ id: chanOpen.transaction_id, lnd: args.lnd, }, cbk); }], // Generate blocks generate: ['waitPending', async ({}) => { return await args.generate({count: confCount, node: args.generator}); }], // Wait for open channel: ['chanOpen', ({chanOpen}, cbk) => { return waitForChannel({ hidden: args.hidden, id: chanOpen.transaction_id, lnd: args.lnd, }, cbk); }], }, returnResult({reject, resolve, of: 'channel'}, cbk)); }); };