aboutsummaryrefslogtreecommitdiffstats
path: root/packages/contracts/util/crypto.ts
blob: e4baee02197b0908bacba838be3622ba4ba7ffc5 (plain) (blame)
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
33
34
35
36
37
38
import {BigNumber} from 'bignumber.js';
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 {
    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 = ABI.soliditySHA3(argTypes, args);
    return hash;
  },
};