From e9b4a3f6b357d1c367ecb03d5c473894931c1853 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Sat, 17 Apr 2021 20:45:35 +0100 Subject: [PATCH] Automatically backup trade bot data when starting a new trade (from either side). --- .../tradebot/LitecoinACCTv1TradeBot.java | 6 ++++++ .../qortal/controller/tradebot/TradeBot.java | 17 +++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/main/java/org/qortal/controller/tradebot/LitecoinACCTv1TradeBot.java b/src/main/java/org/qortal/controller/tradebot/LitecoinACCTv1TradeBot.java index 15764199..286cbf74 100644 --- a/src/main/java/org/qortal/controller/tradebot/LitecoinACCTv1TradeBot.java +++ b/src/main/java/org/qortal/controller/tradebot/LitecoinACCTv1TradeBot.java @@ -211,6 +211,9 @@ public class LitecoinACCTv1TradeBot implements AcctTradeBot { TradeBot.updateTradeBotState(repository, tradeBotData, () -> String.format("Built AT %s. Waiting for deployment", atAddress)); + // Attempt to backup the trade bot data + TradeBot.backupTradeBotData(repository); + // Return to user for signing and broadcast as we don't have their Qortal private key try { return DeployAtTransactionTransformer.toBytes(deployAtTransactionData); @@ -283,6 +286,9 @@ public class LitecoinACCTv1TradeBot implements AcctTradeBot { tradeForeignPublicKey, tradeForeignPublicKeyHash, crossChainTradeData.expectedForeignAmount, xprv58, null, lockTimeA, receivingPublicKeyHash); + // Attempt to backup the trade bot data + TradeBot.backupTradeBotData(repository); + // Check we have enough funds via xprv58 to fund P2SH to cover expectedForeignAmount long p2shFee; try { diff --git a/src/main/java/org/qortal/controller/tradebot/TradeBot.java b/src/main/java/org/qortal/controller/tradebot/TradeBot.java index 84e32125..94c7cefb 100644 --- a/src/main/java/org/qortal/controller/tradebot/TradeBot.java +++ b/src/main/java/org/qortal/controller/tradebot/TradeBot.java @@ -7,6 +7,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; +import java.util.concurrent.locks.ReentrantLock; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -267,6 +268,22 @@ public class TradeBot implements Listener { return secret; } + /*package*/ static void backupTradeBotData(Repository repository) { + // Attempt to backup the trade bot data. This an optional step and doesn't impact trading, so don't throw an exception on failure + try { + LOGGER.info("About to backup trade bot data..."); + ReentrantLock blockchainLock = Controller.getInstance().getBlockchainLock(); + blockchainLock.lockInterruptibly(); + try { + repository.exportNodeLocalData(true); + } finally { + blockchainLock.unlock(); + } + } catch (InterruptedException | DataException e) { + LOGGER.info(String.format("Failed to obtain blockchain lock when exporting trade bot data: %s", e.getMessage())); + } + } + /** Updates trade-bot entry to new state, with current timestamp, logs message and notifies state-change listeners. */ /*package*/ static void updateTradeBotState(Repository repository, TradeBotData tradeBotData, String newState, int newStateValue, Supplier logMessageSupplier) throws DataException {