mirror of
				https://github.com/Instadapp/dsa-connectors.git
				synced 2024-07-29 22:37:00 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			111 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Solidity
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Solidity
		
	
	
	
	
	
// SPDX-License-Identifier: MIT
 | 
						|
pragma solidity ^0.7.6;
 | 
						|
pragma experimental ABIEncoderV2;
 | 
						|
 | 
						|
/**
 | 
						|
 * @title Compound-Import.
 | 
						|
 * @dev Lending & Borrowing.
 | 
						|
 */
 | 
						|
 | 
						|
import { TokenInterface, AccountInterface } from "../../common/interfaces.sol";
 | 
						|
import { CompoundHelper } from "./helpers.sol";
 | 
						|
import { Events } from "./events.sol";
 | 
						|
 | 
						|
contract CompoundImportResolver is CompoundHelper {
 | 
						|
	/**
 | 
						|
	 * @notice this function performs the import of user's Compound positions into its DSA
 | 
						|
	 * @dev called internally by the importCompound and migrateCompound functions
 | 
						|
	 * @param _importInputData the struct containing borrowIds of the users borrowed tokens
 | 
						|
	 * @param _flashLoanFees list of flash loan fees
 | 
						|
	 */
 | 
						|
	function _importCompound(
 | 
						|
		ImportInputData memory _importInputData,
 | 
						|
		uint256[] memory _flashLoanFees
 | 
						|
	) internal returns (string memory _eventName, bytes memory _eventParam) {
 | 
						|
		require(
 | 
						|
			AccountInterface(address(this)).isAuth(
 | 
						|
				_importInputData.userAccount
 | 
						|
			),
 | 
						|
			"user-account-not-auth"
 | 
						|
		);
 | 
						|
 | 
						|
		require(_importInputData.supplyIds.length > 0, "0-length-not-allowed");
 | 
						|
 | 
						|
		ImportData memory data;
 | 
						|
 | 
						|
		uint256 _length = add(
 | 
						|
			_importInputData.supplyIds.length,
 | 
						|
			_importInputData.borrowIds.length
 | 
						|
		);
 | 
						|
		data.cTokens = new address[](_length);
 | 
						|
 | 
						|
		// get info about all borrowings and lendings by the user on Compound
 | 
						|
		data = getBorrowAmounts(_importInputData, data);
 | 
						|
		data = getSupplyAmounts(_importInputData, data);
 | 
						|
 | 
						|
		_enterMarkets(data.cTokens);
 | 
						|
 | 
						|
		// pay back user's debt using flash loan funds
 | 
						|
		_repayUserDebt(
 | 
						|
			_importInputData.userAccount,
 | 
						|
			data.borrowCtokens,
 | 
						|
			data.borrowAmts
 | 
						|
		);
 | 
						|
 | 
						|
		// transfer user's tokens to DSA
 | 
						|
		_transferTokensToDsa(
 | 
						|
			_importInputData.userAccount,
 | 
						|
			data.supplyCtokens,
 | 
						|
			data.supplyAmts
 | 
						|
		);
 | 
						|
 | 
						|
		// borrow the earlier position from Compound with flash loan fee added
 | 
						|
		_borrowDebtPosition(
 | 
						|
			data.borrowCtokens,
 | 
						|
			data.borrowAmts,
 | 
						|
			_flashLoanFees
 | 
						|
		);
 | 
						|
 | 
						|
		_eventName = "LogCompoundImport(address,address[],string[],string[],uint256[],uint256[])";
 | 
						|
		_eventParam = abi.encode(
 | 
						|
			_importInputData.userAccount,
 | 
						|
			data.cTokens,
 | 
						|
			_importInputData.supplyIds,
 | 
						|
			_importInputData.borrowIds,
 | 
						|
			data.supplyAmts,
 | 
						|
			data.borrowAmts
 | 
						|
		);
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @notice import Compound position of the address passed in as userAccount
 | 
						|
	 * @dev internally calls _importContract to perform the actual import
 | 
						|
	 * @param _userAccount address of user whose position is to be imported to DSA
 | 
						|
	 * @param _supplyIds Ids of all tokens the user has supplied to Compound
 | 
						|
	 * @param _borrowIds Ids of all token borrowed by the user
 | 
						|
	 * @param _flashLoanFees list of flash loan fees
 | 
						|
	 */
 | 
						|
	function importCompound(
 | 
						|
		address _userAccount,
 | 
						|
		string[] memory _supplyIds,
 | 
						|
		string[] memory _borrowIds,
 | 
						|
		uint256[] memory _flashLoanFees
 | 
						|
	)
 | 
						|
		external
 | 
						|
		payable
 | 
						|
		returns (string memory _eventName, bytes memory _eventParam)
 | 
						|
	{
 | 
						|
		ImportInputData memory inputData = ImportInputData({
 | 
						|
			userAccount: _userAccount,
 | 
						|
			supplyIds: _supplyIds,
 | 
						|
			borrowIds: _borrowIds
 | 
						|
		});
 | 
						|
 | 
						|
		(_eventName, _eventParam) = _importCompound(inputData, _flashLoanFees);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
contract ConnectV2CompoundImport is CompoundImportResolver {
 | 
						|
	string public constant name = "Compound-Import-v2";
 | 
						|
}
 |