smart-contract/contracts/ProxyLogics/import/InstaTokenImport.sol
2019-11-20 16:52:44 +05:30

59 lines
1.9 KiB
Solidity

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 {}
}