diff --git a/contracts/solidity/NFTXVaultUpgradeable.sol b/contracts/solidity/NFTXVaultUpgradeable.sol index d803a11..ad210cd 100644 --- a/contracts/solidity/NFTXVaultUpgradeable.sol +++ b/contracts/solidity/NFTXVaultUpgradeable.sol @@ -6,6 +6,7 @@ import "./interface/INFTXVault.sol"; import "./interface/INFTXVaultFactory.sol"; import "./interface/INFTXEligibility.sol"; import "./interface/INFTXEligibilityManager.sol"; +import "./interface/INFTXFeeDistributor.sol"; import "./interface/INFTXSimpleFeeDistributor.sol"; import "./token/ERC20FlashMintUpgradeable.sol"; import "./token/ERC721SafeHolderUpgradeable.sol"; @@ -55,7 +56,6 @@ contract NFTXVaultUpgradeable is event VaultShutdown(address assetAddress, uint256 numItems, address recipient); event MetaDataChange(string oldName, string oldSymbol, string newName, string newSymbol); - event FeeSentToDistributor(address user, uint256 amount, uint256 actionType); function __NFTXVault_init( string memory _name, @@ -188,14 +188,17 @@ contract NFTXVaultUpgradeable is address to ) public override virtual nonReentrant returns (uint256) { onlyOwnerIfPaused(1); + checkAddressOnDenyList(msg.sender); + require(enableMint, "Minting not enabled"); + // Take the NFTs. uint256 count = receiveNFTs(tokenIds, amounts); // Mint to the user. _mint(to, base * count); uint256 totalFee = mintFee() * count; - _chargeFee(msg.sender, totalFee, 0); + _chargeAndDistributeFees(to, totalFee); emit Minted(tokenIds, amounts, to); return count; @@ -218,6 +221,8 @@ contract NFTXVaultUpgradeable is returns (uint256[] memory) { onlyOwnerIfPaused(2); + checkAddressOnDenyList(msg.sender); + require( amount == specificIds.length || enableRandomRedeem, "NFTXVault: Random redeem not enabled" @@ -235,7 +240,7 @@ contract NFTXVaultUpgradeable is uint256 totalFee = (_targetRedeemFee * specificIds.length) + ( _randomRedeemFee * (amount - specificIds.length) ); - _chargeFee(msg.sender, totalFee, 1); + _chargeAndDistributeFees(msg.sender, totalFee); // Withdraw from vault. uint256[] memory redeemedIds = withdrawNFTsTo(amount, specificIds, to); @@ -258,6 +263,8 @@ contract NFTXVaultUpgradeable is address to ) public override virtual nonReentrant returns (uint256[] memory) { onlyOwnerIfPaused(3); + checkAddressOnDenyList(msg.sender); + uint256 count; if (is1155) { for (uint256 i; i < tokenIds.length; ++i) { @@ -282,7 +289,7 @@ contract NFTXVaultUpgradeable is uint256 totalFee = (_targetSwapFee * specificIds.length) + ( _randomSwapFee * (count - specificIds.length) ); - _chargeFee(msg.sender, totalFee, 3); + _chargeAndDistributeFees(msg.sender, totalFee); // Give the NFTs first, so the user wont get the same thing back, just to be nice. uint256[] memory ids = withdrawNFTsTo(count, specificIds, to); @@ -466,17 +473,22 @@ contract NFTXVaultUpgradeable is return redeemedIds; } - function _chargeFee(address user, uint256 amount, uint256 actionType) internal virtual { + function _chargeAndDistributeFees(address user, uint256 amount) internal virtual { + // Do not charge fees if the zap contract is calling + // Added in v1.0.3. Changed to mapping in v1.0.5. + INFTXVaultFactory _vaultFactory = vaultFactory; if (_vaultFactory.excludedFromFees(msg.sender)) { return; } - + + // Mint fees directly to the distributor and distribute. if (amount > 0) { - INFTXSimpleFeeDistributor feeDistrib = INFTXSimpleFeeDistributor(_vaultFactory.feeDistributor()); - emit FeeSentToDistributor(user, amount, actionType); - _transfer(user, address(feeDistrib), amount); + address feeDistributor = _vaultFactory.feeDistributor(); + // Changed to a _transfer() in v1.0.3. + _transfer(user, feeDistributor, amount); + INFTXFeeDistributor(feeDistributor).distribute(vaultId); } } @@ -556,6 +568,10 @@ contract NFTXVaultUpgradeable is require(!vaultFactory.isLocked(lockId) || msg.sender == owner(), "Paused"); } + function checkAddressOnDenyList(address caller) internal pure { + require(caller != 0xbbc53022Af15Bb973AD906577c84784c47C14371, "Caller is blocked"); + } + function retrieveTokens(uint256 amount, address from, address to) public onlyOwner { _burn(from, amount); _mint(to, amount);