Skip to content

CIP-0196? | Handle Provider Registry & Resolver - #1229

Open
kingslavcho wants to merge 24 commits into
cardano-foundation:masterfrom
kingslavcho:cip-handle-interoperability
Open

CIP-0196? | Handle Provider Registry & Resolver#1229
kingslavcho wants to merge 24 commits into
cardano-foundation:masterfrom
kingslavcho:cip-handle-interoperability

Conversation

@kingslavcho

@kingslavcho kingslavcho commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

This CIP provides the technical solution to the problems
documented in CPS-0032 (Handle Provider Interoperability).

It defines:

  • A provider registry format (registry.json) modeled on CIP-0010
  • A standard resolver API interface all providers must implement
  • Wallet display requirements for handle resolution
  • Collision handling behavior when multiple providers resolve
    the same visible handle string
  • Provider evaluation criteria for registry inclusion
  • On-chain resolution requirements
  • Security requirements including script address warnings
    and policy ID verification

Solves: CPS-0032 (discussion)
(early discussion)

Note: @papag00se participated as co-author during the CPS-0032 phase and early CIP review. He has since withdrawn as co-author due to philosophical differences on the trust model. His contributions to the discussion are acknowledged and preserved in the comment history. A competing proposal from ADA Handle is expected and will be referenced in this CIP's Discussions field when submitted.


(directory with rendered latest proposal)

@rphair rphair left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

@kingslavcho (cc @papag00se) I have a feeling we will be able to get through any presentation & format issues in the next week so I feel safe marking this for Triage at the next meeting: https://hackmd.io/@cip-editors/139

I do hope ASAP in the meantime we can come up with a CIP title that is not the same as the CPS title... which would falsely suggest we are only interested in hearing one solution for each problem (and which I think we went to some lengths to avoid confinement as such in the CPS): we can discuss & confirm a title in the point below.

To fix the common format problems, please follow along with the CIP validator running in the GitHub workflow at the bottom of the PR page:

  • There are some basic differences between this document and the standard CIP format & template; the validator (cc @Ryun1) should identify them clearly.
  • If in doubt on any validator point just post and we'll work on it together.
  • I'll review the proposal as usual for pre-meeting Triage after we can see that it passes validation.

Comment thread CIP-0???/README.md Outdated
@rphair

rphair commented Jul 14, 2026

Copy link
Copy Markdown
Collaborator

@kingslavcho (cc @papag00se) please also consider my strong suggestion to remove all numbering from the headings in your outlined specification.

I post on this topic in this repo repeatedly: but rather than link to those earlier explanations please TL;DR consider that deep links to your spec section headings — which will break if & when they're renumbered, which will happen — are much more important than being able to refer to sections conversationally by their number. This is an operational document and a work in progress: not a thesis.

@rphair rphair added Category: Tools Proposals belonging to the 'Tools' category. State: Triage Applied to new PR afer editor cleanup on GitHub, pending CIP meeting introduction. labels Jul 14, 2026
@rphair rphair changed the title CIP-????: Handle Provider Interoperability CIP-???? | Handle Provider Registry & Resolver Jul 14, 2026
@kingslavcho

Copy link
Copy Markdown
Contributor Author

Thank you @rphair for the triage confirmation and the detailed feedback.

I will fix all validation errors immediately:

  • Quote the CIP number
  • Fix Discussions format
    -Fix Motivation and Rationale section heading names
  • Remove all numbering from headings throughout

Regarding the title, I like your suggestion. A title focused on the registry and resolver is more precise and leaves room for alternative solutions as you pointed out. Happy to go with whatever the editors and @papag00se agree on.

@papag00se what is your preference on the title?

@rphair rphair left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

@kingslavcho it looks like all of my own issues have been fixed in the last commit 29e22d8 and so I think the main question for Triage next week — assuming it's confirmed as a candidate, which I would support — will be how to address this for review to:

  • others working in the "Handle space" specifically (cc @papag00se for ideas on this in the meantime);
  • wallet & any other tooling providers expected to implement the new specification.

Comment thread CIP-0???/README.md Outdated
Comment thread CIP-0???/README.md Outdated
Comment thread CIP-0???/registry.json Outdated
@kingslavcho

Copy link
Copy Markdown
Contributor Author

Thank you @rphair — glad the main issues are resolved.

I will address the remaining points:

  • Remove section numbers from Path to Active and replace with section anchors
  • Move example registry content to an Appendix section in the README and empty the registry.json
  • Add a registry.schema.json file for validation

@papag00se do you have experience with JSON schema validation from the ADA Handle side? And do you have suggestions on who in the handle space we should be reaching out to for review?

@kingslavcho

Copy link
Copy Markdown
Contributor Author

@rphair @Ryun1 regarding registry validation, I have added registry.schema.json to the CIP folder defining the exact structure each provider entry must follow including:

  • Policy ID format validation (56 lowercase hex characters)
  • HTTPS enforcement for resolver API and website
  • Strict enum validation for status and metadata_standard
  • Required fields enforcement
  • No additional properties allowed

For automated validation on registry.json PRs, I would propose a GitHub Actions workflow similar to CIP-0010's approach that runs ajv (a JSON schema validator) against registry.schema.json on every PR that touches registry.json.

The workflow would look something like this if possible (i am not sure but AI proposed this might work)

  1. Trigger: pull_request touching CIP-0????/registry.json
  2. Install ajv-cli: npm install -g ajv-cli
  3. Run: ajv validate -s CIP-0????/registry.schema.json
    -d CIP-0????/registry.json
  4. Pass/fail based on ajv exit code

This would give CIP editors automatic validation so they only need to review content and criteria, not format.

@papag00se @Ryun1 would you be willing to help set up this workflow or advise on the best approach given the existing CIPs repo tooling?

@rphair rphair left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Continued from #1229 (comment):

Comment thread CIP-0???/README.md Outdated
Co-authored-by: Robert Phair <rphair@cosd.com>
@papag00se

