176 lines
5.7 KiB
JavaScript
176 lines
5.7 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(nft.address);
|
|
await tokenClaimer.updateSigner(singer);
|
|
await tokenClaimer.updateStartTime(start);
|
|
await tokenClaimer.updateEndTime(end);
|
|
});
|
|
|
|
it("should cliam token", async () => {
|
|
await nft.updateMinters(tokenClaimer.address, true);
|
|
const token = nft.address;
|
|
const chainId = await web3.eth.getChainId();
|
|
const address = tokenClaimer.address;
|
|
const saltNonce = (Math.random() * 1000) | 0;
|
|
let signStr = web3.utils.soliditySha3.apply(this,
|
|
[user, token, chainId, address, saltNonce]);
|
|
let signature = await web3.eth.sign(signStr, singer);
|
|
signature = signature.replace(/00$/, "1b").replace(/01$/, "1c");
|
|
|
|
const receipt = await tokenClaimer.claim(
|
|
saltNonce,
|
|
signature,
|
|
{ from: user }
|
|
);
|
|
|
|
const balanceOfUser = await nft.balanceOf(user);
|
|
assert.equal(balanceOfUser, 1, "Incorrect user balance");
|
|
});
|
|
it("should revert cliam token for no minter permission", async () => {
|
|
const token = nft.address;
|
|
const chainId = await web3.eth.getChainId();
|
|
const address = tokenClaimer.address;
|
|
const saltNonce = (Math.random() * 1000) | 0;
|
|
let signStr = web3.utils.soliditySha3.apply(this,
|
|
[user, token, chainId, address, saltNonce]);
|
|
let signature = await web3.eth.sign(signStr, singer);
|
|
signature = signature.replace(/00$/, "1b").replace(/01$/, "1c");
|
|
|
|
const err = `Address does not have the minter permission`
|
|
await expectRevert(
|
|
tokenClaimer.claim(
|
|
saltNonce,
|
|
signature,
|
|
{ from: user }
|
|
),
|
|
err
|
|
);
|
|
|
|
});
|
|
it("should revert cliam token for error signature", async () => {
|
|
await nft.updateMinters(tokenClaimer.address, true);
|
|
const token = nft.address;
|
|
const chainId = await web3.eth.getChainId();
|
|
const address = tokenClaimer.address;
|
|
const saltNonce = (Math.random() * 1000) | 0;
|
|
let signStr = web3.utils.soliditySha3.apply(this,
|
|
[user, token, chainId, address, saltNonce]);
|
|
let signature = await web3.eth.sign(signStr, singer);
|
|
signature = signature.replace(/00$/, "1b").replace(/01$/, "1c");
|
|
|
|
const receipt = await tokenClaimer.claim(
|
|
saltNonce,
|
|
signature,
|
|
{ from: user }
|
|
);
|
|
const err = `NFTClaimer: already claimed.`
|
|
await expectRevert(
|
|
tokenClaimer.claim(
|
|
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 () => {
|
|
await nft.updateMinters(tokenClaimer.address, true);
|
|
const token = nft.address;
|
|
const chainId = await web3.eth.getChainId();
|
|
const address = tokenClaimer.address;
|
|
const saltNonce = (Math.random() * 1000) | 0;
|
|
let signStr = web3.utils.soliditySha3.apply(this,
|
|
[user, token, chainId, address, saltNonce]);
|
|
let signature = await web3.eth.sign(signStr, singer);
|
|
signature = signature.replace(/00$/, "1b").replace(/01$/, "1c");
|
|
|
|
const receipt = await tokenClaimer.claim(
|
|
saltNonce,
|
|
signature,
|
|
{ from: user }
|
|
);
|
|
|
|
const saltNonce2 = (Math.random() * 1000) | 0;
|
|
let signStr2 = web3.utils.soliditySha3.apply(this,
|
|
[user, token, 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(
|
|
saltNonce2,
|
|
signature2,
|
|
{ from: user }
|
|
),
|
|
err
|
|
);
|
|
});
|
|
it("should revert cliam token for activity not begin", async () => {
|
|
await nft.updateMinters(tokenClaimer.address, true);
|
|
await tokenClaimer.updateStartTime(Date.now() / 1000 | 0 + 3600);
|
|
const token = nft.address;
|
|
const chainId = await web3.eth.getChainId();
|
|
const address = tokenClaimer.address;
|
|
const saltNonce = (Math.random() * 1000) | 0;
|
|
let signStr = web3.utils.soliditySha3.apply(this,
|
|
[user, token, 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(
|
|
saltNonce,
|
|
signature,
|
|
{ from: user }
|
|
),
|
|
err
|
|
);
|
|
});
|
|
it("should revert cliam token for activity already end", async () => {
|
|
await nft.updateMinters(tokenClaimer.address, true);
|
|
await tokenClaimer.updateEndTime((Date.now() / 1000 | 0) - 3600);
|
|
const token = nft.address;
|
|
const chainId = await web3.eth.getChainId();
|
|
const address = tokenClaimer.address;
|
|
const saltNonce = (Math.random() * 1000) | 0;
|
|
let signStr = web3.utils.soliditySha3.apply(this,
|
|
[user, token, 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(
|
|
saltNonce,
|
|
signature,
|
|
{ from: user }
|
|
),
|
|
err
|
|
);
|
|
});
|
|
}); |