BasicERC721.ts 4.3 KB

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