pragma solidity ^0.5.0; import "./ERC20Mock.sol"; import "../IUniswapExchange.sol"; contract UniswapMock is IUniswapExchange { ERC20Mock public token; uint256 public price; // EthPurchase: event({buyer: indexed(address), tokens_sold: indexed(uint256), eth_bought: indexed(uint256(wei))}) event EthPurchase(address buyer, uint256 tokens_sold, uint256 eth_bought); constructor(ERC20Mock _token, uint256 _price) public payable { token = _token; price = _price; // in wei } /* * @notice Convert Tokens to ETH. * @dev User specifies maximum input and exact output. * @param eth_bought Amount of ETH purchased. * @param max_tokens Maximum Tokens sold. * @param deadline Time after which this transaction can no longer be executed. * @return Amount of Tokens sold. * @public * def tokenToEthSwapOutput(eth_bought: uint256(wei), max_tokens: uint256, deadline: timestamp) -> uint256: */ function tokenToEthSwapOutput(uint256 eth_bought, uint256 /*max_tokens*/, uint256 /*deadline*/) public returns(uint256 tokens_sold) { tokens_sold = getTokenToEthOutputPrice(eth_bought); token.transferFrom(msg.sender, address(this), tokens_sold); msg.sender.transfer(eth_bought); emit EthPurchase(msg.sender, tokens_sold, eth_bought); return eth_bought; } function getTokenToEthOutputPrice(uint256 eth_bought) public view returns (uint256) { return eth_bought * price / 10**18; } // /* // * @notice Convert Tokens to ETH. // * @dev User specifies exact input and minimum output. // * @param tokens_sold Amount of Tokens sold. // * @param min_eth Minimum ETH purchased. // * @param deadline Time after which this transaction can no longer be executed. // * @return Amount of ETH bought. // * def tokenToEthSwapInput(tokens_sold: uint256, min_eth: uint256(wei), deadline: timestamp) -> uint256(wei): // */ // function tokenToEthSwapInput(uint256 tokens_sold, uint256 min_eth, uint256 deadline) public returns(uint256) { // token.transferFrom(msg.sender, address(this), tokens_sold); // uint256 eth_bought = getTokenToEthInputPrice(tokens_sold); // msg.sender.transfer(eth_bought); // return eth_bought; // } // function getTokenToEthInputPrice(uint256 tokens_sold /* in wei */) public view returns (uint256 eth_bought) { // return tokens_sold * price / 10**18; // } function setPrice(uint256 _price) external { price = _price; } function() external payable {} }