编译器
0.8.16+commit.07a7930e
文件 1 的 70:Address.sol
pragma solidity ^0.8.1;
library Address {
function isContract(address account) internal view returns (bool) {
return account.code.length > 0;
}
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
文件 2 的 70:Context.sol
pragma solidity ^0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
文件 3 的 70:ERC165.sol
pragma solidity ^0.8.0;
import "./IERC165.sol";
abstract contract ERC165 is IERC165 {
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
文件 4 的 70:ERC165Checker.sol
pragma solidity ^0.8.0;
import "./IERC165.sol";
library ERC165Checker {
bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;
function supportsERC165(address account) internal view returns (bool) {
return
_supportsERC165Interface(account, type(IERC165).interfaceId) &&
!_supportsERC165Interface(account, _INTERFACE_ID_INVALID);
}
function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {
return supportsERC165(account) && _supportsERC165Interface(account, interfaceId);
}
function getSupportedInterfaces(address account, bytes4[] memory interfaceIds)
internal
view
returns (bool[] memory)
{
bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);
if (supportsERC165(account)) {
for (uint256 i = 0; i < interfaceIds.length; i++) {
interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);
}
}
return interfaceIdsSupported;
}
function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {
if (!supportsERC165(account)) {
return false;
}
for (uint256 i = 0; i < interfaceIds.length; i++) {
if (!_supportsERC165Interface(account, interfaceIds[i])) {
return false;
}
}
return true;
}
function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {
bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId);
(bool success, bytes memory result) = account.staticcall{gas: 30000}(encodedParams);
if (result.length < 32) return false;
return success && abi.decode(result, (bool));
}
}
文件 5 的 70:IERC165.sol
pragma solidity ^0.8.0;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 6 的 70:IERC721.sol
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
interface IERC721 is IERC165 {
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
function balanceOf(address owner) external view returns (uint256 balance);
function ownerOf(uint256 tokenId) external view returns (address owner);
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
function approve(address to, uint256 tokenId) external;
function getApproved(uint256 tokenId) external view returns (address operator);
function setApprovalForAll(address operator, bool _approved) external;
function isApprovedForAll(address owner, address operator) external view returns (bool);
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
}
文件 7 的 70:IJBAllowanceTerminal3_1.sol
pragma solidity ^0.8.0;
interface IJBAllowanceTerminal3_1 {
function useAllowanceOf(
uint256 projectId,
uint256 amount,
uint256 currency,
address token,
uint256 minReturnedTokens,
address payable beneficiary,
string calldata memo,
bytes calldata metadata
) external returns (uint256 netDistributedAmount);
}
文件 8 的 70:IJBController.sol
pragma solidity ^0.8.0;
import {IERC165} from '@openzeppelin/contracts/utils/introspection/IERC165.sol';
import {JBBallotState} from './../enums/JBBallotState.sol';
import {JBFundAccessConstraints} from './../structs/JBFundAccessConstraints.sol';
import {JBFundingCycle} from './../structs/JBFundingCycle.sol';
import {JBFundingCycleData} from './../structs/JBFundingCycleData.sol';
import {JBFundingCycleMetadata} from './../structs/JBFundingCycleMetadata.sol';
import {JBGroupedSplits} from './../structs/JBGroupedSplits.sol';
import {JBProjectMetadata} from './../structs/JBProjectMetadata.sol';
import {JBSplit} from './../structs/JBSplit.sol';
import {IJBDirectory} from './IJBDirectory.sol';
import {IJBFundingCycleStore} from './IJBFundingCycleStore.sol';
import {IJBMigratable} from './IJBMigratable.sol';
import {IJBPaymentTerminal} from './IJBPaymentTerminal.sol';
import {IJBProjects} from './IJBProjects.sol';
import {IJBSplitsStore} from './IJBSplitsStore.sol';
import {IJBTokenStore} from './IJBTokenStore.sol';
interface IJBController is IERC165 {
event LaunchProject(uint256 configuration, uint256 projectId, string memo, address caller);
event LaunchFundingCycles(uint256 configuration, uint256 projectId, string memo, address caller);
event ReconfigureFundingCycles(
uint256 configuration,
uint256 projectId,
string memo,
address caller
);
event SetFundAccessConstraints(
uint256 indexed fundingCycleConfiguration,
uint256 indexed fundingCycleNumber,
uint256 indexed projectId,
JBFundAccessConstraints constraints,
address caller
);
event DistributeReservedTokens(
uint256 indexed fundingCycleConfiguration,
uint256 indexed fundingCycleNumber,
uint256 indexed projectId,
address beneficiary,
uint256 tokenCount,
uint256 beneficiaryTokenCount,
string memo,
address caller
);
event DistributeToReservedTokenSplit(
uint256 indexed projectId,
uint256 indexed domain,
uint256 indexed group,
JBSplit split,
uint256 tokenCount,
address caller
);
event MintTokens(
address indexed beneficiary,
uint256 indexed projectId,
uint256 tokenCount,
uint256 beneficiaryTokenCount,
string memo,
uint256 reservedRate,
address caller
);
event BurnTokens(
address indexed holder,
uint256 indexed projectId,
uint256 tokenCount,
string memo,
address caller
);
event Migrate(uint256 indexed projectId, IJBMigratable to, address caller);
event PrepMigration(uint256 indexed projectId, address from, address caller);
function projects() external view returns (IJBProjects);
function fundingCycleStore() external view returns (IJBFundingCycleStore);
function tokenStore() external view returns (IJBTokenStore);
function splitsStore() external view returns (IJBSplitsStore);
function directory() external view returns (IJBDirectory);
function reservedTokenBalanceOf(
uint256 projectId,
uint256 reservedRate
) external view returns (uint256);
function distributionLimitOf(
uint256 projectId,
uint256 configuration,
IJBPaymentTerminal terminal,
address token
) external view returns (uint256 distributionLimit, uint256 distributionLimitCurrency);
function overflowAllowanceOf(
uint256 projectId,
uint256 configuration,
IJBPaymentTerminal terminal,
address token
) external view returns (uint256 overflowAllowance, uint256 overflowAllowanceCurrency);
function totalOutstandingTokensOf(
uint256 projectId,
uint256 reservedRate
) external view returns (uint256);
function getFundingCycleOf(
uint256 projectId,
uint256 configuration
)
external
view
returns (JBFundingCycle memory fundingCycle, JBFundingCycleMetadata memory metadata);
function latestConfiguredFundingCycleOf(
uint256 projectId
)
external
view
returns (JBFundingCycle memory, JBFundingCycleMetadata memory metadata, JBBallotState);
function currentFundingCycleOf(
uint256 projectId
)
external
view
returns (JBFundingCycle memory fundingCycle, JBFundingCycleMetadata memory metadata);
function queuedFundingCycleOf(
uint256 projectId
)
external
view
returns (JBFundingCycle memory fundingCycle, JBFundingCycleMetadata memory metadata);
function launchProjectFor(
address owner,
JBProjectMetadata calldata projectMetadata,
JBFundingCycleData calldata data,
JBFundingCycleMetadata calldata metadata,
uint256 mustStartAtOrAfter,
JBGroupedSplits[] memory groupedSplits,
JBFundAccessConstraints[] memory fundAccessConstraints,
IJBPaymentTerminal[] memory terminals,
string calldata memo
) external returns (uint256 projectId);
function launchFundingCyclesFor(
uint256 projectId,
JBFundingCycleData calldata data,
JBFundingCycleMetadata calldata metadata,
uint256 mustStartAtOrAfter,
JBGroupedSplits[] memory groupedSplits,
JBFundAccessConstraints[] memory fundAccessConstraints,
IJBPaymentTerminal[] memory terminals,
string calldata memo
) external returns (uint256 configuration);
function reconfigureFundingCyclesOf(
uint256 projectId,
JBFundingCycleData calldata data,
JBFundingCycleMetadata calldata metadata,
uint256 mustStartAtOrAfter,
JBGroupedSplits[] memory groupedSplits,
JBFundAccessConstraints[] memory fundAccessConstraints,
string calldata memo
) external returns (uint256);
function mintTokensOf(
uint256 projectId,
uint256 tokenCount,
address beneficiary,
string calldata memo,
bool preferClaimedTokens,
bool useReservedRate
) external returns (uint256 beneficiaryTokenCount);
function burnTokensOf(
address holder,
uint256 projectId,
uint256 tokenCount,
string calldata memo,
bool preferClaimedTokens
) external;
function distributeReservedTokensOf(
uint256 projectId,
string memory memo
) external returns (uint256);
function migrate(uint256 projectId, IJBMigratable to) external;
}
文件 9 的 70:IJBDirectory.sol
pragma solidity ^0.8.0;
import {IJBFundingCycleStore} from './IJBFundingCycleStore.sol';
import {IJBPaymentTerminal} from './IJBPaymentTerminal.sol';
import {IJBProjects} from './IJBProjects.sol';
interface IJBDirectory {
event SetController(uint256 indexed projectId, address indexed controller, address caller);
event AddTerminal(uint256 indexed projectId, IJBPaymentTerminal indexed terminal, address caller);
event SetTerminals(uint256 indexed projectId, IJBPaymentTerminal[] terminals, address caller);
event SetPrimaryTerminal(
uint256 indexed projectId,
address indexed token,
IJBPaymentTerminal indexed terminal,
address caller
);
event SetIsAllowedToSetFirstController(address indexed addr, bool indexed flag, address caller);
function projects() external view returns (IJBProjects);
function fundingCycleStore() external view returns (IJBFundingCycleStore);
function controllerOf(uint256 projectId) external view returns (address);
function isAllowedToSetFirstController(address account) external view returns (bool);
function terminalsOf(uint256 projectId) external view returns (IJBPaymentTerminal[] memory);
function isTerminalOf(
uint256 projectId,
IJBPaymentTerminal terminal
) external view returns (bool);
function primaryTerminalOf(
uint256 projectId,
address token
) external view returns (IJBPaymentTerminal);
function setControllerOf(uint256 projectId, address controller) external;
function setTerminalsOf(uint256 projectId, IJBPaymentTerminal[] calldata terminals) external;
function setPrimaryTerminalOf(
uint256 projectId,
address token,
IJBPaymentTerminal terminal
) external;
function setIsAllowedToSetFirstController(address account, bool flag) external;
}
文件 10 的 70:IJBFeeGauge3_1.sol
pragma solidity ^0.8.0;
import {JBFeeType} from './../enums/JBFeeType.sol';
interface IJBFeeGauge3_1 {
function currentDiscountFor(uint256 projectId, JBFeeType feeType) external view returns (uint256);
}
文件 11 的 70:IJBFeeHoldingTerminal.sol
pragma solidity ^0.8.0;
interface IJBFeeHoldingTerminal {
function addToBalanceOf(
uint256 projectId,
uint256 amount,
address token,
bool shouldRefundHeldFees,
string calldata memo,
bytes calldata metadata
) external payable;
}
文件 12 的 70:IJBFundingCycleBallot.sol
pragma solidity ^0.8.0;
import {IERC165} from '@openzeppelin/contracts/utils/introspection/IERC165.sol';
import {JBBallotState} from './../enums/JBBallotState.sol';
interface IJBFundingCycleBallot is IERC165 {
function duration() external view returns (uint256);
function stateOf(
uint256 projectId,
uint256 configuration,
uint256 start
) external view returns (JBBallotState);
}
文件 13 的 70:IJBFundingCycleStore.sol
pragma solidity ^0.8.0;
import {JBBallotState} from './../enums/JBBallotState.sol';
import {JBFundingCycle} from './../structs/JBFundingCycle.sol';
import {JBFundingCycleData} from './../structs/JBFundingCycleData.sol';
interface IJBFundingCycleStore {
event Configure(
uint256 indexed configuration,
uint256 indexed projectId,
JBFundingCycleData data,
uint256 metadata,
uint256 mustStartAtOrAfter,
address caller
);
event Init(uint256 indexed configuration, uint256 indexed projectId, uint256 indexed basedOn);
function latestConfigurationOf(uint256 projectId) external view returns (uint256);
function get(
uint256 projectId,
uint256 configuration
) external view returns (JBFundingCycle memory);
function latestConfiguredOf(
uint256 projectId
) external view returns (JBFundingCycle memory fundingCycle, JBBallotState ballotState);
function queuedOf(uint256 projectId) external view returns (JBFundingCycle memory fundingCycle);
function currentOf(uint256 projectId) external view returns (JBFundingCycle memory fundingCycle);
function currentBallotStateOf(uint256 projectId) external view returns (JBBallotState);
function configureFor(
uint256 projectId,
JBFundingCycleData calldata data,
uint256 metadata,
uint256 mustStartAtOrAfter
) external returns (JBFundingCycle memory fundingCycle);
}
文件 14 的 70:IJBMigratable.sol
pragma solidity ^0.8.0;
interface IJBMigratable {
function prepForMigrationOf(uint256 projectId, address from) external;
}
文件 15 的 70:IJBOperatable.sol
pragma solidity ^0.8.0;
import {IJBOperatorStore} from './IJBOperatorStore.sol';
interface IJBOperatable {
function operatorStore() external view returns (IJBOperatorStore);
}
文件 16 的 70:IJBOperatorStore.sol
pragma solidity ^0.8.0;
import {JBOperatorData} from './../structs/JBOperatorData.sol';
interface IJBOperatorStore {
event SetOperator(
address indexed operator,
address indexed account,
uint256 indexed domain,
uint256[] permissionIndexes,
uint256 packed
);
function permissionsOf(
address operator,
address account,
uint256 domain
) external view returns (uint256);
function hasPermission(
address operator,
address account,
uint256 domain,
uint256 permissionIndex
) external view returns (bool);
function hasPermissions(
address operator,
address account,
uint256 domain,
uint256[] calldata permissionIndexes
) external view returns (bool);
function setOperator(JBOperatorData calldata operatorData) external;
function setOperators(JBOperatorData[] calldata operatorData) external;
}
文件 17 的 70:IJBPayDelegate.sol
pragma solidity ^0.8.0;
import {IERC165} from '@openzeppelin/contracts/utils/introspection/IERC165.sol';
import {JBDidPayData} from './../structs/JBDidPayData.sol';
interface IJBPayDelegate is IERC165 {
function didPay(JBDidPayData calldata data) external payable;
}
文件 18 的 70:IJBPayDelegate3_1_1.sol
pragma solidity ^0.8.0;
import {IERC165} from '@openzeppelin/contracts/utils/introspection/IERC165.sol';
import {JBDidPayData3_1_1} from './../structs/JBDidPayData3_1_1.sol';
interface IJBPayDelegate3_1_1 is IERC165 {
function didPay(JBDidPayData3_1_1 calldata data) external payable;
}
文件 19 的 70:IJBPaymentTerminal.sol
pragma solidity ^0.8.0;
import {IERC165} from '@openzeppelin/contracts/utils/introspection/IERC165.sol';
interface IJBPaymentTerminal is IERC165 {
function acceptsToken(address token, uint256 projectId) external view returns (bool);
function currencyForToken(address token) external view returns (uint256);
function decimalsForToken(address token) external view returns (uint256);
function currentEthOverflowOf(uint256 projectId) external view returns (uint256);
function pay(
uint256 projectId,
uint256 amount,
address token,
address beneficiary,
uint256 minReturnedTokens,
bool preferClaimedTokens,
string calldata memo,
bytes calldata metadata
) external payable returns (uint256 beneficiaryTokenCount);
function addToBalanceOf(
uint256 projectId,
uint256 amount,
address token,
string calldata memo,
bytes calldata metadata
) external payable;
}
文件 20 的 70:IJBPayoutRedemptionPaymentTerminal3_1.sol
pragma solidity ^0.8.0;
import {JBFee} from './../structs/JBFee.sol';
import {IJBAllowanceTerminal3_1} from './IJBAllowanceTerminal3_1.sol';
import {IJBDirectory} from './IJBDirectory.sol';
import {IJBFeeHoldingTerminal} from './IJBFeeHoldingTerminal.sol';
import {IJBPayDelegate} from './IJBPayDelegate.sol';
import {IJBPaymentTerminal} from './IJBPaymentTerminal.sol';
import {IJBPayoutTerminal3_1} from './IJBPayoutTerminal3_1.sol';
import {IJBPrices} from './IJBPrices.sol';
import {IJBProjects} from './IJBProjects.sol';
import {IJBRedemptionDelegate} from './IJBRedemptionDelegate.sol';
import {IJBRedemptionTerminal} from './IJBRedemptionTerminal.sol';
import {IJBSplitsStore} from './IJBSplitsStore.sol';
import {JBDidPayData} from './../structs/JBDidPayData.sol';
import {JBDidRedeemData} from './../structs/JBDidRedeemData.sol';
import {JBSplit} from './../structs/JBSplit.sol';
interface IJBPayoutRedemptionPaymentTerminal3_1 is
IJBPaymentTerminal,
IJBPayoutTerminal3_1,
IJBAllowanceTerminal3_1,
IJBRedemptionTerminal,
IJBFeeHoldingTerminal
{
event AddToBalance(
uint256 indexed projectId,
uint256 amount,
uint256 refundedFees,
string memo,
bytes metadata,
address caller
);
event Migrate(
uint256 indexed projectId,
IJBPaymentTerminal indexed to,
uint256 amount,
address caller
);
event DistributePayouts(
uint256 indexed fundingCycleConfiguration,
uint256 indexed fundingCycleNumber,
uint256 indexed projectId,
address beneficiary,
uint256 amount,
uint256 distributedAmount,
uint256 fee,
uint256 beneficiaryDistributionAmount,
bytes metadata,
address caller
);
event UseAllowance(
uint256 indexed fundingCycleConfiguration,
uint256 indexed fundingCycleNumber,
uint256 indexed projectId,
address beneficiary,
uint256 amount,
uint256 distributedAmount,
uint256 netDistributedamount,
string memo,
bytes metadata,
address caller
);
event HoldFee(
uint256 indexed projectId,
uint256 indexed amount,
uint256 indexed fee,
uint256 feeDiscount,
address beneficiary,
address caller
);
event ProcessFee(
uint256 indexed projectId,
uint256 indexed amount,
bool indexed wasHeld,
address beneficiary,
address caller
);
event RefundHeldFees(
uint256 indexed projectId,
uint256 indexed amount,
uint256 indexed refundedFees,
uint256 leftoverAmount,
address caller
);
event Pay(
uint256 indexed fundingCycleConfiguration,
uint256 indexed fundingCycleNumber,
uint256 indexed projectId,
address payer,
address beneficiary,
uint256 amount,
uint256 beneficiaryTokenCount,
string memo,
bytes metadata,
address caller
);
event DelegateDidPay(
IJBPayDelegate indexed delegate,
JBDidPayData data,
uint256 delegatedAmount,
address caller
);
event RedeemTokens(
uint256 indexed fundingCycleConfiguration,
uint256 indexed fundingCycleNumber,
uint256 indexed projectId,
address holder,
address beneficiary,
uint256 tokenCount,
uint256 reclaimedAmount,
string memo,
bytes metadata,
address caller
);
event DelegateDidRedeem(
IJBRedemptionDelegate indexed delegate,
JBDidRedeemData data,
uint256 delegatedAmount,
address caller
);
event DistributeToPayoutSplit(
uint256 indexed projectId,
uint256 indexed domain,
uint256 indexed group,
JBSplit split,
uint256 amount,
uint256 netAmount,
address caller
);
event SetFee(uint256 fee, address caller);
event SetFeeGauge(address indexed feeGauge, address caller);
event SetFeelessAddress(address indexed addrs, bool indexed flag, address caller);
event PayoutReverted(
uint256 indexed projectId,
JBSplit split,
uint256 amount,
bytes reason,
address caller
);
event FeeReverted(
uint256 indexed projectId,
uint256 indexed feeProjectId,
uint256 amount,
bytes reason,
address caller
);
function projects() external view returns (IJBProjects);
function splitsStore() external view returns (IJBSplitsStore);
function directory() external view returns (IJBDirectory);
function prices() external view returns (IJBPrices);
function store() external view returns (address);
function baseWeightCurrency() external view returns (uint256);
function payoutSplitsGroup() external view returns (uint256);
function heldFeesOf(uint256 projectId) external view returns (JBFee[] memory);
function fee() external view returns (uint256);
function feeGauge() external view returns (address);
function isFeelessAddress(address account) external view returns (bool);
function migrate(uint256 projectId, IJBPaymentTerminal to) external returns (uint256 balance);
function processFees(uint256 projectId) external;
function setFee(uint256 fee) external;
function setFeeGauge(address feeGauge) external;
function setFeelessAddress(address account, bool flag) external;
}
文件 21 的 70:IJBPayoutRedemptionPaymentTerminal3_1_1.sol
pragma solidity ^0.8.0;
import {JBFee} from './../structs/JBFee.sol';
import {JBDidRedeemData3_1_1} from './../structs/JBDidRedeemData3_1_1.sol';
import {JBDidPayData3_1_1} from './../structs/JBDidPayData3_1_1.sol';
import {IJBPayDelegate3_1_1} from './IJBPayDelegate3_1_1.sol';
import {IJBRedemptionDelegate3_1_1} from './IJBRedemptionDelegate3_1_1.sol';
import {IJBPayoutRedemptionPaymentTerminal3_1} from './IJBPayoutRedemptionPaymentTerminal3_1.sol';
interface IJBPayoutRedemptionPaymentTerminal3_1_1 is IJBPayoutRedemptionPaymentTerminal3_1 {
event DelegateDidRedeem(
IJBRedemptionDelegate3_1_1 indexed delegate,
JBDidRedeemData3_1_1 data,
uint256 delegatedAmount,
uint256 fee,
address caller
);
event DelegateDidPay(
IJBPayDelegate3_1_1 indexed delegate,
JBDidPayData3_1_1 data,
uint256 delegatedAmount,
address caller
);
}
文件 22 的 70:IJBPayoutTerminal3_1.sol
pragma solidity ^0.8.0;
interface IJBPayoutTerminal3_1 {
function distributePayoutsOf(
uint256 projectId,
uint256 amount,
uint256 currency,
address token,
uint256 minReturnedTokens,
bytes calldata metadata
) external returns (uint256 netLeftoverDistributionAmount);
}
文件 23 的 70:IJBPriceFeed.sol
pragma solidity ^0.8.0;
interface IJBPriceFeed {
function currentPrice(uint256 targetDecimals) external view returns (uint256);
}
文件 24 的 70:IJBPrices.sol
pragma solidity ^0.8.0;
import {IJBPriceFeed} from './IJBPriceFeed.sol';
interface IJBPrices {
event AddFeed(uint256 indexed currency, uint256 indexed base, IJBPriceFeed feed);
function feedFor(uint256 currency, uint256 base) external view returns (IJBPriceFeed);
function priceFor(
uint256 currency,
uint256 base,
uint256 decimals
) external view returns (uint256);
function addFeedFor(uint256 currency, uint256 base, IJBPriceFeed priceFeed) external;
}
文件 25 的 70:IJBProjects.sol
pragma solidity ^0.8.0;
import {IERC721} from '@openzeppelin/contracts/token/ERC721/IERC721.sol';
import {JBProjectMetadata} from './../structs/JBProjectMetadata.sol';
import {IJBTokenUriResolver} from './IJBTokenUriResolver.sol';
interface IJBProjects is IERC721 {
event Create(
uint256 indexed projectId,
address indexed owner,
JBProjectMetadata metadata,
address caller
);
event SetMetadata(uint256 indexed projectId, JBProjectMetadata metadata, address caller);
event SetTokenUriResolver(IJBTokenUriResolver indexed resolver, address caller);
function count() external view returns (uint256);
function metadataContentOf(
uint256 projectId,
uint256 domain
) external view returns (string memory);
function tokenUriResolver() external view returns (IJBTokenUriResolver);
function createFor(
address owner,
JBProjectMetadata calldata metadata
) external returns (uint256 projectId);
function setMetadataOf(uint256 projectId, JBProjectMetadata calldata metadata) external;
function setTokenUriResolver(IJBTokenUriResolver newResolver) external;
}
文件 26 的 70:IJBRedemptionDelegate.sol
pragma solidity ^0.8.0;
import {IERC165} from '@openzeppelin/contracts/utils/introspection/IERC165.sol';
import {JBDidRedeemData} from './../structs/JBDidRedeemData.sol';
interface IJBRedemptionDelegate is IERC165 {
function didRedeem(JBDidRedeemData calldata data) external payable;
}
文件 27 的 70:IJBRedemptionDelegate3_1_1.sol
pragma solidity ^0.8.0;
import {IERC165} from '@openzeppelin/contracts/utils/introspection/IERC165.sol';
import {JBDidRedeemData3_1_1} from './../structs/JBDidRedeemData3_1_1.sol';
interface IJBRedemptionDelegate3_1_1 is IERC165 {
function didRedeem(JBDidRedeemData3_1_1 calldata data) external payable;
}
文件 28 的 70:IJBRedemptionTerminal.sol
pragma solidity ^0.8.0;
interface IJBRedemptionTerminal {
function redeemTokensOf(
address holder,
uint256 projectId,
uint256 tokenCount,
address token,
uint256 minReturnedTokens,
address payable beneficiary,
string calldata memo,
bytes calldata metadata
) external returns (uint256 reclaimAmount);
}
文件 29 的 70:IJBSingleTokenPaymentTerminal.sol
pragma solidity ^0.8.0;
import {IJBPaymentTerminal} from './IJBPaymentTerminal.sol';
interface IJBSingleTokenPaymentTerminal is IJBPaymentTerminal {
function token() external view returns (address);
function currency() external view returns (uint256);
function decimals() external view returns (uint256);
}
文件 30 的 70:IJBSingleTokenPaymentTerminalStore3_1_1.sol
pragma solidity ^0.8.0;
import {JBFundingCycle} from './../structs/JBFundingCycle.sol';
import {JBPayDelegateAllocation3_1_1} from './../structs/JBPayDelegateAllocation3_1_1.sol';
import {JBRedemptionDelegateAllocation3_1_1} from './../structs/JBRedemptionDelegateAllocation3_1_1.sol';
import {JBTokenAmount} from './../structs/JBTokenAmount.sol';
import {IJBDirectory} from './IJBDirectory.sol';
import {IJBFundingCycleStore} from './IJBFundingCycleStore.sol';
import {IJBPrices} from './IJBPrices.sol';
import {IJBSingleTokenPaymentTerminal} from './IJBSingleTokenPaymentTerminal.sol';
interface IJBSingleTokenPaymentTerminalStore3_1_1 {
function fundingCycleStore() external view returns (IJBFundingCycleStore);
function directory() external view returns (IJBDirectory);
function prices() external view returns (IJBPrices);
function balanceOf(
IJBSingleTokenPaymentTerminal terminal,
uint256 projectId
) external view returns (uint256);
function usedDistributionLimitOf(
IJBSingleTokenPaymentTerminal terminal,
uint256 projectId,
uint256 fundingCycleNumber
) external view returns (uint256);
function usedOverflowAllowanceOf(
IJBSingleTokenPaymentTerminal terminal,
uint256 projectId,
uint256 fundingCycleConfiguration
) external view returns (uint256);
function currentOverflowOf(
IJBSingleTokenPaymentTerminal terminal,
uint256 projectId
) external view returns (uint256);
function currentTotalOverflowOf(
uint256 projectId,
uint256 decimals,
uint256 currency
) external view returns (uint256);
function currentReclaimableOverflowOf(
IJBSingleTokenPaymentTerminal terminal,
uint256 projectId,
uint256 tokenCount,
bool useTotalOverflow
) external view returns (uint256);
function currentReclaimableOverflowOf(
uint256 projectId,
uint256 tokenCount,
uint256 totalSupply,
uint256 overflow
) external view returns (uint256);
function recordPaymentFrom(
address payer,
JBTokenAmount memory amount,
uint256 projectId,
uint256 baseWeightCurrency,
address beneficiary,
string calldata inputMemo,
bytes calldata metadata
)
external
returns (
JBFundingCycle memory fundingCycle,
uint256 tokenCount,
JBPayDelegateAllocation3_1_1[] memory delegateAllocations,
string memory outputMemo
);
function recordRedemptionFor(
address holder,
uint256 projectId,
uint256 tokenCount,
string calldata inputMemo,
bytes calldata metadata
)
external
returns (
JBFundingCycle memory fundingCycle,
uint256 reclaimAmount,
JBRedemptionDelegateAllocation3_1_1[] memory delegateAllocations,
string memory outputMemo
);
function recordDistributionFor(
uint256 projectId,
uint256 amount,
uint256 currency
) external returns (JBFundingCycle memory fundingCycle, uint256 distributedAmount);
function recordUsedAllowanceOf(
uint256 projectId,
uint256 amount,
uint256 currency
) external returns (JBFundingCycle memory fundingCycle, uint256 withdrawnAmount);
function recordAddedBalanceFor(uint256 projectId, uint256 amount) external;
function recordMigration(uint256 projectId) external returns (uint256 balance);
}
文件 31 的 70:IJBSplitAllocator.sol
pragma solidity ^0.8.0;
import {IERC165} from '@openzeppelin/contracts/utils/introspection/IERC165.sol';
import {JBSplitAllocationData} from '../structs/JBSplitAllocationData.sol';
interface IJBSplitAllocator is IERC165 {
function allocate(JBSplitAllocationData calldata data) external payable;
}
文件 32 的 70:IJBSplitsStore.sol
pragma solidity ^0.8.0;
import {JBGroupedSplits} from './../structs/JBGroupedSplits.sol';
import {JBSplit} from './../structs/JBSplit.sol';
import {IJBDirectory} from './IJBDirectory.sol';
import {IJBProjects} from './IJBProjects.sol';
interface IJBSplitsStore {
event SetSplit(
uint256 indexed projectId,
uint256 indexed domain,
uint256 indexed group,
JBSplit split,
address caller
);
function projects() external view returns (IJBProjects);
function directory() external view returns (IJBDirectory);
function splitsOf(
uint256 projectId,
uint256 domain,
uint256 group
) external view returns (JBSplit[] memory);
function set(uint256 projectId, uint256 domain, JBGroupedSplits[] memory groupedSplits) external;
}
文件 33 的 70:IJBToken.sol
pragma solidity ^0.8.0;
interface IJBToken {
function projectId() external view returns (uint256);
function decimals() external view returns (uint8);
function totalSupply(uint256 projectId) external view returns (uint256);
function balanceOf(address account, uint256 projectId) external view returns (uint256);
function mint(uint256 projectId, address account, uint256 amount) external;
function burn(uint256 projectId, address account, uint256 amount) external;
function approve(uint256, address spender, uint256 amount) external;
function transfer(uint256 projectId, address to, uint256 amount) external;
function transferFrom(uint256 projectId, address from, address to, uint256 amount) external;
}
文件 34 的 70:IJBTokenStore.sol
pragma solidity ^0.8.0;
import {IJBFundingCycleStore} from './IJBFundingCycleStore.sol';
import {IJBProjects} from './IJBProjects.sol';
import {IJBToken} from './IJBToken.sol';
interface IJBTokenStore {
event Issue(
uint256 indexed projectId,
IJBToken indexed token,
string name,
string symbol,
address caller
);
event Mint(
address indexed holder,
uint256 indexed projectId,
uint256 amount,
bool tokensWereClaimed,
bool preferClaimedTokens,
address caller
);
event Burn(
address indexed holder,
uint256 indexed projectId,
uint256 amount,
uint256 initialUnclaimedBalance,
uint256 initialClaimedBalance,
bool preferClaimedTokens,
address caller
);
event Claim(
address indexed holder,
uint256 indexed projectId,
uint256 initialUnclaimedBalance,
uint256 amount,
address caller
);
event Set(uint256 indexed projectId, IJBToken indexed newToken, address caller);
event Transfer(
address indexed holder,
uint256 indexed projectId,
address indexed recipient,
uint256 amount,
address caller
);
function tokenOf(uint256 projectId) external view returns (IJBToken);
function projects() external view returns (IJBProjects);
function fundingCycleStore() external view returns (IJBFundingCycleStore);
function unclaimedBalanceOf(address holder, uint256 projectId) external view returns (uint256);
function unclaimedTotalSupplyOf(uint256 projectId) external view returns (uint256);
function totalSupplyOf(uint256 projectId) external view returns (uint256);
function balanceOf(address holder, uint256 projectId) external view returns (uint256 result);
function issueFor(
uint256 projectId,
string calldata name,
string calldata symbol
) external returns (IJBToken token);
function setFor(uint256 projectId, IJBToken token) external;
function burnFrom(
address holder,
uint256 projectId,
uint256 amount,
bool preferClaimedTokens
) external;
function mintFor(
address holder,
uint256 projectId,
uint256 amount,
bool preferClaimedTokens
) external;
function claimFor(address holder, uint256 projectId, uint256 amount) external;
function transferFrom(
address holder,
uint256 projectId,
address recipient,
uint256 amount
) external;
}
文件 35 的 70:IJBTokenUriResolver.sol
pragma solidity ^0.8.0;
interface IJBTokenUriResolver {
function getUri(uint256 projectId) external view returns (string memory tokenUri);
}
文件 36 的 70:JBBallotState.sol
pragma solidity ^0.8.0;
enum JBBallotState {
Active,
Approved,
Failed
}
文件 37 的 70:JBConstants.sol
pragma solidity ^0.8.0;
library JBConstants {
uint256 public constant MAX_RESERVED_RATE = 10_000;
uint256 public constant MAX_REDEMPTION_RATE = 10_000;
uint256 public constant MAX_DISCOUNT_RATE = 1_000_000_000;
uint256 public constant SPLITS_TOTAL_PERCENT = 1_000_000_000;
uint256 public constant MAX_FEE = 1_000_000_000;
uint256 public constant MAX_FEE_DISCOUNT = 1_000_000_000;
}
文件 38 的 70:JBCurrencies.sol
pragma solidity ^0.8.0;
library JBCurrencies {
uint256 public constant ETH = 1;
uint256 public constant USD = 2;
}
文件 39 的 70:JBDidPayData.sol
pragma solidity ^0.8.0;
import {JBTokenAmount} from './JBTokenAmount.sol';
struct JBDidPayData {
address payer;
uint256 projectId;
uint256 currentFundingCycleConfiguration;
JBTokenAmount amount;
JBTokenAmount forwardedAmount;
uint256 projectTokenCount;
address beneficiary;
bool preferClaimedTokens;
string memo;
bytes metadata;
}
文件 40 的 70:JBDidPayData3_1_1.sol
pragma solidity ^0.8.0;
import {JBTokenAmount} from './JBTokenAmount.sol';
struct JBDidPayData3_1_1 {
address payer;
uint256 projectId;
uint256 currentFundingCycleConfiguration;
JBTokenAmount amount;
JBTokenAmount forwardedAmount;
uint256 projectTokenCount;
address beneficiary;
bool preferClaimedTokens;
string memo;
bytes dataSourceMetadata;
bytes payerMetadata;
}
文件 41 的 70:JBDidRedeemData.sol
pragma solidity ^0.8.0;
import {JBTokenAmount} from './JBTokenAmount.sol';
struct JBDidRedeemData {
address holder;
uint256 projectId;
uint256 currentFundingCycleConfiguration;
uint256 projectTokenCount;
JBTokenAmount reclaimedAmount;
JBTokenAmount forwardedAmount;
address payable beneficiary;
string memo;
bytes metadata;
}
文件 42 的 70:JBDidRedeemData3_1_1.sol
pragma solidity ^0.8.0;
import {JBTokenAmount} from './JBTokenAmount.sol';
struct JBDidRedeemData3_1_1 {
address holder;
uint256 projectId;
uint256 currentFundingCycleConfiguration;
uint256 projectTokenCount;
JBTokenAmount reclaimedAmount;
JBTokenAmount forwardedAmount;
address payable beneficiary;
string memo;
bytes dataSourceMetadata;
bytes redeemerMetadata;
}
文件 43 的 70:JBETHPaymentTerminal3_1_2.sol
pragma solidity ^0.8.16;
import {Address} from '@openzeppelin/contracts/utils/Address.sol';
import {JBPayoutRedemptionPaymentTerminal3_1_2} from './abstract/JBPayoutRedemptionPaymentTerminal3_1_2.sol';
import {IJBDirectory} from './interfaces/IJBDirectory.sol';
import {IJBOperatorStore} from './interfaces/IJBOperatorStore.sol';
import {IJBProjects} from './interfaces/IJBProjects.sol';
import {IJBSplitsStore} from './interfaces/IJBSplitsStore.sol';
import {IJBPrices} from './interfaces/IJBPrices.sol';
import {JBCurrencies} from './libraries/JBCurrencies.sol';
import {JBSplitsGroups} from './libraries/JBSplitsGroups.sol';
import {JBTokens} from './libraries/JBTokens.sol';
contract JBETHPaymentTerminal3_1_2 is JBPayoutRedemptionPaymentTerminal3_1_2 {
function _balance() internal view override returns (uint256) {
return address(this).balance;
}
constructor(
uint256 _baseWeightCurrency,
IJBOperatorStore _operatorStore,
IJBProjects _projects,
IJBDirectory _directory,
IJBSplitsStore _splitsStore,
IJBPrices _prices,
address _store,
address _owner
)
JBPayoutRedemptionPaymentTerminal3_1_2(
JBTokens.ETH,
18,
JBCurrencies.ETH,
_baseWeightCurrency,
JBSplitsGroups.ETH_PAYOUT,
_operatorStore,
_projects,
_directory,
_splitsStore,
_prices,
_store,
_owner
)
{
}
function _transferFrom(address _from, address payable _to, uint256 _amount) internal override {
_from;
Address.sendValue(_to, _amount);
}
}
文件 44 的 70:JBFee.sol
pragma solidity ^0.8.0;
struct JBFee {
uint256 amount;
uint32 fee;
uint32 feeDiscount;
address beneficiary;
}
文件 45 的 70:JBFeeType.sol
pragma solidity ^0.8.0;
enum JBFeeType {
PAYOUT,
ALLOWANCE,
REDEMPTION
}
文件 46 的 70:JBFees.sol
pragma solidity ^0.8.0;
import {PRBMath} from '@paulrberg/contracts/math/PRBMath.sol';
import {JBConstants} from './../libraries/JBConstants.sol';
library JBFees {
function feeIn(
uint256 _amount,
uint256 _feePercent,
uint256 _feeDiscount
) internal pure returns (uint256) {
uint256 _discountedFeePercent = _feePercent -
PRBMath.mulDiv(_feePercent, _feeDiscount, JBConstants.MAX_FEE_DISCOUNT);
return
_amount - PRBMath.mulDiv(_amount, JBConstants.MAX_FEE, _discountedFeePercent + JBConstants.MAX_FEE);
}
function feeFrom(
uint256 _amount,
uint256 _feePercent,
uint256 _feeDiscount
) internal pure returns (uint256) {
uint256 _discountedFeePercent = _feePercent -
PRBMath.mulDiv(_feePercent, _feeDiscount, JBConstants.MAX_FEE_DISCOUNT);
return PRBMath.mulDiv(_amount, _discountedFeePercent, JBConstants.MAX_FEE);
}
}
文件 47 的 70:JBFixedPointNumber.sol
pragma solidity ^0.8.16;
library JBFixedPointNumber {
function adjustDecimals(
uint256 _value,
uint256 _decimals,
uint256 _targetDecimals
) internal pure returns (uint256) {
if (_targetDecimals == _decimals) return _value;
else if (_targetDecimals > _decimals) return _value * 10**(_targetDecimals - _decimals);
else return _value / 10**(_decimals - _targetDecimals);
}
}
文件 48 的 70:JBFundAccessConstraints.sol
pragma solidity ^0.8.0;
import {IJBPaymentTerminal} from './../interfaces/IJBPaymentTerminal.sol';
struct JBFundAccessConstraints {
IJBPaymentTerminal terminal;
address token;
uint256 distributionLimit;
uint256 distributionLimitCurrency;
uint256 overflowAllowance;
uint256 overflowAllowanceCurrency;
}
文件 49 的 70:JBFundingCycle.sol
pragma solidity ^0.8.0;
import {IJBFundingCycleBallot} from './../interfaces/IJBFundingCycleBallot.sol';
struct JBFundingCycle {
uint256 number;
uint256 configuration;
uint256 basedOn;
uint256 start;
uint256 duration;
uint256 weight;
uint256 discountRate;
IJBFundingCycleBallot ballot;
uint256 metadata;
}
文件 50 的 70:JBFundingCycleData.sol
pragma solidity ^0.8.0;
import {IJBFundingCycleBallot} from './../interfaces/IJBFundingCycleBallot.sol';
struct JBFundingCycleData {
uint256 duration;
uint256 weight;
uint256 discountRate;
IJBFundingCycleBallot ballot;
}
文件 51 的 70:JBFundingCycleMetadata.sol
pragma solidity ^0.8.0;
import {JBGlobalFundingCycleMetadata} from './JBGlobalFundingCycleMetadata.sol';
struct JBFundingCycleMetadata {
JBGlobalFundingCycleMetadata global;
uint256 reservedRate;
uint256 redemptionRate;
uint256 ballotRedemptionRate;
bool pausePay;
bool pauseDistributions;
bool pauseRedeem;
bool pauseBurn;
bool allowMinting;
bool allowTerminalMigration;
bool allowControllerMigration;
bool holdFees;
bool preferClaimedTokenOverride;
bool useTotalOverflowForRedemptions;
bool useDataSourceForPay;
bool useDataSourceForRedeem;
address dataSource;
uint256 metadata;
}
文件 52 的 70:JBFundingCycleMetadataResolver.sol
pragma solidity ^0.8.16;
import {JBFundingCycle} from './../structs/JBFundingCycle.sol';
import {JBFundingCycleMetadata} from './../structs/JBFundingCycleMetadata.sol';
import {JBGlobalFundingCycleMetadata} from './../structs/JBGlobalFundingCycleMetadata.sol';
import {JBConstants} from './JBConstants.sol';
import {JBGlobalFundingCycleMetadataResolver} from './JBGlobalFundingCycleMetadataResolver.sol';
library JBFundingCycleMetadataResolver {
function global(JBFundingCycle memory _fundingCycle)
internal
pure
returns (JBGlobalFundingCycleMetadata memory)
{
return JBGlobalFundingCycleMetadataResolver.expandMetadata(uint8(_fundingCycle.metadata >> 8));
}
function reservedRate(JBFundingCycle memory _fundingCycle) internal pure returns (uint256) {
return uint256(uint16(_fundingCycle.metadata >> 24));
}
function redemptionRate(JBFundingCycle memory _fundingCycle) internal pure returns (uint256) {
return JBConstants.MAX_REDEMPTION_RATE - uint256(uint16(_fundingCycle.metadata >> 40));
}
function ballotRedemptionRate(JBFundingCycle memory _fundingCycle)
internal
pure
returns (uint256)
{
return JBConstants.MAX_REDEMPTION_RATE - uint256(uint16(_fundingCycle.metadata >> 56));
}
function payPaused(JBFundingCycle memory _fundingCycle) internal pure returns (bool) {
return ((_fundingCycle.metadata >> 72) & 1) == 1;
}
function distributionsPaused(JBFundingCycle memory _fundingCycle) internal pure returns (bool) {
return ((_fundingCycle.metadata >> 73) & 1) == 1;
}
function redeemPaused(JBFundingCycle memory _fundingCycle) internal pure returns (bool) {
return ((_fundingCycle.metadata >> 74) & 1) == 1;
}
function burnPaused(JBFundingCycle memory _fundingCycle) internal pure returns (bool) {
return ((_fundingCycle.metadata >> 75) & 1) == 1;
}
function mintingAllowed(JBFundingCycle memory _fundingCycle) internal pure returns (bool) {
return ((_fundingCycle.metadata >> 76) & 1) == 1;
}
function terminalMigrationAllowed(JBFundingCycle memory _fundingCycle)
internal
pure
returns (bool)
{
return ((_fundingCycle.metadata >> 77) & 1) == 1;
}
function controllerMigrationAllowed(JBFundingCycle memory _fundingCycle)
internal
pure
returns (bool)
{
return ((_fundingCycle.metadata >> 78) & 1) == 1;
}
function shouldHoldFees(JBFundingCycle memory _fundingCycle) internal pure returns (bool) {
return ((_fundingCycle.metadata >> 79) & 1) == 1;
}
function preferClaimedTokenOverride(JBFundingCycle memory _fundingCycle)
internal
pure
returns (bool)
{
return ((_fundingCycle.metadata >> 80) & 1) == 1;
}
function useTotalOverflowForRedemptions(JBFundingCycle memory _fundingCycle)
internal
pure
returns (bool)
{
return ((_fundingCycle.metadata >> 81) & 1) == 1;
}
function useDataSourceForPay(JBFundingCycle memory _fundingCycle) internal pure returns (bool) {
return (_fundingCycle.metadata >> 82) & 1 == 1;
}
function useDataSourceForRedeem(JBFundingCycle memory _fundingCycle)
internal
pure
returns (bool)
{
return (_fundingCycle.metadata >> 83) & 1 == 1;
}
function dataSource(JBFundingCycle memory _fundingCycle) internal pure returns (address) {
return address(uint160(_fundingCycle.metadata >> 84));
}
function metadata(JBFundingCycle memory _fundingCycle) internal pure returns (uint256) {
return uint256(uint8(_fundingCycle.metadata >> 244));
}
function packFundingCycleMetadata(JBFundingCycleMetadata memory _metadata)
internal
pure
returns (uint256 packed)
{
packed = 1;
packed |=
JBGlobalFundingCycleMetadataResolver.packFundingCycleGlobalMetadata(_metadata.global) <<
8;
packed |= _metadata.reservedRate << 24;
packed |= (JBConstants.MAX_REDEMPTION_RATE - _metadata.redemptionRate) << 40;
packed |= (JBConstants.MAX_REDEMPTION_RATE - _metadata.ballotRedemptionRate) << 56;
if (_metadata.pausePay) packed |= 1 << 72;
if (_metadata.pauseDistributions) packed |= 1 << 73;
if (_metadata.pauseRedeem) packed |= 1 << 74;
if (_metadata.pauseBurn) packed |= 1 << 75;
if (_metadata.allowMinting) packed |= 1 << 76;
if (_metadata.allowTerminalMigration) packed |= 1 << 77;
if (_metadata.allowControllerMigration) packed |= 1 << 78;
if (_metadata.holdFees) packed |= 1 << 79;
if (_metadata.preferClaimedTokenOverride) packed |= 1 << 80;
if (_metadata.useTotalOverflowForRedemptions) packed |= 1 << 81;
if (_metadata.useDataSourceForPay) packed |= 1 << 82;
if (_metadata.useDataSourceForRedeem) packed |= 1 << 83;
packed |= uint256(uint160(address(_metadata.dataSource))) << 84;
packed |= _metadata.metadata << 244;
}
function expandMetadata(JBFundingCycle memory _fundingCycle)
internal
pure
returns (JBFundingCycleMetadata memory)
{
return
JBFundingCycleMetadata(
global(_fundingCycle),
reservedRate(_fundingCycle),
redemptionRate(_fundingCycle),
ballotRedemptionRate(_fundingCycle),
payPaused(_fundingCycle),
distributionsPaused(_fundingCycle),
redeemPaused(_fundingCycle),
burnPaused(_fundingCycle),
mintingAllowed(_fundingCycle),
terminalMigrationAllowed(_fundingCycle),
controllerMigrationAllowed(_fundingCycle),
shouldHoldFees(_fundingCycle),
preferClaimedTokenOverride(_fundingCycle),
useTotalOverflowForRedemptions(_fundingCycle),
useDataSourceForPay(_fundingCycle),
useDataSourceForRedeem(_fundingCycle),
dataSource(_fundingCycle),
metadata(_fundingCycle)
);
}
}
文件 53 的 70:JBGlobalFundingCycleMetadata.sol
pragma solidity ^0.8.0;
struct JBGlobalFundingCycleMetadata {
bool allowSetTerminals;
bool allowSetController;
bool pauseTransfers;
}
文件 54 的 70:JBGlobalFundingCycleMetadataResolver.sol
pragma solidity ^0.8.16;
import {JBFundingCycleMetadata} from './../structs/JBFundingCycleMetadata.sol';
import {JBGlobalFundingCycleMetadata} from './../structs/JBGlobalFundingCycleMetadata.sol';
library JBGlobalFundingCycleMetadataResolver {
function setTerminalsAllowed(uint8 _data) internal pure returns (bool) {
return (_data & 1) == 1;
}
function setControllerAllowed(uint8 _data) internal pure returns (bool) {
return ((_data >> 1) & 1) == 1;
}
function transfersPaused(uint8 _data) internal pure returns (bool) {
return ((_data >> 2) & 1) == 1;
}
function packFundingCycleGlobalMetadata(
JBGlobalFundingCycleMetadata memory _metadata
) internal pure returns (uint256 packed) {
if (_metadata.allowSetTerminals) packed |= 1;
if (_metadata.allowSetController) packed |= 1 << 1;
if (_metadata.pauseTransfers) packed |= 1 << 2;
}
function expandMetadata(
uint8 _packedMetadata
) internal pure returns (JBGlobalFundingCycleMetadata memory metadata) {
return
JBGlobalFundingCycleMetadata(
setTerminalsAllowed(_packedMetadata),
setControllerAllowed(_packedMetadata),
transfersPaused(_packedMetadata)
);
}
}
文件 55 的 70:JBGroupedSplits.sol
pragma solidity ^0.8.0;
import {JBSplit} from './JBSplit.sol';
struct JBGroupedSplits {
uint256 group;
JBSplit[] splits;
}
文件 56 的 70:JBOperatable.sol
pragma solidity ^0.8.16;
import {IJBOperatable} from './../interfaces/IJBOperatable.sol';
import {IJBOperatorStore} from './../interfaces/IJBOperatorStore.sol';
abstract contract JBOperatable is IJBOperatable {
error UNAUTHORIZED();
modifier requirePermission(
address _account,
uint256 _domain,
uint256 _permissionIndex
) {
_requirePermission(_account, _domain, _permissionIndex);
_;
}
modifier requirePermissionAllowingOverride(
address _account,
uint256 _domain,
uint256 _permissionIndex,
bool _override
) {
_requirePermissionAllowingOverride(_account, _domain, _permissionIndex, _override);
_;
}
IJBOperatorStore public immutable override operatorStore;
constructor(IJBOperatorStore _operatorStore) {
operatorStore = _operatorStore;
}
function _requirePermission(
address _account,
uint256 _domain,
uint256 _permissionIndex
) internal view {
if (
msg.sender != _account &&
!operatorStore.hasPermission(msg.sender, _account, _domain, _permissionIndex) &&
!operatorStore.hasPermission(msg.sender, _account, 0, _permissionIndex)
) revert UNAUTHORIZED();
}
function _requirePermissionAllowingOverride(
address _account,
uint256 _domain,
uint256 _permissionIndex,
bool _override
) internal view {
if (
!_override &&
msg.sender != _account &&
!operatorStore.hasPermission(msg.sender, _account, _domain, _permissionIndex) &&
!operatorStore.hasPermission(msg.sender, _account, 0, _permissionIndex)
) revert UNAUTHORIZED();
}
}
文件 57 的 70:JBOperations.sol
pragma solidity ^0.8.0;
library JBOperations {
uint256 public constant RECONFIGURE = 1;
uint256 public constant REDEEM = 2;
uint256 public constant MIGRATE_CONTROLLER = 3;
uint256 public constant MIGRATE_TERMINAL = 4;
uint256 public constant PROCESS_FEES = 5;
uint256 public constant SET_METADATA = 6;
uint256 public constant ISSUE = 7;
uint256 public constant SET_TOKEN = 8;
uint256 public constant MINT = 9;
uint256 public constant BURN = 10;
uint256 public constant CLAIM = 11;
uint256 public constant TRANSFER = 12;
uint256 public constant REQUIRE_CLAIM = 13;
uint256 public constant SET_CONTROLLER = 14;
uint256 public constant SET_TERMINALS = 15;
uint256 public constant SET_PRIMARY_TERMINAL = 16;
uint256 public constant USE_ALLOWANCE = 17;
uint256 public constant SET_SPLITS = 18;
}
文件 58 的 70:JBOperatorData.sol
pragma solidity ^0.8.0;
struct JBOperatorData {
address operator;
uint256 domain;
uint256[] permissionIndexes;
}
文件 59 的 70:JBPayDelegateAllocation3_1_1.sol
pragma solidity ^0.8.0;
import {IJBPayDelegate3_1_1} from '../interfaces/IJBPayDelegate3_1_1.sol';
struct JBPayDelegateAllocation3_1_1 {
IJBPayDelegate3_1_1 delegate;
uint256 amount;
bytes metadata;
}
文件 60 的 70:JBPayoutRedemptionPaymentTerminal3_1_2.sol
pragma solidity ^0.8.16;
import {Ownable} from '@openzeppelin/contracts/access/Ownable.sol';
import {IERC165} from '@openzeppelin/contracts/utils/introspection/IERC165.sol';
import {ERC165Checker} from '@openzeppelin/contracts/utils/introspection/ERC165Checker.sol';
import {PRBMath} from '@paulrberg/contracts/math/PRBMath.sol';
import {JBFeeType} from './../enums/JBFeeType.sol';
import {IJBAllowanceTerminal3_1} from './../interfaces/IJBAllowanceTerminal3_1.sol';
import {IJBController} from './../interfaces/IJBController.sol';
import {IJBDirectory} from './../interfaces/IJBDirectory.sol';
import {IJBPayoutRedemptionPaymentTerminal3_1} from './../interfaces/IJBPayoutRedemptionPaymentTerminal3_1.sol';
import {IJBPayoutRedemptionPaymentTerminal3_1_1} from './../interfaces/IJBPayoutRedemptionPaymentTerminal3_1_1.sol';
import {IJBSplitsStore} from './../interfaces/IJBSplitsStore.sol';
import {IJBFeeGauge3_1} from './../interfaces/IJBFeeGauge3_1.sol';
import {IJBOperatable} from './../interfaces/IJBOperatable.sol';
import {IJBOperatorStore} from './../interfaces/IJBOperatorStore.sol';
import {IJBPaymentTerminal} from './../interfaces/IJBPaymentTerminal.sol';
import {IJBPayoutTerminal3_1} from './../interfaces/IJBPayoutTerminal3_1.sol';
import {IJBPrices} from './../interfaces/IJBPrices.sol';
import {IJBProjects} from './../interfaces/IJBProjects.sol';
import {IJBRedemptionTerminal} from './../interfaces/IJBRedemptionTerminal.sol';
import {IJBSingleTokenPaymentTerminalStore3_1_1} from './../interfaces/IJBSingleTokenPaymentTerminalStore3_1_1.sol';
import {IJBSplitAllocator} from './../interfaces/IJBSplitAllocator.sol';
import {JBConstants} from './../libraries/JBConstants.sol';
import {JBCurrencies} from './../libraries/JBCurrencies.sol';
import {JBFees} from './../libraries/JBFees.sol';
import {JBFixedPointNumber} from './../libraries/JBFixedPointNumber.sol';
import {JBFundingCycleMetadataResolver} from './../libraries/JBFundingCycleMetadataResolver.sol';
import {JBOperations} from './../libraries/JBOperations.sol';
import {JBTokens} from './../libraries/JBTokens.sol';
import {JBDidRedeemData3_1_1} from './../structs/JBDidRedeemData3_1_1.sol';
import {JBDidPayData3_1_1} from './../structs/JBDidPayData3_1_1.sol';
import {JBFee} from './../structs/JBFee.sol';
import {JBFundingCycle} from './../structs/JBFundingCycle.sol';
import {JBPayDelegateAllocation3_1_1} from './../structs/JBPayDelegateAllocation3_1_1.sol';
import {JBRedemptionDelegateAllocation3_1_1} from './../structs/JBRedemptionDelegateAllocation3_1_1.sol';
import {JBSplit} from './../structs/JBSplit.sol';
import {JBSplitAllocationData} from './../structs/JBSplitAllocationData.sol';
import {JBTokenAmount} from './../structs/JBTokenAmount.sol';
import {JBOperatable} from './JBOperatable.sol';
import {JBSingleTokenPaymentTerminal} from './JBSingleTokenPaymentTerminal.sol';
abstract contract JBPayoutRedemptionPaymentTerminal3_1_2 is
JBSingleTokenPaymentTerminal,
JBOperatable,
Ownable,
IJBPayoutRedemptionPaymentTerminal3_1_1
{
using JBFundingCycleMetadataResolver for JBFundingCycle;
error FEE_TOO_HIGH();
error INADEQUATE_DISTRIBUTION_AMOUNT();
error INADEQUATE_RECLAIM_AMOUNT();
error INADEQUATE_TOKEN_COUNT();
error NO_MSG_VALUE_ALLOWED();
error PAY_TO_ZERO_ADDRESS();
error PROJECT_TERMINAL_MISMATCH();
error REDEEM_TO_ZERO_ADDRESS();
error TERMINAL_TOKENS_INCOMPATIBLE();
uint256 internal constant _FEE_CAP = 50_000_000;
uint256 internal constant _FEE_BENEFICIARY_PROJECT_ID = 1;
mapping(uint256 => JBFee[]) internal _heldFeesOf;
IJBProjects public immutable override projects;
IJBDirectory public immutable override directory;
IJBSplitsStore public immutable override splitsStore;
IJBPrices public immutable override prices;
address public immutable override store;
uint256 public immutable override baseWeightCurrency;
uint256 public immutable override payoutSplitsGroup;
uint256 public override fee = 25_000_000;
address public override feeGauge;
mapping(address => bool) public override isFeelessAddress;
function currentEthOverflowOf(
uint256 _projectId
) external view virtual override returns (uint256) {
uint256 _overflow = IJBSingleTokenPaymentTerminalStore3_1_1(store).currentOverflowOf(
this,
_projectId
);
uint256 _adjustedOverflow = (decimals == 18)
? _overflow
: JBFixedPointNumber.adjustDecimals(_overflow, decimals, 18);
return
(currency == JBCurrencies.ETH)
? _adjustedOverflow
: PRBMath.mulDiv(
_adjustedOverflow,
10 ** decimals,
prices.priceFor(currency, JBCurrencies.ETH, decimals)
);
}
function heldFeesOf(uint256 _projectId) external view override returns (JBFee[] memory) {
return _heldFeesOf[_projectId];
}
function supportsInterface(
bytes4 _interfaceId
) public view virtual override(JBSingleTokenPaymentTerminal, IERC165) returns (bool) {
return
_interfaceId == type(IJBPayoutRedemptionPaymentTerminal3_1_1).interfaceId ||
_interfaceId == type(IJBPayoutRedemptionPaymentTerminal3_1).interfaceId ||
_interfaceId == type(IJBPayoutTerminal3_1).interfaceId ||
_interfaceId == type(IJBAllowanceTerminal3_1).interfaceId ||
_interfaceId == type(IJBRedemptionTerminal).interfaceId ||
_interfaceId == type(IJBOperatable).interfaceId ||
super.supportsInterface(_interfaceId);
}
function _balance() internal view virtual returns (uint256);
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)
{
baseWeightCurrency = _baseWeightCurrency;
payoutSplitsGroup = _payoutSplitsGroup;
projects = _projects;
directory = _directory;
splitsStore = _splitsStore;
prices = _prices;
store = _store;
transferOwnership(_owner);
}
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) {
_token;
if (token != JBTokens.ETH) {
if (msg.value != 0) revert NO_MSG_VALUE_ALLOWED();
uint256 _balanceBefore = _balance();
_transferFrom(msg.sender, payable(address(this)), _amount);
_amount = _balance() - _balanceBefore;
}
else _amount = msg.value;
return
_pay(
_amount,
msg.sender,
_projectId,
_beneficiary,
_minReturnedTokens,
_preferClaimedTokens,
_memo,
_metadata
);
}
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)
{
_token;
return
_redeemTokensOf(
_holder,
_projectId,
_tokenCount,
_minReturnedTokens,
_beneficiary,
_memo,
_metadata
);
}
function distributePayoutsOf(
uint256 _projectId,
uint256 _amount,
uint256 _currency,
address _token,
uint256 _minReturnedTokens,
bytes calldata _metadata
) external virtual override returns (uint256 netLeftoverDistributionAmount) {
_token;
return _distributePayoutsOf(_projectId, _amount, _currency, _minReturnedTokens, _metadata);
}
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)
{
_token;
return
_useAllowanceOf(
_projectId,
_amount,
_currency,
_minReturnedTokens,
_beneficiary,
_memo,
_metadata
);
}
function migrate(
uint256 _projectId,
IJBPaymentTerminal _to
)
external
virtual
override
requirePermission(projects.ownerOf(_projectId), _projectId, JBOperations.MIGRATE_TERMINAL)
returns (uint256 balance)
{
if (!_to.acceptsToken(token, _projectId)) revert TERMINAL_TOKENS_INCOMPATIBLE();
balance = IJBSingleTokenPaymentTerminalStore3_1_1(store).recordMigration(_projectId);
if (balance != 0) {
_beforeTransferTo(address(_to), balance);
uint256 _payableValue = token == JBTokens.ETH ? balance : 0;
_to.addToBalanceOf{value: _payableValue}(_projectId, balance, token, '', bytes(''));
}
emit Migrate(_projectId, _to, balance, msg.sender);
}
function addToBalanceOf(
uint256 _projectId,
uint256 _amount,
address _token,
string calldata _memo,
bytes calldata _metadata
) external payable virtual override {
addToBalanceOf(_projectId, _amount, _token, false, _memo, _metadata);
}
function processFees(
uint256 _projectId
)
external
virtual
override
requirePermissionAllowingOverride(
projects.ownerOf(_projectId),
_projectId,
JBOperations.PROCESS_FEES,
msg.sender == owner()
)
{
JBFee[] memory _heldFees = _heldFeesOf[_projectId];
delete _heldFeesOf[_projectId];
uint256 _heldFeeLength = _heldFees.length;
uint256 _amount;
for (uint256 _i; _i < _heldFeeLength; ) {
_amount = (
_heldFees[_i].fee == 0 || _heldFees[_i].feeDiscount == JBConstants.MAX_FEE_DISCOUNT
? 0
: JBFees.feeIn(_heldFees[_i].amount, _heldFees[_i].fee, _heldFees[_i].feeDiscount)
);
_processFee(_amount, _heldFees[_i].beneficiary, _projectId);
emit ProcessFee(_projectId, _amount, true, _heldFees[_i].beneficiary, msg.sender);
unchecked {
++_i;
}
}
}
function setFee(uint256 _fee) external virtual override onlyOwner {
if (_fee > _FEE_CAP) revert FEE_TOO_HIGH();
fee = _fee;
emit SetFee(_fee, msg.sender);
}
function setFeeGauge(address _feeGauge) external virtual override onlyOwner {
feeGauge = _feeGauge;
emit SetFeeGauge(_feeGauge, msg.sender);
}
function setFeelessAddress(address _address, bool _flag) external virtual override onlyOwner {
isFeelessAddress[_address] = _flag;
emit SetFeelessAddress(_address, _flag, msg.sender);
}
function addToBalanceOf(
uint256 _projectId,
uint256 _amount,
address _token,
bool _shouldRefundHeldFees,
string calldata _memo,
bytes calldata _metadata
) public payable virtual override {
_token;
if (token != JBTokens.ETH) {
if (msg.value != 0) revert NO_MSG_VALUE_ALLOWED();
uint256 _balanceBefore = _balance();
_transferFrom(msg.sender, payable(address(this)), _amount);
_amount = _balance() - _balanceBefore;
}
else _amount = msg.value;
_addToBalanceOf(_projectId, _amount, _shouldRefundHeldFees, _memo, _metadata);
}
function _transferFrom(address _from, address payable _to, uint256 _amount) internal virtual {
_from;
_to;
_amount;
}
function _beforeTransferTo(address _to, uint256 _amount) internal virtual {
_to;
_amount;
}
function _cancelTransferTo(address _to, uint256 _amount) internal virtual {
_to;
_amount;
}
function _redeemTokensOf(
address _holder,
uint256 _projectId,
uint256 _tokenCount,
uint256 _minReturnedTokens,
address payable _beneficiary,
string memory _memo,
bytes memory _metadata
) internal returns (uint256 reclaimAmount) {
if (_beneficiary == address(0)) revert REDEEM_TO_ZERO_ADDRESS();
JBFundingCycle memory _fundingCycle;
{
uint256 _feeEligibleDistributionAmount;
uint256 _feeDiscount;
uint256 _feePercent = fee;
{
JBRedemptionDelegateAllocation3_1_1[] memory _delegateAllocations;
(
_fundingCycle,
reclaimAmount,
_delegateAllocations,
_memo
) = IJBSingleTokenPaymentTerminalStore3_1_1(store).recordRedemptionFor(
_holder,
_projectId,
_tokenCount,
_memo,
_metadata
);
_feeDiscount = isFeelessAddress[_beneficiary] ||
(_fundingCycle.redemptionRate() == JBConstants.MAX_REDEMPTION_RATE &&
_fundingCycle.ballotRedemptionRate() == JBConstants.MAX_REDEMPTION_RATE) ||
_feePercent == 0
? JBConstants.MAX_FEE_DISCOUNT
: _currentFeeDiscount(_projectId, JBFeeType.REDEMPTION);
if (reclaimAmount < _minReturnedTokens) revert INADEQUATE_RECLAIM_AMOUNT();
if (_tokenCount != 0)
IJBController(directory.controllerOf(_projectId)).burnTokensOf(
_holder,
_projectId,
_tokenCount,
'',
false
);
if (_delegateAllocations.length != 0) {
JBDidRedeemData3_1_1 memory _data = JBDidRedeemData3_1_1(
_holder,
_projectId,
_fundingCycle.configuration,
_tokenCount,
JBTokenAmount(token, reclaimAmount, decimals, currency),
JBTokenAmount(token, 0, decimals, currency),
_beneficiary,
_memo,
bytes(''),
_metadata
);
JBRedemptionDelegateAllocation3_1_1 memory _delegateAllocation;
uint256 _delegatedAmountFee;
uint256 _numDelegates = _delegateAllocations.length;
for (uint256 _i; _i < _numDelegates; ) {
_delegateAllocation = _delegateAllocations[_i];
_delegatedAmountFee = _feePercent == 0
? 0
: JBFees.feeIn(_delegateAllocation.amount, _feePercent, _feeDiscount);
if (_delegatedAmountFee != 0) {
_feeEligibleDistributionAmount += _delegateAllocation.amount;
_delegateAllocation.amount -= _delegatedAmountFee;
}
_beforeTransferTo(address(_delegateAllocation.delegate), _delegateAllocation.amount);
_data.forwardedAmount.value = _delegateAllocation.amount;
_data.dataSourceMetadata = _delegateAllocation.metadata;
_delegateAllocation.delegate.didRedeem{
value: token == JBTokens.ETH ? _delegateAllocation.amount : 0
}(_data);
emit DelegateDidRedeem(
_delegateAllocation.delegate,
_data,
_delegateAllocation.amount,
_delegatedAmountFee,
msg.sender
);
unchecked {
++_i;
}
}
}
}
if (reclaimAmount != 0) {
uint256 _reclaimAmountFee = _feeDiscount == JBConstants.MAX_FEE_DISCOUNT
? 0
: JBFees.feeIn(reclaimAmount, _feePercent, _feeDiscount);
if (_reclaimAmountFee != 0) {
_feeEligibleDistributionAmount += reclaimAmount;
reclaimAmount -= _reclaimAmountFee;
}
if (reclaimAmount != 0) _transferFrom(address(this), _beneficiary, reclaimAmount);
}
_feeEligibleDistributionAmount != 0
? _takeFeeFrom(
_projectId,
false,
_feeEligibleDistributionAmount,
_feePercent,
_beneficiary,
_feeDiscount
)
: 0;
}
emit RedeemTokens(
_fundingCycle.configuration,
_fundingCycle.number,
_projectId,
_holder,
_beneficiary,
_tokenCount,
reclaimAmount,
_memo,
_metadata,
msg.sender
);
}
function _distributePayoutsOf(
uint256 _projectId,
uint256 _amount,
uint256 _currency,
uint256 _minReturnedTokens,
bytes calldata _metadata
) internal returns (uint256 netLeftoverDistributionAmount) {
(
JBFundingCycle memory _fundingCycle,
uint256 _distributedAmount
) = IJBSingleTokenPaymentTerminalStore3_1_1(store).recordDistributionFor(
_projectId,
_amount,
_currency
);
if (_distributedAmount < _minReturnedTokens) revert INADEQUATE_DISTRIBUTION_AMOUNT();
address payable _projectOwner = payable(projects.ownerOf(_projectId));
uint256 _feeTaken;
{
uint256 _feePercent = fee;
uint256 _feeDiscount = _feePercent == 0
? JBConstants.MAX_FEE_DISCOUNT
: _currentFeeDiscount(_projectId, JBFeeType.PAYOUT);
uint256 _feeEligibleDistributionAmount;
uint256 _leftoverDistributionAmount;
(_leftoverDistributionAmount, _feeEligibleDistributionAmount) = _distributeToPayoutSplitsOf(
_projectId,
_fundingCycle.configuration,
payoutSplitsGroup,
_distributedAmount,
_feePercent,
_feeDiscount
);
if (_feeDiscount != JBConstants.MAX_FEE_DISCOUNT) {
unchecked {
_feeEligibleDistributionAmount += _leftoverDistributionAmount;
}
}
_feeTaken = _feeEligibleDistributionAmount != 0
? _takeFeeFrom(
_projectId,
_fundingCycle.shouldHoldFees(),
_feeEligibleDistributionAmount,
_feePercent,
_projectOwner,
_feeDiscount
)
: 0;
if (_leftoverDistributionAmount != 0) {
netLeftoverDistributionAmount =
_leftoverDistributionAmount -
(
_feeDiscount == JBConstants.MAX_FEE_DISCOUNT
? 0
: JBFees.feeIn(_leftoverDistributionAmount, _feePercent, _feeDiscount)
);
_transferFrom(address(this), _projectOwner, netLeftoverDistributionAmount);
}
}
emit DistributePayouts(
_fundingCycle.configuration,
_fundingCycle.number,
_projectId,
_projectOwner,
_amount,
_distributedAmount,
_feeTaken,
netLeftoverDistributionAmount,
_metadata,
msg.sender
);
}
function _useAllowanceOf(
uint256 _projectId,
uint256 _amount,
uint256 _currency,
uint256 _minReturnedTokens,
address payable _beneficiary,
string memory _memo,
bytes calldata _metadata
) internal returns (uint256 netDistributedAmount) {
(
JBFundingCycle memory _fundingCycle,
uint256 _distributedAmount
) = IJBSingleTokenPaymentTerminalStore3_1_1(store).recordUsedAllowanceOf(
_projectId,
_amount,
_currency
);
if (_distributedAmount < _minReturnedTokens) revert INADEQUATE_DISTRIBUTION_AMOUNT();
{
uint256 _feeTaken;
uint256 _feePercent = fee;
address _projectOwner = projects.ownerOf(_projectId);
uint256 _feeDiscount = _feePercent == 0 || isFeelessAddress[msg.sender]
? JBConstants.MAX_FEE_DISCOUNT
: _currentFeeDiscount(_projectId, JBFeeType.ALLOWANCE);
_feeTaken = _feeDiscount == JBConstants.MAX_FEE_DISCOUNT
? 0
: _takeFeeFrom(
_projectId,
_fundingCycle.shouldHoldFees(),
_distributedAmount,
_feePercent,
_projectOwner,
_feeDiscount
);
unchecked {
netDistributedAmount = _distributedAmount - _feeTaken;
}
if (netDistributedAmount != 0)
_transferFrom(address(this), _beneficiary, netDistributedAmount);
}
emit UseAllowance(
_fundingCycle.configuration,
_fundingCycle.number,
_projectId,
_beneficiary,
_amount,
_distributedAmount,
netDistributedAmount,
_memo,
_metadata,
msg.sender
);
}
function _distributeToPayoutSplitsOf(
uint256 _projectId,
uint256 _domain,
uint256 _group,
uint256 _amount,
uint256 _feePercent,
uint256 _feeDiscount
) internal returns (uint256, uint256 feeEligibleDistributionAmount) {
uint256 _leftoverPercentage = JBConstants.SPLITS_TOTAL_PERCENT;
JBSplit[] memory _splits = splitsStore.splitsOf(_projectId, _domain, _group);
JBSplit memory _split;
for (uint256 _i; _i < _splits.length; ) {
_split = _splits[_i];
uint256 _payoutAmount = PRBMath.mulDiv(_amount, _split.percent, _leftoverPercentage);
uint256 _netPayoutAmount = _distributeToPayoutSplit(
_split,
_projectId,
_group,
_payoutAmount,
_feePercent,
_feeDiscount
);
if (_netPayoutAmount != 0 && _netPayoutAmount != _payoutAmount)
feeEligibleDistributionAmount += _payoutAmount;
if (_payoutAmount != 0) {
unchecked {
_amount -= _payoutAmount;
}
}
unchecked {
_leftoverPercentage -= _split.percent;
}
emit DistributeToPayoutSplit(
_projectId,
_domain,
_group,
_split,
_payoutAmount,
_netPayoutAmount,
msg.sender
);
unchecked {
++_i;
}
}
return (_amount, feeEligibleDistributionAmount);
}
function _distributeToPayoutSplit(
JBSplit memory _split,
uint256 _projectId,
uint256 _group,
uint256 _amount,
uint256 _feePercent,
uint256 _feeDiscount
) internal returns (uint256 netPayoutAmount) {
netPayoutAmount = _amount;
if (_split.allocator != IJBSplitAllocator(address(0))) {
if (
_feeDiscount != JBConstants.MAX_FEE_DISCOUNT && !isFeelessAddress[address(_split.allocator)]
) {
unchecked {
netPayoutAmount -= JBFees.feeIn(_amount, _feePercent, _feeDiscount);
}
}
_beforeTransferTo(address(_split.allocator), netPayoutAmount);
JBSplitAllocationData memory _data = JBSplitAllocationData(
token,
netPayoutAmount,
decimals,
_projectId,
_group,
_split
);
bytes memory _reason;
if (
ERC165Checker.supportsInterface(
address(_split.allocator),
type(IJBSplitAllocator).interfaceId
)
)
try
_split.allocator.allocate{value: token == JBTokens.ETH ? netPayoutAmount : 0}(_data)
{} catch (bytes memory __reason) {
_reason = __reason.length == 0 ? abi.encode('Allocate fail') : __reason;
}
else {
_reason = abi.encode('IERC165 fail');
}
if (_reason.length != 0) {
_revertTransferFrom(_projectId, address(_split.allocator), netPayoutAmount, _amount);
netPayoutAmount = 0;
emit PayoutReverted(_projectId, _split, _amount, _reason, msg.sender);
}
} else if (_split.projectId != 0) {
IJBPaymentTerminal _terminal = directory.primaryTerminalOf(_split.projectId, token);
if (_terminal == IJBPaymentTerminal(address(0))) {
netPayoutAmount = 0;
_revertTransferFrom(_projectId, address(0), 0, _amount);
emit PayoutReverted(_projectId, _split, _amount, 'Terminal not found', msg.sender);
} else {
if (
_terminal != this &&
_feeDiscount != JBConstants.MAX_FEE_DISCOUNT &&
!isFeelessAddress[address(_terminal)]
) {
unchecked {
netPayoutAmount -= JBFees.feeIn(_amount, _feePercent, _feeDiscount);
}
}
_beforeTransferTo(address(_terminal), netPayoutAmount);
if (_split.preferAddToBalance)
try
_terminal.addToBalanceOf{value: token == JBTokens.ETH ? netPayoutAmount : 0}(
_split.projectId,
netPayoutAmount,
token,
'',
bytes(abi.encodePacked(_projectId))
)
{} catch (bytes memory _reason) {
_revertTransferFrom(_projectId, address(_terminal), netPayoutAmount, _amount);
netPayoutAmount = 0;
emit PayoutReverted(_projectId, _split, _amount, _reason, msg.sender);
}
else
try
_terminal.pay{value: token == JBTokens.ETH ? netPayoutAmount : 0}(
_split.projectId,
netPayoutAmount,
token,
_split.beneficiary != address(0) ? _split.beneficiary : msg.sender,
0,
_split.preferClaimed,
'',
bytes(abi.encodePacked(_projectId))
)
{} catch (bytes memory _reason) {
_revertTransferFrom(_projectId, address(_terminal), netPayoutAmount, _amount);
netPayoutAmount = 0;
emit PayoutReverted(_projectId, _split, _amount, _reason, msg.sender);
}
}
} else {
if (_feeDiscount != JBConstants.MAX_FEE_DISCOUNT) {
unchecked {
netPayoutAmount -= JBFees.feeIn(_amount, _feePercent, _feeDiscount);
}
}
_transferFrom(
address(this),
_split.beneficiary != address(0) ? _split.beneficiary : payable(msg.sender),
netPayoutAmount
);
}
}
function _takeFeeFrom(
uint256 _projectId,
bool _shouldHoldFees,
uint256 _amount,
uint256 _feePercent,
address _beneficiary,
uint256 _feeDiscount
) internal returns (uint256 feeAmount) {
feeAmount = JBFees.feeIn(_amount, _feePercent, _feeDiscount);
if (_shouldHoldFees) {
_heldFeesOf[_projectId].push(
JBFee(_amount, uint32(_feePercent), uint32(_feeDiscount), _beneficiary)
);
emit HoldFee(_projectId, _amount, _feePercent, _feeDiscount, _beneficiary, msg.sender);
} else {
_processFee(feeAmount, _beneficiary, _projectId);
emit ProcessFee(_projectId, feeAmount, false, _beneficiary, msg.sender);
}
}
function _processFee(uint256 _amount, address _beneficiary, uint256 _from) internal {
IJBPaymentTerminal _terminal = directory.primaryTerminalOf(_FEE_BENEFICIARY_PROJECT_ID, token);
if (address(_terminal) != address(this)) _beforeTransferTo(address(_terminal), _amount);
try
_terminal.pay{value: token == JBTokens.ETH ? _amount : 0}(
_FEE_BENEFICIARY_PROJECT_ID,
_amount,
token,
_beneficiary,
0,
false,
'',
bytes(abi.encodePacked(_from))
)
{} catch (bytes memory _reason) {
_revertTransferFrom(
_from,
address(_terminal) != address(this) ? address(_terminal) : address(0),
address(_terminal) != address(this) ? _amount : 0,
_amount
);
emit FeeReverted(_from, _FEE_BENEFICIARY_PROJECT_ID, _amount, _reason, msg.sender);
}
}
function _revertTransferFrom(
uint256 _projectId,
address _expectedDestination,
uint256 _allowanceAmount,
uint256 _depositAmount
) internal {
if (_allowanceAmount != 0) _cancelTransferTo(_expectedDestination, _allowanceAmount);
IJBSingleTokenPaymentTerminalStore3_1_1(store).recordAddedBalanceFor(
_projectId,
_depositAmount
);
}
function _pay(
uint256 _amount,
address _payer,
uint256 _projectId,
address _beneficiary,
uint256 _minReturnedTokens,
bool _preferClaimedTokens,
string memory _memo,
bytes memory _metadata
) internal returns (uint256 beneficiaryTokenCount) {
if (_beneficiary == address(0)) revert PAY_TO_ZERO_ADDRESS();
JBFundingCycle memory _fundingCycle;
{
JBPayDelegateAllocation3_1_1[] memory _delegateAllocations;
uint256 _tokenCount;
JBTokenAmount memory _bundledAmount = JBTokenAmount(token, _amount, decimals, currency);
(
_fundingCycle,
_tokenCount,
_delegateAllocations,
_memo
) = IJBSingleTokenPaymentTerminalStore3_1_1(store).recordPaymentFrom(
_payer,
_bundledAmount,
_projectId,
baseWeightCurrency,
_beneficiary,
_memo,
_metadata
);
if (_tokenCount != 0)
beneficiaryTokenCount = IJBController(directory.controllerOf(_projectId)).mintTokensOf(
_projectId,
_tokenCount,
_beneficiary,
'',
_preferClaimedTokens,
true
);
if (beneficiaryTokenCount < _minReturnedTokens) revert INADEQUATE_TOKEN_COUNT();
if (_delegateAllocations.length != 0) {
JBDidPayData3_1_1 memory _data = JBDidPayData3_1_1(
_payer,
_projectId,
_fundingCycle.configuration,
_bundledAmount,
JBTokenAmount(token, 0, decimals, currency),
beneficiaryTokenCount,
_beneficiary,
_preferClaimedTokens,
_memo,
bytes(''),
_metadata
);
uint256 _numDelegates = _delegateAllocations.length;
JBPayDelegateAllocation3_1_1 memory _delegateAllocation;
for (uint256 _i; _i < _numDelegates; ) {
_delegateAllocation = _delegateAllocations[_i];
_beforeTransferTo(address(_delegateAllocation.delegate), _delegateAllocation.amount);
_data.forwardedAmount.value = _delegateAllocation.amount;
_data.dataSourceMetadata = _delegateAllocation.metadata;
_delegateAllocation.delegate.didPay{
value: token == JBTokens.ETH ? _delegateAllocation.amount : 0
}(_data);
emit DelegateDidPay(
_delegateAllocation.delegate,
_data,
_delegateAllocation.amount,
msg.sender
);
unchecked {
++_i;
}
}
}
}
emit Pay(
_fundingCycle.configuration,
_fundingCycle.number,
_projectId,
_payer,
_beneficiary,
_amount,
beneficiaryTokenCount,
_memo,
_metadata,
msg.sender
);
}
function _addToBalanceOf(
uint256 _projectId,
uint256 _amount,
bool _shouldRefundHeldFees,
string memory _memo,
bytes memory _metadata
) internal {
uint256 _refundedFees = _shouldRefundHeldFees ? _refundHeldFees(_projectId, _amount) : 0;
IJBSingleTokenPaymentTerminalStore3_1_1(store).recordAddedBalanceFor(
_projectId,
_amount + _refundedFees
);
emit AddToBalance(_projectId, _amount, _refundedFees, _memo, _metadata, msg.sender);
}
function _refundHeldFees(
uint256 _projectId,
uint256 _amount
) internal returns (uint256 refundedFees) {
JBFee[] memory _heldFees = _heldFeesOf[_projectId];
delete _heldFeesOf[_projectId];
uint256 leftoverAmount = _amount;
uint256 _heldFeesLength = _heldFees.length;
for (uint256 _i; _i < _heldFeesLength; ) {
if (leftoverAmount == 0) {
_heldFeesOf[_projectId].push(_heldFees[_i]);
} else {
uint256 _feeAmount = (
_heldFees[_i].fee == 0 || _heldFees[_i].feeDiscount == JBConstants.MAX_FEE_DISCOUNT
? 0
: JBFees.feeIn(_heldFees[_i].amount, _heldFees[_i].fee, _heldFees[_i].feeDiscount)
);
if (leftoverAmount >= _heldFees[_i].amount - _feeAmount) {
unchecked {
leftoverAmount = leftoverAmount - (_heldFees[_i].amount - _feeAmount);
refundedFees += _feeAmount;
}
} else {
_feeAmount = (
_heldFees[_i].fee == 0 || _heldFees[_i].feeDiscount == JBConstants.MAX_FEE_DISCOUNT
? 0
: JBFees.feeFrom(leftoverAmount, _heldFees[_i].fee, _heldFees[_i].feeDiscount)
);
unchecked {
_heldFeesOf[_projectId].push(
JBFee(
_heldFees[_i].amount - (leftoverAmount + _feeAmount),
_heldFees[_i].fee,
_heldFees[_i].feeDiscount,
_heldFees[_i].beneficiary
)
);
refundedFees += _feeAmount;
}
leftoverAmount = 0;
}
}
unchecked {
++_i;
}
}
emit RefundHeldFees(_projectId, _amount, refundedFees, leftoverAmount, msg.sender);
}
function _currentFeeDiscount(
uint256 _projectId,
JBFeeType _feeType
) internal view returns (uint256) {
if (
directory.primaryTerminalOf(_FEE_BENEFICIARY_PROJECT_ID, token) ==
IJBPaymentTerminal(address(0))
) return JBConstants.MAX_FEE_DISCOUNT;
if (feeGauge != address(0))
try IJBFeeGauge3_1(feeGauge).currentDiscountFor(_projectId, _feeType) returns (
uint256 discount
) {
if (discount <= JBConstants.MAX_FEE_DISCOUNT) return discount;
} catch {
return 0;
}
return 0;
}
}
文件 61 的 70:JBProjectMetadata.sol
pragma solidity ^0.8.0;
struct JBProjectMetadata {
string content;
uint256 domain;
}
文件 62 的 70:JBRedemptionDelegateAllocation3_1_1.sol
pragma solidity ^0.8.0;
import {IJBRedemptionDelegate3_1_1} from '../interfaces/IJBRedemptionDelegate3_1_1.sol';
struct JBRedemptionDelegateAllocation3_1_1 {
IJBRedemptionDelegate3_1_1 delegate;
uint256 amount;
bytes metadata;
}
文件 63 的 70:JBSingleTokenPaymentTerminal.sol
pragma solidity ^0.8.16;
import {ERC165} from '@openzeppelin/contracts/utils/introspection/ERC165.sol';
import {IERC165} from '@openzeppelin/contracts/utils/introspection/ERC165.sol';
import {IJBPaymentTerminal} from './../interfaces/IJBPaymentTerminal.sol';
import {IJBSingleTokenPaymentTerminal} from './../interfaces/IJBSingleTokenPaymentTerminal.sol';
abstract contract JBSingleTokenPaymentTerminal is ERC165, IJBSingleTokenPaymentTerminal {
address public immutable override token;
uint256 public immutable override decimals;
uint256 public immutable override currency;
function acceptsToken(address _token, uint256 _projectId) external view override returns (bool) {
_projectId;
return _token == token;
}
function decimalsForToken(address _token) external view override returns (uint256) {
_token;
return decimals;
}
function currencyForToken(address _token) external view override returns (uint256) {
_token;
return currency;
}
function supportsInterface(
bytes4 _interfaceId
) public view virtual override(ERC165, IERC165) returns (bool) {
return
_interfaceId == type(IJBPaymentTerminal).interfaceId ||
_interfaceId == type(IJBSingleTokenPaymentTerminal).interfaceId ||
super.supportsInterface(_interfaceId);
}
constructor(address _token, uint256 _decimals, uint256 _currency) {
token = _token;
decimals = _decimals;
currency = _currency;
}
}
文件 64 的 70:JBSplit.sol
pragma solidity ^0.8.0;
import {IJBSplitAllocator} from './../interfaces/IJBSplitAllocator.sol';
struct JBSplit {
bool preferClaimed;
bool preferAddToBalance;
uint256 percent;
uint256 projectId;
address payable beneficiary;
uint256 lockedUntil;
IJBSplitAllocator allocator;
}
文件 65 的 70:JBSplitAllocationData.sol
pragma solidity ^0.8.0;
import {JBSplit} from './JBSplit.sol';
struct JBSplitAllocationData {
address token;
uint256 amount;
uint256 decimals;
uint256 projectId;
uint256 group;
JBSplit split;
}
文件 66 的 70:JBSplitsGroups.sol
pragma solidity ^0.8.0;
library JBSplitsGroups {
uint256 public constant ETH_PAYOUT = 1;
uint256 public constant RESERVED_TOKENS = 2;
}
文件 67 的 70:JBTokenAmount.sol
pragma solidity ^0.8.0;
struct JBTokenAmount {
address token;
uint256 value;
uint256 decimals;
uint256 currency;
}
文件 68 的 70:JBTokens.sol
pragma solidity ^0.8.0;
library JBTokens {
address public constant ETH = address(0x000000000000000000000000000000000000EEEe);
}
文件 69 的 70:Ownable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_transferOwnership(_msgSender());
}
function owner() public view virtual returns (address) {
return _owner;
}
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
文件 70 的 70:PRBMath.sol
pragma solidity >=0.8.4;
import "prb-math/contracts/PRBMath.sol";
{
"compilationTarget": {
"contracts/JBETHPaymentTerminal3_1_2.sol": "JBETHPaymentTerminal3_1_2"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"uint256","name":"_baseWeightCurrency","type":"uint256"},{"internalType":"contract IJBOperatorStore","name":"_operatorStore","type":"address"},{"internalType":"contract IJBProjects","name":"_projects","type":"address"},{"internalType":"contract IJBDirectory","name":"_directory","type":"address"},{"internalType":"contract IJBSplitsStore","name":"_splitsStore","type":"address"},{"internalType":"contract IJBPrices","name":"_prices","type":"address"},{"internalType":"address","name":"_store","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"FEE_TOO_HIGH","type":"error"},{"inputs":[],"name":"INADEQUATE_DISTRIBUTION_AMOUNT","type":"error"},{"inputs":[],"name":"INADEQUATE_RECLAIM_AMOUNT","type":"error"},{"inputs":[],"name":"INADEQUATE_TOKEN_COUNT","type":"error"},{"inputs":[],"name":"NO_MSG_VALUE_ALLOWED","type":"error"},{"inputs":[],"name":"PAY_TO_ZERO_ADDRESS","type":"error"},{"inputs":[{"internalType":"uint256","name":"prod1","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"PRBMath__MulDivOverflow","type":"error"},{"inputs":[],"name":"PROJECT_TERMINAL_MISMATCH","type":"error"},{"inputs":[],"name":"REDEEM_TO_ZERO_ADDRESS","type":"error"},{"inputs":[],"name":"TERMINAL_TOKENS_INCOMPATIBLE","type":"error"},{"inputs":[],"name":"UNAUTHORIZED","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"refundedFees","type":"uint256"},{"indexed":false,"internalType":"string","name":"memo","type":"string"},{"indexed":false,"internalType":"bytes","name":"metadata","type":"bytes"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"AddToBalance","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IJBPayDelegate3_1_1","name":"delegate","type":"address"},{"components":[{"internalType":"address","name":"payer","type":"address"},{"internalType":"uint256","name":"projectId","type":"uint256"},{"internalType":"uint256","name":"currentFundingCycleConfiguration","type":"uint256"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"uint256","name":"currency","type":"uint256"}],"internalType":"struct JBTokenAmount","name":"amount","type":"tuple"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"uint256","name":"currency","type":"uint256"}],"internalType":"struct JBTokenAmount","name":"forwardedAmount","type":"tuple"},{"internalType":"uint256","name":"projectTokenCount","type":"uint256"},{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"bool","name":"preferClaimedTokens","type":"bool"},{"internalType":"string","name":"memo","type":"string"},{"internalType":"bytes","name":"dataSourceMetadata","type":"bytes"},{"internalType":"bytes","name":"payerMetadata","type":"bytes"}],"indexed":false,"internalType":"struct JBDidPayData3_1_1","name":"data","type":"tuple"},{"indexed":false,"internalType":"uint256","name":"delegatedAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"DelegateDidPay","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IJBPayDelegate","name":"delegate","type":"address"},{"components":[{"internalType":"address","name":"payer","type":"address"},{"internalType":"uint256","name":"projectId","type":"uint256"},{"internalType":"uint256","name":"currentFundingCycleConfiguration","type":"uint256"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"uint256","name":"currency","type":"uint256"}],"internalType":"struct JBTokenAmount","name":"amount","type":"tuple"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"uint256","name":"currency","type":"uint256"}],"internalType":"struct JBTokenAmount","name":"forwardedAmount","type":"tuple"},{"internalType":"uint256","name":"projectTokenCount","type":"uint256"},{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"bool","name":"preferClaimedTokens","type":"bool"},{"internalType":"string","name":"memo","type":"string"},{"internalType":"bytes","name":"metadata","type":"bytes"}],"indexed":false,"internalType":"struct JBDidPayData","name":"data","type":"tuple"},{"indexed":false,"internalType":"uint256","name":"delegatedAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"DelegateDidPay","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IJBRedemptionDelegate3_1_1","name":"delegate","type":"address"},{"components":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"uint256","name":"projectId","type":"uint256"},{"internalType":"uint256","name":"currentFundingCycleConfiguration","type":"uint256"},{"internalType":"uint256","name":"projectTokenCount","type":"uint256"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"uint256","name":"currency","type":"uint256"}],"internalType":"struct JBTokenAmount","name":"reclaimedAmount","type":"tuple"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"uint256","name":"currency","type":"uint256"}],"internalType":"struct JBTokenAmount","name":"forwardedAmount","type":"tuple"},{"internalType":"address payable","name":"beneficiary","type":"address"},{"internalType":"string","name":"memo","type":"string"},{"internalType":"bytes","name":"dataSourceMetadata","type":"bytes"},{"internalType":"bytes","name":"redeemerMetadata","type":"bytes"}],"indexed":false,"internalType":"struct JBDidRedeemData3_1_1","name":"data","type":"tuple"},{"indexed":false,"internalType":"uint256","name":"delegatedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"DelegateDidRedeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IJBRedemptionDelegate","name":"delegate","type":"address"},{"components":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"uint256","name":"projectId","type":"uint256"},{"internalType":"uint256","name":"currentFundingCycleConfiguration","type":"uint256"},{"internalType":"uint256","name":"projectTokenCount","type":"uint256"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"uint256","name":"currency","type":"uint256"}],"internalType":"struct JBTokenAmount","name":"reclaimedAmount","type":"tuple"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"uint256","name":"currency","type":"uint256"}],"internalType":"struct JBTokenAmount","name":"forwardedAmount","type":"tuple"},{"internalType":"address payable","name":"beneficiary","type":"address"},{"internalType":"string","name":"memo","type":"string"},{"internalType":"bytes","name":"metadata","type":"bytes"}],"indexed":false,"internalType":"struct JBDidRedeemData","name":"data","type":"tuple"},{"indexed":false,"internalType":"uint256","name":"delegatedAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"DelegateDidRedeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fundingCycleConfiguration","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"fundingCycleNumber","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"},{"indexed":false,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"distributedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"beneficiaryDistributionAmount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"metadata","type":"bytes"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"DistributePayouts","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"domain","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"group","type":"uint256"},{"components":[{"internalType":"bool","name":"preferClaimed","type":"bool"},{"internalType":"bool","name":"preferAddToBalance","type":"bool"},{"internalType":"uint256","name":"percent","type":"uint256"},{"internalType":"uint256","name":"projectId","type":"uint256"},{"internalType":"address payable","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"lockedUntil","type":"uint256"},{"internalType":"contract IJBSplitAllocator","name":"allocator","type":"address"}],"indexed":false,"internalType":"struct JBSplit","name":"split","type":"tuple"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"netAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"DistributeToPayoutSplit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"feeProjectId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"reason","type":"bytes"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"FeeReverted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeDiscount","type":"uint256"},{"indexed":false,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"HoldFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"},{"indexed":true,"internalType":"contract IJBPaymentTerminal","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"Migrate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fundingCycleConfiguration","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"fundingCycleNumber","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"},{"indexed":false,"internalType":"address","name":"payer","type":"address"},{"indexed":false,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"beneficiaryTokenCount","type":"uint256"},{"indexed":false,"internalType":"string","name":"memo","type":"string"},{"indexed":false,"internalType":"bytes","name":"metadata","type":"bytes"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"Pay","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"},{"components":[{"internalType":"bool","name":"preferClaimed","type":"bool"},{"internalType":"bool","name":"preferAddToBalance","type":"bool"},{"internalType":"uint256","name":"percent","type":"uint256"},{"internalType":"uint256","name":"projectId","type":"uint256"},{"internalType":"address payable","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"lockedUntil","type":"uint256"},{"internalType":"contract IJBSplitAllocator","name":"allocator","type":"address"}],"indexed":false,"internalType":"struct JBSplit","name":"split","type":"tuple"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"reason","type":"bytes"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"PayoutReverted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"bool","name":"wasHeld","type":"bool"},{"indexed":false,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"ProcessFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fundingCycleConfiguration","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"fundingCycleNumber","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"},{"indexed":false,"internalType":"address","name":"holder","type":"address"},{"indexed":false,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenCount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reclaimedAmount","type":"uint256"},{"indexed":false,"internalType":"string","name":"memo","type":"string"},{"indexed":false,"internalType":"bytes","name":"metadata","type":"bytes"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"RedeemTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"refundedFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"leftoverAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"RefundHeldFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"SetFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"feeGauge","type":"address"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"SetFeeGauge","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addrs","type":"address"},{"indexed":true,"internalType":"bool","name":"flag","type":"bool"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"SetFeelessAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fundingCycleConfiguration","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"fundingCycleNumber","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"},{"indexed":false,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"distributedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"netDistributedamount","type":"uint256"},{"indexed":false,"internalType":"string","name":"memo","type":"string"},{"indexed":false,"internalType":"bytes","name":"metadata","type":"bytes"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"UseAllowance","type":"event"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"acceptsToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"string","name":"_memo","type":"string"},{"internalType":"bytes","name":"_metadata","type":"bytes"}],"name":"addToBalanceOf","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"bool","name":"_shouldRefundHeldFees","type":"bool"},{"internalType":"string","name":"_memo","type":"string"},{"internalType":"bytes","name":"_metadata","type":"bytes"}],"name":"addToBalanceOf","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"baseWeightCurrency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"currencyForToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"currentEthOverflowOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"decimalsForToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"directory","outputs":[{"internalType":"contract IJBDirectory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_currency","type":"uint256"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_minReturnedTokens","type":"uint256"},{"internalType":"bytes","name":"_metadata","type":"bytes"}],"name":"distributePayoutsOf","outputs":[{"internalType":"uint256","name":"netLeftoverDistributionAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeGauge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"heldFeesOf","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint32","name":"fee","type":"uint32"},{"internalType":"uint32","name":"feeDiscount","type":"uint32"},{"internalType":"address","name":"beneficiary","type":"address"}],"internalType":"struct JBFee[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeelessAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"contract IJBPaymentTerminal","name":"_to","type":"address"}],"name":"migrate","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"operatorStore","outputs":[{"internalType":"contract IJBOperatorStore","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_minReturnedTokens","type":"uint256"},{"internalType":"bool","name":"_preferClaimedTokens","type":"bool"},{"internalType":"string","name":"_memo","type":"string"},{"internalType":"bytes","name":"_metadata","type":"bytes"}],"name":"pay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"payoutSplitsGroup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prices","outputs":[{"internalType":"contract IJBPrices","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"processFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"projects","outputs":[{"internalType":"contract IJBProjects","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"},{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"uint256","name":"_tokenCount","type":"uint256"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_minReturnedTokens","type":"uint256"},{"internalType":"address payable","name":"_beneficiary","type":"address"},{"internalType":"string","name":"_memo","type":"string"},{"internalType":"bytes","name":"_metadata","type":"bytes"}],"name":"redeemTokensOf","outputs":[{"internalType":"uint256","name":"reclaimAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeGauge","type":"address"}],"name":"setFeeGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_flag","type":"bool"}],"name":"setFeelessAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"splitsStore","outputs":[{"internalType":"contract IJBSplitsStore","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"store","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_currency","type":"uint256"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_minReturnedTokens","type":"uint256"},{"internalType":"address payable","name":"_beneficiary","type":"address"},{"internalType":"string","name":"_memo","type":"string"},{"internalType":"bytes","name":"_metadata","type":"bytes"}],"name":"useAllowanceOf","outputs":[{"internalType":"uint256","name":"netDistributedAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]