BasicERC721.ts 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. import { expect } from "chai"
  2. import { ethers } from "hardhat"
  3. import { makeInterfaceId } from "@openzeppelin/test-helpers"
  4. import { loadFixture } from "@nomicfoundation/hardhat-toolbox/network-helpers"
  5. describe("BasicERC721", () => {
  6. const setupFixture = async () => {
  7. const signers = await ethers.getSigners()
  8. const name = "ProtoToken"
  9. const symbol = "PT"
  10. const baseURI = "ipfs://base-uri/"
  11. const contractURI = "ipfs://contract-uri"
  12. const owner = signers[0].address
  13. const BasicERC721 = await ethers.getContractFactory("BasicERC721")
  14. const contract = await BasicERC721.deploy(name, symbol, baseURI, contractURI, owner, {
  15. from: owner,
  16. })
  17. return {
  18. contract,
  19. contractAddress: await contract.getAddress(),
  20. deployer: owner,
  21. accounts: await ethers.getSigners(),
  22. contractConstructor: {
  23. name,
  24. symbol,
  25. baseURI,
  26. contractURI,
  27. owner,
  28. },
  29. }
  30. }
  31. it("Should Return Valid Contract Configurations Passed In Constructor", async () => {
  32. const { contractConstructor, contract } = await loadFixture(setupFixture)
  33. expect(await contract.name()).to.equal(contractConstructor.name)
  34. expect(await contract.symbol()).to.equal(contractConstructor.symbol)
  35. expect(await contract.contractURI()).to.equal(contractConstructor.contractURI)
  36. expect(await contract.owner()).to.equal(contractConstructor.owner)
  37. })
  38. describe("Minting Functionality", () => {
  39. it("Should Increase Total Supply When Minting", async () => {
  40. const { contract, deployer } = await loadFixture(setupFixture)
  41. expect(await contract.totalSupply()).to.equal(0)
  42. await contract.safeMint(deployer)
  43. await contract.safeMint(deployer)
  44. await contract.safeMint(deployer)
  45. expect(await contract.totalSupply()).to.equal(3)
  46. })
  47. it("Should Mint Tokens With Correct Token IDs", async () => {
  48. const { contract, accounts } = await loadFixture(setupFixture)
  49. await contract.safeMint(await accounts[0].getAddress())
  50. await contract.safeMint(await accounts[1].getAddress())
  51. await contract.safeMint(await accounts[2].getAddress())
  52. expect(await contract.ownerOf(1)).to.equal(await accounts[0].getAddress())
  53. expect(await contract.ownerOf(2)).to.equal(await accounts[1].getAddress())
  54. expect(await contract.ownerOf(3)).to.equal(await accounts[2].getAddress())
  55. })
  56. it("Should Allow Minting Only to Contract Owner", async () => {
  57. const { contract, accounts } = await loadFixture(setupFixture)
  58. await expect(contract.connect(accounts[1]).safeMint(await accounts[1].getAddress()))
  59. .to.be.revertedWithCustomError(contract, "OwnableUnauthorizedAccount")
  60. .withArgs(await accounts[1].getAddress())
  61. })
  62. })
  63. describe("Contract And Token Metadata", () => {
  64. it("Should Return Correct Token URI", async () => {
  65. const { contract, accounts, contractConstructor } = await loadFixture(setupFixture)
  66. await contract.safeMint(await accounts[0].getAddress())
  67. expect(await contract.tokenURI(1)).to.equal(`${contractConstructor.baseURI}1.json`)
  68. })
  69. it("Should Return Correct Token URI", async () => {
  70. const { contract } = await loadFixture(setupFixture)
  71. await expect(contract.tokenURI(1))
  72. .to.be.revertedWithCustomError(contract, "ERC721NonexistentToken")
  73. .withArgs(1)
  74. })
  75. it("Should Return Correct Contract URI", async () => {
  76. const { contract, contractConstructor } = await loadFixture(setupFixture)
  77. expect(await contract.contractURI()).to.equal(contractConstructor.contractURI)
  78. })
  79. })
  80. describe("InterfaceId", () => {
  81. it("Should Validate IERC721", async () => {
  82. const { contract } = await loadFixture(setupFixture)
  83. const erc721InterfaceId = makeInterfaceId.ERC165([
  84. "balanceOf(address)",
  85. "ownerOf(uint256)",
  86. "safeTransferFrom(address,address,uint256)",
  87. "transferFrom(address,address,uint256)",
  88. "approve(address,uint256)",
  89. "getApproved(uint256)",
  90. "setApprovalForAll(address,bool)",
  91. "isApprovedForAll(address,address)",
  92. "safeTransferFrom(address,address,uint256,bytes)",
  93. ])
  94. expect(await contract.supportsInterface(erc721InterfaceId)).to.equal(true)
  95. })
  96. it("Should Validate IERC721Enumerable", async () => {
  97. const { contract } = await loadFixture(setupFixture)
  98. const erc721EnumerableInterfaceId = makeInterfaceId.ERC165([
  99. "totalSupply()",
  100. "tokenOfOwnerByIndex(address,uint256)",
  101. "tokenByIndex(uint256)",
  102. ])
  103. expect(await contract.supportsInterface(erc721EnumerableInterfaceId)).to.equal(true)
  104. })
  105. })
  106. })