-
-
Notifications
You must be signed in to change notification settings - Fork 12
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
4 changed files
with
19 additions
and
168 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,144 +1,27 @@ | ||
|
||
import { LoadTestSettingsFromEnv, TestSettings } from "../services/main/settings.js" | ||
import { LoadTestSettingsFromEnv } from "../services/main/settings.js" | ||
import { BitcoinCoreWrapper } from "./bitcoinCore.js" | ||
import LND from '../services/lnd/lnd.js' | ||
import { AddressType } from '../../proto/autogenerated/ts/types.js'; | ||
import { BitcoinCoreWrapper } from "./bitcoinCore.js"; | ||
// dave <--> alice <--> carol <--> bob | ||
type LndInstances = { alice: LND; bob: LND; carol: LND; dave: LND; } | ||
type Addresses = { alice: string, bob: string, carol: string, dave: string } | ||
type InstanceInfo = { pubkey: string; host: string; } | ||
type InstancesInfo = { alice: InstanceInfo; bob: InstanceInfo; carol: InstanceInfo; dave: InstanceInfo; } | ||
export const setupNetwork = async () => { | ||
|
||
const settings = LoadTestSettingsFromEnv() | ||
const core = new BitcoinCoreWrapper(settings) | ||
await core.Init() | ||
const instances = await initLndInstances(settings) | ||
const { alice, bob, carol, dave } = instances | ||
const connectInfo = await getConnectInfo(instances) | ||
await bob.ConnectPeer(connectInfo.carol) | ||
await carol.ConnectPeer(connectInfo.alice) | ||
await alice.ConnectPeer(connectInfo.dave) | ||
console.log("done connecting peer, sending coins") | ||
|
||
const addresses = await getAddresses(instances) | ||
await sendCoinsToAddresses(core, addresses) | ||
console.log("done sending coins, opening channels") | ||
|
||
await openChannels(core, instances, connectInfo, addresses) | ||
console.log("done opening channels, sending balancing payment") | ||
console.log(await getAllBalances(instances)) | ||
await sendBalancingPayment(instances) | ||
stopAllInstances(instances) | ||
console.log("network setup complete, starting tests") | ||
} | ||
|
||
const sendBalancingPayment = async (instances: LndInstances) => { | ||
const invoice = await instances.dave.NewInvoice(50_000, "balancing_payment", 3600) | ||
const payment = await instances.carol.PayInvoice(invoice.payRequest, 0, 50_000) | ||
console.log({ payment }) | ||
} | ||
|
||
const openChannels = async (core: BitcoinCoreWrapper, instances: LndInstances, info: InstancesInfo, addresses: Addresses) => { | ||
await openChannel(instances.bob, info.carol.pubkey, addresses.bob) | ||
await openChannel(instances.carol, info.alice.pubkey, addresses.carol) | ||
await openChannel(instances.alice, info.dave.pubkey, addresses.alice) | ||
await slowMine(core, 6) | ||
|
||
} | ||
|
||
const openChannel = async (instance: LND, to: string, closeAddr: string) => { | ||
await core.InitAddress() | ||
await core.Mine(1) | ||
const lnd = new LND(settings.lndSettings, () => { }, () => { }, () => { }, () => { }) | ||
for (let i = 0; i < 10; i++) { | ||
try { | ||
await instance.OpenChannel(to, closeAddr, 10_000_000, 0) | ||
console.log("success opening channel") | ||
const info = await lnd.GetInfo() | ||
if (!info.syncedToChain) { | ||
throw new Error("not synced to chain") | ||
} | ||
if (!info.syncedToGraph) { | ||
throw new Error("not synced to graph") | ||
} | ||
return | ||
} catch (e) { | ||
await new Promise((resolve) => setTimeout(resolve, 1000)) | ||
console.log("error opening channel", e) | ||
console.log("waiting for lnd to be ready") | ||
await new Promise(resolve => setTimeout(resolve, 1000)) | ||
} | ||
} | ||
throw new Error("could not open channel after 10 tries") | ||
} | ||
|
||
const sendCoinsToAddresses = async (core: BitcoinCoreWrapper, addresses: Addresses) => { | ||
await core.SendToAddress(addresses.alice, 10) | ||
await core.SendToAddress(addresses.bob, 10) | ||
await core.SendToAddress(addresses.carol, 10) | ||
await core.SendToAddress(addresses.dave, 10) | ||
await core.Mine(6) | ||
} | ||
|
||
const slowMine = async (core: BitcoinCoreWrapper, blocks: number) => { | ||
for (let i = 0; i < blocks; i++) { | ||
await core.Mine(1) | ||
await new Promise((resolve) => setTimeout(resolve, 500)) | ||
} | ||
} | ||
|
||
const getAddresses = async (instances: LndInstances): Promise<Addresses> => { | ||
const alice = (await instances.alice.NewAddress(AddressType.WITNESS_PUBKEY_HASH)).address | ||
const bob = (await instances.bob.NewAddress(AddressType.WITNESS_PUBKEY_HASH)).address | ||
const carol = (await instances.carol.NewAddress(AddressType.WITNESS_PUBKEY_HASH)).address | ||
const dave = (await instances.dave.NewAddress(AddressType.WITNESS_PUBKEY_HASH)).address | ||
return { alice, bob, carol, dave } | ||
} | ||
|
||
const getAllInfo = async (instances: LndInstances) => { | ||
const aliceInfo = await instances.alice.GetInfo() | ||
const bobInfo = await instances.bob.GetInfo() | ||
const carolInfo = await instances.carol.GetInfo() | ||
const daveInfo = await instances.dave.GetInfo() | ||
return { aliceInfo, bobInfo, carolInfo, daveInfo } | ||
|
||
} | ||
|
||
const getAllBalances = async (instances: LndInstances) => { | ||
const aliceBal = await instances.alice.GetBalance() | ||
const bobBal = await instances.bob.GetBalance() | ||
const carolBal = await instances.carol.GetBalance() | ||
const daveBal = await instances.dave.GetBalance() | ||
return { aliceBal, bobBal, carolBal, daveBal } | ||
|
||
} | ||
|
||
const getConnectInfo = async (instances: LndInstances) => { | ||
const { aliceInfo, bobInfo, carolInfo, daveInfo } = await getAllInfo(instances) | ||
const [alicePub, aliceHost] = aliceInfo.uris[0].split('@') | ||
const alice = { pubkey: alicePub, host: aliceHost } | ||
|
||
const [bobPub, bobHost] = bobInfo.uris[0].split('@') | ||
const bob = { pubkey: bobPub, host: bobHost } | ||
|
||
const [carolPub, carolHost] = carolInfo.uris[0].split('@') | ||
const carol = { pubkey: carolPub, host: carolHost } | ||
|
||
const [davePub, daveHost] = daveInfo.uris[0].split('@') | ||
const dave = { pubkey: davePub, host: daveHost } | ||
|
||
return { alice, bob, carol, dave } | ||
} | ||
|
||
const initLndInstances = async (settings: TestSettings): Promise<LndInstances> => { | ||
const alice = new LND(settings.lndSettings, console.log, console.log, () => { }, () => { }) | ||
await alice.Warmup() | ||
|
||
const bobSettings = { ...settings.lndSettings, mainNode: settings.lndSettings.otherNode } | ||
const bob = new LND(bobSettings, console.log, console.log, () => { }, () => { }) | ||
await bob.Warmup() | ||
|
||
const carolSettings = { ...settings.lndSettings, mainNode: settings.lndSettings.thirdNode } | ||
const carol = new LND(carolSettings, console.log, console.log, () => { }, () => { }) | ||
await carol.Warmup() | ||
|
||
const daveSettings = { ...settings.lndSettings, mainNode: settings.lndSettings.fourthNode } | ||
const dave = new LND(daveSettings, console.log, console.log, () => { }, () => { }) | ||
await dave.Warmup() | ||
return { alice, bob, carol, dave } | ||
} | ||
|
||
const stopAllInstances = (instances: LndInstances) => { | ||
instances.alice.Stop() | ||
instances.bob.Stop() | ||
instances.carol.Stop() | ||
instances.dave.Stop() | ||
} | ||
throw new Error("lnd is not ready after 10 seconds") | ||
} |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters