onchain-warfare / contracts

NFT contracts
0 stars 0 forks source link

Resolve Issues With Test We Contract #3

Open earth2travis opened 4 months ago

earth2travis commented 4 months ago

Deployed TestWe.sol ERC-721 contract and TestWe.t.sol to Base Sepolia in https://github.com/onchain-warfare/contracts/issues/1

Used the the Solidity Wizard to create a starter template to work from: https://github.com/onchain-warfare/contracts/issues/1#issuecomment-2189296844

Made a few minor changes to the starter template: https://github.com/onchain-warfare/contracts/issues/1#issuecomment-2189296879

Got the tests passing and the contract deployed and verified: https://sepolia.basescan.org/address/0x5324735Aa67FaE868C90795CBbAD9F78700664dD

Minted two test NFTs:

For the first one I used the metadata in the uri (string):

ipfs://QmYNsRQWtiC37rkf66gxPSvu4FRtFWp2kgMU9z2yi1HfPi (shall-we.json)

For the second on I used the image in the uri (string):

ipfs://QmSouB7L7mVsonRtp168ybpFkQThwmtZLeanjJ6uynY1bs (shall-we.png)

Of course the biggest issue is the images are not showing.

But here is a list of other things I would like to figure out:

Issues

earth2travis commented 4 months ago

Notes from Call With Dekan

Underscores are a naming convention for private variables.

Base URI should be the metadata.

Being able to input the URI when you Write Contract is good for testing. But you will probably want to specify it in your production contracts. It is typically restricted to a market contract. Or a server that has the private key and returns the URI. He used base 64 encoded metadata to avoid having to store the data. Browsers understand the encoded file.

If you got to Read Contract and input your token IDs into the tokenURI function:

You can see that it is concatenating two IPFS addresses. The second address is the one you are putting in when you Write Contract. The first one was when you input the metadata (shall-we.json) the second one was when you input the image (shall-we.png).

Need to figure out how to only return one address.

In the function tokenURI "super" calls the tokenURI function from the parent contracts. This overrides and integrates the functionality from ERC721.sol and ERC721URIStorage.sol.

In the ERC721.sol you import this is the tokenURI function:

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual returns (string memory) {
        _requireOwned(tokenId);

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string.concat(baseURI, tokenId.toString()) : "";
    }

Maybe remove token URI storage from SafeMint. Remove the "super" from tokenURI

change:

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

to:

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        require(ownerOf(tokenId)!=address(0), "No Owner");
        return _baseURI();
    }
earth2travis commented 4 months ago

In the tokenURI function:

change:

return super.tokenURI(tokenId);

to:

return ERC721URIStorage.tokenURI(tokenId);

To ensures that only the URL provided to ERC721URIStorage's tokenURI function is called to prevent concatenation issues.

