01
Built on the Canton Token Standard
Transfers run through the instrument registry’s own entry points, under CIP-0056.
Payvol Request
Create a request once. Get paid from any wallet. Settled in seconds, on-chain, and it matches itself.
Payment request devnet
The rail
Four properties of the network underneath, each shown with the evidence we captured.
01
Transfers run through the instrument registry’s own entry points, under CIP-0056.
02
Not a target. This is our own measured run, read from the committed fixtures.
requested 13:03:13.66Z recorded 13:03:19.32Z
03
One structured instrument field carries any instrument on the network.
04
No relay to trust and no public index to scan. The payee reconciles on its own ledger.
Every value on this row is read at build time from the committed fixtures. Nothing here is typed by hand. packages/payvol-conformance/fixtures/
What it makes possible
One portable request, fulfilled by any conforming wallet, settled on Canton. These are shapes the standard makes possible.
Corridors
Settled in
5.7seconds
Create a request
Payee
Amount
Reference
INV-2026-0045
Expires
30 days
Create request
Share as
Atomic settlement
210.00of 500.00 this month
A cafe · Table 4
Scan to pay
2 flat white9.60
Paid from
Any conforming wallet
Terminal
None needed
Payvol
one artifact
Needed
No session, no relay
How it works
Five steps, one artifact. No session to keep alive, no relay in the middle, no account to open on either side.
01
Amount, instrument, reference and expiry, written once into a canonical object with a stable hash.
rendered from the object
Encodes to a QR, a link and an NFC record
no serverno session
canton:payvol-demo-recipient?instrument=DSO%3A%3A1220be58c29e65de40bf273be1dc2b266d43a9a002ea5b18955aeef7aac881bb471a%2FAmulet&amount=1245.40&reason=Payvol%20demo%20invoice%20INV-2026-0045&reference=INV-2026-0045&expiry=2026-09-20T00%3A00%3A00Z&label=Payvol
02
The artifact carries everything a wallet needs, so it can be printed, emailed or handed over offline.
Everything a wallet needs, nothing it must fetch
Print it, hand it over, pay it later
03
The wallet prepares the transaction and shows the exact fields being authorised. Nothing is hidden behind an opaque payload.
Canton CoinDSO::1220be58… / Amulet 1,245.40 gpLaLGoZCdmyStwfn9xwfdgOuLbm8mTgCmkjyIJWI+M=
HASHING_SCHEME_VERSION_V2
04
The transfer runs through the instrument registry under CIP-0056, atomically, and is disclosed to the payer, the payee and that registry rather than to the network.
122097838979b331f7…162d
payer, payee
Canton Cointransferred, not wrapped TransferFactory_Transfer
splice.lfdecentralizedtrust.org/reason
05
The reference travels with the payment, so the payee matches it on its own ledger without a reconciliation run.
Read on the payee own ledger, no public index scanned
The reference arrives with the payment
On the surface, under the hood
The payer scans a code. What they scanned is a link. What the link carries is a canonical object with a stable hash. Same bytes, three ways to hand them over.
What the payer sees
Under all three
canton:payvol-demo-recipient?instrument=DSO%3A%3A1220be58c29…471a%2FAmulet&amount=1245.40&reference=INV-2026-0045
One object, one hash
sha256 c7f2…c6a3
Change any field and the hash changes. Nothing is negotiated in transit.
The same request is shown three ways: the canonical JSON the specification defines, the canton: URI a link carries, and the QR a Canton Coin wallet scans. All three carry one object with the digest c7f2…c6a3.
Built for institutions
Request to pay is how corporate payment already works. Payvol carries the same primitive to a ledger where the cash leg can settle atomically against an asset.
The cash leg of a tokenized trade
Asset and payment clear in one transaction, or neither moves.
One field, any instrument
Tokenized cash, funds or securities, carried in the same request.
Settlement detail stays with its parties
Counterparties and the instrument registry see the transfer. The rest of the network does not.
Where an institutional request primitive leads
Intercompany netting across subsidiaries, corporate actions and fund subscriptions as batched requests, compliance data carried alongside the request rather than reconciled afterwards, and approval policy expressed on the request itself. Directions the standard is designed to reach, not deployments.
For developers
Encode an object, render it however you like. The spec, the vectors and the settlement evidence are open.
// npm i @payvol/core @payvol/qr
import { encode } from '@payvol/core';
const uri = encode({
version: '0.1',
type: 'transfer',
recipient: 'payvol-demo-recipient',
instrument: 'DSO::1220be58…471a/Amulet',
amount: '1245.40',
reference: 'INV-2026-0045',
}); Returns
canton:payvol-demo-recipient?instrument=DSO%3A%3A1220be58c29…471a%2FAmulet&amount=1245.40&reference=INV-2026-0045
Where it is used
Send an invoice that matches itself when it is paid
One code on a counter, payable from any wallet
Ask an internal counterparty for a transfer, with a record
A request a program can produce, check and pay
Bill for node operation, and read the settlement yourself
Pay many parties, and know which payout was which
Wherever the payer is
The payer can be anywhere and hold anything the network supports. What settles is always a Canton instrument.
Amount due
1,245.40
reference INV-2026-0045 · expires 2026-09-20
Held by this wallet
Also carried by the same request
Request details
Settles
in seconds
Visible to
payer, payee
No account · no portal · no relay