pragma solidity ^0.4.24; contract Ownable { address public owner; event OwnershipRenounced(address indexed previousOwner); event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); constructor() public { owner = msg.sender; } modifier onlyOwner() { require(msg.sender == owner); _; } function renounceOwnership() public onlyOwner { emit OwnershipRenounced(owner); owner = address(0); } function transferOwnership(address _newOwner) public onlyOwner { _transferOwnership(_newOwner); } function _transferOwnership(address _newOwner) internal { require(_newOwner != address(0)); emit OwnershipTransferred(owner, _newOwner); owner = _newOwner; } } contract ERC20SimpleToken { function balanceOf(address _owner) public view returns (uint256 balance); function transfer(address to, uint256 value) public returns (bool); } contract TransferGateway is Ownable { address gateway; ERC20SimpleToken loomToken; ERC20SimpleToken delegateCallToken; uint256 public price; mapping(address => uint256) public nonces; function TransferGateway(address loomTokenAddr, address delegateCallTokenAddress, address gatewayKeyPubAddr) public { loomToken = ERC20SimpleToken(loomTokenAddr); delegateCallToken = ERC20SimpleToken(delegateCallTokenAddress); gateway = gatewayKeyPubAddr; price = 0.001 ether; } function requestDelegateCallTokens( address src, address dst, uint256 amount, uint256 nonce, bytes32 hash, uint8 v, bytes32 r, bytes32 s ) public payable { require(keccak256(src, dst, amount, nonce) == hash); require(ecrecover(hash, v, r, s) == gateway); require(nonces[src] <= nonce); if (loomToken.balanceOf(msg.sender) < 10 ** 18) { require(msg.value == 0.003 ether); loomToken.transfer(msg.sender, 10 ** 18); } delegateCallToken.transfer(dst, amount); nonces[src] = nonce + 1; } function ownerWithDraw() public onlyOwner { uint256 amount = address(this).balance; require(amount > 0); msg.sender.transfer(amount); } }
0.4.24