Skip to content

fix(monero): three Send money bugs — a stray Mark received, a used address, the wallet button - #341

Merged
corpetty merged 1 commit into
mainfrom
fix/xmr-send-bugs
Oct 23, 2026
Merged

corpetty merged 1 commit into
mainfrom
fix/xmr-send-bugs

Conversation

@corpetty

Copy link
Copy Markdown
Owner

Three bugs found in the Monero Send money flow.

1. Mark received before anything arrived closed the send unpaid.

  • The payer's link went away, and their card said the payee's wallet had confirmed the payment.
  • Fix: Mark received now takes a second press, with a warning shown in place of the share's status. Cancel undoes the first press.
  • On Monero, Mark received appears only once the payer has said they paid. The payee's own wallet confirms on its own, so before that there is nothing to mark.
  • A share closed by the payee's word now reads "payee marked it received" on the payer's card.
  • The module still accepts the payee's word, which covers a request paid in cash.

2. A second send reused the payee's last shared Monero address and was refused (shared-address-used), with no way forward.

  • Fix: the form now applies the module's rule: an address already backing a payment in the room doesn't count. The form says so and offers Ask name for a new Monero address.

3. Pay with Monero Wallet opened the wallet's Settings tab.

  • It raised monero.accounts.manage, which Monero Wallet answers by opening Settings.
  • Monero Wallet 0.1.1 accepts no address or amount from another app, so nothing can prefill its Send yet.
  • Fix: the button is now Copy address, open Monero Wallet. It copies the address and brings the wallet up on its own view through the shell's basecamp.apps.launch.
  • A prefilled Send needs an upstream intent (exo-914).

Also: FakeBackend.qml regenerated; it was stale on main since #339.

Tested

  • A new gallery fixture, card-mark-received, built from a recorded snapshot of the payee with an agreed, unpaid split:
    • the first press arms the button;
    • Cancel disarms it;
    • the second press calls confirmPart.
  • The full gallery: 152 ok. The one failure, settings-btc-payer, fails identically on main (exo-a908).
  • ui-lint: 0 new findings.
  • MUSTER_UI=dev ui-parity: 12/12.

Not seen rendered: the Monero-only parts (the gate on the payer's report, the used-address form, the wallet launch). No recorded Monero room exists, and the runner bundles no Monero wallet.

🤖 Generated with Claude Code

…dress, the wallet button

Found on the Monero send flow (2026-10-23):

- Mark received before anything arrived closed the send unpaid. The payer's link went
  away, and their card said the payee's wallet had confirmed it. Now Mark received takes
  a second press, its warning in place of the share's status, and Cancel undoes the first.
  On Monero it is offered only once the payer has said they paid: the payee's own wallet
  confirms on its own, so before a report there is nothing to mark. A share closed by the
  payee's word now reads "<payee> marked it received" on the payer's card, not "<payee>'s
  wallet confirmed your payment". The module still takes the payee's word (a request
  paid in cash, probe_xmr_no_spend_stepper).
- A second send to someone reused their last shared Monero address, which already backs a
  payment, and the module refused it (shared-address-used) with no way forward. The form
  now applies the module's rule: a used address doesn't count, the form says so, and it
  offers "Ask <name> for a new Monero address".
- Pay with Monero Wallet raised monero.accounts.manage, which Monero Wallet answers by
  opening its Settings tab. Monero Wallet 0.1.1 takes no address or amount from another
  app, so nothing can prefill its Send yet. The button is now "Copy address, open Monero
  Wallet": it copies the address and brings the wallet up on its own view through the
  shell's basecamp.apps.launch (declared in uses). The steps say the wallet can't be
  filled in from here. A prefilled Send needs an upstream intent: exo-914.

Also: FakeBackend.qml regenerated (stale on main since #339's FileShare slots).

Tested-Behavior: gallery fixture card-mark-received (a recorded split-self-test snapshot of the payee with an agreed, unpaid split): the first press arms with the warning and Cancel, Cancel disarms, the second press calls confirmPart — 5 checks, 0 QML warnings; the full gallery 152 ok, one failure (settings-btc-payer) that fails identically on main (exo-a908); ui-lint 0 new; MUSTER_UI=dev ui-parity 12/12. The Monero-only parts (the gate on a report, the used-address form, the wallet launch) were not rendered: no recorded Monero room exists, and the runner bundles no Monero wallet

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Session-Id: 836705fe-fda9-501b-8ac2-1ce50b5af64a
@corpetty
corpetty merged commit c2784e5 into main Oct 23, 2026
6 checks passed
Fergulati pushed a commit to Fergulati/muster that referenced this pull request Oct 24, 2026
…llet can (exo-914)

The card's button asks Monero Wallet to fill its Send tab with the agreed address and
amount, through monero.wallet.send (logos-co/logos-monero-wallet-ui#11). The person
checks both there and sends; Muster sends nothing and approves nothing (ADR-018).

A wallet without that intent (Monero Wallet 0.1.1, the released one) answers
unavailable. Muster then falls back to corpetty#341's path: the wallet is brought up on its own
view (basecamp.apps.launch), and the card's steps say what to type. The address is
copied either way. A refusal from the wallet itself (a view-only wallet, a send already
on screen) is shown as its own reason. The card's steps say which happened:
"Monero Wallet's Send is filled in with <payee>'s address and N XMR" or the copy-and-
paste steps. ui/metadata.json declares monero.wallet.send in uses.

The wallet's side was driven in Basecamp 0.3.2 with the corpetty#11 build: the intent filled
Send with the address and amount, and waited for a wallet to open when none was.
Muster raising it from a Monero card has not been driven: no recorded Monero room
exists, and the runner bundles no Monero wallet. The release check covers it.

Tested-Behavior: ui-lint 0 new; gallery card-mark-received, card-status-split-agreed and flow-approve ok with 0 QML warnings; the wallet half in Basecamp 0.3.2 (logos-monero-wallet-ui#11): a monero.wallet.send request filled Send with the address and 0.0005, and refilled it with 0.0001; a 13-place amount refused

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Session-Id: 836705fe-fda9-501b-8ac2-1ce50b5af64a
Fergulati added a commit to Fergulati/muster that referenced this pull request Oct 24, 2026
Main moved three PRs past this branch's base 67701f8 (corpetty#341, corpetty#342, corpetty#343: Send money fixes,
Pay with Monero Wallet filling its Send tab, the pebbles for 0.3.3), which left PR 340
conflicting. The one conflict was ui/tests/gallery/FakeBackend.qml, which both sides had
regenerated with FileShare's props and slots; it is generated from ui/src/muster_ui.rep,
which main does not touch, so it is regenerated here (python3 ui/tools/gen-fake-backend.py)
and comes out byte-identical to this branch's. Main.qml, Room.qml, RoomThread.qml,
RoomComposer.qml, MusterCard.qml and CardProposal.qml merged on their own.

TDD-Exempt: a merge of main; the regenerated fake backend is checked by gen-fake-backend.py --check, and the merged QML by the gallery fixtures run after it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant