đ The new DA Apps docs are here! Explore our updated content and improved layout. Looking for the previous version? You can still find the complete Legacy Utilities Docs here.
As a Canton Network explorer, enhance your UpdateId detail view with the Proof of Transfer functionality for DA Registry Assets. As a wallet builder add a unique verification feature to your offering.
Integrating Proof of Transfer capability into a Canton Network Explorer gives users a seamless interface to verify transaction statuses natively, while preserving privacy.
To provide a seamless customer journey, the Explorer handles incoming payload informationâan UpdateID and a Transfer Object payloadâusually supplied via direct user copy-pasting or automated routing via a platform referral URL parameter. The platform then submits this data payload to the DA Registry API to render an indisputable confirmation receipt.
Follow this workflow sequence to build the verification stack inside your network explorer ecosystem.
1
1. Configure the Target Inbound Route
Create a dedicated, public route in your application routing profile (e.g., /verify-transfer) designated to handle incoming cryptographic verification payloads. Ensure the handler is equipped to extract query string components seamlessly if redirected from external wallet histories.
2
2. Construct the Payload Input Form Interface
Design a clean input card component. If parameters are present in the URL path, auto-populate the data fields for the user. If blank, provide a structured text area box allowing the user to paste their raw transaction JSON payload manually.
3
3. Query the DA Registry Endpoint
Dispatch an asynchronous network request from your application frontend layer directly to the live DA Registry network service infrastructure node using the structured body schemas.
4. Parse Outcomes & Render Visual Verification Status
Read the structured enum value returned from the API service. Update the client view container to reflect the deterministic ledger evaluation output cleanly using descriptive status layouts.
To ensure alignment with network expectations, map the direct string responses from the DA Registry API into intuitive, color-coded dashboard indicators for your end users.
The transaction variables are authenticated against the ledger state and indicate successful contract finalization.
Response Sample
{ "status": "Success"}
Interface Suggestion: Render a prominent checkmark module highlighting an âIndisputably Settledâ receipt statement. Users can confidently treat this transaction as settled.
The parameters represent a structurally valid ledger entry path, but the contract steps are still moving through live execution queues.
Response Sample
{ "status": "Pending"}
Interface Suggestion: Inform users that the asset transfer is in an intermediate lifecycle phase (e.g., a two-step transfer workflow where the destination party hasnât formally accepted an open offer yet). Advise re-evaluating once final settlement commits.
The proof data successfully resolved to a historical ledger event path, but the workflow instructions failed execution or were rejected.
Response Sample
{ "status": "Failure"}
Interface Suggestion: Update the dashboard to inform the user that the transaction request was intentionally canceled, explicitly aborted by a counterparty, or simply expired on-chain.
The input fields failed lookup, are missing parameters, or contain structured mismatches against live on-chain transactional tracking parameters.
Response Sample
{ "error": "invalid_request", "error_description": "Something went wrong"}
Data Privacy Guardrail Rule: The backend deliberately zero-discloses tracking details to prevent unwanted transaction state farming by unauthorized actors. Ensure your Explorer frontend handles errors elegantly with a general âInvalid Proof Credentialsâ module rather than displaying custom data logs.
To enable this transfer proofing capability, wallets must make the Transfer Object payload and UpdateID extractable, allowing end-users to easily locate and copy this data directly from their transaction history to use in proofing services or network explorers.This guide provides the technical specifications for locating and extracting the Transfer Object from the ledger via the JSON API.
Technical Guidelines: What Constitutes the Transfer Object?
The UpdateID is the unique identifier for a transaction on the ledger. With it, you can fetch the Created, Exercised, and Archived events for that specific transaction. NOTE: The wallets need to ensure that they display the most recent update for a given transfer. For example, in the case of a 2 step transfer, Wallet Providers will need to explicitly refresh the updateID, after the transaction has been accepted, so that they display the transfer, not just the offer.The underlying schema defining the Transfer Object can be referenced in the DAML model here: Splice/Api/Token/TransferInstructionV1.damlThe Transfer Object can also be serialized into JSON format, as shown in the following example:
Fetching the Data via JSON APIWhile gRPC can be used, this guide assumes integration via the DAML JSON API.To fetch update info from the participant node, query the following endpoint using the transactionâs UpdateID: GET /v2/updates/update-by-id
Locating the Transfer Object (By Transaction State)
Depending on the lifecycle stage of the transaction, the Transfer Object is located in different event arguments. You will need to parse the events returned from the endpoint above based on these three scenarios:Scenario A: The Transfer Offer is CreatedIf the update represents the creation of a transfer offer, look for a Created event.
Scenario B: The Transfer is ConcludedIf the update represents a concluded transfer (e.g., an accepted offer or a pre-approved transfer), look for an Exercised event.
Scenario C: The Transfer Offer is Rejected or WithdrawnIf the update represents an offer that was ultimately rejected or withdrawn, locating the object is a two-step process:
Identify the Event: Look for an Exercised event matching the following:
Ledger data is subject to pruning. The JSON API queries described in the previous section will only succeed if the transaction events have not yet been pruned from the participant node.Wallet Developer Action Required: To ensure end-users can always access their Transfer Objects for the proofing service, wallets MUST persist the Transfer Object and UpdateID data in their own backend databases at the time the transaction occurs. Relying strictly on real-time ledger queries for historical transactions will result in errors once the transactions are pruned. PQS can be considered as an option for storing ledger data.
LabellingThere are two key items to be displayed within the transaction details:
UpdateID
Transfer object
Displaying valueA truncated preview of the UpdateID can be displayed or in full. A truncated preview of the json object can be displayed as needed or none at all.Interactive optionsUsers must be able to review the full json object.Option 1
Click to open a modal/side-panel component or an external browser window. Since the content is hidden to start, when a user clicks to open this component, the json object should by default be displayed fully. This component shows the label of âTransfer objectâ, contains the full json object for reviewing, and an accessible copy button.
If an external window is used, its domain must match the application domain from which the window was triggered.
The icon or button for a user to click to review the json object must be accessible, alongside the copy icon/button. Users can copy the object without opening the review component.
Option 2
Click to open the accordion containing the content. The accordion is closed by default, and a copy button is accessible without opening the accordion.
The Proof of Transfer API is supporting the validation of multiple transactions within an UpdateID, that means also Batch Transfer can be validated. In order to enable it from a wallet perspective, ensure that end users can extract the Transfer Object for each individual transaction of a batch.
Copying behaviorThe copy behavior must always copy the full UpdateID and full json object, never the truncated preview string.
Assistant
Responses are generated using AI and may contain mistakes.