// Taken from https://medium.com/walletconnect/how-to-build-a-wallet-in-react-native-with-the-web3wallet-sdk-b6f57bf02f9a import { EIP155_CHAINS, EIP155_SIGNING_METHODS, TEIP155Chain, } from './EIP155Lib'; import { eip155Wallets } from './EIP155Wallet'; import { getSignParamsMessage, getSignTypedDataParamsData, getWalletAddressFromParams, } from './Helpers'; import { formatJsonRpcError, formatJsonRpcResult } from '@json-rpc-tools/utils'; import { SignClientTypes } from '@walletconnect/types'; import { getSdkError } from '@walletconnect/utils'; import { providers } from 'ethers'; import { currentETHAddress } from './WalletConnectUtils'; export async function approveEIP155Request( requestEvent: SignClientTypes.EventArguments['session_request'], ) { const { params, id } = requestEvent; const { chainId, request } = params; const wallet = eip155Wallets[getWalletAddressFromParams([currentETHAddress], params)]; switch (request.method) { case EIP155_SIGNING_METHODS.PERSONAL_SIGN: case EIP155_SIGNING_METHODS.ETH_SIGN: const message = getSignParamsMessage(request.params); const signedMessage = await wallet.signMessage(message); return formatJsonRpcResult(id, signedMessage); case EIP155_SIGNING_METHODS.ETH_SIGN_TYPED_DATA: case EIP155_SIGNING_METHODS.ETH_SIGN_TYPED_DATA_V3: case EIP155_SIGNING_METHODS.ETH_SIGN_TYPED_DATA_V4: const { domain, types, message: data, } = getSignTypedDataParamsData(request.params); // https://github.com/ethers-io/ethers.js/issues/687#issuecomment-714069471 delete types.EIP712Domain; const signedData = await wallet._signTypedData(domain, types, data); return formatJsonRpcResult(id, signedData); case EIP155_SIGNING_METHODS.ETH_SEND_TRANSACTION: const provider = new providers.JsonRpcProvider( EIP155_CHAINS[chainId as TEIP155Chain].rpc, ); const sendTransaction = request.params[0]; const connectedWallet = wallet.connect(provider); const { hash } = await connectedWallet.sendTransaction(sendTransaction); return formatJsonRpcResult(id, hash); case EIP155_SIGNING_METHODS.ETH_SIGN_TRANSACTION: const signTransaction = request.params[0]; const signature = await wallet.signTransaction(signTransaction); return formatJsonRpcResult(id, signature); default: throw new Error(getSdkError('INVALID_METHOD').message); } } export function rejectEIP155Request( request: SignClientTypes.EventArguments['session_request'], ) { const { id } = request; return formatJsonRpcError(id, getSdkError('USER_REJECTED_METHODS').message); }