becrypto/test/nftclaimer.test.js
2024-02-26 17:32:55 +08:00

181 lines
5.9 KiB
JavaScript

const NFTClaimer = artifacts.require("NFTClaimer");
const NFT = artifacts.require("BEBadgeV2");
const {
BN,
constants,
expectEvent,
expectRevert,
} = require("@openzeppelin/test-helpers");
contract("NFTClaimer", (accounts) => {
let tokenClaimer;
let nft;
const owner = accounts[0];
const user = accounts[1];
const singer = accounts[2];
const now = Date.now() / 1000 | 0;
const start = now - 3600;
const end = now + 3600;
beforeEach(async () => {
nft = await NFT.new("NFT", "NFT", 5);
tokenClaimer = await NFTClaimer.new();
await tokenClaimer.updateTokenSupport(nft.address, true);
await tokenClaimer.updateSigner(singer);
await tokenClaimer.updateStartTime(start);
await tokenClaimer.updateEndTime(end);
});
it("should cliam token", async () => {
const minterRole = await nft.MINTER_ROLE();
await nft.grantRole(minterRole, tokenClaimer.address);
const token = nft.address;
const chainId = await web3.eth.getChainId();
const address = tokenClaimer.address;
const startTime = Date.now() / 1000 | 0;
const saltNonce = (Math.random() * 1000) | 0;
let signStr = web3.utils.soliditySha3.apply(this,
[user, token, startTime, chainId, address, saltNonce]);
let signature = await web3.eth.sign(signStr, singer);
signature = signature.replace(/00$/, "1b").replace(/01$/, "1c");
const receipt = await tokenClaimer.claim(
token,
startTime,
saltNonce,
signature,
{ from: user }
);
const balanceOfUser = await nft.balanceOf(user);
assert.equal(balanceOfUser, 1, "Incorrect user balance");
});
it("should revert cliam token for error signature", async () => {
const minterRole = await nft.MINTER_ROLE();
await nft.grantRole(minterRole, tokenClaimer.address);
const token = nft.address;
const chainId = await web3.eth.getChainId();
const address = tokenClaimer.address;
const startTime = Date.now() / 1000 | 0;
const saltNonce = (Math.random() * 1000) | 0;
let signStr = web3.utils.soliditySha3.apply(this,
[user, token, startTime, chainId, address, saltNonce]);
let signature = await web3.eth.sign(signStr, singer);
signature = signature.replace(/00$/, "1b").replace(/01$/, "1c");
const receipt = await tokenClaimer.claim(
token,
startTime,
saltNonce,
signature,
{ from: user }
);
const err = `[BE] signature used. please send another transaction with new signature`
await expectRevert(
tokenClaimer.claim(
token,
startTime,
saltNonce,
signature,
{ from: user }
),
err
);
const balanceOfUser = await nft.balanceOf(user);
assert.equal(balanceOfUser, 1, "Incorrect user balance");
});
it("should revert cliam token for already claimed", async () => {
const minterRole = await nft.MINTER_ROLE();
await nft.grantRole(minterRole, tokenClaimer.address);
const token = nft.address;
const chainId = await web3.eth.getChainId();
const address = tokenClaimer.address;
const startTime = Date.now() / 1000 | 0;
const saltNonce = (Math.random() * 1000) | 0;
let signStr = web3.utils.soliditySha3.apply(this,
[user, token, startTime, chainId, address, saltNonce]);
let signature = await web3.eth.sign(signStr, singer);
signature = signature.replace(/00$/, "1b").replace(/01$/, "1c");
const receipt = await tokenClaimer.claim(
token,
startTime,
saltNonce,
signature,
{ from: user }
);
const startTime2 = Date.now() / 1000 | 0;
const saltNonce2 = (Math.random() * 1000) | 0;
let signStr2 = web3.utils.soliditySha3.apply(this,
[user, token, startTime2, chainId, address, saltNonce2]);
let signature2 = await web3.eth.sign(signStr2, singer);
signature2 = signature2.replace(/00$/, "1b").replace(/01$/, "1c");
const err = `NFTClaimer: already claimed`
await expectRevert(
tokenClaimer.claim(
token,
startTime2,
saltNonce2,
signature2,
{ from: user }
),
err
);
});
it("should revert cliam token for activity not begin", async () => {
const minterRole = await nft.MINTER_ROLE();
await tokenClaimer.updateStartTime(Date.now() / 1000 | 0 + 3600);
await nft.grantRole(minterRole, tokenClaimer.address);
const token = nft.address;
const chainId = await web3.eth.getChainId();
const address = tokenClaimer.address;
const startTime = Date.now() / 1000 | 0;
const saltNonce = (Math.random() * 1000) | 0;
let signStr = web3.utils.soliditySha3.apply(this,
[user, token, startTime, chainId, address, saltNonce]);
let signature = await web3.eth.sign(signStr, singer);
signature = signature.replace(/00$/, "1b").replace(/01$/, "1c");
const err = `NFTClaimer: not started`
await expectRevert(
tokenClaimer.claim(
token,
startTime,
saltNonce,
signature,
{ from: user }
),
err
);
});
it("should revert cliam token for activity already end", async () => {
const minterRole = await nft.MINTER_ROLE();
await tokenClaimer.updateEndTime((Date.now() / 1000 | 0) - 3600);
await nft.grantRole(minterRole, tokenClaimer.address);
const token = nft.address;
const chainId = await web3.eth.getChainId();
const address = tokenClaimer.address;
const startTime = Date.now() / 1000 | 0;
const saltNonce = (Math.random() * 1000) | 0;
let signStr = web3.utils.soliditySha3.apply(this,
[user, token, startTime, chainId, address, saltNonce]);
let signature = await web3.eth.sign(signStr, singer);
signature = signature.replace(/00$/, "1b").replace(/01$/, "1c");
const err = `NFTClaimer: already ended`
await expectRevert(
tokenClaimer.claim(
token,
startTime,
saltNonce,
signature,
{ from: user }
),
err
);
});
});