38 lines
1.2 KiB
TypeScript
38 lines
1.2 KiB
TypeScript
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;
|
|
},
|
|
};
|