Skip to main content

JBController3_1

Stitches together funding cycles and project tokens, making sure all activity is accounted for and correct.

Git Source

Mainnet: 0x97a5b9D9F0F7cD676B69f584F29048D0Ef4BB59b

Goerli: 0x1d260DE91233e650F136Bf35f8A4ea1F2b68aDB6

Inherits: JBOperatable, ERC165, IJBController3_1, IJBMigratable

Adheres to:

  • IJBController3_1: General interface for the generic controller methods in this contract that interacts with funding cycles and tokens according to the protocol's rules.
  • IJBMigratable: Allows migrating to this contract, with a hook called to prepare for the migration.

Inherits from:

  • JBOperatable: Several functions in this contract can only be accessed by a project owner, or an address that has been preconfifigured to be an operator of the project.
  • ERC165: Introspection on interface adherance.

This Controller has the same functionality as JBController3_1, except it is not backwards compatible with the original IJBController view methods.

State Variables

_packedDistributionLimitDataOf

Data regarding the distribution limit of a project during a configuration.

  • bits 0-231: The amount of token that a project can distribute per funding cycle.
  • bits 232-255: The currency of amount that a project can distribute.

Params:

  • _projectId The ID of the project to get the packed distribution limit data of.
  • _configuration The configuration during which the packed distribution limit data applies.
  • _terminal The terminal from which distributions are being limited.
  • _token The token for which distributions are being limited.
mapping(uint256 => mapping(uint256 => mapping(IJBPaymentTerminal => mapping(address => uint256)))) internal
_packedDistributionLimitDataOf;

_packedOverflowAllowanceDataOf

Data regarding the overflow allowance of a project during a configuration.

  • bits 0-231: The amount of overflow that a project is allowed to tap into on-demand throughout the configuration.
  • bits 232-255: The currency of the amount of overflow that a project is allowed to tap.

Params:

  • _projectId The ID of the project to get the packed overflow allowance data of.
  • _configuration The configuration during which the packed overflow allowance data applies.
  • _terminal The terminal managing the overflow.
  • _token The token for which overflow is being allowed.
mapping(uint256 => mapping(uint256 => mapping(IJBPaymentTerminal => mapping(address => uint256)))) internal
_packedOverflowAllowanceDataOf;

projects

Mints ERC-721's that represent project ownership.

IJBProjects public immutable override projects;

fundingCycleStore

The contract storing all funding cycle configurations.

IJBFundingCycleStore public immutable override fundingCycleStore;

tokenStore

The contract that manages token minting and burning.

IJBTokenStore public immutable override tokenStore;

splitsStore

The contract that stores splits for each project.

IJBSplitsStore public immutable override splitsStore;

fundAccessConstraintsStore

A contract that stores fund access constraints for each project.

IJBFundAccessConstraintsStore public immutable override fundAccessConstraintsStore;

directory

The directory of terminals and controllers for projects.

IJBDirectory public immutable override directory;

reservedTokenBalanceOf

The current undistributed reserved token balance of.

  • _projectId The ID of the project to get a reserved token balance of.
mapping(uint256 => uint256) public override reservedTokenBalanceOf;

Functions

getFundingCycleOf

A project's funding cycle for the specified configuration along with its metadata.

function getFundingCycleOf(uint256 _projectId, uint256 _configuration)
external
view
override
returns (JBFundingCycle memory fundingCycle, JBFundingCycleMetadata memory metadata);

Parameters

NameTypeDescription
_projectIduint256The ID of the project to which the funding cycle belongs.
_configurationuint256

Returns

NameTypeDescription
fundingCycleJBFundingCycleThe funding cycle.
metadataJBFundingCycleMetadataThe funding cycle's metadata.

latestConfiguredFundingCycleOf

A project's latest configured funding cycle along with its metadata and the ballot state of the configuration.

function latestConfiguredFundingCycleOf(uint256 _projectId)
external
view
override
returns (JBFundingCycle memory fundingCycle, JBFundingCycleMetadata memory metadata, JBBallotState ballotState);

Parameters

NameTypeDescription
_projectIduint256The ID of the project to which the funding cycle belongs.

Returns

NameTypeDescription
fundingCycleJBFundingCycleThe latest configured funding cycle.
metadataJBFundingCycleMetadataThe latest configured funding cycle's metadata.
ballotStateJBBallotStateThe state of the configuration.

currentFundingCycleOf

