Skip to content

chore: promote development to master - #771

Merged
Seranged merged 102 commits into
masterfrom
development
Jul 30, 2026
Merged

Seranged merged 102 commits into
masterfrom
development

Conversation

@Seranged

@Seranged Seranged commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Features

Performance

Refactors

Fixes

Dependencies

Seranged added 30 commits July 13, 2026 13:17
- 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.
Seranged and others added 25 commits July 27, 2026 14:57
- 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>
- 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
- 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
Reuse form slot hints across batch additions
@coderabbitai

coderabbitai Bot commented Jul 30, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository: euler-xyz/coderabbit/.coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: d99a6452-4efb-4e6a-9401-9f3c734f5af5

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Comment @coderabbitai help to get the list of available commands.

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.ts sets simError only on simulationError / status-check failures, so canExecuteBatch stays enabled and the incomplete layer is stitched into the portfolio overlay.
  • With a non-empty cart, getEntryPlanningAccount returns 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.ts handleResult likewise ignores snapshotReadFailures, 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 ignoring snapshotReadFailures entirely 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).
  • simulateTransactionPlan already receives ownerAddr (Address), not a frozen Account — Pyth plugin freshness concern from memory does not apply here.
  • Spy fail-closed + useEffectiveAddress on portfolio/APY/rewards/REUL paths correctly avoid wallet fallback while verifying.
  • Activity feed is read-only display; V3 proxy paths are allowlisted; eulerInterfacesBranch is a public branch name, not a secret.
  • executeTxPlan without prior simulation remains the established opt-in pattern and was not newly stripped.
Open in Web View Automation 

Sent by Cursor Automation: Lite PR Reviewer

Comment thread package.json
@Seranged

Copy link
Copy Markdown
Contributor Author

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. snapshotReadFailures is diagnostic, while the transaction execution and status checks remain authoritative. Lite should not turn this into a blanket execution block; any follow-up should focus on degraded projection handling without preventing repayment.

@Seranged
Seranged merged commit 3ad90ca into master Jul 30, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants