# Send and receive BSV payments: every rule

Every do and don't the guide states on the pages behind this skill. The costly ones come first; the full list follows, grouped by page. Quote them; do not paraphrase them.

100 rules: 18 that can cost money, 16 that can cost trust, 66 standard.

## Start here

- **DO** _(Costs money)_ Resolve the handle and show the profile name and avatar before the confirm button. Paying "Anna Keller" is checkable; paying anna@example.com is only spellable. See Paying by handle.
  <https://www.bitcoinsv.design/guide/rule/fba6444cf1/>
- **DON'T** _(Costs money)_ Let a typed handle go straight to a confirm screen with no resolution step. The resolution is the check.
  <https://www.bitcoinsv.design/guide/rule/44c3c56764/>
- **DO** _(Costs money)_ Warn on every pasted address that money sent to an address on another network is very hard to recover, and offer the user's contacts or a handle instead.
  <https://www.bitcoinsv.design/guide/rule/2433fe3c54/>
- **DON'T** _(Costs money)_ Offer "Try again" on a payment until you know the first attempt did not go out.
  <https://www.bitcoinsv.design/guide/rule/24ccdc3485/>
- **DO** _(Costs money)_ Tell the user once when their wallet is retrying for them: "Your wallet will keep trying to send this. You don't need to pay again."
  <https://www.bitcoinsv.design/guide/rule/2a72388be3/>
- **DO** _(Costs money)_ Show on the review screen the same sats amount the wallet's prompt will show, and if the rate moves before Anna presses the button, update the figure on this screen first rather than letting the wallet show a different number.
  <https://www.bitcoinsv.design/guide/rule/cef01aa4a6/>
- **DON'T** _(Costs money)_ Add a booking fee or any other charge after the review screen. If the product charges one, it is part of the price shown here.
  <https://www.bitcoinsv.design/guide/rule/9d65fbb29c/>
- **DO** _(Costs money)_ Show the profile name and avatar the handle resolved to, before the confirm button. Paying "Anna Keller" is checkable; paying anna@examplebank.com is only spellable.
  <https://www.bitcoinsv.design/guide/rule/344afceabd/>
- **DO** _(Costs money)_ Say when the key behind a saved contact has changed since last time, and make the user acknowledge it. A silently rotated key is how a handle gets hijacked.
  <https://www.bitcoinsv.design/guide/rule/f47f34353f/>
- **DO** _(Costs money)_ Make the handle the default and the address the fallback. Every payment that uses a handle is a payment that cannot go to the wrong network.
  <https://www.bitcoinsv.design/guide/rule/98fc09f14d/>
- **DO** _(Costs money)_ Put the network name next to the address field, always, not only on error. "BSV address" is three words and it is the whole defence.
  <https://www.bitcoinsv.design/guide/rule/fea05e6af6/>
- **DO** _(Costs money)_ Warn on every pasted address rather than trying to detect a bad one. You cannot detect it, and a warning that only fires sometimes teaches people it means something specific.
  <https://www.bitcoinsv.design/guide/rule/7b6afde89f/>
- **DON'T** _(Costs money)_ Use "bitcoin address" as the field label. That is the word that cannot distinguish the networks, on the screen where the distinction is the whole point.
  <https://www.bitcoinsv.design/guide/rule/e92e4f5284/>
- **DO** _(Costs money)_ Put the network on the confirmation, beside the recipient, in the same weight as the amount.
  <https://www.bitcoinsv.design/guide/rule/e7486b509a/>
- **DO** _(Costs money)_ Say plainly what cannot be undone, before the button: "Sent to the wrong network, this usually cannot be recovered."
  <https://www.bitcoinsv.design/guide/rule/94b4f84162/>
- **DO** _(Costs money)_ Offer a test payment for a first-time address above a threshold you choose, and ask the user to check with the recipient that it arrived. It costs a fraction of a penny and it is the only defence that proves the address is right.
  <https://www.bitcoinsv.design/guide/rule/ea9599e1da/>
- **DO** _(Costs money)_ Make the network selection impossible to leave at a default, and restate the chosen network on the confirmation.
  <https://www.bitcoinsv.design/guide/rule/278b3b2795/>
- **DO** _(Costs money)_ Warn before any payment to a contact whose key has changed, and require acknowledgement: "Anna's wallet key has changed since you last paid her. If you weren't expecting this, check with her another way first."
  <https://www.bitcoinsv.design/guide/rule/00ea519fe6/>
