Commit c9f557b8 authored by tom's avatar tom

wallet connect

parent 3c9abe3d
import * as Sentry from '@sentry/react'; import * as Sentry from '@sentry/react';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; import { ReactQueryDevtools } from '@tanstack/react-query-devtools';
import {
EthereumClient,
modalConnectors,
walletConnectProvider,
} from '@web3modal/ethereum';
import { Web3Modal } from '@web3modal/react';
import type { AppProps } from 'next/app'; import type { AppProps } from 'next/app';
import React, { useState } from 'react'; import React, { useState } from 'react';
import type { Chain } from 'wagmi';
import { configureChains, createClient, WagmiConfig } from 'wagmi';
import appConfig from 'configs/app/config'; import appConfig from 'configs/app/config';
import type { ResourceError } from 'lib/api/resources'; import type { ResourceError } from 'lib/api/resources';
...@@ -15,6 +23,39 @@ import theme from 'theme'; ...@@ -15,6 +23,39 @@ import theme from 'theme';
import AppError from 'ui/shared/AppError/AppError'; import AppError from 'ui/shared/AppError/AppError';
import ErrorBoundary from 'ui/shared/ErrorBoundary'; import ErrorBoundary from 'ui/shared/ErrorBoundary';
export const poa: Chain = {
id: 99,
name: 'POA',
network: 'poa',
nativeCurrency: {
decimals: 18,
name: 'POA',
symbol: 'POA',
},
rpcUrls: {
'default': { http: [ 'https://core.poa.network' ] },
},
blockExplorers: {
'default': { name: 'Blockscout', url: 'https://blockscout.com/poa/core' },
},
};
const chains = [ poa ];
const PROJECT_ID = 'b4ed81be141093911032944632465175';
// Wagmi client
const { provider } = configureChains(chains, [
walletConnectProvider({ projectId: PROJECT_ID }),
]);
const wagmiClient = createClient({
autoConnect: true,
connectors: modalConnectors({ appName: 'web3Modal', chains }),
provider,
});
// Web3Modal Ethereum Client
const ethereumClient = new EthereumClient(wagmiClient, chains);
function MyApp({ Component, pageProps }: AppProps) { function MyApp({ Component, pageProps }: AppProps) {
useConfigSentry(); useConfigSentry();
const [ queryClient ] = useState(() => new QueryClient({ const [ queryClient ] = useState(() => new QueryClient({
...@@ -61,7 +102,14 @@ function MyApp({ Component, pageProps }: AppProps) { ...@@ -61,7 +102,14 @@ function MyApp({ Component, pageProps }: AppProps) {
<QueryClientProvider client={ queryClient }> <QueryClientProvider client={ queryClient }>
<ScrollDirectionProvider> <ScrollDirectionProvider>
<SocketProvider url={ `${ appConfig.api.socket }${ appConfig.api.basePath }/socket/v2` }> <SocketProvider url={ `${ appConfig.api.socket }${ appConfig.api.basePath }/socket/v2` }>
<Component { ...pageProps }/> <WagmiConfig client={ wagmiClient }>
<Component { ...pageProps }/>
</WagmiConfig>
<Web3Modal
projectId={ PROJECT_ID }
ethereumClient={ ethereumClient }
themeZIndex={ 1200 }
/>
</SocketProvider> </SocketProvider>
</ScrollDirectionProvider> </ScrollDirectionProvider>
<ReactQueryDevtools/> <ReactQueryDevtools/>
......
import { Alert, chakra, Link } from '@chakra-ui/react';
import { useWeb3Modal } from '@web3modal/react';
import React from 'react';
import { useAccount, useDisconnect } from 'wagmi';
import AddressIcon from 'ui/shared/address/AddressIcon';
const ContractConnectWallet = () => {
const { isOpen, open } = useWeb3Modal();
const { address, isDisconnected } = useAccount();
const { disconnect } = useDisconnect();
const handleConnect = React.useCallback(() => {
open();
}, [ open ]);
const handleDisconnect = React.useCallback(() => {
disconnect();
}, [ disconnect ]);
const content = (() => {
if (isOpen) {
return <span>connecting...</span>;
}
if (isDisconnected || !address) {
return (
<>
<span>Disconnected.</span>
<Link ml={ 1 } onClick={ handleConnect }>Connect wallet</Link>
</>
);
}
return (
<>
<span>Connected to </span>
<AddressIcon address={{ hash: address, is_contract: false }} mx={ 2 }/>
<chakra.span fontWeight={ 600 }>{ address }</chakra.span>
<Link ml={ 2 } onClick={ handleDisconnect }>Disconnect</Link>
</>
);
})();
return <Alert mb={ 6 } status={ address ? 'success' : 'warning' }>{ content }</Alert>;
};
export default ContractConnectWallet;
...@@ -9,6 +9,7 @@ import ContentLoader from 'ui/shared/ContentLoader'; ...@@ -9,6 +9,7 @@ import ContentLoader from 'ui/shared/ContentLoader';
import DataFetchAlert from 'ui/shared/DataFetchAlert'; import DataFetchAlert from 'ui/shared/DataFetchAlert';
import { useContractContext } from './context'; import { useContractContext } from './context';
import ContractConnectWallet from './ContractConnectWallet';
import ContractMethodCallable from './ContractMethodCallable'; import ContractMethodCallable from './ContractMethodCallable';
interface Props { interface Props {
...@@ -68,7 +69,12 @@ const ContractWrite = ({ isProxy }: Props) => { ...@@ -68,7 +69,12 @@ const ContractWrite = ({ isProxy }: Props) => {
return <ContentLoader/>; return <ContentLoader/>;
} }
return <ContractMethodsAccordion data={ data } renderContent={ renderContent }/>; return (
<>
<ContractConnectWallet/>
<ContractMethodsAccordion data={ data } renderContent={ renderContent }/>
</>
);
}; };
export default ContractWrite; export default ContractWrite;
...@@ -7,7 +7,7 @@ import type { AddressParam } from 'types/api/addressParams'; ...@@ -7,7 +7,7 @@ import type { AddressParam } from 'types/api/addressParams';
import AddressContractIcon from 'ui/shared/address/AddressContractIcon'; import AddressContractIcon from 'ui/shared/address/AddressContractIcon';
type Props = { type Props = {
address: AddressParam; address: Pick<AddressParam, 'hash' | 'is_contract'>;
className?: string; className?: string;
} }
......
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment