interface IJBPayoutRedemptionPaymentTerminal is
  IJBPaymentTerminal,
  IJBPayoutTerminal,
  IJBAllowanceTerminal,
  IJBRedemptionTerminal
{
  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,
    string memo,
    address caller
  );
  event UseAllowance(
    uint256 indexed fundingCycleConfiguration,
    uint256 indexed fundingCycleNumber,
    uint256 indexed projectId,
    address beneficiary,
    uint256 amount,
    uint256 distributedAmount,
    uint256 netDistributedamount,
    string memo,
    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,
    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, address caller);
  event RedeemTokens(
    uint256 indexed fundingCycleConfiguration,
    uint256 indexed fundingCycleNumber,
    uint256 indexed projectId,
    address holder,
    address beneficiary,
    uint256 tokenCount,
    uint256 reclaimedAmount,
    string memo,
    address caller
  );
  event DelegateDidRedeem(
    IJBRedemptionDelegate indexed delegate,
    JBDidRedeemData data,
    address caller
  );
  event DistributeToPayoutSplit(
    uint256 indexed projectId,
    uint256 indexed domain,
    uint256 indexed group,
    JBSplit split,
    uint256 amount,
    address caller
  );
  event SetFee(uint256 fee, address caller);
  event SetFeeGauge(IJBFeeGauge indexed feeGauge, address caller);
  event SetFeelessAddress(address indexed addrs, bool indexed flag, 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 (IJBSingleTokenPaymentTerminalStore);
  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 (IJBFeeGauge);
  function isFeelessTerminal(IJBPaymentTerminal _terminal) 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(IJBFeeGauge _feeGauge) external;
  function setFeelessAddress(address _address, bool _flag) external;
}