import { Contract } from 'web3-eth-contract' import Web3 from 'web3' import { Account } from 'web3-core' const abi = require('abis/NftDistributor.json').abi export class DistributorReactor { private web3: Web3 private contract: Contract private account: Account constructor({ web3, address }: { web3: Web3; address: string }) { this.web3 = web3 this.account = this.web3.eth.accounts.wallet[0] this.contract = new this.web3.eth.Contract(abi, address, { from: this.account.address }) } /** * 发布NFT列表 */ async publishAirdropList({ address, to, nftList, encodeABI = false, }: { address?: string to: string nftList: string[] encodeABI?: boolean }) { const contract = address ? new this.web3.eth.Contract(abi, address, { from: this.account.address }) : this.contract if (encodeABI) { return contract.methods.addNFTData(to, nftList).encodeABI() } let gas = await contract.methods.addNFTData(to, nftList).estimateGas({ from: this.account.address }) let res = await contract.methods.addNFTData(to, nftList).send({ gas: (gas * 1.5) | 0 }) return res } /** * mint nft to user */ async mintNft({ address, to, count, encodeABI = false, }: { address?: string to: string count: number encodeABI?: boolean }) { const contract = address ? new this.web3.eth.Contract(abi, address, { from: this.account.address }) : this.contract const countStr = count + '' if (encodeABI) { return contract.methods.mintToUser(to, countStr).encodeABI() } let gas = await contract.methods.mintToUser(to, countStr).estimateGas({ from: this.account.address }) let res = await contract.methods.mintToUser(to, countStr).send({ gas: (gas * 1.5) | 0 }) return res } /** * 查询用户可mint的数量 */ async getMintableCount({ address, user }: { address?: string; user: string }) { const contract = address ? new this.web3.eth.Contract(abi, address, { from: this.account.address }) : this.contract return await contract.methods.getMintableCount(user).call() } }