chore: promote development to master - #771
Conversation
- keep historical EVK categories independent of current borrowability - distinguish partial coverage and bound proxy backoffs
Keep raw V3 activity available while Lite requests only scope-relevant display events and suppresses accrual and paired share-movement noise.
- clarify transfers and suppress exact paired share movements - add token imagery, compact responsive details, and copyable addresses - hide unavailable pricing noise while preserving truthful fallbacks
Show historical amounts in underlying asset units and conservatively collapse exact paired operations.
Use the available Activity feed width to switch between compact and full table layouts, keeping vault rows readable without changing the wider portfolio presentation.
Group participant metadata with the event summary at constrained feed widths so vault activity stays dense while preserving the wide portfolio table.
Emphasize event amounts, reduce redundant asset labels, and present expandable metadata as a compact accessible disclosure control.
- clarify transfers and suppress exact paired share movements - add token imagery, compact responsive details, and copyable addresses - hide unavailable pricing noise while preserving truthful fallbacks
Describe incomplete categories without implying that no events exist.
Limit position history to attributable operations, show asset-unit amounts, and conservatively collapse exact paired events.
Align portfolio activity copy with the position terminology used throughout Lite.
…events-tab-to-portfolio-per-wallet-event feat: add portfolio activity timeline
Restore focused position and vault event filters, keep spy navigation synchronized, and make shared Activity controls responsive and accessible.
Keep responsive tabs visible after late layout changes and expose selected Activity filters in the control accessibility label.
Sign asset amounts by flow direction and color inflows, switch feed timestamps to relative with the absolute date on hover, drop the redundant generic asset label and token address line, hide the viewed account from participants, resolve known vault participants to named vault links, and wrap category filter chips instead of clipping them.
Uppercase acronyms in fallback event titles (Set LTV), order LTV change fields and drop ramp targets on immediate changes, decode config flag bitmasks and EVK config amounts (interest fee, liquidation discount) into readable values, render zero addresses and empty hooked ops as None, wrap long event titles instead of truncating, and remove the no-participants and no-details placeholders.
Show up to two details and participants inline — a Details toggle that hides a single row costs more space than it saves — and vertically center row content when no toggle renders, including table-width rows where the toggle never shows.
Replace the floating boxed Details button with a muted "+N more" text control rendered after the visible detail entries, where the hidden rows appear on expand.
Skip rendering the empty participants wrapper so its flex gap no longer pushes the summary off center, and vertically center the transaction link on rows without an expand toggle.
Apply one alignment rule to every mid-width row: event summary, details, and the transaction link share the first grid row and center against each other, while participants span a full-width second row. Replaces the static-row special case that left lending amounts floating between the title and participant lines.
Flatten the row into explicit grid cells: the category icon, details column, and transaction link span and center against the full card height on every row, while the title and participant lines stack top-down beside the icon. The table header gains a matching icon column so the Event label stays aligned with titles.
- render historical liquidation valuation fallbacks through the shared row formatter - decode vault and hooked-operation details with compact responsive disclosure styling - align portfolio empty, loading, timestamp, and transfer presentation
- pass the configured interfaces branch into SDK ABI resolution - derive EulerChains deployments from the same branch
- resolve SDK plugins from the current owner while retaining the pinned layer-0 account - isolate slot hints across chain changes and late probe completions - cover both review boundaries with focused regressions
Review follow-ups on the first-batch-add fast path. Never accept prefetched accounts per entry. `usePlanAccount().account` and `useEulerAccount().portfolio` are both layer-aware: they resolve to the active *simulated* layer once the batch is non-empty, so a page handing them to `addEntry` could in principle seed the batch's own layer 0 with simulated state. Nothing was corrupted today — every path that nulls `baseAccountSnapshot` also clears `layers` and calls `syncOverlay()`, so the overlay was always null exactly where the preflight consumed the supplied account — but the invariant lived across four call sites and nothing enforced it. The batch now reads only the prefetch registry, which holds pre-overlay loader output by construction, via one `resolvePrefetchedAccounts` helper shared by the preflight, `getEntryPlanningAccount`, and `resimulate`. Drops the `planningAccount` / `baseAccount` / `slotHints` entry props. Drop the slot-hint half of the registry. The SDK's `fetchErc20SlotHints` already memoises module-scope by `chainId:token`, so once any form primes a token the batch's own probe short-circuits to a Map lookup with no RPC. The registry bought the removal of an `await`, not a round-trip, at the cost of a chain-keyed Map, a three-way merge with ambiguous precedence, and its own teardown. The batch keeps probing only tokens missing from `batchSlotHints`, which is what the simulator actually reads. Stop speculative priming from gating submit. `isResolvingStateOverrideHints` is a global counter that hard-disables submit and add-to-batch on every mounted form and swaps the tooltip to "Complete the form fields above to continue." Page-load priming now passes `background: true` so it no longer registers as pending work — on a cold cache the simulator just falls back to access-list discovery, as it did before priming existed. Applies to the earn page and wallet repay added here, and to the lend page, which already had it. Also: guard the earn page's probe against a native-currency asset, matching lend; keep the concurrent-prime fix in `primeSlotHintsFor` (the pre-await snapshot dropped hints landed by a parallel prime) and cover it directly. Verified: 1489 tests pass, `npm run typecheck` clean, ESLint clean on every changed file. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This reverts commit 141d8b7.
- pin SDK 1.2.2 for the published runtime ABI service - resolve UtilsLens and VaultLens through the shared SDK instance - remove unused ABI modules and exports
refactor: consume SDK collateral position data
Speed up first batch additions
- compact token quantities and render unlimited caps semantically - collapse multi-strategy queue details behind an expandable summary - keep the final pagination action centered within the feed
# Conflicts: # package-lock.json # package.json
…events-section-to-vault-page-filterable-by feat: add vault and portfolio activity timelines
Keep long vault names within compact Activity rows while preserving the asset symbol and copy action.
- show canonical market and asset identities on separate lines - constrain expanded detail rows across desktop container breakpoints
fix: clarify Activity vault identities
Reuse form slot hints across batch additions
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository: euler-xyz/coderabbit/.coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Comment |
There was a problem hiding this comment.
Review summary
This promotion ships activity feeds, spy fail-closed owner resolution, batch account/slot-hint prefetch, and an Euler SDK bump to 1.2.3. Money-moving paths (batch sim/execute, repay slot priming, spy-safe address selection) were traced end-to-end; most of that work looks carefully guarded. The main concern is shipping SDK 1.2.3’s incomplete-snapshot signal without the Lite-side rejection that was briefly added on this branch and then reverted.
Reviewed: batch prefetch (useTxBatch, batchPrefetchState, useStateOverrideOptions, lend/repay priming), spy mode + useEffectiveAddress consumers, position collateral SDK migration, ABI→SDK sourcing, activity feed/liquidation enrichment, V3 proxy allowlisting, env/__APP_CONFIG__ interfaces branch wiring · Traced beyond the diff: simulateTransactionPlan → stitch → getEntryPlanningAccount → execute gate; form useTransactionPlanSimulation.handleResult; SDK SimulateBatchResult 1.2.1 vs 1.2.2/1.2.3 · Protocol skills consulted: euler-vaults, euler-advanced (hooks)
Findings
🚨 Critical
package.json:38 — SDK 1.2.3 incomplete AccountLens snapshots are not rejected
This PR bumps @eulerxyz/euler-v2-sdk from 1.2.1 → 1.2.3. From 1.2.2 onward the SDK can return snapshotReadFailures while leaving canExecute: true, and its types explicitly warn that a failed AccountLens read does not stop the batch — consumers must check snapshotReadFailures before treating simulatedAccounts as a complete post-state (e.g. before deriving a health factor).
Lite does not do that check today:
composables/useTxBatch.tssetssimErroronly onsimulationError/ status-check failures, socanExecuteBatchstays enabled and the incomplete layer is stitched into the portfolio overlay.- With a non-empty cart,
getEntryPlanningAccountreturns that final simulated layer as the planning account for the next add — so a subsequent borrow/multiply plan can be built from a snapshot missing collateral or debt. composables/useTransactionPlanSimulation.tshandleResultlikewise ignoressnapshotReadFailures, so form Review can open on an incomplete projection.
Concrete trigger: during batch or form simulation, an AccountLens vaultAccount / evcAccount read fails in-band (queryFailure) or reverts (RPC/lens flake, undecodable vault). SDK still reports success with an incomplete account. Consequence: projected HF / position state can omit real debt or collateral; the user can keep adding sized entries and hit Execute while trusting that projection. On-chain deferred checks may still revert an unsafe batch, but the UI is no longer a faithful risk gate, and follow-on plans are built from the bad layer.
This branch already contained the fix (141d8b7e — reject in useTxBatch + useTransactionPlanSimulation + formatSimulationFailure) paired with SDK 1.2.2, then reverted it (9fe6170d) back to 1.2.1, and later landed on 1.2.3 without restoring the guard. Re-apply that rejection (or an equivalent) before promoting 1.2.3, or stay on 1.2.1 until the consumer side is ready.
💬 Suggestions
pages/position/[number]/borrow/index.vue:105 — leftover spyAddress || address after fail-closed spy
Spy activation now clears spyAddress until EVC owner resolution finishes, while isSpyMode is already true. Most load-bearing callers were moved to useEffectiveAddress (which stays falsy while pending). This identity key still does spyAddress.value || address.value, so during the pending window it falls back to the connected wallet if a position object is briefly still present. Low blast radius (identity/baseline key only), but it is the anti-pattern this PR fixed elsewhere — switch it to effectiveAddress for consistency.
Open questions
- Why was
141d8b7e(“reject incomplete account simulations”) reverted? If it was false-positive noise from noisy lens failures, a narrower policy (block Execute / block next-add planning, but still render a degraded banner) would still be safer than ignoringsnapshotReadFailuresentirely on 1.2.3. Confirming the revert rationale would settle whether CRITICAL should be downgraded once a deliberate policy is documented.
Not flagged
- Batch account/slot-hint prefetch validates chain+owner and keeps simulated overlays out of layer 0; slot hints remain sim-only (aligned with prior batch-slot-hint guidance).
simulateTransactionPlanalready receivesownerAddr(Address), not a frozen Account — Pyth plugin freshness concern from memory does not apply here.- Spy fail-closed +
useEffectiveAddresson portfolio/APY/rewards/REUL paths correctly avoid wallet fallback while verifying. - Activity feed is read-only display; V3 proxy paths are allowlisted;
eulerInterfacesBranchis a public branch name, not a secret. executeTxPlanwithout prior simulation remains the established opt-in pattern and was not newly stripped.
Sent by Cursor Automation: Lite PR Reviewer
|
Lower priority / non-blocking based on contract-side guidance: Account Lens snapshot read failures should remain permissive so users can still repay against custom or messy vault state. |


Features
Performance
Refactors
Fixes
Dependencies
@eulerxyz/euler-v2-sdkfrom 1.2.1 to 1.2.3 for Activity, normalized collateral data, and runtime ABI support (feat: add vault and portfolio activity timelines #736, refactor: consume SDK collateral position data #765) @Seranged