Files
TheGame/packages/utils/src/ethereumHelper.ts
dan13ram 8517a26048 Upgrade dependencies (#486)
* upgraded storybook dependencies

* upgraded web dependencies

* updated timezone selector

* upgrade chakra in metamaps

* upgraded react-dnd in metamaps

* upgraded framer-motion

* fixed types in metamaps

* upgraded eslint

* upgraded lerna, husky and graphql

* upgraded node version

* removed metamaps package

* fixed all eslint issues

* ran yarn format to prettier format all files

* updated lint-staged & husky scripts

* add executable perms to pre-push scripts

* updated yarn.lock

* fixed eslint and moved chakra icons to ds

* fixed emotion errors

* removed extra useContext

* update yarn.lock

* upgraded more packages

* removed unnecessary .huskyrc.json

* lint fix
2021-05-01 12:46:48 +05:30

67 lines
1.8 KiB
TypeScript

import { Contract, providers, utils } from 'ethers';
export async function signerHelper(
provider: providers.Web3Provider,
rawMessage: string,
): Promise<string> {
const ethereum = provider.provider;
const signer = provider.getSigner();
const address = await signer.getAddress();
if (!ethereum.request) throw new Error('invalid ethereum provider');
let params = [rawMessage, address.toLowerCase()];
if (ethereum.isMetaMask) {
params = [params[1], params[0]];
}
const signature = await ethereum.request({
method: 'personal_sign',
params,
});
return signature;
}
const smartWalletABI = [
'function isValidSignature(bytes32 _message, bytes _signature) public view returns (bool)',
];
enum WalletType {
EOA,
SMART,
}
async function getWalletType(
address: string,
provider: providers.BaseProvider,
): Promise<WalletType> {
const code = await provider.getCode(address);
return code === '0x' ? WalletType.EOA : WalletType.SMART;
}
export async function verifySignature(
address: string,
message: string,
signature: string,
provider: providers.BaseProvider,
): Promise<boolean> {
const walletType = await getWalletType(address, provider);
if (walletType === WalletType.EOA) {
const recoveredAddress = utils.verifyMessage(message, signature);
return address === recoveredAddress;
}
// Smart wallet
const arrayishMessage = utils.toUtf8Bytes(message);
const hexMessage = utils.hexlify(arrayishMessage);
const hexArray = utils.arrayify(hexMessage);
const hashMessage = utils.hashMessage(hexArray);
const contract = new Contract(address, smartWalletABI, provider);
try {
const returnValue = await contract.isValidSignature(hashMessage, signature);
return returnValue;
} catch (error) {
throw new Error('unsupported smart wallet');
}
}