Is the the URI from that is input with Write Contract? (Don't think that is the one we want)

earth2travis commented 4 months ago

Let's give it a shot:

forge test
[⠢] Compiling...
No files changed, compilation skipped

Ran 1 test for test/TestWe.t.sol:TestWeTest
[PASS] testSafeMint() (gas: 192663)
Suite result: ok. 1 passed; 0 failed; 0 skipped; finished in 20.41ms (3.34ms CPU time)

Ran 1 test suite in 561.66ms (20.41ms CPU time): 1 tests passed, 0 failed, 0 skipped (1 total tests)

Deploy

forge create src/TestWe.sol:TestWe \
--rpc-url https://sepolia.base.org \
--private-key <PRIVATE_KEY>
[⠒] Compiling...
No files changed, compilation skipped
Deployer: 0x1a75971C77957d26f8D81C29f9A2093f5F989Dd5
Deployed to: 0xfB91f1e21f06cb79889359bD5840a4737495B839
Transaction hash: 0x6df4adb0b08b13a55ab6052863b9765b891712d43bc8df03d168af0cd0d6875c

https://sepolia.basescan.org/address/0xfB91f1e21f06cb79889359bD5840a4737495B839

Verify

forge verify-contract 0xfB91f1e21f06cb79889359bD5840a4737495B839  \
TestWe \
--etherscan-api-key <ETHERSCAN_API_KEY> \
--verifier-url https://api-sepolia.basescan.org/api \
--watch
Start verifying contract `0xfB91f1e21f06cb79889359bD5840a4737495B839` deployed on mainnet

Submitting verification for [src/TestWe.sol:TestWe] 0xfB91f1e21f06cb79889359bD5840a4737495B839.
Submitted contract for verification:
        Response: `OK`
        GUID: `srgqa67t48uxdbhjshmd23xyezhxcexjfr6dfhkmiuqec3qumx`
        URL: https://etherscan.io/address/0xfb91f1e21f06cb79889359bd5840a4737495b839
Contract verification status:
Response: `NOTOK`
Details: `Pending in queue`
Contract verification status:
Response: `OK`
Details: `Pass - Verified`
Contract successfully verified

https://sepolia.basescan.org/address/0xfB91f1e21f06cb79889359bD5840a4737495B839

earth2travis commented 4 months ago

https://sepolia.basescan.org/address/0xfB91f1e21f06cb79889359bD5840a4737495B839

Add the image to uri (string): ipfs://QmcaHejVG4YvtqKABvhNcAEh14KiE5Fv4yYMwxR1aQ7Wdi

Image

Transaction

https://testnets.opensea.io/assets/base-sepolia/0xfb91f1e21f06cb79889359bd5840a4737495b839/0

Still concatenated:

Image

Gonna change:

return ERC721URIStorage.tokenURI(tokenId);

back to:

return super.tokenURI(tokenId);

And experiment with Dekan's idea

earth2travis commented 4 months ago

Maybe remove token URI storage from SafeMint. Remove the "super" from tokenURI

change:

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

to:

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        _requireOwned(tokenId);
        return _baseURI();
    }

change:

    function safeMint(address to, string memory uri) public {
        uint256 tokenId = _nextTokenId++;
        _safeMint(to, tokenId);
        _setTokenURI(tokenId, uri);
    }

to:

    function safeMint(address to) public {
        uint256 tokenId = _nextTokenId++;
        _safeMint(to, tokenId);
    }
earth2travis commented 4 months ago
Deployer: 0x1a75971C77957d26f8D81C29f9A2093f5F989Dd5
Deployed to: 0xDf3990Ac93658e7f3aC341EF7c3549a637B995Eb
Transaction hash: 0x78c6bc2780a9a0c572d22f129c5492bfb15a598e11b29cb6d0b7686f5a2cd69b
Contract verification status:
Response: `OK`
Details: `Pass - Verified`
Contract successfully verified

https://sepolia.basescan.org/address/0xDf3990Ac93658e7f3aC341EF7c3549a637B995Eb

earth2travis commented 4 months ago

Image

Transaction

Image

https://testnets.opensea.io/assets/base-sepolia/0xdf3990ac93658e7f3ac341ef7c3549a637b995eb/0

earth2travis commented 4 months ago

Add function allowing updates to the tokenURI so we can get metadata dialed in:

   function updateTokenURI(uint256 tokenId, string memory uri) public onlyOwner {
        _setTokenURI(tokenId, uri);
    }

Should make a decision about whether it is desirable to keep in?

Updated metadata and image

Deployer: 0x1a75971C77957d26f8D81C29f9A2093f5F989Dd5
Deployed to: 0x9ef73e41F3226e0C6795F0aE8D960a99138Ba294
Transaction hash: 0x8d02fdca81b0507ee1ed819a12023d3be0e0e3320714b59dc5ee630a5fcd2c54
Contract verification status:
Response: `OK`
Details: `Pass - Verified`
Contract successfully verified

https://sepolia.basescan.org/address/0x9ef73e41f3226e0c6795f0ae8d960a99138ba294

earth2travis commented 4 months ago

Transaction

https://testnets.opensea.io/assets/base-sepolia/0x9ef73e41f3226e0c6795f0ae8d960a99138ba294/0

So the metadata seems correct. Don't know why the image is not showing.

{
  "description": "Inaugural drop of WarFrames. A call to arms. A herald. A harbinger of onchain warfare. A key to future engagements. The question is simple. The answer lies with you.",
  "external_url": "https://warframes.wtf/",
  "image": "ipfs://QmZyxJKxjGsMYrvFQWgH8B2sFBZkGMT97T1GS4Yz5iwS91",
  "name": "Shall we play a frame?",
  "attributes": [
    {
      "trait_type": "Access",
      "value": "Restricted"
    },
    {
      "trait_type": "Engagement",
      "value": "Solo"
    },
    {
      "trait_type": "Mode",
      "value": "Real"
    }
  ]
}

