diff options
author | Steve Klebanoff <steve.klebanoff@gmail.com> | 2018-12-01 04:47:05 +0800 |
---|---|---|
committer | Steve Klebanoff <steve.klebanoff@gmail.com> | 2018-12-01 04:47:05 +0800 |
commit | 12d34707b70e4784719593ec8d7ea57c5e601856 (patch) | |
tree | 263e872f0dc042f4dd0dfcc85c7ecc403ba83415 /packages/utils/src/abi_encoder/abstract_data_types/types/pointer.ts | |
parent | ab631060a05fc6344ef6e2de7b0e6a0f0096e8ed (diff) | |
parent | f496096ce154e51ae0317cc91fd55d062eb6ec4f (diff) | |
download | dexon-sol-tools-12d34707b70e4784719593ec8d7ea57c5e601856.tar dexon-sol-tools-12d34707b70e4784719593ec8d7ea57c5e601856.tar.gz dexon-sol-tools-12d34707b70e4784719593ec8d7ea57c5e601856.tar.bz2 dexon-sol-tools-12d34707b70e4784719593ec8d7ea57c5e601856.tar.lz dexon-sol-tools-12d34707b70e4784719593ec8d7ea57c5e601856.tar.xz dexon-sol-tools-12d34707b70e4784719593ec8d7ea57c5e601856.tar.zst dexon-sol-tools-12d34707b70e4784719593ec8d7ea57c5e601856.zip |
Merge branch 'development' into feature/instant/prod-env-switches-cdn
Diffstat (limited to 'packages/utils/src/abi_encoder/abstract_data_types/types/pointer.ts')
-rw-r--r-- | packages/utils/src/abi_encoder/abstract_data_types/types/pointer.ts | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/packages/utils/src/abi_encoder/abstract_data_types/types/pointer.ts b/packages/utils/src/abi_encoder/abstract_data_types/types/pointer.ts new file mode 100644 index 000000000..0f3c55280 --- /dev/null +++ b/packages/utils/src/abi_encoder/abstract_data_types/types/pointer.ts @@ -0,0 +1,54 @@ +import { DataItem } from 'ethereum-types'; +import * as ethUtil from 'ethereumjs-util'; +import * as _ from 'lodash'; + +import { PointerCalldataBlock } from '../../calldata/blocks/pointer'; +import { CalldataBlock } from '../../calldata/calldata_block'; +import { RawCalldata } from '../../calldata/raw_calldata'; +import { constants } from '../../utils/constants'; +import { DecodingRules } from '../../utils/rules'; + +import { DataType } from '../data_type'; +import { DataTypeFactory } from '../interfaces'; + +export abstract class AbstractPointerDataType extends DataType { + protected _destination: DataType; + protected _parent: DataType; + + public constructor(dataItem: DataItem, factory: DataTypeFactory, destination: DataType, parent: DataType) { + super(dataItem, factory); + this._destination = destination; + this._parent = parent; + } + + public generateCalldataBlock(value: any, parentBlock?: CalldataBlock): PointerCalldataBlock { + if (_.isUndefined(parentBlock)) { + throw new Error(`DependentDataType requires a parent block to generate its block`); + } + const destinationBlock = this._destination.generateCalldataBlock(value, parentBlock); + const name = this.getDataItem().name; + const signature = this.getSignature(); + const parentName = parentBlock.getName(); + const block = new PointerCalldataBlock(name, signature, parentName, destinationBlock, parentBlock); + return block; + } + + public generateValue(calldata: RawCalldata, rules: DecodingRules): any { + const destinationOffsetBuf = calldata.popWord(); + const destinationOffsetHex = ethUtil.bufferToHex(destinationOffsetBuf); + const destinationOffsetRelative = parseInt(destinationOffsetHex, constants.HEX_BASE); + const destinationOffsetAbsolute = calldata.toAbsoluteOffset(destinationOffsetRelative); + const currentOffset = calldata.getOffset(); + calldata.setOffset(destinationOffsetAbsolute); + const value = this._destination.generateValue(calldata, rules); + calldata.setOffset(currentOffset); + return value; + } + + // Disable prefer-function-over-method for inherited abstract method. + /* tslint:disable prefer-function-over-method */ + public isStatic(): boolean { + return true; + } + /* tslint:enable prefer-function-over-method */ +} |