Component
Other
Priority
P1
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.
Component
Other
Priority
P1
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-282swallows a failedwriteCidToStore;:423-425then sets "Upload complete!", overwriting the "not yet resolvable" message at:284-288;components/preview/FileUpload.vue:92-98shows "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-137has no fee UI whilestore/useDomainStore.ts:282-291attachesquoteTransferFeeasvalue, which is either zero or a fullstartingPrice.components/RegisterModal.vue:427-434already quotes and displays the equivalent floor.Release surrenders a name on one click.
components/profile/EscrowTab.vue:115-123hands the name to escrow from a secondary-styled button with no confirmation; the header at:18describes 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-166is two transactions whilecomponents/TransactionTimeline.vue:61completes after the first.withdrawalready 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-300returnszeroAddresson any RPC error andcomposables/useAddressResolver.ts:78-80marks it resolved, socomponents/modals/AddSubdomainModal.vue:386mints a paid subdomain to0x0andcomponents/modals/DelegateDomainModal.vue:208issuesapprove(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
value.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.