- **DO** _(Costs trust)_ Show the running total against the allowance somewhere the user passes regularly, and make every agent or app payment visible in activity, marked as such. See Permissions and allowances.
  <https://www.bitcoinsv.design/guide/rule/faf9dcb5ed/>
- **DO** _(Costs trust)_ Require the device's authentication to confirm, above whatever threshold the user set.
  <https://www.bitcoinsv.design/guide/rule/5a60232bfd/>
- **DO** _(Costs trust)_ Say first whether money left the wallet.
  <https://www.bitcoinsv.design/guide/rule/0b8d2226b1/>
- **DO** _(Costs trust)_ Make sure this works without your servers, any Pass, or any vendor service. It is the user's guaranteed way out if everything else in the stack fails. See Backups.
  <https://www.bitcoinsv.design/guide/rule/575c867a4e/>
- **DO** _(Costs trust)_ Say whether money moved in every message that follows a payment attempt, including when the answer is that nothing left the wallet.
  <https://www.bitcoinsv.design/guide/rule/10b3023998/>
- **DON'T** _(Costs trust)_ Ask for a spending allowance "to make the next purchase faster". A site people pay a few times a year should ask each time.
  <https://www.bitcoinsv.design/guide/rule/6d94573c75/>
- **DON'T** _(Costs trust)_ Keep a fee picker because the design system already has one. It asks the user a question with no wrong answer, which teaches them that your questions are decorative.
  <https://www.bitcoinsv.design/guide/rule/5d31c5cfd7/>
- **DO** _(Costs trust)_ Leave the fee off the review screen entirely for ordinary payments, and put it in the transaction details afterwards for anyone who looks.
  <https://www.bitcoinsv.design/guide/rule/8223d8056e/>
- **DON'T** _(Costs trust)_ Put anything personal in a note by default. It is shared with the payer and may end up in their records. See Wallet privacy.
  <https://www.bitcoinsv.design/guide/rule/2a1e3fc5a2/>
- **DO** _(Costs trust)_ A public donation handle is permanently linked to everything paid to it. Suggest a separate handle for it. A tag such as @maya+donations@example.com sorts the payments but still resolves to Maya. See Paying by handle.
  <https://www.bitcoinsv.design/guide/rule/651a6d824e/>
- **DO** _(Costs trust)_ Always show the user what they're paying for, and the running total against their allowance. Small, frequent payments add up, and users should never be surprised by them.
  <https://www.bitcoinsv.design/guide/rule/2cc79b8eeb/>
- **DO** _(Costs trust)_ Warn plainly when a handle does not resolve, naming what failed: no such handle, domain unreachable, certificate invalid. "Couldn't find that" sends people to try again rather than to look harder at what they typed.
  <https://www.bitcoinsv.design/guide/rule/3087625834/>
- **DON'T** _(Costs trust)_ Fall back silently to a plain-address payment when a handle resolves but does not support the peer-to-peer flow. Say so, because the confirmation the user gets is weaker. See Legacy compatibility.
  <https://www.bitcoinsv.design/guide/rule/b1f4906d93/>
- **DO** _(Costs trust)_ Say what happened in plain words: which network it went to, that the money is not lost from the chain but is out of reach from here, and what recovery would require.
  <https://www.bitcoinsv.design/guide/rule/6221629f1c/>
- **DON'T** _(Costs trust)_ Promise recovery you cannot deliver. If it needs the other party's cooperation, say that is what it needs.
  <https://www.bitcoinsv.design/guide/rule/d3b1447e05/>
- **DO** _(Costs trust)_ Name what is lost in the confirmation: the saved key, and therefore the warning if it changes. Payment history stays.
  <https://www.bitcoinsv.design/guide/rule/1f7685c1df/>

## Every rule, by page

### Sending

https://www.bitcoinsv.design/guide/daily-spending-wallet/sending/

- **DO** Autocomplete from contacts before accepting free text, and make saving a new recipient the obvious next step after a first payment. The second payment to someone should never involve typing.
  <https://www.bitcoinsv.design/guide/rule/5d73135962/>
- **DO** _(Costs money)_ Resolve the handle and show the profile name and avatar before the confirm button. Paying "Anna Keller" is checkable; paying anna@example.com is only spellable. See Paying by handle.
  <https://www.bitcoinsv.design/guide/rule/fba6444cf1/>
