Add Support to an Initiative
Supporting an initiative allows community members to lock tokens to signal their backing for a proposed idea. Support is represented by an ERC721 NFT that can be redeemed once the initiative is accepted or expired.
Overview
When you support an initiative, you:
- Lock ERC20 tokens for a specified duration
- Receive an ERC721 NFT representing your lock position
- Contribute weight toward the initiative's acceptance threshold
- Become eligible for incentive rewards (if configured)
How to Support
To support an initiative, call supportInitiative() with:
- The initiative ID you want to support
- The amount of tokens to lock (in wei)
- The lock duration (measured in intervals, not seconds)
You'll receive an NFT token ID representing your lock position.
See the Initiative Interactions Reference for detailed function signatures and parameters.
Prerequisites
Before supporting an initiative, ensure:
- Board is open - Current time ≥
opensAtand <closesAt - Initiative exists and is in Proposed state - Cannot support accepted or expired initiatives
- You meet participant requirements - Check eligibility with
accountCanSupport(address, amount) - You have sufficient tokens and approval - Balance ≥ amount and approved the Signals contract
Token Approval
You must approve the Signals contract to spend your tokens before calling supportInitiative. The contract will transfer your tokens when you lock them.
Participant Eligibility
Boards configure participant requirements using four fields (token, minBalance, minHoldingDuration, minLockAmount). The token controls which ERC20/IVotes balance is checked—it can be the underlying lock token or a separate governance token. Different patterns emerge based on which fields are set:
1. None (Most Permissive)
Anyone can participate - just need tokens to lock.
ParticipantRequirements({
token: UNDERLYING_TOKEN,
minBalance: 0,
minHoldingDuration: 0,
minLockAmount: 0
})2. Minimum Balance
Participants must hold a minimum token balance at support time. Optionally, a minimum lock amount can be enforced.
ParticipantRequirements({
token: UNDERLYING_TOKEN,
minBalance: 10_000 * 1e18, // Must hold 10k tokens
minHoldingDuration: 0,
minLockAmount: 1_000 * 1e18 // Must lock at least 1k tokens
})This prevents low-balance sybil attacks and ensures supporters lock meaningful amounts.
3. Minimum Balance and Duration (Most Restrictive)
Participants must:
- Currently hold ≥
minBalancetokens - Have held ≥
minBalancefor ≥minHoldingDurationblocks (historical balance check) - Lock ≥
minLockAmounttokens (must be ≤ minBalance) - Token must support ERC20Votes (checkpoint functionality)
ParticipantRequirements({
token: GOVERNANCE_TOKEN, // Can differ from the locking token
minBalance: 10_000 * 1e18,
minHoldingDuration: 50400, // ~7 days at 12s/block
minLockAmount: 1_000 * 1e18
})This ensures only committed token holders can participate.
Weight Contribution
Your support contributes weight toward the initiative's acceptance threshold. Weight is calculated based on:
- Lock amount
- Lock duration
- Time decay (based on board's decay curve)
Initial Weight
Your initial weight = amount × lockDuration
For example:
- Lock 100 tokens for 10 intervals
- Initial weight = 100 × 10 = 1,000
Weight Decay
Weight decays over time based on the board's decay curve:
Linear Decay: Weight decreases steadily over time Exponential Decay: Weight decreases at an accelerating rate
Weight never drops below the nominal lock amount until the lock expires.
Acceptance Threshold
The threshold an initiative must reach is calculated as:
threshold = max(
totalSupply * thresholdPercentTotalSupplyWAD / 1e18,
minThreshold
)Query the current threshold with getAcceptanceThreshold().
NFT Lock Position
When you support an initiative, you receive an ERC721 NFT representing your lock position.
NFT Properties
- Name:
{underlyingToken.name()} Locked Support - Symbol:
sx{underlyingToken.symbol()} - Transferable: Yes - you can trade your lock position
- Redeemable: Holder can redeem underlying tokens after acceptance/expiration
The NFT contains all lock details including amount, duration, and creation timestamp.
Multiple Lock Positions
You can support the same initiative multiple times with different amounts and durations. Each support creates a separate NFT with independent:
- Lock duration
- Amount
- Creation timestamp
- Decay calculation
Redemption
You cannot withdraw tokens early. Redemption is only available when:
-
Initiative is Accepted
- Must wait for
releaseLockDurationto pass (if configured) - Auto-claims incentive rewards on redemption
- Must wait for
-
Initiative is Expired
- Immediate redemption available
- No incentive rewards
-
Lock Duration Passed
- Can redeem once your lock duration expires
- Initiative state doesn't matter
-
Board is Cancelled
- Emergency override - all locks become immediately redeemable
- Bypasses release timelock
See the Reclaiming Locked Tokens guide for redemption details.
Integration with Incentives
If the board has incentives enabled:
- Early supporters get more rewards - Time-weighted based on when you lock
- Rewards are calculated on redemption - Based on your credited weight and time buckets
- Auto-claimed on redemption - No need to manually claim
- Multiple locks are weighted independently - Each position earns rewards
The pool does not expose per-supporter reward previews before redemption.
For technical details including function signatures, data structures, weight formulas, events, errors, and code examples, see the Initiative Interactions Reference.