Wonder what we could do to have some interesting mechanics and rarity built into the traits?

earth2travis commented 4 months ago

Maybe the image is not displaying is related to that function we added allowing updates to the tokenURI:

remove:

   function updateTokenURI(uint256 tokenId, string memory uri) public onlyOwner {
        _setTokenURI(tokenId, uri);
    }
[⠒] Compiling...
[⠰] Compiling 2 files with Solc 0.8.23
[⠒] Solc 0.8.23 finished in 4.43s
Compiler run successful!

Ran 1 test for test/TestWe.t.sol:TestWeTest
[PASS] testSafeMint() (gas: 120922)
Suite result: ok. 1 passed; 0 failed; 0 skipped; finished in 30.73ms (3.09ms CPU time)

Ran 1 test suite in 372.28ms (30.73ms CPU time): 1 tests passed, 0 failed, 0 skipped (1 total tests)
Deployer: 0x1a75971C77957d26f8D81C29f9A2093f5F989Dd5
Deployed to: 0x09B2dc2236dDe2BbD0E543d651Fd5C3d1C1c2A81
Transaction hash: 0x8e29a84a031b0aacb605313bd35f530c3885cd84b75b3502e12d8e2bfa05e319
Contract verification status:
Response: `OK`
Details: `Pass - Verified`
Contract successfully verified

https://sepolia.basescan.org/address/0x09b2dc2236dde2bbd0e543d651fd5c3d1c1c2a81

earth2travis commented 4 months ago

https://sepolia.basescan.org/address/0x09b2dc2236dde2bbd0e543d651fd5c3d1c1c2a81

Transaction

https://testnets.opensea.io/assets/base-sepolia/0x09b2dc2236dde2bbd0e543d651fd5c3d1c1c2a81/0

Image

earth2travis commented 4 months ago

Test Moar

Deploy

Deployer: 0x1a75971C77957d26f8D81C29f9A2093f5F989Dd5
Deployed to: 0x6a11e59A95a649934146107C917C81a17e72347A
Transaction hash: 0x86fb24f01d9d4372f387754be128b58240f30ebe11dceb44fd45947718eb2b47

Verify

Contract verification status:
Response: `OK`
Details: `Pass - Verified`
Contract successfully verified

Contract

https://sepolia.basescan.org/address/0x6a11e59a95a649934146107c917c81a17e72347a

Mint

https://sepolia.basescan.org/tx/0xcf735d79349ec3c46ca39b39e84d95c562dd959ea2364d447d3a7044a535379d

For some reason tokenURI is returning an IPFS has with a zero on the end:

ipfs://QmS3o2PYn5RA3kmDW1nXicrXeX8VmgzMaEnYoy9wwEHtAQ0

earth2travis commented 4 months ago

Test Moar Two

Deploy

Deployer: 0x1a75971C77957d26f8D81C29f9A2093f5F989Dd5
Deployed to: 0x42F8196D40C7A7fd5dE8C667E7D22743404b5C17
Transaction hash: 0x9adc69fd5c3b426d7e82e8d133e9e0f71fe9c215142452c3e47e1a5b1a089d38

Verify

Start verifying contract `0x42F8196D40C7A7fd5dE8C667E7D22743404b5C17` deployed on mainnet

Contract [src/TestMoar.sol:TestMoar] "0x42F8196D40C7A7fd5dE8C667E7D22743404b5C17" is already verified. Skipping verification.

Contract

https://sepolia.basescan.org/address/0x42F8196D40C7A7fd5dE8C667E7D22743404b5C17

Mint

https://sepolia.basescan.org/tx/0x7f225862e97a469ec7140f8a9b7c350dc3db01c70f6ae50eea2faafab80587d5

OpenSea

https://testnets.opensea.io/assets/base-sepolia/0x42f8196d40c7a7fd5de8c667e7d22743404b5c17/0

earth2travis commented 4 months ago

added:

    function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) {
        _requireOwned(tokenId);
        return _baseURI();
    }

Test Moar Three

Deploy

Deployer: 0x1a75971C77957d26f8D81C29f9A2093f5F989Dd5
Deployed to: 0x1bcB2C1055734c45249e40476E422473619c27D4
Transaction hash: 0x1e4a692d0629288fd740911ea42508cf9837e4696524fd73d64f401189f0a89b

Verify

Contract verification status:
Response: `OK`
Details: `Pass - Verified`
Contract successfully verified

Contract

https://sepolia.basescan.org/address/0x1bcB2C1055734c45249e40476E422473619c27D4

Mint

https://sepolia.basescan.org/tx/0x2a7331e4b6e738f8e643f81a1594e57ba164d813344f178e78657000678e5cf3

OpenSea

https://testnets.opensea.io/assets/base-sepolia/0x42f8196d40c7a7fd5de8c667e7d22743404b5c17/0

earth2travis commented 4 months ago

Went ham on the changes. Will try to remember what has been updated:

Deploy

Deployer: 0x1a75971C77957d26f8D81C29f9A2093f5F989Dd5
Deployed to: 0xA2ba1B3b3ef97f16afd661edB6c8Db81f2466919
Transaction hash: 0xce0f657206eccf668064797b4f5ebf9f7dc2598f378a17ed384b82f4a8d5b156

Verify

Contract verification status:
Response: `OK`
Details: `Pass - Verified`
Contract successfully verified

Contract

Mint

Image

https://sepolia.basescan.org/tx/0x0950246f5bcc225a18683aa142db1ce5ddb463dfdcca9480c907c1d6debb94a5

OpenSea

https://testnets.opensea.io/assets/base-sepolia/0xa2ba1b3b3ef97f16afd661edb6c8db81f2466919/0

Price worked but now we have some duplicate metadata:

Image

Gonna remove:

    /**
     * @dev Returns the contract URI for metadata.
     * @return The URI of the contract metadata.
     */
    function contractURI() external view returns (string memory) {
        return _contractURI;
    }
earth2travis commented 4 months ago

Deploy

Deployer: 0x1a75971C77957d26f8D81C29f9A2093f5F989Dd5
Deployed to: 0x0d5494349Cfb511fEb27b4606F898B3391aCFbBB
Transaction hash: 0xa80937874745caab1b594891a1436dc520163799d72b923263a905ce9b6bd8f1

Verify

Contract verification status:
Response: `OK`
Details: `Pass - Verified`
Contract successfully verified

Contract

https://sepolia.basescan.org/address/0x0d5494349Cfb511fEb27b4606F898B3391aCFbBB

Mint

https://sepolia.basescan.org/tx/0xb6e3d26cd084c9734d0cb1eb856ef167e8d5b8ff435d292daed1275d978877ae

OpenSea

https://testnets.opensea.io/assets/base-sepolia/0x0d5494349cfb511feb27b4606f898b3391acfbbb/0

earth2travis commented 4 months ago

Questions

When comparing this TestMaor contact with WarGamesOne. these are a few questions:

What do the setContractURI and contractURI() functions in WarGamesOne do? Should these be added to TestMoar or are they redundant?

setContractURI:

contractURI:

Use Case: If you need a metadata URI for the entire contract, adding these functions can be useful.

Redundancy: If your use case does not require a separate metadata URI for the contract (outside individual token URIs), these functions may be redundant.

What are the benefits of constructing a detailed metadata JSON string in tokenURI? Should this be added to TestMoar or is it redundant?

Benefits of Constructing Detailed Metadata JSON in tokenURI:

  1. Enhanced User Experience: Detailed metadata provides rich information about each NFT, including its name, description, image, and attributes, which enhances the presentation on NFT marketplaces like OpenSea.
  2. Interoperability: Standardized metadata allows for better compatibility with various platforms and applications that support NFTs.
  3. Custom Attributes: Including specific attributes (e.g., traits, properties) can add value and uniqueness to each NFT.
  4. Flexibility: Allows dynamic generation of metadata, enabling updates and additional features over time.

Add If:

Redundant If:

