/* Importing this library provides react native with a secure random source. For more information, "visit https://docs.ethers.org/v5/cookbook/react-native/#cookbook-reactnative-security" */ import 'react-native-get-random-values'; import '@ethersproject/shims'; import { Wallet, utils } from 'ethers'; import { HDNode } from 'ethers/lib/utils'; import { Alert } from 'react-native'; import { setInternetCredentials, getInternetCredentials, resetInternetCredentials, } from 'react-native-keychain'; const generateWallet = async (): Promise => { try { const mnemonic = utils.entropyToMnemonic(utils.randomBytes(32)); const hdNode = HDNode.fromMnemonic(mnemonic); const ethNode = hdNode.derivePath("m/44'/60'/0'/0/0"); await setInternetCredentials('keyServer', 'key', ethNode.privateKey); await setInternetCredentials('mnemonicServer', 'mnemonic', mnemonic); return ethNode; } catch (error) { console.error('Error creating wallet ', error); } }; const signMessage = async (message: string) => { try { const keyCred = await getInternetCredentials('keyServer'); const wallet = keyCred && new Wallet(keyCred.password); const signature = wallet && (await wallet.signMessage(message)); if (typeof signature === 'string') { Alert.alert('Message signature: ', signature); } else { Alert.alert('Message signing failed. Please try again.'); } } catch (error) { console.error('Error signing transaction ', error); } }; const resetWallet = async () => { await resetInternetCredentials('keyServer'); await resetInternetCredentials('mnemonicServer'); }; export { generateWallet, signMessage, resetWallet };