pragma solidity ^0.7.0; /** * @title StaticConnectBasic. * @dev Static Connector to withdraw assets. */ interface TokenInterface { function balanceOf(address) external view returns (uint); function transfer(address, uint) external returns (bool); } interface AccountInterface { function isAuth(address) external view returns (bool); } interface EventInterface { function emitEvent(uint _connectorType, uint _connectorID, bytes32 _eventCode, bytes calldata _eventData) external; } contract Memory { /** * @dev Return InstaEvent Address. */ function getEventAddr() internal pure returns (address) { return 0x2af7ea6Cb911035f3eb1ED895Cb6692C39ecbA97; } function connectorID() public pure returns(uint _type, uint _id) { (_type, _id) = (2, 1); } } contract BasicResolver is Memory { event LogWithdraw(address erc20, uint tokenAmt, address to); /** * @dev ETH Address. */ address constant internal ethAddr = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; /** * @dev Withdraw Assets To Smart Account. * @param erc20 Token Address. * @param tokenAmt Token Amount. */ function withdraw( address erc20, uint tokenAmt ) external payable { uint amt; if (erc20 == ethAddr) { amt = tokenAmt == uint(-1) ? address(this).balance : tokenAmt; msg.sender.transfer(amt); } else { TokenInterface token = TokenInterface(erc20); amt = tokenAmt == uint(-1) ? token.balanceOf(address(this)) : tokenAmt; token.transfer(msg.sender, amt); } emit LogWithdraw(erc20, amt, msg.sender); bytes32 _eventCode = keccak256("LogWithdraw(address,uint256,address)"); bytes memory _eventParam = abi.encode(erc20, amt, msg.sender); (uint _type, uint _id) = connectorID(); EventInterface(getEventAddr()).emitEvent(_type, _id, _eventCode, _eventParam); } } contract StaticConnectBasic is BasicResolver { string public constant name = "Static-Basic-v1"; }