Compare commits
52 commits
my-next-ve
...
main
Author | SHA1 | Date | |
---|---|---|---|
707e3bb008 | |||
dd453adbd5 | |||
a4e91575f9 | |||
103227dd73 | |||
b5c62050d3 | |||
3cebfe6ba1 | |||
0f202148b6 | |||
5d2c0b16a1 | |||
e4f548e24f | |||
1c0d9e3299 | |||
52d25d8256 | |||
29c38946b8 | |||
b7edb070fc | |||
485c696d5e | |||
11f70a8d3d | |||
5413a41d62 | |||
e0cf3b05df | |||
1e14441297 | |||
efb4823a78 | |||
ff3ed55d29 | |||
0ec5b3bbd5 | |||
4c444533bf | |||
c13522175f | |||
570f63cb86 | |||
e143b86791 | |||
05d9796bb9 | |||
46cac08f42 | |||
285b853a58 | |||
d3945fff7e | |||
34cc564f18 | |||
1be47b7646 | |||
97c349f6b3 | |||
401b363d07 | |||
ac4b7c597c | |||
30460f05f4 | |||
893fa2ec90 | |||
dc062984b3 | |||
16c2d87cea | |||
52bdd156f3 | |||
648165b368 | |||
36a371ef34 | |||
|
e4e118f70c | ||
|
53e2c5cc24 | ||
|
62d5eb4bc3 | ||
|
183782982c | ||
13b201b020 | |||
|
ee49324fbb | ||
6a2672893c | |||
86d557c669 | |||
36667f0b09 | |||
a2f537ebf4 | |||
8e1c629abd |
15
.github/workflows/build.yml
vendored
|
@ -5,10 +5,15 @@ name: CI
|
|||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- '**/README.md'
|
||||
push:
|
||||
tags:
|
||||
- 'v*.*.*'
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
@ -163,11 +168,3 @@ jobs:
|
|||
${{ github.workspace }}/haveno-v${{ env.VERSION }}-macos-SNAPSHOT-all.jar.SHA-256
|
||||
${{ github.workspace }}/release-windows/haveno-v${{ env.VERSION }}-windows-installer.exe
|
||||
${{ github.workspace }}/haveno-v${{ env.VERSION }}-windows-SNAPSHOT-all.jar.SHA-256
|
||||
|
||||
# https://git-scm.com/docs/git-tag - git-tag Docu
|
||||
#
|
||||
# git tag - lists all local tags
|
||||
# git tag -d 1.0.19-1 - delete local tag
|
||||
#
|
||||
# git ls-remote --tags - lists all remote tags
|
||||
# git push origin --delete refs/tags/1.0.19-1 - delete remote tag
|
||||
|
|
2
.github/workflows/codacy-code-reporter.yml
vendored
|
@ -7,7 +7,7 @@ permissions:
|
|||
|
||||
jobs:
|
||||
build:
|
||||
if: github.repository == 'haveno-dex/haveno'
|
||||
if: github.repository == 'MoneroEcosystem/haveno'
|
||||
name: Publish coverage
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
|
|
1
.gitignore
vendored
|
@ -39,3 +39,4 @@ deploy
|
|||
*/.factorypath
|
||||
.flatpak-builder
|
||||
exchange.haveno.Haveno.yaml
|
||||
hs_ed25519_secret_key
|
12
Makefile
|
@ -595,3 +595,15 @@ user3-desktop-mainnet:
|
|||
--apiPort=1204 \
|
||||
--useNativeXmrWallet=false \
|
||||
--ignoreLocalXmrNode=false \
|
||||
|
||||
parner1-bot-stagenet:
|
||||
./haveno-bot$(APP_EXT) \
|
||||
--baseCurrencyNetwork=XMR_STAGENET \
|
||||
--useLocalhostForP2P=false \
|
||||
--useDevPrivilegeKeys=false \
|
||||
--nodePort=9999 \
|
||||
--appName=haveno-XMR_STAGENET_user3 \
|
||||
--apiPassword=apitest \
|
||||
--apiPort=1204 \
|
||||
--useNativeXmrWallet=false \
|
||||
--ignoreLocalXmrNode=false \
|
84
README.md
|
@ -1,83 +1 @@
|
|||
<div align="center">
|
||||
<img src="https://raw.githubusercontent.com/haveno-dex/haveno-meta/721e52919b28b44d12b6e1e5dac57265f1c05cda/logo/haveno_logo_landscape.svg" alt="Haveno logo">
|
||||
|
||||

