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