diff options
author | Greg Hysen <greg.hysen@gmail.com> | 2018-11-21 05:40:46 +0800 |
---|---|---|
committer | Greg Hysen <greg.hysen@gmail.com> | 2018-11-29 08:38:11 +0800 |
commit | fee67326adbbf745966803c935d5663c3ca7f52c (patch) | |
tree | 752d17d251026abf2a774992a79b2e9030957161 /packages/utils/src/abi_encoder/abstract_data_types/dependent_data_type.ts | |
parent | a47901370bc69d6247e941c569bc9fe824516db9 (diff) | |
download | dexon-sol-tools-fee67326adbbf745966803c935d5663c3ca7f52c.tar dexon-sol-tools-fee67326adbbf745966803c935d5663c3ca7f52c.tar.gz dexon-sol-tools-fee67326adbbf745966803c935d5663c3ca7f52c.tar.bz2 dexon-sol-tools-fee67326adbbf745966803c935d5663c3ca7f52c.tar.lz dexon-sol-tools-fee67326adbbf745966803c935d5663c3ca7f52c.tar.xz dexon-sol-tools-fee67326adbbf745966803c935d5663c3ca7f52c.tar.zst dexon-sol-tools-fee67326adbbf745966803c935d5663c3ca7f52c.zip |
Merge above
Diffstat (limited to 'packages/utils/src/abi_encoder/abstract_data_types/dependent_data_type.ts')
-rw-r--r-- | packages/utils/src/abi_encoder/abstract_data_types/dependent_data_type.ts | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/packages/utils/src/abi_encoder/abstract_data_types/dependent_data_type.ts b/packages/utils/src/abi_encoder/abstract_data_types/dependent_data_type.ts new file mode 100644 index 000000000..e9f390b22 --- /dev/null +++ b/packages/utils/src/abi_encoder/abstract_data_types/dependent_data_type.ts @@ -0,0 +1,50 @@ +import { DataItem } from 'ethereum-types'; +import * as ethUtil from 'ethereumjs-util'; +import * as _ from 'lodash'; + +import { CalldataBlock, DependentCalldataBlock, RawCalldata } from '../calldata'; +import * as Constants from '../constants'; +import { DecodingRules } from '../utils/rules'; + +import { DataType } from './data_type'; +import { DataTypeFactory } from './interfaces'; + +export abstract class DependentDataType extends DataType { + protected _dependency: DataType; + protected _parent: DataType; + private readonly _isStatic: boolean; + + public constructor(dataItem: DataItem, factory: DataTypeFactory, dependency: DataType, parent: DataType) { + super(dataItem, factory); + this._dependency = dependency; + this._parent = parent; + this._isStatic = true; + } + + public generateCalldataBlock(value: any, parentBlock?: CalldataBlock): DependentCalldataBlock { + if (parentBlock === undefined) { + throw new Error(`DependentDataType requires a parent block to generate its block`); + } + const dependencyBlock = this._dependency.generateCalldataBlock(value, parentBlock); + const name = this.getDataItem().name; + const signature = this.getSignature(); + const parentName = parentBlock === undefined ? '' : parentBlock.getName(); + const block = new DependentCalldataBlock(name, signature, parentName, dependencyBlock, parentBlock); + return block; + } + + public generateValue(calldata: RawCalldata, rules: DecodingRules): any { + const destinationOffsetBuf = calldata.popWord(); + const currentOffset = calldata.getOffset(); + const destinationOffsetRelative = parseInt(ethUtil.bufferToHex(destinationOffsetBuf), Constants.HEX_BASE); + const destinationOffsetAbsolute = calldata.toAbsoluteOffset(destinationOffsetRelative); + calldata.setOffset(destinationOffsetAbsolute); + const value = this._dependency.generateValue(calldata, rules); + calldata.setOffset(currentOffset); + return value; + } + + public isStatic(): boolean { + return this._isStatic; + } +} |