JBPayoutRedemptionPaymentTerminal3_1_1
Generic terminal managing all inflows and outflows of funds into the protocol ecosystem.
Inherits: JBSingleTokenPaymentTerminal
, JBOperatable
, Ownable
, IJBPayoutRedemptionPaymentTerminal3_1
, IJBPayoutRedemptionPaymentTerminal3_1_1
State Variables
_FEE_CAP
Maximum fee that can be set for a funding cycle configuration.
Out of MAX_FEE (50_000_000 / 1_000_000_000).
uint256 internal constant _FEE_CAP = 50_000_000;
_FEE_BENEFICIARY_PROJECT_ID
The fee beneficiary project ID is 1, as it should be the first project launched during the deployment process.
uint256 internal constant _FEE_BENEFICIARY_PROJECT_ID = 1;
_heldFeesOf
Fees that are being held to be processed later.
mapping(uint256 => JBFee[]) internal _heldFeesOf;
projects
Mints ERC-721's that represent project ownership and transfers.
IJBProjects public immutable override projects;
directory
The directory of terminals and controllers for projects.
IJBDirectory public immutable override directory;
splitsStore
The contract that stores splits for each project.
IJBSplitsStore public immutable override splitsStore;
prices
The contract that exposes price feeds.
IJBPrices public immutable override prices;
store
The contract that stores and manages the terminal's data.
address public immutable override store;
baseWeightCurrency
The currency to base token issuance on.
If this differs from currency
, there must be a price feed available to convert currency
to baseWeightCurrency
.
uint256 public immutable override baseWeightCurrency;
payoutSplitsGroup
The group that payout splits coming from this terminal are identified by.
uint256 public immutable override payoutSplitsGroup;
fee
The platform fee percent.
Out of MAX_FEE (25_000_000 / 1_000_000_000)
uint256 public override fee = 25_000_000;
feeGauge
The data source that returns a discount to apply to a project's fee.
address public override feeGauge;
isFeelessAddress
Addresses that can be paid towards from this terminal without incurring a fee.
Only addresses that are considered to be contained within the ecosystem can be feeless. Funds sent outside the ecosystem may incur fees despite being stored as feeless.
mapping(address => bool) public override isFeelessAddress;
Functions
currentEthOverflowOf
Gets the current overflowed amount in this terminal for a specified project, in terms of ETH.
The current overflow is represented as a fixed point number with 18 decimals.
function currentEthOverflowOf(uint256 _projectId)
external
view
virtual
override
returns (uint256);
Parameters
Name | Type | Description |
---|---|---|
_projectId | uint256 | The ID of the project to get overflow for. |
Returns
Name | Type | Description |
---|---|---|
<none> | uint256 | The current amount of ETH overflow that project has in this terminal, as a fixed point number with 18 decimals. |
heldFeesOf
The fees that are currently being held to be processed later for each project.
function heldFeesOf(uint256 _projectId) external view override returns (JBFee[] memory);
Parameters
Name | Type | Description |
---|---|---|
_projectId | uint256 | The ID of the project for which fees are being held. |
Returns
Name | Type | Description |
---|---|---|
<none> | JBFee[] | An array of fees that are being held. |
supportsInterface
Indicates if this contract adheres to the specified interface.
See IERC165-supportsInterface.
function supportsInterface(bytes4 _interfaceId)
public
view
virtual
override(JBSingleTokenPaymentTerminal, IERC165)
returns (bool);
Parameters
Name | Type | Description |
---|---|---|
_interfaceId | bytes4 | The ID of the interface to check for adherance to. |
Returns
Name | Type | Description |
---|---|---|
<none> | bool | A flag indicating if the provided interface ID is supported. |
_balance
Checks the balance of tokens in this contract.
function _balance() internal view virtual returns (uint256);
Returns
Name | Type | Description |
---|---|---|
<none> | uint256 | The contract's balance. |
constructor
constructor(
address _token,
uint256 _decimals,
uint256 _currency,
uint256 _baseWeightCurrency,
uint256 _payoutSplitsGroup,
IJBOperatorStore _operatorStore,
IJBProjects _projects,
IJBDirectory _directory,
IJBSplitsStore _splitsStore,
IJBPrices _prices,
address _store,
address _owner
) payable JBSingleTokenPaymentTerminal(_token, _decimals, _currency) JBOperatable(_operatorStore);
Parameters
Name | Type | Description |
---|---|---|
_token | address | The token that this terminal manages. |
_decimals | uint256 | The number of decimals the token fixed point amounts are expected to have. |
_currency | uint256 | The currency that this terminal's token adheres to for price feeds. |
_baseWeightCurrency | uint256 | The currency to base token issuance on. |
_payoutSplitsGroup | uint256 | The group that denotes payout splits from this terminal in the splits store. |
_operatorStore | IJBOperatorStore | A contract storing operator assignments. |
_projects | IJBProjects | A contract which mints ERC-721's that represent project ownership and transfers. |
_directory | IJBDirectory | A contract storing directories of terminals and controllers for each project. |
_splitsStore | IJBSplitsStore | A contract that stores splits for each project. |
_prices | IJBPrices | A contract that exposes price feeds. |
_store | address | A contract that stores the terminal's data. |
_owner | address | The address that will own this contract. |
pay
Contribute tokens to a project.
function pay(
uint256 _projectId,
uint256 _amount,
address _token,
address _beneficiary,
uint256 _minReturnedTokens,
bool _preferClaimedTokens,
string calldata _memo,
bytes calldata _metadata
) external payable virtual override returns (uint256);
Parameters
Name | Type | Description |
---|---|---|
_projectId | uint256 | The ID of the project being paid. |
_amount | uint256 | The amount of terminal tokens being received, as a fixed point number with the same amount of decimals as this terminal. If this terminal's token is ETH, this is ignored and msg.value is used in its place. |
_token | address | The token being paid. This terminal ignores this property since it only manages one token. |
_beneficiary | address | The address to mint tokens for and pass along to the funding cycle's data source and delegate. |
_minReturnedTokens | uint256 | The minimum number of project tokens expected in return, as a fixed point number with the same amount of decimals as this terminal. |
_preferClaimedTokens | bool | A flag indicating whether the request prefers to mint project tokens into the beneficiaries wallet rather than leaving them unclaimed. This is only possible if the project has an attached token contract. Leaving them unclaimed saves gas. |
_memo | string | A memo to pass along to the emitted event, and passed along the the funding cycle's data source and delegate. A data source can alter the memo before emitting in the event and forwarding to the delegate. |
_metadata | bytes | Bytes to send along to the data source, delegate, and emitted event, if provided. |
Returns
Name | Type | Description |
---|---|---|
<none> | uint256 | The number of tokens minted for the beneficiary, as a fixed point number with 18 decimals. |
redeemTokensOf
Holders can redeem their tokens to claim the project's overflowed tokens, or to trigger rules determined by the project's current funding cycle's data source.
Only a token holder or a designated operator can redeem its tokens.
function redeemTokensOf(
address _holder,
uint256 _projectId,
uint256 _tokenCount,
address _token,
uint256 _minReturnedTokens,
address payable _beneficiary,
string memory _memo,
bytes memory _metadata
)
external
virtual
override
requirePermission(_holder, _projectId, JBOperations.REDEEM)
returns (uint256 reclaimAmount);
Parameters
Name | Type | Description |
---|---|---|
_holder | address | The account to redeem tokens for. |
_projectId | uint256 | The ID of the project to which the tokens being redeemed belong. |
_tokenCount | uint256 | The number of project tokens to redeem, as a fixed point number with 18 decimals. |
_token | address | The token being reclaimed. This terminal ignores this property since it only manages one token. |
_minReturnedTokens | uint256 | The minimum amount of terminal tokens expected in return, as a fixed point number with the same amount of decimals as the terminal. |
_beneficiary | address payable | The address to send the terminal tokens to. |
_memo | string | A memo to pass along to the emitted event. |
_metadata | bytes | Bytes to send along to the data source, delegate, and emitted event, if provided. |
Returns
Name | Type | Description |
---|---|---|
reclaimAmount | uint256 | The amount of terminal tokens that the project tokens were redeemed for, as a fixed point number with 18 decimals. |
distributePayoutsOf
Distributes payouts for a project with the distribution limit of its current funding cycle.
Payouts are sent to the preprogrammed splits. Any leftover is sent to the project's owner.
Anyone can distribute payouts on a project's behalf. The project can preconfigure a wildcard split that is used to send funds to msg.sender. This can be used to incentivize calling this function.
All funds distributed outside of this contract or any feeless terminals incure the protocol fee.
function distributePayoutsOf(
uint256 _projectId,
uint256 _amount,
uint256 _currency,
address _token,
uint256 _minReturnedTokens,
bytes calldata _metadata
) external virtual override returns (uint256 netLeftoverDistributionAmount);
Parameters
Name | Type | Description |
---|---|---|
_projectId | uint256 | The ID of the project having its payouts distributed. |
_amount | uint256 | The amount of terminal tokens to distribute, as a fixed point number with same number of decimals as this terminal. |
_currency | uint256 | The expected currency of the amount being distributed. Must match the project's current funding cycle's distribution limit currency. |
_token | address | The token being distributed. This terminal ignores this property since it only manages one token. |
_minReturnedTokens | uint256 | The minimum number of terminal tokens that the _amount should be valued at in terms of this terminal's currency, as a fixed point number with the same number of decimals as this terminal. |
_metadata | bytes | Bytes to send along to the emitted event, if provided. |
Returns
Name | Type | Description |
---|---|---|
netLeftoverDistributionAmount | uint256 | The amount that was sent to the project owner, as a fixed point number with the same amount of decimals as this terminal. |
useAllowanceOf
Allows a project to send funds from its overflow up to the preconfigured allowance.
Only a project's owner or a designated operator can use its allowance.
Incurs the protocol fee.
function useAllowanceOf(
uint256 _projectId,
uint256 _amount,
uint256 _currency,
address _token,
uint256 _minReturnedTokens,
address payable _beneficiary,
string memory _memo,
bytes calldata _metadata
)
external
virtual
override
requirePermission(projects.ownerOf(_projectId), _projectId, JBOperations.USE_ALLOWANCE)
returns (uint256 netDistributedAmount);
Parameters
Name | Type | Description |
---|---|---|
_projectId | uint256 | The ID of the project to use the allowance of. |
_amount | uint256 | The amount of terminal tokens to use from this project's current allowance, as a fixed point number with the same amount of decimals as this terminal. |
_currency | uint256 | The expected currency of the amount being distributed. Must match the project's current funding cycle's overflow allowance currency. |
_token | address | The token being distributed. This terminal ignores this property since it only manages one token. |
_minReturnedTokens | uint256 | The minimum number of tokens that the _amount should be valued at in terms of this terminal's currency, as a fixed point number with 18 decimals. |
_beneficiary | address payable | The address to send the funds to. |
_memo | string | A memo to pass along to the emitted event. |
_metadata | bytes | Bytes to send along to the emitted event, if provided. |
Returns
Name | Type | Description |
---|---|---|
netDistributedAmount | uint256 | The amount of tokens that was distributed to the beneficiary, as a fixed point number with the same amount of decimals as the terminal. |
migrate
Allows a project owner to migrate its funds and operations to a new terminal that accepts the same token type.
Only a project's owner or a designated operator can migrate it.
function migrate(uint256 _projectId, IJBPaymentTerminal _to)
external
virtual
override
requirePermission(projects.ownerOf(_projectId), _projectId, JBOperations.MIGRATE_TERMINAL)
returns (uint256 balance);
Parameters
Name | Type | Description |
---|---|---|
_projectId | uint256 | The ID of the project being migrated. |
_to | IJBPaymentTerminal | The terminal contract that will gain the project's funds. |
Returns
Name | Type | Description |
---|---|---|
balance | uint256 | The amount of funds that were migrated, as a fixed point number with the same amount of decimals as this terminal. |
addToBalanceOf
Receives funds belonging to the specified project.
function addToBalanceOf(
uint256 _projectId,
uint256 _amount,
address _token,
string calldata _memo,
bytes calldata _metadata
) external payable virtual override;
Parameters
Name | Type | Description |
---|---|---|
_projectId | uint256 | The ID of the project to which the funds received belong. |
_amount | uint256 | The amount of tokens to add, as a fixed point number with the same number of decimals as this terminal. If this is an ETH terminal, this is ignored and msg.value is used instead. |
_token | address | The token being paid. This terminal ignores this property since it only manages one currency. |
_memo | string | A memo to pass along to the emitted event. |
_metadata | bytes | Extra data to pass along to the emitted event. |
processFees
Process any fees that are being held for the project.
Only a project owner, an operator, or the contract's owner can process held fees.
function processFees(uint256 _projectId)
external
virtual
override
requirePermissionAllowingOverride(
projects.ownerOf(_projectId),
_projectId,
JBOperations.PROCESS_FEES,
msg.sender == owner()
);
Parameters
Name | Type | Description |
---|---|---|
_projectId | uint256 | The ID of the project whos held fees should be processed. |
setFee
Allows the fee to be updated.
Only the owner of this contract can change the fee.
function setFee(uint256 _fee) external virtual override onlyOwner;
Parameters
Name | Type | Description |
---|---|---|
_fee | uint256 | The new fee, out of MAX_FEE. |
setFeeGauge
Allows the fee gauge to be updated.
Only the owner of this contract can change the fee gauge.
function setFeeGauge(address _feeGauge) external virtual override onlyOwner;
Parameters
Name | Type | Description |
---|---|---|
_feeGauge | address | The new fee gauge. |
setFeelessAddress
Sets whether projects operating on this terminal can pay towards the specified address without incurring a fee.
Only the owner of this contract can set addresses as feeless.
function setFeelessAddress(address _address, bool _flag) external virtual override onlyOwner;
Parameters
Name | Type | Description |
---|---|---|
_address | address | The address that can be paid towards while still bypassing fees. |
_flag | bool | A flag indicating whether the terminal should be feeless or not. |
addToBalanceOf
Receives funds belonging to the specified project.
function addToBalanceOf(
uint256 _projectId,
uint256 _amount,
address _token,
bool _shouldRefundHeldFees,
string calldata _memo,
bytes calldata _metadata
) public payable virtual override;
Parameters
Name | Type | Description |
---|---|---|
_projectId | uint256 | The ID of the project to which the funds received belong. |
_amount | uint256 | The amount of tokens to add, as a fixed point number with the same number of decimals as this terminal. If this is an ETH terminal, this is ignored and msg.value is used instead. |
_token | address | The token being paid. This terminal ignores this property since it only manages one currency. |
_shouldRefundHeldFees | bool | A flag indicating if held fees should be refunded based on the amount being added. |
_memo | string | A memo to pass along to the emitted event. |
_metadata | bytes | Extra data to pass along to the emitted event. |
_transferFrom
Transfers tokens.
function _transferFrom(address _from, address payable _to, uint256 _amount) internal virtual;
Parameters
Name | Type | Description |
---|---|---|
_from | address | The address from which the transfer should originate. |
_to | address payable | The address to which the transfer should go. |
_amount | uint256 | The amount of the transfer, as a fixed point number with the same number of decimals as this terminal. |
_beforeTransferTo
Logic to be triggered before transferring tokens from this terminal.
function _beforeTransferTo(address _to, uint256 _amount) internal virtual;
Parameters
Name | Type | Description |
---|---|---|
_to | address | The address to which the transfer is going. |
_amount | uint256 | The amount of the transfer, as a fixed point number with the same number of decimals as this terminal. |
_cancelTransferTo
Logic to be triggered if a transfer should be undone
function _cancelTransferTo(address _to, uint256 _amount) internal virtual;
Parameters
Name | Type | Description |
---|---|---|
_to | address | The address to which the transfer went. |
_amount | uint256 | The amount of the transfer, as a fixed point number with the same number of decimals as this terminal. |
_isTerminalOf
Verifies this terminal is a terminal of provided project ID.
function _isTerminalOf(uint256 _projectId) internal view;
Parameters
Name | Type | Description |
---|---|---|
_projectId | uint256 | The ID of the project to check if this contract is a terminal of. |
_redeemTokensOf
Holders can redeem their tokens to claim the project's overflowed tokens, or to trigger rules determined by the project's current funding cycle's data source.
Only a token holder or a designated operator can redeem its tokens.
function _redeemTokensOf(
address _holder,
uint256 _projectId,
uint256 _tokenCount,
uint256 _minReturnedTokens,
address payable _beneficiary,
string memory _memo,
bytes memory _metadata
) internal returns (uint256 reclaimAmount);
Parameters
Name | Type | Description |
---|---|---|
_holder | address | The account to redeem tokens for. |
_projectId | uint256 | The ID of the project to which the tokens being redeemed belong. |
_tokenCount | uint256 | The number of project tokens to redeem, as a fixed point number with 18 decimals. |
_minReturnedTokens | uint256 | The minimum amount of terminal tokens expected in return, as a fixed point number with the same amount of decimals as the terminal. |
_beneficiary | address payable | The address to send the terminal tokens to. |
_memo | string | A memo to pass along to the emitted event. |
_metadata | bytes | Bytes to send along to the data source, delegate, and emitted event, if provided. |
Returns
Name | Type | Description |
---|---|---|
reclaimAmount | uint256 | The amount of terminal tokens that the project tokens were redeemed for, as a fixed point number with 18 decimals. |
_distributePayoutsOf
Distributes payouts for a project with the distribution limit of its current funding cycle.
Payouts are sent to the preprogrammed splits. Any leftover is sent to the project's owner.
Anyone can distribute payouts on a project's behalf. The project can preconfigure a wildcard split that is used to send funds to msg.sender. This can be used to incentivize calling this function.
All funds distributed outside of this contract or any feeless terminals incure the protocol fee.
function _distributePayoutsOf(
uint256 _projectId,
uint256 _amount,
uint256 _currency,
uint256 _minReturnedTokens,
bytes calldata _metadata
) internal returns (uint256 netLeftoverDistributionAmount);
Parameters
Name | Type | Description |
---|---|---|
_projectId | uint256 | The ID of the project having its payouts distributed. |
_amount | uint256 | The amount of terminal tokens to distribute, as a fixed point number with same number of decimals as this terminal. |
_currency | uint256 | The expected currency of the amount being distributed. Must match the project's current funding cycle's distribution limit currency. |
_minReturnedTokens | uint256 | The minimum number of terminal tokens that the _amount should be valued at in terms of this terminal's currency, as a fixed point number with the same number of decimals as this terminal. |
_metadata | bytes | Bytes to send along to the emitted event, if provided. |
Returns
Name | Type | Description |
---|---|---|
netLeftoverDistributionAmount | uint256 | The amount that was sent to the project owner, as a fixed point number with the same amount of decimals as this terminal. |
_useAllowanceOf
Allows a project to send funds from its overflow up to the preconfigured allowance.
Only a project's owner or a designated operator can use its allowance.
Incurs the protocol fee.
function _useAllowanceOf(
uint256 _projectId,
uint256 _amount,
uint256 _currency,
uint256 _minReturnedTokens,
address payable _beneficiary,
string memory _memo,
bytes calldata _metadata
) internal returns (uint256 netDistributedAmount);
Parameters
Name | Type | Description |
---|---|---|
_projectId | uint256 | The ID of the project to use the allowance of. |
_amount | uint256 | The amount of terminal tokens to use from this project's current allowance, as a fixed point number with the same amount of decimals as this terminal. |
_currency | uint256 | The expected currency of the amount being distributed. Must match the project's current funding cycle's overflow allowance currency. |
_minReturnedTokens | uint256 | The minimum number of tokens that the _amount should be valued at in terms of this terminal's currency, as a fixed point number with 18 decimals. |
_beneficiary | address payable | The address to send the funds to. |
_memo | string | A memo to pass along to the emitted event. |
_metadata | bytes | Bytes to send along to the emitted event, if provided. |
Returns
Name | Type | Description |
---|---|---|
netDistributedAmount | uint256 | The amount of tokens that was distributed to the beneficiary, as a fixed point number with the same amount of decimals as the terminal. |