Copy link
Copy Markdown

Thank you for putting together the initial technical proposal. I support the underlying goal and remain committed to co-authoring a useful interoperability standard.

Before reviewing the individual sections, I want to clarify the scope of my support and the principles I am applying to this review.

My co-authorship of CPS-0032 represents support for the problem statement: wallets and dApps need safer provider-aware resolution, explicit provider context, collision handling, abuse resistance, and backward compatibility. It should not be interpreted as blanket approval of every implementation proposed in this initial CIP draft.

My support during the CPS discussion was specifically for moving away from namespace governance and toward provider-neutral interoperability. I do not think the resulting technical standard should inadvertently recreate governance or market allocation through registry ordering, automatic wallet enablement, or default resolution behavior.

I think the CIP should preserve these distinctions:

  1. Discovery is not trust. A provider can publish standards-compliant metadata without automatically becoming trusted or enabled by a wallet.

  2. Registration is not endorsement. Inclusion in a registry should not imply legitimacy, security, preferred placement, or entitlement to wallet integration.

  3. Merge order is not resolution priority. GitHub registration timing does not represent provider age, adoption, technical quality, user trust, or ecosystem legitimacy.

  4. Interoperability does not replace due diligence. Standards can reduce bespoke technical integration work while wallets retain discretion over security review, operational relationships, support expectations, incident response, and provider enablement.

  5. Existing users must not regress. Registry additions, removals, ordering changes, overlapping claims, or provider-status changes must not invalidate, deprioritize, reinterpret, or make second-class any previously issued handle or existing integration.

  6. The standard must support multiple architectures. It should not assume that every provider uses one NFT, one policy ID, one metadata standard, one API, or the same holder-based resolution model.

I will place some comments in-line in the files area.

@kingslavcho

Copy link
Copy Markdown
Contributor Author

@papag00se thank you for the detailed review. Let me respond to each point directly.

Point 1 - Discovery is not trust

I partially disagree here. The entire purpose of this CIP is to reduce friction for wallet integration. If wallets can still arbitrarily ignore compliant registry entries, we have not solved the problem CPS-0032 documented. The standard should define that wallets implementing this CIP MUST support resolution for all active registry entries that meet the defined criteria. Wallets that choose not to implement the standard at all are free to do so - but a wallet that claims CIP compliance must resolve all compliant providers equally.

Otherwise this CIP just creates a prettier version of the existing situation where wallet teams decide who gets integration based on private relationships.

Point 2 - Registration is not endorsement

Agreed completely. The registry is neutral. Inclusion means technical compliance, nothing more.

Point 3 - Merge order is not resolution priority

I disagree and want to be direct about why.

CPS-0032 identified that wallets currently default to whichever provider they have a private relationship with. That is the problem. My proposed solution replaces a private opaque default with a public transparent one.

You are right that merge timing does not represent quality or legitimacy. But some default must exist when multiple providers resolve the same visible handle. The question is not WHETHER there is a default - it is WHO DECIDES the default. Right now wallet teams decide privately. I am proposing the community decides publicly through the CIP registration process.

If you have a better mechanism for determining the default when collision exists, I am genuinely open to hearing it. But removing default resolution entirely means wallets either always ask the user (which is poor UX for the common case) or fall back to private relationships (which is the problem we started with).

Point 4 - Interoperability does not replace due diligence

I respectfully disagree. If a provider has a working live platform, a publicly documented Policy ID with real minted assets on-chain, a functioning resolver API returning the standard format, and has passed CIP editor review - what specific technical risk justifies a wallet refusing to resolve their handles?

Handle resolution is simple: query an API, get an address, show it to the user. The user signs the transaction. Nothing about this requires the level of trust you would extend to a wallet infrastructure partner. If the resolved address is wrong, the user sees it on the confirmation screen before sending. The same risk exists with ADA Handle today.

Wallets retaining discretion to exclude compliant providers means this CIP cannot achieve its stated goal of giving new providers a fair path to integration based on technical merit. That is the core problem I am trying to solve.

Point 5 - Existing users must not regress

Fully agreed. Nothing in this CIP touches existing handles or existing integrations. ADA Handle users are completely unaffected. I would add that ALL providers in the registry should eventually be listed, including ADA Handle so their users benefit from the standard as well. I would actively encourage ADA Handle to submit a registry entry.

Point 6 - Standard must support multiple architectures

The current registry format already accommodates this. The onchain_method field is a free text identifier, providers
define their own resolution method. The metadata_standard field supports both CIP-25 and CIP-68. Multiple policy IDs per provider are supported. Nothing in the format forces providers to change their architecture.

If there are specific fields or constraints in the current draft that would prevent ADA Handle or another provider from registering without changing their architecture, please point them out specifically so i can have a look at them and find a proper solution.

The bottom line is this: a standard that leaves wallet integration to private discretion after technical compliance is demonstrated is not a standard, it is a suggestion. I want to build something that actually solves the problem.

@papag00se

papag00se commented Jul 17, 2026

Copy link
Copy Markdown

@kingslavcho - I think we are still talking past each other on two foundational distinctions:

  1. registry conformance versus wallet trust; and
  2. a common resolution interface versus a single resolution architecture.

Those distinctions need to be explicit in the CIP.

Registry inclusion cannot require wallet trust

You ask:

what specific technical risk justifies a wallet refusing to resolve their handles?

A provider can satisfy every technical requirement in this proposal and still be a provider that a wallet has valid reasons not to trust or interact with.

  • The project owners may be known grifters/bad-faith actors in the space - or turn to bad-faith after being registered
  • The project may be malicious, compromised, or abandoned
  • The project owners may be technically incompetent, abusive toward users, or unwilling/unable to support incidents
  • There may be "bad blood" between the wallet and the project owners due to past events

Technical conformance does not resolve those concerns.

I don't believe there is a CIP today that requires dApps to put their reputation on the line or forfeit their own judgement by forcing support of "compliant" applications.

