HPAY tools
These tools shipped in Games/Biome 1.21.0 on hartiibiome.com. They are Beta: tested by the project's own test suites, not independently audited. Start with small amounts.
All of them are non-custodial. The payer's wallet signs, the money goes straight to the payee, Hartii takes no fee, and
there is no new contract. They share the HPAY Request v1 link format and its payment matcher. An
unknown number is always shown as a dash, never as 0. Every tool page is noindex.
12 confirmations is a placeholder until finality on Quai has been measured on mainnet. Where a tool lets you change it, the range is given below.
Point of sale
https://hartiibiome.com/hpay/pos is for a shop. It works on a phone or a tablet.
- Save your Quai address or Hartii @name once. It is stored on this device only.
- Type a price in dollars on the keypad and press Charge. A shop can add a note for the customer (up to 60 characters), which appears on the customer's payment page and on the receipt.
- The page asks for a quote, then shows a QR code of a tagged request with a 15 minute price lock and a countdown. The customer scans it and pays from their own wallet.
- The screen turns green with Paid only when the payment matcher says the payment has the confirmations the sale was opened with.
Each sale is one reference (POS-0001, POS-0002, and so on), one fresh quote and one tag. A tag is not reused for
30 minutes after a sale ends, so a late payment to an old sale cannot pay a new one. Nothing can mark a sale paid by
hand.
Confirmations. In Settings, "Confirmations before a sale shows Paid" is 1 to 12, default 12. Each sale keeps the number it was opened with. A shop can wait for fewer than the customer's own page does, never more.
What the statuses mean:
| Status | Meaning |
|---|---|
| Waiting | The sale is open. No confirmed payment yet. |
| Paid | A payment matched the sale's address, exact tagged amount and time window, and has the required confirmations. |
| Needs a look | A payment arrived that does not match: a wrong amount, a late or duplicate payment, one that fits more than one sale, or one the node could not confirm. It is never counted. A wrong amount says what was asked, what arrived and how much it is short or over. |
| Expired | The sale's time ran out, and after a 3 minute wait both Quaiscan and the Quai node answered with no matching payment. |
| Not verified | Hartii cannot say whether it was paid: a source stayed down until 30 minutes after the expiry, the sale could not be matched, or the sale was still waiting after a week (it is then not looked for again). Check the address on Quaiscan. |
"Expired" is not final while a source is down or Quaiscan is more than 60 blocks behind the node. The page then says it cannot say that nothing was paid.
The Sales on this device log can be filtered (All, Paid, Waiting, Needs a look, Expired), searched, sorted (Newest first, Highest dollars first, Status) and downloaded as CSV. "Needs a look" also holds the Not verified sales. The CSV columns are Sale, Created (UTC), Status, Quoted dollars, QUAI asked, Exact amount asked (wei), QUAI received, Paid at (UTC), Paid by, Transaction, Receipt link and Note. Text a spreadsheet could read as a formula starts with an apostrophe. The screen is kept awake while a sale is open, where the browser allows it.
Limits to know:
- One tab per device. A second tab would overwrite the first, so the page freezes Charge when it sees another tab change the data.
- Sales live on that device only (up to 5,000). Download the CSV for your books. Reset this device clears the address and every sale.
- The dollar figure is the shop's quote at that moment. The chain only records QUAI.
- The page calls the quote request (it carries the dollar figure and nothing else), the Quai node and Quaiscan. It also sends one page-view message to the project's own server (the page name, the referring site and a campaign tag, never amounts or addresses), but only once counting is switched on; nothing goes to an outside analytics service. Counting is switched off today, so no such message is sent. See HartiiBiome analytics.
Receipt
https://hartiibiome.com/hpay/receipt?tx=<hash>&req=<request>
A receipt is rebuilt from chain data every time it is opened, and can be printed. Hartii stores nothing, not even in your browser. It keeps two kinds of fact apart:
- From the chain: the sender, the recipient, the amount, the block and the confirmations.
- From the link: the price, the reference and the note. The person who made the link says them. They are labelled not checked, and are never shown in green.
The page compares the payment with the link. A payment that does not match the link is shown in red as This payment does not match the link, and a transaction that is not a payment says so. A transaction that is not in a block shows its checks as "Not checked yet", not "Matches".
req is the request's own fields. conf (1 to 12) is how many confirmations a shop waited for before it showed Paid,
so the receipt counts to the same number. It is left out when it is 12. A count taken from a link is labelled "set by
the link".
Create a link in dollars
On https://hartiibiome.com/hpay, Create a link can price a request in US dollars.
- Choose US dollars next to the amount. A preview shows the QUAI for that price.
- Optionally add an Order reference (letters, digits and
. _ : -, up to 64 characters) and a memo. - A fresh quote is taken when the link is created. It locks the QUAI amount for 15 minutes into a tagged link and a QR code. The expiry is 15 minutes (price lock).
- The result card counts the lock down and turns to Paid by itself when the payment is confirmed.
Payer chooses is not available with a dollar price. A tag is never reused inside the page. If the price sources disagree, the page gives no price.
The request page /pay. For a tagged request, it shows a countdown against a corrected clock (the quote service's
time, or the newest block's time, when the device clock is off). Payment is refused in the last 45 seconds and after
the expiry. The exact amount is shown in full, because the last digits are the tag: "If you pay from another app, send
exactly this amount." Pay is disabled once a payment for the request was already seen. The page says In a block
with a count such as "3 of 12 confirmations" and flips to Paid, with the transaction link, when the payment is
confirmed. The dollar figure is shown as "the person who made this link says it is worth $X. Nothing here checks that."
A link with no dollar label has no creation time, so a payment the matcher accepts may be older than the link, and the
page says so.
Pay page
https://hartiibiome.com/pay/@name and https://hartiibiome.com/pay/0x... are public pages to pay a person.
- The name is read from the chain (the HartiiProfiles contract). The person is shown with an address ring drawn
from their address; it lights when the name has been confirmed on the chain. A raw
0xaddress works too. - Amounts are $1, $5, $10, $25 or Other (dollars or an exact QUAI amount). A dollar amount uses a 15 minute quote from at least two agreeing sources. If they disagree, the page refuses to quote.
- The page says: "Your wallet sends QUAI straight to this person's wallet. Hartii never holds the money and takes no fee. You pay only the network fee."
- The payer connects Pelagus (or opens the page in Blip) and sees the steps: check the payment, estimate the network fee, confirm in the wallet, wait for the network, confirmed. A wallet request never carries a chain id.
- It shows a count such as "3 of 12 confirmations" and says confirmed only at 12.
- To share: a QR code, a link with the chosen amount and note, and a 1200 by 630 share card as a PNG. Link previews name the person. The activity list stays in your browser.
Split a bill
https://hartiibiome.com/hpay/split
- Say who gets paid, the total in dollars (up to $1,000,000.00) and the people (up to 30), each with an optional fixed amount. Amounts left empty share the rest evenly, in whole cents that add up to the total. If you paid the bill and are one of the people sharing it, tick that box: your share is counted and never requested, and you take the extra cents first.
- Each person gets one exact, tagged request: the payee's address, the QUAI for a 15 minute price, the dollar amount, a reference, an expiry and a 6 digit tag in the last digits of the amount.
- Who has paid reads the chain every 12 seconds while the page is open. Each person is Waiting, Confirming, Paid, Needs a look, Price expired or Could not check. Wrong, late and doubled payments are listed and never counted.
- New prices for everyone who has not paid asks for new quotes in one step. The old request is kept, because a payment made inside its window is still valid. A request's window starts 60 seconds before its quote was made. A person can have at most 6 prices.
- Show QR code draws a scannable code for that person's request.
Until the first read, the totals show a dash and "Waiting for a block", never a zero. A person whose chain read failed shows "Could not check", not "Waiting". The page's confirmations setting accepts 1 to 60 and defaults to 12. Unlike the point of sale, it is not capped at 12.
The whole split lives in the link, after the #. A bookmark brings it back. Nothing about a split is stored on a
server, and anyone who has the link can see the names and amounts. A split opened from a link says so and shows the
payee address, and calls the dollar figures "what its maker wrote, not checked".
Statement
https://hartiibiome.com/hpay/statement?address=0x...&from=2026-10-01&to=2026-10-31
A statement lists the QUAI payments to an address that Quaiscan and the Quai node list, in a period of up to 400 UTC days, not before 2025-01-01. It lists:
- direct transfers,
- QuaiRelay sends,
- transfers with data (value sent along with a contract call).
It does not list QUAI that other contracts send to the address, such as payouts and swaps. Quaiscan lists no internal transfers on Quai, so the page cannot see them. The page says this in a note, in its description, in the Sources panel ("Not listed") and on the CSV button. Failed transactions, zero-value calls and cross-zone transfers moved no QUAI here, so they are counted aside, not listed.
- Plain transfers come from Quaiscan. QuaiRelay sends come from Quaiscan's list of the relay's events plus the node's own events for the newest 9,000 blocks (about 12 hours), so a payment the indexer has not listed yet is not missed.
- Each payment can be checked against the Quai node: the transaction, its receipt and its block. A statement with 60 payments or fewer checks them by itself. A longer one waits for the button. Where the node disagrees, the node wins and the row says so. A payment the node disagrees with is shown, flagged and left out of the totals; it stays in the CSV.
- A source that fails is named at the top and never read as "no payments".
- Dollar values use the history endpoint: one source, MEXC QUAIUSDT hourly, labelled. An hour with no price shows a dash on the page and an empty cell in the CSV, and a dollar total is shown only when every counted payment has a price.
- The CSV is oldest first, with the columns
date_utc,time_utc,tx_hash,method,from,to,amount_quai,amount_wei,usd_rate,usd_value,rate_source,rate_hour_utc,block,confirmationsandchecked_by_node.methodisdirect,relayordirect+data. Text a spreadsheet could read as a formula starts with an apostrophe. - The page's confirmations setting accepts 1 to 60 and defaults to 12.
- Only the address goes to the Quai node and Quaiscan, as if you opened it on Quaiscan. The price service sees only the dates. Hartii stores nothing about the address.
Inbox
https://hartiibiome.com/hpay/inbox and https://hartiibiome.com/hpay/inbox?address=0x... (Games/Biome 1.24.0, Beta).
For a walkthrough, see the guide HPAY: read your inbox.
An inbox is the Statement turned both ways. It lists the QUAI payments an address sent and received, newest first, read from public chain data in the visitor's own browser. The address is the account: there is nothing to sign up for and nothing stored on Hartii's servers.
- Whose inbox. The connected wallet's (a silent read of the account; the Connect wallet button asks only when you
press it, and shares the address only: no signature, no chain id, nothing is sent). Or any address, view only, with
?address=or the Open any address box. A?tab=ofreceived,sentorlookpicks the tab. Anyone can open any address, because it is public chain data. A Qi address, an address outside Cyprus-1 or an @name is refused. - What it lists. Direct QUAI transfers, QuaiRelay sends, and transfers that carry data to a wallet, in both directions, in 30 day windows (the last 30 days first, Load older for the next). Tabs: All, Received, Sent, Needs a look. A payment to the address itself is under All.
- Checked against the node. Each payment can be read again from the Quai node (transaction, receipt, block). A list of 60 payments or fewer checks itself; a longer one waits for Check all with the node. Where the node disagrees with Quaiscan, the node wins, the row is flagged under Needs a look and is left out of the totals. A row says Checked only after 12 confirmations (the same placeholder as the other tools).
- New since your last visit. The page counts the payments received since you last marked the inbox read (Mark all read).
- Where each part comes from. Received and sent plain transfers come from Quaiscan's lists. QuaiRelay sends come from Quaiscan's list of the relay's events plus the node's own events for the newest 9,000 blocks (about 12 hours).
- Dollar values come from the history endpoint, one source, labelled, asked in pieces of at most 20 days. A payment is valued at the price of its own hour. An hour with no price shows a dash.
- CSV. Export CSV downloads the windows on screen in the order shown, named like
hpay-inbox-0x00606ee2-2026-09-11-to-2026-10-10.csv. Columns:date_utc,time_utc,direction,tx_hash,method,counterparty,from,to,amount_quai,amount_wei,usd_rate,usd_value,rate_source,rate_hour_utc,block,confirmations,checked_by_node.directionisreceived,sentorself. A payment the node disagrees with stays in the CSV withchecked_by_nodeset tono. Unknown is an empty cell. The Statement's CSV is unchanged.
How to open it. The first entry in the HPAY tools list on /hpay; Your HPAY inbox in the Biome wallet panel once a
wallet is connected; See it in your inbox after a payment on /pay and /pay/<name> (a link only: nothing about the
payment is passed along, and inside a shop's pop-up it opens in a new tab); or the address bar.
What it cannot do.
- It cannot tell an HPAY payment from any other QUAI transfer. On the chain a QUAI payment looks the same whether it came from a pay link, a point of sale, a split, a button, Pelagus or Blip. Only QuaiRelay sends have an HPAY shape. So this is a list of QUAI payments, never "all your HPAY receipts".
- Request references, memos and dollar prices stay in the links. They never reach the chain. Where the same browser holds a record (a paid point-of-sale sale, an entry in your HPAY activity), the row says Known on this device. Another browser or device does not show that.
- The newest plain transfers may lag. Plain transfers come from Quaiscan's index, which can run behind the node. The page says so when it is behind. QuaiRelay payments of the last 12 hours are read from the node itself.
- Counted aside, not listed: failed transactions, transactions with no value, cross-zone transfers, and other contract calls that carry QUAI. QUAI that other contracts send to the address (payouts, swaps) is not listed: Quaiscan lists no internal transfers on Quai.
- No alerts, no refunds, no disputes. The page sends no email, text or push message; it shows what the chain holds when you open it. A refund is a new payment sent by the other person, never a reversal.
- A source that fails is named at the top and never read as "no payments".
Privacy. The page says it in these words:
This device keeps one thing: for each address you open (at most 20), the time of the newest payment you marked as seen,
under the browser key hartii:hpay:inbox:v1. It keeps no payments and no notes, and Forget what this device has seen
clears it. A browser that refuses to store anything still works for the visit. The inbox reads, and never writes, the
point-of-sale and activity records.