Rezva

Wallet integration

Add Rezva as a resolver step beside the wallet’s existing QR scanner, transaction builder, signer, and confirmation screen.

Integration contract

Rezva accepts a typed identifier and returns lifecycle state plus compatible payment destinations. It does not hold keys or execute a transaction.

QR or typed input
       ↓
parse { resolver_url, type, value }
       ↓
POST resolver_url/v1/resolve
       ↓
validate status + payment_ready
       ↓
show destination and ask for confirmation
       ↓
wallet signs and broadcasts

Minimum implementation

  1. Extract and validate resolver_url, type, and value.
  2. POST { type, value } to the resolver URL with an approved provider key or prototype Free API key.
  3. Require status === "active" and payment_ready === true.
  4. Filter payment_options by a chain and asset supported by the wallet.
  5. Display destination, chain, asset, token contract, and constraints before confirmation.
  6. Build, sign, broadcast, and monitor the transaction using wallet code.

QR parsing

type RezvaQrPayload = {
  resolver_url: string;
  type: string;
  value: string;
};

function parseRezvaQr(raw: string): RezvaQrPayload {
  const payload = JSON.parse(raw) as Partial<RezvaQrPayload>;
  if (
    typeof payload.resolver_url !== "string" ||
    typeof payload.type !== "string" ||
    typeof payload.value !== "string"
  ) {
    throw new Error("Unsupported Rezva QR payload");
  }
  return payload as RezvaQrPayload;
}

Resolve and gate payment

const qr = parseRezvaQr(scannedText);
const response = await fetch(qr.resolver_url, {
  method: "POST",
  headers: {
    "content-type": "application/json",
    authorization: `Bearer ${providerApiKey}`,
  },
  body: JSON.stringify({ type: qr.type, value: qr.value }),
});

if (!response.ok) throw new Error(`Resolver HTTP ${response.status}`);
const result = await response.json();

if (result.status !== "active" || result.payment_ready !== true) {
  showUnavailableState(result.status);
  return;
}

const payable = result.payment_options.filter(
  (option: { chain: string; asset: string; payment_ready: boolean }) =>
    option.payment_ready,
);
showPaymentOptions(payable);

Do not delegate to Rezva

  • Private-key custody or transaction signing
  • Final amount selection without user confirmation
  • Blockchain settlement or payment guarantees
  • Registry mutations without controller authorization

Use the Authentication page for credential boundaries and the API Reference for field definitions and error responses.