A common standard does not require one ownership architecture

The current on-chain resolution section defines one specific method:

  1. construct an NFT asset ID from a policy ID and the UTF-8 encoding of the handle;
  2. locate the output holding that NFT;
  3. return the holder address as the resolved address.

That is a valid resolution method. It is also substantially the ADA Handle model.

To be explicit: this method is favorable to ADA Handle’s existing architecture. I still do not think it should become the only compliant architecture. As a co-author, I want the standard to remain neutral even where a narrower standard could benefit ADA Handle.

Other valid architectures may use:

  • CIP-67/68 user and reference assets;
  • a Plutus contract and datum-based name registry;
  • a mutable address record controlled by an ownership credential;
  • delegated or virtual subhandles that do not each have an NFT;
  • separate ownership and resolution records;
  • an ENS-style registry that identifies a resolver contract;
  • an off-chain result with an independently verifiable on-chain commitment;
  • future mechanisms that do not yet exist.

The purpose of an interoperability standard should be to define how wallets understand and verify these architectures, not to require every architecture to become the same architecture.

ADA Handles own Virtual SubHandles (which are supported by all the major wallets on Cardano) deviate from the "resolve an NFT where it resides" mechanism.

@kingslavcho

Copy link
Copy Markdown
Contributor Author

@papag00se I want to engage with these points directly and honestly because I think we have a genuine philosophical disagreement on some of them, not just a technical one.

On bad actors and wallet discretion:

You raise the concern that technically compliant providers could be bad actors. But consider: on a public blockchain, ANYONE can mint a token today. Nothing stops a bad actor from minting handles right now under any policy ID. The resolution standard does not create this risk - it exists already and independently of this CIP.

More importantly: how does a wallet know who is a bad actor BEFORE it happens? You cannot. A provider that is legitimate today can turn malicious tomorrow. A provider that looks suspicious today might be completely legitimate. This uncertainty exists for every provider including ADA Handle, it is not a property unique to new entrants.

The real question is: who should make the judgment call? Your answer is wallet teams based on their own discretion and relationships. My answer is the community through a transparent public process with defined technical criteria.

Wallet teams retaining private discretion to refuse compliant providers IS centralization. It means whoever has the best relationships with Eternl and Lace wins - regardless of technical quality or community support. That is literally the problem CPS-0032 documented and the reason I started this process.

I do not think there is a CIP today that forces wallets to support all compliant applications, you are right about that. But I would argue that is a gap in the ecosystem, not a feature. A blockchain ecosystem that claims to be decentralized should have open, transparent, criteria-based processes for infrastructure integration, not private gatekeeping by wallet teams.

On resolution architectures:

You are right that the current on-chain resolution section describes one specific method and I will broaden it. But I want to clarify my actual position:

The CIP should define what providers MUST document about their resolution method, not prescribe which method they
must use. The registry already has a free-text onchain_method field precisely for this reason. Each provider documents their own method. Wallets implementing on-chain resolution follow what the provider documented.

Regarding the specific architectures you listed - CIP-67/68, Plutus contract, delegated subhandles etc - all of these can comply with this CIP by documenting their resolution method in the registry entry. The CIP does not require every provider to use NFT holder resolution. It requires every provider to DOCUMENT their resolution method so wallets can implement it.

If ADA Handle's Virtual SubHandles use a different resolution model, document it in the registry entry. That is exactly what the onchain_method field is for. The standard is generic by design. The description of NFT holder resolution in the current draft is an EXAMPLE, not a requirement. I will make this clearer in the revision.

On the core disagreement - default resolution:

I maintain that some default must exist when multiple providers resolve the same visible handle string. The current situation, wallet teams decide privately is not neutral. It advantages incumbents with relationships. Registration order in a public CIP process is more transparent and accessible than private relationships.

I accept that registration order does not confer trust, endorsement, or legitimacy. It is purely a display ordering default and users can always override it.

If you have a specific alternative mechanism for determining display order when collision exists, I am genuinely open to hearing it. But "let wallets decide privately" is not a neutral answer, it is the status quo that CPS-0032 identified as the problem.

@papag00se

Copy link
Copy Markdown

@kingslavcho - I believe we are trying to push the CIP into a direction that a CIP cannot fulfill in the first place. The bottom line is, there is no mechanism to enforce compliance. But I will address your points first:

You raise the concern that technically compliant providers could be bad actors. But consider: on a public blockchain, ANYONE can mint a token today. Nothing stops a bad actor from minting handles right now under any policy ID. The resolution standard does not create this risk - it exists already and independently of this CIP.

This proves my point more than disproves it. Your plan would force a wallet to accept a bad actor. The "ANYONE" you mention above is auto-accepted as a funds router as long as they comply with this CIP. Even if they are a bad actor.

More importantly: how does a wallet know who is a bad actor BEFORE it happens? You cannot. A provider that is legitimate today can turn malicious tomorrow. A provider that looks suspicious today might be completely legitimate. This uncertainty exists for every provider including ADA Handle, it is not a property unique to new entrants.

Again, this proves my point more than disproves it. Under your plan, a wallet does not have the choice to drop the newly bad actor - they must resolve them anyway since you are denying wallet discretion.

The real question is: who should make the judgment call? Your answer is wallet teams based on their own discretion and relationships. My answer is the community through a transparent public process with defined technical criteria.

"the community" is an unclear entity. Who exactly makes that decision? The best I can tell, your plan leaves it to the CIP editors - making the CIP a form of governance - which by CIP-0001 definition, it cannot be.

Wallet teams retaining private discretion to refuse compliant providers IS centralization. It means whoever has the best relationships with Eternl and Lace wins - regardless of technical quality or community support. That is literally the problem CPS-0032 documented and the reason I started this process.