- **DON'T** _(Costs money)_ Let a typed handle go straight to a confirm screen with no resolution step. The resolution is the check.
  <https://www.bitcoinsv.design/guide/rule/44c3c56764/>
- **DO** Default to the unit the user set, and let them switch between it and their local currency in one tap. See Amounts and units.
  <https://www.bitcoinsv.design/guide/rule/62549b7884/>
- **DO** Allow very small amounts without complaint. A payment of 50 satoshis is ordinary, and a minimum blocks it for no reason.
  <https://www.bitcoinsv.design/guide/rule/de88c18a7f/>
- **DON'T** Show a "max" button that empties the wallet without saying so. Label it with the resulting amount.
  <https://www.bitcoinsv.design/guide/rule/a830c06ea1/>
- **DO** _(Costs trust)_ Show the running total against the allowance somewhere the user passes regularly, and make every agent or app payment visible in activity, marked as such. See Permissions and allowances.
  <https://www.bitcoinsv.design/guide/rule/faf9dcb5ed/>
- **DON'T** Prompt for every per-use payment. An article that costs 20 satoshis cannot carry a confirmation dialog, and a wallet that insists makes the whole category unusable.
  <https://www.bitcoinsv.design/guide/rule/e178ad1ce4/>
- **DO** Make the recipient the largest thing on the screen. The amount is usually right; the recipient is what gets checked too quickly.
  <https://www.bitcoinsv.design/guide/rule/e51521a9a8/>
- **DO** _(Costs trust)_ Require the device's authentication to confirm, above whatever threshold the user set.
  <https://www.bitcoinsv.design/guide/rule/5a60232bfd/>
- **DON'T** Put an "advanced" disclosure on the review screen. If something matters enough to show, show it; if it does not, it belongs in the transaction's details afterwards.
  <https://www.bitcoinsv.design/guide/rule/209f596f5d/>
- **DO** Label every wait with the step and, where there is one, the person. "Handing payment to Anna's wallet…" tells the user what is happening and to whom.
  <https://www.bitcoinsv.design/guide/rule/eff0757699/>
- **DON'T** Show a spinner with no words, or a full-screen loader for a step that takes a second. Both make an ordinary pause look like a fault.
  <https://www.bitcoinsv.design/guide/rule/0ae64e9f7c/>
- **DO** _(Costs trust)_ Say first whether money left the wallet.
  <https://www.bitcoinsv.design/guide/rule/0b8d2226b1/>
- **DON'T** Show an error code as the headline. Put it in the details for support, with plain words on top.
  <https://www.bitcoinsv.design/guide/rule/76e25ae879/>
- **DO** _(Costs money)_ Warn on every pasted address that money sent to an address on another network is very hard to recover, and offer the user's contacts or a handle instead.
  <https://www.bitcoinsv.design/guide/rule/2433fe3c54/>
- **DO** _(Costs trust)_ Make sure this works without your servers, any Pass, or any vendor service. It is the user's guaranteed way out if everything else in the stack fails. See Backups.
  <https://www.bitcoinsv.design/guide/rule/575c867a4e/>
- **DO** Show "Paid" on acceptance and stop there for everyday amounts. A spinner that waits for a block makes the user wait for nothing. See Transactions.
  <https://www.bitcoinsv.design/guide/rule/56bb292103/>

### Errors and failed payments

https://www.bitcoinsv.design/guide/patterns/errors-and-failed-payments/

- **DO** _(Costs trust)_ Say whether money moved in every message that follows a payment attempt, including when the answer is that nothing left the wallet.
  <https://www.bitcoinsv.design/guide/rule/10b3023998/>
- **DO** End every error with one thing the user can do, as a button where there is one.
  <https://www.bitcoinsv.design/guide/rule/0e448050b8/>
- **DO** Put the error code and technical detail in an expandable details area with a copy button, so support can ask for it.
  <https://www.bitcoinsv.design/guide/rule/fd58b25cc9/>
- **DO** Keep what the user entered. Return them to where they were with the amount, recipient and note still filled in.
  <https://www.bitcoinsv.design/guide/rule/987ac15fa3/>
- **DON'T** Write "Something went wrong" on its own. If you truly do not know what happened, say what you do know and whether money moved.
  <https://www.bitcoinsv.design/guide/rule/29c4f5d4cc/>
