Supporting an Initiative
Lock ERC20 tokens behind an initiative to generate support weight that counts toward its acceptance threshold. Each lock mints a transferable ERC721 NFT representing the position. For example, a board using ENS token would mint NFTs named ENS Locked Support with symbol sxENS. Trading the NFT transfers the right to redeem the underlying tokens.
supportInitiative()
function supportInitiative(
uint256 initiativeId,
uint256 amount,
uint256 lockDuration
) external returns (uint256 tokenId)Call with the initiative ID, the amount of tokens to lock, and a lock duration (measured in intervals). You must have approved the Signals contract to transfer your tokens beforehand.
The initiative must be in the Proposed state and the board must be open. Check eligibility with accountCanSupport(address, amount).
You can support the same initiative multiple times. Each call creates a separate NFT with its own amount, duration, and decay calculation.
Weight calculation and decay
Support weight determines when an initiative can be accepted.
Initial weight = lockAmount * lockDuration
Locking 100 tokens for 10 intervals produces an initial weight of 1,000. Locking 50 tokens for 20 intervals also produces 1,000. The mechanism rewards large commitments and long commitments equally.
Both curves start at 1,000 (100 tokens x 10 intervals). Linear decay drops steadily until it hits the weight floor at 100 (the locked amount), then holds there until the lock expires. Exponential decay (0.9x per interval) falls steeply at first, then flattens, staying above the floor for longer.
Weight decay reduces the initial value over elapsed intervals according to the board's configured decay curve:
- Linear decay: weight decreases by a fixed rate per interval. With a rate of
1e18, 100 tokens locked for 10 intervals loses 100 weight per interval elapsed. - Exponential decay: weight is multiplied by a decay factor each interval. With a multiplier of
0.9e18, weight retains 90% of its value each interval, compounding.
Weight floor: a lock's weight never drops below the locked amount itself. Even after heavy decay, 100 locked tokens still contribute at least 100 weight until the lock expires. This guarantees early supporters always retain baseline influence.
Aggregate weight for an initiative is the sum of all individual lock weights at a given timestamp. When aggregate weight crosses the acceptance threshold, the initiative can be accepted.
Acceptance threshold
threshold = max(totalSupply * thresholdPercentTotalSupplyWAD / 1e18, minThreshold)The effective threshold is the greater of a percentage of total token supply or a fixed minimum.
Example: board with 5% supply threshold and 100k minThreshold, 10M total supply
Initiative B accumulates sustained support and crosses the 500k threshold (5% of 10M supply) on day 15. It can now be accepted. Initiative A attracted early support but stalled. Without new locks, decay pulls its weight down. It never reaches threshold.
Query the current threshold with getAcceptanceThreshold(). Query an initiative's current weight with getWeight(initiativeId) or at a specific time with getWeightAt(initiativeId, timestamp).
Incentive rewards
If the board has an incentives pool attached, lock positions earn rewards weighted by creation time. Earlier locks receive higher multipliers. Rewards are auto-claimed during redemption. Redeeming before acceptance forfeits incentive rewards for that position.
See the Supporting Initiatives reference for full function details.
