forked from ProjectOpenSea/seadrop
-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathERC721SeaDropBurnable.spec.ts
123 lines (101 loc) · 3.93 KB
/
ERC721SeaDropBurnable.spec.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import { expect } from "chai";
import { ethers, network } from "hardhat";
import { randomHex } from "./utils/encoding";
import { faucet } from "./utils/faucet";
import { VERSION } from "./utils/helpers";
import { whileImpersonating } from "./utils/impersonate";
import type { ERC721SeaDropBurnable, ISeaDrop } from "../typechain-types";
import type { Wallet } from "ethers";
describe(`ERC721SeaDropBurnable (v${VERSION})`, function () {
const { provider } = ethers;
let seadrop: ISeaDrop;
let token: ERC721SeaDropBurnable;
let owner: Wallet;
let creator: Wallet;
let minter: Wallet;
let approved: Wallet;
after(async () => {
await network.provider.request({
method: "hardhat_reset",
});
});
before(async () => {
// Set the wallets
owner = new ethers.Wallet(randomHex(32), provider);
creator = new ethers.Wallet(randomHex(32), provider);
minter = new ethers.Wallet(randomHex(32), provider);
approved = new ethers.Wallet(randomHex(32), provider);
// Add eth to wallets
for (const wallet of [owner, minter, creator, approved]) {
await faucet(wallet.address, provider);
}
// Deploy SeaDrop
const SeaDrop = await ethers.getContractFactory("SeaDrop", owner);
seadrop = await SeaDrop.deploy();
});
beforeEach(async () => {
// Deploy token
const ERC721SeaDropBurnable = await ethers.getContractFactory(
"ERC721SeaDropBurnable",
owner
);
token = await ERC721SeaDropBurnable.deploy("", "", [seadrop.address]);
});
it("Should only let the token owner burn their own token", async () => {
await token.setMaxSupply(3);
// Mint three tokens to the minter.
await whileImpersonating(
seadrop.address,
provider,
async (impersonatedSigner) => {
await token.connect(impersonatedSigner).mintSeaDrop(minter.address, 3);
}
);
expect(await token.ownerOf(1)).to.equal(minter.address);
expect(await token.ownerOf(2)).to.equal(minter.address);
expect(await token.ownerOf(3)).to.equal(minter.address);
expect(await token.totalSupply()).to.equal(3);
// Only the owner or approved of the minted token should be able to burn it.
await expect(token.connect(owner).burn(1)).to.be.revertedWith(
"TransferCallerNotOwnerNorApproved()"
);
await expect(token.connect(approved).burn(1)).to.be.revertedWith(
"TransferCallerNotOwnerNorApproved()"
);
await expect(token.connect(approved).burn(2)).to.be.revertedWith(
"TransferCallerNotOwnerNorApproved()"
);
await expect(token.connect(owner).burn(3)).to.be.revertedWith(
"TransferCallerNotOwnerNorApproved()"
);
expect(await token.ownerOf(1)).to.equal(minter.address);
expect(await token.ownerOf(2)).to.equal(minter.address);
expect(await token.ownerOf(3)).to.equal(minter.address);
expect(await token.totalSupply()).to.equal(3);
await token.connect(minter).burn(1);
expect(await token.totalSupply()).to.equal(2);
await token.connect(minter).setApprovalForAll(approved.address, true);
await token.connect(approved).burn(2);
expect(await token.totalSupply()).to.equal(1);
await token.connect(minter).setApprovalForAll(approved.address, false);
await expect(token.connect(approved).burn(3)).to.be.revertedWith(
"TransferCallerNotOwnerNorApproved()"
);
await token.connect(minter).approve(owner.address, 3);
await token.connect(owner).burn(3);
expect(await token.totalSupply()).to.equal(0);
await expect(token.ownerOf(1)).to.be.revertedWith(
"OwnerQueryForNonexistentToken()"
);
await expect(token.ownerOf(2)).to.be.revertedWith(
"OwnerQueryForNonexistentToken()"
);
expect(await token.totalSupply()).to.equal(0);
// Should not be able to burn a nonexistent token.
for (const tokenId of [0, 1, 2, 3]) {
await expect(token.connect(minter).burn(tokenId)).to.be.revertedWith(
"OwnerQueryForNonexistentToken()"
);
}
});
});