Skip to content

Commit

Permalink
This is to initiate the update necessary for the fulfillment of proposal
Browse files Browse the repository at this point in the history
bisq-network#110:

Fully functional and basic Monero (XMR) wallet integrated to Monero RPC
Wallet
running on localhost with the following features:

1. Viewing balance (total and unlocked).
2. Sending XMR.
3. Viewing XMR Primary address to receive XMR.
4. Viewing and searching transactions.
5. Transaction/payment proof/verification (almost certified complete).

TODOs:

1. Completion of automation of Monero related trades (integration to
wallet).
2. Unit Tests (first order - XmrFormatter and XmrValidator).
3.Payment proof testing completion.
  • Loading branch information
niyid committed Sep 16, 2019
1 parent d701d2f commit da3b693
Show file tree
Hide file tree
Showing 33 changed files with 3,085 additions and 196 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,4 @@ deploy
/monitor/TorHiddenServiceStartupTimeTests/*
/monitor/monitor-tor/*
.java-version
/.metadata/
2 changes: 2 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -75,12 +75,14 @@ configure(subprojects) {
}

repositories {
mavenLocal()
mavenCentral()
maven { url 'https://jitpack.io' }
}

dependencies {
testCompile "junit:junit:$junitVersion"
compile 'woodser:monero-wallet-java:0.0.2-SNAPSHOT'
}

tasks.withType(JavaCompile) {
Expand Down
7 changes: 7 additions & 0 deletions common/src/main/proto/pb.proto
Original file line number Diff line number Diff line change
Expand Up @@ -1378,6 +1378,13 @@ message PreferencesPayload {
int32 ignore_dust_threshold = 51;
double buyer_security_deposit_as_percent_for_crypto = 52;
int32 block_notify_port = 53;
bool use_bisq_xmr_wallet = 54;
string xmr_user_host = 55;
string xmr_host_port = 56;
string xmr_rpc_user = 57;
string xmr_rpc_pwd = 58;
repeated string xmr_hosts = 59;
int32 xmr_host_option_ordinal = 60;
}

///////////////////////////////////////////////////////////////////////////////////////////
Expand Down
15 changes: 15 additions & 0 deletions core/src/main/java/bisq/core/payment/PaymentAccountFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,10 @@

package bisq.core.payment;

import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.PaymentMethod;
import bisq.core.xmr.wallet.XmrWalletRpcWrapper;


public class PaymentAccountFactory {
public static PaymentAccount getPaymentAccount(PaymentMethod paymentMethod) {
Expand Down Expand Up @@ -89,4 +92,16 @@ public static PaymentAccount getPaymentAccount(PaymentMethod paymentMethod) {
throw new RuntimeException("Not supported PaymentMethod: " + paymentMethod);
}
}

public static InstantCryptoCurrencyAccount producePrimaryWalletAccount(XmrWalletRpcWrapper xmrWalletRpcWrapper, TradeCurrency xmrTradeCurrency) {
InstantCryptoCurrencyAccount account = new InstantCryptoCurrencyAccount();
account.init();

account.setAddress(xmrWalletRpcWrapper.getPrimaryAddress());
account.setSingleTradeCurrency(xmrTradeCurrency);
account.setAccountName("XMR Wallet: " + account.getAddress().substring(0, 6) + "...");

return account;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@

import bisq.common.app.AppModule;

import bisq.core.xmr.wallet.XmrWalletRpcWrapper;

import org.springframework.core.env.Environment;

import com.google.inject.Singleton;
Expand Down
110 changes: 110 additions & 0 deletions core/src/main/java/bisq/core/user/Preferences.java
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,10 @@
@Slf4j
@Singleton
public final class Preferences implements PersistedDataHost, BridgeAddressProvider {
//TODO(niyid) Monero Wallet params: XMR_MAIN_NET_EXPLORERS, XMR_TEST_NET_EXPLORERS
//TODO(niyid) Monero Wallet params: Local Host(127.0.0.1)/Remote Host node, Port
//TODO(niyid) Monero Wallet params: List of available remote nodes
//TODO(niyid) Monero Wallet params equivalents of: btcNodesFromOptions, useTorFlagFromOptions, rpcUserFromOptions, rpcPwFromOptions

private static final ArrayList<BlockChainExplorer> BTC_MAIN_NET_EXPLORERS = new ArrayList<>(Arrays.asList(
new BlockChainExplorer("Blockstream.info", "https://blockstream.info/tx/", "https://blockstream.info/address/"),
Expand Down Expand Up @@ -129,14 +133,19 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid
private final ObservableList<FiatCurrency> fiatCurrenciesAsObservable = FXCollections.observableArrayList();
private final ObservableList<CryptoCurrency> cryptoCurrenciesAsObservable = FXCollections.observableArrayList();
private final ObservableList<TradeCurrency> tradeCurrenciesAsObservable = FXCollections.observableArrayList();
private final ObservableList<String> xmrHostsAsObservable = FXCollections.observableArrayList();
private final ObservableMap<String, Boolean> dontShowAgainMapAsObservable = FXCollections.observableHashMap();

private final Storage<PreferencesPayload> storage;
private final BisqEnvironment bisqEnvironment;
private final String btcNodesFromOptions, useTorFlagFromOptions, referralIdFromOptions, fullDaoNodeFromOptions,
rpcUserFromOptions, rpcPwFromOptions, blockNotifyPortFromOptions;

private final String xmrUserHostDelegate, xmrHostPortDelegate, xmrRpcUserDelegate, xmrRpcPwdDelegate;
@Getter
private final BooleanProperty useStandbyModeProperty = new SimpleBooleanProperty(prefPayload.isUseStandbyMode());
@Getter
private final BooleanProperty useBisqXmrWalletProperty = new SimpleBooleanProperty(prefPayload.isUseBisqXmrWallet());


///////////////////////////////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -166,6 +175,11 @@ public Preferences(Storage<PreferencesPayload> storage,
this.rpcUserFromOptions = rpcUser;
this.rpcPwFromOptions = rpcPassword;
this.blockNotifyPortFromOptions = rpcBlockNotificationPort;

xmrUserHostDelegate = "127.0.0.1";
xmrHostPortDelegate = "29088";
xmrRpcUserDelegate = null;
xmrRpcPwdDelegate = null;

useAnimationsProperty.addListener((ov) -> {
prefPayload.setUseAnimations(useAnimationsProperty.get());
Expand All @@ -178,6 +192,11 @@ public Preferences(Storage<PreferencesPayload> storage,
persist();
});

useBisqXmrWalletProperty.addListener((ov) -> {
prefPayload.setUseBisqXmrWallet(useBisqXmrWalletProperty.get());
persist();
});

fiatCurrenciesAsObservable.addListener((javafx.beans.Observable ov) -> {
prefPayload.getFiatCurrencies().clear();
prefPayload.getFiatCurrencies().addAll(fiatCurrenciesAsObservable);
Expand Down Expand Up @@ -259,11 +278,13 @@ public void readPersisted() {
// set all properties
useAnimationsProperty.set(prefPayload.isUseAnimations());
useStandbyModeProperty.set(prefPayload.isUseStandbyMode());
useBisqXmrWalletProperty.set(prefPayload.isUseBisqXmrWallet());
useCustomWithdrawalTxFeeProperty.set(prefPayload.isUseCustomWithdrawalTxFee());
withdrawalTxFeeInBytesProperty.set(prefPayload.getWithdrawalTxFeeInBytes());

tradeCurrenciesAsObservable.addAll(prefPayload.getFiatCurrencies());
tradeCurrenciesAsObservable.addAll(prefPayload.getCryptoCurrencies());
xmrHostsAsObservable.addAll(prefPayload.getXmrHosts());
dontShowAgainMapAsObservable.putAll(getDontShowAgainMap());

// Override settings with options if set
Expand Down Expand Up @@ -368,6 +389,27 @@ public void removeCryptoCurrency(CryptoCurrency tradeCurrency) {
}
}

public void addXmrHost(String host) {
if (!xmrHostsAsObservable.contains(host)) {
xmrHostsAsObservable.add(host);
}
}

public void removeXmrHost(String host) {
if (xmrHostsAsObservable.size() > 1) {
if (xmrHostsAsObservable.contains(host))
xmrHostsAsObservable.remove(host);

if (prefPayload.getXmrUserHost() != null &&
prefPayload.getXmrUserHost().equals(host)) {
setXmrUserHost(xmrHostsAsObservable.get(0));
}
} else {
log.error("you cannot remove the last Monero host");
}
}


public void setBlockChainExplorer(BlockChainExplorer blockChainExplorer) {
if (BisqEnvironment.getBaseCurrencyNetwork().isMainnet())
setBlockChainExplorerMainNet(blockChainExplorer);
Expand Down Expand Up @@ -608,6 +650,10 @@ public void setUseStandbyMode(boolean useStandbyMode) {
this.useStandbyModeProperty.set(useStandbyMode);
}

public void setUseBisqXmrWallet(boolean useBisqXmrWallet) {
this.useBisqXmrWalletProperty.set(useBisqXmrWallet);
}

public void setTakeOfferSelectedPaymentAccountId(String value) {
prefPayload.setTakeOfferSelectedPaymentAccountId(value);
persist();
Expand Down Expand Up @@ -639,6 +685,32 @@ public void setRpcPw(String value) {
}
}

public void setXmrUserHostDelegate(String value) {
prefPayload.setXmrUserHost(value);
persist();
}

public void setXmrHostPortDelegate(String value) {
prefPayload.setXmrHostPort(value);
persist();
}

public void setXmrRpcUserDelegate(String value) {
// We only persist if we have not set the program argument
if (xmrUserHostDelegate == null || xmrUserHostDelegate.isEmpty()) {
prefPayload.setXmrRpcUser(value);
persist();
}
}

public void setXmrRpcPwdDelegate(String value) {
// We only persist if we have not set the program argument
if (xmrRpcPwdDelegate == null || xmrRpcPwdDelegate.isEmpty()) {
prefPayload.setXmrRpcPwd(value);
persist();
}
}

public void setBlockNotifyPort(int value) {
// We only persist if we have not set the program argument
if (blockNotifyPortFromOptions == null || blockNotifyPortFromOptions.isEmpty()) {
Expand Down Expand Up @@ -672,6 +744,10 @@ public ObservableList<CryptoCurrency> getCryptoCurrenciesAsObservable() {
public ObservableList<TradeCurrency> getTradeCurrenciesAsObservable() {
return tradeCurrenciesAsObservable;
}

public ObservableList<String> getXmrHostsAsObservable() {
return xmrHostsAsObservable;
}

public ObservableMap<String, Boolean> getDontShowAgainMapAsObservable() {
return dontShowAgainMapAsObservable;
Expand Down Expand Up @@ -791,6 +867,38 @@ public String getRpcPw() {
}
}

public String getXmrUserHostDelegate() {
if (xmrUserHostDelegate != null && !xmrUserHostDelegate.isEmpty()) {
return xmrUserHostDelegate;
} else {
return prefPayload.getXmrUserHost();
}
}

public String getXmrHostPortDelegate() {
if (xmrHostPortDelegate != null && !xmrHostPortDelegate.isEmpty()) {
return xmrHostPortDelegate;
} else {
return prefPayload.getXmrUserHost();
}
}

public String getXmrRpcUserDelegate() {
if (xmrRpcUserDelegate != null && !xmrRpcUserDelegate.isEmpty()) {
return xmrRpcUserDelegate;
} else {
return prefPayload.getXmrRpcUser();
}
}

public String getXmrRpcPwdDelegate() {
if (xmrRpcPwdDelegate != null && !xmrRpcPwdDelegate.isEmpty()) {
return xmrRpcPwdDelegate;
} else {
return prefPayload.getXmrRpcPwd();
}
}

public int getBlockNotifyPort() {
if (blockNotifyPortFromOptions != null && !blockNotifyPortFromOptions.isEmpty()) {
try {
Expand Down Expand Up @@ -911,6 +1019,8 @@ private interface ExcludesDelegateMethods {
long getWithdrawalTxFeeInBytes();

void setUseStandbyMode(boolean useStandbyMode);

void setUseBisqXmrWallet(boolean useBisqXmrWallet);

void setTakeOfferSelectedPaymentAccountId(String value);

Expand Down
Loading

0 comments on commit da3b693

Please sign in to comment.