aboutsummaryrefslogtreecommitdiffstats
path: root/packages/utils/src/abi_encoder/evm_data_types/static_bytes.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/utils/src/abi_encoder/evm_data_types/static_bytes.ts')
-rw-r--r--packages/utils/src/abi_encoder/evm_data_types/static_bytes.ts58
1 files changed, 33 insertions, 25 deletions
diff --git a/packages/utils/src/abi_encoder/evm_data_types/static_bytes.ts b/packages/utils/src/abi_encoder/evm_data_types/static_bytes.ts
index 9a2a99ec7..afa9afdf2 100644
--- a/packages/utils/src/abi_encoder/evm_data_types/static_bytes.ts
+++ b/packages/utils/src/abi_encoder/evm_data_types/static_bytes.ts
@@ -11,7 +11,6 @@ export class StaticBytes extends PayloadDataType {
private static readonly _matcher = RegExp(
'^(byte|bytes(1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32))$',
);
-
private static readonly _DEFAULT_WIDTH = 1;
private readonly _width: number;
@@ -19,16 +18,20 @@ export class StaticBytes extends PayloadDataType {
return StaticBytes._matcher.test(type);
}
+ private static _decodeWidthFromType(type: string): number {
+ const matches = StaticBytes._matcher.exec(type);
+ const width = (matches !== null && matches.length === 3 && matches[2] !== undefined)
+ ? parseInt(matches[2], Constants.DEC_BASE)
+ : StaticBytes._DEFAULT_WIDTH;
+ return width;
+ }
+
public constructor(dataItem: DataItem, dataTypeFactory: DataTypeFactory) {
super(dataItem, dataTypeFactory, StaticBytes._SIZE_KNOWN_AT_COMPILE_TIME);
- const matches = StaticBytes._matcher.exec(dataItem.type);
if (!StaticBytes.matchType(dataItem.type)) {
- throw new Error(`Tried to instantiate Byte with bad input: ${dataItem}`);
+ throw new Error(`Tried to instantiate Static Bytes with bad input: ${dataItem}`);
}
- this._width =
- matches !== null && matches.length === 3 && matches[2] !== undefined
- ? parseInt(matches[2], Constants.DEC_BASE)
- : StaticBytes._DEFAULT_WIDTH;
+ this._width = StaticBytes._decodeWidthFromType(dataItem.type);
}
public getSignature(): string {
@@ -37,11 +40,30 @@ export class StaticBytes extends PayloadDataType {
}
public encodeValue(value: string | Buffer): Buffer {
- // Sanity check if string
- if (typeof value === 'string' && !value.startsWith('0x')) {
- throw new Error(`Tried to encode non-hex value. Value must inlcude '0x' prefix.`);
+ // 1/2 Convert value into a buffer and do bounds checking
+ this._sanityCheckValue(value);
+ const valueBuf = ethUtil.toBuffer(value);
+ // 2/2 Store value as hex
+ const valuePadded = ethUtil.setLengthRight(valueBuf, Constants.EVM_WORD_WIDTH_IN_BYTES);
+ return valuePadded;
+ }
+
+ public decodeValue(calldata: RawCalldata): string {
+ const valueBufPadded = calldata.popWord();
+ const valueBuf = valueBufPadded.slice(0, this._width);
+ const value = ethUtil.bufferToHex(valueBuf);
+ this._sanityCheckValue(value);
+ return value;
+ }
+
+ private _sanityCheckValue(value: string | Buffer): void {
+ if (typeof value === 'string') {
+ if (!value.startsWith('0x')) {
+ throw new Error(`Tried to encode non-hex value. Value must inlcude '0x' prefix.`);
+ } else if (value.length % 2 !== 0) {
+ throw new Error(`Tried to assign ${value}, which is contains a half-byte. Use full bytes only.`);
+ }
}
- // Convert value into a buffer and do bounds checking
const valueBuf = ethUtil.toBuffer(value);
if (valueBuf.byteLength > this._width) {
throw new Error(
@@ -49,20 +71,6 @@ export class StaticBytes extends PayloadDataType {
valueBuf.byteLength
} bytes), which exceeds max bytes that can be stored in a ${this.getSignature()}`,
);
- } else if (value.length % 2 !== 0) {
- throw new Error(`Tried to assign ${value}, which is contains a half-byte. Use full bytes only.`);
}
-
- // Store value as hex
- const evmWordWidth = 32;
- const paddedValue = ethUtil.setLengthRight(valueBuf, evmWordWidth);
- return paddedValue;
- }
-
- public decodeValue(calldata: RawCalldata): string {
- const paddedValueBuf = calldata.popWord();
- const valueBuf = paddedValueBuf.slice(0, this._width);
- const value = ethUtil.bufferToHex(valueBuf);
- return value;
}
}