Skip to content
Mailing Lists/CIP-112: how should investors access holdings held by a qualified custodian?Source on lists.sync.global ↗

CIP-112: how should investors access holdings held by a qualified custodian?

globalSyncForumCIP-01120 messages
  1. #1mani27-07-2026source ↗
    Hi all,

    We're building otcDigital, a multi-participant marketplace for RWAs on Canton. The marketplace connects buy-side institutions, sell-side firms, qualified custodians, transfer agents, and FMIs covering primary market workflows (tokenization, subscription, allocation, DvP settlement) and secondary market trading and instant settlement across multiple asset classes.

    We've been implementing CIP-0112 as our standard throughout, and hit a gap I'd like to raise for discussion. For reference: we're using Splice 0.6.12, Canton 3.5.8, Daml SDK 3.5.2, splice-api-token-holding-v2-1.0.0, -allocation-v2-1.0.0, and -allocation-instruction-v2-1.0.0 DARs.

    The situation
    In institutional markets, most assets aren't held directly by end investors they're held by a qualified custodian (a regulated bank or broker-dealer) on behalf of the client. The HoldingV2.HoldingView data model seems to cover this: Account.owner for the beneficial owner (investor) and Account.provider for the custodian, with a spec requirement that both MUST have visibility. So we set up accounts that way.
     
    In our first implementation, the investor was correctly named as Account.owner in the view, but still could not query the holding unless the concrete template also declared them as an observer.

    The reason is a gap between the view semantics and Canton's routing mechanism. HoldingV2.HoldingView is data that a party reads after they have access to a contract - it plays no role in determining who receives the contract. Canton routes contracts based solely on the signatory and observer clauses of the concrete Daml template. An investor named in Account.owner who isn't also declared as observer in the underlying template receives nothing, regardless of what the view says.Please correct us if our observations are wrong. 

    The practical issue is that these account fields are interface view data. They describe the account after a party already has access to the contract; they do not themselves route the contract to that party. Each implementor must still decide how to connect the account parties, especially Account.owner, to concrete Daml stakeholder or observer declarations.

    What we did
    We built a concrete holding template that explicitly declares investor parties as Canton observers, routing the contract to their participant node. We also caught that our initial view had Account.owner = custodian semantically backwards from the spec's intent. The fix is straightforward: set Account.owner = investor in the view AND declare them as observer in the template body. But these are two separate steps, and the spec currently provides no guidance connecting them. For allocation-based settlement, we now propagate this through the typed CIP-0112 field AllocationSpecification.authorizer
     
    Note that this solution is not interoperable: a third-party wallet implementing only HoldingV2.Holding cannot determine from the interface whether Account.owner actually has ledger access.
     
    Questions for the group
    1Can the Foundation confirm that Account.owner = beneficial owner (investor) and Account.provider = custodian is the intended mapping for the qualified custody pattern? Or is the intended mapping different?

    2Is there a normative reference implementation of the qualified custody pattern that shows how Account.owner is wired to a Canton observer declaration? If not, would the Foundation consider publishing one?

    3) Should CIP-0112 add clearer conformance guidance or reference tests for qualified custody, specifying when a compliant holding should route to the Account.owner party's participant node, and how that should be represented in concrete Daml templates?

    4How does the standard envision handling multi-tier custody chains (investor → custodian → prime broker → CSD)? Account has two tiers; real custody chains often have more.
     
    Keen to hear how others are handling this, particularly anyone integrating custodian or asset manager workflows.

    Thanks, 
    Mani Pillai,  mani@...
  2. #2Bernhard Elsner27-07-2026source ↗
    Hi Mani,

    You are right "that Account.owner = beneficial owner (investor) and Account.provider = custodian is the intended mapping".
    You could equally well make them just observers in some cases. But they MUST be observers. The spec does say that for the provider (https://github.com/canton-network/splice/blob/main/token-standard/splice-api-token-holding-v2/daml/Splice/Api/Token/HoldingV2.daml#L37). For the owner, it doesn't explicitly say so, but it's definitely the intent.
    The reference implementation has a highly configurable account authorization model so you likely only need to take those tests that apply.

    Best,
    Bernhard

  3. #3mani28-07-2026source ↗
    Thanks, Bernhard.
    This is helpful and confirms the main mapping question.

    We agree that making both account parties signatories is stronger than making one of them an observer. For our marketplace model, though, we want to keep the investor observer-only.

    The reason is that the trade has already been executed in an off-chain venue before the Canton settlement workflow begins. We do not want front-office users, whether dealers or investors, to become required signers in the post-trade settlement path. Settlement should be operated by the relevant custodial / administrative parties under the agreed market workflow.

    At the same time, in a real-time 24x7 market, front-office users need direct ledger visibility into settlement finality. Once settlement completes, they should be able to rely on that final state immediately for subsequent trading, financing, collateral, or liquidity decisions, without waiting for a back-office/custodian report or an application-layer reconciliation cycle.

    This is exactly where CIP-0112 is powerful for us: it lets us support a true decentralized 24x7 marketplace with full lifecycle privacy, while giving each authorized participant the level of ledger visibility and authority appropriate to its role.

    Regards,
    Mani