From c7d1ab56e74936819aeb583ddeaa4aaf077865bf Mon Sep 17 00:00:00 2001 From: Seranged <80223622+Seranged@users.noreply.github.com> Date: Fri, 31 Jul 2026 09:50:46 +0100 Subject: [PATCH 01/12] fix: display oracle router activity events --- tests/utils/activity-display.test.ts | 40 ++++++++++++++++++++++++++++ utils/activity-display.ts | 9 +++++++ 2 files changed, 49 insertions(+) diff --git a/tests/utils/activity-display.test.ts b/tests/utils/activity-display.test.ts index c9f873740..8c088e603 100644 --- a/tests/utils/activity-display.test.ts +++ b/tests/utils/activity-display.test.ts @@ -73,6 +73,10 @@ describe('activity display helpers', () => { 'repay', 'set_caps', 'set_ltv', + 'set_oracle_config', + 'set_fallback_oracle', + 'set_resolved_vault', + 'set_oracle_governor', 'liquidation', ])) @@ -195,6 +199,8 @@ describe('activity display helpers', () => { expect(formatActivityEventLabel({ type: 'set_supply_cap' })).toBe('Set supply cap') expect(formatActivityEventLabel({ type: 'set_ltv' })).toBe('Set LTV') expect(formatActivityEventLabel({ type: 'set_interest_rate_model' })).toBe('Set interest rate model') + expect(formatActivityEventLabel({ type: 'set_oracle_config' })).toBe('Set oracle config') + expect(formatActivityEventLabel({ type: 'set_oracle_governor' })).toBe('Set oracle governor') }) it('labels and styles vault share transfers relative to the event position', () => { @@ -703,6 +709,40 @@ describe('activity display helpers', () => { }, getVaultMetadata)).toEqual([ { field: 'new_supply_cap', label: 'New supply cap', value: '155M USDC' }, ]) + + expect(getActivityChangeEntries({ + type: 'set_resolved_vault', + vault: VAULT, + vaultType: 'evk', + change: { + fields: { + router: ASSET, + resolved_vault: OTHER_VAULT, + asset: SHARES, + }, + }, + }, getVaultMetadata)).toEqual([ + { + field: 'asset', + label: 'Asset', + addresses: [{ address: SHARES, linkKind: 'explorer' }], + }, + { + field: 'resolved_vault', + label: 'Resolved vault', + addresses: [{ + address: OTHER_VAULT, + label: 'Collateral vault', + linkKind: 'vault', + vaultType: 'evk', + }], + }, + { + field: 'router', + label: 'Router', + addresses: [{ address: ASSET, linkKind: 'explorer' }], + }, + ]) }) it('orders LTV change fields and trims ramp fields on immediate changes', () => { diff --git a/utils/activity-display.ts b/utils/activity-display.ts index dcfc9eb87..2bb5754a8 100644 --- a/utils/activity-display.ts +++ b/utils/activity-display.ts @@ -110,6 +110,10 @@ const VAULT_ACTIVITY_EVENT_TYPES = { 'set_interest_rate_model', 'set_liquidation_cool_off_time', 'set_max_liquidation_discount', + 'set_oracle_config', + 'set_fallback_oracle', + 'set_resolved_vault', + 'set_oracle_governor', ], earn: [ 'deposit', @@ -829,6 +833,7 @@ const VAULT_ADDRESS_FIELDS_BY_EVENT: Partial { /** Display order for change fields whose upstream order is unhelpful. */ const CHANGE_FIELD_PRIORITY: Partial> = { + set_fallback_oracle: ['fallback_oracle', 'router'], set_ltv: [ 'collateral', 'borrow_ltv', @@ -959,6 +965,9 @@ const CHANGE_FIELD_PRIORITY: Partial Date: Fri, 31 Jul 2026 10:05:35 +0100 Subject: [PATCH 02/12] fix: clarify oracle route activity Resolve oracle route assets into a compact pair summary while preserving linked addresses in expanded details. Use semantic labels for oracle router governance events. --- .../entities/activity/ActivityEventRow.vue | 25 ++- tests/utils/activity-display.test.ts | 44 +++- utils/activity-display.ts | 190 +++++++++++------- 3 files changed, 179 insertions(+), 80 deletions(-) diff --git a/components/entities/activity/ActivityEventRow.vue b/components/entities/activity/ActivityEventRow.vue index adb8d3eab..fdcbb1dd4 100644 --- a/components/entities/activity/ActivityEventRow.vue +++ b/components/entities/activity/ActivityEventRow.vue @@ -56,6 +56,7 @@ const { registryVersion, } = useVaultRegistry() const { getTokenByAddress } = useTokenList() +const { buildKnownSymbols, resolveSymbol: resolveTokenSymbol } = useTokenSymbolResolver() const vaultAddress = computed(() => event.vault ?? '') const vaultProduct = useEulerProductOfVault(vaultAddress) const collateralVaultAddress = computed(() => @@ -93,6 +94,15 @@ const activityVaultMetadata = (address: `0x${string}`) => { } } +const knownTokenSymbols = computed(() => { + void registryVersion.value + return buildKnownSymbols() +}) + +const activityTokenSymbol = (address: `0x${string}`) => + tokenMetadata(address)?.symbol + ?? resolveTokenSymbol(address, knownTokenSymbols.value) + const resolveAvatarAsset = (asset: ActivityEvent['assets'][number]) => { const representsVaultShares = asset.kind === 'shares' || (event.category === 'liquidations' && ['collateral', 'yield'].includes(asset.kind)) @@ -179,7 +189,7 @@ const assets = computed(() => { const changes = computed(() => { // Re-resolve human-readable vault names when registry metadata arrives. void registryVersion.value - return getActivityChangeEntries(event, activityVaultMetadata) + return getActivityChangeEntries(event, activityVaultMetadata, activityTokenSymbol) .filter(entry => event.category !== 'liquidations' || entry.field !== 'collateral') .map(entry => ({ kind: 'change' as const, @@ -187,6 +197,7 @@ const changes = computed(() => { label: entry.label, value: entry.value, valueTitle: entry.value, + summary: entry.summary, addresses: entry.addresses, })) }) @@ -237,15 +248,17 @@ const portfolioPosition = computed(() => showVault const COLLAPSED_ENTRY_COUNT = 1 const hiddenEntryCount = computed(() => Math.max(0, details.value.length - COLLAPSED_ENTRY_COUNT)) -const addressCollectionSummary = (count: number) => - getActivityAddressCollectionSummary(event.type, count) +const addressCollectionSummary = (detail: (typeof details.value)[number]) => + 'summary' in detail && detail.summary + ? detail.summary + : getActivityAddressCollectionSummary(event.type, detailAddressCount(detail)) const detailAddressCount = (detail: (typeof details.value)[number]) => 'addresses' in detail && Array.isArray(detail.addresses) ? detail.addresses.length : 0 const hasExpandableDetails = computed(() => hiddenEntryCount.value > 0 || details.value .slice(0, COLLAPSED_ENTRY_COUNT) - .some(detail => addressCollectionSummary(detailAddressCount(detail)) !== null)) + .some(detail => addressCollectionSummary(detail) !== null)) const eventIcon = computed(() => getActivityEventIcon(event)) const eventLabel = computed(() => portfolioPosition.value ? `${portfolioPosition.value.label} liquidated` @@ -415,10 +428,10 @@ const vaultDisplay = computed(() => {