ETH Price: $1,812.64 (-3.22%)

Transaction Decoder

Block:
4435747 at Oct-26-2017 11:00:17 PM +UTC
Transaction Fee:
0.001660932 ETH $3.01
Gas Used:
79,092 Gas / 21 Gwei

Emitted Events:

5 FlipToken.Mint( to=[Sender] 0x993297f85da44df0256721eb98f191f37be2847c, amount=468000000000000000000 )
6 FlipToken.Transfer( from=0x0000000000000000000000000000000000000000, to=[Sender] 0x993297f85da44df0256721eb98f191f37be2847c, value=468000000000000000000 )
7 PreSaleExtended.TokenPurchase( purchaser=[Sender] 0x993297f85da44df0256721eb98f191f37be2847c, beneficiary=[Sender] 0x993297f85da44df0256721eb98f191f37be2847c, value=1800000000000000000, amount=468000000000000000000 )
8 MultiSigWalletWithDailyLimit.Deposit( sender=[Receiver] PreSaleExtended, value=1800000000000000000 )

Account State Difference:

  Address   Before After State Difference Code
0x158F3A8D...7Ecef0AD4
(GameFlipWallet)
1,698.588122431000480101 Eth1,700.388122431000480101 Eth1.8
0x3a1Bda28...20F79BcD3
0x5CDd8211...4907FC85f
(GameFlipPreSaleExtended)
0x993297f8...37be2847C
1.858386013022843626 Eth
Nonce: 246
0.056725081022843626 Eth
Nonce: 247
1.801660932
0.027943962 Eth0.029604894 Eth0.001660932

Execution Trace

