diff options
author | Fred Carlsen <fred@sjelfull.no> | 2018-12-05 23:15:44 +0800 |
---|---|---|
committer | Fred Carlsen <fred@sjelfull.no> | 2018-12-05 23:15:44 +0800 |
commit | 00dbddc1aafd56c352e7a8905338d81e236b1fa1 (patch) | |
tree | c8462eb4e6882a39dec601b990f75761b4897ce8 /packages/utils/src/abi_encoder/evm_data_types/method.ts | |
parent | b552c2bd0c5090629a96bc6b0e032cb85d9c52b3 (diff) | |
parent | b411e2250aed82b87d1cbebf5cf805d794ddbdb7 (diff) | |
download | dexon-sol-tools-00dbddc1aafd56c352e7a8905338d81e236b1fa1.tar dexon-sol-tools-00dbddc1aafd56c352e7a8905338d81e236b1fa1.tar.gz dexon-sol-tools-00dbddc1aafd56c352e7a8905338d81e236b1fa1.tar.bz2 dexon-sol-tools-00dbddc1aafd56c352e7a8905338d81e236b1fa1.tar.lz dexon-sol-tools-00dbddc1aafd56c352e7a8905338d81e236b1fa1.tar.xz dexon-sol-tools-00dbddc1aafd56c352e7a8905338d81e236b1fa1.tar.zst dexon-sol-tools-00dbddc1aafd56c352e7a8905338d81e236b1fa1.zip |
Merge remote-tracking branch 'upstream/development' into website
# Conflicts:
# packages/website/package.json
# packages/website/ts/style/colors.ts
Diffstat (limited to 'packages/utils/src/abi_encoder/evm_data_types/method.ts')
-rw-r--r-- | packages/utils/src/abi_encoder/evm_data_types/method.ts | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/packages/utils/src/abi_encoder/evm_data_types/method.ts b/packages/utils/src/abi_encoder/evm_data_types/method.ts new file mode 100644 index 000000000..b1cd1377f --- /dev/null +++ b/packages/utils/src/abi_encoder/evm_data_types/method.ts @@ -0,0 +1,72 @@ +import { DataItem, MethodAbi } from 'ethereum-types'; +import * as ethUtil from 'ethereumjs-util'; +import * as _ from 'lodash'; + +import { DataType } from '../abstract_data_types/data_type'; +import { DataTypeFactory } from '../abstract_data_types/interfaces'; +import { AbstractSetDataType } from '../abstract_data_types/types/set'; +import { constants } from '../utils/constants'; +import { DecodingRules, EncodingRules } from '../utils/rules'; + +import { TupleDataType } from './tuple'; + +export class MethodDataType extends AbstractSetDataType { + private readonly _methodSignature: string; + private readonly _methodSelector: string; + private readonly _returnDataType: DataType; + + public constructor(abi: MethodAbi, dataTypeFactory: DataTypeFactory) { + const methodDataItem = { type: 'method', name: abi.name, components: abi.inputs }; + super(methodDataItem, dataTypeFactory); + this._methodSignature = this._computeSignature(); + this._methodSelector = this._computeSelector(); + const returnDataItem: DataItem = { type: 'tuple', name: abi.name, components: abi.outputs }; + this._returnDataType = new TupleDataType(returnDataItem, this.getFactory()); + } + + public encode(value: any, rules?: EncodingRules): string { + const calldata = super.encode(value, rules, this._methodSelector); + return calldata; + } + + public decode(calldata: string, rules?: DecodingRules): any[] | object { + const value = super.decode(calldata, rules, this._methodSelector); + return value; + } + + public encodeReturnValues(value: any, rules?: EncodingRules): string { + const returnData = this._returnDataType.encode(value, rules); + return returnData; + } + + public decodeReturnValues(returndata: string, rules?: DecodingRules): any { + const returnValues = this._returnDataType.decode(returndata, rules); + return returnValues; + } + + public getSignature(): string { + return this._methodSignature; + } + + public getSelector(): string { + return this._methodSelector; + } + + private _computeSignature(): string { + const memberSignature = this._computeSignatureOfMembers(); + const methodSignature = `${this.getDataItem().name}${memberSignature}`; + return methodSignature; + } + + private _computeSelector(): string { + const signature = this._computeSignature(); + const selector = ethUtil.bufferToHex( + ethUtil.toBuffer( + ethUtil + .sha3(signature) + .slice(constants.HEX_SELECTOR_BYTE_OFFSET_IN_CALLDATA, constants.HEX_SELECTOR_LENGTH_IN_BYTES), + ), + ); + return selector; + } +} |