@argonprotocol/testing 1.3.6 → 1.3.8
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.
- package/lib/docker-compose.yml +467 -0
- package/lib/index.cjs +56 -18
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +9 -1
- package/lib/index.d.ts +9 -1
- package/lib/index.js +76 -39
- package/lib/index.js.map +1 -1
- package/package.json +10 -9
package/lib/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/TestNotary.ts","../src/TestMainchain.ts","../src/TestBitcoinCli.ts","../src/TestOracle.ts"],"sourcesContent":["import { ArgonClient, Keyring, KeyringPair, TxSubmitter } from '@argonprotocol/mainchain';\nimport { describe, SuiteAPI } from 'vitest';\nimport * as process from 'node:process';\nimport HttpProxy from 'http-proxy';\nimport * as child_process from 'node:child_process';\nimport * as http from 'node:http';\nimport * as url from 'node:url';\nimport * as net from 'node:net';\nimport * as Path from 'node:path';\nimport TestNotary from './TestNotary';\nimport TestMainchain from './TestMainchain';\nimport TestBitcoinCli from './TestBitcoinCli';\nimport TestOracle from './TestOracle';\nimport * as util from 'node:util';\n\nexport { TestNotary, TestMainchain, TestBitcoinCli, TestOracle };\n\nexport interface ITeardownable {\n teardown(): Promise<void>;\n}\n\nconst toTeardown: ITeardownable[] = [];\n\nlet proxy: HttpProxy | null = null;\nlet proxyServer: http.Server | null = null;\nexport let describeIntegration: SuiteAPI = describe;\n\nif (process.env.SKIP_E2E === 'true' || process.env.SKIP_E2E === '1') {\n describeIntegration = describe.skip as any;\n}\n\nexport async function getProxy() {\n if (!proxy) {\n proxy = HttpProxy.createProxyServer({\n changeOrigin: true,\n ws: true,\n autoRewrite: true,\n });\n proxy.on('error', () => null);\n proxyServer = http.createServer(function (req, res) {\n //parse query string and get targetUrl\n const queryData = url.parse(req.url!, true).query;\n if (!queryData.target) {\n res.writeHead(500, { 'Content-Type': 'text/plain' });\n res.end('Target parameter is required');\n return;\n }\n console.log('Proxying http request', queryData.target);\n proxy?.web(req, res, { target: queryData.target as string });\n });\n proxyServer.on('upgrade', function (req, clientSocket, head) {\n const queryData = url.parse(req.url!, true).query;\n const target = url.parse(queryData.target as string);\n proxy?.ws(req, clientSocket, head, {\n target: target.href,\n ws: true,\n });\n clientSocket.on('error', console.error);\n });\n await new Promise<void>(resolve => proxyServer!.listen(0, resolve));\n toTeardown.push({\n teardown: () =>\n new Promise<void>(resolve => {\n proxy?.close();\n proxyServer?.close(_ => null);\n proxy = null;\n proxyServer = null;\n resolve();\n }),\n });\n }\n const port = (proxyServer!.address() as net.AddressInfo).port;\n return `ws://host.docker.internal:${port}`;\n}\n\nexport function stringifyExt(obj: any): any {\n return JSON.stringify(\n obj,\n (_key, value) => {\n if (typeof value === 'bigint') {\n return value.toString() + 'n'; // Append 'n' to indicate bigint\n }\n if (Buffer.isBuffer(value) || value instanceof Uint8Array) {\n return `0x${Buffer.from(value).toString('hex')}`; // Convert Buffer to hex string\n }\n return value;\n },\n 2,\n );\n}\n\nexport function projectRoot() {\n if (process.env.ARGON_PROJECT_ROOT) {\n return Path.join(process.env.ARGON_PROJECT_ROOT);\n }\n return Path.join(__dirname, `../../..`);\n}\n\n/**\n * Run a script from the project \"scripts\" folder\n * @param relativePath\n */\nexport async function runTestScript(relativePath: string): Promise<string> {\n const scriptPath = Path.resolve(projectRoot(), relativePath);\n return child_process.execSync(scriptPath, { encoding: 'utf8' }).trim();\n}\n\nexport async function getDockerPortMapping(\n containerName: string,\n port: number,\n): Promise<string | undefined> {\n return child_process\n .execSync(`docker port ${containerName} ${port}`, { encoding: 'utf8' })\n .trim()\n .split(':')\n .pop();\n}\n\nexport async function teardown() {\n for (const t of toTeardown) {\n try {\n await t.teardown().catch(console.error);\n } catch {}\n }\n toTeardown.length = 0;\n}\n\nexport function cleanHostForDocker(host: string, replacer = 'host.docker.internal'): string {\n if (process.env.ARGON_USE_DOCKER_BINS) {\n return host\n .replace('localhost', replacer)\n .replace('127.0.0.1', replacer)\n .replace('0.0.0.0', replacer);\n }\n return host;\n}\n\nexport function addTeardown(teardownable: ITeardownable) {\n toTeardown.push(teardownable);\n}\n\nexport function runOnTeardown(teardown: () => Promise<void>) {\n addTeardown({ teardown });\n}\n\nexport function closeOnTeardown<T extends { close(): Promise<void> }>(closeable: T): T {\n addTeardown({ teardown: () => closeable.close() });\n return closeable;\n}\n\nexport function disconnectOnTeardown<T extends { disconnect(): Promise<void> }>(closeable: T): T {\n addTeardown({ teardown: () => closeable.disconnect() });\n return closeable;\n}\n\nexport function sudo(): KeyringPair {\n return new Keyring({ type: 'sr25519' }).createFromUri('//Alice');\n}\n\nexport async function activateNotary(sudo: KeyringPair, client: ArgonClient, notary: TestNotary) {\n await notary.register(client);\n await new TxSubmitter(\n client,\n client.tx.sudo.sudo(client.tx.notaries.activate(notary.operator!.publicKey)),\n sudo,\n ).submit({ waitForBlock: true });\n}\n","import { customAlphabet } from 'nanoid';\nimport pg from 'pg';\nimport type { Client } from 'pg';\nimport * as child_process from 'node:child_process';\nimport { ArgonClient, Keyring, KeyringPair, TxSubmitter } from '@argonprotocol/mainchain';\nimport * as fs from 'node:fs';\nimport * as readline from 'node:readline';\nimport {\n addTeardown,\n cleanHostForDocker,\n getDockerPortMapping,\n getProxy,\n ITeardownable,\n projectRoot,\n} from './index';\nimport * as process from 'node:process';\nimport { Readable } from 'node:stream';\nimport * as Path from 'node:path';\n\nconst { Client: PgClient } = pg;\n\nconst nanoid = customAlphabet('0123456789abcdefghijklmnopqrstuvwxyz', 4);\n\nexport function createUid(): string {\n return nanoid();\n}\n\nexport default class TestNotary implements ITeardownable {\n public operator?: KeyringPair;\n public ip = '127.0.0.1';\n public registeredPublicKey?: Uint8Array;\n public port?: string;\n public containerName?: string;\n public proxy?: string;\n #dbName?: string;\n #dbConnectionString: string;\n #childProcess?: child_process.ChildProcessByStdio<null, Readable, Readable>;\n #stdioInterface?: readline.Interface;\n\n public get address(): string {\n if (this.proxy) {\n const url = new URL(this.proxy);\n url.searchParams.set('target', `ws://${this.ip}:${this.port}`);\n return url.href;\n }\n return `ws://${this.ip}:${this.port}`;\n }\n\n constructor(dbConnectionString?: string) {\n this.#dbConnectionString =\n dbConnectionString ??\n process.env.NOTARY_DB_URL ??\n 'postgres://postgres:postgres@localhost:5432';\n addTeardown(this);\n }\n\n /**\n * Returns the localhost address of the notary (NOTE: not accessible from containers)\n */\n public async start(options: {\n mainchainUrl: string;\n uuid: string;\n pathToNotaryBin?: string;\n }): Promise<string> {\n const { pathToNotaryBin, uuid, mainchainUrl } = options;\n this.operator = new Keyring({ type: 'sr25519' }).createFromUri('//Bob');\n this.registeredPublicKey = new Keyring({ type: 'ed25519' }).createFromUri(\n '//Ferdie//notary',\n ).publicKey;\n\n let notaryPath = pathToNotaryBin ?? Path.join(projectRoot(), 'target/debug/argon-notary');\n if (process.env.ARGON_USE_DOCKER_BINS) {\n this.containerName = 'notary_' + uuid;\n const addHost = process.env.ADD_DOCKER_HOST\n ? ` --add-host=host.docker.internal:host-gateway`\n : '';\n\n notaryPath = `docker run --rm -p=0:9925${addHost} --name=${this.containerName} -e RUST_LOG=warn ghcr.io/argonprotocol/argon-notary:dev`;\n\n this.#dbConnectionString = cleanHostForDocker(this.#dbConnectionString);\n } else if (!fs.existsSync(notaryPath)) {\n throw new Error(`Notary binary not found at ${notaryPath}`);\n }\n\n const client = await this.connect();\n let dbName = '';\n try {\n let tries = 10;\n while (tries > 0) {\n dbName = `notary_${uuid}`;\n // check if the db path notary_{id} exists\n const result = await client.query('SELECT 1 FROM pg_database WHERE datname = $1', [dbName]);\n if (result.rowCount === 0) {\n break;\n }\n tries -= 1;\n }\n this.#dbName = dbName;\n await client.query(`CREATE DATABASE \"${dbName}\"`);\n } finally {\n await client.end();\n }\n\n let result = child_process.execSync(\n `${notaryPath} migrate --db-url ${this.#dbConnectionString}/${this.#dbName}`,\n {\n encoding: 'utf-8',\n },\n );\n if (result.trim().length) {\n console.log(result.trim());\n }\n console.log(\n \"Notary >> connecting to mainchain '%s', db %s\",\n mainchainUrl,\n `${this.#dbConnectionString}/${this.#dbName}`,\n );\n\n const bucketName = `notary-${uuid}`;\n const execArgs = [\n 'run',\n `--db-url=${this.#dbConnectionString}/${this.#dbName}`,\n `--dev`,\n `-t ${mainchainUrl}`,\n `--archive-bucket=${bucketName}`,\n `--operator-address=${this.operator.address}`,\n ];\n if (process.env.ARGON_USE_DOCKER_BINS) {\n process.env.AWS_S3_ENDPOINT = 'http://host.docker.internal:9000';\n execArgs.unshift(...notaryPath.replace('docker run', 'run').split(' '));\n execArgs.push('-b=0.0.0.0:9925');\n\n notaryPath = 'docker';\n }\n if (process.env.AWS_S3_ENDPOINT) {\n execArgs.push(`--archive-endpoint=${process.env.AWS_S3_ENDPOINT}`);\n }\n this.#childProcess = child_process.spawn(notaryPath, execArgs, {\n stdio: ['ignore', 'pipe', 'pipe'],\n env: { ...process.env, RUST_LOG: 'warn' },\n });\n this.#childProcess.stdout.setEncoding('utf8');\n this.#childProcess.stderr.setEncoding('utf8');\n this.port = await new Promise<string>((resolve, reject) => {\n const onProcessError = (err: Error): void => {\n console.warn('Error running notary', err);\n reject(err);\n };\n this.#childProcess!.once('error', onProcessError);\n this.#childProcess!.stderr.on('data', data => {\n console.warn('Notary >> %s', data);\n if (data.startsWith('WARNING')) return;\n this.#childProcess!.off('error', onProcessError);\n reject(data);\n });\n this.#stdioInterface = readline\n .createInterface({ input: this.#childProcess!.stdout })\n .on('line', line => {\n console.log('Notary >> %s', line);\n let match = line.match(/Listening on ([ws:/\\d.]+)/);\n if (match?.length ?? 0 > 0) {\n resolve(match![1].split(':').pop()!);\n }\n });\n });\n this.#childProcess.on('error', err => {\n throw err;\n });\n if (this.containerName) {\n this.port = await getDockerPortMapping(this.containerName, 9925);\n this.proxy = cleanHostForDocker(await getProxy());\n }\n\n return this.address;\n }\n\n public async register(client: ArgonClient): Promise<void> {\n let address = new URL(this.address);\n await new TxSubmitter(\n client,\n client.tx.notaries.propose({\n public: this.registeredPublicKey,\n hosts: [address.href],\n name: 'Test Notary',\n }),\n this.operator!,\n ).submit({ waitForBlock: true });\n }\n\n public async teardown(): Promise<void> {\n this.#childProcess?.kill();\n this.#stdioInterface?.close();\n const client = await this.connect();\n try {\n await client.query(`DROP DATABASE \"${this.#dbName}\" WITH (FORCE)`);\n } finally {\n await client.end();\n }\n if (this.containerName) {\n try {\n child_process.execSync(`docker rm -f ${this.containerName}`);\n } catch {}\n }\n }\n\n async connect(): Promise<Client> {\n const client = new PgClient({ connectionString: this.#dbConnectionString });\n try {\n await client.connect();\n } catch (err) {\n console.error('ERROR connecting to postgres client', err);\n throw err;\n }\n return client;\n }\n}\n","import * as fs from 'node:fs';\nimport { ChildProcess, execSync, spawn } from 'node:child_process';\nimport * as Path from 'node:path';\nimport * as readline from 'node:readline';\nimport {\n addTeardown,\n cleanHostForDocker,\n disconnectOnTeardown,\n getDockerPortMapping,\n getProxy,\n ITeardownable,\n projectRoot,\n} from './index';\nimport { detectPort } from 'detect-port';\nimport { customAlphabet } from 'nanoid';\nimport Client from 'bitcoin-core';\nimport * as lockfile from 'proper-lockfile';\nimport { createUid } from './TestNotary';\nimport { type ArgonClient, getClient } from '@argonprotocol/mainchain';\n\nconst nanoid = customAlphabet('0123456789abcdefghijklmnopqrstuvwxyz', 4);\n\nconst lockPath = Path.join(process.cwd(), '.port-lock');\n\nexport default class TestMainchain implements ITeardownable {\n public ip = '127.0.0.1';\n public port?: string;\n public loglevel = 'warn';\n public uuid: string;\n #binPath: string;\n #process?: ChildProcess;\n #interfaces: readline.Interface[] = [];\n containerName?: string;\n proxy?: string;\n #bitcoind?: ChildProcess;\n bitcoinPort?: number;\n #bitcoinDir?: string;\n\n public get address(): string {\n if (this.proxy) {\n const url = new URL(this.proxy);\n url.searchParams.set('target', `ws://${this.ip}:${this.port}`);\n return url.href;\n }\n return `ws://${this.ip}:${this.port}`;\n }\n\n constructor(binPath?: string) {\n this.#binPath = binPath ?? Path.join(projectRoot(), `target/debug/argon-node`);\n this.#binPath = Path.resolve(this.#binPath);\n if (!process.env.ARGON_USE_DOCKER_BINS && !fs.existsSync(this.#binPath)) {\n throw new Error(`Mainchain binary not found at ${this.#binPath}`);\n }\n this.uuid = createUid();\n addTeardown(this);\n }\n\n public getBitcoinClient(): Client {\n return new Client({\n username: 'bitcoin',\n password: 'bitcoin',\n host: `http://localhost:${this.bitcoinPort}`,\n });\n }\n\n /**\n * Launch and return the localhost url. NOTE: this url will not work cross-docker. You need to use the containerAddress property\n * @param options\n * @param options.miningThreads - number of threads to use for mining\n * @param options.bootnodes - bootnodes to use for the mainchain\n */\n public async launch(options?: {\n miningThreads?: number;\n bootnodes?: string;\n author?: string;\n launchBitcoin?: boolean;\n }): Promise<string> {\n const { miningThreads = 1, bootnodes, author = 'alice', launchBitcoin = false } = options ?? {};\n let port = 0;\n let rpcPort = 0;\n let execArgs: string[] = [];\n let containerName: string;\n if (process.env.ARGON_USE_DOCKER_BINS) {\n containerName = 'miner_' + nanoid();\n this.containerName = containerName;\n this.#binPath = 'docker';\n port = 33344;\n rpcPort = 9944;\n execArgs = [\n 'run',\n '--rm',\n `--name=${containerName}`,\n `-p=0:${port}`,\n `-p=0:${rpcPort}`,\n '-e',\n `RUST_LOG=${this.loglevel},sc_rpc_server=info`,\n 'ghcr.io/argonprotocol/argon-miner:dev',\n ];\n\n if (process.env.ADD_DOCKER_HOST) {\n execArgs.splice(2, 0, `--add-host=host.docker.internal:host-gateway`);\n }\n }\n\n const bitcoinRpcUrl = await this.startBitcoin(launchBitcoin);\n execArgs.push(\n '--dev',\n '--validator',\n `--${author}`,\n `--compute-miners=${miningThreads}`,\n `--port=${port}`,\n `--rpc-port=${rpcPort}`,\n '--rpc-external',\n '--no-mdns',\n '--no-telemetry',\n '--no-prometheus',\n '--unsafe-rpc-external',\n '--rpc-methods=unsafe',\n `--bitcoin-rpc-url=${bitcoinRpcUrl}`,\n `--notebook-archive-hosts=http://127.0.0.1:9000/${this.uuid}`,\n );\n if (bootnodes) {\n execArgs.push(`--bootnodes=${bootnodes}`);\n }\n this.#process = spawn(this.#binPath, execArgs, {\n stdio: ['ignore', 'pipe', 'pipe', 'ignore'],\n env: { ...process.env, RUST_LOG: `${this.loglevel},sc_rpc_server=info` },\n });\n\n this.#process.stderr!.setEncoding('utf8');\n this.#process.stdout!.setEncoding('utf8');\n this.#process.stdout!.on('data', data => {\n console.log('Main >> %s', data);\n });\n\n const int1 = readline.createInterface({ input: this.#process.stdout! }).on('line', line => {\n if (line) console.log('Main >> %s', line);\n });\n this.#interfaces.push(int1);\n\n this.port = await new Promise<string>((resolve, reject) => {\n this.#process!.on('error', err => {\n console.warn('Error running mainchain', err);\n reject(err);\n });\n\n const int2 = readline.createInterface({ input: this.#process!.stderr! }).on('line', line => {\n console.log('Main >> %s', line);\n let match = line.match(/Running JSON-RPC server: addr=([\\d.:]+)/);\n if (match) {\n let ipv4 = match[1].split(',').at(0);\n resolve(ipv4!.split(':').pop()!);\n }\n });\n this.#interfaces.push(int2);\n });\n if (this.containerName) {\n this.port = await getDockerPortMapping(this.containerName, rpcPort);\n this.proxy = cleanHostForDocker(await getProxy());\n }\n\n console.log(`argon Node listening at ${this.address}`);\n return this.address;\n }\n\n public async client(): Promise<ArgonClient> {\n const client = await getClient(this.address);\n disconnectOnTeardown(client);\n return client;\n }\n\n public async bootAddress(): Promise<string | undefined> {\n const client = await this.client();\n const bootAddress = await client.rpc.system.localListenAddresses();\n\n for (const address of bootAddress) {\n const addr = address.toString();\n if (addr.includes('127.0.0.1')) {\n return addr;\n }\n }\n return undefined;\n }\n\n public async teardown(): Promise<void> {\n if (process.env.ARGON_USE_DOCKER_BINS) {\n try {\n execSync(`docker rm -f ${this.containerName}`);\n } catch {}\n }\n const launchedProcess = this.#process;\n if (launchedProcess) {\n launchedProcess?.kill();\n try {\n launchedProcess.stdio.forEach(io => io?.destroy());\n } catch {}\n launchedProcess.unref();\n }\n\n this.#process?.kill();\n this.#process?.unref();\n this.#bitcoind?.kill();\n this.#bitcoind?.unref();\n if (this.#bitcoinDir) {\n await fs.promises.rm(this.#bitcoinDir, {\n recursive: true,\n force: true,\n });\n }\n for (const i of this.#interfaces) {\n i.close();\n }\n }\n\n private async startBitcoin(launchBitcoin: boolean): Promise<string> {\n let rpcPort = 14338;\n if (launchBitcoin) {\n // Ensure lock file exists\n fs.closeSync(fs.openSync(lockPath, 'w'));\n const release = await lockfile.lock(lockPath, { retries: 10 });\n try {\n rpcPort = await detectPort();\n const path = execSync(Path.join(projectRoot(), `target/debug/argon-testing-bitcoin`), {\n encoding: 'utf8',\n }).trim();\n\n const tmpDir = fs.mkdtempSync('/tmp/argon-bitcoin-' + this.uuid);\n\n console.log('Starting bitcoin node at %s. Data %s', path, tmpDir);\n this.#bitcoind = spawn(\n path,\n [\n '-regtest',\n '-fallbackfee=0.0001',\n '-listen=0',\n `-datadir=${tmpDir}`,\n '-blockfilterindex',\n '-txindex',\n `-rpcport=${rpcPort}`,\n '-rpcbind=0.0.0.0',\n '-rpcallowip=0.0.0.0/0',\n '-rpcuser=bitcoin',\n '-rpcpassword=bitcoin',\n ],\n {\n stdio: ['ignore', 'pipe', 'pipe'],\n },\n );\n this.#bitcoind.stderr!.setEncoding('utf8');\n this.#bitcoind.stdout!.setEncoding('utf8');\n this.#bitcoind.stdout!.on('data', data => {\n console.log('Bitcoin >> %s', data);\n });\n this.#bitcoind.stderr!.on('data', data => {\n console.error('Bitcoin >> %s', data);\n });\n this.#bitcoinDir = tmpDir;\n } finally {\n // Release the lock file\n await release();\n }\n }\n this.bitcoinPort = rpcPort;\n return cleanHostForDocker(`http://bitcoin:bitcoin@localhost:${rpcPort}`);\n }\n}\n","import * as child_process from 'node:child_process';\nimport { projectRoot } from './index';\nimport * as Path from 'node:path';\n\nexport default class TestBitcoinCli {\n /**\n * Returns the localhost address of the notary (NOTE: not accessible from containers)\n */\n public static run(command: string): string {\n const binPath = Path.join(`${projectRoot()}`, 'target/debug/argon-bitcoin-cli');\n\n try {\n return child_process\n .execSync(`${binPath} ${command}`, {\n encoding: 'utf8',\n })\n .trim();\n } catch (e) {\n console.error(`Error running command: ${command}`);\n console.error((e as any).stdout);\n throw e;\n }\n }\n}\n","import * as child_process from 'node:child_process';\nimport { Keyring, KeyringPair } from '@argonprotocol/mainchain';\nimport * as fs from 'node:fs';\nimport * as readline from 'node:readline';\nimport { addTeardown, ITeardownable, projectRoot } from './index';\nimport * as process from 'node:process';\nimport * as Path from 'node:path';\nimport { Readable } from 'node:stream';\n\nexport default class TestOracle implements ITeardownable {\n public static BitcoinOperator = '//Dave';\n public static PriceIndexOperator = '//Eve';\n public operator?: KeyringPair;\n public port?: string;\n #childProcess?: child_process.ChildProcessByStdio<null, Readable, Readable>;\n #stdioInterface?: readline.Interface;\n\n constructor() {\n addTeardown(this);\n }\n\n public async start(\n service: 'price-index' | 'bitcoin',\n options: {\n mainchainUrl: string;\n bitcoinRpcUrl?: string;\n pathToBin?: string;\n env?: Record<string, string>;\n },\n ) {\n const { pathToBin, mainchainUrl, bitcoinRpcUrl } = options;\n const operatorSuri =\n service == 'bitcoin' ? TestOracle.BitcoinOperator : TestOracle.PriceIndexOperator;\n this.operator = new Keyring({ type: 'sr25519' }).createFromUri(operatorSuri);\n const binPath = pathToBin ?? Path.join(projectRoot(), 'target/debug/argon-oracle');\n if (!fs.existsSync(binPath)) {\n throw new Error(`Oracle binary not found at ${binPath}`);\n }\n console.log(`Starting ${service} oracle`);\n\n const execArgs: string[] = ['--dev', '-t', mainchainUrl, service];\n if (service == 'bitcoin') {\n if (!bitcoinRpcUrl) {\n throw new Error('Bitcoin RPC URL is required for bitcoin oracle');\n }\n execArgs.push('--bitcoin-rpc-url', bitcoinRpcUrl);\n } else {\n execArgs.push('--simulate-prices');\n }\n this.#childProcess = child_process.spawn(binPath, execArgs, {\n stdio: ['ignore', 'pipe', 'pipe'],\n env: { ...process.env, RUST_LOG: 'info', ...options.env },\n });\n this.#childProcess.stdout.setEncoding('utf8');\n this.#childProcess.stderr.setEncoding('utf8');\n this.#childProcess!.stderr.on('data', data => {\n console.warn('%sOracle >> %s', service, data);\n });\n this.#stdioInterface = readline\n .createInterface({ input: this.#childProcess!.stdout })\n .on('line', line => {\n console.log('%sOracle >> %s', service, line);\n });\n\n this.#childProcess.on('error', err => {\n throw err;\n });\n }\n\n public async teardown(): Promise<void> {\n this.#childProcess?.kill();\n this.#stdioInterface?.close();\n }\n}\n"],"mappings":"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","names":["import_mainchain","process","child_process","Path","process","pg","url","result","resolve","fs","Path","readline","import_nanoid","import_mainchain","nanoid","url","Client","resolve","child_process","Path","child_process","import_mainchain","fs","readline","process","Path","HttpProxy","resolve","teardown","sudo"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/TestNotary.ts","../src/TestMainchain.ts","../src/TestBitcoinCli.ts","../src/TestOracle.ts","../src/TestNetwork.ts"],"sourcesContent":["import { ArgonClient, Keyring, KeyringPair, TxSubmitter } from '@argonprotocol/mainchain';\nimport { describe, SuiteAPI } from 'vitest';\nimport * as process from 'node:process';\nimport HttpProxy from 'http-proxy';\nimport * as child_process from 'node:child_process';\nimport * as http from 'node:http';\nimport * as url from 'node:url';\nimport * as net from 'node:net';\nimport * as Path from 'node:path';\nimport TestNotary from './TestNotary';\nimport TestMainchain from './TestMainchain';\nimport TestBitcoinCli from './TestBitcoinCli';\nimport TestOracle from './TestOracle';\nimport { startNetwork } from './TestNetwork';\n\nexport { TestNotary, TestMainchain, TestBitcoinCli, TestOracle, startNetwork };\n\nexport interface ITeardownable {\n teardown(): Promise<void>;\n}\n\nconst toTeardown: ITeardownable[] = [];\n\nlet proxy: HttpProxy | null = null;\nlet proxyServer: http.Server | null = null;\nexport let describeIntegration: SuiteAPI = describe;\n\nif (process.env.SKIP_E2E === 'true' || process.env.SKIP_E2E === '1') {\n describeIntegration = describe.skip as any;\n}\n\nexport async function getProxy() {\n if (!proxy) {\n proxy = HttpProxy.createProxyServer({\n changeOrigin: true,\n ws: true,\n autoRewrite: true,\n });\n proxy.on('error', () => null);\n proxyServer = http.createServer(function (req, res) {\n //parse query string and get targetUrl\n const queryData = url.parse(req.url!, true).query;\n if (!queryData.target) {\n res.writeHead(500, { 'Content-Type': 'text/plain' });\n res.end('Target parameter is required');\n return;\n }\n console.log('Proxying http request', queryData.target);\n proxy?.web(req, res, { target: queryData.target as string });\n });\n proxyServer.on('upgrade', function (req, clientSocket, head) {\n const queryData = url.parse(req.url!, true).query;\n const target = url.parse(queryData.target as string);\n proxy?.ws(req, clientSocket, head, {\n target: target.href,\n ws: true,\n });\n clientSocket.on('error', console.error);\n });\n await new Promise<void>(resolve => proxyServer!.listen(0, resolve));\n toTeardown.push({\n teardown: () =>\n new Promise<void>(resolve => {\n proxy?.close();\n proxyServer?.close(_ => null);\n proxy = null;\n proxyServer = null;\n resolve();\n }),\n });\n }\n const port = (proxyServer!.address() as net.AddressInfo).port;\n return `ws://host.docker.internal:${port}`;\n}\n\nexport function stringifyExt(obj: any): any {\n return JSON.stringify(\n obj,\n (_key, value) => {\n if (typeof value === 'bigint') {\n return value.toString() + 'n'; // Append 'n' to indicate bigint\n }\n if (Buffer.isBuffer(value) || value instanceof Uint8Array) {\n return `0x${Buffer.from(value).toString('hex')}`; // Convert Buffer to hex string\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return value;\n },\n 2,\n );\n}\n\nexport function projectRoot() {\n if (process.env.ARGON_PROJECT_ROOT) {\n return Path.join(process.env.ARGON_PROJECT_ROOT);\n }\n return Path.join(__dirname, `../../..`);\n}\n\n/**\n * Run a script from the project \"scripts\" folder\n * @param relativePath\n */\nexport async function runTestScript(relativePath: string): Promise<string> {\n const scriptPath = Path.resolve(projectRoot(), relativePath);\n return child_process.execSync(scriptPath, { encoding: 'utf8' }).trim();\n}\n\nexport async function getDockerPortMapping(\n containerName: string,\n port: number,\n): Promise<string | undefined> {\n return child_process\n .execSync(`docker port ${containerName} ${port}`, { encoding: 'utf8' })\n .trim()\n .split(':')\n .pop();\n}\n\nexport async function teardown() {\n for (const t of toTeardown) {\n try {\n await t.teardown().catch(console.error);\n } catch {}\n }\n toTeardown.length = 0;\n}\n\nexport function cleanHostForDocker(host: string, replacer = 'host.docker.internal'): string {\n if (process.env.ARGON_USE_DOCKER_BINS) {\n return host\n .replace('localhost', replacer)\n .replace('127.0.0.1', replacer)\n .replace('0.0.0.0', replacer);\n }\n return host;\n}\n\nexport function addTeardown(teardownable: ITeardownable) {\n toTeardown.push(teardownable);\n}\n\nexport function runOnTeardown(teardown: () => Promise<void>) {\n addTeardown({ teardown });\n}\n\nexport function closeOnTeardown<T extends { close(): Promise<void> }>(closeable: T): T {\n addTeardown({ teardown: () => closeable.close() });\n return closeable;\n}\n\nexport function disconnectOnTeardown<T extends { disconnect(): Promise<void> }>(closeable: T): T {\n addTeardown({ teardown: () => closeable.disconnect() });\n return closeable;\n}\n\nexport function sudo(): KeyringPair {\n return new Keyring({ type: 'sr25519' }).createFromUri('//Alice');\n}\n\nexport async function activateNotary(sudo: KeyringPair, client: ArgonClient, notary: TestNotary) {\n await notary.register(client);\n await new TxSubmitter(\n client,\n client.tx.sudo.sudo(client.tx.notaries.activate(notary.operator!.publicKey)),\n sudo,\n ).submit({ waitForBlock: true });\n}\n","import { customAlphabet } from 'nanoid';\nimport type { Client } from 'pg';\nimport pg from 'pg';\nimport * as child_process from 'node:child_process';\nimport { ArgonClient, Keyring, KeyringPair, TxSubmitter } from '@argonprotocol/mainchain';\nimport * as fs from 'node:fs';\nimport * as readline from 'node:readline';\nimport {\n addTeardown,\n cleanHostForDocker,\n getDockerPortMapping,\n getProxy,\n ITeardownable,\n projectRoot,\n} from './index';\nimport * as process from 'node:process';\nimport { Readable } from 'node:stream';\nimport * as Path from 'node:path';\n\nconst { Client: PgClient } = pg;\n\nconst nanoid = customAlphabet('0123456789abcdefghijklmnopqrstuvwxyz', 4);\n\nexport function createUid(): string {\n return nanoid();\n}\n\nexport default class TestNotary implements ITeardownable {\n public operator?: KeyringPair;\n public ip = '127.0.0.1';\n public registeredPublicKey?: Uint8Array;\n public port?: string;\n public containerName?: string;\n public proxy?: string;\n #dbName?: string;\n #dbConnectionString: string;\n #childProcess?: child_process.ChildProcessByStdio<null, Readable, Readable>;\n #stdioInterface?: readline.Interface;\n\n public get address(): string {\n if (this.proxy) {\n const url = new URL(this.proxy);\n url.searchParams.set('target', `ws://${this.ip}:${this.port}`);\n return url.href;\n }\n return `ws://${this.ip}:${this.port}`;\n }\n\n constructor(dbConnectionString?: string) {\n this.#dbConnectionString =\n dbConnectionString ??\n process.env.NOTARY_DB_URL ??\n 'postgres://postgres:postgres@localhost:5432';\n addTeardown(this);\n }\n\n /**\n * Returns the localhost address of the notary (NOTE: not accessible from containers)\n */\n public async start(options: {\n mainchainUrl: string;\n uuid: string;\n pathToNotaryBin?: string;\n }): Promise<string> {\n const { pathToNotaryBin, uuid, mainchainUrl } = options;\n this.operator = new Keyring({ type: 'sr25519' }).createFromUri('//Bob');\n this.registeredPublicKey = new Keyring({ type: 'ed25519' }).createFromUri(\n '//Ferdie//notary',\n ).publicKey;\n\n let notaryPath = pathToNotaryBin ?? Path.join(projectRoot(), 'target/debug/argon-notary');\n if (process.env.ARGON_USE_DOCKER_BINS) {\n this.containerName = 'notary_' + uuid;\n const addHost = process.env.ADD_DOCKER_HOST\n ? ` --add-host=host.docker.internal:host-gateway`\n : '';\n\n notaryPath = `docker run --rm -p=0:9925${addHost} --name=${this.containerName} -e RUST_LOG=warn ghcr.io/argonprotocol/argon-notary:dev`;\n\n this.#dbConnectionString = cleanHostForDocker(this.#dbConnectionString);\n } else if (!fs.existsSync(notaryPath)) {\n throw new Error(`Notary binary not found at ${notaryPath}`);\n }\n\n const client = await this.connect();\n let dbName = '';\n try {\n let tries = 10;\n while (tries > 0) {\n dbName = `notary_${uuid}`;\n // check if the db path notary_{id} exists\n const result = await client.query('SELECT 1 FROM pg_database WHERE datname = $1', [dbName]);\n if (result.rowCount === 0) {\n break;\n }\n tries -= 1;\n }\n this.#dbName = dbName;\n await client.query(`CREATE DATABASE \"${dbName}\"`);\n } finally {\n await client.end();\n }\n\n const result = child_process.execSync(\n `${notaryPath} migrate --db-url ${this.#dbConnectionString}/${this.#dbName}`,\n {\n encoding: 'utf-8',\n },\n );\n if (result.trim().length) {\n console.log(result.trim());\n }\n console.log(\n \"Notary >> connecting to mainchain '%s', db %s\",\n mainchainUrl,\n `${this.#dbConnectionString}/${this.#dbName}`,\n );\n\n const bucketName = `notary-${uuid}`;\n const execArgs = [\n 'run',\n `--db-url=${this.#dbConnectionString}/${this.#dbName}`,\n `--dev`,\n `-t ${mainchainUrl}`,\n `--archive-bucket=${bucketName}`,\n `--operator-address=${this.operator.address}`,\n ];\n if (process.env.ARGON_USE_DOCKER_BINS) {\n process.env.AWS_S3_ENDPOINT = 'http://host.docker.internal:9000';\n execArgs.unshift(...notaryPath.replace('docker run', 'run').split(' '));\n execArgs.push('-b=0.0.0.0:9925');\n\n notaryPath = 'docker';\n }\n if (process.env.AWS_S3_ENDPOINT) {\n execArgs.push(`--archive-endpoint=${process.env.AWS_S3_ENDPOINT}`);\n }\n this.#childProcess = child_process.spawn(notaryPath, execArgs, {\n stdio: ['ignore', 'pipe', 'pipe'],\n env: { ...process.env, RUST_LOG: 'warn' },\n });\n this.#childProcess.stdout.setEncoding('utf8');\n this.#childProcess.stderr.setEncoding('utf8');\n this.port = await new Promise<string>((resolve, reject) => {\n const onProcessError = (err: Error): void => {\n console.warn('Error running notary', err);\n reject(err);\n };\n this.#childProcess!.once('error', onProcessError);\n this.#childProcess!.stderr.on('data', data => {\n console.warn('Notary >> %s', data);\n if (typeof data === 'string' && data.startsWith('WARNING')) return;\n this.#childProcess!.off('error', onProcessError);\n reject(data);\n });\n this.#stdioInterface = readline\n .createInterface({ input: this.#childProcess!.stdout })\n .on('line', line => {\n console.log('Notary >> %s', line);\n const match = line.match(/Listening on ([ws:/\\d.]+)/);\n if (match?.length ?? 0 > 0) {\n resolve(match![1].split(':').pop()!);\n }\n });\n });\n this.#childProcess.on('error', err => {\n throw err;\n });\n if (this.containerName) {\n this.port = await getDockerPortMapping(this.containerName, 9925);\n this.proxy = cleanHostForDocker(await getProxy());\n }\n\n return this.address;\n }\n\n public async register(client: ArgonClient): Promise<void> {\n const address = new URL(this.address);\n await new TxSubmitter(\n client,\n client.tx.notaries.propose({\n public: this.registeredPublicKey,\n hosts: [address.href],\n name: 'Test Notary',\n }),\n this.operator!,\n ).submit({ waitForBlock: true });\n }\n\n public async teardown(): Promise<void> {\n this.#childProcess?.kill();\n this.#stdioInterface?.close();\n const client = await this.connect();\n try {\n await client.query(`DROP DATABASE \"${this.#dbName}\" WITH (FORCE)`);\n } finally {\n await client.end();\n }\n if (this.containerName) {\n try {\n child_process.execSync(`docker rm -f ${this.containerName}`);\n } catch {}\n }\n }\n\n async connect(): Promise<Client> {\n const client = new PgClient({ connectionString: this.#dbConnectionString });\n try {\n await client.connect();\n } catch (err) {\n console.error('ERROR connecting to postgres client', err);\n throw err;\n }\n return client;\n }\n}\n","import * as fs from 'node:fs';\nimport { ChildProcess, execSync, spawn } from 'node:child_process';\nimport * as Path from 'node:path';\nimport * as readline from 'node:readline';\nimport {\n addTeardown,\n cleanHostForDocker,\n disconnectOnTeardown,\n getDockerPortMapping,\n getProxy,\n ITeardownable,\n projectRoot,\n} from './index';\nimport { detectPort } from 'detect-port';\nimport { customAlphabet } from 'nanoid';\nimport Client from 'bitcoin-core';\nimport * as lockfile from 'proper-lockfile';\nimport { createUid } from './TestNotary';\nimport { type ArgonClient, getClient } from '@argonprotocol/mainchain';\n\nconst nanoid = customAlphabet('0123456789abcdefghijklmnopqrstuvwxyz', 4);\n\nconst lockPath = Path.join(process.cwd(), '.port-lock');\n\nexport default class TestMainchain implements ITeardownable {\n public ip = '127.0.0.1';\n public port?: string;\n public loglevel = 'warn';\n public uuid: string;\n #binPath: string;\n #process?: ChildProcess;\n #interfaces: readline.Interface[] = [];\n containerName?: string;\n proxy?: string;\n #bitcoind?: ChildProcess;\n bitcoinPort?: number;\n #bitcoinDir?: string;\n\n public get address(): string {\n if (this.proxy) {\n const url = new URL(this.proxy);\n url.searchParams.set('target', `ws://${this.ip}:${this.port}`);\n return url.href;\n }\n return `ws://${this.ip}:${this.port}`;\n }\n\n constructor(binPath?: string) {\n this.#binPath = binPath ?? Path.join(projectRoot(), `target/debug/argon-node`);\n this.#binPath = Path.resolve(this.#binPath);\n if (!process.env.ARGON_USE_DOCKER_BINS && !fs.existsSync(this.#binPath)) {\n throw new Error(`Mainchain binary not found at ${this.#binPath}`);\n }\n this.uuid = createUid();\n addTeardown(this);\n }\n\n public getBitcoinClient(): Client {\n return new Client({\n username: 'bitcoin',\n password: 'bitcoin',\n host: `http://localhost:${this.bitcoinPort}`,\n });\n }\n\n /**\n * Launch and return the localhost url. NOTE: this url will not work cross-docker. You need to use the containerAddress property\n * @param options\n * @param options.miningThreads - number of threads to use for mining\n * @param options.bootnodes - bootnodes to use for the mainchain\n */\n public async launch(options?: {\n miningThreads?: number;\n bootnodes?: string;\n author?: string;\n launchBitcoin?: boolean;\n }): Promise<string> {\n const { miningThreads = 1, bootnodes, author = 'alice', launchBitcoin = false } = options ?? {};\n let port = 0;\n let rpcPort = 0;\n let execArgs: string[] = [];\n let containerName: string;\n if (process.env.ARGON_USE_DOCKER_BINS) {\n containerName = 'miner_' + nanoid();\n this.containerName = containerName;\n this.#binPath = 'docker';\n port = 33344;\n rpcPort = 9944;\n execArgs = [\n 'run',\n '--rm',\n `--name=${containerName}`,\n `-p=0:${port}`,\n `-p=0:${rpcPort}`,\n '-e',\n `RUST_LOG=${this.loglevel},sc_rpc_server=info`,\n 'ghcr.io/argonprotocol/argon-miner:dev',\n ];\n\n if (process.env.ADD_DOCKER_HOST) {\n execArgs.splice(2, 0, `--add-host=host.docker.internal:host-gateway`);\n }\n }\n\n const bitcoinRpcUrl = await this.startBitcoin(launchBitcoin);\n execArgs.push(\n '--dev',\n '--validator',\n `--${author}`,\n `--compute-miners=${miningThreads}`,\n `--port=${port}`,\n `--rpc-port=${rpcPort}`,\n '--rpc-external',\n '--no-mdns',\n '--no-telemetry',\n '--no-prometheus',\n '--unsafe-rpc-external',\n '--rpc-methods=unsafe',\n `--bitcoin-rpc-url=${bitcoinRpcUrl}`,\n `--notebook-archive-hosts=http://127.0.0.1:9000/${this.uuid}`,\n );\n if (bootnodes) {\n execArgs.push(`--bootnodes=${bootnodes}`);\n }\n this.#process = spawn(this.#binPath, execArgs, {\n stdio: ['ignore', 'pipe', 'pipe', 'ignore'],\n env: { ...process.env, RUST_LOG: `${this.loglevel},sc_rpc_server=info` },\n });\n\n this.#process.stderr!.setEncoding('utf8');\n this.#process.stdout!.setEncoding('utf8');\n this.#process.stdout!.on('data', data => {\n console.log('Main >> %s', data);\n });\n\n const int1 = readline.createInterface({ input: this.#process.stdout! }).on('line', line => {\n if (line) console.log('Main >> %s', line);\n });\n this.#interfaces.push(int1);\n\n this.port = await new Promise<string>((resolve, reject) => {\n this.#process!.on('error', err => {\n console.warn('Error running mainchain', err);\n reject(err);\n });\n\n const int2 = readline.createInterface({ input: this.#process!.stderr! }).on('line', line => {\n console.log('Main >> %s', line);\n const match = line.match(/Running JSON-RPC server: addr=([\\d.:]+)/);\n if (match) {\n const ipv4 = match[1].split(',').at(0);\n resolve(ipv4!.split(':').pop()!);\n }\n });\n this.#interfaces.push(int2);\n });\n if (this.containerName) {\n this.port = await getDockerPortMapping(this.containerName, rpcPort);\n this.proxy = cleanHostForDocker(await getProxy());\n }\n\n console.log(`argon Node listening at ${this.address}`);\n return this.address;\n }\n\n public async client(): Promise<ArgonClient> {\n const client = await getClient(this.address);\n disconnectOnTeardown(client);\n return client;\n }\n\n public async bootAddress(): Promise<string | undefined> {\n const client = await this.client();\n const bootAddress = await client.rpc.system.localListenAddresses();\n\n for (const address of bootAddress) {\n const addr = address.toString();\n if (addr.includes('127.0.0.1')) {\n return addr;\n }\n }\n return undefined;\n }\n\n public async teardown(): Promise<void> {\n if (process.env.ARGON_USE_DOCKER_BINS) {\n try {\n execSync(`docker rm -f ${this.containerName}`);\n } catch {}\n }\n const launchedProcess = this.#process;\n if (launchedProcess) {\n launchedProcess?.kill();\n try {\n launchedProcess.stdio.forEach(io => io?.destroy());\n } catch {}\n launchedProcess.unref();\n }\n\n this.#process?.kill();\n this.#process?.unref();\n this.#bitcoind?.kill();\n this.#bitcoind?.unref();\n if (this.#bitcoinDir) {\n await fs.promises.rm(this.#bitcoinDir, {\n recursive: true,\n force: true,\n });\n }\n for (const i of this.#interfaces) {\n i.close();\n }\n }\n\n private async startBitcoin(launchBitcoin: boolean): Promise<string> {\n let rpcPort = 14338;\n if (launchBitcoin) {\n // Ensure lock file exists\n fs.closeSync(fs.openSync(lockPath, 'w'));\n const release = await lockfile.lock(lockPath, { retries: 10 });\n try {\n rpcPort = await detectPort();\n const path = execSync(Path.join(projectRoot(), `target/debug/argon-testing-bitcoin`), {\n encoding: 'utf8',\n }).trim();\n\n const tmpDir = fs.mkdtempSync('/tmp/argon-bitcoin-' + this.uuid);\n\n console.log('Starting bitcoin node at %s. Data %s', path, tmpDir);\n this.#bitcoind = spawn(\n path,\n [\n '-regtest',\n '-fallbackfee=0.0001',\n '-listen=0',\n `-datadir=${tmpDir}`,\n '-blockfilterindex',\n '-txindex',\n `-rpcport=${rpcPort}`,\n '-rpcbind=0.0.0.0',\n '-rpcallowip=0.0.0.0/0',\n '-rpcuser=bitcoin',\n '-rpcpassword=bitcoin',\n ],\n {\n stdio: ['ignore', 'pipe', 'pipe'],\n },\n );\n this.#bitcoind.stderr!.setEncoding('utf8');\n this.#bitcoind.stdout!.setEncoding('utf8');\n this.#bitcoind.stdout!.on('data', data => {\n console.log('Bitcoin >> %s', data);\n });\n this.#bitcoind.stderr!.on('data', data => {\n console.error('Bitcoin >> %s', data);\n });\n this.#bitcoinDir = tmpDir;\n } finally {\n // Release the lock file\n await release();\n }\n }\n this.bitcoinPort = rpcPort;\n return cleanHostForDocker(`http://bitcoin:bitcoin@localhost:${rpcPort}`);\n }\n}\n","import * as child_process from 'node:child_process';\nimport { projectRoot } from './index';\nimport * as Path from 'node:path';\n\nexport default class TestBitcoinCli {\n /**\n * Returns the localhost address of the notary (NOTE: not accessible from containers)\n */\n public static run(command: string): string {\n const binPath = Path.join(`${projectRoot()}`, 'target/debug/argon-bitcoin-cli');\n\n try {\n return child_process\n .execSync(`${binPath} ${command}`, {\n encoding: 'utf8',\n })\n .trim();\n } catch (e) {\n console.error(`Error running command: ${command}`);\n console.error((e as any).stdout);\n throw e;\n }\n }\n}\n","import * as child_process from 'node:child_process';\nimport { Keyring, KeyringPair } from '@argonprotocol/mainchain';\nimport * as fs from 'node:fs';\nimport * as readline from 'node:readline';\nimport { addTeardown, ITeardownable, projectRoot } from './index';\nimport * as process from 'node:process';\nimport * as Path from 'node:path';\nimport { Readable } from 'node:stream';\n\nexport default class TestOracle implements ITeardownable {\n public static BitcoinOperator = '//Dave';\n public static PriceIndexOperator = '//Eve';\n public operator?: KeyringPair;\n public port?: string;\n #childProcess?: child_process.ChildProcessByStdio<null, Readable, Readable>;\n #stdioInterface?: readline.Interface;\n\n constructor() {\n addTeardown(this);\n }\n\n public async start(\n service: 'price-index' | 'bitcoin',\n options: {\n mainchainUrl: string;\n bitcoinRpcUrl?: string;\n pathToBin?: string;\n env?: Record<string, string>;\n },\n ) {\n const { pathToBin, mainchainUrl, bitcoinRpcUrl } = options;\n const operatorSuri =\n service == 'bitcoin' ? TestOracle.BitcoinOperator : TestOracle.PriceIndexOperator;\n this.operator = new Keyring({ type: 'sr25519' }).createFromUri(operatorSuri);\n const binPath = pathToBin ?? Path.join(projectRoot(), 'target/debug/argon-oracle');\n if (!fs.existsSync(binPath)) {\n throw new Error(`Oracle binary not found at ${binPath}`);\n }\n console.log(`Starting ${service} oracle`);\n\n const execArgs: string[] = ['--dev', '-t', mainchainUrl, service];\n if (service == 'bitcoin') {\n if (!bitcoinRpcUrl) {\n throw new Error('Bitcoin RPC URL is required for bitcoin oracle');\n }\n execArgs.push('--bitcoin-rpc-url', bitcoinRpcUrl);\n } else {\n execArgs.push('--simulate-prices');\n }\n this.#childProcess = child_process.spawn(binPath, execArgs, {\n stdio: ['ignore', 'pipe', 'pipe'],\n env: { ...process.env, RUST_LOG: 'info', ...options.env },\n });\n this.#childProcess.stdout.setEncoding('utf8');\n this.#childProcess.stderr.setEncoding('utf8');\n this.#childProcess.stderr.on('data', data => {\n console.warn('%sOracle >> %s', service, data);\n });\n this.#stdioInterface = readline\n .createInterface({ input: this.#childProcess.stdout })\n .on('line', line => {\n console.log('%sOracle >> %s', service, line);\n });\n\n this.#childProcess.on('error', err => {\n throw err;\n });\n }\n\n public async teardown(): Promise<void> {\n this.#childProcess?.kill();\n this.#stdioInterface?.close();\n }\n}\n","import * as docker from 'docker-compose';\nimport { runOnTeardown } from './index';\nimport * as Path from 'node:path';\n\nexport async function startNetwork(\n testName: string,\n options?: {\n shouldLog: boolean;\n dockerEnv?: Record<string, string>;\n },\n): Promise<{ archiveUrl: string; notaryUrl: string }> {\n const config = Path.join(__dirname, `docker-compose.yml`);\n const env = {\n VERSION: 'dev',\n ARGON_CHAIN: 'dev-docker',\n BITCOIN_BLOCK_SECS: '20',\n PATH: `${process.env.PATH}:/opt/homebrew/bin:/usr/local/bin`,\n COMPOSE_PROJECT_NAME: `argon-test-${testName}`,\n ...(options?.dockerEnv ?? {}),\n };\n runOnTeardown(async () => {\n await docker.downAll({\n log: options?.shouldLog ?? false,\n commandOptions: [`--volumes`],\n env,\n config,\n });\n });\n await docker.upAll({\n log: options?.shouldLog ?? false,\n commandOptions: [`--force-recreate`, `--remove-orphans`],\n config,\n env,\n });\n const portResult = await docker.port('archive-node', '9944', { config, env });\n const notaryPortResult = await docker.port('notary', '9925', { config, env });\n const port = portResult.data.port;\n return {\n archiveUrl: `ws://localhost:${port}`,\n notaryUrl: `ws://localhost:${notaryPortResult.data.port}`,\n };\n}\n"],"mappings":"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","names":["import_mainchain","process","child_process","Path","process","pg","url","result","resolve","fs","Path","readline","import_nanoid","import_mainchain","nanoid","url","Client","port","resolve","child_process","Path","child_process","import_mainchain","fs","readline","process","Path","Path","env","port","HttpProxy","resolve","port","teardown","sudo"]}
|
package/lib/index.d.cts
CHANGED
|
@@ -79,6 +79,14 @@ declare class TestOracle implements ITeardownable {
|
|
|
79
79
|
teardown(): Promise<void>;
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
+
declare function startNetwork(testName: string, options?: {
|
|
83
|
+
shouldLog: boolean;
|
|
84
|
+
dockerEnv?: Record<string, string>;
|
|
85
|
+
}): Promise<{
|
|
86
|
+
archiveUrl: string;
|
|
87
|
+
notaryUrl: string;
|
|
88
|
+
}>;
|
|
89
|
+
|
|
82
90
|
interface ITeardownable {
|
|
83
91
|
teardown(): Promise<void>;
|
|
84
92
|
}
|
|
@@ -105,4 +113,4 @@ declare function disconnectOnTeardown<T extends {
|
|
|
105
113
|
declare function sudo(): KeyringPair;
|
|
106
114
|
declare function activateNotary(sudo: KeyringPair, client: ArgonClient, notary: TestNotary): Promise<void>;
|
|
107
115
|
|
|
108
|
-
export { type ITeardownable, TestBitcoinCli, TestMainchain, TestNotary, TestOracle, activateNotary, addTeardown, cleanHostForDocker, closeOnTeardown, describeIntegration, disconnectOnTeardown, getDockerPortMapping, getProxy, projectRoot, runOnTeardown, runTestScript, stringifyExt, sudo, teardown };
|
|
116
|
+
export { type ITeardownable, TestBitcoinCli, TestMainchain, TestNotary, TestOracle, activateNotary, addTeardown, cleanHostForDocker, closeOnTeardown, describeIntegration, disconnectOnTeardown, getDockerPortMapping, getProxy, projectRoot, runOnTeardown, runTestScript, startNetwork, stringifyExt, sudo, teardown };
|
package/lib/index.d.ts
CHANGED
|
@@ -79,6 +79,14 @@ declare class TestOracle implements ITeardownable {
|
|
|
79
79
|
teardown(): Promise<void>;
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
+
declare function startNetwork(testName: string, options?: {
|
|
83
|
+
shouldLog: boolean;
|
|
84
|
+
dockerEnv?: Record<string, string>;
|
|
85
|
+
}): Promise<{
|
|
86
|
+
archiveUrl: string;
|
|
87
|
+
notaryUrl: string;
|
|
88
|
+
}>;
|
|
89
|
+
|
|
82
90
|
interface ITeardownable {
|
|
83
91
|
teardown(): Promise<void>;
|
|
84
92
|
}
|
|
@@ -105,4 +113,4 @@ declare function disconnectOnTeardown<T extends {
|
|
|
105
113
|
declare function sudo(): KeyringPair;
|
|
106
114
|
declare function activateNotary(sudo: KeyringPair, client: ArgonClient, notary: TestNotary): Promise<void>;
|
|
107
115
|
|
|
108
|
-
export { type ITeardownable, TestBitcoinCli, TestMainchain, TestNotary, TestOracle, activateNotary, addTeardown, cleanHostForDocker, closeOnTeardown, describeIntegration, disconnectOnTeardown, getDockerPortMapping, getProxy, projectRoot, runOnTeardown, runTestScript, stringifyExt, sudo, teardown };
|
|
116
|
+
export { type ITeardownable, TestBitcoinCli, TestMainchain, TestNotary, TestOracle, activateNotary, addTeardown, cleanHostForDocker, closeOnTeardown, describeIntegration, disconnectOnTeardown, getDockerPortMapping, getProxy, projectRoot, runOnTeardown, runTestScript, startNetwork, stringifyExt, sudo, teardown };
|
package/lib/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// node_modules/tsup/assets/esm_shims.js
|
|
2
|
-
import { fileURLToPath } from "url";
|
|
3
2
|
import path from "path";
|
|
3
|
+
import { fileURLToPath } from "url";
|
|
4
4
|
var getFilename = () => fileURLToPath(import.meta.url);
|
|
5
5
|
var getDirname = () => path.dirname(getFilename());
|
|
6
6
|
var __dirname = /* @__PURE__ */ getDirname();
|
|
@@ -8,22 +8,22 @@ var __dirname = /* @__PURE__ */ getDirname();
|
|
|
8
8
|
// src/index.ts
|
|
9
9
|
import { Keyring as Keyring3, TxSubmitter as TxSubmitter2 } from "@argonprotocol/mainchain";
|
|
10
10
|
import { describe } from "vitest";
|
|
11
|
-
import * as process4 from "
|
|
11
|
+
import * as process4 from "process";
|
|
12
12
|
import HttpProxy from "http-proxy";
|
|
13
|
-
import * as child_process4 from "
|
|
14
|
-
import * as http from "
|
|
15
|
-
import * as url from "
|
|
16
|
-
import * as
|
|
13
|
+
import * as child_process4 from "child_process";
|
|
14
|
+
import * as http from "http";
|
|
15
|
+
import * as url from "url";
|
|
16
|
+
import * as Path6 from "path";
|
|
17
17
|
|
|
18
18
|
// src/TestNotary.ts
|
|
19
19
|
import { customAlphabet } from "nanoid";
|
|
20
20
|
import pg from "pg";
|
|
21
|
-
import * as child_process from "
|
|
21
|
+
import * as child_process from "child_process";
|
|
22
22
|
import { Keyring, TxSubmitter } from "@argonprotocol/mainchain";
|
|
23
|
-
import * as fs from "
|
|
24
|
-
import * as readline from "
|
|
25
|
-
import * as process2 from "
|
|
26
|
-
import * as Path from "
|
|
23
|
+
import * as fs from "fs";
|
|
24
|
+
import * as readline from "readline";
|
|
25
|
+
import * as process2 from "process";
|
|
26
|
+
import * as Path from "path";
|
|
27
27
|
var { Client: PgClient } = pg;
|
|
28
28
|
var nanoid = customAlphabet("0123456789abcdefghijklmnopqrstuvwxyz", 4);
|
|
29
29
|
function createUid() {
|
|
@@ -87,7 +87,7 @@ var TestNotary = class {
|
|
|
87
87
|
} finally {
|
|
88
88
|
await client.end();
|
|
89
89
|
}
|
|
90
|
-
|
|
90
|
+
const result = child_process.execSync(
|
|
91
91
|
`${notaryPath} migrate --db-url ${this.#dbConnectionString}/${this.#dbName}`,
|
|
92
92
|
{
|
|
93
93
|
encoding: "utf-8"
|
|
@@ -133,13 +133,13 @@ var TestNotary = class {
|
|
|
133
133
|
this.#childProcess.once("error", onProcessError);
|
|
134
134
|
this.#childProcess.stderr.on("data", (data) => {
|
|
135
135
|
console.warn("Notary >> %s", data);
|
|
136
|
-
if (data.startsWith("WARNING")) return;
|
|
136
|
+
if (typeof data === "string" && data.startsWith("WARNING")) return;
|
|
137
137
|
this.#childProcess.off("error", onProcessError);
|
|
138
138
|
reject(data);
|
|
139
139
|
});
|
|
140
140
|
this.#stdioInterface = readline.createInterface({ input: this.#childProcess.stdout }).on("line", (line) => {
|
|
141
141
|
console.log("Notary >> %s", line);
|
|
142
|
-
|
|
142
|
+
const match = line.match(/Listening on ([ws:/\d.]+)/);
|
|
143
143
|
if (match?.length ?? 0 > 0) {
|
|
144
144
|
resolve3(match[1].split(":").pop());
|
|
145
145
|
}
|
|
@@ -155,7 +155,7 @@ var TestNotary = class {
|
|
|
155
155
|
return this.address;
|
|
156
156
|
}
|
|
157
157
|
async register(client) {
|
|
158
|
-
|
|
158
|
+
const address = new URL(this.address);
|
|
159
159
|
await new TxSubmitter(
|
|
160
160
|
client,
|
|
161
161
|
client.tx.notaries.propose({
|
|
@@ -195,10 +195,10 @@ var TestNotary = class {
|
|
|
195
195
|
};
|
|
196
196
|
|
|
197
197
|
// src/TestMainchain.ts
|
|
198
|
-
import * as fs2 from "
|
|
199
|
-
import { execSync as execSync2, spawn as spawn2 } from "
|
|
200
|
-
import * as Path2 from "
|
|
201
|
-
import * as readline2 from "
|
|
198
|
+
import * as fs2 from "fs";
|
|
199
|
+
import { execSync as execSync2, spawn as spawn2 } from "child_process";
|
|
200
|
+
import * as Path2 from "path";
|
|
201
|
+
import * as readline2 from "readline";
|
|
202
202
|
import { detectPort } from "detect-port";
|
|
203
203
|
import { customAlphabet as customAlphabet2 } from "nanoid";
|
|
204
204
|
import Client from "bitcoin-core";
|
|
@@ -251,7 +251,7 @@ var TestMainchain = class {
|
|
|
251
251
|
*/
|
|
252
252
|
async launch(options) {
|
|
253
253
|
const { miningThreads = 1, bootnodes, author = "alice", launchBitcoin = false } = options ?? {};
|
|
254
|
-
let
|
|
254
|
+
let port2 = 0;
|
|
255
255
|
let rpcPort = 0;
|
|
256
256
|
let execArgs = [];
|
|
257
257
|
let containerName;
|
|
@@ -259,13 +259,13 @@ var TestMainchain = class {
|
|
|
259
259
|
containerName = "miner_" + nanoid2();
|
|
260
260
|
this.containerName = containerName;
|
|
261
261
|
this.#binPath = "docker";
|
|
262
|
-
|
|
262
|
+
port2 = 33344;
|
|
263
263
|
rpcPort = 9944;
|
|
264
264
|
execArgs = [
|
|
265
265
|
"run",
|
|
266
266
|
"--rm",
|
|
267
267
|
`--name=${containerName}`,
|
|
268
|
-
`-p=0:${
|
|
268
|
+
`-p=0:${port2}`,
|
|
269
269
|
`-p=0:${rpcPort}`,
|
|
270
270
|
"-e",
|
|
271
271
|
`RUST_LOG=${this.loglevel},sc_rpc_server=info`,
|
|
@@ -281,7 +281,7 @@ var TestMainchain = class {
|
|
|
281
281
|
"--validator",
|
|
282
282
|
`--${author}`,
|
|
283
283
|
`--compute-miners=${miningThreads}`,
|
|
284
|
-
`--port=${
|
|
284
|
+
`--port=${port2}`,
|
|
285
285
|
`--rpc-port=${rpcPort}`,
|
|
286
286
|
"--rpc-external",
|
|
287
287
|
"--no-mdns",
|
|
@@ -315,9 +315,9 @@ var TestMainchain = class {
|
|
|
315
315
|
});
|
|
316
316
|
const int2 = readline2.createInterface({ input: this.#process.stderr }).on("line", (line) => {
|
|
317
317
|
console.log("Main >> %s", line);
|
|
318
|
-
|
|
318
|
+
const match = line.match(/Running JSON-RPC server: addr=([\d.:]+)/);
|
|
319
319
|
if (match) {
|
|
320
|
-
|
|
320
|
+
const ipv4 = match[1].split(",").at(0);
|
|
321
321
|
resolve3(ipv4.split(":").pop());
|
|
322
322
|
}
|
|
323
323
|
});
|
|
@@ -426,8 +426,8 @@ var TestMainchain = class {
|
|
|
426
426
|
};
|
|
427
427
|
|
|
428
428
|
// src/TestBitcoinCli.ts
|
|
429
|
-
import * as child_process2 from "
|
|
430
|
-
import * as Path3 from "
|
|
429
|
+
import * as child_process2 from "child_process";
|
|
430
|
+
import * as Path3 from "path";
|
|
431
431
|
var TestBitcoinCli = class {
|
|
432
432
|
/**
|
|
433
433
|
* Returns the localhost address of the notary (NOTE: not accessible from containers)
|
|
@@ -447,12 +447,12 @@ var TestBitcoinCli = class {
|
|
|
447
447
|
};
|
|
448
448
|
|
|
449
449
|
// src/TestOracle.ts
|
|
450
|
-
import * as child_process3 from "
|
|
450
|
+
import * as child_process3 from "child_process";
|
|
451
451
|
import { Keyring as Keyring2 } from "@argonprotocol/mainchain";
|
|
452
|
-
import * as fs3 from "
|
|
453
|
-
import * as readline3 from "
|
|
454
|
-
import * as process3 from "
|
|
455
|
-
import * as Path4 from "
|
|
452
|
+
import * as fs3 from "fs";
|
|
453
|
+
import * as readline3 from "readline";
|
|
454
|
+
import * as process3 from "process";
|
|
455
|
+
import * as Path4 from "path";
|
|
456
456
|
var TestOracle = class _TestOracle {
|
|
457
457
|
static BitcoinOperator = "//Dave";
|
|
458
458
|
static PriceIndexOperator = "//Eve";
|
|
@@ -503,6 +503,42 @@ var TestOracle = class _TestOracle {
|
|
|
503
503
|
}
|
|
504
504
|
};
|
|
505
505
|
|
|
506
|
+
// src/TestNetwork.ts
|
|
507
|
+
import * as docker from "docker-compose";
|
|
508
|
+
import * as Path5 from "path";
|
|
509
|
+
async function startNetwork(testName, options) {
|
|
510
|
+
const config = Path5.join(__dirname, `docker-compose.yml`);
|
|
511
|
+
const env4 = {
|
|
512
|
+
VERSION: "dev",
|
|
513
|
+
ARGON_CHAIN: "dev-docker",
|
|
514
|
+
BITCOIN_BLOCK_SECS: "20",
|
|
515
|
+
PATH: `${process.env.PATH}:/opt/homebrew/bin:/usr/local/bin`,
|
|
516
|
+
COMPOSE_PROJECT_NAME: `argon-test-${testName}`,
|
|
517
|
+
...options?.dockerEnv ?? {}
|
|
518
|
+
};
|
|
519
|
+
runOnTeardown(async () => {
|
|
520
|
+
await docker.downAll({
|
|
521
|
+
log: options?.shouldLog ?? false,
|
|
522
|
+
commandOptions: [`--volumes`],
|
|
523
|
+
env: env4,
|
|
524
|
+
config
|
|
525
|
+
});
|
|
526
|
+
});
|
|
527
|
+
await docker.upAll({
|
|
528
|
+
log: options?.shouldLog ?? false,
|
|
529
|
+
commandOptions: [`--force-recreate`, `--remove-orphans`],
|
|
530
|
+
config,
|
|
531
|
+
env: env4
|
|
532
|
+
});
|
|
533
|
+
const portResult = await docker.port("archive-node", "9944", { config, env: env4 });
|
|
534
|
+
const notaryPortResult = await docker.port("notary", "9925", { config, env: env4 });
|
|
535
|
+
const port2 = portResult.data.port;
|
|
536
|
+
return {
|
|
537
|
+
archiveUrl: `ws://localhost:${port2}`,
|
|
538
|
+
notaryUrl: `ws://localhost:${notaryPortResult.data.port}`
|
|
539
|
+
};
|
|
540
|
+
}
|
|
541
|
+
|
|
506
542
|
// src/index.ts
|
|
507
543
|
var toTeardown = [];
|
|
508
544
|
var proxy = null;
|
|
@@ -549,8 +585,8 @@ async function getProxy() {
|
|
|
549
585
|
})
|
|
550
586
|
});
|
|
551
587
|
}
|
|
552
|
-
const
|
|
553
|
-
return `ws://host.docker.internal:${
|
|
588
|
+
const port2 = proxyServer.address().port;
|
|
589
|
+
return `ws://host.docker.internal:${port2}`;
|
|
554
590
|
}
|
|
555
591
|
function stringifyExt(obj) {
|
|
556
592
|
return JSON.stringify(
|
|
@@ -569,16 +605,16 @@ function stringifyExt(obj) {
|
|
|
569
605
|
}
|
|
570
606
|
function projectRoot() {
|
|
571
607
|
if (process4.env.ARGON_PROJECT_ROOT) {
|
|
572
|
-
return
|
|
608
|
+
return Path6.join(process4.env.ARGON_PROJECT_ROOT);
|
|
573
609
|
}
|
|
574
|
-
return
|
|
610
|
+
return Path6.join(__dirname, `../../..`);
|
|
575
611
|
}
|
|
576
612
|
async function runTestScript(relativePath) {
|
|
577
|
-
const scriptPath =
|
|
613
|
+
const scriptPath = Path6.resolve(projectRoot(), relativePath);
|
|
578
614
|
return child_process4.execSync(scriptPath, { encoding: "utf8" }).trim();
|
|
579
615
|
}
|
|
580
|
-
async function getDockerPortMapping(containerName,
|
|
581
|
-
return child_process4.execSync(`docker port ${containerName} ${
|
|
616
|
+
async function getDockerPortMapping(containerName, port2) {
|
|
617
|
+
return child_process4.execSync(`docker port ${containerName} ${port2}`, { encoding: "utf8" }).trim().split(":").pop();
|
|
582
618
|
}
|
|
583
619
|
async function teardown() {
|
|
584
620
|
for (const t of toTeardown) {
|
|
@@ -636,6 +672,7 @@ export {
|
|
|
636
672
|
projectRoot,
|
|
637
673
|
runOnTeardown,
|
|
638
674
|
runTestScript,
|
|
675
|
+
startNetwork,
|
|
639
676
|
stringifyExt,
|
|
640
677
|
sudo,
|
|
641
678
|
teardown
|