Skip to content

Board Configuration

Configuration Structure

BoardConfig bundles addresses, metadata, eligibility, locking, and decay settings:

struct BoardConfig {
    string version;
    address owner;
    address underlyingToken;
    uint256 opensAt;
    uint256 closesAt;
    Metadata boardMetadata;
    AcceptanceCriteria acceptanceCriteria;
    ParticipantRequirements proposerRequirements;
    ParticipantRequirements supporterRequirements;
    LockingConfig lockingConfig;
    DecayConfig decayConfig;
}
 
struct LockingConfig {
    uint256 lockInterval;
    uint256 maxLockIntervals;
    uint256 releaseLockDuration;
    uint256 inactivityTimeout;
}
 
struct DecayConfig {
    DecayCurveType curveType; // 0=linear, 1=exponential
    uint256[] params;         // Curve params (length depends on type)
}
 
struct ParticipantRequirements {
    address token;
    uint256 minBalance;
    uint256 minHoldingDuration;
    uint256 minLockAmount;
}

Core Parameters

  • owner: Board controller (accept, close/cancel, set timings). Use multisig/DAO when possible.
  • underlyingToken: ERC20 used for locking and weight; must be set. Eligibility checks can point to a different token via ParticipantRequirements.token.
  • boardMetadata: Title, body, attachments (emitted in BoardCreated, not stored on-chain).
  • version: Off-chain compatibility marker for the board configuration.
  • opensAt / closesAt: Timestamps gating participation; closesAt must be ≥ opensAt (or 0).

Acceptance Criteria

enum AcceptancePermissions {
    Permissionless,  // Anyone can accept if threshold is met
    OnlyOwner        // Only the board owner can accept
}
 
enum ThresholdOverride {
    None,            // Everyone (including owner) must meet threshold
    OnlyOwner        // Owner can bypass threshold requirement
}
 
struct AcceptanceCriteria {
    AcceptancePermissions permissions;
    ThresholdOverride thresholdOverride;
    uint256 thresholdPercentTotalSupplyWAD;  // Percentage of total supply (in WAD)
    uint256 minThreshold;                     // Minimum fixed threshold
}

Threshold calculation:

threshold = max(totalSupply * thresholdPercentTotalSupplyWAD / 1e18, minThreshold)

Requirements:

  • At least one of thresholdPercentTotalSupplyWAD or minThreshold must be non-zero.
  • thresholdPercentTotalSupplyWAD must be < 1e18 (100%).

Participant Requirements

proposerRequirements and supporterRequirements share the same structure:

  • token: ERC20/IVotes token checked for eligibility (can differ from underlyingToken).
  • minBalance == 0 and minHoldingDuration == 0: no balance requirement.
  • minBalance > 0 and minHoldingDuration == 0: current balance check.
  • minBalance > 0 and minHoldingDuration > 0: historical balance check (requires IVotes support on token).
  • minLockAmount sets a minimum lock size for supporting or proposing with a lock.

Constraints:

  • token cannot be address(0).
  • minHoldingDuration > 0 requires minBalance > 0.
  • minLockAmount must be ≤ minBalance.

Locking Configuration

  • lockInterval: Time unit for locks and decay calculations (seconds, must be > 0).
  • maxLockIntervals: Maximum number of intervals a lock can span (> 0).
  • releaseLockDuration: Additional timelock after acceptance before redemption. 0 allows immediate redemption after acceptance; expiration/cancellation bypasses it.
  • inactivityTimeout: Inactivity window after which an initiative can be expired (tracked via lastActivity updates on creation/support).

Decay Configuration

  • curveType: 0 = linear, 1 = exponential.
  • params: Curve parameters; length must match curve type.
    • Linear: [decayRate] where 1e18 = 1:1 linear decay per interval.
    • Exponential: [decayMultiplier] per interval.

Validation & Errors

ErrorConditionFix
SignalsFactory_ZeroAddressOwnerOwner is address(0)Provide valid owner address
Signals_InvalidArgumentsunderlyingToken or participant token is address(0)Provide valid token address
Signals_InvalidArgumentsBoth thresholds are 0Set at least one threshold > 0
Signals_InvalidArgumentsPercentage threshold >= 100%Set thresholdPercentTotalSupplyWAD < 1e18
Signals_InvalidArgumentsMax intervals is 0Set maxLockIntervals > 0
Signals_InvalidArgumentsLock interval is 0Set lockInterval > 0
Signals_InvalidArgumentsInvalid decay curve typeUse type 0 or 1
Signals_InvalidArgumentsclosesAt < opensAtEnsure close time is after or equal to open time
Signals_InvalidArgumentsminLockAmount > minBalance or minHoldingDuration > 0 with minBalance == 0Adjust participant requirements