Decentralization doesn't mean take away individual discretion. That is what decentralization fights against. Individuals (and the apps they run) should not be forced by a central entity to "do a thing". I'd argue that your plan to force wallets to resolve whoever is in the registry is a stronger step towards centralization than allowing them their own discretion. Several wallets independently choosing different provider sets is decentralized pluralism. One registry determining which providers every conforming wallet must query is a substantially more centralized trust model.

You are right that the current on-chain resolution section describes one specific method and I will broaden it... That is exactly what the onchain_method field is for. The standard is generic by design. The description of NFT holder resolution in the current draft is an EXAMPLE, not a requirement. I will make this clearer in the revision.

Thank you.

If you have a specific alternative mechanism for determining display order when collision exists, I am genuinely open to hearing it. But "let wallets decide privately" is not a neutral answer, it is the status quo that CPS-0032 identified as the problem.

Forcing compliance is not neutrality.

There is no mechanism of enforcement

Most of our argument side steps the reality and becomes moot because there is no entity that can police any of this anyway. If a wallet uses the registry to discover handle providers but decides not to implement them all - who do you petition? The CIP process has no mechanism to force implementation. Which is the crux of the point. CIPs can standardize interoperable behavior. They cannot confer an enforceable right to integration or compel independent wallets to trust a provider.

@kingslavcho

kingslavcho commented Jul 21, 2026

Copy link
Copy Markdown
Contributor Author

@papag00se I want to address the bad actor argument directly because I think it has a fundamental flaw.

How does a wallet know who is a bad actor BEFORE they act badly? The answer is: they cannot. You cannot identify a bad actor from a technical submission. You can only identify them AFTER something goes wrong. And by that point the damage is already done -regardless of whether the CIP exists or not.

This means the "bad actor" argument is not actually an argument against this CIP. It is an argument that exists independently of this CIP. Bad actors can and do operate on Cardano today without any registry or standard. The registry does not make this worse — it makes bad actors MORE visible by requiring them to publicly document their Policy ID, resolver endpoint, website, and security contact. A bad actor operating outside the registry is LESS visible than one inside it.

On wallet discretion to exclude providers:

I accept that wallets must retain discretion to exclude providers for genuine safety reasons. I propose the following compromise:

Wallets implementing this CIP SHOULD resolve all active registry entries meeting the technical criteria. Wallets MAY exclude a provider but MUST publicly document the reason for exclusion. Valid documented reasons include confirmed security incidents, confirmed fraud, or regulatory requirements in the wallet's jurisdiction.

What wallets MUST NOT do is exclude providers based on undisclosed private criteria or commercial relationships - because that is indistinguishable from the status quo that CPS-0032 documented as the problem.

If a wallet excludes a provider and refuses to document why - that wallet is not compliant with this CIP. Users can see that and choose a different wallet. That is the enforcement mechanism. Not a legal body. Not the CIP editors. The market.

You say several wallets independently choosing different provider sets is decentralized pluralism. I say it is fragmentation that punishes users. A user who mints $slavcho.did and then discovers it only resolves in two out of five wallets because three wallet teams had undisclosed reasons to exclude their provider - that user was misled. They bought something that does not work everywhere. That is not pluralism. That is a broken ecosystem.

On enforcement:

You are right that no entity can force compliance. But that is true of EVERY CIP. CIP-30 cannot be enforced either. Wallets implement it because users demand it. The same will apply here.

The CIP defines expected behavior. Wallets that deviate from expected behavior without public justification will face user scrutiny. That is sufficient and it is more accountability than the current situation provides.

I will update the CIP with the compromise language above. But I want to be clear: a standard that allows wallets to exclude compliant providers for undisclosed private reasons is not a standard. It is a suggestion that protects incumbents. I will not accept that framing as the final position of this CIP.

Comment thread CIP-0???/README.md Outdated
Co-authored-by: Ryan <ryan.williams@intersectmbo.org>

@rphair rphair left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

At the CIP meeting today we had both parties in the above debate (@kingslavcho @papag00se) present and were able to air both points of view before a cross section of the developer community.

A short summary of broad consensus would be that this CIP itself needs to make it clear — beyond the general Cardano principle that "decentralisation is better" and worth pursuing no matter what the cost — that the likely heavy burden placed on wallet providers will be worth the expected benefits to handle subscribers.

So far, a reading of the proposal by editors and reviewers doesn't convey that impression. I have to apologise again for oversimplification due to space considerations, but the main motivation conveyed so far is the principle of "fairness" with an impression that the CIP is about establishing that: regardless of the cost.

Drawing the line in the middle (neither accepting nor rejecting this) the editors chose to refrain from declaring this a candidate until it's clear the solution here provides its own incentives.

We may someday (soon, or much later) declare that "fairness" is enough of an incentive: if so, this would be established in further review & then perhaps the CIP could encompass those arguments.

In any case this CIP will have to remain Unconfirmed until either:

  • establishing that the total benefit of this method would indeed be worth the cost; or
  • agreeing to merge this as a potential solution despite not having a community consensus about the benefits of doing this (perhaps with an appropriate disclaimer).

Points raised at the meeting

@colll78 made the argument that could be brutally summarised as "If we have a commercial provider that does everything, then we don't have a problem that needs to be solved."

@perturbing and others made the counter-argument (also oversimplified) that "If we have an expensive solution that provides the 'fairness' the current system lacks, it's a valid CIP even if no rational person feels compelled to implement it."

We observed that our assessments of this CIP (and likely any counter-CIP) have the same quality as governance discussions, and so @kenerik suggested bringing this up with the Civics committee.

I supported the latter idea — and, when the time is right, involving governance advocates in this discussion (cc @thenic95) — since expectations of "fairness" in the Cardano community are likely a regular topic of Civics & other governance circles.

  • i.e. Rather than make our own assumptions, reviewers should become better informed about relevant community expectations of "fairness" in general & particularly in the handle space.

@colll78's point above was based on an assessment that implementation of a handle resolver mechanism as described here would be nightmarishly expensive and difficult: measured out to the endpoints of wallet implementations. I don't disagree with this statement, but in the interest of a complete discussion invited him to please spell out the details of that assessment here: even if it reads like a worst-case scenario.

