diff options
author | Fabio Berger <me@fabioberger.com> | 2018-06-02 08:29:44 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-06-02 08:29:44 +0800 |
commit | d50fbac5f937602d7a90343ea8ff88cee5c4542f (patch) | |
tree | d1c818e64b75c1f4fed1c7d797892fb0d35dd779 /packages/order-utils/src/crypto.ts | |
parent | 62e60e2ba6d07b9b892b4f2e92a5421c54f5fa20 (diff) | |
parent | d3c64bd5b493dc1779a24c7c051c255106a4292a (diff) | |
download | dexon-sol-tools-d50fbac5f937602d7a90343ea8ff88cee5c4542f.tar dexon-sol-tools-d50fbac5f937602d7a90343ea8ff88cee5c4542f.tar.gz dexon-sol-tools-d50fbac5f937602d7a90343ea8ff88cee5c4542f.tar.bz2 dexon-sol-tools-d50fbac5f937602d7a90343ea8ff88cee5c4542f.tar.lz dexon-sol-tools-d50fbac5f937602d7a90343ea8ff88cee5c4542f.tar.xz dexon-sol-tools-d50fbac5f937602d7a90343ea8ff88cee5c4542f.tar.zst dexon-sol-tools-d50fbac5f937602d7a90343ea8ff88cee5c4542f.zip |
Merge pull request #636 from 0xProject/refactor/order-utils/for-v2
Refactor order-utils for v2
Diffstat (limited to 'packages/order-utils/src/crypto.ts')
-rw-r--r-- | packages/order-utils/src/crypto.ts | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/packages/order-utils/src/crypto.ts b/packages/order-utils/src/crypto.ts new file mode 100644 index 000000000..517ca2840 --- /dev/null +++ b/packages/order-utils/src/crypto.ts @@ -0,0 +1,46 @@ +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): Buffer { + const argTypes: string[] = []; + _.each(args, (arg, i) => { + const isNumber = _.isFinite(arg); + if (isNumber) { + argTypes.push('uint8'); + } else if (arg.isBigNumber) { + argTypes.push('uint256'); + const base = 10; + args[i] = new BN(arg.toString(base), base); + } else if (ethUtil.isValidAddress(arg)) { + argTypes.push('address'); + } else if (_.isString(arg)) { + argTypes.push('string'); + } else if (_.isBuffer(arg)) { + argTypes.push('bytes'); + } else if (_.isBoolean(arg)) { + argTypes.push('bool'); + } else { + throw new Error(`Unable to guess arg type: ${arg}`); + } + }); + const hash = hashFunction(argTypes, args); + return hash; + }, +}; |