Integrate wallet connect (#2)

* Configure stack navigation to display header

* Use wallet connect to connect with dApps

* Replace react-native alerts with js alerts

* Add example env file

* Remove unnecessary code

* Make UI changes

* Uncomment required code

* Remove unnecessary dependencies

* Remove any type

* Fix indentation

---------

Co-authored-by: Shreerang Kale <shreerangkale@gmail.com>
Co-authored-by: Nabarun <nabarun@deepstacksoft.com>
This commit is contained in:
Isha Venikar 2024-07-26 10:28:57 +05:30 committed by GitHub
parent 640155aa4a
commit f554c82149
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
27 changed files with 1442 additions and 923 deletions

4
.env.example Normal file
View File

@ -0,0 +1,4 @@
REACT_APP_WALLET_CONNECT_PROJECT_ID=
REACT_APP_DEFAULT_GAS_PRICE=0.025
# Reference: https://github.com/cosmos/cosmos-sdk/issues/16020
REACT_APP_GAS_ADJUSTMENT=2

2
.gitignore vendored
View File

@ -21,3 +21,5 @@
npm-debug.log* npm-debug.log*
yarn-debug.log* yarn-debug.log*
yarn-error.log* yarn-error.log*
.env

View File

@ -1,4 +1,5 @@
// TODO: Use Typescript // TODO: Use Typescript
const webpack = require('webpack')
module.exports = function override(config, env) { module.exports = function override(config, env) {
config.module.rules.push({ config.module.rules.push({
@ -26,6 +27,12 @@ module.exports = function override(config, env) {
} }
}); });
config.plugins.push(
new webpack.ProvidePlugin({
Buffer: ["buffer", "Buffer"],
})
)
config.module.rules.push({ config.module.rules.push({
test: /\.(jpg|png|woff|woff2|eot|ttf|svg)$/, test: /\.(jpg|png|woff|woff2|eot|ttf|svg)$/,
type: 'asset/resource' type: 'asset/resource'
@ -34,6 +41,9 @@ module.exports = function override(config, env) {
config.resolve.fallback = { config.resolve.fallback = {
crypto: require.resolve("crypto-browserify"), crypto: require.resolve("crypto-browserify"),
stream: require.resolve("stream-browserify"), stream: require.resolve("stream-browserify"),
http: require.resolve('stream-http'),
https: require.resolve('https-browserify'),
url: false
} }
config.resolve.alias['react-native$'] = require.resolve('react-native-web'); config.resolve.alias['react-native$'] = require.resolve('react-native-web');

View File

@ -14,43 +14,31 @@
"@hookform/resolvers": "^3.3.4", "@hookform/resolvers": "^3.3.4",
"@json-rpc-tools/utils": "^1.7.6", "@json-rpc-tools/utils": "^1.7.6",
"@mui/material": "^5.16.4", "@mui/material": "^5.16.4",
"@react-native-async-storage/async-storage": "^1.22.3",
"@react-native-community/netinfo": "^11.3.1",
"@react-navigation/elements": "^1.3.30", "@react-navigation/elements": "^1.3.30",
"@react-navigation/native": "^6.1.10", "@react-navigation/native": "^6.1.10",
"@react-navigation/native-stack": "^6.9.18", "@react-navigation/native-stack": "^6.9.18",
"@react-navigation/stack": "^6.4.1",
"@testing-library/jest-dom": "^5.14.1", "@testing-library/jest-dom": "^5.14.1",
"@testing-library/react": "^13.0.0", "@testing-library/react": "^13.0.0",
"@testing-library/user-event": "^13.2.1", "@walletconnect/web3wallet": "^1.13.0",
"@types/jest": "^27.0.1",
"@types/node": "^16.7.13",
"@types/react": "^18.0.0",
"@types/react-dom": "^18.0.0",
"assert": "^2.1.0", "assert": "^2.1.0",
"chain-registry": "^1.41.2", "chain-registry": "^1.41.2",
"cosmjs-types": "^0.9.0", "cosmjs-types": "^0.9.0",
"ethers": "5.7.2", "ethers": "5.7.2",
"http-browserify": "^1.7.0",
"https-browserify": "^1.0.0", "https-browserify": "^1.0.0",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"patch-package": "^8.0.0",
"react": "^18.3.1", "react": "^18.3.1",
"react-art": "^18.3.1",
"react-dom": "^18.3.1", "react-dom": "^18.3.1",
"react-hook-form": "^7.51.2", "react-hook-form": "^7.51.2",
"react-native": "^0.74.3", "react-native": "^0.74.3",
"react-native-config": "^1.5.1",
"react-native-get-random-values": "^1.10.0", "react-native-get-random-values": "^1.10.0",
"react-native-paper": "^5.12.3", "react-native-paper": "^5.12.3",
"react-native-quick-base64": "^2.0.8",
"react-native-quick-crypto": "^0.6.1",
"react-native-safe-area-context": "^4.10.8", "react-native-safe-area-context": "^4.10.8",
"react-native-screens": "^3.29.0", "react-native-screens": "^3.29.0",
"react-native-svg": "^15.1.0",
"react-native-url-polyfill": "^2.0.0",
"react-native-vector-icons": "^10.1.0", "react-native-vector-icons": "^10.1.0",
"react-native-web": "^0.19.12", "react-native-web": "^0.19.12",
"react-scripts": "5.0.1", "react-scripts": "5.0.1",
"stream-http": "^3.2.0",
"text-encoding-polyfill": "^0.6.7", "text-encoding-polyfill": "^0.6.7",
"typescript": "^4.4.2", "typescript": "^4.4.2",
"use-debounce": "^10.0.0", "use-debounce": "^10.0.0",
@ -82,15 +70,12 @@
] ]
}, },
"devDependencies": { "devDependencies": {
"@babel/plugin-proposal-class-properties": "^7.18.6",
"@babel/plugin-proposal-object-rest-spread": "^7.20.7",
"@babel/preset-env": "^7.24.8",
"@babel/preset-flow": "^7.24.7",
"@babel/preset-react": "^7.24.7",
"@babel/preset-typescript": "^7.24.7",
"@types/lodash": "^4.17.7", "@types/lodash": "^4.17.7",
"babel-loader": "^9.1.3", "@types/node": "^16.7.13",
"core-js": "^3.37.1", "@types/react": "^18.0.0",
"react-app-rewired": "^2.2.1" "@types/react-dom": "^18.0.0",
"crypto-browserify": "^3.12.0",
"react-app-rewired": "^2.2.1",
"stream-browserify": "^3.0.0"
} }
} }

View File

@ -1,233 +1,236 @@
import React, { useCallback, useEffect, useState } from 'react'; import React, { useCallback, useEffect, useState } from 'react';
import { Button, Snackbar, Text } from 'react-native-paper'; import { Button, Snackbar, Text } from 'react-native-paper';
// import Icon from 'react-native-vector-icons/MaterialCommunityIcons'; import { TxBody, AuthInfo } from 'cosmjs-types/cosmos/tx/v1beta1/tx';
// import { TxBody, AuthInfo } from 'cosmjs-types/cosmos/tx/v1beta1/tx';
// import { SignClientTypes } from '@walletconnect/types'; import { SignClientTypes } from '@walletconnect/types';
import { useNavigation } from '@react-navigation/native'; import { useNavigation } from '@react-navigation/native';
import { import {
NativeStackNavigationProp, createStackNavigator,
createNativeStackNavigator, StackNavigationProp,
} from '@react-navigation/native-stack'; } from '@react-navigation/stack';
// import { getSdkError } from '@walletconnect/utils'; import { getSdkError } from '@walletconnect/utils';
// import { Web3WalletTypes } from '@walletconnect/web3wallet'; import { Web3WalletTypes } from '@walletconnect/web3wallet';
// import { formatJsonRpcResult } from '@json-rpc-tools/utils'; import { formatJsonRpcResult } from '@json-rpc-tools/utils';
// import PairingModal from './components/PairingModal'; import PairingModal from './components/PairingModal';
// import { useWalletConnect } from './context/WalletConnectContext'; import { useWalletConnect } from './context/WalletConnectContext';
import { useAccounts } from './context/AccountsContext'; import { useAccounts } from './context/AccountsContext';
import InvalidPath from './screens/InvalidPath'; import InvalidPath from './screens/InvalidPath';
import SignMessage from './screens/SignMessage'; import SignMessage from './screens/SignMessage';
import HomeScreen from './screens/HomeScreen'; import HomeScreen from './screens/HomeScreen';
import SignRequest from './screens/SignRequest'; import SignRequest from './screens/SignRequest';
import AddSession from './screens/AddSession'; import AddSession from './screens/AddSession';
// import WalletConnect from './screens/WalletConnect'; import WalletConnect from './screens/WalletConnect';
import ApproveTransaction from './screens/ApproveTransaction'; import ApproveTransaction from './screens/ApproveTransaction';
import { StackParamsList } from './types'; import { StackParamsList } from './types';
// import { web3wallet } from './utils/wallet-connect/WalletConnectUtils'; import { web3wallet } from './utils/wallet-connect/WalletConnectUtils';
// import { EIP155_SIGNING_METHODS } from './utils/wallet-connect/EIP155Data'; import { EIP155_SIGNING_METHODS } from './utils/wallet-connect/EIP155Data';
// import { getSignParamsMessage } from './utils/wallet-connect/helpers'; import { getSignParamsMessage } from './utils/wallet-connect/helpers';
import ApproveTransfer from './screens/ApproveTransfer'; import ApproveTransfer from './screens/ApproveTransfer';
import AddNetwork from './screens/AddNetwork'; import AddNetwork from './screens/AddNetwork';
import EditNetwork from './screens/EditNetwork'; import EditNetwork from './screens/EditNetwork';
// import { COSMOS, EIP155 } from './utils/constants'; import { COSMOS, EIP155 } from './utils/constants';
import { useNetworks } from './context/NetworksContext'; import { useNetworks } from './context/NetworksContext';
// import { NETWORK_METHODS } from './utils/wallet-connect/common-data'; import { NETWORK_METHODS } from './utils/wallet-connect/common-data';
// import { COSMOS_METHODS } from './utils/wallet-connect/COSMOSData'; import { COSMOS_METHODS } from './utils/wallet-connect/COSMOSData';
const Stack = createNativeStackNavigator<StackParamsList>(); const Stack = createStackNavigator<StackParamsList>();
const App = (): React.JSX.Element => { const App = (): React.JSX.Element => {
const navigation = const navigation =
useNavigation<NativeStackNavigationProp<StackParamsList>>(); useNavigation<StackNavigationProp<StackParamsList>>();
// const { setActiveSessions } = useWalletConnect(); const { setActiveSessions } = useWalletConnect();
const { accounts, setCurrentIndex } = useAccounts(); const { accounts, setCurrentIndex } = useAccounts();
const { networksData, selectedNetwork, setSelectedNetwork } = useNetworks(); const { networksData, selectedNetwork, setSelectedNetwork } = useNetworks();
const [modalVisible, setModalVisible] = useState(false); const [modalVisible, setModalVisible] = useState(false);
const [toastVisible, setToastVisible] = useState(false); const [toastVisible, setToastVisible] = useState(false);
// const [currentProposal, setCurrentProposal] = useState< const [currentProposal, setCurrentProposal] = useState<
// SignClientTypes.EventArguments['session_proposal'] | undefined SignClientTypes.EventArguments['session_proposal'] | undefined
// >(); >();
// const onSessionProposal = useCallback( const onSessionProposal = useCallback(
// async (proposal: SignClientTypes.EventArguments['session_proposal']) => { async (proposal: SignClientTypes.EventArguments['session_proposal']) => {
// if (!accounts.length || !accounts.length) { console.log("modal triggered")
// const { id } = proposal; debugger
// await web3wallet!.rejectSession({ if (!accounts.length || !accounts.length) {
// id, const { id } = proposal;
// reason: getSdkError('UNSUPPORTED_ACCOUNTS'), await web3wallet!.rejectSession({
// }); id,
// return; reason: getSdkError('UNSUPPORTED_ACCOUNTS'),
// } });
// setModalVisible(true); return;
// setCurrentProposal(proposal); }
// }, setModalVisible(true);
// [accounts], setCurrentProposal(proposal);
// ); },
[accounts],
);
// const onSessionRequest = useCallback( const onSessionRequest = useCallback(
// async (requestEvent: Web3WalletTypes.SessionRequest) => { async (requestEvent: Web3WalletTypes.SessionRequest) => {
// const { topic, params, id } = requestEvent; const { topic, params, id } = requestEvent;
// const { request } = params; const { request } = params;
// const requestSessionData = const requestSessionData =
// web3wallet!.engine.signClient.session.get(topic); web3wallet!.engine.signClient.session.get(topic);
// switch (request.method) { switch (request.method) {
// case NETWORK_METHODS.GET_NETWORKS: case NETWORK_METHODS.GET_NETWORKS:
// const currentNetworkId = networksData.find( const currentNetworkId = networksData.find(
// networkData => networkData.networkId === selectedNetwork!.networkId, networkData => networkData.networkId === selectedNetwork!.networkId,
// )?.networkId; )?.networkId;
// const networkNamesData = networksData.map(networkData => { const networkNamesData = networksData.map(networkData => {
// return { return {
// id: networkData.networkId, id: networkData.networkId,
// name: networkData.networkName, name: networkData.networkName,
// }; };
// }); });
// const formattedResponse = formatJsonRpcResult(id, { const formattedResponse = formatJsonRpcResult(id, {
// currentNetworkId, currentNetworkId,
// networkNamesData, networkNamesData,
// }); });
// await web3wallet!.respondSessionRequest({ await web3wallet!.respondSessionRequest({
// topic, topic,
// response: formattedResponse, response: formattedResponse,
// }); });
// break; break;
// case NETWORK_METHODS.CHANGE_NETWORK: case NETWORK_METHODS.CHANGE_NETWORK:
// const networkNameData = request.params[0]; const networkNameData = request.params[0];
// const network = networksData.find( const network = networksData.find(
// networkData => networkData.networkId === networkNameData.id, networkData => networkData.networkId === networkNameData.id,
// ); );
// setCurrentIndex(0); setCurrentIndex(0);
// setSelectedNetwork(network); setSelectedNetwork(network);
// const response = formatJsonRpcResult(id, { const response = formatJsonRpcResult(id, {
// response: 'true', response: 'true',
// }); });
// await web3wallet!.respondSessionRequest({ await web3wallet!.respondSessionRequest({
// topic, topic,
// response: response, response: response,
// }); });
// break; break;
// case EIP155_SIGNING_METHODS.ETH_SEND_TRANSACTION: case EIP155_SIGNING_METHODS.ETH_SEND_TRANSACTION:
// navigation.navigate('ApproveTransfer', { navigation.navigate('ApproveTransfer', {
// transaction: request.params[0], transaction: request.params[0],
// requestEvent, requestEvent,
// requestSessionData, requestSessionData,
// }); });
// break; break;
// case EIP155_SIGNING_METHODS.PERSONAL_SIGN: case EIP155_SIGNING_METHODS.PERSONAL_SIGN:
// navigation.navigate('SignRequest', { navigation.navigate('SignRequest', {
// namespace: EIP155, namespace: EIP155,
// address: request.params[1], address: request.params[1],
// message: getSignParamsMessage(request.params), message: getSignParamsMessage(request.params),
// requestEvent, requestEvent,
// requestSessionData, requestSessionData,
// }); });
// break; break;
// case COSMOS_METHODS.COSMOS_SIGN_DIRECT: case COSMOS_METHODS.COSMOS_SIGN_DIRECT:
// const message = { const message = {
// txbody: TxBody.toJSON( txbody: TxBody.toJSON(
// TxBody.decode( TxBody.decode(
// Uint8Array.from( Uint8Array.from(
// Buffer.from(request.params.signDoc.bodyBytes, 'hex'), Buffer.from(request.params.signDoc.bodyBytes, 'hex'),
// ), ),
// ), ),
// ), ),
// authInfo: AuthInfo.toJSON( authInfo: AuthInfo.toJSON(
// AuthInfo.decode( AuthInfo.decode(
// Uint8Array.from( Uint8Array.from(
// Buffer.from(request.params.signDoc.authInfoBytes, 'hex'), Buffer.from(request.params.signDoc.authInfoBytes, 'hex'),
// ), ),
// ), ),
// ), ),
// }; };
// navigation.navigate('SignRequest', { navigation.navigate('SignRequest', {
// namespace: COSMOS, namespace: COSMOS,
// address: request.params.signerAddress, address: request.params.signerAddress,
// message: JSON.stringify(message, undefined, 2), message: JSON.stringify(message, undefined, 2),
// requestEvent, requestEvent,
// requestSessionData, requestSessionData,
// }); });
// break; break;
// case COSMOS_METHODS.COSMOS_SIGN_AMINO: case COSMOS_METHODS.COSMOS_SIGN_AMINO:
// navigation.navigate('SignRequest', { navigation.navigate('SignRequest', {
// namespace: COSMOS, namespace: COSMOS,
// address: request.params.signerAddress, address: request.params.signerAddress,
// message: request.params.signDoc.memo, message: request.params.signDoc.memo,
// requestEvent, requestEvent,
// requestSessionData, requestSessionData,
// }); });
// break; break;
// case COSMOS_METHODS.COSMOS_SEND_TOKENS: case COSMOS_METHODS.COSMOS_SEND_TOKENS:
// navigation.navigate('ApproveTransfer', { navigation.navigate('ApproveTransfer', {
// transaction: request.params[0], transaction: request.params[0],
// requestEvent, requestEvent,
// requestSessionData, requestSessionData,
// }); });
// break; break;
// case COSMOS_METHODS.COSMOS_SEND_TRANSACTION: case COSMOS_METHODS.COSMOS_SEND_TRANSACTION:
// const { transactionMessage, signer } = request.params; const { transactionMessage, signer } = request.params;
// navigation.navigate('ApproveTransaction', { navigation.navigate('ApproveTransaction', {
// transactionMessage, transactionMessage,
// signer, signer,
// requestEvent, requestEvent,
// requestSessionData, requestSessionData,
// }); });
// break; break;
// default: default:
// throw new Error('Invalid method'); throw new Error('Invalid method');
// } }
// }, },
// [ [
// navigation, navigation,
// networksData, networksData,
// setSelectedNetwork, setSelectedNetwork,
// setCurrentIndex, setCurrentIndex,
// selectedNetwork, selectedNetwork,
// ], ],
// ); );
// const onSessionDelete = useCallback(() => { const onSessionDelete = useCallback(() => {
// const sessions = web3wallet!.getActiveSessions(); const sessions = web3wallet!.getActiveSessions();
// setActiveSessions(sessions); setActiveSessions(sessions);
// }, [setActiveSessions]); }, [setActiveSessions]);
// useEffect(() => { useEffect(() => {
// web3wallet?.on('session_proposal', onSessionProposal); web3wallet?.on('session_proposal', onSessionProposal);
// web3wallet?.on('session_request', onSessionRequest); web3wallet?.on('session_request', onSessionRequest);
// web3wallet?.on('session_delete', onSessionDelete); web3wallet?.on('session_delete', onSessionDelete);
// return () => { return () => {
// web3wallet?.off('session_proposal', onSessionProposal); web3wallet?.off('session_proposal', onSessionProposal);
// web3wallet?.off('session_request', onSessionRequest); web3wallet?.off('session_request', onSessionRequest);
// web3wallet?.off('session_delete', onSessionDelete); web3wallet?.off('session_delete', onSessionDelete);
// }; };
// }); });
return ( return (
<> <>
<Stack.Navigator> <Stack.Navigator
screenOptions={{
headerBackTitleVisible: true,
}}
>
<Stack.Screen <Stack.Screen
name="Laconic" name="Laconic"
component={HomeScreen} component={HomeScreen}
options={{ options={{
// eslint-disable-next-line react/no-unstable-nested-components // eslint-disable-next-line react/no-unstable-nested-components
headerTitle: () => <Text variant="titleLarge">Laconic Wallet</Text>, headerTitle: () => <Text variant="titleLarge">Laconic Wallet</Text>,
headerBackVisible: false, }} />
}}
/>
<Stack.Screen <Stack.Screen
name="SignMessage" name="SignMessage"
component={SignMessage} component={SignMessage}
@ -236,24 +239,30 @@ const App = (): React.JSX.Element => {
headerTitle: () => <Text variant="titleLarge">Sign Message</Text>, headerTitle: () => <Text variant="titleLarge">Sign Message</Text>,
}} }}
/> />
{/* <Stack.Screen <Stack.Screen
name="SignRequest" name="SignRequest"
component={SignRequest} component={SignRequest}
options={{ options={{
// eslint-disable-next-line react/no-unstable-nested-components // eslint-disable-next-line react/no-unstable-nested-components
headerTitle: () => <Text variant="titleLarge">Sign Request</Text>, headerTitle: () => <Text variant="titleLarge">Sign Request</Text>,
}} }}
/> */} />
<Stack.Screen <Stack.Screen
name="InvalidPath" name="InvalidPath"
component={InvalidPath} component={InvalidPath}
options={{ options={{
// eslint-disable-next-line react/no-unstable-nested-components // eslint-disable-next-line react/no-unstable-nested-components
headerTitle: () => <Text variant="titleLarge">Bad Request</Text>, headerTitle: () => <Text variant="titleLarge">Bad Request</Text>,
headerBackVisible: false,
}} }}
/> />
{/* <Stack.Screen <Stack.Screen
name="AddSession"
component={AddSession}
options={{
title: 'New session',
}}
/>
<Stack.Screen
name="WalletConnect" name="WalletConnect"
component={WalletConnect} component={WalletConnect}
options={{ options={{
@ -265,27 +274,18 @@ const App = (): React.JSX.Element => {
onPress={() => { onPress={() => {
navigation.navigate('AddSession'); navigation.navigate('AddSession');
}}> }}>
{<Icon name={'qrcode-scan'} size={20} />} {<Text>PAIR</Text>}
</Button> </Button>
), ),
}} }}
/> */}
<Stack.Screen
name="AddSession"
component={AddSession}
options={{
title: 'New session',
}}
/> />
<Stack.Screen
{/* <Stack.Screen
name="ApproveTransfer" name="ApproveTransfer"
component={ApproveTransfer} component={ApproveTransfer}
options={{ options={{
title: 'Approve transfer', title: 'Approve transfer',
}} }}
/> */} />
<Stack.Screen <Stack.Screen
name="AddNetwork" name="AddNetwork"
component={AddNetwork} component={AddNetwork}
@ -300,21 +300,21 @@ const App = (): React.JSX.Element => {
title: 'Edit Network', title: 'Edit Network',
}} }}
/> />
{/* <Stack.Screen <Stack.Screen
name="ApproveTransaction" name="ApproveTransaction"
component={ApproveTransaction} component={ApproveTransaction}
options={{ options={{
title: 'Approve Transaction', title: 'Approve Transaction',
}} }}
/> */} />
</Stack.Navigator> </Stack.Navigator>
{/* <PairingModal <PairingModal
visible={modalVisible} visible={modalVisible}
setModalVisible={setModalVisible} setModalVisible={setModalVisible}
currentProposal={currentProposal} currentProposal={currentProposal}
setCurrentProposal={setCurrentProposal} setCurrentProposal={setCurrentProposal}
setToastVisible={setToastVisible} setToastVisible={setToastVisible}
/> */} />
<Snackbar <Snackbar
visible={toastVisible} visible={toastVisible}
onDismiss={() => setToastVisible(false)} onDismiss={() => setToastVisible(false)}

