aboutsummaryrefslogtreecommitdiffstats
path: root/packages/contracts/src/utils/eip712_utils.ts
diff options
context:
space:
mode:
authorJacob Evans <jacob@dekz.net>2018-05-30 08:11:33 +0800
committerJacob Evans <jacob@dekz.net>2018-06-05 08:41:00 +0800
commit4670cc1a5f04d61045a82b4a3bbcf56e009afd56 (patch)
treec66321deb69c78a85f7a5c907fac62cc95eae14d /packages/contracts/src/utils/eip712_utils.ts
parent70858603ed37de24ae47978a191b3f188f450182 (diff)
downloaddexon-0x-contracts-4670cc1a5f04d61045a82b4a3bbcf56e009afd56.tar
dexon-0x-contracts-4670cc1a5f04d61045a82b4a3bbcf56e009afd56.tar.gz
dexon-0x-contracts-4670cc1a5f04d61045a82b4a3bbcf56e009afd56.tar.bz2
dexon-0x-contracts-4670cc1a5f04d61045a82b4a3bbcf56e009afd56.tar.lz
dexon-0x-contracts-4670cc1a5f04d61045a82b4a3bbcf56e009afd56.tar.xz
dexon-0x-contracts-4670cc1a5f04d61045a82b4a3bbcf56e009afd56.tar.zst
dexon-0x-contracts-4670cc1a5f04d61045a82b4a3bbcf56e009afd56.zip
Add missing EIP191 prefix for EIP712
Diffstat (limited to 'packages/contracts/src/utils/eip712_utils.ts')
-rw-r--r--packages/contracts/src/utils/eip712_utils.ts63
1 files changed, 63 insertions, 0 deletions
diff --git a/packages/contracts/src/utils/eip712_utils.ts b/packages/contracts/src/utils/eip712_utils.ts
new file mode 100644
index 000000000..07b45c8af
--- /dev/null
+++ b/packages/contracts/src/utils/eip712_utils.ts
@@ -0,0 +1,63 @@
+import { BigNumber } from '@0xproject/utils';
+import ethUtil = require('ethereumjs-util');
+import * as _ from 'lodash';
+
+import { crypto } from './crypto';
+import { EIP712Schema } from './types';
+
+const EIP191_PREFIX = '\x19\x01';
+const EIP712_DOMAIN_NAME = '0x Protocol';
+const EIP712_DOMAIN_VERSION = '1';
+
+const EIP712_DOMAIN_SCHEMA: EIP712Schema = {
+ name: 'DomainSeparator',
+ parameters: [
+ { name: 'name', type: 'string' },
+ { name: 'version', type: 'string' },
+ { name: 'contract', type: 'address' },
+ ],
+};
+
+export const EIP712Utils = {
+ compileSchema(schema: EIP712Schema): Buffer {
+ const namedTypes = _.map(schema.parameters, parameter => `${parameter.type} ${parameter.name}`);
+ const namedTypesJoined = namedTypes.join(',');
+ const eip712Schema = `${schema.name}(${namedTypesJoined})`;
+ const eip712SchemaHashBuffer = crypto.solSHA3([eip712Schema]);
+ return eip712SchemaHashBuffer;
+ },
+ createEIP712Message(hashStruct: string, contractAddress: string): Buffer {
+ const domainSeparatorHashHex = EIP712Utils.getDomainSeparatorHashHex(contractAddress);
+ const messageBuff = crypto.solSHA3([
+ EIP191_PREFIX,
+ new BigNumber(domainSeparatorHashHex),
+ new BigNumber(hashStruct),
+ ]);
+ return messageBuff;
+ },
+ getDomainSeparatorSchemaBuffer(): Buffer {
+ return EIP712Utils.compileSchema(EIP712_DOMAIN_SCHEMA);
+ },
+ getDomainSeparatorHashHex(exchangeAddress: string): string {
+ const domainSeparatorSchemaBuffer = EIP712Utils.getDomainSeparatorSchemaBuffer();
+ const nameHash = crypto.solSHA3([EIP712_DOMAIN_NAME]);
+ const versionHash = crypto.solSHA3([EIP712_DOMAIN_VERSION]);
+ const domainSeparatorHashBuff = crypto.solSHA3([
+ domainSeparatorSchemaBuffer,
+ nameHash,
+ versionHash,
+ EIP712Utils.pad32Address(exchangeAddress),
+ ]);
+ const domainSeparatorHashHex = `0x${domainSeparatorHashBuff.toString('hex')}`;
+ return domainSeparatorHashHex;
+ },
+ pad32Address(address: string): Buffer {
+ const addressBuffer = ethUtil.toBuffer(address);
+ const addressPadded = EIP712Utils.pad32Buffer(addressBuffer);
+ return addressPadded;
+ },
+ pad32Buffer(buffer: Buffer): Buffer {
+ const bufferPadded = ethUtil.setLengthLeft(buffer, 32);
+ return bufferPadded;
+ },
+};