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]; beforeEach(async () => { nft = await NFT.new("NFT", "NFT", 5); tokenClaimer = await NFTClaimer.new(); await tokenClaimer.updateTokenSupport(nft.address, true); await tokenClaimer.updateSigner(singer); }); 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 ); }); });