Paying to be heard
Priced token rooms in bWalletX: each message burns tokens or pays the issuer, in one transaction. The wallet signs, the server checks before anything is spent. Admins exempt, 50-sat minimum.
Status: live on the server. Priced rooms are enforced by bChat’s server now. The wallet support (paying when you post) is built and will be in the next bWalletX release. This is part 2 of the chat series, after 021 Coordinate on BSV.
The problem with free rooms
A token room in bWalletX is a room only the token’s holders can enter. That already keeps most strangers out. But holding a token is a one-off: once you’re in, every message is free. A room that matters to people attracts the same things a busy group chat does. Someone posts thirty lines in a minute. A small group decides to bury a thread. A bot finds the door and starts talking.
Moderation helps, but it always comes after the damage. We wanted something that changes the maths before anyone types: if every message costs a little, posting thirty lines costs thirty times as much as posting one. A pile-on needs everyone in it to pay. Most people in a room post a few times a day and barely notice the cost. The people who flood a room notice it straight away.
Issuers already had a price-per-message setting in room settings. Until now it was a label. The server didn’t check it. This change makes it real.
What an issuer can set
The issuer of a token, or an admin of its room, can set a charge per message. There are three kinds:
- Tokens, burned. Each message burns some of the room’s token. Nobody receives it: it is gone from the supply.
- Tokens, to the issuer. Each message sends some of the token to the issuer.
- Sats, to the issuer. Each message pays the issuer in BSV. The minimum is 50 sats.
Why a 50-sat floor? A payment smaller than that costs more in network fees and index work than it is worth. It would make every message more expensive to process without making flooding any more expensive. A token charge has to be at least one unit of the token.
Per-message rules are enforced now. Rooms can also set rules per minute, per hour or per day, and the settings screen says plainly that those aren’t enforced yet.
One transaction, not two
The obvious way to build this is two steps: pay, then post. That has an ugly failure. You pay, then the post is refused (you sold the token a second ago, the room changed its price, the server was down), and now you have paid for nothing. Or the reverse: the post goes through and the payment doesn’t.
So a priced message is a single Bitcoin transaction with two parts. One part is the payment: the burn, the token transfer or the sats to the issuer. The other is a small record that says which room it is for, who wrote it, a fingerprint (a SHA-256 hash) of the message text, and which version of the room’s rule it was paying. The payment and the message can’t be separated, because they are the same transaction.
The wallet signs, the server checks, then it is spent
This is the decision we spent most time on. When you post in a priced room, bWalletX builds that transaction and signs it, but it does not broadcast it. It sends the signed transaction to bChat’s server along with your message.
The server then checks everything: that you are a member, that the text matches the fingerprint, that the payment matches the room’s current rule, and that the amounts and the destination are right. Only if all of that passes does the server broadcast the transaction and then store your message.
If the server refuses, it broadcasts nothing. The wallet then cancels the signed transaction and frees the coins it would have used. You can’t end up paid-but-refused. If the network drops halfway, a retry sends the same signed transaction again rather than paying twice.
The wallet also counts a message towards your spending only after the server has accepted it, so a refused message doesn’t eat into your limits.
You see the price before you pay
Nothing is charged silently. Before you send in a priced room, the wallet shows a line such as “This message costs 5 $ACME, burned” or “This message costs 100 sats to the issuer”. (Those are examples, not real room prices.) You can tell it not to ask again in that room up to an amount you choose, and there is a cap per session, so a long conversation can’t quietly run up a bill.
Admins don’t pay
The issuer and the room’s admins are exempt. They are the people answering questions, pinning things and keeping the room in order, and charging them to do that would just tax moderation. Everyone else pays the same rule.
Burned or paid to the issuer?
That is the issuer’s choice. Burning means nobody profits from your message: it just costs you something, which is all the anti-flood effect needs. Paying the issuer means the person who runs the room is paid for the attention. Some rooms will want one, some the other. We show which one applies on every send, so you know where your money goes.
What we didn’t do
We didn’t take a cut. The charge goes where the issuer set it: burned, or to the issuer. bWalletX adds nothing on top of the normal network fee.
We didn’t make free rooms rarer. Most rooms will stay free. A price is a tool for rooms that need it, not a default.
And we didn’t put token rooms in the store edition. bWallet, on the App Store and Google Play, has no token rooms, so it has no priced rooms either.
What’s next
The wallet half of this is built on a branch and goes out in the next release. After that: enforcing the per-minute, per-hour and per-day rules, paying for calls and streams by the second, and letting people set their own price to be messaged by strangers. Those are all marked Coming on the Chat page.