Skip to content

Commit 8cbe207

Browse files
ci(release): publish latest release
1 parent 238b1b7 commit 8cbe207

4 files changed

Lines changed: 97 additions & 60 deletions

File tree

RELEASE

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
IPFS hash of the deployment:
2-
- CIDv0: `QmWatBgGd4ZGkd2Xuakr3ZrA65uRqp9y3CtHYryUQCM6UK`
3-
- CIDv1: `bafybeid2qloqnkke257qbx26emm3ouyut27o2gmc6lxmjsbnyb4tttjh2q`
2+
- CIDv0: `QmPMstr4FqqqFmJ6g5hvSDw1Vs7KSFUtedTLtuWNZ2yApE`
3+
- CIDv1: `bafybeiapfqwr6kz7gmutbrovotycr5cmx3gdcisqojgcz23ssofim67mq4`
44

55
The latest release is always mirrored at [app.uniswap.org](https://app.uniswap.org).
66

@@ -10,5 +10,5 @@ You can also access the Uniswap Interface from an IPFS gateway.
1010
Your Uniswap settings are never remembered across different URLs.
1111

1212
IPFS gateways:
13-
- https://bafybeid2qloqnkke257qbx26emm3ouyut27o2gmc6lxmjsbnyb4tttjh2q.ipfs.dweb.link/
14-
- [ipfs://QmWatBgGd4ZGkd2Xuakr3ZrA65uRqp9y3CtHYryUQCM6UK/](ipfs://QmWatBgGd4ZGkd2Xuakr3ZrA65uRqp9y3CtHYryUQCM6UK/)
13+
- https://bafybeiapfqwr6kz7gmutbrovotycr5cmx3gdcisqojgcz23ssofim67mq4.ipfs.dweb.link/
14+
- [ipfs://QmPMstr4FqqqFmJ6g5hvSDw1Vs7KSFUtedTLtuWNZ2yApE/](ipfs://QmPMstr4FqqqFmJ6g5hvSDw1Vs7KSFUtedTLtuWNZ2yApE/)

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
web/5.147.2
1+
web/5.147.3

apps/web/src/features/Toucan/hooks/useTopAuctions/useTopAuctions.ts

Lines changed: 74 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import { PlainMessage, toPlainMessage } from '@bufbuild/protobuf'
2-
import { useQuery } from '@tanstack/react-query'
3-
import { AuctionWithStats, ListTopAuctionsRequest } from '@uniswap/client-data-api/dist/data/v1/auction_pb'
2+
import { useQueries, useQuery } from '@tanstack/react-query'
3+
import {
4+
AuctionWithStats,
5+
GetAuctionRequest,
6+
ListTopAuctionsRequest,
7+
} from '@uniswap/client-data-api/dist/data/v1/auction_pb'
48
import { DynamicConfigs, useDynamicConfigValue, VerifiedAuctionsConfigKey } from '@universe/gating'
59
import { useMemo } from 'react'
610
import { useSelector } from 'react-redux'
@@ -69,28 +73,82 @@ export function useTopAuctions(): {
6973

7074
const { data: topAuctions, isLoading, isError } = useQuery(auctionQueries.listTopAuctions({ params }))
7175

76+
// Parse verified IDs ("chainId_address") and filter by URL chain when present.
77+
// GetAuction is used as a fallback so verified auctions outside the top-N (e.g. not-yet-started
78+
// ones with zero bid volume) still surface in the verified section.
79+
const verifiedAuctionParams = useMemo<{ chainId: number; address: string }[]>(
80+
() =>
81+
verifiedAuctionIds
82+
.map((id) => {
83+
const sepIndex = id.indexOf('_')
84+
if (sepIndex < 0) {
85+
return undefined
86+
}
87+
const parsedChainId = Number(id.slice(0, sepIndex))
88+
const address = id.slice(sepIndex + 1)
89+
if (!Number.isFinite(parsedChainId) || !address) {
90+
return undefined
91+
}
92+
return { chainId: parsedChainId, address }
93+
})
94+
.filter((p): p is { chainId: number; address: string } => p !== undefined)
95+
.filter((p) => !chainId || p.chainId === chainId),
96+
[verifiedAuctionIds, chainId],
97+
)
98+
99+
const topAuctionIdSet = useMemo(
100+
() =>
101+
new Set(
102+
(topAuctions?.auctions ?? []).map((a) => a.auction?.auctionId).filter((id): id is string => id !== undefined),
103+
),
104+
[topAuctions?.auctions],
105+
)
106+
107+
const missingVerifiedParams = useMemo(
108+
() => verifiedAuctionParams.filter((p) => !topAuctionIdSet.has(`${p.chainId}_${p.address}`)),
109+
[verifiedAuctionParams, topAuctionIdSet],
110+
)
111+
112+
const missingVerifiedQueries = useQueries({
113+
queries: missingVerifiedParams.map((p) => auctionQueries.getAuction({ params: new GetAuctionRequest(p) })),
114+
})
115+
116+
// Merge ListTopAuctions results with any verified auctions fetched individually via GetAuction.
117+
// The verified-only entries are appended with empty totalBidVolume so they sort to the end via
118+
// auctionCommittedVolumeComparator (USD volume missing/zero).
119+
const mergedAuctions = useMemo<AuctionWithStats[]>(() => {
120+
const base = topAuctions?.auctions ?? []
121+
const extras: AuctionWithStats[] = []
122+
for (const q of missingVerifiedQueries) {
123+
const auction = q.data?.auctions[0]
124+
if (auction) {
125+
extras.push(new AuctionWithStats({ auction, totalBidVolume: '' }))
126+
}
127+
}
128+
return extras.length > 0 ? [...base, ...extras] : base
129+
}, [topAuctions?.auctions, missingVerifiedQueries])
130+
131+
const verifiedFallbackLoading = missingVerifiedQueries.some((q) => q.isLoading)
132+
72133
const currencyIds = useMemo(
73134
() =>
74-
(topAuctions?.auctions ?? [])
135+
mergedAuctions
75136
.map((auction) =>
76137
auction.auction ? buildCurrencyId(auction.auction.chainId, auction.auction.tokenAddress) : undefined,
77138
)
78139
.filter((id): id is string => id !== undefined),
79-
[topAuctions?.auctions],
140+
[mergedAuctions],
80141
)
81142
const currencyInfos = useCurrencyInfos(currencyIds, {
82-
skip: !topAuctions?.auctions || topAuctions.auctions.length === 0,
143+
skip: mergedAuctions.length === 0,
83144
})
84145

85146
// Extract unique chain IDs from auctions to minimize RPC calls
86147
const auctionChainIds = useMemo(() => {
87-
if (!topAuctions?.auctions) {
88-
return new Set<EVMUniverseChainId>()
89-
}
90148
return new Set(
91-
topAuctions.auctions.map((a) => a.auction?.chainId).filter((id): id is EVMUniverseChainId => id !== undefined),
149+
mergedAuctions.map((a) => a.auction?.chainId).filter((id): id is EVMUniverseChainId => id !== undefined),
92150
)
93-
}, [topAuctions?.auctions])
151+
}, [mergedAuctions])
94152

95153
// Fetch current block numbers and timestamps for chains that have auctions
96154
const blocksByChain = useMultiChainBlockInfo(auctionChainIds)
@@ -103,11 +161,7 @@ export function useTopAuctions(): {
103161

104162
// Build requests for block timestamps - extract endBlock values from auctions
105163
const blockTimestampRequests = useMemo<BlockTimestampRequest[]>(() => {
106-
if (!topAuctions?.auctions) {
107-
return []
108-
}
109-
110-
return topAuctions.auctions
164+
return mergedAuctions
111165
.map((auctionWithStats) => {
112166
const auction = auctionWithStats.auction
113167
// Only create request if both chainId and endBlock are valid
@@ -134,18 +188,18 @@ export function useTopAuctions(): {
134188
})
135189
.flat()
136190
.filter((req): req is BlockTimestampRequest => req !== null)
137-
}, [topAuctions?.auctions])
191+
}, [mergedAuctions])
138192

139193
const getBlockTimestamp = useGetBlockTimestamps(blockTimestampRequests, blocksByChain)
140194

141195
const auctionsWithCurrencyInfo = useMemo<EnrichedAuction[]>(() => {
142-
if (!topAuctions?.auctions) {
196+
if (mergedAuctions.length === 0) {
143197
return []
144198
}
145199

146200
const verifiedSet = new Set(verifiedAuctionIds)
147201

148-
return topAuctions.auctions
202+
return mergedAuctions
149203
.map((auction, index) => {
150204
const coreAuction = auction.auction
151205
const currencyInfo = currencyInfos[index]
@@ -193,11 +247,11 @@ export function useTopAuctions(): {
193247
const chainId = auctionWithInfo.auction?.chainId
194248
return chainId !== undefined && (isTestnetModeEnabled || !isTestnetChain(chainId))
195249
})
196-
}, [topAuctions?.auctions, verifiedAuctionIds, isTestnetModeEnabled, getBlockTimestamp, currencyInfos, blocksByChain])
250+
}, [mergedAuctions, verifiedAuctionIds, isTestnetModeEnabled, getBlockTimestamp, currencyInfos, blocksByChain])
197251

198252
return {
199253
auctions: auctionsWithCurrencyInfo,
200-
isLoading: isLoading || !areBlocksLoaded,
254+
isLoading: isLoading || verifiedFallbackLoading || !areBlocksLoaded,
201255
isError,
202256
}
203257
}

apps/web/src/pages/Explore/tables/Auctions/TopVerifiedAuctionsSection.tsx

Lines changed: 18 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,7 @@ import { useAuctionTokenPrices } from '~/features/Toucan/hooks/useTopAuctions/us
1010
import { auctionCommittedVolumeComparator, useTopAuctions } from '~/features/Toucan/hooks/useTopAuctions/useTopAuctions'
1111
import { AuctionChip } from '~/pages/Explore/tables/Auctions/AuctionChip'
1212

13-
const TWENTY_FOUR_HOURS_MS = 86400000
14-
const MAX_CHIPS = 8
15-
const FALLBACK_CHIPS = 4
13+
const MAX_CHIPS = 4
1614

1715
export function TopVerifiedAuctionsSection() {
1816
const { t } = useTranslation()
@@ -31,39 +29,24 @@ export function TopVerifiedAuctionsSection() {
3129
}, [verifiedAuctions])
3230

3331
const verifiedSortedCompletedAuctions = useMemo(() => {
34-
const currentTime = Date.now()
35-
36-
const completedAuctions = verifiedAuctions.filter((enrichedAuction) => {
37-
const auction = enrichedAuction.auction
38-
const endBlockTimestamp = enrichedAuction.timeRemaining.endBlockTimestamp
39-
40-
if (
41-
!auction ||
42-
!auction.endBlock ||
43-
!auction.chainId ||
44-
!endBlockTimestamp ||
45-
!enrichedAuction.timeRemaining.isCompleted
46-
) {
47-
return false
48-
}
49-
50-
// For completed auctions, check if completed within 24 hours using the actual end block timestamp
51-
const endTime = Number(endBlockTimestamp) * 1000 // Convert to milliseconds
52-
const timeSinceCompletion = currentTime - endTime
53-
54-
if (timeSinceCompletion <= TWENTY_FOUR_HOURS_MS) {
55-
return true
56-
}
57-
58-
// if there are no ongoing auctions include auctions that completed over 24 hours ago as well
59-
return verifiedSortedOngoingAuctions.length <= 0
60-
})
61-
62-
return completedAuctions.sort(auctionCommittedVolumeComparator)
63-
}, [verifiedAuctions, verifiedSortedOngoingAuctions.length])
32+
return verifiedAuctions
33+
.filter((enrichedAuction) => {
34+
const auction = enrichedAuction.auction
35+
return (
36+
enrichedAuction.timeRemaining.isCompleted &&
37+
!!auction &&
38+
!!auction.endBlock &&
39+
!!auction.chainId &&
40+
enrichedAuction.timeRemaining.endBlockTimestamp !== undefined
41+
)
42+
})
43+
.sort(auctionCommittedVolumeComparator)
44+
}, [verifiedAuctions])
6445

65-
const limit = verifiedSortedOngoingAuctions.length > 0 ? MAX_CHIPS : FALLBACK_CHIPS
66-
const topVerifiedAuctions = [...verifiedSortedOngoingAuctions, ...verifiedSortedCompletedAuctions].slice(0, limit)
46+
const topVerifiedAuctions = useMemo(() => {
47+
const remainingSlots = Math.max(0, MAX_CHIPS - verifiedSortedOngoingAuctions.length)
48+
return [...verifiedSortedOngoingAuctions, ...verifiedSortedCompletedAuctions.slice(0, remainingSlots)]
49+
}, [verifiedSortedOngoingAuctions, verifiedSortedCompletedAuctions])
6750

6851
// Hide section if no verified auctions match criteria
6952
if (isLoading || topVerifiedAuctions.length === 0) {

0 commit comments

Comments
 (0)