diff options
author | Jacob Evans <jacob@dekz.net> | 2018-05-30 08:11:33 +0800 |
---|---|---|
committer | Jacob Evans <jacob@dekz.net> | 2018-06-05 08:41:00 +0800 |
commit | 4670cc1a5f04d61045a82b4a3bbcf56e009afd56 (patch) | |
tree | c66321deb69c78a85f7a5c907fac62cc95eae14d /packages/contracts/src/utils/eip712_utils.ts | |
parent | 70858603ed37de24ae47978a191b3f188f450182 (diff) | |
download | dexon-sol-tools-4670cc1a5f04d61045a82b4a3bbcf56e009afd56.tar dexon-sol-tools-4670cc1a5f04d61045a82b4a3bbcf56e009afd56.tar.gz dexon-sol-tools-4670cc1a5f04d61045a82b4a3bbcf56e009afd56.tar.bz2 dexon-sol-tools-4670cc1a5f04d61045a82b4a3bbcf56e009afd56.tar.lz dexon-sol-tools-4670cc1a5f04d61045a82b4a3bbcf56e009afd56.tar.xz dexon-sol-tools-4670cc1a5f04d61045a82b4a3bbcf56e009afd56.tar.zst dexon-sol-tools-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.ts | 63 |
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; + }, +}; |