setTokenURI on erc721

I’m the owner of a ERC721 contract, but setTokenURI transactions for token #1 (got 25 total that got the same media with manifold) are reverting. Please confirm if metadata is immutable, the contract is paused, or if there are any restrictions or additional requirements for setTokenURI.

Hi - Just trying to understand what you’re trying to do. You’re looking to update the metadata for token 1 of your contract out of the 25 that have been minted?

Contracts are immutable, but for tokens, its possible for an artist to update the metadata of a token. This is typically used for more performance art style tokens where the metadata can change over time.

yeah thats exactly what i try to do. my collection has 25 tokens wich all hold the same metadata/media. i was googling for a way to change token 1 to image 1 token 2 to image 2 etc. and found the setTokenURI way. when i try write to the contract every txn fails

Do you have a transaction you can provide us? Can look into this

Are you doing this on etherscan? There is no reason you would not be able to call setTokenURI unless you are calling it incorrectly, or from a wallet that is not the admin.

Was this minted as a series? If that’s the case you have to use the extension to update it. In which case I suggest using the UX itself.

https://basescan.org/tx/0xab6cc44f81026bbc7c89fe5911c2d426f7a8cac1ab105de7c96c166ee71a8b08

you mean i can do this from manifold? when i went into manifold i saw i could edit the media but that would change it for all 25 tokens. i want to change them 1 by 1

1 Like

howdy! so this is just a UX limitation but not a contract limitation. this made us realize we need to add the feature of being able to swap between identical and non-identical series at will. if you’d like to try and figure out the contract calls, you’ll need to use this contract on base scan to do it:

https://basescan.org/address/0x76Da6eB8C7bA072937E917286D3a23Dc7cCbed99#writeContract

you’ll see the “setTokenURI” function in write. it requires attaching many more parameters than usual but if you’re adventurous you can figure it out! One thing to be wary of is that it expects a URL that leads to a folder of metadata JSON files on arweave, not just a single metadata JSON file.

cheers! will report back when we have the UX side figure out for you.

1 Like

thnx for the follow up! im afraid ill have to wait then. whatever i tried ended up in getting failed:
ransaction has been reverted by the EVM: { “blockHash”: “0x259cdb1de54d08c44375b83474893c90b0267547b733700ffe2a5ccf77e77dc9”, “blockNumber”: 27124179, “contractAddress”: null, “cumulativeGasUsed”: 12758998, “effectiveGasPrice”: 4160908, “from”: “0x9526ea46cf9e8df7f55886d9672adc973db12e02”, “gasUsed”: 24246, “l1BaseFeeScalar”: “0x8dd”, “l1BlobBaseFee”: “0x5222bb66”, “l1BlobBaseFeeScalar”: “0x101c12”, “l1Fee”: “0x346d1a1c64”, “l1GasPrice”: “0x4f1cff80”, “l1GasUsed”: “0x95c”, “logsBloom”: “0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000”, “status”: false, “to”: “0x76da6eb8c7ba072937e917286d3a23dc7ccbed99”, “transactionHash”: “0x15a982c9557ba20d1ef4fd7931aa3af25c90ff63ad87d40b39e9a56522bbbb54”, “transactionIndex”: 41, “type”: “0x2”, “events”: {} }

got it working! had to change the instanceid

1 Like

you are an absolute beast, well done. i’ll make this into an FAQ guide soon!!!

1 Like

what exactly is the instance ID here? im having the same issue

i’m having the same issue here https://basescan.org/tx/0x1f69bc33917f36832e04c8cd7c5608482a2fac89cfdd9e1eebec89fc57ed390e. unable to call setTokenUri after minting

hiya. you’ll want to set the token URI on the extension that actually minted the token, the extension overrides the base behavior of the core creator contract.

Screenshot 2025-05-19 at 4.27.58 PM

So do the setting on the extension contract which controls the token URI here.

https://basescan.org/address/0x76Da6eB8C7bA072937E917286D3a23Dc7cCbed99#writeContract

Screenshot 2025-05-19 at 4.28.45 PM

creator core = the normal contract address you deployed (in your situation it’s 0x55Ec0C976856cd4767Ab16d661AbB964b2B99021)

instance id = you can find this in the summary for your batch mint via Manifold Studio. if ya cant find it send a screenshot and let me know.

storage protocol (requires a little explanation) refers to the type of content you have put in the location field:

  • 0 is the invalid value, dont use this
  • 1 means you are providing full URLs like “https://www.something.com
  • 2 means you are providing arweave hashes that we will concatenate into arweave.net URLs (like WjfMBcs9xWaxuhrENPlRZBzPkTvDJrL3KhnVwzuibTs)
  • 3 is the same as two but for IPFS hashes

location: the URL, the arweave hash, or the IPFS hash (see storage protocol)


Just for FYI the reason we do it this way is to save on gas costs for you as the creator. The extension allows us to do a batch all at once and save you money. But it does mean that updates are a little more complex than raw mints from the core contract.

1 Like

I can’t find the instance IDs in the batch summary (see screenshot below). Also, why is it instanceID and not token ID? I can’t update the URI on a token individually?