remix-project mirror
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
remix-project/libs/remix-simulator/src/provider.ts

172 lines
4.6 KiB

4 years ago
import { Blocks } from './methods/blocks'
import { info } from './utils/logs'
4 years ago
import merge from 'merge'
import { Web3Accounts } from './methods/accounts'
4 years ago
import { Filters } from './methods/filters'
import { methods as miscMethods } from './methods/misc'
import { methods as netMethods } from './methods/net'
4 years ago
import { Transactions } from './methods/transactions'
import { Debug } from './methods/debug'
import { VMContext } from './vm-context'
import { Web3PluginBase } from 'web3'
export interface JSONRPCRequestPayload {
params: any[];
method: string;
id: number;
jsonrpc: string;
}
export interface JSONRPCResponsePayload {
result: any;
id: number;
jsonrpc: string;
}
export type JSONRPCResponseCallback = (err: Error, result?: JSONRPCResponsePayload) => void
4 years ago
export class Provider {
2 years ago
options: Record<string, string | number>
vmContext
4 years ago
Accounts
Transactions
methods
connected: boolean
initialized: boolean
pendingRequests: Array<any>
4 years ago
2 years ago
constructor (options: Record<string, string | number> = {}) {
this.options = options
this.connected = true
2 years ago
this.vmContext = new VMContext(options['fork'] as string, options['nodeUrl'] as string, options['blockNumber'] as (number | 'latest'))
4 years ago
this.Accounts = new Web3Accounts(this.vmContext)
this.Transactions = new Transactions(this.vmContext)
this.methods = {}
this.methods = merge(this.methods, this.Accounts.methods())
this.methods = merge(this.methods, (new Blocks(this.vmContext, options)).methods())
this.methods = merge(this.methods, miscMethods())
this.methods = merge(this.methods, (new Filters(this.vmContext)).methods())
this.methods = merge(this.methods, netMethods())
this.methods = merge(this.methods, this.Transactions.methods())
this.methods = merge(this.methods, (new Debug(this.vmContext)).methods())
}
async init () {
this.initialized = false
this.pendingRequests = []
await this.vmContext.init()
await this.Accounts.resetAccounts()
this.Transactions.init(this.Accounts.accounts)
this.initialized = true
if (this.pendingRequests.length > 0) {
this.pendingRequests.map((req) => {
this.sendAsync(req.payload, req.callback)
})
this.pendingRequests = []
}
}
2 years ago
_send(payload: JSONRPCRequestPayload, callback: (err: Error, result?: JSONRPCResponsePayload) => void) {
// log.info('payload method is ', payload.method) // commented because, this floods the IDE console
if (!this.initialized) {
this.pendingRequests.push({ payload, callback })
return
}
const method = this.methods[payload.method]
if (this.options.logDetails) {
info(payload)
}
if (method) {
return method.call(method, payload, (err, result) => {
if (this.options.logDetails) {
info(err)
info(result)
}
if (err) {
return callback(err)
}
4 years ago
const response = { id: payload.id, jsonrpc: '2.0', result: result }
callback(null, response)
})
}
callback(new Error('unknown method ' + payload.method))
}
2 years ago
sendAsync (payload: JSONRPCRequestPayload, callback: (err: Error, result?: JSONRPCResponsePayload) => void) {
return new Promise((resolve,reject)=>{
const cb = (err, result) => {
if(typeof callback==='function'){
callback(err,result)
}
if(err){
return reject(err)
}
return resolve(result)
}
this._send(payload, cb)
})
}
send (payload, callback) {
2 years ago
return this.sendAsync(payload,callback)
}
isConnected () {
return true
}
disconnect () {
return false
3 years ago
}
supportsSubscriptions () {
return true
3 years ago
}
on (type, cb) {
this.vmContext.logsManager.addListener(type, cb)
}
4 years ago
}
export function extend (web3) {
1 year ago
if(!web3.testPlugin){
web3.registerPlugin(new Web3TestPlugin())
}
}
class Web3TestPlugin extends Web3PluginBase {
public pluginNamespace = 'testPlugin'
public getExecutionResultFromSimulator(transactionHash) {
return this.requestManager.send({
method: 'eth_getExecutionResultFromSimulator',
params: [transactionHash]
})
}
public getHHLogsForTx(transactionHash) {
return this.requestManager.send({
method: 'eth_getHHLogsForTx',
params: [transactionHash]
})
}
4 years ago
public getHashFromTagBySimulator(timestamp) {
return this.requestManager.send({
method: 'eth_getHashFromTagBySimulator',
params: [timestamp]
})
}
public callBySimulator(payload) {
return this.requestManager.send({
method: 'eth_callBySimulator',
params: [payload]
})
}
}