ETH 1.8 PreSaleExtended.CALL( )
  • FlipToken.mint( _to=0x993297f85da44DF0256721Eb98f191f37be2847C, _amount=468000000000000000000 ) => ( True )
  • ETH 1.8 MultiSigWalletWithDailyLimit.CALL( )
    File 1 of 3: PreSaleExtended
    pragma solidity ^0.4.15;
    
    library SafeMath {
      function mul(uint256 a, uint256 b) internal constant returns (uint256) {
        uint256 c = a * b;
        assert(a == 0 || c / a == b);
        return c;
      }
    
      function div(uint256 a, uint256 b) internal constant returns (uint256) {
        // assert(b > 0); // Solidity automatically throws when dividing by 0
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return c;
      }
    
      function sub(uint256 a, uint256 b) internal constant returns (uint256) {
        assert(b <= a);
        return a - b;
      }
    
      function add(uint256 a, uint256 b) internal constant returns (uint256) {
        uint256 c = a + b;
        assert(c >= a);
        return c;
      }
    }
    
    contract Crowdsale {
      using SafeMath for uint256;
    
      // The token being sold
      MintableToken public token;
    
      // start and end timestamps where investments are allowed (both inclusive)
      uint256 public startTime;
      uint256 public endTime;
    
      // address where funds are collected
      address public wallet;
    
      // how many token units a buyer gets per wei
      uint256 public rate;
    
      // amount of raised money in wei
      uint256 public weiRaised;
    
      /**
       * event for token purchase logging
       * @param purchaser who paid for the tokens
       * @param beneficiary who got the tokens
       * @param value weis paid for purchase
       * @param amount amount of tokens purchased
       */
      event TokenPurchase(address indexed purchaser, address indexed beneficiary, uint256 value, uint256 amount);
    
    
      function Crowdsale(uint256 _startTime, uint256 _endTime, uint256 _rate, address _wallet) {
        require(_startTime >= now);
        require(_endTime >= _startTime);
        require(_rate > 0);
        require(_wallet != 0x0);
    
        token = createTokenContract();
        startTime = _startTime;
        endTime = _endTime;
        rate = _rate;
        wallet = _wallet;
      }
    
      // creates the token to be sold.
      // override this method to have crowdsale of a specific mintable token.
      function createTokenContract() internal returns (MintableToken) {
        return new MintableToken();
      }
    
    
      // fallback function can be used to buy tokens
      function () payable {
        buyTokens(msg.sender);
      }
    
      // low level token purchase function
      function buyTokens(address beneficiary) public payable {
        require(beneficiary != 0x0);
        require(validPurchase());
    
        uint256 weiAmount = msg.value;
    
        // calculate token amount to be created
        uint256 tokens = weiAmount.mul(rate);
    
        // update state
        weiRaised = weiRaised.add(weiAmount);
    
        token.mint(beneficiary, tokens);
        TokenPurchase(msg.sender, beneficiary, weiAmount, tokens);
    
        forwardFunds();
      }
    
      // send ether to the fund collection wallet
      // override to create custom fund forwarding mechanisms
      function forwardFunds() internal {
        wallet.transfer(msg.value);
      }
    
      // @return true if the transaction can buy tokens
      function validPurchase() internal constant returns (bool) {
        bool withinPeriod = now >= startTime && now <= endTime;
        bool nonZeroPurchase = msg.value != 0;
        return withinPeriod && nonZeroPurchase;
      }
    
      // @return true if crowdsale event has ended
      function hasEnded() public constant returns (bool) {
        return now > endTime;
      }
    
    
    }
    
    contract Ownable {
      address public owner;
    
    
      event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    
    
      /**
       * @dev The Ownable constructor sets the original `owner` of the contract to the sender
       * account.
       */
      function Ownable() {
        owner = msg.sender;
      }
    
    
      /**
       * @dev Throws if called by any account other than the owner.
       */
      modifier onlyOwner() {
        require(msg.sender == owner);
        _;
      }
    
    
      /**
       * @dev Allows the current owner to transfer control of the contract to a newOwner.
       * @param newOwner The address to transfer ownership to.
       */
      function transferOwnership(address newOwner) onlyOwner public {
        require(newOwner != address(0));
        OwnershipTransferred(owner, newOwner);
        owner = newOwner;
      }
    
    }
    
    contract FinalizableCrowdsale is Crowdsale, Ownable {
      using SafeMath for uint256;
    
      bool public isFinalized = false;
    
      event Finalized();
    
      /**
       * @dev Must be called after crowdsale ends, to do some extra finalization
       * work. Calls the contract's finalization function.
       */
      function finalize() onlyOwner public {
        require(!isFinalized);
        require(hasEnded());
    
        finalization();
        Finalized();
    
        isFinalized = true;
      }
    
      /**
       * @dev Can be overridden to add finalization logic. The overriding function
       * should call super.finalization() to ensure the chain of finalization is
       * executed entirely.
       */
      function finalization() internal {
      }
    }
    
    contract Pausable is Ownable {
      event Pause();
      event Unpause();
    
      bool public paused = false;
    
    
      /**
       * @dev Modifier to make a function callable only when the contract is not paused.
       */
      modifier whenNotPaused() {
        require(!paused);
        _;
      }
    
      /**
       * @dev Modifier to make a function callable only when the contract is paused.
       */
      modifier whenPaused() {
        require(paused);
        _;
      }
    
      /**
       * @dev called by the owner to pause, triggers stopped state
       */
      function pause() onlyOwner whenNotPaused public {
        paused = true;
        Pause();
      }
    
      /**
       * @dev called by the owner to unpause, returns to normal state
       */
      function unpause() onlyOwner whenPaused public {
        paused = false;
        Unpause();
      }
    }
    
    contract Contactable is Ownable{
    
        string public contactInformation;
    
        /**
         * @dev Allows the owner to set a string with their contact information.
         * @param info The contact information to attach to the contract.
         */
        function setContactInformation(string info) onlyOwner public {
             contactInformation = info;
         }
    }
    
    contract HasNoContracts is Ownable {
    
      /**
       * @dev Reclaim ownership of Ownable contracts
       * @param contractAddr The address of the Ownable to be reclaimed.
       */
      function reclaimContract(address contractAddr) external onlyOwner {
        Ownable contractInst = Ownable(contractAddr);
        contractInst.transferOwnership(owner);
      }
    }
    
    contract HasNoEther is Ownable {
    
      /**
      * @dev Constructor that rejects incoming Ether
      * @dev The `payable` flag is added so we can access `msg.value` without compiler warning. If we
      * leave out payable, then Solidity will allow inheriting contracts to implement a payable
      * constructor. By doing it this way we prevent a payable constructor from working. Alternatively
      * we could use assembly to access msg.value.
      */
      function HasNoEther() payable {
        require(msg.value == 0);
      }
    
      /**
       * @dev Disallows direct send by settings a default function without the `payable` flag.
       */
      function() external {
      }
    
      /**
       * @dev Transfer all Ether held by the contract to the owner.
       */
      function reclaimEther() external onlyOwner {
        assert(owner.send(this.balance));
      }
    }
    
    contract ERC20Basic {
      uint256 public totalSupply;
      function balanceOf(address who) public constant returns (uint256);
      function transfer(address to, uint256 value) public returns (bool);
      event Transfer(address indexed from, address indexed to, uint256 value);
    }
    
    contract BasicToken is ERC20Basic {
      using SafeMath for uint256;
    
      mapping(address => uint256) balances;
    
      /**
      * @dev transfer token for a specified address
      * @param _to The address to transfer to.
      * @param _value The amount to be transferred.
      */
      function transfer(address _to, uint256 _value) public returns (bool) {
        require(_to != address(0));
    
        // SafeMath.sub will throw if there is not enough balance.
        balances[msg.sender] = balances[msg.sender].sub(_value);
        balances[_to] = balances[_to].add(_value);
        Transfer(msg.sender, _to, _value);
        return true;
      }
    
      /**
      * @dev Gets the balance of the specified address.
      * @param _owner The address to query the the balance of.
      * @return An uint256 representing the amount owned by the passed address.
      */
      function balanceOf(address _owner) public constant returns (uint256 balance) {
        return balances[_owner];
      }
    
    }
    
    contract ERC20 is ERC20Basic {
      function allowance(address owner, address spender) public constant returns (uint256);
      function transferFrom(address from, address to, uint256 value) public returns (bool);
      function approve(address spender, uint256 value) public returns (bool);
      event Approval(address indexed owner, address indexed spender, uint256 value);
    }
    
    library SafeERC20 {
      function safeTransfer(ERC20Basic token, address to, uint256 value) internal {
        assert(token.transfer(to, value));
      }
    
      function safeTransferFrom(ERC20 token, address from, address to, uint256 value) internal {
        assert(token.transferFrom(from, to, value));
      }
    
      function safeApprove(ERC20 token, address spender, uint256 value) internal {
        assert(token.approve(spender, value));
      }
    }
    
    contract CanReclaimToken is Ownable {
      using SafeERC20 for ERC20Basic;
    
      /**
       * @dev Reclaim all ERC20Basic compatible tokens
       * @param token ERC20Basic The address of the token contract
       */
      function reclaimToken(ERC20Basic token) external onlyOwner {
        uint256 balance = token.balanceOf(this);
        token.safeTransfer(owner, balance);
      }
    
    }
    
    contract HasNoTokens is CanReclaimToken {
    
     /**
      * @dev Reject all ERC23 compatible tokens
      * @param from_ address The address that is transferring the tokens
      * @param value_ uint256 the amount of the specified token
      * @param data_ Bytes The data passed from the caller.
      */
      function tokenFallback(address from_, uint256 value_, bytes data_) external {
        revert();
      }
    
    }
    
    contract StandardToken is ERC20, BasicToken {
    
      mapping (address => mapping (address => uint256)) allowed;
    
    
      /**
       * @dev Transfer tokens from one address to another
       * @param _from address The address which you want to send tokens from
       * @param _to address The address which you want to transfer to
       * @param _value uint256 the amount of tokens to be transferred
       */
      function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
        require(_to != address(0));
    
        uint256 _allowance = allowed[_from][msg.sender];
    
        // Check is not needed because sub(_allowance, _value) will already throw if this condition is not met
        // require (_value <= _allowance);
    
        balances[_from] = balances[_from].sub(_value);
        balances[_to] = balances[_to].add(_value);
        allowed[_from][msg.sender] = _allowance.sub(_value);
        Transfer(_from, _to, _value);
        return true;
      }
    
      /**
       * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
       *
       * Beware that changing an allowance with this method brings the risk that someone may use both the old
       * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
       * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
       * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
       * @param _spender The address which will spend the funds.
       * @param _value The amount of tokens to be spent.
       */
      function approve(address _spender, uint256 _value) public returns (bool) {
        allowed[msg.sender][_spender] = _value;
        Approval(msg.sender, _spender, _value);
        return true;
      }
    
      /**
       * @dev Function to check the amount of tokens that an owner allowed to a spender.
       * @param _owner address The address which owns the funds.
       * @param _spender address The address which will spend the funds.
       * @return A uint256 specifying the amount of tokens still available for the spender.
       */
      function allowance(address _owner, address _spender) public constant returns (uint256 remaining) {
        return allowed[_owner][_spender];
      }
    
      /**
       * approve should be called when allowed[_spender] == 0. To increment
       * allowed value is better to use this function to avoid 2 calls (and wait until
       * the first transaction is mined)
       * From MonolithDAO Token.sol
       */
      function increaseApproval (address _spender, uint _addedValue)
        returns (bool success) {
        allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
        Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
        return true;
      }
    
      function decreaseApproval (address _spender, uint _subtractedValue)
        returns (bool success) {
        uint oldValue = allowed[msg.sender][_spender];
        if (_subtractedValue > oldValue) {
          allowed[msg.sender][_spender] = 0;
        } else {
          allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
        }
        Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
        return true;
      }
    
    }
    
    contract MintableToken is StandardToken, Ownable {
      event Mint(address indexed to, uint256 amount);
      event MintFinished();
    
      bool public mintingFinished = false;
    
    
      modifier canMint() {
        require(!mintingFinished);
        _;
      }
    
      /**
       * @dev Function to mint tokens
       * @param _to The address that will receive the minted tokens.
       * @param _amount The amount of tokens to mint.
       * @return A boolean that indicates if the operation was successful.
       */
      function mint(address _to, uint256 _amount) onlyOwner canMint public returns (bool) {
        totalSupply = totalSupply.add(_amount);
        balances[_to] = balances[_to].add(_amount);
        Mint(_to, _amount);
        Transfer(0x0, _to, _amount);
        return true;
      }
    
      /**
       * @dev Function to stop minting new tokens.
       * @return True if the operation was successful.
       */
      function finishMinting() onlyOwner public returns (bool) {
        mintingFinished = true;
        MintFinished();
        return true;
      }
    }
    
    contract PausableToken is StandardToken, Pausable {
    
      function transfer(address _to, uint256 _value) public whenNotPaused returns (bool) {
        return super.transfer(_to, _value);
      }
    
      function transferFrom(address _from, address _to, uint256 _value) public whenNotPaused returns (bool) {
        return super.transferFrom(_from, _to, _value);
      }
    
      function approve(address _spender, uint256 _value) public whenNotPaused returns (bool) {
        return super.approve(_spender, _value);
      }
    
      function increaseApproval(address _spender, uint _addedValue) public whenNotPaused returns (bool success) {
        return super.increaseApproval(_spender, _addedValue);
      }
    
      function decreaseApproval(address _spender, uint _subtractedValue) public whenNotPaused returns (bool success) {
        return super.decreaseApproval(_spender, _subtractedValue);
      }
    }
    
    contract FlipCrowdsale is Contactable, Pausable, HasNoContracts, HasNoTokens, FinalizableCrowdsale {
        using SafeMath for uint256;
    
        uint256 public tokensSold = 0;
    
        // ignore the Crowdsale.rate and dynamically compute rate based on other factors (e.g. purchase amount, time, etc)
        function FlipCrowdsale(MintableToken _token, uint256 _startTime, uint256 _endTime, address _ethWallet)
        Ownable()
        Pausable()
        Contactable()
        HasNoTokens()
        HasNoContracts()
        Crowdsale(_startTime, _endTime, 1, _ethWallet)
        FinalizableCrowdsale()
        {
            // deployment must set token.owner = FlipCrowdsale.address to allow minting
            token = _token;
            contactInformation = 'https://tokensale.gameflip.com/';
        }
    
        function setWallet(address _wallet) onlyOwner public {
            require(_wallet != 0x0);
            wallet = _wallet;
        }
    
        // over-ridden low level token purchase function so that we
        // can control the token-per-wei exchange rate dynamically
        function buyTokens(address beneficiary) public payable whenNotPaused {
            require(beneficiary != 0x0);
            require(validPurchase());
    
            uint256 weiAmount = msg.value;
    
            // calculate token amount to be created
            uint256 tokens = applyExchangeRate(weiAmount);
    
            // update state
            weiRaised = weiRaised.add(weiAmount);
            tokensSold = tokensSold.add(tokens);
    
            token.mint(beneficiary, tokens);
            TokenPurchase(msg.sender, beneficiary, weiAmount, tokens);
    
            forwardFunds();
        }
    
        function tokenTransferOwnership(address newOwner) public onlyOwner {
            require(hasEnded());
            token.transferOwnership(newOwner);
        }
    
        /**
        * @dev Allows the current owner to transfer control of the contract to a newOwner.
        * @param newOwner The address to transfer ownership to.
        */
        function transferOwnership(address newOwner) onlyOwner public {
            // do not allow self ownership
            require(newOwner != address(this));
            super.transferOwnership(newOwner);
        }
    
        // overriding Crowdsale#hasEnded to add cap logic
        // @return true if crowdsale event has ended
        function hasEnded() public constant returns (bool) {
            bool capReached = tokensRemaining() == 0;
            return super.hasEnded() || capReached;
        }
    
        // sub-classes must override to control tokens sales cap
        function tokensRemaining() constant public returns (uint256);
    
    
        /*
         * internal functions
         */
        function createTokenContract() internal returns (MintableToken) {
            return token;
        }
    
        // sub-classes must override to customize token-per-wei exchange rate
        function applyExchangeRate(uint256 _wei) constant internal returns (uint256);
    
        /**
           * @dev Can be overridden to add finalization logic. The overriding function
           * should call super.finalization() to ensure the chain of finalization is
           * executed entirely.
           */
        function finalization() internal {
            // if we own the token, pass ownership to our owner when finalized
            if(address(token) != address(0) && token.owner() == address(this) && owner != address(0)) {
                token.transferOwnership(owner);
            }
            super.finalization();
        }
    }
    
    contract FlipToken is Contactable, HasNoTokens, HasNoEther, MintableToken, PausableToken {
    
        string public constant name = "FLIP Token";
        string public constant symbol = "FLP";
        uint8 public constant decimals = 18;
    
        uint256 public constant ONE_TOKENS = (10 ** uint256(decimals));
        uint256 public constant MILLION_TOKENS = (10**6) * ONE_TOKENS;
        uint256 public constant TOTAL_TOKENS = 100 * MILLION_TOKENS;
    
        function FlipToken()
        Ownable()
        Contactable()
        HasNoTokens()
        HasNoEther()
        MintableToken()
        PausableToken()
        {
            contactInformation = 'https://tokensale.gameflip.com/';
        }
    
        // cap minting so that totalSupply <= TOTAL_TOKENS
        function mint(address _to, uint256 _amount) onlyOwner canMint public returns (bool) {
            require(totalSupply.add(_amount) <= TOTAL_TOKENS);
            return super.mint(_to, _amount);
        }
    
    
        /**
        * @dev Allows the current owner to transfer control of the contract to a newOwner.
        * @param newOwner The address to transfer ownership to.
        */
        function transferOwnership(address newOwner) onlyOwner public {
            // do not allow self ownership
            require(newOwner != address(this));
            super.transferOwnership(newOwner);
        }
    }
    
    contract PreSale is FlipCrowdsale {
        using SafeMath for uint256;
    
        uint256 public constant PRESALE_TOKEN_CAP = 238 * (10**4) * (10 ** uint256(18)); // 2.38 million tokens
        uint256 public minPurchaseAmt = 3 ether;
    
        function PreSale(MintableToken _token, uint256 _startTime, uint256 _endTime, address _ethWallet)
        FlipCrowdsale(_token, _startTime, _endTime, _ethWallet)
        {
        }
    
        function setMinPurchaseAmt(uint256 _wei) onlyOwner public {
            require(_wei >= 0);
            minPurchaseAmt = _wei;
        }
    
        function tokensRemaining() constant public returns (uint256) {
            return PRESALE_TOKEN_CAP.sub(tokensSold);
        }
    
        /*
         * internal functions
         */
    
        function applyExchangeRate(uint256 _wei) constant internal returns (uint256) {
            // white paper (6.3 Token Pre-Sale) specifies rates based on purchase value
            // those values here hard-coded here
            require(_wei >= minPurchaseAmt);
            uint256 tokens;
            if(_wei >= 5000 ether) {
                tokens = _wei.mul(340);
            } else if(_wei >= 3000 ether) {
                tokens = _wei.mul(320);
            } else if(_wei >= 1000 ether) {
                tokens = _wei.mul(300);
            } else if(_wei >= 100 ether) {
                tokens = _wei.mul(280);
            } else {
                tokens = _wei.mul(260);
            }
            // check token cap
            uint256 remaining = tokensRemaining();
            require(remaining >= tokens);
            // if remaining tokens cannot be purchased (at min rate) then gift to current buyer ... it's a sellout!
            uint256 min_tokens_purchasable = minPurchaseAmt.mul(260);
            remaining = remaining.sub(tokens);
            if(remaining < min_tokens_purchasable) {
                tokens = tokens.add(remaining);
            }
            return tokens;
        }
    
    }
    
    contract PreSaleExtended is PreSale {
        using SafeMath for uint256;
    
        uint256 public extendedTokenCap;
    
        function PreSaleExtended(MintableToken _token, uint256 _startTime, uint256 _endTime, address _ethWallet)
        PreSale(_token, _startTime, _endTime, _ethWallet)
        {
            minPurchaseAmt = 1 ether;
        }
    
        function setExtendedTokenCap(uint256 _extendedTokenCap) public onlyOwner returns(uint256) {
            require(_extendedTokenCap <= PRESALE_TOKEN_CAP); // not over initial presale hard-cap
            require(_extendedTokenCap > extendedTokenCap);  // not decreasing existing cap
            extendedTokenCap = _extendedTokenCap;
        }
    
        function tokensRemaining() constant public returns (uint256) {
            return extendedTokenCap.sub(tokensSold);
        }
    
    }

    File 2 of 3: FlipToken
    pragma solidity ^0.4.15;
    
    library SafeMath {
      function mul(uint256 a, uint256 b) internal constant returns (uint256) {
        uint256 c = a * b;
        assert(a == 0 || c / a == b);
        return c;
      }
    
      function div(uint256 a, uint256 b) internal constant returns (uint256) {
        // assert(b > 0); // Solidity automatically throws when dividing by 0
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return c;
      }
    
      function sub(uint256 a, uint256 b) internal constant returns (uint256) {
        assert(b <= a);
        return a - b;
      }
    
      function add(uint256 a, uint256 b) internal constant returns (uint256) {
        uint256 c = a + b;
        assert(c >= a);
        return c;
      }
    }
    
    contract Ownable {
      address public owner;
    
    
      event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    
    
      /**
       * @dev The Ownable constructor sets the original `owner` of the contract to the sender
       * account.
       */
      function Ownable() {
        owner = msg.sender;
      }
    
    
      /**
       * @dev Throws if called by any account other than the owner.
       */
      modifier onlyOwner() {
        require(msg.sender == owner);
        _;
      }
    
    
      /**
       * @dev Allows the current owner to transfer control of the contract to a newOwner.
       * @param newOwner The address to transfer ownership to.
       */
      function transferOwnership(address newOwner) onlyOwner public {
        require(newOwner != address(0));
        OwnershipTransferred(owner, newOwner);
        owner = newOwner;
      }
    
    }
    
    contract Pausable is Ownable {
      event Pause();
      event Unpause();
    
      bool public paused = false;
    
    
      /**
       * @dev Modifier to make a function callable only when the contract is not paused.
       */
      modifier whenNotPaused() {
        require(!paused);
        _;
      }
    
      /**
       * @dev Modifier to make a function callable only when the contract is paused.
       */
      modifier whenPaused() {
        require(paused);
        _;
      }
    
      /**
       * @dev called by the owner to pause, triggers stopped state
       */
      function pause() onlyOwner whenNotPaused public {
        paused = true;
        Pause();
      }
    
      /**
       * @dev called by the owner to unpause, returns to normal state
       */
      function unpause() onlyOwner whenPaused public {
        paused = false;
        Unpause();
      }
    }
    
    contract Contactable is Ownable{
    
        string public contactInformation;
    
        /**
         * @dev Allows the owner to set a string with their contact information.
         * @param info The contact information to attach to the contract.
         */
        function setContactInformation(string info) onlyOwner public {
             contactInformation = info;
         }
    }
    
    contract HasNoEther is Ownable {
    
      /**
      * @dev Constructor that rejects incoming Ether
      * @dev The `payable` flag is added so we can access `msg.value` without compiler warning. If we
      * leave out payable, then Solidity will allow inheriting contracts to implement a payable
      * constructor. By doing it this way we prevent a payable constructor from working. Alternatively
      * we could use assembly to access msg.value.
      */
      function HasNoEther() payable {
        require(msg.value == 0);
      }
    
      /**
       * @dev Disallows direct send by settings a default function without the `payable` flag.
       */
      function() external {
      }
    
      /**
       * @dev Transfer all Ether held by the contract to the owner.
       */
      function reclaimEther() external onlyOwner {
        assert(owner.send(this.balance));
      }
    }
    
    contract ERC20Basic {
      uint256 public totalSupply;
      function balanceOf(address who) public constant returns (uint256);
      function transfer(address to, uint256 value) public returns (bool);
      event Transfer(address indexed from, address indexed to, uint256 value);
    }
    
    contract BasicToken is ERC20Basic {
      using SafeMath for uint256;
    
      mapping(address => uint256) balances;
    
      /**
      * @dev transfer token for a specified address
      * @param _to The address to transfer to.
      * @param _value The amount to be transferred.
      */
      function transfer(address _to, uint256 _value) public returns (bool) {
        require(_to != address(0));
    
        // SafeMath.sub will throw if there is not enough balance.
        balances[msg.sender] = balances[msg.sender].sub(_value);
        balances[_to] = balances[_to].add(_value);
        Transfer(msg.sender, _to, _value);
        return true;
      }
    
      /**
      * @dev Gets the balance of the specified address.
      * @param _owner The address to query the the balance of.
      * @return An uint256 representing the amount owned by the passed address.
      */
      function balanceOf(address _owner) public constant returns (uint256 balance) {
        return balances[_owner];
      }
    
    }
    
    contract ERC20 is ERC20Basic {
      function allowance(address owner, address spender) public constant returns (uint256);
      function transferFrom(address from, address to, uint256 value) public returns (bool);
      function approve(address spender, uint256 value) public returns (bool);
      event Approval(address indexed owner, address indexed spender, uint256 value);
    }
    
    library SafeERC20 {
      function safeTransfer(ERC20Basic token, address to, uint256 value) internal {
        assert(token.transfer(to, value));
      }
    
      function safeTransferFrom(ERC20 token, address from, address to, uint256 value) internal {
        assert(token.transferFrom(from, to, value));
      }
    
      function safeApprove(ERC20 token, address spender, uint256 value) internal {
        assert(token.approve(spender, value));
      }
    }
    
    contract CanReclaimToken is Ownable {
      using SafeERC20 for ERC20Basic;
    
      /**
       * @dev Reclaim all ERC20Basic compatible tokens
       * @param token ERC20Basic The address of the token contract
       */
      function reclaimToken(ERC20Basic token) external onlyOwner {
        uint256 balance = token.balanceOf(this);
        token.safeTransfer(owner, balance);
      }
    
    }
    
    contract HasNoTokens is CanReclaimToken {
    
     /**
      * @dev Reject all ERC23 compatible tokens
      * @param from_ address The address that is transferring the tokens
      * @param value_ uint256 the amount of the specified token
      * @param data_ Bytes The data passed from the caller.
      */
      function tokenFallback(address from_, uint256 value_, bytes data_) external {
        revert();
      }
    
    }
    
    contract StandardToken is ERC20, BasicToken {
    
      mapping (address => mapping (address => uint256)) allowed;
    
    
      /**
       * @dev Transfer tokens from one address to another
       * @param _from address The address which you want to send tokens from
       * @param _to address The address which you want to transfer to
       * @param _value uint256 the amount of tokens to be transferred
       */
      function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
        require(_to != address(0));
    
        uint256 _allowance = allowed[_from][msg.sender];
    
        // Check is not needed because sub(_allowance, _value) will already throw if this condition is not met
        // require (_value <= _allowance);
    
        balances[_from] = balances[_from].sub(_value);
        balances[_to] = balances[_to].add(_value);
        allowed[_from][msg.sender] = _allowance.sub(_value);
        Transfer(_from, _to, _value);
        return true;
      }
    
      /**
       * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
       *
       * Beware that changing an allowance with this method brings the risk that someone may use both the old
       * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
       * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
       * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
       * @param _spender The address which will spend the funds.
       * @param _value The amount of tokens to be spent.
       */
      function approve(address _spender, uint256 _value) public returns (bool) {
        allowed[msg.sender][_spender] = _value;
        Approval(msg.sender, _spender, _value);
        return true;
      }
    
      /**
       * @dev Function to check the amount of tokens that an owner allowed to a spender.
       * @param _owner address The address which owns the funds.
       * @param _spender address The address which will spend the funds.
       * @return A uint256 specifying the amount of tokens still available for the spender.
       */
      function allowance(address _owner, address _spender) public constant returns (uint256 remaining) {
        return allowed[_owner][_spender];
      }
    
      /**
       * approve should be called when allowed[_spender] == 0. To increment
       * allowed value is better to use this function to avoid 2 calls (and wait until
       * the first transaction is mined)
       * From MonolithDAO Token.sol
       */
      function increaseApproval (address _spender, uint _addedValue)
        returns (bool success) {
        allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
        Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
        return true;
      }
    
      function decreaseApproval (address _spender, uint _subtractedValue)
        returns (bool success) {
        uint oldValue = allowed[msg.sender][_spender];
        if (_subtractedValue > oldValue) {
          allowed[msg.sender][_spender] = 0;
        } else {
          allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
        }
        Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
        return true;
      }
    
    }
    
    contract MintableToken is StandardToken, Ownable {
      event Mint(address indexed to, uint256 amount);
      event MintFinished();
    
      bool public mintingFinished = false;
    
    
      modifier canMint() {
        require(!mintingFinished);
        _;
      }
    
      /**
       * @dev Function to mint tokens
       * @param _to The address that will receive the minted tokens.
       * @param _amount The amount of tokens to mint.
       * @return A boolean that indicates if the operation was successful.
       */
      function mint(address _to, uint256 _amount) onlyOwner canMint public returns (bool) {
        totalSupply = totalSupply.add(_amount);
        balances[_to] = balances[_to].add(_amount);
        Mint(_to, _amount);
        Transfer(0x0, _to, _amount);
        return true;
      }
    
      /**
       * @dev Function to stop minting new tokens.
       * @return True if the operation was successful.
       */
      function finishMinting() onlyOwner public returns (bool) {
        mintingFinished = true;
        MintFinished();
        return true;
      }
    }
    
    contract PausableToken is StandardToken, Pausable {
    
      function transfer(address _to, uint256 _value) public whenNotPaused returns (bool) {
        return super.transfer(_to, _value);
      }
    
      function transferFrom(address _from, address _to, uint256 _value) public whenNotPaused returns (bool) {
        return super.transferFrom(_from, _to, _value);
      }
    
      function approve(address _spender, uint256 _value) public whenNotPaused returns (bool) {
        return super.approve(_spender, _value);
      }
    
      function increaseApproval(address _spender, uint _addedValue) public whenNotPaused returns (bool success) {
        return super.increaseApproval(_spender, _addedValue);
      }
    
      function decreaseApproval(address _spender, uint _subtractedValue) public whenNotPaused returns (bool success) {
        return super.decreaseApproval(_spender, _subtractedValue);
      }
    }
    
    contract FlipToken is Contactable, HasNoTokens, HasNoEther, MintableToken, PausableToken {
    
        string public constant name = "FLIP Token";
        string public constant symbol = "FLP";
        uint8 public constant decimals = 18;
    
        uint256 public constant ONE_TOKENS = (10 ** uint256(decimals));
        uint256 public constant MILLION_TOKENS = (10**6) * ONE_TOKENS;
        uint256 public constant TOTAL_TOKENS = 100 * MILLION_TOKENS;
    
        function FlipToken()
        Ownable()
        Contactable()
        HasNoTokens()
        HasNoEther()
        MintableToken()
        PausableToken()
        {
            contactInformation = 'https://tokensale.gameflip.com/';
        }
    
        // cap minting so that totalSupply <= TOTAL_TOKENS
        function mint(address _to, uint256 _amount) onlyOwner canMint public returns (bool) {
            require(totalSupply.add(_amount) <= TOTAL_TOKENS);
            return super.mint(_to, _amount);
        }
    
    
        /**
        * @dev Allows the current owner to transfer control of the contract to a newOwner.
        * @param newOwner The address to transfer ownership to.
        */
        function transferOwnership(address newOwner) onlyOwner public {
            // do not allow self ownership
            require(newOwner != address(this));
            super.transferOwnership(newOwner);
        }
    }

    File 3 of 3: MultiSigWalletWithDailyLimit
    pragma solidity 0.4.4;
    
    
    /// @title Multisignature wallet - Allows multiple parties to agree on transactions before execution.
    /// @author Stefan George - <[email protected]>
    contract MultiSigWallet {
    
        uint constant public MAX_OWNER_COUNT = 50;
    
        event Confirmation(address indexed sender, uint indexed transactionId);
        event Revocation(address indexed sender, uint indexed transactionId);
        event Submission(uint indexed transactionId);
        event Execution(uint indexed transactionId);
        event ExecutionFailure(uint indexed transactionId);
        event Deposit(address indexed sender, uint value);
        event OwnerAddition(address indexed owner);
        event OwnerRemoval(address indexed owner);
        event RequirementChange(uint required);
    
        mapping (uint => Transaction) public transactions;
        mapping (uint => mapping (address => bool)) public confirmations;
        mapping (address => bool) public isOwner;
        address[] public owners;
        uint public required;
        uint public transactionCount;
    
        struct Transaction {
            address destination;
            uint value;
            bytes data;
            bool executed;
        }
    
        modifier onlyWallet() {
            if (msg.sender != address(this))
                throw;
            _;
        }
    
        modifier ownerDoesNotExist(address owner) {
            if (isOwner[owner])
                throw;
            _;
        }
    
        modifier ownerExists(address owner) {
            if (!isOwner[owner])
                throw;
            _;
        }
    
        modifier transactionExists(uint transactionId) {
            if (transactions[transactionId].destination == 0)
                throw;
            _;
        }
    
        modifier confirmed(uint transactionId, address owner) {
            if (!confirmations[transactionId][owner])
                throw;
            _;
        }
    
        modifier notConfirmed(uint transactionId, address owner) {
            if (confirmations[transactionId][owner])
                throw;
            _;
        }
    
        modifier notExecuted(uint transactionId) {
            if (transactions[transactionId].executed)
                throw;
            _;
        }
    
        modifier notNull(address _address) {
            if (_address == 0)
                throw;
            _;
        }
    
        modifier validRequirement(uint ownerCount, uint _required) {
            if (   ownerCount > MAX_OWNER_COUNT
                || _required > ownerCount
                || _required == 0
                || ownerCount == 0)
                throw;
            _;
        }
    
        /// @dev Fallback function allows to deposit ether.
        function()
            payable
        {
            if (msg.value > 0)
                Deposit(msg.sender, msg.value);
        }
    
        /*
         * Public functions
         */
        /// @dev Contract constructor sets initial owners and required number of confirmations.
        /// @param _owners List of initial owners.
        /// @param _required Number of required confirmations.
        function MultiSigWallet(address[] _owners, uint _required)
            public
            validRequirement(_owners.length, _required)
        {
            for (uint i=0; i<_owners.length; i++) {
                if (isOwner[_owners[i]] || _owners[i] == 0)
                    throw;
                isOwner[_owners[i]] = true;
            }
            owners = _owners;
            required = _required;
        }
    
        /// @dev Allows to add a new owner. Transaction has to be sent by wallet.
        /// @param owner Address of new owner.
        function addOwner(address owner)
            public
            onlyWallet
            ownerDoesNotExist(owner)
            notNull(owner)
            validRequirement(owners.length + 1, required)
        {
            isOwner[owner] = true;
            owners.push(owner);
            OwnerAddition(owner);
        }
    
        /// @dev Allows to remove an owner. Transaction has to be sent by wallet.
        /// @param owner Address of owner.
        function removeOwner(address owner)
            public
            onlyWallet
            ownerExists(owner)
        {
            isOwner[owner] = false;
            for (uint i=0; i<owners.length - 1; i++)
                if (owners[i] == owner) {
                    owners[i] = owners[owners.length - 1];
                    break;
                }
            owners.length -= 1;
            if (required > owners.length)
                changeRequirement(owners.length);
            OwnerRemoval(owner);
        }
    
        /// @dev Allows to replace an owner with a new owner. Transaction has to be sent by wallet.
        /// @param owner Address of owner to be replaced.
        /// @param owner Address of new owner.
        function replaceOwner(address owner, address newOwner)
            public
            onlyWallet
            ownerExists(owner)
            ownerDoesNotExist(newOwner)
        {
            for (uint i=0; i<owners.length; i++)
                if (owners[i] == owner) {
                    owners[i] = newOwner;
                    break;
                }
            isOwner[owner] = false;
            isOwner[newOwner] = true;
            OwnerRemoval(owner);
            OwnerAddition(newOwner);
        }
    
        /// @dev Allows to change the number of required confirmations. Transaction has to be sent by wallet.
        /// @param _required Number of required confirmations.
        function changeRequirement(uint _required)
            public
            onlyWallet
            validRequirement(owners.length, _required)
        {
            required = _required;
            RequirementChange(_required);
        }
    
        /// @dev Allows an owner to submit and confirm a transaction.
        /// @param destination Transaction target address.
        /// @param value Transaction ether value.
        /// @param data Transaction data payload.
        /// @return Returns transaction ID.
        function submitTransaction(address destination, uint value, bytes data)
            public
            returns (uint transactionId)
        {
            transactionId = addTransaction(destination, value, data);
            confirmTransaction(transactionId);
        }
    
        /// @dev Allows an owner to confirm a transaction.
        /// @param transactionId Transaction ID.
        function confirmTransaction(uint transactionId)
            public
            ownerExists(msg.sender)
            transactionExists(transactionId)
            notConfirmed(transactionId, msg.sender)
        {
            confirmations[transactionId][msg.sender] = true;
            Confirmation(msg.sender, transactionId);
            executeTransaction(transactionId);
        }
    
        /// @dev Allows an owner to revoke a confirmation for a transaction.
        /// @param transactionId Transaction ID.
        function revokeConfirmation(uint transactionId)
            public
            ownerExists(msg.sender)
            confirmed(transactionId, msg.sender)
            notExecuted(transactionId)
        {
            confirmations[transactionId][msg.sender] = false;
            Revocation(msg.sender, transactionId);
        }
    
        /// @dev Allows anyone to execute a confirmed transaction.
        /// @param transactionId Transaction ID.
        function executeTransaction(uint transactionId)
            public
            notExecuted(transactionId)
        {
            if (isConfirmed(transactionId)) {
                Transaction tx = transactions[transactionId];
                tx.executed = true;
                if (tx.destination.call.value(tx.value)(tx.data))
                    Execution(transactionId);
                else {
                    ExecutionFailure(transactionId);
                    tx.executed = false;
                }
            }
        }
    
        /// @dev Returns the confirmation status of a transaction.
        /// @param transactionId Transaction ID.
        /// @return Confirmation status.
        function isConfirmed(uint transactionId)
            public
            constant
            returns (bool)
        {
            uint count = 0;
            for (uint i=0; i<owners.length; i++) {
                if (confirmations[transactionId][owners[i]])
                    count += 1;
                if (count == required)
                    return true;
            }
        }
    
        /*
         * Internal functions
         */
        /// @dev Adds a new transaction to the transaction mapping, if transaction does not exist yet.
        /// @param destination Transaction target address.
        /// @param value Transaction ether value.
        /// @param data Transaction data payload.
        /// @return Returns transaction ID.
        function addTransaction(address destination, uint value, bytes data)
            internal
            notNull(destination)
            returns (uint transactionId)
        {
            transactionId = transactionCount;
            transactions[transactionId] = Transaction({
                destination: destination,
                value: value,
                data: data,
                executed: false
            });
            transactionCount += 1;
            Submission(transactionId);
        }
    
        /*
         * Web3 call functions
         */
        /// @dev Returns number of confirmations of a transaction.
        /// @param transactionId Transaction ID.
        /// @return Number of confirmations.
        function getConfirmationCount(uint transactionId)
            public
            constant
            returns (uint count)
        {
            for (uint i=0; i<owners.length; i++)
                if (confirmations[transactionId][owners[i]])
                    count += 1;
        }
    
        /// @dev Returns total number of transactions after filers are applied.
        /// @param pending Include pending transactions.
        /// @param executed Include executed transactions.
        /// @return Total number of transactions after filters are applied.
        function getTransactionCount(bool pending, bool executed)
            public
            constant
            returns (uint count)
        {
            for (uint i=0; i<transactionCount; i++)
                if (   pending && !transactions[i].executed
                    || executed && transactions[i].executed)
                    count += 1;
        }
    
        /// @dev Returns list of owners.
        /// @return List of owner addresses.
        function getOwners()
            public
            constant
            returns (address[])
        {
            return owners;
        }
    
        /// @dev Returns array with owner addresses, which confirmed transaction.
        /// @param transactionId Transaction ID.
        /// @return Returns array of owner addresses.
        function getConfirmations(uint transactionId)
            public
            constant
            returns (address[] _confirmations)
        {
            address[] memory confirmationsTemp = new address[](owners.length);
            uint count = 0;
            uint i;
            for (i=0; i<owners.length; i++)
                if (confirmations[transactionId][owners[i]]) {
                    confirmationsTemp[count] = owners[i];
                    count += 1;
                }
            _confirmations = new address[](count);
            for (i=0; i<count; i++)
                _confirmations[i] = confirmationsTemp[i];
        }
    
        /// @dev Returns list of transaction IDs in defined range.
        /// @param from Index start position of transaction array.
        /// @param to Index end position of transaction array.
        /// @param pending Include pending transactions.
        /// @param executed Include executed transactions.
        /// @return Returns array of transaction IDs.
        function getTransactionIds(uint from, uint to, bool pending, bool executed)
            public
            constant
            returns (uint[] _transactionIds)
        {
            uint[] memory transactionIdsTemp = new uint[](transactionCount);
            uint count = 0;
            uint i;
            for (i=0; i<transactionCount; i++)
                if (   pending && !transactions[i].executed
                    || executed && transactions[i].executed)
                {
                    transactionIdsTemp[count] = i;
                    count += 1;
                }
            _transactionIds = new uint[](to - from);
            for (i=from; i<to; i++)
                _transactionIds[i - from] = transactionIdsTemp[i];
        }
    }
    
    
    /// @title Multisignature wallet with daily limit - Allows an owner to withdraw a daily limit without multisig.
    /// @author Stefan George - <[email protected]>
    contract MultiSigWalletWithDailyLimit is MultiSigWallet {
    
        event DailyLimitChange(uint dailyLimit);
    
        uint public dailyLimit;
        uint public lastDay;
        uint public spentToday;
    
        /*
         * Public functions
         */
        /// @dev Contract constructor sets initial owners, required number of confirmations and daily withdraw limit.
        /// @param _owners List of initial owners.
        /// @param _required Number of required confirmations.
        /// @param _dailyLimit Amount in wei, which can be withdrawn without confirmations on a daily basis.
        function MultiSigWalletWithDailyLimit(address[] _owners, uint _required, uint _dailyLimit)
            public
            MultiSigWallet(_owners, _required)
        {
            dailyLimit = _dailyLimit;
        }
    
        /// @dev Allows to change the daily limit. Transaction has to be sent by wallet.
        /// @param _dailyLimit Amount in wei.
        function changeDailyLimit(uint _dailyLimit)
            public
            onlyWallet
        {
            dailyLimit = _dailyLimit;
            DailyLimitChange(_dailyLimit);
        }
    
        /// @dev Allows anyone to execute a confirmed transaction or ether withdraws until daily limit is reached.
        /// @param transactionId Transaction ID.
        function executeTransaction(uint transactionId)
            public
            notExecuted(transactionId)
        {
            Transaction tx = transactions[transactionId];
            bool confirmed = isConfirmed(transactionId);
            if (confirmed || tx.data.length == 0 && isUnderLimit(tx.value)) {
                tx.executed = true;
                if (!confirmed)
                    spentToday += tx.value;
                if (tx.destination.call.value(tx.value)(tx.data))
                    Execution(transactionId);
                else {
                    ExecutionFailure(transactionId);
                    tx.executed = false;
                    if (!confirmed)
                        spentToday -= tx.value;
                }
            }
        }
    
        /*
         * Internal functions
         */
        /// @dev Returns if amount is within daily limit and resets spentToday after one day.
        /// @param amount Amount to withdraw.
        /// @return Returns if amount is under daily limit.
        function isUnderLimit(uint amount)
            internal
            returns (bool)
        {
            if (now > lastDay + 24 hours) {
                lastDay = now;
                spentToday = 0;
            }
            if (spentToday + amount > dailyLimit || spentToday + amount < spentToday)
                return false;
            return true;
        }
    
        /*
         * Web3 call functions
         */
        /// @dev Returns maximum withdraw amount.
        /// @return Returns amount.
        function calcMaxWithdraw()
            public
            constant
            returns (uint)
        {
            if (now > lastDay + 24 hours)
                return dailyLimit;
            if (dailyLimit < spentToday)
                return 0;
            return dailyLimit - spentToday;
        }
    }