aboutsummaryrefslogtreecommitdiffstats
path: root/packages/utils/src/abi_encoder/calldata
diff options
context:
space:
mode:
authorGreg Hysen <greg.hysen@gmail.com>2018-11-26 10:24:46 +0800
committerGreg Hysen <greg.hysen@gmail.com>2018-11-29 08:38:11 +0800
commit9a51af46ee4a35b3d1ce2fcdc6f561aa68307cf0 (patch)
tree1978be0aa6086aeba0337d37dae01e26871278f9 /packages/utils/src/abi_encoder/calldata
parentbb4d02e413119132f283ee17549cf5e1732d75b5 (diff)
downloaddexon-sol-tools-9a51af46ee4a35b3d1ce2fcdc6f561aa68307cf0.tar
dexon-sol-tools-9a51af46ee4a35b3d1ce2fcdc6f561aa68307cf0.tar.gz
dexon-sol-tools-9a51af46ee4a35b3d1ce2fcdc6f561aa68307cf0.tar.bz2
dexon-sol-tools-9a51af46ee4a35b3d1ce2fcdc6f561aa68307cf0.tar.lz
dexon-sol-tools-9a51af46ee4a35b3d1ce2fcdc6f561aa68307cf0.tar.xz
dexon-sol-tools-9a51af46ee4a35b3d1ce2fcdc6f561aa68307cf0.tar.zst
dexon-sol-tools-9a51af46ee4a35b3d1ce2fcdc6f561aa68307cf0.zip
Payload -> Blob, Dependent -> Pointer, Member -> Set
Diffstat (limited to 'packages/utils/src/abi_encoder/calldata')
-rw-r--r--packages/utils/src/abi_encoder/calldata/blocks/blob.ts20
-rw-r--r--packages/utils/src/abi_encoder/calldata/blocks/index.ts3
-rw-r--r--packages/utils/src/abi_encoder/calldata/blocks/pointer.ts (renamed from packages/utils/src/abi_encoder/calldata/dependent_calldata_block.ts)20
-rw-r--r--packages/utils/src/abi_encoder/calldata/blocks/set.ts (renamed from packages/utils/src/abi_encoder/calldata/member_calldata_block.ts)9
-rw-r--r--packages/utils/src/abi_encoder/calldata/calldata.ts14
-rw-r--r--packages/utils/src/abi_encoder/calldata/calldata_blocks.ts3
-rw-r--r--packages/utils/src/abi_encoder/calldata/index.ts7
-rw-r--r--packages/utils/src/abi_encoder/calldata/payload_calldata_block.ts20
-rw-r--r--packages/utils/src/abi_encoder/calldata/raw_calldata.ts25
9 files changed, 59 insertions, 62 deletions
diff --git a/packages/utils/src/abi_encoder/calldata/blocks/blob.ts b/packages/utils/src/abi_encoder/calldata/blocks/blob.ts
new file mode 100644
index 000000000..210ef6420
--- /dev/null
+++ b/packages/utils/src/abi_encoder/calldata/blocks/blob.ts
@@ -0,0 +1,20 @@
+import { CalldataBlock } from '../calldata_block';
+
+export class Blob extends CalldataBlock {
+ private readonly _blob: Buffer;
+
+ constructor(name: string, signature: string, parentName: string, blob: Buffer) {
+ const headerSizeInBytes = 0;
+ const bodySizeInBytes = blob.byteLength;
+ super(name, signature, parentName, headerSizeInBytes, bodySizeInBytes);
+ this._blob = blob;
+ }
+
+ public toBuffer(): Buffer {
+ return this._blob;
+ }
+
+ public getRawData(): Buffer {
+ return this._blob;
+ }
+}
diff --git a/packages/utils/src/abi_encoder/calldata/blocks/index.ts b/packages/utils/src/abi_encoder/calldata/blocks/index.ts
new file mode 100644
index 000000000..958582dae
--- /dev/null
+++ b/packages/utils/src/abi_encoder/calldata/blocks/index.ts
@@ -0,0 +1,3 @@
+export * from './blob';
+export * from './pointer';
+export * from './set';
diff --git a/packages/utils/src/abi_encoder/calldata/dependent_calldata_block.ts b/packages/utils/src/abi_encoder/calldata/blocks/pointer.ts
index 16b9a6fe6..1c49a8c6c 100644
--- a/packages/utils/src/abi_encoder/calldata/dependent_calldata_block.ts
+++ b/packages/utils/src/abi_encoder/calldata/blocks/pointer.ts
@@ -1,10 +1,10 @@
import * as ethUtil from 'ethereumjs-util';
-import * as Constants from '../utils/constants';
+import * as Constants from '../../utils/constants';
-import { CalldataBlock } from './calldata_block';
+import { CalldataBlock } from '../calldata_block';
-export class DependentCalldataBlock extends CalldataBlock {
+export class Pointer extends CalldataBlock {
public static readonly RAW_DATA_START = new Buffer('<');
public static readonly RAW_DATA_END = new Buffer('>');
private static readonly _DEPENDENT_PAYLOAD_SIZE_IN_BYTES = 32;
@@ -14,8 +14,8 @@ export class DependentCalldataBlock extends CalldataBlock {
private _aliasFor: CalldataBlock | undefined;
constructor(name: string, signature: string, parentName: string, dependency: CalldataBlock, parent: CalldataBlock) {
- const headerSizeInBytes = DependentCalldataBlock._EMPTY_HEADER_SIZE;
- const bodySizeInBytes = DependentCalldataBlock._DEPENDENT_PAYLOAD_SIZE_IN_BYTES;
+ const headerSizeInBytes = Pointer._EMPTY_HEADER_SIZE;
+ const bodySizeInBytes = Pointer._DEPENDENT_PAYLOAD_SIZE_IN_BYTES;
super(name, signature, parentName, headerSizeInBytes, bodySizeInBytes);
this._parent = parent;
this._dependency = dependency;
@@ -28,9 +28,9 @@ export class DependentCalldataBlock extends CalldataBlock {
const parentOffset = this._parent.getOffsetInBytes();
const parentHeaderSize = this._parent.getHeaderSizeInBytes();
const pointer: number = destinationOffset - (parentOffset + parentHeaderSize);
- const pointerBuf = ethUtil.toBuffer(`0x${pointer.toString(Constants.HEX_BASE)}`);
- const evmWordWidthInBytes = 32;
- const pointerBufPadded = ethUtil.setLengthLeft(pointerBuf, evmWordWidthInBytes);
+ const pointerHex = `0x${pointer.toString(Constants.HEX_BASE)}`;
+ const pointerBuf = ethUtil.toBuffer(pointerHex);
+ const pointerBufPadded = ethUtil.setLengthLeft(pointerBuf, Constants.EVM_WORD_WIDTH_IN_BYTES);
return pointerBufPadded;
}
@@ -50,9 +50,9 @@ export class DependentCalldataBlock extends CalldataBlock {
public getRawData(): Buffer {
const dependencyRawData = this._dependency.getRawData();
const rawDataComponents: Buffer[] = [];
- rawDataComponents.push(DependentCalldataBlock.RAW_DATA_START);
+ rawDataComponents.push(Pointer.RAW_DATA_START);
rawDataComponents.push(dependencyRawData);
- rawDataComponents.push(DependentCalldataBlock.RAW_DATA_END);
+ rawDataComponents.push(Pointer.RAW_DATA_END);
const rawData = Buffer.concat(rawDataComponents);
return rawData;
}
diff --git a/packages/utils/src/abi_encoder/calldata/member_calldata_block.ts b/packages/utils/src/abi_encoder/calldata/blocks/set.ts
index c35beb8de..e4de22c5c 100644
--- a/packages/utils/src/abi_encoder/calldata/member_calldata_block.ts
+++ b/packages/utils/src/abi_encoder/calldata/blocks/set.ts
@@ -1,8 +1,8 @@
import * as _ from 'lodash';
-import { CalldataBlock } from './calldata_block';
+import { CalldataBlock } from '../calldata_block';
-export class MemberCalldataBlock extends CalldataBlock {
+export class Set extends CalldataBlock {
private _header: Buffer | undefined;
private _members: CalldataBlock[];
@@ -14,14 +14,13 @@ export class MemberCalldataBlock extends CalldataBlock {
public getRawData(): Buffer {
const rawDataComponents: Buffer[] = [];
- if (this._header !== undefined) {
+ if (this._header) {
rawDataComponents.push(this._header);
}
_.each(this._members, (member: CalldataBlock) => {
const memberBuffer = member.getRawData();
rawDataComponents.push(memberBuffer);
});
-
const rawData = Buffer.concat(rawDataComponents);
return rawData;
}
@@ -36,7 +35,7 @@ export class MemberCalldataBlock extends CalldataBlock {
}
public toBuffer(): Buffer {
- if (this._header !== undefined) {
+ if (this._header) {
return this._header;
}
return new Buffer('');
diff --git a/packages/utils/src/abi_encoder/calldata/calldata.ts b/packages/utils/src/abi_encoder/calldata/calldata.ts
index 3b85f821b..b2396ee8f 100644
--- a/packages/utils/src/abi_encoder/calldata/calldata.ts
+++ b/packages/utils/src/abi_encoder/calldata/calldata.ts
@@ -5,8 +5,8 @@ import * as Constants from '../utils/constants';
import { Queue } from '../utils/queue';
import { EncodingRules } from '../utils/rules';
+import * as CalldataBlocks from './blocks';
import { CalldataBlock } from './calldata_block';
-import * as CalldataBlocks from './calldata_blocks';
export class Calldata {
private readonly _rules: EncodingRules;
@@ -18,7 +18,7 @@ export class Calldata {
const blockQueue = new Queue<CalldataBlock>();
// Base Case
- if (!(block instanceof CalldataBlocks.MemberCalldataBlock)) {
+ if (!(block instanceof CalldataBlocks.Set)) {
blockQueue.pushBack(block);
return blockQueue;
}
@@ -26,7 +26,7 @@ export class Calldata {
// This is a Member Block
const memberBlock = block;
_.eachRight(memberBlock.getMembers(), (member: CalldataBlock) => {
- if (member instanceof CalldataBlocks.MemberCalldataBlock) {
+ if (member instanceof CalldataBlocks.Set) {
blockQueue.mergeFront(Calldata._createQueue(member));
} else {
blockQueue.pushFront(member);
@@ -35,9 +35,9 @@ export class Calldata {
// Children
_.each(memberBlock.getMembers(), (member: CalldataBlock) => {
- if (member instanceof CalldataBlocks.DependentCalldataBlock && member.getAlias() === undefined) {
+ if (member instanceof CalldataBlocks.Pointer && member.getAlias() === undefined) {
const dependency = member.getDependency();
- if (dependency instanceof CalldataBlocks.MemberCalldataBlock) {
+ if (dependency instanceof CalldataBlocks.Set) {
blockQueue.mergeBack(Calldata._createQueue(dependency));
} else {
blockQueue.pushBack(dependency);
@@ -68,7 +68,7 @@ export class Calldata {
const subtreeQueue = Calldata._createQueue(this._root);
let block: CalldataBlock | undefined;
for (block = subtreeQueue.popBack(); block !== undefined; block = subtreeQueue.popBack()) {
- if (block instanceof CalldataBlocks.DependentCalldataBlock) {
+ if (block instanceof CalldataBlocks.Pointer) {
const dependencyBlockHashBuf = block.getDependency().computeHash();
const dependencyBlockHash = ethUtil.bufferToHex(dependencyBlockHashBuf);
if (dependencyBlockHash in blocksByHash) {
@@ -175,7 +175,7 @@ export class Calldata {
),
)
.padEnd(valuePadding);
- if (block instanceof CalldataBlocks.MemberCalldataBlock) {
+ if (block instanceof CalldataBlocks.Set) {
nameStr = `### ${prettyName.padEnd(namePadding)}`;
line = `\n${offsetStr}${value}${nameStr}`;
} else {
diff --git a/packages/utils/src/abi_encoder/calldata/calldata_blocks.ts b/packages/utils/src/abi_encoder/calldata/calldata_blocks.ts
deleted file mode 100644
index 8d4e7d7ca..000000000
--- a/packages/utils/src/abi_encoder/calldata/calldata_blocks.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export * from './dependent_calldata_block';
-export * from './member_calldata_block';
-export * from './payload_calldata_block';
diff --git a/packages/utils/src/abi_encoder/calldata/index.ts b/packages/utils/src/abi_encoder/calldata/index.ts
index 2c786cd8d..2ef75e8d0 100644
--- a/packages/utils/src/abi_encoder/calldata/index.ts
+++ b/packages/utils/src/abi_encoder/calldata/index.ts
@@ -1,6 +1,5 @@
-export * from './calldata_block';
-export * from './dependent_calldata_block';
-export * from './payload_calldata_block';
-export * from './member_calldata_block';
export * from './calldata';
+export * from './calldata_block';
export * from './raw_calldata';
+import * as CalldataBlocks from './blocks';
+export { CalldataBlocks };
diff --git a/packages/utils/src/abi_encoder/calldata/payload_calldata_block.ts b/packages/utils/src/abi_encoder/calldata/payload_calldata_block.ts
deleted file mode 100644
index 0420b01d8..000000000
--- a/packages/utils/src/abi_encoder/calldata/payload_calldata_block.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { CalldataBlock } from './calldata_block';
-
-export class PayloadCalldataBlock extends CalldataBlock {
- private readonly _payload: Buffer;
-
- constructor(name: string, signature: string, parentName: string, payload: Buffer) {
- const headerSizeInBytes = 0;
- const bodySizeInBytes = payload.byteLength;
- super(name, signature, parentName, headerSizeInBytes, bodySizeInBytes);
- this._payload = payload;
- }
-
- public toBuffer(): Buffer {
- return this._payload;
- }
-
- public getRawData(): Buffer {
- return this._payload;
- }
-}
diff --git a/packages/utils/src/abi_encoder/calldata/raw_calldata.ts b/packages/utils/src/abi_encoder/calldata/raw_calldata.ts
index 9e72bbd62..b13cbdfd9 100644
--- a/packages/utils/src/abi_encoder/calldata/raw_calldata.ts
+++ b/packages/utils/src/abi_encoder/calldata/raw_calldata.ts
@@ -8,26 +8,25 @@ export class RawCalldata {
private readonly _value: Buffer;
private readonly _selector: string;
private readonly _scopes: Queue<number>;
- private _offset: number; // tracks current offset into raw calldata; used for parsing
+ private _offset: number;
- constructor(value: string | Buffer, hasSelectorPrefix: boolean = true) {
+ public constructor(value: string | Buffer, hasSelector: boolean = true) {
+ // Sanity check
if (typeof value === 'string' && !value.startsWith('0x')) {
throw new Error(`Expected raw calldata to start with '0x'`);
}
- const valueBuf = ethUtil.toBuffer(value);
- if (hasSelectorPrefix) {
- this._selector = ethUtil.bufferToHex(
- valueBuf.slice(Constants.HEX_SELECTOR_BYTE_OFFSET_IN_CALLDATA, Constants.HEX_SELECTOR_LENGTH_IN_BYTES),
- );
- this._value = valueBuf.slice(Constants.HEX_SELECTOR_LENGTH_IN_BYTES); // disregard selector
- } else {
- this._selector = '0x';
- this._value = valueBuf;
- }
-
+ // Construct initial values
+ this._value = ethUtil.toBuffer(value);
+ this._selector = '0x';
this._scopes = new Queue<number>();
this._scopes.pushBack(RawCalldata._INITIAL_OFFSET);
this._offset = RawCalldata._INITIAL_OFFSET;
+ // If there's a selector then slice it
+ if (hasSelector) {
+ const selectorBuf = this._value.slice(Constants.HEX_SELECTOR_LENGTH_IN_BYTES);
+ this._value = this._value.slice(Constants.HEX_SELECTOR_LENGTH_IN_BYTES);
+ this._selector = ethUtil.bufferToHex(selectorBuf);
+ }
}
public popBytes(lengthInBytes: number): Buffer {