Skip to content

Claim & Settlement

A claim settles only against a voucher signed by the verifier for a participant who passed the Gates. The contract checks the authorization on-chain before releasing funds.

The voucher is an EIP-712 typed-data signature over a ClaimAuth struct. The domain binds the signature to one specific pool:

domain = {
name: "GatollRewardPool",
version: "1",
chainId,
verifyingContract: <pool address>
}
ClaimAuth = {
address poolAddress; // the target pool
address recipient; // who receives the reward
uint256 amount; // fungible amount or NFT count
uint256[] tokenIds; // NFT ids (empty otherwise)
uint256 deadline; // expiry (unix seconds)
uint256 nonce; // single-use, issued by the verifier
}
  1. The participant passes the Loot’s Gates.
  2. The verifier issues a ClaimAuth for the participant’s wallet, assigns a single-use nonce for that (pool, recipient), sets a short deadline, and signs it.
  3. Someone submits claim(auth, signature) to the pool — either the recipient themselves, or a platform relayer when the Loot has gas-free claims enabled.
  4. The pool verifies the claim and, if every check passes, computes or reads the allocation and transfers it to recipient.

For Random and Equal Loots, the voucher carries a zero allocation and the contract computes the amount at claim time. For Custom Loots, the verifier signs the exact amount or token IDs.

Pools that support relay expose RELAY_ENABLED and hold an immutable reference to a RelayerRegistry. The claim check is:

recipient == msg.sender || RelayerRegistry.isRelayer(msg.sender)
  • Self-claim — the participant pays gas and submits (always available).
  • Relay — a registry-whitelisted EOA submits and pays gas; funds still transfer only to the signed recipient.
  • Anyone else — reverts. Leaving submission fully open would let mempool snipers race random-pool claims; the registry closes that vector and allows instant revoke if a relayer key is compromised.

A compromised relayer can at worst spend its own gas sending legitimate rewards to legitimate recipients. It cannot rewrite recipient without a new verifier signature. Creators fund relay seats off-chain with a native-coin gas deposit; when seats are exhausted, the product falls back to self-claim.

Before moving any funds, the pool independently checks that:

  • the signature recovers to the pool’s snapshotted verifier address;
  • poolAddress equals this pool (no cross-pool reuse);
  • recipient equals the caller or the caller is a registered relayer;
  • deadline has not passed;
  • the nonce has not been used;
  • the recipient has not already claimed, and a seat is available.

Four independent properties make a voucher non-replayable: it is bound to one pool (domain + poolAddress), one recipient, a single-use nonce the contract burns on use, and a short deadline. On top of that, the contract enforces one claim per wallet per Loot. A leaked or reused voucher is inert; it can only ever do exactly what the verifier authorized, once.

This is the core of Gatoll’s trust model: the verifier decides eligibility, but the contract decides settlement. Even a misbehaving verifier cannot make the pool pay the same address twice or pay against the wrong pool. The relayer only chooses who pays gas, never who gets paid.