Reward onchain activity

Give roles, points or Discord and Telegram access for wallet age, transaction count, contract calls, or holding a token since a block or for N days.

To give roles or rewards for onchain activity in Guild, add a role with onchain requirements and attach the reward to it. Onchain activity checks a wallet's first transaction (wallet age), and counts its transactions, contract deployments and calls to a contract in a fixed date range or a rolling window such as the last 30 days. Held at a past block and Held continuously for check that a wallet held a token at a snapshot or without a break for a number of days, on Ethereum and Base. Members connect their wallets, Guild checks them and gives out the role's Discord role, Telegram group, points or NFT, and takes back what can be taken back when a member stops qualifying.

These requirements need no paid plan.

Pick the right requirement

You want to reward Requirement Setting
Old wallets, not fresh ones Onchain activity First transaction before a date
Real users of a chain Onchain activity Transaction count, optionally only to one To address
Builders Onchain activity Contract deployment
Users of your protocol Onchain activity Contract call on your contract and method
Holders at a snapshot Held at a past block Block Number or Point In Time
Long-term holders Held continuously for Held For (days)
Anything your contract can answer Contract query a read function called with the member's address

Wallet activity works on fewer chains than token balances, and the form only offers the chains it supports; see Supported chains. Holding history works only on Ethereum and Base, because it reads past chain state from the archive nodes Guild runs for those two chains.

Set it up

  1. Create a guild at /create, or open the admin panel of the one you have.
  2. Open Spaces & roles and choose New role, then Empty role.
  3. Under Unlocks, press Add reward and pick what the role gives: a Discord role, a Telegram group, points, an NFT or another reward.
  4. Under Who gets it, press Requirement and pick Onchain activity, Held at a past block or Held continuously for.
  5. Fill in the form for the check you picked:
    • Wallet age: under Select what to check, choose First transaction, pick the chain, and set Time to before the date a wallet must be older than.
    • Transaction count: choose Transaction count, pick the chain and the number. Enter a To address to count only transactions sent to it.
    • Contract interactions: choose Contract call and paste the Contract address. Guild loads the contract's methods so you can pick one under Method; if it can't, type the method's signature, such as swap(uint256,uint256). You can also count only calls with given input values or a transaction value range.
    • Holding at a snapshot: pick Held at a past block, Ethereum or Base, the Asset Type (COIN, ERC20, ERC721 or ERC1155) and the Token Address, then enter a Block Number or a Point In Time, not both.
    • Holding for N days: pick Held continuously for, the same chain, asset and Token Address, and the days in Held For (days).
  6. For transaction counts, contract deployments and contract calls, set the time window: Pick a date for a fixed From and To, or Relative period for a rolling window.
  7. Set the amount to compare against and press Add requirement.

To combine checks, add several requirements and set Members should meet to All, Any one or Some.

Examples

  • OG wallets: First transaction on Ethereum before 1 January 2022. Reward: an "OG" Discord role.
  • Active on Base: Transaction count on Base, at least 100. Reward: access to a Telegram group.
  • Protocol users: Contract call to your router, the swap method, at least 5 times in a relative period of 30 days. Reward: points.
  • Launch holders: Held at a past block, ERC20, your token on Base, at least 100 at the launch block. Reward: an NFT.
  • Diamond hands: Held continuously for, ERC721, your collection on Ethereum, 180 days, at least 1. Reward: a Discord role for a holders' channel.

For tiers, give points with each role, then add a points requirement to higher roles, for example Gold at 2,000 points.

What to watch for

  • Each requirement checks one chain. To count activity on several chains, add one requirement per chain and combine them with Any one or Some.
  • A relative period moves with time, so a member can lose the role when old activity falls out of the window.
  • Held continuously for takes the lowest balance in the window, which always ends now, so someone who sold and bought back during it doesn't qualify. It fails rather than guess for tokens whose balance can change without a Transfer event, such as WETH.
  • Guild refreshes onchain data in the background. A member who just made a transaction can press Check access on the role.
  • Before adding a requirement to a role many people hold, check Why members miss it in the inspector, or use a new role.

Every field is described on the Wallet activity and Holding history requirement pages.

FAQ

Can I require a wallet to be a certain age?

Yes. Use Onchain activity with First transaction and set Time to before a date. A wallet whose first transaction on that chain is later doesn't qualify.

Can I require that someone has held a token since a date?

Use Held continuously for with the number of days since that date. It checks the balance never dipped below the amount in that time. Held at a past block checks only the balance at one block, not the days in between.

Which chains support these requirements?

Holding history works on Ethereum and Base. Wallet activity works on fewer chains than token balances and contract queries; see Supported chains.

Does a member lose the role if they sell?

Yes, for current holding and holding-duration checks: the member loses the role and the rewards that can be taken back, such as a Discord role or Telegram group. An NFT stays in their wallet, a revealed secret stays revealed, and points are kept by default.

What if no requirement fits my contract?

Use a Contract query. It calls any read function with the member's wallet address and checks the value it returns, such as a staked balance or a registration flag.

All Guild docs