forked from cerc-io/laconic-wallet
* 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>
73 lines
2.6 KiB
TypeScript
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);
|
|
}
|