on f8149eb help sign in
bridge/src/lib/WalletConnect.ts
54 lines 1.6 kB history raw
1import { ITxData } from '@walletconnect/types';
2import { JsonTx, Transaction } from '@ethereumjs/tx';
3import { stripHexPrefix } from './utils/address';
4import { FakeSignableTx, FakeSignResult } from './txn';
5import Web3 from 'web3';
7type SignWalletConnectTransactionArgs = {
8 from: string;
9 txn: Transaction;
10 txnSigner: (txn: ITxData) => Promise<string>;
11 txnSender: (txn: ITxData) => Promise<string>;
12};
14const walletConnectSignTransaction = async ({
15 from,
16 txn,
17 txnSigner,
18 txnSender,
19}: SignWalletConnectTransactionArgs) => {
20 // tsc complains about missing from and gas, which are populated in subsequent lines
21 //@ts-ignore
22 let wcFormattedTx: JsonTx & {
23 from: string;
24 gas: string;
25 } = txn.toJSON();
26 wcFormattedTx.from = from;
27 wcFormattedTx.gas = txn.gasLimit.toString();
29 let signature;
30 try {
31 signature = await txnSigner(wcFormattedTx);
32 } catch (e) {
33 if (e.message === 'METHOD_NOT_SUPPORTED') {
34 console.log('connected wc wallet does not support tx signing.');
35 return FakeSignResult(
36 wcFormattedTx,
37 //@ts-ignore // TODO
38 walletConnectSendTransaction(txnSender)
39 );
40 } else {
41 throw e;
42 }
43 }
44 const serializedTx = Buffer.from(stripHexPrefix(signature), 'hex');
45 const signedTx = Transaction.fromSerializedTx(serializedTx);
47 return signedTx;
48};
50const walletConnectSendTransaction = (
51 txnSender: (tx: FakeSignableTx) => Promise<string>
52) => (txn: FakeSignableTx, _web3: Web3): Promise<string> => txnSender(txn);
54export { walletConnectSignTransaction };