becrypto/test/evolve.test.js
2023-11-28 11:14:31 +08:00

89 lines
2.9 KiB
JavaScript

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