github.com/MetalBlockchain/subnet-evm@v0.4.9/contract-examples/test/contract_native_minter.ts (about)

     1  // (c) 2019-2022, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers";
     5  import { expect } from "chai";
     6  import {
     7    BigNumber,
     8    Contract,
     9    ContractFactory,
    10  } from "ethers"
    11  import { ethers } from "hardhat"
    12  
    13  // make sure this is always an admin for minter precompile
    14  const adminAddress: string = "0x8db97C7cEcE249c2b98bDC0226Cc4C2A57BF52FC"
    15  const MINT_PRECOMPILE_ADDRESS = "0x0200000000000000000000000000000000000001";
    16  const mintValue = ethers.utils.parseEther("1")
    17  const initialValue = ethers.utils.parseEther("10")
    18  
    19  const ROLES = {
    20    NONE: 0,
    21    MINTER: 1,
    22    ADMIN: 2
    23  };
    24  
    25  describe("ERC20NativeMinter", function () {
    26    let owner: SignerWithAddress
    27    let contract: Contract
    28    let minter: SignerWithAddress
    29    before(async function () {
    30      owner = await ethers.getSigner(adminAddress);
    31      const Token: ContractFactory = await ethers.getContractFactory("ERC20NativeMinter", { signer: owner })
    32      contract = await Token.deploy(initialValue)
    33      await contract.deployed()
    34      const contractAddress: string = contract.address
    35      console.log(`Contract deployed to: ${contractAddress}`)
    36  
    37      const name: string = await contract.name()
    38      console.log(`Name: ${name}`)
    39  
    40      const symbol: string = await contract.symbol()
    41      console.log(`Symbol: ${symbol}`)
    42  
    43      const decimals: string = await contract.decimals()
    44      console.log(`Decimals: ${decimals}`)
    45  
    46      const signers: SignerWithAddress[] = await ethers.getSigners()
    47      minter = signers.slice(-1)[0]
    48  
    49      // Fund minter address
    50      await owner.sendTransaction({
    51        to: minter.address,
    52        value: ethers.utils.parseEther("1")
    53      })
    54    });
    55  
    56    it("should add contract deployer as owner", async function () {
    57      const contractOwnerAddr: string = await contract.owner()
    58      expect(owner.address).to.equal(contractOwnerAddr)
    59    });
    60  
    61    // this contract is not given minter permission yet, so should not mintdraw
    62    it("contract should not be able to mintdraw", async function () {
    63      const minterList = await ethers.getContractAt("INativeMinter", MINT_PRECOMPILE_ADDRESS, owner);
    64      let contractRole = await minterList.readAllowList(contract.address);
    65      expect(contractRole).to.be.equal(ROLES.NONE)
    66      try {
    67        await contract.mintdraw(mintValue)
    68      }
    69      catch (err) {
    70        return
    71      }
    72      expect.fail("should have errored")
    73    })
    74  
    75    it("should be added to minter list", async function () {
    76      const minterList = await ethers.getContractAt("INativeMinter", MINT_PRECOMPILE_ADDRESS, owner);
    77      let adminRole = await minterList.readAllowList(adminAddress);
    78      expect(adminRole).to.be.equal(ROLES.ADMIN)
    79      let contractRole = await minterList.readAllowList(contract.address);
    80      expect(contractRole).to.be.equal(ROLES.NONE)
    81  
    82      let mintTx = await minterList.setEnabled(contract.address);
    83      await mintTx.wait()
    84      contractRole = await minterList.readAllowList(contract.address);
    85      expect(contractRole).to.be.equal(ROLES.MINTER)
    86    });
    87  
    88    // admin should mintdraw since it has ERC20 token initially.
    89    it("admin should mintdraw", async function () {
    90      let initBalance: BigNumber = await contract.balanceOf(owner.address)
    91      let initNativeBalance: BigNumber = await ethers.provider.getBalance(owner.address)
    92      let tx = await contract.mintdraw(mintValue)
    93      let txRec = await tx.wait()
    94      let balance = await contract.balanceOf(owner.address)
    95      expect(balance).to.be.equal(initBalance.sub(mintValue))
    96  
    97      let nativeBalance = await ethers.provider.getBalance(owner.address)
    98      let gasUsed: BigNumber = txRec.cumulativeGasUsed
    99      let gasPrice: BigNumber = txRec.effectiveGasPrice
   100      let txFee = gasUsed.mul(gasPrice)
   101      expect(nativeBalance).to.be.equal(initNativeBalance.add(mintValue).sub(txFee))
   102    })
   103  
   104    // minter should not mintdraw since it has no ERC20 token.
   105    it("minter should not mintdraw ", async function () {
   106      try {
   107        await contract.connect(minter).mintdraw(mintValue)
   108      }
   109      catch (err) {
   110        return
   111      }
   112      expect.fail("should have errored")
   113    })
   114  
   115    // minter should not mintdraw since it has no ERC20 token.
   116    it("should deposit for minter", async function () {
   117      let initBalance: BigNumber = await contract.balanceOf(minter.address)
   118      let initNativeBalance: BigNumber = await ethers.provider.getBalance(minter.address)
   119      let tx = await contract.connect(minter).deposit({ value: mintValue })
   120      let txRec = await tx.wait()
   121  
   122      let balance = await contract.balanceOf(minter.address)
   123      expect(balance).to.be.equal(initBalance.add(mintValue))
   124      let nativeBalance = await ethers.provider.getBalance(minter.address)
   125      let gasUsed: BigNumber = txRec.cumulativeGasUsed
   126      let gasPrice: BigNumber = txRec.effectiveGasPrice
   127      let txFee = gasUsed.mul(gasPrice)
   128      expect(nativeBalance).to.be.equal(initNativeBalance.sub(mintValue).sub(txFee))
   129    })
   130  
   131    // minter should mintdraw now since it has ERC20 token.
   132    it("minter should mintdraw", async function () {
   133      let initBalance: BigNumber = await contract.balanceOf(minter.address)
   134      let initNativeBalance: BigNumber = await ethers.provider.getBalance(minter.address)
   135      let tx = await contract.connect(minter).mintdraw(mintValue)
   136      let txRec = await tx.wait()
   137  
   138      let balance = await contract.balanceOf(minter.address)
   139      expect(balance).to.be.equal(initBalance.sub(mintValue))
   140      let nativeBalance = await ethers.provider.getBalance(minter.address)
   141      let gasUsed: BigNumber = txRec.cumulativeGasUsed
   142      let gasPrice: BigNumber = txRec.effectiveGasPrice
   143      let txFee = gasUsed.mul(gasPrice)
   144      expect(nativeBalance).to.be.equal(initNativeBalance.add(mintValue).sub(txFee))
   145    })
   146  })