View Issue Details

IDProjectCategoryView StatusLast Update
0012147Talerwallet (iOS App)public2026-11-15 19:38
Reporterbot-cg [agent]  
PrioritynormalSeveritymajor 
Status new 
Summary0012147: iOS wallet: state the user can never delete -- audit against the rule that every item must be individually removable [meta]
DescriptionRule, as stated by the maintainer on 2026-11-15: there must be no state in
the wallet that can never be deleted. Deletion may be hard -- a confirmation,
a deposit first, an accepted loss -- but every transaction (confirmed,
cancelled, pending), every scanned code, every directory entry has to be
removable AS THAT ITEM. "Reset wallet" does not count. Deleting the payment
service that owns an item does not count either; that is acceptable only for
the digital cash itself.

This issue collects what an audit of the iOS wallet against that rule found.
Each child is one item, with the evidence and, where the fix needed no design
decision, a patch.

How it was audited
 1. The app source, category by category: where each kind of state is listed
    and what removes one entry of it.
 2. wallet-core's computeXxxTransactionActions tables: which states offer
    none of delete, abort, fail.
 3. A new oracle in the UI fuzz harness ("state-not-deletable"), run over all
    1703 recorded episodes: it reports a scanned code listed without a remove
    control (45 episodes) and a transaction page that, with the whole page in
    view, offers none of Delete / Abort / Abandon (10 episodes, all a
    withdrawal waiting for KYC that offers only Suspend or Resume).
 4. Deterministic scenarios that create one item and delete it; these now
    form a "deletability" matrix in the harness, so the rule is checked on
    every run rather than audited once.

Children (this tree) and one earlier report:
  - scanned codes cannot be removed (the case that prompted this)
  - deleting a transaction ends on "Internal core error" (7052)
  - TalDir contacts cannot be deleted
  - TalDir mailbox cannot be deleted; own alias registrations are not listed
  - backup files cannot be deleted
  - transactions whose page offers the user no removal: what the app hides
  - wallet-core: transaction states with neither delete, abort nor fail
  - 11962 (earlier): discount / pass tokens can never be removed

Read in the source but NOT verified by a run -- leads, not findings:
  - The payment-service list iterates controller.balances, not listExchanges
    (ExchangeListView.swift). A payment service that getBalances does not
    report (failed add, terms never accepted) would have no row and so no
    delete button.
  - For a scope with several payment services only exchanges.first can be
    deleted per visit (ExchangeSectionView.swift:58-70).
  - Every transaction list hangs off a balance section. A transaction whose
    scope has no balance row (e.g. a pay dialog in a currency the wallet
    holds nothing in) would not be reachable, hence not deletable.
  - Transactions that fail to decode are dropped silently
    (Model+Transactions.swift:81-93): never listed, never deletable.

Checked and fine: bank accounts ("Forget bank account" for every entry),
mailbox messages (swipe to delete), payment services that have a balance row
(delete, with an escalation to deposit-or-purge when coins remain).
TagsNo tags attached.

Required notifications

Address or linkRemarkAdded byNotifiedActions

The plan

IDSummaryStatusLocked byEstimated effort (hours)
0012148A scanned code that cannot be acted on (expired or malformed pay request) stays in the Actions menu and cannot be removed (patch attached) new
0012149Deleting a transaction from its page ends on "Internal core error" (7052 transaction not found): the list row asks for the transaction just deleted (patch attached) new
0012150TalDir contacts can be added and edited but never deleted: wallet-core's deleteContact is not called anywhere (patch attached) new
0012151TalDir: a mailbox, once created, cannot be deleted, and the wallet does not list its own alias registrations new
0012152Backup files can be created and restored but not deleted from within the app (patch attached) new
0012153Transaction pages that offer the user no way to remove the transaction: Suspend/Resume are developer-only, Retry is never shown, and nothing is shown while the connection is stalled new
0012154wallet-core: transaction states that offer neither delete, abort nor fail -- a transaction parked there can never be removed by the user new
This issue (hours)
Its children (hours)0
Together (hours)0
Not planned yet: 0012148, 0012149, 0012150, 0012151, 0012152, 0012153, 0012154. The plan of this issue cannot be finished while part of it is unplanned.

Relationships

parent of 0012148 new A scanned code that cannot be acted on (expired or malformed pay request) stays in the Actions menu and cannot be removed (patch attached) 
parent of 0012149 new Deleting a transaction from its page ends on "Internal core error" (7052 transaction not found): the list row asks for the transaction just deleted (patch attached) 
parent of 0012150 new TalDir contacts can be added and edited but never deleted: wallet-core's deleteContact is not called anywhere (patch attached) 
parent of 0012151 new TalDir: a mailbox, once created, cannot be deleted, and the wallet does not list its own alias registrations 
parent of 0012152 new Backup files can be created and restored but not deleted from within the app (patch attached) 
parent of 0012153 new Transaction pages that offer the user no way to remove the transaction: Suspend/Resume are developer-only, Retry is never shown, and nothing is shown while the connection is stalled 
parent of 0012154 new wallet-core: transaction states that offer neither delete, abort nor fail -- a transaction parked there can never be removed by the user 
Not all the children of this issue are yet resolved or closed.

Activities

There are no notes attached to this issue.

Issue History

Date ModifiedUsernameFieldChange
2026-11-15 19:38bot-cgNew Issue
2026-11-15 19:38bot-cgRelationship addedparent of 0012151
2026-11-15 19:38bot-cgRelationship addedparent of 0012148
2026-11-15 19:38bot-cgRelationship addedparent of 0012154
2026-11-15 19:38bot-cgRelationship addedparent of 0012153
2026-11-15 19:38bot-cgRelationship addedparent of 0012152
2026-11-15 19:38bot-cgRelationship addedparent of 0012149
2026-11-15 19:38bot-cgRelationship addedparent of 0012150
2026-11-15 19:38bot-cgImplementer => MarcS
2026-11-15 19:38bot-cgReviewer => bernaalp
2026-11-15 19:38bot-cgDeployed by => mikolai
2026-11-15 19:38bot-cgVerifier => Florian Dold
2026-11-15 19:38bot-cgCommunicator => CM_7