Execute proposal flow#511
Conversation
…e interceptor to guardian
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using default effort and found 2 potential issues.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Comment @cursor review or bugbot run to trigger another review on this PR
Reviewed by Cursor Bugbot for commit 46577df. Configure here.
|
|
||
| print('executing proposal id: ${widget.proposal.id}'); | ||
| print('msig: ${widget.msig.accountId}'); | ||
| print('signer: ${signer.accountId}'); |
There was a problem hiding this comment.
Debug print left in execute sheet
Low Severity
The execute confirmation sheet calls print for fee loading and submission with proposal id, multisig address, and signer id. That mirrors temporary debugging, not the debugPrint pattern used on the approve sheet, and can leak account identifiers in production logs.
Reviewed by Cursor Bugbot for commit 46577df. Configure here.
|
|
||
| removePendingMultisigExecution(ref, pending.id); | ||
| await reconcileIndexedExecution(ref, msig, pending); | ||
| return true; |
There was a problem hiding this comment.
Execution poll ignores extrinsic outcome
Medium Severity
Execution polling clears pending state when the proposal’s indexer status is executed, without checking that this user’s submit extrinsic succeeded. If another signer executes first, the local pending row is dropped even when the user’s extrinsic later fails on-chain, so no submit-failure feedback and a wasted fee are possible.
Reviewed by Cursor Bugbot for commit 46577df. Configure here.
|
Review complete. Here's my assessment of PR #511 — Execute proposal flow. OverviewAdds the end-to-end multisig execute path: confirm sheet → Should fix before merge1. Leftover debug 2. polkadart:
output_dir: lib/generated
chains:
- planck: wss://a1-planck.quantus.cat
+ planck: ws://127.0.0.1:9944This looks like local-dev config that leaked in — the 3. Exact duplicate test group — Worth discussing4. Silent drop of a failed execution (Bugbot's medium finding is valid) — in 5. Fee-estimate failure swallowed — 6. DRY: execute sheet is a ~190-line near-copy of the approve sheet — 7. Deploy-order dependency on the indexer — Minor
What looks good
Items 1–3 are quick fixes I'd block on; item 4 is a judgment call but at minimum deserves a log/toast given the "no silent failures" principle. |
…Network/quantus-apps into beast/execute-proposal-flow
n13
left a comment
There was a problem hiding this comment.
Review (agent-assisted, diffed against multisig-implementation)
Verdict: GTG — no blockers found; two minor, non-blocking notes.
Minor
-
Logout doesn't clear pending execution state —
mobile-app/lib/services/logout_service.dartclearspendingTransactionsProviderandpendingMultisigCreationsProvider, but not the new in-memorypendingMultisigExecutionsProvider(the same gap already exists for the pending proposals/approvals providers, so this extends a pre-existing pattern). After logout + re-login in the same process, stale "Executing…" rows could survive and execution pollers tied to the old session keep running. -
Possible false "executed by another signer" toast — in
_tryResolveExecutionTimeout(multisig_execution_polling_service.dart), when the proposal status isexecutedbutsearchExecutedByExtrinsicHashreturns null, theexecutedByOthertoast is always shown. That branch is also reachable when this user's own execution succeeded but account-history indexing is still lagging past the poll timeout — the code comment acknowledges "most likely". Consider softening the copy or rechecking once more before asserting someone else executed it.
Checked and fine
MultisigApprovalToastListenerexhaustively handles allMultisigExecutionToastKindvalues includingexecutedByOther.- Execute submit path (
executeProposal/_submitExecuteBackground) cleans up pending state and surfaces a toast on submit failure; optimistic state + indexer polling mirrors the existing approve flow.
* msig implementation 1 * linter fixes and package updates * Create multisig flow (#505) * feat: localize copy writing * Format and regrenate runtime apis * feat: finish create multisig flow * fix: code reviews * fix: code reviews * feat: finish adding in-flight tracking for multisig creation - reconcilate pending multisig creation - track multisig creation * feat: improve multisig creation - make nonce calculated on the fly - only show history for creator * feat: add checksum and not truncate checksum * fix: create multisig screen * fix: add logging on error * feat: improve UX multisig creation pending and details sheet * fix: preflight balance check * fix: DRY violation * fix: silent or masking bad data * fix: persisting pending multisig creation * chore: formatting * Discover multisig flow (#506) * feat: finish adding discover multisig * fix: code review issues * fix: another code review issues * feat: add checksum on discover list item * fix: listview item non properly ordered without key * feat: refactor repeating multisig graphql handling * feat: make json reading throw early instead of silently droping it. Also have intFromJson for supporting hasura stringify number. * fix: use variable instead of string interpolation * feat: propagate error as to not confuse user * Create proposal flow (#507) * wip: create proposal - finish create flow - create history of proposal * feat: improve UX of propose amount and review screen * feat: finish improving the lifecycle of proposal creation and event listing presentation * feat: address code review issues * feat: another code reviews fixes * chore: formatting * fix: dart rule violation * fix: redudancy * fix: graphql query for multisig * fix: circle dependency * feat: explicitly show failed fee fetch - add retry button - show message - silently refetch network fee unless failed * fix: reduce risk of double proposal creation * fix: handle last effort before timeout * chore: formatting * Sign proposal flow (#510) * feat: finish approve proposal flow from multisig account * feat: show approve event in signer account * feat: resolve DRY and simplicity issues * feat: best effort timout and balance refresh * chore: formatting * chore: revert constants * chore: remove dead code * Execute proposal flow (#511) * feat: finish approve proposal flow from multisig account * feat: show approve event in signer account * feat: resolve DRY and simplicity issues * feat: best effort timout and balance refresh * chore: formatting * wip: add execute flow * feat: regenerate polkadart metadata, clean up deposit field and rename interceptor to guardian * fix: live state resolution and update executed proposal UI * feat: improve UX executed proposals * chore: formatting * chore: revert constants * feat: show activity in executor * chore: formatting * chore: revert back chain url * fix: code reviews * fix: execute event query and data model * chore: revert constants * chore: formatting * Cancel proposal flow (#512) * feat: finish approve proposal flow from multisig account * feat: show approve event in signer account * feat: resolve DRY and simplicity issues * feat: best effort timout and balance refresh * chore: formatting * wip: add execute flow * feat: regenerate polkadart metadata, clean up deposit field and rename interceptor to guardian * fix: live state resolution and update executed proposal UI * feat: improve UX executed proposals * chore: formatting * chore: revert constants * feat: show activity in executor * chore: formatting * feat: add cancel proposal flow * feat: display cancel proposal event in proposer activity * chore: formatting * chore: revert constants * chore: revert back chain url * fix: code reviews * fix: execute event query and data model * chore: revert constants * chore: formatting * fix: code review issues * Multisig proposal polling (#513) * feat: finish approve proposal flow from multisig account * feat: show approve event in signer account * feat: resolve DRY and simplicity issues * feat: best effort timout and balance refresh * chore: formatting * wip: add execute flow * feat: regenerate polkadart metadata, clean up deposit field and rename interceptor to guardian * fix: live state resolution and update executed proposal UI * feat: improve UX executed proposals * chore: formatting * chore: revert constants * feat: show activity in executor * chore: formatting * feat: add cancel proposal flow * feat: display cancel proposal event in proposer activity * chore: formatting * chore: revert constants * feat: finish implementing polling and refresh proposals * chore: formatting * chore: revert back chain url * fix: code reviews * fix: execute event query and data model * chore: revert constants * chore: formatting * fix: code review issues * fix: code review issues * fix: broken initialization of timezone * chore: add debug on error * fix: code review issues --------- Co-authored-by: Nikolaus Heger <nheger@gmail.com>


Summary
Note
Medium Risk
Touches on-chain submission and balance-affecting execute flows with new polling paths; multisig creation preflight no longer reserves deposit, which can change whether creation is allowed vs the old app.
Overview
Adds an end-to-end multisig execute path after approvals hit threshold: confirm sheet (fee estimate + local auth),
TransactionSubmissionService.executeProposalwith optimistic pending state, indexer polling/reconciliation, and UI on proposal detail, activity rows, and error toasts—mirroring the existing approve flow.Proposal detail & lists now branch on status: Execute when
isReadyToExecute, Approve otherwise, with pending “Executing…” states; terminal proposals show an AT timestamp fromupdated_atinstead of expiry. Open proposals sort byupdated_at; live proposal resolution checks past proposals too.SDK / chain metadata (spec 129) is regenerated: multisig creation deposit and dissolve APIs are dropped from models, preflight, and activity detail; creation cost is pallet + network fees only.
MultisigServicegains build/estimate/submit formultisig.execute. GraphQL andMultisigProposaluseupdated_atfor ordering and activity timestamps. Generated pallets also pick up reversible-transfers guardian renames and other runtime doc/type updates bundled in the regen.i18n adds execute-related strings (EN/ID) and tightens insufficient-balance copy for multisig creation.
Reviewed by Cursor Bugbot for commit 46577df. Configure here.