Skip to content

CIP-0068 | Support multi-asset metadata a la CIP-0025#1112

Open
thaddeusdiamond wants to merge 3 commits intocardano-foundation:masterfrom
thaddeusdiamond:master
Open

CIP-0068 | Support multi-asset metadata a la CIP-0025#1112
thaddeusdiamond wants to merge 3 commits intocardano-foundation:masterfrom
thaddeusdiamond:master

Conversation

@thaddeusdiamond
Copy link
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

You're absolutely right. I've removed the "721-ERC-style" terminology and clarified that:

  • Option 1 refers to the direct metadata format with individual asset metadata fields (name, image, files, etc.) following CIP-0025's structure
  • Option 2 refers to CIP-0025's nested map organization with policy_id -> asset_name keys, where the outer map contains a "721" key

The clarification now distinguishes between the individual metadata structure (which CIP-0025 defines) and the encapsulation structure (the policy_id -> asset_name mapping that CIP-0025 uses).

}
}
}

Copy link
Copy Markdown
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.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Fixed. The CDDL now properly uses bounded_bytes for all keys:

  • "721" key is encoded as bounded_bytes (UTF-8 bytes: 0x373231)
  • policy_id keys are bounded_bytes (as in CIP-0025 version 2)
  • asset_name keys are bounded_bytes (as in CIP-0025 version 2)

