private void checkDeliveringTime()
     throws CantExecuteDatabaseOperationException, CantExecuteQueryException,
         UnexpectedResultReturnedFromDatabaseException, CantGetCryptoTransactionException,
         CantGetTransactionsException, CantLoadWalletException, CantRegisterCreditException,
         CantRegisterDebitException, CantGetAssetIssuerActorsException,
         CantSendTransactionNewStatusNotificationException, CantGetAssetUserActorsException,
         CantAssetUserActorNotFoundException, RecordsNotFoundException,
         CantCheckAssetUserRedemptionProgressException, InvalidParameterException {
   for (DeliverRecord record : userRedemptionDao.getDeliveringRecords()) {
     DistributionStatus currentStatus =
         userRedemptionDao.getDistributionStatusForGenesisTx(record.getGenesisTransaction());
     if (new Date().after(record.getTimeOut())
         && currentStatus == DistributionStatus.DELIVERING) {
       try {
         bitcoinNetworkManager.cancelBroadcast(
             record.getDigitalAssetMetadata().getLastTransactionHash());
       } catch (CantCancellBroadcastTransactionException e) {
         e.printStackTrace();
       }
       record.getDigitalAssetMetadata().removeLastTransaction();
       digitalAssetUserRedemptionVault.updateWalletBalance(
           record.getDigitalAssetMetadata(),
           AssetVerification.foundCryptoTransaction(
               bitcoinNetworkManager, record.getDigitalAssetMetadata()),
           BalanceType.AVAILABLE,
           TransactionType.CREDIT,
           DAPTransactionType.RECEPTION,
           record.getRedeemPointPublicKey());
       userRedemptionDao.cancelDelivering(record.getTransactionId());
     }
   }
 }
    /**
     * This method check the pending transactions registered in database and take actions according
     * to CryptoStatus
     *
     * @throws CantExecuteQueryException
     * @throws CantCheckAssetUserRedemptionProgressException
     * @throws CantGetCryptoTransactionException
     * @throws UnexpectedResultReturnedFromDatabaseException
     * @throws CantGetDigitalAssetFromLocalStorageException
     * @throws CantDeliverDigitalAssetToAssetWalletException
     */
    private void checkPendingTransactions()
        throws CantExecuteQueryException, CantCheckAssetUserRedemptionProgressException,
            CantGetCryptoTransactionException, UnexpectedResultReturnedFromDatabaseException,
            CantGetDigitalAssetFromLocalStorageException,
            CantDeliverDigitalAssetToAssetWalletException, CantGetTransactionCryptoStatusException,
            RecordsNotFoundException, CantGetBroadcastStatusException,
            CantCancellBroadcastTransactionException, CantBroadcastTransactionException,
            CantGetTransactionsException, CantGetAssetUserActorsException,
            CantRegisterDebitException, CantAssetUserActorNotFoundException,
            CantLoadWalletException, CantGetAssetIssuerActorsException, CantRegisterCreditException,
            CantCreateDigitalAssetFileException {
      for (DeliverRecord record : userRedemptionDao.getDeliveredRecords()) {
        switch (bitcoinNetworkManager.getCryptoStatus(record.getGenesisTransactionSent())) {
          case ON_BLOCKCHAIN:
          case IRREVERSIBLE:
            CryptoTransaction transactionOnBlockChain =
                AssetVerification.getCryptoTransactionFromCryptoNetworkByCryptoStatus(
                    bitcoinNetworkManager,
                    record.getDigitalAssetMetadata(),
                    CryptoStatus.ON_BLOCKCHAIN);
            if (transactionOnBlockChain == null) break; // not yet...
            DigitalAssetMetadata digitalAssetMetadata =
                digitalAssetUserRedemptionVault.updateMetadataTransactionChain(
                    record.getGenesisTransaction(), transactionOnBlockChain);
            digitalAssetUserRedemptionVault.setDigitalAssetMetadataAssetIssuerWalletTransaction(
                transactionOnBlockChain,
                digitalAssetMetadata,
                AssetBalanceType.BOOK,
                TransactionType.DEBIT,
                DAPTransactionType.RECEPTION,
                record.getRedeemPointPublicKey());
            userRedemptionDao.updateDeliveringStatusForTxId(
                record.getTransactionId(), DistributionStatus.DISTRIBUTION_FINISHED);
            break;
          case REVERSED_ON_BLOCKCHAIN:
            userRedemptionDao.updateDeliveringStatusForTxId(
                record.getTransactionId(), DistributionStatus.DISTRIBUTION_FINISHED);
            break;
          case REVERSED_ON_CRYPTO_NETWORK:
            userRedemptionDao.updateDeliveringStatusForTxId(
                record.getTransactionId(), DistributionStatus.DISTRIBUTION_FINISHED);
            break;
        }
      }

      for (DeliverRecord record : userRedemptionDao.getSendingCryptoRecords()) {
        BroadcastStatus status =
            bitcoinNetworkManager.getBroadcastStatus(record.getGenesisTransactionSent());
        switch (status.getStatus()) {
          case WITH_ERROR:
            System.out.println("VAMM: USER REDEMPTION BROADCAST WITH ERROR");
            if (record.getAttemptNumber()
                < UserRedemptionDigitalAssetTransactionPluginRoot.BROADCASTING_MAX_ATTEMPT_NUMBER) {
              System.out.println("VAMM: ATTEMPT NUMBER: " + record.getAttemptNumber());
              userRedemptionDao.newAttempt(record.getTransactionId());
              bitcoinNetworkManager.broadcastTransaction(record.getGenesisTransactionSent());
            } else {
              System.out.println("VAMM: MAX NUMBER OF ATTEMPT REACHED, CANCELLING.");
              bitcoinNetworkManager.cancelBroadcast(record.getGenesisTransactionSent());
            }
            break;
          case BROADCASTED:
            userRedemptionDao.updateDeliveringStatusForTxId(
                record.getTransactionId(), DistributionStatus.DELIVERED);
            break;
          case BROADCASTING:
            break;
          case CANCELLED:
            digitalAssetUserRedemptionVault.updateWalletBalance(
                record.getDigitalAssetMetadata(),
                AssetVerification.foundCryptoTransaction(
                    bitcoinNetworkManager, record.getDigitalAssetMetadata()),
                BalanceType.AVAILABLE,
                TransactionType.CREDIT,
                DAPTransactionType.DISTRIBUTION,
                record.getRedeemPointPublicKey());
            userRedemptionDao.failedToSendCrypto(record.getTransactionId());
            break;
        }
      }
    }
    private void checkNetworkLayerEvents()
        throws CantConfirmTransactionException, CantExecuteQueryException,
            UnexpectedResultReturnedFromDatabaseException,
            CantCheckAssetUserRedemptionProgressException,
            CantGetDigitalAssetFromLocalStorageException, CantSendAssetBitcoinsToUserException,
            CantGetCryptoTransactionException, CantDeliverDigitalAssetToAssetWalletException,
            CantDistributeDigitalAssetsException, CantDeliverPendingTransactionsException,
            RecordsNotFoundException, CantBroadcastTransactionException,
            CantCreateDigitalAssetFileException, CantLoadWalletException {
      List<Transaction<DigitalAssetMetadataTransaction>> pendingEventsList =
          assetTransmissionManager.getPendingTransactions(Specialist.ASSET_ISSUER_SPECIALIST);
      if (!userRedemptionDao.getPendingNetworkLayerEvents().isEmpty()) {
        for (Transaction<DigitalAssetMetadataTransaction> transaction : pendingEventsList) {
          if (transaction.getInformation().getReceiverType()
                  == PlatformComponentType.ACTOR_ASSET_USER
              && transaction.getInformation().getSenderType()
                  == PlatformComponentType.ACTOR_ASSET_REDEEM_POINT) {
            DigitalAssetMetadataTransaction digitalAssetMetadataTransaction =
                transaction.getInformation();
            System.out.println(
                "ASSET USER REDEMPTION Digital Asset Metadata Transaction: "
                    + digitalAssetMetadataTransaction);
            DigitalAssetMetadataTransactionType digitalAssetMetadataTransactionType =
                digitalAssetMetadataTransaction.getType();
            System.out.println(
                "ASSET USER REDEMPTION Digital Asset Metadata Transaction Type: "
                    + digitalAssetMetadataTransactionType);
            String userId = digitalAssetMetadataTransaction.getSenderId();
            System.out.println("ASSET USER REDEMPTION User Id: " + userId);
            String genesisTransaction = digitalAssetMetadataTransaction.getGenesisTransaction();
            System.out.println("ASSET USER REDEMPTION Genesis Transaction: " + genesisTransaction);
            if (!userRedemptionDao.isGenesisTransactionRegistered(genesisTransaction)) {
              System.out.println("ASSET USET REDEMPTION THIS IS NOT FOR ME!!");
              break;
            }
            DistributionStatus distributionStatus =
                digitalAssetMetadataTransaction.getDistributionStatus();
            userRedemptionDao.updateDistributionStatusByGenesisTransaction(
                distributionStatus, genesisTransaction);
            assetTransmissionManager.confirmReception(transaction.getTransactionID());
          }
        }
        userRedemptionDao.updateEventStatus(
            userRedemptionDao.getPendingNetworkLayerEvents().get(0));
      }

      List<String> assetAcceptedGenesisTransactionList =
          userRedemptionDao.getGenesisTransactionByAssetAcceptedStatus();
      for (String assetAcceptedGenesisTransaction : assetAcceptedGenesisTransactionList) {
        String actorUserCryptoAddress =
            userRedemptionDao.getActorRedeemPointCryptoAddressByGenesisTransaction(
                assetAcceptedGenesisTransaction);
        System.out.println(
            "ASSET USER REDEMPTION actorUserCryptoAddress: " + actorUserCryptoAddress);
        // For now, I set the cryptoAddress for Bitcoins
        CryptoAddress cryptoAddressTo =
            new CryptoAddress(actorUserCryptoAddress, CryptoCurrency.BITCOIN);
        System.out.println("ASSET USER REDEMPTION cryptoAddressTo: " + cryptoAddressTo);
        updateDistributionStatus(
            DistributionStatus.SENDING_CRYPTO, assetAcceptedGenesisTransaction);
        DeliverRecord record = userRedemptionDao.getLastDelivering(assetAcceptedGenesisTransaction);
        switch (record.getState()) {
          case DELIVERING:
            DigitalAssetMetadata metadata =
                digitalAssetUserRedemptionVault.getDigitalAssetMetadataFromWallet(
                    assetAcceptedGenesisTransaction, record.getNetworkType());
            userRedemptionDao.sendingBitcoins(
                assetAcceptedGenesisTransaction, metadata.getLastTransactionHash());
            userRedemptionDao.updateDigitalAssetCryptoStatusByGenesisTransaction(
                assetAcceptedGenesisTransaction, CryptoStatus.PENDING_SUBMIT);
            sendCryptoAmountToRemoteActor(metadata);
            break;
          case DELIVERING_CANCELLED:
            userRedemptionDao.updateDistributionStatusByGenesisTransaction(
                DistributionStatus.SENDING_CRYPTO_FAILED, assetAcceptedGenesisTransaction);
            break;
          default:
            System.out.println("This transaction has already been updated.");
            break;
        }
      }

      // TODO CHANGE THIS!!!!!!!!!!!!!
      List<String> assetRejectedByContractGenesisTransactionList =
          userRedemptionDao.getGenesisTransactionByAssetRejectedByContractStatus();
      for (String assetRejectedGenesisTransaction : assetRejectedByContractGenesisTransactionList) {
        DigitalAssetMetadata digitalAssetMetadata =
            digitalAssetUserRedemptionVault
                .getUserWallet(BlockchainNetworkType.getDefaultBlockchainNetworkType())
                .getDigitalAssetMetadata(assetRejectedGenesisTransaction);
        String internalId =
            userRedemptionDao.getTransactionIdByGenesisTransaction(assetRejectedGenesisTransaction);
        List<CryptoTransaction> genesisTransactionList =
            bitcoinNetworkManager.getCryptoTransactions(
                digitalAssetMetadata.getLastTransactionHash());
        if (genesisTransactionList == null || genesisTransactionList.isEmpty()) {
          throw new CantCheckAssetUserRedemptionProgressException(
              "Cannot get the CryptoTransaction from Crypto Network for "
                  + assetRejectedGenesisTransaction);
        }
        System.out.println("ASSET REJECTED BY CONTRACT!! : " + digitalAssetMetadata);
        String userPublicKey =
            userRedemptionDao.getActorUserPublicKeyByGenesisTransaction(
                assetRejectedGenesisTransaction);
        digitalAssetUserRedemptionVault.setDigitalAssetMetadataAssetIssuerWalletTransaction(
            genesisTransactionList.get(0),
            digitalAssetMetadata,
            AssetBalanceType.AVAILABLE,
            TransactionType.CREDIT,
            DAPTransactionType.DISTRIBUTION,
            userPublicKey);
      }

      List<String> assetRejectedByHashGenesisTransactionList =
          userRedemptionDao.getGenesisTransactionByAssetRejectedByHashStatus();
      for (String assetRejectedGenesisTransaction : assetRejectedByHashGenesisTransactionList) {
        DigitalAssetMetadata digitalAssetMetadata =
            digitalAssetUserRedemptionVault
                .getUserWallet(BlockchainNetworkType.getDefaultBlockchainNetworkType())
                .getDigitalAssetMetadata(assetRejectedGenesisTransaction);
        String internalId =
            userRedemptionDao.getTransactionIdByGenesisTransaction(assetRejectedGenesisTransaction);
        List<CryptoTransaction> genesisTransactionList =
            bitcoinNetworkManager.getCryptoTransactions(
                digitalAssetMetadata.getLastTransactionHash());
        if (genesisTransactionList == null || genesisTransactionList.isEmpty()) {
          throw new CantCheckAssetUserRedemptionProgressException(
              "Cannot get the CryptoTransaction from Crypto Network for "
                  + assetRejectedGenesisTransaction);
        }
        System.out.println("ASSET REJECTED BY HASH!! : " + digitalAssetMetadata);
        String userPublicKey =
            userRedemptionDao.getActorUserPublicKeyByGenesisTransaction(
                assetRejectedGenesisTransaction);
        digitalAssetUserRedemptionVault.setDigitalAssetMetadataAssetIssuerWalletTransaction(
            genesisTransactionList.get(0),
            digitalAssetMetadata,
            AssetBalanceType.AVAILABLE,
            TransactionType.CREDIT,
            DAPTransactionType.DISTRIBUTION,
            userPublicKey);
      }
    }