Skip to main content
The list Rabbithole shows on its Hold to Earn page, rendered inside your product. One request, no wallet, no key. It is the highest-value thing you can ship from these docs, and the smallest. This page assumes the client and helpers from Project Setup.

What It Shows

The Component

components/opportunities-list.tsx
Drop it on a page:
chainId filters by the reward chain, the one users claim on. A campaign that tracks a pool on Arbitrum and pays on Base shows up under 8453, not 42161. To list campaigns for a specific pool, filter by target instead (next section).

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:
Then render one row per vault, or a single “Earn 15.50% extra” badge when the list is non-empty. For a Uniswap v4 pool, match on 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
bigint cannot cross the server-to-client boundary. If you pass campaign data from a Server Component into a Client Component, format it into strings first, as above, or pass the campaign ID and fetch again on the client.
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 null on their own. Two lines, or one total that is labelled as an estimate.
  • participants is 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: true so 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.