Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/lib/top-vaults/TopVaultsPage.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@
defaultRiskIndex?: number;
/** Default value for the "Hide unknown" filter (1 = hide, 0 = show) */
defaultHideUnknown?: number;
/** Show the "Hide unknown" protocol filter checkbox */
showUnknownFilter?: boolean;
/** Default monthly return filter key */
defaultMonthlyReturnKey?: string;
/** Default sort column key */
Expand Down Expand Up @@ -87,6 +89,7 @@
defaultAgeIndex,
defaultRiskIndex,
defaultHideUnknown,
showUnknownFilter,
defaultMonthlyReturnKey,
defaultSort,
defaultDirection,
Expand Down Expand Up @@ -221,6 +224,7 @@
{showFilters}
{defaultRiskIndex}
{defaultHideUnknown}
{showUnknownFilter}
{defaultMonthlyReturnKey}
{defaultSort}
{defaultDirection}
Expand Down Expand Up @@ -249,6 +253,7 @@
{defaultAgeIndex}
{defaultRiskIndex}
{defaultHideUnknown}
{showUnknownFilter}
{defaultMonthlyReturnKey}
{defaultSort}
{defaultDirection}
Expand Down
37 changes: 21 additions & 16 deletions src/lib/top-vaults/TopVaultsTable.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,8 @@
defaultRiskIndex?: number;
/** Default value for the "Hide unknown" filter (1 = hide, 0 = show) */
defaultHideUnknown?: number;
/** Show the "Hide unknown" protocol filter checkbox */
showUnknownFilter?: boolean;
/** Default monthly return filter key */
defaultMonthlyReturnKey?: string;
/** Default sort column key */
Expand Down Expand Up @@ -147,6 +149,7 @@
defaultAgeIndex = 0,
defaultRiskIndex = 1,
defaultHideUnknown = 1,
showUnknownFilter = true,
defaultMonthlyReturnKey = 'any',
defaultSort,
defaultDirection,
Expand Down Expand Up @@ -267,7 +270,7 @@
let treasuryRate = $derived((page.data as { treasuryRate?: number | null }).treasuryRate ?? null);

let hideClosed = $derived(urlState.closed === 1);
let hideUnknown = $derived(urlState.unknown === 1);
let hideUnknown = $derived(showUnknownFilter && urlState.unknown === 1);
let returnsDropdownOpen = $state(false);
let selectedReturnColumnIds = $derived(sanitiseReturnColumnSelection(urlState.returns));
let selectedReturnColumns = $derived(
Expand Down Expand Up @@ -806,21 +809,23 @@
</Tooltip>
</div>

<div class="filter-group">
<Tooltip>
<label class="checkbox-filter" slot="trigger">
<span class="filter-label filter-label-hint">Hide unknown</span>
<input
type="checkbox"
checked={hideUnknown}
onchange={() => updateSearchParams({ unknown: hideUnknown ? 0 : 1 })}
/>
</label>
<svelte:fragment slot="popup">
Don't show vaults whose protocol has not been identified yet
</svelte:fragment>
</Tooltip>
</div>
{#if showUnknownFilter}
<div class="filter-group">
<Tooltip>
<label class="checkbox-filter" slot="trigger">
<span class="filter-label filter-label-hint">Hide unknown</span>
<input
type="checkbox"
checked={hideUnknown}
onchange={() => updateSearchParams({ unknown: hideUnknown ? 0 : 1 })}
/>
</label>
<svelte:fragment slot="popup">
Don't show vaults whose protocol has not been identified yet
</svelte:fragment>
</Tooltip>
</div>
{/if}

<div class="filter">
<TextInput
Expand Down
27 changes: 27 additions & 0 deletions src/lib/trade-executor/helpers/position-chart.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,15 @@ describe('buildPositionChartsModel', () => {
planned_quantity: '0',
executed_quantity: '0',
flags: []
}),
createTrade({
trade_id: 4,
trade_type: 'repair',
planned_quantity: '5',
executed_quantity: '0',
planned_reserve: '5',
executed_reserve: '0',
repaired_trade_id: 2
})
]
});
Expand All @@ -161,6 +170,24 @@ describe('buildPositionChartsModel', () => {
expect(model.underlyingPrice.markers[0].tradeId).toBe(1);
});

test('uses planned reserve amount for vault marker USD value when executed quantity is zero', () => {
const payload = createPayload({
trades: [
createTrade({
planned_quantity: '123.45',
executed_quantity: '0',
planned_reserve: '123.45',
executed_reserve: '0'
})
]
});

const model = buildPositionChartsModel(payload);

expect(model.underlyingPrice.markers).toHaveLength(1);
expect(model.underlyingPrice.markers[0].tradeValueUsd).toBe(123.45);
});

test('falls back to underlying_price samples when price_history is missing', () => {
const payload = createPayload({
price_history: [],
Expand Down
8 changes: 7 additions & 1 deletion src/lib/trade-executor/helpers/position-chart.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ function normalisePoints(points: PositionChartPoint[]) {
function getMarkerTrades(trades: TradeInfo[], tradePathBase: string) {
return trades
.filter((trade) => !trade.repaired_at)
.filter((trade) => !trade.isRepair)
.filter((trade) => {
const plannedQuantity = trade.planned_quantity;
const executedQuantity = trade.executed_quantity ?? 0;
Expand All @@ -114,7 +115,7 @@ function getMarkerTrades(trades: TradeInfo[], tradePathBase: string) {
directionLabel: trade.direction === TradeDirections.Enter ? 'Increase' : 'Decrease',
quantity: trade.executed_quantity ?? trade.planned_quantity ?? null,
price: trade.executed_price ?? null,
tradeValueUsd: trade.value,
tradeValueUsd: getTradeValueUsd(trade),
tradeUrl: `${tradePathBase}/trade-${trade.trade_id}`
}
];
Expand Down Expand Up @@ -163,3 +164,8 @@ function getNearestPoint(points: PositionChartPoint[], timestamp: number) {
function getTradeTimestamp(trade: TradeInfo) {
return trade.executed_at ?? trade.failed_at ?? trade.started_at ?? trade.opened_at ?? null;
}

function getTradeValueUsd(trade: TradeInfo) {
const reserveValue = Math.abs(trade.executed_reserve || trade.planned_reserve || 0);
return reserveValue || trade.value;
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
let title = $derived(`${chainName} stablecoin vaults`);
let description = $derived(`Top stablecoin vaults on ${chainName} blockchain ranked by performance.`);
let pageUrl = $derived(new URL(page.url.pathname, page.url.origin).href);
let defaultTvlKey = $derived(chainSlug === 'robinhood' ? 'any' : '10k');
</script>

<MetaTags
Expand Down Expand Up @@ -65,7 +66,7 @@
{loading}
title="{chainName} stablecoin vaults"
showFilters
defaultTvlKey="10k"
{defaultTvlKey}
>
{#snippet detailDescription()}
{#if topVaults?.vaults.length}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@
title={heroTitle}
subtitle={isUnknownVaultProtocol ? unknownVaultSubtitle : undefined}
showFilters
showUnknownFilter={false}
defaultTvlKey="10k"
defaultHideUnknown={isUnsupportedProtocolSlug(protocolSlug) ? 0 : 1}
>
Expand Down
Loading