reactjsweb3jsweb3-react

useWeb3React hook doesn't return provider


I want to access the Ethereum blockchain through Cloudflare Ethereum Gateway. I am trying to use web3-react library, but useWeb3React doesn't return object with provider property.

codesandbox.io

index.js

import { StrictMode } from "react";
import ReactDOM from "react-dom";
import Web3 from "web3";
import { Web3ReactProvider } from "@web3-react/core";

import App from "./App";

function getLibrary(provider) {
  const web3Provider = new Web3.providers.HttpProvider(
    "https://cloudflare-eth.com"
  );
  const web3 = new Web3(web3Provider);
  return web3;
}

const rootElement = document.getElementById("root");
ReactDOM.render(
  <StrictMode>
    <Web3ReactProvider getLibrary={getLibrary}>
      <App />
    </Web3ReactProvider>
  </StrictMode>,
  rootElement
);

App.js

import { useWeb3React } from "@web3-react/core";

import "./styles.css";

export default function App() {
  const web3React = useWeb3React();
  console.log({ web3React });

  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      <h2>Start editing to see some magic happen!</h2>
    </div>
  );
}

Solution

  • There is an issue in the library describing this exact problem with the solution here: https://github.com/NoahZinsmeister/web3-react/issues/126#issuecomment-783057749

    Seems like you have to call web3React.activate() in your App.js with whatever connector you want to use. So for example with the @web3-react/injected-connector:

    import { useWeb3React } from "@web3-react/core";
    import { InjectedConnector } from "@web3-react/injected-connector";
    
    import "./styles.css";
    
    export default function App() {
      const web3React = useWeb3React();
    
      web3React.activate(new InjectedConnector({
        supportedChainIds: [1, 3, 4, 5, 42]
      }));
      console.log({ web3React });
    
      return (
        <div className="App">
          <h1>Hello CodeSandbox</h1>
          <h2>Start editing to see some magic happen!</h2>
        </div>
      );
    }