Skip to content
Payvol

Payvol Route

Say how a payment settles. Let somebody else run it.

Route describes the path a request will take on Canton, in a shape every module downstream already understands. It does not price, hold liquidity, or execute anything.

Read the docs See all modules

@payvol/coreexpresses, never executesdirect today In development

The code exists and runs in this repository. It is not published yet, so there is nothing to install.

One source of truth

Owning execution is how a standard turns into a product you cannot leave.

The moment a payment layer runs its own matching engine, everyone downstream depends on that engine being up, being fair, and staying in business. Route takes the opposite side: it expresses the settlement path precisely enough that anyone can execute it, and then gets out of the way.

The amount lives in exactly one place

One truth

What the payee must receive is stated once, on the request. Every settlement option derives from it. A second copy on the option would be a second truth, and the two would drift the first time somebody edited one.

Declared once, referenced per option

No repetition

The conditions a payment depends on are defined at the top of the request and referenced by the options that need them. Different paths need different conditions, and none of them repeat the definition.

We describe, providers execute

Where the line sits

Payvol never quotes a price, never holds inventory, never guarantees atomicity. Those belong to whoever runs the settlement, along with the responsibility when one of them fails.

Every route returns the same five things

One shape back

Whatever path a payment took, the record that comes back has the same shape. That is what lets a reconciliation engine treat a direct transfer and a future conversion identically.

How it works

Read, resolve, prepare.

01

Read

  • Take the settlement options off the request
  • Read what the payer actually holds
  • Filter to the options that can run today

02

Resolve

  • Check the conditions each option references
  • Drop any option whose conditions cannot be met
  • Present what is left, with the reasons for what was dropped

03

Prepare

  • Build the Token Standard transfer for the chosen option
  • Attach the identifier to the settlement metadata
  • Hand the prepared transaction to the wallet's signing flow

Where the line sits

Three ways a payment layer can treat settlement.

01

Run the engine

the layer executes

The payment layer matches, prices and settles. Integration is easy on day one, and every participant now depends on one operator staying online, neutral and solvent.

Convenience bought with dependency

02

Say nothing

settlement left undefined

The format carries an amount and a payee and stops. Every integrator invents their own answer for how the payment actually runs, and no two of them agree.

Interoperability that ends at the transfer

03

Describe the path

Payvol Route

The route is expressed in the request, precisely enough to execute and neutral enough that anyone can. The engine is somebody else, and replacing it changes nothing upstream.

Precision without a dependency

Boundaries

What Route deliberately does not do.

This is the module where saying no matters most, because everything it refuses is something a vendor would happily sell you.

No pricing, ever Payvol does not quote a rate, imply a rate, or assume that two assets are worth the same. When a conversion happens, the provider's quote is the only number in play.
No liquidity, no inventory Nothing is held, pooled or fronted. Route describes a path that somebody else has the assets to walk.
No atomicity promise Where a path is atomic, it is atomic because the Token Standard and the provider make it so. Payvol reports that guarantee rather than issuing it.
No engine, later either If Cayvox ever builds a conversion product, it will be a separate name consuming this same interface, with no privileged position inside it.

For integrators

The route object is small on purpose.

It names the option, the conditions it depends on, and the references that come back after settlement. Everything else is the executor business.

Read the docs What comes back

import { validateArtifact } from '@payvol/core/draft02'

// the options a request declares, and the conditions each needs
const result = validateArtifact(artifact)
const { options, requirementDefs } = result.artifact.payload

// an option a payer could not evaluate is refused, never ignored
result.valid   // false
result.code    // 'UNRESOLVED_REQUIREMENT_REF'

Where it is used

1 of the six situations reach Route.

Direct today. The shape is ready for the rest.

Build against it now and the day conversion arrives, your integration does not move.

Read the docs See the other modules