function process_contribution(address _toAddr) internal {
    
    require ((campaignState == 2)   
         && (now <= tCampaignEnd)   
         && (paused == false));     
      

    
    if ( (now > tBonusStageEnd) && 
         (now < tRegSaleStart)){ 
      revert(); 
    }

    
    if ((now <= tBonusStageEnd) && 
        ((msg.value < bonusMinContribution ) ||
        (tokensGenerated >= bonusTokenThreshold))) 
    {
      revert();
    }      

    
  
    
    
    require ( msg.value >= minContribution );

    
    
    uint256 rate = get_rate();
    
    
    uint256 nTokens = (rate.mul(msg.value)).div(1 ether);
    
    
    uint256 opEth = (PRCT_ETH_OP.mul(msg.value)).div(100);

    
    opVaultAddr.transfer(opEth);
    
    
    
    require( do_grant_tokens(_toAddr, nTokens) );


    amountRaised = amountRaised.add(msg.value);
    
    
    TokenGranted(_toAddr, nTokens);
    TotalRaised(amountRaised);
  }