From ade3e5c312a52f273cee3212f8342d69b0c69b79 Mon Sep 17 00:00:00 2001 From: Samyak Jain <34437877+KaymasJain@users.noreply.github.com> Date: Fri, 15 Oct 2021 04:31:34 +0530 Subject: [PATCH 1/4] added Aave flashloan connector --- .../connectors/instapool_v3/events.sol | 10 ++ .../connectors/instapool_v3/interfaces.sol | 17 +++ .../mainnet/connectors/instapool_v3/main.sol | 130 ++++++++++++++++++ .../connectors/instapool_v3/variables.sol | 17 +++ 4 files changed, 174 insertions(+) create mode 100644 contracts/mainnet/connectors/instapool_v3/events.sol create mode 100644 contracts/mainnet/connectors/instapool_v3/interfaces.sol create mode 100644 contracts/mainnet/connectors/instapool_v3/main.sol create mode 100644 contracts/mainnet/connectors/instapool_v3/variables.sol diff --git a/contracts/mainnet/connectors/instapool_v3/events.sol b/contracts/mainnet/connectors/instapool_v3/events.sol new file mode 100644 index 00000000..9fc1cd40 --- /dev/null +++ b/contracts/mainnet/connectors/instapool_v3/events.sol @@ -0,0 +1,10 @@ +pragma solidity >=0.7.0; +pragma experimental ABIEncoderV2; + +contract Events { + event LogFlashBorrow(address token, uint256 tokenAmt); + event LogFlashPayback(address token, uint256 tokenAmt); + + event LogFlashMultiBorrow(address[] token, uint256[] tokenAmts); + event LogFlashMultiPayback(address[] token, uint256[] tokenAmts); +} \ No newline at end of file diff --git a/contracts/mainnet/connectors/instapool_v3/interfaces.sol b/contracts/mainnet/connectors/instapool_v3/interfaces.sol new file mode 100644 index 00000000..89ae592a --- /dev/null +++ b/contracts/mainnet/connectors/instapool_v3/interfaces.sol @@ -0,0 +1,17 @@ +pragma solidity >=0.7.0; +pragma experimental ABIEncoderV2; + +interface InstaFlashV2Interface { + function initiateFlashLoan(address token, uint256 amt, uint route, bytes calldata data) external; + function initiateMultiFlashLoan( + address[] memory tokens_, + uint256[] memory amounts_, + uint256, + bytes calldata data + ) external; +} + +interface AccountInterface { + function enable(address) external; + function disable(address) external; +} diff --git a/contracts/mainnet/connectors/instapool_v3/main.sol b/contracts/mainnet/connectors/instapool_v3/main.sol new file mode 100644 index 00000000..a0a93e83 --- /dev/null +++ b/contracts/mainnet/connectors/instapool_v3/main.sol @@ -0,0 +1,130 @@ +pragma solidity ^0.7.0; +pragma experimental ABIEncoderV2; + +/** + * @title Instapool. + * @dev Inbuilt Flash Loan in DSA + */ + +import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; +import { Address } from "@openzeppelin/contracts/utils/Address.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { TokenInterface } from "../../common/interfaces.sol"; +import { AccountInterface } from "./interfaces.sol"; +import { DSMath } from "../../common/math.sol"; +import { Stores } from "../../common/stores.sol"; +import { Variables } from "./variables.sol"; +import { Events } from "./events.sol"; + +contract LiquidityResolver is DSMath, Stores, Variables, Events { + using SafeERC20 for IERC20; + + /** + * @dev Borrow Flashloan and Cast spells. + * @param token Token Address. + * @param amt Token Amount. + * @param route Flashloan source route. (0: dYdX(ETH,DAI,USDC only), 1: MakerDAO(DAI only), 2: Compound(All borrowable tokens in Compound), 3: AaveV2(All borrowable tokens in AaveV2)) + * @param data targets & data for cast. + */ + function flashBorrowAndCast( + address token, + uint amt, + uint route, + bytes memory data + ) external payable { + AccountInterface(address(this)).enable(address(instaPool)); + (string[] memory _targets, bytes[] memory callDatas) = abi.decode(data, (string[], bytes[])); + + bytes memory callData = abi.encodeWithSignature("cast(string[],bytes[],address)", _targets, callDatas, address(instaPool)); + + instaPool.initiateFlashLoan(token, amt, route, callData); + + emit LogFlashBorrow(token, amt); + AccountInterface(address(this)).disable(address(instaPool)); + } + + /** + * @dev Return token to InstaPool. + * @param token Token Address. + * @param amt Token Amount. + * @param getId Get token amount at this ID from `InstaMemory` Contract. + * @param setId Set token amount at this ID in `InstaMemory` Contract. + */ + function flashPayback( + address token, + uint amt, + uint getId, + uint setId + ) external payable { + uint _amt = getUint(getId, amt); + + IERC20 tokenContract = IERC20(token); + + if (token == ethAddr) { + Address.sendValue(payable(address(instaPool)), _amt); + } else { + tokenContract.safeTransfer(address(instaPool), _amt); + } + + setUint(setId, _amt); + + emit LogFlashPayback(token, _amt); + } + + /** + * @dev Borrow Flashloan and Cast spells. + * @param token Token Address. + * @param amt Token Amount. + * @param route Flashloan source route. (0: dYdX(ETH,DAI,USDC only), 1: MakerDAO(DAI only), 2: Compound(All borrowable tokens in Compound), 3: AaveV2(All borrowable tokens in AaveV2)) + * @param data targets & data for cast. + */ + function flashMultiBorrowAndCast( + address[] memory tokens_, + uint[] memory amts_, + uint route, + bytes memory data + ) external payable { + AccountInterface(address(this)).enable(address(instaPool)); + (string[] memory _targets, bytes[] memory callDatas) = abi.decode(data, (string[], bytes[])); + + bytes memory callData = abi.encodeWithSignature("cast(string[],bytes[],address)", _targets, callDatas, address(instaPool)); + + instaPool.initiateMultiFlashLoan(tokens_, amts_, route, callData); + + emit LogMultiFlashBorrow(tokens_, amts_); + AccountInterface(address(this)).disable(address(instaPool)); + } + + /** + * @dev Return token to InstaPool. + * @param token Token Address. + * @param amt Token Amount. + * @param getId Get token amount at this ID from `InstaMemory` Contract. + * @param setId Set token amount at this ID in `InstaMemory` Contract. + */ + function flashMultiPayback( + address[] memory tokens_, + uint[] memory amts_, + uint[] memory getIds, + uint[] memory setIds + ) external payable { + for (uint i = 0; i < tokens_.length; i++) { + amts_[i] = getUint(getIds[i], amts_[i]); + + if (tokens_[i] == ethAddr) { + Address.sendValue(payable(address(instaPool)), amts_[i]); + } else { + IERC20(tokens_[i]).safeTransfer(address(instaPool), amts_[i]); + } + + setUint(setIds[i], amts_[i]); + } + + emit LogFlashPayback(tokens_, amts_); + } + +} + +contract ConnectV2InstaPool is LiquidityResolver { + string public name = "Instapool-v1.2"; +} diff --git a/contracts/mainnet/connectors/instapool_v3/variables.sol b/contracts/mainnet/connectors/instapool_v3/variables.sol new file mode 100644 index 00000000..40eede68 --- /dev/null +++ b/contracts/mainnet/connectors/instapool_v3/variables.sol @@ -0,0 +1,17 @@ +pragma solidity ^0.7.0; +pragma experimental ABIEncoderV2; + +import { InstaFlashV2Interface } from "./interfaces.sol"; + +contract Variables { + + /** + * @dev Instapool contract proxy + */ + InstaFlashV2Interface public immutable instaPool; + + constructor(address _instaPool) { + instaPool = InstaFlashV2Interface(_instaPool); + } + +} \ No newline at end of file From 137defd8aebf87257c548199754c094834102612 Mon Sep 17 00:00:00 2001 From: Samyak Jain <34437877+KaymasJain@users.noreply.github.com> Date: Fri, 15 Oct 2021 22:05:54 +0530 Subject: [PATCH 2/4] updated openzepplin package to recent one --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index dd1ac07c..43662cc9 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ }, "homepage": "https://github.com/InstaDApp/dsa-connectors-new#readme", "dependencies": { - "@openzeppelin/contracts": "^3.4.0-solc-0.7", + "@openzeppelin/contracts": "^4.3.2", "@uniswap/v3-core": "^1.0.0", "@uniswap/v3-periphery": "^1.1.1", "chalk": "^4.0.0", From 3cd2968268e14492a539ef7764a0a745a49f7773 Mon Sep 17 00:00:00 2001 From: Thrilok Kumar Date: Mon, 18 Oct 2021 17:59:53 +0530 Subject: [PATCH 3/4] Minor changes --- .../mainnet/connectors/instapool_v3/main.sol | 42 ++++++++++--------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/contracts/mainnet/connectors/instapool_v3/main.sol b/contracts/mainnet/connectors/instapool_v3/main.sol index a0a93e83..5d627297 100644 --- a/contracts/mainnet/connectors/instapool_v3/main.sol +++ b/contracts/mainnet/connectors/instapool_v3/main.sol @@ -23,7 +23,7 @@ contract LiquidityResolver is DSMath, Stores, Variables, Events { * @dev Borrow Flashloan and Cast spells. * @param token Token Address. * @param amt Token Amount. - * @param route Flashloan source route. (0: dYdX(ETH,DAI,USDC only), 1: MakerDAO(DAI only), 2: Compound(All borrowable tokens in Compound), 3: AaveV2(All borrowable tokens in AaveV2)) + * @param route Flashloan source route. * @param data targets & data for cast. */ function flashBorrowAndCast( @@ -31,7 +31,7 @@ contract LiquidityResolver is DSMath, Stores, Variables, Events { uint amt, uint route, bytes memory data - ) external payable { + ) external payable returns (string memory _eventName, bytes memory _eventParam) { AccountInterface(address(this)).enable(address(instaPool)); (string[] memory _targets, bytes[] memory callDatas) = abi.decode(data, (string[], bytes[])); @@ -39,8 +39,10 @@ contract LiquidityResolver is DSMath, Stores, Variables, Events { instaPool.initiateFlashLoan(token, amt, route, callData); - emit LogFlashBorrow(token, amt); AccountInterface(address(this)).disable(address(instaPool)); + + _eventName = "LogFlashBorrow(address,uint256)"; + _eventParam = abi.encode(token, amt); } /** @@ -55,7 +57,7 @@ contract LiquidityResolver is DSMath, Stores, Variables, Events { uint amt, uint getId, uint setId - ) external payable { + ) external payable returns (string memory _eventName, bytes memory _eventParam) { uint _amt = getUint(getId, amt); IERC20 tokenContract = IERC20(token); @@ -68,14 +70,15 @@ contract LiquidityResolver is DSMath, Stores, Variables, Events { setUint(setId, _amt); - emit LogFlashPayback(token, _amt); + _eventName = "LogFlashPayback(address,uint256)"; + _eventParam = abi.encode(token, amt); } /** - * @dev Borrow Flashloan and Cast spells. - * @param token Token Address. - * @param amt Token Amount. - * @param route Flashloan source route. (0: dYdX(ETH,DAI,USDC only), 1: MakerDAO(DAI only), 2: Compound(All borrowable tokens in Compound), 3: AaveV2(All borrowable tokens in AaveV2)) + * @dev Borrow multi-tokens Flashloan and Cast spells. + * @param tokens_ Array of Token Addresses. + * @param amts_ Array of Token Amounts. + * @param route Flashloan source route. * @param data targets & data for cast. */ function flashMultiBorrowAndCast( @@ -83,7 +86,7 @@ contract LiquidityResolver is DSMath, Stores, Variables, Events { uint[] memory amts_, uint route, bytes memory data - ) external payable { + ) external payable returns (string memory _eventName, bytes memory _eventParam) { AccountInterface(address(this)).enable(address(instaPool)); (string[] memory _targets, bytes[] memory callDatas) = abi.decode(data, (string[], bytes[])); @@ -91,23 +94,24 @@ contract LiquidityResolver is DSMath, Stores, Variables, Events { instaPool.initiateMultiFlashLoan(tokens_, amts_, route, callData); - emit LogMultiFlashBorrow(tokens_, amts_); AccountInterface(address(this)).disable(address(instaPool)); + _eventName = "LogFlashPayback(address[],uint256[])"; + _eventParam = abi.encode(tokens_, amts_); } /** - * @dev Return token to InstaPool. - * @param token Token Address. - * @param amt Token Amount. - * @param getId Get token amount at this ID from `InstaMemory` Contract. - * @param setId Set token amount at this ID in `InstaMemory` Contract. + * @dev Return multi-tokens to InstaPool. + * @param tokens_ Array of Token Addresses. + * @param amts_ Array of Token Amounts. + * @param getIds Array of getId token amounts. + * @param setIds Array of setId token amounts. */ function flashMultiPayback( address[] memory tokens_, uint[] memory amts_, uint[] memory getIds, uint[] memory setIds - ) external payable { + ) external payable returns (string memory _eventName, bytes memory _eventParam) { for (uint i = 0; i < tokens_.length; i++) { amts_[i] = getUint(getIds[i], amts_[i]); @@ -125,6 +129,6 @@ contract LiquidityResolver is DSMath, Stores, Variables, Events { } -contract ConnectV2InstaPool is LiquidityResolver { - string public name = "Instapool-v1.2"; +contract ConnectV2InstaPoolV3 is LiquidityResolver { + string public name = "Instapool-v3"; } From 361161b5245ef36fe554cc1a1a59c17a2119b7d2 Mon Sep 17 00:00:00 2001 From: Thrilok Kumar Date: Fri, 22 Oct 2021 18:10:14 +0530 Subject: [PATCH 4/4] Minor changes --- contracts/mainnet/connectors/instapool_v3/main.sol | 5 +++-- contracts/mainnet/connectors/instapool_v3/variables.sol | 6 +----- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/contracts/mainnet/connectors/instapool_v3/main.sol b/contracts/mainnet/connectors/instapool_v3/main.sol index 5d627297..d977011b 100644 --- a/contracts/mainnet/connectors/instapool_v3/main.sol +++ b/contracts/mainnet/connectors/instapool_v3/main.sol @@ -95,7 +95,7 @@ contract LiquidityResolver is DSMath, Stores, Variables, Events { instaPool.initiateMultiFlashLoan(tokens_, amts_, route, callData); AccountInterface(address(this)).disable(address(instaPool)); - _eventName = "LogFlashPayback(address[],uint256[])"; + _eventName = "LogFlashMultiBorrow(address[],uint256[])"; _eventParam = abi.encode(tokens_, amts_); } @@ -124,7 +124,8 @@ contract LiquidityResolver is DSMath, Stores, Variables, Events { setUint(setIds[i], amts_[i]); } - emit LogFlashPayback(tokens_, amts_); + _eventName = "LogFlashMultiPayback(address[],uint256[])"; + _eventParam = abi.encode(tokens_, amts_); } } diff --git a/contracts/mainnet/connectors/instapool_v3/variables.sol b/contracts/mainnet/connectors/instapool_v3/variables.sol index 40eede68..1c7c0826 100644 --- a/contracts/mainnet/connectors/instapool_v3/variables.sol +++ b/contracts/mainnet/connectors/instapool_v3/variables.sol @@ -8,10 +8,6 @@ contract Variables { /** * @dev Instapool contract proxy */ - InstaFlashV2Interface public immutable instaPool; - - constructor(address _instaPool) { - instaPool = InstaFlashV2Interface(_instaPool); - } + InstaFlashV2Interface public constant instaPool = InstaFlashV2Interface(0xF77A5935f35aDD4C2f524788805293EF86B87560); } \ No newline at end of file