becrypto/test/goldbricks.test.js
2023-12-26 14:12:04 +08:00

137 lines
5.0 KiB
JavaScript

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