aboutsummaryrefslogtreecommitdiffstats
path: root/packages/contracts/src/utils/multi_sig_wrapper.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/contracts/src/utils/multi_sig_wrapper.ts')
-rw-r--r--packages/contracts/src/utils/multi_sig_wrapper.ts43
1 files changed, 43 insertions, 0 deletions
diff --git a/packages/contracts/src/utils/multi_sig_wrapper.ts b/packages/contracts/src/utils/multi_sig_wrapper.ts
new file mode 100644
index 000000000..84fed7944
--- /dev/null
+++ b/packages/contracts/src/utils/multi_sig_wrapper.ts
@@ -0,0 +1,43 @@
+import { AbiDefinition, MethodAbi } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import ABI = require('ethereumjs-abi');
+import ethUtil = require('ethereumjs-util');
+import * as _ from 'lodash';
+import * as Web3 from 'web3';
+
+import { MultiSigWalletContract } from '../contract_wrappers/generated/multi_sig_wallet';
+
+import { TransactionDataParams } from './types';
+
+export class MultiSigWrapper {
+ private _multiSig: MultiSigWalletContract;
+ public static encodeFnArgs(name: string, abi: AbiDefinition[], args: any[]) {
+ const abiEntity = _.find(abi, { name }) as MethodAbi;
+ if (_.isUndefined(abiEntity)) {
+ throw new Error(`Did not find abi entry for name: ${name}`);
+ }
+ const types = _.map(abiEntity.inputs, input => input.type);
+ const funcSig = ethUtil.bufferToHex(ABI.methodID(name, types));
+ const argsData = _.map(args, arg => {
+ const target = _.isBoolean(arg) ? +arg : arg;
+ const targetBuff = ethUtil.toBuffer(target);
+ return ethUtil.setLengthLeft(targetBuff, 32).toString('hex');
+ });
+ return funcSig + argsData.join('');
+ }
+ constructor(multiSigContract: MultiSigWalletContract) {
+ this._multiSig = multiSigContract;
+ }
+ public async submitTransactionAsync(
+ destination: string,
+ from: string,
+ dataParams: TransactionDataParams,
+ value: BigNumber = new BigNumber(0),
+ ) {
+ const { name, abi, args = [] } = dataParams;
+ const encoded = MultiSigWrapper.encodeFnArgs(name, abi, args);
+ return this._multiSig.submitTransaction.sendTransactionAsync(destination, value, encoded, {
+ from,
+ });
+ }
+}