- **DO** Explain a failure in the app when it is about the app's task, such as an article not unlocking, and in the wallet when it is about the user's money or permissions.
  <https://www.bitcoinsv.design/guide/rule/cf11c641f7/>
- **DON'T** _(Costs money)_ Offer "Try again" on a payment until you know the first attempt did not go out.
  <https://www.bitcoinsv.design/guide/rule/24ccdc3485/>
- **DO** _(Costs money)_ Tell the user once when their wallet is retrying for them: "Your wallet will keep trying to send this. You don't need to pay again."
  <https://www.bitcoinsv.design/guide/rule/2a72388be3/>
- **DON'T** Show a refusal or an unanswered wallet prompt in an error style. Both are the user's choice, and red tells them they did something wrong.
  <https://www.bitcoinsv.design/guide/rule/0199a519d1/>

### Buying a ticket

https://www.bitcoinsv.design/guide/connected-web-app/buying-a-ticket/

- **DO** _(Costs money)_ Show on the review screen the same sats amount the wallet's prompt will show, and if the rate moves before Anna presses the button, update the figure on this screen first rather than letting the wallet show a different number.
  <https://www.bitcoinsv.design/guide/rule/cef01aa4a6/>
- **DO** Name who receives the money and who the ticket is for in one line. Anna is paying the ticket site, for a venue, and both names belong on the screen.
  <https://www.bitcoinsv.design/guide/rule/28f49068d4/>
- **DO** Say on the review screen what Anna can do with the ticket afterwards, give it away or not, refund it or not, before she pays rather than in the terms.
  <https://www.bitcoinsv.design/guide/rule/239b48c214/>
- **DON'T** _(Costs money)_ Add a booking fee or any other charge after the review screen. If the product charges one, it is part of the price shown here.
  <https://www.bitcoinsv.design/guide/rule/9d65fbb29c/>
- **DO** Ask for the tickets basket in the first purchase's prompt, as a separate item Anna can decline, and never at sign-in.
  <https://www.bitcoinsv.design/guide/rule/b0b03659e4/>
- **DON'T** _(Costs trust)_ Ask for a spending allowance "to make the next purchase faster". A site people pay a few times a year should ask each time.
  <https://www.bitcoinsv.design/guide/rule/6d94573c75/>
- **DO** Tell Anna where the ticket is, in her wallet, on the confirmation, so she does not wait for an email that is not coming.
  <https://www.bitcoinsv.design/guide/rule/c47043659b/>
- **DO** Write the gig name, venue, date and what the holder may do with the ticket into the token when it is issued, so any wallet can show it without asking the site.
  <https://www.bitcoinsv.design/guide/rule/7d58d12ea1/>
- **DON'T** Let a picture of the ticket be enough to get in. The picture is the part anybody can copy; the door has to check that the person in front of it holds the ticket now.
  <https://www.bitcoinsv.design/guide/rule/ef68ada499/>

### Send fees

https://www.bitcoinsv.design/guide/daily-spending-wallet/sending/send-fees/

- **DON'T** _(Costs trust)_ Keep a fee picker because the design system already has one. It asks the user a question with no wrong answer, which teaches them that your questions are decorative.
  <https://www.bitcoinsv.design/guide/rule/5d31c5cfd7/>
- **DO** _(Costs trust)_ Leave the fee off the review screen entirely for ordinary payments, and put it in the transaction details afterwards for anyone who looks.
  <https://www.bitcoinsv.design/guide/rule/8223d8056e/>
- **DO** In the payment's details, show the fee in local currency as one small line: "Fee: less than 1p". A figure in satoshis invites arithmetic nobody wanted to do.
  <https://www.bitcoinsv.design/guide/rule/38e0a0da8b/>
- **DON'T** Explain the fee model. A user who wanted to know about satoshis per byte will find it in the transaction details.
  <https://www.bitcoinsv.design/guide/rule/022b63ad54/>
- **DO** Pay the fee on the user's behalf where the product can, and do not mention it. We suggest a shop absorb it as a cost of sale and an app fold it into its price. It is a real option because the fee is smaller than any price the user will see.
  <https://www.bitcoinsv.design/guide/rule/67836d2509/>

### Requesting

https://www.bitcoinsv.design/guide/daily-spending-wallet/requesting/

- **DO** Make the handle the primary thing on the receive screen, and the amount optional. Most of the time the payer knows what they owe.
  <https://www.bitcoinsv.design/guide/rule/7a42bd0615/>
