From 06313311c39f79baa28a4b0edacfd52152a28dea Mon Sep 17 00:00:00 2001 From: zhl Date: Mon, 22 May 2023 11:00:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=80=E4=B8=AA=E8=AE=A1?= =?UTF-8?q?=E7=AE=97erc20=E8=BD=AC=E8=B4=A6=E4=BB=B7=E6=A0=BC=E7=9A=84?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/chain/BlockChain.ts | 9 ++++++++- src/chain/ERC20Reactor.ts | 6 ++++++ src/controllers/token.controllers.ts | 16 ++++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 src/controllers/token.controllers.ts diff --git a/src/chain/BlockChain.ts b/src/chain/BlockChain.ts index d3ffa3d..2c0db70 100644 --- a/src/chain/BlockChain.ts +++ b/src/chain/BlockChain.ts @@ -1,5 +1,4 @@ import { singleton } from 'decorators/singleton' -import logger from 'logger/logger' import { TaskType } from 'models/RequestTask' import { ConfirmQueue } from 'queue/confirm.queue' import Web3 from 'web3' @@ -9,6 +8,7 @@ import { ERC721Reactor } from './ERC721Reactor' import { HttpRetryProvider } from './HttpRetryProvider' import { WalletReactor } from './WalletReactor' import { DistributorReactor } from './DistributorReactor' +import { fromTokenMinimalUnit } from 'utils/number.util' @singleton export class BlockChain { @@ -96,4 +96,11 @@ export class BlockChain { } return abi } + + public async generateGasShow(gas: any) { + let price = await this.web3.eth.getGasPrice() + let ehtBN = this.web3.utils.toBN(price).mul(this.web3.utils.toBN(gas)) + let eth = fromTokenMinimalUnit(ehtBN, 18) + return { gas, price, eth } + } } diff --git a/src/chain/ERC20Reactor.ts b/src/chain/ERC20Reactor.ts index f44970d..30b123b 100644 --- a/src/chain/ERC20Reactor.ts +++ b/src/chain/ERC20Reactor.ts @@ -135,6 +135,12 @@ export class ERC20Reactor { }) } + async calcTransferGas({ address }: { address: string }) { + const contract = new this.web3.eth.Contract(abiFt, address, { from: this.account.address }) + let gas = await contract.methods.transferFrom(this.account.address, this.account.address, 0).estimateGas() + return gas + } + async mint({ address, to, diff --git a/src/controllers/token.controllers.ts b/src/controllers/token.controllers.ts new file mode 100644 index 0000000..34a73c4 --- /dev/null +++ b/src/controllers/token.controllers.ts @@ -0,0 +1,16 @@ +import BaseController from 'common/base.controller' +import { role, router } from 'decorators/router' +import { BlockChain } from 'chain/BlockChain' +import { ZError } from 'common/ZError' + +class TokenController extends BaseController { + @role('anon') + @router('post /chain/estimate_transfer_gas') + async calcGasPrice(req, res) { + const { address } = req.params + let gas = await new BlockChain().erc20Reactor.calcTransferGas({ address }) + let data = await new BlockChain().generateGasShow(gas) + return data + } +} +export default TokenController