diff --git a/libs/remix-simulator/bin/ethsim b/libs/remix-simulator/bin/ethsim index 814e2a6a46..dd7a9c6538 100755 --- a/libs/remix-simulator/bin/ethsim +++ b/libs/remix-simulator/bin/ethsim @@ -23,22 +23,37 @@ program .command('start') .option('-p, --port [port]', 'specify port', 8545) .option('-b, --ip [host]', 'specify host', '127.0.0.1') - .option('-c, --coinbase [coinbase]', 'specify coinbase', '0x0000000000000000000000000000000000000000') .option('--rpc', 'run rpc server only', true) .option('--details', 'display payloads for every requests and their responses', false) - .action((option) => { - console.log('coinbase: ', option.coinbase) + .option('-c, --coinbase [coinbase]', 'specify coinbase', '0x0000000000000000000000000000000000000000') + .option('-f, --fork [fork]', 'specify fork name') + .option('-n, --nodeUrl [nodeUrl]', 'specify node url') + .option('-bn, --blockNumber [blockNumber]', 'specify block Number') + .option('-s, --stateDb [stateDb]', 'specify state database') + .option('-bs, --blocks [blocks]', 'specify blocks') + .action((option, env) => { + env.outputHelp() + console.log('\n') + console.log('Usage:') + console.log('remix-simulator start') + console.log('remix-simulator start -n -f cancun -bn latest') + console.log('\n') + console.log('Command line options:') + console.log('port: ', option.port) + console.log('host: ', option.ip) console.log('rpc: ', option.rpc) console.log('details: ', option.details) - console.log('host: ', option.ip) - console.log('port: ', option.port) - const Server = require('../src/server') - const server = new Server({ - coinbase: option.coinbase, - rpc: option.rpc, - logDetails: option.details - }) - server.start(option.ip, option.port) + console.log('\n') + console.log('Provider options:') + console.log('coinbase: ', option.coinbase) + console.log('fork: ', option.fork) + console.log('nodeUrl: ', option.nodeUrl) + console.log('blockNumber: ', option.blockNumber) + console.log('stateDb: ', option.stateDb) + console.log('blocks: ', option.blocks) + const { Server } = require('../src/server') + const server = new Server(option) + server.start(option) }) program.parse(process.argv) diff --git a/libs/remix-simulator/src/index.ts b/libs/remix-simulator/src/index.ts index e49f4baf86..35835a8ee2 100644 --- a/libs/remix-simulator/src/index.ts +++ b/libs/remix-simulator/src/index.ts @@ -1 +1,2 @@ export { Provider, extend, JSONRPCRequestPayload, JSONRPCResponsePayload, JSONRPCResponseCallback } from './provider' +export { Server } from './server' diff --git a/libs/remix-simulator/src/provider.ts b/libs/remix-simulator/src/provider.ts index 39b1cd1c5f..27918a4359 100644 --- a/libs/remix-simulator/src/provider.ts +++ b/libs/remix-simulator/src/provider.ts @@ -35,7 +35,7 @@ export type ProviderOptions = { nodeUrl?: string, blockNumber?: number | 'latest', stateDb?: State, - logDetails?: boolean + details?: boolean blocks?: string[], coinbase?: string } @@ -90,12 +90,12 @@ export class Provider { return } const method = this.methods[payload.method] - if (this.options.logDetails) { + if (this.options.details) { info(payload) } if (method) { return method.call(method, payload, (err, result) => { - if (this.options.logDetails) { + if (this.options.details) { info(err) info(result) } diff --git a/libs/remix-simulator/src/server.ts b/libs/remix-simulator/src/server.ts index 15636cac5a..0f285609d1 100644 --- a/libs/remix-simulator/src/server.ts +++ b/libs/remix-simulator/src/server.ts @@ -1,26 +1,32 @@ -import express from 'express' import cors from 'cors' import bodyParser from 'body-parser' -import expressWs from 'express-ws' -import { Provider } from './provider' -import { log } from './utils/logs' -const app = express() +import { Provider, ProviderOptions } from './provider' +import { log, error } from './utils/logs' -class Server { +export type CliOptions = { + rpc?: boolean, + port: number + ip: string +} + +export class Server { provider - rpcOnly - constructor (options) { + constructor (options?: ProviderOptions) { this.provider = new Provider(options) this.provider.init().then(() => { log('Provider initiated') + log('Test accounts:') + log(Object.keys(this.provider.Accounts.accounts)) }).catch((error) => { log(error) }) - this.rpcOnly = options.rpc } - start (host, port) { + async start (cliOptions: CliOptions) { + const expressWs = (await import('express-ws')).default + const express = (await import('express')).default + const app = express() const wsApp = expressWs(app) app.use(cors()) @@ -31,22 +37,39 @@ class Server { res.send('Welcome to remix-simulator') }) - if (this.rpcOnly) { + if (cliOptions.rpc) { app.use((req, res) => { + if (req && req.body && (req.body.method === 'eth_sendTransaction' || req.body.method === 'eth_call')) { + log('Receiving call/transaction:') + log(req.body.params) + } this.provider.sendAsync(req.body, (err, jsonResponse) => { if (err) { + error(err) return res.send(JSON.stringify({ error: err })) } + if (req && req.body && (req.body.method === 'eth_sendTransaction' || req.body.method === 'eth_call')) { + log(jsonResponse) + } res.send(jsonResponse) }) }) } else { wsApp.app.ws('/', (ws, req) => { ws.on('message', (msg) => { - this.provider.sendAsync(JSON.parse(msg.toString()), (err, jsonResponse) => { + const body = JSON.parse(msg.toString()) + if (body && (body.method === 'eth_sendTransaction' || body.method === 'eth_call')) { + log('Receiving call/transaction:') + log(body.params) + } + this.provider.sendAsync(body, (err, jsonResponse) => { if (err) { + error(err) return ws.send(JSON.stringify({ error: err })) } + if (body && (body.method === 'eth_sendTransaction' || body.method === 'eth_call')) { + log(jsonResponse) + } ws.send(JSON.stringify(jsonResponse)) }) }) @@ -57,13 +80,14 @@ class Server { }) } - app.listen(port, host, () => { - log('Remix Simulator listening on ws://' + host + ':' + port) - if (!this.rpcOnly) { + app.listen(cliOptions.port, cliOptions.ip, () => { + if (!cliOptions.rpc) { + log('Remix Simulator listening on ws://' + cliOptions.ip + ':' + cliOptions.port) log('http json-rpc is deprecated and disabled by default. To enable it use --rpc') + } else { + log('Remix Simulator listening on http://' + cliOptions.ip + ':' + cliOptions.port) } }) } } -module.exports = Server