Incentives Configuration Reference
Complete technical reference for configuring and deploying the IncentivesPool system.
Setup Summary
- Deploy
IncentivesPoolwith the reward token address. - Fund the pool via
addFundsToPool. - Approve each board with a budget and per-initiative cap.
- Link the pool to the board via
setIncentivesPoolbeforeopensAt.
IncentivesConfig Structure
struct IncentivesConfig {
IncentiveType incentiveType; // Linear only (exponential reserved)
uint256[] incentiveParametersWAD; // 2-24 values defining the curve
}
enum IncentiveType {
Linear,
Exponential
}Note: Exponential is not implemented yet; only Linear is supported.
Pool Deployment & Funding
Deploy IncentivesPool
constructor(address rewardToken)Fund the Pool
function addFundsToPool(uint256 amount) externalIf tokens are transferred in externally, the owner can sync the balance:
function updateAvailableRewards(uint256 newBalance) external onlyOwnerApprove Board
function approveBoard(
address board,
uint256 boardMaxBudget_,
uint256 totalRewardPerInitiative_
) external onlyOwnerboardMaxBudget_: total budget allocated to this boardtotalRewardPerInitiative_: max reward per initiative for this board
Link Pool to Board
// In Signals.sol
function setIncentivesPool(
address incentivesPool_,
IncentivesConfig calldata incentivesConfig_
) external onlyOwnerCritical: Must be called before opensAt.
Incentive Weighting (Bucket Model)
- Signals credits each lock into a time bucket when the lock is created.
incentiveParametersWADis interpolated and normalized into per-bucket multipliers.- On claim, each lock’s reward share is proportional to its credit and bucket multiplier.
Simplified flow:
multipliers = normalize(interpolate(parameters, buckets))
lockPercent = credit * multipliers[bucketIndex] / totalCredits
reward = totalRewardPerInitiative * lockPercentDistribution Mechanics
- On lock, Signals calls
addIncentivesCreditForLockon the pool. - On redemption, Signals calls
claimIncentivesForLocksif the release timelock has passed. - If redeeming before acceptance, Signals calls
removeIncentivesCreditForLocks.
Query Functions
function approvedBoards(address board) external view returns (bool)
function totalRewardPerInitiative(address board) external view returns (uint256)
function boardRemainingBudget(address board) external view returns (uint256)
function availableRewards() external view returns (uint256)
function totalBoardBudgets() external view returns (uint256)
function distributedRewards() external view returns (uint256)
function REWARD_TOKEN() external view returns (address)Events
event FundsAddedToPool(uint256 amount)
event AvailableRewardsUpdated(uint256 newBalance)
event BoardApproved(address indexed board)
event BoardRevoked(address indexed board)
event RewardsPaidOut(
address indexed board,
uint256 indexed initiativeId,
address indexed supporter,
uint256 percentOfInitiativeRewards,
uint256 remainingBoardBudget,
uint256 amountPaid
)
event RewardsClaimed(
uint256 indexed initiativeId,
uint256 indexed lockId,
address indexed claimant,
uint256 percentOfInitiativeRewardsWAD
)Validation & Errors
| Error | Condition | Solution |
|---|---|---|
IncentivesPool_InvalidConfiguration | Invalid token, budget, or amounts | Fix parameters before deployment or approval |
IncentivesPool_InsufficientFunds | Budget exceeds available rewards | Fund the pool or reduce budgets |
IncentivesPool_BoardAlreadyApproved | Board already approved | Use revokeBoard then re-approve if needed |
IncentivesPool_NotApprovedBoard | Unauthorized board call | Approve the board first |
Signals_IncorrectBoardState | Pool set after board opens | Call setIncentivesPool before opensAt |
Signals_IncentivesPoolAlreadySet | Pool already configured | Pool can be set only once |
Signals_IncentivesPoolNotApproved | Pool has not approved the board | Call approveBoard on the pool |
Signals_InvalidArguments | Invalid incentives config parameters | Use 2-24 values for linear curve |
