contract IMoneyContract is ICommonGame, IBalanceInfo {
    function profitValue() public view returns(uint);
    function getDeveloperProfit() public view returns(uint);
    function getCharityProfit() public view returns(uint);
    function getFinalProfit() public view returns(uint);

    function getLastBalance() public view returns(uint);
    function getLastProfitSync() public view returns(uint);

    function getDeveloperShare() public view returns(uint);
    function getCharityShare() public view returns(uint);
    function getFinalShare() public view returns(uint);

    // well anyone can deposit to the contract for the experiment
    function depositToBank() public payable;

    function canUpdatePayout() public view returns(bool);
    function recalculatePayoutValue() public;
    function withdrawPayout() public;
    function withdraw2Address(address addr) public;
    function finishedWithdrawalTime() public view returns(bool);
    function finishedWithdrawalBlock() public view returns(uint);

    function getTotalPayoutValue() public view returns(uint);
    function getPayoutValue(address addr) public view returns(uint);
    function getPayoutValueSender() public view returns(uint);

    // adds the developer to the contract
    function addDeveloper(address dev, string name, string url) public;
    function getDeveloperName(address dev) public view returns (string);
    function getDeveloperUrl(address dev) public view returns (string);
    function developersAdded() public view returns (bool);

    // adds the charity to the contract
    function addCharity(address charity, string name, string url) public;
    function getCharityName(address charity) public view returns (string);
    function getCharityUrl(address charity) public view returns (string);

    function dedicatedCharitySet() public view returns(bool);
    function setDedicatedCharityForNextRound(address charity) public;
    function dedicatedCharityAddress() public view returns(address);

    event MoneyDeposited(address indexed sender, uint value);
    event MoneyWithdrawn(address indexed reciever, uint value);

    event ProfitRecalculated(bool gameFinish, uint developerProfit, uint charityProfit, uint finalProfit, 
    uint developerCount, uint charityCount, bool dedicated, address dedicatedCharity);

    event CharityAdded(address charity, string name, string url);
    event DedicatedCharitySelected(address charity);

    event DeveloperAdded(address developer, string name, string url);
}
function addCharity(address charity, string name, string url) public;

// adds the charity to the contract