From 4963d5687082d318120c4fe4c6f4624b8ed11cfa Mon Sep 17 00:00:00 2001 From: SevenSwen Date: Thu, 30 Jan 2025 12:26:18 +0700 Subject: [PATCH] add _getFeeAmounts --- contracts/extensions/FeeTaker.sol | 30 +++++++++++++++++++----------- package.json | 2 +- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/contracts/extensions/FeeTaker.sol b/contracts/extensions/FeeTaker.sol index 829dbf7d..85bb1f71 100644 --- a/contracts/extensions/FeeTaker.sol +++ b/contracts/extensions/FeeTaker.sol @@ -132,18 +132,8 @@ contract FeeTaker is IPostInteraction, AmountGetterWithFee, Ownable { receiver = address(bytes20(extraData)); extraData = extraData[20:]; } - (bool isWhitelisted, uint256 integratorFee, uint256 integratorShare, uint256 resolverFee, bytes calldata tail) = _parseFeeData(extraData, taker, _isWhitelistedPostInteractionImpl); - if (!isWhitelisted && _ACCESS_TOKEN.balanceOf(taker) == 0) revert OnlyWhitelistOrAccessToken(); - uint256 integratorFeeAmount; - uint256 protocolFeeAmount; - - { - uint256 denominator = _BASE_1E5 + integratorFee + resolverFee; - uint256 integratorFeeTotal = Math.mulDiv(takingAmount, integratorFee, denominator); - integratorFeeAmount = Math.mulDiv(integratorFeeTotal, integratorShare, _BASE_1E2); - protocolFeeAmount = Math.mulDiv(takingAmount, resolverFee, denominator) + integratorFeeTotal - integratorFeeAmount; - } + (uint256 integratorFeeAmount, uint256 protocolFeeAmount, bytes calldata tail) = _getFeeAmounts(taker, takingAmount, extraData); if (order.receiver.get() == address(this)) { if (order.takerAsset.get() == address(_WETH) && order.makerTraits.unwrapWeth()) { @@ -181,6 +171,24 @@ contract FeeTaker is IPostInteraction, AmountGetterWithFee, Ownable { return _isWhitelistedGetterImpl(whitelistData, taker); } + /** + * @dev Calculates fee amounts depending on whether the taker is in the whitelist and whether they have an _ACCESS_TOKEN. + * Override this function if the calculation of integratorFee and protocolFee differs from the existing logic and requires a different parsing of extraData. + */ + function _getFeeAmounts(address taker, uint256 takingAmount, bytes calldata extraData) internal virtual returns (uint256 integratorFeeAmount, uint256 protocolFeeAmount, bytes calldata tail) { + bool isWhitelisted; + uint256 integratorFee; + uint256 integratorShare; + uint256 resolverFee; + (isWhitelisted, integratorFee, integratorShare, resolverFee, tail) = _parseFeeData(extraData, taker, _isWhitelistedPostInteractionImpl); + if (!isWhitelisted && _ACCESS_TOKEN.balanceOf(taker) == 0) revert OnlyWhitelistOrAccessToken(); + + uint256 denominator = _BASE_1E5 + integratorFee + resolverFee; + uint256 integratorFeeTotal = Math.mulDiv(takingAmount, integratorFee, denominator); + integratorFeeAmount = Math.mulDiv(integratorFeeTotal, integratorShare, _BASE_1E2); + protocolFeeAmount = Math.mulDiv(takingAmount, resolverFee, denominator) + integratorFeeTotal - integratorFeeAmount; + } + function _sendEth(address target, uint256 amount) private { (bool success, ) = target.call{value: amount}(""); if (!success) { diff --git a/package.json b/package.json index ef57251f..d23449d0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@1inch/limit-order-protocol-contract", - "version": "4.2.2", + "version": "4.2.3", "description": "1inch Limit Order Protocol", "repository": { "type": "git",