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