123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- import { expect } from "chai"
- import { ethers } from "hardhat"
- import { makeInterfaceId } from "@openzeppelin/test-helpers"
- import { loadFixture } from "@nomicfoundation/hardhat-toolbox/network-helpers"
- describe("BasicERC721", () => {
- const setupFixture = async () => {
- const signers = await ethers.getSigners()
- const name = "ProtoToken"
- const symbol = "PT"
- const baseURI = "ipfs://base-uri/"
- const contractURI = "ipfs://contract-uri"
- const owner = signers[0].address
- const BasicERC721 = await ethers.getContractFactory("BasicERC721")
- const contract = await BasicERC721.deploy(name, symbol, baseURI, contractURI, owner, {
- from: owner,
- })
- return {
- contract,
- contractAddress: await contract.getAddress(),
- deployer: owner,
- accounts: await ethers.getSigners(),
- contractConstructor: {
- name,
- symbol,
- baseURI,
- contractURI,
- owner,
- },
- }
- }
- it("Should Return Valid Contract Configurations Passed In Constructor", async () => {
- const { contractConstructor, contract } = await loadFixture(setupFixture)
- expect(await contract.name()).to.equal(contractConstructor.name)
- expect(await contract.symbol()).to.equal(contractConstructor.symbol)
- expect(await contract.contractURI()).to.equal(contractConstructor.contractURI)
- expect(await contract.owner()).to.equal(contractConstructor.owner)
- })
- describe("Minting Functionality", () => {
- it("Should Increase Total Supply When Minting", async () => {
- const { contract, deployer } = await loadFixture(setupFixture)
- expect(await contract.totalSupply()).to.equal(0)
- await contract.safeMint(deployer)
- await contract.safeMint(deployer)
- await contract.safeMint(deployer)
- expect(await contract.totalSupply()).to.equal(3)
- })
- it("Should Mint Tokens With Correct Token IDs", async () => {
- const { contract, accounts } = await loadFixture(setupFixture)
- await contract.safeMint(await accounts[0].getAddress())
- await contract.safeMint(await accounts[1].getAddress())
- await contract.safeMint(await accounts[2].getAddress())
- expect(await contract.ownerOf(1)).to.equal(await accounts[0].getAddress())
- expect(await contract.ownerOf(2)).to.equal(await accounts[1].getAddress())
- expect(await contract.ownerOf(3)).to.equal(await accounts[2].getAddress())
- })
- it("Should Allow Minting Only to Contract Owner", async () => {
- const { contract, accounts } = await loadFixture(setupFixture)
- await expect(contract.connect(accounts[1]).safeMint(await accounts[1].getAddress()))
- .to.be.revertedWithCustomError(contract, "OwnableUnauthorizedAccount")
- .withArgs(await accounts[1].getAddress())
- })
- })
- describe("Contract And Token Metadata", () => {
- it("Should Return Correct Token URI", async () => {
- const { contract, accounts, contractConstructor } = await loadFixture(setupFixture)
- await contract.safeMint(await accounts[0].getAddress())
- expect(await contract.tokenURI(1)).to.equal(`${contractConstructor.baseURI}1.json`)
- })
- it("Should Return Correct Token URI", async () => {
- const { contract } = await loadFixture(setupFixture)
- await expect(contract.tokenURI(1))
- .to.be.revertedWithCustomError(contract, "ERC721NonexistentToken")
- .withArgs(1)
- })
- it("Should Return Correct Contract URI", async () => {
- const { contract, contractConstructor } = await loadFixture(setupFixture)
- expect(await contract.contractURI()).to.equal(contractConstructor.contractURI)
- })
- })
- describe("InterfaceId", () => {
- it("Should Validate IERC721", async () => {
- const { contract } = await loadFixture(setupFixture)
- const erc721InterfaceId = makeInterfaceId.ERC165([
- "balanceOf(address)",
- "ownerOf(uint256)",
- "safeTransferFrom(address,address,uint256)",
- "transferFrom(address,address,uint256)",
- "approve(address,uint256)",
- "getApproved(uint256)",
- "setApprovalForAll(address,bool)",
- "isApprovedForAll(address,address)",
- "safeTransferFrom(address,address,uint256,bytes)",
- ])
- expect(await contract.supportsInterface(erc721InterfaceId)).to.equal(true)
- })
- it("Should Validate IERC721Enumerable", async () => {
- const { contract } = await loadFixture(setupFixture)
- const erc721EnumerableInterfaceId = makeInterfaceId.ERC165([
- "totalSupply()",
- "tokenOfOwnerByIndex(address,uint256)",
- "tokenByIndex(uint256)",
- ])
- expect(await contract.supportsInterface(erc721EnumerableInterfaceId)).to.equal(true)
- })
- })
- })
|