A project's current funding cycle along with its metadata.

function currentFundingCycleOf(uint256 _projectId)
external
view
override
returns (JBFundingCycle memory fundingCycle, JBFundingCycleMetadata memory metadata);

Parameters

NameTypeDescription
_projectIduint256The ID of the project to which the funding cycle belongs.

Returns

NameTypeDescription
fundingCycleJBFundingCycleThe current funding cycle.
metadataJBFundingCycleMetadataThe current funding cycle's metadata.

queuedFundingCycleOf

A project's queued funding cycle along with its metadata.

function queuedFundingCycleOf(uint256 _projectId)
external
view
override
returns (JBFundingCycle memory fundingCycle, JBFundingCycleMetadata memory metadata);

Parameters

NameTypeDescription
_projectIduint256The ID of the project to which the funding cycle belongs.

Returns

NameTypeDescription
fundingCycleJBFundingCycleThe queued funding cycle.
metadataJBFundingCycleMetadataThe queued funding cycle's metadata.

totalOutstandingTokensOf

Gets the current total amount of outstanding tokens for a project.

function totalOutstandingTokensOf(uint256 _projectId) public view override returns (uint256);

Parameters

NameTypeDescription
_projectIduint256The ID of the project to get total outstanding tokens of.

Returns

NameTypeDescription
<none>uint256The current total amount of outstanding tokens for the project.

supportsInterface

Indicates if this contract adheres to the specified interface.

See IERC165 - supportsInterface.

function supportsInterface(bytes4 _interfaceId) public view virtual override(ERC165, IERC165) returns (bool);

Parameters

NameTypeDescription
_interfaceIdbytes4The ID of the interface to check for adherance to.

constructor

constructor(
IJBOperatorStore _operatorStore,
IJBProjects _projects,
IJBDirectory _directory,
IJBFundingCycleStore _fundingCycleStore,
IJBTokenStore _tokenStore,
IJBSplitsStore _splitsStore,
IJBFundAccessConstraintsStore _fundAccessConstraintsStore
) JBOperatable(_operatorStore);

Parameters

NameTypeDescription
_operatorStoreIJBOperatorStoreA contract storing operator assignments.
_projectsIJBProjectsA contract which mints ERC-721's that represent project ownership and transfers.
_directoryIJBDirectoryA contract storing directories of terminals and controllers for each project.
_fundingCycleStoreIJBFundingCycleStoreA contract storing all funding cycle configurations.
_tokenStoreIJBTokenStoreA contract that manages token minting and burning.
_splitsStoreIJBSplitsStoreA contract that stores splits for each project.
_fundAccessConstraintsStoreIJBFundAccessConstraintsStoreA contract that stores fund access constraints for each project.

launchProjectFor

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[] memory _terminals,
string memory _memo
) external virtual override returns (uint256 projectId);

Parameters

NameTypeDescription
_owneraddressThe address to set as the owner of the project. The project ERC-721 will be owned by this address.
_projectMetadataJBProjectMetadataMetadata to associate with the project within a particular domain. This can be updated any time by the owner of the project.
_dataJBFundingCycleDataData that defines the project's first funding cycle. These properties will remain fixed for the duration of the funding cycle.
_metadataJBFundingCycleMetadataMetadata specifying the controller specific params that a funding cycle can have. These properties will remain fixed for the duration of the funding cycle.
_mustStartAtOrAfteruint256The time before which the configured funding cycle cannot start.
_groupedSplitsJBGroupedSplits[]An array of splits to set for any number of groups.
_fundAccessConstraintsJBFundAccessConstraints[]An array 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.
_terminalsIJBPaymentTerminal[]Payment terminals to add for the project.
_memostringA memo to pass along to the emitted event.

Returns

NameTypeDescription
projectIduint256The ID of the project.

launchFundingCyclesFor

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 memory _memo
)
external
virtual
override
requirePermission(projects.ownerOf(_projectId), _projectId, JBOperations.RECONFIGURE)
returns (uint256 configuration);

Parameters

NameTypeDescription
_projectIduint256The ID of the project to launch funding cycles for.
_dataJBFundingCycleDataData that defines the project's first funding cycle. These properties will remain fixed for the duration of the funding cycle.
_metadataJBFundingCycleMetadataMetadata specifying the controller specific params that a funding cycle can have. These properties will remain fixed for the duration of the funding cycle.
_mustStartAtOrAfteruint256The time before which the configured funding cycle cannot start.
_groupedSplitsJBGroupedSplits[]An array of splits to set for any number of groups.
_fundAccessConstraintsJBFundAccessConstraints[]An array 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.
_terminalsIJBPaymentTerminal[]Payment terminals to add for the project.
_memostringA memo to pass along to the emitted event.