- **DON'T** Generate a new address for each request and show it. On BSV a fresh key is derived per payment automatically, so the privacy reason for showing a new address has already been handled. See Payments.
  <https://www.bitcoinsv.design/guide/rule/b047195dc2/>
- **DON'T** Add an expiry to a request. Nothing in a handle and an amount goes stale, so an expiry is a deadline with nothing behind it.
  <https://www.bitcoinsv.design/guide/rule/8b8d9838a1/>
- **DO** Let the amount be entered in local currency and converted, which is how people think about being owed money.
  <https://www.bitcoinsv.design/guide/rule/cf3f778dba/>
- **DO** Allow an empty amount. "Pay me what you like" is a real case: tips, donations, splitting a bill the payer can see.
  <https://www.bitcoinsv.design/guide/rule/f4dbdc826a/>
- **DO** Prefill it where you can. A request made from a shared bill can say what the bill was.
  <https://www.bitcoinsv.design/guide/rule/275c3dcb7f/>
- **DON'T** _(Costs trust)_ Put anything personal in a note by default. It is shared with the payer and may end up in their records. See Wallet privacy.
  <https://www.bitcoinsv.design/guide/rule/2a1e3fc5a2/>
- **DO** Offer copy and share as distinct actions, and confirm in place rather than with a toast the user is not looking at.
  <https://www.bitcoinsv.design/guide/rule/9f96c8a20f/>
- **DO** Show it immediately and clearly: who paid, how much, and the note. A received payment is a good moment and the interface can say so.
  <https://www.bitcoinsv.design/guide/rule/71daac948d/>
- **DO** _(Costs trust)_ A public donation handle is permanently linked to everything paid to it. Suggest a separate handle for it. A tag such as @maya+donations@example.com sorts the payments but still resolves to Maya. See Paying by handle.
  <https://www.bitcoinsv.design/guide/rule/651a6d824e/>

### Receiving

https://www.bitcoinsv.design/guide/daily-spending-wallet/requesting/receiving/

- **DO** Show who paid, how much, and the note. When the payer's wallet shares a profile name and avatar, an entry can read "Anna Keller, for lunch"; otherwise show their handle.
  <https://www.bitcoinsv.design/guide/rule/1c01595db1/>
- **DO** Make it noticeable. A received payment is one of the few genuinely good moments in a finance app, and a silent list entry wastes it.
  <https://www.bitcoinsv.design/guide/rule/885d7cb83f/>
- **DON'T** Show a confirmation counter. It was verified on arrival, and counting blocks afterwards tells the user that your "Received" was provisional. See Transactions.
  <https://www.bitcoinsv.design/guide/rule/61405a5d46/>
- **DO** Collect anything waiting on launch, verify it, and show what arrived while the user was away as a group rather than a burst of separate notifications.
  <https://www.bitcoinsv.design/guide/rule/558676b58c/>
- **DO** Say on the receive screen's help, or in Settings › Services, that payments wait in a message box when the wallet is closed. It is the one real cost of the peer-to-peer model. See Payments.
  <https://www.bitcoinsv.design/guide/rule/211458699f/>
- **DO** Reject it, and tell the user in plain words that a payment arrived and could not be verified, so it was not accepted. Do not add it to the balance.
  <https://www.bitcoinsv.design/guide/rule/b3cb42f772/>
- **DON'T** Show a cryptographic error. "Merkle proof invalid" tells the user nothing they can act on.
  <https://www.bitcoinsv.design/guide/rule/437025ee4f/>
- **DO** Use a different state for these: "Incoming" until it is mined, then "Received". It is genuinely less certain than a peer-to-peer payment and the interface should not pretend otherwise. See Legacy compatibility.
  <https://www.bitcoinsv.design/guide/rule/de0ddb24e3/>
- **DO** Show it with whatever the sender provided, and let the user add their own note. An unexplained entry is the one they will be puzzling over in six months.
  <https://www.bitcoinsv.design/guide/rule/b6a67378a2/>
- **DON'T** Build a returns flow into a consumer wallet. Sending it back is just a payment, and the sender's handle is already there to pay.
  <https://www.bitcoinsv.design/guide/rule/8953c080ff/>
- **DO** Because step 4 happens, the payer can be shown "Paid" at the same moment the recipient is shown "Received". Design both ends of that: the two people are often standing next to each other.
  <https://www.bitcoinsv.design/guide/rule/67b4d0f5d2/>

