refactor: earn flow + remove xstate/store#551
Conversation
|
|
Important Review skippedDraft detected. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
|
This pull request is automatically being deployed by Amplify Hosting (learn more). |
|
This pull request is automatically being deployed by Amplify Hosting (learn more). |
Key validators by address and subnet so selection keeps distinct validator options. Scope balance and init token options to the selected dashboard category.
| {t("dashboard.borrow.success_page.view_transaction")} | ||
| </Text> | ||
| </Box> | ||
| ) : null |
There was a problem hiding this comment.
🔒 Agentic Security Review
Severity: MEDIUM
submission.link is opened via window.open(..., "_blank") without noopener,noreferrer. If this URL is attacker-influenced (e.g., via upstream API data), the opened page can access window.opener and navigate the original tab (reverse-tabnabbing).
Impact: A user can be redirected from the trusted widget host tab to a phishing or malicious page after clicking a transaction link.
Reviewed by Cursor Security Reviewer for commit 6cf3187. Configure here.
6cf3187 to
5dac944
Compare
There was a problem hiding this comment.
Stale comment
Risk: high. Not approving: this large earn/borrow refactor exceeds the low-risk approval threshold, Cursor Security Agent left an unresolved medium-severity finding, and required checks did not finish on the latest commit (Bugbot cancelled; Security Agent still running). Assigned jdomingos and dnehl for human review.
Sent by Cursor Approval Agent: Pull Request Router and Approver
There was a problem hiding this comment.
Stale comment
Risk: high. Not approving: this large earn/borrow refactor exceeds the low-risk approval threshold, and Cursor Security Agent has an unresolved medium-severity tabnabbing finding on
complete.tsx. jdomingos and dnehl are already assigned for human review.Sent by Cursor Approval Agent: Pull Request Router and Approver
Split earn intent and view atoms so route and wallet state changes update the resolved view. Keep dispatch separate from view reads and add wallet resolution handling. Cover dashboard tab selection and patch Effect parent tracking.
Use the native TypeScript 7 compiler across the widget and examples. Keep TypeScript 6 API compatibility for Next.js tooling.
There was a problem hiding this comment.
Stale comment
Risk: high. Not approving: this large earn/borrow refactor exceeds the low-risk approval threshold, and Cursor Security Agent has an unresolved medium-severity tabnabbing finding on
complete.tsx. jdomingos and dnehl are already assigned for human review.Sent by Cursor Approval Agent: Pull Request Router and Approver
Replace legacy context, query, and state-machine integrations with Effect services and atom-backed wallet, API, and workflow state. Split Vitest projects and add AST rules to validate the new architecture.
16d2bb4 to
67eb76f
Compare
There was a problem hiding this comment.
Stale comment
Risk: high. Not approving: this large earn/borrow refactor exceeds the low-risk approval threshold, and Cursor Security Agent has an unresolved medium-severity tabnabbing finding on
complete.tsx. jdomingos and dnehl are already assigned for human review.Sent by Cursor Approval Agent: Pull Request Router and Approver
There was a problem hiding this comment.
Stale comment
Risk: high. Not approving: this large earn/borrow refactor exceeds the low-risk approval threshold, and Cursor Security Agent has an unresolved medium-severity tabnabbing finding on
complete.tsx. jdomingos and dnehl are already assigned for human review.Sent by Cursor Approval Agent: Pull Request Router and Approver
Define an explicit public API contract for package and bundle consumers. Emit only public declarations instead of the full application type graph.
66cee96 to
0d6ed5f
Compare
There was a problem hiding this comment.
Stale comment
Risk: high. Not approving: this large earn/borrow refactor exceeds the low-risk approval threshold, and Cursor Security Agent has an unresolved medium-severity tabnabbing finding on
complete.tsx. jdomingos and dnehl are already assigned for human review.Sent by Cursor Approval Agent: Pull Request Router and Approver
Standardize ignored files and vendored repository paths. Align editor, TypeScript, pnpm, and agent guidance and remove obsolete files.
Reorganize app composition, services, features, domain, and shared code by ownership. Consolidate runtime state around one Effect Atom runtime. Add architecture checks to prevent dependency leaks.
There was a problem hiding this comment.
Stale comment
Risk: high. Not approving: this large earn/borrow refactor exceeds the low-risk approval threshold, and Cursor Security Agent has an unresolved medium-severity tabnabbing finding on
complete.tsx. jdomingos and dnehl are already assigned for human review.Sent by Cursor Approval Agent: Pull Request Router and Approver
Project borrow wallet state directly from normalized atom state. Remove the unused bridge-owned chain switching command. Rename the atom runtime provider directory to match its broader role.
Replace separate step and borrow executors with one Effect-backed workflow model. Share the workflow across classic and dashboard flows. Normalize wallet transaction payloads at the domain boundary and align tests and Effect guidance with the new runtime.
There was a problem hiding this comment.
Stale comment
Risk: high. Not approving: this large earn/borrow refactor exceeds the low-risk approval threshold, and Cursor Security Agent has an unresolved medium-severity tabnabbing finding on
complete.tsx. jdomingos and dnehl are already assigned for human review.Sent by Cursor Approval Agent: Pull Request Router and Approver
Split the workflow graph into direct atom families so mounted consumers retain each atom. Keep derived atoms on one machine and provide the classic workflow key through React context.
Key runtime generations by API configuration while keeping host callbacks reactive. Bind workflows, selections, and resource invalidation to semantic wallet scopes. Prevent account and network changes from reusing stale state. Route classic and dashboard flows through scoped guards. Cover lifecycle behavior with unit, DOM, and browser tests.
Capture one immutable wallet bootstrap snapshot per app runtime. Construct one service-owned Wagmi config with observable lifecycle phases. Keep watchers, initialization, reconnect ordering, and cleanup scope-owned. Preserve the legacy consumer path for the later authoritative handoff.
Own modern Wallet Standard discovery, readiness, mobile parity, and cleanup. Keep dynamic adapters out of Wagmi until the later membership cutover.
Route the Wagmi React boundary and core wallet projections through the scoped WalletService runtime. Keep one config across wallet-setting changes and surface terminal failures through typed adapters.
Move live external-provider snapshots and connector notifications into the scoped WalletService runtime. Enforce fixed connector mode with terminal, log-once invariants without rebuilding Wagmi.
Move connection enrichment and private command-routing context into the scoped wallet runtime. Publish atomic, deduplicated service projections and replace feature state owners with read-only adapters.
Run connection tracking and unsupported-chain disconnects from serialized WalletService state. Remove atom lifecycle ownership and scope recoverable effects to the wallet runtime.
Capture one service-owned routing snapshot when each command begins. Fail terminal runtime phases deterministically while preserving immediate pre-ready capability failures and active-command stability.
Drive Solana connector discovery and readiness from the scoped wallet runtime. Keep the Wagmi config authoritative and stable. Remove the React Solana bootstrap bridge and unused adapter dependency.
Remove keyed wallet controller and root-input compatibility paths. Keep React as a read-only adapter for the service-owned Wagmi config. Declare the missing Fractal Solana peer required by distributable builds.
Make wallet service acquisition define readiness through a top-down bootstrap. Replace the public runtime event protocol with Effect-native state, streams, and dependency injection. Keep wallet readiness isolated from unrelated app services while sharing their constructed service context through the wallet runtime.
There was a problem hiding this comment.
Stale comment
Risk: high. Not approving: this large earn/borrow refactor exceeds the low-risk approval threshold, and Cursor Security Agent has an unresolved medium-severity tabnabbing finding on
complete.tsx. jdomingos and dnehl are already assigned for human review.Sent by Cursor Approval Agent: Pull Request Router and Approver
Import values and types directly from their defining modules to make dependency boundaries explicit. Add Biome rules that prevent internal barrels and type re-exports while preserving the public entrypoints.
There was a problem hiding this comment.
Risk: high. Not approving: this large earn/borrow refactor exceeds the low-risk approval threshold, and Cursor Security Agent has an unresolved medium-severity tabnabbing finding on complete.tsx. jdomingos and dnehl are already assigned for human review.
Sent by Cursor Approval Agent: Pull Request Router and Approver




Note
High Risk
Large new DeFi borrow path with wallet signing, transaction submission, and LTV validation touches money-moving flows; earn routing/state refactor could regress staking if mis-wired.
Overview
Adds a feature-flagged borrow experience in the dashboard (form → review → steps → complete, plus borrow position management), backed by a new
borrowmodule: Effect Schema domain models, OpenAPI-generatedBorrowApiclient, and@effect/atom-reactatoms for markets/positions, form state, action execution (sign/submit/confirm), and post-tx cache refresh.Earn flow cleanup: drops
EarnPageStateUsageBoundaryProvider/@xstate/store, removescommon/get-token-balances.tsandgetInitialTokenfrom stake types, and tightens validator handling via a compositeValidator.key(address + optional subnet) used in select-validator and position balance keys.Tooling/config: OpenAPI generator gains
BorrowApi(fullhttpclient+ spec prep), optional CLI spec selection,VITE_BORROW_API_URL/VITE_FORCE_BORROW, and rootpnpm.patchedDependenciesremoved; adds skeleton line/circle loaders for borrow UI loading states.Reviewed by Cursor Bugbot for commit 6cf3187. Configure here.