Skip to content
Payvol

Payvol Verify

Never ask a payer to trust a green tick.

Verify checks a payment request against its profile before a wallet shows it, and names the rule behind every refusal. What it cannot establish, such as whether a signature is genuine, it reports as not checked rather than as a pass.

Add Verify to a wallet Try it in the app

@payvol/coreruns offlinefails closed

What it does

One checkmark hides the question that matters.

A request can have perfect bytes and a perfect signature and still come from the wrong company. Collapse every check into a single green state and the payer cannot tell which part was actually established. Verify keeps the answers apart.

Unknown is a rejection, not a shrug

Fails closed

An unrecognised profile, a malformed field, an expired request. Each one stops the request before a pay button can render, with the reason code of the rule it broke.

A valid signature is not a verified merchant

Identity kept separate

Cryptography proves the bytes were not altered by someone without the key. It does not prove whose key it is. Verify keeps those two facts apart and refuses to let the second borrow confidence from the first.

The request declares, the wallet checks

Checked at pay time

A request states what the receiving side needs. It never carries a claim that those conditions are met, because a request created on Monday cannot know what is true on Thursday.

Two implementations, one verdict

Same answer everywhere

The conformance vectors decide what is correct. They are published in @payvol/conformance with a runner, so a second implementation can check that it agrees with this one.

// same request, two independent readers
reader A -> 9f2c...41a7
reader B -> 9f2c...41a7

// a disagreement is a failing test, not a bug report

How it works

Read, check, answer.

01

Read

  • Take the canton: URI from a QR code, a link or an NFC tap
  • Refuse input that is too large or does not parse
  • Refuse a profile version it does not implement

02

Check

  • Check every field against the profile's rules
  • Check the expiry against the time you evaluate at
  • Report the signature as absent or not checked
  • Warn about a request that is well formed but unpayable as written

03

Answer

  • Refuse with the reason code of the rule that failed
  • Return a valid request with its warnings
  • Leave the decision to your own policy

Scope

What Verify leaves to the wallet.

It does not decide for the wallet Verify produces answers. The thresholds, the trusted origins and the final call belong to the wallet that ships it.
It does not resolve identity Mapping a key to a real company is the job of a registry, a credential, or the payer. Verify consumes that answer and never invents it.
It does not verify signatures No implementation can verify a Payvol signature yet, because the Canton external party key and signature scheme is an open question. The bytes a signature must cover are pinned by conformance vector, so two implementations cannot diverge on them.
It does not sign, submit or settle Signing stays inside the wallet's own flow, and a request that passes every check can still fail at the ledger. Verify describes the request, not the payment.

Get started

Check a request before you show it.

Install the package, pass validate the URI you scanned, and act on the answer. It runs inside the wallet: no network calls, no keys, no account.

npm i @payvol/core version 0.4.0 TypeScript
import { validate } from '@payvol/core';

// the canton: URI read from a QR code, a link or an NFC tap
const result = validate(scanned);

if (result.valid) {
  result.warnings; // what is questionable, never a refusal
  result.signatureVerified; // 'absent' | 'not-checked': no signature was verified
  wallet.present(result.payvol);
} else {
  wallet.refuse(result.code); // the rule that refused it, for example 'EXPIRED'
}