Skip to content

Commit

Permalink
feat: added _skipFees function
Browse files Browse the repository at this point in the history
  • Loading branch information
capedcrusader21 committed Oct 3, 2023
1 parent 66498c1 commit e9d46e3
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 24 deletions.
30 changes: 29 additions & 1 deletion packages/marketplace/contracts/exchange/Exchange.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

pragma solidity 0.8.21;

import {ERC165Upgradeable, IERC165Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol";
import {AccessControlUpgradeable} from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol";
import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import {ContextUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol";
import {ERC2771HandlerUpgradeable} from "@sandbox-smart-contracts/dependency-metatx/contracts/ERC2771HandlerUpgradeable.sol";
Expand All @@ -15,7 +17,14 @@ import {ExchangeCore} from "./ExchangeCore.sol";
/// @notice Used to exchange assets, that is, tokens.
/// @dev Main functions are in ExchangeCore
/// @dev TransferManager is used to execute token transfers
contract Exchange is Initializable, ExchangeCore, TransferManager, ERC2771HandlerUpgradeable {
contract Exchange is
Initializable,
ERC165Upgradeable,
AccessControlUpgradeable,
ExchangeCore,
TransferManager,
ERC2771HandlerUpgradeable
{
/// @notice role erc1776 trusted meta transaction contracts (Sand for example).
/// @return hash for ERC1776_OPERATOR_ROLE
bytes32 public constant ERC1776_OPERATOR_ROLE = keccak256("ERC1776_OPERATOR_ROLE");
Expand All @@ -24,6 +33,10 @@ contract Exchange is Initializable, ExchangeCore, TransferManager, ERC2771Handle
/// @return hash for EXCHANGE_ADMIN_ROLE
bytes32 public constant EXCHANGE_ADMIN_ROLE = keccak256("EXCHANGE_ADMIN_ROLE");

/// @notice role to identify the sandbox accounts
/// @return hash for SKIP_FEES_ROLE
bytes32 public constant SKIP_FEES_ROLE = keccak256("SKIP_FEES_ROLE");

/// @dev this protects the implementation contract from being initialized.
/// @custom:oz-upgrades-unsafe-allow constructor
constructor() {
Expand Down Expand Up @@ -58,6 +71,7 @@ contract Exchange is Initializable, ExchangeCore, TransferManager, ERC2771Handle
newRoyaltiesProvider
);
__ExchangeCoreInitialize(orderValidatorAddress, newAssetMatcher);
__AccessControl_init();
_grantRole(DEFAULT_ADMIN_ROLE, admin);
}

Expand Down Expand Up @@ -125,6 +139,10 @@ contract Exchange is Initializable, ExchangeCore, TransferManager, ERC2771Handle
_setDefaultFeeReceiver(newDefaultFeeReceiver);
}

function _skipFees(address from) internal view override returns (bool) {
return !hasRole(SKIP_FEES_ROLE, from);
}

function _msgSender()
internal
view
Expand All @@ -138,4 +156,14 @@ contract Exchange is Initializable, ExchangeCore, TransferManager, ERC2771Handle
function _msgData() internal view override(ContextUpgradeable, ERC2771HandlerUpgradeable) returns (bytes calldata) {
return ERC2771HandlerUpgradeable._msgData();
}

/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(
bytes4 interfaceId
) public view virtual override(ERC165Upgradeable, AccessControlUpgradeable) returns (bool) {
return
ERC165Upgradeable.supportsInterface(interfaceId) || AccessControlUpgradeable.supportsInterface(interfaceId);
}
}
2 changes: 2 additions & 0 deletions packages/marketplace/contracts/mocks/SimpleTest.sol
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,6 @@ contract SimpleTest is TransferManager, TransferExecutor {
function getRoyaltiesByAssetTest(LibAsset.AssetType memory matchNft) external returns (LibPart.Part[] memory) {
return getRoyaltiesByAssetType(matchNft);
}

function _skipFees(address from) internal virtual override returns (bool) {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
pragma solidity 0.8.21;

import {ERC165Upgradeable, IERC165Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol";
import {AccessControlUpgradeable} from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol";
import {IRoyaltiesProvider} from "../interfaces/IRoyaltiesProvider.sol";
import {BpLibrary} from "../lib-bp/BpLibrary.sol";
import {IRoyaltyUGC} from "./interfaces/IRoyaltyUGC.sol";
Expand All @@ -15,15 +14,11 @@ import {LibPart} from "../lib-part/LibPart.sol";
/// @notice responsible for transferring all Assets
/// @dev this manager supports different types of fees
/// @dev also it supports different beneficiaries
abstract contract TransferManager is ERC165Upgradeable, AccessControlUpgradeable, ITransferManager {
abstract contract TransferManager is ERC165Upgradeable, ITransferManager {
using BpLibrary for uint;

bytes4 internal constant INTERFACE_ID_IROYALTYUGC = 0xa30b4db9;

/// @notice role to identify the sandbox accounts
/// @return hash for TSB_WALLET
bytes32 public constant TSB_WALLET = keccak256("TSB_WALLET");

/// @notice fee for primary sales
/// @return uint256 of primary sale fee
uint256 public protocolFeePrimary;
Expand Down Expand Up @@ -66,8 +61,6 @@ abstract contract TransferManager is ERC165Upgradeable, AccessControlUpgradeable
IRoyaltiesProvider newRoyaltiesProvider
) internal onlyInitializing {
__ERC165_init();
__AccessControl_init();
_grantRole(DEFAULT_ADMIN_ROLE, _msgSender());
_setProtocolFee(newProtocolFeePrimary, newProtocolFeeSecondary);
_setRoyaltiesRegistry(newRoyaltiesProvider);
_setDefaultFeeReceiver(newDefaultFeeReceiver);
Expand Down Expand Up @@ -129,7 +122,7 @@ abstract contract TransferManager is ERC165Upgradeable, AccessControlUpgradeable
function doTransfersWithFees(LibDeal.DealSide memory paymentSide, LibDeal.DealSide memory nftSide) internal {
uint256 rest = paymentSide.asset.value;

if (!hasRole(TSB_WALLET, paymentSide.from)) {
if (_skipFees(paymentSide.from)) {
rest = transferRoyalties(
paymentSide.asset.assetType,
nftSide.asset.assetType,
Expand Down Expand Up @@ -323,15 +316,7 @@ abstract contract TransferManager is ERC165Upgradeable, AccessControlUpgradeable
}
}

/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(
bytes4 interfaceId
) public view virtual override(ERC165Upgradeable, AccessControlUpgradeable) returns (bool) {
return
ERC165Upgradeable.supportsInterface(interfaceId) || AccessControlUpgradeable.supportsInterface(interfaceId);
}
function _skipFees(address from) internal virtual returns (bool);

uint256[46] private __gap;
}
11 changes: 6 additions & 5 deletions packages/marketplace/test/exchange/Exchange.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -849,6 +849,7 @@ describe('Exchange.sol', function () {
ERC721WithRoyaltyV2981,
defaultFeeReceiver,
deployer,
admin,
user1: maker,
user2: taker,
} = await loadFixture(deployFixtures);
Expand All @@ -865,11 +866,11 @@ describe('Exchange.sol', function () {
// set up receiver
await ERC721WithRoyaltyV2981.setRoyaltiesReceiver(1, deployer.address);

// grant TSB Wallet role to seller
const TSB_WALLET =
'0x1c3ffa8a78d1cdbeb9812a2ae7c540d20292531d0254f9ac1fa85e0ac44b9ad0'; // keccak256("TSB_WALLET")
await ExchangeContractAsDeployer.connect(deployer).grantRole(
TSB_WALLET,
// grant Skip Fees role to seller
const SKIP_FEES_ROLE =
'0x9c14d84aa0a4264a5c33560cb08e43e3ed227d0565fa3d19078d0f01304516eb'; // keccak256("SKIP_FEES_ROLE")
await ExchangeContractAsDeployer.connect(admin).grantRole(
SKIP_FEES_ROLE,
taker.address
);

Expand Down

1 comment on commit e9d46e3

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Coverage for this commit

75.18%

Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
packages/marketplace/contracts/exchange
   AssetMatcher.sol100%100%100%100%
   Exchange.sol87.27%85%86.67%90%157, 65, 90, 90–91
   ExchangeCore.sol78.76%59.09%100%89.66%116, 139–140, 140, 140, 140, 140, 143, 143, 204–205, 207–208, 245, 247–249, 255–257, 280–281, 298, 76
   OrderValidator.sol69.81%53.85%100%81.82%38, 54, 61–62, 62, 62, 72, 82–83, 88, 90, 90, 90, 90–91, 93
   WhiteList.sol97.73%93.75%100%100%57
packages/marketplace/contracts/exchange/libraries
   LibFill.sol55%33.33%66.67%63.64%48–49, 61, 71–72, 72, 72–73
   LibOrderDataGeneric.sol22.81%22.22%40%20.59%16–23, 25–26, 28, 41, 43, 43, 43–44, 46–47, 50, 50, 50–51, 53, 56, 56, 56–57, 59, 62, 66, 68, 68, 68–70, 73, 82, 82, 82–84
packages/marketplace/contracts/interfaces
   IAssetMatcher.sol100%100%100%100%
   IOrderValidator.sol100%100%100%100%
   IRoyaltiesProvider.sol100%100%100%100%
   IWhiteList.sol100%100%100%100%
packages/marketplace/contracts/lib-asset
   LibAsset.sol100%100%100%100%
packages/marketplace/contracts/lib-bp
   BpLibrary.sol100%100%100%100%
packages/marketplace/contracts/lib-order
   LibMath.sol27.50%18.75%50%30%100–103, 17–18, 33–34, 50, 50, 50–51, 72, 72, 72–73, 75, 88, 88, 88–89, 93, 93, 93, 93, 93, 97
   LibOrder.sol66.67%50%100%72.73%105, 105, 107, 107, 41–43, 54, 66
   LibOrderData.sol100%100%100%100%
packages/marketplace/contracts/lib-part
   LibPart.sol0%100%0%0%21
packages/marketplace/contracts/royalties
   IERC2981.sol100%100%100%100%
   LibRoyalties2981.sol78.57%50%100%88.89%19–20, 23
packages/marketplace/contracts/royalties-registry
   IMultiRoyaltyRecipients.sol100%100%100%100%
   RoyaltiesRegistry.sol79.20%79.41%100%75%166–167, 170–171, 212, 216, 232–233, 236–244, 247, 247, 247–248, 250, 256, 259, 276, 60
packages/marketplace/contracts/transfer-manager
   TransferExecutor.sol75.76%64.29%100%81.25%49–51, 58–59, 63, 66–67
   TransferManager.sol82.91%72.41%100%87.50%110, 114–115, 203, 210–211, 211, 211–212, 216, 256, 273, 277–279, 279, 279–281, 286–287, 310, 314–315, 62, 82–83
packages/marketplace/contracts/transfer-manager/interfaces
   IRoyaltyUGC.sol100%100%100%100%
   ITransferExecutor.sol100%100%100%100%
   ITransferManager.sol100%100%100%100%
packages/marketplace/contracts/transfer-manager/lib
   LibDeal.sol100%100%100%100%
   LibFeeSide.sol44.44%37.50%100%44.44%21, 24, 24, 24–25, 27, 27, 27–28, 30
   LibTransfer.sol0%0%0%0%7–8, 8, 8

Please sign in to comment.