pragma solidity ^0.4.8;

 

 

 contract ERC20Interface {

     function totalSupply() constant returns (uint256 totalSupply);

 

     function balanceOf(address _owner) constant returns (uint256 balance);

 

     function transfer(address _to, uint256 _value) returns (bool success);

 

     function transferFrom(address _from, address _to, uint256 _value) returns (bool success);

 

     function approve(address _spender, uint256 _value) returns (bool success);

 

     function allowance(address _owner, address _spender) constant returns (uint256 remaining);

 

     event Transfer(address indexed _from, address indexed _to, uint256 _value);

 

     event Approval(address indexed _owner, address indexed _spender, uint256 _value);

 }

 

// This interface must be implemented by the fund's contract

contract CharityInterface {

    function donate(address[] recipients) payable;

}

 

// A standard ERC20 token implementation with support for charity

 contract CharityToken is ERC20Interface {

     string public constant symbol = "CHA";

     string public constant name = "Example Token With Support For Charity";

     uint8 public constant decimals = 18;

 

     // The percent that will be donated

     uint8 public constant charityPercent = 1;

     uint256 _totalSupply = 1000000;

 

 

     uint256 public priceInWei;

     address public owner;

     CharityInterface public charity;

 

     mapping(address => uint256) balances;

 

     mapping(address => mapping (address => uint256)) allowed;

 

     modifier onlyOwner() {

         if (msg.sender != owner) {

             throw;

         }

         _;

     }

 

     // We store the address of the charity fund

     function CharityToken(address _charityAddress, uint256 _priceInWei) {

         owner = msg.sender;

         balances[owner] = _totalSupply;

         charity = CharityInterface(_charityAddress);

         priceInWei = _priceInWei;

     }

 

     function totalSupply() constant returns (uint256 totalSupply) {

         totalSupply = _totalSupply;

     }

 

     function balanceOf(address _owner) constant returns (uint256 balance) {

         return balances[_owner];

     }

 

     function transfer(address _to, uint256 _amount) returns (bool success) {

         if (balances[msg.sender] >= _amount

             && _amount > 0

             && balances[_to] + _amount > balances[_to]) {

             balances[msg.sender] -= _amount;

             balances[_to] += _amount;

             Transfer(msg.sender, _to, _amount);

             return true;

         } else {

             return false;

         }

     }

 

     function transferFrom(

         address _from,

         address _to,

         uint256 _amount

     ) returns (bool success) {

         if (balances[_from] >= _amount

             && allowed[_from][msg.sender] >= _amount

             && _amount > 0

             && balances[_to] + _amount > balances[_to]) {

             balances[_from] -= _amount;

             allowed[_from][msg.sender] -= _amount;

             balances[_to] += _amount;

             Transfer(_from, _to, _amount);

             return true;

         } else {

             return false;

         }

     }

 

     function approve(address _spender, uint256 _amount) returns (bool success) {

         allowed[msg.sender][_spender] = _amount;

         Approval(msg.sender, _spender, _amount);

         return true;

     }

 

     function allowance(address _owner, address _spender) constant returns (uint256 remaining) {

         return allowed[_owner][_spender];

     }

 

     // This method allows an investor to buy tokens directly from the issuer.

     // It also accepts a list of charity projects the investor would like to donate to.

     function buyFromOwner(address[] charityProjects) payable {

         var charityValue = msg.value / 100 * charityPercent;

         var left = msg.value - charityValue;

         var tokensToBuy = left / priceInWei;

         if (balances[owner] >= tokensToBuy) {

            balances[owner] -= tokensToBuy;

            balances[msg.sender] += tokensToBuy;

            charity.donate.value(charityValue)(charityProjects);

         }

         else {

             throw;

         }

     }

 }