ethers.js 封装
import { utils, BigNumber } from 'ethers'
import { Message } from 'element-ui'
import config from '@/config'
import { fmtWalletAddress } from '@/utils/utils'
import Bus from '@/utils/bus'
class contractFn { constructor({ account, provider, chainId }) { console.log(`[ account : ${account} ] >`) this.provider = provider this.account = account.toLowerCase() this.fmtAccount = fmtWalletAddress(account) this.chainId = chainId this.config = config }
async call({ to, methods, params, abi }) { const iface = new utils.Interface(abi) const data = iface.encodeFunctionData(methods, params) return this.provider .call({ to, data }) .then(res => { return iface.decodeFunctionResult(methods, res) }) }
async transaction({ to, methods, params, abi, value=0 }) { const iface = new utils.Interface(abi) const data = iface.encodeFunctionData(methods, params) let gas = BigNumber.from('10000') try { gas = await this.provider.estimateGas({ from: this.account, to: to, data: data, value: value }) Bus.$emit('transaction', { state: 'pending' }) } catch (error) { const message = error.data ? error.data.message : error.error.message const msg = message.replace('execution reverted:', '') Message.warning(msg) return Promise.reject(error) } try { const signer = this.provider.getSigner() const tx = await signer.sendTransaction({ to: to, data: data, value: value, gasLimit: gas.toNumber() }) const obj = Object.assign( { methods, params }, { hash: tx.hash }, { state: 'success' } ) Bus.$emit('transaction', obj) return Promise.resolve(tx) } catch (error) { Bus.$emit('transaction', { state: 'rejected' }) // Message.error(error.data) return Promise.reject(error) } } }
export default contractFn
class contractFn { constructor({ account, provider, chainId }) { console.log(`[ account : ${account} ] >`) this.provider = provider this.account = account.toLowerCase() this.fmtAccount = fmtWalletAddress(account) this.chainId = chainId this.config = config }
async call({ to, methods, params, abi }) { const iface = new utils.Interface(abi) const data = iface.encodeFunctionData(methods, params) return this.provider .call({ to, data }) .then(res => { return iface.decodeFunctionResult(methods, res) }) }
async transaction({ to, methods, params, abi, value=0 }) { const iface = new utils.Interface(abi) const data = iface.encodeFunctionData(methods, params) let gas = BigNumber.from('10000') try { gas = await this.provider.estimateGas({ from: this.account, to: to, data: data, value: value }) Bus.$emit('transaction', { state: 'pending' }) } catch (error) { const message = error.data ? error.data.message : error.error.message const msg = message.replace('execution reverted:', '') Message.warning(msg) return Promise.reject(error) } try { const signer = this.provider.getSigner() const tx = await signer.sendTransaction({ to: to, data: data, value: value, gasLimit: gas.toNumber() }) const obj = Object.assign( { methods, params }, { hash: tx.hash }, { state: 'success' } ) Bus.$emit('transaction', obj) return Promise.resolve(tx) } catch (error) { Bus.$emit('transaction', { state: 'rejected' }) // Message.error(error.data) return Promise.reject(error) } } }
export default contractFn