Repository navigation
Description
Summary
Finish PR #72: Reown existing-wallet login, rather than rebuild it.
Already implemented: a “Connect Wallet” login option opening Reown, EVM-only accounts, wallet-submitted transactions, session restoration, and Options → Logout. External account changes/disconnection end the session and return to login with a reconnect message. These flows need verification, not a new design.
Remaining work: prevent old account data/permissions surviving account changes, coordinate network switching, handle replaced transactions, and correctly reject unsupported dApp connections.
Baseline: feat-connect-wallet-reown. (the target branch for the PR)
Contributor bounty: Mythic
Contributor task
- Request assignment with an ETA. Run the branch locally and reproduce the issues below.
- Use Node 24 and pinned Yarn 4.17.0. Configure a test environment with a valid
NEXT_PUBLIC_WALLET_CONNECT_PROJECT_IDandNEXT_PUBLIC_LOGIN_EXISTING_WALLET_ENABLED=true. - Fix the four areas below, add regression tests, and provide a reviewable PR with evidence.
- Preserve social login and the existing reconnect-on-account-change behaviour. No account linking, new account switcher, dashboard redesign or non-EVM support is required.
- Keep the production flag off; merging, deployment and production enablement are outside this bounty.
Scope checks
1. Keep each account’s permissions and data separate
Problem: connections from other dApps to GoodWallet can survive social/private-key logout and later use a different active account. Transaction requests also overwrite a supplied sender instead of rejecting a mismatch. History is not cleared or keyed by account; its ten-minute refresh delay can retain the previous account’s activity. Balances and swap clients have reset paths, but unfinished requests need protection against writing stale results.
Done when: logout/account changes invalidate the old signing account and incompatible dApp connections. Requests for account A cannot be silently signed as B. New sessions show only their own data, including when earlier requests finish late.
Verify: connect a dApp as A, logout, then login as B within ten minutes. Check activity/balances and reject requests still addressed to A. Repeat with delayed balance/history/swap initialization.
Sources: session permissions, sender validation, history store.
2. Avoid competing network switches
Problem: parallel claims can switch the same external wallet between networks while another transaction is being prepared.
Done when: network switching and signing/submission are coordinated across claims and other wallet operations. Each action uses its intended account/network; rejection leaves the interface usable.
Verify: start Celo and XDC claims together; delay or reject one switch. Check transaction destinations and that neither action remains stuck. Cover overlapping signing/swap operations with deterministic tests. Review finding.
3. Finish transaction tracking
Problem: tracking only the original transaction hash can leave Send/Claim pending after the user speeds up or cancels in their wallet.
Done when: success, revert, replacement and cancellation have accurate outcomes. Temporary RPC uncertainty preserves the submitted hash and does not trigger a duplicate send. Preserve receipt and Divvi tracking.
Verify: test mined success, revert, speed-up, cancellation and delayed RPC visibility; check final status, hash and activity entries. Review finding.
4. Complete connection feedback and compatibility checks
Problem: unsupported required chains produce a local error but leave the requesting dApp waiting. Proposal compatibility must also be checked against the methods available for the active wallet/session. External disconnection also uses the “account changed” message.
Done when: unsupported required chains or methods receive a proper rejection; unsupported optional chains or methods can be omitted. Advertise and approve only methods actually supported by the active signer/session. Disconnect/account-change messages describe what happened, and Connect Wallet remains usable for retry.
Verify: pair an EVM dApp and one requiring an unsupported chain. Test supported methods, unsupported required methods, and a mix of supported and unsupported optional methods. Confirm the requesting dApp receives a rejection for unsupported requirements rather than waiting, approved namespaces contain only supported methods, and advertised methods can be executed. Include the existing external-wallet restrictions on raw transaction signing/sending and EIP-5792. Test connect/cancel/retry, reload/restore, Options → Logout, external disconnect and account change. Check feature-flag-off login fallback. Review finding.
GoodID’s empty-name acceptance and mobile-wallet handoff are compatibility checks, not confirmed defects. Use the PR’s existing human QA guide now; retest affected flows after fixes. Cover English/Danish and desktop/mobile. Record blocked checks honestly. Existing private-key screenshots do not prove external-wallet compatibility.
Required commands
yarn install --immutable
yarn biome:verify:all
yarn build
yarn tsc --noEmit
yarn test
yarn test:e2eFor interactive testing: yarn dev. It runs drizzle-kit push: use an isolated test database. Playwright starts its own server on port 3000.
Add runnable external-wallet/provider mocks for failure cases. Separately record actual-wallet checks using approved test funds, never production balances. Explain failed/unrun commands; mocks are not live-wallet evidence.
Handoff comment
Contributor: @handle
PR / final commit:
Fixed: list each scope area and linked review finding
Verified: commands, scenarios and results; distinguish mocks from actual wallets
Evidence: test paths, screenshots/recording, CI and wallet/browser versions
Remaining: unresolved issues or blocked checks, reason and next stepMetadata
Metadata
Assignees
Labels
Type
Projects
- StatusShow more project fieldsIn Progress
Activity
L03TJ3 commentedon Oct 23, 2026
@sirpy assigned you and please give an update when the local follow-ups are pushed
[-][DRAFT] Complete external-wallet login in GoodWallet[/-][+][GoodBounty] Complete external-wallet login in GoodWallet[/+]Ryjen1 commentedon Nov 3, 2026
Hello team, I’d like to take on this bounty
I’ve reviewed the issue and understand the goal is to complete the existing work on PR #72 (feat-connect-wallet-reown branch), not rebuild external-wallet login from scratch.
Plan:
ETA: 7–10 working days from assignment, with an initial reproduction / status update within 24 hours.
Please assign this issue to me if it’s still available. Thanks!
Godbrand0 commentedon Nov 3, 2026
Hello, I would first run the feat-connect-wallet-reown branch locally using Node 24 and Yarn 4.17.0, configure the Reown test environment, and reproduce the reported issues.
I’ll then investigate session isolation, network-switch coordination, transaction replacement tracking, and dApp connection compatibility before implementing fixes and regression tests. I’ll preserve the existing login flows and provide a reviewable PR with verification evidence.
ETA: 20 hours.
Please assign me.
HushLuxe commentedon Nov 3, 2026
Hello, I would like to request assignment for this bounty.
I have read the issue and understand that the task is to complete PR #72 from the feat-connect-wallet-reown branch, rather than rebuild the external-wallet login. I will first run the branch locally using Node 24 and Yarn 4.17.0, set up the specified test environment, and reproduce the issues across the four scope areas: account data and permission isolation, coordinated network switching, replacement-transaction tracking, and dApp compatibility feedback.
I will add regression tests and submit a reviewable PR with the required verification commands, test evidence, and any blocked checks clearly reported.
ETA: 10 working days from assignment, with an initial reproduction update within 24 hours.
Please assign this issue to me if it is still available. Thank you.
edehvictor commentedon Nov 3, 2026
Claim: Contributor Role
Contributor: @edehvictor
ETA: 7-10 working days from assignment, with an initial reproduction update within 24 hours
I’ve reviewed #76 and the existing work in PR #72. I recently worked on GoodWidget’s bridge correctness issue #257 in PR #266, covering account and source-chain changes, fresh quotes, wallet-switch rejection and Retry, and transaction progress. The bridge suite passed 38/38 locally, and I documented a separate funded wallet test rather than presenting mocks as live evidence. That experience is relevant here, though I’ll reproduce GoodWallet’s Reown-specific issues before changing them.
Plan
Initial Assessment
PR Add Reown existing-wallet login alongside Web3Auth #72 already implements the external-wallet login path, so I would build on it rather than redesign it. The remaining work is in account safety, transaction outcomes, and connection compatibility. I saw the earlier assignment note; please confirm this bounty is available before assigning it to me.
Kindly assign me @L03TJ3
nomsoscript commentedon Nov 3, 2026
Hi @L03TJ3 , would like to take on #76 if it’s still available.
I understand the task is to complete PR #72, not rebuild the external-wallet login. My approach would be to reproduce the reported issues, then address account/session isolation, network-switch coordination, transaction replacement tracking, and dApp compatibility.
I’ll preserve existing login flows, add regression tests, keep the production flag off, and clearly distinguish mocked tests from actual-wallet verification.
Please let me know whether this bounty is open to assignment.
ETA: 7-10 from assignment.
robertocarlous commentedon Nov 3, 2026
Hi @L03TJ3, I’d like to be assigned to this issue.
Approach: I’ll finish PR #72 on top of feat-connect-wallet-reown rather than rebuild it. I’ll start by auditing the baseline against the four scope areas and posting my findings, so you can see what is verified and what is broken before I change anything.
Account isolation: On logout or account change, invalidate the old signing account and any incompatible dApp sessions. Reject a request when the sender doesn’t match the active account instead of overwriting it. Guard history and balance fetches so a late response from a previous account can’t update the UI.
Network switching: Serialize switch, sign and submit operations across claims and other wallet actions. A rejected switch leaves the UI usable.
Transaction tracking: Handle success, revert, speed-up, cancel and replace. A temporary RPC failure won’t trigger a resend. The receipt and Divvi tracking stay intact.
Connection feedback: Explicitly reject unsupported required chains or methods. Omit unsupported optional ones. Approve only supported methods. Make disconnect messages accurate, and keep Connect Wallet usable for retry.
I’ll keep social login and the reconnect-on-account-change behavior unchanged, leave the production flag off, and stay out of the excluded scope. Each area will get regression tests, and any mocks will be labeled as mocks. The PR will be reviewable and will pass the required commands (biome, build, tsc, test, e2e). I’ll finish with a handoff comment listing fixes, verification, evidence and anything blocked.
ETA: 3-5 working days for a reviewable PR. I’ll post a progress update after the first audit.
Thanks for considering it.
Abidoyesimze commentedon Nov 3, 2026
Hi @L03TJ3 , I'd like to take this on. Please assign it to me.
ETA: 3-4 working days (with QA evidence).
About me: I'm a TypeScript/Node engineer working on wallet and payments infrastructure (CowryPay: transaction signing, on-chain transfers on Celo, payout flows), so session handling, nonce/replacement tracking and wallet edge cases are familiar ground.
Plan, on top of
feat-connect-wallet-reown:fromdoesn't match the active account; key or clear history by account; guard balance/history/swap writes with an account/session token so late responses for A are dropped after switching to B.I'll add provider/wallet mocks and regression tests for each area, run the full required command set, and follow the existing QA guide (EN/DA, desktop/mobile). I'll keep mock results clearly separate from real-wallet checks done with test funds, and record any blocked checks honestly in the handoff comment.
The production flag stays off; social login and reconnect-on-account-change will be preserved.
Yormee-103 commentedon Nov 3, 2026
Hi @L03TJ3, I'd like to request assignment for this bounty.
I've reviewed issue #76 and understand that the goal is to complete the existing Reown external-wallet login implementation in PR #72, rather than rebuild the authentication flow.
My approach would be to:
I'll add regression tests for the affected areas, preserve existing social login functionality, and keep the production feature flag disabled.
I'll also follow the existing QA guide and distinguish mocked test results from actual-wallet verification.
ETA: 7–10 working days from assignment, with an initial reproduction and progress update within 24 hours.
I'll follow the repository's contributing guidelines and provide a reviewable PR with verification results, evidence and any outstanding limitations.
Please assign me if the bounty is still available. Thank you!
L03TJ3 commentedon Nov 3, 2026
Okay, you are assigned! @Ryjen1
once you start please reach out on telegram so I can share potential needed environment variables to be able to run the wallet locally
Ryjen1 commentedon Nov 3, 2026
Thank you, @L03TJ3 - assignment acknowledged. I’ll reach out on Telegram once I'm about to start.
Abuchtela commentedon Nov 5, 2026
Claim: Contributor Role
Contributor: @Abuchtela
ETA: update within 24/48 hours
I’ve reviewed #76 and the existing work in PR #72. The bridge suite passed 38/38 locally, and I documented a separate funded wallet test rather than presenting mocks as live evidence. That experience is relevant here, though I’ll reproduce GoodWallet’s Reown-specific issues before changing them.
Plan
Run feat-connect-wallet-reown locally with Node 24, Yarn 4.17.0, the required feature flags, and an isolated test database.
Audit PR Add Reown existing-wallet login alongside Web3Auth #72 against issue [GoodBounty] Complete external-wallet login in GoodWallet #76 and reproduce the reported failures.
Address account/session isolation, competing network switches, transaction replacements, and unsupported dApp connection requests.
Add regression tests, run the issue’s required Yarn commands, and distinguish mocked tests from actual-wallet evidence.
Post a handoff with results and any blocked checks. I will keep the production flag off.
Initial Assessment
PR Add Reown existing-wallet login alongside Web3Auth #72 already implements the external-wallet login path, so I would build on it rather than redesign it. The remaining work is in account safety, transaction outcomes, and connection compatibility.
Kindly assign me @L03TJ3
Ryjen1 commentedon Nov 5, 2026
Contributor: @Ryjen1
PR / final commit: [https://github.com//pull/78] — final commit e652cf4
Fixed:
Scope 1 — Keep each account's permissions and data separate
transactionHistoryStore,amountsStore. (b1e0300, acc1672)WalletWrappervalidates the dApp-suppliedfromaddress against the connected account using a case-insensitive helper (isSameAddress) so that EIP-55 casing variants are accepted while genuinely different addresses are rejected. (b1e0300, 46a9753)disconnectDappSessions()before clearing state, so no dApp connection can survive a session boundary.storage.ts. (4e0f486)initializeWalletConnectbefore the signer is marked usable.walletConnectStore.ts. (141d918, 60926a9)Review finding addressed: Add Reown existing-wallet login alongside Web3Auth #72 (comment), Add Reown existing-wallet login alongside Web3Auth #72 (comment)
Scope 2 — Avoid competing network switches
chainOpLockmutex serializesensureChain,submitTransaction,signTypedData,signMessage, andgetReownEip1193Provider. Concurrent claims on different networks queue instead of racing. The lock is always released in afinallyblock so a failed or rejected switch does not leave the interface stuck.reown.ts. (4e0f486, 89db1b3)watchReownAccountis split intoonAccountChangedandonDisconnectedcallbacks so external account changes and disconnections produce distinct messages and behaviours. (4e0f486)Review finding addressed: Add Reown existing-wallet login alongside Web3Auth #72 (comment)
Scope 3 — Finish transaction tracking
provider.waitForTransactionwithreplaceableTransaction(hash, startBlock), enabling ethers to follow speed-ups and cancellations through the mempool.utils.ts. (ab4e1df)startBlockis captured bygetBlockNumberbeforesubmitTransactionis called, so a fast replacement cannot be mined before the tracking window opens. (cd22844)TRANSACTION_REPLACEDhandling branches onerr.reason:"repriced"(speed-up): replacement receipt is used; Divvi referral tracking proceeds on the replacement hash — original intent is preserved."cancelled"/"replaced"(different intent): error is rethrown; the caller's error path surfaces the failure,submitReferralis not reached, and no false-success analytics fire. (e652cf4)getTransactionfailures (null result) are retried up to 40 times at 1.5 s intervals before giving up. (ab4e1df)Review finding addressed: Add Reown existing-wallet login alongside Web3Auth #72 (comment)
Scope 4 — Complete connection feedback and compatibility checks
RequestHandlernow inspects required namespaces in every session proposal. If any required chain is not in the supported set,rejectSessionis called with WalletConnect error codeUNSUPPORTED_CHAINSso the requesting dApp receives an immediate rejection rather than waiting forever. (141d918)initializeWalletConnect, preventing cross-account rebinding. (141d918, 60926a9)Review finding addressed: Add Reown existing-wallet login alongside Web3Auth #72 (comment)
Verified:
All required commands run on Node 24, Yarn 4.17.0, macOS, branch
fix/external-wallet-login-hardeningat e652cf4:yarn install --immutable✅ passyarn biome check✅ pass — 363 files, 0 errorsyarn tsc --noEmit✅ pass — 0 type errorsyarn build✅ pass — Turbopack ~34 s, 11/11 static pages generatedyarn test✅ pass — 19 test files, 151 testsyarn test:e2e✅ pass — 10/10 Playwright scenariosAll failure cases (cancelled transaction, replaced transaction, late async balance response, concurrent network switch, unsupported proposal rejection, case-insensitive sender validation) are covered by deterministic unit tests using provider/wallet mocks.
Interactive QA was performed with
yarn devagainst a testnet environment (NEXT_PUBLIC_GOODDOLLAR_CONTRACTS=development) using MetaMask on Brave. Verified: external login, automatic logout on external account switch, account data isolation, hard refresh session restore, and logout.NEXT_PUBLIC_LOGIN_EXISTING_WALLET_ENABLEDremainsfalsefor production.Evidence:
Test files:
transactionHistoryStore.test.ts,amountsStore.test.ts,WalletWrapper.test.ts,reown.test.ts,utils.test.ts,RequestHandler.test.ts,walletConnectStore.test.ts.Build: Turbopack, 11/11 static routes, clean.
E2E: Playwright 10/10 on desktop + mobile, EN + DA.
Remaining:
disconnectDappSessionsinstorage.tsis fire-and-forget (pre-existing pattern).chainOpLockhas no timeout for a hung wallet popup.lifiStoreare not serialized throughchainOpLock.cyzcz commentedon Nov 7, 2026
PR: #80 (#80)
Contributor: @cyzcz
Commit:
2f19955(targetingfeat-connect-wallet-reown)Fixed
src/sections/WalletConnect/requests/RequestHandler.ts): Re-querieswalletConnectInstance.getActiveSessions()[topic]afteropenWalletConnectDialogresolves so a session revoked or disconnected while the approval modal was open cannot proceed to sign.src/sections/Swap/components/RouteSlider/RouteSlider.tsx): Added anactivityHistoryStore.getCurrentAccountToken() !== initialAccountTokencheck insideupdateTransactionRequestHookso a mid-route logout/account switch aborts before signing subsequent steps with another account's signer.chainOpLocknetwork switching, reverted/repriced replacement transaction handling, andUNSUPPORTED_CHAINS/UNSUPPORTED_METHODSproposal rejection).