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