
Quickstart

Create a form
Sign in to app.formo.so to create your form.


Native Token
Require responders to hold a minimum balance of a chain’s native token (e.g., ETH, MATIC, BNB).Setup
- In your form settings, click Add Requirement and select Native Token
- Choose the chain (Ethereum, Base, Polygon, etc.)
- Set the minimum balance required
Example
Require at least 0.1 ETH on Ethereum Mainnet:| Field | Value |
|---|---|
| Type | Native Token |
| Chain | Ethereum |
| Minimum balance | 0.1 |
ERC-20 Token
Require responders to hold a minimum amount of a specific ERC-20 token.Setup
- In your form settings, click Add Requirement and select ERC-20
- Choose the chain where the token is deployed
- Paste the token contract address
- Set the minimum balance required
Example
Require at least 1,000 USDC on Base:| Field | Value |
|---|---|
| Type | ERC-20 |
| Chain | Base |
| Contract address | 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 |
| Minimum balance | 1000 |
NFT
Require responders to hold one or more NFTs from a specific collection (ERC-721 or ERC-1155).Setup
- In your form settings, click Add Requirement and select NFT
- Choose the chain where the NFT collection is deployed
- Paste the NFT contract address
- Set the minimum quantity (defaults to 1)
Example
Require at least 1 NFT from a collection on Ethereum:| Field | Value |
|---|---|
| Type | NFT |
| Chain | Ethereum |
| Contract address | Your NFT collection address |
| Minimum quantity | 1 |
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
Add a Contract Read requirement
In your form settings, click Add Requirement and select Contract Read.
Provide the ABI
Paste the contract ABI (JSON format). For verified contracts, you can copy the ABI from Etherscan.
Select a function
Choose a read-only function from the ABI. Only
view and pure functions are available.Configure function arguments
Enter the function arguments. Use
{{address}} as a placeholder for the responder’s wallet address.Set the condition
Choose a comparison operator and the expected value:
| Operator | Meaning |
|---|---|
> | Greater than |
>= | Greater than or equal |
< | Less than |
<= | Less than or equal |
== | Equal to |
!= | Not equal to |
Example: Staking requirement
Gate access to users who have staked at least 100 tokens:| Field | Value |
|---|---|
| Chain | Ethereum |
| Contract address | Your staking contract |
| Function | stakedBalance(address) |
| Arguments | {{address}} |
| Operator | >= |
| Value | 100000000000000000000 (100 tokens with 18 decimals) |
Example: Governance power
Require a minimum voting power to access a governance feedback form:| Field | Value |
|---|---|
| Chain | Base |
| Contract address | Your governance token |
| Function | getVotes(address) |
| Arguments | {{address}} |
| Operator | >= |
| Value | 1000000000000000000000 (1000 tokens) |
Supported functions
Contract Read supports anyview or pure function that:
- Returns a single scalar value (number, boolean, address, or string)
- Takes scalar input parameters (no arrays or structs)
balanceOf, stakedBalance, getVotes, isWhitelisted, hasRole, and any custom getter function on your contract.