What is the totalSupply() function that returns the current token count using _tokenIdCounter. TestMoar is handling uint256 tokenId = _nextTokenId++; differently with safeMint. safeMintis the updated recommendation from OpenZeppelin. We can get totalSupply() with the ERC721Enumerable.sol contract https://docs.openzeppelin.com/contracts/5.x/api/token/erc721#IERC721Enumerable What is the most simple approach here?

This approach leverages the existing ERC721Enumerable functionality, making the code simpler and more robust.

earth2travis commented 4 months ago

Updated beneficiary to Gnosis Safe on Base Sepolia: 0x800337390b18494C0931eEb0c50D58e48032e14F

Changed the image and metadata. Want to deploy before making any other major changes.

Deploy

Deployer: 0x1a75971C77957d26f8D81C29f9A2093f5F989Dd5
Deployed to: 0xd8B759d2aC55770702c9630689CF30382574a66e
Transaction hash: 0xfa352f1fb0876f35ce008629f8af83bc5736e868301cc3e06ca2d4f86127334d

Verify

Contract verification status:
Response: `OK`
Details: `Pass - Verified`
Contract successfully verified

Contract

https://sepolia.basescan.org/address/0xd8B759d2aC55770702c9630689CF30382574a66e

Mint

https://sepolia.basescan.org/tx/0xb18a854bb5acf3d0f2164cd2ed9898a7bcd00f7aafee803fecec5159d61d4a7a

OpenSea

https://testnets.opensea.io/assets/base-sepolia/0xd8b759d2ac55770702c9630689cf30382574a66e/0

Image

earth2travis commented 4 months ago

Beneficiary is sending to the Gnosis Safe

Image

earth2travis commented 4 months ago

Added:

string private _contractURI = "ipfs://QmepDmnbK4anoddxtqEpXHaFQ4E7mj1WZQ7Kyfw4bPiGza";
    function contractURI() external view returns (string memory) {
        return _contractURI;
    }
    function setContractURI(string memory _newContractURI) public onlyOwner {
        _contractURI = _newContractURI;
    }

Deploy

Deployer: 0x1a75971C77957d26f8D81C29f9A2093f5F989Dd5
Deployed to: 0x5e2DA8A4a723e01eD613b687035DFA273b2cfce9
Transaction hash: 0x743f8846bdf249e4df554037444e2f44f4d6493d2a7812caa014f3f8cd803c07

Verify

Contract verification status:
Response: `OK`
Details: `Pass - Verified`
Contract successfully verified

Contract

https://sepolia.basescan.org/address/0x5e2DA8A4a723e01eD613b687035DFA273b2cfce9

Mint

https://sepolia.basescan.org/tx/0x64561d1a01733389e3a812b7957a7561c9b613250b36bbc4cdc12fa92a2804c1

OpenSea

https://testnets.opensea.io/assets/base-sepolia/0x5e2da8a4a723e01ed613b687035dfa273b2cfce9/0

Image

☝ with these changes the NFT is no longer pulling the first name from the constructor

earth2travis commented 4 months ago
import "../utils/base64.sol";

string private _imageURI = "ipfs://QmSKKfz9q8dLKKGwP7m9pWK49d6UU3fqJMoFgUSjZU3kop";

Added to tokenURI function:

        string memory description = "Name from string memory description";

        string memory metadata = string(
            abi.encodePacked(
                '{"name": "Name from string memory metadata #',
                Strings.toString(tokenId),
                '", "description": "',
                description,
                '", "image": "',
                _imageURI,
                '", "external_url": "https://warframes.wtf", "attributes":[{"trait_type": "Access", "value": "Restricted"}, {"trait_type": "Engagement", "value": "Solo"}, {"trait_type": "Mode", "value": "Real"}]}'
            )
        );

        return string(abi.encodePacked("data:application/json;base64,", Base64.encode(bytes(metadata))));

Deploy

Deployer: 0x1a75971C77957d26f8D81C29f9A2093f5F989Dd5
Deployed to: 0x7C262e42280170db0c061c588dD5EEbc1A366Ed9
Transaction hash: 0x7fd3e87073222f3004633afc57fc8d5a17b456c549a8d42e76d03edc76b93cc8

Verify

Contract verification status:
Response: `OK`
Details: `Pass - Verified`
Contract successfully verified

Contract

