From 512d24df5db89f91fad99ce918a7eaf5b80a3f4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Alexandre=20Vaz=20Ferreira?= <30525975+joaoavf@users.noreply.github.com> Date: Wed, 12 Jul 2023 03:15:56 +0000 Subject: [PATCH] Adjusting gamma whitelist logic :) --- .../bridges/Gamma/GammaDepositBridge.sol | 35 ++++++++++++------- .../bridges/Gamma/interfaces/IHypervisor.sol | 3 ++ 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/contracts/bridges/Gamma/GammaDepositBridge.sol b/contracts/bridges/Gamma/GammaDepositBridge.sol index f96a95a..f7445c0 100644 --- a/contracts/bridges/Gamma/GammaDepositBridge.sol +++ b/contracts/bridges/Gamma/GammaDepositBridge.sol @@ -9,26 +9,34 @@ import "./interfaces/IHypervisorRouter.sol"; import "./interfaces/IHypervisor.sol"; contract GammaDepositBridge is IGammaDeposit { - address constant hypervisorRouterAddress = 0xe0A61107E250f8B5B24bf272baBFCf638569830C; - IHypervisorRouter constant hypervisorRouter = IHypervisorRouter(hypervisorRouterAddress); + function _approveTokens( + address hypervisorAddress, + address[] calldata tokens, + uint256[] calldata percentages) + internal returns (uint256[] memory) { + uint256 numTokens = uint256(tokens.length); + uint256[] memory amountsIn = new uint256[](numTokens); + + for (uint256 i = 0; i < tokens.length; i++) { + amountsIn[i] = IERC20(tokens[i]).balanceOf(address(this)) * percentages[i] / 100_000; + IERC20(tokens[i]).approve(hypervisorAddress, 0); + IERC20(tokens[i]).approve(hypervisorAddress, amountsIn[i]); + } + + return amountsIn; + } function deposit( address hypervisorAddress, address[] calldata tokens, uint256[] calldata percentages, uint256[4] calldata minAmountsin - ) external override { - uint256 numTokens = uint256(tokens.length); - uint256[] memory amountsIn = new uint256[](numTokens); + ) external override { + IHypervisorRouter hypervisorRouter = IHypervisorRouter(IHypervisor(hypervisorAddress).whitelistedAddress()); - for (uint256 i = 0; i < numTokens; i++) { - amountsIn[i] = IERC20(tokens[i]).balanceOf(address(this)) * percentages[i] / 100_000; - // Approve 0 first as a few ERC20 tokens are requiring this pattern. - IERC20(tokens[i]).approve(hypervisorAddress, 0); - IERC20(tokens[i]).approve(hypervisorAddress, amountsIn[i]); - } + uint256[] memory amountsIn = _approveTokens(hypervisorAddress, tokens, percentages); - (uint256 depositA, uint256 depositB) = capRatios(tokens, amountsIn, hypervisorAddress); + (uint256 depositA, uint256 depositB) = capRatios(tokens, amountsIn, hypervisorAddress, hypervisorRouter); uint256 amountOut = hypervisorRouter.deposit( depositA, @@ -64,7 +72,8 @@ contract GammaDepositBridge is IGammaDeposit { function capRatios( address[] calldata tokens, uint256[] memory amountsIn, - address hypervisorAddress + address hypervisorAddress, + IHypervisorRouter hypervisorRouter ) internal view returns (uint256, uint256) { (uint256 startA, uint256 endA) = hypervisorRouter.getDepositAmount( hypervisorAddress, diff --git a/contracts/bridges/Gamma/interfaces/IHypervisor.sol b/contracts/bridges/Gamma/interfaces/IHypervisor.sol index 6347b79..5713233 100644 --- a/contracts/bridges/Gamma/interfaces/IHypervisor.sol +++ b/contracts/bridges/Gamma/interfaces/IHypervisor.sol @@ -13,4 +13,7 @@ interface IHypervisor { function balanceOf( address account ) external view returns (uint256); + + function whitelistedAddress( + ) external view returns (address); } \ No newline at end of file