Returns

NameTypeDescription
configurationuint256The configuration of the funding cycle that was successfully created.

reconfigureFundingCyclesOf

Proposes a configuration of a subsequent funding cycle that will take effect once the current one expires if it is approved by the current funding cycle's ballot.

Only a project's owner or a designated operator can configure its funding cycles.

function reconfigureFundingCyclesOf(
uint256 _projectId,
JBFundingCycleData calldata _data,
JBFundingCycleMetadata calldata _metadata,
uint256 _mustStartAtOrAfter,
JBGroupedSplits[] calldata _groupedSplits,
JBFundAccessConstraints[] calldata _fundAccessConstraints,
string calldata _memo
)
external
virtual
override
requirePermission(projects.ownerOf(_projectId), _projectId, JBOperations.RECONFIGURE)
returns (uint256 configuration);

Parameters

NameTypeDescription
_projectIduint256The ID of the project whose funding cycles are being reconfigured.
_dataJBFundingCycleDataData that defines the funding cycle. These properties will remain fixed for the duration of the funding cycle.
_metadataJBFundingCycleMetadataMetadata specifying the controller specific params that a funding cycle can have. These properties will remain fixed for the duration of the funding cycle.
_mustStartAtOrAfteruint256The time before which the configured funding cycle cannot start.
_groupedSplitsJBGroupedSplits[]An array of splits to set for any number of groups.
_fundAccessConstraintsJBFundAccessConstraints[]An array 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.
_memostringA memo to pass along to the emitted event.

Returns

NameTypeDescription
configurationuint256The configuration of the funding cycle that was successfully reconfigured.

mintTokensOf

Mint new token supply into an account, and optionally reserve a supply to be distributed according to the project's current funding cycle configuration.

Only a project's owner, a designated operator, one of its terminals, or the current data source can mint its tokens.

function mintTokensOf(
uint256 _projectId,
uint256 _tokenCount,
address _beneficiary,
string calldata _memo,
bool _preferClaimedTokens,
bool _useReservedRate
) external virtual override returns (uint256 beneficiaryTokenCount);

Parameters

NameTypeDescription
_projectIduint256The ID of the project to which the tokens being minted belong.
_tokenCountuint256The amount of tokens to mint in total, counting however many should be reserved.
_beneficiaryaddressThe account that the tokens are being minted for.
_memostringA memo to pass along to the emitted event.
_preferClaimedTokensboolA flag indicating whether a project's attached token contract should be minted if they have been issued.
_useReservedRateboolWhether to use the current funding cycle's reserved rate in the mint calculation.

Returns

NameTypeDescription
beneficiaryTokenCountuint256The amount of tokens minted for the beneficiary.

burnTokensOf

Burns a token holder's supply.

Only a token's holder, a designated operator, or a project's terminal can burn it.

function burnTokensOf(
address _holder,
uint256 _projectId,
uint256 _tokenCount,
string calldata _memo,
bool _preferClaimedTokens
)
external
virtual
override
requirePermissionAllowingOverride(
_holder,
_projectId,
JBOperations.BURN,
directory.isTerminalOf(_projectId, IJBPaymentTerminal(msg.sender))
);

Parameters

NameTypeDescription
_holderaddressThe account that is having its tokens burned.
_projectIduint256The ID of the project to which the tokens being burned belong.
_tokenCountuint256The number of tokens to burn.
_memostringA memo to pass along to the emitted event.
_preferClaimedTokensboolA flag indicating whether a project's attached token contract should be burned first if they have been issued.

distributeReservedTokensOf

Distributes all outstanding reserved tokens for a project.

function distributeReservedTokensOf(uint256 _projectId, string calldata _memo)
external
virtual
override
returns (uint256);

Parameters

NameTypeDescription
_projectIduint256The ID of the project to which the reserved tokens belong.
_memostringA memo to pass along to the emitted event.

Returns

NameTypeDescription
<none>uint256The amount of minted reserved tokens.

prepForMigrationOf

Allows other controllers to signal to this one that a migration is expected for the specified project.

