forked from cerc-io/laconic-wallet
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:
parent
984cad8e48
commit
da4bed9c4b
55
src/App.tsx
55
src/App.tsx
@ -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(() => {
|
||||||
|
@ -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 ?? [])],
|
||||||
|
@ -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 => (
|
||||||
|
@ -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 ?? []),
|
||||||
],
|
],
|
||||||
|
@ -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();
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
4
src/utils/wallet-connect/common-data.ts
Normal file
4
src/utils/wallet-connect/common-data.ts
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
export const NETWORK_METHODS = {
|
||||||
|
GET_NETWORKS: 'getNetworks',
|
||||||
|
CHANGE_NETWORK: 'changeNetwork',
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user