This commit is contained in:
Richa-iitr 2022-06-02 12:29:24 +05:30
parent 22aa323ff5
commit 4e9baa0438
5 changed files with 181 additions and 51 deletions

View File

@ -1,5 +1,6 @@
//SPDX-License-Identifier: MIT //SPDX-License-Identifier: MIT
pragma solidity ^0.7.0; pragma solidity ^0.7.0;
pragma experimental ABIEncoderV2;
interface TokenInterface { interface TokenInterface {
function approve(address, uint256) external; function approve(address, uint256) external;
@ -22,4 +23,13 @@ interface AccountInterface {
function enable(address) external; function enable(address) external;
function disable(address) external; function disable(address) external;
function isAuth(address) external view returns (bool); function isAuth(address) external view returns (bool);
function cast(
string[] calldata _targetNames,
bytes[] calldata _datas,
address _origin
) external payable returns (bytes32[] memory responses);
}
interface ListInterface {
function accountID(address) external returns (uint64);
} }

View File

@ -5,7 +5,7 @@ pragma experimental ABIEncoderV2;
contract Events { contract Events {
event LogAaveV3Import( event LogAaveV3Import(
address indexed user, address indexed user,
address[] ctokens, address[] atokens,
string[] supplyIds, string[] supplyIds,
string[] borrowIds, string[] borrowIds,
uint256[] flashLoanFees, uint256[] flashLoanFees,
@ -14,7 +14,7 @@ contract Events {
); );
event LogAaveV3ImportWithCollateral( event LogAaveV3ImportWithCollateral(
address indexed user, address indexed user,
address[] ctokens, address[] atokens,
string[] supplyIds, string[] supplyIds,
string[] borrowIds, string[] borrowIds,
uint256[] flashLoanFees, uint256[] flashLoanFees,

View File

@ -1,9 +1,10 @@
//SPDX-License-Identifier: MIT //SPDX-License-Identifier: MIT
pragma solidity ^0.7.0; pragma solidity ^0.7.0;
pragma abicoder v2;
import { DSMath } from "../../../common/math.sol"; import { DSMath } from "../../../common/math.sol";
import { Basic } from "../../../common/basic.sol"; import { Basic } from "../../../common/basic.sol";
import { TokenInterface, AccountInterface } from "../../../common/interfaces.sol"; import { TokenInterface, AccountInterface, ListInterface } from "../../../common/interfaces.sol";
import { AaveInterface, AavePoolProviderInterface, AaveDataProviderInterface } from "./interface.sol"; import { AaveInterface, AavePoolProviderInterface, AaveDataProviderInterface } from "./interface.sol";
import "./events.sol"; import "./events.sol";
import "./interface.sol"; import "./interface.sol";
@ -26,6 +27,12 @@ abstract contract Helper is DSMath, Basic {
AaveDataProviderInterface internal constant aaveData = AaveDataProviderInterface internal constant aaveData =
AaveDataProviderInterface(0x69FA688f1Dc47d4B5d8029D5a35FB7a548310654); AaveDataProviderInterface(0x69FA688f1Dc47d4B5d8029D5a35FB7a548310654);
/**
* @dev InstaList
*/
ListInterface internal constant instaList =
ListInterface(0x839c2D3aDe63DF5b0b8F3E57D5e145057Ab41556);
function getIsColl(address token, address user) function getIsColl(address token, address user)
internal internal
view view
@ -231,20 +238,60 @@ contract AaveHelpers is Helper {
address[] memory tokens, address[] memory tokens,
address userAccount address userAccount
) internal { ) internal {
for (uint256 i = 0; i < _length; i++) { if (instaList.accountID(userAccount) == 0) {
if (amts[i] > 0) { for (uint256 i = 0; i < _length; i++) {
uint256 _amt = amts[i]; if (amts[i] > 0) {
require( uint256 _amt = amts[i];
atokenContracts[i].transferFrom( require(
userAccount, atokenContracts[i].transferFrom(
address(this), userAccount,
_amt address(this),
), _amt
"allowance?" ),
); "allowance?"
);
if (!getIsColl(tokens[i], address(this))) {
aave.setUserUseReserveAsCollateral(tokens[i], true);
}
}
}
} else {
uint256 _len = 0;
uint256 _cntr = 0;
for (uint256 i = 0; i < _length; i++) {
if (amts[i] > 0) {
_len++;
}
}
string[] memory _targets = new string[](_len);
bytes[] memory _data = new bytes[](_len);
address[] memory _tokens = new address[](_len);
bytes4 basicWithdraw = bytes4(
keccak256("withdraw(address,uint256,address,uint256,uint256)")
);
if (!getIsColl(tokens[i], address(this))) { for (uint256 i = 0; i < _length; i++) {
aave.setUserUseReserveAsCollateral(tokens[i], true); if (amts[i] > 0) {
uint256 _amt = amts[i];
address _token = address(atokenContracts[i]);
_targets[_cntr] = "BASIC-A";
_data[_cntr] = abi.encodeWithSelector(
basicWithdraw,
_token,
_amt,
address(this),
0,
0
);
_tokens[_cntr] = tokens[i];
_cntr++;
}
}
AccountInterface(userAccount).cast(_targets, _data, address(this));
for (uint256 i = 0; i < _len; i++) {
if (!getIsColl(_tokens[i], address(this))) {
aave.setUserUseReserveAsCollateral(_tokens[i], true);
} }
} }
} }
@ -259,20 +306,67 @@ contract AaveHelpers is Helper {
bool[] memory colEnable, bool[] memory colEnable,
address userAccount address userAccount
) internal { ) internal {
for (uint256 i = 0; i < _length; i++) { if (instaList.accountID(userAccount) == 0) {
if (amts[i] > 0) { for (uint256 i = 0; i < _length; i++) {
uint256 _amt = amts[i]; if (amts[i] > 0) {
require( uint256 _amt = amts[i];
atokenContracts[i].transferFrom( require(
userAccount, atokenContracts[i].transferFrom(
address(this), userAccount,
_amt address(this),
), _amt
"allowance?" ),
); "allowance?"
);
if (!getIsColl(tokens[i], address(this))) { if (!getIsColl(tokens[i], address(this))) {
aave.setUserUseReserveAsCollateral(tokens[i], colEnable[i]); aave.setUserUseReserveAsCollateral(
tokens[i],
colEnable[i]
);
}
}
}
} else {
uint256 _len = 0;
uint256 _cntr = 0;
for (uint256 i = 0; i < _length; i++) {
if (amts[i] > 0) {
_len++;
}
}
string[] memory _targets = new string[](_len);
bytes[] memory _data = new bytes[](_len);
address[] memory _tokens = new address[](_len);
bytes4 basicWithdraw = bytes4(
keccak256("withdraw(address,uint256,address,uint256,uint256)")
);
for (uint256 i = 0; i < _length; i++) {
if (amts[i] > 0) {
uint256 _amt = amts[i];
address _token = address(atokenContracts[i]);
_targets[_cntr] = "BASIC-A";
_data[_cntr] = abi.encodeWithSelector(
basicWithdraw,
_token,
_amt,
address(this),
0,
0
);
_tokens[_cntr] = tokens[i];
_cntr++;
}
}
AccountInterface(userAccount).cast(_targets, _data, address(this));
for (uint256 i = 0; i < _len; i++) {
if (!getIsColl(_tokens[i], address(this))) {
aave.setUserUseReserveAsCollateral(
_tokens[i],
colEnable[i]
);
} }
} }
} }

View File

@ -3,7 +3,7 @@ pragma solidity ^0.7.0;
pragma experimental ABIEncoderV2; pragma experimental ABIEncoderV2;
/** /**
* @title Aave v3 import connector . * @title Aave v3 import connector .
* @dev Import EOA's aave V3 position to DSA's aave v3 position * Import EOA's / External DSA's aave V3 position to DSA's aave v3 position
*/ */
import { TokenInterface, AccountInterface } from "../../../common/interfaces.sol"; import { TokenInterface, AccountInterface } from "../../../common/interfaces.sol";
import { AaveInterface, ATokenInterface } from "./interface.sol"; import { AaveInterface, ATokenInterface } from "./interface.sol";
@ -15,10 +15,17 @@ contract AaveV3ImportResolver is AaveHelpers {
internal internal
returns (string memory _eventName, bytes memory _eventParam) returns (string memory _eventName, bytes memory _eventParam)
{ {
require( if (instaList.accountID(userAccount) == 0) {
AccountInterface(address(this)).isAuth(userAccount), require(
"user-account-not-auth" AccountInterface(address(this)).isAuth(userAccount),
); "user-account-not-auth"
);
} else {
require(
AccountInterface(userAccount).isAuth(address(this)),
"user-account-not-auth"
);
}
require(inputData.supplyTokens.length > 0, "0-length-not-allowed"); require(inputData.supplyTokens.length > 0, "0-length-not-allowed");
@ -91,17 +98,28 @@ contract AaveV3ImportResolver is AaveHelpers {
); );
} }
function _importAaveWithCollateral(address userAccount, ImportInputData memory inputData, bool[] memory enableCollateral) function _importAaveWithCollateral(
internal address userAccount,
returns (string memory _eventName, bytes memory _eventParam) ImportInputData memory inputData,
{ bool[] memory enableCollateral
require( ) internal returns (string memory _eventName, bytes memory _eventParam) {
AccountInterface(address(this)).isAuth(userAccount), if (instaList.accountID(userAccount) == 0) {
"user-account-not-auth" require(
); AccountInterface(address(this)).isAuth(userAccount),
"user-account-not-auth"
);
} else {
require(
AccountInterface(userAccount).isAuth(address(this)),
"user-account-not-auth"
);
}
require(inputData.supplyTokens.length > 0, "0-length-not-allowed"); require(inputData.supplyTokens.length > 0, "0-length-not-allowed");
require(enableCollateral.length == inputData.supplyTokens.length, "lengths-not-same"); require(
enableCollateral.length == inputData.supplyTokens.length,
"lengths-not-same"
);
ImportData memory data; ImportData memory data;
@ -177,7 +195,7 @@ contract AaveV3ImportResolver is AaveHelpers {
/** /**
* @dev Import aave V3 position . * @dev Import aave V3 position .
* @notice Import EOA's aave V3 position to DSA's aave v3 position * @notice Import EOA's aave V3 position to DSA's aave v3 position
* @param userAccount The address of the EOA from which aave position will be imported * @param userAccount The address of the EOA from which Aave position will be imported or the address of the DSA to which the DSA's Aave position will be merged
* @param inputData The struct containing all the neccessary input data * @param inputData The struct containing all the neccessary input data
*/ */
function importAave(address userAccount, ImportInputData memory inputData) function importAave(address userAccount, ImportInputData memory inputData)
@ -191,19 +209,27 @@ contract AaveV3ImportResolver is AaveHelpers {
/** /**
* @dev Import aave V3 position (with collateral). * @dev Import aave V3 position (with collateral).
* @notice Import EOA's aave V3 position to DSA's aave v3 position * @notice Import EOA's aave V3 position to DSA's aave v3 position
* @param userAccount The address of the EOA from which aave position will be imported * @param userAccount The address of the EOA from which aave position will be imported or the address of the DSA to which the DSA's Aave position will be merged
* @param inputData The struct containing all the neccessary input data * @param inputData The struct containing all the neccessary input data
* @param enableCollateral The boolean array to enable selected collaterals in the imported position * @param enableCollateral The boolean array to enable selected collaterals in the imported position
*/ */
function importAaveWithCollateral(address userAccount, ImportInputData memory inputData, bool[] memory enableCollateral) function importAaveWithCollateral(
address userAccount,
ImportInputData memory inputData,
bool[] memory enableCollateral
)
external external
payable payable
returns (string memory _eventName, bytes memory _eventParam) returns (string memory _eventName, bytes memory _eventParam)
{ {
(_eventName, _eventParam) = _importAaveWithCollateral(userAccount, inputData, enableCollateral); (_eventName, _eventParam) = _importAaveWithCollateral(
userAccount,
inputData,
enableCollateral
);
} }
} }
contract ConnectV2AaveV3ImportOptimism is AaveV3ImportResolver { contract ConnectV2AaveV3ImportOptimism is AaveV3ImportResolver {
string public constant name = "Aave-v3-import-v1.1"; string public constant name = "Aave-v3-import-v1.2";
} }

View File

@ -6,7 +6,7 @@ pragma experimental ABIEncoderV2;
* @dev Import EOA's / External DSA's aave V3 position to DSA's aave v3 position * @dev Import EOA's / External DSA's aave V3 position to DSA's aave v3 position
*/ */
import { TokenInterface, AccountInterface, ListInterface } from "../../../common/interfaces.sol"; import { TokenInterface, AccountInterface } from "../../../common/interfaces.sol";
import { AaveInterface, ATokenInterface } from "./interface.sol"; import { AaveInterface, ATokenInterface } from "./interface.sol";
import "./helpers.sol"; import "./helpers.sol";
import "./events.sol"; import "./events.sol";
@ -209,7 +209,7 @@ contract AaveV3ImportResolver is AaveHelpers {
/** /**
* @dev Import aave V3 position (with collateral). * @dev Import aave V3 position (with collateral).
* @notice Import EOA's aave V3 position to DSA's aave v3 position * @notice Import EOA's aave V3 position to DSA's aave v3 position
* @param userAccount The address of the EOA from which aave position will be imported * @param userAccount The address of the EOA from which aave position will be imported or the address of the DSA to which the DSA's Aave position will be merged
* @param inputData The struct containing all the neccessary input data * @param inputData The struct containing all the neccessary input data
* @param enableCollateral The boolean array to enable selected collaterals in the imported position * @param enableCollateral The boolean array to enable selected collaterals in the imported position
*/ */