// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >=0.7.5; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; // TODO: change to import from @airdao/astra-cl-core import '@airdao/astra-cl-core/contracts/libraries/LowGasSafeMath.sol'; import './PeripheryPayments.sol'; import '../interfaces/IPeripheryPaymentsWithFee.sol'; import '../interfaces/external/ISAMB.sol'; import '../libraries/TransferHelper.sol'; abstract contract PeripheryPaymentsWithFee is PeripheryPayments, IPeripheryPaymentsWithFee { using LowGasSafeMath for uint256; /// @inheritdoc IPeripheryPaymentsWithFee function unwrapSAMBWithFee( uint256 amountMinimum, address recipient, uint256 feeBips, address feeRecipient ) public payable override { require(feeBips > 0 && feeBips <= 100); uint256 balanceSAMB = ISAMB(SAMB).balanceOf(address(this)); require(balanceSAMB >= amountMinimum, 'Insufficient SAMB'); if (balanceSAMB > 0) { ISAMB(SAMB).withdraw(balanceSAMB); uint256 feeAmount = balanceSAMB.mul(feeBips) / 10_000; if (feeAmount > 0) TransferHelper.safeTransferAMB(feeRecipient, feeAmount); TransferHelper.safeTransferAMB(recipient, balanceSAMB - feeAmount); } } /// @inheritdoc IPeripheryPaymentsWithFee function sweepTokenWithFee( address token, uint256 amountMinimum, address recipient, uint256 feeBips, address feeRecipient ) public payable override { require(feeBips > 0 && feeBips <= 100); uint256 balanceToken = IERC20(token).balanceOf(address(this)); require(balanceToken >= amountMinimum, 'Insufficient token'); if (balanceToken > 0) { uint256 feeAmount = balanceToken.mul(feeBips) / 10_000; if (feeAmount > 0) TransferHelper.safeTransfer(token, feeRecipient, feeAmount); TransferHelper.safeTransfer(token, recipient, balanceToken - feeAmount); } } }