This controller should not yet be the project's controller.

function prepForMigrationOf(uint256 _projectId, address _from) external virtual override;

Parameters

NameTypeDescription
_projectIduint256The ID of the project that will be migrated to this controller.
_fromaddressThe controller being migrated from.

migrate

Allows a project to migrate from this controller to another.

Only a project's owner or a designated operator can migrate it.

function migrate(uint256 _projectId, IJBMigratable _to)
external
virtual
override
requirePermission(projects.ownerOf(_projectId), _projectId, JBOperations.MIGRATE_CONTROLLER);

Parameters

NameTypeDescription
_projectIduint256The ID of the project that will be migrated from this controller.
_toIJBMigratableThe controller to which the project is migrating.

_distributeReservedTokensOf

Distributes all outstanding reserved tokens for a project.

function _distributeReservedTokensOf(uint256 _projectId, string memory _memo) internal returns (uint256 tokenCount);

Parameters

NameTypeDescription
_projectIduint256The ID of the project to which the reserved tokens belong.
_memostringA memo to pass along to the emitted event.

Returns

NameTypeDescription
tokenCountuint256The amount of minted reserved tokens.

_distributeToReservedTokenSplitsOf

Distribute tokens to the splits according to the specified funding cycle configuration.

function _distributeToReservedTokenSplitsOf(uint256 _projectId, uint256 _domain, uint256 _group, uint256 _amount)
internal
returns (uint256 leftoverAmount);

Parameters

NameTypeDescription
_projectIduint256The ID of the project for which reserved token splits are being distributed.
_domainuint256The domain of the splits to distribute the reserved tokens between.
_groupuint256The group of the splits to distribute the reserved tokens between.
_amountuint256The total amount of tokens to mint.

Returns

NameTypeDescription
leftoverAmountuint256If the splits percents dont add up to 100%, the leftover amount is returned.

_configure

Configures a funding cycle and stores information pertinent to the configuration.

function _configure(
uint256 _projectId,
JBFundingCycleData calldata _data,
JBFundingCycleMetadata calldata _metadata,
uint256 _mustStartAtOrAfter,
JBGroupedSplits[] memory _groupedSplits,
JBFundAccessConstraints[] memory _fundAccessConstraints
) internal returns (uint256);

Parameters

NameTypeDescription
_projectIduint256The ID of the project whose funding cycles are being reconfigured.
_dataJBFundingCycleDataData that defines the funding cycle. These properties will remain fixed for the duration of the funding cycle.
_metadataJBFundingCycleMetadataMetadata specifying the controller specific params that a funding cycle can have. These properties will remain fixed for the duration of the funding cycle.
_mustStartAtOrAfteruint256The time before which the configured funding cycle cannot start.
_groupedSplitsJBGroupedSplits[]An array of splits to set for any number of groups.
_fundAccessConstraintsJBFundAccessConstraints[]An array 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.

Returns

NameTypeDescription
<none>uint256configuration The configuration of the funding cycle that was successfully reconfigured.

Errors

BURN_PAUSED_AND_SENDER_NOT_VALID_TERMINAL_DELEGATE

error BURN_PAUSED_AND_SENDER_NOT_VALID_TERMINAL_DELEGATE();

CANT_MIGRATE_TO_CURRENT_CONTROLLER

error CANT_MIGRATE_TO_CURRENT_CONTROLLER();

FUNDING_CYCLE_ALREADY_LAUNCHED

error FUNDING_CYCLE_ALREADY_LAUNCHED();

INVALID_BALLOT_REDEMPTION_RATE

error INVALID_BALLOT_REDEMPTION_RATE();

INVALID_REDEMPTION_RATE

error INVALID_REDEMPTION_RATE();

INVALID_RESERVED_RATE

error INVALID_RESERVED_RATE();

MIGRATION_NOT_ALLOWED

error MIGRATION_NOT_ALLOWED();

MINT_NOT_ALLOWED_AND_NOT_TERMINAL_DELEGATE

error MINT_NOT_ALLOWED_AND_NOT_TERMINAL_DELEGATE();

NO_BURNABLE_TOKENS

error NO_BURNABLE_TOKENS();

NOT_CURRENT_CONTROLLER

error NOT_CURRENT_CONTROLLER();

OVERFLOW_ALERT

error OVERFLOW_ALERT();

ZERO_TOKENS_TO_MINT

error ZERO_TOKENS_TO_MINT();