What It Shows
The Component
components/opportunities-list.tsx
Only Your Own Pools
Most partners want the campaigns rewarding their vaults, not every campaign on a chain. Match on the target, which is the position contract on the event chain:target.poolId client-side; see Find Your Campaign.
Server Components
The list needs no wallet, so it can render on the server and ship as HTML. Fetch in a Server Component and format there.app/opportunities/page.tsx
revalidate = 60 caches the page for a minute, the same cadence as the client-side refetchInterval.
Rules the Row Has to Follow
- Never render a null APR as
0.00%. A live campaign showing zero reads as broken. Show a dash or hide the cell. - Never sum the two APRs silently. They measure different things and can each be
nullon their own. Two lines, or one total that is labelled as an estimate. participantsis not a live holder count. A wallet that entered and later withdrew stays counted. Use it for social proof, not for “currently earning”.- Forwarder-only campaigns are hidden by default. If your deposit flow uses the Deposit Button, pass
includeForwarderRequired: trueso those campaigns appear.
Keep Exploring
Display Campaign Stats
The endpoint behind this list, field by field.
Campaigns, IDs, and Chains
Event chain versus reward chain, and what discovery returns.
Rewards Panel
The next component: what the connected wallet has earned.