Accepting and Expiring Initiatives
An initiative in the Proposed state can transition to Accepted (threshold met) or Expired (inactive too long). Both transitions are permanent and one-way.
Proposed → Accepted (via acceptInitiative)
Proposed → Expired (via expireInitiative)acceptInitiative()
function acceptInitiative(uint256 initiativeId) externalAccepts an initiative that has reached the board's acceptance threshold. Records acceptanceTimestamp, which starts the releaseLockDuration countdown for token redemption. If an incentives pool is configured, supporters earn rewards on redemption.
Access control
Who can call acceptInitiative() depends on the board's AcceptanceCriteria:
permissions | thresholdOverride | Who can accept | Threshold required |
|---|---|---|---|
OnlyOwner | None | Owner only | Yes |
OnlyOwner | OnlyOwner | Owner only | No (owner bypasses) |
Permissionless | None | Anyone | Yes |
Permissionless | OnlyOwner | Anyone | Yes (owner bypasses) |
The threshold is calculated as:
threshold = max(totalSupply * thresholdPercentTotalSupplyWAD / 1e18, minThreshold)Query the current value with getAcceptanceThreshold() and compare against getWeight(initiativeId).
expireInitiative()
function expireInitiative(uint256 initiativeId) external onlyOwnerExpires an initiative that has been inactive for longer than the board's inactivityTimeout. Owner-only. The initiative must still be in the Proposed state.
Inactivity is tracked by lastActivity, which updates when the initiative is created and each time a supporter locks tokens. If block.timestamp > lastActivity + inactivityTimeout, the initiative can be expired.
Tokens locked against an expired initiative are redeemable immediately with no waiting period. No incentive rewards are distributed.
Events
event InitiativeAccepted(uint256 indexed initiativeId, address indexed actor)
event InitiativeExpired(uint256 indexed initiativeId, address indexed actor)See Redeeming Tokens for how supporters reclaim tokens after acceptance or expiry.
