@argonprotocol/testing 1.4.3-dev.8dfc7f36 → 1.4.3-dev.8e7d7af7
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/ethereum-contracts/ArgonToken.json +419 -0
- package/lib/ethereum-contracts/ArgonotToken.json +419 -0
- package/lib/ethereum-contracts/MintingGateway.json +538 -0
- package/lib/ethereum-contracts/ProxyAdmin.json +135 -0
- package/lib/ethereum-contracts/TransparentUpgradeableProxy.json +131 -0
- package/lib/index.cjs +520 -17
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +96 -3
- package/lib/index.d.ts +96 -3
- package/lib/index.js +519 -17
- package/lib/index.js.map +1 -1
- package/package.json +5 -6
- /package/lib/{docker-compose.yml → dev.docker-compose.yml} +0 -0
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","../src/TestNetwork.ts"],"sourcesContent":["import { ArgonClient, Keyring, KeyringPair, TxSubmitter } from '@argonprotocol/mainchain';\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;\n\nexport const SKIP_E2E = process.env.SKIP_E2E === 'true' || process.env.SKIP_E2E === '1';\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 const txResult = await new TxSubmitter(\n client,\n client.tx.sudo.sudo(client.tx.notaries.activate(notary.operator!.publicKey)),\n sudo,\n ).submit();\n await txResult.waitForInFirstBlock;\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 const result = 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();\n await result.waitForInFirstBlock;\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 }\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../node_modules/tsup/assets/cjs_shims.js","../src/TestNotary.ts","../src/TestMainchain.ts","../src/TestBitcoinCli.ts","../src/TestOracle.ts","../src/TestEthereum.ts","../src/ethereumContracts.ts","../src/TestNetwork.ts"],"sourcesContent":["import { ArgonClient, Keyring, KeyringPair, TxSubmitter } from '@argonprotocol/mainchain';\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 TestEthereum from './TestEthereum';\nimport { startNetwork } from './TestNetwork';\nimport { argonTokenArtifact, mintingGatewayArtifact } from './ethereumContracts';\n\nexport { TestNotary, TestMainchain, TestBitcoinCli, TestOracle, TestEthereum, startNetwork };\nexport { argonTokenArtifact, mintingGatewayArtifact };\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;\n\nexport const SKIP_E2E = process.env.SKIP_E2E === 'true' || process.env.SKIP_E2E === '1';\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 const txResult = await new TxSubmitter(\n client,\n client.tx.sudo.sudo(client.tx.notaries.activate(notary.operator!.publicKey)),\n sudo,\n ).submit();\n await txResult.waitForInFirstBlock;\n}\n","// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () =>\n typeof document === 'undefined'\n ? new URL(`file:${__filename}`).href\n : (document.currentScript && document.currentScript.src) ||\n new URL('main.js', document.baseURI).href\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\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 const result = 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();\n await result.waitForInFirstBlock;\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 * 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(): BitcoinRpcClient {\n return new BitcoinRpcClient(`http://localhost:${this.bitcoinPort}`, 'bitcoin', 'bitcoin');\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 let lastError: unknown;\n\n for (let attempt = 0; attempt < 20; attempt += 1) {\n try {\n const client = await getClient(this.address);\n disconnectOnTeardown(client);\n return client;\n } catch (error) {\n lastError = error;\n await new Promise(resolve => setTimeout(resolve, 250));\n }\n }\n\n throw new Error(`Unable to connect to mainchain client at ${this.address}`, {\n cause: lastError instanceof Error ? lastError : undefined,\n });\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\nclass BitcoinRpcClient {\n #rpcUrl: string;\n #authorization: string;\n\n constructor(rpcUrl: string, username: string, password: string) {\n this.#rpcUrl = rpcUrl;\n this.#authorization = `Basic ${Buffer.from(`${username}:${password}`).toString('base64')}`;\n }\n\n public async command<TMethod extends BitcoinRpcMethod>(\n method: TMethod,\n ...params: Parameters<BitcoinRpcMethods[TMethod]>\n ): Promise<ReturnType<BitcoinRpcMethods[TMethod]>>;\n\n public async command<TResult = unknown>(method: string, ...params: unknown[]): Promise<TResult>;\n\n public async command(method: string, ...params: unknown[]): Promise<unknown> {\n const response = await fetch(this.#rpcUrl, {\n method: 'POST',\n headers: {\n authorization: this.#authorization,\n 'content-type': 'application/json',\n },\n body: JSON.stringify({\n jsonrpc: '1.0',\n id: `${method}-${Date.now()}`,\n method,\n params,\n }),\n });\n\n const body = await response.text();\n\n let payload: BitcoinRpcPayload<unknown> | undefined;\n if (body) {\n try {\n payload = JSON.parse(body) as BitcoinRpcPayload<unknown>;\n } catch {\n payload = undefined;\n }\n }\n\n if (payload?.error) {\n const httpStatus = response.ok ? '' : ` with HTTP ${response.status}`;\n throw new Error(\n `Bitcoin RPC ${method} failed${httpStatus} (${payload.error.code}): ${payload.error.message}`,\n );\n }\n\n if (!response.ok) {\n throw new Error(`Bitcoin RPC ${method} failed with HTTP ${response.status}`);\n }\n\n if (!payload) {\n throw new Error(`Bitcoin RPC ${method} returned an invalid JSON response`);\n }\n\n return payload.result;\n }\n}\n\ntype BitcoinRpcMethod = keyof BitcoinRpcMethods;\n\n// bitcoin-core@5.0.0 only types `command()` as generic `any`, so we keep a\n// narrow local signature map for the handful of Bitcoin Core RPC fields our tests\n// actually read. Uninspected responses stay `unknown`.\ntype BitcoinRpcMethods = {\n createwallet(walletName: string): unknown;\n loadwallet(walletName: string): unknown;\n getnewaddress(): string;\n generatetoaddress(blockCount: number, address: string): unknown;\n getbalances(): unknown;\n walletcreatefundedpsbt(\n inputs: unknown[],\n outputs: Record<string, number>,\n locktime: number,\n options: BitcoinWalletCreateFundedPsbtOptions,\n ): BitcoinFundedPsbtResult;\n walletprocesspsbt(psbt: string): BitcoinProcessedPsbtResult;\n decodepsbt(psbt: string): BitcoinDecodedPsbtResult;\n finalizepsbt(psbt: string): BitcoinFinalizedPsbtResult;\n sendrawtransaction(transactionHex: string): string;\n getrawtransaction(txid: string, verbose: true): BitcoinRawTransactionResult;\n gettransaction(txid: string): unknown;\n};\n\ntype BitcoinRpcPayload<TResult> = {\n result: TResult;\n error?: { code: number; message: string } | null;\n};\n\ntype BitcoinWalletCreateFundedPsbtOptions = {\n lockUnspents?: boolean;\n feeRate?: number;\n};\n\ntype BitcoinFundedPsbtResult = {\n psbt: string;\n};\n\ntype BitcoinProcessedPsbtResult = {\n psbt: string;\n complete: boolean;\n};\n\ntype BitcoinDecodedPsbtResult = {\n inputs?: unknown[];\n};\n\ntype BitcoinFinalizedPsbtResult = {\n hex: string;\n txid?: string;\n};\n\ntype BitcoinRawTransactionResult = {\n txid: string;\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 }\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 fs from 'node:fs/promises';\nimport * as os from 'node:os';\nimport * as Path from 'node:path';\nimport { spawn, spawnSync } from 'node:child_process';\nimport { detectPort } from 'detect-port';\nimport {\n argonTokenArtifact,\n argonotTokenArtifact,\n mintingGatewayArtifact,\n proxyAdminArtifact,\n transparentUpgradeableProxyArtifact,\n} from './ethereumContracts';\nimport { privateKeyToAccount } from 'viem/accounts';\nimport {\n type Abi,\n createPublicClient,\n createWalletClient,\n defineChain,\n encodeFunctionData,\n getAddress,\n http,\n type Hex,\n zeroAddress,\n} from 'viem';\nimport { addTeardown, type ITeardownable } from './index';\n\nconst DEFAULT_KURTOSIS_BIN = 'kurtosis';\nconst DEFAULT_ETHEREUM_PACKAGE = 'github.com/ethpandaops/ethereum-package';\nconst DEFAULT_EL_PORT_START = 32000;\nconst DEFAULT_CL_PORT_START = 33000;\nconst PORT_RANGE_SIZE = 32;\nconst ENCLAVE_NAME_PREFIX = 'argon-eth-';\nconst PROBE_INTERVAL_MS = 1_000;\nconst PROBE_TIMEOUT_MS = 60_000;\nconst LIGHT_CLIENT_READY_TIMEOUT_MS = 5 * 60_000;\nconst KURTOSIS_RUN_TIMEOUT_MS = 20 * 60_000;\nconst DEFAULT_SEED_ARGON_AMOUNT_BASE_UNITS = 1_000_000_000n;\nconst ERC1967_ADMIN_SLOT =\n '0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103' as const;\n\nexport interface EthereumEndpoints {\n executionRpcUrl: string;\n beaconApiUrl: string;\n chainId: string;\n}\n\nexport interface EthereumMintingGatewayFixture {\n argonTokenAddress: Hex;\n argonotTokenAddress: Hex;\n gatewayAddress: Hex;\n}\n\nexport interface EthereumPrefundedAccount {\n balance: string;\n}\n\nexport type EthereumConsensusClient = 'lighthouse' | 'lodestar';\nexport type EthereumBeaconPreset = 'mainnet' | 'minimal';\n\ninterface ProbeResult {\n chainId?: string;\n url: string;\n}\n\nexport default class TestEthereum implements ITeardownable {\n public readonly enclaveName: string;\n\n public readonly kurtosisBin: string;\n\n public readonly packageRef: string;\n\n public executionRpcUrl?: string;\n\n public beaconApiUrl?: string;\n\n public chainId?: string;\n\n #argsDir?: string;\n\n constructor(\n enclaveName = `${ENCLAVE_NAME_PREFIX}${Math.random().toString(36).slice(2, 8)}`,\n kurtosisBin = DEFAULT_KURTOSIS_BIN,\n packageRef = DEFAULT_ETHEREUM_PACKAGE,\n ) {\n this.enclaveName = enclaveName;\n this.kurtosisBin = kurtosisBin;\n this.packageRef = packageRef;\n addTeardown(this);\n }\n\n public static isInstalled(kurtosisBin = DEFAULT_KURTOSIS_BIN): boolean {\n return spawnSync(kurtosisBin, ['version'], { stdio: 'ignore' }).status === 0;\n }\n\n public async launch(options?: {\n consensusClient?: EthereumConsensusClient;\n preset?: EthereumBeaconPreset;\n secondsPerSlot?: number;\n waitForFinalization?: boolean;\n prefundedAccounts?: Record<string, EthereumPrefundedAccount>;\n }): Promise<EthereumEndpoints> {\n const {\n consensusClient = 'lighthouse',\n preset = 'mainnet',\n secondsPerSlot,\n waitForFinalization = true,\n prefundedAccounts,\n } = options ?? {};\n const elPublicPortStart = await findFreePortRange(DEFAULT_EL_PORT_START, PORT_RANGE_SIZE);\n const clPublicPortStart = await findFreePortRange(DEFAULT_CL_PORT_START, PORT_RANGE_SIZE);\n\n this.#argsDir = await fs.mkdtemp(Path.join(os.tmpdir(), 'argon-ethereum-devnet-'));\n const argsFile = Path.join(this.#argsDir, 'network-params.yaml');\n await fs.writeFile(\n argsFile,\n renderEthereumArgs(\n elPublicPortStart,\n clPublicPortStart,\n consensusClient,\n preset,\n secondsPerSlot,\n waitForFinalization,\n prefundedAccounts,\n ),\n );\n\n await runCommand(\n this.kurtosisBin,\n ['run', '--enclave', this.enclaveName, this.packageRef, '--args-file', argsFile],\n KURTOSIS_RUN_TIMEOUT_MS,\n );\n\n const executionRpc = await waitForProbe(\n () => findExecutionRpcUrl(elPublicPortStart, PORT_RANGE_SIZE),\n PROBE_TIMEOUT_MS,\n );\n const beaconApi = await waitForProbe(\n () => findBeaconApiUrl(clPublicPortStart, PORT_RANGE_SIZE),\n PROBE_TIMEOUT_MS,\n );\n\n this.executionRpcUrl = executionRpc.url;\n this.beaconApiUrl = beaconApi.url;\n this.chainId = executionRpc.chainId;\n\n await waitForProbe(\n () => this.getBeacon('/eth/v1/beacon/genesis'),\n LIGHT_CLIENT_READY_TIMEOUT_MS,\n );\n\n return {\n executionRpcUrl: this.executionRpcUrl,\n beaconApiUrl: this.beaconApiUrl,\n chainId: this.chainId!,\n };\n }\n\n public async callExecution<TResult>(method: string, params: unknown[] = []): Promise<TResult> {\n const executionRpcUrl = this.executionRpcUrl;\n if (!executionRpcUrl) {\n throw new Error('Execution RPC URL is not available before launch');\n }\n\n const response = await fetch(executionRpcUrl, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n id: 1,\n jsonrpc: '2.0',\n method,\n params,\n }),\n signal: AbortSignal.timeout(10_000),\n });\n\n if (!response.ok) {\n throw new Error(`Execution RPC request failed for ${method}: ${response.status}`);\n }\n\n const body = (await response.json()) as {\n error?: { code?: number; message?: string };\n result?: TResult;\n };\n\n if (body.error) {\n throw new Error(\n `Execution RPC ${method} failed (${body.error.code ?? 'unknown'}): ${body.error.message ?? 'unknown error'}`,\n );\n }\n\n return body.result as TResult;\n }\n\n public async getBeacon<TResult>(path: string): Promise<TResult> {\n const beaconApiUrl = this.beaconApiUrl;\n if (!beaconApiUrl) {\n throw new Error('Beacon API URL is not available before launch');\n }\n\n const response = await fetch(new URL(path, `${beaconApiUrl}/`), {\n signal: AbortSignal.timeout(10_000),\n });\n\n if (!response.ok) {\n throw new Error(`Beacon API request failed for ${path}: ${response.status}`);\n }\n\n return (await response.json()) as TResult;\n }\n\n public async deployMintingGatewayFixture(options: {\n deployerPrivateKey: Hex;\n adminSafe?: Hex;\n guardianSafe?: Hex;\n seedArgonRecipient?: Hex;\n seedArgonAmountBaseUnits?: bigint;\n }): Promise<EthereumMintingGatewayFixture> {\n const { executionRpcUrl, chainId } = this;\n if (!executionRpcUrl || !chainId) {\n throw new Error('Ethereum devnet must be launched before deploying MintingGateway fixtures');\n }\n\n const account = privateKeyToAccount(options.deployerPrivateKey);\n const adminSafe = options.adminSafe ?? account.address;\n const guardianSafe = options.guardianSafe ?? adminSafe;\n const chain = createExecutionChain(chainId, executionRpcUrl);\n const publicClient = createPublicClient({\n chain,\n transport: http(executionRpcUrl),\n });\n const walletClient = createWalletClient({\n account,\n chain,\n transport: http(executionRpcUrl),\n });\n\n const bootstrapImplementationAddress = await deployContract(walletClient, publicClient, {\n abi: mintingGatewayArtifact.abi,\n bytecode: mintingGatewayArtifact.bytecode,\n args: [zeroAddress, zeroAddress],\n });\n const initializeData = encodeFunctionData({\n abi: mintingGatewayArtifact.abi,\n functionName: 'initialize',\n args: [adminSafe, guardianSafe],\n });\n const gatewayAddress = await deployContract(walletClient, publicClient, {\n abi: transparentUpgradeableProxyArtifact.abi,\n bytecode: transparentUpgradeableProxyArtifact.bytecode,\n args: [bootstrapImplementationAddress, adminSafe, initializeData],\n });\n const proxyAdminAddress = getAddressFromStorage(\n await publicClient.getStorageAt({\n address: gatewayAddress,\n slot: ERC1967_ADMIN_SLOT,\n }),\n );\n const argonTokenAddress = await deployContract(walletClient, publicClient, {\n abi: argonTokenArtifact.abi,\n bytecode: argonTokenArtifact.bytecode,\n args: [gatewayAddress],\n });\n const argonotTokenAddress = await deployContract(walletClient, publicClient, {\n abi: argonotTokenArtifact.abi,\n bytecode: argonotTokenArtifact.bytecode,\n args: [gatewayAddress],\n });\n const finalImplementationAddress = await deployContract(walletClient, publicClient, {\n abi: mintingGatewayArtifact.abi,\n bytecode: mintingGatewayArtifact.bytecode,\n args: [argonTokenAddress, argonotTokenAddress],\n });\n const upgradeHash = await walletClient.sendTransaction({\n to: proxyAdminAddress,\n data: encodeFunctionData({\n abi: proxyAdminArtifact.abi,\n functionName: 'upgradeAndCall',\n args: [gatewayAddress, finalImplementationAddress, '0x'],\n }),\n });\n const upgradeReceipt = await waitForExecutionReceipt(publicClient, upgradeHash);\n if (upgradeReceipt.status !== 'success') {\n throw new Error('MintingGateway proxy upgrade failed');\n }\n\n if (options.seedArgonRecipient) {\n const mintHash = await walletClient.sendTransaction({\n to: gatewayAddress,\n data: encodeFunctionData({\n abi: mintingGatewayArtifact.abi,\n functionName: 'adminMintBatch',\n args: [\n argonTokenAddress,\n [options.seedArgonRecipient],\n [options.seedArgonAmountBaseUnits ?? DEFAULT_SEED_ARGON_AMOUNT_BASE_UNITS],\n ],\n }),\n });\n const mintReceipt = await waitForExecutionReceipt(publicClient, mintHash);\n if (mintReceipt.status !== 'success') {\n throw new Error('MintingGateway admin mint failed');\n }\n }\n\n return {\n argonTokenAddress,\n argonotTokenAddress,\n gatewayAddress,\n };\n }\n\n public async teardown(): Promise<void> {\n if (this.#argsDir) {\n await fs.rm(this.#argsDir, { recursive: true, force: true });\n this.#argsDir = undefined;\n }\n\n await runCommand(this.kurtosisBin, ['enclave', 'rm', '-f', this.enclaveName], 60_000, true);\n }\n}\n\nasync function deployContract(\n walletClient: ReturnType<typeof createWalletClient>,\n publicClient: ReturnType<typeof createPublicClient>,\n request: {\n abi: Abi;\n bytecode: Hex;\n args: readonly unknown[];\n },\n) {\n const hash = await walletClient.deployContract({\n ...request,\n account: walletClient.account!,\n chain: walletClient.chain,\n });\n const receipt = await waitForExecutionReceipt(publicClient, hash);\n\n if (receipt.status !== 'success' || !receipt.contractAddress) {\n throw new Error(`Contract deployment failed for ${request.bytecode.slice(0, 10)}`);\n }\n\n return receipt.contractAddress;\n}\n\nfunction getAddressFromStorage(value: Hex | undefined) {\n if (!value || value === '0x') {\n throw new Error('Missing proxy admin address in ERC1967 admin slot');\n }\n\n return getAddress(`0x${value.slice(-40)}`);\n}\n\nfunction renderEthereumArgs(\n elPublicPortStart: number,\n clPublicPortStart: number,\n consensusClient: EthereumConsensusClient,\n preset: EthereumBeaconPreset,\n secondsPerSlot: number | undefined,\n waitForFinalization: boolean,\n prefundedAccounts?: Record<string, EthereumPrefundedAccount>,\n): string {\n const lines = [\n 'participants:',\n ' - el_type: geth',\n ` cl_type: ${consensusClient}`,\n 'network_params:',\n ' network: kurtosis',\n ` preset: ${preset}`,\n ...(secondsPerSlot ? [` seconds_per_slot: ${secondsPerSlot}`] : []),\n ...(prefundedAccounts && Object.keys(prefundedAccounts).length > 0\n ? [` prefunded_accounts: '${JSON.stringify(prefundedAccounts)}'`]\n : []),\n 'additional_services: []',\n `wait_for_finalization: ${waitForFinalization ? 'true' : 'false'}`,\n 'global_log_level: warn',\n 'port_publisher:',\n ' el:',\n ' enabled: true',\n ` public_port_start: ${elPublicPortStart}`,\n ' cl:',\n ' enabled: true',\n ` public_port_start: ${clPublicPortStart}`,\n ];\n\n lines.push('');\n return lines.join('\\n');\n}\n\nasync function findExecutionRpcUrl(portStart: number, rangeSize: number): Promise<ProbeResult> {\n for (let port = portStart; port < portStart + rangeSize; port += 1) {\n const url = `http://127.0.0.1:${port}`;\n const response = await fetchJsonRpc(url, 'eth_chainId');\n if (typeof response === 'string') {\n return { url, chainId: response };\n }\n }\n\n throw new Error(\n `Unable to find an execution RPC endpoint in ${portStart}-${portStart + rangeSize - 1}`,\n );\n}\n\nasync function findBeaconApiUrl(portStart: number, rangeSize: number): Promise<ProbeResult> {\n for (let port = portStart; port < portStart + rangeSize; port += 1) {\n const url = `http://127.0.0.1:${port}`;\n\n try {\n const response = await fetch(new URL('/eth/v1/node/version', `${url}/`), {\n signal: AbortSignal.timeout(2_000),\n });\n if (!response.ok) {\n continue;\n }\n\n const body = (await response.json()) as { data?: { version?: string } };\n if (body.data?.version) {\n return { url };\n }\n } catch {}\n }\n\n throw new Error(\n `Unable to find a Beacon API endpoint in ${portStart}-${portStart + rangeSize - 1}`,\n );\n}\n\nasync function fetchJsonRpc(url: string, method: string): Promise<unknown> {\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n id: 1,\n jsonrpc: '2.0',\n method,\n params: [],\n }),\n signal: AbortSignal.timeout(2_000),\n });\n\n if (!response.ok) {\n return null;\n }\n\n const body = (await response.json()) as { result?: unknown };\n return body.result ?? null;\n } catch {\n return null;\n }\n}\n\nfunction createExecutionChain(chainId: string, executionRpcUrl: string) {\n return defineChain({\n id: Number.parseInt(chainId, 16),\n name: 'argon-test-ethereum',\n nativeCurrency: {\n name: 'Ether',\n symbol: 'ETH',\n decimals: 18,\n },\n rpcUrls: {\n default: {\n http: [executionRpcUrl],\n },\n },\n });\n}\n\nasync function findFreePortRange(start: number, size: number): Promise<number> {\n for (let candidate = start; candidate < start + 1_000; candidate += size) {\n const ports = Array.from({ length: size }, (_, index) => candidate + index);\n const results = await Promise.all(ports.map(port => detectPort(port)));\n if (results.every((resolvedPort, index) => resolvedPort === ports[index])) {\n return candidate;\n }\n }\n\n throw new Error(`Unable to find a free port range starting near ${start}`);\n}\n\nasync function waitForProbe<T>(probe: () => Promise<T>, timeoutMs: number): Promise<T> {\n const start = Date.now();\n let lastError: unknown;\n\n while (Date.now() - start < timeoutMs) {\n try {\n return await probe();\n } catch (error) {\n lastError = error;\n await delay(PROBE_INTERVAL_MS);\n }\n }\n\n throw lastError instanceof Error ? lastError : new Error('Timed out waiting for probe');\n}\n\nasync function waitForExecutionReceipt(\n publicClient: ReturnType<typeof createPublicClient>,\n hash: Hex,\n) {\n const start = Date.now();\n let lastError: Error | undefined;\n\n while (Date.now() - start < 120_000) {\n try {\n const receipt = await publicClient.getTransactionReceipt({ hash });\n if (receipt) {\n return receipt;\n }\n } catch (error) {\n const errorText =\n error instanceof Error\n ? [\n error.message,\n 'details' in error && typeof error.details === 'string' ? error.details : undefined,\n ]\n .filter(Boolean)\n .join(' ')\n : String(error);\n\n if (\n !errorText.includes('indexing is in progress') &&\n !errorText.includes('Transaction receipt with hash') &&\n !errorText.includes('could not be found')\n ) {\n throw error;\n }\n\n lastError = error instanceof Error ? error : new Error(errorText);\n }\n\n await delay(500);\n }\n\n throw lastError ?? new Error(`Timed out waiting for execution receipt ${hash}`);\n}\n\nasync function runCommand(\n command: string,\n args: string[],\n timeoutMs: number,\n allowFailure = false,\n): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const child = spawn(command, args, {\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n let stdout = '';\n let stderr = '';\n const timeout = setTimeout(() => {\n child.kill('SIGTERM');\n reject(new Error(`Command timed out: ${command} ${args.join(' ')}`));\n }, timeoutMs);\n\n child.stdout?.setEncoding('utf8');\n child.stderr?.setEncoding('utf8');\n child.stdout?.on('data', chunk => {\n stdout += chunk;\n });\n child.stderr?.on('data', chunk => {\n stderr += chunk;\n });\n\n child.on('error', error => {\n clearTimeout(timeout);\n reject(error);\n });\n\n child.on('exit', code => {\n clearTimeout(timeout);\n\n if (code === 0 || allowFailure) {\n resolve();\n return;\n }\n\n reject(\n new Error(\n [`Command failed: ${command} ${args.join(' ')}`, stdout.trim(), stderr.trim()]\n .filter(Boolean)\n .join('\\n'),\n ),\n );\n });\n });\n}\n\nasync function delay(ms: number): Promise<void> {\n await new Promise(resolve => setTimeout(resolve, ms));\n}\n","import { readFileSync } from 'node:fs';\nimport type { Abi, Hex } from 'viem';\n\ntype EthereumContractArtifact = {\n abi: Abi;\n bytecode: Hex;\n};\n\nfunction loadArtifact(fileName: string) {\n return JSON.parse(\n readFileSync(new URL(`./ethereum-contracts/${fileName}`, import.meta.url), 'utf8'),\n ) as EthereumContractArtifact;\n}\n\nconst argonTokenArtifact = loadArtifact('ArgonToken.json');\nconst argonotTokenArtifact = loadArtifact('ArgonotToken.json');\nconst mintingGatewayArtifact = loadArtifact('MintingGateway.json');\nconst proxyAdminArtifact = loadArtifact('ProxyAdmin.json');\nconst transparentUpgradeableProxyArtifact = loadArtifact('TransparentUpgradeableProxy.json');\n\nexport {\n argonTokenArtifact,\n argonotTokenArtifact,\n mintingGatewayArtifact,\n proxyAdminArtifact,\n transparentUpgradeableProxyArtifact,\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, `dev.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","http","Path","process","pg","url","result","resolve","fs","Path","readline","import_nanoid","import_mainchain","nanoid","url","port","resolve","child_process","Path","child_process","import_mainchain","fs","readline","process","Path","fs","Path","import_node_child_process","import_detect_port","port","url","resolve","Path","env","port","HttpProxy","resolve","port","teardown","sudo"]}
|
package/lib/index.d.cts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { KeyringPair, ArgonClient } from '@argonprotocol/mainchain';
|
|
2
2
|
import { Client } from 'pg';
|
|
3
|
-
import
|
|
3
|
+
import { Hex, Abi } from 'viem';
|
|
4
4
|
|
|
5
5
|
declare class TestNotary implements ITeardownable {
|
|
6
6
|
#private;
|
|
@@ -36,7 +36,7 @@ declare class TestMainchain implements ITeardownable {
|
|
|
36
36
|
bitcoinPort?: number;
|
|
37
37
|
get address(): string;
|
|
38
38
|
constructor(binPath?: string);
|
|
39
|
-
getBitcoinClient():
|
|
39
|
+
getBitcoinClient(): BitcoinRpcClient;
|
|
40
40
|
/**
|
|
41
41
|
* Launch and return the localhost url. NOTE: this url will not work cross-docker. You need to use the containerAddress property
|
|
42
42
|
* @param options
|
|
@@ -54,6 +54,48 @@ declare class TestMainchain implements ITeardownable {
|
|
|
54
54
|
teardown(): Promise<void>;
|
|
55
55
|
private startBitcoin;
|
|
56
56
|
}
|
|
57
|
+
declare class BitcoinRpcClient {
|
|
58
|
+
#private;
|
|
59
|
+
constructor(rpcUrl: string, username: string, password: string);
|
|
60
|
+
command<TMethod extends BitcoinRpcMethod>(method: TMethod, ...params: Parameters<BitcoinRpcMethods[TMethod]>): Promise<ReturnType<BitcoinRpcMethods[TMethod]>>;
|
|
61
|
+
command<TResult = unknown>(method: string, ...params: unknown[]): Promise<TResult>;
|
|
62
|
+
}
|
|
63
|
+
type BitcoinRpcMethod = keyof BitcoinRpcMethods;
|
|
64
|
+
type BitcoinRpcMethods = {
|
|
65
|
+
createwallet(walletName: string): unknown;
|
|
66
|
+
loadwallet(walletName: string): unknown;
|
|
67
|
+
getnewaddress(): string;
|
|
68
|
+
generatetoaddress(blockCount: number, address: string): unknown;
|
|
69
|
+
getbalances(): unknown;
|
|
70
|
+
walletcreatefundedpsbt(inputs: unknown[], outputs: Record<string, number>, locktime: number, options: BitcoinWalletCreateFundedPsbtOptions): BitcoinFundedPsbtResult;
|
|
71
|
+
walletprocesspsbt(psbt: string): BitcoinProcessedPsbtResult;
|
|
72
|
+
decodepsbt(psbt: string): BitcoinDecodedPsbtResult;
|
|
73
|
+
finalizepsbt(psbt: string): BitcoinFinalizedPsbtResult;
|
|
74
|
+
sendrawtransaction(transactionHex: string): string;
|
|
75
|
+
getrawtransaction(txid: string, verbose: true): BitcoinRawTransactionResult;
|
|
76
|
+
gettransaction(txid: string): unknown;
|
|
77
|
+
};
|
|
78
|
+
type BitcoinWalletCreateFundedPsbtOptions = {
|
|
79
|
+
lockUnspents?: boolean;
|
|
80
|
+
feeRate?: number;
|
|
81
|
+
};
|
|
82
|
+
type BitcoinFundedPsbtResult = {
|
|
83
|
+
psbt: string;
|
|
84
|
+
};
|
|
85
|
+
type BitcoinProcessedPsbtResult = {
|
|
86
|
+
psbt: string;
|
|
87
|
+
complete: boolean;
|
|
88
|
+
};
|
|
89
|
+
type BitcoinDecodedPsbtResult = {
|
|
90
|
+
inputs?: unknown[];
|
|
91
|
+
};
|
|
92
|
+
type BitcoinFinalizedPsbtResult = {
|
|
93
|
+
hex: string;
|
|
94
|
+
txid?: string;
|
|
95
|
+
};
|
|
96
|
+
type BitcoinRawTransactionResult = {
|
|
97
|
+
txid: string;
|
|
98
|
+
};
|
|
57
99
|
|
|
58
100
|
declare class TestBitcoinCli {
|
|
59
101
|
/**
|
|
@@ -78,6 +120,50 @@ declare class TestOracle implements ITeardownable {
|
|
|
78
120
|
teardown(): Promise<void>;
|
|
79
121
|
}
|
|
80
122
|
|
|
123
|
+
interface EthereumEndpoints {
|
|
124
|
+
executionRpcUrl: string;
|
|
125
|
+
beaconApiUrl: string;
|
|
126
|
+
chainId: string;
|
|
127
|
+
}
|
|
128
|
+
interface EthereumMintingGatewayFixture {
|
|
129
|
+
argonTokenAddress: Hex;
|
|
130
|
+
argonotTokenAddress: Hex;
|
|
131
|
+
gatewayAddress: Hex;
|
|
132
|
+
}
|
|
133
|
+
interface EthereumPrefundedAccount {
|
|
134
|
+
balance: string;
|
|
135
|
+
}
|
|
136
|
+
type EthereumConsensusClient = 'lighthouse' | 'lodestar';
|
|
137
|
+
type EthereumBeaconPreset = 'mainnet' | 'minimal';
|
|
138
|
+
declare class TestEthereum implements ITeardownable {
|
|
139
|
+
#private;
|
|
140
|
+
readonly enclaveName: string;
|
|
141
|
+
readonly kurtosisBin: string;
|
|
142
|
+
readonly packageRef: string;
|
|
143
|
+
executionRpcUrl?: string;
|
|
144
|
+
beaconApiUrl?: string;
|
|
145
|
+
chainId?: string;
|
|
146
|
+
constructor(enclaveName?: string, kurtosisBin?: string, packageRef?: string);
|
|
147
|
+
static isInstalled(kurtosisBin?: string): boolean;
|
|
148
|
+
launch(options?: {
|
|
149
|
+
consensusClient?: EthereumConsensusClient;
|
|
150
|
+
preset?: EthereumBeaconPreset;
|
|
151
|
+
secondsPerSlot?: number;
|
|
152
|
+
waitForFinalization?: boolean;
|
|
153
|
+
prefundedAccounts?: Record<string, EthereumPrefundedAccount>;
|
|
154
|
+
}): Promise<EthereumEndpoints>;
|
|
155
|
+
callExecution<TResult>(method: string, params?: unknown[]): Promise<TResult>;
|
|
156
|
+
getBeacon<TResult>(path: string): Promise<TResult>;
|
|
157
|
+
deployMintingGatewayFixture(options: {
|
|
158
|
+
deployerPrivateKey: Hex;
|
|
159
|
+
adminSafe?: Hex;
|
|
160
|
+
guardianSafe?: Hex;
|
|
161
|
+
seedArgonRecipient?: Hex;
|
|
162
|
+
seedArgonAmountBaseUnits?: bigint;
|
|
163
|
+
}): Promise<EthereumMintingGatewayFixture>;
|
|
164
|
+
teardown(): Promise<void>;
|
|
165
|
+
}
|
|
166
|
+
|
|
81
167
|
declare function startNetwork(testName: string, options?: {
|
|
82
168
|
shouldLog: boolean;
|
|
83
169
|
dockerEnv?: Record<string, string>;
|
|
@@ -86,6 +172,13 @@ declare function startNetwork(testName: string, options?: {
|
|
|
86
172
|
notaryUrl: string;
|
|
87
173
|
}>;
|
|
88
174
|
|
|
175
|
+
type EthereumContractArtifact = {
|
|
176
|
+
abi: Abi;
|
|
177
|
+
bytecode: Hex;
|
|
178
|
+
};
|
|
179
|
+
declare const argonTokenArtifact: EthereumContractArtifact;
|
|
180
|
+
declare const mintingGatewayArtifact: EthereumContractArtifact;
|
|
181
|
+
|
|
89
182
|
interface ITeardownable {
|
|
90
183
|
teardown(): Promise<void>;
|
|
91
184
|
}
|
|
@@ -112,4 +205,4 @@ declare function disconnectOnTeardown<T extends {
|
|
|
112
205
|
declare function sudo(): KeyringPair;
|
|
113
206
|
declare function activateNotary(sudo: KeyringPair, client: ArgonClient, notary: TestNotary): Promise<void>;
|
|
114
207
|
|
|
115
|
-
export { type ITeardownable, SKIP_E2E, TestBitcoinCli, TestMainchain, TestNotary, TestOracle, activateNotary, addTeardown, cleanHostForDocker, closeOnTeardown, disconnectOnTeardown, getDockerPortMapping, getProxy, projectRoot, runOnTeardown, runTestScript, startNetwork, stringifyExt, sudo, teardown };
|
|
208
|
+
export { type ITeardownable, SKIP_E2E, TestBitcoinCli, TestEthereum, TestMainchain, TestNotary, TestOracle, activateNotary, addTeardown, argonTokenArtifact, cleanHostForDocker, closeOnTeardown, disconnectOnTeardown, getDockerPortMapping, getProxy, mintingGatewayArtifact, projectRoot, runOnTeardown, runTestScript, startNetwork, stringifyExt, sudo, teardown };
|
package/lib/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { KeyringPair, ArgonClient } from '@argonprotocol/mainchain';
|
|
2
2
|
import { Client } from 'pg';
|
|
3
|
-
import
|
|
3
|
+
import { Hex, Abi } from 'viem';
|
|
4
4
|
|
|
5
5
|
declare class TestNotary implements ITeardownable {
|
|
6
6
|
#private;
|
|
@@ -36,7 +36,7 @@ declare class TestMainchain implements ITeardownable {
|
|
|
36
36
|
bitcoinPort?: number;
|
|
37
37
|
get address(): string;
|
|
38
38
|
constructor(binPath?: string);
|
|
39
|
-
getBitcoinClient():
|
|
39
|
+
getBitcoinClient(): BitcoinRpcClient;
|
|
40
40
|
/**
|
|
41
41
|
* Launch and return the localhost url. NOTE: this url will not work cross-docker. You need to use the containerAddress property
|
|
42
42
|
* @param options
|
|
@@ -54,6 +54,48 @@ declare class TestMainchain implements ITeardownable {
|
|
|
54
54
|
teardown(): Promise<void>;
|
|
55
55
|
private startBitcoin;
|
|
56
56
|
}
|
|
57
|
+
declare class BitcoinRpcClient {
|
|
58
|
+
#private;
|
|
59
|
+
constructor(rpcUrl: string, username: string, password: string);
|
|
60
|
+
command<TMethod extends BitcoinRpcMethod>(method: TMethod, ...params: Parameters<BitcoinRpcMethods[TMethod]>): Promise<ReturnType<BitcoinRpcMethods[TMethod]>>;
|
|
61
|
+
command<TResult = unknown>(method: string, ...params: unknown[]): Promise<TResult>;
|
|
62
|
+
}
|
|
63
|
+
type BitcoinRpcMethod = keyof BitcoinRpcMethods;
|
|
64
|
+
type BitcoinRpcMethods = {
|
|
65
|
+
createwallet(walletName: string): unknown;
|
|
66
|
+
loadwallet(walletName: string): unknown;
|
|
67
|
+
getnewaddress(): string;
|
|
68
|
+
generatetoaddress(blockCount: number, address: string): unknown;
|
|
69
|
+
getbalances(): unknown;
|
|
70
|
+
walletcreatefundedpsbt(inputs: unknown[], outputs: Record<string, number>, locktime: number, options: BitcoinWalletCreateFundedPsbtOptions): BitcoinFundedPsbtResult;
|
|
71
|
+
walletprocesspsbt(psbt: string): BitcoinProcessedPsbtResult;
|
|
72
|
+
decodepsbt(psbt: string): BitcoinDecodedPsbtResult;
|
|
73
|
+
finalizepsbt(psbt: string): BitcoinFinalizedPsbtResult;
|
|
74
|
+
sendrawtransaction(transactionHex: string): string;
|
|
75
|
+
getrawtransaction(txid: string, verbose: true): BitcoinRawTransactionResult;
|
|
76
|
+
gettransaction(txid: string): unknown;
|
|
77
|
+
};
|
|
78
|
+
type BitcoinWalletCreateFundedPsbtOptions = {
|
|
79
|
+
lockUnspents?: boolean;
|
|
80
|
+
feeRate?: number;
|
|
81
|
+
};
|
|
82
|
+
type BitcoinFundedPsbtResult = {
|
|
83
|
+
psbt: string;
|
|
84
|
+
};
|
|
85
|
+
type BitcoinProcessedPsbtResult = {
|
|
86
|
+
psbt: string;
|
|
87
|
+
complete: boolean;
|
|
88
|
+
};
|
|
89
|
+
type BitcoinDecodedPsbtResult = {
|
|
90
|
+
inputs?: unknown[];
|
|
91
|
+
};
|
|
92
|
+
type BitcoinFinalizedPsbtResult = {
|
|
93
|
+
hex: string;
|
|
94
|
+
txid?: string;
|
|
95
|
+
};
|
|
96
|
+
type BitcoinRawTransactionResult = {
|
|
97
|
+
txid: string;
|
|
98
|
+
};
|
|
57
99
|
|
|
58
100
|
declare class TestBitcoinCli {
|
|
59
101
|
/**
|
|
@@ -78,6 +120,50 @@ declare class TestOracle implements ITeardownable {
|
|
|
78
120
|
teardown(): Promise<void>;
|
|
79
121
|
}
|
|
80
122
|
|
|
123
|
+
interface EthereumEndpoints {
|
|
124
|
+
executionRpcUrl: string;
|
|
125
|
+
beaconApiUrl: string;
|
|
126
|
+
chainId: string;
|
|
127
|
+
}
|
|
128
|
+
interface EthereumMintingGatewayFixture {
|
|
129
|
+
argonTokenAddress: Hex;
|
|
130
|
+
argonotTokenAddress: Hex;
|
|
131
|
+
gatewayAddress: Hex;
|
|
132
|
+
}
|
|
133
|
+
interface EthereumPrefundedAccount {
|
|
134
|
+
balance: string;
|
|
135
|
+
}
|
|
136
|
+
type EthereumConsensusClient = 'lighthouse' | 'lodestar';
|
|
137
|
+
type EthereumBeaconPreset = 'mainnet' | 'minimal';
|
|
138
|
+
declare class TestEthereum implements ITeardownable {
|
|
139
|
+
#private;
|
|
140
|
+
readonly enclaveName: string;
|
|
141
|
+
readonly kurtosisBin: string;
|
|
142
|
+
readonly packageRef: string;
|
|
143
|
+
executionRpcUrl?: string;
|
|
144
|
+
beaconApiUrl?: string;
|
|
145
|
+
chainId?: string;
|
|
146
|
+
constructor(enclaveName?: string, kurtosisBin?: string, packageRef?: string);
|
|
147
|
+
static isInstalled(kurtosisBin?: string): boolean;
|
|
148
|
+
launch(options?: {
|
|
149
|
+
consensusClient?: EthereumConsensusClient;
|
|
150
|
+
preset?: EthereumBeaconPreset;
|
|
151
|
+
secondsPerSlot?: number;
|
|
152
|
+
waitForFinalization?: boolean;
|
|
153
|
+
prefundedAccounts?: Record<string, EthereumPrefundedAccount>;
|
|
154
|
+
}): Promise<EthereumEndpoints>;
|
|
155
|
+
callExecution<TResult>(method: string, params?: unknown[]): Promise<TResult>;
|
|
156
|
+
getBeacon<TResult>(path: string): Promise<TResult>;
|
|
157
|
+
deployMintingGatewayFixture(options: {
|
|
158
|
+
deployerPrivateKey: Hex;
|
|
159
|
+
adminSafe?: Hex;
|
|
160
|
+
guardianSafe?: Hex;
|
|
161
|
+
seedArgonRecipient?: Hex;
|
|
162
|
+
seedArgonAmountBaseUnits?: bigint;
|
|
163
|
+
}): Promise<EthereumMintingGatewayFixture>;
|
|
164
|
+
teardown(): Promise<void>;
|
|
165
|
+
}
|
|
166
|
+
|
|
81
167
|
declare function startNetwork(testName: string, options?: {
|
|
82
168
|
shouldLog: boolean;
|
|
83
169
|
dockerEnv?: Record<string, string>;
|
|
@@ -86,6 +172,13 @@ declare function startNetwork(testName: string, options?: {
|
|
|
86
172
|
notaryUrl: string;
|
|
87
173
|
}>;
|
|
88
174
|
|
|
175
|
+
type EthereumContractArtifact = {
|
|
176
|
+
abi: Abi;
|
|
177
|
+
bytecode: Hex;
|
|
178
|
+
};
|
|
179
|
+
declare const argonTokenArtifact: EthereumContractArtifact;
|
|
180
|
+
declare const mintingGatewayArtifact: EthereumContractArtifact;
|
|
181
|
+
|
|
89
182
|
interface ITeardownable {
|
|
90
183
|
teardown(): Promise<void>;
|
|
91
184
|
}
|
|
@@ -112,4 +205,4 @@ declare function disconnectOnTeardown<T extends {
|
|
|
112
205
|
declare function sudo(): KeyringPair;
|
|
113
206
|
declare function activateNotary(sudo: KeyringPair, client: ArgonClient, notary: TestNotary): Promise<void>;
|
|
114
207
|
|
|
115
|
-
export { type ITeardownable, SKIP_E2E, TestBitcoinCli, TestMainchain, TestNotary, TestOracle, activateNotary, addTeardown, cleanHostForDocker, closeOnTeardown, disconnectOnTeardown, getDockerPortMapping, getProxy, projectRoot, runOnTeardown, runTestScript, startNetwork, stringifyExt, sudo, teardown };
|
|
208
|
+
export { type ITeardownable, SKIP_E2E, TestBitcoinCli, TestEthereum, TestMainchain, TestNotary, TestOracle, activateNotary, addTeardown, argonTokenArtifact, cleanHostForDocker, closeOnTeardown, disconnectOnTeardown, getDockerPortMapping, getProxy, mintingGatewayArtifact, projectRoot, runOnTeardown, runTestScript, startNetwork, stringifyExt, sudo, teardown };
|