Use Byte array instead of hex for pub keys

This commit is contained in:
Manfred Karrer 2015-03-14 19:26:30 +01:00
parent ce3bc26be6
commit 72ded8ad90
43 changed files with 201 additions and 292 deletions

View file

@ -149,7 +149,7 @@ public class BitsquareApp extends Application {
primaryStage.show(); primaryStage.show();
//TODO just temp. //TODO just temp.
showDebugWindow(); //showDebugWindow();
} }
private void showDebugWindow() { private void showDebugWindow() {

View file

@ -30,6 +30,7 @@ public class Arbitrator implements Serializable {
private String id; private String id;
private String pubKeyAsHex; private String pubKeyAsHex;
private byte[] pubKey;
private String messagePubKeyAsHex; private String messagePubKeyAsHex;
private String name; private String name;
private ID_TYPE idType; private ID_TYPE idType;
@ -46,7 +47,7 @@ public class Arbitrator implements Serializable {
public Arbitrator() { public Arbitrator() {
} }
public Arbitrator(String pubKeyAsHex, public Arbitrator(byte[] pubKey,
String messagePubKeyAsHex, String messagePubKeyAsHex,
String name, String name,
ID_TYPE idType, ID_TYPE idType,
@ -57,7 +58,7 @@ public class Arbitrator implements Serializable {
List<ID_VERIFICATION> idVerifications, List<ID_VERIFICATION> idVerifications,
String webUrl, String webUrl,
String description) { String description) {
this.pubKeyAsHex = pubKeyAsHex; this.pubKey=pubKey;
this.messagePubKeyAsHex = messagePubKeyAsHex; this.messagePubKeyAsHex = messagePubKeyAsHex;
this.name = name; this.name = name;
this.idType = idType; this.idType = idType;
@ -121,6 +122,10 @@ public class Arbitrator implements Serializable {
return pubKeyAsHex; return pubKeyAsHex;
} }
public byte[] getPubKey() {
return pubKey;
}
public String getMessagePubKeyAsHex() { public String getMessagePubKeyAsHex() {
return messagePubKeyAsHex; return messagePubKeyAsHex;
} }

View file

@ -36,6 +36,7 @@ public class AddressEntry implements Serializable {
private final NetworkParameters params; private final NetworkParameters params;
private final AddressContext addressContext; private final AddressContext addressContext;
private final String offerId; private final String offerId;
private final byte[] pubKey;
private final byte[] pubKeyHash; private final byte[] pubKeyHash;
@ -49,6 +50,7 @@ public class AddressEntry implements Serializable {
this.addressContext = addressContext; this.addressContext = addressContext;
this.offerId = offerId; this.offerId = offerId;
pubKey = key.getPubOnly().getPubKey();
pubKeyHash = key.getPubOnly().getPubKeyHash(); pubKeyHash = key.getPubOnly().getPubKeyHash();
} }
@ -64,7 +66,7 @@ public class AddressEntry implements Serializable {
return getAddress().toString(); return getAddress().toString();
} }
public String getPubKeyAsHexString() { public String getPubKeyAsHex() {
return Utils.HEX.encode(key.getPubKey()); return Utils.HEX.encode(key.getPubKey());
} }
@ -84,6 +86,10 @@ public class AddressEntry implements Serializable {
return pubKeyHash; return pubKeyHash;
} }
public byte[] getPubKey() {
return pubKey;
}
public static enum AddressContext { public static enum AddressContext {
REGISTRATION_FEE, REGISTRATION_FEE,
TRADE, TRADE,

View file

@ -92,10 +92,6 @@ import rx.subjects.Subject;
import static org.bitcoinj.script.ScriptOpCodes.OP_RETURN; import static org.bitcoinj.script.ScriptOpCodes.OP_RETURN;
/**
* TODO: use walletextension (with protobuffer) instead of saving addressEntryList via storage
* TODO: break that class up. maybe a bitsquarewallet
*/
public class WalletService { public class WalletService {
private static final Logger log = LoggerFactory.getLogger(WalletService.class); private static final Logger log = LoggerFactory.getLogger(WalletService.class);
private static final String LOCK_NAME = "lock"; private static final String LOCK_NAME = "lock";
@ -225,8 +221,7 @@ public class WalletService {
if (serializable instanceof List) { if (serializable instanceof List) {
List<AddressEntry> persistedAddressEntryList = (List<AddressEntry>) serializable; List<AddressEntry> persistedAddressEntryList = (List<AddressEntry>) serializable;
for (AddressEntry persistedAddressEntry : persistedAddressEntryList) { for (AddressEntry persistedAddressEntry : persistedAddressEntryList) {
persistedAddressEntry.setDeterministicKey( persistedAddressEntry.setDeterministicKey((DeterministicKey) wallet.findKeyFromPubHash(persistedAddressEntry.getPubKeyHash()));
(DeterministicKey) wallet.findKeyFromPubHash(persistedAddressEntry.getPubKeyHash()));
} }
addressEntryList = persistedAddressEntryList; addressEntryList = persistedAddressEntryList;
registrationAddressEntry = addressEntryList.get(0); registrationAddressEntry = addressEntryList.get(0);
@ -310,7 +305,7 @@ public class WalletService {
return arbitratorDepositAddressEntry; return arbitratorDepositAddressEntry;
} }
public AddressEntry getAddressInfoByTradeID(String offerId) { public AddressEntry getAddressInfo(String offerId) {
Optional<AddressEntry> addressEntry = getAddressEntryList().stream().filter(e -> Optional<AddressEntry> addressEntry = getAddressEntryList().stream().filter(e ->
offerId.equals(e.getOfferId())).findFirst(); offerId.equals(e.getOfferId())).findFirst();
@ -533,7 +528,7 @@ public class WalletService {
sendRequest.shuffleOutputs = false; sendRequest.shuffleOutputs = false;
// we allow spending of unconfirmed tx (double spend risk is low and usability would suffer if we need to // we allow spending of unconfirmed tx (double spend risk is low and usability would suffer if we need to
// wait for 1 confirmation) // wait for 1 confirmation)
AddressEntry addressEntry = getAddressInfoByTradeID(offerId); AddressEntry addressEntry = getAddressInfo(offerId);
sendRequest.coinSelector = new AddressBasedCoinSelector(params, addressEntry, true); sendRequest.coinSelector = new AddressBasedCoinSelector(params, addressEntry, true);
sendRequest.changeAddress = addressEntry.getAddress(); sendRequest.changeAddress = addressEntry.getAddress();
wallet.completeTx(sendRequest); wallet.completeTx(sendRequest);
@ -547,8 +542,7 @@ public class WalletService {
Futures.addCallback(future, callback); Futures.addCallback(future, callback);
} }
public String payTakeOfferFee(String offerId, FutureCallback<Transaction> callback) throws public String payTakeOfferFee(String offerId, FutureCallback<Transaction> callback) throws InsufficientMoneyException {
InsufficientMoneyException {
Transaction tx = new Transaction(params); Transaction tx = new Transaction(params);
Coin fee = FeePolicy.TAKE_OFFER_FEE.subtract(FeePolicy.TX_FEE); Coin fee = FeePolicy.TAKE_OFFER_FEE.subtract(FeePolicy.TX_FEE);
log.trace("fee: " + fee.toFriendlyString()); log.trace("fee: " + fee.toFriendlyString());
@ -558,8 +552,8 @@ public class WalletService {
sendRequest.shuffleOutputs = false; sendRequest.shuffleOutputs = false;
// we allow spending of unconfirmed tx (double spend risk is low and usability would suffer if we need to // we allow spending of unconfirmed tx (double spend risk is low and usability would suffer if we need to
// wait for 1 confirmation) // wait for 1 confirmation)
sendRequest.coinSelector = new AddressBasedCoinSelector(params, getAddressInfoByTradeID(offerId), true); sendRequest.coinSelector = new AddressBasedCoinSelector(params, getAddressInfo(offerId), true);
sendRequest.changeAddress = getAddressInfoByTradeID(offerId).getAddress(); sendRequest.changeAddress = getAddressInfo(offerId).getAddress();
Wallet.SendResult sendResult = wallet.sendCoins(sendRequest); Wallet.SendResult sendResult = wallet.sendCoins(sendRequest);
Futures.addCallback(sendResult.broadcastComplete, callback); Futures.addCallback(sendResult.broadcastComplete, callback);
@ -577,8 +571,7 @@ public class WalletService {
public String sendFunds(String withdrawFromAddress, public String sendFunds(String withdrawFromAddress,
String withdrawToAddress, String withdrawToAddress,
Coin amount, Coin amount,
FutureCallback<Transaction> callback) throws AddressFormatException, FutureCallback<Transaction> callback) throws AddressFormatException, InsufficientMoneyException, IllegalArgumentException {
InsufficientMoneyException, IllegalArgumentException {
Transaction tx = new Transaction(params); Transaction tx = new Transaction(params);
tx.addOutput(amount.subtract(FeePolicy.TX_FEE), new Address(params, withdrawToAddress)); tx.addOutput(amount.subtract(FeePolicy.TX_FEE), new Address(params, withdrawToAddress));
@ -603,8 +596,6 @@ public class WalletService {
} }
// TODO: Trade process - use P2SH instead and optimize tx creation and data exchange
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Trade process // Trade process
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
@ -612,9 +603,9 @@ public class WalletService {
// 1. step: deposit tx // 1. step: deposit tx
// Offerer creates the 2of3 multiSig deposit tx with his unsigned input and change output // Offerer creates the 2of3 multiSig deposit tx with his unsigned input and change output
public Transaction offererCreatesMSTxAndAddPayment(Coin offererInputAmount, public Transaction offererCreatesMSTxAndAddPayment(Coin offererInputAmount,
String offererPubKey, byte[] offererPubKey,
String takerPubKey, byte[] takerPubKey,
String arbitratorPubKey, byte[] arbitratorPubKey,
String tradeId) throws InsufficientMoneyException { String tradeId) throws InsufficientMoneyException {
log.debug("offererCreatesMSTxAndAddPayment"); log.debug("offererCreatesMSTxAndAddPayment");
log.trace("inputs: "); log.trace("inputs: ");
@ -640,7 +631,7 @@ public class WalletService {
Wallet.SendRequest sendRequest = Wallet.SendRequest.forTx(tx); Wallet.SendRequest sendRequest = Wallet.SendRequest.forTx(tx);
sendRequest.shuffleOutputs = false; sendRequest.shuffleOutputs = false;
AddressEntry addressEntry = getAddressInfoByTradeID(tradeId); AddressEntry addressEntry = getAddressInfo(tradeId);
// we allow spending of unconfirmed tx (double spend risk is low and usability would suffer if we need to // we allow spending of unconfirmed tx (double spend risk is low and usability would suffer if we need to
// wait for 1 confirmation) // wait for 1 confirmation)
sendRequest.coinSelector = new AddressBasedCoinSelector(params, addressEntry, true); sendRequest.coinSelector = new AddressBasedCoinSelector(params, addressEntry, true);
@ -672,9 +663,9 @@ public class WalletService {
public Transaction takerAddPaymentAndSignTx(Coin takerInputAmount, public Transaction takerAddPaymentAndSignTx(Coin takerInputAmount,
Coin msOutputAmount, Coin msOutputAmount,
String offererPubKey, byte[] offererPubKey,
String takerPubKey, byte[] takerPubKey,
String arbitratorPubKey, byte[] arbitratorPubKey,
String offerersPartialDepositTxAsHex, String offerersPartialDepositTxAsHex,
String tradeId) throws InsufficientMoneyException { String tradeId) throws InsufficientMoneyException {
log.debug("takerAddPaymentAndSignTx"); log.debug("takerAddPaymentAndSignTx");
@ -700,7 +691,7 @@ public class WalletService {
Wallet.SendRequest sendRequest = Wallet.SendRequest.forTx(tempTx); Wallet.SendRequest sendRequest = Wallet.SendRequest.forTx(tempTx);
sendRequest.shuffleOutputs = false; sendRequest.shuffleOutputs = false;
AddressEntry addressEntry = getAddressInfoByTradeID(tradeId); AddressEntry addressEntry = getAddressInfo(tradeId);
// we allow spending of unconfirmed tx (double spend risk is low and usability would suffer if we need to // we allow spending of unconfirmed tx (double spend risk is low and usability would suffer if we need to
// wait for 1 confirmation) // wait for 1 confirmation)
sendRequest.coinSelector = new AddressBasedCoinSelector(params, addressEntry, true); sendRequest.coinSelector = new AddressBasedCoinSelector(params, addressEntry, true);
@ -952,13 +943,13 @@ public class WalletService {
// We create the payout tx // We create the payout tx
Transaction tx = createPayoutTx(depositTxAsHex, offererPaybackAmount, takerPaybackAmount, Transaction tx = createPayoutTx(depositTxAsHex, offererPaybackAmount, takerPaybackAmount,
getAddressInfoByTradeID(tradeID).getAddressString(), takerAddress); getAddressInfo(tradeID).getAddressString(), takerAddress);
// We create the signature for that tx // We create the signature for that tx
TransactionOutput multiSigOutput = tx.getInput(0).getConnectedOutput(); TransactionOutput multiSigOutput = tx.getInput(0).getConnectedOutput();
Script multiSigScript = multiSigOutput.getScriptPubKey(); Script multiSigScript = multiSigOutput.getScriptPubKey();
Sha256Hash sigHash = tx.hashForSignature(0, multiSigScript, Transaction.SigHash.ALL, false); Sha256Hash sigHash = tx.hashForSignature(0, multiSigScript, Transaction.SigHash.ALL, false);
ECKey.ECDSASignature offererSignature = getAddressInfoByTradeID(tradeID).getKey().sign(sigHash); ECKey.ECDSASignature offererSignature = getAddressInfo(tradeID).getKey().sign(sigHash);
TransactionSignature offererTxSig = new TransactionSignature(offererSignature, Transaction.SigHash.ALL, false); TransactionSignature offererTxSig = new TransactionSignature(offererSignature, Transaction.SigHash.ALL, false);
Script inputScript = ScriptBuilder.createMultiSigInputScript(ImmutableList.of(offererTxSig)); Script inputScript = ScriptBuilder.createMultiSigInputScript(ImmutableList.of(offererTxSig));
@ -989,7 +980,7 @@ public class WalletService {
// We create the payout tx // We create the payout tx
Transaction tx = createPayoutTx(depositTxAsHex, offererPaybackAmount, takerPaybackAmount, offererAddress, Transaction tx = createPayoutTx(depositTxAsHex, offererPaybackAmount, takerPaybackAmount, offererAddress,
getAddressInfoByTradeID(tradeID).getAddressString()); getAddressInfo(tradeID).getAddressString());
// We sign that tx with our key and apply the signature form the offerer // We sign that tx with our key and apply the signature form the offerer
TransactionOutput multiSigOutput = tx.getInput(0).getConnectedOutput(); TransactionOutput multiSigOutput = tx.getInput(0).getConnectedOutput();
@ -997,7 +988,7 @@ public class WalletService {
Sha256Hash sigHash = tx.hashForSignature(0, multiSigScript, Transaction.SigHash.ALL, false); Sha256Hash sigHash = tx.hashForSignature(0, multiSigScript, Transaction.SigHash.ALL, false);
log.trace("sigHash=" + sigHash); log.trace("sigHash=" + sigHash);
ECKey.ECDSASignature takerSignature = getAddressInfoByTradeID(tradeID).getKey().sign(sigHash); ECKey.ECDSASignature takerSignature = getAddressInfo(tradeID).getKey().sign(sigHash);
TransactionSignature takerTxSig = new TransactionSignature(takerSignature, Transaction.SigHash.ALL, false); TransactionSignature takerTxSig = new TransactionSignature(takerSignature, Transaction.SigHash.ALL, false);
ECKey.ECDSASignature offererSignature = ECKey.ECDSASignature offererSignature =
@ -1040,7 +1031,15 @@ public class WalletService {
} }
} }
//TODO private Script getMultiSigScript(byte[] offererPubKey, byte[] takerPubKey, byte[] arbitratorPubKey) {
ECKey offererKey = ECKey.fromPublicOnly(offererPubKey);
ECKey takerKey = ECKey.fromPublicOnly(takerPubKey);
ECKey arbitratorKey = ECKey.fromPublicOnly(arbitratorPubKey);
List<ECKey> keys = ImmutableList.of(offererKey, takerKey, arbitratorKey);
return ScriptBuilder.createMultiSigOutputScript(2, keys);
}
private Script getMultiSigScript(String offererPubKey, String takerPubKey, String arbitratorPubKey) { private Script getMultiSigScript(String offererPubKey, String takerPubKey, String arbitratorPubKey) {
ECKey offererKey = ECKey.fromPublicOnly(Utils.parseAsHexOrBase58(offererPubKey)); ECKey offererKey = ECKey.fromPublicOnly(Utils.parseAsHexOrBase58(offererPubKey));
ECKey takerKey = ECKey.fromPublicOnly(Utils.parseAsHexOrBase58(takerPubKey)); ECKey takerKey = ECKey.fromPublicOnly(Utils.parseAsHexOrBase58(takerPubKey));

View file

@ -41,7 +41,6 @@ import io.bitsquare.viewfx.model.ViewModel;
import org.bitcoinj.core.Coin; import org.bitcoinj.core.Coin;
import org.bitcoinj.core.ECKey; import org.bitcoinj.core.ECKey;
import org.bitcoinj.core.Utils;
import com.google.inject.Inject; import com.google.inject.Inject;
@ -352,7 +351,7 @@ class MainViewModel implements ViewModel {
private void addMockArbitrator() { private void addMockArbitrator() {
if (accountSettings.getAcceptedArbitrators().isEmpty() && user.getMessageKeyPair() != null) { if (accountSettings.getAcceptedArbitrators().isEmpty() && user.getMessageKeyPair() != null) {
String pubKeyAsHex = Utils.HEX.encode(new ECKey().getPubKey()); byte[] pubKey = new ECKey().getPubKey();
String messagePubKeyAsHex = DSAKeyUtil.getHexStringFromPublicKey(user.getMessagePublicKey()); String messagePubKeyAsHex = DSAKeyUtil.getHexStringFromPublicKey(user.getMessagePublicKey());
List<Locale> languages = new ArrayList<>(); List<Locale> languages = new ArrayList<>();
languages.add(LanguageUtil.getDefaultLanguageLocale()); languages.add(LanguageUtil.getDefaultLanguageLocale());
@ -362,7 +361,7 @@ class MainViewModel implements ViewModel {
idVerifications.add(Arbitrator.ID_VERIFICATION.PASSPORT); idVerifications.add(Arbitrator.ID_VERIFICATION.PASSPORT);
idVerifications.add(Arbitrator.ID_VERIFICATION.GOV_ID); idVerifications.add(Arbitrator.ID_VERIFICATION.GOV_ID);
Arbitrator arbitrator = new Arbitrator(pubKeyAsHex, Arbitrator arbitrator = new Arbitrator(pubKey,
messagePubKeyAsHex, messagePubKeyAsHex,
"Manfred Karrer", "Manfred Karrer",
Arbitrator.ID_TYPE.REAL_LIFE_ID, Arbitrator.ID_TYPE.REAL_LIFE_ID,

View file

@ -369,14 +369,14 @@ public class ArbitratorRegistrationView extends ActivatableView<AnchorPane, Void
} }
private Arbitrator getEditedArbitrator() { private Arbitrator getEditedArbitrator() {
String pubKeyAsHex = walletService.getArbitratorDepositAddressEntry().getPubKeyAsHexString(); byte[] pubKey = walletService.getArbitratorDepositAddressEntry().getPubKey();
String messagePubKeyAsHex = DSAKeyUtil.getHexStringFromPublicKey(user.getMessagePublicKey()); String messagePubKeyAsHex = DSAKeyUtil.getHexStringFromPublicKey(user.getMessagePublicKey());
String name = nameTextField.getText(); String name = nameTextField.getText();
Coin fee = formatter.parseToCoin(arbitrationFeeTextField.getText()); Coin fee = formatter.parseToCoin(arbitrationFeeTextField.getText());
String webUrl = webPageTextField.getText(); String webUrl = webPageTextField.getText();
String description = descriptionTextArea.getText(); String description = descriptionTextArea.getText();
return new Arbitrator(pubKeyAsHex, return new Arbitrator(pubKey,
messagePubKeyAsHex, messagePubKeyAsHex,
name, name,
idType, idType,

View file

@ -34,7 +34,6 @@ import io.bitsquare.viewfx.model.DataModel;
import org.bitcoinj.core.Coin; import org.bitcoinj.core.Coin;
import org.bitcoinj.core.ECKey; import org.bitcoinj.core.ECKey;
import org.bitcoinj.core.Utils;
import com.google.inject.Inject; import com.google.inject.Inject;
@ -124,7 +123,7 @@ class IrcAccountDataModel implements Activatable, DataModel {
private void addMockArbitrator() { private void addMockArbitrator() {
if (accountSettings.getAcceptedArbitrators().isEmpty() && user.getMessageKeyPair() != null) { if (accountSettings.getAcceptedArbitrators().isEmpty() && user.getMessageKeyPair() != null) {
String pubKeyAsHex = Utils.HEX.encode(new ECKey().getPubKey()); byte[] pubKey = new ECKey().getPubKey();
String messagePubKeyAsHex = DSAKeyUtil.getHexStringFromPublicKey(user.getMessagePublicKey()); String messagePubKeyAsHex = DSAKeyUtil.getHexStringFromPublicKey(user.getMessagePublicKey());
List<Locale> languages = new ArrayList<>(); List<Locale> languages = new ArrayList<>();
languages.add(LanguageUtil.getDefaultLanguageLocale()); languages.add(LanguageUtil.getDefaultLanguageLocale());
@ -134,7 +133,7 @@ class IrcAccountDataModel implements Activatable, DataModel {
idVerifications.add(Arbitrator.ID_VERIFICATION.PASSPORT); idVerifications.add(Arbitrator.ID_VERIFICATION.PASSPORT);
idVerifications.add(Arbitrator.ID_VERIFICATION.GOV_ID); idVerifications.add(Arbitrator.ID_VERIFICATION.GOV_ID);
Arbitrator arbitrator = new Arbitrator(pubKeyAsHex, Arbitrator arbitrator = new Arbitrator(pubKey,
messagePubKeyAsHex, messagePubKeyAsHex,
"Manfred Karrer", "Manfred Karrer",
Arbitrator.ID_TYPE.REAL_LIFE_ID, Arbitrator.ID_TYPE.REAL_LIFE_ID,

View file

@ -33,7 +33,6 @@ import io.bitsquare.viewfx.model.DataModel;
import org.bitcoinj.core.Coin; import org.bitcoinj.core.Coin;
import org.bitcoinj.core.ECKey; import org.bitcoinj.core.ECKey;
import org.bitcoinj.core.Utils;
import com.google.inject.Inject; import com.google.inject.Inject;
@ -154,7 +153,7 @@ class RestrictionsDataModel implements Activatable, DataModel {
// TODO Remove mock later // TODO Remove mock later
private void addMockArbitrator() { private void addMockArbitrator() {
if (accountSettings.getAcceptedArbitrators().isEmpty() && user.getMessageKeyPair() != null) { if (accountSettings.getAcceptedArbitrators().isEmpty() && user.getMessageKeyPair() != null) {
String pubKeyAsHex = Utils.HEX.encode(new ECKey().getPubKey()); byte[] pubKey = new ECKey().getPubKey();
String messagePubKeyAsHex = DSAKeyUtil.getHexStringFromPublicKey(user.getMessagePublicKey()); String messagePubKeyAsHex = DSAKeyUtil.getHexStringFromPublicKey(user.getMessagePublicKey());
List<Locale> languages = new ArrayList<>(); List<Locale> languages = new ArrayList<>();
languages.add(LanguageUtil.getDefaultLanguageLocale()); languages.add(LanguageUtil.getDefaultLanguageLocale());
@ -166,7 +165,7 @@ class RestrictionsDataModel implements Activatable, DataModel {
// TODO use very small sec. dposit to make testing in testnet less expensive // TODO use very small sec. dposit to make testing in testnet less expensive
// Revert later to 0.1 BTC again // Revert later to 0.1 BTC again
Arbitrator arbitrator = new Arbitrator(pubKeyAsHex, Arbitrator arbitrator = new Arbitrator(pubKey,
messagePubKeyAsHex, messagePubKeyAsHex,
"Manfred Karrer", "Manfred Karrer",
Arbitrator.ID_TYPE.REAL_LIFE_ID, Arbitrator.ID_TYPE.REAL_LIFE_ID,

View file

@ -184,7 +184,7 @@ class PendingTradesDataModel implements Activatable, DataModel {
} }
}; };
AddressEntry addressEntry = walletService.getAddressInfoByTradeID(getTrade().getId()); AddressEntry addressEntry = walletService.getAddressInfo(getTrade().getId());
String fromAddress = addressEntry.getAddressString(); String fromAddress = addressEntry.getAddressString();
try { try {
walletService.sendFunds(fromAddress, toAddress, getAmountToWithdraw(), callback); walletService.sendFunds(fromAddress, toAddress, getAmountToWithdraw(), callback);
@ -258,7 +258,7 @@ class PendingTradesDataModel implements Activatable, DataModel {
} }
Coin getAmountToWithdraw() { Coin getAmountToWithdraw() {
AddressEntry addressEntry = walletService.getAddressInfoByTradeID(getTrade().getId()); AddressEntry addressEntry = walletService.getAddressInfo(getTrade().getId());
log.debug("trade id " + getTrade().getId()); log.debug("trade id " + getTrade().getId());
log.debug("getAddressString " + addressEntry.getAddressString()); log.debug("getAddressString " + addressEntry.getAddressString());
log.debug("funds " + walletService.getBalanceForAddress(addressEntry.getAddress()).subtract(FeePolicy log.debug("funds " + walletService.getBalanceForAddress(addressEntry.getAddress()).subtract(FeePolicy

View file

@ -125,7 +125,7 @@ class CreateOfferDataModel implements Activatable, DataModel {
networkFeeAsCoin.set(FeePolicy.TX_FEE); networkFeeAsCoin.set(FeePolicy.TX_FEE);
if (walletService != null && walletService.getWallet() != null) { if (walletService != null && walletService.getWallet() != null) {
addressEntry = walletService.getAddressInfoByTradeID(offerId); addressEntry = walletService.getAddressInfo(offerId);
walletService.addBalanceListener(new BalanceListener(getAddressEntry().getAddress()) { walletService.addBalanceListener(new BalanceListener(getAddressEntry().getAddress()) {
@Override @Override

View file

@ -121,7 +121,7 @@ class TakeOfferDataModel implements Activatable, DataModel {
calculateVolume(); calculateVolume();
calculateTotalToPay(); calculateTotalToPay();
addressEntry = walletService.getAddressInfoByTradeID(offer.getId()); addressEntry = walletService.getAddressInfo(offer.getId());
walletService.addBalanceListener(new BalanceListener(addressEntry.getAddress()) { walletService.addBalanceListener(new BalanceListener(addressEntry.getAddress()) {
@Override @Override
public void onBalanceChanged(@NotNull Coin balance) { public void onBalanceChanged(@NotNull Coin balance) {
@ -148,6 +148,8 @@ class TakeOfferDataModel implements Activatable, DataModel {
case OFFERER_REJECTED: case OFFERER_REJECTED:
requestTakeOfferErrorMessage.set("Take offer request got rejected. Maybe another trader has taken the offer in the meantime."); requestTakeOfferErrorMessage.set("Take offer request got rejected. Maybe another trader has taken the offer in the meantime.");
break; break;
case TAKE_OFFER_FEE_PAID:
break;
case DEPOSIT_PUBLISHED: case DEPOSIT_PUBLISHED:
case DEPOSIT_CONFIRMED: case DEPOSIT_CONFIRMED:
// TODO Check why DEPOSIT_CONFIRMED can happen, refactor state handling // TODO Check why DEPOSIT_CONFIRMED can happen, refactor state handling
@ -163,9 +165,12 @@ class TakeOfferDataModel implements Activatable, DataModel {
break; break;
case FIAT_PAYMENT_STARTED: case FIAT_PAYMENT_STARTED:
break; break;
case TAKE_OFFER_FEE_PAYMENT_FAILED:
requestTakeOfferErrorMessage.set("An error occurred when paying the trade fee.");
break;
case MESSAGE_SENDING_FAILED: case MESSAGE_SENDING_FAILED:
requestTakeOfferErrorMessage.set("An error occurred when sending a message to the offerer. Maybe there are connection problems. Please " + requestTakeOfferErrorMessage.set("An error occurred when sending a message to the offerer. Maybe there are connection problems. " +
"try later again."); "Please try later again.");
break; break;
case PAYOUT_PUBLISHED: case PAYOUT_PUBLISHED:
break; break;

View file

@ -41,6 +41,7 @@ public class Trade implements Serializable {
OPEN, OPEN,
OFFERER_ACCEPTED, OFFERER_ACCEPTED,
OFFERER_REJECTED, /* For taker only*/ OFFERER_REJECTED, /* For taker only*/
TAKE_OFFER_FEE_PAYMENT_FAILED,
TAKE_OFFER_FEE_PAID, TAKE_OFFER_FEE_PAID,
DEPOSIT_PUBLISHED, DEPOSIT_PUBLISHED,
DEPOSIT_CONFIRMED, DEPOSIT_CONFIRMED,

View file

@ -385,6 +385,7 @@ public class TradeManager {
case OPEN: case OPEN:
break; break;
case OFFERER_ACCEPTED: // only taker side case OFFERER_ACCEPTED: // only taker side
case TAKE_OFFER_FEE_PAID:
case DEPOSIT_PUBLISHED: case DEPOSIT_PUBLISHED:
case DEPOSIT_CONFIRMED: case DEPOSIT_CONFIRMED:
case FIAT_PAYMENT_STARTED: case FIAT_PAYMENT_STARTED:
@ -393,6 +394,7 @@ public class TradeManager {
persistPendingTrades(); persistPendingTrades();
break; break;
case OFFERER_REJECTED: case OFFERER_REJECTED:
case TAKE_OFFER_FEE_PAYMENT_FAILED:
case MESSAGE_SENDING_FAILED: case MESSAGE_SENDING_FAILED:
removeFailedTrade(trade); removeFailedTrade(trade);
buyerAcceptsOfferProtocolMap.get(trade.getId()).cleanup(); buyerAcceptsOfferProtocolMap.get(trade.getId()).cleanup();

View file

@ -48,7 +48,7 @@ public class BroadcastCreateOfferFeeTx extends Task<PlaceOfferModel> {
protected void doRun() { protected void doRun() {
Coin totalsNeeded = model.getOffer().getSecurityDeposit().add(FeePolicy.CREATE_OFFER_FEE).add(FeePolicy.TX_FEE); Coin totalsNeeded = model.getOffer().getSecurityDeposit().add(FeePolicy.CREATE_OFFER_FEE).add(FeePolicy.TX_FEE);
AddressEntry addressEntry = model.getWalletService().getAddressInfoByTradeID(model.getOffer().getId()); AddressEntry addressEntry = model.getWalletService().getAddressInfo(model.getOffer().getId());
Coin balance = model.getWalletService().getBalanceForAddress(addressEntry.getAddress()); Coin balance = model.getWalletService().getBalanceForAddress(addressEntry.getAddress());
if (balance.compareTo(totalsNeeded) >= 0) { if (balance.compareTo(totalsNeeded) >= 0) {

View file

@ -33,8 +33,8 @@ import java.security.PublicKey;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public class TradeSharedModel extends SharedModel { public class OfferSharedModel extends SharedModel {
protected static final Logger log = LoggerFactory.getLogger(TradeSharedModel.class); protected static final Logger log = LoggerFactory.getLogger(OfferSharedModel.class);
// provided // provided
protected final Offer offer; protected final Offer offer;
@ -44,19 +44,19 @@ public class TradeSharedModel extends SharedModel {
protected final SignatureService signatureService; protected final SignatureService signatureService;
// derived // derived
protected final String arbitratorPubKey;
protected final BankAccount bankAccount; protected final BankAccount bankAccount;
protected final String accountId; protected final String accountId;
protected final PublicKey messagePublicKey; protected final PublicKey messagePublicKey;
protected final ECKey accountKey; protected final ECKey accountKey;
protected final byte[] arbitratorPubKey;
// data written/read by tasks // data written/read by tasks
private TradeMessage tradeMessage; protected TradeMessage tradeMessage;
protected String tradePubKeyAsHex; protected byte[] takerPubKey;
protected String peersAccountId; protected String peersAccountId;
protected BankAccount peersBankAccount; protected BankAccount peersBankAccount;
public TradeSharedModel(Offer offer, public OfferSharedModel(Offer offer,
TradeMessageService tradeMessageService, TradeMessageService tradeMessageService,
WalletService walletService, WalletService walletService,
BlockChainService blockChainService, BlockChainService blockChainService,
@ -69,7 +69,7 @@ public class TradeSharedModel extends SharedModel {
this.signatureService = signatureService; this.signatureService = signatureService;
//TODO use default arbitrator for now //TODO use default arbitrator for now
arbitratorPubKey = offer.getArbitrators().get(0).getPubKeyAsHex(); arbitratorPubKey = offer.getArbitrators().get(0).getPubKey();
bankAccount = user.getBankAccount(offer.getBankAccountId()); bankAccount = user.getBankAccount(offer.getBankAccountId());
accountId = user.getAccountId(); accountId = user.getAccountId();
messagePublicKey = user.getMessagePublicKey(); messagePublicKey = user.getMessagePublicKey();
@ -98,7 +98,7 @@ public class TradeSharedModel extends SharedModel {
return offer; return offer;
} }
public String getArbitratorPubKey() { public byte[] getArbitratorPubKey() {
return arbitratorPubKey; return arbitratorPubKey;
} }
@ -118,27 +118,27 @@ public class TradeSharedModel extends SharedModel {
return accountKey; return accountKey;
} }
public String getTradePubKeyAsHex() { public byte[] getTakerPubKey() {
return tradePubKeyAsHex; return takerPubKey;
} }
public void setTradePubKeyAsHex(String tradePubKeyAsHex) { public void setTakerPubKey(byte[] takerPubKey) {
this.tradePubKeyAsHex = tradePubKeyAsHex; this.takerPubKey = takerPubKey;
} }
public String getPeersAccountId() { public String getTakerAccountId() {
return peersAccountId; return peersAccountId;
} }
public void setPeersAccountId(String peersAccountId) { public void setTakerAccountId(String peersAccountId) {
this.peersAccountId = peersAccountId; this.peersAccountId = peersAccountId;
} }
public BankAccount getPeersBankAccount() { public BankAccount getTakerBankAccount() {
return peersBankAccount; return peersBankAccount;
} }
public void setPeersBankAccount(BankAccount peersBankAccount) { public void setTakerBankAccount(BankAccount peersBankAccount) {
this.peersBankAccount = peersBankAccount; this.peersBankAccount = peersBankAccount;
} }

View file

@ -25,7 +25,7 @@ import io.bitsquare.network.Peer;
import io.bitsquare.offer.OpenOffer; import io.bitsquare.offer.OpenOffer;
import io.bitsquare.trade.Trade; import io.bitsquare.trade.Trade;
import io.bitsquare.trade.TradeMessageService; import io.bitsquare.trade.TradeMessageService;
import io.bitsquare.trade.protocol.trade.TradeSharedModel; import io.bitsquare.trade.protocol.trade.OfferSharedModel;
import io.bitsquare.user.User; import io.bitsquare.user.User;
import org.bitcoinj.core.Coin; import org.bitcoinj.core.Coin;
@ -35,7 +35,7 @@ import java.security.PublicKey;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public class BuyerAsOffererModel extends TradeSharedModel { public class BuyerAsOffererModel extends OfferSharedModel {
private static final Logger log = LoggerFactory.getLogger(BuyerAsOffererModel.class); private static final Logger log = LoggerFactory.getLogger(BuyerAsOffererModel.class);
@ -48,15 +48,15 @@ public class BuyerAsOffererModel extends TradeSharedModel {
// data written/read by tasks // data written/read by tasks
private Trade trade; private Trade trade;
private Peer peer; private Peer taker;
private String preparedOffererDepositTxAsHex; private String preparedOffererDepositTxAsHex;
private String depositTxAsHex; private String depositTxAsHex;
private String peersAccountId; private String takerAccountId;
private BankAccount peersBankAccount; private BankAccount takerBankAccount;
private PublicKey peersMessagePublicKey; private PublicKey takerMessagePublicKey;
private String peersContractAsJson; private String takerContractAsJson;
private String signedTakerDepositTxAsHex; private String signedTakerDepositTxAsHex;
@ -66,11 +66,10 @@ public class BuyerAsOffererModel extends TradeSharedModel {
private long takerTxOutIndex; private long takerTxOutIndex;
private Coin takerPaybackAmount; private Coin takerPaybackAmount;
private String takeOfferFeeTxId; private String takeOfferFeeTxId;
private String tradePubKeyAsHex;
private String takerPayoutAddress; private String takerPayoutAddress;
private long offererTxOutIndex; private long offererTxOutIndex;
private String offererPubKey; private byte[] offererPubKey;
private String offererSignatureR; private String offererSignatureR;
private String offererSignatureS; private String offererSignatureS;
private Coin offererPaybackAmount; private Coin offererPaybackAmount;
@ -94,7 +93,7 @@ public class BuyerAsOffererModel extends TradeSharedModel {
user); user);
this.openOffer = openOffer; this.openOffer = openOffer;
offererPaybackAddress = walletService.getAddressInfoByTradeID(offer.getId()).getAddressString(); offererPaybackAddress = walletService.getAddressInfo(offer.getId()).getAddressString();
} }
//getter/setter //getter/setter
@ -102,8 +101,8 @@ public class BuyerAsOffererModel extends TradeSharedModel {
return openOffer; return openOffer;
} }
public Peer getPeer() { public Peer getTaker() {
return peer; return taker;
} }
public String getOffererPaybackAddress() { public String getOffererPaybackAddress() {
@ -134,16 +133,6 @@ public class BuyerAsOffererModel extends TradeSharedModel {
this.takeOfferFeeTxId = takeOfferFeeTxId; this.takeOfferFeeTxId = takeOfferFeeTxId;
} }
@Override
public String getTradePubKeyAsHex() {
return tradePubKeyAsHex;
}
@Override
public void setTradePubKeyAsHex(String tradePubKeyAsHex) {
this.tradePubKeyAsHex = tradePubKeyAsHex;
}
public String getTakerPayoutAddress() { public String getTakerPayoutAddress() {
return takerPayoutAddress; return takerPayoutAddress;
} }
@ -153,39 +142,39 @@ public class BuyerAsOffererModel extends TradeSharedModel {
} }
@Override @Override
public String getPeersAccountId() { public String getTakerAccountId() {
return peersAccountId; return takerAccountId;
} }
@Override @Override
public void setPeersAccountId(String peersAccountId) { public void setTakerAccountId(String takerAccountId) {
this.peersAccountId = peersAccountId; this.takerAccountId = takerAccountId;
} }
@Override @Override
public BankAccount getPeersBankAccount() { public BankAccount getTakerBankAccount() {
return peersBankAccount; return takerBankAccount;
} }
@Override @Override
public void setPeersBankAccount(BankAccount peersBankAccount) { public void setTakerBankAccount(BankAccount takerBankAccount) {
this.peersBankAccount = peersBankAccount; this.takerBankAccount = takerBankAccount;
} }
public PublicKey getPeersMessagePublicKey() { public PublicKey getTakerMessagePublicKey() {
return peersMessagePublicKey; return takerMessagePublicKey;
} }
public void setPeersMessagePublicKey(PublicKey peersMessagePublicKey) { public void setTakerMessagePublicKey(PublicKey takerMessagePublicKey) {
this.peersMessagePublicKey = peersMessagePublicKey; this.takerMessagePublicKey = takerMessagePublicKey;
} }
public String getPeersContractAsJson() { public String getTakerContractAsJson() {
return peersContractAsJson; return takerContractAsJson;
} }
public void setPeersContractAsJson(String peersContractAsJson) { public void setTakerContractAsJson(String takerContractAsJson) {
this.peersContractAsJson = peersContractAsJson; this.takerContractAsJson = takerContractAsJson;
} }
public String getSignedTakerDepositTxAsHex() { public String getSignedTakerDepositTxAsHex() {
@ -220,11 +209,11 @@ public class BuyerAsOffererModel extends TradeSharedModel {
this.takerTxOutIndex = takerTxOutIndex; this.takerTxOutIndex = takerTxOutIndex;
} }
public String getOffererPubKey() { public byte[] getOffererPubKey() {
return offererPubKey; return offererPubKey;
} }
public void setOffererPubKey(String offererPubKey) { public void setOffererPubKey(byte[] offererPubKey) {
this.offererPubKey = offererPubKey; this.offererPubKey = offererPubKey;
} }
@ -276,7 +265,7 @@ public class BuyerAsOffererModel extends TradeSharedModel {
return trade; return trade;
} }
public void setPeer(Peer peer) { public void setTaker(Peer taker) {
this.peer = peer; this.taker = taker;
} }
} }

View file

@ -80,7 +80,7 @@ public class BuyerAsOffererProtocol {
private void handleRequestTakeOfferMessage(RequestTakeOfferMessage tradeMessage, Peer peer) { private void handleRequestTakeOfferMessage(RequestTakeOfferMessage tradeMessage, Peer peer) {
model.setTradeMessage(tradeMessage); model.setTradeMessage(tradeMessage);
model.setPeer(peer); model.setTaker(peer);
BuyerAsOffererTaskRunner<BuyerAsOffererModel> taskRunner = new BuyerAsOffererTaskRunner<>(model, BuyerAsOffererTaskRunner<BuyerAsOffererModel> taskRunner = new BuyerAsOffererTaskRunner<>(model,
() -> { () -> {

View file

@ -28,12 +28,12 @@ public class TakerDepositPaymentRequestMessage implements Serializable, TradeMes
private final String tradeId; private final String tradeId;
private final BankAccount bankAccount; private final BankAccount bankAccount;
private final String accountID; private final String accountID;
private final String offererPubKey; private final byte[] offererPubKey;
private final String preparedOffererDepositTxAsHex; private final String preparedOffererDepositTxAsHex;
private final long offererTxOutIndex; private final long offererTxOutIndex;
public TakerDepositPaymentRequestMessage(String tradeId, BankAccount bankAccount, String accountID, public TakerDepositPaymentRequestMessage(String tradeId, BankAccount bankAccount, String accountID,
String offererPubKey, String preparedOffererDepositTxAsHex, byte[] offererPubKey, String preparedOffererDepositTxAsHex,
long offererTxOutIndex) { long offererTxOutIndex) {
this.tradeId = tradeId; this.tradeId = tradeId;
this.bankAccount = bankAccount; this.bankAccount = bankAccount;
@ -56,7 +56,7 @@ public class TakerDepositPaymentRequestMessage implements Serializable, TradeMes
return accountID; return accountID;
} }
public String getOffererPubKey() { public byte[] getOffererPubKey() {
return offererPubKey; return offererPubKey;
} }

View file

@ -40,12 +40,13 @@ public class CreateDepositTx extends Task<BuyerAsOffererModel> {
@Override @Override
protected void doRun() { protected void doRun() {
try { try {
String offererPubKey = model.getWalletService().getAddressInfoByTradeID(model.getTrade().getId()).getPubKeyAsHexString();
byte[] offererPubKey = model.getWalletService().getAddressInfo(model.getTrade().getId()).getPubKey();
Coin offererInputAmount = model.getTrade().getSecurityDeposit().add(FeePolicy.TX_FEE); Coin offererInputAmount = model.getTrade().getSecurityDeposit().add(FeePolicy.TX_FEE);
Transaction transaction = model.getWalletService().offererCreatesMSTxAndAddPayment( Transaction transaction = model.getWalletService().offererCreatesMSTxAndAddPayment(
offererInputAmount, offererInputAmount,
offererPubKey, offererPubKey,
model.getTradePubKeyAsHex(), model.getTakerPubKey(),
model.getArbitratorPubKey(), model.getArbitratorPubKey(),
model.getTrade().getId()); model.getTrade().getId());

View file

@ -42,10 +42,10 @@ public class ProcessRequestOffererPublishDepositTxMessage extends Task<BuyerAsOf
RequestOffererPublishDepositTxMessage message = (RequestOffererPublishDepositTxMessage) model.getTradeMessage(); RequestOffererPublishDepositTxMessage message = (RequestOffererPublishDepositTxMessage) model.getTradeMessage();
model.setTakerPayoutAddress(nonEmptyStringOf(message.getTakerPayoutAddress())); model.setTakerPayoutAddress(nonEmptyStringOf(message.getTakerPayoutAddress()));
model.setPeersAccountId(nonEmptyStringOf(message.getTakerAccountId())); model.setTakerAccountId(nonEmptyStringOf(message.getTakerAccountId()));
model.setPeersBankAccount(checkNotNull(message.getTakerBankAccount())); model.setTakerBankAccount(checkNotNull(message.getTakerBankAccount()));
model.setPeersMessagePublicKey(checkNotNull(message.getTakerMessagePublicKey())); model.setTakerMessagePublicKey(checkNotNull(message.getTakerMessagePublicKey()));
model.setPeersContractAsJson(nonEmptyStringOf(message.getTakerContractAsJson())); model.setTakerContractAsJson(nonEmptyStringOf(message.getTakerContractAsJson()));
model.setSignedTakerDepositTxAsHex(nonEmptyStringOf(message.getSignedTakerDepositTxAsHex())); model.setSignedTakerDepositTxAsHex(nonEmptyStringOf(message.getSignedTakerDepositTxAsHex()));
model.setTxConnOutAsHex(nonEmptyStringOf(message.getTxConnOutAsHex())); model.setTxConnOutAsHex(nonEmptyStringOf(message.getTxConnOutAsHex()));
model.setTxScriptSigAsHex(nonEmptyStringOf(message.getTxScriptSigAsHex())); model.setTxScriptSigAsHex(nonEmptyStringOf(message.getTxScriptSigAsHex()));

View file

@ -36,6 +36,9 @@ public class ProcessRequestTakeOfferMessage extends Task<BuyerAsOffererModel> {
@Override @Override
protected void doRun() { protected void doRun() {
try { try {
log.debug("######### " + model.getOffer().getId());
log.debug("######### " + model.getTradeMessage().getTradeId());
checkTradeId(model.getOffer().getId(), model.getTradeMessage()); checkTradeId(model.getOffer().getId(), model.getTradeMessage());
complete(); complete();

View file

@ -26,6 +26,7 @@ import io.bitsquare.util.taskrunner.TaskRunner;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import static com.google.common.base.Preconditions.checkNotNull;
import static io.bitsquare.util.Validator.*; import static io.bitsquare.util.Validator.*;
public class ProcessTakeOfferFeePayedMessage extends Task<BuyerAsOffererModel> { public class ProcessTakeOfferFeePayedMessage extends Task<BuyerAsOffererModel> {
@ -45,7 +46,7 @@ public class ProcessTakeOfferFeePayedMessage extends Task<BuyerAsOffererModel> {
trade.setTakeOfferFeeTxID(nonEmptyStringOf(takeOfferFeePayedMessage.getTakeOfferFeeTxId())); trade.setTakeOfferFeeTxID(nonEmptyStringOf(takeOfferFeePayedMessage.getTakeOfferFeeTxId()));
trade.setTradeAmount(positiveCoinOf(nonZeroCoinOf(takeOfferFeePayedMessage.getTradeAmount()))); trade.setTradeAmount(positiveCoinOf(nonZeroCoinOf(takeOfferFeePayedMessage.getTradeAmount())));
model.setTakeOfferFeeTxId(nonEmptyStringOf(takeOfferFeePayedMessage.getTakeOfferFeeTxId())); model.setTakeOfferFeeTxId(nonEmptyStringOf(takeOfferFeePayedMessage.getTakeOfferFeeTxId()));
model.setTradePubKeyAsHex(nonEmptyStringOf(takeOfferFeePayedMessage.getTakerPubKeyAsHex())); model.setTakerPubKey(checkNotNull(takeOfferFeePayedMessage.getTakerPubKey()));
complete(); complete();
} catch (Throwable t) { } catch (Throwable t) {
@ -55,5 +56,6 @@ public class ProcessTakeOfferFeePayedMessage extends Task<BuyerAsOffererModel> {
@Override @Override
protected void updateStateOnFault() { protected void updateStateOnFault() {
// do nothing
} }
} }

View file

@ -50,7 +50,7 @@ public class RespondToTakeOfferRequest extends Task<BuyerAsOffererModel> {
} }
RespondToTakeOfferRequestMessage tradeMessage = new RespondToTakeOfferRequestMessage(model.getOpenOffer().getId(), offerIsAvailable); RespondToTakeOfferRequestMessage tradeMessage = new RespondToTakeOfferRequestMessage(model.getOpenOffer().getId(), offerIsAvailable);
model.getTradeMessageService().sendMessage(model.getPeer(), tradeMessage, new SendMessageListener() { model.getTradeMessageService().sendMessage(model.getTaker(), tradeMessage, new SendMessageListener() {
@Override @Override
public void handleResult() { public void handleResult() {
complete(); complete();
@ -66,8 +66,8 @@ public class RespondToTakeOfferRequest extends Task<BuyerAsOffererModel> {
@Override @Override
protected void updateStateOnFault() { protected void updateStateOnFault() {
if (offerIsAvailable && model.getOpenOffer().getState() == OpenOffer.State.OFFER_ACCEPTED) { if (offerIsAvailable && model.getOpenOffer().getState() == OpenOffer.State.OFFER_ACCEPTED) {
model.getOpenOffer().setState(OpenOffer.State.OPEN);
model.setTrade(null); model.setTrade(null);
model.getOpenOffer().setState(OpenOffer.State.OPEN);
} }
} }
} }

View file

@ -43,7 +43,7 @@ public class SendBankTransferInitedMessage extends Task<BuyerAsOffererModel> {
model.getOffererPaybackAmount(), model.getOffererPaybackAmount(),
model.getTakerPaybackAmount(), model.getTakerPaybackAmount(),
model.getOffererPaybackAddress()); model.getOffererPaybackAddress());
model.getTradeMessageService().sendMessage(model.getPeer(), tradeMessage, new SendMessageListener() { model.getTradeMessageService().sendMessage(model.getTaker(), tradeMessage, new SendMessageListener() {
@Override @Override
public void handleResult() { public void handleResult() {
log.trace("Sending BankTransferInitedMessage succeeded."); log.trace("Sending BankTransferInitedMessage succeeded.");

View file

@ -40,7 +40,7 @@ public class SendDepositTxIdToTaker extends Task<BuyerAsOffererModel> {
DepositTxPublishedMessage tradeMessage = new DepositTxPublishedMessage(model.getTrade().getId(), DepositTxPublishedMessage tradeMessage = new DepositTxPublishedMessage(model.getTrade().getId(),
Utils.HEX.encode(model.getTrade().getDepositTx().bitcoinSerialize())); Utils.HEX.encode(model.getTrade().getDepositTx().bitcoinSerialize()));
model.getTradeMessageService().sendMessage(model.getPeer(), tradeMessage, new SendMessageListener() { model.getTradeMessageService().sendMessage(model.getTaker(), tradeMessage, new SendMessageListener() {
@Override @Override
public void handleResult() { public void handleResult() {
log.trace("DepositTxPublishedMessage successfully arrived at peer"); log.trace("DepositTxPublishedMessage successfully arrived at peer");

View file

@ -43,7 +43,7 @@ public class SendTakerDepositPaymentRequest extends Task<BuyerAsOffererModel> {
model.getPreparedOffererDepositTxAsHex(), model.getPreparedOffererDepositTxAsHex(),
model.getOffererTxOutIndex()); model.getOffererTxOutIndex());
model.getTradeMessageService().sendMessage(model.getPeer(), tradeMessage, new SendMessageListener() { model.getTradeMessageService().sendMessage(model.getTaker(), tradeMessage, new SendMessageListener() {
@Override @Override
public void handleResult() { public void handleResult() {
log.trace("RequestTakerDepositPaymentMessage successfully arrived at peer"); log.trace("RequestTakerDepositPaymentMessage successfully arrived at peer");

View file

@ -43,11 +43,11 @@ public class VerifyAndSignContract extends Task<BuyerAsOffererModel> {
trade.getTradeAmount(), trade.getTradeAmount(),
model.getTakeOfferFeeTxId(), model.getTakeOfferFeeTxId(),
model.getAccountId(), model.getAccountId(),
model.getPeersAccountId(), model.getTakerAccountId(),
model.getBankAccount(), model.getBankAccount(),
model.getPeersBankAccount(), model.getTakerBankAccount(),
model.getMessagePublicKey(), model.getMessagePublicKey(),
model.getPeersMessagePublicKey()); model.getTakerMessagePublicKey());
String contractAsJson = Utilities.objectToJson(contract); String contractAsJson = Utilities.objectToJson(contract);
String signature = model.getSignatureService().signMessage(model.getAccountKey(), contractAsJson); String signature = model.getSignatureService().signMessage(model.getAccountKey(), contractAsJson);

View file

@ -35,7 +35,7 @@ public class VerifyTakerAccount extends Task<BuyerAsOffererModel> {
protected void doRun() { protected void doRun() {
//TODO mocked yet //TODO mocked yet
if (model.getBlockChainService().verifyAccountRegistration()) { if (model.getBlockChainService().verifyAccountRegistration()) {
if (model.getBlockChainService().isAccountBlackListed(model.getPeersAccountId(), model.getPeersBankAccount())) { if (model.getBlockChainService().isAccountBlackListed(model.getTakerAccountId(), model.getTakerBankAccount())) {
log.error("Taker is blacklisted"); log.error("Taker is blacklisted");
failed("Taker is blacklisted"); failed("Taker is blacklisted");
} }

View file

@ -23,41 +23,31 @@ import io.bitsquare.crypto.SignatureService;
import io.bitsquare.network.Peer; import io.bitsquare.network.Peer;
import io.bitsquare.trade.Trade; import io.bitsquare.trade.Trade;
import io.bitsquare.trade.TradeMessageService; import io.bitsquare.trade.TradeMessageService;
import io.bitsquare.trade.protocol.trade.TradeSharedModel; import io.bitsquare.trade.protocol.trade.OfferSharedModel;
import io.bitsquare.user.User; import io.bitsquare.user.User;
import org.bitcoinj.core.Coin; import org.bitcoinj.core.Coin;
import org.bitcoinj.core.Transaction; import org.bitcoinj.core.Transaction;
import java.security.PublicKey;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public class SellerAsTakerModel extends TradeSharedModel { public class SellerAsTakerModel extends OfferSharedModel {
private static final Logger log = LoggerFactory.getLogger(SellerAsTakerModel.class); private static final Logger log = LoggerFactory.getLogger(SellerAsTakerModel.class);
// provided // provided
private final Trade trade; private final Trade trade;
// derived
private final Coin tradeAmount;
private final Coin securityDeposit;
private final PublicKey offererMessagePublicKey;
// written/read by task // written/read by task
private Peer peer; private Peer offerer;
private String preparedOffererDepositTxAsHex;
private String preparedPeersDepositTxAsHex;
private String depositTxAsHex; private String depositTxAsHex;
private Transaction signedTakerDepositTx; private Transaction signedTakerDepositTx;
private Transaction payoutTx; private Transaction payoutTx;
private String payoutTxAsHex; private String payoutTxAsHex;
private Coin takerPaybackAmount; private Coin takerPaybackAmount;
private byte[] offererPubKey;
private String peersPubKey; private long offererTxOutIndex;
private long peersTxOutIndex;
private String offererSignatureR; private String offererSignatureR;
private String offererSignatureS; private String offererSignatureS;
private Coin offererPaybackAmount; private Coin offererPaybackAmount;
@ -77,10 +67,7 @@ public class SellerAsTakerModel extends TradeSharedModel {
user); user);
this.trade = trade; this.trade = trade;
tradeAmount = trade.getTradeAmount(); takerPubKey = walletService.getAddressInfo(trade.getId()).getPubKey();
securityDeposit = trade.getSecurityDeposit();
offererMessagePublicKey = offer.getMessagePublicKey();
tradePubKeyAsHex = walletService.getAddressInfoByTradeID(trade.getId()).getPubKeyAsHexString();
} }
// getter/setter // getter/setter
@ -88,24 +75,12 @@ public class SellerAsTakerModel extends TradeSharedModel {
return trade; return trade;
} }
public Coin getTradeAmount() { public Peer getOfferer() {
return tradeAmount; return offerer;
} }
public Coin getSecurityDeposit() { public void setOfferer(Peer offerer) {
return securityDeposit; this.offerer = offerer;
}
public PublicKey getOffererMessagePublicKey() {
return offererMessagePublicKey;
}
public Peer getPeer() {
return peer;
}
public void setPeer(Peer peer) {
this.peer = peer;
} }
public Transaction getPayoutTx() { public Transaction getPayoutTx() {
@ -124,28 +99,28 @@ public class SellerAsTakerModel extends TradeSharedModel {
this.payoutTxAsHex = payoutTxAsHex; this.payoutTxAsHex = payoutTxAsHex;
} }
public String getPeersPubKey() { public byte[] getOffererPubKey() {
return peersPubKey; return offererPubKey;
} }
public void setPeersPubKey(String peersPubKey) { public void setOffererPubKeyAsHex(byte[] offererPubKey) {
this.peersPubKey = peersPubKey; this.offererPubKey = offererPubKey;
} }
public String getPreparedPeersDepositTxAsHex() { public String getPreparedOffererDepositTxAsHex() {
return preparedPeersDepositTxAsHex; return preparedOffererDepositTxAsHex;
} }
public void setPreparedPeersDepositTxAsHex(String preparedPeersDepositTxAsHex) { public void setPreparedOffererDepositTxAsHex(String preparedOffererDepositTxAsHex) {
this.preparedPeersDepositTxAsHex = preparedPeersDepositTxAsHex; this.preparedOffererDepositTxAsHex = preparedOffererDepositTxAsHex;
} }
public long getPeersTxOutIndex() { public long getOffererTxOutIndex() {
return peersTxOutIndex; return offererTxOutIndex;
} }
public void setPeersTxOutIndex(long peersTxOutIndex) { public void setOffererTxOutIndex(long offererTxOutIndex) {
this.peersTxOutIndex = peersTxOutIndex; this.offererTxOutIndex = offererTxOutIndex;
} }
public String getDepositTxAsHex() { public String getDepositTxAsHex() {

View file

@ -23,6 +23,7 @@ import java.io.Serializable;
public class RequestTakeOfferMessage implements Serializable, TradeMessage { public class RequestTakeOfferMessage implements Serializable, TradeMessage {
private static final long serialVersionUID = 4660151440192191798L; private static final long serialVersionUID = 4660151440192191798L;
private final String tradeId; private final String tradeId;
public RequestTakeOfferMessage(String tradeId) { public RequestTakeOfferMessage(String tradeId) {

View file

@ -25,17 +25,17 @@ import java.io.Serializable;
public class TakeOfferFeePayedMessage implements Serializable, TradeMessage { public class TakeOfferFeePayedMessage implements Serializable, TradeMessage {
private static final long serialVersionUID = -5057935061275354312L; private static final long serialVersionUID = -5057935061275354312L;
private final String tradeId;
private final String tradeId;
private final Coin tradeAmount; private final Coin tradeAmount;
private final String takeOfferFeeTxID; private final String takeOfferFeeTxID;
private final String tradePubKeyAsHex; private final byte[] takerPubKey;
public TakeOfferFeePayedMessage(String tradeId, String takeOfferFeeTxID, Coin tradeAmount, String tradePubKeyAsHex) { public TakeOfferFeePayedMessage(String tradeId, String takeOfferFeeTxID, Coin tradeAmount, byte[] takerPubKey) {
this.tradeId = tradeId; this.tradeId = tradeId;
this.takeOfferFeeTxID = takeOfferFeeTxID; this.takeOfferFeeTxID = takeOfferFeeTxID;
this.tradeAmount = tradeAmount; this.tradeAmount = tradeAmount;
this.tradePubKeyAsHex = tradePubKeyAsHex; this.takerPubKey = takerPubKey;
} }
@Override @Override
@ -51,8 +51,8 @@ public class TakeOfferFeePayedMessage implements Serializable, TradeMessage {
return takeOfferFeeTxID; return takeOfferFeeTxID;
} }
public String getTakerPubKeyAsHex() { public byte[] getTakerPubKey() {
return tradePubKeyAsHex; return takerPubKey;
} }
} }

View file

@ -39,13 +39,13 @@ public class CreateAndSignContract extends Task<SellerAsTakerModel> {
Trade trade = model.getTrade(); Trade trade = model.getTrade();
Contract contract = new Contract( Contract contract = new Contract(
model.getOffer(), model.getOffer(),
model.getTradeAmount(), model.getTrade().getTradeAmount(),
trade.getTakeOfferFeeTxId(), trade.getTakeOfferFeeTxId(),
model.getPeersAccountId(), model.getTakerAccountId(),
model.getAccountId(), model.getAccountId(),
model.getPeersBankAccount(), model.getTakerBankAccount(),
model.getBankAccount(), model.getBankAccount(),
model.getOffererMessagePublicKey(), model.getOffer().getMessagePublicKey(),
model.getMessagePublicKey()); model.getMessagePublicKey());
String contractAsJson = Utilities.objectToJson(contract); String contractAsJson = Utilities.objectToJson(contract);
String signature = model.getSignatureService().signMessage(model.getAccountKey(), contractAsJson); String signature = model.getSignatureService().signMessage(model.getAccountKey(), contractAsJson);

View file

@ -42,7 +42,7 @@ public class GetPeerAddress extends Task<SellerAsTakerModel> {
public void onResult(Peer peer) { public void onResult(Peer peer) {
log.trace("Found peer: " + peer.toString()); log.trace("Found peer: " + peer.toString());
model.setPeer(peer); model.setOfferer(peer);
complete(); complete();
} }

View file

@ -38,15 +38,15 @@ public class PayDeposit extends Task<SellerAsTakerModel> {
@Override @Override
protected void doRun() { protected void doRun() {
try { try {
Coin amountToPay = model.getTradeAmount().add(model.getSecurityDeposit()); Coin amountToPay = model.getTrade().getTradeAmount().add(model.getTrade().getSecurityDeposit());
Coin msOutputAmount = amountToPay.add(model.getSecurityDeposit()); Coin msOutputAmount = amountToPay.add(model.getTrade().getSecurityDeposit());
Transaction signedTakerDepositTx = model.getWalletService().takerAddPaymentAndSignTx( Transaction signedTakerDepositTx = model.getWalletService().takerAddPaymentAndSignTx(
amountToPay, amountToPay,
msOutputAmount, msOutputAmount,
model.getPeersPubKey(), model.getOffererPubKey(),
model.getTradePubKeyAsHex(), model.getTakerPubKey(),
model.getArbitratorPubKey(), model.getArbitratorPubKey(),
model.getPreparedPeersDepositTxAsHex(), model.getPreparedOffererDepositTxAsHex(),
model.getTrade().getId()); model.getTrade().getId());
model.setSignedTakerDepositTx(signedTakerDepositTx); model.setSignedTakerDepositTx(signedTakerDepositTx);

View file

@ -58,6 +58,7 @@ public class PayTakeOfferFee extends Task<SellerAsTakerModel> {
} }
}); });
} catch (InsufficientMoneyException e) { } catch (InsufficientMoneyException e) {
appendToErrorMessage(e.getMessage());
failed(e); failed(e);
} }
} }
@ -67,6 +68,7 @@ public class PayTakeOfferFee extends Task<SellerAsTakerModel> {
// As long as the take offer fee was not paid nothing critical happens. // As long as the take offer fee was not paid nothing critical happens.
// The take offer process can be repeated so we reset the trade state. // The take offer process can be repeated so we reset the trade state.
appendToErrorMessage("Take offer fee payment failed. Maybe your network connection was lost. Please try again."); appendToErrorMessage("Take offer fee payment failed. Maybe your network connection was lost. Please try again.");
model.getTrade().setState(Trade.State.OPEN); model.getTrade().setTakeOfferFeeTxID(null);
model.getTrade().setState(Trade.State.TAKE_OFFER_FEE_PAYMENT_FAILED);
} }
} }

View file

@ -40,11 +40,11 @@ public class ProcessTakerDepositPaymentRequestMessage extends Task<SellerAsTaker
try { try {
checkTradeId(model.getTrade().getId(), model.getTradeMessage()); checkTradeId(model.getTrade().getId(), model.getTradeMessage());
TakerDepositPaymentRequestMessage message = (TakerDepositPaymentRequestMessage) model.getTradeMessage(); TakerDepositPaymentRequestMessage message = (TakerDepositPaymentRequestMessage) model.getTradeMessage();
model.setPeersAccountId(nonEmptyStringOf(message.getAccountId())); model.setTakerAccountId(nonEmptyStringOf(message.getAccountId()));
model.setPeersBankAccount(checkNotNull(message.getBankAccount())); model.setTakerBankAccount(checkNotNull(message.getBankAccount()));
model.setPeersPubKey(nonEmptyStringOf(message.getOffererPubKey())); model.setOffererPubKeyAsHex(checkNotNull(message.getOffererPubKey()));
model.setPreparedPeersDepositTxAsHex(nonEmptyStringOf(message.getPreparedOffererDepositTxAsHex())); model.setPreparedOffererDepositTxAsHex(nonEmptyStringOf(message.getPreparedOffererDepositTxAsHex()));
model.setPeersTxOutIndex(nonNegativeLongOf(message.getOffererTxOutIndex())); model.setOffererTxOutIndex(nonNegativeLongOf(message.getOffererTxOutIndex()));
complete(); complete();
} catch (Throwable t) { } catch (Throwable t) {

View file

@ -21,18 +21,14 @@ import io.bitsquare.offer.Offer;
import io.bitsquare.trade.listeners.SendMessageListener; import io.bitsquare.trade.listeners.SendMessageListener;
import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel; import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
import io.bitsquare.trade.protocol.trade.taker.messages.RequestTakeOfferMessage; import io.bitsquare.trade.protocol.trade.taker.messages.RequestTakeOfferMessage;
import io.bitsquare.util.Utilities;
import io.bitsquare.util.taskrunner.Task; import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner; import io.bitsquare.util.taskrunner.TaskRunner;
import javafx.animation.AnimationTimer;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public class RequestTakeOffer extends Task<SellerAsTakerModel> { public class RequestTakeOffer extends Task<SellerAsTakerModel> {
private static final Logger log = LoggerFactory.getLogger(RequestTakeOffer.class); private static final Logger log = LoggerFactory.getLogger(RequestTakeOffer.class);
private AnimationTimer timeoutTimer;
public RequestTakeOffer(TaskRunner taskHandler, SellerAsTakerModel model) { public RequestTakeOffer(TaskRunner taskHandler, SellerAsTakerModel model) {
super(taskHandler, model); super(taskHandler, model);
@ -40,18 +36,11 @@ public class RequestTakeOffer extends Task<SellerAsTakerModel> {
@Override @Override
protected void doRun() { protected void doRun() {
timeoutTimer = Utilities.setTimeout(10000, animationTimer -> { log.debug("######### " + model.getTrade().getId());
failed("Timeout reached. We did not get any response form the offerer."); model.getTradeMessageService().sendMessage(model.getOfferer(), new RequestTakeOfferMessage(model.getTrade().getId()),
model.getOffer().setState(Offer.State.OFFERER_OFFLINE);
return null;
});
timeoutTimer.start();
model.getTradeMessageService().sendMessage(model.getPeer(), new RequestTakeOfferMessage(model.getTrade().getId()),
new SendMessageListener() { new SendMessageListener() {
@Override @Override
public void handleResult() { public void handleResult() {
timeoutTimer.stop();
complete(); complete();
} }
@ -65,7 +54,6 @@ public class RequestTakeOffer extends Task<SellerAsTakerModel> {
@Override @Override
protected void updateStateOnFault() { protected void updateStateOnFault() {
timeoutTimer.stop();
if (model.getOffer().getState() != Offer.State.OFFERER_OFFLINE) if (model.getOffer().getState() != Offer.State.OFFERER_OFFLINE)
model.getOffer().setState(Offer.State.AVAILABILITY_CHECK_FAILED); model.getOffer().setState(Offer.State.AVAILABILITY_CHECK_FAILED);
} }

View file

@ -36,7 +36,7 @@ public class SendPayoutTxToOfferer extends Task<SellerAsTakerModel> {
@Override @Override
protected void doRun() { protected void doRun() {
PayoutTxPublishedMessage tradeMessage = new PayoutTxPublishedMessage(model.getTrade().getId(), model.getPayoutTxAsHex()); PayoutTxPublishedMessage tradeMessage = new PayoutTxPublishedMessage(model.getTrade().getId(), model.getPayoutTxAsHex());
model.getTradeMessageService().sendMessage(model.getPeer(), tradeMessage, new SendMessageListener() { model.getTradeMessageService().sendMessage(model.getOfferer(), tradeMessage, new SendMessageListener() {
@Override @Override
public void handleResult() { public void handleResult() {
log.trace("PayoutTxPublishedMessage successfully arrived at peer"); log.trace("PayoutTxPublishedMessage successfully arrived at peer");

View file

@ -51,11 +51,11 @@ public class SendSignedTakerDepositTxAsHex extends Task<SellerAsTakerModel> {
Utils.HEX.encode(signedTakerDepositTx.getInput(1).getConnectedOutput().getParentTransaction().bitcoinSerialize()), Utils.HEX.encode(signedTakerDepositTx.getInput(1).getConnectedOutput().getParentTransaction().bitcoinSerialize()),
model.getTrade().getContractAsJson(), model.getTrade().getContractAsJson(),
model.getTrade().getTakerContractSignature(), model.getTrade().getTakerContractSignature(),
model.getWalletService().getAddressInfoByTradeID(model.getTrade().getId()).getAddressString(), model.getWalletService().getAddressInfo(model.getTrade().getId()).getAddressString(),
takerTxOutIndex, takerTxOutIndex,
model.getPeersTxOutIndex()); model.getOffererTxOutIndex());
model.getTradeMessageService().sendMessage(model.getPeer(), tradeMessage, new SendMessageListener() { model.getTradeMessageService().sendMessage(model.getOfferer(), tradeMessage, new SendMessageListener() {
@Override @Override
public void handleResult() { public void handleResult() {
complete(); complete();

View file

@ -17,6 +17,7 @@
package io.bitsquare.trade.protocol.trade.taker.tasks; package io.bitsquare.trade.protocol.trade.taker.tasks;
import io.bitsquare.trade.Trade;
import io.bitsquare.trade.listeners.SendMessageListener; import io.bitsquare.trade.listeners.SendMessageListener;
import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel; import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
import io.bitsquare.trade.protocol.trade.taker.messages.TakeOfferFeePayedMessage; import io.bitsquare.trade.protocol.trade.taker.messages.TakeOfferFeePayedMessage;
@ -40,12 +41,11 @@ public class SendTakeOfferFeePayedMessage extends Task<SellerAsTakerModel> {
TakeOfferFeePayedMessage msg = new TakeOfferFeePayedMessage( TakeOfferFeePayedMessage msg = new TakeOfferFeePayedMessage(
model.getTrade().getId(), model.getTrade().getId(),
model.getTrade().getTakeOfferFeeTxId(), model.getTrade().getTakeOfferFeeTxId(),
model.getTradeAmount(), model.getTrade().getTradeAmount(),
model.getTradePubKeyAsHex() model.getTakerPubKey()
); );
model.getTradeMessageService().sendMessage(model.getPeer(), msg, new SendMessageListener() { model.getTradeMessageService().sendMessage(model.getOfferer(), msg, new SendMessageListener() {
@Override @Override
public void handleResult() { public void handleResult() {
log.trace("Sending TakeOfferFeePayedMessage succeeded."); log.trace("Sending TakeOfferFeePayedMessage succeeded.");
@ -71,5 +71,6 @@ public class SendTakeOfferFeePayedMessage extends Task<SellerAsTakerModel> {
protected void updateStateOnFault() { protected void updateStateOnFault() {
appendToErrorMessage("Sending TakeOfferFeePayedMessage to offerer failed. Maybe the network connection was lost or the offerer lost his connection. " + appendToErrorMessage("Sending TakeOfferFeePayedMessage to offerer failed. Maybe the network connection was lost or the offerer lost his connection. " +
"We persisted the state of the trade, please try again later or cancel that trade."); "We persisted the state of the trade, please try again later or cancel that trade.");
model.getTrade().setState(Trade.State.MESSAGE_SENDING_FAILED);
} }
} }

View file

@ -34,7 +34,7 @@ public class VerifyOffererAccount extends Task<SellerAsTakerModel> {
@Override @Override
protected void doRun() { protected void doRun() {
if (model.getBlockChainService().verifyAccountRegistration()) { if (model.getBlockChainService().verifyAccountRegistration()) {
if (model.getBlockChainService().isAccountBlackListed(model.getPeersAccountId(), model.getPeersBankAccount())) { if (model.getBlockChainService().isAccountBlackListed(model.getTakerAccountId(), model.getTakerBankAccount())) {
failed("Taker is blacklisted."); failed("Taker is blacklisted.");
} }
else { else {

View file

@ -1,68 +0,0 @@
/*
* This file is part of Bitsquare.
*
* Bitsquare is free software: you can redistribute it and/or modify it
* under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at
* your option) any later version.
*
* Bitsquare is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
* License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Bitsquare. If not, see <http://www.gnu.org/licenses/>.
*/
package io.bitsquare.util;
import org.bitcoinj.core.Utils;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import java.io.IOException;
import java.util.Arrays;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Bytes {
private static final Logger log = LoggerFactory.getLogger(Bytes.class);
public final byte[] bytes;
public final String string;
public Bytes(byte[] bytes) {
this.bytes = Arrays.copyOf(bytes, bytes.length);
this.string = Utils.HEX.encode(bytes);
}
public Bytes(String string) {
this.string = string;
this.bytes = Utils.HEX.decode(string);
}
@Override
public String toString() {
return string;
}
public static class GsonAdapter extends TypeAdapter<Bytes> {
@Override
public Bytes read(JsonReader reader) throws IOException {
return new Bytes(reader.nextString());
}
@Override
public void write(JsonWriter out, Bytes value) throws IOException {
if (value == null)
out.nullValue();
else
out.value(value.string);
}
}
}

View file

@ -145,7 +145,7 @@ public class PlaceOfferProtocolTest {
() -> { () -> {
log.trace("wallet completed"); log.trace("wallet completed");
// 1. Use that address for funding the trading wallet // 1. Use that address for funding the trading wallet
address = walletService.getAddressInfoByTradeID(OFFER_ID).getAddress(); address = walletService.getAddressInfo(OFFER_ID).getAddress();
log.info("address for funding wallet = " + address.toString());//muoTvFHJmQwPKYoA8Fr7t87UCSfZM4fciG log.info("address for funding wallet = " + address.toString());//muoTvFHJmQwPKYoA8Fr7t87UCSfZM4fciG
log.info("Balance = " + walletService.getBalanceForAddress(address)); log.info("Balance = " + walletService.getBalanceForAddress(address));
countDownLatch.countDown(); countDownLatch.countDown();