### Payments

https://www.bitcoinsv.design/guide/how-it-works/payments/

- **DO** Show "Paid" or "Received" as soon as the recipient's wallet replies "accepted". Do not wait for the payment to be mined.
  <https://www.bitcoinsv.design/guide/rule/e3a51dbe82/>
- **DO** Don't show derived payment addresses in the main interface. Show the person, handle or app the payment relates to. Keep raw transaction details in an advanced view.
  <https://www.bitcoinsv.design/guide/rule/b81a18d899/>
- **DO** _(Costs trust)_ Always show the user what they're paying for, and the running total against their allowance. Small, frequent payments add up, and users should never be surprised by them.
  <https://www.bitcoinsv.design/guide/rule/2cc79b8eeb/>

### Paying by handle

https://www.bitcoinsv.design/guide/patterns/paying-by-handle/

- **DO** Accept both forms in any field that takes a handle. A user pasting anna@example.com into a wallet using the newer scheme should simply work.
  <https://www.bitcoinsv.design/guide/rule/f8fdfce7d2/>
- **DO** _(Costs money)_ Show the profile name and avatar the handle resolved to, before the confirm button. Paying "Anna Keller" is checkable; paying anna@examplebank.com is only spellable.
  <https://www.bitcoinsv.design/guide/rule/344afceabd/>
- **DO** _(Costs money)_ Say when the key behind a saved contact has changed since last time, and make the user acknowledge it. A silently rotated key is how a handle gets hijacked.
  <https://www.bitcoinsv.design/guide/rule/f47f34353f/>
- **DO** Make saving a resolved handle as a contact the obvious next step. The second payment to someone should never involve typing.
  <https://www.bitcoinsv.design/guide/rule/e308418a77/>
- **DON'T** Show the derived address anywhere in the main flow. It is a one-time internal value and putting it on screen invites comparison nobody can perform.
  <https://www.bitcoinsv.design/guide/rule/8d56db7003/>
- **DO** Offer matches from saved contacts as the user types a handle, before accepting free text.
  <https://www.bitcoinsv.design/guide/rule/61c7489fc9/>
- **DON'T** Show a handle on the review screen without the profile name it resolved to. On its own, a one-character difference is invisible.
  <https://www.bitcoinsv.design/guide/rule/6e2c0b3343/>
- **DO** _(Costs trust)_ Warn plainly when a handle does not resolve, naming what failed: no such handle, domain unreachable, certificate invalid. "Couldn't find that" sends people to try again rather than to look harder at what they typed.
  <https://www.bitcoinsv.design/guide/rule/3087625834/>
- **DON'T** _(Costs trust)_ Fall back silently to a plain-address payment when a handle resolves but does not support the peer-to-peer flow. Say so, because the confirmation the user gets is weaker. See Legacy compatibility.
  <https://www.bitcoinsv.design/guide/rule/b1f4906d93/>

### Wrong-network payments

https://www.bitcoinsv.design/guide/patterns/wrong-network-payments/

- **DO** _(Costs money)_ Make the handle the default and the address the fallback. Every payment that uses a handle is a payment that cannot go to the wrong network.
  <https://www.bitcoinsv.design/guide/rule/98fc09f14d/>
- **DO** _(Costs money)_ Put the network name next to the address field, always, not only on error. "BSV address" is three words and it is the whole defence.
  <https://www.bitcoinsv.design/guide/rule/fea05e6af6/>
- **DO** _(Costs money)_ Warn on every pasted address rather than trying to detect a bad one. You cannot detect it, and a warning that only fires sometimes teaches people it means something specific.
  <https://www.bitcoinsv.design/guide/rule/7b6afde89f/>
- **DON'T** _(Costs money)_ Use "bitcoin address" as the field label. That is the word that cannot distinguish the networks, on the screen where the distinction is the whole point.
  <https://www.bitcoinsv.design/guide/rule/e92e4f5284/>
- **DO** _(Costs money)_ Put the network on the confirmation, beside the recipient, in the same weight as the amount.
  <https://www.bitcoinsv.design/guide/rule/e7486b509a/>
- **DO** _(Costs money)_ Say plainly what cannot be undone, before the button: "Sent to the wrong network, this usually cannot be recovered."
  <https://www.bitcoinsv.design/guide/rule/94b4f84162/>