View File

@ -1,7 +1,6 @@
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
import { ScrollView, TouchableOpacity, View } from 'react-native'; import { TouchableOpacity, View } from 'react-native';
import { Button, List, Text, useTheme } from 'react-native-paper'; import { Button, List, Text, useTheme } from 'react-native-paper';
// import { setInternetCredentials } from 'react-native-keychain';
import { useNavigation } from '@react-navigation/native'; import { useNavigation } from '@react-navigation/native';
import { NativeStackNavigationProp } from '@react-navigation/native-stack'; import { NativeStackNavigationProp } from '@react-navigation/native-stack';
@ -17,6 +16,7 @@ import { useNetworks } from '../context/NetworksContext';
import ConfirmDialog from './ConfirmDialog'; import ConfirmDialog from './ConfirmDialog';
import { getNamespaces } from '../utils/wallet-connect/helpers'; import { getNamespaces } from '../utils/wallet-connect/helpers';
import ShowPKDialog from './ShowPKDialog'; import ShowPKDialog from './ShowPKDialog';
import { setInternetCredentials } from '../utils/key-store';
const Accounts = () => { const Accounts = () => {
const navigation = const navigation =
@ -103,11 +103,11 @@ const Accounts = () => {
networkData => selectedNetwork!.networkId !== networkData.networkId, networkData => selectedNetwork!.networkId !== networkData.networkId,
); );
// await setInternetCredentials( await setInternetCredentials(
// 'networks', 'networks',
// '_', '_',
// JSON.stringify(updatedNetworks), JSON.stringify(updatedNetworks),
// ); );
setSelectedNetwork(updatedNetworks[0]); setSelectedNetwork(updatedNetworks[0]);
setCurrentIndex(0); setCurrentIndex(0);
@ -116,7 +116,7 @@ const Accounts = () => {
}; };
return ( return (
<ScrollView> <View>
<View> <View>
<HDPathDialog <HDPathDialog
visible={hdDialog} visible={hdDialog}
@ -153,76 +153,76 @@ const Accounts = () => {
</View> </View>
<AccountDetails account={accounts[currentIndex]} /> <AccountDetails account={accounts[currentIndex]} />
<View style={styles.linkContainer}>
<View style={styles.signLink}>
<TouchableOpacity
onPress={() => {
navigation.navigate('SignMessage', {
selectedNamespace: selectedNetwork!.namespace,
selectedChainId: selectedNetwork!.chainId,
accountInfo: accounts[currentIndex],
});
}}>
<Text
variant="titleSmall"
style={[styles.hyperlink, { color: theme.colors.primary }]}>
Sign Message
</Text>
</TouchableOpacity>
</View>
<View style={styles.signLink}>
<TouchableOpacity
onPress={() => {
navigation.navigate('AddNetwork');
}}>
<Text
variant="titleSmall"
style={[styles.hyperlink, { color: theme.colors.primary }]}>
Add Network
</Text>
</TouchableOpacity>
</View>
<View style={styles.signLink}>
<TouchableOpacity
onPress={() => {
navigation.navigate('EditNetwork', {
selectedNetwork: selectedNetwork!,
});
}}>
<Text
variant="titleSmall"
style={[styles.hyperlink, { color: theme.colors.primary }]}>
Edit Network
</Text>
</TouchableOpacity>
</View>
{!selectedNetwork!.isDefault && (
<View style={styles.signLink}> <View style={styles.signLink}>
<TouchableOpacity <TouchableOpacity
onPress={() => { onPress={() => {
setDeleteNetworkDialog(true); navigation.navigate('SignMessage', {
selectedNamespace: selectedNetwork!.namespace,
selectedChainId: selectedNetwork!.chainId,
accountInfo: accounts[currentIndex],
});
}}> }}>
<Text <Text
variant="titleSmall" variant="titleSmall"
style={[styles.hyperlink, { color: theme.colors.primary }]}> style={[styles.hyperlink, { color: theme.colors.primary }]}>
Delete Network Sign Message
</Text> </Text>
</TouchableOpacity> </TouchableOpacity>
</View> </View>
)}
<ConfirmDialog
title="Delete Network"
visible={deleteNetworkDialog}
hideDialog={hideDeleteNetworkDialog}
onConfirm={handleRemove}
/>
<ShowPKDialog /> <View style={styles.signLink}>
<TouchableOpacity
onPress={() => {
navigation.navigate('AddNetwork');
}}>
<Text
variant="titleSmall"
style={[styles.hyperlink, { color: theme.colors.primary }]}>
Add Network
</Text>
</TouchableOpacity>
</View>
<View style={styles.signLink}>
<TouchableOpacity
onPress={() => {
navigation.navigate('EditNetwork', {
selectedNetwork: selectedNetwork!,
});
}}>
<Text
variant="titleSmall"
style={[styles.hyperlink, { color: theme.colors.primary }]}>
Edit Network
</Text>
</TouchableOpacity>
</View>
{!selectedNetwork!.isDefault && (
<View style={styles.signLink}>
<TouchableOpacity
onPress={() => {
setDeleteNetworkDialog(true);
}}>
<Text
variant="titleSmall"
style={[styles.hyperlink, { color: theme.colors.primary }]}>
Delete Network
</Text>
</TouchableOpacity>
</View>
)}
<ConfirmDialog
title="Delete Network"
visible={deleteNetworkDialog}
hideDialog={hideDeleteNetworkDialog}
onConfirm={handleRemove}
/>
<ShowPKDialog />
</View>
</View> </View>
</ScrollView> </View>
); );
}; };

View File

@ -1,10 +1,9 @@
import React, { useEffect, useMemo, useState } from 'react'; import React, { useEffect, useMemo, useState } from 'react';
import { Image, View, Modal, ScrollView } from 'react-native'; import { Image, View, Modal, ScrollView } from 'react-native';
import { Button, Text } from 'react-native-paper'; import { Button, Text } from 'react-native-paper';
import { SvgUri } from 'react-native-svg';
import mergeWith from 'lodash/mergeWith'; import mergeWith from 'lodash/mergeWith';
// import { buildApprovedNamespaces, getSdkError } from '@walletconnect/utils'; import { buildApprovedNamespaces, getSdkError } from '@walletconnect/utils';
import { PairingModalProps } from '../types'; import { PairingModalProps } from '../types';
import styles from '../styles/stylesheet'; import styles from '../styles/stylesheet';
@ -26,12 +25,9 @@ const PairingModal = ({
const [isLoading, setIsLoading] = useState(false); const [isLoading, setIsLoading] = useState(false);
const [chainError, setChainError] = useState(''); const [chainError, setChainError] = useState('');
// const dappName = currentProposal?.params?.proposer?.metadata.name; const dappName = currentProposal?.params?.proposer?.metadata.name;
// const url = currentProposal?.params?.proposer?.metadata.url; const url = currentProposal?.params?.proposer?.metadata.url;
// const icon = currentProposal?.params.proposer?.metadata.icons[0]; const icon = currentProposal?.params.proposer?.metadata.icons[0];
const dappName = undefined;
const url = undefined;
const icon = '.svg';
const [walletConnectData, setWalletConnectData] = useState<{ const [walletConnectData, setWalletConnectData] = useState<{
walletConnectMethods: string[]; walletConnectMethods: string[];
@ -98,9 +94,7 @@ const PairingModal = ({
return; return;
} }
// const { optionalNamespaces, requiredNamespaces } = currentProposal.params; const { optionalNamespaces, requiredNamespaces } = currentProposal.params;
const { optionalNamespaces, requiredNamespaces } = currentProposal;
try { try {
const nameSpaces = await getNamespaces( const nameSpaces = await getNamespaces(
optionalNamespaces, optionalNamespaces,
@ -114,11 +108,11 @@ const PairingModal = ({
} catch (err) { } catch (err) {
setChainError((err as Error).message); setChainError((err as Error).message);
// const { id } = currentProposal; const { id } = currentProposal;
// await web3wallet!.rejectSession({ await web3wallet!.rejectSession({
// id, id,
// reason: getSdkError('UNSUPPORTED_CHAINS'), reason: getSdkError('UNSUPPORTED_CHAINS'),
// }); });
setCurrentProposal(undefined); setCurrentProposal(undefined);
setWalletConnectData({ setWalletConnectData({
walletConnectMethods: [], walletConnectMethods: [],
@ -143,11 +137,11 @@ const PairingModal = ({
return ( return (
currentProposal && currentProposal &&
supportedNamespaces supportedNamespaces
// && &&
// buildApprovedNamespaces({ buildApprovedNamespaces({
// proposal: currentProposal.params, proposal: currentProposal.params,
// supportedNamespaces, supportedNamespaces,
// }) })
); );
}, [currentProposal, supportedNamespaces]); }, [currentProposal, supportedNamespaces]);
@ -188,11 +182,11 @@ const PairingModal = ({
const handleReject = async () => { const handleReject = async () => {
if (currentProposal) { if (currentProposal) {
// const { id } = currentProposal; const { id } = currentProposal;
// await web3wallet!.rejectSession({ await web3wallet!.rejectSession({
// id, id,
// reason: getSdkError('USER_REJECTED_METHODS'), reason: getSdkError('USER_REJECTED_METHODS'),
// }); });
setModalVisible(false); setModalVisible(false);
setCurrentProposal(undefined); setCurrentProposal(undefined);
@ -214,7 +208,7 @@ const PairingModal = ({
<> <>
{icon.endsWith('.svg') ? ( {icon.endsWith('.svg') ? (
<View style={styles.dappLogo}> <View style={styles.dappLogo}>
<SvgUri height="50" width="50" uri={icon} /> <Text>SvgURI requstIcon</Text>
</View> </View>
) : ( ) : (
<Image style={styles.dappLogo} source={{ uri: icon }} /> <Image style={styles.dappLogo} source={{ uri: icon }} />
@ -243,7 +237,7 @@ const PairingModal = ({
<> <>
{icon.endsWith('.svg') ? ( {icon.endsWith('.svg') ? (
<View style={styles.dappLogo}> <View style={styles.dappLogo}>
<SvgUri height="50" width="50" uri={icon} /> <Text>SvgURI requstIcon</Text>
</View> </View>
) : ( ) : (
<Image style={styles.dappLogo} source={{ uri: icon }} /> <Image style={styles.dappLogo} source={{ uri: icon }} />

View File

@ -19,7 +19,7 @@ const useAccounts = () => {
return accountsContext; return accountsContext;
}; };
const AccountsProvider = ({ children }: { children: any }) => { const AccountsProvider = ({ children }: { children: React.ReactNode }) => {
const [accounts, setAccounts] = useState<Account[]>([]); const [accounts, setAccounts] = useState<Account[]>([]);
const [currentIndex, setCurrentIndex] = useState<number>(0); const [currentIndex, setCurrentIndex] = useState<number>(0);

View File

@ -27,7 +27,7 @@ const useNetworks = () => {
return networksContext; return networksContext;
}; };
const NetworksProvider = ({ children }: { children: any }) => { const NetworksProvider = ({ children }: { children: React.ReactNode }) => {
const [networksData, setNetworksData] = useState<NetworksDataState[]>([]); const [networksData, setNetworksData] = useState<NetworksDataState[]>([]);
const [networkType, setNetworkType] = useState<string>(EIP155); const [networkType, setNetworkType] = useState<string>(EIP155);
const [selectedNetwork, setSelectedNetwork] = useState<NetworksDataState>(); const [selectedNetwork, setSelectedNetwork] = useState<NetworksDataState>();

View File

@ -1,6 +1,6 @@
import React, { createContext, useContext, useEffect, useState } from 'react'; import React, { createContext, useContext, useEffect, useState } from 'react';
// import { SessionTypes } from '@walletconnect/types'; import { SessionTypes } from '@walletconnect/types';
import { WalletConnectContextProps } from '../types'; import { WalletConnectContextProps } from '../types';
import { web3wallet } from '../utils/wallet-connect/WalletConnectUtils'; import { web3wallet } from '../utils/wallet-connect/WalletConnectUtils';
@ -25,8 +25,7 @@ const WalletConnectProvider = ({ children }: { children: React.ReactNode }) => {
}, []); }, []);
const [activeSessions, setActiveSessions] = useState< const [activeSessions, setActiveSessions] = useState<
// Record<string, SessionTypes.Struct> Record<string, SessionTypes.Struct>
Record<string, any>
>({}); >({});
return ( return (

View File

@ -3,6 +3,7 @@ import ReactDOM from 'react-dom/client';
import { PaperProvider, MD3LightTheme as DefaultTheme, } from 'react-native-paper'; import { PaperProvider, MD3LightTheme as DefaultTheme, } from 'react-native-paper';
import { NavigationContainer } from '@react-navigation/native'; import { NavigationContainer } from '@react-navigation/native';
import { Platform } from 'react-native'; import { Platform } from 'react-native';
import { Buffer } from 'buffer';
import './index.css'; import './index.css';
import App from './App'; import App from './App';
@ -11,26 +12,7 @@ import { NetworksProvider } from './context/NetworksContext';
import reportWebVitals from './reportWebVitals'; import reportWebVitals from './reportWebVitals';
import { WalletConnectProvider } from './context/WalletConnectContext'; import { WalletConnectProvider } from './context/WalletConnectContext';
// // Generate the required CSS globalThis.Buffer = Buffer;
// import iconFont from 'react-native-vector-icons/Fonts/FontAwesome.ttf';
// const iconFontStyles = `@font-face {
// src: url(${iconFont});
// font-family: FontAwesome;
// }`;
// // Create a stylesheet
// const style = document.createElement('style');
// style.type = 'text/css';
// // Append the iconFontStyles to the stylesheet
// if (style.styleSheet) {
// style.styleSheet.cssText = iconFontStyles;
// } else {
// style.appendChild(document.createTextNode(iconFontStyles));
// }
// // Inject the stylesheet into the document head
// document.head.appendChild(style);
const linking = { const linking = {
prefixes: ['https://wallet.laconic.com'], prefixes: ['https://wallet.laconic.com'],

View File

@ -30,6 +30,7 @@ import {
getInternetCredentials, getInternetCredentials,
setInternetCredentials, setInternetCredentials,
} from '../utils/key-store'; } from '../utils/key-store';
import styles from '../styles/stylesheet';
const ethNetworkDataSchema = z.object({ const ethNetworkDataSchema = z.object({
chainId: z.string().nonempty({ message: EMPTY_FIELD_ERROR }), chainId: z.string().nonempty({ message: EMPTY_FIELD_ERROR }),
@ -211,7 +212,7 @@ const AddNetwork = () => {
}, [namespace, reset]); }, [namespace, reset]);
return ( return (
<View> <View style={styles.appContainer}>
<SelectNetworkType updateNetworkType={updateNetworkType} /> <SelectNetworkType updateNetworkType={updateNetworkType} />
<Controller <Controller

View File

@ -1,13 +1,6 @@
import React, { useEffect, useState } from 'react'; import React, { useState } from 'react';
import { AppState, TouchableOpacity, View } from 'react-native'; import { View } from 'react-native';
import { Button, Text, TextInput } from 'react-native-paper'; import { Button, Text, TextInput } from 'react-native-paper';
// import {
// Camera,
// useCameraDevice,
// useCameraPermission,
// useCodeScanner,
// } from 'react-native-vision-camera';
import { Linking } from 'react-native';
import { useNavigation } from '@react-navigation/native'; import { useNavigation } from '@react-navigation/native';
import { NativeStackNavigationProp } from '@react-navigation/native-stack'; import { NativeStackNavigationProp } from '@react-navigation/native-stack';
@ -20,30 +13,7 @@ const AddSession = () => {
const navigation = const navigation =
useNavigation<NativeStackNavigationProp<StackParamsList>>(); useNavigation<NativeStackNavigationProp<StackParamsList>>();
// const { hasPermission, requestPermission } = useCameraPermission();
// const device = useCameraDevice('back');
const [currentWCURI, setCurrentWCURI] = useState<string>(''); const [currentWCURI, setCurrentWCURI] = useState<string>('');
// const [isActive, setIsActive] = useState(AppState.currentState === 'active');
// const [isScanning, setScanning] = useState(true);
// const codeScanner = useCodeScanner({
// codeTypes: ['qr'],
// onCodeScanned: codes => {
// if (isScanning) {
// codes.forEach(code => {
// if (code.value) {
// setCurrentWCURI(code.value);
// setScanning(false);
// }
// });
// }
// },
// });
const linkToSettings = async () => {
await Linking.openSettings();
};
const pair = async () => { const pair = async () => {
const pairing = await web3WalletPair({ uri: currentWCURI }); const pairing = await web3WalletPair({ uri: currentWCURI });
@ -51,69 +21,25 @@ const AddSession = () => {
return pairing; return pairing;
}; };
// useEffect(() => {
// const handleAppStateChange = (newState: string) => {
// setIsActive(newState === 'active');
// };
// AppState.addEventListener('change', handleAppStateChange);
// if (!hasPermission) {
// requestPermission();
// }
// }, [hasPermission, requestPermission]);
return ( return (
<View style={styles.appContainer}> <View style={styles.appContainer}>
{/* {!hasPermission || !device ? ( */} <View style={styles.inputContainer}>
{false ? ( <Text variant="titleMedium">Enter WalletConnect URI</Text>
<> <TextInput
{/* <Text> mode="outlined"
{!hasPermission onChangeText={setCurrentWCURI}
? 'No Camera Permission granted' value={currentWCURI}
: 'No Camera Selected'} numberOfLines={4}
</Text> */} multiline={true}
<TouchableOpacity onPress={linkToSettings}> style={styles.walletConnectUriText}
<Text variant="titleSmall" style={[styles.hyperlink]}> />
Go to settings
</Text>
</TouchableOpacity>
</>
) : (
<>
<View style={styles.cameraContainer}>
{/* {isActive ? (
<Camera
style={styles.camera}
device={device}
isActive={isActive}
codeScanner={codeScanner}
video={false}
/>
) : (
<Text>No Camera Selected!</Text>
)} */}
</View>
<View style={styles.inputContainer}> <View style={styles.signButton}>
<Text variant="titleMedium">Enter WalletConnect URI</Text> <Button mode="contained" onPress={pair}>
<TextInput Pair Session
mode="outlined" </Button>
onChangeText={setCurrentWCURI} </View>
value={currentWCURI} </View>
numberOfLines={4}
multiline={true}
style={styles.walletConnectUriText}
/>
<View style={styles.signButton}>
<Button mode="contained" onPress={pair}>
Pair Session
</Button>
</View>
</View>
</>
)}
</View> </View>
); );
}; };

View File

@ -1,8 +1,6 @@
import React, { useCallback, useEffect, useState } from 'react'; import React, { useCallback, useEffect, useState } from 'react';
import { Image, ScrollView, View } from 'react-native'; import { Image, ScrollView, View } from 'react-native';
import { Button, Text, TextInput } from 'react-native-paper'; import { Button, Text, TextInput } from 'react-native-paper';
import { SvgUri } from 'react-native-svg';
import Config from 'react-native-config';
import { import {
NativeStackNavigationProp, NativeStackNavigationProp,
@ -95,7 +93,11 @@ const ApproveTransaction = ({ route }: ApproveTransactionProps) => {
sender, sender,
); );
setCosmosStargateClient(client); setCosmosStargateClient(client);
} catch (error: any) { } catch (error) {
if (!(error instanceof Error)) {
throw error;
}
setTxError(error.message); setTxError(error.message);
setIsTxErrorDialogOpen(true); setIsTxErrorDialogOpen(true);
const response = formatJsonRpcError(requestEventId, error.message); const response = formatJsonRpcError(requestEventId, error.message);
@ -141,10 +143,14 @@ const ApproveTransaction = ({ route }: ApproveTransactionProps) => {
setCosmosGasLimit( setCosmosGasLimit(
String( String(
Math.round(gasEstimation * Number(Config.DEFAULT_GAS_ADJUSTMENT)), Math.round(gasEstimation * Number(process.env.REACT_APP_GAS_ADJUSTMENT)),
), ),
); );
} catch (error: any) { } catch (error) {
if (!(error instanceof Error)) {
throw error;
}
setTxError(error.message); setTxError(error.message);
setIsTxErrorDialogOpen(true); setIsTxErrorDialogOpen(true);
const response = formatJsonRpcError(requestEventId, error.message); const response = formatJsonRpcError(requestEventId, error.message);
@ -209,7 +215,11 @@ const ApproveTransaction = ({ route }: ApproveTransactionProps) => {
await web3wallet!.respondSessionRequest({ topic, response }); await web3wallet!.respondSessionRequest({ topic, response });
setIsRequestAccepted(false); setIsRequestAccepted(false);
navigation.navigate('Laconic'); navigation.navigate('Laconic');
} catch (error: any) { } catch (error) {
if (!(error instanceof Error)) {
throw error;
}
setTxError(error.message); setTxError(error.message);
setIsTxErrorDialogOpen(true); setIsTxErrorDialogOpen(true);
const response = formatJsonRpcError(requestEventId, error.message); const response = formatJsonRpcError(requestEventId, error.message);
@ -235,7 +245,8 @@ const ApproveTransaction = ({ route }: ApproveTransactionProps) => {
<> <>
{requestIcon.endsWith('.svg') ? ( {requestIcon.endsWith('.svg') ? (
<View style={styles.dappLogo}> <View style={styles.dappLogo}>
<SvgUri height="50" width="50" uri={requestIcon} /> {/* <SvgUri height="50" width="50" uri={requestIcon} /> */}
<Text>SvgURI requstIcon</Text>
</View> </View>
) : ( ) : (
<Image style={styles.dappLogo} source={{ uri: requestIcon }} /> <Image style={styles.dappLogo} source={{ uri: requestIcon }} />

View File

@ -8,7 +8,6 @@ import {
TextInput, TextInput,
} from 'react-native-paper'; } from 'react-native-paper';
import { providers, BigNumber } from 'ethers'; import { providers, BigNumber } from 'ethers';
import Config from 'react-native-config';
import { Deferrable } from 'ethers/lib/utils'; import { Deferrable } from 'ethers/lib/utils';
import { useNavigation } from '@react-navigation/native'; import { useNavigation } from '@react-navigation/native';
@ -150,7 +149,11 @@ const ApproveTransfer = ({ route }: SignRequestProps) => {
); );
setCosmosStargateClient(client); setCosmosStargateClient(client);
} catch (error: any) { } catch (error) {
if (!(error instanceof Error)) {
throw error;
}
setTxError(error.message); setTxError(error.message);
setIsTxErrorDialogOpen(true); setIsTxErrorDialogOpen(true);
} }
@ -170,7 +173,11 @@ const ApproveTransfer = ({ route }: SignRequestProps) => {
); );
return ethProvider; return ethProvider;
} catch (error: any) { } catch (error) {
if (!(error instanceof Error)) {
throw error;
}
setTxError(error.message); setTxError(error.message);
setIsTxErrorDialogOpen(true); setIsTxErrorDialogOpen(true);
} }
@ -330,7 +337,11 @@ const ApproveTransfer = ({ route }: SignRequestProps) => {
const { topic } = requestEvent; const { topic } = requestEvent;
await web3wallet!.respondSessionRequest({ topic, response }); await web3wallet!.respondSessionRequest({ topic, response });
navigation.navigate('Laconic'); navigation.navigate('Laconic');
} catch (error: any) { } catch (error) {
if (!(error instanceof Error)) {
throw error;
}
setTxError(error.message); setTxError(error.message);
setIsTxErrorDialogOpen(true); setIsTxErrorDialogOpen(true);
} }
@ -368,7 +379,11 @@ const ApproveTransfer = ({ route }: SignRequestProps) => {
setBalance(cosmosBalance?.amount!); setBalance(cosmosBalance?.amount!);
} }
} catch (error: any) { } catch (error) {
if (!(error instanceof Error)) {
throw error;
}
setTxError(error.message); setTxError(error.message);
setIsTxErrorDialogOpen(true); setIsTxErrorDialogOpen(true);
} }
@ -431,7 +446,11 @@ const ApproveTransfer = ({ route }: SignRequestProps) => {
const gasLimit = await provider.estimateGas(transactionObject); const gasLimit = await provider.estimateGas(transactionObject);
setEthGasLimit(gasLimit); setEthGasLimit(gasLimit);
} }
} catch (error: any) { } catch (error) {
if (!(error instanceof Error)) {
throw error;
}
setTxError(error.message); setTxError(error.message);
setIsTxErrorDialogOpen(true); setIsTxErrorDialogOpen(true);
} }
@ -457,10 +476,14 @@ const ApproveTransfer = ({ route }: SignRequestProps) => {
setCosmosGasLimit( setCosmosGasLimit(
String( String(
Math.round(gasEstimation * Number(Config.DEFAULT_GAS_ADJUSTMENT)), Math.round(gasEstimation * Number(process.env.REACT_APP_GAS_ADJUSTMENT)),
), ),
); );
} catch (error: any) { } catch (error) {
if (!(error instanceof Error)) {
throw error;
}
setTxError(error.message); setTxError(error.message);
setIsTxErrorDialogOpen(true); setIsTxErrorDialogOpen(true);
} }

View File

@ -96,7 +96,7 @@ const EditNetwork = ({ route }: EditNetworkProps) => {
); );
return ( return (
<View> <View style={styles.appContainer}>
<View> <View>
<Text style={styles.subHeading}> <Text style={styles.subHeading}>
Edit {networkData?.networkName} details Edit {networkData?.networkName} details

View File

@ -4,7 +4,7 @@ import { Button, Text } from 'react-native-paper';
import { NativeStackNavigationProp } from '@react-navigation/native-stack'; import { NativeStackNavigationProp } from '@react-navigation/native-stack';
import { useNavigation } from '@react-navigation/native'; import { useNavigation } from '@react-navigation/native';
// import { getSdkError } from '@walletconnect/utils'; import { getSdkError } from '@walletconnect/utils';
import { createWallet, resetWallet, retrieveAccounts } from '../utils/accounts'; import { createWallet, resetWallet, retrieveAccounts } from '../utils/accounts';
import { DialogComponent } from '../components/Dialog'; import { DialogComponent } from '../components/Dialog';
@ -58,7 +58,6 @@ const HomeScreen = () => {
const [isWalletCreating, setIsWalletCreating] = useState<boolean>(false); const [isWalletCreating, setIsWalletCreating] = useState<boolean>(false);
const [walletDialog, setWalletDialog] = useState<boolean>(false); const [walletDialog, setWalletDialog] = useState<boolean>(false);
const [resetWalletDialog, setResetWalletDialog] = useState<boolean>(false); const [resetWalletDialog, setResetWalletDialog] = useState<boolean>(false);
// const [isAccountsFetched, setIsAccountsFetched] = useState<boolean>(false);
const [isAccountsFetched, setIsAccountsFetched] = useState<boolean>(true); const [isAccountsFetched, setIsAccountsFetched] = useState<boolean>(true);
const [phrase, setPhrase] = useState(''); const [phrase, setPhrase] = useState('');
@ -99,14 +98,14 @@ const HomeScreen = () => {
setNetworksData([]); setNetworksData([]);
setSelectedNetwork(undefined); setSelectedNetwork(undefined);
await resetWallet(); await resetWallet();
// const sessions = web3wallet!.getActiveSessions(); const sessions = web3wallet!.getActiveSessions();
// Object.keys(sessions).forEach(async sessionId => { Object.keys(sessions).forEach(async sessionId => {
// await web3wallet!.disconnectSession({ await web3wallet!.disconnectSession({
// topic: sessionId, topic: sessionId,
// reason: getSdkError('USER_DISCONNECTED'), reason: getSdkError('USER_DISCONNECTED'),
// }); });
// }); });
setActiveSessions({}); setActiveSessions({});
hideResetDialog(); hideResetDialog();

View File

@ -1,5 +1,5 @@
import React, { useState } from 'react'; import React, { useState } from 'react';
import { View, Alert } from 'react-native'; import { View } from 'react-native';
import { Button, Text, TextInput } from 'react-native-paper'; import { Button, Text, TextInput } from 'react-native-paper';
import { NativeStackScreenProps } from '@react-navigation/native-stack'; import { NativeStackScreenProps } from '@react-navigation/native-stack';
@ -25,7 +25,7 @@ const SignMessage = ({ route }: SignProps) => {
chainId, chainId,
accountId: account.index, accountId: account.index,
}); });
Alert.alert('Signature', signedMessage); alert(`Signature ${signedMessage}`);
}; };
return ( return (

View File

@ -1,7 +1,6 @@
import React, { useCallback, useEffect, useMemo, useState } from 'react'; import React, { useCallback, useEffect, useMemo, useState } from 'react';
import { Alert, Image, ScrollView, View } from 'react-native'; import { Image, ScrollView, View } from 'react-native';
import { ActivityIndicator, Button, Text, Appbar } from 'react-native-paper'; import { ActivityIndicator, Button, Text, Appbar } from 'react-native-paper';
import { SvgUri } from 'react-native-svg';
import { useNavigation } from '@react-navigation/native'; import { useNavigation } from '@react-navigation/native';
import { import {
@ -210,7 +209,7 @@ const SignRequest = ({ route }: SignRequestProps) => {
chainId, chainId,
accountId: account.index, accountId: account.index,
}); });
Alert.alert('Signature', signedMessage); alert(`Signature ${signedMessage}`);
} }
}; };
@ -279,7 +278,7 @@ const SignRequest = ({ route }: SignRequestProps) => {
<> <>
{requestIcon.endsWith('.svg') ? ( {requestIcon.endsWith('.svg') ? (
<View style={styles.dappLogo}> <View style={styles.dappLogo}>
<SvgUri height="50" width="50" uri={requestIcon} /> <Text>SvgURI requstIcon</Text>
</View> </View>
) : ( ) : (
<Image <Image

View File

@ -1,9 +1,8 @@
import React, { useEffect } from 'react'; import React, { useEffect } from 'react';
import { Image, TouchableOpacity, View } from 'react-native'; import { Image, TouchableOpacity, View } from 'react-native';
import { List, Text } from 'react-native-paper'; import { List, Text } from 'react-native-paper';
import { SvgUri } from 'react-native-svg';
// import { getSdkError } from '@walletconnect/utils'; import { getSdkError } from '@walletconnect/utils';
import { useWalletConnect } from '../context/WalletConnectContext'; import { useWalletConnect } from '../context/WalletConnectContext';
import { web3wallet } from '../utils/wallet-connect/WalletConnectUtils'; import { web3wallet } from '../utils/wallet-connect/WalletConnectUtils';
@ -13,10 +12,10 @@ export default function WalletConnect() {
const { activeSessions, setActiveSessions } = useWalletConnect(); const { activeSessions, setActiveSessions } = useWalletConnect();
const disconnect = async (sessionId: string) => { const disconnect = async (sessionId: string) => {
// await web3wallet!.disconnectSession({ await web3wallet!.disconnectSession({
// topic: sessionId, topic: sessionId,
// reason: getSdkError('USER_DISCONNECTED'), reason: getSdkError('USER_DISCONNECTED'),
// }); });
const sessions = web3wallet?.getActiveSessions() || {}; const sessions = web3wallet?.getActiveSessions() || {};
setActiveSessions(sessions); setActiveSessions(sessions);
return; return;
@ -48,11 +47,7 @@ export default function WalletConnect() {
<> <>
{session.peer.metadata.icons[0].endsWith('.svg') ? ( {session.peer.metadata.icons[0].endsWith('.svg') ? (
<View style={styles.dappLogo}> <View style={styles.dappLogo}>
<SvgUri <Text>SvgURI peerMetaDataIcon</Text>
height="50"
width="50"
uri={session.peer.metadata.icons[0]}
/>
</View> </View>
) : ( ) : (
<Image <Image

View File

@ -218,17 +218,9 @@ const styles = StyleSheet.create({
paddingHorizontal: 10, paddingHorizontal: 10,
marginVertical: 3, marginVertical: 3,
}, },
cameraContainer: {
justifyContent: 'center',
alignItems: 'center',
},
inputContainer: { inputContainer: {
marginTop: 20, marginTop: 20,
}, },
camera: {
width: 400,
height: 400,
},
dappDetails: { dappDetails: {
display: 'flex', display: 'flex',
alignItems: 'center', alignItems: 'center',
@ -282,6 +274,9 @@ const styles = StyleSheet.create({
fontWeight: '700', fontWeight: '700',
padding: 8, padding: 8,
}, },
linkContainer: {
paddingBottom: 72
}
}); });
export default styles; export default styles;

View File

@ -1,7 +1,7 @@
import { PopulatedTransaction } from 'ethers'; import { PopulatedTransaction } from 'ethers';
// import { SignClientTypes, SessionTypes } from '@walletconnect/types'; import { SignClientTypes, SessionTypes } from '@walletconnect/types';
// import { Web3WalletTypes } from '@walletconnect/web3wallet'; import { Web3WalletTypes } from '@walletconnect/web3wallet';
import { EncodeObject } from '@cosmjs/proto-signing'; import { EncodeObject } from '@cosmjs/proto-signing';
export type StackParamsList = { export type StackParamsList = {
@ -15,17 +15,13 @@ export type StackParamsList = {
namespace: string; namespace: string;
address: string; address: string;
message: string; message: string;
// requestEvent?: Web3WalletTypes.SessionRequest; requestEvent?: Web3WalletTypes.SessionRequest;
// requestSessionData?: SessionTypes.Struct; requestSessionData?: SessionTypes.Struct;
requestEvent?: any;
requestSessionData?: any;
}; };
ApproveTransfer: { ApproveTransfer: {
transaction: PopulatedTransaction; transaction: PopulatedTransaction;
// requestEvent: Web3WalletTypes.SessionRequest; requestEvent: Web3WalletTypes.SessionRequest;
// requestSessionData: SessionTypes.Struct; requestSessionData: SessionTypes.Struct;
requestEvent: any;
requestSessionData: any;
}; };
InvalidPath: undefined; InvalidPath: undefined;
WalletConnect: undefined; WalletConnect: undefined;
@ -37,10 +33,8 @@ export type StackParamsList = {
ApproveTransaction: { ApproveTransaction: {
transactionMessage: EncodeObject; transactionMessage: EncodeObject;
signer: string; signer: string;
// requestEvent: Web3WalletTypes.SessionRequest; requestEvent: Web3WalletTypes.SessionRequest;
// requestSessionData: SessionTypes.Struct; requestSessionData: SessionTypes.Struct;
requestEvent: any;
requestSessionData: any;
}; };
}; };
@ -120,21 +114,19 @@ export interface PairingModalProps {
visible: boolean; visible: boolean;
setModalVisible: (arg1: boolean) => void; setModalVisible: (arg1: boolean) => void;
currentProposal: currentProposal:
// | SignClientTypes.EventArguments['session_proposal'] | SignClientTypes.EventArguments['session_proposal']
| undefined; | undefined;
setCurrentProposal: ( setCurrentProposal: (
arg1: arg1:
// | SignClientTypes.EventArguments['session_proposal'] | SignClientTypes.EventArguments['session_proposal']
| undefined, | undefined,
) => void; ) => void;
setToastVisible: (arg1: boolean) => void; setToastVisible: (arg1: boolean) => void;
} }
export interface WalletConnectContextProps { export interface WalletConnectContextProps {
// activeSessions: Record<string, SessionTypes.Struct>; activeSessions: Record<string, SessionTypes.Struct>;
activeSessions: Record<string, any>;
setActiveSessions: ( setActiveSessions: (
// activeSessions: Record<string, SessionTypes.Struct>, activeSessions: Record<string, SessionTypes.Struct>,
activeSessions: Record<string, any>,
) => void; ) => void;
} }

View File

@ -119,14 +119,14 @@ const resetKeyServers = async (namespace: string) => {
const networksData: NetworksDataState[] = JSON.parse(networksServer); const networksData: NetworksDataState[] = JSON.parse(networksServer);
const filteredNetworks = networksData.filter( const filteredNetworks = networksData.filter(
(network: any) => network.namespace === namespace, network => network.namespace === namespace,
); );
if (filteredNetworks.length === 0) { if (filteredNetworks.length === 0) {
throw new Error(`No networks found for namespace ${namespace}.`); throw new Error(`No networks found for namespace ${namespace}.`);
} }
filteredNetworks.forEach(async (network: any) => { filteredNetworks.forEach(async network => {
const { chainId } = network; const { chainId } = network;
const namespaceChainId = `${namespace}:${chainId}`; const namespaceChainId = `${namespace}:${chainId}`;

View File

@ -1,36 +1,32 @@
import Config from 'react-native-config';
// import '@walletconnect/react-native-compat';
import '@ethersproject/shims'; import '@ethersproject/shims';
// import { Core } from '@walletconnect/core'; import { Core } from '@walletconnect/core';
// import { ICore } from '@walletconnect/types'; import { ICore } from '@walletconnect/types';
// import { Web3Wallet, IWeb3Wallet } from '@walletconnect/web3wallet'; import { Web3Wallet, IWeb3Wallet } from '@walletconnect/web3wallet';
export let web3wallet: export let web3wallet:
// | IWeb3Wallet | IWeb3Wallet
| any; | undefined;
export let core: export let core: ICore;
// | ICore
| any;
export async function createWeb3Wallet() { export async function createWeb3Wallet() {
// core = new Core({ core = new Core({
// projectId: Config.WALLET_CONNECT_PROJECT_ID, projectId: process.env.REACT_APP_WALLET_CONNECT_PROJECT_ID,
// }); });
// web3wallet = await Web3Wallet.init({ web3wallet = await Web3Wallet.init({
// core, core,
// metadata: { metadata: {
// name: 'Laconic Wallet', name: 'Laconic Wallet',
// description: 'Laconic Wallet', description: 'Laconic Wallet',
// url: 'https://wallet.laconic.com/', url: 'https://wallet.laconic.com/',
// icons: ['https://avatars.githubusercontent.com/u/92608123'], icons: ['https://avatars.githubusercontent.com/u/92608123'],
// }, },
// }); });
} }
export async function web3WalletPair(params: { uri: string }) { export async function web3WalletPair(params: { uri: string }) {
if (web3wallet) { if (web3wallet) {
// return await web3wallet.core.pairing.pair({ uri: params.uri }); return await web3wallet.core.pairing.pair({ uri: params.uri });
} }
} }

View File

@ -2,7 +2,7 @@
import { utils } from 'ethers'; import { utils } from 'ethers';
// import { ProposalTypes } from '@walletconnect/types'; import { ProposalTypes } from '@walletconnect/types';
import { Account, NetworksDataState } from '../../types'; import { Account, NetworksDataState } from '../../types';
import { EIP155_SIGNING_METHODS } from './EIP155Data'; import { EIP155_SIGNING_METHODS } from './EIP155Data';
@ -35,10 +35,8 @@ export function getSignParamsMessage(params: string[]) {
} }
export const getNamespaces = async ( export const getNamespaces = async (
// optionalNamespaces: ProposalTypes.OptionalNamespaces, optionalNamespaces: ProposalTypes.OptionalNamespaces,
// requiredNamespaces: ProposalTypes.RequiredNamespaces, requiredNamespaces: ProposalTypes.RequiredNamespaces,
optionalNamespaces: any,
requiredNamespaces: any,
networksData: NetworksDataState[], networksData: NetworksDataState[],
selectedNetwork: NetworksDataState, selectedNetwork: NetworksDataState,
accounts: Account[], accounts: Account[],

View File

@ -2,8 +2,8 @@
import { BigNumber, Wallet, providers } from 'ethers'; import { BigNumber, Wallet, providers } from 'ethers';
import { formatJsonRpcError, formatJsonRpcResult } from '@json-rpc-tools/utils'; import { formatJsonRpcError, formatJsonRpcResult } from '@json-rpc-tools/utils';
// import { SignClientTypes } from '@walletconnect/types'; import { SignClientTypes } from '@walletconnect/types';
// import { getSdkError } from '@walletconnect/utils'; import { getSdkError } from '@walletconnect/utils';
import { import {
SigningStargateClient, SigningStargateClient,
StdFee, StdFee,
@ -11,6 +11,7 @@ import {
} from '@cosmjs/stargate'; } from '@cosmjs/stargate';
import { EncodeObject } from '@cosmjs/proto-signing'; import { EncodeObject } from '@cosmjs/proto-signing';
import { LaconicClient } from '@cerc-io/registry-sdk'; import { LaconicClient } from '@cerc-io/registry-sdk';
import { Buffer } from 'buffer';
import { EIP155_SIGNING_METHODS } from './EIP155Data'; import { EIP155_SIGNING_METHODS } from './EIP155Data';
import { signDirectMessage, signEthMessage } from '../sign-message'; import { signDirectMessage, signEthMessage } from '../sign-message';
@ -67,8 +68,7 @@ export type WalletConnectRequests =
| CosmosSendTransaction; | CosmosSendTransaction;
export async function approveWalletConnectRequest( export async function approveWalletConnectRequest(
// requestEvent: SignClientTypes.EventArguments['session_request'], requestEvent: SignClientTypes.EventArguments['session_request'],
requestEvent: any,
account: Account, account: Account,
namespace: string, namespace: string,
chainId: string, chainId: string,
@ -207,15 +207,14 @@ export async function approveWalletConnectRequest(
}); });
default: default:
// throw new Error(getSdkError('INVALID_METHOD').message); throw new Error(getSdkError('INVALID_METHOD').message);
} }
} }
export function rejectWalletConnectRequest( export function rejectWalletConnectRequest(
// request: SignClientTypes.EventArguments['session_request'], request: SignClientTypes.EventArguments['session_request'],
request: any,
) { ) {
// const { id } = request; const { id } = request;
// return formatJsonRpcError(id, getSdkError('USER_REJECTED_METHODS').message); return formatJsonRpcError(id, getSdkError('USER_REJECTED_METHODS').message);
} }

1369
yarn.lock

File diff suppressed because it is too large Load Diff