> For the complete documentation index, see [llms.txt](https://theluckyducks.gitbook.io/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://theluckyducks.gitbook.io/docs/races/access-and-gating.md).

# Race access and gating

The five join settings, every gate type, and exactly when hosting one needs a Runner NFT.

Every race carries a **join setting** that decides who may enter. Open by default, or locked to verified players, an invite list, NFT holders or token holders.

This page covers each one, when hosting needs a Runner NFT, and how the gates stack with [minimum account age](/docs/races/advanced-options.md#minimum-account-age).

## The five join settings

| Setting                   | Who can join                                                        |
| ------------------------- | ------------------------------------------------------------------- |
| **Open**                  | Anyone with a wallet. Default.                                      |
| **Verified players only** | Players who have linked and verified a social account.              |
| **Allowed players**       | Only the wallets on the creator's invite list.                      |
| **NFT holders**           | Players who hold a minimum number of NFTs from a chosen collection. |
| **Token holders**         | Players who hold a minimum balance of a chosen token.               |

<figure><img src="https://3421471796-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F7dtEnU4lv7j0vOpw19z4%2Fuploads%2Fgit-blob-ad454f7d23f07d5cbee3feb73bf49a5eeea05b9e%2Fapp-join-setting-picker-banner.png?alt=media" alt="The join setting selector in the create form with the five options listed"><figcaption><p>Picked once, at creation, and fixed from then on.</p></figcaption></figure>

{% hint style="info" %}
Everyone sees every race whatever the setting. A player who does not qualify finds Join disabled, with the reason on the race.
{% endhint %}

## When you need a Runner NFT to host

Two gates are free: **Verified Only** and **Token Holders**, each with its own creator side check below. **NFT Holders always needs a Runner**, on every chain, and so does Allowed Players.

A Runner is also what customizing the race past the basics needs: a custom name, a sponsored prize, more seats, another duration, and the other opt ins. [Runner NFTs](/docs/nfts/runners.md#what-it-unlocks) has the full list.

So a plain race on default settings, gated on Verified Only or Token Holders or not gated at all, needs no Runner. Customize it, or pick NFT Holders or Allowed Players, and a Runner is required.

{% hint style="success" %}
The Runner only has to be in the host's wallet at create time. Joiners never need one: their eligibility is whatever the join setting asks for.
{% endhint %}

## Verified players only

Limits the race to players who have proved who they are by linking a social account. Anyone who has not [verified](/docs/trust-and-fairness/verification.md) sees the race but cannot join, which cuts out throwaway wallets without you managing a list.

No Runner needed for the gate itself. The creator's own compliance comes from their join rather than from a separate check, so a creator who takes a seat must be verified, while a host who never joins is never asked. Host mode needs a Runner regardless, which is why the app offers this option to a creator who is either verified or holding one.

## NFT holders

Requires each player to hold NFTs from a collection you choose, along with the **minimum number** they must hold, and the **chain** the collection lives on. The minimum is at least 1 and at most a cap the platform sets, 5 as it stands and never above 32.

{% hint style="warning" %}
This gate always needs a Runner NFT to create, whichever chain the collection is on. Approval decides which collections may gate a race; it does not make the gate free.
{% endhint %}

<figure><img src="https://3421471796-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F7dtEnU4lv7j0vOpw19z4%2Fuploads%2Fgit-blob-98deacd2a44bcf8b5823ac3748e754915bb3671b%2Fapp-nft-gate-fields-banner.png?alt=media" alt="The NFT Holders gate on the create form with the collection field and the minimum count"><figcaption><p>Both the collection and the count are shown to joiners.</p></figcaption></figure>

### Solana or another chain

Solana is the default. The chain selector also offers supported non-Solana chains, such as Ethereum, Base and Polygon, where you pick from the collections approved on that chain instead. Only chains the platform supports appear, so anything you can pick works; anything missing is not enabled yet. Each collection in the picker shows its address, shortened, with a button that copies it in full, so you can check it is the one you mean.

Nothing else about the race changes. It still runs on Solana, with SOL or the usual tokens, and the ducks race the same. Only the source of the required NFT is new.

Players see the chain wherever the race is announced: a race gated on a Base collection announces itself as needing NFT holders on BASE.

On another chain, a minimum above 1 needs a collection whose token IDs the platform can list for a wallet: one that supports ERC-721 Enumerable, or one the chain's NFT data service covers. For any other collection, creating the race with a minimum above 1 is refused.

### The collection has to be approved

{% hint style="warning" %}
Whatever the chain, the collection must be one the platform has approved for gating. The team maintains that list, and the create transaction refuses a collection that is not on it, so nobody can gate on something arbitrary or spammy.
{% endhint %}

### Joining a cross-chain race: linked wallets

A Solana-gated race checks your connected wallet at join time, as ever.

A race gated on another chain checks the external wallet linked to your profile, which is a one time step per wallet:

* On your profile, choose "Link an external wallet".
* Connect the wallet holding those NFTs and sign a short message to prove you control it.
* The signature moves no funds and approves nothing. It only proves ownership.
* Linking a new wallet replaces the old link.

<figure><img src="https://3421471796-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F7dtEnU4lv7j0vOpw19z4%2Fuploads%2Fgit-blob-3962cc6092b59984a289f2110a7ab323fa38fc6f%2Fapp-link-external-wallet-banner.png?alt=media" alt="The link an external wallet panel on the profile page, showing the supported chains"><figcaption><p>One signature per wallet, once. It proves ownership and moves nothing.</p></figcaption></figure>

That wallet is then remembered for every future cross-chain race on that chain, so you never link per race. It stays private to your account, is read only to check ownership, and nothing is ever spent from it.

### At join time

When you join, the platform confirms the wallet holds at least the minimum number of NFTs from the required collection and lets you in; if it does not, you are not eligible, as with any holder gate. On another chain that is your linked wallet. Not linked yet? The join flow sends you to that step first.

For an eligible player the app prepares a one time eligibility pass, so the race confirms you qualify at the moment you enter. On Solana that covers Metaplex Core and compressed NFTs, so most approved collections work. For other chains the backend checks the linked wallet's holdings off chain.

### Creator side eligibility

A Runner is required, and your own auto join faces the same threshold as any joiner: the backend will not sign your eligibility pass unless you hold the minimum yourself, on whichever chain the collection lives on. Host without playing and only the approval gate applies at create time.

### A few things worth knowing

* Eligibility counts **what you hold when you join**, not how long you have held it.
* Each NFT counts toward **one seat per race**. Once it has counted for a player, it cannot count for anyone else in that race, even after moving to another wallet, so passing NFTs between wallets cannot seat several players.
* The eligibility pass is short lived, so finish your join promptly. If it expires, join again.
* Solana-gated races are untouched by any of this. Race only in those and you never link an external wallet.

## Token holders

Requires a minimum balance of a token you choose, and the **minimum amount** has to be greater than zero. The check runs on chain as a player joins, so there is nothing to prepare beyond signing.

The token must be on the platform's approved list, the same list used for SPL prize tokens, visible in the token picker at creation. Anything else and the create transaction refuses. The picker shows each token's address, as the [currency picker](/docs/economy/spl-tokens.md#selecting-a-token) does.

The gating token need not be the prize token: a SOL race can require USDC, a USDC race can require AMPS. Legacy SPL Token and Token-2022 mints both work, as for [token races](/docs/economy/spl-tokens.md).

Creator side: no Runner needed on an approved token. Auto join your own race and the contract checks your balance at create time; in host mode it checks whenever you later join.

<figure><img src="https://3421471796-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F7dtEnU4lv7j0vOpw19z4%2Fuploads%2Fgit-blob-516912fe14b41464fef7edd9499b8d17356df79d%2Fapp-token-gate-fields-banner.png?alt=media" alt="The Token Holders gate on the create form with the token field and the minimum amount"><figcaption><p>The gate token need not be the token the race is played in.</p></figcaption></figure>

## Allowed players (private invites)

Invites specific wallets to a private race, up to **20 wallets**, which is also the most players a race can hold.

* Add the wallets, one per line, as you create the race.
* Your own wallet depends on how you create it:
  * In a **normal** race you are auto joined as the first player, and the form starts the list with your own wallet. The list holds one wallet per seat, so if you take your wallet off it while still joining, you take the seat of one of the wallets you listed. The form warns you when that is the case.
  * In **host mode** you are not auto joined, so you can delete your own wallet from the list and give that seat to someone else. Joining later means being on the list like anyone else. Host mode needs a Runner regardless.
  * In a **sponsored** race you do not play, so the list does not concern you.
* On the list, the race shows an active Join button and you enter like any other race.
* The list is held for about an hour while you build it and sign. Take longer and the hold expires: re-enter it and create again. No funds are involved, so that costs nothing.

Only a short fingerprint of the list goes on chain with the race, not the wallets. The list itself lives on the platform's servers and is published with the race, so the app and anyone else looking at the race can see who is invited. It is not secret; the fingerprint exists to prove the list was not tampered with between creation and join.

Need more than 20 wallets? Use a public race with another gate, such as NFT Holders, Token Holders or Verified Only.

{% hint style="warning" %}
Hosting an Allowed Players race needs a Runner NFT, unlike the other gates, because the allowlist is itself a customization.
{% endhint %}

<figure><img src="https://3421471796-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F7dtEnU4lv7j0vOpw19z4%2Fuploads%2Fgit-blob-95514385aeea6d67de4b06c6a7f8e8387eb457aa%2Fapp-allowed-players-list-banner.png?alt=media" alt="The allowed players list on the create form with several wallets added and the counter"><figcaption><p>Up to 20 wallets, and the counter says how many are left.</p></figcaption></figure>

## Stacking with minimum account age

[Minimum account age](/docs/races/advanced-options.md#minimum-account-age) stacks on any join setting. An NFT Holders race can also require an account of a certain age, and both checks must pass: the right NFTs **and** old enough.

## Gating and creator rewards

Rewards do not care which gate you chose. They care whether you **join your own race**: every creator who takes a seat earns the base [Creator Fee Share](/docs/economy/creator-fee-share.md) with no NFT at all, and each NFT adds more.

A gated race therefore earns exactly what an open one does, and creating without a Runner still earns the base share. Creating without playing, which is [host mode](/docs/races/hosting-and-cancelling.md#host-a-race-without-playing), earns nothing, decided at creation rather than later. Races the platform auto hosts earn no share either, since there is no creator wallet to pay.

## Good to know

* In a normal race the host is auto joined at creation, so you never enter your own race separately.
* Verified Only and Token Holders need no Runner on their own. NFT Holders and Allowed Players always do, as does any customization past the defaults.
* For NFT and Token gates the minimum must exceed zero. Zero would admit everyone, which is just Open.
* For NFT and Token gates the collection or token must be approved, or the create transaction refuses.
* Gated races always stay visible. Players simply cannot join without meeting the requirement, and the Join button says so.

<figure><img src="https://3421471796-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F7dtEnU4lv7j0vOpw19z4%2Fuploads%2Fgit-blob-4987b043f9f7d7d52af3c9ef33d4bdbf9118c109%2Fapp-gated-race-join-disabled-banner.png?alt=media" alt="A gated race detail modal with the Join button disabled and the requirement spelled out above it"><figcaption><p>A gate you do not pass is explained on the race, not hidden from the list.</p></figcaption></figure>