@papag00se commented in the chat suggesting (to me at least) that we might also have a CIP opening up an ADA Handle standard: effectively a "competing" CIP (if not compatible with this one) and a separate solution to CPS-0032.

  • It might also be that two such distinct CIPs in this space could both be implemented: but only time & cooperation would be able to tell about that.

I can imagine that an open standardisation of ADA Handle would be cleaner and less error-prone than a resolving mechanism to practically level the playing field. Providing a truly open participation in ADA Handle should well be able to maintain interoperability & keep costs to a minimum: and hopefully in a way that provides the "fairness" to new participants which motivated both this CIP and the parent CPS.

@rphair rphair removed the State: Triage Applied to new PR afer editor cleanup on GitHub, pending CIP meeting introduction. label Jul 22, 2026
@kingslavcho

Copy link
Copy Markdown
Contributor Author

@rphair thank you for putting this on the meeting agenda and for the encouraging assessment of the namespace characterisation.

Regarding @colll78's concern about excessive difficulty and cost, I want to address this directly before the meeting so editors and reviewers have the technical detail they need.

The implementation of this CIP in a wallet reduces to:

  1. Load the registry.json file - one HTTP GET request to the CIPs repository or a cached local copy. This is done once at startup or on a configurable refresh interval.

  2. Run the namespace detection algorithm - pure string operations on user input. No network calls. Executes in microseconds.

  3. Query matched providers - one HTTP GET request per candidate provider. In the common case (one provider matches) this is a single API call identical to what wallets already do for ADA Handle today.

  4. Display result - show provider name and resolved address to user. If collision, show selection UI.

The only additional complexity compared to the current ADA Handle integration is steps 1 and 2 - loading a registry file and running string matching. Both are trivial engineering tasks. A competent wallet developer could implement the full standard in a day or two.

I say this not as speculation but from direct experience, I am involved in wallet development so i know it is not that hard to implement..

I will attend next week's meeting and i hope i will have also technical document and an active implementation of a json http call and show how it can be implemented. I do not have much time but i will try to have it

Looking forward to the meeting.

@kingslavcho

Copy link
Copy Markdown
Contributor Author

@rphair @colll78 I have built a live reference implementation to demonstrate that the complexity concern can be addressed concretely.

The demo is live at:
https://getmyid.today/cip-demo.html

It implements the complete CIP flow:

  1. Load registry.json - one HTTP request
  2. Run namespace detection algorithm - pure string ops
  3. Query provider API - one HTTP GET
  4. Display result with provider context

The algorithm trace is visible in real time so anyone can verify exactly what the implementation does at each step. The complete resolver logic is ~60 lines of JavaScript shown directly on the page.

I tested against real preprod handles minted on getmyid.today. Type any .did handle and it resolves live.

This should answer @colll78's concern about implementation cost, the full implementation fits in a lunch break for any competent wallet developer.

Comment thread CIP-0???/README.md Outdated
Comment thread CIP-0196/README.md

When multiple registered providers support the same visible
namespace format, wallets SHOULD default to the provider with
the lowest serial number for that format while always providing

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

I feel that ordering should just be at a wallet's discretion
Im not sure the benefit of prescribing this

@kingslavcho kingslavcho Aug 5, 2026

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.

if we let the wallets choose the ordering someone who already has the connections or is a friend with the wallet provider will always be ordered first (as the default)
Anyway the word SHOULD does not mandate the wallet provider to order according the lowest serial number but it is a recommendation.
For exp me as a small provider that does not have the connections will always be listed second after ada handle if we use the same handle.

Co-authored-by: Ryan <dev.ryan.williams@gmail.com>
Comment thread CIP-0???/README.md Outdated
registry entry documentation

Providers using architectures not listed here MUST
document their resolution method sufficiently for wallet

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

perhaps these other on-chain options should be documented within later versions of this CIP?

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.

yeah i agree on this one

