Messages
Message Types
RegisterNotaryInfo
Purpose: Register a new notary configuration that DApps can use for asset notarisation, and provision its native
x/vcv verification route.
Sender: Any address (becomes the admin if notary_info_admin is not specified)
Parameters (proto/d/notary/v1/tx.proto, MsgRegisterNotaryInfo):
sender: transaction signernotary_info_admin: Admin address (optional, defaults to sender)asset_type_id: Type of assets this configuration handles (e.g. invoice)ext_opt_route: OptionalRegisterNotaryRouteused to verify verifiable presentations carried as tx extension options (enforced by the vcv ante handler)content_route: RequiredRegisterNotaryRouteused to verify theverifier_inputcontent during notarisation
Each RegisterNotaryRoute is a flat structure {issuer, typ, routes, verification_materials} — the typ is the
x/vcv route type (currently only SD-JWT, ROUTE_TYPE_SD_JWT), routes are the d.vcv.v1.Requirements and
verification_materials are the issuer's JWK public keys. The issuers map of the resulting x/vcv Route is compiled
in state (compileRegisterRoute, x/notary/keeper/verifier.go) because gogoproto map entries cannot be carried in a
tx.
VCV Integration (x/notary/keeper/ms_notaryinfo.go):
- The notary keeper stores the
NotaryInfo, compiles each providedRegisterNotaryRouteinto anx/vcvRoute{Admin, Typ, Requirements, Issuers}and callsVcvKeeper.SetRoute(ctx, routeId, route)withrouteId = BuildNotarisationExtOptRouteId(notaryInfoId)(/d.notary.v1.MsgNotarise:extop:<notaryInfoId>) and/orrouteId = BuildNotarisationContentRouteId(notaryInfoId)(/d.notary.v1.MsgNotarise:content:<notaryInfoId>). - There are no verifier contracts and no contract addresses; the routes are persisted natively by
x/vcv.
Returns: notary_info_id for the newly registered configuration. (The response also defines
notary_ext_opt_route_id and notary_content_route_id fields, but the keeper does not currently populate them — only
notary_info_id is set.)
UpdateNotaryInfoRoute
Purpose: Update the x/vcv route(s) provisioned for an existing NotaryInfo.
Sender: Must be the admin of the NotaryInfo
Parameters (MsgUpdateNotaryInfoRoute):
sender: transaction signernotary_info_id: ID of the notary configuration to updateext_opt_route: OptionalUpdateNotaryRoutefor the extension-option routecontent_route: OptionalUpdateNotaryRoutefor the content route
VCV Integration (x/notary/keeper/ms_notaryinfo.go, mergeUpdateRoute):
- For each provided
UpdateNotaryRoute, the keeper loads the existing route (or creates a fresh one owned by the admin if none exists), overwrites itstypandrequirements, and updates-or-appends the issuer in the route'sIssuersmap. A nilUpdateNotaryRouteleaves that route untouched.
Returns: notary_info_id, notary_ext_opt_route_id, notary_content_route_id
Notarise
Purpose: Notarise an asset by providing a verifiable presentation that proves asset validity.
Sender: Any address
Parameters (MsgNotarise):
sender: transaction signernotary_info_id: ID of the notary configuration to useverifier_input: Verifiable presentation bytes (SD-JWT) for verificationasset_data: JSON-encoded asset data (structure depends on asset type, e.g.AssetInvoiceData)owner: Asset owner address (optional, defaults to sender)max_notarise_fee: Optional maximum fee the sender is willing to pay (nil = no limit, 0 = reject any fee)
VCV Integration (x/notary/keeper/keeper_notarise.go):
- If an extension-option route exists for the
NotaryInfoId, the vcv ante handler first verifies the verifiable presentation carried as a tx extension option (via the notary keeper'sGetMsgExtensionOptionRequirements,x/notary/keeper/exported.go) - Build the content
routeId(/d.notary.v1.MsgNotarise:content:<notaryInfoId>) and fetch the route viaVcvKeeper.GetRoute(ctx, routeId) - Parse the asset data and calculate the
AssetIdas a SHA256 hash of asset components (calculateAssetId) - Call
VcvKeeper.VerifyVerifiablePresentation(ctx, route, vp, compareTo)with theverifier_inputas the verifiable presentation and acompareTomap of{"AssetId": assetId, "OdpHash": odpHash} x/vcvnatively verifies the SD-JWT presentation against the route's issuer requirements and verification materials- If verification fails, the notarisation is rejected with an error
Returns: notarised_asset_id (the SHA256 asset id), along with notary_info_id and asset_type_id
Additional Processing:
- Calculates the notarisation fee from the asset value via the configured currency conversion rate, EUR price in adt, and notarisation fee rate
- Transfers the fee from the sender to the module account and burns it
- Stores the
NotarisedAssetin state - Emits
EventNotarisewith the asset id and fee burned
UpdateNotarisedAsset
Purpose: Update the state of an existing notarised asset (e.g. status, owner, operator, issuance id, collateral ref).
Sender: Must be the asset's owner or operator_proxy
Parameters (MsgUpdateNotarisedAsset):
sender: transaction signernotarised_asset_id: ID of the notarised asset to updatenew_asset_data: JSON-encodedAssetInvoiceUpdateData
Returns: updated_notarised_asset_id
VCV Integration: None — updating an already-notarised asset does not re-run verification.
UpdateAdmin
Purpose: Transfer admin rights of a NotaryInfo to a new address.
Sender: Must be the current admin of the NotaryInfo
Parameters (MsgUpdateAdmin):
sender: transaction signernotary_info_id: ID of the NotaryInfo to updatenew_admin: New admin address
VCV Integration: None — no verification required for admin updates.
RemoveNotaryInfo
Purpose: Delete a notary configuration.
Sender: Must be the admin of the NotaryInfo
Parameters (MsgRemoveNotaryInfo):
sender: transaction signernotary_info_id: ID of the NotaryInfo to remove
Effects:
- Removes the
NotaryInfofrom state - Future
MsgNotarisecalls with thisnotary_info_idwill fail (the route can no longer be resolved)
VCV Integration: None — no verification required for removal.
Fee and Pricing Messages
The following authority-gated messages configure the inputs used to compute notarisation fees:
- SetCurrencyConversionRate (
MsgSetCurrencyConversionRate): set a currency's conversion rate to EUR. - SetEurPriceInAdt (
MsgSetEurPriceInAdt): set the price of 1 EUR expressed in adt. - SetNotarisationFeeRate (
MsgSetNotarisationFeeRate): set the notarisation fee rate (EUR equivalent).
Each requires the sender to be the module authority and performs no VCV verification.