- **DO** _(Costs money)_ Offer a test payment for a first-time address above a threshold you choose, and ask the user to check with the recipient that it arrived. It costs a fraction of a penny and it is the only defence that proves the address is right.
  <https://www.bitcoinsv.design/guide/rule/ea9599e1da/>
- **DO** _(Costs trust)_ Say what happened in plain words: which network it went to, that the money is not lost from the chain but is out of reach from here, and what recovery would require.
  <https://www.bitcoinsv.design/guide/rule/6221629f1c/>
- **DO** Give them the transaction reference and the output, so somebody technical can help.
  <https://www.bitcoinsv.design/guide/rule/dc1f50e8b3/>
- **DON'T** Say "transaction failed". It did not fail. It succeeded somewhere else, and telling somebody it failed sends them looking for a refund that is not coming.
  <https://www.bitcoinsv.design/guide/rule/c1d8c3eddf/>
- **DON'T** _(Costs trust)_ Promise recovery you cannot deliver. If it needs the other party's cooperation, say that is what it needs.
  <https://www.bitcoinsv.design/guide/rule/d3b1447e05/>
- **DO** _(Costs money)_ Make the network selection impossible to leave at a default, and restate the chosen network on the confirmation.
  <https://www.bitcoinsv.design/guide/rule/278b3b2795/>
- **DO** Treat a first withdrawal to a new address as a different flow from a repeat one.
  <https://www.bitcoinsv.design/guide/rule/6e0e8f799c/>

### Contacts

https://www.bitcoinsv.design/guide/daily-spending-wallet/contacts/

- **DO** Let the user rename a contact to whatever they call that person. "Mum" beats the profile name the handle returned, and it is what they will search for.
  <https://www.bitcoinsv.design/guide/rule/b2cb3f1325/>
- **DO** Offer "save as contact" in the success state of a first payment. One tap at the moment the information is in front of the user beats a form they have to go and find.
  <https://www.bitcoinsv.design/guide/rule/ca9c316d14/>
- **DON'T** Ask for a name before resolving the handle. The resolution usually supplies one, and asking first makes the user invent a label for someone the wallet is about to identify.
  <https://www.bitcoinsv.design/guide/rule/0481aea407/>
- **DO** _(Costs money)_ Warn before any payment to a contact whose key has changed, and require acknowledgement: "Anna's wallet key has changed since you last paid her. If you weren't expecting this, check with her another way first."
  <https://www.bitcoinsv.design/guide/rule/00ea519fe6/>
- **DO** Record when the key last changed on the contact, so a user who is unsure can see whether this is the third change this month.
  <https://www.bitcoinsv.design/guide/rule/7fc52e7840/>
- **DO** Show a Pass as what it proves and who vouched for it, not as a generic tick. "Business name verified by Example Registry" is checkable; a blue badge is not.
  <https://www.bitcoinsv.design/guide/rule/0a4277400c/>
- **DON'T** Imply a Pass means the person is trustworthy. It means an issuer attested to one attribute, which is a much smaller claim.
  <https://www.bitcoinsv.design/guide/rule/8dbefecf1c/>
- **DO** Search across the name, the handle and the note. Users search for how they think of someone, which is rarely the exact stored name.
  <https://www.bitcoinsv.design/guide/rule/0859248932/>
- **DO** Order by recently paid rather than alphabetically. A wallet's contact list is short and heavily weighted to a handful of people.
  <https://www.bitcoinsv.design/guide/rule/33c5d40912/>
- **DON'T** Import the phone's address book by default. It is a large privacy ask for a feature most users do not need on day one, and it takes names out of the wallet's control.
  <https://www.bitcoinsv.design/guide/rule/de9eb761c1/>
- **DO** _(Costs trust)_ Name what is lost in the confirmation: the saved key, and therefore the warning if it changes. Payment history stays.
  <https://www.bitcoinsv.design/guide/rule/1f7685c1df/>
- **DON'T** Remove payment history when a contact is deleted. The money moved; that is a fact about the user's finances, not about the contact.
  <https://www.bitcoinsv.design/guide/rule/f9a7cab9cd/>
- **DO** Keep them in separate lists but make them feel related. What a user does with a person is pay them; what they do with an app is review and revoke what it may do. Those are different enough that one combined list serves neither. See Security.
  <https://www.bitcoinsv.design/guide/rule/88e7256ce9/>
