From 7cc3756776db7b335ab8a035ee54f791345cc1f3 Mon Sep 17 00:00:00 2001 From: Andrew Dmytrenko Date: Fri, 5 Jan 2024 16:46:17 +0200 Subject: [PATCH 1/8] use IFundsManager instead of collateral type --- .../CollateralProvider/CollateralProvider.sol | 15 ++++++++------- .../RefundProvider/RefundProvider.sol | 8 ++++---- .../RefundProvider/RefundState.sol | 8 +++++--- contracts/interfaces/IFundsManager.sol | 7 +++++-- contracts/mock/MockProvider.sol | 2 +- contracts/mock/MockTransfer.sol | 1 - 6 files changed, 23 insertions(+), 18 deletions(-) diff --git a/contracts/AdvancedProviders/CollateralProvider/CollateralProvider.sol b/contracts/AdvancedProviders/CollateralProvider/CollateralProvider.sol index d363bad4..3ad7a684 100644 --- a/contracts/AdvancedProviders/CollateralProvider/CollateralProvider.sol +++ b/contracts/AdvancedProviders/CollateralProvider/CollateralProvider.sol @@ -1,13 +1,13 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import "../../interfaces/IFundsManager.sol"; import "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol"; import "./CollateralState.sol"; import "../../util/CalcUtils.sol"; +import "../../interfaces/IFundsManager.sol"; import "@ironblocks/firewall-consumer/contracts/FirewallConsumer.sol"; -contract CollateralProvider is IFundsManager, ERC721Holder, CollateralState, FirewallConsumer { +contract CollateralProvider is ERC721Holder, CollateralState, FirewallConsumer, IFundsManager { using CalcUtils for uint256; ///@dev withdraw tokens @@ -36,10 +36,7 @@ contract CollateralProvider is IFundsManager, ERC721Holder, CollateralState, Fir /// @param params[0] = token amount /// @param params[params.length - 2] = main coin amount /// @param params[params.length - 1] = FinishTime - function _registerPool(uint256 poolId, uint256[] calldata params) - internal - firewallProtectedSig(0x8b60dedb) - { + function _registerPool(uint256 poolId, uint256[] calldata params) internal firewallProtectedSig(0x8b60dedb) { uint256 tokenAmount = params[0]; uint256 mainCoinAmount = params[params.length - 2]; uint256 finishTime = params[params.length - 1]; @@ -141,4 +138,8 @@ contract CollateralProvider is IFundsManager, ERC721Holder, CollateralState, Fir params[0] += amount; provider.registerPool(poolId, params); } -} \ No newline at end of file + + function getProvider() external view returns (ISimpleProvider) { + return provider; + } +} diff --git a/contracts/AdvancedProviders/RefundProvider/RefundProvider.sol b/contracts/AdvancedProviders/RefundProvider/RefundProvider.sol index 390a7b4f..9c6c8605 100644 --- a/contracts/AdvancedProviders/RefundProvider/RefundProvider.sol +++ b/contracts/AdvancedProviders/RefundProvider/RefundProvider.sol @@ -10,7 +10,7 @@ contract RefundProvider is RefundState, IERC721Receiver, FirewallConsumer { constructor(ILockDealNFT nftContract, address provider) { require(address(nftContract) != address(0x0) && provider != address(0x0), "invalid address"); lockDealNFT = nftContract; - collateralProvider = CollateralProvider(provider); + collateralProvider = IFundsManager(provider); name = "RefundProvider"; } @@ -24,8 +24,8 @@ contract RefundProvider is RefundState, IERC721Receiver, FirewallConsumer { require(msg.sender == address(lockDealNFT), "invalid nft contract"); if (provider == user) { uint256 collateralPoolId = poolIdToCollateralId[poolId]; - require(collateralProvider.poolIdToTime(collateralPoolId) > block.timestamp, "too late"); - ISimpleProvider dealProvider = collateralProvider.provider(); + require(collateralProvider.getParams(collateralPoolId)[2] > block.timestamp, "too late"); + ISimpleProvider dealProvider = collateralProvider.getProvider(); uint256 userDataPoolId = poolId + 1; // user withdraws his tokens and will receives refund uint256 amount = dealProvider.getParams(userDataPoolId)[0]; @@ -133,7 +133,7 @@ contract RefundProvider is RefundState, IERC721Receiver, FirewallConsumer { uint256 userDataPoolId = poolId + 1; IProvider provider = lockDealNFT.poolIdToProvider(userDataPoolId); amountToBeWithdrawed = provider.getWithdrawableAmount(userDataPoolId); - if (collateralProvider.poolIdToTime(poolIdToCollateralId[poolId]) >= block.timestamp) { + if (collateralProvider.getParams(poolIdToCollateralId[poolId])[1] >= block.timestamp) { collateralProvider.handleWithdraw(poolIdToCollateralId[poolId], amountToBeWithdrawed); } isFinal = provider.getParams(userDataPoolId)[0] == amountToBeWithdrawed; diff --git a/contracts/AdvancedProviders/RefundProvider/RefundState.sol b/contracts/AdvancedProviders/RefundProvider/RefundState.sol index 8b74f3ba..2ef78204 100644 --- a/contracts/AdvancedProviders/RefundProvider/RefundState.sol +++ b/contracts/AdvancedProviders/RefundProvider/RefundState.sol @@ -1,13 +1,15 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import "../CollateralProvider/CollateralProvider.sol"; +import "../../interfaces/IFundsManager.sol"; +import "../../SimpleProviders/Provider/ProviderModifiers.sol"; +import "../../util/CalcUtils.sol"; import "../../interfaces/IInnerWithdraw.sol"; abstract contract RefundState is ProviderModifiers, IInnerWithdraw, IERC165 { using CalcUtils for uint256; - CollateralProvider public collateralProvider; + IFundsManager public collateralProvider; mapping(uint256 => uint256) public poolIdToCollateralId; ///@return params params [0] = tokenLeftAmount; - user(poolId + 1) data @@ -18,7 +20,7 @@ abstract contract RefundState is ProviderModifiers, IInnerWithdraw, IERC165 { params = new uint256[](2); uint256 tokenAmount = dataParams[0]; uint256 collateralPoolId = poolIdToCollateralId[poolId]; - uint256 rateToWei = collateralProvider.poolIdToRateToWei(collateralPoolId); + uint256 rateToWei = collateralProvider.getParams(collateralPoolId)[2]; params[0] = tokenAmount; params[1] = tokenAmount.calcAmount(rateToWei); } diff --git a/contracts/interfaces/IFundsManager.sol b/contracts/interfaces/IFundsManager.sol index b736a956..cbc2c37d 100644 --- a/contracts/interfaces/IFundsManager.sol +++ b/contracts/interfaces/IFundsManager.sol @@ -1,7 +1,10 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -interface IFundsManager { +import "./ISimpleProvider.sol"; + +interface IFundsManager is IProvider { function handleWithdraw(uint256 poolId, uint256 tokenAmount) external; function handleRefund(uint256 poolId, address user, uint256 tokenAmount) external; -} \ No newline at end of file + function getProvider() external view returns (ISimpleProvider); +} diff --git a/contracts/mock/MockProvider.sol b/contracts/mock/MockProvider.sol index 9da85ff7..1d58d819 100644 --- a/contracts/mock/MockProvider.sol +++ b/contracts/mock/MockProvider.sol @@ -6,7 +6,7 @@ import "../interfaces/IFundsManager.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; /// @dev MockProvider is a contract for testing purposes. -contract MockProvider is IFundsManager { +contract MockProvider { IProvider public _provider; ILockDealNFT public lockDealNFT; diff --git a/contracts/mock/MockTransfer.sol b/contracts/mock/MockTransfer.sol index f76849cb..09a0240e 100644 --- a/contracts/mock/MockTransfer.sol +++ b/contracts/mock/MockTransfer.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.0; import "../SimpleProviders/DealProvider/DealProvider.sol"; -import "../interfaces/IFundsManager.sol"; import "../interfaces/IBeforeTransfer.sol"; contract MockTransfer is IBeforeTransfer, DealProvider { From 8e97bedaf8f353d7b7b5ba82db500db631461195 Mon Sep 17 00:00:00 2001 From: Andrew Dmytrenko Date: Fri, 5 Jan 2024 17:29:28 +0200 Subject: [PATCH 2/8] remove getProvider --- .../CollateralProvider/CollateralProvider.sol | 8 ++------ .../AdvancedProviders/RefundProvider/RefundProvider.sol | 3 ++- contracts/interfaces/IFundsManager.sol | 1 - 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/contracts/AdvancedProviders/CollateralProvider/CollateralProvider.sol b/contracts/AdvancedProviders/CollateralProvider/CollateralProvider.sol index 3ad7a684..27e615dc 100644 --- a/contracts/AdvancedProviders/CollateralProvider/CollateralProvider.sol +++ b/contracts/AdvancedProviders/CollateralProvider/CollateralProvider.sol @@ -1,13 +1,13 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; +import "../../interfaces/IFundsManager.sol"; import "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol"; import "./CollateralState.sol"; import "../../util/CalcUtils.sol"; -import "../../interfaces/IFundsManager.sol"; import "@ironblocks/firewall-consumer/contracts/FirewallConsumer.sol"; -contract CollateralProvider is ERC721Holder, CollateralState, FirewallConsumer, IFundsManager { +contract CollateralProvider is IFundsManager, ERC721Holder, CollateralState, FirewallConsumer { using CalcUtils for uint256; ///@dev withdraw tokens @@ -138,8 +138,4 @@ contract CollateralProvider is ERC721Holder, CollateralState, FirewallConsumer, params[0] += amount; provider.registerPool(poolId, params); } - - function getProvider() external view returns (ISimpleProvider) { - return provider; - } } diff --git a/contracts/AdvancedProviders/RefundProvider/RefundProvider.sol b/contracts/AdvancedProviders/RefundProvider/RefundProvider.sol index 9c6c8605..f0bbb0bf 100644 --- a/contracts/AdvancedProviders/RefundProvider/RefundProvider.sol +++ b/contracts/AdvancedProviders/RefundProvider/RefundProvider.sol @@ -3,6 +3,7 @@ pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import "../../ERC165/Refundble.sol"; +import "../../SimpleProviders/LockProvider/LockDealState.sol"; import "./RefundState.sol"; import "@ironblocks/firewall-consumer/contracts/FirewallConsumer.sol"; @@ -25,7 +26,7 @@ contract RefundProvider is RefundState, IERC721Receiver, FirewallConsumer { if (provider == user) { uint256 collateralPoolId = poolIdToCollateralId[poolId]; require(collateralProvider.getParams(collateralPoolId)[2] > block.timestamp, "too late"); - ISimpleProvider dealProvider = collateralProvider.getProvider(); + ISimpleProvider dealProvider = LockDealState(address(collateralProvider)).provider(); uint256 userDataPoolId = poolId + 1; // user withdraws his tokens and will receives refund uint256 amount = dealProvider.getParams(userDataPoolId)[0]; diff --git a/contracts/interfaces/IFundsManager.sol b/contracts/interfaces/IFundsManager.sol index cbc2c37d..249bbb4c 100644 --- a/contracts/interfaces/IFundsManager.sol +++ b/contracts/interfaces/IFundsManager.sol @@ -6,5 +6,4 @@ import "./ISimpleProvider.sol"; interface IFundsManager is IProvider { function handleWithdraw(uint256 poolId, uint256 tokenAmount) external; function handleRefund(uint256 poolId, address user, uint256 tokenAmount) external; - function getProvider() external view returns (ISimpleProvider); } From c901e0a8cf6be49ab7edbf33405321675ffa9265 Mon Sep 17 00:00:00 2001 From: Andrew Dmytrenko Date: Mon, 8 Jan 2024 13:11:04 +0200 Subject: [PATCH 3/8] fix array index --- contracts/AdvancedProviders/RefundProvider/RefundProvider.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/AdvancedProviders/RefundProvider/RefundProvider.sol b/contracts/AdvancedProviders/RefundProvider/RefundProvider.sol index f0bbb0bf..f8690ec8 100644 --- a/contracts/AdvancedProviders/RefundProvider/RefundProvider.sol +++ b/contracts/AdvancedProviders/RefundProvider/RefundProvider.sol @@ -25,7 +25,7 @@ contract RefundProvider is RefundState, IERC721Receiver, FirewallConsumer { require(msg.sender == address(lockDealNFT), "invalid nft contract"); if (provider == user) { uint256 collateralPoolId = poolIdToCollateralId[poolId]; - require(collateralProvider.getParams(collateralPoolId)[2] > block.timestamp, "too late"); + require(collateralProvider.getParams(collateralPoolId)[1] > block.timestamp, "too late"); ISimpleProvider dealProvider = LockDealState(address(collateralProvider)).provider(); uint256 userDataPoolId = poolId + 1; // user withdraws his tokens and will receives refund From c0916edf8c13f2c07a135013a652ecd49df8ded6 Mon Sep 17 00:00:00 2001 From: Andrew Dmytrenko Date: Mon, 8 Jan 2024 15:46:40 +0200 Subject: [PATCH 4/8] use IProvider import --- contracts/interfaces/IFundsManager.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/interfaces/IFundsManager.sol b/contracts/interfaces/IFundsManager.sol index 249bbb4c..4b31c8a6 100644 --- a/contracts/interfaces/IFundsManager.sol +++ b/contracts/interfaces/IFundsManager.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import "./ISimpleProvider.sol"; +import "./IProvider.sol"; interface IFundsManager is IProvider { function handleWithdraw(uint256 poolId, uint256 tokenAmount) external; From 819d8348bc51c644920051e278a63df7bc4f9f29 Mon Sep 17 00:00:00 2001 From: Andrew Dmytrenko Date: Mon, 8 Jan 2024 15:53:27 +0200 Subject: [PATCH 5/8] use poolIdToProvider --- contracts/AdvancedProviders/RefundProvider/RefundProvider.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/AdvancedProviders/RefundProvider/RefundProvider.sol b/contracts/AdvancedProviders/RefundProvider/RefundProvider.sol index 33961ff0..791db7ee 100644 --- a/contracts/AdvancedProviders/RefundProvider/RefundProvider.sol +++ b/contracts/AdvancedProviders/RefundProvider/RefundProvider.sol @@ -29,8 +29,8 @@ contract RefundProvider is RefundState, IERC721Receiver, FirewallConsumer { collateralProvider.getParams(collateralPoolId)[1] > block.timestamp, "RefundProvider: Refund period has expired" ); - ISimpleProvider dealProvider = LockDealState(address(collateralProvider)).provider(); uint256 userDataPoolId = poolId + 1; + ISimpleProvider dealProvider = ISimpleProvider(address(lockDealNFT.poolIdToProvider(userDataPoolId))); // User receives a refund and the tokens go into the collateral pool uint256 amount = dealProvider.getParams(userDataPoolId)[0]; (uint256 withdrawnAmount, ) = dealProvider.withdraw(userDataPoolId, amount); From 06a56a502f9895032c3331c30e4df6f0d4b8e5cb Mon Sep 17 00:00:00 2001 From: Andrew Dmytrenko Date: Mon, 8 Jan 2024 16:27:05 +0200 Subject: [PATCH 6/8] use the correct dealProvider pool id --- .../AdvancedProviders/RefundProvider/RefundProvider.sol | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/contracts/AdvancedProviders/RefundProvider/RefundProvider.sol b/contracts/AdvancedProviders/RefundProvider/RefundProvider.sol index 791db7ee..66b327b6 100644 --- a/contracts/AdvancedProviders/RefundProvider/RefundProvider.sol +++ b/contracts/AdvancedProviders/RefundProvider/RefundProvider.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import "../../ERC165/Refundble.sol"; -import "../../SimpleProviders/LockProvider/LockDealState.sol"; +import "../../interfaces/ISimpleProvider.sol"; import "./RefundState.sol"; import "@ironblocks/firewall-consumer/contracts/FirewallConsumer.sol"; @@ -29,10 +29,12 @@ contract RefundProvider is RefundState, IERC721Receiver, FirewallConsumer { collateralProvider.getParams(collateralPoolId)[1] > block.timestamp, "RefundProvider: Refund period has expired" ); + ISimpleProvider dealProvider = ISimpleProvider(address(lockDealNFT.poolIdToProvider(collateralPoolId + 1))); + // user pool id can be TimedProvider, LockProvider or DealProvider uint256 userDataPoolId = poolId + 1; - ISimpleProvider dealProvider = ISimpleProvider(address(lockDealNFT.poolIdToProvider(userDataPoolId))); // User receives a refund and the tokens go into the collateral pool uint256 amount = dealProvider.getParams(userDataPoolId)[0]; + // using directly the deal provider for withdraw (uint256 withdrawnAmount, ) = dealProvider.withdraw(userDataPoolId, amount); collateralProvider.handleRefund(collateralPoolId, user, withdrawnAmount); } From 92f66c9e42e0fc313a5c976ab9438ef03e536244 Mon Sep 17 00:00:00 2001 From: Andrew Dmytrenko Date: Mon, 8 Jan 2024 17:19:09 +0200 Subject: [PATCH 7/8] RefundProvider uses isPoolFinished view --- .../CollateralProvider/CollateralProvider.sol | 3 +-- .../CollateralProvider/CollateralState.sol | 7 ++++--- .../AdvancedProviders/RefundProvider/RefundProvider.sol | 7 ++----- contracts/interfaces/IFundsManager.sol | 1 + 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/contracts/AdvancedProviders/CollateralProvider/CollateralProvider.sol b/contracts/AdvancedProviders/CollateralProvider/CollateralProvider.sol index 162b8d6b..3163408d 100644 --- a/contracts/AdvancedProviders/CollateralProvider/CollateralProvider.sol +++ b/contracts/AdvancedProviders/CollateralProvider/CollateralProvider.sol @@ -1,13 +1,12 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import "../../interfaces/IFundsManager.sol"; import "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol"; import "./CollateralState.sol"; import "../../util/CalcUtils.sol"; import "@ironblocks/firewall-consumer/contracts/FirewallConsumer.sol"; -contract CollateralProvider is IFundsManager, ERC721Holder, CollateralState, FirewallConsumer { +contract CollateralProvider is ERC721Holder, CollateralState, FirewallConsumer { using CalcUtils for uint256; ///@dev withdraw tokens diff --git a/contracts/AdvancedProviders/CollateralProvider/CollateralState.sol b/contracts/AdvancedProviders/CollateralProvider/CollateralState.sol index a10262f5..a2a27359 100644 --- a/contracts/AdvancedProviders/CollateralProvider/CollateralState.sol +++ b/contracts/AdvancedProviders/CollateralProvider/CollateralState.sol @@ -5,8 +5,9 @@ import "../../SimpleProviders/LockProvider/LockDealState.sol"; import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; import "../../SimpleProviders/Provider/ProviderModifiers.sol"; import "../../interfaces/IInnerWithdraw.sol"; +import "../../interfaces/IFundsManager.sol"; -abstract contract CollateralState is LockDealState, IInnerWithdraw, IERC165, ProviderModifiers { +abstract contract CollateralState is LockDealState, IInnerWithdraw, IFundsManager, IERC165, ProviderModifiers { mapping(uint256 => uint256) public poolIdToRateToWei; function getParams(uint256 poolId) public view override returns (uint256[] memory params) { @@ -26,7 +27,7 @@ abstract contract CollateralState is LockDealState, IInnerWithdraw, IERC165, Pro } } - function currentParamsTargetLength() public pure override returns (uint256) { + function currentParamsTargetLength() public pure override(IProvider, ProviderState) returns (uint256) { return 3; } @@ -54,7 +55,7 @@ abstract contract CollateralState is LockDealState, IInnerWithdraw, IERC165, Pro return interfaceId == type(IERC165).interfaceId || interfaceId == type(IInnerWithdraw).interfaceId; } - function getSubProvidersPoolIds(uint256 poolId) public view virtual override returns (uint256[] memory poolIds) { + function getSubProvidersPoolIds(uint256 poolId) public view virtual override(IProvider, ProviderState) returns (uint256[] memory poolIds) { if (lockDealNFT.poolIdToProvider(poolId) == this) { poolIds = new uint256[](3); (poolIds[0], poolIds[1], poolIds[2]) = getInnerIds(poolId); diff --git a/contracts/AdvancedProviders/RefundProvider/RefundProvider.sol b/contracts/AdvancedProviders/RefundProvider/RefundProvider.sol index 66b327b6..a58e7f85 100644 --- a/contracts/AdvancedProviders/RefundProvider/RefundProvider.sol +++ b/contracts/AdvancedProviders/RefundProvider/RefundProvider.sol @@ -25,10 +25,7 @@ contract RefundProvider is RefundState, IERC721Receiver, FirewallConsumer { require(msg.sender == address(lockDealNFT), "RefundProvider: invalid nft contract"); if (provider == user) { uint256 collateralPoolId = poolIdToCollateralId[poolId]; - require( - collateralProvider.getParams(collateralPoolId)[1] > block.timestamp, - "RefundProvider: Refund period has expired" - ); + require(!collateralProvider.isPoolFinished(collateralPoolId), "RefundProvider: Refund period has expired"); ISimpleProvider dealProvider = ISimpleProvider(address(lockDealNFT.poolIdToProvider(collateralPoolId + 1))); // user pool id can be TimedProvider, LockProvider or DealProvider uint256 userDataPoolId = poolId + 1; @@ -139,7 +136,7 @@ contract RefundProvider is RefundState, IERC721Receiver, FirewallConsumer { uint256 userDataPoolId = poolId + 1; IProvider provider = lockDealNFT.poolIdToProvider(userDataPoolId); amountToBeWithdrawed = provider.getWithdrawableAmount(userDataPoolId); - if (collateralProvider.getParams(poolIdToCollateralId[poolId])[1] >= block.timestamp) { + if (!collateralProvider.isPoolFinished(poolIdToCollateralId[poolId])) { collateralProvider.handleWithdraw(poolIdToCollateralId[poolId], amountToBeWithdrawed); } isFinal = provider.getParams(userDataPoolId)[0] == amountToBeWithdrawed; diff --git a/contracts/interfaces/IFundsManager.sol b/contracts/interfaces/IFundsManager.sol index 4b31c8a6..ac6c6576 100644 --- a/contracts/interfaces/IFundsManager.sol +++ b/contracts/interfaces/IFundsManager.sol @@ -6,4 +6,5 @@ import "./IProvider.sol"; interface IFundsManager is IProvider { function handleWithdraw(uint256 poolId, uint256 tokenAmount) external; function handleRefund(uint256 poolId, address user, uint256 tokenAmount) external; + function isPoolFinished(uint256 poolId) external view returns (bool); } From 1d4076095c0191c83862e1ccaee2a4a8e480aa98 Mon Sep 17 00:00:00 2001 From: Andrew Dmytrenko Date: Tue, 9 Jan 2024 13:41:46 +0200 Subject: [PATCH 8/8] use abstract contract instead interface --- .../CollateralProvider/CollateralState.sol | 10 +++++----- .../RefundProvider/RefundProvider.sol | 4 ++-- .../AdvancedProviders/RefundProvider/RefundState.sol | 4 ++-- contracts/interfaces/FundsManager.sol | 11 +++++++++++ contracts/interfaces/IFundsManager.sol | 10 ---------- contracts/mock/MockProvider.sol | 6 +++--- 6 files changed, 23 insertions(+), 22 deletions(-) create mode 100644 contracts/interfaces/FundsManager.sol delete mode 100644 contracts/interfaces/IFundsManager.sol diff --git a/contracts/AdvancedProviders/CollateralProvider/CollateralState.sol b/contracts/AdvancedProviders/CollateralProvider/CollateralState.sol index a2a27359..25773b54 100644 --- a/contracts/AdvancedProviders/CollateralProvider/CollateralState.sol +++ b/contracts/AdvancedProviders/CollateralProvider/CollateralState.sol @@ -5,9 +5,9 @@ import "../../SimpleProviders/LockProvider/LockDealState.sol"; import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; import "../../SimpleProviders/Provider/ProviderModifiers.sol"; import "../../interfaces/IInnerWithdraw.sol"; -import "../../interfaces/IFundsManager.sol"; +import "../../interfaces/FundsManager.sol"; -abstract contract CollateralState is LockDealState, IInnerWithdraw, IFundsManager, IERC165, ProviderModifiers { +abstract contract CollateralState is IInnerWithdraw, FundsManager, IERC165, ProviderModifiers { mapping(uint256 => uint256) public poolIdToRateToWei; function getParams(uint256 poolId) public view override returns (uint256[] memory params) { @@ -43,7 +43,7 @@ abstract contract CollateralState is LockDealState, IInnerWithdraw, IFundsManage if (lockDealNFT.poolIdToProvider(poolId) == this) { (uint256 mainCoinCollectorId, , uint256 mainCoinHolderId) = getInnerIds(poolId); withdrawalAmount = lockDealNFT.getWithdrawableAmount(mainCoinCollectorId); - if (poolIdToTime[poolId] <= block.timestamp) { + if (isPoolFinished(poolId)) { withdrawalAmount += lockDealNFT.getWithdrawableAmount(mainCoinHolderId); } } @@ -62,7 +62,7 @@ abstract contract CollateralState is LockDealState, IInnerWithdraw, IFundsManage } } - function isPoolFinished(uint256 poolId) public view returns (bool) { - return poolIdToTime[poolId] < block.timestamp; + function isPoolFinished(uint256 poolId) public view override returns (bool) { + return poolIdToTime[poolId] <= block.timestamp; } } diff --git a/contracts/AdvancedProviders/RefundProvider/RefundProvider.sol b/contracts/AdvancedProviders/RefundProvider/RefundProvider.sol index a58e7f85..2c8dca0f 100644 --- a/contracts/AdvancedProviders/RefundProvider/RefundProvider.sol +++ b/contracts/AdvancedProviders/RefundProvider/RefundProvider.sol @@ -11,7 +11,7 @@ contract RefundProvider is RefundState, IERC721Receiver, FirewallConsumer { constructor(ILockDealNFT nftContract, address provider) { require(address(nftContract) != address(0x0) && provider != address(0x0), "RefundProvider: invalid address"); lockDealNFT = nftContract; - collateralProvider = IFundsManager(provider); + collateralProvider = FundsManager(provider); name = "RefundProvider"; } @@ -26,7 +26,7 @@ contract RefundProvider is RefundState, IERC721Receiver, FirewallConsumer { if (provider == user) { uint256 collateralPoolId = poolIdToCollateralId[poolId]; require(!collateralProvider.isPoolFinished(collateralPoolId), "RefundProvider: Refund period has expired"); - ISimpleProvider dealProvider = ISimpleProvider(address(lockDealNFT.poolIdToProvider(collateralPoolId + 1))); + ISimpleProvider dealProvider = collateralProvider.provider(); // user pool id can be TimedProvider, LockProvider or DealProvider uint256 userDataPoolId = poolId + 1; // User receives a refund and the tokens go into the collateral pool diff --git a/contracts/AdvancedProviders/RefundProvider/RefundState.sol b/contracts/AdvancedProviders/RefundProvider/RefundState.sol index 2ef78204..435620a4 100644 --- a/contracts/AdvancedProviders/RefundProvider/RefundState.sol +++ b/contracts/AdvancedProviders/RefundProvider/RefundState.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import "../../interfaces/IFundsManager.sol"; +import "../../interfaces/FundsManager.sol"; import "../../SimpleProviders/Provider/ProviderModifiers.sol"; import "../../util/CalcUtils.sol"; import "../../interfaces/IInnerWithdraw.sol"; @@ -9,7 +9,7 @@ import "../../interfaces/IInnerWithdraw.sol"; abstract contract RefundState is ProviderModifiers, IInnerWithdraw, IERC165 { using CalcUtils for uint256; - IFundsManager public collateralProvider; + FundsManager public collateralProvider; mapping(uint256 => uint256) public poolIdToCollateralId; ///@return params params [0] = tokenLeftAmount; - user(poolId + 1) data diff --git a/contracts/interfaces/FundsManager.sol b/contracts/interfaces/FundsManager.sol new file mode 100644 index 00000000..7caff399 --- /dev/null +++ b/contracts/interfaces/FundsManager.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "./IProvider.sol"; +import "../SimpleProviders/LockProvider/LockDealState.sol"; + +abstract contract FundsManager is LockDealState, IProvider { + function handleWithdraw(uint256 poolId, uint256 tokenAmount) external virtual {} + function handleRefund(uint256 poolId, address user, uint256 tokenAmount) external virtual {} + function isPoolFinished(uint256 poolId) external view virtual returns (bool) {} +} diff --git a/contracts/interfaces/IFundsManager.sol b/contracts/interfaces/IFundsManager.sol deleted file mode 100644 index ac6c6576..00000000 --- a/contracts/interfaces/IFundsManager.sol +++ /dev/null @@ -1,10 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import "./IProvider.sol"; - -interface IFundsManager is IProvider { - function handleWithdraw(uint256 poolId, uint256 tokenAmount) external; - function handleRefund(uint256 poolId, address user, uint256 tokenAmount) external; - function isPoolFinished(uint256 poolId) external view returns (bool); -} diff --git a/contracts/mock/MockProvider.sol b/contracts/mock/MockProvider.sol index 1d58d819..9caad08a 100644 --- a/contracts/mock/MockProvider.sol +++ b/contracts/mock/MockProvider.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.0; import "../SimpleProviders/TimedDealProvider/TimedDealProvider.sol"; -import "../interfaces/IFundsManager.sol"; +import "../interfaces/FundsManager.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; /// @dev MockProvider is a contract for testing purposes. @@ -53,11 +53,11 @@ contract MockProvider { } function handleWithdraw(uint256 poolId, uint256 tokenAmount) external { - IFundsManager(address(_provider)).handleWithdraw(poolId, tokenAmount); + FundsManager(address(_provider)).handleWithdraw(poolId, tokenAmount); } function handleRefund(uint256 poolId, address user, uint256 tokenAmount) external { - IFundsManager(address(_provider)).handleRefund(poolId, user, tokenAmount); + FundsManager(address(_provider)).handleRefund(poolId, user, tokenAmount); } function registerNewRefundPool(address owner, IProvider provider) external returns (uint256 poolId) {