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
2 changes: 1 addition & 1 deletion src/lib/top-vaults/TopVaultsOptIn.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

<div style:margin-top="1rem">
<Alert size="md" status="info" title="Coming soon">
Automated vault multistrategy coming soon. Subscribe here for our newsletter to be first to know.
Automated vault of vaults multistrategy. Subscribe to the newsletter to be first to know.
<div class="subscribe-form-wrapper">
<SubscribeForm inputSize="md" buttonSize="sm" />
</div>
Expand Down
52 changes: 35 additions & 17 deletions src/lib/top-vaults/TopVaultsTable.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@

const { topVaults, chain }: Props = $props();

let showChainCol = $derived(!chain);

const formatReturn = (v: MaybeNumber) => formatPercent(v, 2);
const formatTvl = (v: MaybeNumber) => formatDollar(v, 2);

Expand Down Expand Up @@ -131,22 +133,28 @@
<div class="table-extras">
<div class="table-meta">
<span>{topVaults.vaults.length} {chain?.name ?? 'total'} vaults</span>
<span>Min. TVL $50k</span>
<span>Stablecoin-only</span>
<span>Updated <Timestamp date={topVaults.generated_at} relative /></span>
</div>
<TextInput bind:value={filterValue} type="search" placeholder="Search vaults" />
<div class="filter">
<TextInput bind:value={filterValue} type="search" placeholder="Search vaults" />
</div>
</div>

<div class="table-wrapper">
<table class="top-vaults-table">
<thead>
<tr>
<th class="index"></th>
{@render sortColHeader(
'',
'chain',
'asc',
stringCompare((v) => getChain(v.chain_id)?.name ?? `Chain ${v.chain_id}`)
)}
{#if showChainCol}
{@render sortColHeader(
'',
'chain',
'asc',
stringCompare((v) => getChain(v.chain_id)?.name ?? `Chain ${v.chain_id}`)
)}
{/if}
{@render sortColHeader(
'Vault',
'vault',
Expand Down Expand Up @@ -224,9 +232,11 @@
<tr>
<!-- index cell is populated with row index via `rowNumber` CSS counter -->
<td class="index"></td>
<td class="chain">
<ChainCell {chain} label={chain?.name ?? `Chain ${vault.chain_id}`} />
</td>
{#if showChainCol}
<td class="chain">
<ChainCell {chain} label={chain?.name ?? `Chain ${vault.chain_id}`} />
</td>
{/if}
<td class="vault">
<div class="multiline">
<strong>{vault.name}</strong>
Expand Down Expand Up @@ -293,30 +303,38 @@
gap: 1rem;

.table-extras {
display: grid;
grid-template-columns: 1fr 24rem;
gap: 1rem;
display: flex;
flex-wrap: wrap;
justify-content: space-between;

gap: 1rem 1.5rem;
align-items: center;
margin-top: 1rem;
--text-input-width: 100%;

@media (--viewport-sm-down) {
@media (--viewport-md-down) {
grid-template-columns: 1fr;
}
}

.table-meta {
display: flex;
gap: 0.75rem;
flex-wrap: wrap;
flex-grow: 1;
gap: 0.5rem 0;
color: var(--c-text-extra-light);
font: var(--f-ui-md-medium);

> :not(:last-child)::after {
span:not(:last-child)::after {
content: '|';
margin-left: 0.75rem;
margin-inline: 0.75rem;
}
}

.filter {
flex: 1 24rem;
}

.table-wrapper {
width: 100%;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,7 @@
let error: ErrorInfo | unknown | undefined = $state();

const payment = fsm('initial', {
'*': {
fail: 'failed'
},
'*': { fail: 'failed' },

initial: {
_enter() {
Expand Down
27 changes: 23 additions & 4 deletions src/routes/trading-view/vaults/+page.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,17 @@
</script>

<svelte:head>
<title>Top vaults | Trading Strategy</title>
<meta name="description" content="Browse the highest performing vaults across all supported blockchains." />
<title>Top DeFi stablecoin vaults</title>
<meta name="description" content="The best DeFi vaults for all blockchains." />
</svelte:head>

<Breadcrumbs labels={{ vaults: 'Top Vaults' }} />

<main class="top-vaults ds-3">
<Section tag="header">
<HeroBanner subtitle="The best performing DeFi vaults across all chains with minimum $50k USD TVL">
<HeroBanner subtitle="The best performing DeFi stablecoin vaults across multiple blockchains">
{#snippet title()}
<span>Top DeFi Vaults</span>
<span>Top DeFi stablecoin vaults</span>
<DataBadge class="badge" status="warning">Beta</DataBadge>
{/snippet}
</HeroBanner>
Expand All @@ -29,6 +29,14 @@
<Section>
<TopVaultsTable {topVaults} />
</Section>

<Section>
<div class="api-link">
<a class="body-link" href="https://tradingstrategy.ai/blog/announcing-defi-vault-top-lists-and-api">
Available as API here.
</a>
</div>
</Section>
</main>

<style>
Expand All @@ -39,4 +47,15 @@
transform: translate(0, -0.375em);
}
}

.api-link {
margin-top: 2rem;
font: var(--f-ui-body-medium);
color: var(--c-text-light);
text-align: center;

@media (--viewport-md-down) {
font: var(--f-ui-small-medium);
}
}
</style>
Loading