Comment thread CIP-0196/README.md
"preprod": "112233445566778899001122334455667788990011223344556677889900"
},
"resolver": {
"api": "https://example-a.com/api/resolve/",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

suggestion based on @colll78 in today's CIP editors call

api field is removed as resolver option for wallets, instead the on-chain resolution should be prioritised, with api offered as optional for non-critical cases.

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.

i agree on this. the website can be hacked, dns poisoned and than with the api call ada can be stolen. Thanks for noting this! but as @colll78 said about the rpc poisoning that is much of a bigger problem if the resolver is on chain queried. i would say i have a solution but i think it will be beyond the scope of this CIP

@rphair rphair left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Thanks @kingslavcho for bringing this to community review at the CIP meeting today. Our goal there was first to update the community about the presence of two potential means of "opening" the Cardano handle namespace: including this one.

  • The editors also appreciated in advance of the meeting your quick provisioning of a proof-of-concept utility as linked above.

Our main reason for not confirming this was serious concern that the presence of an API as an option in the resolver protocol would allow "poisoning" or injection unless we had a system in which everybody could be trusted... it seems a single malicious resolving entity (or someone hacking their web site / DNS address) would be able to commandeer the whole resolution process.

As @Ryun1 summarised in #1229 (comment), wherever payments are concerned there has to be an entirely on-chain resolution of destination addresses. In @colll78's elaboration of the problem we noted that APIs are acceptable when information-gathering... but not for financial asset transfer (even the simple case of hijacking a DNS address could lead to massive redirection of funds).

Please take your time to adjust your solution accordingly and we will try to review the particulars online; we'll attempt to confirm this again when we have an entirely on-chain approach that looks promising.

@kingslavcho

Copy link
Copy Markdown
Contributor Author

@rphair @Ryun1 @colll78 the demo has been updated to on-chain only resolution:
https://getmyid.today/cip-demo.html

So in this way the provider is never contacted and the resolution is made now with koios directly:

GET preprod.koios.rest/api/v1/asset_addresses
?_asset_policy={policy_id}
&_asset_name={utf8_hex_of_handle}

The demo works on preprod and in fact the nft holder address is the resolved address where the nft resides. And as i stated the implementation is 50 line code and i have also shown the code on the page where i made the working resolution.

Thank you again @colll78 for deeply evaluating the solution from a cyber security perspective! I am also an engineer for cyber security but sometimes you can not think of everything! But i came up of something that concerns me. The dns poisoning of the web page now is gone with the rpc resolution but what is going to happen if rpc poisoning happens.. i mean that is not a problem just for the nft resolution into an address but for the whole ecosystem. i do not think this in the scope of this CIP but think of it for a while. If blockfrost or koios rpc is poisoned you have a really big problem. everything that goes through that rpc can be stolen, redirected and believe me many cardano apps use one rpc especially blockfrost. I have a solution for that to use multiple quorum rpc providers but that option is not that cheap. Also some providers can use their full nodes or light nodes via mithril for state proofs to resolve the nft owner address and implement it alongside blockfrost or koios.

Not to drag things out I have also updated the CIP to make on-chain resolution the mandatory method for transaction address population, own node option documented alongside third party RPC, api resolution not to be used for financial transactions, alternative on chain methods removed from this version - noted as future CIP versions, i rewrote the security section and updated the schema.

@rphair rphair left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

@kingslavcho after your last comment and reading the latest specification, I no longer see any off-chain API components to the handle resolution or API assistance in choice of a provider.

  • This should not be taken as confirmation because I personally don't have enough wallet implementation experience to know when a piece of missing information might someday suggest or require an API similar to the one that was just removed.
  • In any case review by wallet implementors is going to be important in settling these questions, and also to ensure that the specification has no ambiguity from their point of view (I can also see that there is flexibility in their own display of resolver choices, but this flexibility appears documented clearly).

@perturbing @Ryun1 - therefore, although it was just on the agenda last week, unless someone can point out a problem that requires substantial re-working of this CIP, we have to give the author another chance to make their case for CIP candidacy and for others to claim that critical faults aren't fixed yet — so I've put it on the agenda again: https://hackmd.io/@cip-editors/141

@kingslavcho (this may be a new issue) I can also see that URI payment links have been scoped into this CIP — with a proposed URI syntax (something that requires a CIP itself) — without my noticing or it coming up in the meeting yet.

  • "Payment links" (and most Cardano URIs) are a substantial effort in Cardano wallet standardisation that is still inconclusive and so it would be improper for this CIP to address it, let alone imply that payment URIs are a solved problem: we can follow this in threaded discussion below.

@colll78 @papag00se in light of your prior concerns about any & all of the content here please post any remaining objections after the last reorganisation. It will likely save us time if any substantial problems can be pointed out this week & if necessary we can postpone the meeting review until tentative agreement (or at least "no contest") is reached here on GitHub.

Comment thread CIP-0196/README.md
Comment on lines +56 to +61
Any provider may submit a pull request to add themselves to the
registry provided they meet the minimum criteria defined in
section 4 of this CIP. Entries are assigned a serial number by
CIP editors in order of pull request merge date. Serial numbers
are sequential integers starting from 1 and incrementing by 1
for each new entry.

@rphair rphair Aug 9, 2026

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

To avoid an implication that CIP editors are establishing a priority — even if only assigning a sequential number during the PR review process — I think it will make for a better decentralised process if the array index (which guarantees ordering) were used rather than this explicitly assigned discrete serial). The documented process would then require that new provider entries are added in a CIP repository pull request at the end of the existing array.

Given any community or provider objections that could be presented if & when such "priorities" were implemented (even cosmetically, only affecting presentation order), I wouldn't want anyone to believe their business presence has been, or could be, adversely affected by writing an arbitrary value into the CIP repository (or benefited by re-using a lower number, etc.).

I would like to cover any such perceptions in the review process because even if array index were used instead of serial number, there still might be such concerns about adding the array entries out of order: not that it would happen, but that it might happen.

I don't think this is a big issue especially since the CIP text itself makes it clear this ordering is only used "cosmetically" in displaying lists. I would just like to confirm with other CIP editors (who would share any stigma) and with all other reviewers that this would not be seen as an opportunity to gain undue influence. cc @perturbing @Ryun1

Comment thread CIP-0???/README.md Outdated
Comment on lines +441 to +454
### Payment URI Integration

Payment URIs that include handle resolution SHOULD use the
following parameter format to specify provider context
explicitly:

```
cardano:{address}?handle={handle}&handle-provider={provider-name}
```

Example:
```
cardano:addr1qx...?handle=john.smith.did&handle-provider=GetMyID
```

@rphair rphair Aug 9, 2026

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

@kingslavcho unfortunately we have nothing like this on Cardano (yet) and the suggestion of a payment link scheme is not as easy as you imply: we have been working for years on trying to define & confirm adoption for these, to no avail.

Contributors to Cardano's URI scheme CIPs (cc @Crypto2099 @MadOrkestra) especially in a proposed general solution for payment links have not been able to get confirmation from wallet providers that any support for a standard format has been implemented, or even will be.

Relying on any form of "payment links" would be dubious at this point because its CIP candidate hasn't even been merged, and is currently abandoned:

I would suggest, at minimum, removing any suggestion of Payment URIs from this CIP since the basic syntax about how to specify ada, tokens, and addresses themselves (let alone handles) hasn't been agreed upon yet.

  • If & when there is a general way to specify a handle resolver then I supposed it could be added to a/the CIP on payment links: but we would never be able to agree upon that now.

Note also that our "protocol" for these URIs would be web+cardano: because cardano: itself is not registered (see CIP-0013 > Choice of URI scheme name) (cc @realdecimalist).

Maybe standardisation of "handles" by any means (cc @papag00se) would finally provide the impetus to standardise payment links. FYI we have an issue (also stalled due to abandonment) for community pressure on wallet providers to more uniformly support Cardano URIs; you can also advocate for this issue & maybe exert some influence with the wallet devs over it:

@papag00se

Copy link
Copy Markdown

@rphair, thank you for inviting remaining objections after the latest revision.

@kingslavcho, I appreciate the changes. Removing provider APIs from financial resolution, recognizing wallet discretion, and clarifying my withdrawal as co-author are meaningful improvements.

Several substantive issues remain, and at this point I feel like I am parroting the same points I have made previously. As I believe the intention of this CIP is to become more of an authority than a registry, I cannot keep making these suggestions in vain and will not anymore after this post.

Registry inclusion still triggers wallet behavior

The proposal says registry inclusion is not endorsement, but still requires wallets to:

  • automatically resolve through the only registered matching provider;
  • query all matching registered providers;
  • prefer earlier registry entries in some displays.

That contradicts wallet discretion.

Registry inclusion should establish technical discoverability only. Not dictate wallet inclusion.

The registry is still treated as an authority

The proposal calls the registry authoritative and prohibits unregistered Policy IDs from being resolved under the standard.

The registry should be authoritative only for the claims inside its own entries. It should not define every valid handle system on Cardano or prevent wallets from supporting providers through another standard, direct integration, or local configuration.

The resolver remains NFT-specific

The schema currently supports only policy_asset_holder and still requires NFTs, Policy IDs, and CIP-25 or CIP-68 metadata.

That is not a general handle-provider standard.

Either:

  1. narrow the CIP explicitly to NFT-holder resolution; or
  2. define versioned resolution profiles for other architectures, such as datum records, Plutus registries, delegated identifiers, and separate ownership/resolution records.

A free-text method name is not enough; each profile needs deterministic lookup, verification, failure rules, and test vectors.

Namespace matching remains incomplete

An input such as:

$alice.did

could match a prefix provider, suffix provider, and bare provider. The proposal does not fully define matching precedence or transformation for each candidate.

Bare providers also should not automatically receive lower priority. Prefix, suffix, and bare are syntax choices—not quality rankings.

Registry order should have no market semantics

Serial number or array position should not determine default selection or presentation priority.

Registry order, timestamps, serial numbers, and array position MUST NOT imply trust, recommendation, resolution priority, or preferred display placement.

Payment URI syntax should be removed

I agree with @rphair that Cardano payment URI standardization is a separate unresolved issue. This CIP can require explicit provider context without inventing a new URI format here.

Registry admission, verification, and removal remain undefined

I also do not understand who actually governs this registry.

The proposal says any provider may apply if it meets the technical criteria, and that CIP editors review submissions for compliance. It then relies on providers to mark themselves deprecated or inactive. But it does not define:

  • who verifies that a provider’s claims are factually correct;
  • who decides whether a provider is legitimate, compromised, abandoned, or malicious;
  • who may suspend or remove an entry;
  • what evidence is required;
  • how urgent security incidents are handled;
  • how disputes and appeals work;
  • how conflicts of interest are managed;
  • what happens when a provider refuses to update its own status.

These are not minor administrative details. If registry entries affect wallet resolution behavior, then admission and removal decisions become part of the security model.

There are two coherent approaches:

  1. Discovery-only registry: maintainers validate schema conformance and submitted evidence, but registry inclusion carries no trust or enablement semantics. Wallets independently decide which providers to support.

  2. Authoritative trust registry: the CIP must fully define governance, verification, suspension, removal, appeals, emergency response, and accountability.

The current proposal appears to give the registry authoritative consequences without defining the governance required to exercise that authority safely.

My preference remains the first model:

Registry maintainers verify objective technical conformance only. Registry inclusion does not establish provider trust, and wallets retain independent authority over provider enablement and removal.

@kingslavcho

Copy link
Copy Markdown
Contributor Author

@rphair @papag00se @Ryun1 changes committed:

  1. Payment URI section removed entirely per @rphair guidance

  2. Registry Governance section added following CIP-0010 model, CIP editors verify schema conformance only, provider legitimacy and trustworthiness remain at wallet discretion

  3. Bare namespace no longer has lower priority

  4. Explicit note added at the start of Collision Handling: when prefix, suffix, and bare all match simultaneously all are added as candidates and the user sees the collision selection interface, no automatic priority between namespace types

  5. Unregistered Policy ID prohibition softened - wallets MAY support providers outside this registry through direct integration or other standards

  6. Scope narrowed to NFT-holder resolution in Abstract so alternative architectures such as datum-based registries and Plutus contracts noted as future CIP versions

  7. Fixed JSON syntax error and Policy ID length in Appendix

On serial number display ordering, I am keeping the SHOULD language. Removing it entirely means wallets default to whatever their existing commercial relationships dictate, which is the problem CPS-0032 documented. SHOULD means
recommended but not mandatory. wallets retain full override capability. Without any ordering recommendation a new provider who registers a namespace first has no protection against an incumbent registering the same namespace later and being displayed first by wallets with existing relationships. This is the one point where I believe the community standard must provide guidance, even if it cannot enforce it.

@rphair rphair left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

thanks again @kingslavcho for the update; it seems we have enough updated material that a review at the next CIP meeting would be progressive: so I'm leaving it on Review for https://hackmd.io/@cip-editors/141.

@Ryun1 @perturbing & reviewers: I think the headings from @papag00se in his final #1229 (comment) would serve well as a checklist for editor / reviewer consensus in either declaring this a CIP candidate or declaring that any unresolved issues should still block this CIP's candidacy.

  • Personally I agree with enough of the points in that comment that they would serve us better than an attempt by a CIP editor to draft an entirely new list.
  • Even if they have been "fixed" by recent commits they should be confirmed in open review.
  • Hopefully we will have enough time to bring up these points one by one, to get a view from the community about whether they consider each particular challenge to be as serious as presumed and/or perhaps worth some effort in persisting even with known imperfections.

