Skip to main content
Token Gated Form Builder
Formo supports token gating, giving you full control over who can access your forms.

Quickstart

Token Gated Form Builder
1

Create a form

Sign in to app.formo.so to create your form.
2

Enable token gating

Go to your form’s settings page to enable token gating.
3

Add requirements

Click Add Requirement to add one or more gating requirements.
4

Publish

Publish your form and share the link with your users!
Your form will verify that responders fulfill your requirements before continuing. Formo currently supports 40+ chains.
Token Gated Form Builder
Choose from different types of token gating requirements:
Token Gated Form Builder

Native Token

Require responders to hold a minimum balance of a chain’s native token (e.g., ETH, MATIC, BNB).

Setup

  1. In your form settings, click Add Requirement and select Native Token
  2. Choose the chain (Ethereum, Base, Polygon, etc.)
  3. Set the minimum balance required

Example

Require at least 0.1 ETH on Ethereum Mainnet:
FieldValue
TypeNative Token
ChainEthereum
Minimum balance0.1

ERC-20 Token

Require responders to hold a minimum amount of a specific ERC-20 token.

Setup

  1. In your form settings, click Add Requirement and select ERC-20
  2. Choose the chain where the token is deployed
  3. Paste the token contract address
  4. Set the minimum balance required

Example

Require at least 1,000 USDC on Base:
FieldValue
TypeERC-20
ChainBase
Contract address0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913
Minimum balance1000
Formo automatically detects the token name, symbol, and decimals from the contract address.

NFT

Require responders to hold one or more NFTs from a specific collection (ERC-721 or ERC-1155).

Setup

  1. In your form settings, click Add Requirement and select NFT
  2. Choose the chain where the NFT collection is deployed
  3. Paste the NFT contract address
  4. Set the minimum quantity (defaults to 1)

Example

Require at least 1 NFT from a collection on Ethereum:
FieldValue
TypeNFT
ChainEthereum
Contract addressYour NFT collection address
Minimum quantity1

Contract Read

Gate form access based on any smart contract’s read function. This is useful for verifying staking balances, governance power, protocol participation, or any other onchain state that can be queried from a contract.

How it works

Contract Read calls a read-only function on a smart contract and compares the result against a value you specify. The responder’s wallet address can be passed as a function argument using the {{address}} placeholder. Example: Require that the responder has staked at least 100 WCT tokens by reading the stakedBalance(address) function.

Setup

1

Add a Contract Read requirement

In your form settings, click Add Requirement and select Contract Read.
2

Select the chain

Choose the chain where your contract is deployed (Ethereum, Base, Arbitrum, etc.)
3

Enter the contract address

Paste the smart contract address (e.g., 0x1234...abcd).
4

Provide the ABI

Paste the contract ABI (JSON format). For verified contracts, you can copy the ABI from Etherscan.
5

Select a function

Choose a read-only function from the ABI. Only view and pure functions are available.
6

Configure function arguments

Enter the function arguments. Use {{address}} as a placeholder for the responder’s wallet address.
7

Set the condition

Choose a comparison operator and the expected value:
OperatorMeaning
>Greater than
>=Greater than or equal
<Less than
<=Less than or equal
==Equal to
!=Not equal to
8

Publish

Publish your form. Formo will verify each responder’s wallet against the contract before allowing submission.

Example: Staking requirement

Gate access to users who have staked at least 100 tokens:
FieldValue
ChainEthereum
Contract addressYour staking contract
FunctionstakedBalance(address)
Arguments{{address}}
Operator>=
Value100000000000000000000 (100 tokens with 18 decimals)
Values are compared as raw integers. For ERC-20 tokens with 18 decimals, 100 tokens = 100000000000000000000 (100 * 10^18).

Example: Governance power

Require a minimum voting power to access a governance feedback form:
FieldValue
ChainBase
Contract addressYour governance token
FunctiongetVotes(address)
Arguments{{address}}
Operator>=
Value1000000000000000000000 (1000 tokens)

Supported functions

Contract Read supports any view or pure function that:
  • Returns a single scalar value (number, boolean, address, or string)
  • Takes scalar input parameters (no arrays or structs)
Common use cases include balanceOf, stakedBalance, getVotes, isWhitelisted, hasRole, and any custom getter function on your contract.