datxweb-core-method
Version:
Handles the JSON-RPC methods. This package is also internally used by datxweb.
1,449 lines (1,323 loc) • 50.4 kB
JavaScript
import EventEmitter from 'eventemitter3';
import { NewHeadsSubscription } from 'datxweb-core-subscriptions';
import isFunction from 'lodash/isFunction';
import isString from 'lodash/isString';
import cloneDeep from 'lodash/cloneDeep';
import { Observable } from 'rxjs';
class PromiEvent {
constructor() {
this.promise = new Promise((resolve, reject) => {
this.resolve = resolve;
this.reject = reject;
});
this.eventEmitter = new EventEmitter();
return new Proxy(this, {
get: this.proxyHandler
});
}
proxyHandler(target, name) {
if (name === 'resolve' || name === 'reject') {
return target[name];
}
if (name === 'then') {
return target.promise.then.bind(target.promise);
}
if (name === 'catch') {
return target.promise.catch.bind(target.promise);
}
if (target.eventEmitter[name]) {
return target.eventEmitter[name];
}
}
}
class AbstractMethod {
constructor(rpcMethod, parametersAmount, utils, formatters, moduleInstance) {
this.utils = utils;
this.formatters = formatters;
this.moduleInstance = moduleInstance;
this._arguments = {
parameters: []
};
this._rpcMethod = rpcMethod;
this._parametersAmount = parametersAmount;
}
beforeExecution(moduleInstance) {}
afterExecution(response) {
return response;
}
async execute() {
this.beforeExecution(this.moduleInstance);
if (this.parameters.length !== this.parametersAmount) {
const error = new Error(`Invalid Arguments length: expected: ${this.parametersAmount}, given: ${this.parameters.length}`);
if (this.callback) {
this.callback(error, null);
return;
}
throw error;
}
try {
let response = await this.moduleInstance.currentProvider.send(this.rpcMethod, this.parameters);
if (response) {
response = this.afterExecution(response);
}
if (this.callback) {
this.callback(false, response);
return;
}
return response;
} catch (error) {
if (this.callback) {
this.callback(error, null);
return;
}
throw error;
}
}
set rpcMethod(value) {
this._rpcMethod = value;
}
get rpcMethod() {
return this._rpcMethod;
}
set parametersAmount(value) {
this._parametersAmount = value;
}
get parametersAmount() {
return this._parametersAmount;
}
get parameters() {
return this._arguments.parameters;
}
set parameters(value) {
this._arguments.parameters = value;
}
get callback() {
return this._arguments.callback;
}
set callback(value) {
this._arguments.callback = value;
}
setArguments(methodArguments) {
let parameters = cloneDeep([...methodArguments]);
let callback = null;
if (parameters.length > this.parametersAmount) {
if (!isFunction(parameters[parameters.length - 1])) {
throw new TypeError("The latest parameter should be a function otherwise it can't be used as callback");
}
callback = parameters.pop();
}
this._arguments = {
callback,
parameters
};
}
getArguments() {
return this._arguments;
}
isHash(parameter) {
return isString(parameter) && parameter.startsWith('0x');
}
}
class AbstractGetBlockMethod extends AbstractMethod {
constructor(rpcMethod, utils, formatters, moduleInstance) {
super(rpcMethod, 2, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
this.parameters[0] = this.formatters.inputBlockNumberFormatter(this.parameters[0]);
if (isFunction(this.parameters[1])) {
this.callback = this.parameters[1];
this.parameters[1] = false;
} else {
this.parameters[1] = !!this.parameters[1];
}
}
afterExecution(response) {
return this.formatters.outputBlockFormatter(response);
}
}
class GetBlockByNumberMethod extends AbstractGetBlockMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_getBlockByNumber', utils, formatters, moduleInstance);
}
}
class GetTransactionReceiptMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_getTransactionReceipt', 1, utils, formatters, moduleInstance);
}
afterExecution(response) {
if (response !== null) {
return this.formatters.outputTransactionReceiptFormatter(response);
}
return response;
}
}
class TransactionObserver {
constructor(provider, timeout, blockConfirmations, getTransactionReceiptMethod, getBlockByNumberMethod, newHeadsSubscription) {
this.provider = provider;
this.timeout = timeout;
this.blockConfirmations = blockConfirmations;
this.getTransactionReceiptMethod = getTransactionReceiptMethod;
this.getBlockByNumberMethod = getBlockByNumberMethod;
this.newHeadsSubscription = newHeadsSubscription;
this.blockNumbers = [];
this.lastBlock = false;
this.confirmations = 0;
this.confirmationChecks = 0;
this.interval = false;
}
observe(transactionHash) {
return Observable.create(observer => {
if (this.provider.supportsSubscriptions()) {
this.startSocketObserver(transactionHash, observer);
} else {
this.startHttpObserver(transactionHash, observer);
}
});
}
startSocketObserver(transactionHash, observer) {
this.newHeadsSubscription.subscribe(async (error, newHead) => {
try {
if (observer.closed) {
await this.newHeadsSubscription.unsubscribe();
return;
}
if (error) {
throw error;
}
this.getTransactionReceiptMethod.parameters = [transactionHash];
const receipt = await this.getTransactionReceiptMethod.execute();
if (!this.blockNumbers.includes(newHead.number)) {
if (receipt) {
this.confirmations++;
this.emitNext(receipt, observer);
if (this.isConfirmed()) {
await this.newHeadsSubscription.unsubscribe();
observer.complete();
}
}
this.blockNumbers.push(newHead.number);
this.confirmationChecks++;
if (this.isTimeoutTimeExceeded()) {
await this.newHeadsSubscription.unsubscribe();
this.emitError(new Error('Timeout exceeded during the transaction confirmation process. Be aware the transaction could still get confirmed!'), receipt, observer);
}
}
} catch (error2) {
this.emitError(error2, false, observer);
}
});
}
startHttpObserver(transactionHash, observer) {
const interval = setInterval(async () => {
try {
if (observer.closed) {
clearInterval(interval);
return;
}
this.getTransactionReceiptMethod.parameters = [transactionHash];
const receipt = await this.getTransactionReceiptMethod.execute();
if (receipt && receipt.blockNumber) {
if (this.lastBlock) {
const block = await this.getBlockByNumber(this.lastBlock.number + 1);
if (block && this.isValidConfirmation(block)) {
this.lastBlock = block;
this.confirmations++;
this.emitNext(receipt, observer);
}
} else {
this.lastBlock = await this.getBlockByNumber(receipt.blockNumber);
this.confirmations++;
this.emitNext(receipt, observer);
}
if (this.isConfirmed()) {
observer.complete();
clearInterval(interval);
}
}
this.confirmationChecks++;
if (this.isTimeoutTimeExceeded()) {
clearInterval(interval);
this.emitError(new Error('Timeout exceeded during the transaction confirmation process. Be aware the transaction could still get confirmed!'), receipt, observer);
}
} catch (error) {
clearInterval(interval);
this.emitError(error, false, observer);
}
}, 1000);
}
emitNext(receipt, observer) {
observer.next({
receipt,
confirmations: this.confirmations
});
}
emitError(error, receipt, observer) {
observer.error({
error,
receipt,
confirmations: this.confirmations,
confirmationChecks: this.confirmationChecks
});
}
getBlockByNumber(blockNumber) {
this.getBlockByNumberMethod.parameters = [blockNumber];
return this.getBlockByNumberMethod.execute();
}
isConfirmed() {
return this.confirmations === this.blockConfirmations;
}
isValidConfirmation(block) {
return this.lastBlock.hash === block.parentHash && this.lastBlock.number !== block.number;
}
isTimeoutTimeExceeded() {
return this.confirmationChecks === this.timeout;
}
}
class GetTransactionCountMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_getTransactionCount', 2, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
this.parameters[0] = this.formatters.inputAddressFormatter(this.parameters[0]);
if (isFunction(this.parameters[1])) {
this.callback = this.parameters[1];
this.parameters[1] = moduleInstance.defaultBlock;
}
this.parameters[1] = this.formatters.inputDefaultBlockNumberFormatter(this.parameters[1], moduleInstance);
}
afterExecution(response) {
return this.utils.hexToNumber(response);
}
}
class ChainIdMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_chainId', 0, utils, formatters, moduleInstance);
}
afterExecution(response) {
return this.utils.hexToNumber(response);
}
}
class AbstractMethodFactory {
constructor(utils, formatters) {
this.utils = utils;
this.formatters = formatters;
this._methods = null;
}
get methods() {
if (this._methods) {
return this._methods;
}
throw new Error('No methods defined for MethodFactory!');
}
set methods(value) {
this._methods = value;
}
hasMethod(name) {
return typeof this.methods[name] !== 'undefined';
}
createMethod(name, moduleInstance) {
const method = this.methods[name];
if (method.Type === 'observed-transaction-method') {
return new method(this.utils, this.formatters, moduleInstance, this.createTransactionObserver(moduleInstance));
}
if (method.Type === 'eth-send-transaction-method') {
return new method(this.utils, this.formatters, moduleInstance, this.createTransactionObserver(moduleInstance), new ChainIdMethod(this.utils, this.formatters, moduleInstance), new GetTransactionCountMethod(this.utils, this.formatters, moduleInstance));
}
return new method(this.utils, this.formatters, moduleInstance);
}
getTimeout(moduleInstance) {
let timeout = moduleInstance.transactionBlockTimeout;
if (!moduleInstance.currentProvider.supportsSubscriptions()) {
timeout = moduleInstance.transactionPollingTimeout;
}
return timeout;
}
createTransactionObserver(moduleInstance) {
return new TransactionObserver(moduleInstance.currentProvider, this.getTimeout(moduleInstance), moduleInstance.transactionConfirmationBlocks, new GetTransactionReceiptMethod(this.utils, this.formatters, moduleInstance), new GetBlockByNumberMethod(this.utils, this.formatters, moduleInstance), new NewHeadsSubscription(this.utils, this.formatters, moduleInstance));
}
}
class MethodProxy {
constructor(target, methodFactory) {
return new Proxy(target, {
get: (target, name) => {
if (methodFactory.hasMethod(name)) {
if (typeof target[name] !== 'undefined') {
throw new TypeError(`Duplicated method ${name}. This method is defined as RPC call and as Object method.`);
}
const method = methodFactory.createMethod(name, target);
function RpcMethod() {
method.setArguments(arguments);
return method.execute();
}
RpcMethod.method = method;
RpcMethod.request = function () {
method.setArguments(arguments);
return method;
};
return RpcMethod;
}
return Reflect.get(target, name);
}
});
}
}
class GetProtocolVersionMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_protocolVersion', 0, utils, formatters, moduleInstance);
}
afterExecution(response) {
return this.utils.hexToNumber(response);
}
}
class VersionMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('net_version', 0, utils, formatters, moduleInstance);
}
afterExecution(response) {
return this.utils.hexToNumber(response);
}
}
class ListeningMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('net_listening', 0, utils, formatters, moduleInstance);
}
}
class PeerCountMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('net_peerCount', 0, utils, formatters, moduleInstance);
}
afterExecution(response) {
return this.utils.hexToNumber(response);
}
}
class GetNodeInfoMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('datxweb_clientVersion', 0, utils, formatters, moduleInstance);
}
}
class GetCoinbaseMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_coinbase', 0, utils, formatters, moduleInstance);
}
}
class IsMiningMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_mining', 0, utils, formatters, moduleInstance);
}
}
class GetHashrateMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_hashrate', 0, utils, formatters, moduleInstance);
}
afterExecution(response) {
return this.utils.hexToNumber(response);
}
}
class IsSyncingMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_syncing', 0, utils, formatters, moduleInstance);
}
afterExecution(response) {
if (typeof response !== 'boolean') {
return this.formatters.outputSyncingFormatter(response);
}
return response;
}
}
class GetGasPriceMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_gasPrice', 0, utils, formatters, moduleInstance);
}
afterExecution(response) {
return this.formatters.outputBigNumberFormatter(response);
}
}
class SubmitWorkMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_submitWork', 3, utils, formatters, moduleInstance);
}
}
class GetWorkMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_getWork', 0, utils, formatters, moduleInstance);
}
}
class GetProofMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_getProof', 3, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
this.parameters[0] = this.formatters.inputAddressFormatter(this.parameters[0]);
this.parameters[2] = this.formatters.inputDefaultBlockNumberFormatter(this.parameters[2], moduleInstance);
}
afterExecution(response) {
response.nonce = this.utils.toBN(response.nonce).toString(10);
response.balance = this.utils.toBN(response.balance).toString(10);
for (let i = 0; i < response.storageProof.length; i++) {
response.storageProof[i].value = this.utils.toBN(response.storageProof[i].value).toString(10);
}
return response;
}
}
class GetAccountsMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_accounts', 0, utils, formatters, moduleInstance);
}
afterExecution(response) {
return response.map(responseItem => {
return this.utils.toChecksumAddress(responseItem);
});
}
}
class GetBalanceMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_getBalance', 2, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
this.parameters[0] = this.formatters.inputAddressFormatter(this.parameters[0]);
if (isFunction(this.parameters[1])) {
this.callback = this.parameters[1];
this.parameters[1] = moduleInstance.defaultBlock;
}
this.parameters[1] = this.formatters.inputDefaultBlockNumberFormatter(this.parameters[1], moduleInstance);
}
afterExecution(response) {
return this.formatters.outputBigNumberFormatter(response);
}
}
class RequestAccountsMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_requestAccounts', 0, utils, formatters, moduleInstance);
}
}
class AbstractGetUncleMethod extends AbstractMethod {
constructor(rpcMethod, utils, formatters, moduleInstance) {
super(rpcMethod, 2, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
this.parameters[0] = this.formatters.inputBlockNumberFormatter(this.parameters[0]);
this.parameters[1] = this.utils.numberToHex(this.parameters[1]);
}
afterExecution(response) {
return this.formatters.outputBlockFormatter(response);
}
}
class AbstractGetBlockTransactionCountMethod extends AbstractMethod {
constructor(rpcMethod, utils, formatters, moduleInstance) {
super(rpcMethod, 1, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
this.parameters[0] = this.formatters.inputBlockNumberFormatter(this.parameters[0]);
}
afterExecution(response) {
return this.utils.hexToNumber(response);
}
}
class AbstractGetBlockUncleCountMethod extends AbstractMethod {
constructor(rpcMethod, utils, formatters, moduleInstance) {
super(rpcMethod, 1, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
this.parameters[0] = this.formatters.inputBlockNumberFormatter(this.parameters[0]);
}
afterExecution(response) {
return this.utils.hexToNumber(response);
}
}
class GetBlockByHashMethod extends AbstractGetBlockMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_getBlockByHash', utils, formatters, moduleInstance);
}
}
class GetBlockNumberMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_blockNumber', 0, utils, formatters, moduleInstance);
}
afterExecution(response) {
return this.utils.hexToNumber(response);
}
}
class GetBlockTransactionCountByHashMethod extends AbstractGetBlockTransactionCountMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_getBlockTransactionCountByHash', utils, formatters, moduleInstance);
}
}
class GetBlockTransactionCountByNumberMethod extends AbstractGetBlockTransactionCountMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_getBlockTransactionCountByNumber', utils, formatters, moduleInstance);
}
}
class GetBlockUncleCountByBlockHashMethod extends AbstractGetBlockUncleCountMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_getUncleCountByBlockHash', utils, formatters, moduleInstance);
}
}
class GetBlockUncleCountByBlockNumberMethod extends AbstractGetBlockUncleCountMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_getUncleCountByBlockNumber', utils, formatters, moduleInstance);
}
}
class GetUncleByBlockHashAndIndexMethod extends AbstractGetUncleMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_getUncleByBlockHashAndIndex', utils, formatters, moduleInstance);
}
}
class GetUncleByBlockNumberAndIndexMethod extends AbstractGetUncleMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_getUncleByBlockNumberAndIndex', utils, formatters, moduleInstance);
}
}
class AbstractGetTransactionFromBlockMethod extends AbstractMethod {
constructor(rpcMethod, utils, formatters, moduleInstance) {
super(rpcMethod, 2, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
this.parameters[0] = this.formatters.inputBlockNumberFormatter(this.parameters[0]);
this.parameters[1] = this.utils.numberToHex(this.parameters[1]);
}
afterExecution(response) {
return this.formatters.outputTransactionFormatter(response);
}
}
class AbstractObservedTransactionMethod extends AbstractMethod {
constructor(rpcMethod, parametersAmount, utils, formatters, moduleInstance, transactionObserver) {
super(rpcMethod, parametersAmount, utils, formatters, moduleInstance);
this.transactionObserver = transactionObserver;
this.promiEvent = new PromiEvent();
}
static get Type() {
return 'observed-transaction-method';
}
get Type() {
return 'observed-transaction-method';
}
execute() {
this.beforeExecution(this.moduleInstance);
this.moduleInstance.currentProvider.send(this.rpcMethod, this.parameters).then(transactionHash => {
let confirmations, receipt;
if (this.callback) {
this.callback(false, transactionHash);
return;
}
this.promiEvent.emit('transactionHash', transactionHash);
const transactionConfirmationSubscription = this.transactionObserver.observe(transactionHash).subscribe(transactionConfirmation => {
confirmations = transactionConfirmation.confirmations;
receipt = transactionConfirmation.receipt;
if (!receipt.status) {
if (this.parameters[0].gas === receipt.gasUsed) {
this.handleError(new Error(`Transaction ran out of gas. Please provide more gas:\n${JSON.stringify(receipt, null, 2)}`), receipt, confirmations);
transactionConfirmationSubscription.unsubscribe();
return;
}
this.handleError(new Error(`Transaction has been reverted by the EVM:\n${JSON.stringify(receipt, null, 2)}`), receipt, confirmations);
transactionConfirmationSubscription.unsubscribe();
return;
}
this.promiEvent.emit('confirmation', confirmations, this.formatters.outputTransactionFormatter(receipt));
}, error => {
this.handleError(error, receipt, confirmations);
}, () => {
if (this.promiEvent.listenerCount('receipt') > 0) {
this.promiEvent.emit('receipt', this.afterExecution(receipt));
this.promiEvent.removeAllListeners();
return;
}
this.promiEvent.resolve(this.afterExecution(receipt));
});
}).catch(error => {
if (this.callback) {
this.callback(error, null);
return;
}
this.handleError(error, false, 0);
});
return this.promiEvent;
}
handleError(error, receipt, confirmations) {
if (this.promiEvent.listenerCount('error') > 0) {
this.promiEvent.emit('error', error, receipt, confirmations);
this.promiEvent.removeAllListeners();
return;
}
this.promiEvent.reject(error);
}
}
class SendTransactionMethod extends AbstractObservedTransactionMethod {
constructor(utils, formatters, moduleInstance, transactionObserver) {
super('datx_sendTransaction', 1, utils, formatters, moduleInstance, transactionObserver);
}
beforeExecution(moduleInstance) {
this.parameters[0] = this.formatters.inputTransactionFormatter(this.parameters[0], moduleInstance);
}
afterExecution(response) {
return this.formatters.outputTransactionFormatter(response);
}
}
class EthSendTransactionMethod extends SendTransactionMethod {
constructor(utils, formatters, moduleInstance, transactionObserver, chainIdMethod, getTransactionCountMethod) {
super(utils, formatters, moduleInstance, transactionObserver);
this.chainIdMethod = chainIdMethod;
this.getTransactionCountMethod = getTransactionCountMethod;
}
static get Type() {
return 'eth-send-transaction-method';
}
get Type() {
return 'eth-send-transaction-method';
}
beforeExecution(moduleInstance) {
if (this.rpcMethod !== 'datx_sendRawTransaction') {
super.beforeExecution(moduleInstance);
}
}
execute() {
if (!this.parameters[0].gas && this.moduleInstance.defaultGas) {
this.parameters[0]['gas'] = this.moduleInstance.defaultGas;
}
if (!this.parameters[0].gasPrice && this.parameters[0].gasPrice !== 0) {
if (!this.moduleInstance.defaultGasPrice) {
this.moduleInstance.currentProvider.send('datx_gasPrice', []).then(gasPrice => {
this.parameters[0].gasPrice = gasPrice;
this.execute();
}).catch(error => {
this.handleError(error, false, 0);
});
return this.promiEvent;
}
this.parameters[0]['gasPrice'] = this.moduleInstance.defaultGasPrice;
}
if (this.hasAccounts() && this.isDefaultSigner()) {
const account = this.moduleInstance.accounts.wallet[this.parameters[0].from];
if (account) {
this.sendRawTransaction(account).catch(error => {
this.handleError(error, false, 0);
});
return this.promiEvent;
}
}
if (this.hasCustomSigner()) {
this.sendRawTransaction().catch(error => {
this.handleError(error, false, 0);
});
return this.promiEvent;
}
return super.execute();
}
async sendRawTransaction(account = {}) {
const response = await this.signTransaction(account);
this.parameters = [response.rawTransaction];
this.rpcMethod = 'datx_sendRawTransaction';
return super.execute();
}
async signTransaction(account = {}) {
this.beforeExecution(this.moduleInstance);
if (!this.parameters[0].chainId) {
this.parameters[0].chainId = await this.chainIdMethod.execute();
}
if (!this.parameters[0].nonce && this.parameters[0].nonce !== 0) {
let nonce;
if (account.nonce) {
account.nonce = account.nonce + 1;
nonce = account.nonce;
}
if (!nonce) {
this.getTransactionCountMethod.parameters = [this.parameters[0].from, 'latest'];
nonce = await this.getTransactionCountMethod.execute();
account.nonce = nonce;
}
this.parameters[0].nonce = nonce;
}
let transaction = this.parameters[0];
transaction.to = transaction.to || '0x';
transaction.data = transaction.data || '0x';
transaction.value = transaction.value || '0x';
transaction.chainId = this.utils.numberToHex(transaction.chainId);
delete transaction.from;
return this.moduleInstance.transactionSigner.sign(transaction, account.privateKey);
}
isDefaultSigner() {
return this.moduleInstance.transactionSigner.type === 'TransactionSigner';
}
hasAccounts() {
return this.moduleInstance.accounts && this.moduleInstance.accounts.wallet.accountsIndex > 0;
}
hasCustomSigner() {
return this.moduleInstance.transactionSigner.type !== 'TransactionSigner';
}
}
class GetTransactionMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_getTransactionByHash', 1, utils, formatters, moduleInstance);
}
afterExecution(response) {
return this.formatters.outputTransactionFormatter(response);
}
}
class GetPendingTransactionsMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_pendingTransactions', 0, utils, formatters, moduleInstance);
}
afterExecution(response) {
if (response) {
return response.map(item => {
return this.formatters.outputTransactionFormatter(item);
});
}
return response;
}
}
class GetTransactionByBlockHashAndIndexMethod extends AbstractGetTransactionFromBlockMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_getTransactionByBlockHashAndIndex', utils, formatters, moduleInstance);
}
}
class GetTransactionByBlockNumberAndIndexMethod extends AbstractGetTransactionFromBlockMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_getTransactionByBlockNumberAndIndex', utils, formatters, moduleInstance);
}
}
class SendRawTransactionMethod extends AbstractObservedTransactionMethod {
constructor(utils, formatters, moduleInstance, transactionObserver) {
super('datx_sendRawTransaction', 1, utils, formatters, moduleInstance, transactionObserver);
}
afterExecution(response) {
return this.formatters.outputTransactionFormatter(response);
}
}
class SignTransactionMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_signTransaction', 1, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
this.parameters[0] = this.formatters.inputTransactionFormatter(this.parameters[0], moduleInstance);
}
}
class GetCodeMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_getCode', 2, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
this.parameters[0] = this.formatters.inputAddressFormatter(this.parameters[0]);
if (isFunction(this.parameters[1])) {
this.callback = this.parameters[1];
this.parameters[1] = moduleInstance.defaultBlock;
}
this.parameters[1] = this.formatters.inputDefaultBlockNumberFormatter(this.parameters[1], moduleInstance);
}
}
class SignMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_sign', 2, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
this.parameters[0] = this.formatters.inputSignFormatter(this.parameters[0]);
this.parameters[1] = this.formatters.inputAddressFormatter(this.parameters[1]);
this.parameters.reverse();
}
}
class CallMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_call', 2, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
this.parameters[0] = this.formatters.inputCallFormatter(this.parameters[0], moduleInstance);
if (isFunction(this.parameters[1])) {
this.callback = this.parameters[1];
this.parameters[1] = moduleInstance.defaultBlock;
}
this.parameters[1] = this.formatters.inputDefaultBlockNumberFormatter(this.parameters[1], moduleInstance);
}
}
class GetStorageAtMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_getStorageAt', 3, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
this.parameters[0] = this.formatters.inputAddressFormatter(this.parameters[0]);
this.parameters[1] = this.utils.numberToHex(this.parameters[1]);
if (isFunction(this.parameters[2])) {
this.callback = this.parameters[2];
this.parameters[2] = moduleInstance.defaultBlock;
}
this.parameters[2] = this.formatters.inputDefaultBlockNumberFormatter(this.parameters[2], moduleInstance);
}
}
class EstimateGasMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_estimateGas', 1, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
this.parameters[0] = this.formatters.inputCallFormatter(this.parameters[0], moduleInstance);
}
afterExecution(response) {
return this.utils.hexToNumber(response);
}
}
class GetPastLogsMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('datx_getLogs', 1, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
this.parameters[0] = this.formatters.inputLogFormatter(this.parameters[0]);
}
afterExecution(response) {
return response.map(responseItem => {
return this.formatters.outputLogFormatter(responseItem);
});
}
}
class EcRecoverMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('personal_ecRecover', 2, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
this.parameters[0] = this.formatters.inputSignFormatter(this.parameters[0]);
}
}
class ImportRawKeyMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('personal_importRawKey', 2, utils, formatters, moduleInstance);
}
}
class ListAccountsMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('personal_listAccounts', 0, utils, formatters, moduleInstance);
}
afterExecution(response) {
return response.map(responseItem => {
return this.utils.toChecksumAddress(responseItem);
});
}
}
class LockAccountMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('personal_lockAccount', 1, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
this.parameters[0] = this.formatters.inputAddressFormatter(this.parameters[0]);
}
}
class NewAccountMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('personal_newAccount', 1, utils, formatters, moduleInstance);
}
afterExecution(response) {
return this.utils.toChecksumAddress(response);
}
}
class PersonalSendTransactionMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('personal_sendTransaction', 2, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
this.parameters[0] = this.formatters.inputTransactionFormatter(this.parameters[0], moduleInstance);
}
}
class PersonalSignMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('personal_sign', 3, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
this.parameters[0] = this.formatters.inputSignFormatter(this.parameters[0]);
this.parameters[1] = this.formatters.inputAddressFormatter(this.parameters[1]);
if (isFunction(this.parameters[2])) {
this.callback = this.parameters[2];
delete this.parameters[2];
}
}
}
class PersonalSignTransactionMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('personal_signTransaction', 2, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
this.parameters[0] = this.formatters.inputTransactionFormatter(this.parameters[0], moduleInstance);
}
}
class UnlockAccountMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('personal_unlockAccount', 3, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
this.parameters[0] = this.formatters.inputAddressFormatter(this.parameters[0]);
}
}
class AddPrivateKeyMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('shh_addPrivateKey', 1, utils, formatters, moduleInstance);
}
}
class AddSymKeyMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('shh_addSymKey', 1, utils, formatters, moduleInstance);
}
}
class DeleteKeyPairMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('shh_deleteKeyPair', 1, utils, formatters, moduleInstance);
}
}
class DeleteMessageFilterMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('shh_deleteMessageFilter', 1, utils, formatters, moduleInstance);
}
}
class DeleteSymKeyMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('shh_deleteSymKey', 1, utils, formatters, moduleInstance);
}
}
class GenerateSymKeyFromPasswordMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('shh_generateSymKeyFromPassword', 1, utils, formatters, moduleInstance);
}
}
class GetFilterMessagesMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('shh_getFilterMessages', 1, utils, formatters, moduleInstance);
}
}
class GetInfoMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('shh_info', 0, utils, formatters, moduleInstance);
}
}
class GetPrivateKeyMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('shh_getPrivateKey', 1, utils, formatters, moduleInstance);
}
}
class GetPublicKeyMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('shh_getPublicKey', 1, utils, formatters, moduleInstance);
}
}
class GetSymKeyMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('shh_getSymKey', 1, utils, formatters, moduleInstance);
}
}
class HasKeyPairMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('shh_hasKeyPair', 1, utils, formatters, moduleInstance);
}
}
class HasSymKeyMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('shh_hasSymKey', 1, utils, formatters, moduleInstance);
}
}
class MarkTrustedPeerMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('shh_markTrustedPeer', 1, utils, formatters, moduleInstance);
}
}
class NewKeyPairMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('shh_newKeyPair', 0, utils, formatters, moduleInstance);
}
}
class NewMessageFilterMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('shh_newMessageFilter', 1, utils, formatters, moduleInstance);
}
}
class NewSymKeyMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('shh_newSymKey', 0, utils, formatters, moduleInstance);
}
}
class PostMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('shh_post', 1, utils, formatters, moduleInstance);
}
}
class SetMaxMessageSizeMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('shh_setMaxMessageSize', 1, utils, formatters, moduleInstance);
}
}
class SetMinPoWMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('shh_setMinPoW', 1, utils, formatters, moduleInstance);
}
}
class ShhVersionMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('shh_version', 0, utils, formatters, moduleInstance);
}
}
class BackTraceAtMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('debug_backtraceAt', 1, utils, formatters, moduleInstance);
}
}
class BlockProfileMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('debug_blockProfile', 2, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
this.parameters[1] = this.utils.numberToHex(this.parameters[1]);
}
}
class CpuProfileMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('debug_cpuProfile', 2, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
this.parameters[1] = this.utils.numberToHex(this.parameters[1]);
}
}
class DumpBlockMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('debug_dumpBlock', 1, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
this.parameters[0] = this.utils.numberToHex(this.parameters[0]);
}
}
class GcStatsMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('debug_gcStats', 0, utils, formatters, moduleInstance);
}
}
class GetBlockRlpMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('debug_getBlockRlp', 1, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
this.parameters[0] = this.utils.numberToHex(this.parameters[0]);
}
}
class GoTraceMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('debug_goTrace', 2, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
this.parameters[1] = this.utils.numberToHex(this.parameters[1]);
}
}
class MemStatsMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('debug_memStats', 0, utils, formatters, moduleInstance);
}
}
class SeedHashMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('debug_seedHash', 0, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
this.parameters[0] = this.utils.numberToHex(this.parameters[0]);
}
}
class SetBlockProfileRateMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('debug_setBlockProfileRate', 1, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
this.parameters[0] = this.utils.numberToHex(this.parameters[0]);
}
}
class SetHeadMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('debug_setHead', 1, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
this.parameters[0] = this.utils.numberToHex(this.parameters[0]);
}
}
class StacksMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('debug_stacks', 0, utils, formatters, moduleInstance);
}
}
class StartCpuProfileMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('debug_startCPUProfile', 1, utils, formatters, moduleInstance);
}
}
class StartGoTraceMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('debug_startGoTrace', 1, utils, formatters, moduleInstance);
}
}
class StopCpuProfileMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('debug_stopCPUProfile', 0, utils, formatters, moduleInstance);
}
}
class StopGoTraceMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('debug_stopGoTrace', 0, utils, formatters, moduleInstance);
}
}
class TraceBlockByHashMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('debug_traceBlockByHash', 2, utils, formatters, moduleInstance);
}
}
class TraceBlockByNumberMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('debug_traceBlockByNumber', 2, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
this.parameters[0] = this.utils.numberToHex(this.parameters[0]);
}
}
class TraceBlockFromFileMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('debug_traceBlockFromFile', 2, utils, formatters, moduleInstance);
}
}
class TraceBlockMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('debug_traceBlock', 2, utils, formatters, moduleInstance);
}
}
class TraceTransactionMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('debug_traceTransaction', 2, utils, formatters, moduleInstance);
}
}
class VerbosityMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('debug_verbosity', 1, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
this.parameters[0] = this.utils.numberToHex(this.parameters[0]);
}
}
class VmoduleMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('debug_vmodule', 1, utils, formatters, moduleInstance);
}
}
class WriteBlockProfileMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('debug_writeBlockProfile', 1, utils, formatters, moduleInstance);
}
}
class WriteMemProfileMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('debug_writeMemProfile', 1, utils, formatters, moduleInstance);
}
}
class ContentMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('txpool_content', 0, utils, formatters, moduleInstance);
}
}
class InspectMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('txpool_inspect', 0, utils, formatters, moduleInstance);
}
}
class StatusMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('txpool_status', 0, utils, formatters, moduleInstance);
}
afterExecution(response) {
if (response) {
response.pending = this.utils.hexToNumber(response.pending);
response.queued = this.utils.hexToNumber(response.queued);
}
return response;
}
}
class AddPeerMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('admin_addPeer', 1, utils, formatters, moduleInstance);
}
}
class DataDirectoryMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('admin_datadir', 0, utils, formatters, moduleInstance);
}
}
class NodeInfoMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('admin_nodeInfo', 0, utils, formatters, moduleInstance);
}
afterExecution(response) {
if (response) {
response.ports.discovery = this.utils.hexToNumber(response.ports.discovery);
response.ports.listener = this.utils.hexToNumber(response.ports.listener);
}
return response;
}
}
class PeersMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('admin_peers', 0, utils, formatters, moduleInstance);
}
}
class SetSolcMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('admin_setSolc', 1, utils, formatters, moduleInstance);
}
}
class StartRpcMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('admin_startRPC', 4, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
if (this.parameters[1]) {
this.parameters[1] = this.utils.numberToHex(this.parameters[1]);
}
}
}
class StartWsMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('admin_startWS', 4, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
if (this.parameters[1]) {
this.parameters[1] = this.utils.numberToHex(this.parameters[1]);
}
}
}
class StopRpcMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('admin_stopRPC', 0, utils, formatters, moduleInstance);
}
}
class StopWsMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('admin_stopWS', 0, utils, formatters, moduleInstance);
}
}
class SetEtherBaseMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('miner_setEtherbase', 1, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
this.parameters[0] = this.formatters.inputAddressFormatter(this.parameters[0]);
}
}
class SetExtraMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('miner_setExtra', 1, utils, formatters, moduleInstance);
}
}
class SetGasPriceMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('miner_setGasPrice', 1, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
this.parameters[0] = this.utils.numberToHex(this.parameters[0]);
}
}
class StartMinerMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('miner_start', 1, utils, formatters, moduleInstance);
}
beforeExecution(moduleInstance) {
this.parameters[0] = this.utils.numberToHex(this.parameters[0]);
}
}
class StopMinerMethod extends AbstractMethod {
constructor(utils, formatters, moduleInstance) {
super('miner_stop', 0, utils, formatters, moduleInstance);
}
}
export { AbstractGetBlockMethod, AbstractGetBlockTransactionCountMethod, AbstractGetBlockUncleCountMethod, AbstractGetTransactionFromBlockMethod, AbstractGetUncleMethod, AbstractMethod, AbstractMethodFactory, AbstractObservedTransactionMethod, AddPeerMethod, AddPrivateKeyMethod, AddSymKeyMethod, BackTraceAtMethod, BlockProfileMethod, CallMethod, ChainIdMethod, ContentMethod, CpuProfileMethod, DataDirectoryMethod, DeleteKeyPairMethod, DeleteMessageFilterMethod, DeleteSymKeyMethod, DumpBlockMethod, EcRecoverMethod, EstimateGasMethod, EthSendTransactionMethod, GcStatsMethod, GenerateSymKeyFromPasswordMethod, GetAccountsMethod, GetBalanceMethod, GetBlockByHashMethod, GetBlockByNumberMethod, GetBlockNumberMethod, GetBlockRlpMethod, GetBlockTransactionCountByHashMethod, GetBlockTransactionCountByNumberMethod, GetBlockUncleCountByBlockHashMethod, GetBlockUncleCountByBlockNumberMethod, GetCodeMethod, GetCoinbaseMethod, GetFilterMessagesMethod, GetGasPriceMethod, GetHashrateMethod, GetInfoMethod, GetNodeInfoMethod, GetPastLogsMethod, GetPendingTransactionsMethod, GetPrivateKeyMethod, GetProofMethod, GetProtocolVersionMethod, GetPublicKeyMethod, GetStorageAtMethod, GetSymKeyMethod, GetTransactionByBlockHashAndIndexMethod, GetTransactionByBlockNumberAndIndexMethod, GetTransactionCountMethod, GetTransactionMethod, GetTransactionReceiptMethod, GetUncleByBlockHashAndIndexMethod, GetUncleByBlockNumberAndIndexMethod, GetWorkMethod, GoTraceMethod, HasKeyPairMethod, HasSymKeyMethod, ImportRawKeyMethod, InspectMethod, IsMiningMethod, IsSyncingMethod, ListAccountsMethod, ListeningMethod, LockAccountMethod, MarkTrustedPeerMethod, MemStatsMethod, MethodProxy, NewAccountMethod, NewKeyPairMethod, NewMessageFilterMethod, NewSymKeyMethod, NodeInfoMethod, PeerCountMethod, PeersMethod, PersonalSendTransactionMethod, PersonalSignMethod, PersonalSignTransactionMethod, PostMethod, PromiEvent, RequestAccountsMethod, SeedHashMethod, SendRawTransactionMethod, SendTransactionMethod, SetBlockProfileRateMethod, SetEtherBaseMethod, SetExtraMethod, SetGasPriceMethod, SetHeadMethod, SetMaxMessageSizeMethod, SetMinPoWMethod, SetSolcMethod, ShhVersionMethod, SignMethod, SignTransactionMethod, StacksMethod, StartCpuProfileMethod, StartGoTraceMethod