Send networks data to dapp (#87)

* Send networks data to dapp

* Reflect switching tabs in dapp dropdown

* Fix current network name not showing in Dapp

* Modify variable names

* Modify method and variable names

* Modify networks type

* Use selectedNetwork state and networkId

* Fix networks context states

* Add separate file for network methods
This commit is contained in:
IshaVenikar 2024-04-15 17:00:58 +05:30 committed by Nabarun Gogoi
parent 984cad8e48
commit da4bed9c4b
7 changed files with 68 additions and 21 deletions

View File

@ -11,6 +11,7 @@ import {
} from '@react-navigation/native-stack'; } from '@react-navigation/native-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 PairingModal from './components/PairingModal'; import PairingModal from './components/PairingModal';
import { useWalletConnect } from './context/WalletConnectContext'; import { useWalletConnect } from './context/WalletConnectContext';
@ -28,6 +29,9 @@ import { getSignParamsMessage } from './utils/wallet-connect/Helpers';
import ApproveTransaction from './screens/ApproveTransaction'; import ApproveTransaction from './screens/ApproveTransaction';
import AddNetwork from './screens/AddNetwork'; import AddNetwork from './screens/AddNetwork';
import { COSMOS, EIP155 } from './utils/constants'; import { COSMOS, EIP155 } from './utils/constants';
import { retrieveNetworksData } from './utils/accounts';
import { useNetworks } from './context/NetworksContext';
import { NETWORK_METHODS } from './utils/wallet-connect/common-data';
const Stack = createNativeStackNavigator<StackParamsList>(); const Stack = createNativeStackNavigator<StackParamsList>();
@ -36,7 +40,8 @@ const App = (): React.JSX.Element => {
useNavigation<NativeStackNavigationProp<StackParamsList>>(); useNavigation<NativeStackNavigationProp<StackParamsList>>();
const { setActiveSessions } = useWalletConnect(); const { setActiveSessions } = useWalletConnect();
const { accounts } = useAccounts(); const { accounts, setCurrentIndex } = useAccounts();
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<
@ -61,12 +66,44 @@ const App = (): React.JSX.Element => {
const onSessionRequest = useCallback( const onSessionRequest = useCallback(
async (requestEvent: Web3WalletTypes.SessionRequest) => { async (requestEvent: Web3WalletTypes.SessionRequest) => {
const { topic, params } = 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:
const retrievedNetworks = await retrieveNetworksData();
const currentNetworkId = networksData.find(
networkData => networkData.networkId === selectedNetwork.networkId,
)?.networkId;
const formattedResponse = formatJsonRpcResult(id, {
retrievedNetworks,
currentNetworkId,
});
await web3wallet!.respondSessionRequest({
topic,
response: formattedResponse,
});
break;
case NETWORK_METHODS.CHANGE_NETWORK:
const network = request.params[0];
setCurrentIndex(0);
setSelectedNetwork(network);
const response = formatJsonRpcResult(id, {
response: 'true',
});
await web3wallet!.respondSessionRequest({
topic,
response: response,
});
break;
case EIP155_SIGNING_METHODS.ETH_SEND_TRANSACTION: case EIP155_SIGNING_METHODS.ETH_SEND_TRANSACTION:
navigation.navigate('ApproveTransaction', { navigation.navigate('ApproveTransaction', {
transaction: request.params[0], transaction: request.params[0],
@ -83,8 +120,8 @@ const App = (): React.JSX.Element => {
requestEvent, requestEvent,
requestSessionData, requestSessionData,
}); });
break; break;
case 'cosmos_signDirect': case 'cosmos_signDirect':
const message = { const message = {
txbody: TxBody.toJSON( txbody: TxBody.toJSON(
@ -109,8 +146,8 @@ const App = (): React.JSX.Element => {
requestEvent, requestEvent,
requestSessionData, requestSessionData,
}); });
break; break;
case 'cosmos_signAmino': case 'cosmos_signAmino':
navigation.navigate('SignRequest', { navigation.navigate('SignRequest', {
namespace: COSMOS, namespace: COSMOS,
@ -119,7 +156,6 @@ const App = (): React.JSX.Element => {
requestEvent, requestEvent,
requestSessionData, requestSessionData,
}); });
break; break;
case 'cosmos_sendTokens': case 'cosmos_sendTokens':
@ -128,14 +164,19 @@ const App = (): React.JSX.Element => {
requestEvent, requestEvent,
requestSessionData, requestSessionData,
}); });
break; break;
default: default:
throw new Error('Invalid method'); throw new Error('Invalid method');
} }
}, },
[navigation], [
navigation,
networksData,
setSelectedNetwork,
setCurrentIndex,
selectedNetwork,
],
); );
const onSessionDelete = useCallback(() => { const onSessionDelete = useCallback(() => {

View File

@ -17,6 +17,7 @@ import { EIP155_SIGNING_METHODS } from '../utils/wallet-connect/EIP155Data';
import { COSMOS_METHODS } from '../utils/wallet-connect/COSMOSData'; import { COSMOS_METHODS } from '../utils/wallet-connect/COSMOSData';
import { useNetworks } from '../context/NetworksContext'; import { useNetworks } from '../context/NetworksContext';
import { COSMOS, EIP155 } from '../utils/constants'; import { COSMOS, EIP155 } from '../utils/constants';
import { NETWORK_METHODS } from '../utils/wallet-connect/common-data';
const Accounts = ({ currentIndex, updateIndex }: AccountsProps) => { const Accounts = ({ currentIndex, updateIndex }: AccountsProps) => {
const navigation = const navigation =
@ -63,6 +64,7 @@ const Accounts = ({ currentIndex, updateIndex }: AccountsProps) => {
// TODO: Debug optional namespace methods and events being required for approval // TODO: Debug optional namespace methods and events being required for approval
methods: [ methods: [
...Object.values(EIP155_SIGNING_METHODS), ...Object.values(EIP155_SIGNING_METHODS),
...Object.values(NETWORK_METHODS),
...(combinedNamespaces.eip155?.methods ?? []), ...(combinedNamespaces.eip155?.methods ?? []),
], ],
events: [...(combinedNamespaces.eip155?.events ?? [])], events: [...(combinedNamespaces.eip155?.events ?? [])],
@ -84,6 +86,7 @@ const Accounts = ({ currentIndex, updateIndex }: AccountsProps) => {
chains: [namespaceChainId], chains: [namespaceChainId],
methods: [ methods: [
...Object.values(COSMOS_METHODS), ...Object.values(COSMOS_METHODS),
...Object.values(NETWORK_METHODS),
...(combinedNamespaces.cosmos?.methods ?? []), ...(combinedNamespaces.cosmos?.methods ?? []),
], ],
events: [...(combinedNamespaces.cosmos?.events ?? [])], events: [...(combinedNamespaces.cosmos?.events ?? [])],

View File

@ -7,23 +7,20 @@ import styles from '../styles/stylesheet';
import { useNetworks } from '../context/NetworksContext'; import { useNetworks } from '../context/NetworksContext';
const NetworkDropdown = ({ updateNetwork }: NetworkDropdownProps) => { const NetworkDropdown = ({ updateNetwork }: NetworkDropdownProps) => {
const { networksData } = useNetworks(); const { networksData, selectedNetwork, setSelectedNetwork } = useNetworks();
const [expanded, setExpanded] = useState<boolean>(false); const [expanded, setExpanded] = useState<boolean>(false);
const [selectedNetwork, setSelectedNetwork] = useState<string>(
networksData[0].networkName,
);
const handleNetworkPress = (networksData: NetworksDataState) => { const handleNetworkPress = (networksData: NetworksDataState) => {
updateNetwork(networksData); updateNetwork(networksData);
setSelectedNetwork(networksData.networkName); setSelectedNetwork(networksData);
setExpanded(false); setExpanded(false);
}; };
return ( return (
<View style={styles.networkDropdown}> <View style={styles.networkDropdown}>
<List.Accordion <List.Accordion
title={selectedNetwork} title={selectedNetwork.networkName}
expanded={expanded} expanded={expanded}
onPress={() => setExpanded(!expanded)}> onPress={() => setExpanded(!expanded)}>
{networksData.map(networkData => ( {networksData.map(networkData => (

View File

@ -15,6 +15,7 @@ import { EIP155_SIGNING_METHODS } from '../utils/wallet-connect/EIP155Data';
import { COSMOS_METHODS } from '../utils/wallet-connect/COSMOSData'; import { COSMOS_METHODS } from '../utils/wallet-connect/COSMOSData';
import { useNetworks } from '../context/NetworksContext'; import { useNetworks } from '../context/NetworksContext';
import { COSMOS, EIP155 } from '../utils/constants'; import { COSMOS, EIP155 } from '../utils/constants';
import { NETWORK_METHODS } from '../utils/wallet-connect/common-data';
const PairingModal = ({ const PairingModal = ({
visible, visible,
@ -102,6 +103,7 @@ const PairingModal = ({
// TODO: Debug optional namespace methods and events being required for approval // TODO: Debug optional namespace methods and events being required for approval
methods: [ methods: [
...Object.values(EIP155_SIGNING_METHODS), ...Object.values(EIP155_SIGNING_METHODS),
...Object.values(NETWORK_METHODS),
...(optionalNamespaces.eip155?.methods ?? []), ...(optionalNamespaces.eip155?.methods ?? []),
...(requiredNamespaces.eip155?.methods ?? []), ...(requiredNamespaces.eip155?.methods ?? []),
], ],
@ -126,6 +128,7 @@ const PairingModal = ({
chains: [namespaceChainId], chains: [namespaceChainId],
methods: [ methods: [
...Object.values(COSMOS_METHODS), ...Object.values(COSMOS_METHODS),
...Object.values(NETWORK_METHODS),
...(optionalNamespaces.cosmos?.methods ?? []), ...(optionalNamespaces.cosmos?.methods ?? []),
...(requiredNamespaces.cosmos?.methods ?? []), ...(requiredNamespaces.cosmos?.methods ?? []),
], ],

View File

@ -11,10 +11,8 @@ const NetworksContext = createContext<{
setNetworksData: React.Dispatch<React.SetStateAction<NetworksDataState[]>>; setNetworksData: React.Dispatch<React.SetStateAction<NetworksDataState[]>>;
networkType: string; networkType: string;
setNetworkType: (networkType: string) => void; setNetworkType: (networkType: string) => void;
selectedNetwork?: NetworksDataState; selectedNetwork: NetworksDataState;
setSelectedNetwork: React.Dispatch< setSelectedNetwork: React.Dispatch<React.SetStateAction<NetworksDataState>>;
React.SetStateAction<NetworksDataState | undefined>
>;
}>({ }>({
currentIndex: 0, currentIndex: 0,
setCurrentIndex: () => {}, setCurrentIndex: () => {},
@ -35,7 +33,9 @@ const NetworksProvider = ({ children }: { children: any }) => {
const [networksData, setNetworksData] = useState<NetworksDataState[]>([]); const [networksData, setNetworksData] = useState<NetworksDataState[]>([]);
const [currentIndex, setCurrentIndex] = useState<number>(0); const [currentIndex, setCurrentIndex] = useState<number>(0);
const [networkType, setNetworkType] = useState<string>(EIP155); const [networkType, setNetworkType] = useState<string>(EIP155);
const [selectedNetwork, setSelectedNetwork] = useState<NetworksDataState>(); const [selectedNetwork, setSelectedNetwork] = useState<NetworksDataState>(
{} as NetworksDataState,
);
useEffect(() => { useEffect(() => {
const fetchData = async () => { const fetchData = async () => {
@ -47,7 +47,7 @@ const NetworksProvider = ({ children }: { children: any }) => {
} }
const retrievedNewNetworks = await retrieveNetworksData(); const retrievedNewNetworks = await retrieveNetworksData();
setNetworksData(retrievedNewNetworks); setNetworksData(retrievedNewNetworks);
setSelectedNetwork(retrievedNetworks[0]); setSelectedNetwork(retrievedNewNetworks[0]);
}; };
fetchData(); fetchData();

View File

@ -138,14 +138,13 @@ const storeNetworkData = async (
const updatedNetworks: NetworksDataState[] = [ const updatedNetworks: NetworksDataState[] = [
...retrievedNetworks, ...retrievedNetworks,
{ networkId: networkId, ...networkData }, { ...networkData, networkId: String(networkId) },
]; ];
await setInternetCredentials( await setInternetCredentials(
'networks', 'networks',
'_', '_',
JSON.stringify(updatedNetworks), JSON.stringify(updatedNetworks),
); );
return updatedNetworks; return updatedNetworks;
}; };

View File

@ -0,0 +1,4 @@
export const NETWORK_METHODS = {
GET_NETWORKS: 'getNetworks',
CHANGE_NETWORK: 'changeNetwork',
};