Skip to main content


Contract: JBController​‌

Creates a project. This will mint an ERC-721 into the specified owner's account, configure a first funding cycle, and set up any splits.

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

Anyone can deploy a project on an owner's behalf.


function launchProjectFor(
address _owner,
JBProjectMetadata calldata _projectMetadata,
JBFundingCycleData calldata _data,
JBFundingCycleMetadata calldata _metadata,
uint256 _mustStartAtOrAfter,
JBGroupedSplits[] calldata _groupedSplits,
JBFundAccessConstraints[] calldata _fundAccessConstraints,
IJBPaymentTerminal[] calldata _terminals,
string calldata _memo
) external virtual override returns (uint256 projectId) { ... }
  • Arguments:
    • _owner is the address to set as the owner of the project. The project ERC-721 will be owned by this address.
    • _projectMetadata is a JBProjectMetadata data structure to associate with the project within a particular domain. This can be updated any time by the owner of the project.
    • _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.
  • The function can be accessed externally by anyone.
  • The function can be overriden by inheriting contracts.
  • The function overrides a function definition from the IJBController interface.
  • The function returns the ID of the project that was launched.


  1. Keep a reference to the directory.

    // Keep a reference to the directory.
    IJBDirectory _directory = directory;

    Internal references:

  2. Create the project. This will mint an ERC-721 in the owner's wallet representing ownership over the project.

    // Mint the project into the wallet of the message sender.
    projectId = projects.createFor(_owner, _projectMetadata);

    Internal references:

    External references:

  3. 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));

    External references:

  4. 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.
    uint256 _configuration = _configure(

    Internal references:

  5. 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);

    External references:

  6. Emit a LaunchProject event with the relevant parameters.

    emit LaunchProject(_configuration, projectId, _memo, msg.sender);

    Event references: