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

浙公网安备 33010602011771号