|
||||
[](https://github.com/haveno-dex/haveno/issues?q=is%3Aopen+is%3Aissue+label%3A%F0%9F%92%B0bounty)
|
||||
[](https://twitter.com/havenodex)
|
||||
[](https://matrix.to/#/#haveno:monero.social) [](https://github.com/haveno-dex/.github/blob/master/CODE_OF_CONDUCT.md)
|
||||
</div>
|
||||
|
||||
## What is Haveno?
|
||||
|
||||
Haveno (pronounced ha‧ve‧no) is an open source platform to exchange [Monero](https://getmonero.org) for fiat currencies like USD, EUR, and GBP or other cryptocurrencies like BTC, ETH, and BCH.
|
||||
|
||||
Main features:
|
||||
|
||||
- Communications are routed through **Tor**, to preserve your privacy.
|
||||
|
||||
- Trades are **peer-to-peer**: trades on Haveno happen between people only, there is no central authority.
|
||||
|
||||
- Trades are **non-custodial**: Haveno supports arbitration in case something goes wrong during the trade, but arbitrators never have access to your funds.
|
||||
|
||||
- There is **No token**, because it's not needed. Transactions between traders are secured by non-custodial multisignature transactions on the Monero network.
|
||||
|
||||
See the [FAQ on our website](https://haveno.exchange/faq/) for more information.
|
||||
|
||||
## Haveno Demo
|
||||
|
||||
https://github.com/user-attachments/assets/eb6b3af0-78ce-46a7-bfa1-2aacd8649d47
|
||||
|
||||
## Installing Haveno
|
||||
|
||||
Haveno can be installed on Linux, macOS, and Windows by using a third party installer and network.
|
||||
|
||||
> [!note]
|
||||
> The official Haveno repository does not support making real trades directly.
|
||||
>
|
||||
> To make real trades with Haveno, first find a third party network, and then use their installer or build their repository. We do not endorse any networks at this time.
|
||||
|
||||
A test network is also available for users to make test trades using Monero's stagenet. See the [instructions](https://github.com/haveno-dex/haveno/blob/master/docs/installing.md) to build Haveno and connect to the test network.
|
||||
|
||||
Alternatively, you can [create your own mainnet network](https://github.com/haveno-dex/haveno/blob/master/docs/create-mainnet.md).
|
||||
|
||||
Note that Haveno is being actively developed. If you find issues or bugs, please let us know.
|
||||
|
||||
## Main repositories
|
||||
|
||||
- **[haveno](https://github.com/haveno-dex/haveno)** - This repository. The core of Haveno.
|
||||
- **[haveno-ts](https://github.com/haveno-dex/haveno-ts)** - TypeScript library for using Haveno.
|
||||
- **[haveno-ui](https://github.com/haveno-dex/haveno-ui)** - A new user interface (WIP).
|
||||
- **[haveno-meta](https://github.com/haveno-dex/haveno-meta)** - For project-wide discussions and proposals.
|
||||
|
||||
If you wish to help, take a look at the repositories above and look for open issues. We run a bounty program to incentivize development. See [Bounties](#bounties).
|
||||
|
||||
## Keep in touch and help out!
|
||||
|
||||
Haveno is a community-driven project. For it to be successful it's fundamental to have the support and help of the community. Join the community rooms on our Matrix server:
|
||||
|
||||
- General discussions: **Haveno** ([#haveno:monero.social](https://matrix.to/#/#haveno:monero.social)) relayed on IRC/Libera (`#haveno`)
|
||||
- Development discussions: **Haveno Development** ([#haveno-development:monero.social](https://matrix.to/#/#haveno-development:monero.social)) relayed on IRC/Libera (`#haveno-development`)
|
||||
|
||||
Email: contact@haveno.exchange
|
||||
Website: [haveno.exchange](https://haveno.exchange)
|
||||
|
||||
## Contributing to Haveno
|
||||
|
||||
See the [developer guide](docs/developer-guide.md) to get started developing for Haveno.
|
||||
|
||||
See [docs/CONTRIBUTING.md](docs/CONTRIBUTING.md) for our styling guides.
|
||||
|
||||
If you are not able to contribute code and want to contribute development resources, [donations](#support-and-sponsorships) fund development bounties.
|
||||
|
||||
## Bounties
|
||||
|
||||
To incentivize development and reward contributors, we adopt a simple bounty system. Contributors may be awarded bounties after completing a task (resolving an issue). Take a look at the [issues labeled '💰bounty'](https://github.com/haveno-dex/haveno/issues?q=is%3Aopen+is%3Aissue+label%3A%F0%9F%92%B0bounty) in the main `haveno` repository. [Details and conditions for receiving a bounty](docs/bounties.md).
|
||||
|
||||
## Support
|
||||
|
||||
To bring Haveno to life, we need resources. If you have the possibility, please consider donating to the project:
|
||||
|
||||
<p align="center">
|
||||
<img src="https://raw.githubusercontent.com/haveno-dex/haveno/master/media/donate_monero.png" alt="Donate Monero" width="115" height="115"><br>
|
||||
<code>47fo8N5m2VVW4uojadGQVJ34LFR9yXwDrZDRugjvVSjcTWV2WFSoc1XfNpHmxwmVtfNY9wMBch6259G6BXXFmhU49YG1zfB</code>
|
||||
</p>
|
||||
The original Haveno core fork from haveno-dex/haveno adapted for the multiplatform app.
|
|
@ -51,7 +51,7 @@ public class HavenoProcess extends AbstractLinuxProcess implements LinuxProcess
|
|||
public HavenoProcess(HavenoAppConfig havenoAppConfig, ApiTestConfig config) {
|
||||
super(havenoAppConfig.appName, config);
|
||||
this.havenoAppConfig = havenoAppConfig;
|
||||
this.baseCurrencyNetwork = "XMR_STAGENET";
|
||||
this.baseCurrencyNetwork = "XMR_MAINNET";
|
||||
this.genesisTxId = "30af0050040befd8af25068cc697e418e09c2d8ebd8d411d2240591b9ec203cf";
|
||||
this.genesisBlockHeight = 111;
|
||||
this.seedNodes = "localhost:2002";
|
||||
|
|
47
bot/src/main/java/haveno/bot/app/HavenoBot.java
Normal file
|
@ -0,0 +1,47 @@
|
|||
/*
|
||||
* This file is part of Bisq.
|
||||
*
|
||||
* Bisq 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.
|
||||
*
|
||||
* Bisq 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 Bisq. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package haveno.bot.app;
|
||||
|
||||
import com.google.inject.Injector;
|
||||
import haveno.core.app.misc.AppSetup;
|
||||
import haveno.core.app.misc.AppSetupWithP2P;
|
||||
import haveno.core.network.p2p.inventory.GetInventoryRequestHandler;
|
||||
import lombok.Setter;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@Slf4j
|
||||
public class HavenoBot {
|
||||
@Setter
|
||||
private Injector injector;
|
||||
private AppSetup appSetup;
|
||||
private GetInventoryRequestHandler getInventoryRequestHandler;
|
||||
|
||||
public HavenoBot() {
|
||||
}
|
||||
|
||||
public void startApplication() {
|
||||
appSetup = injector.getInstance(AppSetupWithP2P.class);
|
||||
appSetup.start();
|
||||
|
||||
getInventoryRequestHandler = injector.getInstance(GetInventoryRequestHandler.class);
|
||||
}
|
||||
|
||||
public void shutDown() {
|
||||
getInventoryRequestHandler.shutDown();
|
||||
}
|
||||
}
|
187
bot/src/main/java/haveno/bot/app/HavenoBotMain.java
Normal file
|
@ -0,0 +1,187 @@
|
|||
/*
|
||||
* This file is part of Bisq.
|
||||
*
|
||||
* Bisq 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.
|
||||
*
|
||||
* Bisq 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 Bisq. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package haveno.bot.app;
|
||||
|
||||
import haveno.common.UserThread;
|
||||
import haveno.common.app.AppModule;
|
||||
import haveno.common.handlers.ResultHandler;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import haveno.common.Timer;
|
||||
import haveno.common.config.BaseCurrencyNetwork;
|
||||
import haveno.common.config.Config;
|
||||
import haveno.core.app.TorSetup;
|
||||
import haveno.core.app.misc.ExecutableForAppWithP2p;
|
||||
import haveno.core.app.misc.ModuleForAppWithP2p;
|
||||
import haveno.core.user.Cookie;
|
||||
import haveno.core.user.CookieKey;
|
||||
import haveno.core.user.User;
|
||||
import haveno.network.p2p.P2PService;
|
||||
import haveno.network.p2p.P2PServiceListener;
|
||||
import haveno.network.p2p.peers.PeerManager;
|
||||
|
||||
@Slf4j
|
||||
public class HavenoBotMain extends ExecutableForAppWithP2p {
|
||||
|
||||
private static final long CHECK_CONNECTION_LOSS_SEC = 30;
|
||||
private static final String VERSION = "1.1.2";
|
||||
private HavenoBot bot;
|
||||
private Timer checkConnectionLossTime;
|
||||
|
||||
public HavenoBotMain() {
|
||||
super("Haveno Bot", "haveno-bot", "haveno_bot", VERSION);
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
System.out.println("HavenoBot.VERSION: " + VERSION);
|
||||
new HavenoBotMain().execute(args);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int doExecute() {
|
||||
super.doExecute();
|
||||
|
||||
checkMemory(config, this);
|
||||
|
||||
return keepRunning();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addCapabilities() {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void launchApplication() {
|
||||
UserThread.execute(() -> {
|
||||
try {
|
||||
bot = new HavenoBot();
|
||||
UserThread.execute(this::onApplicationLaunched);
|
||||
} catch (Exception e) {
|
||||
log.error("Error launching haveno bot: {}\n", e.toString(), e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onApplicationLaunched() {
|
||||
super.onApplicationLaunched();
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
// We continue with a series of synchronous execution tasks
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@Override
|
||||
protected AppModule getModule() {
|
||||
return new ModuleForAppWithP2p(config);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void applyInjector() {
|
||||
super.applyInjector();
|
||||
|
||||
bot.setInjector(injector);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void startApplication() {
|
||||
Cookie cookie = injector.getInstance(User.class).getCookie();
|
||||
cookie.getAsOptionalBoolean(CookieKey.CLEAN_TOR_DIR_AT_RESTART).ifPresent(wasCleanTorDirSet -> {
|
||||
if (wasCleanTorDirSet) {
|
||||
injector.getInstance(TorSetup.class).cleanupTorFiles(() -> {
|
||||
log.info("Tor directory reset");
|
||||
cookie.remove(CookieKey.CLEAN_TOR_DIR_AT_RESTART);
|
||||
}, log::error);
|
||||
}
|
||||
});
|
||||
|
||||
bot.startApplication();
|
||||
|
||||
injector.getInstance(P2PService.class).addP2PServiceListener(new P2PServiceListener() {
|
||||
@Override
|
||||
public void onDataReceived() {
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNoSeedNodeAvailable() {
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNoPeersAvailable() {
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUpdatedDataReceived() {
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTorNodeReady() {
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onHiddenServicePublished() {
|
||||
UserThread.runAfter(() -> setupConnectionLossCheck(), 60);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSetupFailed(Throwable throwable) {
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRequestCustomBridges() {
|
||||
// Do nothing
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void setupConnectionLossCheck() {
|
||||
// For dev testing (usually on XMR_LOCAL) we don't want to get the seed shut
|
||||
// down as it is normal that the seed is the only actively running node.
|
||||
if (Config.baseCurrencyNetwork() != BaseCurrencyNetwork.XMR_MAINNET) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (checkConnectionLossTime != null) {
|
||||
return;
|
||||
}
|
||||
|
||||
checkConnectionLossTime = UserThread.runPeriodically(() -> {
|
||||
if (injector.getInstance(PeerManager.class).getNumAllConnectionsLostEvents() > 1) {
|
||||
// We set a flag to clear tor cache files at re-start. We cannot clear it now as Tor is used and
|
||||
// that can cause problems.
|
||||
injector.getInstance(User.class).getCookie().putAsBoolean(CookieKey.CLEAN_TOR_DIR_AT_RESTART, true);
|
||||
shutDown(this);
|
||||
}
|
||||
}, CHECK_CONNECTION_LOSS_SEC);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void gracefulShutDown(ResultHandler resultHandler) {
|
||||
bot.shutDown();
|
||||
super.gracefulShutDown(resultHandler);
|
||||
}
|
||||
}
|
19
bot/src/main/resources/logback.xml
Normal file
|
@ -0,0 +1,19 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<configuration>
|
||||
|
||||
<conversionRule conversionWord="hl2" converterClass="haveno.common.app.LogHighlighter" />
|
||||
|
||||
<appender name="CONSOLE_APPENDER" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
<pattern>%hl2(%d{MMM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{40}: %msg %xEx%n)</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<root level="TRACE">
|
||||
<appender-ref ref="CONSOLE_APPENDER"/>
|
||||
</root>
|
||||
|
||||
<logger name="io.grpc.netty" level="WARN"/>
|
||||
<logger name="org.apache" level="WARN" />
|
||||
|
||||
</configuration>
|
76
build.gradle
|
@ -132,7 +132,8 @@ configure([project(':cli'),
|
|||
project(':seednode'),
|
||||
project(':statsnode'),
|
||||
project(':inventory'),
|
||||
project(':apitest')]) {
|
||||
project(':apitest')
|
||||
]) {
|
||||
|
||||
apply plugin: 'application'
|
||||
|
||||
|
@ -787,7 +788,12 @@ configure(project(':statsnode')) {
|
|||
}
|
||||
|
||||
configure(project(':daemon')) {
|
||||
mainClassName = 'haveno.daemon.app.HavenoDaemonMain'
|
||||
apply plugin: 'com.github.johnrengelman.shadow'
|
||||
apply plugin: 'application'
|
||||
|
||||
application {
|
||||
mainClass = 'haveno.daemon.app.HavenoDaemonMain'
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation project(':proto')
|
||||
|
@ -847,6 +853,72 @@ configure(project(':daemon')) {
|
|||
}
|
||||
}
|
||||
|
||||
//configure(project(':bot')) {
|
||||
// apply plugin: 'com.github.johnrengelman.shadow'
|
||||
// apply plugin: 'application'
|
||||
//
|
||||
// application {
|
||||
// mainClass = 'haveno.bot.app.HavenoBotMain'
|
||||
// }
|
||||
//
|
||||
// dependencies {
|
||||
// implementation project(':proto')
|
||||
// implementation project(':common')
|
||||
// implementation project(':p2p')
|
||||
// implementation project(':core')
|
||||
// annotationProcessor "org.projectlombok:lombok:$lombokVersion"
|
||||
// compileOnly "javax.annotation:javax.annotation-api:$javaxAnnotationVersion"
|
||||
// compileOnly "org.projectlombok:lombok:$lombokVersion"
|
||||
// implementation "ch.qos.logback:logback-classic:$logbackVersion"
|
||||
// implementation "ch.qos.logback:logback-core:$logbackVersion"
|
||||
// implementation "com.google.code.gson:gson:$gsonVersion"
|
||||
// implementation "com.google.guava:guava:$guavaVersion"
|
||||
// implementation "com.google.protobuf:protobuf-java:$protobufVersion"
|
||||
// implementation "org.apache.commons:commons-lang3:$langVersion"
|
||||
// implementation "org.jetbrains:annotations:$jetbrainsAnnotationsVersion"
|
||||
// implementation "org.slf4j:slf4j-api:$slf4jVersion"
|
||||
// implementation("com.github.bisq-network:bitcoinj:$bitcoinjVersion") {
|
||||
// exclude(module: 'bcprov-jdk15on')
|
||||
// exclude(module: 'guava')
|
||||
// exclude(module: 'jsr305')
|
||||
// exclude(module: 'okhttp')
|
||||
// exclude(module: 'okio')
|
||||
// exclude(module: 'protobuf-java')
|
||||
// exclude(module: 'slf4j-api')
|
||||
// }
|
||||
// implementation("com.google.inject:guice:$guiceVersion") {
|
||||
// exclude(module: 'guava')
|
||||
// }
|
||||
// implementation("io.grpc:grpc-protobuf:$grpcVersion") {
|
||||
// exclude(module: 'animal-sniffer-annotations')
|
||||
// exclude(module: 'guava')
|
||||
// }
|
||||
// implementation("io.grpc:grpc-stub:$grpcVersion") {
|
||||
// exclude(module: 'animal-sniffer-annotations')
|
||||
// exclude(module: 'guava')
|
||||
// }
|
||||
// runtimeOnly("io.grpc:grpc-netty-shaded:$grpcVersion") {
|
||||
// exclude(module: 'animal-sniffer-annotations')
|
||||
// exclude(module: 'guava')
|
||||
// }
|
||||
// testAnnotationProcessor "org.projectlombok:lombok:$lombokVersion"
|
||||
// testCompileOnly "org.projectlombok:lombok:$lombokVersion"
|
||||
// testImplementation "org.junit.jupiter:junit-jupiter-api:$jupiterVersion"
|
||||
// testImplementation "org.junit.jupiter:junit-jupiter-params:$jupiterVersion"
|
||||
// testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:$jupiterVersion")
|
||||
//
|
||||
// implementation("io.github.woodser:monero-java:$moneroJavaVersion") {
|
||||
// exclude(module: 'jackson-core')
|
||||
// exclude(module: 'jackson-annotations')
|
||||
// exclude(module: 'jackson-databind')
|
||||
// exclude(module: 'bcprov-jdk15on')
|
||||
// exclude(group: 'org.slf4j', module: 'slf4j-simple')
|
||||
// }
|
||||
// implementation "org.openjfx:javafx-base:$javafxVersion:$os"
|
||||
// implementation "org.openjfx:javafx-graphics:$javafxVersion:$os"
|
||||
// }
|
||||
//}
|
||||
|
||||
configure(project(':inventory')) {
|
||||
apply plugin: 'com.github.johnrengelman.shadow'
|
||||
|
||||
|
|
|
@ -99,7 +99,7 @@ public class Version {
|
|||
|
||||
// The version no. for the objects sent over the network. A change will break the serialization of old objects.
|
||||
// If objects are used for both network and database the network version is applied.
|
||||
public static final String P2P_NETWORK_VERSION = "A";
|
||||
public static final String P2P_NETWORK_VERSION = System.getenv().getOrDefault("P2P_NETWORK_VERSION", "X");
|
||||
|
||||
// The version no. of the serialized data stored to disc. A change will break the serialization of old objects.
|
||||
// VERSION = 0.5.0 -> LOCAL_DB_VERSION = 1
|
||||
|
|
|
@ -20,7 +20,6 @@ package haveno.core.alert;
|
|||
import com.google.common.base.Charsets;
|
||||
import com.google.inject.Inject;
|
||||
import com.google.inject.name.Named;
|
||||
import haveno.common.app.DevEnv;
|
||||
import haveno.common.config.Config;
|
||||
import haveno.common.crypto.KeyRing;
|
||||
import haveno.core.user.User;
|
||||
|
@ -97,24 +96,12 @@ public class AlertManager {
|
|||
}
|
||||
|
||||
protected List<String> getPubKeyList() {
|
||||
if (useDevPrivilegeKeys) return List.of(DevEnv.DEV_PRIVILEGE_PUB_KEY);
|
||||
switch (Config.baseCurrencyNetwork()) {
|
||||
case XMR_LOCAL:
|
||||
return List.of(
|
||||
"027a381b5333a56e1cc3d90d3a7d07f26509adf7029ed06fc997c656621f8da1ee",
|
||||
"024baabdba90e7cc0dc4626ef73ea9d722ea7085d1104491da8c76f28187513492");
|
||||
case XMR_STAGENET:
|
||||
return List.of(
|
||||
"036d8a1dfcb406886037d2381da006358722823e1940acc2598c844bbc0fd1026f",
|
||||
"026c581ad773d987e6bd10785ac7f7e0e64864aedeb8bce5af37046de812a37854",
|
||||
"025b058c9f2c60d839669dbfa5578cf5a8117d60e6b70e2f0946f8a691273c6a36");
|
||||
case XMR_MAINNET:
|
||||
return List.of();
|
||||
default:
|
||||
throw new RuntimeException("Unhandled base currency network: " + Config.baseCurrencyNetwork());
|
||||
"0326b14f3a55d02575dceed5202b8b125f458cbe0fdceeee294b443bf1a8d8cf78",
|
||||
"03d62d14438adbe7aea688ade1f73933c6f0a705f238c02c5b54b83dd1e4fca225",
|
||||
"023c8fdea9ff2d03daef54337907e70a7b0e20084a75fcc3ad2f0c28d8b691dea1"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
// API
|
||||
|
|
|
@ -24,7 +24,6 @@ import com.google.common.util.concurrent.MoreExecutors;
|
|||
import com.google.common.util.concurrent.SettableFuture;
|
||||
import com.google.inject.Inject;
|
||||
import com.google.inject.name.Named;
|
||||
import haveno.common.app.DevEnv;
|
||||
import haveno.common.config.Config;
|
||||
import haveno.common.crypto.KeyRing;
|
||||
import haveno.common.crypto.PubKeyRing;
|
||||
|
@ -63,7 +62,6 @@ public class PrivateNotificationManager implements MessageListener {
|
|||
private final MailboxMessageService mailboxMessageService;
|
||||
private final KeyRing keyRing;
|
||||
private final ObjectProperty<PrivateNotificationPayload> privateNotificationMessageProperty = new SimpleObjectProperty<>();
|
||||
private final boolean useDevPrivilegeKeys;
|
||||
|
||||
private ECKey privateNotificationSigningKey;
|
||||
@Nullable
|
||||
|
@ -87,7 +85,6 @@ public class PrivateNotificationManager implements MessageListener {
|
|||
this.networkNode = networkNode;
|
||||
this.mailboxMessageService = mailboxMessageService;
|
||||
this.keyRing = keyRing;
|
||||
this.useDevPrivilegeKeys = useDevPrivilegeKeys;
|
||||
|
||||
if (!ignoreDevMsg) {
|
||||
this.p2PService.addDecryptedDirectMessageListener(this::handleMessage);
|
||||
|
@ -96,22 +93,11 @@ public class PrivateNotificationManager implements MessageListener {
|
|||
}
|
||||
|
||||
protected List<String> getPubKeyList() {
|
||||
if (useDevPrivilegeKeys) return List.of(DevEnv.DEV_PRIVILEGE_PUB_KEY);
|
||||
switch (Config.baseCurrencyNetwork()) {
|
||||
case XMR_LOCAL:
|
||||
return List.of(
|
||||
"027a381b5333a56e1cc3d90d3a7d07f26509adf7029ed06fc997c656621f8da1ee",
|
||||
"024baabdba90e7cc0dc4626ef73ea9d722ea7085d1104491da8c76f28187513492");
|
||||
case XMR_STAGENET:
|
||||
return List.of(
|
||||
"02ba7c5de295adfe57b60029f3637a2c6b1d0e969a8aaefb9e0ddc3a7963f26925",
|
||||
"026c581ad773d987e6bd10785ac7f7e0e64864aedeb8bce5af37046de812a37854",
|
||||
"025b058c9f2c60d839669dbfa5578cf5a8117d60e6b70e2f0946f8a691273c6a36");
|
||||
case XMR_MAINNET:
|
||||
return List.of();
|
||||
default:
|
||||
throw new RuntimeException("Unhandled base currency network: " + Config.baseCurrencyNetwork());
|
||||
}
|
||||
"0326b14f3a55d02575dceed5202b8b125f458cbe0fdceeee294b443bf1a8d8cf78",
|
||||
"03d62d14438adbe7aea688ade1f73933c6f0a705f238c02c5b54b83dd1e4fca225",
|
||||
"023c8fdea9ff2d03daef54337907e70a7b0e20084a75fcc3ad2f0c28d8b691dea1"
|
||||
);
|
||||
}
|
||||
|
||||
private void handleMessage(DecryptedMessageWithPubKey decryptedMessageWithPubKey, NodeAddress senderNodeAddress) {
|
||||
|
@ -203,11 +189,12 @@ public class PrivateNotificationManager implements MessageListener {
|
|||
SettableFuture<Connection> future = networkNode.sendMessage(peersNodeAddress, ping);
|
||||
Futures.addCallback(future, new FutureCallback<>() {
|
||||
@Override
|
||||
public void onSuccess(Connection connection) {
|
||||
public void onSuccess(@SuppressWarnings("null") Connection connection) {
|
||||
connection.addMessageListener(PrivateNotificationManager.this);
|
||||
pingResponseHandler = resultHandler;
|
||||
}
|
||||
|
||||
@SuppressWarnings("null")
|
||||
@Override
|
||||
public void onFailure(@NotNull Throwable throwable) {
|
||||
String errorMessage = "Sending ping to " + peersNodeAddress.getAddressForDisplay() +
|
||||
|
|
|
@ -49,6 +49,7 @@ import haveno.core.api.model.MarketPriceInfo;
|
|||
import haveno.core.api.model.PaymentAccountForm;
|
||||
import haveno.core.api.model.PaymentAccountFormField;
|
||||
import haveno.core.app.AppStartupState;
|
||||
import haveno.core.filter.Filter;
|
||||
import haveno.core.monetary.Price;
|
||||
import haveno.core.offer.Offer;
|
||||
import haveno.core.offer.OfferDirection;
|
||||
|
@ -73,6 +74,7 @@ import java.util.Set;
|
|||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.TimeoutException;
|
||||
import java.util.function.Consumer;
|
||||
import haveno.network.p2p.peers.peerexchange.Peer;
|
||||
import lombok.Getter;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import monero.common.MoneroRpcConnection;
|
||||
|
@ -102,6 +104,7 @@ public class CoreApi {
|
|||
private final CoreWalletsService walletsService;
|
||||
private final TradeStatisticsManager tradeStatisticsManager;
|
||||
private final CoreNotificationService notificationService;
|
||||
private final CoreNetworkService networkService;
|
||||
private final XmrConnectionService xmrConnectionService;
|
||||
private final XmrLocalNode xmrLocalNode;
|
||||
|
||||
|
@ -119,6 +122,7 @@ public class CoreApi {
|
|||
CoreWalletsService walletsService,
|
||||
TradeStatisticsManager tradeStatisticsManager,
|
||||
CoreNotificationService notificationService,
|
||||
CoreNetworkService networkService,
|
||||
XmrConnectionService xmrConnectionService,
|
||||
XmrLocalNode xmrLocalNode) {
|
||||
this.config = config;
|
||||
|
@ -134,6 +138,7 @@ public class CoreApi {
|
|||
this.walletsService = walletsService;
|
||||
this.tradeStatisticsManager = tradeStatisticsManager;
|
||||
this.notificationService = notificationService;
|
||||
this.networkService = networkService;
|
||||
this.xmrConnectionService = xmrConnectionService;
|
||||
this.xmrLocalNode = xmrLocalNode;
|
||||
}
|
||||
|
@ -355,6 +360,25 @@ public class CoreApi {
|
|||
notificationService.sendNotification(notification);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Network
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//public void addNetworkListener(NetworkListener listener) {
|
||||
// networkService.addListener(listener);
|
||||
//}
|
||||
public Set<Peer> getOnlinePeers() {
|
||||
return networkService.getOnlinePeers();
|
||||
}
|
||||
|
||||
public Set<Peer> getOnlineSeedNodes() {
|
||||
return networkService.getOnlineSeedNodePeers();
|
||||
}
|
||||
|
||||
public Filter getFilter() {
|
||||
return networkService.getFilter();
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Disputes
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -392,7 +416,11 @@ public class CoreApi {
|
|||
coreDisputeAgentsService.unregisterDisputeAgent(disputeAgentType, resultHandler, errorMessageHandler);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
public void getRegisteredDisputeAgents(ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) {
|
||||
//coreDisputeAgentsService.getRegisteredDisputeAgents(resultHandler, errorMessageHandler);
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////s//////////////////////////////////////////////
|
||||
// Offers
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
|
|
@ -161,6 +161,17 @@ class CoreDisputeAgentsService {
|
|||
}
|
||||
}
|
||||
|
||||
// void getRegisteredDisputeAgents(ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) {
|
||||
// if (!p2PService.isBootstrapped())
|
||||
// throw new IllegalStateException("p2p service is not bootstrapped yet");
|
||||
//
|
||||
// arbitratorManager.getObservableMap().forEach(entry -> {
|
||||
// if (arbitrator != null) {
|
||||
// log.info("Registered arbitrator: {}", arbitrator.getNodeAddress().getFullAddress());
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
|
||||
private void registerArbitrator(NodeAddress nodeAddress,
|
||||
List<String> languageCodes,
|
||||
ECKey ecKey,
|
||||
|
|
59
core/src/main/java/haveno/core/api/CoreNetworkService.java
Normal file
|
@ -0,0 +1,59 @@
|
|||
package haveno.core.api;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.google.inject.Singleton;
|
||||
import java.util.Set;
|
||||
|
||||
import haveno.network.p2p.peers.peerexchange.Peer;
|
||||
import haveno.core.filter.Filter;
|
||||
import haveno.core.filter.FilterManager;
|
||||
import haveno.network.p2p.peers.PeerManager;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@Singleton
|
||||
@Slf4j
|
||||
public class CoreNetworkService {
|
||||
|
||||
private final PeerManager peerManager;
|
||||
private final FilterManager filterManager;
|
||||
|
||||
@Inject
|
||||
public CoreNetworkService(PeerManager peerManager
|
||||
, FilterManager filterManager) {
|
||||
this.peerManager = peerManager;
|
||||
this.filterManager = filterManager;
|
||||
}
|
||||
|
||||
//public void addListener(@NonNull NetworkListener listener) {
|
||||
// synchronized (lock) {
|
||||
// listeners.add(listener);
|
||||
// }
|
||||
//}
|
||||
|
||||
Set<Peer> getOnlinePeers() {
|
||||
return peerManager.getLivePeers();
|
||||
}
|
||||
|
||||
Set<Peer> getOnlineSeedNodePeers() {
|
||||
return peerManager.getLiveSeedNodePeers();
|
||||
}
|
||||
|
||||
Filter getFilter() {
|
||||
return filterManager.getFilter();
|
||||
}
|
||||
|
||||
//public void sendNetworMessage(@NonNull NetworkMessage network_message) {
|
||||
// synchronized (lock) {
|
||||
// for (Iterator<NetworkListener> iter = listeners.iterator(); iter.hasNext(); ) {
|
||||
// NetworkListener listener = iter.next();
|
||||
// try {
|
||||
// listener.onMessage(network_message);
|
||||
// } catch (RuntimeException e) {
|
||||
// log.warn("Failed to send network envelope to listener {}: {}", listener, e.getMessage());
|
||||
// iter.remove();
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
}
|
9
core/src/main/java/haveno/core/api/NetworkListener.java
Normal file
|
@ -0,0 +1,9 @@
|
|||
package haveno.core.api;
|
||||
|
||||
import haveno.proto.grpc.NetworkMessage;
|
||||
|
||||
import lombok.NonNull;
|
||||
|
||||
public interface NetworkListener {
|
||||
void onMessage(@NonNull NetworkMessage network_message);
|
||||
}
|
62
core/src/main/java/haveno/core/api/model/PeerInfo.java
Normal file
|
@ -0,0 +1,62 @@
|
|||
package haveno.core.api.model;
|
||||
|
||||
import haveno.core.api.model.builder.PeerInfoBuilder;
|
||||
import haveno.network.p2p.peers.peerexchange.Peer;
|
||||
import haveno.common.Payload;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
||||
public class PeerInfo implements Payload {
|
||||
|
||||
private final String nodeAddress;
|
||||
private final List<Integer> capabilities;
|
||||
|
||||
public static PeerInfo toPeerInfo(Peer peer) {
|
||||
return getBuilder(peer)
|
||||
.build();
|
||||
}
|
||||
|
||||
public PeerInfo(PeerInfoBuilder builder) {
|
||||
this.nodeAddress = builder.getNodeAddress();
|
||||
this.capabilities = builder.getCapabilities();
|
||||
}
|
||||
|
||||
private static PeerInfoBuilder getBuilder(Peer peer) {
|
||||
return new PeerInfoBuilder()
|
||||
.withNodeAddress(peer.getNodeAddress().getFullAddress());
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
// PROTO BUFFER
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
public static PeerInfo fromProto(haveno.proto.grpc.PeerInfo proto) {
|
||||
return new PeerInfoBuilder()
|
||||
.withNodeAddress(proto.getNodeAddress())
|
||||
.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public haveno.proto.grpc.PeerInfo toProtoMessage() {
|
||||
haveno.proto.grpc.PeerInfo.Builder builder = haveno.proto.grpc.PeerInfo.newBuilder()
|
||||
.setNodeAddress(nodeAddress);
|
||||
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "PeerInfo{" + "\n" +
|
||||
" " + nodeAddress.toString() + "\n" +
|
||||
'}';
|
||||
}
|
||||
|
||||
public String getNodeAddress() {
|
||||
return nodeAddress;
|
||||
}
|
||||
|
||||
public List<Integer> getCapabilities() {
|
||||
return capabilities;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
package haveno.core.api.model.builder;
|
||||
|
||||
import haveno.core.api.model.PeerInfo;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* A builder helps avoid bungling use of a large OfferInfo constructor
|
||||
* argument list. If consecutive argument values of the same type are not
|
||||
* ordered correctly, the compiler won't complain but the resulting bugs could
|
||||
* be hard to find and fix.
|
||||
*/
|
||||
|
||||
public final class PeerInfoBuilder {
|
||||
|
||||
private String nodeAddress;
|
||||
|
||||
private List<Integer> capabilities;
|
||||
|
||||
public PeerInfoBuilder withNodeAddress(String nodeAddress) {
|
||||
this.nodeAddress = nodeAddress;
|
||||
return this;
|
||||
}
|
||||
|
||||
public PeerInfoBuilder withCapabilities(List<Integer> capabilities) {
|
||||
this.capabilities = capabilities;
|
||||
return this;
|
||||
}
|
||||
|
||||
public PeerInfo build() {
|
||||
return new PeerInfo(this);
|
||||
}
|
||||
|
||||
public String getNodeAddress() {
|
||||
return nodeAddress;
|
||||
}
|
||||
|
||||
public List<Integer> getCapabilities() {
|
||||
return capabilities;
|
||||
}
|
||||
|
||||
}
|
5
core/src/main/java/haveno/core/app/EventBusSetup.java
Normal file
|
@ -0,0 +1,5 @@
|
|||
package haveno.core.app;
|
||||
|
||||
public class EventBusSetup {
|
||||
|
||||
}
|
|
@ -126,7 +126,7 @@ public abstract class HavenoExecutable implements GracefulShutDownHandler, Haven
|
|||
System.exit(EXIT_FAILURE);
|
||||
} catch (Throwable ex) {
|
||||
System.err.println("fault: An unexpected error occurred. " +
|
||||
"Please file a report at https://github.com/haveno-dex/haveno/issues");
|
||||
"Please file a report at https://github.com/MoneroEcosystem/haveno");
|
||||
ex.printStackTrace(System.err);
|
||||
System.exit(EXIT_FAILURE);
|
||||
}
|
||||
|
@ -142,6 +142,7 @@ public abstract class HavenoExecutable implements GracefulShutDownHandler, Haven
|
|||
CommonSetup.setup(config, this);
|
||||
CoreSetup.setup(config);
|
||||
|
||||
|
||||
addCapabilities();
|
||||
|
||||
// If application is JavaFX application we need to wait until it is initialized
|
||||
|
|
|
@ -20,7 +20,6 @@ package haveno.core.filter;
|
|||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
import com.google.inject.Inject;
|
||||
import com.google.inject.name.Named;
|
||||
import haveno.common.app.DevEnv;
|
||||
import haveno.common.app.Version;
|
||||
import haveno.common.config.Config;
|
||||
import haveno.common.config.ConfigFileEditor;
|
||||
|
@ -44,7 +43,6 @@ import java.nio.charset.StandardCharsets;
|
|||
import java.security.PublicKey;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
|
@ -114,11 +112,11 @@ public class FilterManager {
|
|||
this.providersRepository = providersRepository;
|
||||
this.ignoreDevMsg = ignoreDevMsg;
|
||||
|
||||
publicKeys = useDevPrivilegeKeys ?
|
||||
Collections.singletonList(DevEnv.DEV_PRIVILEGE_PUB_KEY) :
|
||||
List.of("0358d47858acdc41910325fce266571540681ef83a0d6fedce312bef9810793a27",
|
||||
"029340c3e7d4bb0f9e651b5f590b434fecb6175aeaa57145c7804ff05d210e534f",
|
||||
"034dc7530bf66ffd9580aa98031ea9a18ac2d269f7c56c0e71eca06105b9ed69f9");
|
||||
publicKeys = List.of(
|
||||
"0326b14f3a55d02575dceed5202b8b125f458cbe0fdceeee294b443bf1a8d8cf78",
|
||||
"03d62d14438adbe7aea688ade1f73933c6f0a705f238c02c5b54b83dd1e4fca225",
|
||||
"023c8fdea9ff2d03daef54337907e70a7b0e20084a75fcc3ad2f0c28d8b691dea1"
|
||||
);
|
||||
|
||||
banFilter.setBannedNodePredicate(this::isNodeAddressBannedFromNetwork);
|
||||
}
|
||||
|
|
|
@ -406,6 +406,13 @@ public class CurrencyUtil {
|
|||
removedCryptoCurrency.isPresent() ? removedCryptoCurrency.get().getName() : Res.get("shared.na");
|
||||
return getCryptoCurrency(currencyCode).map(TradeCurrency::getName).orElse(xmrOrRemovedAsset);
|
||||
}
|
||||
if (isTraditionalNonFiatCurrency(currencyCode)) {
|
||||
return getTraditionalNonFiatCurrencies().stream()
|
||||
.filter(currency -> currency.getCode().equals(currencyCode))
|
||||
.findAny()
|
||||
.map(TradeCurrency::getName)
|
||||
.orElse(currencyCode);
|
||||
}
|
||||
try {
|
||||
return Currency.getInstance(currencyCode).getDisplayName();
|
||||
} catch (Throwable t) {
|
||||
|
|
|
@ -169,15 +169,19 @@ public class MobileNotificationService {
|
|||
doSend = true;
|
||||
break;
|
||||
case OFFER:
|
||||
doSend = true;
|
||||
break;
|
||||
case TRADE:
|
||||
doSend = true;
|
||||
break;
|
||||
case DISPUTE:
|
||||
doSend = useTradeNotificationsProperty.get();
|
||||
doSend = true;
|
||||
break;
|
||||
case PRICE:
|
||||
doSend = usePriceNotificationsProperty.get();
|
||||
doSend = true;
|
||||
break;
|
||||
case MARKET:
|
||||
doSend = useMarketNotificationsProperty.get();
|
||||
doSend = true;
|
||||
break;
|
||||
case ERASE:
|
||||
doSend = true;
|
||||
|
|
|
@ -52,6 +52,7 @@ public abstract class DisputeSession extends SupportSession {
|
|||
return dispute != null ? dispute.getTradeId() : "";
|
||||
}
|
||||
|
||||
@SuppressWarnings("null")
|
||||
@Override
|
||||
public int getClientId() {
|
||||
// Get pubKeyRing of trader. Arbitrator is considered server for the chat session
|
||||
|
|
|
@ -36,7 +36,6 @@ package haveno.core.support.dispute.arbitration.arbitrator;
|
|||
|
||||
import com.google.inject.Inject;
|
||||
import com.google.inject.Singleton;
|
||||
import haveno.common.config.Config;
|
||||
import haveno.common.crypto.KeyRing;
|
||||
import haveno.core.filter.FilterManager;
|
||||
import haveno.core.support.dispute.agent.DisputeAgentManager;
|
||||
|
@ -59,29 +58,11 @@ public class ArbitratorManager extends DisputeAgentManager<Arbitrator> {
|
|||
|
||||
@Override
|
||||
protected List<String> getPubKeyList() {
|
||||
switch (Config.baseCurrencyNetwork()) {
|
||||
case XMR_LOCAL:
|
||||
return List.of(
|
||||
"027a381b5333a56e1cc3d90d3a7d07f26509adf7029ed06fc997c656621f8da1ee",
|
||||
"024baabdba90e7cc0dc4626ef73ea9d722ea7085d1104491da8c76f28187513492",
|
||||
"026eeec3c119dd6d537249d74e5752a642dd2c3cc5b6a9b44588eb58344f29b519");
|
||||
case XMR_STAGENET:
|
||||
return List.of(
|
||||
"03bb559ce207a4deb51d4c705076c95b85ad8581d35936b2a422dcb504eaf7cdb0",
|
||||
"026c581ad773d987e6bd10785ac7f7e0e64864aedeb8bce5af37046de812a37854",
|
||||
"025b058c9f2c60d839669dbfa5578cf5a8117d60e6b70e2f0946f8a691273c6a36",
|
||||
"036c7d3f4bf05ef39b9d1b0a5d453a18210de36220c3d83cd16e59bd6132b037ad",
|
||||
"030f7122a10ff73cd73808bddace95be77a94189c8a0eb24586265e125ce5ce6b9",
|
||||
"03aa23e062afa0dda465f46986f8aa8d0374ad3e3f256141b05681dcb1e39c3859",
|
||||
"02d3beb1293ca2ca14e6d42ca8bd18089a62aac62fd6bb23923ee6ead46ac60fba",
|
||||
"03fa0f38f27bdd324db6f933f7e57851dadf3b911e4db6b19dd0950492c4525a31",
|
||||
"02a1a458df5acf4ab08fdca748e28f33a955a30854c8c1a831ee733dca7f0d2fcd",
|
||||
"0374dd70f3fa6e47ec5ab97932e1cec6233e98e6ae3129036b17118650c44fd3de");
|
||||
case XMR_MAINNET:
|
||||
return List.of();
|
||||
default:
|
||||
throw new RuntimeException("Unhandled base currency network: " + Config.baseCurrencyNetwork());
|
||||
}
|
||||
"0326b14f3a55d02575dceed5202b8b125f458cbe0fdceeee294b443bf1a8d8cf78",
|
||||
"03d62d14438adbe7aea688ade1f73933c6f0a705f238c02c5b54b83dd1e4fca225",
|
||||
"023c8fdea9ff2d03daef54337907e70a7b0e20084a75fcc3ad2f0c28d8b691dea1"
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -76,7 +76,7 @@ public class ClosedTradableFormatter {
|
|||
}
|
||||
|
||||
public String getTotalTxFeeAsString(BigInteger totalTradeAmount, BigInteger totalTxFee) {
|
||||
double percentage = HavenoUtils.divide(totalTxFee, totalTradeAmount);
|
||||
double percentage = totalTradeAmount.equals(BigInteger.ZERO) ? 0 : HavenoUtils.divide(totalTxFee, totalTradeAmount);
|
||||
return Res.get(I18N_KEY_TOTAL_TX_FEE,
|
||||
HavenoUtils.formatXmr(totalTxFee, true),
|
||||
formatToPercentWithSymbol(percentage));
|
||||
|
@ -104,7 +104,7 @@ public class ClosedTradableFormatter {
|
|||
}
|
||||
|
||||
public String getTotalTradeFeeAsString(BigInteger totalTradeAmount, BigInteger totalTradeFee) {
|
||||
double percentage = HavenoUtils.divide(totalTradeFee, totalTradeAmount);
|
||||
double percentage = totalTradeAmount.equals(BigInteger.ZERO) ? 0 : HavenoUtils.divide(totalTradeFee, totalTradeAmount);
|
||||
return Res.get(I18N_KEY_TOTAL_TRADE_FEE_BTC,
|
||||
HavenoUtils.formatXmr(totalTradeFee, true),
|
||||
formatToPercentWithSymbol(percentage));
|
||||
|
|
|
@ -85,13 +85,13 @@ import org.bitcoinj.core.Coin;
|
|||
public class HavenoUtils {
|
||||
|
||||
// configure release date
|
||||
private static final String RELEASE_DATE = "25-05-2024 00:00:00"; // optionally set to release date of the network in format dd-mm-yyyy to impose temporary limits, etc. e.g. "25-05-2024 00:00:00"
|
||||
private static final String RELEASE_DATE = "18-06-2025 00:00:00"; // optionally set to release date of the network in format dd-mm-yyyy to impose temporary limits, etc. e.g. "25-05-2024 00:00:00"
|
||||
public static final int RELEASE_LIMIT_DAYS = 60; // number of days to limit sell offers to max buy limit for new accounts
|
||||
public static final int WARN_ON_OFFER_EXCEEDS_UNSIGNED_BUY_LIMIT_DAYS = 182; // number of days to warn if sell offer exceeds unsigned buy limit
|
||||
public static final int ARBITRATOR_ACK_TIMEOUT_SECONDS = 60;
|
||||
|
||||
// configure fees
|
||||
public static final boolean ARBITRATOR_ASSIGNS_TRADE_FEE_ADDRESS = true;
|
||||
public static final boolean ARBITRATOR_ASSIGNS_TRADE_FEE_ADDRESS = false;
|
||||
public static final double PENALTY_FEE_PCT = 0.02; // 2%
|
||||
public static final double MAKER_FEE_PCT = 0.0015; // 0.15%
|
||||
public static final double TAKER_FEE_PCT = 0.0075; // 0.75%
|
||||
|
@ -476,9 +476,9 @@ public class HavenoUtils {
|
|||
case XMR_STAGENET:
|
||||
return "5B11hTJdG2XDNwjdKGLRxwSLwDhkbGg7C7UEAZBxjE6FbCeRMjudrpNACmDNtWPiSnNfjDQf39QRjdtdgoL69txv81qc2Mc";
|
||||
case XMR_MAINNET:
|
||||
throw new RuntimeException("Mainnet fee address not implemented");
|
||||
return "8BTqDom6yukimzKTaLX7d4EgxznKUqTLjebpvUySkWGcg9irMqUwiHKccCTZ8dMu7CG3Ac89H7kqifpCwjCeWd2GUhhxy1F";
|
||||
default:
|
||||
throw new RuntimeException("Unhandled base currency network: " + Config.baseCurrencyNetwork());
|
||||
return "8BTqDom6yukimzKTaLX7d4EgxznKUqTLjebpvUySkWGcg9irMqUwiHKccCTZ8dMu7CG3Ac89H7kqifpCwjCeWd2GUhhxy1F";
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -79,7 +79,7 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid
|
|||
}
|
||||
|
||||
private static final ArrayList<BlockChainExplorer> XMR_MAIN_NET_EXPLORERS = new ArrayList<>(Arrays.asList(
|
||||
new BlockChainExplorer("xmrchain.net", "https://xmrchain.net/tx/")
|
||||
new BlockChainExplorer("moneroexplorer.com", "https://moneroexplorer.com/tx?id=")
|
||||
));
|
||||
private static final ArrayList<BlockChainExplorer> XMR_STAGE_NET_EXPLORERS = new ArrayList<>(Arrays.asList(
|
||||
new BlockChainExplorer("stagenet.xmrchain.net", "https://stagenet.xmrchain.net/tx/")
|
||||
|
@ -87,7 +87,6 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid
|
|||
|
||||
private static final ArrayList<String> XMR_TX_PROOF_SERVICES_CLEAR_NET = new ArrayList<>(Arrays.asList(
|
||||
"xmrblocks.monero.emzy.de", // @emzy
|
||||
//"explorer.monero.wiz.biz", // @wiz
|
||||
"xmrblocks.bisq.services" // @devinbileck
|
||||
));
|
||||
private static final ArrayList<String> XMR_TX_PROOF_SERVICES = new ArrayList<>(Arrays.asList(
|
||||
|
|
|
@ -107,7 +107,7 @@ public class XmrWalletService extends XmrWalletBase {
|
|||
|
||||
// monero configuration
|
||||
public static final int NUM_BLOCKS_UNLOCK = 10;
|
||||
public static final String MONERO_BINS_DIR = Config.appDataDir().getAbsolutePath();
|
||||
public static final String MONERO_BINS_DIR = System.getenv().getOrDefault("MONERO_BINS_DIR", Config.appDataDir().getAbsolutePath());
|
||||
public static final String MONERO_WALLET_RPC_NAME = Utilities.isWindows() ? "monero-wallet-rpc.exe" : "monero-wallet-rpc";
|
||||
public static final String MONERO_WALLET_RPC_PATH = MONERO_BINS_DIR + File.separator + MONERO_WALLET_RPC_NAME;
|
||||
public static final MoneroTxPriority PROTOCOL_FEE_PRIORITY = MoneroTxPriority.DEFAULT;
|
||||
|
@ -120,8 +120,8 @@ public class XmrWalletService extends XmrWalletBase {
|
|||
private static final String KEYS_FILE_POSTFIX = ".keys";
|
||||
private static final String ADDRESS_FILE_POSTFIX = ".address.txt";
|
||||
private static final int NUM_MAX_WALLET_BACKUPS = 2;
|
||||
private static final int MAX_SYNC_ATTEMPTS = 3;
|
||||
private static final boolean PRINT_RPC_STACK_TRACE = false;
|
||||
private static final int MAX_SYNC_ATTEMPTS = 5;
|
||||
private static final boolean PRINT_RPC_STACK_TRACE = true;
|
||||
private static final String THREAD_ID = XmrWalletService.class.getSimpleName();
|
||||
private static final long SHUTDOWN_TIMEOUT_MS = 60000;
|
||||
private static final long NUM_BLOCKS_BEHIND_TOLERANCE = 5;
|
||||
|
|
|
@ -93,7 +93,7 @@ grant {
|
|||
|
||||
/* user data dir for Mac, Linux, Windows */
|
||||
permission "java.io.FilePermission" "${user.home}${/}Library${/}Application Support${/}-", "read,write,delete";
|
||||
permission "java.io.FilePermission" "${user.home}${/}.local${/}share${/}haveno-", "read,write,delete";
|
||||
permission "java.io.FilePermission" "${user.home}${/}.local${/}share${/}-", "read,write,delete";
|
||||
permission "java.io.FilePermission" "${appdata}${/}haveno-", "read,write,delete";
|
||||
|
||||
/* temp dir Mac, Linux, Windows TODO */
|
||||
|
|
|
@ -1002,7 +1002,7 @@ portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=T
|
|||
(with seller receiving full trade amount back as well). \
|
||||
This way, there is no security risk, and only trade fees are lost. \n\n\
|
||||
You can request a reimbursement for lost trade fees here: \
|
||||
[HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
[HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing \
|
||||
but funds have been locked in the deposit transaction.\n\n\
|
||||
If the buyer is also missing the delayed payout transaction, they will be instructed to NOT send the payment and open \
|
||||
|
@ -1011,18 +1011,18 @@ portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=
|
|||
their security deposits (with seller receiving full trade amount back as well). \
|
||||
Otherwise the trade amount should go to the buyer. \n\n\
|
||||
You can request a reimbursement for lost trade fees here: \
|
||||
[HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
[HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.errorMsgSet=There was an error during trade protocol execution.\n\n\
|
||||
Error: {0}\n\n\
|
||||
It might be that this error is not critical, and the trade can be completed normally. If you are unsure, open a mediation \
|
||||
ticket to get advice from Haveno mediators. \n\n\
|
||||
If the error was critical and the trade cannot be completed, you might have lost your trade fee. \
|
||||
Request a reimbursement for lost trade fees here: \
|
||||
[HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
[HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.missingContract=The trade contract is not set.\n\n\
|
||||
The trade cannot be completed and you might \
|
||||
have lost your trade fee. If so, you can request a reimbursement for lost trade fees here: \
|
||||
[HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
[HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.info.popup=The trade protocol encountered some problems.\n\n{0}
|
||||
portfolio.pending.failedTrade.txChainInvalid.moveToFailed=The trade protocol encountered a serious problem.\n\n{0}\n\n\
|
||||
Do you want to move the trade to failed trades?\n\n\
|
||||
|
@ -2141,7 +2141,7 @@ popup.headline.error=Error
|
|||
popup.doNotShowAgain=Don't show again
|
||||
popup.reportError.log=Open log file
|
||||
popup.reportError.gitHub=Report to GitHub issue tracker
|
||||
popup.reportError={0}\n\nTo help us to improve the software please report this bug by opening a new issue at https://github.com/haveno-dex/haveno/issues.\n\
|
||||
popup.reportError={0}\n\nTo help us to improve the software please report this bug by opening a new issue at https://github.com/MoneroEcosystem/haveno/issues.\n\
|
||||
The above error message will be copied to the clipboard when you click either of the buttons below.\n\
|
||||
It will make debugging easier if you include the haveno.log file by pressing "Open log file", saving a copy, and attaching it to your bug report.
|
||||
|
||||
|
@ -2264,17 +2264,17 @@ popup.shutDownInProgress.msg=Shutting down application can take a few seconds.\n
|
|||
|
||||
popup.attention.forTradeWithId=Attention required for trade with ID {0}
|
||||
popup.attention.welcome.stagenet=Welcome to the Haveno test instance!\n\n\
|
||||
This platform allows you to test Haveno's protocol. Make sure to follow the instructions[HYPERLINK:https://github.com/haveno-dex/haveno/blob/master/docs/installing.md].\n\n\
|
||||
If you encounter any problem, please let us know by opening an issue [HYPERLINK:https://github.com/haveno-dex/haveno/issues/new].\n\n\
|
||||
This platform allows you to test Haveno's protocol. Make sure to follow the instructions[HYPERLINK:https://github.com/MoneroEcosystem/haveno/blob/master/docs/installing.md].\n\n\
|
||||
If you encounter any problem, please let us know by opening an issue [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues/new].\n\n\
|
||||
This is a test instance. Do not use real money!
|
||||
popup.attention.welcome.mainnet=Welcome to Haveno!\n\n\
|
||||
This platform allows you to trade Monero for fiat currencies or other cryptocurrencies in a decentralized way.\n\n\
|
||||
Get started by creating a new payment account then making or taking an offer.\n\n\
|
||||
If you encounter any problem, please let us know by opening an issue [HYPERLINK:https://github.com/haveno-dex/haveno/issues/new].
|
||||
If you encounter any problem, please let us know by opening an issue [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues/new].
|
||||
popup.attention.welcome.mainnet.test=Welcome to Haveno!\n\n\
|
||||
This platform allows you to trade Monero for fiat currencies or other cryptocurrencies in a decentralized way.\n\n\
|
||||
Get started by creating a new payment account then making or taking an offer.\n\n\
|
||||
If you encounter any problem, please let us know by opening an issue [HYPERLINK:https://github.com/haveno-dex/haveno/issues/new].\n\n\
|
||||
If you encounter any problem, please let us know by opening an issue [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues/new].\n\n\
|
||||
Haveno was recently released for public testing. Please use small amounts!
|
||||
|
||||
popup.info.multiplePaymentAccounts.headline=Multiple payment accounts available
|
||||
|
|
|
@ -967,7 +967,7 @@ portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=Z
|
|||
(přičemž prodejce také obdrží plnou částku obchodu). \
|
||||
Tímto způsobem nehrozí žádné bezpečnostní riziko a jsou ztraceny pouze obchodní poplatky.\n\n\
|
||||
O vrácení ztracených obchodních poplatků můžete požádat zde: \
|
||||
[HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
[HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=Zpožděná výplatní transakce chybí, \
|
||||
ale prostředky byly v depozitní transakci uzamčeny.\n\n\
|
||||
Pokud kupujícímu chybí také odložená výplatní transakce, bude poučen, aby platbu NEPOSLAL a místo toho otevřel \
|
||||
|
@ -976,18 +976,18 @@ portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=
|
|||
svých bezpečnostních vkladů (přičemž prodejce také obdrží plnou částku obchodu). \
|
||||
Jinak by částka obchodu měla jít kupujícímu.\n\n\
|
||||
O vrácení ztracených obchodních poplatků můžete požádat zde: \
|
||||
[HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
[HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.errorMsgSet=Během provádění obchodního protokolu došlo k chybě.\n\n
|
||||
Chyba: {0}\n\n\
|
||||
Je možné, že tato chyba není kritická a obchod lze dokončit normálně. Pokud si nejste jisti, otevřete si mediační úkol \
|
||||
a získejte radu od mediátorů Haveno.\n\n\
|
||||
Pokud byla chyba kritická a obchod nelze dokončit, možná jste ztratili obchodní poplatek. \
|
||||
O vrácení ztracených obchodních poplatků požádejte zde: \
|
||||
[HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
[HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.missingContract=Obchodní kontrakt není stanoven.\n\n\
|
||||
Obchod nelze dokončit a možná jste ztratili poplatek \
|
||||
za obchodování. Pokud ano, můžete požádat o vrácení ztracených obchodních poplatků zde: \
|
||||
[HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
[HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.info.popup=Obchodní protokol narazil na některé problémy.\n\n{0}
|
||||
portfolio.pending.failedTrade.txChainInvalid.moveToFailed=Obchodní protokol narazil na vážný problém.\n\n{0}\n\n\
|
||||
Chcete obchod přesunout do neúspěšných obchodů?\n\n\
|
||||
|
@ -2099,7 +2099,7 @@ popup.headline.error=Chyba
|
|||
popup.doNotShowAgain=Znovu nezobrazovat
|
||||
popup.reportError.log=Otevřít log
|
||||
popup.reportError.gitHub=Nahlaste problém na GitHub
|
||||
popup.reportError={0}\n\nChcete-li nám pomoci vylepšit software, nahlaste tuto chybu otevřením nového problému na adrese https://github.com/haveno-dex/haveno/issues.\n\
|
||||
popup.reportError={0}\n\nChcete-li nám pomoci vylepšit software, nahlaste tuto chybu otevřením nového problému na adrese https://github.com/MoneroEcosystem/haveno/issues.\n\
|
||||
Výše uvedená chybová zpráva bude zkopírována do schránky po kliknutí na některé z níže uvedených tlačítek.\n\
|
||||
Usnadníte ladění, pokud zahrnete soubor haveno.log stisknutím tlačítka 'Otevřít log soubor', uložením kopie a připojením ke hlášení chyby.
|
||||
|
||||
|
@ -2222,17 +2222,17 @@ popup.shutDownInProgress.msg=Vypnutí aplikace může trvat několik sekund.\nPr
|
|||
|
||||
popup.attention.forTradeWithId=Je třeba věnovat pozornost obchodu ID {0}
|
||||
popup.attention.welcome.stagenet=Vítejte v testovací instanci Haveno!\n\n\
|
||||
Tato platforma umožňuje testovat protokol Haveno. Ujistěte se, že postupujete podle pokynů [HYPERLINK:https://github.com/haveno-dex/haveno/blob/master/docs/installing.md].\n\n\
|
||||
Pokud narazíte na nějaký problém, dejte nám prosím vědět [HYPERLINK:https://github.com/haveno-dex/haveno/issues/new].\n\n\
|
||||
Tato platforma umožňuje testovat protokol Haveno. Ujistěte se, že postupujete podle pokynů [HYPERLINK:https://github.com/MoneroEcosystem/haveno/blob/master/docs/installing.md].\n\n\
|
||||
Pokud narazíte na nějaký problém, dejte nám prosím vědět [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues/new].\n\n\
|
||||
Jedná se o testovací instanci. Nepoužívejte skutečné peníze!
|
||||
popup.attention.welcome.mainnet=Vítejte v Haveno!\n\n\
|
||||
Tato platforma umožňuje decentralizovaně obchodovat s měnou Monero za fiat měny nebo jiné kryptoměny.\n\n\
|
||||
Začněte tím, že si vytvoříte nový platební účet a poté vytvoříte nebo přijmete nabídku.\n\n\
|
||||
Pokud narazíte na nějaký problém, dejte nám prosím vědět [HYPERLINK:https://github.com/haveno-dex/haveno/issues/new].
|
||||
Pokud narazíte na nějaký problém, dejte nám prosím vědět [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues/new].
|
||||
popup.attention.welcome.mainnet.test=Vítejte v Haveno!\n\n\
|
||||
Tato platforma umožňuje decentralizovaně obchodovat s měnou Monero za fiat měny nebo jiné kryptoměny.\n\n\
|
||||
Začněte tím, že si vytvoříte nový platební účet a poté vytvoříte nebo přijmete nabídku.\n\n\
|
||||
Pokud narazíte na nějaký problém, dejte nám prosím vědět [HYPERLINK:https://github.com/haveno-dex/haveno/issues/new].\n\n\
|
||||
Pokud narazíte na nějaký problém, dejte nám prosím vědět [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues/new].\n\n\
|
||||
Systém Haveno byl nedávno uvolněn k veřejnému testování. Používejte prosím nízké částky!
|
||||
|
||||
popup.info.multiplePaymentAccounts.headline=K dispozici jsou účty a více platebními metodami
|
||||
|
|
|
@ -821,10 +821,10 @@ portfolio.pending.mediationResult.popup.alreadyAccepted=Sie haben bereits akzept
|
|||
portfolio.pending.failedTrade.taker.missingTakerFeeTx=Die Transaktion der Abnehmer-Gebühr fehlt.\n\nOhne diese tx kann der Handel nicht abgeschlossen werden. Keine Gelder wurden gesperrt und keine Handelsgebühr wurde bezahlt. Sie können diesen Handel zu den fehlgeschlagenen Händeln verschieben.
|
||||
portfolio.pending.failedTrade.maker.missingTakerFeeTx=Die Transaktion der Abnehmer-Gebühr fehlt.\n\nOhne diese tx kann der Handel nicht abgeschlossen werden. Keine Gelder wurden gesperrt. Ihr Angebot ist für andere Händler weiterhin verfügbar. Sie haben die Ersteller-Gebühr also nicht verloren. Sie können diesen Handel zu den fehlgeschlagenen Händeln verschieben.
|
||||
portfolio.pending.failedTrade.missingDepositTx=Eine Einzahlungstransaktion fehlt.\n\nDiese Transaktion ist erforderlich, um den Handel abzuschließen. Bitte stellen Sie sicher, dass Ihre Wallet vollständig mit der Monero-Blockchain synchronisiert ist.\n\nSie können diesen Handel in den Bereich „Fehlgeschlagene Trades“ verschieben, um ihn zu deaktivieren.
|
||||
portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=Die verzögerte Auszahlungstransaktion fehlt, aber die Gelder wurden in der Einzahlungstransaktion gesperrt.\n\nBitte schicken Sie KEINE Geld-(Traditional-) oder Crypto-Zahlungen an den XMR Verkäufer, weil ohne die verzögerte Auszahlungstransaktion später kein Schlichtungsverfahren eröffnet werden kann. Stattdessen öffnen Sie ein Vermittlungs-Ticket mit Cmd/Strg+o. Der Vermittler sollte vorschlagen, dass beide Handelspartner ihre vollständige Sicherheitskaution zurückerstattet bekommen (und der Verkäufer auch seinen Handels-Betrag). Durch diese Vorgehensweise entsteht kein Sicherheitsrisiko und es geht ausschließlich die Handelsgebühr verloren.\n\nSie können eine Rückerstattung der verlorenen gegangenen Handelsgebühren hier erbitten: [HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=Die verzögerte Auszahlungstransaktion fehlt, aber die Gelder wurden in der Einzahlungstransaktion gesperrt.\n\nWenn dem Käufer die verzögerte Auszahlungstransaktion auch fehlt, wird er dazu aufgefordert die Bezahlung NICHT zu schicken und stattdessen ein Vermittlungs-Ticket zu eröffnen. Sie sollten auch ein Vermittlungs-Ticket mit Cmd/Strg+o öffnen.\n\nWenn der Käufer die Zahlung noch nicht geschickt hat, sollte der Vermittler vorschlagen, dass beide Handelspartner ihre Sicherheitskaution vollständig zurückerhalten (und der Verkäufer auch den Handels-Betrag). Anderenfalls sollte der Handels-Betrag an den Käufer gehen.\n\nSie können eine Rückerstattung der verlorenen gegangenen Handelsgebühren hier erbitten: [HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
portfolio.pending.failedTrade.errorMsgSet=Während der Ausführung des Handel-Protokolls ist ein Fehler aufgetreten.\n\nFehler: {0}\n\nEs kann sein, dass dieser Fehler nicht gravierend ist und der Handel ganz normal abgeschlossen werden kann. Wenn Sie sich unsicher sind, öffnen Sie ein Vermittlungs-Ticket um den Rat eines Haveno Vermittlers zu erhalten.\n\nWenn der Fehler gravierend war, kann der Handel nicht abgeschlossen werden und Sie haben vielleicht die Handelsgebühr verloren. Sie können eine Rückerstattung der verlorenen gegangenen Handelsgebühren hier erbitten: [HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
portfolio.pending.failedTrade.missingContract=Der Handelsvertrag ist nicht festgelegt.\n\nDer Handel kann nicht abgeschlossen werden und Sie haben möglicherweise die Handelsgebühr verloren. Sollte das der Fall sein, können Sie eine Rückerstattung der verlorenen gegangenen Handelsgebühren hier beantragen: [HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=Die verzögerte Auszahlungstransaktion fehlt, aber die Gelder wurden in der Einzahlungstransaktion gesperrt.\n\nBitte schicken Sie KEINE Geld-(Traditional-) oder Crypto-Zahlungen an den XMR Verkäufer, weil ohne die verzögerte Auszahlungstransaktion später kein Schlichtungsverfahren eröffnet werden kann. Stattdessen öffnen Sie ein Vermittlungs-Ticket mit Cmd/Strg+o. Der Vermittler sollte vorschlagen, dass beide Handelspartner ihre vollständige Sicherheitskaution zurückerstattet bekommen (und der Verkäufer auch seinen Handels-Betrag). Durch diese Vorgehensweise entsteht kein Sicherheitsrisiko und es geht ausschließlich die Handelsgebühr verloren.\n\nSie können eine Rückerstattung der verlorenen gegangenen Handelsgebühren hier erbitten: [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=Die verzögerte Auszahlungstransaktion fehlt, aber die Gelder wurden in der Einzahlungstransaktion gesperrt.\n\nWenn dem Käufer die verzögerte Auszahlungstransaktion auch fehlt, wird er dazu aufgefordert die Bezahlung NICHT zu schicken und stattdessen ein Vermittlungs-Ticket zu eröffnen. Sie sollten auch ein Vermittlungs-Ticket mit Cmd/Strg+o öffnen.\n\nWenn der Käufer die Zahlung noch nicht geschickt hat, sollte der Vermittler vorschlagen, dass beide Handelspartner ihre Sicherheitskaution vollständig zurückerhalten (und der Verkäufer auch den Handels-Betrag). Anderenfalls sollte der Handels-Betrag an den Käufer gehen.\n\nSie können eine Rückerstattung der verlorenen gegangenen Handelsgebühren hier erbitten: [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.errorMsgSet=Während der Ausführung des Handel-Protokolls ist ein Fehler aufgetreten.\n\nFehler: {0}\n\nEs kann sein, dass dieser Fehler nicht gravierend ist und der Handel ganz normal abgeschlossen werden kann. Wenn Sie sich unsicher sind, öffnen Sie ein Vermittlungs-Ticket um den Rat eines Haveno Vermittlers zu erhalten.\n\nWenn der Fehler gravierend war, kann der Handel nicht abgeschlossen werden und Sie haben vielleicht die Handelsgebühr verloren. Sie können eine Rückerstattung der verlorenen gegangenen Handelsgebühren hier erbitten: [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.missingContract=Der Handelsvertrag ist nicht festgelegt.\n\nDer Handel kann nicht abgeschlossen werden und Sie haben möglicherweise die Handelsgebühr verloren. Sollte das der Fall sein, können Sie eine Rückerstattung der verlorenen gegangenen Handelsgebühren hier beantragen: [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.info.popup=Das Handels-Protokoll hat ein paar Probleme gefunden.\n\n{0}
|
||||
portfolio.pending.failedTrade.txChainInvalid.moveToFailed=Das Handels-Protokoll hat ein schwerwiegendes Problem gefunden.\n\n{0}\n\nWollen Sie den Handel zu den fehlgeschlagenen Händeln verschieben?\n\nSie können keine Vermittlungs- oder Schlichtungsverfahren auf der Seite für fehlgeschlagene Händel eröffnen, aber Sie können einen fehlgeschlagene Handel wieder auf die Seite der offenen Händeln zurück verschieben.
|
||||
portfolio.pending.failedTrade.txChainValid.moveToFailed=Das Handels-Protokoll hat ein paar Probleme gefunden.\n\n{0}\n\nDie Transaktionen des Handels wurden veröffentlicht und die Gelder sind gesperrt. Verschieben Sie den Handel nur dann zu den fehlgeschlagenen Händeln, wenn Sie sich wirklich sicher sind. Dies könnte Optionen zur Behebung des Problems verhindern.\n\nWollen Sie den Handel zu den fehlgeschlagenen Händeln verschieben?\n\nSie können keine Vermittlungs- oder Schlichtungsverfahren auf der Seite für fehlgeschlagene Händel eröffnen, aber Sie können einen fehlgeschlagene Handel wieder auf die Seite der offenen Händeln zurück verschieben.
|
||||
|
@ -1590,7 +1590,7 @@ popup.headline.error=Fehler
|
|||
popup.doNotShowAgain=Nicht erneut anzeigen
|
||||
popup.reportError.log=Protokolldatei öffnen
|
||||
popup.reportError.gitHub=Auf GitHub-Issue-Tracker melden
|
||||
popup.reportError={0}\n\nUm uns bei der Verbesserung der Software zu helfen, erstellen Sie bitte einen Fehler-Bericht auf https://github.com/haveno-dex/haveno/issues.\nDie Fehlermeldung wird in die Zwischenablage kopiert, wenn Sie auf einen der Knöpfe unten klicken.\nEs wird das Debuggen einfacher machen, wenn Sie die haveno.log Datei anfügen indem Sie "Logdatei öffnen" klicken, eine Kopie speichern und diese dem Fehler-Bericht anfügen.
|
||||
popup.reportError={0}\n\nUm uns bei der Verbesserung der Software zu helfen, erstellen Sie bitte einen Fehler-Bericht auf https://github.com/MoneroEcosystem/haveno/issues.\nDie Fehlermeldung wird in die Zwischenablage kopiert, wenn Sie auf einen der Knöpfe unten klicken.\nEs wird das Debuggen einfacher machen, wenn Sie die haveno.log Datei anfügen indem Sie "Logdatei öffnen" klicken, eine Kopie speichern und diese dem Fehler-Bericht anfügen.
|
||||
|
||||
popup.error.tryRestart=Versuchen Sie bitte Ihre Anwendung neu zu starten und überprüfen Sie Ihre Netzwerkverbindung um zu sehen, ob Sie das Problem beheben können.
|
||||
popup.error.takeOfferRequestFailed=Es ist ein Fehler aufgetreten, als jemand versuchte eins Ihrer Angebote anzunehmen:\n{0}
|
||||
|
|
|
@ -820,10 +820,10 @@ portfolio.pending.mediationResult.popup.alreadyAccepted=You've already accepted
|
|||
portfolio.pending.failedTrade.taker.missingTakerFeeTx=The taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked and no trade fee has been paid. You can move this trade to failed trades.
|
||||
portfolio.pending.failedTrade.maker.missingTakerFeeTx=The peer's taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked. Your offer is still available to other traders, so you have not lost the maker fee. You can move this trade to failed trades.
|
||||
portfolio.pending.failedTrade.missingDepositTx=یک تراکنش واریز مفقود است.\n\nاین تراکنش برای تکمیل معامله لازم است. لطفاً اطمینان حاصل کنید که کیف پول شما بهطور کامل با بلاکچین مونرو همگامسازی شده است.\n\nمیتوانید این معامله را به بخش «معاملات ناموفق» منتقل کنید تا غیرفعال شود.
|
||||
portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing, but funds have been locked in the deposit transaction.\n\nPlease do NOT send the traditional or crypto payment to the XMR seller, because without the delayed payout tx, arbitration cannot be opened. Instead, open a mediation ticket with Cmd/Ctrl+o. The mediator should suggest that both peers each get back the the full amount of their security deposits (with seller receiving full trade amount back as well). This way, there is no security risk, and only trade fees are lost. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing but funds have been locked in the deposit transaction.\n\nIf the buyer is also missing the delayed payout transaction, they will be instructed to NOT send the payment and open a mediation ticket instead. You should also open a mediation ticket with Cmd/Ctrl+o. \n\nIf the buyer has not sent payment yet, the mediator should suggest that both peers each get back the full amount of their security deposits (with seller receiving full trade amount back as well). Otherwise the trade amount should go to the buyer. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
portfolio.pending.failedTrade.errorMsgSet=There was an error during trade protocol execution.\n\nError: {0}\n\nIt might be that this error is not critical, and the trade can be completed normally. If you are unsure, open a mediation ticket to get advice from Haveno mediators. \n\nIf the error was critical and the trade cannot be completed, you might have lost your trade fee. Request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
portfolio.pending.failedTrade.missingContract=The trade contract is not set.\n\nThe trade cannot be completed and you might have lost your trade fee. If so, you can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing, but funds have been locked in the deposit transaction.\n\nPlease do NOT send the traditional or crypto payment to the XMR seller, because without the delayed payout tx, arbitration cannot be opened. Instead, open a mediation ticket with Cmd/Ctrl+o. The mediator should suggest that both peers each get back the the full amount of their security deposits (with seller receiving full trade amount back as well). This way, there is no security risk, and only trade fees are lost. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing but funds have been locked in the deposit transaction.\n\nIf the buyer is also missing the delayed payout transaction, they will be instructed to NOT send the payment and open a mediation ticket instead. You should also open a mediation ticket with Cmd/Ctrl+o. \n\nIf the buyer has not sent payment yet, the mediator should suggest that both peers each get back the full amount of their security deposits (with seller receiving full trade amount back as well). Otherwise the trade amount should go to the buyer. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.errorMsgSet=There was an error during trade protocol execution.\n\nError: {0}\n\nIt might be that this error is not critical, and the trade can be completed normally. If you are unsure, open a mediation ticket to get advice from Haveno mediators. \n\nIf the error was critical and the trade cannot be completed, you might have lost your trade fee. Request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.missingContract=The trade contract is not set.\n\nThe trade cannot be completed and you might have lost your trade fee. If so, you can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.info.popup=The trade protocol encountered some problems.\n\n{0}
|
||||
portfolio.pending.failedTrade.txChainInvalid.moveToFailed=The trade protocol encountered a serious problem.\n\n{0}\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time.
|
||||
portfolio.pending.failedTrade.txChainValid.moveToFailed=The trade protocol encountered some problems.\n\n{0}\n\nThe trade transactions have been published and funds are locked. Only move the trade to failed trades if you are really sure. It might prevent options to resolve the problem.\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time.
|
||||
|
@ -1586,7 +1586,7 @@ popup.headline.error=خطا
|
|||
popup.doNotShowAgain=دوباره نشان نده
|
||||
popup.reportError.log=باز کردن فایل گزارش
|
||||
popup.reportError.gitHub=گزارش به پیگیر مسائل GitHub
|
||||
popup.reportError={0}\n\nTo help us to improve the software please report this bug by opening a new issue at https://github.com/haveno-dex/haveno/issues.\nThe above error message will be copied to the clipboard when you click either of the buttons below.\nIt will make debugging easier if you include the haveno.log file by pressing "Open log file", saving a copy, and attaching it to your bug report.
|
||||
popup.reportError={0}\n\nTo help us to improve the software please report this bug by opening a new issue at https://github.com/MoneroEcosystem/haveno/issues.\nThe above error message will be copied to the clipboard when you click either of the buttons below.\nIt will make debugging easier if you include the haveno.log file by pressing "Open log file", saving a copy, and attaching it to your bug report.
|
||||
|
||||
popup.error.tryRestart=لطفاً سعی کنید برنامه را مجدداً راه اندازی کنید و اتصال شبکه خود را بررسی کنید تا ببینید آیا می توانید مشکل را حل کنید یا خیر.
|
||||
popup.error.takeOfferRequestFailed=وقتی کسی تلاش کرد تا یکی از پیشنهادات شما را بپذیرد خطایی رخ داد:\n{0}
|
||||
|
|
|
@ -822,10 +822,10 @@ portfolio.pending.mediationResult.popup.alreadyAccepted=Vous avez déjà accept
|
|||
portfolio.pending.failedTrade.taker.missingTakerFeeTx=Le frais de transaction du preneur est manquant.\n\nSans ce tx, le trade ne peut être complété. Aucun fonds ont été verrouillés et aucun frais de trade a été payé. Vous pouvez déplacer ce trade vers les trade échoués.
|
||||
portfolio.pending.failedTrade.maker.missingTakerFeeTx=Le frais de transaction du pair preneur est manquant.\n\nSans ce tx, le trade ne peut être complété. Aucun fonds ont été verrouillés. Votre offre est toujours valable pour les autres traders, vous n'avez donc pas perdu le frais de maker. Vous pouvez déplacer ce trade vers les trades échoués.
|
||||
portfolio.pending.failedTrade.missingDepositTx=Une transaction de dépôt est manquante.\n\nCette transaction est nécessaire pour compléter la transaction. Veuillez vous assurer que votre portefeuille est entièrement synchronisé avec la blockchain Monero.\n\nVous pouvez déplacer cette transaction dans la section « Transactions échouées » pour la désactiver.
|
||||
portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=La transaction de paiement différée est manquante, mais les fonds ont été verrouillés dans la transaction de dépôt.\n\nVeuillez NE PAS envoyer de Fiat ou d'crypto au vendeur de XMR, car avec le tx de paiement différé, le jugemenbt ne peut être ouvert. À la place, ouvrez un ticket de médiation avec Cmd/Ctrl+O. Le médiateur devrait suggérer que les deux pair reçoivent tous les deux le montant total de leurs dépôts de sécurité (le vendeur aussi doit reçevoir le montant total du trade). De cette manière, il n'y a pas de risque de non sécurité, et seuls les frais du trade sont perdus.\n\nVous pouvez demander le remboursement des frais de trade perdus ici;\n[LIEN:https://github.com/haveno-dex/haveno/issues]
|
||||
portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=La transaction de paiement différée est manquante, mais les fonds ont été verrouillés dans la transaction de dépôt.\n\nSi l'acheteur n'a pas non plus la transaction de paiement différée, il sera informé du fait de ne PAS envoyer le paiement et d'ouvrir un ticket de médiation à la place. Vous devriez aussi ouvrir un ticket de médiation avec Cmd/Ctrl+o.\n\nSi l'acheteur n'a pas encore envoyé le paiement, le médiateur devrait suggérer que les deux pairs reçoivent le montant total de leurs dépôts de sécurité (le vendeur doit aussi reçevoir le montant total du trade). Sinon, le montant du trade revient à l'acheteur.\n\nVous pouvez effectuer une demande de remboursement pour les frais de trade perdus ici: [LIEN:https://github.com/haveno-dex/haveno/issues]
|
||||
portfolio.pending.failedTrade.errorMsgSet=Il y'a eu une erreur durant l'exécution du protocole de trade.\n\nErreur: {0}\n\nIl est possible que cette erreur ne soit pas critique, et que le trade puisse être complété normalement. Si vous n'en êtes pas sûr, ouvrez un ticket de médiation pour avoir des conseils de la part des médiateurs de Haveno.\n\nSi cette erreur est critique et que le trade ne peut être complété, il est possible que vous ayez perdu le frais du trade. Effectuez une demande de remboursement ici: [LIEN:https://github.com/haveno-dex/haveno/issues]
|
||||
portfolio.pending.failedTrade.missingContract=Le contrat de trade n'est pas complété.\n\nCe trade ne peut être complété et il est possible que vous ayiez perdu votre frais de trade. Dans ce cas, vous pouvez demander un remboursement des frais de trade perdus ici: [LIEN:https://github.com/haveno-dex/haveno/issues]
|
||||
portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=La transaction de paiement différée est manquante, mais les fonds ont été verrouillés dans la transaction de dépôt.\n\nVeuillez NE PAS envoyer de Fiat ou d'crypto au vendeur de XMR, car avec le tx de paiement différé, le jugemenbt ne peut être ouvert. À la place, ouvrez un ticket de médiation avec Cmd/Ctrl+O. Le médiateur devrait suggérer que les deux pair reçoivent tous les deux le montant total de leurs dépôts de sécurité (le vendeur aussi doit reçevoir le montant total du trade). De cette manière, il n'y a pas de risque de non sécurité, et seuls les frais du trade sont perdus.\n\nVous pouvez demander le remboursement des frais de trade perdus ici;\n[LIEN:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=La transaction de paiement différée est manquante, mais les fonds ont été verrouillés dans la transaction de dépôt.\n\nSi l'acheteur n'a pas non plus la transaction de paiement différée, il sera informé du fait de ne PAS envoyer le paiement et d'ouvrir un ticket de médiation à la place. Vous devriez aussi ouvrir un ticket de médiation avec Cmd/Ctrl+o.\n\nSi l'acheteur n'a pas encore envoyé le paiement, le médiateur devrait suggérer que les deux pairs reçoivent le montant total de leurs dépôts de sécurité (le vendeur doit aussi reçevoir le montant total du trade). Sinon, le montant du trade revient à l'acheteur.\n\nVous pouvez effectuer une demande de remboursement pour les frais de trade perdus ici: [LIEN:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.errorMsgSet=Il y'a eu une erreur durant l'exécution du protocole de trade.\n\nErreur: {0}\n\nIl est possible que cette erreur ne soit pas critique, et que le trade puisse être complété normalement. Si vous n'en êtes pas sûr, ouvrez un ticket de médiation pour avoir des conseils de la part des médiateurs de Haveno.\n\nSi cette erreur est critique et que le trade ne peut être complété, il est possible que vous ayez perdu le frais du trade. Effectuez une demande de remboursement ici: [LIEN:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.missingContract=Le contrat de trade n'est pas complété.\n\nCe trade ne peut être complété et il est possible que vous ayiez perdu votre frais de trade. Dans ce cas, vous pouvez demander un remboursement des frais de trade perdus ici: [LIEN:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.info.popup=Le protocole de trade a rencontré quelques problèmes/\n\n{0}
|
||||
portfolio.pending.failedTrade.txChainInvalid.moveToFailed=Le protocole de trade a rencontré un problème critique.\n\n{0}\n\nVoulez-vous déplacer ce trade vers les trades échoués?\n\nVous ne pouvez pas ouvrir de médiations ou de jugements depuis la liste des trades échoués, mais vous pouvez redéplacer un trade échoué vers l'écran des trades ouverts quand vous le souhaitez.
|
||||
portfolio.pending.failedTrade.txChainValid.moveToFailed=Il y a des problèmes avec cet accord de transaction. \n\n{0}\n\nLa transaction de devis a été validée et les fonds ont été bloqués. Déplacer la transaction vers une transaction échouée uniquement si elle est certaine. Cela peut empêcher les options disponibles pour résoudre le problème. \n\nÊtes-vous sûr de vouloir déplacer cette transaction vers la transaction échouée? \n\nVous ne pouvez pas ouvrir une médiation ou un arbitrage dans une transaction échouée, mais vous pouvez déplacer une transaction échouée vers la transaction incomplète à tout moment.
|
||||
|
@ -1592,7 +1592,7 @@ popup.headline.error=Erreur
|
|||
popup.doNotShowAgain=Ne plus montrer
|
||||
popup.reportError.log=Ouvrir le dossier de log
|
||||
popup.reportError.gitHub=Signaler au Tracker de problème GitHub
|
||||
popup.reportError={0}\n\nAfin de nous aider à améliorer le logiciel, veuillez signaler ce bug en ouvrant un nouveau ticket de support sur https://github.com/haveno-dex/haveno/issues.\nLe message d''erreur ci-dessus sera copié dans le presse-papier lorsque vous cliquerez sur l''un des boutons ci-dessous.\nCela facilitera le dépannage si vous incluez le fichier haveno.log en appuyant sur "ouvrir le fichier de log", en sauvegardant une copie, et en l''attachant à votre rapport de bug.
|
||||
popup.reportError={0}\n\nAfin de nous aider à améliorer le logiciel, veuillez signaler ce bug en ouvrant un nouveau ticket de support sur https://github.com/MoneroEcosystem/haveno/issues.\nLe message d''erreur ci-dessus sera copié dans le presse-papier lorsque vous cliquerez sur l''un des boutons ci-dessous.\nCela facilitera le dépannage si vous incluez le fichier haveno.log en appuyant sur "ouvrir le fichier de log", en sauvegardant une copie, et en l''attachant à votre rapport de bug.
|
||||
|
||||
popup.error.tryRestart=Veuillez essayer de redémarrer votre application et vérifier votre connexion réseau pour voir si vous pouvez résoudre ce problème.
|
||||
popup.error.takeOfferRequestFailed=Une erreur est survenue pendant que quelqu''un essayait d''accepter l''un de vos ordres:\n{0}
|
||||
|
|
|
@ -821,10 +821,10 @@ portfolio.pending.mediationResult.popup.alreadyAccepted=すでに受け入れて
|
|||
portfolio.pending.failedTrade.taker.missingTakerFeeTx=欠測テイカー手数料のトランザクション。\n\nこのtxがなければ、トレードを完了できません。資金はロックされず、トレード手数料は支払いませんでした。「失敗トレード」へ送ることができます。
|
||||
portfolio.pending.failedTrade.maker.missingTakerFeeTx=ピアのテイカー手数料のトランザクションは欠測します。\n\nこのtxがなければ、トレードを完了できません。資金はロックされませんでした。あなたのオファーがまだ他の取引者には有効ですので、メイカー手数料は失っていません。このトレードを「失敗トレード」へ送ることができます。
|
||||
portfolio.pending.failedTrade.missingDepositTx=入金トランザクションが見つかりません。\n\nこのトランザクションは取引を完了するために必要です。Moneroブロックチェーンとウォレットが完全に同期されていることを確認してください。\n\nこの取引を「失敗した取引」セクションに移動して、無効化することができます。
|
||||
portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=遅延支払いトランザクションは欠測しますが、資金は入金トランザクションにロックされました。\n\nこの法定通貨・アルトコイン支払いをXMR売り手に送信しないで下さい。遅延支払いtxがなければ、係争仲裁は開始されることができません。代りに、「Cmd/Ctrl+o」で調停チケットをオープンして下さい。調停者はおそらく両方のピアへセキュリティデポジットの全額を払い戻しを提案します(売り手はトレード金額も払い戻しを受ける)。このような方法でセキュリティーのリスクがなし、トレード手数料のみが失われます。\n\n失われたトレード手数料の払い戻し要求はここから提出できます: [HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=遅延支払いトランザクションは欠測しますが、資金は入金トランザクションにロックされました。\n\n買い手の遅延支払いトランザクションが同じく欠測される場合、相手は支払いを送信せず調停チケットをオープンするように指示されます。同様に「Cmd/Ctrl+o」で調停チケットをオープンするのは賢明でしょう。\n\n買い手はまだ支払いを送信しなかった場合、調停者はおそらく両方のピアへセキュリティデポジットの全額を払い戻しを提案します(売り手はトレード金額も払い戻しを受ける)。さもなければ、トレード金額は買い手に支払われるでしょう。\n\n失われたトレード手数料の払い戻し要求はここから提出できます: [HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
portfolio.pending.failedTrade.errorMsgSet=トレードプロトコルの実行にはエラーが生じました。\n\nエラー: {0}\n\nクリティカル・エラーではない可能性はあり、トレードは普通に完了できるかもしれない。迷う場合は調停チケットをオープンして、Haveno調停者からアドバイスを受けることができます。\n\nクリティカル・エラーでトレードが完了できなかった場合はトレード手数料は失われた可能性があります。失われたトレード手数料の払い戻し要求はここから提出できます: [HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
portfolio.pending.failedTrade.missingContract=トレード契約書は設定されません。\n\nトレードは完了できません。トレード手数料は失われた可能性もあります。その場合は失われたトレード手数料の払い戻し要求はここから提出できます: [HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=遅延支払いトランザクションは欠測しますが、資金は入金トランザクションにロックされました。\n\nこの法定通貨・アルトコイン支払いをXMR売り手に送信しないで下さい。遅延支払いtxがなければ、係争仲裁は開始されることができません。代りに、「Cmd/Ctrl+o」で調停チケットをオープンして下さい。調停者はおそらく両方のピアへセキュリティデポジットの全額を払い戻しを提案します(売り手はトレード金額も払い戻しを受ける)。このような方法でセキュリティーのリスクがなし、トレード手数料のみが失われます。\n\n失われたトレード手数料の払い戻し要求はここから提出できます: [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=遅延支払いトランザクションは欠測しますが、資金は入金トランザクションにロックされました。\n\n買い手の遅延支払いトランザクションが同じく欠測される場合、相手は支払いを送信せず調停チケットをオープンするように指示されます。同様に「Cmd/Ctrl+o」で調停チケットをオープンするのは賢明でしょう。\n\n買い手はまだ支払いを送信しなかった場合、調停者はおそらく両方のピアへセキュリティデポジットの全額を払い戻しを提案します(売り手はトレード金額も払い戻しを受ける)。さもなければ、トレード金額は買い手に支払われるでしょう。\n\n失われたトレード手数料の払い戻し要求はここから提出できます: [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.errorMsgSet=トレードプロトコルの実行にはエラーが生じました。\n\nエラー: {0}\n\nクリティカル・エラーではない可能性はあり、トレードは普通に完了できるかもしれない。迷う場合は調停チケットをオープンして、Haveno調停者からアドバイスを受けることができます。\n\nクリティカル・エラーでトレードが完了できなかった場合はトレード手数料は失われた可能性があります。失われたトレード手数料の払い戻し要求はここから提出できます: [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.missingContract=トレード契約書は設定されません。\n\nトレードは完了できません。トレード手数料は失われた可能性もあります。その場合は失われたトレード手数料の払い戻し要求はここから提出できます: [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.info.popup=トレードプロトコルは問題に遭遇しました。\n\n{0}
|
||||
portfolio.pending.failedTrade.txChainInvalid.moveToFailed=トレードプロトコルは深刻な問題に遭遇しました。\n\n{0}\n\nトレードを「失敗トレード」へ送りますか?\n\n「失敗トレード」画面から調停・仲裁を開始できませんけど、失敗トレードがいつでも「オープントレード」へ戻されることができます。
|
||||
portfolio.pending.failedTrade.txChainValid.moveToFailed=トレードプロトコルは問題に遭遇しました。\n\n{0}\n\nトレードのトランザクションは公開され、資金はロックされました。絶対に確信している場合のみにトレードを「失敗トレード」へ送りましょう。問題を解決できる選択肢に邪魔する可能性はあります。\n\nトレードを「失敗トレード」へ送りますか?\n\n「失敗トレード」画面から調停・仲裁を開始できませんけど、失敗トレードがいつでも「オープントレード」へ戻されることができます。
|
||||
|
@ -1590,7 +1590,7 @@ popup.headline.error=エラー
|
|||
popup.doNotShowAgain=次回から表示しない
|
||||
popup.reportError.log=ログファイルを開く
|
||||
popup.reportError.gitHub=GitHub issue trackerに報告
|
||||
popup.reportError={0}\n\nソフトウェアの改善に役立てるため、https://github.com/haveno-dex/haveno/issues で新しい issue を開いてこのバグを報告してください。\n下のボタンのいずれかをクリックすると、上記のエラーメッセージがクリップボードにコピーされます。\n「ログファイルを開く」を押して、コピーを保存し、バグレポートに添付されるhaveno.logファイル含めると、デバッグが容易になります。
|
||||
popup.reportError={0}\n\nソフトウェアの改善に役立てるため、https://github.com/MoneroEcosystem/haveno/issues で新しい issue を開いてこのバグを報告してください。\n下のボタンのいずれかをクリックすると、上記のエラーメッセージがクリップボードにコピーされます。\n「ログファイルを開く」を押して、コピーを保存し、バグレポートに添付されるhaveno.logファイル含めると、デバッグが容易になります。
|
||||
|
||||
popup.error.tryRestart=アプリケーションを再起動し、ネットワーク接続を確認して問題を解決できるかどうかを確認してください。
|
||||
popup.error.takeOfferRequestFailed=誰かがあなたのいずれかのオファーを受けようと時にエラーが発生しました:\n{0}
|
||||
|
|
|
@ -823,10 +823,10 @@ portfolio.pending.mediationResult.popup.alreadyAccepted=Você já aceitou
|
|||
portfolio.pending.failedTrade.taker.missingTakerFeeTx=The taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked and no trade fee has been paid. You can move this trade to failed trades.
|
||||
portfolio.pending.failedTrade.maker.missingTakerFeeTx=The peer's taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked. Your offer is still available to other traders, so you have not lost the maker fee. You can move this trade to failed trades.
|
||||
portfolio.pending.failedTrade.missingDepositTx=Uma transação de depósito está faltando.\n\nEssa transação é necessária para concluir a negociação. Por favor, certifique-se de que sua carteira esteja totalmente sincronizada com a blockchain do Monero.\n\nVocê pode mover esta negociação para a seção "Negociações Falhas" para desativá-la.
|
||||
portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing, but funds have been locked in the deposit transaction.\n\nPlease do NOT send the traditional or crypto payment to the XMR seller, because without the delayed payout tx, arbitration cannot be opened. Instead, open a mediation ticket with Cmd/Ctrl+o. The mediator should suggest that both peers each get back the the full amount of their security deposits (with seller receiving full trade amount back as well). This way, there is no security risk, and only trade fees are lost. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing but funds have been locked in the deposit transaction.\n\nIf the buyer is also missing the delayed payout transaction, they will be instructed to NOT send the payment and open a mediation ticket instead. You should also open a mediation ticket with Cmd/Ctrl+o. \n\nIf the buyer has not sent payment yet, the mediator should suggest that both peers each get back the full amount of their security deposits (with seller receiving full trade amount back as well). Otherwise the trade amount should go to the buyer. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
portfolio.pending.failedTrade.errorMsgSet=There was an error during trade protocol execution.\n\nError: {0}\n\nIt might be that this error is not critical, and the trade can be completed normally. If you are unsure, open a mediation ticket to get advice from Haveno mediators. \n\nIf the error was critical and the trade cannot be completed, you might have lost your trade fee. Request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
portfolio.pending.failedTrade.missingContract=The trade contract is not set.\n\nThe trade cannot be completed and you might have lost your trade fee. If so, you can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing, but funds have been locked in the deposit transaction.\n\nPlease do NOT send the traditional or crypto payment to the XMR seller, because without the delayed payout tx, arbitration cannot be opened. Instead, open a mediation ticket with Cmd/Ctrl+o. The mediator should suggest that both peers each get back the the full amount of their security deposits (with seller receiving full trade amount back as well). This way, there is no security risk, and only trade fees are lost. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing but funds have been locked in the deposit transaction.\n\nIf the buyer is also missing the delayed payout transaction, they will be instructed to NOT send the payment and open a mediation ticket instead. You should also open a mediation ticket with Cmd/Ctrl+o. \n\nIf the buyer has not sent payment yet, the mediator should suggest that both peers each get back the full amount of their security deposits (with seller receiving full trade amount back as well). Otherwise the trade amount should go to the buyer. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.errorMsgSet=There was an error during trade protocol execution.\n\nError: {0}\n\nIt might be that this error is not critical, and the trade can be completed normally. If you are unsure, open a mediation ticket to get advice from Haveno mediators. \n\nIf the error was critical and the trade cannot be completed, you might have lost your trade fee. Request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.missingContract=The trade contract is not set.\n\nThe trade cannot be completed and you might have lost your trade fee. If so, you can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.info.popup=The trade protocol encountered some problems.\n\n{0}
|
||||
portfolio.pending.failedTrade.txChainInvalid.moveToFailed=The trade protocol encountered a serious problem.\n\n{0}\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time.
|
||||
portfolio.pending.failedTrade.txChainValid.moveToFailed=The trade protocol encountered some problems.\n\n{0}\n\nThe trade transactions have been published and funds are locked. Only move the trade to failed trades if you are really sure. It might prevent options to resolve the problem.\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time.
|
||||
|
@ -1594,7 +1594,7 @@ popup.headline.error=Erro
|
|||
popup.doNotShowAgain=Não mostrar novamente
|
||||
popup.reportError.log=Abrir arquivo de log
|
||||
popup.reportError.gitHub=Reportar à lista de problemas no GitHub
|
||||
popup.reportError={0}\n\nPara nos ajudar a melhorar o aplicativo, reporte o bug criando um relatório (Issue) em nossa página do GitHub em https://github.com/haveno-dex/haveno/issues.\n\nA mensagem de erro exibida acima será copiada para a área de transferência quando você clicar qualquer um dos botões abaixo.\nA solução de problemas será mais fácil se você anexar o arquivo haveno.log ao clicar em "Abrir arquivo de log", salvando uma cópia e incluindo-a em seu relatório do problema (Issue) no GitHub.
|
||||
popup.reportError={0}\n\nPara nos ajudar a melhorar o aplicativo, reporte o bug criando um relatório (Issue) em nossa página do GitHub em https://github.com/MoneroEcosystem/haveno/issues.\n\nA mensagem de erro exibida acima será copiada para a área de transferência quando você clicar qualquer um dos botões abaixo.\nA solução de problemas será mais fácil se você anexar o arquivo haveno.log ao clicar em "Abrir arquivo de log", salvando uma cópia e incluindo-a em seu relatório do problema (Issue) no GitHub.
|
||||
|
||||
popup.error.tryRestart=Por favor, reinicie o aplicativo e verifique sua conexão de Internet para ver se o problema foi resolvido.
|
||||
popup.error.takeOfferRequestFailed=Houve um quando alguém tentou aceitar uma de suas ofertas:\n{0}
|
||||
|
|
|
@ -820,10 +820,10 @@ portfolio.pending.mediationResult.popup.alreadyAccepted=You've already accepted
|
|||
portfolio.pending.failedTrade.taker.missingTakerFeeTx=The taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked and no trade fee has been paid. You can move this trade to failed trades.
|
||||
portfolio.pending.failedTrade.maker.missingTakerFeeTx=The peer's taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked. Your offer is still available to other traders, so you have not lost the maker fee. You can move this trade to failed trades.
|
||||
portfolio.pending.failedTrade.missingDepositTx=Отсутствует транзакция депозита.\n\nЭта транзакция необходима для завершения сделки. Пожалуйста, убедитесь, что ваш кошелёк полностью синхронизирован с блокчейном Monero.\n\nВы можете переместить эту сделку в раздел "Неудачные сделки", чтобы деактивировать её.
|
||||
portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing, but funds have been locked in the deposit transaction.\n\nPlease do NOT send the traditional or crypto payment to the XMR seller, because without the delayed payout tx, arbitration cannot be opened. Instead, open a mediation ticket with Cmd/Ctrl+o. The mediator should suggest that both peers each get back the the full amount of their security deposits (with seller receiving full trade amount back as well). This way, there is no security risk, and only trade fees are lost. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing but funds have been locked in the deposit transaction.\n\nIf the buyer is also missing the delayed payout transaction, they will be instructed to NOT send the payment and open a mediation ticket instead. You should also open a mediation ticket with Cmd/Ctrl+o. \n\nIf the buyer has not sent payment yet, the mediator should suggest that both peers each get back the full amount of their security deposits (with seller receiving full trade amount back as well). Otherwise the trade amount should go to the buyer. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
portfolio.pending.failedTrade.errorMsgSet=There was an error during trade protocol execution.\n\nError: {0}\n\nIt might be that this error is not critical, and the trade can be completed normally. If you are unsure, open a mediation ticket to get advice from Haveno mediators. \n\nIf the error was critical and the trade cannot be completed, you might have lost your trade fee. Request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
portfolio.pending.failedTrade.missingContract=The trade contract is not set.\n\nThe trade cannot be completed and you might have lost your trade fee. If so, you can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing, but funds have been locked in the deposit transaction.\n\nPlease do NOT send the traditional or crypto payment to the XMR seller, because without the delayed payout tx, arbitration cannot be opened. Instead, open a mediation ticket with Cmd/Ctrl+o. The mediator should suggest that both peers each get back the the full amount of their security deposits (with seller receiving full trade amount back as well). This way, there is no security risk, and only trade fees are lost. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing but funds have been locked in the deposit transaction.\n\nIf the buyer is also missing the delayed payout transaction, they will be instructed to NOT send the payment and open a mediation ticket instead. You should also open a mediation ticket with Cmd/Ctrl+o. \n\nIf the buyer has not sent payment yet, the mediator should suggest that both peers each get back the full amount of their security deposits (with seller receiving full trade amount back as well). Otherwise the trade amount should go to the buyer. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.errorMsgSet=There was an error during trade protocol execution.\n\nError: {0}\n\nIt might be that this error is not critical, and the trade can be completed normally. If you are unsure, open a mediation ticket to get advice from Haveno mediators. \n\nIf the error was critical and the trade cannot be completed, you might have lost your trade fee. Request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.missingContract=The trade contract is not set.\n\nThe trade cannot be completed and you might have lost your trade fee. If so, you can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.info.popup=The trade protocol encountered some problems.\n\n{0}
|
||||
portfolio.pending.failedTrade.txChainInvalid.moveToFailed=The trade protocol encountered a serious problem.\n\n{0}\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time.
|
||||
portfolio.pending.failedTrade.txChainValid.moveToFailed=The trade protocol encountered some problems.\n\n{0}\n\nThe trade transactions have been published and funds are locked. Only move the trade to failed trades if you are really sure. It might prevent options to resolve the problem.\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time.
|
||||
|
@ -1587,7 +1587,7 @@ popup.headline.error=Ошибка
|
|||
popup.doNotShowAgain=Не показывать снова
|
||||
popup.reportError.log=Открыть файл журнала
|
||||
popup.reportError.gitHub=Сообщить о проблеме в Github
|
||||
popup.reportError={0}\n\nЧтобы помочь нам улучшить приложение, просьба сообщить об ошибке, открыв новую тему на https://github.com/haveno-dex/haveno/issues. \nСообщение об ошибке будет скопировано в буфер обмена при нажатии любой из кнопок ниже.\nЕсли вы прикрепите к отчету о неисправности файл журнала haveno.log, нажав «Открыть файл журнала» и сохранив его копию, это поможет нам разобраться с проблемой быстрее.
|
||||
popup.reportError={0}\n\nЧтобы помочь нам улучшить приложение, просьба сообщить об ошибке, открыв новую тему на https://github.com/MoneroEcosystem/haveno/issues. \nСообщение об ошибке будет скопировано в буфер обмена при нажатии любой из кнопок ниже.\nЕсли вы прикрепите к отчету о неисправности файл журнала haveno.log, нажав «Открыть файл журнала» и сохранив его копию, это поможет нам разобраться с проблемой быстрее.
|
||||
|
||||
popup.error.tryRestart=Попробуйте перезагрузить приложение и проверьте подключение к сети, чтобы попробовать решить проблему.
|
||||
popup.error.takeOfferRequestFailed=Произошла ошибка, когда контрагент попытался принять одно из ваших предложений:\n{0}
|
||||
|
|
|
@ -820,10 +820,10 @@ portfolio.pending.mediationResult.popup.alreadyAccepted=You've already accepted
|
|||
portfolio.pending.failedTrade.taker.missingTakerFeeTx=The taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked and no trade fee has been paid. You can move this trade to failed trades.
|
||||
portfolio.pending.failedTrade.maker.missingTakerFeeTx=The peer's taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked. Your offer is still available to other traders, so you have not lost the maker fee. You can move this trade to failed trades.
|
||||
portfolio.pending.failedTrade.missingDepositTx=ธุรกรรมเงินมัดจำหายไป\n\nธุรกรรมนี้จำเป็นสำหรับการดำเนินการซื้อขายให้เสร็จสมบูรณ์ กรุณาตรวจสอบให้แน่ใจว่า Wallet ของคุณได้ซิงค์กับบล็อกเชน Monero อย่างสมบูรณ์แล้ว\n\nคุณสามารถย้ายการซื้อขายนี้ไปยังส่วน "การซื้อขายที่ล้มเหลว" เพื่อปิดการใช้งานได้
|
||||
portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing, but funds have been locked in the deposit transaction.\n\nPlease do NOT send the traditional or crypto payment to the XMR seller, because without the delayed payout tx, arbitration cannot be opened. Instead, open a mediation ticket with Cmd/Ctrl+o. The mediator should suggest that both peers each get back the the full amount of their security deposits (with seller receiving full trade amount back as well). This way, there is no security risk, and only trade fees are lost. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing but funds have been locked in the deposit transaction.\n\nIf the buyer is also missing the delayed payout transaction, they will be instructed to NOT send the payment and open a mediation ticket instead. You should also open a mediation ticket with Cmd/Ctrl+o. \n\nIf the buyer has not sent payment yet, the mediator should suggest that both peers each get back the full amount of their security deposits (with seller receiving full trade amount back as well). Otherwise the trade amount should go to the buyer. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
portfolio.pending.failedTrade.errorMsgSet=There was an error during trade protocol execution.\n\nError: {0}\n\nIt might be that this error is not critical, and the trade can be completed normally. If you are unsure, open a mediation ticket to get advice from Haveno mediators. \n\nIf the error was critical and the trade cannot be completed, you might have lost your trade fee. Request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
portfolio.pending.failedTrade.missingContract=The trade contract is not set.\n\nThe trade cannot be completed and you might have lost your trade fee. If so, you can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing, but funds have been locked in the deposit transaction.\n\nPlease do NOT send the traditional or crypto payment to the XMR seller, because without the delayed payout tx, arbitration cannot be opened. Instead, open a mediation ticket with Cmd/Ctrl+o. The mediator should suggest that both peers each get back the the full amount of their security deposits (with seller receiving full trade amount back as well). This way, there is no security risk, and only trade fees are lost. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing but funds have been locked in the deposit transaction.\n\nIf the buyer is also missing the delayed payout transaction, they will be instructed to NOT send the payment and open a mediation ticket instead. You should also open a mediation ticket with Cmd/Ctrl+o. \n\nIf the buyer has not sent payment yet, the mediator should suggest that both peers each get back the full amount of their security deposits (with seller receiving full trade amount back as well). Otherwise the trade amount should go to the buyer. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.errorMsgSet=There was an error during trade protocol execution.\n\nError: {0}\n\nIt might be that this error is not critical, and the trade can be completed normally. If you are unsure, open a mediation ticket to get advice from Haveno mediators. \n\nIf the error was critical and the trade cannot be completed, you might have lost your trade fee. Request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.missingContract=The trade contract is not set.\n\nThe trade cannot be completed and you might have lost your trade fee. If so, you can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.info.popup=The trade protocol encountered some problems.\n\n{0}
|
||||
portfolio.pending.failedTrade.txChainInvalid.moveToFailed=The trade protocol encountered a serious problem.\n\n{0}\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time.
|
||||
portfolio.pending.failedTrade.txChainValid.moveToFailed=The trade protocol encountered some problems.\n\n{0}\n\nThe trade transactions have been published and funds are locked. Only move the trade to failed trades if you are really sure. It might prevent options to resolve the problem.\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time.
|
||||
|
@ -1587,7 +1587,7 @@ popup.headline.error=ผิดพลาด
|
|||
popup.doNotShowAgain=ไม่ต้องแสดงอีกครั้ง
|
||||
popup.reportError.log=เปิดไฟล์ที่บันทึก
|
||||
popup.reportError.gitHub=รายงานไปที่ตัวติดตามปัญหา GitHub
|
||||
popup.reportError={0}\n\nTo help us to improve the software please report this bug by opening a new issue at https://github.com/haveno-dex/haveno/issues.\nThe above error message will be copied to the clipboard when you click either of the buttons below.\nIt will make debugging easier if you include the haveno.log file by pressing "Open log file", saving a copy, and attaching it to your bug report.
|
||||
popup.reportError={0}\n\nTo help us to improve the software please report this bug by opening a new issue at https://github.com/MoneroEcosystem/haveno/issues.\nThe above error message will be copied to the clipboard when you click either of the buttons below.\nIt will make debugging easier if you include the haveno.log file by pressing "Open log file", saving a copy, and attaching it to your bug report.
|
||||
|
||||
popup.error.tryRestart=โปรดลองเริ่มแอปพลิเคชั่นของคุณใหม่และตรวจสอบการเชื่อมต่อเครือข่ายของคุณเพื่อดูว่าคุณสามารถแก้ไขปัญหาได้หรือไม่
|
||||
popup.error.takeOfferRequestFailed=เกิดข้อผิดพลาดขึ้นเมื่อมีคนพยายามรับข้อเสนอของคุณ: \n{0}
|
||||
|
|
|
@ -965,7 +965,7 @@ portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=G
|
|||
(satıcı da tam ticaret miktarını geri alır). \
|
||||
Bu şekilde, güvenlik riski yoktur ve yalnızca ticaret ücretleri kaybedilir. \n\n\
|
||||
Kaybedilen ticaret ücretleri için burada geri ödeme talebinde bulunabilirsiniz: \
|
||||
[HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
[HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=Gecikmiş ödeme işlemi eksik \
|
||||
ancak fonlar depozito işleminde kilitlendi.\n\n\
|
||||
Eğer alıcı da gecikmiş ödeme işlemini eksikse, onlara ödemeyi göndermemeleri ve \
|
||||
|
@ -974,18 +974,18 @@ portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=
|
|||
tamamını geri almasını önermelidir (satıcı da tam ticaret miktarını geri alır). \
|
||||
Aksi takdirde ticaret miktarı alıcıya gitmelidir. \n\n\
|
||||
Kaybedilen ticaret ücretleri için burada geri ödeme talebinde bulunabilirsiniz: \
|
||||
[HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
[HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.errorMsgSet=Ticaret protokolü yürütülürken bir hata oluştu.\n\n\
|
||||
Hata: {0}\n\n\
|
||||
Bu hata kritik olmayabilir ve ticaret normal şekilde tamamlanabilir. Emin değilseniz, \
|
||||
Haveno arabulucularından tavsiye almak için bir arabuluculuk bileti açın. \n\n\
|
||||
Eğer hata kritikse ve ticaret tamamlanamazsa, ticaret ücretinizi kaybetmiş olabilirsiniz. \
|
||||
Kaybedilen ticaret ücretleri için burada geri ödeme talebinde bulunun: \
|
||||
[HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
[HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.missingContract=Ticaret sözleşmesi ayarlanmadı.\n\n\
|
||||
Ticaret tamamlanamaz ve ticaret ücretinizi kaybetmiş olabilirsiniz. \
|
||||
Eğer öyleyse, kaybedilen ticaret ücretleri için burada geri ödeme talebinde bulunun: \
|
||||
[HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
[HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.info.popup=Ticaret protokolü bazı sorunlarla karşılaştı.\n\n{0}
|
||||
portfolio.pending.failedTrade.txChainInvalid.moveToFailed=Ticaret protokolü ciddi bir sorunla karşılaştı.\n\n{0}\n\n\
|
||||
Ticareti başarısız ticaretler arasına taşımak ister misiniz?\n\n\
|
||||
|
@ -2091,7 +2091,7 @@ popup.headline.error=Hata
|
|||
popup.doNotShowAgain=Tekrar gösterme
|
||||
popup.reportError.log=Günlük dosyasını aç
|
||||
popup.reportError.gitHub=GitHub hata izleyicisine bildir
|
||||
popup.reportError={0}\n\nYazılımı geliştirmemize yardımcı olmak için lütfen bu hatayı https://github.com/haveno-dex/haveno/issues adresinde yeni bir sorun açarak bildirin.\n\
|
||||
popup.reportError={0}\n\nYazılımı geliştirmemize yardımcı olmak için lütfen bu hatayı https://github.com/MoneroEcosystem/haveno/issues adresinde yeni bir sorun açarak bildirin.\n\
|
||||
Yukarıdaki hata mesajı, aşağıdaki düğmelerden birine tıkladığınızda panoya kopyalanacaktır.\n\
|
||||
Hata ayıklamayı kolaylaştırmak için \"Günlük dosyasını aç\" düğmesine basarak günlük dosyasını kaydedip hata raporunuza eklemeniz yararlı olacaktır.
|
||||
|
||||
|
@ -2214,17 +2214,17 @@ popup.shutDownInProgress.msg=Uygulamayı kapatmak birkaç saniye sürebilir.\nL
|
|||
|
||||
popup.attention.forTradeWithId=ID'si {0} olan ticaret için bildirim
|
||||
popup.attention.welcome.stagenet=Haveno test sürümüne hoş geldiniz!\n\n\
|
||||
Bu platform Haveno'nun protokolünü test etmenizi sağlar. Talimatları izlediğinizden emin olun [HYPERLINK:https://github.com/haveno-dex/haveno/blob/master/docs/installing.md].\n\n\
|
||||
Herhangi bir sorunla karşılaşırsanız, lütfen bir sorun bildirerek bize bildirin [HYPERLINK:https://github.com/haveno-dex/haveno/issues/new].\n\n\
|
||||
Bu platform Haveno'nun protokolünü test etmenizi sağlar. Talimatları izlediğinizden emin olun [HYPERLINK:https://github.com/MoneroEcosystem/haveno/blob/master/docs/installing.md].\n\n\
|
||||
Herhangi bir sorunla karşılaşırsanız, lütfen bir sorun bildirerek bize bildirin [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues/new].\n\n\
|
||||
Bu bir test sürümüdür. Gerçek para kullanmayın!
|
||||
popup.attention.welcome.mainnet=Haveno'ya hoş geldiniz!\n\n\
|
||||
Bu platform, Monero'yu itibari para birimleri veya diğer kripto para birimleriyle merkezi olmayan bir şekilde ticaret yapmanızı sağlar.\n\n\
|
||||
Yeni bir ödeme hesabı oluşturarak ve ardından bir teklif yaparak veya teklif alarak başlayın.\n\n\
|
||||
Herhangi bir sorunla karşılaşırsanız, lütfen bir sorun bildirerek bize bildirin [HYPERLINK:https://github.com/haveno-dex/haveno/issues/new].
|
||||
Herhangi bir sorunla karşılaşırsanız, lütfen bir sorun bildirerek bize bildirin [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues/new].
|
||||
popup.attention.welcome.mainnet.test=Haveno'ya hoş geldiniz!\n\n\
|
||||
Bu platform, Monero'yu itibari para birimleri veya diğer kripto para birimleriyle merkezi olmayan bir şekilde ticaret yapmanızı sağlar.\n\n\
|
||||
Yeni bir ödeme hesabı oluşturarak ve ardından bir teklif yaparak veya teklif alarak başlayın.\n\n\
|
||||
Herhangi bir sorunla karşılaşırsanız, lütfen bir sorun bildirerek bize bildirin [HYPERLINK:https://github.com/haveno-dex/haveno/issues/new].\n\n\
|
||||
Herhangi bir sorunla karşılaşırsanız, lütfen bir sorun bildirerek bize bildirin [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues/new].\n\n\
|
||||
Haveno kısa bir süre önce kamu testi için yayınlandı. Lütfen küçük miktarlar kullanın!
|
||||
|
||||
popup.info.multiplePaymentAccounts.headline=Birden fazla ödeme hesabı mevcut
|
||||
|
|
|
@ -820,10 +820,10 @@ portfolio.pending.mediationResult.popup.alreadyAccepted=You've already accepted
|
|||
portfolio.pending.failedTrade.taker.missingTakerFeeTx=The taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked and no trade fee has been paid. You can move this trade to failed trades.
|
||||
portfolio.pending.failedTrade.maker.missingTakerFeeTx=The peer's taker fee transaction is missing.\n\nWithout this tx, the trade cannot be completed. No funds have been locked. Your offer is still available to other traders, so you have not lost the maker fee. You can move this trade to failed trades.
|
||||
portfolio.pending.failedTrade.missingDepositTx=Một giao dịch ký quỹ đang bị thiếu.\n\nGiao dịch này là bắt buộc để hoàn tất giao dịch. Vui lòng đảm bảo ví của bạn được đồng bộ hoàn toàn với blockchain Monero.\n\nBạn có thể chuyển giao dịch này đến mục "Giao dịch thất bại" để vô hiệu hóa nó.
|
||||
portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing, but funds have been locked in the deposit transaction.\n\nPlease do NOT send the traditional or crypto payment to the XMR seller, because without the delayed payout tx, arbitration cannot be opened. Instead, open a mediation ticket with Cmd/Ctrl+o. The mediator should suggest that both peers each get back the the full amount of their security deposits (with seller receiving full trade amount back as well). This way, there is no security risk, and only trade fees are lost. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing but funds have been locked in the deposit transaction.\n\nIf the buyer is also missing the delayed payout transaction, they will be instructed to NOT send the payment and open a mediation ticket instead. You should also open a mediation ticket with Cmd/Ctrl+o. \n\nIf the buyer has not sent payment yet, the mediator should suggest that both peers each get back the full amount of their security deposits (with seller receiving full trade amount back as well). Otherwise the trade amount should go to the buyer. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
portfolio.pending.failedTrade.errorMsgSet=There was an error during trade protocol execution.\n\nError: {0}\n\nIt might be that this error is not critical, and the trade can be completed normally. If you are unsure, open a mediation ticket to get advice from Haveno mediators. \n\nIf the error was critical and the trade cannot be completed, you might have lost your trade fee. Request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
portfolio.pending.failedTrade.missingContract=The trade contract is not set.\n\nThe trade cannot be completed and you might have lost your trade fee. If so, you can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/haveno-dex/haveno/issues]
|
||||
portfolio.pending.failedTrade.buyer.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing, but funds have been locked in the deposit transaction.\n\nPlease do NOT send the traditional or crypto payment to the XMR seller, because without the delayed payout tx, arbitration cannot be opened. Instead, open a mediation ticket with Cmd/Ctrl+o. The mediator should suggest that both peers each get back the the full amount of their security deposits (with seller receiving full trade amount back as well). This way, there is no security risk, and only trade fees are lost. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.seller.existingDepositTxButMissingDelayedPayoutTx=The delayed payout transaction is missing but funds have been locked in the deposit transaction.\n\nIf the buyer is also missing the delayed payout transaction, they will be instructed to NOT send the payment and open a mediation ticket instead. You should also open a mediation ticket with Cmd/Ctrl+o. \n\nIf the buyer has not sent payment yet, the mediator should suggest that both peers each get back the full amount of their security deposits (with seller receiving full trade amount back as well). Otherwise the trade amount should go to the buyer. \n\nYou can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.errorMsgSet=There was an error during trade protocol execution.\n\nError: {0}\n\nIt might be that this error is not critical, and the trade can be completed normally. If you are unsure, open a mediation ticket to get advice from Haveno mediators. \n\nIf the error was critical and the trade cannot be completed, you might have lost your trade fee. Request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.missingContract=The trade contract is not set.\n\nThe trade cannot be completed and you might have lost your trade fee. If so, you can request a reimbursement for lost trade fees here: [HYPERLINK:https://github.com/MoneroEcosystem/haveno/issues]
|
||||
portfolio.pending.failedTrade.info.popup=The trade protocol encountered some problems.\n\n{0}
|
||||
portfolio.pending.failedTrade.txChainInvalid.moveToFailed=The trade protocol encountered a serious problem.\n\n{0}\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time.
|
||||
portfolio.pending.failedTrade.txChainValid.moveToFailed=The trade protocol encountered some problems.\n\n{0}\n\nThe trade transactions have been published and funds are locked. Only move the trade to failed trades if you are really sure. It might prevent options to resolve the problem.\n\nDo you want to move the trade to failed trades?\n\nYou cannot open mediation or arbitration from the failed trades view, but you can move a failed trade back to the open trades screen any time.
|
||||
|
@ -1589,7 +1589,7 @@ popup.headline.error=Lỗi
|
|||
popup.doNotShowAgain=Không hiển thị lại
|
||||
popup.reportError.log=Mở log file
|
||||
popup.reportError.gitHub=Báo cáo cho người theo dõi vấn đề GitHub
|
||||
popup.reportError={0}\n\nĐể giúp chúng tôi cải tiến phần mềm, vui lòng báo cáo lỗi này bằng cách mở một thông báo vấn đề mới tại https://github.com/haveno-dex/haveno/issues.\nTin nhắn lỗi phía trên sẽ được sao chép tới clipboard khi bạn ấn vào một nút bên dưới.\nSự cố sẽ được xử lý dễ dàng hơn nếu bạn đính kèm haveno.log file bằng cách nhấn "Mở log file", lưu bản sao, và đính kèm vào báo cáo lỗi.
|
||||
popup.reportError={0}\n\nĐể giúp chúng tôi cải tiến phần mềm, vui lòng báo cáo lỗi này bằng cách mở một thông báo vấn đề mới tại https://github.com/MoneroEcosystem/haveno/issues.\nTin nhắn lỗi phía trên sẽ được sao chép tới clipboard khi bạn ấn vào một nút bên dưới.\nSự cố sẽ được xử lý dễ dàng hơn nếu bạn đính kèm haveno.log file bằng cách nhấn "Mở log file", lưu bản sao, và đính kèm vào báo cáo lỗi.
|
||||
|
||||
popup.error.tryRestart=Hãy khởi động lại ứng dụng và kiểm tra kết nối mạng để xem bạn có thể xử lý vấn đề này hay không.
|
||||
popup.error.takeOfferRequestFailed=Có lỗi xảy ra khi ai đó cố gắng để nhận một trong các chào giá của bạn:\n{0}
|
||||
|
|
|
@ -1,2 +1,4 @@
|
|||
# nodeaddress.onion:port [(@owner,@backup)]
|
||||
placeholder.onion:8000 (@placeholder)
|
||||
5i6blbmuflq4s4im6zby26a7g22oef6kyp7vbwyru6oq5e36akzo3ayd.onion:2001 (@op1)
|
||||
dx4ktxyiemjc354imehuaswbhqlidhy62b4ifzigk5p2rb37lxqbveqd.onion:2002 (@op2)
|
||||
ajbqx4clnjlr7lmzoftuvpvmqafdiilidsgocvokx6bqj3okk56ccfqd.onion:2003 (@op3)
|
||||
|
|
|
@ -1,3 +1 @@
|
|||
# nodeaddress.onion:port [(@owner)]
|
||||
dl57jitswby4yhzpqpu7pwq6iyqg2x6vkio73araparbftlqoqxhvqad.onion:2002 (@devtest1)
|
||||
3cqlkowdu766sto5wrdqpntpsi7kezwkkakc532i6jeiyu7hha726ead.onion:3003 (@devtest1)
|
||||
|
|
182
daemon/src/main/java/haveno/daemon/grpc/GrpcNetworkService.java
Normal file
|
@ -0,0 +1,182 @@
|
|||
package haveno.daemon.grpc;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.google.protobuf.ByteString;
|
||||
import io.grpc.ServerInterceptor;
|
||||
import io.grpc.stub.ServerCallStreamObserver;
|
||||
import io.grpc.stub.StreamObserver;
|
||||
|
||||
import haveno.core.api.CoreApi;
|
||||
import haveno.core.api.NetworkListener;
|
||||
import haveno.core.filter.PaymentAccountFilter;
|
||||
import haveno.daemon.grpc.interceptor.CallRateMeteringInterceptor;
|
||||
import haveno.daemon.grpc.interceptor.GrpcCallRateMeter;
|
||||
|
||||
import static haveno.daemon.grpc.interceptor.GrpcServiceRateMeteringConfig.getCustomRateMeteringInterceptor;
|
||||
import haveno.proto.grpc.NetworkMessage;
|
||||
import static haveno.proto.grpc.NetworkGrpc.getRegisterNetworkListenerMethod;
|
||||
import haveno.proto.grpc.GetOnlinePeersRequest;
|
||||
import haveno.proto.grpc.GetSeednodesReply;
|
||||
import haveno.proto.grpc.GetOnlinePeersReply;
|
||||
import haveno.proto.grpc.GetSeednodesRequest;
|
||||
import haveno.network.p2p.peers.peerexchange.Peer;
|
||||
import haveno.proto.grpc.NetworkGrpc.NetworkImplBase;
|
||||
import java.util.HashMap;
|
||||
import java.util.Optional;
|
||||
import static java.util.concurrent.TimeUnit.SECONDS;
|
||||
import haveno.proto.grpc.GetNetworkFilterReply;
|
||||
import haveno.proto.grpc.GetNetworkFilterRequest;
|
||||
import lombok.NonNull;
|
||||
import lombok.Value;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@Slf4j
|
||||
class GrpcNetworkService extends NetworkImplBase {
|
||||
|
||||
private final CoreApi coreApi;
|
||||
private final GrpcExceptionHandler exceptionHandler;
|
||||
|
||||
@Inject
|
||||
public GrpcNetworkService(CoreApi coreApi, GrpcExceptionHandler exceptionHandler) {
|
||||
this.coreApi = coreApi;
|
||||
this.exceptionHandler = exceptionHandler;
|
||||
}
|
||||
|
||||
//@Override
|
||||
//public void registerNetworkListener(RegisterNetworkListenerRequest request,
|
||||
// StreamObserver<NetworkMessage> responseObserver) {
|
||||
// Context ctx = Context.current().fork(); // context is independent for long-lived request
|
||||
// ctx.run(() -> {
|
||||
// try {
|
||||
// coreApi.addNetworkListener(new GrpcNetworkListener(responseObserver));
|
||||
// // No onNext / onCompleted, as the response observer should be kept open
|
||||
// } catch (Throwable t) {
|
||||
// exceptionHandler.handleException(log, t, responseObserver);
|
||||
// }
|
||||
// });
|
||||
//}
|
||||
|
||||
@Override
|
||||
public void getOnlinePeers(GetOnlinePeersRequest request,
|
||||
StreamObserver<GetOnlinePeersReply> responseObserver) {
|
||||
try {
|
||||
GetOnlinePeersReply.Builder replyBuilder = GetOnlinePeersReply.newBuilder();
|
||||
|
||||
for (Peer peer : coreApi.getOnlinePeers()) {
|
||||
replyBuilder.addPeers(
|
||||
haveno.proto.grpc.PeerInfo.newBuilder()
|
||||
.setNodeAddress(peer.getNodeAddress().getFullAddress())
|
||||
//.addAllCapabilities(peer.getCapabilities().stream().map(Integer::intValue).toList())
|
||||
.build());
|
||||
}
|
||||
|
||||
responseObserver.onNext(replyBuilder.build());
|
||||
responseObserver.onCompleted();
|
||||
} catch (Throwable t) {
|
||||
exceptionHandler.handleException(log, t, responseObserver);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getSeednodes(GetSeednodesRequest request,
|
||||
StreamObserver<GetSeednodesReply> responseObserver) {
|
||||
try {
|
||||
GetSeednodesReply.Builder replyBuilder = GetSeednodesReply.newBuilder();
|
||||
|
||||
for (Peer peer : coreApi.getOnlineSeedNodes()) {
|
||||
replyBuilder.addPeers(
|
||||
haveno.proto.grpc.PeerInfo.newBuilder()
|
||||
.setNodeAddress(peer.getNodeAddress().getFullAddress())
|
||||
//.addAllCapabilities(peer.getCapabilities().stream().map(Integer::intValue).toList())
|
||||
.build());
|
||||
}
|
||||
|
||||
responseObserver.onNext(replyBuilder.build());
|
||||
responseObserver.onCompleted();
|
||||
} catch (Throwable t) {
|
||||
exceptionHandler.handleException(log, t, responseObserver);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getNetworkFilter(GetNetworkFilterRequest request,
|
||||
StreamObserver<GetNetworkFilterReply> responseObserver) {
|
||||
try {
|
||||
haveno.core.filter.Filter modelFilter = coreApi.getFilter();
|
||||
|
||||
protobuf.Filter.Builder grpcFilter = protobuf.Filter.newBuilder()
|
||||
.addAllNodeAddressesBannedFromTrading(modelFilter.getNodeAddressesBannedFromTrading())
|
||||
.addAllBannedOfferIds(modelFilter.getBannedOfferIds())
|
||||
.addAllArbitrators(modelFilter.getArbitrators().stream().map(a -> a.toString()).toList())
|
||||
.addAllSeedNodes(modelFilter.getSeedNodes().stream().map(n -> n.toString()).toList())
|
||||
.addAllBannedPaymentAccounts(
|
||||
modelFilter.getBannedPaymentAccounts().stream()
|
||||
.map(PaymentAccountFilter::toProtoMessage)
|
||||
.toList())
|
||||
.setSignatureAsBase64(modelFilter.getSignatureAsBase64())
|
||||
.setOwnerPubKeyBytes(ByteString.copyFrom(modelFilter.getOwnerPubKeyBytes()))
|
||||
.putAllExtraData(modelFilter.getExtraDataMap())
|
||||
.addAllBannedCurrencies(modelFilter.getBannedCurrencies())
|
||||
.addAllBannedPaymentMethods(modelFilter.getBannedPaymentMethods())
|
||||
.addAllPriceRelayNodes(modelFilter.getPriceRelayNodes())
|
||||
.setPreventPublicXmrNetwork(modelFilter.isPreventPublicXmrNetwork())
|
||||
.addAllXmrNodes(modelFilter.getXmrNodes())
|
||||
.setDisableTradeBelowVersion(modelFilter.getDisableTradeBelowVersion())
|
||||
.addAllMediators(modelFilter.getMediators())
|
||||
.addAllRefundAgents(modelFilter.getRefundAgents())
|
||||
.addAllBannedSignerPubKeys(modelFilter.getBannedAccountWitnessSignerPubKeys())
|
||||
.addAllXmrFeeReceiverAddresses(modelFilter.getXmrFeeReceiverAddresses())
|
||||
.setCreationDate(modelFilter.getCreationDate())
|
||||
.setSignerPubKeyAsHex(modelFilter.getSignerPubKeyAsHex())
|
||||
.addAllBannedPrivilegedDevPubKeys(modelFilter.getBannedPrivilegedDevPubKeys())
|
||||
.setDisableAutoConf(modelFilter.isDisableAutoConf())
|
||||
.addAllBannedAutoConfExplorers(modelFilter.getBannedAutoConfExplorers())
|
||||
.addAllNodeAddressesBannedFromNetwork(modelFilter.getNodeAddressesBannedFromNetwork())
|
||||
.setDisableApi(modelFilter.isDisableApi())
|
||||
.setDisableMempoolValidation(modelFilter.isDisableMempoolValidation());
|
||||
|
||||
GetNetworkFilterReply reply = GetNetworkFilterReply.newBuilder()
|
||||
.setFilter(grpcFilter)
|
||||
.build();
|
||||
|
||||
responseObserver.onNext(reply);
|
||||
responseObserver.onCompleted();
|
||||
} catch (Throwable t) {
|
||||
exceptionHandler.handleException(log, t, responseObserver);
|
||||
}
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public void setNetworkFilter() {
|
||||
//
|
||||
// }
|
||||
|
||||
@Value
|
||||
private static class GrpcNetworkListener implements NetworkListener {
|
||||
|
||||
@NonNull
|
||||
StreamObserver<NetworkMessage> responseObserver;
|
||||
|
||||
@Override
|
||||
public void onMessage(@NonNull NetworkMessage network_message) {
|
||||
if (!((ServerCallStreamObserver<NetworkMessage>) responseObserver).isCancelled()) {
|
||||
responseObserver.onNext(network_message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
final ServerInterceptor[] interceptors() {
|
||||
Optional<ServerInterceptor> rateMeteringInterceptor = rateMeteringInterceptor();
|
||||
return rateMeteringInterceptor.map(serverInterceptor ->
|
||||
new ServerInterceptor[]{serverInterceptor}).orElseGet(() -> new ServerInterceptor[0]);
|
||||
}
|
||||
|
||||
final Optional<ServerInterceptor> rateMeteringInterceptor() {
|
||||
return getCustomRateMeteringInterceptor(coreApi.getConfig().appDataDir, this.getClass())
|
||||
.or(() -> Optional.of(CallRateMeteringInterceptor.valueOf(
|
||||
new HashMap<>() {{
|
||||
put(getRegisterNetworkListenerMethod().getFullMethodName(), new GrpcCallRateMeter(10, SECONDS));
|
||||
}}
|
||||
)));
|
||||
}
|
||||
}
|
|
@ -52,6 +52,7 @@ public class GrpcServer {
|
|||
GrpcTradesService tradesService,
|
||||
GrpcWalletsService walletsService,
|
||||
GrpcNotificationsService notificationsService,
|
||||
GrpcNetworkService networkService,
|
||||
GrpcXmrConnectionService moneroConnectionsService,
|
||||
GrpcXmrNodeService moneroNodeService) {
|
||||
this.server = ServerBuilder.forPort(config.apiPort)
|
||||
|
@ -70,6 +71,7 @@ public class GrpcServer {
|
|||
.addService(interceptForward(notificationsService, notificationsService.interceptors()))
|
||||
.addService(interceptForward(moneroConnectionsService, moneroConnectionsService.interceptors()))
|
||||
.addService(interceptForward(moneroNodeService, moneroNodeService.interceptors()))
|
||||
.addService(interceptForward(networkService, networkService.interceptors()))
|
||||
.intercept(passwordAuthInterceptor)
|
||||
.build();
|
||||
coreContext.setApiUser(true);
|
||||
|
|
|
@ -1,51 +0,0 @@
|
|||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
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
|
||||
NYeOG8Xnm4CxuWqUu0FDMv6BhkMCTz2X4xcnbtI=
|
||||
=9LRS
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
|
@ -1,50 +0,0 @@
|
|||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
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
|
||||
=AWz+
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
|
@ -1,156 +0,0 @@
|
|||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
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
|
||||
vUTpzlk=
|
||||
=ZIr3
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
|
@ -195,7 +195,6 @@ task packageInstallers {
|
|||
dependsOn 'retrieveAndExtractJavaBinaries'
|
||||
// Clean all previous artifacts and create a fresh shadowJar for the installers
|
||||
dependsOn rootProject.clean
|
||||
dependsOn ':core:havenoDeps'
|
||||
dependsOn ':desktop:shadowJar'
|
||||
|
||||
doLast {
|
||||
|
|
|
@ -166,7 +166,7 @@ public class HavenoApp extends Application implements UncaughtExceptionHandler {
|
|||
if (scene == null) {
|
||||
log.warn("Scene not available yet, we create a new scene. The bug might be caused by an exception in a constructor or by a circular dependency in Guice. throwable=" + throwable.toString());
|
||||
scene = new Scene(new StackPane(), 1000, 650);
|
||||
CssTheme.loadSceneStyles(scene, CssTheme.CSS_THEME_LIGHT, false);
|
||||
CssTheme.loadSceneStyles(scene, CssTheme.CSS_THEME_DARK, false);
|
||||
stage.setScene(scene);
|
||||
stage.show();
|
||||
}
|
||||
|
|
|
@ -399,7 +399,7 @@ public abstract class Overlay<T extends Overlay<T>> {
|
|||
|
||||
public T useReportBugButton() {
|
||||
this.closeButtonText = Res.get("shared.reportBug");
|
||||
this.closeHandlerOptional = Optional.of(() -> GUIUtil.openWebPage("https://github.com/haveno-dex/haveno/issues"));
|
||||
this.closeHandlerOptional = Optional.of(() -> GUIUtil.openWebPage("https://github.com/MoneroEcosystem/haveno/issues"));
|
||||
return cast();
|
||||
}
|
||||
|
||||
|
@ -941,7 +941,7 @@ public abstract class Overlay<T extends Overlay<T>> {
|
|||
gitHubButton.setOnAction(event -> {
|
||||
if (message != null)
|
||||
Utilities.copyToClipboard(message);
|
||||
GUIUtil.openWebPage("https://github.com/haveno-dex/haveno/issues");
|
||||
GUIUtil.openWebPage("https://github.com/MoneroEcosystem/haveno/issues");
|
||||
hide();
|
||||
});
|
||||
}
|
||||
|
|
|
@ -9,21 +9,21 @@
|
|||
-fx-text-fill: #dadada;
|
||||
|
||||
/* javafx elements */
|
||||
-fx-accent: #0b65da;
|
||||
-fx-accent: #F4511E;
|
||||
-fx-box-border: transparent;
|
||||
-fx-focus-color: #0c59bd;
|
||||
-fx-faint-focus-color: #0c59bd;
|
||||
-fx-focus-color: #F4511E;
|
||||
-fx-faint-focus-color: #F4511E;
|
||||
-fx-selection-bar: #0f87c3;
|
||||
-fx-selection-bar-non-focused: #4181d4;
|
||||
-fx-default-button: derive(-fx-accent, 95%);
|
||||
|
||||
/* haveno main colors */
|
||||
-bs-color-primary: #0b65da;
|
||||
-bs-color-primary-dark: #0c59bd;
|
||||
-bs-color-primary: #F4511E;
|
||||
-bs-color-primary-dark: #F4511E;
|
||||
-bs-text-color: white;
|
||||
-bs-background-color: black;
|
||||
-bs-background-color: #303030;
|
||||
-bs-background-gray: transparent;
|
||||
-bs-content-background-gray: black;
|
||||
-bs-content-background-gray: #303030;
|
||||
|
||||
/* fifty shades of gray */
|
||||
-bs-color-gray-13: #bbb;
|
||||
|
@ -80,10 +80,10 @@
|
|||
|
||||
/* other element styling */
|
||||
-bs-rd-nav-border: #535353;
|
||||
-bs-rd-nav-primary-border: rgba(0, 0, 0, 0);
|
||||
-bs-rd-nav-primary-border: #303030;
|
||||
-bs-rd-nav-border-color: rgba(255, 255, 255, 0.1);
|
||||
-bs-rd-nav-background: rgb(15, 15, 15);
|
||||
-bs-rd-nav-primary-background: rgb(15, 15, 15);
|
||||
-bs-rd-nav-background: #303030;
|
||||
-bs-rd-nav-primary-background: #303030;
|
||||
-bs-rd-nav-selected: black;
|
||||
-bs-rd-nav-deselected: rgba(255, 255, 255, 1);
|
||||
-bs-rd-nav-secondary-selected: -fx-accent;
|
||||
|
@ -128,7 +128,7 @@
|
|||
-bs-rd-tooltip-truncated: #afaeb0;
|
||||
|
||||
/*-bs-toggle-selected: rgb(12, 89, 189);*/
|
||||
-bs-toggle-selected: rgb(12, 89, 190);
|
||||
-bs-toggle-selected: #F4511E;
|
||||
-bs-warning: #db6300;
|
||||
-bs-buy: rgb(80, 180, 90);
|
||||
-bs-buy-focus: derive(-bs-buy, -50%);
|
||||
|
@ -578,7 +578,7 @@
|
|||
}
|
||||
|
||||
#image-logo-splash {
|
||||
-fx-image: url("../../images/logo_splash_dark.png");
|
||||
-fx-image: url("../../images/logo_splash_dark.gif");
|
||||
}
|
||||
|
||||
#image-logo-splash-testnet {
|
||||
|
|
|
@ -827,7 +827,7 @@ public class GUIUtil {
|
|||
public static boolean canCreateOrTakeOfferOrShowPopup(User user, Navigation navigation) {
|
||||
|
||||
if (!user.hasAcceptedArbitrators()) {
|
||||
log.warn("There are no arbitrators available");
|
||||
log.warn("There are no arbitrators available, this probably means your client is outdated and you need to visit https://haveno.com to download a newer version.");
|
||||
new Popup().warning(Res.get("popup.warning.noArbitratorsAvailable")).show();
|
||||
return false;
|
||||
}
|
||||
|
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 667 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 667 KiB |
BIN
desktop/src/main/resources/images/logo_splash_dark.gif
Normal file
After Width: | Height: | Size: 874 KiB |
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
|
@ -1,51 +0,0 @@
|
|||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
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
|
||||
NYeOG8Xnm4CxuWqUu0FDMv6BhkMCTz2X4xcnbtI=
|
||||
=9LRS
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
|
@ -1,50 +0,0 @@
|
|||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
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
|
||||
=AWz+
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
|
@ -1,156 +0,0 @@
|
|||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
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
|
||||
vUTpzlk=
|
||||
=ZIr3
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
33
docker/Dockerfile.core
Normal file
|
@ -0,0 +1,33 @@
|
|||
FROM openjdk:21-jdk-bullseye
|
||||
|
||||
RUN set -ex && \
|
||||
apt update && \
|
||||
apt --no-install-recommends --yes install \
|
||||
make \
|
||||
git \
|
||||
tor
|
||||
|
||||
RUN set -ex && adduser --system --group --disabled-password haveno && \
|
||||
mkdir -p /home/haveno && \
|
||||
chown -R haveno:haveno /home/haveno
|
||||
|
||||
USER haveno
|
||||
|
||||
WORKDIR /home/haveno
|
||||
|
||||
RUN set -ex && git clone https://foss.haveno.com/haveno-network/haveno-core.git
|
||||
|
||||
WORKDIR /home/haveno/haveno
|
||||
|
||||
RUN git checkout master && \
|
||||
git reset --hard
|
||||
|
||||
|
||||
RUN make clean && make skip-tests
|
||||
|
||||
WORKDIR /home/haveno/haveno
|
||||
|
||||
ENTRYPOINT [ "./haveno-seednode" ]
|
||||
|
||||
## CMDs are conditional based on type
|
||||
CMD ["--baseCurrencyNetwork=XMR_MAINNET", "--useLocalhostForP2P=false", "--useDevPrivilegeKeys=false", "--nodePort=2002"]
|
1
docker/config/nodes/haveno_seednode_3/hostname
Normal file
|
@ -0,0 +1 @@
|
|||
ajbqx4clnjlr7lmzoftuvpvmqafdiilidsgocvokx6bqj3okk56ccfqd.onion
|
BIN
docker/config/nodes/haveno_seednode_3/hs_ed25519_public_key
Normal file
3
docker/daemon/.env
Normal file
|
@ -0,0 +1,3 @@
|
|||
NETWORK_VERSION_TAG=1.1.2
|
||||
BASE_NETWORK=MAINNET
|
||||
P2P_NETWORK_VERSION="X"
|
28
docker/daemon/docker-compose.yml
Normal file
|
@ -0,0 +1,28 @@
|
|||
version: '3'
|
||||
|
||||
services:
|
||||
haveno-daemon:
|
||||
image: haveno-core
|
||||
build:
|
||||
context: ../
|
||||
ports:
|
||||
- "127.0.0.1:3201:3201"
|
||||
environment:
|
||||
- P2P_NETWORK_VERSION=X
|
||||
- NETWORK_VERSION_TAG=${NETWORK_VERSION_TAG}
|
||||
- BASE_CURRENCY_NETWORK=XMR_${BASE_NETWORK}
|
||||
- USE_LOCALHOST_FOR_P2P=false
|
||||
- USE_DEV_PRIVILEGE_KEYS=false
|
||||
- NODE_PORT=9999
|
||||
- APP_NAME=haveno-XMR_${BASE_NETWORK}_DAEMON
|
||||
- EXPORT_SHADOW=yes
|
||||
- EXPORT_SHADOW_PATH=daemon/build/libs/daemon-all.sh # Leave this blank in most cases
|
||||
entrypoint: ["./haveno-daemon"]
|
||||
command:
|
||||
- "--baseCurrencyNetwork=XMR_${BASE_NETWORK}"
|
||||
- "--useLocalhostForP2P=false"
|
||||
- "--useDevPrivilegeKeys=false"
|
||||
- "--nodePort=9999"
|
||||
- "--appName=XMR_${BASE_NETWORK}_DAEMON"
|
||||
- "--seedNodes=5i6blbmuflq4s4im6zby26a7g22oef6kyp7vbwyru6oq5e36akzo3ayd.onion:2001,dx4ktxyiemjc354imehuaswbhqlidhy62b4ifzigk5p2rb37lxqbveqd.onion:2002,ajbqx4clnjlr7lmzoftuvpvmqafdiilidsgocvokx6bqj3okk56ccfqd.onion:2003"
|
||||
restart: unless-stopped
|
2
docker/seednode/.env
Normal file
|
@ -0,0 +1,2 @@
|
|||
BASE_NETWORK=MAINNET
|
||||
P2P_NETWORK_VERSION="X"
|
79
docker/seednode/docker-compose.yml
Normal file
|
@ -0,0 +1,79 @@
|
|||
version: '3.8'
|
||||
|
||||
services:
|
||||
haveno-core:
|
||||
image: haveno-core
|
||||
build:
|
||||
context: ../
|
||||
dockerfile: Dockerfile.core
|
||||
# No ports, this one just builds the image
|
||||
entrypoint: ["true"] # No need to run
|
||||
|
||||
haveno-seednode_2001:
|
||||
image: haveno-core
|
||||
depends_on:
|
||||
- haveno-core
|
||||
ports:
|
||||
- "127.0.0.1:2001:2001"
|
||||
environment:
|
||||
- BASE_CURRENCY_NETWORK=XMR_${BASE_NETWORK}
|
||||
- USE_LOCALHOST_FOR_P2P=false
|
||||
- USE_DEV_PRIVILEGE_KEYS=false
|
||||
- NODE_PORT=2001
|
||||
- APP_NAME=haveno-XMR_${BASE_NETWORK}_Seed_2001
|
||||
entrypoint: ["./haveno-seednode"]
|
||||
command:
|
||||
- "--baseCurrencyNetwork=XMR_${BASE_NETWORK}"
|
||||
- "--useLocalhostForP2P=false"
|
||||
- "--useDevPrivilegeKeys=false"
|
||||
- "--nodePort=2001"
|
||||
- "--appName=haveno-XMR_${BASE_NETWORK}_Seed_2001"
|
||||
- "--hiddenServiceAddress=5i6blbmuflq4s4im6zby26a7g22oef6kyp7vbwyru6oq5e36akzo3ayd.onion"
|
||||
- "--seedNodes=5i6blbmuflq4s4im6zby26a7g22oef6kyp7vbwyru6oq5e36akzo3ayd.onion:2001,dx4ktxyiemjc354imehuaswbhqlidhy62b4ifzigk5p2rb37lxqbveqd.onion:2002,ajbqx4clnjlr7lmzoftuvpvmqafdiilidsgocvokx6bqj3okk56ccfqd.onion:2003"
|
||||
restart: unless-stopped
|
||||
|
||||
haveno-seednode_2002:
|
||||
image: haveno-core
|
||||
depends_on:
|
||||
- haveno-core
|
||||
ports:
|
||||
- "127.0.0.1:2002:2002"
|
||||
environment:
|
||||
- BASE_CURRENCY_NETWORK=XMR_${BASE_NETWORK}
|
||||
- USE_LOCALHOST_FOR_P2P=false
|
||||
- USE_DEV_PRIVILEGE_KEYS=false
|
||||
- NODE_PORT=2002
|
||||
- APP_NAME=haveno-XMR_${BASE_NETWORK}_Seed_2002
|
||||
entrypoint: ["./haveno-seednode"]
|
||||
command:
|
||||
- "--baseCurrencyNetwork=XMR_${BASE_NETWORK}"
|
||||
- "--useLocalhostForP2P=false"
|
||||
- "--useDevPrivilegeKeys=false"
|
||||
- "--nodePort=2002"
|
||||
- "--appName=haveno-XMR_${BASE_NETWORK}_Seed_2002"
|
||||
- "--hiddenServiceAddress=dx4ktxyiemjc354imehuaswbhqlidhy62b4ifzigk5p2rb37lxqbveqd.onion"
|
||||
- "--seedNodes=5i6blbmuflq4s4im6zby26a7g22oef6kyp7vbwyru6oq5e36akzo3ayd.onion:2001,dx4ktxyiemjc354imehuaswbhqlidhy62b4ifzigk5p2rb37lxqbveqd.onion:2002,ajbqx4clnjlr7lmzoftuvpvmqafdiilidsgocvokx6bqj3okk56ccfqd.onion:2003"
|
||||
restart: unless-stopped
|
||||
|
||||
haveno-seednode_2003:
|
||||
image: haveno-core
|
||||
depends_on:
|
||||
- haveno-core
|
||||
ports:
|
||||
- "127.0.0.1:2003:2003"
|
||||
environment:
|
||||
- BASE_CURRENCY_NETWORK=XMR_${BASE_NETWORK}
|
||||
- USE_LOCALHOST_FOR_P2P=false
|
||||
- USE_DEV_PRIVILEGE_KEYS=false
|
||||
- NODE_PORT=2003
|
||||
- APP_NAME=haveno-XMR_${BASE_NETWORK}_Seed_2003
|
||||
entrypoint: ["./haveno-seednode"]
|
||||
command:
|
||||
- "--baseCurrencyNetwork=XMR_${BASE_NETWORK}"
|
||||
- "--useLocalhostForP2P=false"
|
||||
- "--useDevPrivilegeKeys=false"
|
||||
- "--nodePort=2003"
|
||||
- "--appName=haveno-XMR_${BASE_NETWORK}_Seed_2003"
|
||||
- "--hiddenServiceAddress=ajbqx4clnjlr7lmzoftuvpvmqafdiilidsgocvokx6bqj3okk56ccfqd.onion"
|
||||
- "--seedNodes=5i6blbmuflq4s4im6zby26a7g22oef6kyp7vbwyru6oq5e36akzo3ayd.onion:2001,dx4ktxyiemjc354imehuaswbhqlidhy62b4ifzigk5p2rb37lxqbveqd.onion:2002,ajbqx4clnjlr7lmzoftuvpvmqafdiilidsgocvokx6bqj3okk56ccfqd.onion:2003"
|
||||
restart: unless-stopped
|
109
docker/torrc
Normal file
|
@ -0,0 +1,109 @@
|
|||
## Configuration file for Haveno Seednode
|
||||
##
|
||||
## Tor opens a socks proxy on port 9050 by default -- even if you don't
|
||||
## configure one below. Set "SocksPort 0" if you plan to run Tor only
|
||||
## as a relay, and not make any local application connections yourself.
|
||||
#SocksPort 9050 # Default: Bind to localhost:9050 for local connections.
|
||||
# ### SocksPort flag: OnionTrafficOnly ###
|
||||
## Tell the tor client to only connect to .onion addresses in response to SOCKS5 requests on this connection.
|
||||
## This is equivalent to NoDNSRequest, NoIPv4Traffic, NoIPv6Traffic.
|
||||
# ### SocksPort flag: ExtendedErrors ###
|
||||
## Return extended error code in the SOCKS reply. So far, the possible errors are:
|
||||
# X'F0' Onion Service Descriptor Can Not be Found
|
||||
# X'F1' Onion Service Descriptor Is Invalid
|
||||
# X'F2' Onion Service Introduction Failed
|
||||
# X'F3' Onion Service Rendezvous Failed
|
||||
# X'F4' Onion Service Missing Client Authorization
|
||||
# X'F5' Onion Service Wrong Client Authorization
|
||||
# X'F6' Onion Service Invalid Address
|
||||
# X'F7' Onion Service Introduction Timed Out
|
||||
SocksPort 9050 OnionTrafficOnly ExtendedErrors
|
||||
|
||||
## Entry policies to allow/deny SOCKS requests based on IP address.
|
||||
## First entry that matches wins. If no SocksPolicy is set, we accept
|
||||
## all (and only) requests that reach a SocksPort. Untrusted users who
|
||||
## can access your SocksPort may be able to learn about the connections
|
||||
## you make.
|
||||
SocksPolicy accept 127.0.0.1
|
||||
SocksPolicy accept6 [::1]
|
||||
SocksPolicy reject *
|
||||
|
||||
## Tor will reject application connections that use unsafe variants of the socks protocol
|
||||
## — ones that only provide an IP address, meaning the application is doing a DNS resolve first.
|
||||
## Specifically, these are socks4 and socks5 when not doing remote DNS. (Default: 0)
|
||||
#SafeSocks 1
|
||||
|
||||
## Tor will make a notice-level log entry for each connection to the Socks port indicating
|
||||
## whether the request used a safe socks protocol or an unsafe one (see above entry on SafeSocks).
|
||||
## This helps to determine whether an application using Tor is possibly leaking DNS requests. (Default: 0)
|
||||
TestSocks 1
|
||||
|
||||
## Logs go to stdout at level "notice" unless redirected by something
|
||||
## else, like one of the below lines. You can have as many Log lines as
|
||||
## you want.
|
||||
##
|
||||
## We advise using "notice" in most cases, since anything more verbose
|
||||
## may provide sensitive information to an attacker who obtains the logs.
|
||||
##
|
||||
## Send all messages of level 'notice' or higher to /var/log/tor/notices.log
|
||||
#Log notice file /var/log/tor/notices.log
|
||||
## Send every possible message to /var/log/tor/debug.log
|
||||
#Log debug file /var/log/tor/debug.log
|
||||
## Use the system log instead of Tor's logfiles (This is default)
|
||||
#Log notice syslog
|
||||
## To send all messages to stderr:
|
||||
#Log debug stderr
|
||||
|
||||
# Try to write to disk less frequently than we would otherwise. This is useful when running on flash memory.
|
||||
AvoidDiskWrites 1
|
||||
|
||||
HiddenServiceStatistics 0
|
||||
|
||||
## Compute the hash of a password with "tor --hash-password password".
|
||||
HashedControlPassword 16:872860B76453A77D60CA2BB8C1A7042072093276A3D701AD684053EC4C
|
||||
#CookieAuthentication 0 # (Default: 1)
|
||||
|
||||
## MetricsPort provides an interface to the underlying Tor relay metrics.
|
||||
## Exposing publicly is dangerous, set a very strict access policy.
|
||||
## Retrieve the metrics with: curl http://127.0.0.1:9035/metrics
|
||||
MetricsPort 127.0.0.1:9035
|
||||
MetricsPortPolicy accept 127.0.0.1
|
||||
MetricsPortPolicy accept [::1]
|
||||
|
||||
HiddenServiceDir /var/lib/tor/haveno_seednode_2001
|
||||
HiddenServicePort 2001 127.0.0.1:2001
|
||||
HiddenServicePort 2001 [::1]:2001
|
||||
HiddenServiceEnableIntroDoSDefense 1
|
||||
HiddenServicePoWDefensesEnabled 1
|
||||
HiddenServicePoWQueueRate 50 # (Default: 250)
|
||||
HiddenServicePoWQueueBurst 250 # (Default: 2500)
|
||||
HiddenServiceMaxStreams 25
|
||||
|
||||
|
||||
HiddenServiceDir /var/lib/tor/haveno_seednode_2002
|
||||
HiddenServicePort 2002 127.0.0.1:2002
|
||||
HiddenServicePort 2002 [::1]:2002
|
||||
HiddenServiceEnableIntroDoSDefense 1
|
||||
#HiddenServiceEnableIntroDoSRatePerSec 25 # (Default: 25)
|
||||
#HiddenServiceEnableIntroDoSBurstPerSec 200 # (Default: 200)
|
||||
HiddenServicePoWDefensesEnabled 1
|
||||
HiddenServicePoWQueueRate 50 # (Default: 250)
|
||||
HiddenServicePoWQueueBurst 250 # (Default: 2500)
|
||||
HiddenServiceMaxStreams 25
|
||||
#HiddenServiceMaxStreamsCloseCircuit 1
|
||||
|
||||
|
||||
HiddenServiceDir /var/lib/tor/haveno_seednode_2003
|
||||
HiddenServicePort 2003 127.0.0.1:2003
|
||||
HiddenServicePort 2003 [::1]:2003
|
||||
HiddenServiceEnableIntroDoSDefense 1
|
||||
#HiddenServiceEnableIntroDoSRatePerSec 25 # (Default: 25)
|
||||
#HiddenServiceEnableIntroDoSBurstPerSec 200 # (Default: 200)
|
||||
#HiddenServiceNumIntroductionPoints 3 # (Default: 3)
|
||||
HiddenServicePoWDefensesEnabled 1
|
||||
HiddenServicePoWQueueRate 50 # (Default: 250)
|
||||
HiddenServicePoWQueueBurst 250 # (Default: 2500)
|
||||
HiddenServiceMaxStreams 25
|
||||
#HiddenServiceMaxStreamsCloseCircuit 1
|
||||
|
||||
LongLivedPorts 2001,2002,2003
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
Thanks for wishing to help! Here there are some guidelines and information about the development process. We suggest you to join the [matrix](https://app.element.io/#/room/#haveno-development:monero.social) room `#haveno-development` (relayed on [IRC/Libera](irc://irc.libera.chat/#haveno-development)) and have a chat with the devs, so that we can help get you started.
|
||||
|
||||
Issues are tracked on GitHub. We use [a label system](https://github.com/haveno-dex/haveno/issues/50) and GitHub's [project boards](https://github.com/haveno-dex/haveno/projects) to simplify development. Make sure to take a look at those and to follow the priorities suggested.
|
||||
Issues are tracked on GitHub. We use [a label system](https://github.com/MoneroEcosystem/haveno/issues/50) and GitHub's [project boards](https://github.com/MoneroEcosystem/haveno/projects) to simplify development. Make sure to take a look at those and to follow the priorities suggested.
|
||||
|
||||
## General guidelines
|
||||
|
||||
|
|
|
@ -7,7 +7,7 @@ For a more robust and decentralized deployment to VPS for reliable uptime, see t
|
|||
## Clone and build Haveno
|
||||
|
||||
```
|
||||
git clone https://github.com/haveno-dex/haveno.git
|
||||
git clone https://github.com/MoneroEcosystem/haveno.git
|
||||
cd haveno
|
||||
git checkout master
|
||||
make clean && make
|
||||
|
@ -39,17 +39,17 @@ For demonstration, we can use the first generated public/private keypair for all
|
|||
|
||||
Hardcode the public key(s) in these files:
|
||||
|
||||
- [AlertManager.java](https://github.com/haveno-dex/haveno/blob/1bf83ecb8baa06b6bfcc30720f165f20b8f77025/core/src/main/java/haveno/core/alert/AlertManager.java#L111)
|
||||
- [ArbitratorManager.java](https://github.com/haveno-dex/haveno/blob/1bf83ecb8baa06b6bfcc30720f165f20b8f77025/core/src/main/java/haveno/core/support/dispute/arbitration/arbitrator/ArbitratorManager.java#L81)
|
||||
- [FilterManager.java](https://github.com/haveno-dex/haveno/blob/1bf83ecb8baa06b6bfcc30720f165f20b8f77025/core/src/main/java/haveno/core/filter/FilterManager.java#L117)
|
||||
- [PrivateNotificationManager.java](https://github.com/haveno-dex/haveno/blob/mainnet_placeholders/core/src/main/java/haveno/core/alert/PrivateNotificationManager.java#L110)
|
||||
- [AlertManager.java](https://github.com/MoneroEcosystem/haveno/blob/1bf83ecb8baa06b6bfcc30720f165f20b8f77025/core/src/main/java/haveno/core/alert/AlertManager.java#L111)
|
||||
- [ArbitratorManager.java](https://github.com/MoneroEcosystem/haveno/blob/1bf83ecb8baa06b6bfcc30720f165f20b8f77025/core/src/main/java/haveno/core/support/dispute/arbitration/arbitrator/ArbitratorManager.java#L81)
|
||||
- [FilterManager.java](https://github.com/MoneroEcosystem/haveno/blob/1bf83ecb8baa06b6bfcc30720f165f20b8f77025/core/src/main/java/haveno/core/filter/FilterManager.java#L117)
|
||||
- [PrivateNotificationManager.java](https://github.com/MoneroEcosystem/haveno/blob/mainnet_placeholders/core/src/main/java/haveno/core/alert/PrivateNotificationManager.java#L110)
|
||||
|
||||
## Change the default folder name for Haveno application data
|
||||
|
||||
To avoid user data corruption when using multiple Haveno networks, change the default folder name for Haveno's application data on your network:
|
||||
|
||||
- Change `DEFAULT_APP_NAME` in [HavenoExecutable.java](https://github.com/haveno-dex/haveno/blob/64acf86fbea069b0ae9f9bce086f8ecce1e91b87/core/src/main/java/haveno/core/app/HavenoExecutable.java#L85).
|
||||
- Change `appName` throughout the [Makefile](https://github.com/haveno-dex/haveno/blob/64acf86fbea069b0ae9f9bce086f8ecce1e91b87/Makefile#L479) accordingly.
|
||||
- Change `DEFAULT_APP_NAME` in [HavenoExecutable.java](https://github.com/MoneroEcosystem/haveno/blob/64acf86fbea069b0ae9f9bce086f8ecce1e91b87/core/src/main/java/haveno/core/app/HavenoExecutable.java#L85).
|
||||
- Change `appName` throughout the [Makefile](https://github.com/MoneroEcosystem/haveno/blob/64acf86fbea069b0ae9f9bce086f8ecce1e91b87/Makefile#L479) accordingly.
|
||||
|
||||
For example, change "Haveno" to "HavenoX", which will use this application folder:
|
||||
|
||||
|
@ -59,7 +59,7 @@ For example, change "Haveno" to "HavenoX", which will use this application folde
|
|||
|
||||
## Change the P2P network version
|
||||
|
||||
To avoid interference with other networks, change `P2P_NETWORK_VERSION` in [Version.java](https://github.com/haveno-dex/haveno/blob/a7e90395d24ec3d33262dd5d09c5faec61651a51/common/src/main/java/haveno/common/app/Version.java#L83).
|
||||
To avoid interference with other networks, change `P2P_NETWORK_VERSION` in [Version.java](https://github.com/MoneroEcosystem/haveno/blob/a7e90395d24ec3d33262dd5d09c5faec61651a51/common/src/main/java/haveno/common/app/Version.java#L83).
|
||||
|
||||
For example, change it to `"B"`.
|
||||
|
||||
|
@ -114,9 +114,9 @@ Otherwise set `ARBITRATOR_ASSIGNS_TRADE_FEE_ADDRESS` to `false` and set the XMR
|
|||
|
||||
### Optionally start a price node
|
||||
|
||||
The price node is separated from Haveno and is run as a standalone service. To deploy a pricenode on both TOR and clearnet, see the instructions on the repository: https://github.com/haveno-dex/haveno-pricenode.
|
||||
The price node is separated from Haveno and is run as a standalone service. To deploy a pricenode on both TOR and clearnet, see the instructions on the repository: https://github.com/MoneroEcosystem/haveno-pricenode.
|
||||
|
||||
After the price node is built and deployed, add the price node to `DEFAULT_NODES` in [ProvidersRepository.java](https://github.com/haveno-dex/haveno/blob/3cdd88b56915c7f8afd4f1a39e6c1197c2665d63/core/src/main/java/haveno/core/provider/ProvidersRepository.java#L50).
|
||||
After the price node is built and deployed, add the price node to `DEFAULT_NODES` in [ProvidersRepository.java](https://github.com/MoneroEcosystem/haveno/blob/3cdd88b56915c7f8afd4f1a39e6c1197c2665d63/core/src/main/java/haveno/core/provider/ProvidersRepository.java#L50).
|
||||
|
||||
### Update the download URL
|
||||
|
||||
|
@ -124,7 +124,7 @@ Change every instance of `https://haveno.exchange/downloads` to your download UR
|
|||
|
||||
## Review all local changes
|
||||
|
||||
For comparison, placeholders to run on mainnet are marked [here on this branch](https://github.com/haveno-dex/haveno/tree/mainnet_placeholders).
|
||||
For comparison, placeholders to run on mainnet are marked [here on this branch](https://github.com/MoneroEcosystem/haveno/tree/mainnet_placeholders).
|
||||
|
||||
## Start users for testing
|
||||
|
||||
|
@ -155,8 +155,8 @@ However a [more robust VPS setup](./deployment-guide.md) should be used for actu
|
|||
|
||||
## Build the installers for distribution
|
||||
|
||||
To build the installers for distribution, first change `XMR_STAGENET` to `XMR_MAINNET` in [package.gradle](https://github.com/haveno-dex/haveno/blob/1bf83ecb8baa06b6bfcc30720f165f20b8f77025/desktop/package/package.gradle#L278).
|
||||
To build the installers for distribution, first change `XMR_STAGENET` to `XMR_MAINNET` in [package.gradle](https://github.com/MoneroEcosystem/haveno/blob/1bf83ecb8baa06b6bfcc30720f165f20b8f77025/desktop/package/package.gradle#L278).
|
||||
|
||||
Then [follow instructions](https://github.com/haveno-dex/haveno/blob/master/desktop/package/README.md) to build the installers for distribution.
|
||||
Then [follow instructions](https://github.com/MoneroEcosystem/haveno/blob/master/desktop/package/README.md) to build the installers for distribution.
|
||||
|
||||
Alternatively, the installers are built automatically by GitHub.
|
|
@ -8,7 +8,7 @@ This document is a guide for Haveno development.
|
|||
|
||||
## Run the UI proof of concept
|
||||
|
||||
Follow [instructions](https://github.com/haveno-dex/haveno-ui-poc) to run Haveno's UI proof of concept in a browser.
|
||||
Follow [instructions](https://github.com/MoneroEcosystem/haveno-ui-poc) to run Haveno's UI proof of concept in a browser.
|
||||
|
||||
This proof of concept demonstrates using Haveno's gRPC server with a web frontend (react and typescript) instead of Haveno's JFX application.
|
||||
|
||||
|
@ -20,19 +20,19 @@ Otherwise follow [instructions](import-haveno.md) to import Haveno into a Eclips
|
|||
|
||||
## Run end-to-end API tests
|
||||
|
||||
Follow [instructions](https://github.com/haveno-dex/haveno-ts#run-tests) to run end-to-end API tests in the UI project.
|
||||
Follow [instructions](https://github.com/MoneroEcosystem/haveno-ts#run-tests) to run end-to-end API tests in the UI project.
|
||||
|
||||
## Add new API functions and tests
|
||||
|
||||
1. Follow [instructions](https://github.com/haveno-dex/haveno-ts#run-tests) to run Haveno's existing API tests successfully.
|
||||
1. Follow [instructions](https://github.com/MoneroEcosystem/haveno-ts#run-tests) to run Haveno's existing API tests successfully.
|
||||
2. Define the new service or message in Haveno's [protobuf definition](../proto/src/main/proto/grpc.proto).
|
||||
3. Clean and build Haveno after modifying the protobuf definition: `make clean && make`
|
||||
4. Implement the new service in Haveno's backend, following existing patterns.<br>
|
||||
For example, the gRPC function to get offers is implemented by [`GrpcServer`](https://github.com/haveno-dex/haveno/blob/master/daemon/src/main/java/haveno/daemon/grpc/GrpcServer.java) > [`GrpcOffersService.getOffers(...)`](https://github.com/haveno-dex/haveno/blob/060d9fa4f138ca07f596386972265782e5ec7b7a/daemon/src/main/java/haveno/daemon/grpc/GrpcOffersService.java#L102) > [`CoreApi.getOffers(...)`](https://github.com/haveno-dex/haveno/blob/060d9fa4f138ca07f596386972265782e5ec7b7a/core/src/main/java/haveno/core/api/CoreApi.java#L403) > [`CoreOffersService.getOffers(...)`](https://github.com/haveno-dex/haveno/blob/060d9fa4f138ca07f596386972265782e5ec7b7a/core/src/main/java/haveno/core/api/CoreOffersService.java#L131) > [`OfferBookService.getOffers()`](https://github.com/haveno-dex/haveno/blob/060d9fa4f138ca07f596386972265782e5ec7b7a/core/src/main/java/haveno/core/offer/OfferBookService.java#L248).
|
||||
For example, the gRPC function to get offers is implemented by [`GrpcServer`](https://github.com/MoneroEcosystem/haveno/blob/master/daemon/src/main/java/haveno/daemon/grpc/GrpcServer.java) > [`GrpcOffersService.getOffers(...)`](https://github.com/MoneroEcosystem/haveno/blob/060d9fa4f138ca07f596386972265782e5ec7b7a/daemon/src/main/java/haveno/daemon/grpc/GrpcOffersService.java#L102) > [`CoreApi.getOffers(...)`](https://github.com/MoneroEcosystem/haveno/blob/060d9fa4f138ca07f596386972265782e5ec7b7a/core/src/main/java/haveno/core/api/CoreApi.java#L403) > [`CoreOffersService.getOffers(...)`](https://github.com/MoneroEcosystem/haveno/blob/060d9fa4f138ca07f596386972265782e5ec7b7a/core/src/main/java/haveno/core/api/CoreOffersService.java#L131) > [`OfferBookService.getOffers()`](https://github.com/MoneroEcosystem/haveno/blob/060d9fa4f138ca07f596386972265782e5ec7b7a/core/src/main/java/haveno/core/offer/OfferBookService.java#L248).
|
||||
5. Build Haveno: `make`
|
||||
6. Update the gRPC client in haveno-ts: `npm install`
|
||||
7. Add the corresponding typescript method(s) to [HavenoClient.ts](https://github.com/haveno-dex/haveno-ts/blob/master/src/HavenoClient.ts) with clear and concise documentation.
|
||||
8. Add clean and comprehensive tests to [HavenoClient.test.ts](https://github.com/haveno-dex/haveno-ts/blob/master/src/HavenoClient.test.ts), following existing patterns.
|
||||
7. Add the corresponding typescript method(s) to [HavenoClient.ts](https://github.com/MoneroEcosystem/haveno-ts/blob/master/src/HavenoClient.ts) with clear and concise documentation.
|
||||
8. Add clean and comprehensive tests to [HavenoClient.test.ts](https://github.com/MoneroEcosystem/haveno-ts/blob/master/src/HavenoClient.test.ts), following existing patterns.
|
||||
9. Run the tests with `npm run test -- -t 'my test'` to run tests by name and `npm test` to run all tests together. Ensure all tests pass and there are no exception stacktraces in the terminals of Alice, Bob, or the arbitrator.
|
||||
10. Open pull requests to the haveno and haveno-ts projects for the backend and frontend implementations.
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ Restart the terminal for the changes to take effect.
|
|||
If it's the first time you are building Haveno, run the following commands to download the repository, the needed dependencies, and build the latest release. If using a third party network, replace the repository URL with theirs:
|
||||
|
||||
```
|
||||
git clone https://github.com/haveno-dex/haveno.git
|
||||
git clone https://github.com/MoneroEcosystem/haveno.git
|
||||
cd haveno
|
||||
git checkout master
|
||||
make
|
||||
|
@ -107,7 +107,7 @@ If you don't use *screen* or *tmux*, open 4 terminal windows and run in each one
|
|||
2. `make user1-desktop-local` or if you want to run user1 as a daemon: `make user1-daemon-local`
|
||||
3. `make user2-desktop-local` or if you want to run user2 as a daemon: `make user2-daemon-local`
|
||||
4. `make arbitrator-desktop-local` or if you want to run arbitrator as a daemon: `make arbitrator-daemon-local`
|
||||
5. Optionally run a [local price node](https://github.com/haveno-dex/haveno-pricenode/blob/main/README.md)
|
||||
5. Optionally run a [local price node](https://github.com/MoneroEcosystem/haveno-pricenode/blob/main/README.md)
|
||||
|
||||
If this is the first time launching the arbitrator desktop application, register the arbitrator after the interface opens. Go to the *Account* tab and press `cmd+r`. Confirm the registration of the arbitrator.
|
||||
|
||||
|
|
|
@ -1,65 +0,0 @@
|
|||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
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
|
||||
=4SFl
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
|
@ -413,6 +413,24 @@ public final class PeerManager implements ConnectionListener, PersistedDataHost
|
|||
return latestLivePeers;
|
||||
}
|
||||
|
||||
public Set<Peer> getLiveSeedNodePeers() {
|
||||
int oldNumLatestLivePeers = latestLivePeers.size();
|
||||
|
||||
Set<Peer> currentLiveSeedNodePeers = getConnectedReportedPeers().stream()
|
||||
.filter(e -> isSeedNode(e))
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
long maxAge = new Date().getTime() - MAX_AGE_LIVE_PEERS;
|
||||
latestLivePeers.clear();
|
||||
Set<Peer> latestLiveSeedNodePeers = currentLiveSeedNodePeers.stream()
|
||||
.filter(peer -> peer.getDateAsLong() > maxAge)
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
if (oldNumLatestLivePeers != latestLiveSeedNodePeers.size())
|
||||
log.info("Num of latestLiveSeedNodePeers={}", latestLiveSeedNodePeers.size());
|
||||
return latestLivePeers;
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Capabilities
|
||||
|
@ -731,6 +749,10 @@ public final class PeerManager implements ConnectionListener, PersistedDataHost
|
|||
return maxConnections;
|
||||
}
|
||||
|
||||
public Set<NodeAddress> getSeedNodeAddresses() {
|
||||
return new HashSet<>(seedNodeAddresses);
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Listeners
|
||||
|
|
|
@ -278,6 +278,8 @@ message NotificationMessage {
|
|||
KEEP_ALIVE = 2;
|
||||
TRADE_UPDATE = 3;
|
||||
CHAT_MESSAGE = 4;
|
||||
OFFER_UPDATE = 5;
|
||||
MARKET_UPDATE = 6;
|
||||
}
|
||||
|
||||
string id = 1;
|
||||
|
@ -1124,3 +1126,300 @@ message AddressBalanceInfo {
|
|||
int64 num_confirmations = 3;
|
||||
bool is_address_unused = 4;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Network
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
service Network {
|
||||
rpc GetOnlinePeers (GetOnlinePeersRequest) returns (GetOnlinePeersReply) {
|
||||
}
|
||||
rpc GetSeednodes (GetSeednodesRequest) returns (GetSeednodesReply) {
|
||||
}
|
||||
rpc GetRegisteredArbitrators (GetRegisteredArbitratorsRequest) returns (GetRegisteredArbitratorsReply) {
|
||||
}
|
||||
rpc GetNetworkFilter (GetNetworkFilterRequest) returns (GetNetworkFilterReply) {
|
||||
}
|
||||
rpc SetNetworkFilter (SetNetworkFilterRequest) returns (SetNetworkFilterReply) {
|
||||
}
|
||||
rpc GetAlerts (GetAlertsRequest) returns (GetAlertsRequest) {
|
||||
}
|
||||
rpc RegisterNetworkListener (RegisterNetworkListenerRequest) returns (stream NetworkMessage) {
|
||||
}
|
||||
}
|
||||
|
||||
message RegisterNetworkListenerRequest {
|
||||
}
|
||||
|
||||
message NetworkMessage {
|
||||
NetworkEnvelope network_envelope = 1;
|
||||
}
|
||||
|
||||
message PeerInfo {
|
||||
enum Capability {
|
||||
SEED_NODE = 0;
|
||||
MEDIATION = 1;
|
||||
SIGNED_ACCOUNT_AGE_WITNESS = 2;
|
||||
REFUND_AGENT = 3;
|
||||
TRADE_STATISTICS_HASH_UPDATE = 4;
|
||||
NO_ADDRESS_PRE_FIX = 5;
|
||||
TRADE_STATISTICS_3 = 6;
|
||||
}
|
||||
|
||||
string node_address = 1;
|
||||
repeated Capability capabilities = 2;
|
||||
}
|
||||
|
||||
message GetOnlinePeersRequest {}
|
||||
|
||||
message GetOnlinePeersReply {
|
||||
repeated PeerInfo peers = 1;
|
||||
}
|
||||
|
||||
message GetSeednodesRequest {}
|
||||
|
||||
message GetSeednodesReply {
|
||||
repeated PeerInfo peers = 1;
|
||||
}
|
||||
|
||||
message GetRegisteredArbitratorsRequest {}
|
||||
|
||||
message GetRegisteredArbitratorsReply {
|
||||
repeated Arbitrator arbitrators = 1;
|
||||
}
|
||||
|
||||
message GetNetworkFilterRequest {}
|
||||
|
||||
message GetNetworkFilterReply {
|
||||
Filter filter = 1;
|
||||
}
|
||||
|
||||
message SetNetworkFilterRequest {
|
||||
string signature = 1;
|
||||
repeated string bannedOffers = 2;
|
||||
repeated string bannedNetworkAddresses = 3;
|
||||
repeated string bannedTradingAccountData = 4;
|
||||
repeated string bannedCurrencyCodes = 5;
|
||||
repeated string bannedTradingMethods = 6;
|
||||
repeated string bannedAccountWitenessSignerPubKeys = 7;
|
||||
repeated string bannedArbitratorAddresses = 8;
|
||||
repeated string bannedRefundAgentAddresses = 10;
|
||||
repeated string bannedXmrFeeReceiverAddresses = 11;
|
||||
repeated string bannedSeedNodeAddresses = 12;
|
||||
repeated string bannedPriceRelayNodeAddresses = 13;
|
||||
repeated string bannedMoneroNodeAddresses = 14;
|
||||
bool banPublicMoneroNetwork = 15;
|
||||
bool disableAutoConfirm = 16;
|
||||
repeated string minVersionRequiredForTrading = 17;
|
||||
repeated string bannedPrivilegedDevPubKeys = 18;
|
||||
repeated string bannedAutoConfirmExplorers = 19;
|
||||
bool disableMempoolValidation = 20;
|
||||
bool disableApi = 21;
|
||||
}
|
||||
|
||||
message SetNetworkFilterReply {
|
||||
}
|
||||
|
||||
message GetAlertsRequest {}
|
||||
|
||||
message GetAlertsReply {
|
||||
repeated Alert alerts = 1;
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Marketplace Protospec
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Orders
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
service Orders {
|
||||
rpc GetOrder (GetOrderRequest) returns (GetOrderReply) {
|
||||
}
|
||||
rpc GetOrders (GetOrdersRequest) returns (GetOrdersReply) {
|
||||
}
|
||||
rpc MakeOrder (MakeOrderRequest) returns (MakeOrderReply) {
|
||||
}
|
||||
rpc ConfirmOrderAccepted (ConfirmOrderAcceptedRequest) returns (ConfirmOrderAcceptedReply) {
|
||||
}
|
||||
rpc ConfirmOrderProcessing (ConfirmOrderProcessingRequest) returns (ConfirmOrderProcessingReply) {
|
||||
}
|
||||
rpc ConfirmOrderShipped (ConfirmOrderShippedRequest) returns (ConfirmOrderShippedReply) {
|
||||
}
|
||||
rpc FinalizeOrder (FinalizeOrderRequest) returns (FinalizeOrderReply) {
|
||||
}
|
||||
rpc GetChatMessages (GetChatMessagesRequest) returns (GetChatMessagesReply) {
|
||||
}
|
||||
rpc SendChatMessage (SendChatMessageRequest) returns (SendChatMessageReply) {
|
||||
}
|
||||
}
|
||||
|
||||
message GetMyOrderRequest {
|
||||
string id = 1;
|
||||
}
|
||||
|
||||
message GetMyOrderReply {
|
||||
OrderInfo order = 1;
|
||||
}
|
||||
|
||||
message GetOrdersRequest {
|
||||
string direction = 1;
|
||||
string currency_code = 2;
|
||||
}
|
||||
|
||||
message GetOrdersReply {
|
||||
repeated OfferInfo orders = 1;
|
||||
}
|
||||
|
||||
message GetMyOrdersRequest {
|
||||
}
|
||||
|
||||
message GetMyOrdersReply {
|
||||
repeated OfferInfo orders = 1;
|
||||
}
|
||||
|
||||
message MakeOrderRequest {
|
||||
string currency_code = 1;
|
||||
string direction = 2;
|
||||
string price = 3;
|
||||
bool use_market_based_price = 4;
|
||||
double market_price_margin_pct = 5;
|
||||
uint64 amount = 6 [jstype = JS_STRING];
|
||||
uint64 min_amount = 7 [jstype = JS_STRING];
|
||||
double security_deposit_pct = 8;
|
||||
string trigger_price = 9;
|
||||
bool reserve_exact_amount = 10;
|
||||
string payment_account_id = 11;
|
||||
bool is_private_order = 12;
|
||||
bool buyer_as_taker_without_deposit = 13;
|
||||
string extra_info = 14;
|
||||
string source_order_id = 15;
|
||||
}
|
||||
|
||||
message MakeOrderReply {
|
||||
OrderInfo order = 1;
|
||||
}
|
||||
|
||||
message CancelOrderRequest {
|
||||
string id = 1;
|
||||
}
|
||||
|
||||
message CancelOrderReply {
|
||||
}
|
||||
|
||||
message ConfirmOrderAcceptedRequest {
|
||||
string id = 1;
|
||||
}
|
||||
|
||||
message ConfirmOrderAcceptedReply {
|
||||
OrderInfo offer = 1;
|
||||
}
|
||||
|
||||
message ConfirmOrderProcessingRequest {
|
||||
string id = 1;
|
||||
}
|
||||
|
||||
message ConfirmOrderProcessingReply {
|
||||
OrderInfo order = 1;
|
||||
}
|
||||
|
||||
message ConfirmOrderShippedRequest {
|
||||
string id = 1;
|
||||
}
|
||||
|
||||
message ConfirmOrderShippedReply {
|
||||
OrderInfo order = 1;
|
||||
}
|
||||
|
||||
message FinalizeOrderRequest {
|
||||
string id = 1;
|
||||
}
|
||||
|
||||
message FinalizeOrderReply {
|
||||
OrderInfo order = 1;
|
||||
}
|
||||
|
||||
message OrderInfo {
|
||||
string id = 1;
|
||||
string category = 2;
|
||||
string purchase_price = 3;
|
||||
bool use_market_based_price = 4;
|
||||
double market_price_margin_pct = 5;
|
||||
uint64 amount = 6 [jstype = JS_STRING];
|
||||
uint64 quantity = 7 [jstype = JS_STRING];
|
||||
double buyer_fee_pct = 8;
|
||||
double seller_fee_pct = 9;
|
||||
double penalty_fee_pct = 10;
|
||||
double buyer_security_deposit_pct = 11;
|
||||
double seller_security_deposit_pct = 12;
|
||||
string max_purchase_quantity = 13;
|
||||
ShippingOptionInfo shipping_option = 14;
|
||||
string trigger_price = 15;
|
||||
string payment_account_id = 16;
|
||||
string payment_method_id = 17;
|
||||
string payment_method_short_name = 18;
|
||||
string base_currency_code = 19;
|
||||
string seller_public_key = 20;
|
||||
uint64 date = 21;
|
||||
string state = 22;
|
||||
bool is_activated = 23;
|
||||
bool is_my_order = 24;
|
||||
string store_node_address = 25;
|
||||
string pub_key_ring = 26;
|
||||
string version_nr = 27;
|
||||
int32 protocol_version = 28;
|
||||
string arbitrator_signer = 29;
|
||||
string split_output_tx_hash = 30;
|
||||
uint64 split_output_tx_fee = 31 [jstype = JS_STRING];
|
||||
bool is_private_order = 32;
|
||||
string challenge = 33;
|
||||
string extra_info = 34;
|
||||
}
|
||||
|
||||
message GetOrderRequest {
|
||||
string id = 1;
|
||||
}
|
||||
|
||||
message GetOrderReply {
|
||||
OrderInfo order = 1;
|
||||
}
|
||||
|
||||
message ShippingOptionInfo {
|
||||
string id = 1;
|
||||
string label = 2;
|
||||
string price = 3;
|
||||
StoreInfo store = 4;
|
||||
}
|
||||
|
||||
message GetShippingOptionRequest {
|
||||
string id = 1;
|
||||
}
|
||||
|
||||
message GetShippingOptionReply {
|
||||
ShippingOptionInfo shipping_option = 1;
|
||||
}
|
||||
|
||||
message StoreInfo {
|
||||
string id = 1;
|
||||
string label = 2;
|
||||
string name = 3;
|
||||
bool is_active = 4;
|
||||
double cost = 5;
|
||||
uint64 estimated_days = 6 [jstype = JS_STRING];
|
||||
uint64 quantity = 7 [jstype = JS_STRING];
|
||||
StoreInfo store = 8;
|
||||
}
|
||||
|
||||
message GetStoreRequest {
|
||||
string store_id = 1;
|
||||
}
|
||||
|
||||
message GetStoreReply {
|
||||
StoreInfo store = 1;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Products
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
|
@ -15,7 +15,7 @@
|
|||
#### In `dispXXXX` AppVM:
|
||||
##### Clone repository
|
||||
```shell
|
||||
% git clone --depth=1 https://github.com/haveno-dex/haveno
|
||||
% git clone --depth=1 https://github.com/MoneroEcosystem/haveno
|
||||
```
|
||||
|
||||
---
|
||||
|
@ -233,7 +233,7 @@ $ printf 'haveno-Haveno.desktop' | qvm-appmenus --set-whitelist – haveno
|
|||
<p style="text-align: center;">Example:</p>
|
||||
|
||||
```shell
|
||||
% bash haveno/scripts/install_qubes/scripts/1-TemplateVM/1.0-haveno-templatevm.sh "https://download.bell-sw.com/java/21.0.6+10/bellsoft-jdk21.0.6+10-linux-amd64.deb" "a5e3fd9f5323de5fc188180c91e0caa777863b5b" "https://github.com/haveno-dex/haveno"
|
||||
% bash haveno/scripts/install_qubes/scripts/1-TemplateVM/1.0-haveno-templatevm.sh "https://download.bell-sw.com/java/21.0.6+10/bellsoft-jdk21.0.6+10-linux-amd64.deb" "a5e3fd9f5323de5fc188180c91e0caa777863b5b" "https://github.com/MoneroEcosystem/haveno"
|
||||
```
|
||||
+ Upon Successful Compilation & Packaging, A `Filecopy` Confirmation Will Be Presented
|
||||
|
||||
|
|
|
@ -26,4 +26,4 @@ WORKDIR /home/haveno/haveno
|
|||
|
||||
ENTRYPOINT [ "./haveno-seednode" ]
|
||||
|
||||
CMD ["--baseCurrencyNetwork=XMR_STAGENET", "--useLocalhostForP2P=false", "--useDevPrivilegeKeys=false", "--nodePort=2002", "--appName=haveno-XMR_STAGENET_Seed_2002" ]
|
||||
CMD ["--baseCurrencyNetwork=XMR_MAINNET", "--useLocalhostForP2P=false", "--useDevPrivilegeKeys=false", "--nodePort=2002", "--appName=haveno-XMR_STAGENET_Seed_2002" ]
|
||||
|
|
|
@ -12,5 +12,6 @@ include 'seednode'
|
|||
include 'statsnode'
|
||||
include 'inventory'
|
||||
include 'apitest'
|
||||
//include 'bot'
|
||||
|
||||
rootProject.name = 'haveno'
|
||||
|
|