laconic-wallet/utils/wallet-connect/EIP155Requests.ts
shreerang6921 150f10b91f
Connect wallet to a dapp using WalletConnect (#38)
* Connect with dapp using WalletConnect

* Pair dapp with wallet

* Sign message taken from dapp and return the signature

* Add todos

* Move wallet connect functions to seperate screen

* Change ui

* Change ui for wc modals

* Add styles

* Remove border radius at the bottom

* Make review changes

* Add dependancy to useEffect

* Move pairing modal methods

---------

Co-authored-by: Adw8 <adwait@deepstacksoft.com>
2024-03-05 19:20:31 +05:30

73 lines
2.6 KiB
TypeScript

// 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);
}