Decent Wallet Provider

Built on top of Web3 Modal to connect Ethereum (EVM) wallets.

Supported Wallets

Injected Wallets

Metamask, Frame etc

WalletConnect

Using WalletConnect Provider, allows connection to mobile and supported desktop apps

Getting Started

Installation

React Versions

This component uses react hooks and the Context API. react@16 or greater is required.

react-scripts

if using react-scripts version 5.0.0 or greater, react-app-rewired will be needed to add process, buffer, util packages.

npm install react-app-rewired process buffer util

and then add config-overrifdes.js from the sandbox to allow for these node packages to be added to webpack.

Provider Context

Web3Provider.tsx exports an Context.provider that will pass provider state data through the component tree.

import { Web3Provider } from '@decent-org/wallet-provider'

ReactDOM.render(
  <Web3Provider config={config} theme={theme}>
    <App />
  </Web3Provider>
);

There are 2 props that can be be passed to <Web3Provider>

name default type required description
config * DWPConfig true Provider configurations
theme ‘light’ string | ModalTheme false Web3Modal theme settings

Config

This prop excepts the following properties

name default type required description
providerKeys * ProviderKeys At least one key is required. Node api keys for fallback provider
localChainId undefined string false Chain id for local node
localProviderURL undefined string false providerURL for local node
fallbackChainId * string true Chain Id for when wallet is not connected
supportedChainIds * string true Supported main/test net chain ids. Should be formatted as 1,3,4,42

Theme

This property is optional. See web3modal for more details.

Usage

using the useWeb3Provider() hook in hooks/useWeb3Provider.ts you now have access to the Wallet Provider and connection information within state. For Typed Definition see types.ts

export interface IWeb3ProviderContext {
  state: InitialState;
  connect: ConnectFn;
  disconnect: DisconnectFn;
}

import { useWeb3Provider } from '@decent-org/wallet-provider';

function Component() {
  const { state: { account, chaindId, network, connectionType } } = useWeb3Provider();

  console.log(account)
  // if connected 0x.... 
  // if not connected null
  console.log(chainId)
  // 0x04
  console.log(network)
  // 'rinkeby'
  console.log(connectionType)
  // 'injected provider'
  ... 
}

Connecting and Disconnect to Wallet

import { useWeb3Provider } from '@decent-org/wallet-provider';

function Component() {
  const { state: { account },  connect, disconnect } = useWeb3Provider();

  if(!account) {
    return (
      <button onClick={connect}>Connect</button>
    )
    return (
      <button onClick={disconnect}>Disconnect</button>
    )
  }
}

Interacting with the blockchain

function Component() {
  const { state: { provider, signer } } = useWeb3Provider();

  // When retreiving information use provider
    provider.on('block',  (block: number) => {
      setBlockNumber(block);
    };);

  // When broadcasting a transaction or interacting with a contract use Signer
  ontract.connect(daoData.moduleAddresses[1], signer);
}

Local Development

Some scripts have been created to help get going quickly

Node

nvm use to change to node version 16.15.1

Install packages

npm run install:packages

First removes node_modules from root and sandbox directories before installing packages.

Build Wallet Provider package

npm run build:link

Builds and then establish a local link between the packages dist directory and a package within the node_modules of the sandbox.

Note: There currently is not a hotloader to automatically build when files are updated. after running npm run build:link, you will need to restart your development server. It’s recommended you spilt your terminal to run these commands as needed.

Start development server

npm run start

From the root directory you can start the development server, no need to cd into sandbox

GitHub

View Github