[Bug]: UI - Actions that move money or ownership are not disclosed, confirmed, or truthfully reported
Nobody has claimed this yet.
- Dominant language
- Solidity
- Stars
- 4
- Forks
- 2
- Avg merge
- 1d 18h
- Merged PRs (30d)
- 24
Description
Component
Other
Priority
P2
What happened?
Five instances of one pattern in packages/ui: an action that spends funds or transfers ownership charges without saying so, proceeds without confirmation, or reports an outcome that did not happen.
Upload reports success for a write that failed. store/useBulletinStore.ts:277-282 swallows a failed writeCidToStore; :423-425 then sets "Upload complete!", overwriting the "not yet resolvable" message at :284-288; components/preview/FileUpload.vue:92-98 shows "Congratulations! Transaction successful!" with a zero hash. The user then points a name's contenthash at that CID.
Transfer charges an undisclosed fee. components/modals/TransferDomainModal.vue:100-137 has no fee UI while store/useDomainStore.ts:282-291 attaches quoteTransferFee as value, which is either zero or a full startingPrice. components/RegisterModal.vue:427-434 already quotes and displays the equivalent floor.
Release surrenders a name on one click. components/profile/EscrowTab.vue:115-123 hands the name to escrow from a secondary-styled button with no confirmation; the header at :18 describes it only as "Release a name to start its cooldown". Recovery means claiming the deposit and paying to register again.
Withdrawal reports Finalized halfway through. store/useEscrowStore.ts:160-166 is two transactions while components/TransactionTimeline.vue:61 completes after the first. withdraw already zeroes the amount, so a dismissed second prompt leaves the row rendering "Claimed" with no action button and the deposit reachable only through the CLI.
A failed address conversion is shown as resolved. store/useWalletStore.ts:288-300 returns zeroAddress on any RPC error and composables/useAddressResolver.ts:78-80 marks it resolved, so components/modals/AddSubdomainModal.vue:386 mints a paid subdomain to 0x0 and components/modals/DelegateDomainModal.vue:208 issues approve(0), silently revoking a delegation while toasting "Delegation updated". transferDomain (store/useDomainStore.ts:276) is guarded and is the model.
Expected behavior
Before an action that spends funds or transfers ownership, the UI shows what it will cost and what will be given up, and asks for confirmation where the effect is irreversible. After it, the UI reports what actually happened: a success state means the chain write landed, and a failed write is surfaced rather than logged.
Reproduction
- Upload a file with "Save CID to on-chain Store" enabled and reject the Store prompt. The flow still ends in "Congratulations! Transaction successful!" with a zero transaction hash, and the CID is absent from the Store list.
- Open the transfer modal for a name whose recipient is a tier downgrade. No fee is shown anywhere, and the submitted transaction carries a non-zero
value. - Click Release on any funded position. The name is transferred to escrow immediately, with no intermediate confirmation.
Additional context
Scope note: this covers the write and disclosure side. #227 covers the read side, where failed reads are replaced with plausible fallback values. #220 covers the records that follow a name through a transfer, which is the other half of what the transfer warning omits.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by tracing the five flows in packages/ui: the upload and domain stores, TransferDomainModal.vue, RegisterModal.vue, EscrowTab.vue, TransactionTimeline.vue, useWalletStore.ts, useAddressResolver.ts, AddSubdomainModal.vue, and DelegateDomainModal.vue; compare transferDomain with the guarded behavior. Done means each irreversible or paid action discloses its effect and confirms when needed, while success and failure states match the transactions that actually landed.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- blockchain, solidity, typescript
- Domain
- blockchain, frontend
- Issue type
- Bug
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100