Skip to content

Conversation

@thaddeusdiamond
Copy link
Contributor

Add version 4 metadata support with 721-ERC-style mappings to NFT (222), FT (333) and RFT (444) standards, ensuring consistency across all asset classes.

Changes:

  • Add metadata_field union type supporting both direct and 721-map formats
  • Add RESERVE_KEYWORD_721_V4 marker for 721-style detection
  • Update retrieval steps to handle both metadata formats
  • Support version 4 in FT standard
  • Support version 3/4 in RFT standard
  • Add 721-style JSON example for NFT standard
  • Update pattern descriptions with asset_name terminology
  • Fix URI support to include [* bounded_bytes] for RFT

…tion#1112)

Add version 4 metadata support with 721-ERC-style mappings to NFT (222),
FT (333) and RFT (444) standards, ensuring consistency across
all asset classes.

Changes:
- Add metadata_field union type supporting both direct and 721-map formats
- Add __RESERVE_KEYWORD_721_V4__ marker for 721-style detection
- Update retrieval steps to handle both metadata formats
- Support version 4 in FT standard
- Support version 3/4 in RFT standard
- Add 721-style JSON example for NFT standard
- Update pattern descriptions with asset_name terminology
- Fix URI support to include [* bounded_bytes] for RFT
@thaddeusdiamond thaddeusdiamond changed the title CIP-0068 | Support multi-asset metadata a la CIP-0025 (#1111) CIP-0068 | Support multi-asset metadata a la CIP-0025 (#1112) Nov 2, 2025
@rphair
Copy link
Collaborator

rphair commented Nov 6, 2025

@thaddeusdiamond I was answering your comments by subject in alphabetical (not chronological) order, so I posted this response without seeing you've already done the proposed update:

I think these changes are consistent with your suggestion of a new best-practice approach, the editorial guidelines, and the requirements of CIP-0068... but we'll follow the related issue in case other feedback indicates that a different approach should be taken. In any case we'll tag this Triage so this can all be introduced at the next CIP meeting together (to include any review or resolutions in the meantime): https://hackmd.io/@cip-editors/123

@rphair rphair added Update Adds content or significantly reworks an existing proposal Category: Tokens Proposals belonging to the 'Tokens' category. State: Triage Applied to new PR afer editor cleanup on GitHub, pending CIP meeting introduction. labels Nov 6, 2025
@rphair rphair changed the title CIP-0068 | Support multi-asset metadata a la CIP-0025 (#1112) CIP-0068 | Support multi-asset metadata a la CIP-0025 Nov 25, 2025
@rphair
Copy link
Collaborator

rphair commented Nov 25, 2025

@thaddeusdiamond I'm recording this meeting resolution to leave this submission Unconfirmed due to a conversation that you & @Crypto2099 reportedly had about some unresolved details of implementing such a change... I'm not the best person to document this & in fact didn't catch all of it at the meeting, so I'll leave it to you & Adam to record the details here and/or discuss them in the "container" issue #1111.

@rphair rphair added State: Unconfirmed Triaged at meeting but not confirmed (or assigned CIP number) yet. and removed State: Triage Applied to new PR afer editor cleanup on GitHub, pending CIP meeting introduction. labels Nov 25, 2025
@thaddeusdiamond
Copy link
Contributor Author

I think @Crypto2099 was onboard as is since it's backwards compatible but he can comment here. Will close #1111

@rphair
Copy link
Collaborator

rphair commented Dec 6, 2025

@thaddeusdiamond we might not get @Crypto2099's participation on this issue... so if there are any review points you could record here about that conversation please do... otherwise we'll continue on with this without it.

If that's the case... @Ryun1 @perturbing if you can recall any other blocking issues to consider this a CIP candidate, perhaps you can post them here? Otherwise we might mark this as Confirmed and assign a CIP number at a CIP meeting in the near future (or by editor consensus outside the meeting). @thaddeusdiamond feel free to comment again if time goes by without you observing progress along either of these lines.

@SmaugPool
Copy link
Contributor

SmaugPool commented Dec 11, 2025

  1. I'm not sure to understand the proposal. As the reference token asset_name must match the user token one modulo the asset_name_label, and both should have the same policy, is the plan to have several reference tokens in the same tx output but one datum?

  2. In this case could you detail how much this saves if at all with examples? Because the additional reserved bool, 721 key, policy_id and asset_name take space that was not required before. So I'm not convinced by the gain compared to several tx outputs, each with its own datum.

  3. Using a different name label could be considered instead of adding a reserved bool and 721 key.

  4. Additionally I think some details about the metadata update process should be added. Should the datum be split when a single token needs to be updated?

  5. Overall please detail the aim of this proposal. What issue does it solve? I'm not sure consistency has been an issue, and the new format is still not fully consistent with CIP25 anyway (bytes instead of hex+utf8, additional extra field, etc.). Moreover FT and RFT (333,444) have slightly different metadata format than NFT 222 and CIP25. Therefore if there are consistency issues, could you show real world examples and show how this would solve them?

  6. Lastly a major benefit of CIP68 is that smart contracts (onchain validators) can read the metadata. Is this still possible with your proposal? Do scripts have access to all the data required to lookup the correct asset metadata in the datum? I think some plutus example would be needed to demonstrate it. Also the extra field, very often used by onchain scrips, is now the same for all reference tokens in this proposal as it is in the common part of the tx output, so how do this work?

@thaddeusdiamond
Copy link
Contributor Author

  1. I'm not sure to understand the proposal. As the reference token asset_name must match the user token one modulo the asset_name_label, and both should have the same policy, is the plan to have several reference tokens in the same tx output but one datum?

Correct that's the plan.

  1. In this case could you detail how much this saves if at all with examples? Because the additional reserved bool, 721 key, policy_id and asset_name take space that was not required before. So I'm not convinced by the gain compared to several tx outputs, each with its own datum.

I've calculated that several of my artists could get a roughly 75% reduction in minUTxO. For a multi-thousand art piece collection this is several hundred to several thousand dollars.

  1. Using a different name label could be considered instead of adding a reserved bool and 721 key.

The only problem with that is since the name is part of the reference token itself, you would have to "reprint" the reference tokens instead of making this at the datum level. But I'm open to suggestions.

  1. Additionally I think some details about the metadata update process should be added. Should the datum be split when a single token needs to be updated?

I would think this would be up to the dApp developer? So long as it conforms to the spec they can either "respend" the datum and rewrite every related token metadata, or they could split it overall.

  1. Overall please detail the aim of this proposal. What issue does it solve? I'm not sure consistency has been an issue, and the new format is still not fully consistent with CIP25 anyway (bytes instead of hex+utf8, additional extra field, etc.). Moreover FT and RFT (333,444) have slightly different metadata format than NFT 222 and CIP25. Therefore if there are consistency issues, could you show real world examples and show how this would solve them?

Consistency issues? This aims to be backwards-compatible with the existing data formats so I'm not sure I'm following. As for the rationale, I'll attach it to the bottom of this comment and you can let me know what/where you want it.

  1. Lastly a major benefit of CIP68 is that smart contracts (onchain validators) can read the metadata. Is this still possible with your proposal? Do scripts have access to all the data required to lookup the correct asset metadata in the datum? I think some plutus example would be needed to demonstrate it. Also the extra field, very often used by onchain scrips, is now the same for all reference tokens in this proposal as it is in the common part of the tx output, so how do this work?

Yes there is no change to SC usage. Since the datum is just "larger" the contract may be slightly more complex, but there is no structural change. This is more on the dApp or SC developer to interpret the datum in a new way. Not sure about extra field but existing dApps can continue as is IMO. This is an optional optimization.


Rationale for Introducing Optional CIP-0025-Compatible Metadata Within CIP-0068

The current design of CIP-0068 inadvertently creates a significant cost barrier for large NFT collections due to minimum-ADA requirements. As ADA approaches parity with USD, artists and platforms minting 5,000–10,000+ on-chain assets are increasingly impacted by the minUTxO amplification effect: the metadata-bearing reference scripts and datums mandated by CIP-0068 can cause 10–20% of project budgets to be consumed purely by ADA locked in outputs, rather than by art production or ecosystem growth.

This cost profile wasn’t as visible when ADA was significantly cheaper, but it has now become an operational friction point across multiple creator workflows.

The proposal aims to reduce the minUTxO footprint for CIP-0068 assets by allowing an optional alternate metadata shape that mirrors CIP-0025 (721-style metadata) while preserving CIP-0068’s semantics. Concretely:

1. Dual-format Metadata Reduces Unnecessary ADA Locking

Allowing a CIP-0025-shaped metadata payload means:

  • The on-chain can consolidate across multiple reference tokens.
  • The minUTxO requirement is correspondingly reduced.
  • Large-scale mints return to economically sensible territory, especially for low-cost or promotional collections where the metadata weight provides no additional value to creators.

This addresses a real-world pain point reported by multiple production-level minting pipelines, not just isolated cases.

2. Improved Migration Path from CIP-0025 to CIP-0068

A sizeable portion of the ecosystem still lives on CIP-0025, particularly older marketplaces and archived collections. When artists revisit or reissue older collections, the transition path to CIP-0068 is currently friction-heavy, requiring metadata restructuring and toolchain updates.

Supporting a CIP-0025-compatible metadata envelope inside CIP-0068:

  • Enables forward migration without metadata rewrites.
  • Preserves backward recognizability.
  • Reduces engineering cost for wallets, indexers, and minting tools.

3. Strict Optionality Preserves Backward Compatibility

This proposal does not modify or deprecate existing CIP-0068 patterns.
Instead, it introduces an explicitly flagged alternate metadata payload, using a reserved binary key or indicator to avoid collisions with existing fields.

This allows:

  • Full backward compatibility.
  • No disruptive changes for current indexers or marketplaces.
  • Opt-in use where economic relief is necessary.

Why a CIP-0068 Version Bump May Be Preferable to a New CIP

Although this change is cross-cutting, it:

  • Modifies an existing standard rather than creating a new conceptual primitive.
  • Maintains the same reference-NFT architecture, same minting semantics, same high-level goals.
  • Represents an evolution, not a parallel track.

A versioned update (e.g., v5) avoids fracturing standards, while still being explicit enough for tooling authors and indexers to adopt cleanly.

@SmaugPool
Copy link
Contributor

Thanks. A lot of the confusion came from the fact that you previously didn't introduce the MinUTXO issue at all in your proposal. The introduction was:

Add version 4 metadata support with 721-ERC-style mappings to NFT (222), FT (333) and RFT (444) standards, ensuring consistency across all asset classes.

Which is why I thought it was about consistency. So it looked like it was trying to solve some metadata issues, but it actually tries to solve some cost and locked ADA issues. This is therefore a work-around for the current value of MinUTXO, quite unrelated to metadata formats.

Overall I think comparing to CIP25 is very confusing, and even more "721-ERC". This has almost nothing to do with CIP25:

  • it uses a user token and a reference token
  • it uses name labels
  • encoding is very different (bytes everywhere)
  • it uses datum instead of metadata
  • it has an extra field for scripts
  • it supports 333 and 444 metadata format which is closer to cip26 token registry format than CIP25
  • etc.

The only common thing with CIP25 that you introduce is the "policy_id -> asset_name" mapping. The 222/333/444 metadata is then not encoded like CIP25. So given all these differences, I don't think it particularly helps migrating to CIP68. This might instead introduce a lot of errors like in CIP25 v2, where users use strings instead of bytes or mix both versions.

Therefore in my opinion this proposal should be introduced without talking about CIP25 at all, but instead just introduce the aim of supporting multiple assets per tx_output and datum.

I will add other note in changes comments.

This is either:

1. A low-level direct representation of the metadata, following closely the structure of CIP-0025
2. A 721-ERC-style token mapping exactly matching the structure of CIP-0025
Copy link
Contributor

@SmaugPool SmaugPool Dec 11, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is confusing. Why referencing 721-ERC-style here? What does this mean? This is an Ethereum standard and it is not referenced anywhere. The only link with CIP25 is the 721 metadata label.

Also "mapping exactly matching the structure of CIP-0025" is also confusing. I think you are only talking about the policy_id -> asset_name mapping? The rest is different (222/333/444, bytes instead of strings, etc.). Also only CIP25v2 use bytes as keys in the mapping.

Note that "following closely the structure of CIP-0025" was about the individual asset metadata (name, image, files, etc.). Whereas you seem to talk about its encapsulation in policy_id -> asset_name maps.

}
}
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not some valid CDDL. It looks like you are confusing CDDL with JSON.
More importantly, this does not tell how the policy_id and asset_name keys are encoded (I guess byte encoding like CIP25v2 and all CIP68 fields?).

