diff options
author | Amir Bandeali <abandeali1@gmail.com> | 2018-02-09 09:09:34 +0800 |
---|---|---|
committer | Amir Bandeali <abandeali1@gmail.com> | 2018-04-21 04:56:16 +0800 |
commit | 7201a74aeaa6b646e97d7c9c2c4cc979ace5f4f7 (patch) | |
tree | f0cd69fbe346bc6e7fcd8cb1a4f010e8d4513804 /packages/contracts/src/utils/crypto.ts | |
parent | 9e2f8bead9a51a4c30b77781ae3b39bed31c36ee (diff) | |
download | dexon-sol-tools-7201a74aeaa6b646e97d7c9c2c4cc979ace5f4f7.tar dexon-sol-tools-7201a74aeaa6b646e97d7c9c2c4cc979ace5f4f7.tar.gz dexon-sol-tools-7201a74aeaa6b646e97d7c9c2c4cc979ace5f4f7.tar.bz2 dexon-sol-tools-7201a74aeaa6b646e97d7c9c2c4cc979ace5f4f7.tar.lz dexon-sol-tools-7201a74aeaa6b646e97d7c9c2c4cc979ace5f4f7.tar.xz dexon-sol-tools-7201a74aeaa6b646e97d7c9c2c4cc979ace5f4f7.tar.zst dexon-sol-tools-7201a74aeaa6b646e97d7c9c2c4cc979ace5f4f7.zip |
Move utils dir into src
Diffstat (limited to 'packages/contracts/src/utils/crypto.ts')
-rw-r--r-- | packages/contracts/src/utils/crypto.ts | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/packages/contracts/src/utils/crypto.ts b/packages/contracts/src/utils/crypto.ts new file mode 100644 index 000000000..810072d2f --- /dev/null +++ b/packages/contracts/src/utils/crypto.ts @@ -0,0 +1,43 @@ +import BN = require('bn.js'); +import ABI = require('ethereumjs-abi'); +import ethUtil = require('ethereumjs-util'); +import * as _ from 'lodash'; + +export const crypto = { + /** + * We convert types from JS to Solidity as follows: + * BigNumber -> uint256 + * number -> uint8 + * string -> string + * boolean -> bool + * valid Ethereum address -> address + */ + solSHA3(args: any[]): Buffer { + return crypto._solHash(args, ABI.soliditySHA3); + }, + solSHA256(args: any[]): Buffer { + return crypto._solHash(args, ABI.soliditySHA256); + }, + _solHash(args: any[], hashFunction: (types: string[], values: any[]) => Buffer) { + const argTypes: string[] = []; + _.each(args, (arg, i) => { + const isNumber = _.isFinite(arg); + if (isNumber) { + argTypes.push('uint8'); + } else if (arg.isBigNumber) { + argTypes.push('uint256'); + args[i] = new BN(arg.toString(10), 10); + } else if (ethUtil.isValidAddress(arg)) { + argTypes.push('address'); + } else if (_.isString(arg)) { + argTypes.push('string'); + } else if (_.isBoolean(arg)) { + argTypes.push('bool'); + } else { + throw new Error(`Unable to guess arg type: ${arg}`); + } + }); + const hash = hashFunction(argTypes, args); + return hash; + }, +}; |