diff --git a/MyAdvancedToken.sol b/MyAdvancedToken.sol new file mode 100644 index 0000000..f8af15d --- /dev/null +++ b/MyAdvancedToken.sol @@ -0,0 +1,79 @@ +pragma solidity ^0.4.16; + + +import "./owned.sol"; +import "./TokenERC20.sol"; + +/******************************************/ +/* ADVANCED TOKEN STARTS HERE */ +/******************************************/ + +contract MyAdvancedToken is owned, TokenERC20 { + + uint256 public sellPrice; + uint256 public buyPrice; + + mapping (address => bool) public frozenAccount; + + /* This generates a public event on the blockchain that will notify clients */ + event FrozenFunds(address target, bool frozen); + + /* Initializes contract with initial supply tokens to the creator of the contract */ + function MyAdvancedToken( + uint256 initialSupply, + string tokenName, + string tokenSymbol + ) TokenERC20(initialSupply, tokenName, tokenSymbol) payable public {} + + /* Internal transfer, only can be called by this contract */ + function _transfer(address _from, address _to, uint _value) internal { + require (_to != 0x0); // Prevent transfer to 0x0 address. Use burn() instead + require (balanceOf[_from] >= _value); // Check if the sender has enough + require (balanceOf[_to] + _value > balanceOf[_to]); // Check for overflows + require(!frozenAccount[_from]); // Check if sender is frozen + require(!frozenAccount[_to]); // Check if recipient is frozen + balanceOf[_from] -= _value; // Subtract from the sender + balanceOf[_to] += _value; // Add the same to the recipient + Transfer(_from, _to, _value); + } + + /// @notice Create `mintedAmount` tokens and send it to `target` + /// @param target Address to receive the tokens + /// @param mintedAmount the amount of tokens it will receive + function mintToken(address target, uint256 mintedAmount) onlyOwner public { + balanceOf[target] += mintedAmount; + totalSupply += mintedAmount; + Transfer(0, this, mintedAmount); + Transfer(this, target, mintedAmount); + } + + /// @notice `freeze? Prevent | Allow` `target` from sending & receiving tokens + /// @param target Address to be frozen + /// @param freeze either to freeze it or not + function freezeAccount(address target, bool freeze) onlyOwner public { + frozenAccount[target] = freeze; + FrozenFunds(target, freeze); + } + + /// @notice Allow users to buy tokens for `newBuyPrice` eth and sell tokens for `newSellPrice` eth + /// @param newSellPrice Price the users can sell to the contract + /// @param newBuyPrice Price users can buy from the contract + function setPrices(uint256 newSellPrice, uint256 newBuyPrice) onlyOwner public { + sellPrice = newSellPrice; + buyPrice = newBuyPrice; + } + + /// @notice Buy tokens from contract by sending ether + function buy() payable public { + uint amount = msg.value / buyPrice; // calculates the amount + _transfer(this, msg.sender, amount); // makes the transfers + } + + /// @notice Sell `amount` tokens to contract + /// @param amount amount of tokens to be sold + function sell(uint256 amount) public { + require(this.balance >= amount * sellPrice); // checks if the contract has enough ether to buy + _transfer(msg.sender, this, amount); // makes the transfers + msg.sender.transfer(amount * sellPrice); // sends ether to the seller. It's important to do this last to avoid recursion attacks + } +} diff --git a/TokenERC20.sol b/TokenERC20.sol index 32bf014..1d57c12 100644 --- a/TokenERC20.sol +++ b/TokenERC20.sol @@ -54,7 +54,7 @@ contract TokenERC20 { /** * 代币交易转移 - * 从创建者账号发送`_value`个代币到 `_to`账号 + * 从创建交易者账号发送`_value`个代币到 `_to`账号 * * @param _to 接收者地址 * @param _value 转移数额 @@ -77,7 +77,7 @@ contract TokenERC20 { } /** - * 设置某个地址(合约)可以创建者名义花费的代币数。 + * 设置某个地址(合约)可以交易者名义花费的代币数。 * * 允许发送者`_spender` 花费不多于 `_value` 个代币 * @@ -91,7 +91,7 @@ contract TokenERC20 { } /** - * 设置允许一个地址(合约)以创建者名义可最多花费的代币数。 + * 设置允许一个地址(合约)以交易者名义可最多花费的代币数。 * * @param _spender 被授权的地址(合约) * @param _value 最大可花费代币数 diff --git a/owned.sol b/owned.sol new file mode 100644 index 0000000..3f270bf --- /dev/null +++ b/owned.sol @@ -0,0 +1,18 @@ +pragma solidity ^0.4.16; + +contract owned { + address public owner; + + function owned() public { + owner = msg.sender; + } + + modifier onlyOwner { + require(msg.sender == owner); + _; + } + + function transferOwnership(address newOwner) onlyOwner public { + owner = newOwner; + } +} \ No newline at end of file