137 lines
5.0 KiB
JavaScript
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));
|
|
});
|
|
});
|