stability fixes on tor

optimize when multisig info imported
fetch updates for tx progress indicators off main thread
add synchronization locks
refactor address entry management
add totalTxFee to process model
prevent same user from taking same offer at same time
set refresh rate to 30s for tor
This commit is contained in:
woodser 2023-04-06 16:51:12 -04:00
parent 36cf91e093
commit 1b753e4f29
33 changed files with 498 additions and 354 deletions

View file

@ -85,6 +85,7 @@ public class ArbitratorProcessDepositRequest extends TradeTask {
// verify deposit tx
try {
trade.getXmrWalletService().verifyTradeTx(
offer.getId(),
tradeFee,
sendAmount,
securityDeposit,

View file

@ -60,6 +60,7 @@ public class ArbitratorProcessReserveTx extends TradeTask {
Tuple2<MoneroTx, BigInteger> txResult;
try {
txResult = trade.getXmrWalletService().verifyTradeTx(
offer.getId(),
tradeFee,
sendAmount,
securityDeposit,

View file

@ -62,6 +62,9 @@ public class BuyerPreparePaymentSentMessage extends TradeTask {
// create payout tx if we have seller's updated multisig hex
if (trade.getSeller().getUpdatedMultisigHex() != null) {
// import multisig hex
trade.importMultisigHex();
// create payout tx
log.info("Buyer creating unsigned payout tx");
MoneroTxWallet payoutTx = trade.createPayoutTx();

View file

@ -70,7 +70,7 @@ public class MakerSendInitTradeRequest extends TradeTask {
trade.getSelf().getReserveTxHash(),
trade.getSelf().getReserveTxHex(),
trade.getSelf().getReserveTxKey(),
model.getXmrWalletService().getOrCreateAddressEntry(offer.getId(), XmrAddressEntry.Context.TRADE_PAYOUT).getAddressString(),
model.getXmrWalletService().getAddressEntry(offer.getId(), XmrAddressEntry.Context.TRADE_PAYOUT).get().getAddressString(),
null);
// send request to arbitrator

View file

@ -55,7 +55,6 @@ public class ProcessDepositsConfirmedMessage extends TradeTask {
// update multisig hex
sender.setUpdatedMultisigHex(request.getUpdatedMultisigHex());
trade.importMultisigHex();
// decrypt seller payment account payload if key given
if (request.getSellerPaymentAccountKey() != null && trade.getTradePeer().getPaymentAccountPayload() == null) {

View file

@ -126,6 +126,7 @@ public class ProcessPaymentReceivedMessage extends TradeTask {
trade.verifyPayoutTx(message.getSignedPayoutTxHex(), false, true);
} else {
try {
if (trade.getProcessModel().getPaymentSentMessage() == null) throw new RuntimeException("Process model does not have payment sent message for " + trade.getClass().getSimpleName() + " " + trade.getId());
if (StringUtils.equals(trade.getPayoutTxHex(), trade.getProcessModel().getPaymentSentMessage().getPayoutTxHex())) { // unsigned
log.info("{} {} verifying, signing, and publishing seller's payout tx", trade.getClass().getSimpleName(), trade.getId());
trade.verifyPayoutTx(message.getUnsignedPayoutTxHex(), true, true);

View file

@ -44,22 +44,17 @@ public class ProcessPaymentSentMessage extends TradeTask {
// verify signature of payment sent message
HavenoUtils.verifyPaymentSentMessage(trade, message);
// set state
processModel.setPaymentSentMessage(message);
trade.setPayoutTxHex(message.getPayoutTxHex());
trade.getBuyer().setUpdatedMultisigHex(message.getUpdatedMultisigHex());
trade.getSeller().setAccountAgeWitness(message.getSellerAccountAgeWitness());
// import multisig hex
trade.importMultisigHex();
// update latest peer address
trade.getBuyer().setNodeAddress(processModel.getTempTradePeerNodeAddress());
// if seller, decrypt buyer's payment account payload
if (trade.isSeller()) trade.decryptPeerPaymentAccountPayload(message.getPaymentAccountKey());
// update latest peer address
trade.getBuyer().setNodeAddress(processModel.getTempTradePeerNodeAddress());
// set state
// update state
processModel.setPaymentSentMessage(message);
trade.setPayoutTxHex(message.getPayoutTxHex());
trade.getBuyer().setUpdatedMultisigHex(message.getUpdatedMultisigHex());
trade.getSeller().setAccountAgeWitness(message.getSellerAccountAgeWitness());
String counterCurrencyTxId = message.getCounterCurrencyTxId();
if (counterCurrencyTxId != null && counterCurrencyTxId.length() < 100) trade.setCounterCurrencyTxId(counterCurrencyTxId);
String counterCurrencyExtraData = message.getCounterCurrencyExtraData();

View file

@ -43,7 +43,7 @@ public class TakerReserveTradeFunds extends TradeTask {
BigInteger takerFee = trade.getTakerFee();
BigInteger sendAmount = trade.getOffer().getDirection() == OfferDirection.BUY ? trade.getOffer().getAmount() : BigInteger.valueOf(0);
BigInteger securityDeposit = trade.getOffer().getDirection() == OfferDirection.BUY ? trade.getOffer().getSellerSecurityDeposit() : trade.getOffer().getBuyerSecurityDeposit();
String returnAddress = model.getXmrWalletService().getOrCreateAddressEntry(trade.getOffer().getId(), XmrAddressEntry.Context.TRADE_PAYOUT).getAddressString();
String returnAddress = model.getXmrWalletService().getAddressEntry(trade.getOffer().getId(), XmrAddressEntry.Context.TRADE_PAYOUT).get().getAddressString();
MoneroTxWallet reserveTx = model.getXmrWalletService().createReserveTx(takerFee, sendAmount, securityDeposit, returnAddress);
// collect reserved key images