This matches CIP-0025 version 2 conventions where keys are byte-encoded rather than text strings.

}
```

Example datum as JSON (721-style):
Copy link
Copy Markdown
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?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Changed to "nested map format" to be consistent with the terminology used throughout the document and avoid the ambiguous "721-style" reference.

{
__RESERVE_KEYWORD_721_V4__ : bool, ; Long name to avoid conflict

"721":
Copy link
Copy Markdown
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
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Removed the __RESERVE_KEYWORD_721_V4__ marker. You're correct that the presence of the "721" key is sufficient to detect the nested map format. The format can be determined simply by checking if the metadata map contains a "721" key.

}
}
}

Copy link
Copy Markdown
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
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

All metadata_map definitions across 222, 333, and 444 standards have been updated with proper CDDL syntax using bounded_bytes for all keys, consistent with CIP-0025 version 2.

}
}
}

Copy link
Copy Markdown
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
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

All metadata_map definitions across 222, 333, and 444 standards have been updated with proper CDDL syntax using bounded_bytes for all keys, consistent with CIP-0025 version 2.


#### version 4

- Add backwards-compatible support for multi-asset 721-ERC-style metadata mappings
Copy link
Copy Markdown
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.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Clarified:

  • "Backwards-compatible" means compatible with versions 1-3, which only supported direct metadata format. Version 4 adds the nested map format as an additional option.
  • Removed "721-ERC-style" terminology entirely, replacing it with "nested map format following CIP-0025's policy_id -> asset_name structure"

@SmaugPool
Copy link
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
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.

@SmaugPool
Copy link
Copy Markdown
Contributor

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

Actually, the datum does not have to be inline, in which case I think it can be later referenced just by its hash. I guess this would solve this issue assuming your standard recommends using non-inline datum, at least when the policy allows updates.

Fix terminology and CDDL syntax issues identified in review:

- Remove "721-ERC-style" terminology; clarify reference to CIP-0025's
  nested map structure vs individual metadata fields
- Fix CDDL syntax: use proper bounded_bytes for "721", policy_id, and
  asset_name keys (matching CIP-0025 version 2 conventions)
- Remove __RESERVE_KEYWORD_721_V4__ marker; presence of "721" key is
  sufficient for format detection
- Update retrieval steps to detect format by checking for "721" key
- Clarify "backwards-compatible" in changelog: version 4 adds nested
  map format as additional option, compatible with v1-3 direct format
- Rename "721-style" example label to "nested map format"
- Propagate all fixes consistently across 222, 333, and 444 standards
Add comprehensive rationale explaining the motivation for introducing
the CIP-0025-compatible nested map format in version 4:

- Addresses minUTxO cost barriers for large NFT collections
- Enables metadata consolidation to reduce ADA locking (10-20% savings)
- Improves migration path from CIP-0025 to CIP-0068
- Preserves backward compatibility through strict optionality

This rationale explains the economic and practical benefits that led
to the version 4 design decision.
@thaddeusdiamond
Copy link
Copy Markdown
Contributor Author

thaddeusdiamond commented Jan 6, 2026

I published a new change, rationale, and some of my responses. By "reprint" I mean that I already have a ton of (222) NFTs that I want to optimize without having to airdrop everyone a token. Since this is optional and backward-compatible, I can do this optimization inline for my artists now without requiring the creation of 555/666 or whatnot.

Please let me know the path to approval @rphair @SmaugPool

Copy link
Copy Markdown
Collaborator

@rphair rphair left a comment

Choose a reason for hiding this comment

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

@thaddeusdiamond at the CIP meeting earlier today we spontaneously picked this one off the Unconfirmed list and decided that we'd been looking for the response that you made a few hours later. 😅

In my opinion this satisfies all the demanding review points beginning with #1112 (comment) with corresponding changes in the text.

Personally I appreciate that #1112 (comment) was put literally into the Rationale & I'd also like to see that happen for any remaining clarifications resulting from the debate — past, present or future — for the benefit of new implementors and others who may be interested in migrating their tokens.

@SmaugPool can you please go back & double-check the conversations beginning with your #1112 (comment) and mark "resolved" the ones you believe have been properly addressed... or note otherwise if you think they need more debate or adjustment?

Otherwise I think we have a achieved a CIP candidate and so have put this on Review for the next CIP meeting (https://hackmd.io/@cip-editors/126) & we'll double-check all pending review points again in 2 weeks.

@thaddeusdiamond @SmaugPool please also tag other associates who you think would be interested in confirming, disputing, or reviewing this update. 🙏

@rphair rphair requested a review from Ryun1 January 7, 2026 02:56
@rphair
Copy link
Copy Markdown
Collaborator

rphair commented Jan 20, 2026

@thaddeusdiamond due to a lot of proposals on the Triage list we had to postpone editors' & attendees' review until the next meeting https://hackmd.io/@cip-editors/127 - please (cc @SmaugPool) continue the review & response here online in the meantime if possible.

@thaddeusdiamond
Copy link
Copy Markdown
Contributor Author

thaddeusdiamond commented Feb 17, 2026 via email

Copy link
Copy Markdown
Collaborator

@rphair rphair left a comment

Choose a reason for hiding this comment

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

@thaddeusdiamond my guess is that @Ryun1 deleted that review (posted a few minutes before today's CIP meeting) after answering his own question about the backward compatibility (this had already been briefly settled at an earlier meeting).

We pressed this item through our Review agenda at that meeting and those present believed it to be technically in order, but with some concern coming from "whether wallet devs have asked for this". The editors believe this could be an issue because of pathological cases like (hypothetically):

  1. without interest, let alone buy-in, to this addition: this "next generation" of the CIP-0068 standard is merged in, but wallet implementations don't (or don't consistently) use it;
  2. then some other conception of that "next generation" comes along and this update needs to be backed out somehow — or worse: somehow merged with another evolution that it might not be easily compatible with.

So our decision was to progress this if & when we can get some endorsement from tagged representatives from wallet development teams. @Ryun1 and @perturbing said they would work on this and we're awaiting their tagging some of these for review.

In the meantime I think we can call this Confirmed (though not Last Check as it would be for an unquestioned update PR) as we would any technically complete update awaiting more detailed review.

@rphair rphair added State: Confirmed Candiate with CIP number (new PR) or update under review. and removed State: Unconfirmed Triaged at meeting but not confirmed (or assigned CIP number) yet. labels Feb 18, 2026
@thaddeusdiamond
Copy link
Copy Markdown
Contributor Author

thaddeusdiamond commented Feb 18, 2026 via email

@Ryun1
Copy link
Copy Markdown
Collaborator

Ryun1 commented Feb 21, 2026

@thaddeusdiamond appreciate the efforts

It would be beneficial to see further review from a range of implementors
to confirm the motivation for this new version and that it is reasonable to be adopted

Tagging some known CIP-68 implementors for visibility
@AlexDochioiu @Scitz0 @refi93 @ashisherc

@AlexDochioiu
Copy link
Copy Markdown
Contributor

AlexDochioiu commented Feb 23, 2026

I had a quick look and I do not clearly understand how this is intended to work.

Today, with CIP-68, we have:

{policy}.({type}){name}

To retrieve metadata, we replace the type with the reference type and then read the datum from the UTxO that contains the reference asset.

Each token has a clearly identifiable reference pattern:

{policy}.(222){name} -> {policy}.(100){name}

So we know exactly which reference token to look for in order to extract metadata.

What I do not understand is how multiple tokens such as:

{policy}.(222){name1}
{policy}.(222){name2}
{policy}.(222){name3}

are mapped to a single reference.

How do I determine which reference token to query?

Will there be a single reference shared across multiple tokens?
Or is the idea that multiple reference tokens are placed in the same UTxO and share a single datum?

I also noticed mention of including the policy as a key in the datum. Is this because we expect multiple reference tokens from different policies to coexist within the same UTxO?


If this proposal assumes multiple reference tokens sharing a UTxO:

  • The value for wallets is close to zero. It does not meaningfully improve speed or efficiency, since fetching UTxOs by transaction hash is already fast with most indexers.
  • The impact on wallets is manageable. The metadata extraction logic becomes slightly more complex, but not significantly so.

One additional point:

I am generally not a fan of CIP-68. Across nearly all Cardano indexers we use, both managed and self-hosted, retrieving the latest transaction for a given asset, which is required to locate the UTxO containing the datum, is consistently problematic. It is a slow operation and frequently times out or fails altogether.

@thaddeusdiamond
Copy link
Copy Markdown
Contributor Author

Let me try to answer inline below:

I had a quick look and I do not clearly understand how this is intended to work.

Today, with CIP-68, we have:

{policy}.({type}){name}

To retrieve metadata, we replace the type with the reference type and then read the datum from the UTxO that contains the reference asset.

Each token has a clearly identifiable reference pattern:

{policy}.(222){name} -> {policy}.(100){name}

So we know exactly which reference token to look for in order to extract metadata.

What I do not understand is how multiple tokens such as:

{policy}.(222){name1}
{policy}.(222){name2}
{policy}.(222){name3}

are mapped to a single reference.

How do I determine which reference token to query?

The name determines how you query. So there are no changes to the token type (that lives in the actual asset name itself as a prefix). All you are looking up is the metadata of {asset_id}{name} => CDDL

Will there be a single reference shared across multiple tokens? Or is the idea that multiple reference tokens are placed in the same UTxO and share a single datum?

The idea is to share a single datum for space and cost efficiency as all.

I also noticed mention of including the policy as a key in the datum. Is this because we expect multiple reference tokens from different policies to coexist within the same UTxO?

It allows for that (similar to how we did it in CIP-0025)

If this proposal assumes multiple reference tokens sharing a UTxO:

  • The value for wallets is close to zero. It does not meaningfully improve speed or efficiency, since fetching UTxOs by transaction hash is already fast with most indexers.

Agree with this.

  • The impact on wallets is manageable. The metadata extraction logic becomes slightly more complex, but not significantly so.

Good to hear.

One additional point:

I am generally not a fan of CIP-68. Across nearly all Cardano indexers we use, both managed and self-hosted, retrieving the latest transaction for a given asset, which is required to locate the UTxO containing the datum, is consistently problematic. It is a slow operation and frequently times out or fails altogether.

Yeah CIP-0068 is controversial, but the rationale here is to save artists developing on the chain from ballooning minUTxO (which often reaches into the many thousands of ADA for mints).

@AlexDochioiu
Copy link
Copy Markdown
Contributor

@thaddeusdiamond Thank you for the reply! I feel like your message already mostly implies it, but I'll still ask the following question directly to be 100% I'm not mis-interpreting the purpose of this CIP.

Today: Every reference token sits in a dedicated UTxO and the UTxO datum only refers to this (single) token.

The CIP proposal: Multiple reference tokens (potentially from multiple policies) can coexist in the same UTxO and share a single datum (containing the metadata for all of them).

Am I correct in understanding correctly that this is the core (and only?) proposal made by this CIP?

@thaddeusdiamond
Copy link
Copy Markdown
Contributor Author

thaddeusdiamond commented Feb 24, 2026 via email

@rphair
Copy link
Copy Markdown
Collaborator

rphair commented Feb 24, 2026

@thaddeusdiamond really nice to see this proposal moving along into peer review. ⭐ If you're going to keep responding by email to GitHub, please pay attention to how you enter your text (separating by a newline is essential; maybe even a blank line) so the entire quoted email doesn't appear here in the GitHub review stream. 🙏 (otherwise editors have to fit it: e.g. #1112 (comment))

@thaddeusdiamond
Copy link
Copy Markdown
Contributor Author

@thaddeusdiamond really nice to see this proposal moving along into peer review. ⭐ If you're going to keep responding by email to GitHub, please pay attention to how you enter your text (separating by a newline is essential; maybe even a blank line) so the entire quoted email doesn't appear here in the GitHub review stream. 🙏 (otherwise editors have to fit it: e.g. #1112 (comment))

haha TIL... Fixed. Sorry about that.

@Scitz0
Copy link
Copy Markdown
Contributor

Scitz0 commented Feb 24, 2026

Hi, from Eternl's perspective, I don't see any direct issue with the proposed CIP but I haven't spent much time digging through it either. This will likely first happen at the implementation stage if there are any issues. If I read change and comments correctly, fetching the datum works just like before, its just that the content of the datum can now either be as before with direct metadata, or using the 721 style with policy and name in the data structure?

@thaddeusdiamond
Copy link
Copy Markdown
Contributor Author

Hi, from Eternl's perspective, I don't see any direct issue with the proposed CIP but I haven't spent much time digging through it either. This will likely first happen at the implementation stage if there are any issues. If I read change and comments correctly, fetching the datum works just like before, its just that the content of the datum can now either be as before with direct metadata, or using the 721 style with policy and name in the data structure?

That is correct yes.

@Scitz0
Copy link
Copy Markdown
Contributor

Scitz0 commented Feb 24, 2026

Ok, then it should be fairly easy to implement I think.

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: Confirmed Candiate with CIP number (new PR) or update under review. Update Adds content or significantly reworks an existing proposal

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants