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); } }