Made default encoding/decoding rules global to all modules in encoder
This commit is contained in:
@@ -2,13 +2,12 @@ import { DataItem } from 'ethereum-types';
|
||||
import * as _ from 'lodash';
|
||||
|
||||
import { Calldata, CalldataBlock, RawCalldata } from '../calldata';
|
||||
import * as Constants from '../utils/constants';
|
||||
import { DecodingRules, EncodingRules } from '../utils/rules';
|
||||
|
||||
import { DataTypeFactory } from './interfaces';
|
||||
|
||||
export abstract class DataType {
|
||||
private static readonly _DEFAULT_ENCODING_RULES: EncodingRules = { optimize: false, annotate: false };
|
||||
private static readonly _DEFAULT_DECODING_RULES: DecodingRules = { structsAsObjects: false };
|
||||
private readonly _dataItem: DataItem;
|
||||
private readonly _factory: DataTypeFactory;
|
||||
|
||||
@@ -26,7 +25,7 @@ export abstract class DataType {
|
||||
}
|
||||
|
||||
public encode(value: any, rules?: EncodingRules, selector?: string): string {
|
||||
const rules_ = rules ? rules : DataType._DEFAULT_ENCODING_RULES;
|
||||
const rules_ = rules ? rules : Constants.DEFAULT_ENCODING_RULES;
|
||||
const calldata = new Calldata(rules_);
|
||||
if (selector) {
|
||||
calldata.setSelector(selector);
|
||||
@@ -39,7 +38,7 @@ export abstract class DataType {
|
||||
|
||||
public decode(calldata: string, rules?: DecodingRules, hasSelector: boolean = false): any {
|
||||
const rawCalldata = new RawCalldata(calldata, hasSelector);
|
||||
const rules_ = rules ? rules : DataType._DEFAULT_DECODING_RULES;
|
||||
const rules_ = rules ? rules : Constants.DEFAULT_DECODING_RULES;
|
||||
const value = this.generateValue(rawCalldata, rules_);
|
||||
return value;
|
||||
}
|
||||
|
@@ -10,30 +10,28 @@ import { DecodingRules, EncodingRules } from '../utils/rules';
|
||||
import { Tuple } from './tuple';
|
||||
|
||||
export class Method extends MemberDataType {
|
||||
// TMP
|
||||
public selector: string;
|
||||
|
||||
private readonly _methodSignature: string;
|
||||
private readonly _methodSelector: string;
|
||||
private readonly _returnDataType: DataType;
|
||||
|
||||
public constructor(abi: MethodAbi, dataTypeFactory: DataTypeFactory) {
|
||||
super({ type: 'method', name: abi.name, components: abi.inputs }, dataTypeFactory);
|
||||
const methodDataItem = { type: 'method', name: abi.name, components: abi.inputs };
|
||||
super(methodDataItem, dataTypeFactory);
|
||||
this._methodSignature = this._computeSignature();
|
||||
this.selector = this._methodSelector = this._computeSelector();
|
||||
this._methodSelector = this._computeSelector();
|
||||
const returnDataItem: DataItem = { type: 'tuple', name: abi.name, components: abi.outputs };
|
||||
this._returnDataType = new Tuple(returnDataItem, this.getFactory());
|
||||
}
|
||||
|
||||
public encode(value: any, rules?: EncodingRules): string {
|
||||
const calldata = super.encode(value, rules, this.selector);
|
||||
const calldata = super.encode(value, rules, this._methodSelector);
|
||||
return calldata;
|
||||
}
|
||||
|
||||
public decode(calldata: string, rules?: DecodingRules): any[] | object {
|
||||
if (!calldata.startsWith(this.selector)) {
|
||||
if (!calldata.startsWith(this._methodSelector)) {
|
||||
throw new Error(
|
||||
`Tried to decode calldata, but it was missing the function selector. Expected '${this.selector}'.`,
|
||||
`Tried to decode calldata, but it was missing the function selector. Expected '${this._methodSelector}'.`,
|
||||
);
|
||||
}
|
||||
const hasSelector = true;
|
||||
@@ -46,10 +44,11 @@ export class Method extends MemberDataType {
|
||||
return returnData;
|
||||
}
|
||||
|
||||
public decodeReturnValues(returndata: string, rules?: DecodingRules): any {
|
||||
const rules_: DecodingRules = rules ? rules : { structsAsObjects: false };
|
||||
const rawReturnData = new RawCalldata(returndata, false);
|
||||
const returnValues = this._returnDataType.generateValue(rawReturnData, rules_);
|
||||
public decodeReturnValues(returndata: string, rules_?: DecodingRules): any {
|
||||
const rules: DecodingRules = rules_ ? rules_ : Constants.DEFAULT_DECODING_RULES;
|
||||
const returnDataHasSelector = false;
|
||||
const rawReturnData = new RawCalldata(returndata, returnDataHasSelector);
|
||||
const returnValues = this._returnDataType.generateValue(rawReturnData, rules);
|
||||
return returnValues;
|
||||
}
|
||||
|
||||
|
@@ -1,3 +1,5 @@
|
||||
import { DecodingRules, EncodingRules } from './rules';
|
||||
|
||||
export const EVM_WORD_WIDTH_IN_BYTES = 32;
|
||||
export const EVM_WORD_WIDTH_IN_BITS = 256;
|
||||
export const HEX_BASE = 16;
|
||||
@@ -6,3 +8,5 @@ export const BIN_BASE = 2;
|
||||
export const HEX_SELECTOR_LENGTH_IN_CHARS = 10;
|
||||
export const HEX_SELECTOR_LENGTH_IN_BYTES = 4;
|
||||
export const HEX_SELECTOR_BYTE_OFFSET_IN_CALLDATA = 0;
|
||||
export const DEFAULT_DECODING_RULES: DecodingRules = { structsAsObjects: false };
|
||||
export const DEFAULT_ENCODING_RULES: EncodingRules = { optimize: false, annotate: false };
|
||||
|
Reference in New Issue
Block a user