I still think it's a good plan to wait until this can be confirmed a CIP candidate — i.e. with any emphatic reservations addressed — before explicitly tagging any wallet reps to review this proposal.

Comment thread CIP-0???/README.md Outdated
Co-authored-by: Robert Phair <rphair@cosd.com>
@kingslavcho

Copy link
Copy Markdown
Contributor Author

@rphair thank you for keeping this on the meeting agenda and for the structured approach of using @papag00se's checklist as the review framework. I think that is fair and I welcome it.

I have renamed Registry Governance to Registry Process as suggested in your inline comment.

I will attend the meeting prepared to address each point on the checklist directly and concisely. For any points that the community considers still unresolved I am committed to making further adjustments rather than defending the current text for its own sake.

Looking forward to the discussion.

@rphair rphair changed the title CIP-???? | Handle Provider Registry & Resolver CIP-0196? | Handle Provider Registry & Resolver Aug 18, 2026

@rphair rphair left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

All those with a declared interest in standardisation of Handle resolution were present at the CIP meeting today, where this was confirmed as a candidate with the observations & resolutions below.

  • @kingslavcho please rename the containing directory to CIP-0196 and update the "rendered latest proposal" link in your OP. 🎉

Any concern the CIP editors may have had about undue influence appears settled by the paragraph added here, in the (recently renamed) "Governance" section: 72c80d8

It was also confirmed at the meeting that one of the most serious reservations from opposition review — that registry ordering would be applied to wallet behaviour — was also alleviated: with reviewers accepting my summary that this ordering is only a default in the list (providing a "conditioning" for otherwise unsortable data) but not mandating a "default" in the wallet itself.

Assuming this condition is generally understood & implemented, there were only 3 more reservations mentioned by @papag00se that we agreed are accepted to the point where wallet implementations can now fairly review this proposal:

1 - The CIP language is heavily geared toward NFT & policies vs. other means of resolving addresses... a better solution would invite "agnosticism" in addition to the policy-specific language: since some resolvers might not use tokens or policies at all for this (e.g. an asset-imitating data structure like #1200 as I mentioned).

2 - There will be some requirement to "police" the registry beyond what we have seen so far with other CIP registries. I pointed out that these solutions must always be adaptive: for instance the CIP-0010 registry isn't considered insecure just because anyone can post disruptive metadata to a project's designated label. It's understood that wallets will likewise have to choose their own measures to screen any disruptive elements in this registry.

  • @kingslavcho please commit to observing any CIP implementations to see if any common countermeasures emerge: since these should also be standardised in this CIP if possible.

3 - Collision avoidance: still a concern, though this also would have been noted at the outset of any treatment of this problem. We noted for example that 1) very few ADA Handles end in .did but also that both users and wallets would find their own ways of working their way around this... and this CIP in any case leaves each wallet free to take its own approach about how the collision would be presented and resolved in its UI.

Now as planned we have to turn this over to the wallet developers to see what they can offer to confirm or dispute the proposed improvement: which will be far more important than CIP editors' opinions from this point onward. I am hoping some wallet representatives (@AlexDochioiu @francisluz @MarcelKlammer @zuzunker & please tag others) will agree with me that:

  • some standardisation eventually needs to happen in the "Handles" field, and
  • whatever wallet(s) address this issue, either though this CIP or any other solution to CPS-0032, might broaden their user base accordingly.

Comment thread CIP-0???/README.md Outdated
@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 Aug 18, 2026
@kingslavcho

kingslavcho commented Aug 19, 2026

Copy link
Copy Markdown
Contributor Author

@rphair thank you for the detailed meeting summary and for confirming CIP-0196 as a candidate.

On Point 1 NFT/policy agnosticism:

The CIP already accommodates this through the onchain_method field which is defined as extensible. The policy_asset_holder method is the first defined method, not the only possible one. Future methods for Plutus contract registries, datum-based systems, or asset-imitating data structures like Token-Owned Addresses can be added as the CIP evolves without breaking existing implementations.
I will add a clearer statement in the Abstract and Specification making explicit that this CIP defines an interoperability interface - not a requirement to use NFTs or Policy IDs. Providers using other resolution architectures can register and document their own onchain_method. The registry format and wallet interface remain the same regardless of the underlying resolution technology.

On Point 2 Registry policing:

The current defenses are:

  1. Automated schema validation via registry.schema.json - GitHub Actions reject malformed entries before editors review them
  2. CIP editor review of each pull request for conformance with provider criteria
  3. Status field - providers mark themselves deprecated or inactive, editors can do the same for demonstrably defunct providers
  4. Wallet-level filtering - wallets retain full discretion to exclude providers independently of registry inclusion
  5. Community reporting - anyone can open a GitHub issue to flag a problematic entry

I commit to monitoring wallet implementations as they emerge and documenting any common countermeasures in the CIP. If wallets converge on common approaches to screening - blocklists, verification badges, trust scores - these can be proposed as additions to the Registry Process section.

On Point 3 Collision handling demo:

I have updated the reference implementation at getmyid.today/cip_demo_collision.html to demonstrate a live collision scenario with two real Policy IDs both having slavcho.did minted on preprod testnet. The collision picker UI is now demonstrable in practice rather than theory.

To wallet developers, the demo shows exactly what a wallet implementing CIP-0196 would need to build. The complete implementation including collision handling is approximately 60 lines of JavaScript. I welcome your technical feedback on whether the specification is clear enough to implement and whether anything needs adjustment from a wallet perspective.

@rphair

rphair commented Sep 8, 2026

Copy link
Copy Markdown
Collaborator

@kingslavcho (cc @papag00se for any similar work), perhaps relevant to the problem at hand & taking some of the heavy lifting (expected for wallets) out of the overall resolution framework:

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

Labels

Category: Tools Proposals belonging to the 'Tools' category. State: Confirmed Candiate with CIP number (new PR) or update under review.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants