diff --git a/contracts/ProxyLogics/import/InstaTokenImport.sol b/contracts/ProxyLogics/import/InstaTokenImport.sol new file mode 100644 index 0000000..06a808f --- /dev/null +++ b/contracts/ProxyLogics/import/InstaTokenImport.sol @@ -0,0 +1,59 @@ +pragma solidity ^0.5.7; + +interface ERC20Interface { + function allowance(address, address) external view returns (uint); + function balanceOf(address) external view returns (uint); + function approve(address, uint) external; + function transfer(address, uint) external returns (bool); + function transferFrom(address, address, uint) external returns (bool); +} + + +contract DSMath { + function add(uint x, uint y) internal pure returns (uint z) { + require((z = x + y) >= x, "math-not-safe"); + } + + function mul(uint x, uint y) internal pure returns (uint z) { + require(y == 0 || (z = x * y) / y == x, "math-not-safe"); + } + + uint constant WAD = 10 ** 18; + + function wmul(uint x, uint y) internal pure returns (uint z) { + z = add(mul(x, y), WAD / 2) / WAD; + } +} + + +contract ImportResolver is DSMath { + event LogTokensImport(address owner, uint percentage, address[] tokenAddr, uint[] tokenBalArr); + + function importTokens(uint toConvert, address[] memory tokenAddrArr) public { + uint[] memory tokenBalArr = new uint[](tokenAddrArr.length); + + // transfer tokens to InstaDApp smart wallet from user wallet + for (uint i = 0; i < tokenAddrArr.length; i++) { + address cErc20 = tokenAddrArr[i]; + ERC20Interface tknContract = ERC20Interface(cErc20); + uint tokenBal = tknContract.balanceOf(msg.sender); + tokenBal = toConvert < 10**18 ? wmul(tokenBal, toConvert) : tokenBal; + if (tokenBal > 0) { + require(tknContract.transferFrom(msg.sender, address(this), tokenBal), "Allowance?"); + } + tokenBalArr[i] = tokenBal; + } + + emit LogTokensImport( + msg.sender, + toConvert, + tokenAddrArr, + tokenBalArr + ); + } +} + + +contract InstaTokenImport is ImportResolver { + function() external payable {} +} \ No newline at end of file