Skip to content

Incentives Configuration Reference

Complete technical reference for configuring and deploying the IncentivesPool system.

Setup Summary

  1. Deploy IncentivesPool with the reward token address.
  2. Fund the pool via addFundsToPool.
  3. Approve each board with a budget and per-initiative cap.
  4. Link the pool to the board via setIncentivesPool before opensAt.

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) external

If tokens are transferred in externally, the owner can sync the balance:

function updateAvailableRewards(uint256 newBalance) external onlyOwner

Approve Board

function approveBoard(
    address board,
    uint256 boardMaxBudget_,
    uint256 totalRewardPerInitiative_
) external onlyOwner
  • boardMaxBudget_: total budget allocated to this board
  • totalRewardPerInitiative_: max reward per initiative for this board

Link Pool to Board

// In Signals.sol
function setIncentivesPool(
    address incentivesPool_,
    IncentivesConfig calldata incentivesConfig_
) external onlyOwner

Critical: Must be called before opensAt.

Incentive Weighting (Bucket Model)

  • Signals credits each lock into a time bucket when the lock is created.
  • incentiveParametersWAD is 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 * lockPercent

Distribution Mechanics

  • On lock, Signals calls addIncentivesCreditForLock on the pool.
  • On redemption, Signals calls claimIncentivesForLocks if 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

ErrorConditionSolution
IncentivesPool_InvalidConfigurationInvalid token, budget, or amountsFix parameters before deployment or approval
IncentivesPool_InsufficientFundsBudget exceeds available rewardsFund the pool or reduce budgets
IncentivesPool_BoardAlreadyApprovedBoard already approvedUse revokeBoard then re-approve if needed
IncentivesPool_NotApprovedBoardUnauthorized board callApprove the board first
Signals_IncorrectBoardStatePool set after board opensCall setIncentivesPool before opensAt
Signals_IncentivesPoolAlreadySetPool already configuredPool can be set only once
Signals_IncentivesPoolNotApprovedPool has not approved the boardCall approveBoard on the pool
Signals_InvalidArgumentsInvalid incentives config parametersUse 2-24 values for linear curve