Overall we should avoid talking about JSON as metadata and datum are CBOR encoded and CBOR -> JSON is not directly bijective. This only leads to confusion.

Note that JSON in CIP68 is only discussed in examples and even this is slightly questionable in my opinion.

}
```

Example datum as JSON (721-style):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again what "721-style" means?

{
__RESERVE_KEYWORD_721_V4__ : bool, ; Long name to avoid conflict
"721":
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the point of having __RESERVE_KEYWORD_721_V4__ bool here? Wouldn't the presence of "721" key be enough?

}
}
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again not valid CDDL

}
}
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again not valid CDDL


#### version 4

- Add backwards-compatible support for multi-asset 721-ERC-style metadata mappings
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"Backwards-compatible" with what exactly?
And again "721-ERC-style" is not clear. There is no ERC on Cardano.

@SmaugPool
Copy link
Contributor

SmaugPool commented Dec 11, 2025

The only problem with that is since the name is part of the reference token itself, you would have to "reprint" the reference tokens instead of making this at the datum level. But I'm open to suggestions.

I meant introducing a new label instead of reusing 222/333/444. Without doing this, this not fully backward compatible because a current indexer will not expect a version 4. So some new CIP68 token minted as a single asset but with version 4 will be ignored or rejected by such tools.

I don't understand what you mean by "you would have to "reprint" the reference tokens".

@SmaugPool
Copy link
Contributor

I would think this would be up to the dApp developer? So long as it conforms to the spec they can either "respend" the datum and rewrite every related token metadata, or they could split it overall.

I'm not sure there is any choice: assuming there are n tokens in a single tx output with their metadata in the output datum. To update only one of the tokens metadata, you will have to spend all of them, at least as change, but CIP68 metadata lookup is described as:

Construct reference NFT from user token
Look up reference NFT and find the output it's locked in.
Get the datum from the output and lookup metadata by going into the first field of constructor 0.

Note that the lookup only looks at the unspent output (not a previous output). Therefore you will have to rewrite the metadata of all tokens in a datum, hence it makes no sense to split them, it would be even costlier.

@thaddeusdiamond
Copy link
Contributor Author

I would think this would be up to the dApp developer? So long as it conforms to the spec they can either "respend" the datum and rewrite every related token metadata, or they could split it overall.

I'm not sure there is any choice: assuming there are n tokens in a single tx output with their metadata in the output datum. To update only one of the tokens metadata, you will have to spend all of them, at least as change, but CIP68 metadata lookup is described as:

Construct reference NFT from user token
Look up reference NFT and find the output it's locked in.
Get the datum from the output and lookup metadata by going into the first field of constructor 0.

Note that the lookup only looks at the unspent output (not a previous output). Therefore you will have to rewrite the metadata of all tokens in a datum, hence it makes no sense to split them, it would be even costlier.

Makes sense. So rewrite it then makes sense to me.

@SmaugPool
Copy link
Contributor

SmaugPool commented Dec 11, 2025

I would think this would be up to the dApp developer? So long as it conforms to the spec they can either "respend" the datum and rewrite every related token metadata, or they could split it overall.

I'm not sure there is any choice: assuming there are n tokens in a single tx output with their metadata in the output datum. To update only one of the tokens metadata, you will have to spend all of them, at least as change, but CIP68 metadata lookup is described as:

Construct reference NFT from user token
Look up reference NFT and find the output it's locked in.
Get the datum from the output and lookup metadata by going into the first field of constructor 0.

Note that the lookup only looks at the unspent output (not a previous output). Therefore you will have to rewrite the metadata of all tokens in a datum, hence it makes no sense to split them, it would be even costlier.

Makes sense. So rewrite it then makes sense to me.

This is quite a significant drawback compared to current CIP68 and even CIP25 (as only one of the tokens can be minted again to update its metadata), so maybe it's worth thinking more about it to avoid introducing a new flaw?

@thaddeusdiamond
Copy link
Contributor Author

I would think this would be up to the dApp developer? So long as it conforms to the spec they can either "respend" the datum and rewrite every related token metadata, or they could split it overall.

I'm not sure there is any choice: assuming there are n tokens in a single tx output with their metadata in the output datum. To update only one of the tokens metadata, you will have to spend all of them, at least as change, but CIP68 metadata lookup is described as:

Construct reference NFT from user token
Look up reference NFT and find the output it's locked in.
Get the datum from the output and lookup metadata by going into the first field of constructor 0.

Note that the lookup only looks at the unspent output (not a previous output). Therefore you will have to rewrite the metadata of all tokens in a datum, hence it makes no sense to split them, it would be even costlier.

Makes sense. So rewrite it then makes sense to me.

This is quite a significant drawback compared to current CIP68 and even CIP25 (as only one of the tokens can be minted again to update its metadata), so maybe it's worth thinking more about it to avoid introducing a new flaw?

If it's an optional capability what's the drawback? I don't know how to solve the minUTxO problem without consolidating the NFT metadata.

To give a specific example: one of the artists I am minting for has taken roughly 10,000 ADA in project funds and the locked minUTxO is over 1,000 ADA. So that's 10% of his total funds that are locked and can't contribute to his product development.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Category: Tokens Proposals belonging to the 'Tokens' category. State: Unconfirmed Triaged at meeting but not confirmed (or assigned CIP number) yet. Update Adds content or significantly reworks an existing proposal

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants