0.5.0 • Published 7 days ago

@rjshooks/use-contract-function v0.5.0

Weekly downloads
-
License
MIT
Repository
github
Last release
7 days ago

@rjshooks/use-contract-function

React hook for calling Ethereum contract functions with precise error handling and progress tracking. Intended as a replacement for useContractFunction from the useDapp package.

Installation

npm i --save @rjshooks/use-contract-function @ethersproject/contracts @usedapp/core react@20

Usage

In this simple example below, the user clicks a button to trigger 3 separate async steps. The progress indicator text updates as each subsequent step gets executed. 50% of the time any of the steps can fail, at which point an error will be shown. If all steps pass then a success message gets shown. Finally, the user can click the button again to restart the sequence from scratch.

import { useMemo, useCallback } from 'react'
import { useEthers  } from "@usedapp/core"
import { Contract } from "@ethersproject/contracts"
import { useContractFunction } from '@rjshooks/use-contract-function'

// USDC ERC-20 token
const CONTRACT_ADDRESS = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'

const CONTRACT_ABI = [{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]

export const CallContract = () => {
  const { library } = useEthers()

  const contract = useMemo(() => new Contract(CONTRACT_ADDRESS, CONTRACT_ABI, library), [ library ])

  const method = useContractFunction({ 
    contract, 
    functionName: 'transfer' 
  })

  const run = useCallback(async () => {
    await method.exec('0x....', '0x100')
  }, [ method ])

  return (
    <div>
      <button onClick={run}>Run</button>
      {method.progress.error ? <div>Error: {method.progress.error.message}</div> : null}
      {method.progress.completed ? <div>Success!</div> : null}
    </div>
  )
} 

This hook internally uses the useProgress hook to keep track of the sequence progress. If you wish you can supply your own instance of this hook in case you want more fine-grained control over the progress tracking:

import { useMemo, useCallback } from 'react'
import { useEthers  } from "@usedapp/core"
import { Contract } from "@ethersproject/contracts"
import { useContractFunction } from '@rjshooks/use-contract-function'
import { useProgress } from '@rjshooks/use-progress'

// USDC ERC-20 token
// ....

export const CallContract = () => {
  // ...

  const progress = useProgress()
  const method = useContractFunction({ 
    contract, 
    functionName: 'transfer', 
    progress 
  })

  const run = useCallback(async () => {
    progress.reset()

    if (Math.random() > 0.5) {
      progress.setError(new Error('failed'))
      return
    }

    await method.exec('0x....', '0x100')
  }, [ method ])

  return (
    <div>
      <button onClick={run}>Run</button>
      {method.progress.error ? <div>Error: {method.progress.error.message}</div> : null}
      {method.progress.completed ? <div>Success!</div> : null}
    </div>
  )
} 

You can also override the transaction parameters:

const method = useContractFunction({ 
  contract, 
  functionName: 'transfer',  
  options: {
    gasPrice: 1,
    // ...etc
  }
})

License

MIT

0.5.0

7 days ago

0.3.0

7 months ago

0.4.0

7 months ago

0.2.1

2 years ago

0.2.0

2 years ago

0.2.3

2 years ago

0.2.2

2 years ago

0.2.5

2 years ago

0.2.4

2 years ago

0.1.5

2 years ago