Skip to main content


Contract: JBController​‌

Interface: IJBController

Creates a funding cycle for an already existing project ERC-721.

Each operation within this transaction can be done in sequence separately.

Only a project owner or operator can launch its funding cycles.


function launchFundingCyclesFor(
uint256 _projectId,
JBFundingCycleData calldata _data,
JBFundingCycleMetadata calldata _metadata,
uint256 _mustStartAtOrAfter,
JBGroupedSplits[] calldata _groupedSplits,
JBFundAccessConstraints[] memory _fundAccessConstraints,
IJBPaymentTerminal[] memory _terminals,
string calldata _memo
requirePermission(projects.ownerOf(_projectId), _projectId, JBOperations.RECONFIGURE)
returns (uint256 configuration) { ... }
  • Arguments:
    • _projectId is the ID of the project to launch funding cycles for.
    • _data is a JBFundingCycleData data structure that defines the project's first funding cycle. These properties will remain fixed for the duration of the funding cycle.
    • _metadata is a JBFundingCycleMetadata data structure specifying the controller specific params that a funding cycle can have. These properties will remain fixed for the duration of the funding cycle.
    • _mustStartAtOrAfter is the time before which the configured funding cycle cannot start.
    • _groupedSplits is an array of JBGroupedSplits data structures containing splits to set for any number of groups. The core protocol makes use of groups defined in JBSplitsGroups.
    • _fundAccessConstraints is an array of JBFundAccessConstraints data structures containing amounts that a project can use from its treasury for each payment terminal. Amounts are fixed point numbers using the same number of decimals as the accompanying terminal. The _distributionLimit and _overflowAllowance parameters must fit in a uint232. The _distributionLimit applies for each funding cycle, and the _overflowAllowance applies for the entirety of the configuration.
    • _terminals is an array of IJBPaymentTerminal payment terminals to add for the project.
    • _memo is a memo to pass along to the emitted event.
  • Through the requirePermission modifier, the function is only accessible by the project's owner, or from an operator that has been given the JBOperations.RECONFIGURE permission by the project owner for the provided _projectId.
  • The function can be overriden by inheriting contracts.
  • The function overrides a function definition from the IJBController interface.
  • The function returns the configuration of the funding cycle that was successfully updated.


  1. Make sure there's isn't already a funding cycle configuration for the project.

    // If there is a previous configuration, reconfigureFundingCyclesOf should be called instead
    if (fundingCycleStore.latestConfigurationOf(_projectId) > 0)

    Internal references:

    External references:

  2. Set this controller as the controller of the project.

    // Set this contract as the project's controller in the directory.
    directory.setControllerOf(_projectId, address(this));

    Internal references:

    External references:

  3. Configure the project's funding cycle, fund access constraints, and splits. Get a reference to the resulting funding cycle's configuration.

    // Configure the first funding cycle.
    configuration = _configure(

    Internal references:

  4. If terminals were provided, add them to the list of terminals the project can accept funds through.

    // Add the provided terminals to the list of terminals.
    if (_terminals.length > 0) directory.setTerminalsOf(_projectId, _terminals);

    Internal references:

    External references:

  5. Emit a LaunchFundingCycles event with the relevant parameters.

    emit LaunchFundingCycles(configuration, _projectId, _memo, msg.sender);

    Event references: