demo · live / qr generator · live / SOL · USDC · USDT / solana-pay · any wallet
live · create your own QR

Create a payment QR.
Scan. Pay. Done.

Paste any Solana wallet address, set the amount and token, and get a scannable QR code instantly. Works with Phantom, Solflare, Backpack, and any Solana Pay compatible wallet. Everything runs in your browser.

inputwallet · alias · email
tokensSOL · USDC · USDT
outputscannable QR (PNG / SVG)
protocolsolana-pay · bip-21
§01 · try it

Create your QR code.

Paste your Solana wallet address, choose a token, set the amount. Get a scannable QR code you can print, embed, or share.

$ create qr 01 · input
try
pipeline t=0.00s · idle
1
Resolve recipient
wallet address or alias lookup
2
Validate wallet
ed25519 · base58 · 32-byte
3
Build Solana Pay URL
bip-21 · solana:<addr>?amount=…
4
Encode QR
qrcode · ecc-M · 33×33
5
Ready to scan
waiting for wallet · tx.finality
qr · scan
awaiting input
generate to render
recipient · resolved waiting for input
// paste a wallet address and click "Generate QR"
solana pay url · bip-21 utf-8 · urlencoded
// url appears here
§02 · code

Runnable Node.js example.

Copy-paste into any empty directory, npm install, and you have a working end-to-end QR generator. No SolUPG account needed for this snippet — it's just the public primitives.

copy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// $ npm i qrcode // $ node generate-qr.js taco-bell 0.1 const QRCode = require("qrcode"); const fs = require("fs"); // 1. Mock directory service (in production: GET https://api.solupg.dev/v1/resolve) const DIRECTORY = { "taco-bell": "4vyomkhcqdp66vzbq8gHcc3mPiRW2Mm8uFT7NVq88EH4", }; async function main() { const [alias, amountArg] = process.argv.slice(2); const amount = amountArg ?? "0.1"; // 2. Resolve alias → wallet const wallet = DIRECTORY[alias]; if (!wallet) throw new Error(`unknown alias: ${alias}`); console.log(JSON.stringify({ alias: alias, wallet: wallet }, null, 2)); // 3. Build Solana Pay URL (bip-21) const url = `solana:${wallet}` + `?amount=${amount}` + `&label=${encodeURIComponent("TacoBell")}` + `&memo=${encodeURIComponent("SolUPG Payment")}`; console.log("url:", url); // 4. Encode QR — pick one: terminal · base64 · PNG file console.log(await QRCode.toString(url, { type: "terminal", small: true })); const b64 = await QRCode.toDataURL(url); // base64 image await QRCode.toFile("./checkout.png", url, { width: 512 }); // PNG file console.log("✓ wrote checkout.png ·", b64.length, "b (data-url)"); } main().catch(console.error);
§03 · end-to-end

Six steps. Sub-second.

From the moment a user types an alias to the moment funds are finalized on mainnet.

01
User enters alias
"taco-bell"
Any human-readable handle — alias, email, phone, .sol domain, or raw wallet.
02
Backend resolves to wallet
GET /v1/resolve
Directory service returns the canonical 32-byte Solana address. OTP-verified at registration.
03
Build Solana Pay URL
bip-21 · utf-8
Canonical solana:<wallet>?amount=… scheme. Compatible with every major wallet.
04
Encode as QR
qrcode · ecc-M
Medium error-correction, 33×33 modules. Renders as SVG / PNG / terminal / data-URL.
05
User scans with wallet
phantom · solflare · backpack
Wallet reads the URL, pre-fills amount & memo, asks the user to approve.
06
Tx executed on-chain
< 800ms finality
Merchant's webhook fires on payment.finalized. Dashboard updates live.
§04 · wallet-side mock

What the payer sees.

The QR decodes into a standard Solana Pay request. Every wallet renders it the same way.

9:41 ••• 100%
Review payment
T
TacoBell
4vyo…88EH4
verified
0.1 SOL
≈ $14.95 USD
MemoSolUPG Payment
Network fee~0.000005 SOL
Settlementinstant · mainnet-beta
Slide to approve
Cancel

Identical across wallets.

Because the payload is a standard Solana Pay URL, every major mobile wallet — Phantom, Solflare, Backpack — parses it identically. The merchant writes zero wallet-specific code.

  • No deep-link registration
  • No wallet SDK dependency
  • Works in person (print QR) or online (embed)
  • Amount & memo are tamper-evident

Tweaks