@argonprotocol/testing 1.4.10-dev.f355ccc1 → 1.4.11-dev.1acff0b2

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/index.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/TestNotary.ts","../src/support.ts","../src/TestMainchain.ts","../src/TestOracle.ts","../src/TestEthereum.ts","../src/TestNetwork.ts","../src/EthereumE2eUtils.ts","../src/EthereumGatewayQueue.ts","../src/TestEthereumProofActors.ts"],"sourcesContent":["import { ArgonClient, Keyring, KeyringPair, TxSubmitter } from '@argonprotocol/mainchain';\nimport TestNotary from './TestNotary';\nimport TestMainchain from './TestMainchain';\nimport TestOracle from './TestOracle';\nimport TestEthereum from './TestEthereum';\nimport { startNetwork } from './TestNetwork';\nexport {\n addTeardown,\n cleanHostForDocker,\n closeOnTeardown,\n disconnectOnTeardown,\n getDockerPortMapping,\n getProxy,\n type ITeardownable,\n projectRoot,\n runOnTeardown,\n runTestScript,\n SKIP_E2E,\n teardown,\n} from './support';\n\nexport {\n mineLaterExecutionAnchorReceipt,\n signGatewayPermit,\n syncEthereumVerifierUntilAnchorCovers,\n toArgonKeccakSignature,\n toEvmRecoverableSignature,\n waitForExecutionReceipt,\n waitForFinalizedBeaconExecutionAtOrAbove,\n} from './EthereumE2eUtils';\nexport {\n getReadyEthereumGatewayUpdates,\n type EthereumGatewayUpdateBatch,\n} from './EthereumGatewayQueue';\nexport {\n EthereumProofE2eHarness,\n TestMintingAuthorityActor,\n TestMintingGateway,\n} from './TestEthereumProofActors';\nexport { TestNotary, TestMainchain, TestOracle, TestEthereum, startNetwork };\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\n return value;\n },\n 2,\n );\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 './support';\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 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';\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 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 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\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","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 './support';\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 { Keyring, KeyringPair } from '@argonprotocol/mainchain';\nimport * as fs from 'node:fs';\nimport * as readline from 'node:readline';\nimport { addTeardown, ITeardownable, projectRoot } from './support';\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 { EvmContracts } from '@argonprotocol/mainchain';\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 './support';\n\nconst {\n argonTokenArtifact,\n argonotTokenArtifact,\n hashMintingGatewayGlobalIssuanceCouncil,\n mintingGatewayArtifact,\n proxyAdminArtifact,\n transparentUpgradeableProxyArtifact,\n} = EvmContracts;\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 DEFAULT_INITIAL_MICROGONS_PER_ARGONOT = 1_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 initialMicrogonsPerArgonot?: bigint;\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 const bootstrapCouncil = {\n signers: [adminSafe],\n weights: [1n],\n } as const;\n const initialMicrogonsPerArgonot =\n options.initialMicrogonsPerArgonot ?? DEFAULT_INITIAL_MICROGONS_PER_ARGONOT;\n const bootstrapCouncilHash = hashMintingGatewayGlobalIssuanceCouncil({\n ...bootstrapCouncil,\n epochMicrogonsPerArgonot: initialMicrogonsPerArgonot,\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: [\n adminSafe,\n guardianSafe,\n bootstrapCouncilHash,\n BigInt(bootstrapCouncil.signers.length),\n 1n,\n initialMicrogonsPerArgonot,\n ],\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: 'migrate',\n args: [\n {\n recipients: [options.seedArgonRecipient],\n amounts: [options.seedArgonAmountBaseUnits ?? DEFAULT_SEED_ARGON_AMOUNT_BASE_UNITS],\n },\n {\n recipients: [],\n amounts: [],\n },\n ],\n }),\n });\n const mintReceipt = await waitForExecutionReceipt(publicClient, mintHash);\n if (mintReceipt.status !== 'success') {\n throw new Error('MintingGateway migrate 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 * as docker from 'docker-compose';\nimport { runOnTeardown } from './support';\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","import {\n getLatestArgonFinalizedExecutionHeader,\n getNextEthereumBeaconSyncTxs,\n hexToU8a,\n isOutdatedTransactionError,\n type ArgonClient,\n type EthereumBeaconBlockResponse,\n type EthereumBeaconHeaderDetailsResponse,\n type EthereumReceipt,\n type KeyringPair,\n TxSubmitter,\n u8aToHex,\n} from '@argonprotocol/mainchain';\nimport { privateKeyToAccount } from 'viem/accounts';\nimport type { Hex, RpcTransactionReceipt } from 'viem';\nimport { createWalletClient, defineChain, parseSignature } from 'viem';\nimport TestEthereum from './TestEthereum';\n\nexport async function signGatewayPermit(args: {\n account: ReturnType<typeof privateKeyToAccount>;\n chainId: number;\n tokenAddress: Hex;\n gatewayAddress: Hex;\n owner: Hex;\n value: bigint;\n nonce: bigint;\n deadline: bigint;\n}) {\n const signature = parseSignature(\n await args.account.signTypedData({\n domain: {\n name: 'Argon',\n version: '1',\n chainId: args.chainId,\n verifyingContract: args.tokenAddress,\n },\n types: {\n Permit: [\n { name: 'owner', type: 'address' },\n { name: 'spender', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n ],\n },\n primaryType: 'Permit',\n message: {\n owner: args.owner,\n spender: args.gatewayAddress,\n value: args.value,\n nonce: args.nonce,\n deadline: args.deadline,\n },\n }),\n );\n\n return {\n v: Number(signature.v),\n r: signature.r,\n s: signature.s,\n };\n}\n\nexport async function waitForFinalizedBeaconExecutionAtOrAbove(\n ethereum: TestEthereum,\n minimumExecutionBlockNumber: bigint,\n options: {\n minimumFinalizedSlot?: bigint;\n } = {},\n) {\n const startedAt = Date.now();\n const minimumFinalizedSlot = options.minimumFinalizedSlot ?? 0n;\n\n let lastSeenExecutionBlockNumber = 0n;\n let lastSeenHeadSlot = 0n;\n let lastSeenFinalizedSlot = 0n;\n let lastError: Error | undefined;\n\n while (Date.now() - startedAt < 300_000) {\n try {\n const [headHeader, finalizedHeader] = await Promise.all([\n ethereum.getBeacon<EthereumBeaconHeaderDetailsResponse>('/eth/v1/beacon/headers/head'),\n ethereum.getBeacon<EthereumBeaconHeaderDetailsResponse>('/eth/v1/beacon/headers/finalized'),\n ]);\n lastSeenHeadSlot = BigInt(headHeader.data.header.message.slot);\n lastSeenFinalizedSlot = BigInt(finalizedHeader.data.header.message.slot);\n const block = await ethereum.getBeacon<EthereumBeaconBlockResponse>(\n `/eth/v2/beacon/blocks/${finalizedHeader.data.root}`,\n );\n const executionBlockNumber = BigInt(block.data.message.body.execution_payload.block_number);\n lastSeenExecutionBlockNumber = executionBlockNumber;\n lastError = undefined;\n\n if (\n executionBlockNumber >= minimumExecutionBlockNumber &&\n lastSeenFinalizedSlot >= minimumFinalizedSlot\n ) {\n return { header: finalizedHeader, block };\n }\n } catch (error) {\n if (!(error instanceof Error)) {\n throw error;\n }\n lastError = error;\n }\n\n await delay(1_000);\n }\n\n const lastErrorSuffix = lastError ? `; last beacon error was: ${lastError.message}` : '';\n throw new Error(\n `Timed out waiting for finalized beacon execution block at or above ${minimumExecutionBlockNumber} and finalized slot at or above ${minimumFinalizedSlot}; last seen head slot was ${lastSeenHeadSlot}, finalized slot was ${lastSeenFinalizedSlot}, and finalized execution block was ${lastSeenExecutionBlockNumber}${lastErrorSuffix}`,\n );\n}\n\nexport async function mineLaterExecutionAnchorReceipt(\n walletClient: Pick<ReturnType<typeof createWalletClient>, 'sendTransaction'>,\n chain: ReturnType<typeof defineChain>,\n ethereum: TestEthereum,\n account: ReturnType<typeof privateKeyToAccount>,\n minimumBlockNumber: bigint,\n) {\n while (true) {\n const transactionHash = await walletClient.sendTransaction({\n account,\n chain,\n to: account.address,\n value: 0n,\n });\n const receipt = await waitForExecutionReceipt(ethereum, transactionHash);\n\n if (BigInt(receipt.blockNumber) > minimumBlockNumber) {\n return receipt;\n }\n }\n}\n\nexport async function waitForExecutionReceipt(\n ethereum: TestEthereum,\n transactionHash: Hex,\n): Promise<EthereumReceipt> {\n const startedAt = Date.now();\n\n while (Date.now() - startedAt < 120_000) {\n try {\n const receipt = await ethereum.callExecution<RpcTransactionReceipt | null>(\n 'eth_getTransactionReceipt',\n [transactionHash],\n );\n\n if (receipt) {\n return receipt as unknown as EthereumReceipt;\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 (!errorText.includes('indexing is in progress')) {\n throw error;\n }\n }\n\n await delay(500);\n }\n\n throw new Error(`Timed out waiting for execution receipt ${transactionHash}`);\n}\n\nexport async function syncEthereumVerifierUntilAnchorCovers(\n mainchainClient: ArgonClient,\n relayer: KeyringPair,\n beaconApiUrl: string,\n minimumExecutionBlockNumber: bigint,\n) {\n const startedAt = Date.now();\n const timeoutMs = 5 * 60_000;\n let lastRetryableError: Error | undefined;\n let lastAnchorBlockNumber: bigint | undefined;\n\n while (Date.now() - startedAt < timeoutMs) {\n try {\n const anchor = await getLatestArgonFinalizedExecutionHeader(mainchainClient);\n lastAnchorBlockNumber = anchor.blockNumber;\n if (anchor.blockNumber >= minimumExecutionBlockNumber) {\n return;\n }\n } catch {}\n\n const txs = await getNextEthereumBeaconSyncTxs(mainchainClient, beaconApiUrl);\n if (txs.length === 0) {\n await delay(500);\n continue;\n }\n\n let shouldRetry = false;\n for (const tx of txs) {\n try {\n const result = await new TxSubmitter(mainchainClient, tx, relayer).submit();\n await result.waitForInFirstBlock;\n lastRetryableError = undefined;\n } catch (error) {\n if (isRetryableEthereumVerifierSyncError(error)) {\n lastRetryableError = error instanceof Error ? error : new Error(String(error));\n shouldRetry = true;\n break;\n }\n throw error;\n }\n }\n\n if (shouldRetry) {\n await delay(500);\n }\n }\n\n throw (\n lastRetryableError ??\n new Error(\n `Ethereum verifier did not retain an anchor at or above execution block ${minimumExecutionBlockNumber} within ${Math.floor(timeoutMs / 1000)}s; last seen anchor was ${lastAnchorBlockNumber ?? 'unavailable'}`,\n )\n );\n}\n\nexport function toArgonKeccakSignature(signature: Hex): Hex {\n const bytes = hexToU8a(signature);\n if (bytes.length !== 65) {\n throw new Error(`Expected 65-byte ECDSA signature, received ${bytes.length} bytes`);\n }\n if (bytes[64] >= 27) {\n bytes[64] -= 27;\n }\n return u8aToHex(bytes);\n}\n\nexport function toEvmRecoverableSignature(signature: Hex): Hex {\n const bytes = hexToU8a(signature);\n if (bytes.length !== 65) {\n throw new Error(`Expected 65-byte ECDSA signature, received ${bytes.length} bytes`);\n }\n if (bytes[64] <= 1) {\n bytes[64] += 27;\n }\n return u8aToHex(bytes);\n}\n\nfunction isRetryableEthereumVerifierSyncError(error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n\n return (\n isOutdatedTransactionError(error) ||\n message.includes('ethereumVerifier.InvalidHeaderMerkleProof')\n );\n}\n\nasync function delay(ms: number): Promise<void> {\n await new Promise(resolve => setTimeout(resolve, ms));\n}\n","import {\n EvmContracts,\n type IArgonQueryable,\n type PalletCrosschainTransferCouncilApprovalQueueEntry,\n} from '@argonprotocol/mainchain';\nimport type { ContractFunctionArgs } from 'viem';\nimport { getAddress, keccak256, type Address, type Hex } from 'viem';\nimport { toEvmRecoverableSignature } from './EthereumE2eUtils';\n\nconst {\n encodeMintingGatewayGlobalIssuanceCouncilRotateTarget,\n encodeMintingGatewayMintingAuthorityActivationTarget,\n encodeMintingGatewayMintingAuthorityDeactivateTarget,\n hashMintingGatewayActivateMintingAuthority,\n hashMintingGatewayGatewayUpdateApproval,\n hashMintingGatewayGlobalIssuanceCouncil,\n hashMintingGatewayRotateGlobalIssuanceCouncil,\n hashMintingGatewayRotateGlobalIssuanceCouncilApproval,\n mintingGatewayAbi,\n MINTING_GATEWAY_UPDATE_KINDS,\n} = EvmContracts;\n\ntype MintingGatewayHashContext = Parameters<\n typeof EvmContracts.hashMintingGatewayGatewayUpdateApproval\n>[0];\ntype MintingGatewayMintingAuthorityActivationTarget = Parameters<\n typeof EvmContracts.encodeMintingGatewayMintingAuthorityActivationTarget\n>[0];\ntype MintingGatewayGlobalIssuanceCouncilRotateTarget = Parameters<\n typeof EvmContracts.encodeMintingGatewayGlobalIssuanceCouncilRotateTarget\n>[0];\ntype ApplyGatewayUpdatesArgs = ContractFunctionArgs<\n typeof EvmContracts.mintingGatewayAbi,\n 'nonpayable',\n 'applyGatewayUpdates'\n>;\ntype MintingGatewayCouncilSnapshot = ApplyGatewayUpdatesArgs[0];\ntype MintingGatewayGatewayUpdate = ApplyGatewayUpdatesArgs[1][number];\n\nexport type EthereumGatewayUpdateBatch = {\n destinationChain: 'Ethereum';\n chainId: bigint;\n gatewayAddress: Address;\n currentCouncilHash: Hex;\n currentCouncil: MintingGatewayCouncilSnapshot;\n argonApprovalsNonce: bigint;\n argonApprovalsHash: Hex;\n paused: boolean;\n firstQueueNonce?: bigint;\n lastQueueNonce?: bigint;\n updates: MintingGatewayGatewayUpdate[];\n};\n\ntype LoadedCouncil = {\n epochMicrogonsPerArgonot: bigint;\n totalWeight: bigint;\n members: {\n signer: Address;\n weight: bigint;\n }[];\n};\n\ntype ApprovalQueueEntry = PalletCrosschainTransferCouncilApprovalQueueEntry;\n\nexport async function getReadyEthereumGatewayUpdates(\n client: IArgonQueryable,\n gatewayClient: {\n readContract: (...args: any[]) => Promise<unknown>;\n },\n options: {\n destinationChain?: 'Ethereum';\n maxQueueEntries?: number;\n } = {},\n): Promise<EthereumGatewayUpdateBatch> {\n const destinationChain = options.destinationChain ?? 'Ethereum';\n const maxQueueEntries = options.maxQueueEntries ?? 100;\n if (maxQueueEntries < 1) {\n throw new Error(`maxQueueEntries must be at least 1, received ${maxQueueEntries}`);\n }\n\n const chainConfigOption =\n await client.query.crosschainTransfer.chainConfigBySourceChain(destinationChain);\n if (chainConfigOption.isNone) {\n throw new Error(`Crosschain config not found for ${destinationChain}`);\n }\n\n const chainConfig = chainConfigOption.unwrap();\n if (!chainConfig.isEvm) {\n throw new Error(`Chain config for ${destinationChain} is not EVM-shaped`);\n }\n\n const gatewayAddress = getAddress(toHexValue(chainConfig.asEvm.gateway));\n const chainId = chainConfig.asEvm.chainId.toBigInt();\n const hashContext: MintingGatewayHashContext = { chainId, gatewayAddress };\n\n const currentCouncilHashOption =\n await client.query.crosschainTransfer.activeGlobalIssuanceCouncilByDestinationChain(\n destinationChain,\n );\n if (currentCouncilHashOption.isNone) {\n throw new Error(`Active GlobalIssuanceCouncil not found for ${destinationChain}`);\n }\n\n const currentCouncilHash = toHexValue(currentCouncilHashOption.unwrap());\n const councilCache = new Map<Hex, LoadedCouncil>();\n const currentCouncil = councilToSnapshot(\n await loadCouncilByHash(client, currentCouncilHash, councilCache),\n );\n\n const [rawArgonApprovalsNonce, rawArgonApprovalsHash, rawPaused] = await Promise.all([\n gatewayClient.readContract({\n abi: mintingGatewayAbi,\n address: gatewayAddress,\n functionName: 'argonApprovalsNonce',\n }),\n gatewayClient.readContract({\n abi: mintingGatewayAbi,\n address: gatewayAddress,\n functionName: 'argonApprovalsHash',\n }),\n gatewayClient.readContract({\n abi: mintingGatewayAbi,\n address: gatewayAddress,\n functionName: 'paused',\n }),\n ]);\n const argonApprovalsNonce = rawArgonApprovalsNonce as bigint;\n const argonApprovalsHash = rawArgonApprovalsHash as Hex;\n const paused = rawPaused as boolean;\n\n const candidateUpdates: MintingGatewayGatewayUpdate[] = [];\n let expectedPreviousApprovalHash = argonApprovalsHash;\n let readyQueueEntriesScanned = 0;\n\n if (!paused) {\n for (\n let queueNonce = argonApprovalsNonce + 1n;\n readyQueueEntriesScanned < maxQueueEntries;\n queueNonce += 1n\n ) {\n const entryOption =\n await client.query.crosschainTransfer.councilApprovalQueueByDestinationChainAndNonce(\n destinationChain,\n queueNonce,\n );\n if (entryOption.isNone) {\n break;\n }\n\n const entry = entryOption.unwrap();\n const approvingCouncilHash = toHexValue(entry.approvingCouncilHash);\n const approvingCouncil = await loadCouncilByHash(client, approvingCouncilHash, councilCache);\n if (!queueEntryHasQuorum(entry, approvingCouncil)) {\n break;\n }\n readyQueueEntriesScanned += 1;\n\n if (toHexValue(entry.previousApprovalHash) !== expectedPreviousApprovalHash) {\n throw new Error(\n `Queue nonce ${queueNonce} expected previous approval hash ${expectedPreviousApprovalHash}, received ${toHexValue(entry.previousApprovalHash)}`,\n );\n }\n\n const update = await buildGatewayUpdate(client, destinationChain, hashContext, queueNonce, {\n entry,\n approvingCouncilHash,\n councilCache,\n });\n candidateUpdates.push(update);\n expectedPreviousApprovalHash = toHexValue(entry.approvalHash);\n }\n }\n\n const updates = candidateUpdates;\n for (let index = 0; index < updates.length; index += 1) {\n const isBorder =\n updates[index].kind === MINTING_GATEWAY_UPDATE_KINDS.globalIssuanceCouncilRotate ||\n index === updates.length - 1;\n if (isBorder || updates[index].signatures.length === 0) continue;\n updates[index] = {\n ...updates[index],\n signatures: [],\n };\n }\n const firstQueueNonce = updates[0]?.queueNonce;\n const lastQueueNonce = updates[updates.length - 1]?.queueNonce;\n\n return {\n destinationChain,\n chainId,\n gatewayAddress,\n currentCouncilHash,\n currentCouncil,\n argonApprovalsNonce,\n argonApprovalsHash,\n paused,\n ...(firstQueueNonce !== undefined ? { firstQueueNonce, lastQueueNonce } : {}),\n updates,\n };\n}\n\nasync function buildGatewayUpdate(\n client: IArgonQueryable,\n destinationChain: 'Ethereum',\n hashContext: MintingGatewayHashContext,\n queueNonce: bigint,\n queueItem: {\n entry: ApprovalQueueEntry;\n approvingCouncilHash: Hex;\n councilCache: Map<Hex, LoadedCouncil>;\n },\n): Promise<MintingGatewayGatewayUpdate> {\n const { entry, approvingCouncilHash, councilCache } = queueItem;\n if (entry.target.isGlobalIssuanceCouncilRotation) {\n const signatures = getSortedSignatures(entry.signatures);\n const nextCouncilHash = toHexValue(entry.target.asGlobalIssuanceCouncilRotation);\n const nextCouncil = await loadCouncilByHash(client, nextCouncilHash, councilCache);\n const target: MintingGatewayGlobalIssuanceCouncilRotateTarget = {\n council: councilToSnapshot(nextCouncil),\n epochMicrogonsPerArgonot: nextCouncil.epochMicrogonsPerArgonot,\n };\n const calculatedCouncilHash = hashMintingGatewayGlobalIssuanceCouncil({\n ...target.council,\n epochMicrogonsPerArgonot: target.epochMicrogonsPerArgonot,\n });\n const targetPayloadHash = hashMintingGatewayRotateGlobalIssuanceCouncil(hashContext, target);\n const approvalHash = hashMintingGatewayRotateGlobalIssuanceCouncilApproval(hashContext, {\n queueNonce,\n approvingCouncilHash,\n previousUpdateHash: toHexValue(entry.previousApprovalHash),\n target,\n });\n\n if (calculatedCouncilHash !== nextCouncilHash) {\n throw new Error(`Queue nonce ${queueNonce} target council hash does not match council`);\n }\n if (toHexValue(entry.targetPayloadHash) !== targetPayloadHash) {\n throw new Error(`Queue nonce ${queueNonce} target payload hash does not match council`);\n }\n if (toHexValue(entry.approvalHash) !== approvalHash) {\n throw new Error(`Queue nonce ${queueNonce} approval hash does not match council rotation`);\n }\n\n return {\n queueNonce,\n kind: MINTING_GATEWAY_UPDATE_KINDS.globalIssuanceCouncilRotate,\n payload: encodeMintingGatewayGlobalIssuanceCouncilRotateTarget(target),\n signatures,\n };\n }\n\n if (entry.target.isMintingAuthorityActivation) {\n const signatures = getSortedSignatures(entry.signatures);\n const signingKey = getAddress(toHexValue(entry.target.asMintingAuthorityActivation));\n const authorityOption =\n await client.query.crosschainTransfer.mintingAuthoritiesBySigner(signingKey);\n if (authorityOption.isNone) {\n throw new Error(\n `Minting authority activation ${signingKey} not found for queue nonce ${queueNonce}`,\n );\n }\n\n const authority = authorityOption.unwrap();\n if (authority.destinationChain.type !== destinationChain) {\n throw new Error(\n `Minting authority ${signingKey} belongs to ${String(authority.destinationChain.type)}, expected ${String(destinationChain)}`,\n );\n }\n\n const target: MintingGatewayMintingAuthorityActivationTarget = {\n microgonCollateral: authority.gatewayRemainingMicrogonCollateral.toBigInt(),\n micronotCollateral: authority.gatewayRemainingMicronotCollateral.toBigInt(),\n signingKey,\n };\n const payload = encodeMintingGatewayMintingAuthorityActivationTarget(target);\n const targetPayloadHash = hashMintingGatewayActivateMintingAuthority(hashContext, target);\n const approvalHash = hashMintingGatewayGatewayUpdateApproval(hashContext, {\n queueNonce,\n approvingCouncilHash,\n kind: MINTING_GATEWAY_UPDATE_KINDS.mintingAuthorityActivate,\n targetId: `0x${signingKey.slice(2).padStart(64, '0').toLowerCase()}`,\n targetPayloadHash,\n previousUpdateHash: toHexValue(entry.previousApprovalHash),\n });\n\n if (toHexValue(entry.targetPayloadHash) !== targetPayloadHash) {\n throw new Error(`Queue nonce ${queueNonce} target payload hash does not match authority`);\n }\n if (toHexValue(entry.approvalHash) !== approvalHash) {\n throw new Error(\n `Queue nonce ${queueNonce} approval hash does not match authority: actual=${toHexValue(entry.approvalHash)} expected=${approvalHash} previous=${toHexValue(entry.previousApprovalHash)} council=${approvingCouncilHash} targetPayload=${toHexValue(entry.targetPayloadHash)}`,\n );\n }\n\n return {\n queueNonce,\n kind: MINTING_GATEWAY_UPDATE_KINDS.mintingAuthorityActivate,\n payload,\n signatures,\n };\n }\n\n if (entry.target.isMintingAuthorityDeactivation) {\n const signingKey = getAddress(toHexValue(entry.target.asMintingAuthorityDeactivation));\n const payload = encodeMintingGatewayMintingAuthorityDeactivateTarget({ signingKey });\n const targetPayloadHash = keccak256(payload);\n const approvalHash = hashMintingGatewayGatewayUpdateApproval(hashContext, {\n queueNonce,\n approvingCouncilHash,\n kind: MINTING_GATEWAY_UPDATE_KINDS.mintingAuthorityDeactivate,\n targetId: signingKeyTargetId(signingKey),\n targetPayloadHash,\n previousUpdateHash: toHexValue(entry.previousApprovalHash),\n });\n\n if (toHexValue(entry.targetPayloadHash) !== targetPayloadHash) {\n throw new Error(`Queue nonce ${queueNonce} target payload hash does not match deactivation`);\n }\n if (toHexValue(entry.approvalHash) !== approvalHash) {\n throw new Error(\n `Queue nonce ${queueNonce} approval hash does not match deactivation: actual=${toHexValue(entry.approvalHash)} expected=${approvalHash} previous=${toHexValue(entry.previousApprovalHash)} council=${approvingCouncilHash}`,\n );\n }\n\n return {\n queueNonce,\n kind: MINTING_GATEWAY_UPDATE_KINDS.mintingAuthorityDeactivate,\n payload,\n signatures: getSortedSignatures(entry.signatures),\n };\n }\n\n throw new Error(`Unsupported approval queue target ${entry.target.type}`);\n}\n\nasync function loadCouncilByHash(\n client: IArgonQueryable,\n councilHash: Hex,\n cache: Map<Hex, LoadedCouncil>,\n): Promise<LoadedCouncil> {\n const cached = cache.get(councilHash);\n if (cached) {\n return cached;\n }\n\n const councilOption =\n await client.query.crosschainTransfer.globalIssuanceCouncilByHash(councilHash);\n if (councilOption.isNone) {\n throw new Error(`GlobalIssuanceCouncil ${councilHash} not found`);\n }\n\n const council = councilOption.unwrap();\n const loaded = {\n epochMicrogonsPerArgonot: council.epochMicrogonsPerArgonot.toBigInt(),\n totalWeight: council.totalWeight.toBigInt(),\n members: [...council.members.entries()]\n .map(([signer, member]) => ({\n signer: getAddress(toHexValue(signer)),\n weight: member.weight.toBigInt(),\n }))\n .sort((left, right) => left.signer.localeCompare(right.signer)),\n };\n\n cache.set(councilHash, loaded);\n return loaded;\n}\n\nfunction queueEntryHasQuorum(entry: ApprovalQueueEntry, council: LoadedCouncil): boolean {\n let signedWeight = 0n;\n\n for (const [signer] of entry.signatures.entries()) {\n const signerAddress = getAddress(toHexValue(signer));\n const member = council.members.find(x => x.signer === signerAddress);\n if (!member) {\n throw new Error(`Signature submitted by ${signerAddress}, which is not in the council`);\n }\n\n signedWeight += member.weight;\n }\n\n if (signedWeight * 100n >= council.totalWeight * 90n) {\n return true;\n }\n\n const unsignedMemberCount = council.members.length - entry.signatures.size;\n return unsignedMemberCount <= 2 && signedWeight * 100n >= council.totalWeight * 80n;\n}\n\nfunction councilToSnapshot(council: LoadedCouncil): MintingGatewayCouncilSnapshot {\n return {\n signers: council.members.map(member => member.signer),\n weights: council.members.map(member => member.weight),\n };\n}\n\nfunction signingKeyTargetId(signingKey: Address): Hex {\n return `0x${signingKey.slice(2).padStart(64, '0').toLowerCase()}`;\n}\n\nfunction getSortedSignatures(\n signatures: ApprovalQueueEntry['signatures'],\n): MintingGatewayGatewayUpdate['signatures'] {\n return [...signatures.entries()]\n .sort(([leftSigner], [rightSigner]) =>\n toHexValue(leftSigner).localeCompare(toHexValue(rightSigner)),\n )\n .map(([, signature]) => toEvmRecoverableSignature(toHexValue(signature)));\n}\n\nfunction toHexValue(value: { toHex(): string }): Hex {\n return value.toHex() as Hex;\n}\n","import {\n type ArgonClient,\n buildGatewayActivityProofPayload,\n decodeAddress,\n dispatchErrorToString,\n EvmContracts,\n getEthereumBeaconSyncBootstrapTx,\n Keyring,\n type KeyringPair,\n toFixedNumber,\n TxSubmitter,\n U8aFixed,\n Vault,\n Vec,\n} from '@argonprotocol/mainchain';\nimport { privateKeyToAccount } from 'viem/accounts';\nimport {\n createPublicClient,\n createWalletClient,\n defineChain,\n encodeFunctionData,\n type Hex,\n http,\n toHex,\n} from 'viem';\nimport { getReadyEthereumGatewayUpdates } from './EthereumGatewayQueue';\nimport {\n mineLaterExecutionAnchorReceipt,\n signGatewayPermit,\n syncEthereumVerifierUntilAnchorCovers,\n toArgonKeccakSignature,\n waitForExecutionReceipt,\n waitForFinalizedBeaconExecutionAtOrAbove,\n} from './EthereumE2eUtils';\nimport TestEthereum from './TestEthereum';\nimport TestMainchain from './TestMainchain';\n\nconst { argonTokenAbi, mintingGatewayAbi, MINTING_GATEWAY_RUNTIME_TO_ERC20_SCALE } = EvmContracts;\nconst MINIMAL_BOOTSTRAP_FINALIZED_SLOT = 64n;\n\ntype DeployerAccount = ReturnType<typeof privateKeyToAccount>;\ntype EthereumChain = ReturnType<typeof defineChain>;\ntype EthereumPublicClient = {\n getBalance: (args: { address: Hex }) => Promise<bigint>;\n getBlock: (...args: any[]) => Promise<any>;\n getBlockNumber: () => Promise<bigint>;\n readContract: (...args: any[]) => Promise<unknown>;\n waitForTransactionReceipt: (args: {\n hash: Hex;\n }) => Promise<{ status: string; blockNumber: bigint }>;\n};\ntype EthereumWalletClient = {\n sendTransaction: (...args: any[]) => Promise<Hex>;\n writeContract: (...args: any[]) => Promise<Hex>;\n};\ntype GatewayDeployment = Awaited<ReturnType<TestEthereum['deployMintingGatewayFixture']>>;\ntype RuntimeSetupMode =\n | {\n kind: 'inbound-only';\n }\n | {\n kind: 'outbound';\n activationPricing: {\n activationGasCost: bigint | number;\n signatureGasCost: bigint | number;\n estimatedWeiPerGas: bigint | number;\n estimatedMicrogonsPerEth: bigint | number;\n };\n minimumMintingAuthorityValue?: bigint;\n };\n\nexport class EthereumProofE2eHarness {\n public readonly sudoSigner = new Keyring({ type: 'sr25519' }).createFromUri('//Alice');\n public readonly deployer: DeployerAccount;\n public readonly chain: EthereumChain;\n public readonly publicClient: EthereumPublicClient;\n public readonly walletClient: EthereumWalletClient;\n public readonly mainchainClient: ArgonClient;\n public readonly proofRelayer: KeyringPair;\n\n private constructor(\n public readonly ethereum: TestEthereum,\n public readonly endpoints: Awaited<ReturnType<TestEthereum['launch']>>,\n public readonly mainchain: TestMainchain,\n mainchainClient: ArgonClient,\n deployerPrivateKey: Hex,\n proofRelayerUri: string,\n ) {\n this.mainchainClient = mainchainClient;\n this.deployer = privateKeyToAccount(deployerPrivateKey);\n this.chain = defineChain({\n id: Number.parseInt(endpoints.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: [endpoints.executionRpcUrl],\n },\n },\n });\n this.publicClient = createPublicClient({\n chain: this.chain,\n transport: http(endpoints.executionRpcUrl),\n });\n this.walletClient = createWalletClient({\n account: this.deployer,\n chain: this.chain,\n transport: http(endpoints.executionRpcUrl),\n });\n this.proofRelayer = new Keyring({ type: 'sr25519' }).createFromUri(proofRelayerUri);\n }\n\n static async launch(args: {\n testAccount: { address: Hex; balance: string; privateKey: Hex };\n proofRelayerUri: string;\n }) {\n const ethereum = new TestEthereum();\n const endpoints = await ethereum.launch({\n consensusClient: 'lodestar',\n preset: 'minimal',\n secondsPerSlot: 1,\n prefundedAccounts: {\n [args.testAccount.address]: {\n balance: args.testAccount.balance,\n },\n },\n });\n\n const mainchain = new TestMainchain();\n await mainchain.launch();\n const mainchainClient = await mainchain.client();\n\n return new EthereumProofE2eHarness(\n ethereum,\n endpoints,\n mainchain,\n mainchainClient,\n args.testAccount.privateKey,\n args.proofRelayerUri,\n );\n }\n\n async submit(tx: unknown, signer: KeyringPair) {\n const result = await new TxSubmitter(this.mainchainClient, tx as never, signer).submit();\n await result.waitForInFirstBlock;\n return result;\n }\n\n async sudoSubmit(tx: unknown) {\n const result = await this.submit(\n this.mainchainClient.tx.sudo.sudo(tx as never),\n this.sudoSigner,\n );\n const sudoEvent = result.events.find(event => this.mainchainClient.events.sudo.Sudid.is(event));\n if (!sudoEvent || !this.mainchainClient.events.sudo.Sudid.is(sudoEvent)) {\n throw new Error('sudo did not emit sudo.Sudid');\n }\n\n const sudoResult = sudoEvent.data[0] as unknown as {\n isErr: boolean;\n asErr: Parameters<typeof dispatchErrorToString>[1];\n };\n if (sudoResult.isErr) {\n throw new Error(\n `sudo failed: ${dispatchErrorToString(this.mainchainClient, sudoResult.asErr)}`,\n );\n }\n\n return result;\n }\n\n async syncVerifierThrough(minimumExecutionBlockNumber: bigint) {\n await syncEthereumVerifierUntilAnchorCovers(\n this.mainchainClient,\n this.sudoSigner,\n this.endpoints.beaconApiUrl,\n minimumExecutionBlockNumber,\n );\n }\n\n async proveGatewayActivity(gatewayAddress: Hex, throughExecutionBlockNumber: bigint) {\n const payload = await buildGatewayActivityProofPayload(this.mainchainClient, {\n executionRpcUrl: this.endpoints.executionRpcUrl,\n gatewayAddress,\n throughExecutionBlockNumber,\n });\n if (!payload) {\n throw new Error('Expected uncovered gateway activity to prove');\n }\n\n const result = await this.submit(\n this.mainchainClient.tx.crosschainTransfer.proveGatewayActivity(\n 'Ethereum',\n payload.previousGatewayActivityNonce,\n payload.proof,\n ),\n this.proofRelayer,\n );\n\n return { payload, result };\n }\n\n async configureEthereumRuntime(gateway: TestMintingGateway, mode: RuntimeSetupMode) {\n const calls = [\n this.mainchainClient.tx.crosschainTransfer.setChainConfig('Ethereum', {\n Evm: {\n chainId: BigInt(this.chain.id).toString(),\n gateway: gateway.gatewayAddress,\n argonToken: gateway.argonTokenAddress,\n argonotToken: gateway.argonotTokenAddress,\n },\n }),\n ];\n\n if (mode.kind === 'outbound') {\n const activationPricing = {\n activationGasCost: BigInt(mode.activationPricing.activationGasCost),\n signatureGasCost: BigInt(mode.activationPricing.signatureGasCost),\n estimatedWeiPerGas: BigInt(mode.activationPricing.estimatedWeiPerGas),\n estimatedMicrogonsPerEth: BigInt(mode.activationPricing.estimatedMicrogonsPerEth),\n };\n\n calls.push(\n this.mainchainClient.tx.crosschainTransfer.setMintingAuthorityActivationRepaymentPricing(\n 'Ethereum',\n {\n activationGasCost: activationPricing.activationGasCost.toString(),\n signatureGasCost: activationPricing.signatureGasCost.toString(),\n estimatedWeiPerGas: activationPricing.estimatedWeiPerGas.toString(),\n estimatedMicrogonsPerEth: activationPricing.estimatedMicrogonsPerEth.toString(),\n },\n ),\n );\n\n if (mode.minimumMintingAuthorityValue !== undefined) {\n calls.push(\n this.mainchainClient.tx.crosschainTransfer.setMinimumMintingAuthorityValue(\n 'Ethereum',\n mode.minimumMintingAuthorityValue.toString(),\n ),\n );\n }\n }\n\n calls.push(\n await getEthereumBeaconSyncBootstrapTx(this.mainchainClient, this.endpoints.beaconApiUrl),\n );\n\n const result = await this.sudoSubmit(this.mainchainClient.tx.utility.batchAll(calls as never));\n return { result };\n }\n\n async fundBurnAccount(amount: bigint) {\n const burnAccount =\n this.mainchainClient.consts.crosschainTransfer.ethereumBurnAccount.toString();\n\n // For the seeded-gateway tests we need the local burn account to mirror the Ethereum-side\n // migrated circulation exactly, without an extra existential-deposit cushion skewing the\n // gateway circulation check.\n return this.forceSetBalance(burnAccount, amount);\n }\n\n async fundProofRelayer(\n amount = this.mainchainClient.consts.balances.existentialDeposit.toBigInt() + 1_000_000n,\n ) {\n return this.submit(\n this.mainchainClient.tx.balances.transferAllowDeath(this.proofRelayer.address, amount),\n this.sudoSigner,\n );\n }\n\n async forceSetBalance(address: string, amount: bigint) {\n return this.sudoSubmit(this.mainchainClient.tx.balances.forceSetBalance(address, amount));\n }\n\n async forceSetOwnership(address: string, amount: bigint) {\n return this.sudoSubmit(this.mainchainClient.tx.ownership.forceSetBalance(address, amount));\n }\n\n async waitForExecutionFinalizedAfter(minimumExecutionBlockNumber: bigint) {\n const laterReceipt = await mineLaterExecutionAnchorReceipt(\n this.walletClient,\n this.chain,\n this.ethereum,\n this.deployer,\n minimumExecutionBlockNumber,\n );\n await waitForFinalizedBeaconExecutionAtOrAbove(\n this.ethereum,\n BigInt(laterReceipt.blockNumber),\n {\n // Matches the apps/pr/gateway-proof bootstrap guard for minimal devnets.\n minimumFinalizedSlot: MINIMAL_BOOTSTRAP_FINALIZED_SLOT,\n },\n );\n return laterReceipt;\n }\n}\n\nexport class TestMintingGateway {\n private constructor(\n public readonly harness: EthereumProofE2eHarness,\n public readonly deployment: GatewayDeployment,\n ) {}\n\n static async deploy(\n harness: EthereumProofE2eHarness,\n options: Parameters<TestEthereum['deployMintingGatewayFixture']>[0],\n ) {\n const deployment = await harness.ethereum.deployMintingGatewayFixture(options);\n return new TestMintingGateway(harness, deployment);\n }\n\n get gatewayAddress() {\n return this.deployment.gatewayAddress;\n }\n\n get argonTokenAddress() {\n return this.deployment.argonTokenAddress;\n }\n\n get argonotTokenAddress() {\n return this.deployment.argonotTokenAddress;\n }\n\n async startTransferToArgon(args: {\n account: DeployerAccount;\n amountRuntimeUnits: bigint;\n recipientArgonAddress: Hex;\n }) {\n const permitDeadline = (await this.harness.publicClient.getBlock()).timestamp + 3600n;\n const permitNonce = (await this.harness.publicClient.readContract({\n address: this.argonTokenAddress,\n abi: argonTokenAbi,\n functionName: 'nonces',\n args: [args.account.address],\n })) as bigint;\n const permitSignature = await signGatewayPermit({\n account: args.account,\n chainId: this.harness.chain.id,\n tokenAddress: this.argonTokenAddress,\n gatewayAddress: this.gatewayAddress,\n owner: args.account.address,\n value: args.amountRuntimeUnits * MINTING_GATEWAY_RUNTIME_TO_ERC20_SCALE,\n nonce: permitNonce,\n deadline: permitDeadline,\n });\n const transactionHash = await createWalletClient({\n account: args.account,\n chain: this.harness.chain,\n transport: http(this.harness.endpoints.executionRpcUrl),\n }).sendTransaction({\n account: args.account,\n chain: this.harness.chain,\n to: this.gatewayAddress,\n data: encodeFunctionData({\n abi: mintingGatewayAbi,\n functionName: 'startTransferToArgon',\n args: [\n this.argonTokenAddress,\n args.amountRuntimeUnits,\n args.recipientArgonAddress,\n permitDeadline,\n permitSignature.v,\n permitSignature.r,\n permitSignature.s,\n ],\n }),\n });\n\n return waitForExecutionReceipt(this.harness.ethereum, transactionHash);\n }\n\n async forceUpdateActiveCouncil(\n replacementCouncil: { signers: Hex[]; weights: bigint[] },\n nextMicrogonsPerArgonot: bigint,\n ) {\n return this.harness.publicClient.waitForTransactionReceipt({\n hash: await this.harness.walletClient.writeContract({\n account: this.harness.deployer,\n chain: this.harness.chain,\n address: this.gatewayAddress,\n abi: mintingGatewayAbi,\n functionName: 'forceUpdateActiveCouncil',\n args: [replacementCouncil, nextMicrogonsPerArgonot],\n }),\n });\n }\n\n async relayReadyApprovals(\n batch: Awaited<ReturnType<typeof getReadyEthereumGatewayUpdates>>,\n operatorAddress: string,\n ) {\n return this.harness.publicClient.waitForTransactionReceipt({\n hash: await this.harness.walletClient.writeContract({\n account: this.harness.deployer,\n chain: this.harness.chain,\n address: this.gatewayAddress,\n abi: mintingGatewayAbi,\n functionName: 'applyGatewayUpdates',\n args: [\n batch.currentCouncil,\n batch.updates,\n toHex(decodeAddress(operatorAddress), { size: 32 }),\n ],\n }),\n });\n }\n\n async argonApprovalsNonce(): Promise<bigint> {\n return (await this.harness.publicClient.readContract({\n address: this.gatewayAddress,\n abi: mintingGatewayAbi,\n functionName: 'argonApprovalsNonce',\n })) as bigint;\n }\n\n async globalIssuanceCouncil(): Promise<[Hex[], bigint[], Hex]> {\n return (await this.harness.publicClient.readContract({\n address: this.gatewayAddress,\n abi: mintingGatewayAbi,\n functionName: 'globalIssuanceCouncil',\n })) as [Hex[], bigint[], Hex];\n }\n\n async authorityCollateral(signingKey: Hex): Promise<[bigint, bigint]> {\n return (await this.harness.publicClient.readContract({\n address: this.gatewayAddress,\n abi: mintingGatewayAbi,\n functionName: 'mintingAuthorityCollateralRemaining',\n args: [signingKey],\n })) as [bigint, bigint];\n }\n\n async finalizeTransferOut(args: {\n transferRequest: {\n argonAccountId: Hex;\n argonTransferNonce: bigint;\n chainId: bigint;\n microgonsPerArgonot: bigint;\n recipient: Hex;\n validUntilBlock: bigint;\n token: Hex;\n amount: bigint;\n mintingAuthorityTip: bigint;\n };\n collateralizationSignature: Hex;\n micronotCollateral: bigint;\n }) {\n return this.harness.publicClient.waitForTransactionReceipt({\n hash: await this.harness.walletClient.writeContract({\n account: this.harness.deployer,\n chain: this.harness.chain,\n address: this.gatewayAddress,\n abi: mintingGatewayAbi,\n functionName: 'finalizeTransferOutOfArgon',\n args: [\n args.transferRequest,\n {\n authorizations: [\n {\n microgonCollateral: 0n,\n micronotCollateral: args.micronotCollateral,\n signature: args.collateralizationSignature,\n },\n ],\n },\n ],\n }),\n });\n }\n\n async isFinalizedTransferOut(\n transferRequest: Parameters<typeof EvmContracts.hashMintingGatewayTransferOutOfArgonRequest>[0],\n ): Promise<boolean> {\n return (await this.harness.publicClient.readContract({\n address: this.gatewayAddress,\n abi: mintingGatewayAbi,\n functionName: 'finalizedTransferOutOfArgonIds',\n args: [EvmContracts.hashMintingGatewayTransferOutOfArgonRequest(transferRequest)],\n })) as boolean;\n }\n\n async argonBalance(address: Hex): Promise<bigint> {\n return (await this.harness.publicClient.readContract({\n address: this.argonTokenAddress,\n abi: argonTokenAbi,\n functionName: 'balanceOf',\n args: [address],\n })) as bigint;\n }\n\n async fundExecutionAccount(address: Hex, value: bigint) {\n return this.harness.publicClient.waitForTransactionReceipt({\n hash: await this.harness.walletClient.sendTransaction({\n account: this.harness.deployer,\n chain: this.harness.chain,\n to: address,\n value,\n }),\n });\n }\n}\n\nexport class TestMintingAuthorityActor {\n public readonly operator: KeyringPair;\n public readonly councilSigner: DeployerAccount;\n public readonly authoritySigner: DeployerAccount;\n private gateway?: TestMintingGateway;\n\n constructor(\n public readonly harness: EthereumProofE2eHarness,\n args: {\n operatorUri: string;\n councilPrivateKey: Hex;\n authorityPrivateKey: Hex;\n },\n ) {\n this.operator = new Keyring({ type: 'sr25519' }).createFromUri(args.operatorUri);\n this.councilSigner = privateKeyToAccount(args.councilPrivateKey);\n this.authoritySigner = privateKeyToAccount(args.authorityPrivateKey);\n }\n\n attachGateway(gateway: TestMintingGateway) {\n this.gateway = gateway;\n }\n\n async prepareOperator(args: {\n freeBalance: bigint;\n ownershipBalance: bigint;\n committedArgonots: bigint;\n bitcoinXpub: string;\n }) {\n await this.harness.forceSetBalance(this.operator.address, args.freeBalance);\n await this.harness.forceSetOwnership(this.operator.address, args.ownershipBalance);\n\n const vault = await Vault.create(this.harness.mainchainClient, this.operator, {\n securitization: 1_000_000_000n,\n securitizationRatio: 1,\n annualPercentRate: 0.05,\n baseFee: 0n,\n bitcoinXpub: args.bitcoinXpub,\n treasuryProfitSharing: 0,\n treasuryBonusProfitSharing: 0,\n });\n await vault.getVault();\n\n await this.harness.sudoSubmit(\n this.harness.mainchainClient.tx.priceIndex.setOperator(this.operator.address),\n );\n\n const currentTick = await this.harness.mainchainClient.query.ticks.currentTick();\n await this.harness.submit(\n this.harness.mainchainClient.tx.priceIndex.submit(\n {\n btcUsdPrice: toFixedNumber(60_000, 18),\n argonotUsdPrice: toFixedNumber(1, 18),\n argonUsdPrice: toFixedNumber(1, 18),\n argonUsdTargetPrice: toFixedNumber(1, 18),\n argonTimeWeightedAverageLiquidity: toFixedNumber(1_000_000, 18),\n tick: currentTick.toBigInt(),\n },\n null,\n ),\n this.operator,\n );\n\n await this.harness.submit(\n this.harness.mainchainClient.tx.vaults.setCommittedArgonots(args.committedArgonots),\n this.operator,\n );\n }\n\n async registerCouncilSigner() {\n return this.harness.submit(\n this.harness.mainchainClient.tx.crosschainTransfer.registerCouncilSigner(\n 'Ethereum',\n this.councilSigner.address,\n toArgonKeccakSignature(\n await this.councilSigner.signMessage({\n message: { raw: toHex(this.registrationMessage('argon/council-signer/v2')) },\n }),\n ),\n ),\n this.operator,\n );\n }\n\n async forceSingleMemberCouncil() {\n await this.harness.sudoSubmit(\n this.harness.mainchainClient.tx.crosschainTransfer.forceSetGlobalIssuanceCouncil(\n 'Ethereum',\n 0,\n [this.operator.address],\n ),\n );\n\n const activeCouncilHashOption =\n await this.harness.mainchainClient.query.crosschainTransfer.activeGlobalIssuanceCouncilByDestinationChain(\n 'Ethereum',\n );\n if (activeCouncilHashOption.isNone) {\n throw new Error('Expected active Ethereum council hash');\n }\n\n const activeCouncilOption =\n await this.harness.mainchainClient.query.crosschainTransfer.globalIssuanceCouncilByHash(\n activeCouncilHashOption.unwrap(),\n );\n if (activeCouncilOption.isNone) {\n throw new Error('Expected active Ethereum council');\n }\n\n const activeCouncil = activeCouncilOption.unwrap();\n const currentCouncil = [...activeCouncil.members.entries()]\n .map(([signer, member]) => ({\n signer: signer.toHex(),\n weight: member.weight.toBigInt(),\n }))\n .sort((left, right) => left.signer.localeCompare(right.signer));\n\n return {\n activeCouncilHash: activeCouncilHashOption.unwrap().toHex(),\n activeCouncil,\n currentCouncil: {\n signers: currentCouncil.map(member => member.signer),\n weights: currentCouncil.map(member => member.weight),\n },\n };\n }\n\n async registerMintingAuthority(micronotCollateral: bigint) {\n return this.harness.submit(\n this.harness.mainchainClient.tx.crosschainTransfer.registerMintingAuthority(\n 'Ethereum',\n this.authoritySigner.address,\n toArgonKeccakSignature(\n await this.authoritySigner.signMessage({\n message: {\n raw: toHex(this.registrationMessage('argon/minting-authority-signer/v2')),\n },\n }),\n ),\n 0n,\n micronotCollateral,\n ),\n this.operator,\n );\n }\n\n async approveActivationQueueEntry(queueNonce = 1n) {\n const approvalQueueEntry =\n await this.harness.mainchainClient.query.crosschainTransfer.councilApprovalQueueByDestinationChainAndNonce(\n 'Ethereum',\n queueNonce,\n );\n if (approvalQueueEntry.isNone) {\n throw new Error(`Expected queue nonce ${queueNonce} to exist`);\n }\n\n const councilApprovalSignature = await this.councilSigner.signMessage({\n message: {\n raw: approvalQueueEntry.unwrap().approvalHash.toHex(),\n },\n });\n await this.harness.submit(\n this.harness.mainchainClient.tx.crosschainTransfer.approveQueueEntries(\n 'Ethereum',\n new Vec(this.harness.mainchainClient.registry, U8aFixed.with(520), [\n new U8aFixed(\n this.harness.mainchainClient.registry,\n toArgonKeccakSignature(councilApprovalSignature),\n 520,\n ),\n ]),\n ),\n this.operator,\n );\n\n const batch = await getReadyEthereumGatewayUpdates(\n this.harness.mainchainClient,\n this.harness.publicClient,\n );\n\n return {\n approvalQueueEntry,\n councilApprovalSignature,\n batch,\n };\n }\n\n async collateralizeFirstPendingTransferOut() {\n const gateway = this.requireGateway();\n const pendingRequests =\n await this.harness.mainchainClient.query.crosschainTransfer.pendingCollateralizationRequestsByChain(\n 'Ethereum',\n );\n if (pendingRequests.length === 0) {\n throw new Error('Expected a pending collateralization request');\n }\n\n const pendingRequest = pendingRequests[0];\n const transferId = pendingRequest.transferId.toHex();\n const transferOption =\n await this.harness.mainchainClient.query.crosschainTransfer.transferOutById(transferId);\n if (transferOption.isNone) {\n throw new Error(`Expected transfer out ${transferId} to exist`);\n }\n\n const transfer = transferOption.unwrap();\n const transferRequest = {\n argonAccountId: transfer.argonAccountId.toHex(),\n argonTransferNonce: transfer.argonTransferNonce.toBigInt(),\n chainId: BigInt(this.harness.chain.id),\n microgonsPerArgonot: transfer.microgonsPerArgonot.toBigInt(),\n recipient: transfer.destinationAccount.toHex(),\n validUntilBlock: transfer.validUntilEthereumBlock.toBigInt(),\n token: gateway.argonTokenAddress,\n amount: transfer.amount.toBigInt(),\n mintingAuthorityTip: transfer.mintingAuthorityTip.toBigInt(),\n };\n const micronotCollateral = transfer.amount.toBigInt();\n const collateralizationHash = EvmContracts.hashMintingGatewayMintingAuthorization(\n { chainId: BigInt(this.harness.chain.id), gatewayAddress: gateway.gatewayAddress },\n {\n request: transferRequest,\n microgonCollateral: 0n,\n micronotCollateral,\n },\n );\n const collateralizationSignature = await this.authoritySigner.signMessage({\n message: {\n raw: collateralizationHash,\n },\n });\n\n const result = await this.harness.submit(\n this.harness.mainchainClient.tx.crosschainTransfer.collateralizeTransfer(\n transferId,\n toArgonKeccakSignature(collateralizationSignature),\n 0n,\n micronotCollateral,\n ),\n this.operator,\n );\n\n return {\n pendingRequest,\n transferId,\n transferRequest,\n micronotCollateral,\n collateralizationSignature,\n result,\n };\n }\n\n private registrationMessage(prefix: string) {\n const prefixBytes = this.harness.mainchainClient.registry.createType('Bytes', prefix).toU8a();\n const destinationChainBytes = this.harness.mainchainClient.registry\n .createType('PalletCrosschainTransferSourceChain', 'Ethereum')\n .toU8a();\n const operatorAccountIdBytes = this.harness.mainchainClient.registry\n .createType('AccountId32', this.operator.address)\n .toU8a();\n\n return concatBytes(prefixBytes, destinationChainBytes, operatorAccountIdBytes);\n }\n\n private requireGateway() {\n if (!this.gateway) {\n throw new Error('Minting authority actor requires an attached TestMintingGateway');\n }\n\n return this.gateway;\n }\n}\n\nfunction concatBytes(...parts: Uint8Array[]) {\n const totalLength = parts.reduce((sum, part) => sum + part.length, 0);\n const bytes = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const part of parts) {\n bytes.set(part, offset);\n offset += part.length;\n }\n\n return bytes;\n}\n"],"mappings":"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","names":["waitForExecutionReceipt","import_mainchain","child_process","process","HttpProxy","resolve","port","teardown","process","Path","pg","url","result","resolve","fs","Path","readline","import_nanoid","import_mainchain","nanoid","url","port","resolve","child_process","import_mainchain","fs","readline","process","Path","fs","Path","import_node_child_process","import_detect_port","import_mainchain","port","url","resolve","Path","env","port","import_mainchain","import_viem","delay","waitForExecutionReceipt","resolve","import_mainchain","import_viem","hashMintingGatewayGlobalIssuanceCouncil","import_mainchain","import_accounts","import_viem","mintingGatewayAbi","waitForExecutionReceipt","sudo"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/TestNotary.ts","../src/support.ts","../src/TestMainchain.ts","../src/TestOracle.ts","../src/TestEthereum.ts","../src/TestNetwork.ts","../src/EthereumE2eUtils.ts","../src/EthereumGatewayQueue.ts","../src/TestEthereumProofActors.ts"],"sourcesContent":["import { ArgonClient, Keyring, KeyringPair, TxSubmitter } from '@argonprotocol/mainchain';\nimport TestNotary from './TestNotary';\nimport TestMainchain from './TestMainchain';\nimport TestOracle from './TestOracle';\nimport TestEthereum from './TestEthereum';\nimport { startNetwork } from './TestNetwork';\nexport {\n addTeardown,\n cleanHostForDocker,\n closeOnTeardown,\n disconnectOnTeardown,\n getDockerPortMapping,\n getProxy,\n type ITeardownable,\n projectRoot,\n runOnTeardown,\n runTestScript,\n SKIP_E2E,\n teardown,\n} from './support';\n\nexport {\n mineLaterExecutionAnchorReceipt,\n signGatewayPermit,\n syncEthereumVerifierUntilAnchorCovers,\n toArgonKeccakSignature,\n toEvmRecoverableSignature,\n waitForExecutionReceipt,\n waitForFinalizedBeaconExecutionAtOrAbove,\n} from './EthereumE2eUtils';\nexport {\n getReadyEthereumGatewayUpdates,\n type EthereumGatewayUpdateBatch,\n} from './EthereumGatewayQueue';\nexport {\n EthereumProofE2eHarness,\n TestMintingAuthorityActor,\n TestMintingGateway,\n} from './TestEthereumProofActors';\nexport { TestNotary, TestMainchain, TestOracle, TestEthereum, startNetwork };\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\n return value;\n },\n 2,\n );\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 './support';\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 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';\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 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 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\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","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 './support';\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 { Keyring, KeyringPair } from '@argonprotocol/mainchain';\nimport * as fs from 'node:fs';\nimport * as readline from 'node:readline';\nimport { addTeardown, ITeardownable, projectRoot } from './support';\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 { EvmContracts } from '@argonprotocol/mainchain';\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 './support';\n\nconst {\n argonTokenArtifact,\n argonotTokenArtifact,\n hashMintingGatewayGlobalIssuanceCouncil,\n mintingGatewayArtifact,\n proxyAdminArtifact,\n transparentUpgradeableProxyArtifact,\n} = EvmContracts;\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 DEFAULT_INITIAL_MICROGONS_PER_ARGONOT = 1_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 initialMicrogonsPerArgonot?: bigint;\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 const bootstrapCouncil = {\n signers: [adminSafe],\n weights: [1n],\n } as const;\n const initialMicrogonsPerArgonot =\n options.initialMicrogonsPerArgonot ?? DEFAULT_INITIAL_MICROGONS_PER_ARGONOT;\n const bootstrapCouncilHash = hashMintingGatewayGlobalIssuanceCouncil({\n ...bootstrapCouncil,\n epochMicrogonsPerArgonot: initialMicrogonsPerArgonot,\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: [\n adminSafe,\n guardianSafe,\n bootstrapCouncilHash,\n BigInt(bootstrapCouncil.signers.length),\n 1n,\n initialMicrogonsPerArgonot,\n ],\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: 'migrate',\n args: [\n {\n recipients: [options.seedArgonRecipient],\n amounts: [options.seedArgonAmountBaseUnits ?? DEFAULT_SEED_ARGON_AMOUNT_BASE_UNITS],\n },\n {\n recipients: [],\n amounts: [],\n },\n ],\n }),\n });\n const mintReceipt = await waitForExecutionReceipt(publicClient, mintHash);\n if (mintReceipt.status !== 'success') {\n throw new Error('MintingGateway migrate 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 * as docker from 'docker-compose';\nimport { runOnTeardown } from './support';\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","import {\n getLatestArgonFinalizedExecutionHeader,\n getNextEthereumBeaconSyncTxs,\n hexToU8a,\n isOutdatedTransactionError,\n type ArgonClient,\n type EthereumBeaconBlockResponse,\n type EthereumBeaconHeaderDetailsResponse,\n type EthereumReceipt,\n type KeyringPair,\n TxSubmitter,\n u8aToHex,\n} from '@argonprotocol/mainchain';\nimport { privateKeyToAccount } from 'viem/accounts';\nimport type { Hex, RpcTransactionReceipt } from 'viem';\nimport { createWalletClient, defineChain, parseSignature } from 'viem';\nimport TestEthereum from './TestEthereum';\n\nexport async function signGatewayPermit(args: {\n account: ReturnType<typeof privateKeyToAccount>;\n chainId: number;\n tokenAddress: Hex;\n gatewayAddress: Hex;\n owner: Hex;\n value: bigint;\n nonce: bigint;\n deadline: bigint;\n}) {\n const signature = parseSignature(\n await args.account.signTypedData({\n domain: {\n name: 'Argon',\n version: '1',\n chainId: args.chainId,\n verifyingContract: args.tokenAddress,\n },\n types: {\n Permit: [\n { name: 'owner', type: 'address' },\n { name: 'spender', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n ],\n },\n primaryType: 'Permit',\n message: {\n owner: args.owner,\n spender: args.gatewayAddress,\n value: args.value,\n nonce: args.nonce,\n deadline: args.deadline,\n },\n }),\n );\n\n return {\n v: Number(signature.v),\n r: signature.r,\n s: signature.s,\n };\n}\n\nexport async function waitForFinalizedBeaconExecutionAtOrAbove(\n ethereum: TestEthereum,\n minimumExecutionBlockNumber: bigint,\n options: {\n minimumFinalizedSlot?: bigint;\n } = {},\n) {\n const startedAt = Date.now();\n const minimumFinalizedSlot = options.minimumFinalizedSlot ?? 0n;\n\n let lastSeenExecutionBlockNumber = 0n;\n let lastSeenHeadSlot = 0n;\n let lastSeenFinalizedSlot = 0n;\n let lastError: Error | undefined;\n\n while (Date.now() - startedAt < 300_000) {\n try {\n const [headHeader, finalizedHeader] = await Promise.all([\n ethereum.getBeacon<EthereumBeaconHeaderDetailsResponse>('/eth/v1/beacon/headers/head'),\n ethereum.getBeacon<EthereumBeaconHeaderDetailsResponse>('/eth/v1/beacon/headers/finalized'),\n ]);\n lastSeenHeadSlot = BigInt(headHeader.data.header.message.slot);\n lastSeenFinalizedSlot = BigInt(finalizedHeader.data.header.message.slot);\n const block = await ethereum.getBeacon<EthereumBeaconBlockResponse>(\n `/eth/v2/beacon/blocks/${finalizedHeader.data.root}`,\n );\n const executionBlockNumber = BigInt(block.data.message.body.execution_payload.block_number);\n lastSeenExecutionBlockNumber = executionBlockNumber;\n lastError = undefined;\n\n if (\n executionBlockNumber >= minimumExecutionBlockNumber &&\n lastSeenFinalizedSlot >= minimumFinalizedSlot\n ) {\n return { header: finalizedHeader, block };\n }\n } catch (error) {\n if (!(error instanceof Error)) {\n throw error;\n }\n lastError = error;\n }\n\n await delay(1_000);\n }\n\n const lastErrorSuffix = lastError ? `; last beacon error was: ${lastError.message}` : '';\n throw new Error(\n `Timed out waiting for finalized beacon execution block at or above ${minimumExecutionBlockNumber} and finalized slot at or above ${minimumFinalizedSlot}; last seen head slot was ${lastSeenHeadSlot}, finalized slot was ${lastSeenFinalizedSlot}, and finalized execution block was ${lastSeenExecutionBlockNumber}${lastErrorSuffix}`,\n );\n}\n\nexport async function mineLaterExecutionAnchorReceipt(\n walletClient: Pick<ReturnType<typeof createWalletClient>, 'sendTransaction'>,\n chain: ReturnType<typeof defineChain>,\n ethereum: TestEthereum,\n account: ReturnType<typeof privateKeyToAccount>,\n minimumBlockNumber: bigint,\n) {\n while (true) {\n const transactionHash = await walletClient.sendTransaction({\n account,\n chain,\n to: account.address,\n value: 0n,\n });\n const receipt = await waitForExecutionReceipt(ethereum, transactionHash);\n\n if (BigInt(receipt.blockNumber) > minimumBlockNumber) {\n return receipt;\n }\n }\n}\n\nexport async function waitForExecutionReceipt(\n ethereum: TestEthereum,\n transactionHash: Hex,\n): Promise<EthereumReceipt> {\n const startedAt = Date.now();\n\n while (Date.now() - startedAt < 120_000) {\n try {\n const receipt = await ethereum.callExecution<RpcTransactionReceipt | null>(\n 'eth_getTransactionReceipt',\n [transactionHash],\n );\n\n if (receipt) {\n return receipt as unknown as EthereumReceipt;\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 (!errorText.includes('indexing is in progress')) {\n throw error;\n }\n }\n\n await delay(500);\n }\n\n throw new Error(`Timed out waiting for execution receipt ${transactionHash}`);\n}\n\nexport async function syncEthereumVerifierUntilAnchorCovers(\n mainchainClient: ArgonClient,\n relayer: KeyringPair,\n beaconApiUrl: string,\n minimumExecutionBlockNumber: bigint,\n) {\n const startedAt = Date.now();\n const timeoutMs = 5 * 60_000;\n let lastRetryableError: Error | undefined;\n let lastAnchorBlockNumber: bigint | undefined;\n\n while (Date.now() - startedAt < timeoutMs) {\n try {\n const anchor = await getLatestArgonFinalizedExecutionHeader(mainchainClient);\n lastAnchorBlockNumber = anchor.blockNumber;\n if (anchor.blockNumber >= minimumExecutionBlockNumber) {\n return;\n }\n } catch {}\n\n const txs = await getNextEthereumBeaconSyncTxs(mainchainClient, beaconApiUrl);\n if (txs.length === 0) {\n await delay(500);\n continue;\n }\n\n let shouldRetry = false;\n for (const tx of txs) {\n try {\n const result = await new TxSubmitter(mainchainClient, tx, relayer).submit();\n await result.waitForInFirstBlock;\n lastRetryableError = undefined;\n } catch (error) {\n if (isRetryableEthereumVerifierSyncError(error)) {\n lastRetryableError = error instanceof Error ? error : new Error(String(error));\n shouldRetry = true;\n break;\n }\n throw error;\n }\n }\n\n if (shouldRetry) {\n await delay(500);\n }\n }\n\n throw (\n lastRetryableError ??\n new Error(\n `Ethereum verifier did not retain an anchor at or above execution block ${minimumExecutionBlockNumber} within ${Math.floor(timeoutMs / 1000)}s; last seen anchor was ${lastAnchorBlockNumber ?? 'unavailable'}`,\n )\n );\n}\n\nexport function toArgonKeccakSignature(signature: Hex): Hex {\n const bytes = hexToU8a(signature);\n if (bytes.length !== 65) {\n throw new Error(`Expected 65-byte ECDSA signature, received ${bytes.length} bytes`);\n }\n if (bytes[64] >= 27) {\n bytes[64] -= 27;\n }\n return u8aToHex(bytes);\n}\n\nexport function toEvmRecoverableSignature(signature: Hex): Hex {\n const bytes = hexToU8a(signature);\n if (bytes.length !== 65) {\n throw new Error(`Expected 65-byte ECDSA signature, received ${bytes.length} bytes`);\n }\n if (bytes[64] <= 1) {\n bytes[64] += 27;\n }\n return u8aToHex(bytes);\n}\n\nfunction isRetryableEthereumVerifierSyncError(error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n\n return (\n isOutdatedTransactionError(error) ||\n message.includes('ethereumVerifier.InvalidHeaderMerkleProof')\n );\n}\n\nasync function delay(ms: number): Promise<void> {\n await new Promise(resolve => setTimeout(resolve, ms));\n}\n","import {\n EvmContracts,\n type IArgonQueryable,\n type PalletCrosschainTransferCouncilApprovalQueueEntry,\n} from '@argonprotocol/mainchain';\nimport type { ContractFunctionArgs } from 'viem';\nimport { getAddress, keccak256, type Address, type Hex } from 'viem';\nimport { toEvmRecoverableSignature } from './EthereumE2eUtils';\n\nconst {\n encodeMintingGatewayGlobalIssuanceCouncilRotateTarget,\n encodeMintingGatewayMintingAuthorityActivationTarget,\n encodeMintingGatewayMintingAuthorityDeactivateTarget,\n hashMintingGatewayActivateMintingAuthority,\n hashMintingGatewayGatewayUpdateApproval,\n hashMintingGatewayGlobalIssuanceCouncil,\n hashMintingGatewayRotateGlobalIssuanceCouncil,\n hashMintingGatewayRotateGlobalIssuanceCouncilApproval,\n mintingGatewayAbi,\n MINTING_GATEWAY_UPDATE_KINDS,\n} = EvmContracts;\n\ntype MintingGatewayHashContext = Parameters<\n typeof EvmContracts.hashMintingGatewayGatewayUpdateApproval\n>[0];\ntype MintingGatewayMintingAuthorityActivationTarget = Parameters<\n typeof EvmContracts.encodeMintingGatewayMintingAuthorityActivationTarget\n>[0];\ntype MintingGatewayGlobalIssuanceCouncilRotateTarget = Parameters<\n typeof EvmContracts.encodeMintingGatewayGlobalIssuanceCouncilRotateTarget\n>[0];\ntype ApplyGatewayUpdatesArgs = ContractFunctionArgs<\n typeof EvmContracts.mintingGatewayAbi,\n 'nonpayable',\n 'applyGatewayUpdates'\n>;\ntype MintingGatewayCouncilSnapshot = ApplyGatewayUpdatesArgs[0];\ntype MintingGatewayGatewayUpdate = ApplyGatewayUpdatesArgs[1][number];\n\nexport type EthereumGatewayUpdateBatch = {\n destinationChain: 'Ethereum';\n chainId: bigint;\n gatewayAddress: Address;\n currentCouncilHash: Hex;\n currentCouncil: MintingGatewayCouncilSnapshot;\n argonApprovalsNonce: bigint;\n argonApprovalsHash: Hex;\n paused: boolean;\n firstQueueNonce?: bigint;\n lastQueueNonce?: bigint;\n updates: MintingGatewayGatewayUpdate[];\n};\n\ntype LoadedCouncil = {\n epochMicrogonsPerArgonot: bigint;\n totalWeight: bigint;\n members: {\n signer: Address;\n weight: bigint;\n }[];\n};\n\ntype ApprovalQueueEntry = PalletCrosschainTransferCouncilApprovalQueueEntry;\n\nexport async function getReadyEthereumGatewayUpdates(\n client: IArgonQueryable,\n gatewayClient: {\n readContract: (...args: any[]) => Promise<unknown>;\n },\n options: {\n destinationChain?: 'Ethereum';\n maxQueueEntries?: number;\n } = {},\n): Promise<EthereumGatewayUpdateBatch> {\n const destinationChain = options.destinationChain ?? 'Ethereum';\n const maxQueueEntries = options.maxQueueEntries ?? 100;\n if (maxQueueEntries < 1) {\n throw new Error(`maxQueueEntries must be at least 1, received ${maxQueueEntries}`);\n }\n\n const chainConfigOption =\n await client.query.crosschainTransfer.chainConfigBySourceChain(destinationChain);\n if (chainConfigOption.isNone) {\n throw new Error(`Crosschain config not found for ${destinationChain}`);\n }\n\n const chainConfig = chainConfigOption.unwrap();\n if (!chainConfig.isEvm) {\n throw new Error(`Chain config for ${destinationChain} is not EVM-shaped`);\n }\n\n const gatewayAddress = getAddress(toHexValue(chainConfig.asEvm.gateway));\n const chainId = chainConfig.asEvm.chainId.toBigInt();\n const hashContext: MintingGatewayHashContext = { chainId, gatewayAddress };\n\n const currentCouncilHashOption =\n await client.query.crosschainTransfer.activeGlobalIssuanceCouncilByDestinationChain(\n destinationChain,\n );\n if (currentCouncilHashOption.isNone) {\n throw new Error(`Active GlobalIssuanceCouncil not found for ${destinationChain}`);\n }\n\n const currentCouncilHash = toHexValue(currentCouncilHashOption.unwrap());\n const councilCache = new Map<Hex, LoadedCouncil>();\n const currentCouncil = councilToSnapshot(\n await loadCouncilByHash(client, currentCouncilHash, councilCache),\n );\n\n const [rawArgonApprovalsNonce, rawArgonApprovalsHash, rawPaused] = await Promise.all([\n gatewayClient.readContract({\n abi: mintingGatewayAbi,\n address: gatewayAddress,\n functionName: 'argonApprovalsNonce',\n }),\n gatewayClient.readContract({\n abi: mintingGatewayAbi,\n address: gatewayAddress,\n functionName: 'argonApprovalsHash',\n }),\n gatewayClient.readContract({\n abi: mintingGatewayAbi,\n address: gatewayAddress,\n functionName: 'paused',\n }),\n ]);\n const argonApprovalsNonce = rawArgonApprovalsNonce as bigint;\n const argonApprovalsHash = rawArgonApprovalsHash as Hex;\n const paused = rawPaused as boolean;\n\n const candidateUpdates: MintingGatewayGatewayUpdate[] = [];\n let expectedPreviousApprovalHash = argonApprovalsHash;\n let readyQueueEntriesScanned = 0;\n\n if (!paused) {\n for (\n let queueNonce = argonApprovalsNonce + 1n;\n readyQueueEntriesScanned < maxQueueEntries;\n queueNonce += 1n\n ) {\n const entryOption =\n await client.query.crosschainTransfer.councilApprovalQueueByDestinationChainAndNonce(\n destinationChain,\n queueNonce,\n );\n if (entryOption.isNone) {\n break;\n }\n\n const entry = entryOption.unwrap();\n const approvingCouncilHash = toHexValue(entry.approvingCouncilHash);\n const approvingCouncil = await loadCouncilByHash(client, approvingCouncilHash, councilCache);\n if (!queueEntryHasQuorum(entry, approvingCouncil)) {\n break;\n }\n readyQueueEntriesScanned += 1;\n\n if (toHexValue(entry.previousApprovalHash) !== expectedPreviousApprovalHash) {\n throw new Error(\n `Queue nonce ${queueNonce} expected previous approval hash ${expectedPreviousApprovalHash}, received ${toHexValue(entry.previousApprovalHash)}`,\n );\n }\n\n const update = await buildGatewayUpdate(client, destinationChain, hashContext, queueNonce, {\n entry,\n approvingCouncilHash,\n councilCache,\n });\n candidateUpdates.push(update);\n expectedPreviousApprovalHash = toHexValue(entry.approvalHash);\n }\n }\n\n const updates = candidateUpdates;\n for (let index = 0; index < updates.length; index += 1) {\n const isBorder =\n updates[index].kind === MINTING_GATEWAY_UPDATE_KINDS.globalIssuanceCouncilRotate ||\n index === updates.length - 1;\n if (isBorder || updates[index].signatures.length === 0) continue;\n updates[index] = {\n ...updates[index],\n signatures: [],\n };\n }\n const firstQueueNonce = updates[0]?.queueNonce;\n const lastQueueNonce = updates[updates.length - 1]?.queueNonce;\n\n return {\n destinationChain,\n chainId,\n gatewayAddress,\n currentCouncilHash,\n currentCouncil,\n argonApprovalsNonce,\n argonApprovalsHash,\n paused,\n ...(firstQueueNonce !== undefined ? { firstQueueNonce, lastQueueNonce } : {}),\n updates,\n };\n}\n\nasync function buildGatewayUpdate(\n client: IArgonQueryable,\n destinationChain: 'Ethereum',\n hashContext: MintingGatewayHashContext,\n queueNonce: bigint,\n queueItem: {\n entry: ApprovalQueueEntry;\n approvingCouncilHash: Hex;\n councilCache: Map<Hex, LoadedCouncil>;\n },\n): Promise<MintingGatewayGatewayUpdate> {\n const { entry, approvingCouncilHash, councilCache } = queueItem;\n if (entry.target.isGlobalIssuanceCouncilRotation) {\n const signatures = getSortedSignatures(entry.signatures);\n const nextCouncilHash = toHexValue(entry.target.asGlobalIssuanceCouncilRotation);\n const nextCouncil = await loadCouncilByHash(client, nextCouncilHash, councilCache);\n const target: MintingGatewayGlobalIssuanceCouncilRotateTarget = {\n council: councilToSnapshot(nextCouncil),\n epochMicrogonsPerArgonot: nextCouncil.epochMicrogonsPerArgonot,\n };\n const calculatedCouncilHash = hashMintingGatewayGlobalIssuanceCouncil({\n ...target.council,\n epochMicrogonsPerArgonot: target.epochMicrogonsPerArgonot,\n });\n const targetPayloadHash = hashMintingGatewayRotateGlobalIssuanceCouncil(hashContext, target);\n const approvalHash = hashMintingGatewayRotateGlobalIssuanceCouncilApproval(hashContext, {\n queueNonce,\n approvingCouncilHash,\n previousUpdateHash: toHexValue(entry.previousApprovalHash),\n target,\n });\n\n if (calculatedCouncilHash !== nextCouncilHash) {\n throw new Error(`Queue nonce ${queueNonce} target council hash does not match council`);\n }\n if (toHexValue(entry.targetPayloadHash) !== targetPayloadHash) {\n throw new Error(`Queue nonce ${queueNonce} target payload hash does not match council`);\n }\n if (toHexValue(entry.approvalHash) !== approvalHash) {\n throw new Error(`Queue nonce ${queueNonce} approval hash does not match council rotation`);\n }\n\n return {\n queueNonce,\n kind: MINTING_GATEWAY_UPDATE_KINDS.globalIssuanceCouncilRotate,\n payload: encodeMintingGatewayGlobalIssuanceCouncilRotateTarget(target),\n signatures,\n };\n }\n\n if (entry.target.isMintingAuthorityActivation) {\n const signatures = getSortedSignatures(entry.signatures);\n const signingKey = getAddress(toHexValue(entry.target.asMintingAuthorityActivation));\n const authorityOption =\n await client.query.crosschainTransfer.mintingAuthoritiesBySigner(signingKey);\n if (authorityOption.isNone) {\n throw new Error(\n `Minting authority activation ${signingKey} not found for queue nonce ${queueNonce}`,\n );\n }\n\n const authority = authorityOption.unwrap();\n if (authority.destinationChain.type !== destinationChain) {\n throw new Error(\n `Minting authority ${signingKey} belongs to ${String(authority.destinationChain.type)}, expected ${String(destinationChain)}`,\n );\n }\n\n const target: MintingGatewayMintingAuthorityActivationTarget = {\n microgonCollateral: authority.gatewayRemainingMicrogonCollateral.toBigInt(),\n micronotCollateral: authority.gatewayRemainingMicronotCollateral.toBigInt(),\n signingKey,\n };\n const payload = encodeMintingGatewayMintingAuthorityActivationTarget(target);\n const targetPayloadHash = hashMintingGatewayActivateMintingAuthority(hashContext, target);\n const approvalHash = hashMintingGatewayGatewayUpdateApproval(hashContext, {\n queueNonce,\n approvingCouncilHash,\n kind: MINTING_GATEWAY_UPDATE_KINDS.mintingAuthorityActivate,\n targetId: `0x${signingKey.slice(2).padStart(64, '0').toLowerCase()}`,\n targetPayloadHash,\n previousUpdateHash: toHexValue(entry.previousApprovalHash),\n });\n\n if (toHexValue(entry.targetPayloadHash) !== targetPayloadHash) {\n throw new Error(`Queue nonce ${queueNonce} target payload hash does not match authority`);\n }\n if (toHexValue(entry.approvalHash) !== approvalHash) {\n throw new Error(\n `Queue nonce ${queueNonce} approval hash does not match authority: actual=${toHexValue(entry.approvalHash)} expected=${approvalHash} previous=${toHexValue(entry.previousApprovalHash)} council=${approvingCouncilHash} targetPayload=${toHexValue(entry.targetPayloadHash)}`,\n );\n }\n\n return {\n queueNonce,\n kind: MINTING_GATEWAY_UPDATE_KINDS.mintingAuthorityActivate,\n payload,\n signatures,\n };\n }\n\n if (entry.target.isMintingAuthorityDeactivation) {\n const signingKey = getAddress(toHexValue(entry.target.asMintingAuthorityDeactivation));\n const payload = encodeMintingGatewayMintingAuthorityDeactivateTarget({ signingKey });\n const targetPayloadHash = keccak256(payload);\n const approvalHash = hashMintingGatewayGatewayUpdateApproval(hashContext, {\n queueNonce,\n approvingCouncilHash,\n kind: MINTING_GATEWAY_UPDATE_KINDS.mintingAuthorityDeactivate,\n targetId: signingKeyTargetId(signingKey),\n targetPayloadHash,\n previousUpdateHash: toHexValue(entry.previousApprovalHash),\n });\n\n if (toHexValue(entry.targetPayloadHash) !== targetPayloadHash) {\n throw new Error(`Queue nonce ${queueNonce} target payload hash does not match deactivation`);\n }\n if (toHexValue(entry.approvalHash) !== approvalHash) {\n throw new Error(\n `Queue nonce ${queueNonce} approval hash does not match deactivation: actual=${toHexValue(entry.approvalHash)} expected=${approvalHash} previous=${toHexValue(entry.previousApprovalHash)} council=${approvingCouncilHash}`,\n );\n }\n\n return {\n queueNonce,\n kind: MINTING_GATEWAY_UPDATE_KINDS.mintingAuthorityDeactivate,\n payload,\n signatures: getSortedSignatures(entry.signatures),\n };\n }\n\n throw new Error(`Unsupported approval queue target ${entry.target.type}`);\n}\n\nasync function loadCouncilByHash(\n client: IArgonQueryable,\n councilHash: Hex,\n cache: Map<Hex, LoadedCouncil>,\n): Promise<LoadedCouncil> {\n const cached = cache.get(councilHash);\n if (cached) {\n return cached;\n }\n\n const councilOption =\n await client.query.crosschainTransfer.globalIssuanceCouncilByHash(councilHash);\n if (councilOption.isNone) {\n throw new Error(`GlobalIssuanceCouncil ${councilHash} not found`);\n }\n\n const council = councilOption.unwrap();\n const loaded = {\n epochMicrogonsPerArgonot: council.epochMicrogonsPerArgonot.toBigInt(),\n totalWeight: council.totalWeight.toBigInt(),\n members: [...council.members.entries()]\n .map(([signer, member]) => ({\n signer: getAddress(toHexValue(signer)),\n weight: member.weight.toBigInt(),\n }))\n .sort((left, right) => left.signer.localeCompare(right.signer)),\n };\n\n cache.set(councilHash, loaded);\n return loaded;\n}\n\nfunction queueEntryHasQuorum(entry: ApprovalQueueEntry, council: LoadedCouncil): boolean {\n let signedWeight = 0n;\n\n for (const [signer] of entry.signatures.entries()) {\n const signerAddress = getAddress(toHexValue(signer));\n const member = council.members.find(x => x.signer === signerAddress);\n if (!member) {\n throw new Error(`Signature submitted by ${signerAddress}, which is not in the council`);\n }\n\n signedWeight += member.weight;\n }\n\n if (signedWeight * 100n >= council.totalWeight * 90n) {\n return true;\n }\n\n const unsignedMemberCount = council.members.length - entry.signatures.size;\n return unsignedMemberCount <= 2 && signedWeight * 100n >= council.totalWeight * 80n;\n}\n\nfunction councilToSnapshot(council: LoadedCouncil): MintingGatewayCouncilSnapshot {\n return {\n signers: council.members.map(member => member.signer),\n weights: council.members.map(member => member.weight),\n };\n}\n\nfunction signingKeyTargetId(signingKey: Address): Hex {\n return `0x${signingKey.slice(2).padStart(64, '0').toLowerCase()}`;\n}\n\nfunction getSortedSignatures(\n signatures: ApprovalQueueEntry['signatures'],\n): MintingGatewayGatewayUpdate['signatures'] {\n return [...signatures.entries()]\n .sort(([leftSigner], [rightSigner]) =>\n toHexValue(leftSigner).localeCompare(toHexValue(rightSigner)),\n )\n .map(([, signature]) => toEvmRecoverableSignature(toHexValue(signature)));\n}\n\nfunction toHexValue(value: { toHex(): string }): Hex {\n return value.toHex() as Hex;\n}\n","import {\n type ArgonClient,\n buildGatewayActivityProofPayload,\n decodeAddress,\n dispatchErrorToString,\n EvmContracts,\n getEthereumBeaconSyncBootstrapTx,\n Keyring,\n type KeyringPair,\n toFixedNumber,\n TxSubmitter,\n U8aFixed,\n Vault,\n Vec,\n} from '@argonprotocol/mainchain';\nimport { privateKeyToAccount } from 'viem/accounts';\nimport {\n createPublicClient,\n createWalletClient,\n defineChain,\n encodeFunctionData,\n type Hex,\n http,\n toHex,\n} from 'viem';\nimport { getReadyEthereumGatewayUpdates } from './EthereumGatewayQueue';\nimport {\n mineLaterExecutionAnchorReceipt,\n signGatewayPermit,\n syncEthereumVerifierUntilAnchorCovers,\n toArgonKeccakSignature,\n waitForExecutionReceipt,\n waitForFinalizedBeaconExecutionAtOrAbove,\n} from './EthereumE2eUtils';\nimport TestEthereum from './TestEthereum';\nimport TestMainchain from './TestMainchain';\n\nconst { argonTokenAbi, mintingGatewayAbi, MINTING_GATEWAY_RUNTIME_TO_ERC20_SCALE } = EvmContracts;\nconst MINIMAL_BOOTSTRAP_FINALIZED_SLOT = 64n;\n\ntype DeployerAccount = ReturnType<typeof privateKeyToAccount>;\ntype EthereumChain = ReturnType<typeof defineChain>;\ntype EthereumPublicClient = {\n getBalance: (args: { address: Hex }) => Promise<bigint>;\n getBlock: (...args: any[]) => Promise<any>;\n getBlockNumber: () => Promise<bigint>;\n readContract: (...args: any[]) => Promise<unknown>;\n waitForTransactionReceipt: (args: {\n hash: Hex;\n }) => Promise<{ status: string; blockNumber: bigint }>;\n};\ntype EthereumWalletClient = {\n sendTransaction: (...args: any[]) => Promise<Hex>;\n writeContract: (...args: any[]) => Promise<Hex>;\n};\ntype GatewayDeployment = Awaited<ReturnType<TestEthereum['deployMintingGatewayFixture']>>;\ntype RuntimeSetupMode =\n | {\n kind: 'inbound-only';\n }\n | {\n kind: 'outbound';\n activationPricing: {\n activationGasCost: bigint | number;\n signatureGasCost: bigint | number;\n estimatedWeiPerGas: bigint | number;\n estimatedMicrogonsPerEth: bigint | number;\n };\n minimumMintingAuthorityValue?: bigint;\n };\n\nexport class EthereumProofE2eHarness {\n public readonly sudoSigner = new Keyring({ type: 'sr25519' }).createFromUri('//Alice');\n public readonly deployer: DeployerAccount;\n public readonly chain: EthereumChain;\n public readonly publicClient: EthereumPublicClient;\n public readonly walletClient: EthereumWalletClient;\n public readonly mainchainClient: ArgonClient;\n public readonly proofRelayer: KeyringPair;\n\n private constructor(\n public readonly ethereum: TestEthereum,\n public readonly endpoints: Awaited<ReturnType<TestEthereum['launch']>>,\n public readonly mainchain: TestMainchain,\n mainchainClient: ArgonClient,\n deployerPrivateKey: Hex,\n proofRelayerUri: string,\n ) {\n this.mainchainClient = mainchainClient;\n this.deployer = privateKeyToAccount(deployerPrivateKey);\n this.chain = defineChain({\n id: Number.parseInt(endpoints.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: [endpoints.executionRpcUrl],\n },\n },\n });\n this.publicClient = createPublicClient({\n chain: this.chain,\n transport: http(endpoints.executionRpcUrl),\n });\n this.walletClient = createWalletClient({\n account: this.deployer,\n chain: this.chain,\n transport: http(endpoints.executionRpcUrl),\n });\n this.proofRelayer = new Keyring({ type: 'sr25519' }).createFromUri(proofRelayerUri);\n }\n\n static async launch(args: {\n testAccount: { address: Hex; balance: string; privateKey: Hex };\n proofRelayerUri: string;\n }) {\n const ethereum = new TestEthereum();\n const endpoints = await ethereum.launch({\n consensusClient: 'lodestar',\n preset: 'minimal',\n secondsPerSlot: 1,\n prefundedAccounts: {\n [args.testAccount.address]: {\n balance: args.testAccount.balance,\n },\n },\n });\n\n const mainchain = new TestMainchain();\n await mainchain.launch();\n const mainchainClient = await mainchain.client();\n\n return new EthereumProofE2eHarness(\n ethereum,\n endpoints,\n mainchain,\n mainchainClient,\n args.testAccount.privateKey,\n args.proofRelayerUri,\n );\n }\n\n async submit(tx: unknown, signer: KeyringPair) {\n const result = await new TxSubmitter(this.mainchainClient, tx as never, signer).submit();\n await result.waitForInFirstBlock;\n return result;\n }\n\n async sudoSubmit(tx: unknown) {\n const result = await this.submit(\n this.mainchainClient.tx.sudo.sudo(tx as never),\n this.sudoSigner,\n );\n const sudoEvent = result.events.find(event => this.mainchainClient.events.sudo.Sudid.is(event));\n if (!sudoEvent || !this.mainchainClient.events.sudo.Sudid.is(sudoEvent)) {\n throw new Error('sudo did not emit sudo.Sudid');\n }\n\n const sudoResult = sudoEvent.data[0] as unknown as {\n isErr: boolean;\n asErr: Parameters<typeof dispatchErrorToString>[1];\n };\n if (sudoResult.isErr) {\n throw new Error(\n `sudo failed: ${dispatchErrorToString(this.mainchainClient, sudoResult.asErr)}`,\n );\n }\n\n return result;\n }\n\n async syncVerifierThrough(minimumExecutionBlockNumber: bigint) {\n await syncEthereumVerifierUntilAnchorCovers(\n this.mainchainClient,\n this.sudoSigner,\n this.endpoints.beaconApiUrl,\n minimumExecutionBlockNumber,\n );\n }\n\n async proveGatewayActivity(gatewayAddress: Hex, throughExecutionBlockNumber: bigint) {\n const payload = await buildGatewayActivityProofPayload(this.mainchainClient, {\n executionRpcUrl: this.endpoints.executionRpcUrl,\n gatewayAddress,\n throughExecutionBlockNumber,\n });\n if (!payload) {\n throw new Error('Expected uncovered gateway activity to prove');\n }\n\n const result = await this.submit(\n this.mainchainClient.tx.crosschainTransfer.proveGatewayActivity(\n 'Ethereum',\n payload.previousGatewayActivityNonce,\n payload.proof,\n ),\n this.proofRelayer,\n );\n\n return { payload, result };\n }\n\n async configureEthereumRuntime(gateway: TestMintingGateway, mode: RuntimeSetupMode) {\n const calls = [\n this.mainchainClient.tx.crosschainTransfer.setChainConfig('Ethereum', {\n Evm: {\n chainId: BigInt(this.chain.id).toString(),\n gateway: gateway.gatewayAddress,\n argonToken: gateway.argonTokenAddress,\n argonotToken: gateway.argonotTokenAddress,\n },\n }),\n ];\n\n if (mode.kind === 'outbound') {\n const activationPricing = {\n activationGasCost: BigInt(mode.activationPricing.activationGasCost),\n signatureGasCost: BigInt(mode.activationPricing.signatureGasCost),\n estimatedWeiPerGas: BigInt(mode.activationPricing.estimatedWeiPerGas),\n estimatedMicrogonsPerEth: BigInt(mode.activationPricing.estimatedMicrogonsPerEth),\n };\n\n calls.push(\n this.mainchainClient.tx.crosschainTransfer.setMintingAuthorityActivationRepaymentPricing(\n 'Ethereum',\n {\n activationGasCost: activationPricing.activationGasCost.toString(),\n signatureGasCost: activationPricing.signatureGasCost.toString(),\n estimatedWeiPerGas: activationPricing.estimatedWeiPerGas.toString(),\n estimatedMicrogonsPerEth: activationPricing.estimatedMicrogonsPerEth.toString(),\n },\n ),\n );\n\n if (mode.minimumMintingAuthorityValue !== undefined) {\n calls.push(\n this.mainchainClient.tx.crosschainTransfer.setMinimumMintingAuthorityValue(\n 'Ethereum',\n mode.minimumMintingAuthorityValue.toString(),\n ),\n );\n }\n }\n\n calls.push(\n await getEthereumBeaconSyncBootstrapTx(this.mainchainClient, this.endpoints.beaconApiUrl),\n );\n\n const result = await this.sudoSubmit(this.mainchainClient.tx.utility.batchAll(calls as never));\n return { result };\n }\n\n async fundBurnAccount(amount: bigint) {\n const burnAccount =\n this.mainchainClient.consts.crosschainTransfer.ethereumBurnAccount.toString();\n\n // For the seeded-gateway tests we need the local burn account to mirror the Ethereum-side\n // migrated circulation exactly, without an extra existential-deposit cushion skewing the\n // gateway circulation check.\n return this.forceSetBalance(burnAccount, amount);\n }\n\n async fundProofRelayer(\n amount = this.mainchainClient.consts.balances.existentialDeposit.toBigInt() + 1_000_000n,\n ) {\n return this.submit(\n this.mainchainClient.tx.balances.transferAllowDeath(this.proofRelayer.address, amount),\n this.sudoSigner,\n );\n }\n\n async forceSetBalance(address: string, amount: bigint) {\n return this.sudoSubmit(this.mainchainClient.tx.balances.forceSetBalance(address, amount));\n }\n\n async forceSetOwnership(address: string, amount: bigint) {\n return this.sudoSubmit(this.mainchainClient.tx.ownership.forceSetBalance(address, amount));\n }\n\n async waitForExecutionFinalizedAfter(minimumExecutionBlockNumber: bigint) {\n const laterReceipt = await mineLaterExecutionAnchorReceipt(\n this.walletClient,\n this.chain,\n this.ethereum,\n this.deployer,\n minimumExecutionBlockNumber,\n );\n await waitForFinalizedBeaconExecutionAtOrAbove(\n this.ethereum,\n BigInt(laterReceipt.blockNumber),\n {\n // Matches the apps/pr/gateway-proof bootstrap guard for minimal devnets.\n minimumFinalizedSlot: MINIMAL_BOOTSTRAP_FINALIZED_SLOT,\n },\n );\n return laterReceipt;\n }\n}\n\nexport class TestMintingGateway {\n private constructor(\n public readonly harness: EthereumProofE2eHarness,\n public readonly deployment: GatewayDeployment,\n ) {}\n\n static async deploy(\n harness: EthereumProofE2eHarness,\n options: Parameters<TestEthereum['deployMintingGatewayFixture']>[0],\n ) {\n const deployment = await harness.ethereum.deployMintingGatewayFixture(options);\n return new TestMintingGateway(harness, deployment);\n }\n\n get gatewayAddress() {\n return this.deployment.gatewayAddress;\n }\n\n get argonTokenAddress() {\n return this.deployment.argonTokenAddress;\n }\n\n get argonotTokenAddress() {\n return this.deployment.argonotTokenAddress;\n }\n\n async startTransferToArgon(args: {\n account: DeployerAccount;\n amountRuntimeUnits: bigint;\n recipientArgonAddress: Hex;\n }) {\n const permitDeadline = (await this.harness.publicClient.getBlock()).timestamp + 3600n;\n const permitNonce = (await this.harness.publicClient.readContract({\n address: this.argonTokenAddress,\n abi: argonTokenAbi,\n functionName: 'nonces',\n args: [args.account.address],\n })) as bigint;\n const permitSignature = await signGatewayPermit({\n account: args.account,\n chainId: this.harness.chain.id,\n tokenAddress: this.argonTokenAddress,\n gatewayAddress: this.gatewayAddress,\n owner: args.account.address,\n value: args.amountRuntimeUnits * MINTING_GATEWAY_RUNTIME_TO_ERC20_SCALE,\n nonce: permitNonce,\n deadline: permitDeadline,\n });\n const transactionHash = await createWalletClient({\n account: args.account,\n chain: this.harness.chain,\n transport: http(this.harness.endpoints.executionRpcUrl),\n }).sendTransaction({\n account: args.account,\n chain: this.harness.chain,\n to: this.gatewayAddress,\n data: encodeFunctionData({\n abi: mintingGatewayAbi,\n functionName: 'startTransferToArgon',\n args: [\n this.argonTokenAddress,\n args.amountRuntimeUnits,\n args.recipientArgonAddress,\n permitDeadline,\n permitSignature.v,\n permitSignature.r,\n permitSignature.s,\n ],\n }),\n });\n\n return waitForExecutionReceipt(this.harness.ethereum, transactionHash);\n }\n\n async forceUpdateActiveCouncil(\n replacementCouncil: { signers: Hex[]; weights: bigint[] },\n nextMicrogonsPerArgonot: bigint,\n ) {\n return this.harness.publicClient.waitForTransactionReceipt({\n hash: await this.harness.walletClient.writeContract({\n account: this.harness.deployer,\n chain: this.harness.chain,\n address: this.gatewayAddress,\n abi: mintingGatewayAbi,\n functionName: 'forceUpdateActiveCouncil',\n args: [replacementCouncil, nextMicrogonsPerArgonot],\n }),\n });\n }\n\n async relayReadyApprovals(\n batch: Awaited<ReturnType<typeof getReadyEthereumGatewayUpdates>>,\n operatorAddress: string,\n ) {\n return this.harness.publicClient.waitForTransactionReceipt({\n hash: await this.harness.walletClient.writeContract({\n account: this.harness.deployer,\n chain: this.harness.chain,\n address: this.gatewayAddress,\n abi: mintingGatewayAbi,\n functionName: 'applyGatewayUpdates',\n args: [\n batch.currentCouncil,\n batch.updates,\n toHex(decodeAddress(operatorAddress), { size: 32 }),\n ],\n }),\n });\n }\n\n async argonApprovalsNonce(): Promise<bigint> {\n return (await this.harness.publicClient.readContract({\n address: this.gatewayAddress,\n abi: mintingGatewayAbi,\n functionName: 'argonApprovalsNonce',\n })) as bigint;\n }\n\n async globalIssuanceCouncil(): Promise<[Hex[], bigint[], Hex]> {\n return (await this.harness.publicClient.readContract({\n address: this.gatewayAddress,\n abi: mintingGatewayAbi,\n functionName: 'globalIssuanceCouncil',\n })) as [Hex[], bigint[], Hex];\n }\n\n async authorityCollateral(signingKey: Hex): Promise<[bigint, bigint]> {\n return (await this.harness.publicClient.readContract({\n address: this.gatewayAddress,\n abi: mintingGatewayAbi,\n functionName: 'mintingAuthorityCollateralRemaining',\n args: [signingKey],\n })) as [bigint, bigint];\n }\n\n async finalizeTransferOut(args: {\n transferRequest: {\n argonAccountId: Hex;\n argonTransferNonce: bigint;\n chainId: bigint;\n microgonsPerArgonot: bigint;\n recipient: Hex;\n validUntilBlock: bigint;\n token: Hex;\n amount: bigint;\n mintingAuthorityTip: bigint;\n };\n collateralizationSignature: Hex;\n micronotCollateral: bigint;\n }) {\n return this.harness.publicClient.waitForTransactionReceipt({\n hash: await this.harness.walletClient.writeContract({\n account: this.harness.deployer,\n chain: this.harness.chain,\n address: this.gatewayAddress,\n abi: mintingGatewayAbi,\n functionName: 'finalizeTransferOutOfArgon',\n args: [\n args.transferRequest,\n {\n authorizations: [\n {\n microgonCollateral: 0n,\n micronotCollateral: args.micronotCollateral,\n signature: args.collateralizationSignature,\n },\n ],\n },\n ],\n }),\n });\n }\n\n async isFinalizedTransferOut(\n transferRequest: Parameters<typeof EvmContracts.hashMintingGatewayTransferOutOfArgonRequest>[0],\n ): Promise<boolean> {\n return (await this.harness.publicClient.readContract({\n address: this.gatewayAddress,\n abi: mintingGatewayAbi,\n functionName: 'finalizedTransferOutOfArgonIds',\n args: [EvmContracts.hashMintingGatewayTransferOutOfArgonRequest(transferRequest)],\n })) as boolean;\n }\n\n async argonBalance(address: Hex): Promise<bigint> {\n return (await this.harness.publicClient.readContract({\n address: this.argonTokenAddress,\n abi: argonTokenAbi,\n functionName: 'balanceOf',\n args: [address],\n })) as bigint;\n }\n\n async fundExecutionAccount(address: Hex, value: bigint) {\n return this.harness.publicClient.waitForTransactionReceipt({\n hash: await this.harness.walletClient.sendTransaction({\n account: this.harness.deployer,\n chain: this.harness.chain,\n to: address,\n value,\n }),\n });\n }\n}\n\nexport class TestMintingAuthorityActor {\n public readonly operator: KeyringPair;\n public readonly councilSigner: DeployerAccount;\n public readonly authoritySigner: DeployerAccount;\n private gateway?: TestMintingGateway;\n\n constructor(\n public readonly harness: EthereumProofE2eHarness,\n args: {\n operatorUri: string;\n councilPrivateKey: Hex;\n authorityPrivateKey: Hex;\n },\n ) {\n this.operator = new Keyring({ type: 'sr25519' }).createFromUri(args.operatorUri);\n this.councilSigner = privateKeyToAccount(args.councilPrivateKey);\n this.authoritySigner = privateKeyToAccount(args.authorityPrivateKey);\n }\n\n attachGateway(gateway: TestMintingGateway) {\n this.gateway = gateway;\n }\n\n async prepareOperator(args: {\n freeBalance: bigint;\n ownershipBalance: bigint;\n committedArgonots: bigint;\n bitcoinXpub: string;\n }) {\n await this.harness.forceSetBalance(this.operator.address, args.freeBalance);\n await this.harness.forceSetOwnership(this.operator.address, args.ownershipBalance);\n\n const vault = await Vault.create(this.harness.mainchainClient, this.operator, {\n securitization: 1_000_000_000n,\n securitizationRatio: 1,\n annualPercentRate: 0.05,\n baseFee: 0n,\n bitcoinXpub: args.bitcoinXpub,\n treasuryProfitSharing: 0,\n });\n await vault.getVault();\n\n await this.harness.sudoSubmit(\n this.harness.mainchainClient.tx.priceIndex.setOperator(this.operator.address),\n );\n\n const currentTick = await this.harness.mainchainClient.query.ticks.currentTick();\n await this.harness.submit(\n this.harness.mainchainClient.tx.priceIndex.submit(\n {\n btcUsdPrice: toFixedNumber(60_000, 18),\n argonotUsdPrice: toFixedNumber(1, 18),\n argonUsdPrice: toFixedNumber(1, 18),\n argonUsdTargetPrice: toFixedNumber(1, 18),\n argonTimeWeightedAverageLiquidity: toFixedNumber(1_000_000, 18),\n tick: currentTick.toBigInt(),\n },\n null,\n ),\n this.operator,\n );\n\n await this.harness.submit(\n this.harness.mainchainClient.tx.vaults.setCommittedArgonots(args.committedArgonots),\n this.operator,\n );\n }\n\n async registerCouncilSigner() {\n return this.harness.submit(\n this.harness.mainchainClient.tx.crosschainTransfer.registerCouncilSigner(\n 'Ethereum',\n this.councilSigner.address,\n toArgonKeccakSignature(\n await this.councilSigner.signMessage({\n message: { raw: toHex(this.registrationMessage('argon/council-signer/v2')) },\n }),\n ),\n ),\n this.operator,\n );\n }\n\n async forceSingleMemberCouncil() {\n await this.harness.sudoSubmit(\n this.harness.mainchainClient.tx.crosschainTransfer.forceSetGlobalIssuanceCouncil(\n 'Ethereum',\n 0,\n [this.operator.address],\n ),\n );\n\n const activeCouncilHashOption =\n await this.harness.mainchainClient.query.crosschainTransfer.activeGlobalIssuanceCouncilByDestinationChain(\n 'Ethereum',\n );\n if (activeCouncilHashOption.isNone) {\n throw new Error('Expected active Ethereum council hash');\n }\n\n const activeCouncilOption =\n await this.harness.mainchainClient.query.crosschainTransfer.globalIssuanceCouncilByHash(\n activeCouncilHashOption.unwrap(),\n );\n if (activeCouncilOption.isNone) {\n throw new Error('Expected active Ethereum council');\n }\n\n const activeCouncil = activeCouncilOption.unwrap();\n const currentCouncil = [...activeCouncil.members.entries()]\n .map(([signer, member]) => ({\n signer: signer.toHex(),\n weight: member.weight.toBigInt(),\n }))\n .sort((left, right) => left.signer.localeCompare(right.signer));\n\n return {\n activeCouncilHash: activeCouncilHashOption.unwrap().toHex(),\n activeCouncil,\n currentCouncil: {\n signers: currentCouncil.map(member => member.signer),\n weights: currentCouncil.map(member => member.weight),\n },\n };\n }\n\n async registerMintingAuthority(micronotCollateral: bigint) {\n return this.harness.submit(\n this.harness.mainchainClient.tx.crosschainTransfer.registerMintingAuthority(\n 'Ethereum',\n this.authoritySigner.address,\n toArgonKeccakSignature(\n await this.authoritySigner.signMessage({\n message: {\n raw: toHex(this.registrationMessage('argon/minting-authority-signer/v2')),\n },\n }),\n ),\n 0n,\n micronotCollateral,\n ),\n this.operator,\n );\n }\n\n async approveActivationQueueEntry(queueNonce = 1n) {\n const approvalQueueEntry =\n await this.harness.mainchainClient.query.crosschainTransfer.councilApprovalQueueByDestinationChainAndNonce(\n 'Ethereum',\n queueNonce,\n );\n if (approvalQueueEntry.isNone) {\n throw new Error(`Expected queue nonce ${queueNonce} to exist`);\n }\n\n const councilApprovalSignature = await this.councilSigner.signMessage({\n message: {\n raw: approvalQueueEntry.unwrap().approvalHash.toHex(),\n },\n });\n await this.harness.submit(\n this.harness.mainchainClient.tx.crosschainTransfer.approveQueueEntries(\n 'Ethereum',\n new Vec(this.harness.mainchainClient.registry, U8aFixed.with(520), [\n new U8aFixed(\n this.harness.mainchainClient.registry,\n toArgonKeccakSignature(councilApprovalSignature),\n 520,\n ),\n ]),\n ),\n this.operator,\n );\n\n const batch = await getReadyEthereumGatewayUpdates(\n this.harness.mainchainClient,\n this.harness.publicClient,\n );\n\n return {\n approvalQueueEntry,\n councilApprovalSignature,\n batch,\n };\n }\n\n async collateralizeFirstPendingTransferOut() {\n const gateway = this.requireGateway();\n const pendingRequests =\n await this.harness.mainchainClient.query.crosschainTransfer.pendingCollateralizationRequestsByChain(\n 'Ethereum',\n );\n if (pendingRequests.length === 0) {\n throw new Error('Expected a pending collateralization request');\n }\n\n const pendingRequest = pendingRequests[0];\n const transferId = pendingRequest.transferId.toHex();\n const transferOption =\n await this.harness.mainchainClient.query.crosschainTransfer.transferOutById(transferId);\n if (transferOption.isNone) {\n throw new Error(`Expected transfer out ${transferId} to exist`);\n }\n\n const transfer = transferOption.unwrap();\n const transferRequest = {\n argonAccountId: transfer.argonAccountId.toHex(),\n argonTransferNonce: transfer.argonTransferNonce.toBigInt(),\n chainId: BigInt(this.harness.chain.id),\n microgonsPerArgonot: transfer.microgonsPerArgonot.toBigInt(),\n recipient: transfer.destinationAccount.toHex(),\n validUntilBlock: transfer.validUntilEthereumBlock.toBigInt(),\n token: gateway.argonTokenAddress,\n amount: transfer.amount.toBigInt(),\n mintingAuthorityTip: transfer.mintingAuthorityTip.toBigInt(),\n };\n const micronotCollateral = transfer.amount.toBigInt();\n const collateralizationHash = EvmContracts.hashMintingGatewayMintingAuthorization(\n { chainId: BigInt(this.harness.chain.id), gatewayAddress: gateway.gatewayAddress },\n {\n request: transferRequest,\n microgonCollateral: 0n,\n micronotCollateral,\n },\n );\n const collateralizationSignature = await this.authoritySigner.signMessage({\n message: {\n raw: collateralizationHash,\n },\n });\n\n const result = await this.harness.submit(\n this.harness.mainchainClient.tx.crosschainTransfer.collateralizeTransfer(\n transferId,\n toArgonKeccakSignature(collateralizationSignature),\n 0n,\n micronotCollateral,\n ),\n this.operator,\n );\n\n return {\n pendingRequest,\n transferId,\n transferRequest,\n micronotCollateral,\n collateralizationSignature,\n result,\n };\n }\n\n private registrationMessage(prefix: string) {\n const prefixBytes = this.harness.mainchainClient.registry.createType('Bytes', prefix).toU8a();\n const destinationChainBytes = this.harness.mainchainClient.registry\n .createType('PalletCrosschainTransferSourceChain', 'Ethereum')\n .toU8a();\n const operatorAccountIdBytes = this.harness.mainchainClient.registry\n .createType('AccountId32', this.operator.address)\n .toU8a();\n\n return concatBytes(prefixBytes, destinationChainBytes, operatorAccountIdBytes);\n }\n\n private requireGateway() {\n if (!this.gateway) {\n throw new Error('Minting authority actor requires an attached TestMintingGateway');\n }\n\n return this.gateway;\n }\n}\n\nfunction concatBytes(...parts: Uint8Array[]) {\n const totalLength = parts.reduce((sum, part) => sum + part.length, 0);\n const bytes = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const part of parts) {\n bytes.set(part, offset);\n offset += part.length;\n }\n\n return bytes;\n}\n"],"mappings":"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","names":["waitForExecutionReceipt","import_mainchain","child_process","process","HttpProxy","resolve","port","teardown","process","Path","pg","url","result","resolve","fs","Path","readline","import_nanoid","import_mainchain","nanoid","url","port","resolve","child_process","import_mainchain","fs","readline","process","Path","fs","Path","import_node_child_process","import_detect_port","import_mainchain","port","url","resolve","Path","env","port","import_mainchain","import_viem","delay","waitForExecutionReceipt","resolve","import_mainchain","import_viem","hashMintingGatewayGlobalIssuanceCouncil","import_mainchain","import_accounts","import_viem","mintingGatewayAbi","waitForExecutionReceipt","sudo"]}