Skip to main content

currentOf

Contract: JBFundingCycleStore​‌

Interface: IJBFundingCycleStore

The funding cycle that is currently active for the specified project.

If a current funding cycle of the project is not found, returns an empty funding cycle with all properties set to 0.

Definition

function currentOf(uint256 _projectId)
external
view
override
returns (JBFundingCycle memory fundingCycle) { ... }
  • Arguments:
    • _projectId is the ID of the project to get the current funding cycle of.
  • The view function can be accessed externally by anyone, and internally by the contract.
  • The view function does not alter state on the blockchain.
  • The function overrides a function definition from the IJBFundingCycleStore interface.
  • The function returns the project's current JBFundingCycle.

Body

  1. If there are no stored funding cycles for the provided project, there can't be an active funding cycle so an empty funding cycle should be returned.

    // If the project does not have a funding cycle, return an empty struct.
    if (latestConfigurationOf[_projectId] == 0) return _getStructFor(0, 0);

    Internal references:

  2. Get a reference to the configuration of an eligible funding cycle if there is one. This eligible cycle might not yet be approved.

    // Get a reference to the configuration of the eligible funding cycle.
    uint256 _fundingCycleConfiguration = _eligibleOf(_projectId);

    Internal references:

  3. Create a reference to a funding cycle.

    // Keep a reference to the eligible funding cycle.
    JBFundingCycle memory _fundingCycle;
  4. If there's a candidate funding cycle configuration, check to see if it is approved. If so, return the funding cycle as the current funding cycle of the project. Otherwise, get a reference to the funding cycle that the candidate is based on. A current funding cycle will be one derived from this reference.

    // If an eligible funding cycle exists...
    if (_fundingCycleConfiguration > 0) {
    // Resolve the funding cycle for the eligible configuration.
    _fundingCycle = _getStructFor(_projectId, _fundingCycleConfiguration);

    // Check to see if this funding cycle's ballot is approved.
    // If so, return it.
    if (_isApproved(_projectId, _fundingCycle)) return _fundingCycle;

    // If it hasn't been approved, set the funding cycle configuration to be the configuration of the funding cycle that it's based on,
    // which carries the last approved configuration.
    _fundingCycleConfiguration = _fundingCycle.basedOn;
    }

    Internal references:

  5. If there's not a candidate funding cycle configuration, get a reference the latest stored funding cycle for the project. If it's not approved or if it hasn't yet started, get a reference to the cycle it's based on. A current funding cycle will be one derived from this reference.

    else {
    // No upcoming funding cycle found that is eligible to become active,
    // so use the last configuration.
    _fundingCycleConfiguration = latestConfigurationOf[_projectId];

    // Get the funding cycle for the latest ID.
    _fundingCycle = _getStructFor(_projectId, _fundingCycleConfiguration);

    // If it's not approved or if it hasn't yet started, get a reference to the funding cycle that the latest is based on, which has the latest approved configuration.
    if (!_isApproved(_projectId, _fundingCycle) || block.timestamp < _fundingCycle.start)
    _fundingCycleConfiguration = _fundingCycle.basedOn;
    }

    Internal references:

  6. If the current referenced configuration is 0, there must not be a current cycle so return an empty one.

    // If there is not funding cycle to base the current one on, there can't be a current one.
    if (_fundingCycleConfiguration == 0) return _getStructFor(0, 0);

    Internal references:

  7. Create the funding cycle structure using the current reference. The current funding cycle will be one based on this reference.

    // The funding cycle to base a current one on.
    _fundingCycle = _getStructFor(_projectId, _fundingCycleConfiguration);

    Internal references:

  8. If the base has a duration of 0, it must still be current.

    // If the base has no duration, it's still the current one.
    if (_fundingCycle.duration == 0) return _fundingCycle;
  9. Return a funding cycle based on the one currently referenced. The mock funding cycle is allowed to have started already, which is why a true flag is passed in.

    // Return a mock of the current funding cycle.
    return _mockFundingCycleBasedOn(_fundingCycle, true);

    Internal references: