public function __construct(SettingRepository $settingRepository)
 {
     $this->settingRepository = $settingRepository;
     $this->publicKey = $this->settingRepository->getSolveMediaChallengeKey();
     $this->privateKey = $this->settingRepository->getSolveMediaVerificationKey();
     $this->hashKey = $this->settingRepository->getSolveMediaAuthenticationKey();
     $this->useSSL = false;
 }
 public function send($address, $amount, $ip, $referral = false)
 {
     $apiKey = $this->settingRepository->getApiKey();
     $query = http_build_query(array('apikey' => $apiKey));
     $url = $this->config['api_url'] . '?' . $query;
     $headers = array('Connection' => 'close');
     $data = http_build_query(array('address' => $address, 'amount' => $amount, 'referral' => $referral, 'ip' => $ip));
     $browser = new Browser();
     $browser->getClient()->setVerifyPeer(false);
     /** @var Response $response */
     try {
         $response = $browser->post($url, $headers, $data);
     } catch (Exception $e) {
         throw new PaytoshiException('Error while posting request', 500, $e);
     }
     $content = json_decode($response->getContent(), true);
     $apiResponse = new ApiResponse($response->isSuccessful(), $response);
     if (!$response->isSuccessful()) {
         if (isset($content['code'])) {
             switch ($content['code']) {
                 case 'NOT_ENOUGH_FUNDS':
                     $apiResponse->setError('Insufficient funds.');
                     break;
                 case 'INVALID_ADDRESS':
                     $apiResponse->setError('Invalid address.');
                     break;
                 case 'FAUCET_DISABLED':
                     $apiResponse->setError('This faucet has been disabled by the owner or the Paytoshi staff.');
                     break;
                 case 'ACCESS_DENIED':
                     $apiResponse->setError('Access denied, please check your apikey.');
                     break;
                 case 'INTERNAL ERROR':
                     $apiResponse->setError('An internal server error has occurred, try again later.');
                     break;
                 case 'BAD_REQUEST':
                     $apiResponse->setError('Invalid request.');
                     break;
                 default:
                     $apiResponse->setError(sprintf("Generic error: %s.", $content['code']));
                     break;
             }
         } else {
             $apiResponse->setError('Generic error.');
         }
         return $apiResponse;
     }
     $apiResponse->setAmount($content['amount']);
     $apiResponse->setRecipient($content['recipient']);
     return $apiResponse;
 }
 public function getTemplate($filename)
 {
     $templateDir = $this->config['template_path'];
     //Before setup there is no theme...
     if ($this->settingRepository) {
         $currentTheme = $this->settingRepository->getTheme();
         $filePath = '.' . DIRECTORY_SEPARATOR . $templateDir . DIRECTORY_SEPARATOR . $currentTheme . DIRECTORY_SEPARATOR . $filename;
         if (is_file($filePath) && is_readable($filePath)) {
             return $currentTheme . DIRECTORY_SEPARATOR . $filename;
         }
     }
     $defaultTheme = $this->config['default_theme'];
     $defaultFilePath = '.' . DIRECTORY_SEPARATOR . $templateDir . DIRECTORY_SEPARATOR . $defaultTheme . DIRECTORY_SEPARATOR . $filename;
     if (is_file($defaultFilePath) && is_readable($defaultFilePath)) {
         return $defaultTheme . DIRECTORY_SEPARATOR . $filename;
     }
     throw new PaytoshiException('Unable to load a theme.');
 }
 public function __construct(SettingRepository $settingRepository)
 {
     $this->settingRepository = $settingRepository;
     $this->publicKey = $this->settingRepository->getRecaptchaPublicKey();
     $this->privateKey = $this->settingRepository->getRecaptchaPrivateKey();
 }
 /**
  * 1. Captcha check
  * 2. Timeout check
  * 3. Reward generation
  * 4. Payout creation
  * 5. Payment process
  * 6. Referral payout creation
  * 7. Referral payment process
  */
 public function reward()
 {
     $address = $this->app->request->post('address');
     $challenge = $this->app->request->post($this->captchaService->getChallengeName());
     $response = $this->app->request->post($this->captchaService->getResponseName());
     if (empty($address) || empty($challenge) || empty($response)) {
         $this->app->flash('warning', 'Missing address or captcha.');
         $this->app->redirect($this->app->urlFor('index'));
         return;
     }
     $remoteIp = $this->ipService->determineClientIpAddress($_SERVER);
     if (!$remoteIp) {
         $this->app->flash('warning', 'Incorrect ip address.');
         $this->app->redirect($this->app->urlFor('index'));
         return;
     }
     // Captcha Check
     try {
         /** @var CaptchaResponse $captchaResponse */
         $captchaResponse = $this->captchaService->checkAnswer($remoteIp, $challenge, $response);
     } catch (CaptchaException $e) {
         $this->app->flash('error', 'Unable to verify captcha.');
         $this->app->redirect($this->app->urlFor('index'));
         return;
     }
     if (!$captchaResponse->getSuccess()) {
         $this->app->flash('error', 'Invalid Captcha');
         $this->app->redirect($this->app->urlFor('index'));
         return;
     }
     try {
         if (!$this->database->beginTransaction()) {
         }
     } catch (PaytoshiException $e) {
         $this->app->flash('error', 'Unable to connect to database.');
         $this->app->redirect($this->app->urlFor('index'));
         return;
     }
     $recipient = $this->recipientRepository->findOneByAddress($address);
     if (!$recipient) {
         $recipient = new Recipient();
         $recipient->setAddress($address);
     }
     // Timeout check
     $lastPayout = $this->payoutRepository->findLastByRecipientAndIp($recipient, $remoteIp);
     $now = new DateTime();
     $waitingInterval = $this->settingRepository->getWaitingInterval();
     if ($lastPayout) {
         $nextPayoutTime = $lastPayout->getCreatedAt()->add(new DateInterval('PT' . $waitingInterval . 'S'));
         if ($nextPayoutTime > $now) {
             $this->database->rollBack();
             $waitingTime = $nextPayoutTime->diff($now);
             $this->app->flash('warning', sprintf('You can get a reward again in %s.', $this->formatTime($waitingTime)));
             $this->app->redirect($this->app->urlFor('index'));
             return;
         }
     }
     // Reward Generation
     $earning = $this->rewardService->getReward();
     // Payout Creation
     $payout = new Payout();
     $payout->setIp($remoteIp);
     $payout->setRecipientAddress($recipient->getAddress());
     $payout->setEarning($earning);
     // Payment process
     try {
         /* @var $apiResponse ApiResponse */
         $apiResponse = $this->apiService->send($payout->getRecipientAddress(), $payout->getEarning(), $remoteIp);
     } catch (PaytoshiException $e) {
         $this->database->rollback();
         $this->app->flash('error', $e->getMessage());
         $this->app->redirect($this->app->urlFor('index'));
         return;
     }
     if (!$apiResponse->getSuccess()) {
         $this->database->rollback();
         $this->app->flash('error', $apiResponse->getError());
         $this->app->redirect($this->app->urlFor('index'));
         return;
     }
     $view = $this->app->view();
     $view->setData(array('amount' => $apiResponse->getAmount(), 'recipient' => $apiResponse->getRecipient(), 'balanceUrl' => str_replace('_ADDRESS_', $address, $this->app->config('balance_url'))));
     $this->recipientRepository->save($recipient);
     $this->app->flash('success', $view->render($this->themeService->getTemplate('balance.html.twig')));
     $_SESSION['address'] = $recipient->getAddress();
     $referral = $this->app->request->post('referral');
     $referralPercentage = $this->settingRepository->getReferralPercentage();
     if ($referral && $referral != $address && $referralPercentage > 0) {
         // Referral Payout Creation
         $referralRecipient = $this->recipientRepository->findOneByAddress($referral);
         if (!$referralRecipient) {
             $referralRecipient = new Recipient();
             $referralRecipient->setAddress($referral);
         }
         $referralEarning = ceil($earning * $referralPercentage / 100);
         $payout->setReferralRecipientAddress($referralRecipient->getAddress());
         $payout->setReferralEarning($referralEarning);
         $referralRecipient->setReferralEarning($referralEarning + $referralRecipient->getReferralEarning());
         // Referral payment process
         try {
             $apiResponse = $this->apiService->send($referralRecipient->getAddress(), $referralRecipient->getReferralEarning(), $remoteIp, true);
         } catch (PaytoshiException $e) {
             $this->payoutRepository->save($payout);
             $this->recipientRepository->save($referralRecipient);
             $this->database->commit();
             $this->app->flash('error', $e->getMessage());
             $this->app->redirect($this->app->urlFor('index'));
             return;
         }
         if ($apiResponse->getSuccess()) {
             $referralRecipient->setReferralEarning(0);
         }
         $this->recipientRepository->save($referralRecipient);
     }
     $this->payoutRepository->save($payout);
     $this->database->commit();
     $this->app->redirect($this->app->urlFor('index'));
 }
 private function getView()
 {
     return array('version' => $this->settingRepository->getVersion(), 'api_key' => $this->settingRepository->getApiKey(), 'name' => $this->settingRepository->getName(), 'description' => $this->settingRepository->getDescription(), 'current_theme' => $this->settingRepository->getTheme(), 'captcha_provider' => $this->settingRepository->getCaptchaProvider(), 'solve_media' => array('challenge_key' => $this->settingRepository->getSolveMediaChallengeKey(), 'verification_key' => $this->settingRepository->getSolveMediaVerificationKey(), 'authentication_key' => $this->settingRepository->getSolveMediaAuthenticationKey()), 'recaptcha' => array('public_key' => $this->settingRepository->getRecaptchaPublicKey(), 'private_key' => $this->settingRepository->getRecaptchaPrivateKey()), 'funcaptcha' => array('public_key' => $this->settingRepository->getFuncaptchaPublicKey(), 'private_key' => $this->settingRepository->getFuncaptchaPrivateKey()), 'waiting_interval' => $this->settingRepository->getWaitingInterval(), 'rewards' => $this->settingRepository->getRewards(), 'referral_percentage' => $this->settingRepository->getReferralPercentage(), 'css' => $this->settingRepository->getCss(), 'header_box' => $this->settingRepository->getHeaderBox(), 'left_box' => $this->settingRepository->getLeftBox(), 'right_box' => $this->settingRepository->getRightBox(), 'center1_box' => $this->settingRepository->getCenter1Box(), 'center2_box' => $this->settingRepository->getCenter2Box(), 'center3_box' => $this->settingRepository->getCenter3Box(), 'footer_box' => $this->settingRepository->getFooterBox());
 }