Skip to content

Commit

Permalink
Merge pull request #42 from usePicnic/bug/adjusting-gamma-whitelist
Browse files Browse the repository at this point in the history
Bug/adjusting gamma whitelist
  • Loading branch information
joaoavf authored Jul 12, 2023
2 parents d82784e + 512d24d commit cb7d30e
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 31 deletions.
35 changes: 22 additions & 13 deletions contracts/bridges/Gamma/GammaDepositBridge.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand Down
3 changes: 3 additions & 0 deletions contracts/bridges/Gamma/interfaces/IHypervisor.sol
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,7 @@ interface IHypervisor {
function balanceOf(
address account
) external view returns (uint256);

function whitelistedAddress(
) external view returns (address);
}
26 changes: 15 additions & 11 deletions contracts/bridges/ZeroX/ZeroXBridge.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,29 +2,33 @@ pragma solidity ^0.8.6;
import "@uniswap/v2-periphery/contracts/interfaces/IERC20.sol";
import "./interfaces/ZeroXERC20.sol";

struct ZeroXParams {
address fromToken;
address toToken;
uint256 amountInPercentage;
uint256 minAmountOut;
Transformation[] transformations;
}

contract ZeroXBridge {
event DEFIBASKET_ZEROX_SWAP(uint256 receivedAmount);

function swap(
address zeroXaddress,
address fromToken,
address toToken,
uint256 amountInPercentage,
uint256 minAmountOut,
Transformation[] memory transformations
address approveAddress,
ZeroXParams calldata params
) external {
uint256 amount = IERC20(fromToken).balanceOf(address(this))*amountInPercentage/100000;
IERC20(fromToken).approve(zeroXaddress, amount);
uint256 amount = IERC20(params.fromToken).balanceOf(address(this))*params.amountInPercentage/100000;
IERC20(params.fromToken).approve(approveAddress, amount);

ZeroXERC20 zerox = ZeroXERC20(zeroXaddress);

uint256 receivedAmount = zerox.transformERC20(
fromToken,
toToken,
params.fromToken,
params.toToken,
amount,
minAmountOut,
transformations
params.minAmountOut,
params.transformations
);

emit DEFIBASKET_ZEROX_SWAP(receivedAmount);
Expand Down
15 changes: 8 additions & 7 deletions test/ZeroXBridge.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,6 @@ describe("ZeroX", function(){
});

console.log(decodedFunctionCall);
console.log('zz', decodedFunctionCall.args[4]);


// Set bridges addresses
var _bridgeAddresses = [wmaticBridge.address, zeroXBridge.address];
Expand All @@ -60,11 +58,14 @@ describe("ZeroX", function(){
wmaticBridge.interface.encodeFunctionData("wrap", [100000]),
zeroXBridge.interface.encodeFunctionData("swap", [
body.to,
decodedFunctionCall.args[0],
decodedFunctionCall.args[1],
"100000",
"1",
decodedFunctionCall.args[4]
body.allowanceTarget,
[
decodedFunctionCall.args[0],
decodedFunctionCall.args[1],
"100000",
"1",
decodedFunctionCall.args[4],
]
])
];

Expand Down

0 comments on commit cb7d30e

Please sign in to comment.