const BricksFactory = artifacts.require("GoldBricksFactory"); const NFT = artifacts.require("NFT"); const { BN,expectEvent, expectRevert } = require("@openzeppelin/test-helpers"); const { expect } = require("chai"); contract("BricksFactory", (accounts) => { const admin = accounts[0]; const user = accounts[1]; const executor = accounts[0]; let brick; let brickFactory; let ids = [new BN(1), new BN(2), new BN(3)]; beforeEach(async () => { brick = await NFT.new("CRYPTO ELITE'S GOLDBRICK", "GoldBrick", 0); brickFactory = await BricksFactory.new(); await brick.setMintRole(brickFactory.address); await brickFactory.updateExecutor(executor); await brickFactory.addTokenSupport(brick.address); await brick.setApprovalForAll(brickFactory.address, true); await brick.setMintRole(admin); }); it("should assemble gold bricks correctly", async () => { const startTime = new BN(Date.now() / 1000 | 0); const saltNonce = new BN((Math.random() * 1000) | 0); let signStr = web3.utils.soliditySha3.apply(this, [user, brick.address, brickFactory.address, startTime, saltNonce, ...ids]); let signature = await web3.eth.sign(signStr, executor); signature = signature.replace(/00$/, "1b").replace(/01$/, "1c"); await brick.setApprovalForAll(brickFactory.address, true, { from: user }); const receipt = await brickFactory.mintNft( brick.address, ids, startTime, saltNonce, signature, { from: user } ); const e = expectEvent(receipt, "TokenMinted", {}); for (let i = 0; i < ids.length; i++) { expect(e.args.ids[i]).to.be.bignumber.equal(ids[i]); } // Get the user's hero balance const userBrickBalance = await brick.balanceOf(user); expect(userBrickBalance).to.be.bignumber.equal(new BN(3)); }); it("should revert for expired", async () => { const startTime = new BN((Date.now() / 1000 - 60 * 60 * 24 * 2) | 0); const saltNonce = new BN((Math.random() * 1000) | 0); let signStr = web3.utils.soliditySha3.apply(this, [user, brick.address, brickFactory.address, startTime, saltNonce, ...ids]); let signature = await web3.eth.sign(signStr, executor); signature = signature.replace(/00$/, "1a").replace(/01$/, "1d"); await brick.setApprovalForAll(brickFactory.address, true, { from: user }); expectRevert( brickFactory.mintNft( brick.address, ids, startTime, saltNonce, signature, { from: user } ), "expired, please send another transaction with new signature"); }); it("should revert for invalied signature", async () => { const startTime = new BN(Date.now() / 1000 | 0); const saltNonce = new BN((Math.random() * 1000) | 0); let signStr = web3.utils.soliditySha3.apply(this, [user, brick.address, brickFactory.address, startTime, saltNonce, ...ids]); let signature = await web3.eth.sign(signStr, executor); signature = signature.replace(/00$/, "1a").replace(/01$/, "1d"); await brick.setApprovalForAll(brickFactory.address, true, { from: user }); expectRevert( brickFactory.mintNft( brick.address, ids, startTime, saltNonce, signature, { from: user } ), "ECDSA: invalid signature."); }); it("should revert for unsupported NFT", async () => { const startTime = new BN(Date.now() / 1000 | 0); const saltNonce = new BN((Math.random() * 1000) | 0); let signStr = web3.utils.soliditySha3.apply(this, [user, brick.address, brickFactory.address, startTime, saltNonce, ...ids]); let signature = await web3.eth.sign(signStr, executor); signature = signature.replace(/00$/, "1b").replace(/01$/, "1c"); await brick.setApprovalForAll(brickFactory.address, true, { from: user }); expectRevert( brickFactory.mintNft( '0x50A8e60041A206AcaA5F844a1104896224be6F39', ids, startTime, saltNonce, signature, { from: user } ), "GoldBricksFactory: Unsupported NFT"); }); it("should burn gold bricks correctly", async () => { const startTime = Date.now() / 1000 | 0; const saltNonce = (Math.random() * 1000) | 0; let signStr = web3.utils.soliditySha3.apply(this, [user, brick.address, brickFactory.address, startTime, saltNonce, ...ids]); let signature = await web3.eth.sign(signStr, executor); signature = signature.replace(/00$/, "1b").replace(/01$/, "1c"); await brick.setApprovalForAll(brickFactory.address, true, { from: user }); await brick.batchMint(user, ids, { from: admin }); const receipt = await brickFactory.decomposeNft( brick.address, ids, startTime, saltNonce, signature, { from: user } ); const e = expectEvent(receipt, "TokenDecomposed", {}); for (let i = 0; i < ids.length; i++) { expect(e.args.ids[i]).to.be.bignumber.equal(ids[i]); } const userBrickBalance = await brick.balanceOf(user); expect(userBrickBalance).to.be.bignumber.equal(new BN(0)); }); });