https://sepolia.basescan.org/address/0x7C262e42280170db0c061c588dD5EEbc1A366Ed9

Mint

https://sepolia.basescan.org/tx/0x6ea7d70eb1f45f750721946f0ba91a456e7751d19735ee559c95e04bfa21e4e2

OpenSea

https://testnets.opensea.io/assets/base-sepolia/0x5e2da8a4a723e01ed613b687035dfa273b2cfce9/0

Image

☝ think it is because I changed Strings.toString(_tokenId), to Strings.toString(tokenId),

Or maybe it is because I forgot import "@openzeppelin/contracts/utils/Strings.sol";

earth2travis commented 4 months ago

Added:

import "@openzeppelin/contracts/utils/Strings.sol";

Deploy

Deployer: 0x1a75971C77957d26f8D81C29f9A2093f5F989Dd5
Deployed to: 0xfc82312783CE6C30EaF55f985aA4f58BF2A588C7
Transaction hash: 0xe75c65e3516fcf0e3df7fcf93d9eacd3083a1113ce32ab6e8d7244beddc006df

Verify

Contract verification status:
Response: `OK`
Details: `Pass - Verified`
Contract successfully verified

Contract

https://sepolia.basescan.org/address/0xfc82312783CE6C30EaF55f985aA4f58BF2A588C7

Mint

https://sepolia.basescan.org/tx/0xd8b31e341244303f4b948163c76805a92c4e9a0e0d81bb60235c9ae53bcb12e6

OpenSea

https://testnets.opensea.io/assets/base-sepolia/0x5e2da8a4a723e01ed613b687035dfa273b2cfce9/0

Image

Gotta be from changing Strings.toString(_tokenId), to Strings.toString(tokenId),

Unfortunately, when I add the underscore

forge test
Compiler run failed:
Error (7576): Undeclared identifier. Did you mean "tokenId"?
   --> src/Testy.sol:121:34:
    |
121 |                 Strings.toString(_tokenId),
    |                                  ^^^^^^^^

Error: 
Compilation failed
earth2travis commented 4 months ago

Trying again with no underscore

Deploy

Deployer: 0x1a75971C77957d26f8D81C29f9A2093f5F989Dd5
Deployed to: 0x6CF1d18582d5B1208b4b1F25e286b1741EAF9549
Transaction hash: 0x1380bfb4060c2d702f003c1a61e2b813b26ce5d18a43a31d3688361b7c3fc291

Verify

Contract [src/Testy.sol:Testy] "0x6CF1d18582d5B1208b4b1F25e286b1741EAF9549" is already verified. Skipping verification.

Contract

https://sepolia.basescan.org/address/0x6CF1d18582d5B1208b4b1F25e286b1741EAF9549

Mint

https://sepolia.basescan.org/tx/0xc422cd3b2706cee868d10ecc03ee373fc4d2c2e79d2299aa391b61e224553876

OpenSea

https://testnets.opensea.io/assets/base-sepolia/0x6cf1d18582d5b1208b4b1f25e286b1741eaf9549/0

Holy shit!

Image

earth2travis commented 4 months ago

Need to test:

Image

earth2travis commented 4 months ago

Need to sort out these names and descriptions:

Image

Image

earth2travis commented 4 months ago

Updated some metadata (should have tested the function in the contract):

Deploy

Deployer: 0x1a75971C77957d26f8D81C29f9A2093f5F989Dd5
Deployed to: 0xcb7b0DC9b1f55b19e86889e981cc51697355d10c
Transaction hash: 0x1a34312349cd42bc47a380756dbadcdaf71dbbb671871150020c9f1575d025c6

Verify

Contract verification status:
Response: `OK`
Details: `Pass - Verified`
Contract successfully verified

Contract

https://sepolia.basescan.org/address/0xcb7b0DC9b1f55b19e86889e981cc51697355d10c

Mint

Getting a weird error that the "User denied transaction signature" in the contract response but the mints are going through

https://sepolia.basescan.org/tx/0xe3817f479a1e5d98c61d85c1daad2902d1c819857af7240de0881102456587c6

OpenSea

https://testnets.opensea.io/assets/base-sepolia/0xcb7b0dc9b1f55b19e86889e981cc51697355d10c/4

Image