bido-sdk-react
TypeScript icon, indicating that this package has built-in type declarations

0.0.8 • Public • Published

React helpers

React helpers for Lido Finance projects. Part of Lido JS SDK

Install

yarn add bido-sdk-react

Factories

Contracts factory

Source

contractHooksFactory creates set of hooks, which return RPC and Web3 contracts.

// use typechain package to generate factories for your contracts
import { YOUR_ABI_FACTORY } from 'your/abi/folder';
import { contractHooksFactory } from 'bido-sdk-react';
import { CHAINS, TOKENS } from 'bido-sdk-constants';

const getMyContractAddress = (chainId) => {
  // should return contract address
};

const { useContractRPC, useContractWeb3 } = contractHooksFactory(
  YOUR_ABI_FACTORY,
  getMyContractAddress,
);

Package bido-sdk-react exports hooks for WSTETH, STETH, LDO and WithdrawalQueue contracts:

useWSTETHContractRPC();
useWSTETHContractWeb3();
useSTETHContractRPC();
useSTETHContractWeb3();
useLDOContractRPC();
useLDOContractWeb3();
useWithdrawalQueueContractRPC();
useWithdrawalQueueContractWeb3();

ERC20 hooks factory

Source

hooksFactory binds a token address to the ERC20 hooks and returns an object of them. The factory function takes a callback, that uses to get a token address by chain id.

import { hooksFactory } from 'bido-sdk-react';

const getMyContractAddress = (chainId) => {
  // should return contract address
};

const {
  useTokenBalance,
  useTotalSupply,
  useDecimals,
  useAllowance,
  useApprove,
} = hooksFactory(getMyContractAddress);

Hooks for tokens WSTETH, STETH and LDO with attached addresses:

useWSTETHBalance()
useWSTETHTotalSupply()
useWSTETHDecimals()
useWSTETHAllowance(spender: string)
useWSTETHApprove(amount: BigNumber, spender: string, wrapper: UseApproveWrapper)
useSTETHBalance()
useSTETHTotalSupply()
useSTETHDecimals()
useSTETHAllowance(spender: string)
useSTETHApprove(amount: BigNumber, spender: string, wrapper: UseApproveWrapper)
useLDOBalance()
useLDOTotalSupply()
useLDODecimals()
useLDOAllowance(spender: string)
useLDOApprove(amount: BigNumber, spender: string, wrapper: UseApproveWrapper)

ERC20 hooks

ProviderSDK

To use ERC20 hooks, your app must be wrapped with <ProviderSDK />.

import { ProviderSDK } from 'bido-sdk-react';
import { CHAINS } from 'bido-sdk-constants';

const supportedChainIds = [CHAINS.Mainnet, CHAINS.Goerli];
const defaultChainId = CHAINS.Mainnet;

const providerRpc = getRpcProvider(
  CHAINS.Goerli,
  `/api/rpc?chainId=${CHAINS.Goerli}`,
);
const providerMainnetRpc = getRpcProvider(
  CHAINS.Mainnet,
  `/api/rpc?chainId=${CHAINS.Mainnet}`,
);

const App = ({ children }) => {
  const { chainId, providerWeb3 } = FromYourLibrary; // web3-react for example

  return (
    <ProviderSDK
      chainId={chainId || defaultChainId}
      supportedChainIds={supportedChainIds}
      providerRpc={providerRpc}
      providerMainnetRpc={providerMainnetRpc}
      providerWeb3={providerWeb3}
    >
      {children}
    </ProviderSDK>
  );
};

Hooks

All request hooks accept SWR config as optional last argument.

useTotalSupply

import { useTotalSupply } from 'bido-sdk-react';

const Component = () => {
  const token = 'token address';
  const { data, loading } = useTotalSupply(token, { isPaused: !token });
  const totalSupply = data?.toString();

  return <div>{loading ? 'loading...' : totalSupply}</div>;
};

useTokenBalance

import { useTokenBalance } from 'bido-sdk-react';

const Component = () => {
  const token = 'token address';
  const account = 'account address';
  const { data, loading } = useTokenBalance(token, account);
  const balance = data?.toString();

  return <div>{loading ? 'loading...' : balance}</div>;
};

useAllowance

import { useAllowance } from 'bido-sdk-react';

const Component = () => {
  const token = 'token address';
  const spender = 'spender address';
  const { data, loading } = useAllowance(token, spender);
  const balance = data?.toString();

  return <div>{loading ? 'loading...' : balance}</div>;
};

useApprove

import { useApprove } from 'bido-sdk-react';
import { BigNumber } from '@ethersproject/bignumber';

const Component = () => {
  const amount = BigNumber.from(10);
  const token = 'token address';
  const spender = 'spender address';
  const { approve } = useApprove(amount, token, spender);

  return <button onClick={approve}>Approve</button>;
};

