diff --git a/Ethereum/Contracts/Owner!=Minter b/Ethereum/Contracts/Owner!=Minter new file mode 100644 index 0000000..918c4ee --- /dev/null +++ b/Ethereum/Contracts/Owner!=Minter @@ -0,0 +1,103 @@ +contract owned { + address public owner; + + function owned() { + owner = msg.sender; + } + + modifier onlyOwner { + if (msg.sender != owner) throw; + _ + } + + function transferOwnership(address newOwner) onlyOwner { + owner = newOwner; + } +} + +contract tokenRecipient { function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData); } + +contract MyToken is owned { + /* Public variables of the token */ + string public name; + string public symbol; + string public version; + uint8 public decimals; + uint256 public totalSupply; + address public minter; + + /* This creates an array with all balances */ + mapping (address => uint256) public balanceOf; + mapping (address => mapping (address => uint256)) public allowance; + mapping (address => mapping (address => uint256)) public spentAllowance; + + /* This generates a public event on the blockchain that will notify clients */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /* Initializes contract with initial supply tokens to the creator of the contract */ + function MyToken( + uint256 initialSupply, + string tokenName, + uint8 decimalUnits, + string tokenSymbol, + string versionOfTheCode, address initMinter + ) { + balanceOf[msg.sender] = initialSupply; // Give the creator all initial tokens + totalSupply = initialSupply; // Update total supply + name = tokenName; // Set the name for display purposes + symbol = tokenSymbol; // Set the symbol for display purposes + decimals = decimalUnits; // Amount of decimals for display purposes + version = versionOfTheCode; + minter = initMinter; + } + + /* Send coins */ + function transfer(address _to, uint256 _value) { + if (balanceOf[msg.sender] < _value) throw; // Check if the sender has enough + if (balanceOf[_to] + _value < balanceOf[_to]) throw; // Check for overflows + balanceOf[msg.sender] -= _value; // Subtract from the sender + balanceOf[_to] += _value; // Add the same to the recipient + Transfer(msg.sender, _to, _value); // Notify anyone listening that this transfer took place + } + + /* Allow another contract to spend some tokens in your behalf */ + function approveAndCall(address _spender, uint256 _value, bytes _extraData) + returns (bool success) { + allowance[msg.sender][_spender] = _value; + tokenRecipient spender = tokenRecipient(_spender); + spender.receiveApproval(msg.sender, _value, this, _extraData); + return true; + } + + /* A contract attempts to get the coins */ + function transferFrom(address _from, address _to, uint256 _value) returns (bool success) { + if (balanceOf[_from] < _value) throw; // Check if the sender has enough + if (balanceOf[_to] + _value < balanceOf[_to]) throw; // Check for overflows + if (spentAllowance[_from][msg.sender] + _value > allowance[_from][msg.sender]) throw; // Check allowance + balanceOf[_from] -= _value; // Subtract from the sender + balanceOf[_to] += _value; // Add the same to the recipient + spentAllowance[_from][msg.sender] += _value; + Transfer(_from, _to, _value); + return true; + } + + /* This unnamed function is called whenever someone tries to send ether to it */ + function () { + throw; // Prevents accidental sending of ether + } + + function changeMinter(address newMinter) + { + if (msg.sender != minter) throw; + minter = newMinter; + } + + function mintToken(address target, uint256 mintedAmount) + { + if (msg.sender != minter) throw; + balanceOf[target] += mintedAmount; + totalSupply += mintedAmount; + Transfer(0, owner, mintedAmount); + Transfer(owner, target, mintedAmount); + } +}