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 })