useDecimals

import { useDecimals } from 'bido-sdk-react';

const Component = () => {
  const token = 'token address';
  const { data, loading } = useDecimals(token);

  return <div>{loading ? 'loading...' : data}</div>;
};

SWR hooks

useLidoSWR

useLidoSWR hook is a wrapped useSWR. The hook additionally returns:

  • update function, which implements mutate(undefined, true)
  • loading and initialLoading flags
import { useLidoSWR } from 'bido-sdk-react';

const Component = () => {
  const { data, loading } = useLidoSWR('/data', fetcher);

  return <div>{loading ? 'loading...' : data}</div>;
};

useLidoSWRImmutable

Immutable version of useLidoSWR. It has the same API interface as the normal hook.

useLidoSWRImmutable('/data', fetcher);

// equal to
useLidoSWR('/data', fetcher, {
  dedupingInterval: 86_400_000,
  revalidateOnFocus: false,
  revalidateOnReconnect: false,
});

useContractSWR

useLidoSWR for contracts

import { useContractSWR } from 'bido-sdk-react';
import { CHAINS, TOKENS } from 'bido-sdk-constants';

const Component = () => {
  const accountAddress = 'your address';
  const tokenAddress = getTokenAddress(CHAINS.Mainnet, TOKENS.STETH);
  const contractRpc = getERC20Contract(tokenAddress, providerRpc);

  const { data, loading } = useContractSWR({
    contract: contractRpc,
    method: 'balanceOf',
    params: [accountAddress],
  });

  const balance = data?.toString();

  return <div>{loading ? 'loading...' : balance}</div>;
};

useContractEstimateGasSWR

useLidoSWR over contract.estimateGas[method]

import { useContractEstimateGasSWR } from 'bido-sdk-react';
import { CHAINS, TOKENS } from 'bido-sdk-constants';

const Component = () => {
  const { data, loading } = useContractEstimateGasSWR({
    contract: myContractInstance,
    method: 'myMethod',
    params: ['argument'],
  });

  const gas = data?.toString();

  return <div>{loading ? 'loading...' : gas}</div>;
};

useEthereumSWR

useLidoSWR for RPC provider

import { useEthereumSWR } from 'bido-sdk-react';

const Component = () => {
  const { data, loading } = useEthereumSWR({ method: 'getGasPrice' });
  const gasPrice = data?.toString();

  return <div>{loading ? 'loading...' : gasPrice}</div>;
};

useEthereumBalance

import { useEthereumBalance } from 'bido-sdk-react';

const Component = () => {
  const { data, loading } = useEthereumBalance();
  const balance = data?.toString();

  return <div>{loading ? 'loading...' : balance}</div>;
};

useFeeHistory

import { useFeeHistory } from 'bido-sdk-react';

const Component = () => {
  const { data, loading } = useFeeHistory({ blocks: 1024 });
  const { oldestBlock, baseFeePerGas, gasUsedRatio } = data;

  return <div>{loading ? 'loading...' : oldestBlock}</div>;
};

useFeeAnalytics

import { useFeeAnalytics } from 'bido-sdk-react';

const Component = () => {
  const { percentile, loading } = useFeeAnalytics({ blocks: 1024 });

  return <div>{loading ? 'loading...' : percentile}</div>;
};

Price hooks

useEthPrice

import { useEthPrice } from 'bido-sdk-react';

const Component = () => {
  const { data, loading } = useEthPrice();
  const ethPrice = data?.toString();

  return <div>{loading ? 'loading...' : ethPrice}</div>;
};

useTxPrice

import { useTxPrice } from 'bido-sdk-react';

const Component = () => {
  const gasLimit = 10_000;
  const { data, loading } = useTxPrice(gasLimit);
  const txPrice = data?.toString();

  return <div>{loading ? 'loading...' : txPrice}</div>;
};

Other hooks

useTokenToWallet

import { useTokenToWallet } from 'bido-sdk-react';

const Component = () => {
  const token = 'token address';
  const { addToken } = useTokenToWallet(token);

  return <button onClick={addToken}>Add token</button>;
};

useLocalStorage

import { useLocalStorage } from 'bido-sdk-react';

const Component = () => {
  const initialValue = null;
  const [value, setValue] = useLocalStorage('unique-key-in-LS', initialValue);

  return <button onClick={() => setValue(2)}>{value}</button>;
};

useDebounceCallback

import { useDebounceCallback } from 'bido-sdk-react';

const Component = () => {
  const debounced = useDebounceCallback(callback);
};

Package Sidebar

Install

npm i bido-sdk-react

Weekly Downloads

1

Version

0.0.8

License

MIT

Unpacked Size

132 kB

Total Files

115

Last publish

Collaborators

  • wbh1328551759