const EvolveProxy = artifacts.require("EvolveProxy"); const NFT = artifacts.require("NFT"); const { BN, constants, expectEvent, expectRevert, } = require("@openzeppelin/test-helpers"); const Web3 = require("web3"); contract("EvolveProxy", (accounts) => { let evolveProxy; let nft; const owner = accounts[0]; const user = accounts[1]; const executor = accounts[2]; let web3 = new Web3(Web3.givenProvider); beforeEach(async () => { nft = await NFT.new("CRYPTO ELITE'S HERO", "HERO", 0); evolveProxy = await EvolveProxy.new(nft.address); await nft.setMintRole(evolveProxy.address); }); it("should evolve the NFT when tokenIds[0] does not exist", async () => { const evolveEventId = "1"; const tokenIds = [new BN(1)]; const startTime = Date.now() / 1000 | 0; const saltNonce = (Math.random() * 1000) | 0; let signStr = web3.utils.soliditySha3.apply(this, [evolveEventId, user, startTime, saltNonce, ...tokenIds]); let signature = await web3.eth.sign(signStr, executor); signature = signature.replace(/00$/, "1b").replace(/01$/, "1c"); await evolveProxy.updateExecutor(executor, { from: owner }); const receipt = await evolveProxy.evolveNft( evolveEventId, tokenIds, startTime, saltNonce, signature, { from: user } ); // const tokenBNIds = tokenIds.map((id) => web3.utils.toBN(id)); // expectEvent(receipt, "TokenEvolved", { // evolveEventId, // owner: user, // tokenIds, // }); const ownerOfToken1 = await nft.ownerOf("1"); assert.equal(ownerOfToken1, user, "Token 1 ownership not transferred"); const balanceOfUser = await nft.balanceOf(user); assert.equal(balanceOfUser, 1, "Incorrect user balance"); }); it("should evolve the NFT and burn other tokens when tokenIds length is greater than 1", async () => { const evolveEventId = "2"; const tokenIds = ["1", "2", "3"]; const startTime = Date.now() / 1000 | 0; const saltNonce = (Math.random() * 1000) | 0; let signStr = web3.utils.soliditySha3.apply(this, [evolveEventId, user, startTime, saltNonce, ...tokenIds]); let signature = await web3.eth.sign(signStr, executor); signature = signature.replace(/00$/, "1b").replace(/01$/, "1c"); await evolveProxy.updateExecutor(executor, { from: owner }); await nft.batchMint(user, tokenIds, { from: owner }); await nft.approve(evolveProxy.address, "2", { from: user }); await nft.approve(evolveProxy.address, "3", { from: user }); await evolveProxy.evolveNft( evolveEventId, tokenIds, startTime, saltNonce, signature, { from: user } ); const ownerOfToken1 = await nft.ownerOf(1); assert.equal(ownerOfToken1, user, "Token 1 ownership not transferred"); const balanceOfUser = await nft.balanceOf(user); assert.equal(balanceOfUser, 1, "Incorrect user balance"); }); });