Copy disabled (too large)
Download .txt
Showing preview only (15,412K chars total). Download the full file to get everything.
Repository: retoaccess1/haveno-reto
Branch: master
Commit: db6c0f7238d9
Files: 1890
Total size: 13.8 MB
Directory structure:
gitextract_ersdwbkw/
├── .editorconfig
├── .gitattributes
├── .github/
│ ├── CODEOWNERS
│ └── workflows/
│ ├── build.yml
│ ├── codacy-code-reporter.yml
│ ├── codeql-analysis.yml
│ └── label.yml
├── .gitignore
├── LICENSE
├── Makefile
├── README.md
├── apitest/
│ ├── scripts/
│ │ ├── editf2faccountform.py
│ │ ├── get-haveno-pid.sh
│ │ ├── limit-order-simulation.sh
│ │ ├── mainnet-test.sh
│ │ ├── rolling-offer-simulation.sh
│ │ ├── trade-simulation-env.sh
│ │ ├── trade-simulation-utils.sh
│ │ ├── trade-simulation.sh
│ │ ├── trade-xmr-simulation.sh
│ │ └── version-parser.bash
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── haveno/
│ │ │ └── apitest/
│ │ │ ├── ApiTestMain.java
│ │ │ ├── Scaffold.java
│ │ │ ├── SetupTask.java
│ │ │ ├── SmokeTestBashCommand.java
│ │ │ ├── SmokeTestBitcoind.java
│ │ │ ├── config/
│ │ │ │ ├── ApiTestConfig.java
│ │ │ │ ├── ApiTestRateMeterInterceptorConfig.java
│ │ │ │ └── HavenoAppConfig.java
│ │ │ └── linux/
│ │ │ ├── AbstractLinuxProcess.java
│ │ │ ├── BashCommand.java
│ │ │ ├── BitcoinCli.java
│ │ │ ├── BitcoinDaemon.java
│ │ │ ├── HavenoProcess.java
│ │ │ ├── LinuxProcess.java
│ │ │ ├── SystemCommandExecutor.java
│ │ │ └── ThreadedStreamHandler.java
│ │ └── resources/
│ │ ├── apitest.properties
│ │ ├── blocknotify
│ │ ├── haveno.properties
│ │ └── logback.xml
│ └── test/
│ ├── java/
│ │ └── haveno/
│ │ └── apitest/
│ │ ├── ApiTestCase.java
│ │ ├── method/
│ │ │ ├── BitcoinCliHelper.java
│ │ │ ├── CallRateMeteringInterceptorTest.java
│ │ │ ├── GetMethodHelpTest.java
│ │ │ ├── GetVersionTest.java
│ │ │ ├── MethodTest.java
│ │ │ ├── RegisterDisputeAgentsTest.java
│ │ │ ├── offer/
│ │ │ │ ├── AbstractOfferTest.java
│ │ │ │ ├── CancelOfferTest.java
│ │ │ │ ├── CreateOfferUsingFixedPriceTest.java
│ │ │ │ ├── CreateOfferUsingMarketPriceMarginTest.java
│ │ │ │ ├── CreateXMROffersTest.java
│ │ │ │ └── ValidateCreateOfferTest.java
│ │ │ ├── payment/
│ │ │ │ ├── AbstractPaymentAccountTest.java
│ │ │ │ ├── CreatePaymentAccountTest.java
│ │ │ │ └── GetPaymentMethodsTest.java
│ │ │ ├── trade/
│ │ │ │ ├── AbstractTradeTest.java
│ │ │ │ ├── ExpectedProtocolStatus.java
│ │ │ │ ├── TakeBuyBTCOfferTest.java
│ │ │ │ ├── TakeBuyBTCOfferWithNationalBankAcctTest.java
│ │ │ │ ├── TakeBuyXMROfferTest.java
│ │ │ │ ├── TakeSellBTCOfferTest.java
│ │ │ │ └── TakeSellXMROfferTest.java
│ │ │ └── wallet/
│ │ │ ├── BtcWalletTest.java
│ │ │ ├── WalletProtectionTest.java
│ │ │ └── WalletTestUtil.java
│ │ └── scenario/
│ │ ├── LongRunningOfferDeactivationTest.java
│ │ ├── LongRunningTradesTest.java
│ │ ├── OfferTest.java
│ │ ├── PaymentAccountTest.java
│ │ ├── ScriptedBotTest.java
│ │ ├── StartupTest.java
│ │ ├── TradeTest.java
│ │ ├── WalletTest.java
│ │ └── bot/
│ │ ├── AbstractBotTest.java
│ │ ├── Bot.java
│ │ ├── BotClient.java
│ │ ├── BotPaymentAccountGenerator.java
│ │ ├── InvalidRandomOfferException.java
│ │ ├── PaymentAccountNotFoundException.java
│ │ ├── RandomOffer.java
│ │ ├── RobotBob.java
│ │ ├── protocol/
│ │ │ ├── BotProtocol.java
│ │ │ ├── MakerBotProtocol.java
│ │ │ ├── ProtocolStep.java
│ │ │ └── TakerBotProtocol.java
│ │ ├── script/
│ │ │ ├── BashScriptGenerator.java
│ │ │ ├── BotScript.java
│ │ │ └── BotScriptGenerator.java
│ │ └── shutdown/
│ │ ├── ManualBotShutdownException.java
│ │ └── ManualShutdown.java
│ └── resources/
│ └── logback.xml
├── assets/
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── haveno/
│ │ │ └── asset/
│ │ │ ├── AbstractAsset.java
│ │ │ ├── AddressValidationResult.java
│ │ │ ├── AddressValidator.java
│ │ │ ├── Asset.java
│ │ │ ├── AssetRegistry.java
│ │ │ ├── Base58AddressValidator.java
│ │ │ ├── BitcoinAddressValidator.java
│ │ │ ├── BitcoinCashAddressValidator.java
│ │ │ ├── CardanoAddressValidator.java
│ │ │ ├── Coin.java
│ │ │ ├── CryptoAccountDisclaimer.java
│ │ │ ├── CryptoNoteAddressValidator.java
│ │ │ ├── CryptoNoteUtils.java
│ │ │ ├── Erc20Token.java
│ │ │ ├── EtherAddressValidator.java
│ │ │ ├── GrinAddressValidator.java
│ │ │ ├── I18n.java
│ │ │ ├── LiquidBitcoinAddressValidator.java
│ │ │ ├── NetworkParametersAdapter.java
│ │ │ ├── PrintTool.java
│ │ │ ├── RegexAddressValidator.java
│ │ │ ├── RippleAddressValidator.java
│ │ │ ├── SolanaAddressValidator.java
│ │ │ ├── Token.java
│ │ │ ├── Trc20Token.java
│ │ │ ├── TronAddressValidator.java
│ │ │ ├── coins/
│ │ │ │ ├── Bitcoin.java
│ │ │ │ ├── BitcoinCash.java
│ │ │ │ ├── Cardano.java
│ │ │ │ ├── Dogecoin.java
│ │ │ │ ├── Ether.java
│ │ │ │ ├── Litecoin.java
│ │ │ │ ├── Monero.java
│ │ │ │ ├── Ripple.java
│ │ │ │ ├── Solana.java
│ │ │ │ └── Tron.java
│ │ │ ├── package-info.java
│ │ │ └── tokens/
│ │ │ ├── AugmintEuro.java
│ │ │ ├── DaiStablecoinERC20.java
│ │ │ ├── EtherStone.java
│ │ │ ├── TetherUSDERC20.java
│ │ │ ├── TetherUSDTRC20.java
│ │ │ ├── TrueUSD.java
│ │ │ ├── USDCoinERC20.java
│ │ │ └── VectorspaceAI.java
│ │ └── resources/
│ │ ├── META-INF/
│ │ │ └── services/
│ │ │ └── haveno.asset.Asset
│ │ └── i18n/
│ │ └── displayStrings-assets.properties
│ └── test/
│ └── java/
│ └── haveno/
│ └── asset/
│ ├── AbstractAssetTest.java
│ └── coins/
│ ├── BitcoinCashTest.java
│ ├── BitcoinTest.java
│ ├── CardanoTest.java
│ ├── DogecoinTest.java
│ ├── LitecoinTest.java
│ ├── MoneroTest.java
│ ├── RippleTest.java
│ ├── SolanaTest.java
│ ├── TetherUSDERC20Test.java
│ ├── TetherUSDTRC20Test.java
│ └── TronTest.java
├── build.gradle
├── cli/
│ ├── package/
│ │ └── create-cli-dist.sh
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── haveno/
│ │ │ └── cli/
│ │ │ ├── CliMain.java
│ │ │ ├── ColumnHeaderConstants.java
│ │ │ ├── CryptoCurrencyUtil.java
│ │ │ ├── CurrencyFormat.java
│ │ │ ├── DirectionFormat.java
│ │ │ ├── GrpcClient.java
│ │ │ ├── GrpcStubs.java
│ │ │ ├── Method.java
│ │ │ ├── PasswordCallCredentials.java
│ │ │ ├── TransactionFormat.java
│ │ │ ├── opts/
│ │ │ │ ├── AbstractMethodOptionParser.java
│ │ │ │ ├── ArgumentList.java
│ │ │ │ ├── CancelOfferOptionParser.java
│ │ │ │ ├── CreateCryptoCurrencyPaymentAcctOptionParser.java
│ │ │ │ ├── CreateOfferOptionParser.java
│ │ │ │ ├── CreatePaymentAcctOptionParser.java
│ │ │ │ ├── GetAddressBalanceOptionParser.java
│ │ │ │ ├── GetBTCMarketPriceOptionParser.java
│ │ │ │ ├── GetBalanceOptionParser.java
│ │ │ │ ├── GetOfferOptionParser.java
│ │ │ │ ├── GetOffersOptionParser.java
│ │ │ │ ├── GetPaymentAcctFormOptionParser.java
│ │ │ │ ├── GetTradeOptionParser.java
│ │ │ │ ├── GetTradesOptionParser.java
│ │ │ │ ├── GetTransactionOptionParser.java
│ │ │ │ ├── MethodOpts.java
│ │ │ │ ├── OfferIdOptionParser.java
│ │ │ │ ├── OptLabel.java
│ │ │ │ ├── RegisterDisputeAgentOptionParser.java
│ │ │ │ ├── RemoveWalletPasswordOptionParser.java
│ │ │ │ ├── SendBtcOptionParser.java
│ │ │ │ ├── SetTxFeeRateOptionParser.java
│ │ │ │ ├── SetWalletPasswordOptionParser.java
│ │ │ │ ├── SimpleMethodOptionParser.java
│ │ │ │ ├── TakeOfferOptionParser.java
│ │ │ │ ├── UnlockWalletOptionParser.java
│ │ │ │ └── WithdrawFundsOptionParser.java
│ │ │ ├── request/
│ │ │ │ ├── OffersServiceRequest.java
│ │ │ │ ├── PaymentAccountsServiceRequest.java
│ │ │ │ ├── TradesServiceRequest.java
│ │ │ │ └── WalletsServiceRequest.java
│ │ │ └── table/
│ │ │ ├── Table.java
│ │ │ ├── builder/
│ │ │ │ ├── AbstractTableBuilder.java
│ │ │ │ ├── AbstractTradeListBuilder.java
│ │ │ │ ├── AddressBalanceTableBuilder.java
│ │ │ │ ├── BtcBalanceTableBuilder.java
│ │ │ │ ├── ClosedTradeTableBuilder.java
│ │ │ │ ├── FailedTradeTableBuilder.java
│ │ │ │ ├── OfferTableBuilder.java
│ │ │ │ ├── OpenTradeTableBuilder.java
│ │ │ │ ├── PaymentAccountTableBuilder.java
│ │ │ │ ├── TableBuilder.java
│ │ │ │ ├── TableBuilderConstants.java
│ │ │ │ ├── TableType.java
│ │ │ │ ├── TradeDetailTableBuilder.java
│ │ │ │ ├── TradeTableColumnSupplier.java
│ │ │ │ └── TransactionTableBuilder.java
│ │ │ └── column/
│ │ │ ├── AbstractColumn.java
│ │ │ ├── BooleanColumn.java
│ │ │ ├── BtcColumn.java
│ │ │ ├── Column.java
│ │ │ ├── CryptoVolumeColumn.java
│ │ │ ├── DoubleColumn.java
│ │ │ ├── IntegerColumn.java
│ │ │ ├── Iso8601DateTimeColumn.java
│ │ │ ├── LongColumn.java
│ │ │ ├── MixedTradeFeeColumn.java
│ │ │ ├── NumberColumn.java
│ │ │ ├── SatoshiColumn.java
│ │ │ ├── StringColumn.java
│ │ │ └── ZippedStringColumns.java
│ │ └── resources/
│ │ └── logback.xml
│ └── test/
│ └── java/
│ └── haveno/
│ └── cli/
│ ├── AbstractCliTest.java
│ ├── CreateOfferSmokeTest.java
│ ├── EditXmrOffersSmokeTest.java
│ ├── GetOffersSmokeTest.java
│ ├── GetTradesSmokeTest.java
│ ├── opts/
│ │ └── OptionParsersTest.java
│ └── table/
│ ├── AddressCliOutputDiffTest.java
│ ├── GetBalanceCliOutputDiffTest.java
│ ├── GetOffersCliOutputDiffTest.java
│ ├── GetTradeCliOutputDiffTest.java
│ ├── GetTransactionCliOutputDiffTest.java
│ └── PaymentAccountsCliOutputDiffTest.java
├── common/
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── haveno/
│ │ └── common/
│ │ ├── ClockWatcher.java
│ │ ├── Envelope.java
│ │ ├── FrameRateTimer.java
│ │ ├── HavenoException.java
│ │ ├── MasterTimer.java
│ │ ├── Payload.java
│ │ ├── Proto.java
│ │ ├── ThreadUtils.java
│ │ ├── Timer.java
│ │ ├── UserThread.java
│ │ ├── app/
│ │ │ ├── AppModule.java
│ │ │ ├── AsciiLogo.java
│ │ │ ├── Capabilities.java
│ │ │ ├── Capability.java
│ │ │ ├── DevEnv.java
│ │ │ ├── HasCapabilities.java
│ │ │ ├── Log.java
│ │ │ ├── LogHighlighter.java
│ │ │ └── Version.java
│ │ ├── config/
│ │ │ ├── BaseCurrencyNetwork.java
│ │ │ ├── CompositeOptionSet.java
│ │ │ ├── Config.java
│ │ │ ├── ConfigException.java
│ │ │ ├── ConfigFileEditor.java
│ │ │ ├── ConfigFileOption.java
│ │ │ ├── ConfigFileReader.java
│ │ │ ├── EnumValueConverter.java
│ │ │ └── HavenoHelpFormatter.java
│ │ ├── consensus/
│ │ │ └── UsedForTradeContractJson.java
│ │ ├── crypto/
│ │ │ ├── CryptoException.java
│ │ │ ├── CryptoUtils.java
│ │ │ ├── Encryption.java
│ │ │ ├── Hash.java
│ │ │ ├── IncorrectPasswordException.java
│ │ │ ├── KeyConversionException.java
│ │ │ ├── KeyRing.java
│ │ │ ├── KeyStorage.java
│ │ │ ├── PubKeyRing.java
│ │ │ ├── PubKeyRingProvider.java
│ │ │ ├── ScryptUtil.java
│ │ │ ├── SealedAndSigned.java
│ │ │ └── Sig.java
│ │ ├── file/
│ │ │ ├── CorruptedStorageFileHandler.java
│ │ │ ├── FileUtil.java
│ │ │ ├── JsonFileManager.java
│ │ │ └── ResourceNotFoundException.java
│ │ ├── handlers/
│ │ │ ├── ErrorMessageHandler.java
│ │ │ ├── ExceptionHandler.java
│ │ │ ├── FaultHandler.java
│ │ │ └── ResultHandler.java
│ │ ├── persistence/
│ │ │ └── PersistenceManager.java
│ │ ├── proto/
│ │ │ ├── ProtoResolver.java
│ │ │ ├── ProtoUtil.java
│ │ │ ├── ProtobufferException.java
│ │ │ ├── ProtobufferRuntimeException.java
│ │ │ ├── network/
│ │ │ │ ├── GetDataResponsePriority.java
│ │ │ │ ├── NetworkEnvelope.java
│ │ │ │ ├── NetworkPayload.java
│ │ │ │ └── NetworkProtoResolver.java
│ │ │ └── persistable/
│ │ │ ├── NavigationPath.java
│ │ │ ├── PersistableEnvelope.java
│ │ │ ├── PersistableList.java
│ │ │ ├── PersistableListAsObservable.java
│ │ │ ├── PersistablePayload.java
│ │ │ ├── PersistedDataHost.java
│ │ │ └── PersistenceProtoResolver.java
│ │ ├── reactfx/
│ │ │ ├── FxTimer.java
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ └── Timer.java
│ │ ├── setup/
│ │ │ ├── CommonSetup.java
│ │ │ ├── GracefulShutDownHandler.java
│ │ │ └── UncaughtExceptionHandler.java
│ │ ├── taskrunner/
│ │ │ ├── InterceptTaskException.java
│ │ │ ├── Model.java
│ │ │ ├── Task.java
│ │ │ └── TaskRunner.java
│ │ └── util/
│ │ ├── Base64.java
│ │ ├── CollectionUtils.java
│ │ ├── CompletableFutureUtils.java
│ │ ├── DesktopUtil.java
│ │ ├── DoubleSummaryStatisticsWithStdDev.java
│ │ ├── ExtraDataMapValidator.java
│ │ ├── GcUtil.java
│ │ ├── Hex.java
│ │ ├── InvalidVersionException.java
│ │ ├── JsonExclude.java
│ │ ├── MathUtils.java
│ │ ├── PermutationUtil.java
│ │ ├── Preconditions.java
│ │ ├── Profiler.java
│ │ ├── ReflectionUtils.java
│ │ ├── RestartUtil.java
│ │ ├── SingleThreadExecutorUtils.java
│ │ ├── Tuple2.java
│ │ ├── Tuple3.java
│ │ ├── Tuple4.java
│ │ ├── Tuple5.java
│ │ ├── Utilities.java
│ │ └── ZipUtils.java
│ └── test/
│ └── java/
│ └── haveno/
│ └── common/
│ ├── app/
│ │ ├── CapabilitiesTest.java
│ │ └── VersionTest.java
│ ├── config/
│ │ ├── ConfigFileEditorTests.java
│ │ ├── ConfigFileOptionTests.java
│ │ ├── ConfigFileReaderTests.java
│ │ └── ConfigTests.java
│ └── util/
│ ├── MathUtilsTest.java
│ ├── PermutationTest.java
│ ├── PreconditionsTests.java
│ └── UtilitiesTest.java
├── config/
│ └── checkstyle/
│ └── checkstyle.xml
├── core/
│ ├── .tx/
│ │ └── config
│ ├── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── haveno/
│ │ │ │ └── core/
│ │ │ │ ├── account/
│ │ │ │ │ ├── sign/
│ │ │ │ │ │ ├── SignedWitness.java
│ │ │ │ │ │ ├── SignedWitnessService.java
│ │ │ │ │ │ ├── SignedWitnessStorageService.java
│ │ │ │ │ │ └── SignedWitnessStore.java
│ │ │ │ │ └── witness/
│ │ │ │ │ ├── AccountAgeWitness.java
│ │ │ │ │ ├── AccountAgeWitnessService.java
│ │ │ │ │ ├── AccountAgeWitnessStorageService.java
│ │ │ │ │ ├── AccountAgeWitnessStore.java
│ │ │ │ │ └── AccountAgeWitnessUtils.java
│ │ │ │ ├── alert/
│ │ │ │ │ ├── Alert.java
│ │ │ │ │ ├── AlertManager.java
│ │ │ │ │ ├── AlertModule.java
│ │ │ │ │ ├── PrivateNotificationManager.java
│ │ │ │ │ ├── PrivateNotificationMessage.java
│ │ │ │ │ └── PrivateNotificationPayload.java
│ │ │ │ ├── api/
│ │ │ │ │ ├── AccountServiceListener.java
│ │ │ │ │ ├── CoreAccountService.java
│ │ │ │ │ ├── CoreApi.java
│ │ │ │ │ ├── CoreContext.java
│ │ │ │ │ ├── CoreDisputeAgentsService.java
│ │ │ │ │ ├── CoreDisputesService.java
│ │ │ │ │ ├── CoreHelpService.java
│ │ │ │ │ ├── CoreNotificationService.java
│ │ │ │ │ ├── CoreOffersService.java
│ │ │ │ │ ├── CorePaymentAccountsService.java
│ │ │ │ │ ├── CorePriceService.java
│ │ │ │ │ ├── CoreTradesService.java
│ │ │ │ │ ├── CoreWalletsService.java
│ │ │ │ │ ├── NotificationListener.java
│ │ │ │ │ ├── XmrConnectionService.java
│ │ │ │ │ ├── XmrKeyImageListener.java
│ │ │ │ │ ├── XmrKeyImagePoller.java
│ │ │ │ │ ├── XmrLocalNode.java
│ │ │ │ │ ├── XmrLocalNodeListener.java
│ │ │ │ │ └── model/
│ │ │ │ │ ├── AddressBalanceInfo.java
│ │ │ │ │ ├── BalancesInfo.java
│ │ │ │ │ ├── BtcBalanceInfo.java
│ │ │ │ │ ├── ContractInfo.java
│ │ │ │ │ ├── EncryptedConnection.java
│ │ │ │ │ ├── MarketDepthInfo.java
│ │ │ │ │ ├── MarketPriceInfo.java
│ │ │ │ │ ├── OfferInfo.java
│ │ │ │ │ ├── PaymentAccountForm.java
│ │ │ │ │ ├── PaymentAccountFormField.java
│ │ │ │ │ ├── TradeInfo.java
│ │ │ │ │ ├── XmrBalanceInfo.java
│ │ │ │ │ ├── XmrDestination.java
│ │ │ │ │ ├── XmrIncomingTransfer.java
│ │ │ │ │ ├── XmrOutgoingTransfer.java
│ │ │ │ │ ├── XmrTx.java
│ │ │ │ │ └── builder/
│ │ │ │ │ ├── OfferInfoBuilder.java
│ │ │ │ │ └── TradeInfoV1Builder.java
│ │ │ │ ├── app/
│ │ │ │ │ ├── AppStartupState.java
│ │ │ │ │ ├── AvoidStandbyModeService.java
│ │ │ │ │ ├── ConsoleInput.java
│ │ │ │ │ ├── ConsoleInputReadTask.java
│ │ │ │ │ ├── CoreModule.java
│ │ │ │ │ ├── DomainInitialisation.java
│ │ │ │ │ ├── HavenoExecutable.java
│ │ │ │ │ ├── HavenoHeadlessApp.java
│ │ │ │ │ ├── HavenoHeadlessAppMain.java
│ │ │ │ │ ├── HavenoSetup.java
│ │ │ │ │ ├── HeadlessApp.java
│ │ │ │ │ ├── P2PNetworkSetup.java
│ │ │ │ │ ├── TorSetup.java
│ │ │ │ │ ├── WalletAppSetup.java
│ │ │ │ │ └── misc/
│ │ │ │ │ ├── AppSetup.java
│ │ │ │ │ ├── AppSetupWithP2P.java
│ │ │ │ │ ├── ExecutableForAppWithP2p.java
│ │ │ │ │ └── ModuleForAppWithP2p.java
│ │ │ │ ├── exceptions/
│ │ │ │ │ └── TradePriceOutOfToleranceException.java
│ │ │ │ ├── filter/
│ │ │ │ │ ├── Filter.java
│ │ │ │ │ ├── FilterManager.java
│ │ │ │ │ ├── FilterModule.java
│ │ │ │ │ └── PaymentAccountFilter.java
│ │ │ │ ├── locale/
│ │ │ │ │ ├── BankUtil.java
│ │ │ │ │ ├── Country.java
│ │ │ │ │ ├── CountryUtil.java
│ │ │ │ │ ├── CryptoCurrency.java
│ │ │ │ │ ├── CurrencyTuple.java
│ │ │ │ │ ├── CurrencyUtil.java
│ │ │ │ │ ├── GlobalSettings.java
│ │ │ │ │ ├── LanguageUtil.java
│ │ │ │ │ ├── LocaleUtil.java
│ │ │ │ │ ├── Region.java
│ │ │ │ │ ├── Res.java
│ │ │ │ │ ├── TradeCurrency.java
│ │ │ │ │ └── TraditionalCurrency.java
│ │ │ │ ├── monetary/
│ │ │ │ │ ├── CryptoExchangeRate.java
│ │ │ │ │ ├── CryptoMoney.java
│ │ │ │ │ ├── MonetaryWrapper.java
│ │ │ │ │ ├── Price.java
│ │ │ │ │ ├── TraditionalExchangeRate.java
│ │ │ │ │ ├── TraditionalMoney.java
│ │ │ │ │ └── Volume.java
│ │ │ │ ├── network/
│ │ │ │ │ ├── CoreBanFilter.java
│ │ │ │ │ ├── MessageState.java
│ │ │ │ │ └── p2p/
│ │ │ │ │ ├── inventory/
│ │ │ │ │ │ ├── GetInventoryRequestHandler.java
│ │ │ │ │ │ ├── GetInventoryRequestManager.java
│ │ │ │ │ │ ├── GetInventoryRequester.java
│ │ │ │ │ │ ├── messages/
│ │ │ │ │ │ │ ├── GetInventoryRequest.java
│ │ │ │ │ │ │ └── GetInventoryResponse.java
│ │ │ │ │ │ └── model/
│ │ │ │ │ │ ├── Average.java
│ │ │ │ │ │ ├── DeviationByIntegerDiff.java
│ │ │ │ │ │ ├── DeviationByPercentage.java
│ │ │ │ │ │ ├── DeviationOfHashes.java
│ │ │ │ │ │ ├── DeviationSeverity.java
│ │ │ │ │ │ ├── DeviationType.java
│ │ │ │ │ │ ├── InventoryItem.java
│ │ │ │ │ │ └── RequestInfo.java
│ │ │ │ │ └── seed/
│ │ │ │ │ └── DefaultSeedNodeRepository.java
│ │ │ │ ├── notifications/
│ │ │ │ │ ├── MobileMessage.java
│ │ │ │ │ ├── MobileMessageEncryption.java
│ │ │ │ │ ├── MobileMessageType.java
│ │ │ │ │ ├── MobileModel.java
│ │ │ │ │ ├── MobileNotificationService.java
│ │ │ │ │ ├── MobileNotificationValidator.java
│ │ │ │ │ └── alerts/
│ │ │ │ │ ├── DisputeMsgEvents.java
│ │ │ │ │ ├── MyOfferTakenEvents.java
│ │ │ │ │ ├── TradeEvents.java
│ │ │ │ │ ├── market/
│ │ │ │ │ │ ├── MarketAlertFilter.java
│ │ │ │ │ │ └── MarketAlerts.java
│ │ │ │ │ └── price/
│ │ │ │ │ ├── PriceAlert.java
│ │ │ │ │ └── PriceAlertFilter.java
│ │ │ │ ├── offer/
│ │ │ │ │ ├── AvailabilityResult.java
│ │ │ │ │ ├── CreateOfferService.java
│ │ │ │ │ ├── MarketPriceNotAvailableException.java
│ │ │ │ │ ├── Offer.java
│ │ │ │ │ ├── OfferBookService.java
│ │ │ │ │ ├── OfferDirection.java
│ │ │ │ │ ├── OfferFilterService.java
│ │ │ │ │ ├── OfferForJson.java
│ │ │ │ │ ├── OfferModule.java
│ │ │ │ │ ├── OfferPayload.java
│ │ │ │ │ ├── OfferRestrictions.java
│ │ │ │ │ ├── OfferUtil.java
│ │ │ │ │ ├── OpenOffer.java
│ │ │ │ │ ├── OpenOfferManager.java
│ │ │ │ │ ├── SignedOffer.java
│ │ │ │ │ ├── SignedOfferList.java
│ │ │ │ │ ├── TriggerPriceService.java
│ │ │ │ │ ├── availability/
│ │ │ │ │ │ ├── DisputeAgentSelection.java
│ │ │ │ │ │ ├── OfferAvailabilityModel.java
│ │ │ │ │ │ ├── OfferAvailabilityProtocol.java
│ │ │ │ │ │ └── tasks/
│ │ │ │ │ │ ├── ProcessOfferAvailabilityResponse.java
│ │ │ │ │ │ └── SendOfferAvailabilityRequest.java
│ │ │ │ │ ├── messages/
│ │ │ │ │ │ ├── OfferAvailabilityRequest.java
│ │ │ │ │ │ ├── OfferAvailabilityResponse.java
│ │ │ │ │ │ ├── OfferMessage.java
│ │ │ │ │ │ ├── SignOfferRequest.java
│ │ │ │ │ │ └── SignOfferResponse.java
│ │ │ │ │ ├── placeoffer/
│ │ │ │ │ │ ├── PlaceOfferModel.java
│ │ │ │ │ │ ├── PlaceOfferProtocol.java
│ │ │ │ │ │ └── tasks/
│ │ │ │ │ │ ├── MakerProcessSignOfferResponse.java
│ │ │ │ │ │ ├── MakerReserveOfferFunds.java
│ │ │ │ │ │ ├── MakerSendSignOfferRequest.java
│ │ │ │ │ │ ├── MaybeAddToOfferBook.java
│ │ │ │ │ │ └── ValidateOffer.java
│ │ │ │ │ └── takeoffer/
│ │ │ │ │ └── TakeOfferModel.java
│ │ │ │ ├── payment/
│ │ │ │ │ ├── AchTransferAccount.java
│ │ │ │ │ ├── AdvancedCashAccount.java
│ │ │ │ │ ├── AliPayAccount.java
│ │ │ │ │ ├── AmazonGiftCardAccount.java
│ │ │ │ │ ├── AssetAccount.java
│ │ │ │ │ ├── AustraliaPayidAccount.java
│ │ │ │ │ ├── BankAccount.java
│ │ │ │ │ ├── BankNameRestrictedBankAccount.java
│ │ │ │ │ ├── BizumAccount.java
│ │ │ │ │ ├── CapitualAccount.java
│ │ │ │ │ ├── CashAppAccount.java
│ │ │ │ │ ├── CashAtAtmAccount.java
│ │ │ │ │ ├── CashDepositAccount.java
│ │ │ │ │ ├── CelPayAccount.java
│ │ │ │ │ ├── ChargeBackRisk.java
│ │ │ │ │ ├── ChaseQuickPayAccount.java
│ │ │ │ │ ├── CountryBasedPaymentAccount.java
│ │ │ │ │ ├── CryptoCurrencyAccount.java
│ │ │ │ │ ├── DomesticWireTransferAccount.java
│ │ │ │ │ ├── F2FAccount.java
│ │ │ │ │ ├── FasterPaymentsAccount.java
│ │ │ │ │ ├── HalCashAccount.java
│ │ │ │ │ ├── IfscBasedAccount.java
│ │ │ │ │ ├── ImpsAccount.java
│ │ │ │ │ ├── InstantCryptoCurrencyAccount.java
│ │ │ │ │ ├── InteracETransferAccount.java
│ │ │ │ │ ├── JapanBankAccount.java
│ │ │ │ │ ├── JapanBankData.java
│ │ │ │ │ ├── MoneseAccount.java
│ │ │ │ │ ├── MoneyBeamAccount.java
│ │ │ │ │ ├── MoneyGramAccount.java
│ │ │ │ │ ├── NationalBankAccount.java
│ │ │ │ │ ├── NeftAccount.java
│ │ │ │ │ ├── NequiAccount.java
│ │ │ │ │ ├── OKPayAccount.java
│ │ │ │ │ ├── PaxumAccount.java
│ │ │ │ │ ├── PayByMailAccount.java
│ │ │ │ │ ├── PayPalAccount.java
│ │ │ │ │ ├── PaymentAccount.java
│ │ │ │ │ ├── PaymentAccountFactory.java
│ │ │ │ │ ├── PaymentAccountList.java
│ │ │ │ │ ├── PaymentAccountTypeAdapter.java
│ │ │ │ │ ├── PaymentAccountUtil.java
│ │ │ │ │ ├── PaymentAccounts.java
│ │ │ │ │ ├── PaysafeAccount.java
│ │ │ │ │ ├── PayseraAccount.java
│ │ │ │ │ ├── PaytmAccount.java
│ │ │ │ │ ├── PerfectMoneyAccount.java
│ │ │ │ │ ├── PixAccount.java
│ │ │ │ │ ├── PopmoneyAccount.java
│ │ │ │ │ ├── PromptPayAccount.java
│ │ │ │ │ ├── ReceiptPredicates.java
│ │ │ │ │ ├── ReceiptValidator.java
│ │ │ │ │ ├── RevolutAccount.java
│ │ │ │ │ ├── RtgsAccount.java
│ │ │ │ │ ├── SameBankAccount.java
│ │ │ │ │ ├── SameCountryRestrictedBankAccount.java
│ │ │ │ │ ├── SatispayAccount.java
│ │ │ │ │ ├── SepaAccount.java
│ │ │ │ │ ├── SepaInstantAccount.java
│ │ │ │ │ ├── SpecificBanksAccount.java
│ │ │ │ │ ├── StrikeAccount.java
│ │ │ │ │ ├── SwiftAccount.java
│ │ │ │ │ ├── SwishAccount.java
│ │ │ │ │ ├── TikkieAccount.java
│ │ │ │ │ ├── TradeLimits.java
│ │ │ │ │ ├── TransferwiseAccount.java
│ │ │ │ │ ├── TransferwiseUsdAccount.java
│ │ │ │ │ ├── USPostalMoneyOrderAccount.java
│ │ │ │ │ ├── UpholdAccount.java
│ │ │ │ │ ├── UpiAccount.java
│ │ │ │ │ ├── VenmoAccount.java
│ │ │ │ │ ├── VerseAccount.java
│ │ │ │ │ ├── WeChatPayAccount.java
│ │ │ │ │ ├── WesternUnionAccount.java
│ │ │ │ │ ├── ZelleAccount.java
│ │ │ │ │ ├── payload/
│ │ │ │ │ │ ├── AchTransferAccountPayload.java
│ │ │ │ │ │ ├── AdvancedCashAccountPayload.java
│ │ │ │ │ │ ├── AliPayAccountPayload.java
│ │ │ │ │ │ ├── AmazonGiftCardAccountPayload.java
│ │ │ │ │ │ ├── AssetAccountPayload.java
│ │ │ │ │ │ ├── AustraliaPayidAccountPayload.java
│ │ │ │ │ │ ├── BankAccountPayload.java
│ │ │ │ │ │ ├── BizumAccountPayload.java
│ │ │ │ │ │ ├── CapitualAccountPayload.java
│ │ │ │ │ │ ├── CashAppAccountPayload.java
│ │ │ │ │ │ ├── CashAtAtmAccountPayload.java
│ │ │ │ │ │ ├── CashDepositAccountPayload.java
│ │ │ │ │ │ ├── CelPayAccountPayload.java
│ │ │ │ │ │ ├── ChaseQuickPayAccountPayload.java
│ │ │ │ │ │ ├── CountryBasedPaymentAccountPayload.java
│ │ │ │ │ │ ├── CryptoCurrencyAccountPayload.java
│ │ │ │ │ │ ├── DomesticWireTransferAccountPayload.java
│ │ │ │ │ │ ├── F2FAccountPayload.java
│ │ │ │ │ │ ├── FasterPaymentsAccountPayload.java
│ │ │ │ │ │ ├── HalCashAccountPayload.java
│ │ │ │ │ │ ├── IfscBasedAccountPayload.java
│ │ │ │ │ │ ├── ImpsAccountPayload.java
│ │ │ │ │ │ ├── InstantCryptoCurrencyPayload.java
│ │ │ │ │ │ ├── InteracETransferAccountPayload.java
│ │ │ │ │ │ ├── JapanBankAccountPayload.java
│ │ │ │ │ │ ├── MoneseAccountPayload.java
│ │ │ │ │ │ ├── MoneyBeamAccountPayload.java
│ │ │ │ │ │ ├── MoneyGramAccountPayload.java
│ │ │ │ │ │ ├── NationalBankAccountPayload.java
│ │ │ │ │ │ ├── NeftAccountPayload.java
│ │ │ │ │ │ ├── NequiAccountPayload.java
│ │ │ │ │ │ ├── OKPayAccountPayload.java
│ │ │ │ │ │ ├── PaxumAccountPayload.java
│ │ │ │ │ │ ├── PayByMailAccountPayload.java
│ │ │ │ │ │ ├── PayPalAccountPayload.java
│ │ │ │ │ │ ├── PayloadWithHolderName.java
│ │ │ │ │ │ ├── PaymentAccountPayload.java
│ │ │ │ │ │ ├── PaymentMethod.java
│ │ │ │ │ │ ├── PaysafeAccountPayload.java
│ │ │ │ │ │ ├── PayseraAccountPayload.java
│ │ │ │ │ │ ├── PaytmAccountPayload.java
│ │ │ │ │ │ ├── PerfectMoneyAccountPayload.java
│ │ │ │ │ │ ├── PixAccountPayload.java
│ │ │ │ │ │ ├── PopmoneyAccountPayload.java
│ │ │ │ │ │ ├── PromptPayAccountPayload.java
│ │ │ │ │ │ ├── RevolutAccountPayload.java
│ │ │ │ │ │ ├── RtgsAccountPayload.java
│ │ │ │ │ │ ├── SameBankAccountPayload.java
│ │ │ │ │ │ ├── SatispayAccountPayload.java
│ │ │ │ │ │ ├── SepaAccountPayload.java
│ │ │ │ │ │ ├── SepaInstantAccountPayload.java
│ │ │ │ │ │ ├── SpecificBanksAccountPayload.java
│ │ │ │ │ │ ├── StrikeAccountPayload.java
│ │ │ │ │ │ ├── SwiftAccountPayload.java
│ │ │ │ │ │ ├── SwishAccountPayload.java
│ │ │ │ │ │ ├── TikkieAccountPayload.java
│ │ │ │ │ │ ├── TransferwiseAccountPayload.java
│ │ │ │ │ │ ├── TransferwiseUsdAccountPayload.java
│ │ │ │ │ │ ├── USPostalMoneyOrderAccountPayload.java
│ │ │ │ │ │ ├── UpholdAccountPayload.java
│ │ │ │ │ │ ├── UpiAccountPayload.java
│ │ │ │ │ │ ├── VenmoAccountPayload.java
│ │ │ │ │ │ ├── VerseAccountPayload.java
│ │ │ │ │ │ ├── WeChatPayAccountPayload.java
│ │ │ │ │ │ ├── WesternUnionAccountPayload.java
│ │ │ │ │ │ └── ZelleAccountPayload.java
│ │ │ │ │ └── validation/
│ │ │ │ │ ├── AccountNrValidator.java
│ │ │ │ │ ├── AdvancedCashValidator.java
│ │ │ │ │ ├── AliPayValidator.java
│ │ │ │ │ ├── AustraliaPayidAccountNameValidator.java
│ │ │ │ │ ├── AustraliaPayidValidator.java
│ │ │ │ │ ├── BICValidator.java
│ │ │ │ │ ├── BankIdValidator.java
│ │ │ │ │ ├── BankValidator.java
│ │ │ │ │ ├── BranchIdValidator.java
│ │ │ │ │ ├── CapitualValidator.java
│ │ │ │ │ ├── ChaseQuickPayValidator.java
│ │ │ │ │ ├── CountryCallingCodes.java
│ │ │ │ │ ├── CryptoAddressValidator.java
│ │ │ │ │ ├── EmailOrMobileNrOrCashtagValidator.java
│ │ │ │ │ ├── EmailOrMobileNrOrUsernameValidator.java
│ │ │ │ │ ├── EmailOrMobileNrValidator.java
│ │ │ │ │ ├── EmailValidator.java
│ │ │ │ │ ├── F2FValidator.java
│ │ │ │ │ ├── FiatVolumeValidator.java
│ │ │ │ │ ├── HalCashValidator.java
│ │ │ │ │ ├── IBANValidator.java
│ │ │ │ │ ├── InteracETransferAnswerValidator.java
│ │ │ │ │ ├── InteracETransferQuestionValidator.java
│ │ │ │ │ ├── InteracETransferValidator.java
│ │ │ │ │ ├── JapanBankAccountNameValidator.java
│ │ │ │ │ ├── JapanBankAccountNumberValidator.java
│ │ │ │ │ ├── JapanBankBranchCodeValidator.java
│ │ │ │ │ ├── JapanBankBranchNameValidator.java
│ │ │ │ │ ├── JapanBankTransferValidator.java
│ │ │ │ │ ├── LengthValidator.java
│ │ │ │ │ ├── MoneyBeamValidator.java
│ │ │ │ │ ├── NationalAccountIdValidator.java
│ │ │ │ │ ├── PercentageNumberValidator.java
│ │ │ │ │ ├── PerfectMoneyValidator.java
│ │ │ │ │ ├── PhoneNumberValidator.java
│ │ │ │ │ ├── PopmoneyValidator.java
│ │ │ │ │ ├── PromptPayValidator.java
│ │ │ │ │ ├── RevolutValidator.java
│ │ │ │ │ ├── SecurityDepositValidator.java
│ │ │ │ │ ├── SepaIBANValidator.java
│ │ │ │ │ ├── SwishValidator.java
│ │ │ │ │ ├── TransferwiseValidator.java
│ │ │ │ │ ├── USPostalMoneyOrderValidator.java
│ │ │ │ │ ├── UpholdValidator.java
│ │ │ │ │ ├── WeChatPayValidator.java
│ │ │ │ │ └── XmrValidator.java
│ │ │ │ ├── presentation/
│ │ │ │ │ ├── BalancePresentation.java
│ │ │ │ │ ├── CorePresentationModule.java
│ │ │ │ │ ├── SupportTicketsPresentation.java
│ │ │ │ │ └── TradePresentation.java
│ │ │ │ ├── proto/
│ │ │ │ │ ├── CoreProtoResolver.java
│ │ │ │ │ ├── ProtoDevUtil.java
│ │ │ │ │ ├── network/
│ │ │ │ │ │ └── CoreNetworkProtoResolver.java
│ │ │ │ │ └── persistable/
│ │ │ │ │ └── CorePersistenceProtoResolver.java
│ │ │ │ ├── provider/
│ │ │ │ │ ├── FeeHttpClient.java
│ │ │ │ │ ├── HttpClientProvider.java
│ │ │ │ │ ├── MempoolHttpClient.java
│ │ │ │ │ ├── PriceHttpClient.java
│ │ │ │ │ ├── ProvidersRepository.java
│ │ │ │ │ ├── fee/
│ │ │ │ │ │ ├── FeeProvider.java
│ │ │ │ │ │ └── FeeRequest.java
│ │ │ │ │ └── price/
│ │ │ │ │ ├── MarketPrice.java
│ │ │ │ │ ├── PriceFeedService.java
│ │ │ │ │ ├── PriceProvider.java
│ │ │ │ │ ├── PriceRequest.java
│ │ │ │ │ └── PriceRequestException.java
│ │ │ │ ├── setup/
│ │ │ │ │ ├── CoreNetworkCapabilities.java
│ │ │ │ │ ├── CorePersistedDataHost.java
│ │ │ │ │ └── CoreSetup.java
│ │ │ │ ├── support/
│ │ │ │ │ ├── SupportManager.java
│ │ │ │ │ ├── SupportSession.java
│ │ │ │ │ ├── SupportType.java
│ │ │ │ │ ├── dispute/
│ │ │ │ │ │ ├── Attachment.java
│ │ │ │ │ │ ├── Dispute.java
│ │ │ │ │ │ ├── DisputeAlreadyOpenException.java
│ │ │ │ │ │ ├── DisputeList.java
│ │ │ │ │ │ ├── DisputeListService.java
│ │ │ │ │ │ ├── DisputeManager.java
│ │ │ │ │ │ ├── DisputeMessageDeliveryFailedException.java
│ │ │ │ │ │ ├── DisputeResult.java
│ │ │ │ │ │ ├── DisputeSession.java
│ │ │ │ │ │ ├── DisputeSummaryVerification.java
│ │ │ │ │ │ ├── DisputeValidation.java
│ │ │ │ │ │ ├── agent/
│ │ │ │ │ │ │ ├── DisputeAgent.java
│ │ │ │ │ │ │ ├── DisputeAgentLookupMap.java
│ │ │ │ │ │ │ ├── DisputeAgentManager.java
│ │ │ │ │ │ │ ├── DisputeAgentService.java
│ │ │ │ │ │ │ └── MultipleHolderNameDetection.java
│ │ │ │ │ │ ├── arbitration/
│ │ │ │ │ │ │ ├── ArbitrationDisputeList.java
│ │ │ │ │ │ │ ├── ArbitrationDisputeListService.java
│ │ │ │ │ │ │ ├── ArbitrationManager.java
│ │ │ │ │ │ │ ├── ArbitrationSession.java
│ │ │ │ │ │ │ ├── TraderDataItem.java
│ │ │ │ │ │ │ ├── arbitrator/
│ │ │ │ │ │ │ │ ├── Arbitrator.java
│ │ │ │ │ │ │ │ ├── ArbitratorManager.java
│ │ │ │ │ │ │ │ └── ArbitratorService.java
│ │ │ │ │ │ │ └── messages/
│ │ │ │ │ │ │ └── ArbitrationMessage.java
│ │ │ │ │ │ ├── mediation/
│ │ │ │ │ │ │ ├── FileTransferReceiver.java
│ │ │ │ │ │ │ ├── FileTransferSender.java
│ │ │ │ │ │ │ ├── FileTransferSession.java
│ │ │ │ │ │ │ ├── MediationDisputeList.java
│ │ │ │ │ │ │ ├── MediationDisputeListService.java
│ │ │ │ │ │ │ ├── MediationManager.java
│ │ │ │ │ │ │ ├── MediationResultState.java
│ │ │ │ │ │ │ ├── MediationSession.java
│ │ │ │ │ │ │ └── mediator/
│ │ │ │ │ │ │ ├── Mediator.java
│ │ │ │ │ │ │ ├── MediatorManager.java
│ │ │ │ │ │ │ └── MediatorService.java
│ │ │ │ │ │ ├── messages/
│ │ │ │ │ │ │ ├── DisputeClosedMessage.java
│ │ │ │ │ │ │ ├── DisputeMessage.java
│ │ │ │ │ │ │ └── DisputeOpenedMessage.java
│ │ │ │ │ │ └── refund/
│ │ │ │ │ │ ├── RefundDisputeList.java
│ │ │ │ │ │ ├── RefundDisputeListService.java
│ │ │ │ │ │ ├── RefundManager.java
│ │ │ │ │ │ ├── RefundResultState.java
│ │ │ │ │ │ ├── RefundSession.java
│ │ │ │ │ │ └── refundagent/
│ │ │ │ │ │ ├── RefundAgent.java
│ │ │ │ │ │ ├── RefundAgentManager.java
│ │ │ │ │ │ └── RefundAgentService.java
│ │ │ │ │ ├── messages/
│ │ │ │ │ │ ├── ChatMessage.java
│ │ │ │ │ │ └── SupportMessage.java
│ │ │ │ │ └── traderchat/
│ │ │ │ │ ├── TradeChatSession.java
│ │ │ │ │ └── TraderChatManager.java
│ │ │ │ ├── trade/
│ │ │ │ │ ├── ArbitratorTrade.java
│ │ │ │ │ ├── BuyerAsMakerTrade.java
│ │ │ │ │ ├── BuyerAsTakerTrade.java
│ │ │ │ │ ├── BuyerTrade.java
│ │ │ │ │ ├── CleanupMailboxMessages.java
│ │ │ │ │ ├── CleanupMailboxMessagesService.java
│ │ │ │ │ ├── ClosedTradableFormatter.java
│ │ │ │ │ ├── ClosedTradableManager.java
│ │ │ │ │ ├── ClosedTradableUtil.java
│ │ │ │ │ ├── Contract.java
│ │ │ │ │ ├── HavenoUtils.java
│ │ │ │ │ ├── MakerTrade.java
│ │ │ │ │ ├── SellerAsMakerTrade.java
│ │ │ │ │ ├── SellerAsTakerTrade.java
│ │ │ │ │ ├── SellerTrade.java
│ │ │ │ │ ├── TakerTrade.java
│ │ │ │ │ ├── Tradable.java
│ │ │ │ │ ├── TradableList.java
│ │ │ │ │ ├── Trade.java
│ │ │ │ │ ├── TradeDataValidation.java
│ │ │ │ │ ├── TradeManager.java
│ │ │ │ │ ├── TradeModule.java
│ │ │ │ │ ├── TradeTxException.java
│ │ │ │ │ ├── TradeUtil.java
│ │ │ │ │ ├── failed/
│ │ │ │ │ │ └── FailedTradesManager.java
│ │ │ │ │ ├── handlers/
│ │ │ │ │ │ ├── TradeResultHandler.java
│ │ │ │ │ │ └── TransactionResultHandler.java
│ │ │ │ │ ├── messages/
│ │ │ │ │ │ ├── DepositRequest.java
│ │ │ │ │ │ ├── DepositResponse.java
│ │ │ │ │ │ ├── DepositsConfirmedMessage.java
│ │ │ │ │ │ ├── InitMultisigRequest.java
│ │ │ │ │ │ ├── InitTradeRequest.java
│ │ │ │ │ │ ├── MediatedPayoutTxPublishedMessage.java
│ │ │ │ │ │ ├── MediatedPayoutTxSignatureMessage.java
│ │ │ │ │ │ ├── PaymentReceivedMessage.java
│ │ │ │ │ │ ├── PaymentSentMessage.java
│ │ │ │ │ │ ├── SignContractRequest.java
│ │ │ │ │ │ ├── SignContractResponse.java
│ │ │ │ │ │ ├── TradeMailboxMessage.java
│ │ │ │ │ │ ├── TradeMessage.java
│ │ │ │ │ │ └── TradeProtocolVersion.java
│ │ │ │ │ ├── protocol/
│ │ │ │ │ │ ├── ArbitratorProtocol.java
│ │ │ │ │ │ ├── BuyerAsMakerProtocol.java
│ │ │ │ │ │ ├── BuyerAsTakerProtocol.java
│ │ │ │ │ │ ├── BuyerProtocol.java
│ │ │ │ │ │ ├── DisputeProtocol.java
│ │ │ │ │ │ ├── FluentProtocol.java
│ │ │ │ │ │ ├── MakerProtocol.java
│ │ │ │ │ │ ├── ProcessModel.java
│ │ │ │ │ │ ├── ProcessModelServiceProvider.java
│ │ │ │ │ │ ├── SellerAsMakerProtocol.java
│ │ │ │ │ │ ├── SellerAsTakerProtocol.java
│ │ │ │ │ │ ├── SellerProtocol.java
│ │ │ │ │ │ ├── TakerProtocol.java
│ │ │ │ │ │ ├── TradeListener.java
│ │ │ │ │ │ ├── TradePeer.java
│ │ │ │ │ │ ├── TradeProtocol.java
│ │ │ │ │ │ ├── TradeProtocolFactory.java
│ │ │ │ │ │ ├── TradeTaskRunner.java
│ │ │ │ │ │ ├── TraderProtocol.java
│ │ │ │ │ │ └── tasks/
│ │ │ │ │ │ ├── ApplyFilter.java
│ │ │ │ │ │ ├── ArbitratorProcessDepositRequest.java
│ │ │ │ │ │ ├── ArbitratorProcessReserveTx.java
│ │ │ │ │ │ ├── ArbitratorSendDisputeOpenedMessage.java
│ │ │ │ │ │ ├── ArbitratorSendDisputeOpenedMessageToBuyer.java
│ │ │ │ │ │ ├── ArbitratorSendDisputeOpenedMessageToSeller.java
│ │ │ │ │ │ ├── ArbitratorSendInitTradeOrMultisigRequests.java
│ │ │ │ │ │ ├── BuyerPreparePaymentSentMessage.java
│ │ │ │ │ │ ├── BuyerSendPaymentSentMessage.java
│ │ │ │ │ │ ├── BuyerSendPaymentSentMessageToArbitrator.java
│ │ │ │ │ │ ├── BuyerSendPaymentSentMessageToSeller.java
│ │ │ │ │ │ ├── MakerRecreateReserveTx.java
│ │ │ │ │ │ ├── MakerSendInitTradeRequestToArbitrator.java
│ │ │ │ │ │ ├── MakerSetLockTime.java
│ │ │ │ │ │ ├── MaybeResendDisputeClosedMessageWithPayout.java
│ │ │ │ │ │ ├── MaybeSendSignContractRequest.java
│ │ │ │ │ │ ├── ProcessDepositResponse.java
│ │ │ │ │ │ ├── ProcessDepositsConfirmedMessage.java
│ │ │ │ │ │ ├── ProcessInitMultisigRequest.java
│ │ │ │ │ │ ├── ProcessInitTradeRequest.java
│ │ │ │ │ │ ├── ProcessPaymentReceivedMessage.java
│ │ │ │ │ │ ├── ProcessPaymentSentMessage.java
│ │ │ │ │ │ ├── ProcessSignContractRequest.java
│ │ │ │ │ │ ├── SellerPreparePaymentReceivedMessage.java
│ │ │ │ │ │ ├── SellerSendPaymentReceivedMessage.java
│ │ │ │ │ │ ├── SellerSendPaymentReceivedMessageToArbitrator.java
│ │ │ │ │ │ ├── SellerSendPaymentReceivedMessageToBuyer.java
│ │ │ │ │ │ ├── SendDepositRequest.java
│ │ │ │ │ │ ├── SendDepositsConfirmedMessage.java
│ │ │ │ │ │ ├── SendDepositsConfirmedMessageToArbitrator.java
│ │ │ │ │ │ ├── SendDepositsConfirmedMessageToBuyer.java
│ │ │ │ │ │ ├── SendDepositsConfirmedMessageToSeller.java
│ │ │ │ │ │ ├── SendMailboxMessageTask.java
│ │ │ │ │ │ ├── TakerReserveTradeFunds.java
│ │ │ │ │ │ ├── TakerSendInitTradeRequestToArbitrator.java
│ │ │ │ │ │ ├── TakerSendInitTradeRequestToMaker.java
│ │ │ │ │ │ ├── TradeTask.java
│ │ │ │ │ │ ├── VerifyPeersAccountAgeWitness.java
│ │ │ │ │ │ └── mediation/
│ │ │ │ │ │ ├── FinalizeMediatedPayoutTx.java
│ │ │ │ │ │ ├── ProcessMediatedPayoutSignatureMessage.java
│ │ │ │ │ │ ├── ProcessMediatedPayoutTxPublishedMessage.java
│ │ │ │ │ │ ├── SendMediatedPayoutSignatureMessage.java
│ │ │ │ │ │ ├── SendMediatedPayoutTxPublishedMessage.java
│ │ │ │ │ │ ├── SetupMediatedPayoutTxListener.java
│ │ │ │ │ │ └── SignMediatedPayoutTx.java
│ │ │ │ │ └── statistics/
│ │ │ │ │ ├── ReferralId.java
│ │ │ │ │ ├── ReferralIdService.java
│ │ │ │ │ ├── TradeStatistics3.java
│ │ │ │ │ ├── TradeStatistics3StorageService.java
│ │ │ │ │ ├── TradeStatistics3Store.java
│ │ │ │ │ ├── TradeStatisticsForJson.java
│ │ │ │ │ └── TradeStatisticsManager.java
│ │ │ │ ├── user/
│ │ │ │ │ ├── AutoConfirmSettings.java
│ │ │ │ │ ├── BlockChainExplorer.java
│ │ │ │ │ ├── Cookie.java
│ │ │ │ │ ├── CookieKey.java
│ │ │ │ │ ├── DontShowAgainLookup.java
│ │ │ │ │ ├── Preferences.java
│ │ │ │ │ ├── PreferencesPayload.java
│ │ │ │ │ ├── User.java
│ │ │ │ │ └── UserPayload.java
│ │ │ │ ├── util/
│ │ │ │ │ ├── AveragePriceUtil.java
│ │ │ │ │ ├── FormattingUtils.java
│ │ │ │ │ ├── GenerateKeyPairs.java
│ │ │ │ │ ├── InlierUtil.java
│ │ │ │ │ ├── JsonUtil.java
│ │ │ │ │ ├── ParsingUtils.java
│ │ │ │ │ ├── PriceUtil.java
│ │ │ │ │ ├── SimpleMarkdownParser.java
│ │ │ │ │ ├── Validator.java
│ │ │ │ │ ├── VolumeUtil.java
│ │ │ │ │ ├── coin/
│ │ │ │ │ │ ├── CoinFormatter.java
│ │ │ │ │ │ ├── CoinUtil.java
│ │ │ │ │ │ └── ImmutableCoinFormatter.java
│ │ │ │ │ └── validation/
│ │ │ │ │ ├── AmountValidator4Decimals.java
│ │ │ │ │ ├── AmountValidator8Decimals.java
│ │ │ │ │ ├── BtcAddressValidator.java
│ │ │ │ │ ├── HexStringValidator.java
│ │ │ │ │ ├── InputValidator.java
│ │ │ │ │ ├── IntegerValidator.java
│ │ │ │ │ ├── MonetaryValidator.java
│ │ │ │ │ ├── NumberValidator.java
│ │ │ │ │ ├── RegexValidator.java
│ │ │ │ │ ├── RegexValidatorFactory.java
│ │ │ │ │ ├── StringValidator.java
│ │ │ │ │ └── UrlInputValidator.java
│ │ │ │ └── xmr/
│ │ │ │ ├── Balances.java
│ │ │ │ ├── XmrConnectionModule.java
│ │ │ │ ├── XmrModule.java
│ │ │ │ ├── XmrNodeSettings.java
│ │ │ │ ├── exceptions/
│ │ │ │ │ ├── AddressEntryException.java
│ │ │ │ │ ├── InsufficientFundsException.java
│ │ │ │ │ ├── InvalidHostException.java
│ │ │ │ │ ├── RejectedTxException.java
│ │ │ │ │ ├── SigningException.java
│ │ │ │ │ ├── TransactionVerificationException.java
│ │ │ │ │ ├── TxBroadcastException.java
│ │ │ │ │ ├── TxBroadcastTimeoutException.java
│ │ │ │ │ └── WalletException.java
│ │ │ │ ├── listeners/
│ │ │ │ │ ├── AddressConfidenceListener.java
│ │ │ │ │ ├── BalanceListener.java
│ │ │ │ │ ├── TxConfidenceListener.java
│ │ │ │ │ └── XmrBalanceListener.java
│ │ │ │ ├── model/
│ │ │ │ │ ├── AddressEntry.java
│ │ │ │ │ ├── AddressEntryList.java
│ │ │ │ │ ├── EncryptedConnectionList.java
│ │ │ │ │ ├── InputsAndChangeOutput.java
│ │ │ │ │ ├── PreparedDepositTxAndMakerInputs.java
│ │ │ │ │ ├── RawTransactionInput.java
│ │ │ │ │ ├── XmrAddressEntry.java
│ │ │ │ │ └── XmrAddressEntryList.java
│ │ │ │ ├── nodes/
│ │ │ │ │ ├── ProxySocketFactory.java
│ │ │ │ │ ├── SeedPeersSocks5Dns.java
│ │ │ │ │ ├── XmrNetworkConfig.java
│ │ │ │ │ ├── XmrNodeConverter.java
│ │ │ │ │ ├── XmrNodes.java
│ │ │ │ │ ├── XmrNodesRepository.java
│ │ │ │ │ └── XmrNodesSetupPreferences.java
│ │ │ │ ├── setup/
│ │ │ │ │ ├── DownloadListener.java
│ │ │ │ │ ├── HavenoKeyChainFactory.java
│ │ │ │ │ ├── HavenoKeyChainGroupStructure.java
│ │ │ │ │ ├── MoneroWalletRpcManager.java
│ │ │ │ │ ├── RegTestHost.java
│ │ │ │ │ ├── WalletConfig.java
│ │ │ │ │ └── WalletsSetup.java
│ │ │ │ └── wallet/
│ │ │ │ ├── BtcCoinSelector.java
│ │ │ │ ├── BtcWalletService.java
│ │ │ │ ├── HavenoDefaultCoinSelector.java
│ │ │ │ ├── HavenoRiskAnalysis.java
│ │ │ │ ├── NonBsqCoinSelector.java
│ │ │ │ ├── Restrictions.java
│ │ │ │ ├── TradeWalletService.java
│ │ │ │ ├── WalletService.java
│ │ │ │ ├── WalletsManager.java
│ │ │ │ ├── XmrWalletBase.java
│ │ │ │ └── XmrWalletService.java
│ │ │ └── resources/
│ │ │ ├── bip39_english.txt
│ │ │ ├── haveno.policy
│ │ │ ├── haveno.properties
│ │ │ ├── help/
│ │ │ │ ├── canceloffer-help.txt
│ │ │ │ ├── confirmpaymentreceived-help.txt
│ │ │ │ ├── confirmpaymentstarted-help.txt
│ │ │ │ ├── createoffer-help.txt
│ │ │ │ ├── createpaymentacct-help.txt
│ │ │ │ ├── getaddressbalance-help.txt
│ │ │ │ ├── getbalance-help.txt
│ │ │ │ ├── getfundingaddresses-help.txt
│ │ │ │ ├── getmyoffer-help.txt
│ │ │ │ ├── getmyoffers-help.txt
│ │ │ │ ├── getoffer-help.txt
│ │ │ │ ├── getoffers-help.txt
│ │ │ │ ├── getpaymentacctform-help.txt
│ │ │ │ ├── getpaymentaccts-help.txt
│ │ │ │ ├── getpaymentmethods-help.txt
│ │ │ │ ├── gettrade-help.txt
│ │ │ │ ├── gettransaction-help.txt
│ │ │ │ ├── gettxfeerate-help.txt
│ │ │ │ ├── getversion-help.txt
│ │ │ │ ├── getxmrprice-help.txt
│ │ │ │ ├── keepfunds-help.txt
│ │ │ │ ├── lockwallet-help.txt
│ │ │ │ ├── removewalletpassword-help.txt
│ │ │ │ ├── sendxmr-help.txt
│ │ │ │ ├── settxfeerate-help.txt
│ │ │ │ ├── setwalletpassword-help.txt
│ │ │ │ ├── stop-help.txt
│ │ │ │ ├── takeoffer-help.txt
│ │ │ │ ├── unlockwallet-help.txt
│ │ │ │ ├── unsettxfeerate-help.txt
│ │ │ │ └── withdrawfunds-help.txt
│ │ │ ├── i18n/
│ │ │ │ ├── displayStrings.properties
│ │ │ │ ├── displayStrings_cs.properties
│ │ │ │ ├── displayStrings_de.properties
│ │ │ │ ├── displayStrings_es.properties
│ │ │ │ ├── displayStrings_fa.properties
│ │ │ │ ├── displayStrings_fr.properties
│ │ │ │ ├── displayStrings_it.properties
│ │ │ │ ├── displayStrings_ja.properties
│ │ │ │ ├── displayStrings_pt-br.properties
│ │ │ │ ├── displayStrings_pt.properties
│ │ │ │ ├── displayStrings_ru.properties
│ │ │ │ ├── displayStrings_th.properties
│ │ │ │ ├── displayStrings_tr.properties
│ │ │ │ ├── displayStrings_vi.properties
│ │ │ │ ├── displayStrings_zh-hans.properties
│ │ │ │ └── displayStrings_zh-hant.properties
│ │ │ ├── prevent-app-nap-silent-sound.aiff
│ │ │ ├── wallet/
│ │ │ │ ├── checkpoints.testnet.txt
│ │ │ │ └── checkpoints.txt
│ │ │ ├── xmr_local.seednodes
│ │ │ ├── xmr_mainnet.seednodes
│ │ │ └── xmr_stagenet.seednodes
│ │ └── test/
│ │ ├── java/
│ │ │ └── haveno/
│ │ │ └── core/
│ │ │ ├── account/
│ │ │ │ ├── sign/
│ │ │ │ │ ├── SignedWitnessServiceTest.java
│ │ │ │ │ └── SignedWitnessTest.java
│ │ │ │ └── witness/
│ │ │ │ └── AccountAgeWitnessServiceTest.java
│ │ │ ├── app/
│ │ │ │ └── HavenoHelpFormatterTest.java
│ │ │ ├── arbitration/
│ │ │ │ ├── ArbitratorManagerTest.java
│ │ │ │ ├── ArbitratorTest.java
│ │ │ │ ├── MediatorTest.java
│ │ │ │ └── TraderDataItemTest.java
│ │ │ ├── crypto/
│ │ │ │ ├── EncryptionTest.java
│ │ │ │ └── SigTest.java
│ │ │ ├── locale/
│ │ │ │ ├── BankUtilTest.java
│ │ │ │ ├── CurrencyUtilTest.java
│ │ │ │ └── MockTestnetCoin.java
│ │ │ ├── message/
│ │ │ │ └── MarshallerTest.java
│ │ │ ├── monetary/
│ │ │ │ └── PriceTest.java
│ │ │ ├── network/
│ │ │ │ └── p2p/
│ │ │ │ └── seed/
│ │ │ │ └── DefaultSeedNodeRepositoryTest.java
│ │ │ ├── notifications/
│ │ │ │ └── MobileModelTest.java
│ │ │ ├── offer/
│ │ │ │ ├── OfferMaker.java
│ │ │ │ ├── OfferTest.java
│ │ │ │ ├── OpenOfferManagerTest.java
│ │ │ │ └── availability/
│ │ │ │ └── ArbitratorSelectionTest.java
│ │ │ ├── payment/
│ │ │ │ ├── PaymentAccountsTest.java
│ │ │ │ ├── ReceiptPredicatesTest.java
│ │ │ │ ├── ReceiptValidatorTest.java
│ │ │ │ ├── TradeLimitsTest.java
│ │ │ │ └── validation/
│ │ │ │ └── CryptoAddressValidatorTest.java
│ │ │ ├── provider/
│ │ │ │ └── price/
│ │ │ │ └── MarketPriceFeedServiceTest.java
│ │ │ ├── support/
│ │ │ │ └── dispute/
│ │ │ │ └── mediation/
│ │ │ │ └── FileTransferSessionTest.java
│ │ │ ├── trade/
│ │ │ │ └── TradableListTest.java
│ │ │ ├── user/
│ │ │ │ ├── PreferencesTest.java
│ │ │ │ └── UserPayloadModelVOTest.java
│ │ │ ├── util/
│ │ │ │ ├── FormattingUtilsTest.java
│ │ │ │ ├── ProtoUtilTest.java
│ │ │ │ ├── RegexValidatorTest.java
│ │ │ │ └── coin/
│ │ │ │ └── CoinUtilTest.java
│ │ │ └── xmr/
│ │ │ ├── nodes/
│ │ │ │ ├── BtcNetworkConfigTest.java
│ │ │ │ ├── XmrNodeConverterTest.java
│ │ │ │ ├── XmrNodesRepositoryTest.java
│ │ │ │ └── XmrNodesSetupPreferencesTest.java
│ │ │ └── wallet/
│ │ │ └── RestrictionsTest.java
│ │ └── resources/
│ │ ├── haveno/
│ │ │ └── core/
│ │ │ ├── app/
│ │ │ │ ├── cli-output.txt
│ │ │ │ └── cli-output_windows.txt
│ │ │ ├── dao/
│ │ │ │ └── node/
│ │ │ │ └── full/
│ │ │ │ └── rpc/
│ │ │ │ ├── getblock-result-verbosity-0.txt
│ │ │ │ ├── getblock-result-verbosity-1.json
│ │ │ │ ├── getblock-result-verbosity-2.json
│ │ │ │ └── getnetworkinfo-result.json
│ │ │ └── provider/
│ │ │ └── mempool/
│ │ │ ├── badOfferTestData.json
│ │ │ ├── offerTestData.json
│ │ │ └── txInfo.json
│ │ ├── mainnet.seednodes
│ │ ├── mockito-extensions/
│ │ │ └── org.mockito.plugins.MockMaker
│ │ ├── regtest.seednodes
│ │ └── testnet.seednodes
│ └── update_translations.sh
├── daemon/
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── haveno/
│ │ │ └── daemon/
│ │ │ ├── app/
│ │ │ │ ├── HavenoDaemon.java
│ │ │ │ └── HavenoDaemonMain.java
│ │ │ └── grpc/
│ │ │ ├── GrpcAccountService.java
│ │ │ ├── GrpcDisputeAgentsService.java
│ │ │ ├── GrpcDisputesService.java
│ │ │ ├── GrpcErrorMessageHandler.java
│ │ │ ├── GrpcExceptionHandler.java
│ │ │ ├── GrpcGetTradeStatisticsService.java
│ │ │ ├── GrpcHelpService.java
│ │ │ ├── GrpcNotificationsService.java
│ │ │ ├── GrpcOffersService.java
│ │ │ ├── GrpcPaymentAccountsService.java
│ │ │ ├── GrpcPriceService.java
│ │ │ ├── GrpcServer.java
│ │ │ ├── GrpcShutdownService.java
│ │ │ ├── GrpcTradesService.java
│ │ │ ├── GrpcVersionService.java
│ │ │ ├── GrpcWalletsService.java
│ │ │ ├── GrpcXmrConnectionService.java
│ │ │ ├── GrpcXmrNodeService.java
│ │ │ └── interceptor/
│ │ │ ├── CallRateMeteringInterceptor.java
│ │ │ ├── GrpcCallRateMeter.java
│ │ │ ├── GrpcServiceRateMeteringConfig.java
│ │ │ └── PasswordAuthInterceptor.java
│ │ └── resources/
│ │ └── logback.xml
│ └── test/
│ └── java/
│ └── haveno/
│ └── daemon/
│ └── grpc/
│ └── interceptor/
│ └── GrpcServiceRateMeteringConfigTest.java
├── desktop/
│ ├── package/
│ │ ├── 29CDFD3B.asc
│ │ ├── 5BC5ED73.asc
│ │ ├── F379A1C6.asc
│ │ ├── README.md
│ │ ├── linux/
│ │ │ ├── Dockerfile
│ │ │ ├── Haveno.desktop
│ │ │ ├── exchange.haveno.Haveno.metainfo.xml
│ │ │ ├── exchange.haveno.Haveno.yml
│ │ │ └── jpackage.deb/
│ │ │ └── Haveno.desktop
│ │ ├── macosx/
│ │ │ ├── Haveno-volume.icns
│ │ │ ├── Haveno.icns
│ │ │ ├── Info.plist
│ │ │ ├── copy_dbs.sh
│ │ │ ├── finalize.sh
│ │ │ ├── insert_snapshot_version.sh
│ │ │ ├── macos.entitlements
│ │ │ └── replace_version_number.sh
│ │ ├── package.gradle
│ │ ├── signingkey.asc
│ │ ├── tools-1.0.jar
│ │ └── windows/
│ │ ├── main.wxs
│ │ └── overrides.wxi
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── haveno/
│ │ │ └── desktop/
│ │ │ ├── CandleStickChart.css
│ │ │ ├── DesktopModule.java
│ │ │ ├── Navigation.java
│ │ │ ├── app/
│ │ │ │ ├── HavenoApp.java
│ │ │ │ ├── HavenoAppMain.java
│ │ │ │ └── HavenoAppModule.java
│ │ │ ├── common/
│ │ │ │ ├── UITimer.java
│ │ │ │ ├── ViewfxException.java
│ │ │ │ ├── fxml/
│ │ │ │ │ └── FxmlViewLoader.java
│ │ │ │ ├── model/
│ │ │ │ │ ├── Activatable.java
│ │ │ │ │ ├── ActivatableDataModel.java
│ │ │ │ │ ├── ActivatableViewModel.java
│ │ │ │ │ ├── ActivatableWithDataModel.java
│ │ │ │ │ ├── DataModel.java
│ │ │ │ │ ├── Model.java
│ │ │ │ │ ├── ViewModel.java
│ │ │ │ │ └── WithDataModel.java
│ │ │ │ └── view/
│ │ │ │ ├── AbstractView.java
│ │ │ │ ├── ActivatableView.java
│ │ │ │ ├── ActivatableViewAndModel.java
│ │ │ │ ├── CachingViewLoader.java
│ │ │ │ ├── DefaultPathConvention.java
│ │ │ │ ├── FxmlView.java
│ │ │ │ ├── InitializableView.java
│ │ │ │ ├── View.java
│ │ │ │ ├── ViewFactory.java
│ │ │ │ ├── ViewLoader.java
│ │ │ │ ├── ViewPath.java
│ │ │ │ └── guice/
│ │ │ │ └── InjectorViewFactory.java
│ │ │ ├── components/
│ │ │ │ ├── AccountStatusTooltipLabel.java
│ │ │ │ ├── AddressTextField.java
│ │ │ │ ├── AddressWithIconAndDirection.java
│ │ │ │ ├── AutoTooltipButton.java
│ │ │ │ ├── AutoTooltipCheckBox.java
│ │ │ │ ├── AutoTooltipLabel.java
│ │ │ │ ├── AutoTooltipRadioButton.java
│ │ │ │ ├── AutoTooltipSlideToggleButton.java
│ │ │ │ ├── AutoTooltipTableColumn.java
│ │ │ │ ├── AutoTooltipTextField.java
│ │ │ │ ├── AutoTooltipToggleButton.java
│ │ │ │ ├── AutocompleteComboBox.java
│ │ │ │ ├── BalanceTextField.java
│ │ │ │ ├── BusyAnimation.java
│ │ │ │ ├── ColoredDecimalPlacesWithZerosText.java
│ │ │ │ ├── ExplorerAddressTextField.java
│ │ │ │ ├── ExternalHyperlink.java
│ │ │ │ ├── FundsTextField.java
│ │ │ │ ├── HavenoTextArea.java
│ │ │ │ ├── HavenoTextField.java
│ │ │ │ ├── HyperlinkWithIcon.java
│ │ │ │ ├── InfoAutoTooltipLabel.java
│ │ │ │ ├── InfoDisplay.java
│ │ │ │ ├── InfoInputTextField.java
│ │ │ │ ├── InfoTextField.java
│ │ │ │ ├── InputTextArea.java
│ │ │ │ ├── InputTextField.java
│ │ │ │ ├── JFXRadioButtonSkinHavenoStyle.java
│ │ │ │ ├── JFXTextAreaSkinHavenoStyle.java
│ │ │ │ ├── JFXTextFieldSkinHavenoStyle.java
│ │ │ │ ├── MenuItem.java
│ │ │ │ ├── NewBadge.java
│ │ │ │ ├── PasswordTextField.java
│ │ │ │ ├── PeerInfoIcon.java
│ │ │ │ ├── PeerInfoIconDispute.java
│ │ │ │ ├── PeerInfoIconMap.java
│ │ │ │ ├── PeerInfoIconSmall.java
│ │ │ │ ├── PeerInfoIconTrading.java
│ │ │ │ ├── PopOverWrapper.java
│ │ │ │ ├── SimpleMarkdownLabel.java
│ │ │ │ ├── TableGroupHeadline.java
│ │ │ │ ├── TextFieldWithCopyIcon.java
│ │ │ │ ├── TextFieldWithIcon.java
│ │ │ │ ├── TitledGroupBg.java
│ │ │ │ ├── TooltipUtil.java
│ │ │ │ ├── TxIdTextField.java
│ │ │ │ ├── chart/
│ │ │ │ │ ├── ChartDataModel.java
│ │ │ │ │ ├── ChartView.java
│ │ │ │ │ ├── ChartViewModel.java
│ │ │ │ │ └── TemporalAdjusterModel.java
│ │ │ │ ├── controlsfx/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── control/
│ │ │ │ │ │ ├── PopOver.java
│ │ │ │ │ │ └── popover.css
│ │ │ │ │ └── skin/
│ │ │ │ │ └── PopOverSkin.java
│ │ │ │ ├── indicator/
│ │ │ │ │ ├── TxConfidenceIndicator.java
│ │ │ │ │ └── skin/
│ │ │ │ │ └── StaticProgressIndicatorSkin.java
│ │ │ │ ├── list/
│ │ │ │ │ └── FilterBox.java
│ │ │ │ └── paymentmethods/
│ │ │ │ ├── AchTransferForm.java
│ │ │ │ ├── AdvancedCashForm.java
│ │ │ │ ├── AliPayForm.java
│ │ │ │ ├── AmazonGiftCardForm.java
│ │ │ │ ├── AssetsForm.java
│ │ │ │ ├── AustraliaPayidForm.java
│ │ │ │ ├── BankForm.java
│ │ │ │ ├── BizumForm.java
│ │ │ │ ├── CapitualForm.java
│ │ │ │ ├── CashAppForm.java
│ │ │ │ ├── CashAtAtmForm.java
│ │ │ │ ├── CashDepositForm.java
│ │ │ │ ├── CelPayForm.java
│ │ │ │ ├── ChaseQuickPayForm.java
│ │ │ │ ├── DomesticWireTransferForm.java
│ │ │ │ ├── F2FForm.java
│ │ │ │ ├── FasterPaymentsForm.java
│ │ │ │ ├── GeneralAccountNumberForm.java
│ │ │ │ ├── GeneralBankForm.java
│ │ │ │ ├── GeneralSepaForm.java
│ │ │ │ ├── GeneralUsBankForm.java
│ │ │ │ ├── HalCashForm.java
│ │ │ │ ├── IfscBankForm.java
│ │ │ │ ├── ImpsForm.java
│ │ │ │ ├── InteracETransferForm.java
│ │ │ │ ├── JapanBankTransferForm.java
│ │ │ │ ├── MoneseForm.java
│ │ │ │ ├── MoneyBeamForm.java
│ │ │ │ ├── MoneyGramForm.java
│ │ │ │ ├── NationalBankForm.java
│ │ │ │ ├── NeftForm.java
│ │ │ │ ├── NequiForm.java
│ │ │ │ ├── PaxumForm.java
│ │ │ │ ├── PayByMailForm.java
│ │ │ │ ├── PayPalForm.java
│ │ │ │ ├── PaymentMethodForm.java
│ │ │ │ ├── PaysafeForm.java
│ │ │ │ ├── PayseraForm.java
│ │ │ │ ├── PaytmForm.java
│ │ │ │ ├── PerfectMoneyForm.java
│ │ │ │ ├── PixForm.java
│ │ │ │ ├── PopmoneyForm.java
│ │ │ │ ├── PromptPayForm.java
│ │ │ │ ├── RevolutForm.java
│ │ │ │ ├── RtgsForm.java
│ │ │ │ ├── SameBankForm.java
│ │ │ │ ├── SatispayForm.java
│ │ │ │ ├── SepaForm.java
│ │ │ │ ├── SepaInstantForm.java
│ │ │ │ ├── SpecificBankForm.java
│ │ │ │ ├── StrikeForm.java
│ │ │ │ ├── SwiftForm.java
│ │ │ │ ├── SwishForm.java
│ │ │ │ ├── TikkieForm.java
│ │ │ │ ├── TransferwiseForm.java
│ │ │ │ ├── TransferwiseUsdForm.java
│ │ │ │ ├── USPostalMoneyOrderForm.java
│ │ │ │ ├── UpholdForm.java
│ │ │ │ ├── UpiForm.java
│ │ │ │ ├── VenmoForm.java
│ │ │ │ ├── VerseForm.java
│ │ │ │ ├── WeChatPayForm.java
│ │ │ │ ├── WesternUnionForm.java
│ │ │ │ └── ZelleForm.java
│ │ │ ├── haveno.css
│ │ │ ├── images.css
│ │ │ ├── main/
│ │ │ │ ├── MainView.fxml
│ │ │ │ ├── MainView.java
│ │ │ │ ├── MainViewModel.java
│ │ │ │ ├── SharedPresentation.java
│ │ │ │ ├── account/
│ │ │ │ │ ├── AccountView.fxml
│ │ │ │ │ ├── AccountView.java
│ │ │ │ │ ├── content/
│ │ │ │ │ │ ├── PaymentAccountsView.java
│ │ │ │ │ │ ├── backup/
│ │ │ │ │ │ │ ├── BackupView.fxml
│ │ │ │ │ │ │ └── BackupView.java
│ │ │ │ │ │ ├── cryptoaccounts/
│ │ │ │ │ │ │ ├── CryptoAccountsDataModel.java
│ │ │ │ │ │ │ ├── CryptoAccountsView.fxml
│ │ │ │ │ │ │ ├── CryptoAccountsView.java
│ │ │ │ │ │ │ └── CryptoAccountsViewModel.java
│ │ │ │ │ │ ├── notifications/
│ │ │ │ │ │ │ ├── ManageMarketAlertsWindow.java
│ │ │ │ │ │ │ ├── MobileNotificationsView.fxml
│ │ │ │ │ │ │ ├── MobileNotificationsView.java
│ │ │ │ │ │ │ └── NoWebCamFoundException.java
│ │ │ │ │ │ ├── password/
│ │ │ │ │ │ │ ├── PasswordView.fxml
│ │ │ │ │ │ │ └── PasswordView.java
│ │ │ │ │ │ ├── seedwords/
│ │ │ │ │ │ │ ├── SeedWordsView.fxml
│ │ │ │ │ │ │ └── SeedWordsView.java
│ │ │ │ │ │ ├── traditionalaccounts/
│ │ │ │ │ │ │ ├── TraditionalAccountsDataModel.java
│ │ │ │ │ │ │ ├── TraditionalAccountsView.fxml
│ │ │ │ │ │ │ ├── TraditionalAccountsView.java
│ │ │ │ │ │ │ └── TraditionalAccountsViewModel.java
│ │ │ │ │ │ └── walletinfo/
│ │ │ │ │ │ ├── WalletInfoView.fxml
│ │ │ │ │ │ └── WalletInfoView.java
│ │ │ │ │ └── register/
│ │ │ │ │ ├── AgentRegistrationView.java
│ │ │ │ │ ├── AgentRegistrationViewModel.java
│ │ │ │ │ ├── arbitrator/
│ │ │ │ │ │ ├── ArbitratorRegistrationView.fxml
│ │ │ │ │ │ ├── ArbitratorRegistrationView.java
│ │ │ │ │ │ └── ArbitratorRegistrationViewModel.java
│ │ │ │ │ ├── mediator/
│ │ │ │ │ │ ├── MediatorRegistrationView.fxml
│ │ │ │ │ │ ├── MediatorRegistrationView.java
│ │ │ │ │ │ └── MediatorRegistrationViewModel.java
│ │ │ │ │ ├── refundagent/
│ │ │ │ │ │ ├── RefundAgentRegistrationView.fxml
│ │ │ │ │ │ ├── RefundAgentRegistrationView.java
│ │ │ │ │ │ └── RefundAgentRegistrationViewModel.java
│ │ │ │ │ └── signing/
│ │ │ │ │ ├── SigningView.fxml
│ │ │ │ │ └── SigningView.java
│ │ │ │ ├── debug/
│ │ │ │ │ ├── DebugView.fxml
│ │ │ │ │ └── DebugView.java
│ │ │ │ ├── funds/
│ │ │ │ │ ├── FundsView.fxml
│ │ │ │ │ ├── FundsView.java
│ │ │ │ │ ├── deposit/
│ │ │ │ │ │ ├── DepositListItem.java
│ │ │ │ │ │ ├── DepositView.fxml
│ │ │ │ │ │ └── DepositView.java
│ │ │ │ │ ├── locked/
│ │ │ │ │ │ ├── LockedListItem.java
│ │ │ │ │ │ ├── LockedView.fxml
│ │ │ │ │ │ └── LockedView.java
│ │ │ │ │ ├── reserved/
│ │ │ │ │ │ ├── ReservedListItem.java
│ │ │ │ │ │ ├── ReservedView.fxml
│ │ │ │ │ │ └── ReservedView.java
│ │ │ │ │ ├── transactions/
│ │ │ │ │ │ ├── DisplayedTransactions.java
│ │ │ │ │ │ ├── DisplayedTransactionsFactory.java
│ │ │ │ │ │ ├── DummyTransactionAwareTradable.java
│ │ │ │ │ │ ├── ObservableListDecorator.java
│ │ │ │ │ │ ├── TradableRepository.java
│ │ │ │ │ │ ├── TransactionAwareOpenOffer.java
│ │ │ │ │ │ ├── TransactionAwareTradable.java
│ │ │ │ │ │ ├── TransactionAwareTradableFactory.java
│ │ │ │ │ │ ├── TransactionAwareTrade.java
│ │ │ │ │ │ ├── TransactionListItemFactory.java
│ │ │ │ │ │ ├── TransactionsListItem.java
│ │ │ │ │ │ ├── TransactionsView.fxml
│ │ │ │ │ │ └── TransactionsView.java
│ │ │ │ │ └── withdrawal/
│ │ │ │ │ ├── WithdrawalListItem.java
│ │ │ │ │ ├── WithdrawalView.fxml
│ │ │ │ │ └── WithdrawalView.java
│ │ │ │ ├── market/
│ │ │ │ │ ├── MarketView.fxml
│ │ │ │ │ ├── MarketView.java
│ │ │ │ │ ├── offerbook/
│ │ │ │ │ │ ├── OfferBookChartView.fxml
│ │ │ │ │ │ ├── OfferBookChartView.java
│ │ │ │ │ │ ├── OfferBookChartViewModel.java
│ │ │ │ │ │ └── OfferListItem.java
│ │ │ │ │ ├── spread/
│ │ │ │ │ │ ├── SpreadItem.java
│ │ │ │ │ │ ├── SpreadView.fxml
│ │ │ │ │ │ ├── SpreadView.java
│ │ │ │ │ │ ├── SpreadViewModel.java
│ │ │ │ │ │ ├── SpreadViewPaymentMethod.fxml
│ │ │ │ │ │ └── SpreadViewPaymentMethod.java
│ │ │ │ │ └── trades/
│ │ │ │ │ ├── ChartCalculations.java
│ │ │ │ │ ├── TradeStatistics3ListItem.java
│ │ │ │ │ ├── TradesChartsView.fxml
│ │ │ │ │ ├── TradesChartsView.java
│ │ │ │ │ ├── TradesChartsViewModel.java
│ │ │ │ │ └── charts/
│ │ │ │ │ ├── CandleData.java
│ │ │ │ │ ├── price/
│ │ │ │ │ │ ├── Candle.java
│ │ │ │ │ │ ├── CandleStickChart.java
│ │ │ │ │ │ └── CandleTooltip.java
│ │ │ │ │ └── volume/
│ │ │ │ │ ├── VolumeBar.java
│ │ │ │ │ └── VolumeChart.java
│ │ │ │ ├── offer/
│ │ │ │ │ ├── BuyOfferView.fxml
│ │ │ │ │ ├── BuyOfferView.java
│ │ │ │ │ ├── ClosableView.java
│ │ │ │ │ ├── InitializableViewWithTakeOfferData.java
│ │ │ │ │ ├── MutableOfferDataModel.java
│ │ │ │ │ ├── MutableOfferView.java
│ │ │ │ │ ├── MutableOfferViewModel.java
│ │ │ │ │ ├── OfferDataModel.java
│ │ │ │ │ ├── OfferView.java
│ │ │ │ │ ├── OfferViewModelUtil.java
│ │ │ │ │ ├── OfferViewUtil.java
│ │ │ │ │ ├── SelectableView.java
│ │ │ │ │ ├── SellOfferView.fxml
│ │ │ │ │ ├── SellOfferView.java
│ │ │ │ │ ├── createoffer/
│ │ │ │ │ │ ├── CreateOfferDataModel.java
│ │ │ │ │ │ ├── CreateOfferView.fxml
│ │ │ │ │ │ ├── CreateOfferView.java
│ │ │ │ │ │ └── CreateOfferViewModel.java
│ │ │ │ │ ├── offerbook/
│ │ │ │ │ │ ├── CryptoOfferBookView.fxml
│ │ │ │ │ │ ├── CryptoOfferBookView.java
│ │ │ │ │ │ ├── CryptoOfferBookViewModel.java
│ │ │ │ │ │ ├── FiatOfferBookView.fxml
│ │ │ │ │ │ ├── FiatOfferBookView.java
│ │ │ │ │ │ ├── FiatOfferBookViewModel.java
│ │ │ │ │ │ ├── OfferBook.java
│ │ │ │ │ │ ├── OfferBookListItem.java
│ │ │ │ │ │ ├── OfferBookView.fxml
│ │ │ │ │ │ ├── OfferBookView.java
│ │ │ │ │ │ ├── OfferBookViewModel.java
│ │ │ │ │ │ ├── OtherOfferBookView.fxml
│ │ │ │ │ │ ├── OtherOfferBookView.java
│ │ │ │ │ │ └── OtherOfferBookViewModel.java
│ │ │ │ │ ├── signedoffer/
│ │ │ │ │ │ ├── SignedOfferListItem.java
│ │ │ │ │ │ ├── SignedOfferView.fxml
│ │ │ │ │ │ ├── SignedOfferView.java
│ │ │ │ │ │ ├── SignedOffersDataModel.java
│ │ │ │ │ │ └── SignedOffersViewModel.java
│ │ │ │ │ └── takeoffer/
│ │ │ │ │ ├── TakeOfferDataModel.java
│ │ │ │ │ ├── TakeOfferView.fxml
│ │ │ │ │ ├── TakeOfferView.java
│ │ │ │ │ └── TakeOfferViewModel.java
│ │ │ │ ├── overlays/
│ │ │ │ │ ├── Overlay.java
│ │ │ │ │ ├── TabbedOverlay.java
│ │ │ │ │ ├── editor/
│ │ │ │ │ │ ├── PasswordPopup.java
│ │ │ │ │ │ └── PeerInfoWithTagEditor.java
│ │ │ │ │ ├── notifications/
│ │ │ │ │ │ ├── Notification.java
│ │ │ │ │ │ ├── NotificationCenter.java
│ │ │ │ │ │ └── NotificationManager.java
│ │ │ │ │ ├── popups/
│ │ │ │ │ │ ├── Popup.java
│ │ │ │ │ │ └── PopupManager.java
│ │ │ │ │ └── windows/
│ │ │ │ │ ├── ClosedTradesSummaryWindow.java
│ │ │ │ │ ├── ContractWindow.java
│ │ │ │ │ ├── DisplayAlertMessageWindow.java
│ │ │ │ │ ├── DisputeSummaryWindow.java
│ │ │ │ │ ├── EditCustomExplorerWindow.java
│ │ │ │ │ ├── FilterWindow.java
│ │ │ │ │ ├── GenericMessageWindow.java
│ │ │ │ │ ├── OfferDetailsWindow.java
│ │ │ │ │ ├── QRCodeWindow.java
│ │ │ │ │ ├── SelectDepositTxWindow.java
│ │ │ │ │ ├── SendAlertMessageWindow.java
│ │ │ │ │ ├── SendLogFilesWindow.java
│ │ │ │ │ ├── SendPrivateNotificationWindow.java
│ │ │ │ │ ├── ShowWalletDataWindow.java
│ │ │ │ │ ├── SignPaymentAccountsWindow.java
│ │ │ │ │ ├── SignSpecificWitnessWindow.java
│ │ │ │ │ ├── SignUnsignedPubKeysWindow.java
│ │ │ │ │ ├── SwiftPaymentDetails.java
│ │ │ │ │ ├── TacWindow.java
│ │ │ │ │ ├── TorNetworkSettingsWindow.java
│ │ │ │ │ ├── TradeDetailsWindow.java
│ │ │ │ │ ├── TradeFeedbackWindow.java
│ │ │ │ │ ├── TxDetailsWindow.java
│ │ │ │ │ ├── TxWithdrawWindow.java
│ │ │ │ │ ├── UnlockDisputeAgentRegistrationWindow.java
│ │ │ │ │ ├── UpdateAmazonGiftCardAccountWindow.java
│ │ │ │ │ ├── UpdateRevolutAccountWindow.java
│ │ │ │ │ ├── VerifyDisputeResultSignatureWindow.java
│ │ │ │ │ ├── WalletPasswordWindow.java
│ │ │ │ │ ├── WebCamWindow.java
│ │ │ │ │ └── downloadupdate/
│ │ │ │ │ ├── DisplayUpdateDownloadWindow.java
│ │ │ │ │ ├── DownloadTask.java
│ │ │ │ │ ├── HavenoInstaller.java
│ │ │ │ │ └── VerifyTask.java
│ │ │ │ ├── portfolio/
│ │ │ │ │ ├── PortfolioView.fxml
│ │ │ │ │ ├── PortfolioView.java
│ │ │ │ │ ├── cloneoffer/
│ │ │ │ │ │ ├── CloneOfferDataModel.java
│ │ │ │ │ │ ├── CloneOfferView.fxml
│ │ │ │ │ │ ├── CloneOfferView.java
│ │ │ │ │ │ └── CloneOfferViewModel.java
│ │ │ │ │ ├── closedtrades/
│ │ │ │ │ │ ├── ClosedTradableListItem.java
│ │ │ │ │ │ ├── ClosedTradesDataModel.java
│ │ │ │ │ │ ├── ClosedTradesListItem.java
│ │ │ │ │ │ ├── ClosedTradesView.fxml
│ │ │ │ │ │ ├── ClosedTradesView.java
│ │ │ │ │ │ └── ClosedTradesViewModel.java
│ │ │ │ │ ├── duplicateoffer/
│ │ │ │ │ │ ├── DuplicateOfferDataModel.java
│ │ │ │ │ │ ├── DuplicateOfferView.fxml
│ │ │ │ │ │ ├── DuplicateOfferView.java
│ │ │ │ │ │ └── DuplicateOfferViewModel.java
│ │ │ │ │ ├── editoffer/
│ │ │ │ │ │ ├── EditOfferDataModel.java
│ │ │ │ │ │ ├── EditOfferView.fxml
│ │ │ │ │ │ ├── EditOfferView.java
│ │ │ │ │ │ └── EditOfferViewModel.java
│ │ │ │ │ ├── failedtrades/
│ │ │ │ │ │ ├── FailedTradesDataModel.java
│ │ │ │ │ │ ├── FailedTradesListItem.java
│ │ │ │ │ │ ├── FailedTradesView.fxml
│ │ │ │ │ │ ├── FailedTradesView.java
│ │ │ │ │ │ └── FailedTradesViewModel.java
│ │ │ │ │ ├── openoffer/
│ │ │ │ │ │ ├── OpenOfferListItem.java
│ │ │ │ │ │ ├── OpenOffersDataModel.java
│ │ │ │ │ │ ├── OpenOffersView.fxml
│ │ │ │ │ │ ├── OpenOffersView.java
│ │ │ │ │ │ └── OpenOffersViewModel.java
│ │ │ │ │ ├── pendingtrades/
│ │ │ │ │ │ ├── BuyerSubView.java
│ │ │ │ │ │ ├── PendingTradesDataModel.java
│ │ │ │ │ │ ├── PendingTradesListItem.java
│ │ │ │ │ │ ├── PendingTradesView.fxml
│ │ │ │ │ │ ├── PendingTradesView.java
│ │ │ │ │ │ ├── PendingTradesViewModel.java
│ │ │ │ │ │ ├── SellerSubView.java
│ │ │ │ │ │ ├── TradeStepInfo.java
│ │ │ │ │ │ ├── TradeSubView.java
│ │ │ │ │ │ └── steps/
│ │ │ │ │ │ ├── TradeStepView.java
│ │ │ │ │ │ ├── TradeWizardItem.java
│ │ │ │ │ │ ├── buyer/
│ │ │ │ │ │ │ ├── BuyerStep1View.java
│ │ │ │ │ │ │ ├── BuyerStep2View.java
│ │ │ │ │ │ │ ├── BuyerStep3View.java
│ │ │ │ │ │ │ └── BuyerStep4View.java
│ │ │ │ │ │ └── seller/
│ │ │ │ │ │ ├── SellerStep1View.java
│ │ │ │ │ │ ├── SellerStep2View.java
│ │ │ │ │ │ ├── SellerStep3View.java
│ │ │ │ │ │ └── SellerStep4View.java
│ │ │ │ │ └── presentation/
│ │ │ │ │ └── PortfolioUtil.java
│ │ │ │ ├── presentation/
│ │ │ │ │ ├── AccountPresentation.java
│ │ │ │ │ ├── MarketPricePresentation.java
│ │ │ │ │ └── SettingsPresentation.java
│ │ │ │ ├── settings/
│ │ │ │ │ ├── SettingsView.fxml
│ │ │ │ │ ├── SettingsView.java
│ │ │ │ │ ├── about/
│ │ │ │ │ │ ├── AboutView.fxml
│ │ │ │ │ │ └── AboutView.java
│ │ │ │ │ ├── network/
│ │ │ │ │ │ ├── MoneroNetworkListItem.java
│ │ │ │ │ │ ├── NetworkSettingsView.fxml
│ │ │ │ │ │ ├── NetworkSettingsView.java
│ │ │ │ │ │ └── P2pNetworkListItem.java
│ │ │ │ │ └── preferences/
│ │ │ │ │ ├── PreferencesView.fxml
│ │ │ │ │ ├── PreferencesView.java
│ │ │ │ │ └── PreferencesViewModel.java
│ │ │ │ ├── shared/
│ │ │ │ │ ├── ChatView.java
│ │ │ │ │ └── PriceFeedComboBoxItem.java
│ │ │ │ └── support/
│ │ │ │ ├── SupportView.fxml
│ │ │ │ ├── SupportView.java
│ │ │ │ └── dispute/
│ │ │ │ ├── DisputeChatPopup.java
│ │ │ │ ├── DisputeView.java
│ │ │ │ ├── agent/
│ │ │ │ │ ├── DisputeAgentView.java
│ │ │ │ │ ├── arbitration/
│ │ │ │ │ │ ├── ArbitratorView.fxml
│ │ │ │ │ │ └── ArbitratorView.java
│ │ │ │ │ ├── mediation/
│ │ │ │ │ │ ├── MediatorView.fxml
│ │ │ │ │ │ └── MediatorView.java
│ │ │ │ │ └── refund/
│ │ │ │ │ ├── RefundAgentView.fxml
│ │ │ │ │ └── RefundAgentView.java
│ │ │ │ └── client/
│ │ │ │ ├── DisputeClientView.java
│ │ │ │ ├── arbitration/
│ │ │ │ │ ├── ArbitrationClientView.fxml
│ │ │ │ │ └── ArbitrationClientView.java
│ │ │ │ ├── mediation/
│ │ │ │ │ ├── MediationClientView.fxml
│ │ │ │ │ └── MediationClientView.java
│ │ │ │ └── refund/
│ │ │ │ ├── RefundClientView.fxml
│ │ │ │ └── RefundClientView.java
│ │ │ ├── setup/
│ │ │ │ └── DesktopPersistedDataHost.java
│ │ │ ├── theme-dark.css
│ │ │ ├── theme-dev.css
│ │ │ ├── theme-light.css
│ │ │ └── util/
│ │ │ ├── AxisInlierUtils.java
│ │ │ ├── Colors.java
│ │ │ ├── CssTheme.java
│ │ │ ├── CurrencyList.java
│ │ │ ├── CurrencyListItem.java
│ │ │ ├── CurrencyPredicates.java
│ │ │ ├── DisplayUtils.java
│ │ │ ├── FormBuilder.java
│ │ │ ├── GUIProfiler.java
│ │ │ ├── GUIUtil.java
│ │ │ ├── ImageUtil.java
│ │ │ ├── Layout.java
│ │ │ ├── MovingAverageUtils.java
│ │ │ ├── Transitions.java
│ │ │ ├── filtering/
│ │ │ │ ├── FilterableListItem.java
│ │ │ │ └── FilteringUtils.java
│ │ │ ├── normalization/
│ │ │ │ └── IBANNormalizer.java
│ │ │ └── validation/
│ │ │ ├── JFXInputValidator.java
│ │ │ └── PasswordValidator.java
│ │ └── resources/
│ │ ├── fonts/
│ │ │ └── OFL.txt
│ │ ├── keys/
│ │ │ ├── 29CDFD3B.asc
│ │ │ ├── 5BC5ED73.asc
│ │ │ └── F379A1C6.asc
│ │ └── logback.xml
│ └── test/
│ ├── java/
│ │ ├── haveno/
│ │ │ └── desktop/
│ │ │ ├── AwesomeFontDemo.java
│ │ │ ├── AwesomeFontDemoLauncher.java
│ │ │ ├── BindingTest.java
│ │ │ ├── ComponentsDemo.java
│ │ │ ├── ComponentsDemoLauncher.java
│ │ │ ├── GuiceSetupTest.java
│ │ │ ├── MarketsPrintTool.java
│ │ │ ├── MaterialDesignIconDemo.java
│ │ │ ├── MaterialDesignIconDemoLauncher.java
│ │ │ ├── common/
│ │ │ │ ├── fxml/
│ │ │ │ │ ├── FxmlViewLoaderTests$Malformed.fxml
│ │ │ │ │ ├── FxmlViewLoaderTests$MissingFxController.fxml
│ │ │ │ │ ├── FxmlViewLoaderTests$MissingFxmlViewAnnotation.fxml
│ │ │ │ │ ├── FxmlViewLoaderTests$WellFormed.fxml
│ │ │ │ │ └── FxmlViewLoaderTests.java
│ │ │ │ └── support/
│ │ │ │ └── CachingViewLoaderTests.java
│ │ │ ├── components/
│ │ │ │ └── ColoredDecimalPlacesWithZerosTextTest.java
│ │ │ ├── main/
│ │ │ │ ├── funds/
│ │ │ │ │ └── transactions/
│ │ │ │ │ ├── DisplayedTransactionsTest.java
│ │ │ │ │ ├── ObservableListDecoratorTest.java
│ │ │ │ │ ├── TransactionAwareTradableFactoryTest.java
│ │ │ │ │ └── TransactionAwareTradeTest.java
│ │ │ │ ├── market/
│ │ │ │ │ ├── offerbook/
│ │ │ │ │ │ └── OfferBookChartViewModelTest.java
│ │ │ │ │ ├── spread/
│ │ │ │ │ │ └── SpreadViewModelTest.java
│ │ │ │ │ └── trades/
│ │ │ │ │ └── TradesChartsViewModelTest.java
│ │ │ │ ├── offer/
│ │ │ │ │ ├── createoffer/
│ │ │ │ │ │ ├── CreateOfferDataModelTest.java
│ │ │ │ │ │ └── CreateOfferViewModelTest.java
│ │ │ │ │ └── offerbook/
│ │ │ │ │ ├── OfferBookListItemMaker.java
│ │ │ │ │ └── OfferBookViewModelTest.java
│ │ │ │ ├── overlays/
│ │ │ │ │ ├── OverlayTest.java
│ │ │ │ │ └── windows/
│ │ │ │ │ └── downloadupdate/
│ │ │ │ │ ├── HavenoInstallerTest.java
│ │ │ │ │ └── VerifyTaskTest.java
│ │ │ │ └── settings/
│ │ │ │ └── preferences/
│ │ │ │ └── PreferencesViewModelTest.java
│ │ │ ├── maker/
│ │ │ │ ├── CurrencyListItemMakers.java
│ │ │ │ ├── OfferMaker.java
│ │ │ │ ├── PreferenceMakers.java
│ │ │ │ ├── PriceMaker.java
│ │ │ │ ├── TradeCurrencyMakers.java
│ │ │ │ └── VolumeMaker.java
│ │ │ └── util/
│ │ │ ├── CurrencyListTest.java
│ │ │ ├── DisplayUtilsTest.java
│ │ │ ├── GUIUtilTest.java
│ │ │ ├── ImmutableCoinFormatterTest.java
│ │ │ ├── MovingAverageUtilsTest.java
│ │ │ └── validation/
│ │ │ ├── AccountNrValidatorTest.java
│ │ │ ├── AdvancedCashValidatorTest.java
│ │ │ ├── BranchIdValidatorTest.java
│ │ │ ├── CapitualValidatorTest.java
│ │ │ ├── FiatVolumeValidatorTest.java
│ │ │ ├── InteracETransferAnswerValidatorTest.java
│ │ │ ├── InteracETransferQuestionValidatorTest.java
│ │ │ ├── InteracETransferValidatorTest.java
│ │ │ ├── LengthValidatorTest.java
│ │ │ ├── NationalAccountIdValidatorTest.java
│ │ │ ├── PhoneNumberValidatorTest.java
│ │ │ ├── RegexValidatorTest.java
│ │ │ └── XmrValidatorTest.java
│ │ └── org/
│ │ └── bitcoinj/
│ │ └── core/
│ │ └── CoinMaker.java
│ └── resources/
│ ├── downloadUpdate/
│ │ ├── F379A1C6.asc
│ │ ├── test.txt
│ │ ├── test.txt.asc
│ │ ├── test_bad.txt
│ │ └── test_bad.txt.asc
│ └── mockito-extensions/
│ └── org.mockito.plugins.MockMaker
├── docs/
│ ├── CONTRIBUTING.md
│ ├── README.md
│ ├── bounties.md
│ ├── create-mainnet.md
│ ├── data-stores.md
│ ├── deployment-guide.md
│ ├── developer-guide.md
│ ├── external-tor-usage.md
│ ├── flatpak.md
│ ├── import-haveno.md
│ ├── installing.md
│ ├── tor-upgrade.md
│ ├── trade_protocol/
│ │ ├── trade-protocol.drawio
│ │ └── trade-protocol.md
│ └── user-guide.md
├── gpg_keys/
│ ├── reto_public.asc
│ └── woodser.asc
├── gradle/
│ ├── README.md
│ ├── verification-metadata.xml
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── inventory/
│ └── src/
│ └── main/
│ └── resources/
│ ├── inv_btc_mainnet.seednodes
│ └── logback.xml
├── monitor/
│ ├── README.md
│ ├── collectd.conf
│ ├── haveno-monitor.service
│ ├── install_collectd_debian.sh
│ ├── nginx.conf
│ ├── src/
│ │ └── main/
│ │ └── resources/
│ │ ├── logback.xml
│ │ └── metrics.properties
│ └── uninstall_collectd_debian.sh
├── p2p/
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── haveno/
│ │ └── network/
│ │ ├── DnsLookupException.java
│ │ ├── DnsLookupTor.java
│ │ ├── Socks5DnsDiscovery.java
│ │ ├── Socks5MultiDiscovery.java
│ │ ├── Socks5ProxyProvider.java
│ │ ├── Socks5SeedOnionDiscovery.java
│ │ ├── crypto/
│ │ │ ├── DecryptedDataTuple.java
│ │ │ ├── EncryptionService.java
│ │ │ └── EncryptionServiceModule.java
│ │ ├── http/
│ │ │ ├── FakeDnsResolver.java
│ │ │ ├── HttpClient.java
│ │ │ ├── HttpClientImpl.java
│ │ │ ├── HttpException.java
│ │ │ ├── HttpMethod.java
│ │ │ ├── SocksConnectionSocketFactory.java
│ │ │ └── SocksSSLConnectionSocketFactory.java
│ │ ├── p2p/
│ │ │ ├── AckMessage.java
│ │ │ ├── AckMessageSourceType.java
│ │ │ ├── AnonymousMessage.java
│ │ │ ├── BootstrapListener.java
│ │ │ ├── BundleOfEnvelopes.java
│ │ │ ├── CloseConnectionMessage.java
│ │ │ ├── DecryptedDirectMessageListener.java
│ │ │ ├── DecryptedMessageWithPubKey.java
│ │ │ ├── DirectMessage.java
│ │ │ ├── ExtendedDataSizePermission.java
│ │ │ ├── FileTransferPart.java
│ │ │ ├── InitialDataRequest.java
│ │ │ ├── InitialDataResponse.java
│ │ │ ├── NetworkNodeProvider.java
│ │ │ ├── NetworkNotReadyException.java
│ │ │ ├── NodeAddress.java
│ │ │ ├── P2PModule.java
│ │ │ ├── P2PService.java
│ │ │ ├── P2PServiceListener.java
│ │ │ ├── PrefixedSealedAndSignedMessage.java
│ │ │ ├── SendDirectMessageListener.java
│ │ │ ├── SendMailboxMessageListener.java
│ │ │ ├── SendersNodeAddressMessage.java
│ │ │ ├── SupportedCapabilitiesMessage.java
│ │ │ ├── UidMessage.java
│ │ │ ├── mailbox/
│ │ │ │ ├── IgnoredMailboxMap.java
│ │ │ │ ├── IgnoredMailboxService.java
│ │ │ │ ├── MailboxItem.java
│ │ │ │ ├── MailboxMessage.java
│ │ │ │ ├── MailboxMessageList.java
│ │ │ │ └── MailboxMessageService.java
│ │ │ ├── messaging/
│ │ │ │ └── DecryptedMailboxListener.java
│ │ │ ├── network/
│ │ │ │ ├── BanFilter.java
│ │ │ │ ├── BridgeAddressProvider.java
│ │ │ │ ├── CloseConnectionReason.java
│ │ │ │ ├── Connection.java
│ │ │ │ ├── ConnectionListener.java
│ │ │ │ ├── ConnectionState.java
│ │ │ │ ├── ConnectionStatistics.java
│ │ │ │ ├── DefaultPluggableTransports.java
│ │ │ │ ├── DirectBindTor.java
│ │ │ │ ├── HavenoRuntimeException.java
│ │ │ │ ├── InboundConnection.java
│ │ │ │ ├── LocalhostNetworkNode.java
│ │ │ │ ├── MessageListener.java
│ │ │ │ ├── NetworkNode.java
│ │ │ │ ├── NewTor.java
│ │ │ │ ├── OutboundConnection.java
│ │ │ │ ├── PeerType.java
│ │ │ │ ├── ProtoOutputStream.java
│ │ │ │ ├── RuleViolation.java
│ │ │ │ ├── RunningTor.java
│ │ │ │ ├── Server.java
│ │ │ │ ├── SetupListener.java
│ │ │ │ ├── Statistic.java
│ │ │ │ ├── SupportedCapabilitiesListener.java
│ │ │ │ ├── TorMode.java
│ │ │ │ ├── TorNetworkNode.java
│ │ │ │ ├── TorNetworkNodeDirectBind.java
│ │ │ │ └── TorNetworkNodeNetlayer.java
│ │ │ ├── peers/
│ │ │ │ ├── BroadcastHandler.java
│ │ │ │ ├── Broadcaster.java
│ │ │ │ ├── PeerManager.java
│ │ │ │ ├── getdata/
│ │ │ │ │ ├── GetDataRequestHandler.java
│ │ │ │ │ ├── RequestDataHandler.java
│ │ │ │ │ ├── RequestDataManager.java
│ │ │ │ │ └── messages/
│ │ │ │ │ ├── GetDataRequest.java
│ │ │ │ │ ├── GetDataResponse.java
│ │ │ │ │ ├── GetUpdatedDataRequest.java
│ │ │ │ │ └── PreliminaryGetDataRequest.java
│ │ │ │ ├── keepalive/
│ │ │ │ │ ├── KeepAliveHandler.java
│ │ │ │ │ ├── KeepAliveManager.java
│ │ │ │ │ └── messages/
│ │ │ │ │ ├── KeepAliveMessage.java
│ │ │ │ │ ├── Ping.java
│ │ │ │ │ └── Pong.java
│ │ │ │ └── peerexchange/
│ │ │ │ ├── GetPeersRequestHandler.java
│ │ │ │ ├── Peer.java
│ │ │ │ ├── PeerExchangeHandler.java
│ │ │ │ ├── PeerExchangeManager.java
│ │ │ │ ├── PeerList.java
│ │ │ │ └── messages/
│ │ │ │ ├── GetPeersRequest.java
│ │ │ │ ├── GetPeersResponse.java
│ │ │ │ └── PeerExchangeMessage.java
│ │ │ ├── seed/
│ │ │ │ └── SeedNodeRepository.java
│ │ │ └── storage/
│ │ │ ├── HashMapChangedListener.java
│ │ │ ├── P2PDataStorage.java
│ │ │ ├── messages/
│ │ │ │ ├── AddDataMessage.java
│ │ │ │ ├── AddOncePayload.java
│ │ │ │ ├── AddPersistableNetworkPayloadMessage.java
│ │ │ │ ├── BroadcastMessage.java
│ │ │ │ ├── RefreshOfferMessage.java
│ │ │ │ ├── RemoveDataMessage.java
│ │ │ │ └── RemoveMailboxDataMessage.java
│ │ │ ├── payload/
│ │ │ │ ├── CapabilityRequiringPayload.java
│ │ │ │ ├── DateSortedTruncatablePayload.java
│ │ │ │ ├── DateTolerantPayload.java
│ │ │ │ ├── ExpirablePayload.java
│ │ │ │ ├── MailboxStoragePayload.java
│ │ │ │ ├── PersistableNetworkPayload.java
│ │ │ │ ├── PersistableProtectedPayload.java
│ │ │ │ ├── ProcessOncePersistableNetworkPayload.java
│ │ │ │ ├── ProtectedMailboxStorageEntry.java
│ │ │ │ ├── ProtectedStorageEntry.java
│ │ │ │ ├── ProtectedStoragePayload.java
│ │ │ │ └── RequiresOwnerIsOnlinePayload.java
│ │ │ └── persistence/
│ │ │ ├── AppendOnlyDataStoreListener.java
│ │ │ ├── AppendOnlyDataStoreService.java
│ │ │ ├── HistoricalDataStoreService.java
│ │ │ ├── MapStoreService.java
│ │ │ ├── PersistableNetworkPayloadStore.java
│ │ │ ├── ProtectedDataStoreService.java
│ │ │ ├── RemovedPayloadsMap.java
│ │ │ ├── RemovedPayloadsService.java
│ │ │ ├── ResourceDataStoreService.java
│ │ │ ├── SequenceNumberMap.java
│ │ │ └── StoreService.java
│ │ └── utils/
│ │ ├── CapabilityUtils.java
│ │ └── Utils.java
│ └── test/
│ ├── java/
│ │ └── haveno/
│ │ └── network/
│ │ ├── crypto/
│ │ │ └── EncryptionServiceTests.java
│ │ ├── p2p/
│ │ │ ├── DummySeedNode.java
│ │ │ ├── MockNode.java
│ │ │ ├── PeerServiceTest.java
│ │ │ ├── TestUtils.java
│ │ │ ├── mocks/
│ │ │ │ ├── MockMailboxPayload.java
│ │ │ │ └── MockPayload.java
│ │ │ ├── network/
│ │ │ │ ├── LocalhostNetworkNodeTest.java
│ │ │ │ └── TorNetworkNodeTest.java
│ │ │ ├── peers/
│ │ │ │ └── PeerManagerTest.java
│ │ │ └── storage/
│ │ │ ├── P2PDataStorageBuildGetDataResponseTest.java
│ │ │ ├── P2PDataStorageClientAPITest.java
│ │ │ ├── P2PDataStorageGetDataIntegrationTest.java
│ │ │ ├── P2PDataStorageOnMessageHandlerTest.java
│ │ │ ├── P2PDataStoragePersistableNetworkPayloadTest.java
│ │ │ ├── P2PDataStorageProcessGetDataResponse.java
│ │ │ ├── P2PDataStorageProtectedStorageEntryTest.java
│ │ │ ├── P2PDataStorageRemoveExpiredTest.java
│ │ │ ├── P2PDataStorageRequestDataTest.java
│ │ │ ├── P2PDataStoreDisconnectTest.java
│ │ │ ├── TestState.java
│ │ │ ├── messages/
│ │ │ │ └── AddDataMessageTest.java
│ │ │ ├── mocks/
│ │ │ │ ├── AppendOnlyDataStoreServiceFake.java
│ │ │ │ ├── ClockFake.java
│ │ │ │ ├── DateTolerantPayloadStub.java
│ │ │ │ ├── ExpirableProtectedStoragePayloadStub.java
│ │ │ │ ├── MapStoreServiceFake.java
│ │ │ │ ├── MockData.java
│ │ │ │ ├── PersistableExpirableProtectedStoragePayloadStub.java
│ │ │ │ ├── PersistableNetworkPayloadStub.java
│ │ │ │ └── ProtectedStoragePayloadStub.java
│ │ │ └── payload/
│ │ │ ├── ProtectedMailboxStorageEntryTest.java
│ │ │ └── ProtectedStorageEntryTest.java
│ │ └── utils/
│ │ └── UtilsTest.java
│ └── resources/
│ └── mockito-extensions/
│ └── org.mockito.plugins.MockMaker
├── proto/
│ └── src/
│ └── main/
│ └── proto/
│ ├── grpc.proto
│ └── pb.proto
├── relay/
│ ├── Procfile
│ ├── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── haveno/
│ │ │ └── relay/
│ │ │ ├── RelayMain.java
│ │ │ └── RelayService.java
│ │ └── resources/
│ │ ├── logback.xml
│ │ └── version.txt
│ └── torrc
├── scripts/
│ ├── deployment/
│ │ ├── haveno-pricenode.env
│ │ ├── haveno-pricenode.service
│ │ ├── haveno-seednode.service
│ │ ├── haveno-seednode2.service
│ │ ├── monero-stagenet.service
│ │ ├── private-stagenet.conf
│ │ ├── private-stagenet.service
│ │ ├── run-arbitrator-daemon.sh
│ │ ├── run-arbitrator-gui.sh
│ │ └── shared-stagenet.conf
│ ├── install_java.bat
│ ├── install_java.sh
│ ├── install_tails/
│ │ ├── README.md
│ │ ├── assets/
│ │ │ ├── exec.sh
│ │ │ ├── haveno.desktop
│ │ │ ├── haveno.yml
│ │ │ └── install.sh
│ │ ├── deprecated/
│ │ │ ├── README.md
│ │ │ └── haveno-install.sh
│ │ └── haveno-install.sh
│ └── install_whonix_qubes/
│ ├── INSTALL.md
│ ├── README.md
│ └── scripts/
│ ├── 0-dom0/
│ │ ├── 0.0-dom0.sh
│ │ ├── 0.1-dom0.sh
│ │ ├── 0.2-dom0.sh
│ │ └── 0.3-dom0.sh
│ ├── 1-TemplateVM/
│ │ └── 1.0-haveno-templatevm.sh
│ ├── 2-NetVM/
│ │ └── 2.0-haveno-netvm.sh
│ └── 3-AppVM/
│ └── 3.0-haveno-appvm.sh
├── seednode/
│ ├── .dockerignore
│ ├── README.md
│ ├── blocknotify.sh
│ ├── create_jar.sh
│ ├── create_jaronly_archive.sh
│ ├── docker/
│ │ └── Dockerfile
│ ├── haveno-seednode.service
│ ├── haveno.env
│ ├── install_seednode_debian.sh
│ ├── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── haveno/
│ │ │ │ └── seednode/
│ │ │ │ ├── SeedNode.java
│ │ │ │ └── SeedNodeMain.java
│ │ │ └── resources/
│ │ │ └── logback.xml
│ │ └── test/
│ │ └── java/
│ │ └── haveno/
│ │ └── seednode/
│ │ └── GuiceSetupTest.java
│ ├── torrc
│ └── uninstall_seednode_debian.sh
├── settings.gradle
├── shell.nix
└── statsnode/
└── src/
└── main/
├── java/
│ └── haveno/
│ └── statistics/
│ ├── Statistics.java
│ └── StatisticsMain.java
└── resources/
└── logback.xml
================================================
FILE CONTENTS
================================================
================================================
FILE: .editorconfig
================================================
root = true
[*]
indent_style = space
indent_size = 4
continuation_indent_size = 8
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.diff]
trim_trailing_whitespace = false
[Makefile]
indent_style = tab
[*.bat]
end_of_line = crlf
[build.gradle]
continuation_indent_size = 4
[.idea/codeStyles/*.xml]
indent_size = 2
insert_final_newline = false
================================================
FILE: .gitattributes
================================================
# Auto detect text files and normalize line endings to LF
# This will handle all files NOT found below
* text=auto
# These text files should retain Windows line endings (CRLF)
*.bat text eol=crlf
# These binary files should be left untouched
# (binary is a macro for -text -diff)
*.bmp binary
*.gif binary
*.ico binary
*.jar binary
*.jpg binary
*.jpeg binary
*.png binary
================================================
FILE: .github/CODEOWNERS
================================================
# This doc specifies who gets requested to review GitHub pull requests.
# See https://help.github.com/articles/about-codeowners/.
# Default
* @woodser
# Documentation
/docs/ @haveno-dex/core-team
*.md @haveno-dex/core-team
================================================
FILE: .github/workflows/build.yml
================================================
# GitHub Releases requires a tag, e.g:
# git tag -s 1.0.19-1 -m "haveno-v1.0.19-1"
# git push origin 1.0.19-1
name: CI
on:
workflow_dispatch:
push:
pull_request:
paths-ignore:
- '**/README.md'
jobs:
build:
strategy:
matrix:
os: [ubuntu-24.04, ubuntu-24.04-arm, macos-15-intel, macos-15, windows-2025]
include:
- os: ubuntu-24.04
arch: x86_64
- os: ubuntu-24.04-arm
arch: aarch64
- os: macos-15-intel
arch: x86_64
- os: macos-15
arch: aarch64
- os: windows-2025
arch: x86_64
fail-fast: false
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
with:
lfs: true
- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'adopt'
cache: gradle
- name: Create local share directory
# ubuntu-24.04 Github runners do not have `~/.local/share` directory by default.
# This causes issues when testing `FileTransferSend`
if: runner.os == 'Linux'
run: mkdir -p ~/.local/share
- name: Build with Gradle with tests
if: ${{ !(runner.os == 'Linux' && matrix.arch == 'aarch64') }}
run: ./gradlew build --stacktrace --scan
- name: Build with Gradle, skip Desktop tests
# JavaFX `21.x.x` ships with `x86_64` versions of
# `libprism_es2.so` and `libprism_s2.so` shared objects.
# This causes desktop tests to fail on `linux/aarch64`
if: ${{ (runner.os == 'Linux' && matrix.arch == 'aarch64') }}
run: |
./gradlew build --stacktrace --scan -x desktop:test
echo "::warning title=Desktop Tests Skipped::Desktop tests (desktop:test) were \
intentionally skipped for linux/aarch64 builds as JavaFX 21.x.x ships with x86_64 \
shared objects, causing tests to fail. \
This should be revisited when JavaFX is next updated."
- uses: actions/upload-artifact@v4
if: failure()
with:
name: error-reports-${{ matrix.os }}
path: ${{ github.workspace }}/desktop/build/reports
- name: cache nodes dependencies
uses: actions/upload-artifact@v4
with:
include-hidden-files: true
name: cached-localnet-${{ matrix.os }}
path: .localnet
overwrite: true
- name: Install dependencies
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install -y rpm libfuse2 flatpak flatpak-builder appstream
flatpak remote-add --if-not-exists --user flathub https://dl.flathub.org/repo/flathub.flatpakrepo
- name: Install WiX Toolset
if: runner.os == 'Windows'
run: |
Invoke-WebRequest -Uri 'https://github.com/wixtoolset/wix3/releases/download/wix314rtm/wix314.exe' -OutFile wix314.exe
.\wix314.exe /quiet /norestart
shell: powershell
- name: Build Haveno Installer with tests
if: ${{ !(runner.os == 'Linux' && matrix.arch == 'aarch64') }}
run: ./gradlew clean build --refresh-keys --refresh-dependencies
working-directory: .
- name: Build Haveno Installer, skip Desktop tests
# JavaFX `21.x.x` ships with `x86_64` versions of
# `libprism_es2.so` and `libprism_s2.so` shared objects.
# This causes desktop tests to fail on `linux/aarch64`
if: ${{ (runner.os == 'Linux' && matrix.arch == 'aarch64') }}
run: |
./gradlew clean build --refresh-keys --refresh-dependencies -x desktop:test
echo "::warning title=Desktop Tests Skipped::Desktop tests (desktop:test) were \
intentionally skipped for linux/aarch64 builds as JavaFX 21.x.x ships with x86_64 \
shared objects, causing tests to fail. \
This should be revisited when JavaFX is next updated."
working-directory: .
- name: Package Haveno Installer
run: ./gradlew packageInstallers
working-directory: .
- name: Build Daemon JAR
if: >
(runner.os == 'Linux' && (matrix.arch == 'x86_64' || matrix.arch == 'aarch64'))
|| (runner.os == 'Windows')
run: ./gradlew :daemon:shadowJar -x test -x checkstyleMain -x checkstyleTest --stacktrace
working-directory: .
# get version from jar
- name: Set Version Unix
if: runner.os != 'Windows'
run: |
export VERSION=$(ls desktop/build/temp-*/binaries/desktop-*.jar.SHA-256 | grep -Eo 'desktop-[0-9]+\.[0-9]+\.[0-9]+' | sed 's/desktop-//')
echo "VERSION=$VERSION" >> $GITHUB_ENV
- name: Set Version Windows
if: runner.os == 'Windows'
run: |
$VERSION = (Get-ChildItem -Path desktop\build\temp-*/binaries\desktop-*.jar.SHA-256).Name -replace 'desktop-', '' -replace '-.*', ''
"VERSION=$VERSION" | Out-File -FilePath $env:GITHUB_ENV -Append
shell: powershell
- name: Move Release Files for Linux
if: runner.os == 'Linux'
run: |
mkdir ${{ github.workspace }}/release-linux-rpm
mkdir ${{ github.workspace }}/release-linux-deb
mkdir ${{ github.workspace }}/release-linux-flatpak
mkdir ${{ github.workspace }}/release-linux-appimage
mv desktop/build/temp-*/binaries/haveno-*.rpm ${{ github.workspace }}/release-linux-rpm/haveno-v${{ env.VERSION }}-linux-${{ matrix.arch }}-installer.rpm
mv desktop/build/temp-*/binaries/haveno_*.deb ${{ github.workspace }}/release-linux-deb/haveno-v${{ env.VERSION }}-linux-${{ matrix.arch }}-installer.deb
mv desktop/build/temp-*/binaries/*.flatpak ${{ github.workspace }}/release-linux-flatpak/haveno-v${{ env.VERSION }}-linux-${{ matrix.arch }}.flatpak
mv desktop/build/temp-*/binaries/haveno_*.AppImage ${{ github.workspace }}/release-linux-appimage/haveno-v${{ env.VERSION }}-linux-${{ matrix.arch }}.AppImage
cp desktop/build/temp-*/binaries/desktop-*.jar.SHA-256 ${{ github.workspace }}/release-linux-deb
cp desktop/build/temp-*/binaries/desktop-*.jar.SHA-256 ${{ github.workspace }}/release-linux-rpm
cp desktop/build/temp-*/binaries/desktop-*.jar.SHA-256 ${{ github.workspace }}/release-linux-appimage
cp desktop/build/temp-*/binaries/desktop-*.jar.SHA-256 ${{ github.workspace }}/release-linux-flatpak
cp desktop/build/temp-*/binaries/desktop-*.jar.SHA-256 ${{ github.workspace }}/haveno-v${{ env.VERSION }}-linux-${{ matrix.arch }}-SNAPSHOT-all.jar.SHA-256
shell: bash
- name: Move Release Files for macOS
if: runner.os == 'MacOS'
run: |
mkdir ${{ github.workspace }}/release-macos-${{ matrix.arch }}
mv desktop/build/temp-*/binaries/Haveno-*.dmg ${{ github.workspace }}/release-macos-${{ matrix.arch }}/haveno-v${{ env.VERSION }}-macos-${{ matrix.arch }}-installer.dmg
cp desktop/build/temp-*/binaries/desktop-*.jar.SHA-256 ${{ github.workspace }}/release-macos-${{ matrix.arch }}
cp desktop/build/temp-*/binaries/desktop-*.jar.SHA-256 ${{ github.workspace }}/haveno-v${{ env.VERSION }}-macos-${{ matrix.arch }}-SNAPSHOT-all.jar.SHA-256
shell: bash
- name: Move Release Files on Windows
if: runner.os == 'Windows'
run: |
mkdir ${{ github.workspace }}/release-windows
Move-Item -Path desktop\build\temp-*/binaries\Haveno-*.exe -Destination ${{ github.workspace }}/release-windows/haveno-v${{ env.VERSION }}-windows-${{ matrix.arch }}-installer.exe
Copy-Item -Path desktop\build\temp-*/binaries\desktop-*.jar.SHA-256 -Destination ${{ github.workspace }}/release-windows
Move-Item -Path desktop\build\temp-*/binaries\desktop-*.jar.SHA-256 -Destination ${{ github.workspace }}/haveno-v${{ env.VERSION }}-windows-SNAPSHOT-all.jar.SHA-256
shell: powershell
- name: Move Daemon JAR on Linux
if: runner.os == 'Linux'
run: |
mkdir -p ${{ github.workspace }}/release-daemon-linux-${{ matrix.arch }}
mv daemon/build/libs/daemon-all.jar ${{ github.workspace }}/release-daemon-linux-${{ matrix.arch }}/daemon-linux-${{ matrix.arch }}.jar
sha256sum ${{ github.workspace }}/release-daemon-linux-${{ matrix.arch }}/daemon-linux-${{ matrix.arch }}.jar > ${{ github.workspace }}/release-daemon-linux-${{ matrix.arch }}/daemon-linux-${{ matrix.arch }}.jar.SHA-256
shell: bash
- name: Move Daemon JAR on Windows
if: runner.os == 'Windows'
run: |
mkdir ${{ github.workspace }}\release-daemon-windows
Move-Item daemon\build\libs\daemon-all.jar ${{ github.workspace }}\release-daemon-windows\daemon-windows.jar
Get-FileHash ${{ github.workspace }}\release-daemon-windows\daemon-windows.jar -Algorithm SHA256 | ForEach-Object { $_.Hash } > ${{ github.workspace }}\release-daemon-windows\daemon-windows.jar.SHA-256
shell: powershell
- uses: actions/upload-artifact@v4
name: "Linux daemon artifacts"
if: runner.os == 'Linux'
with:
name: daemon-linux-${{ matrix.arch }}
path: ${{ github.workspace }}/release-daemon-linux-${{ matrix.arch }}
- uses: actions/upload-artifact@v4
name: "Windows daemon artifacts"
if: runner.os == 'Windows'
with:
name: daemon-windows
path: ${{ github.workspace }}/release-daemon-windows
# Windows artifacts
- uses: actions/upload-artifact@v4
name: "Windows artifacts"
if: runner.os == 'Windows'
with:
name: haveno-windows-${{ matrix.arch }}
path: ${{ github.workspace }}/release-windows
# macOS artifacts
- uses: actions/upload-artifact@v4
name: "macOS artifacts"
if: runner.os == 'MacOS'
with:
name: haveno-macos-${{ matrix.arch }}
path: ${{ github.workspace }}/release-macos-${{ matrix.arch }}
# Linux artifacts
- uses: actions/upload-artifact@v4
name: "Linux - deb artifact"
if: runner.os == 'Linux'
with:
name: haveno-linux-${{ matrix.arch }}-deb
path: ${{ github.workspace }}/release-linux-deb
- uses: actions/upload-artifact@v4
name: "Linux - rpm artifact"
if: runner.os == 'Linux'
with:
name: haveno-linux-${{ matrix.arch }}-rpm
path: ${{ github.workspace }}/release-linux-rpm
- uses: actions/upload-artifact@v4
name: "Linux - AppImage artifact"
if: runner.os == 'Linux'
with:
name: haveno-linux-${{ matrix.arch }}-appimage
path: ${{ github.workspace }}/release-linux-appimage
- uses: actions/upload-artifact@v4
name: "Linux - flatpak artifact"
if: runner.os == 'Linux'
with:
name: haveno-linux-${{ matrix.arch }}-flatpak
path: ${{ github.workspace }}/release-linux-flatpak
- name: Release
uses: softprops/action-gh-release@v2
if: startsWith(github.ref, 'refs/tags/')
with:
files: |
# Linux x86_64
${{ github.workspace }}/release-linux-deb/haveno-v${{ env.VERSION }}-linux-x86_64-installer.deb
${{ github.workspace }}/release-linux-rpm/haveno-v${{ env.VERSION }}-linux-x86_64-installer.rpm
${{ github.workspace }}/release-linux-appimage/haveno-v${{ env.VERSION }}-linux-x86_64.AppImage
${{ github.workspace }}/release-linux-flatpak/haveno-v${{ env.VERSION }}-linux-x86_64.flatpak
${{ github.workspace }}/haveno-v${{ env.VERSION }}-linux-x86_64-SNAPSHOT-all.jar.SHA-256
# Linux aarch64
${{ github.workspace }}/release-linux-deb/haveno-v${{ env.VERSION }}-linux-aarch64-installer.deb
${{ github.workspace }}/release-linux-rpm/haveno-v${{ env.VERSION }}-linux-aarch64-installer.rpm
${{ github.workspace }}/release-linux-appimage/haveno-v${{ env.VERSION }}-linux-aarch64.AppImage
${{ github.workspace }}/release-linux-flatpak/haveno-v${{ env.VERSION }}-linux-aarch64.flatpak
${{ github.workspace }}/haveno-v${{ env.VERSION }}-linux-aarch64-SNAPSHOT-all.jar.SHA-256
# macOS x86_64
${{ github.workspace }}/release-macos-x86_64/haveno-v${{ env.VERSION }}-macos-x86_64-installer.dmg
${{ github.workspace }}/haveno-v${{ env.VERSION }}-macos-x86_64-SNAPSHOT-all.jar.SHA-256
# macOS aarch64
${{ github.workspace }}/release-macos-aarch64/haveno-v${{ env.VERSION }}-macos-aarch64-installer.dmg
${{ github.workspace }}/haveno-v${{ env.VERSION }}-macos-aarch64-SNAPSHOT-all.jar.SHA-256
# Windows
${{ github.workspace }}/release-windows/haveno-v${{ env.VERSION }}-windows-x86_64-installer.exe
${{ github.workspace }}/haveno-v${{ env.VERSION }}-windows-SNAPSHOT-all.jar.SHA-256
# Daemon JARs
${{ github.workspace }}/release-daemon-linux-x86_64/daemon-linux-x86_64.jar
${{ github.workspace }}/release-daemon-linux-x86_64/daemon-linux-x86_64.jar.SHA-256
${{ github.workspace }}/release-daemon-linux-aarch64/daemon-linux-aarch64.jar
${{ github.workspace }}/release-daemon-linux-aarch64/daemon-linux-aarch64.jar.SHA-256
${{ github.workspace }}/release-daemon-windows/daemon-windows.jar
${{ github.workspace }}/release-daemon-windows/daemon-windows.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
================================================
FILE: .github/workflows/codacy-code-reporter.yml
================================================
name: Codacy Coverage Reporter
on: ["push"]
permissions:
contents: read
jobs:
build:
if: github.repository == 'haveno-dex/haveno'
name: Publish coverage
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'adopt'
- name: Create local share directory
# ubuntu-24.04 Github runners do not have `~/.local/share` directory by default.
# This causes issues when testing `FileTransferSend`
run: mkdir -p ~/.local/share
- name: Build with Gradle
run: ./gradlew clean build -x checkstyleMain -x checkstyleTest -x shadowJar
- name: Run codacy coverage reporter
uses: codacy/codacy-coverage-reporter-action@v1.3.0
with:
project-token: ${{ secrets.CODACY_PROJECT_TOKEN }}
coverage-reports: ${{ github.workspace }}/build/reports/jacoco/testCodeCoverageReport/testCodeCoverageReport.xml
================================================
FILE: .github/workflows/codeql-analysis.yml
================================================
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
name: "CodeQL"
on:
push:
branches: [ master ]
pull_request:
# The branches below must be a subset of the branches above
branches: [ master ]
schedule:
- cron: '43 21 * * 0'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-24.04
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'java' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
# Learn more about CodeQL language support at https://git.io/codeql-language-support
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'adopt'
cache: gradle
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# queries: ./path/to/local/query, your-org/your-repo/queries@main
# Autobuild attempts to build any compiled languages (C/C++, C#, Go, or Java).
# If this step fails, then you should remove it and run the build manually (see below).
# - name: Autobuild
# uses: github/codeql-action/autobuild@v2
# ℹ️ Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# and modify them (or add more) to build your code if your project
# uses a compiled language
- name: Build
run: ./gradlew build --stacktrace -x test -x checkstyleMain -x checkstyleTest
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
================================================
FILE: .github/workflows/label.yml
================================================
name: Comment to label
on:
issues:
types: [labeled]
workflow_call:
jobs:
issueLabeled:
runs-on: ubuntu-24.04
steps:
- name: Bounty explanation
uses: peter-evans/create-or-update-comment@v3
if: github.event.label.name == '💰bounty'
with:
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.issue.number }}
body: >
There is a bounty on this issue. The amount is in the title. The reward will be awarded to the first person or group of people whose solution is accepted and merged.
In some cases, we may assign the issue to specific contributors. We expect contributors to provide a PR in a reasonable time frame or, in case of an extensive work, updates on their progress. We will unassign the issue if we feel the assignee is not responsive or has abandoned the task.
Read the [full conditions and details](https://github.com/haveno-dex/haveno/blob/master/docs/bounties.md) of our bounty system.
================================================
FILE: .gitignore
================================================
bin/
*/docs
*/log
*/out
.idea
!.idea/copyright/haveno_Affero_GPLv3.xml
!.idea/copyright/profiles_settings.xml
!.idea/codeStyleSettings.xml
*.iml
*.spvchain
*.wallet
*.ser
*.log
*.sw[op]
.DS_Store
.gradle
build
.classpath
.project
.settings
*.java.hsp
*.java.hsw
*.~ava
/bundles
/haveno-*
/lib
/xchange
desktop.ini
*/target/*
*.class
deploy
*/releases/*
/monitor/TorHiddenServiceStartupTimeTests/*
/monitor/monitor-tor/*
.java-version
.localnet
.vscode
.vim/*
*/.factorypath
.flatpak-builder
exchange.haveno.Haveno.yaml
================================================
FILE: LICENSE
================================================
GNU AFFERO GENERAL PUBLIC LICENSE
Version 3, 19 November 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Copyright (C) 2020 Haveno Dex
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.
A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate. Many developers of free software are heartened and
encouraged by the resulting cooperation. However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.
The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community. It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server. Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.
An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals. This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU Affero General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Remote Network Interaction; Use with the GNU General Public License.
Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software. This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU Affero General Public License from time to time. Such new versions
will be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program 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.
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source. For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code. There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
<https://www.gnu.org/licenses/>.
================================================
FILE: Makefile
================================================
# See docs/installing.md
build: localnet haveno
clean:
./gradlew clean
clean-localnet:
rm -rf .localnet
localnet:
mkdir -p .localnet
haveno:
./gradlew build
update-dependencies:
./gradlew --refresh-dependencies && ./gradlew --write-verification-metadata sha256
daemon: localnet
./gradlew :daemon:shadowJar -x test -x checkstyleMain -x checkstyleTest
# build haveno without tests
skip-tests: localnet
./gradlew build -x test -x checkstyleMain -x checkstyleTest
# quick build desktop and daemon apps without tests
haveno-apps:
./gradlew :core:compileJava :desktop:build -x test -x checkstyleMain -x checkstyleTest
refresh-deps:
./gradlew --write-verification-metadata sha256 && ./gradlew build --refresh-keys --refresh-dependencies -x test -x checkstyleMain -x checkstyleTest
deploy-screen:
# create a new screen session named 'localnet'
screen -dmS localnet
# deploy each node in its own named screen window
for target in \
seednode-local \
user1-desktop-local \
user2-desktop-local \
arbitrator-desktop-local; do \
screen -S localnet -X screen -t $$target; \
screen -S localnet -p $$target -X stuff "make $$target\n"; \
done;
# give time to start
sleep 5
deploy-tmux:
# Start a new tmux session named 'localnet' (detached)
tmux new-session -d -s localnet -n main "make seednode-local"
# Split the window into panes and run each node in its own pane
tmux split-window -h -t localnet "make user1-desktop-local" # Split horizontally for user1
tmux split-window -v -t localnet:0.0 "make user2-desktop-local" # Split vertically on the left for user2
tmux split-window -v -t localnet:0.1 "make arbitrator-desktop-local" # Split vertically on the right for arbitrator
tmux select-layout -t localnet tiled
# give time to start
sleep 5
# Attach to the tmux session
tmux attach-session -t localnet
.PHONY: build seednode localnet
# Local network
monerod1-local:
./.localnet/monerod \
--testnet \
--no-igd \
--hide-my-port \
--data-dir .localnet/xmr_local/node1 \
--p2p-bind-ip 127.0.0.1 \
--log-level 0 \
--add-exclusive-node 127.0.0.1:48080 \
--add-exclusive-node 127.0.0.1:58080 \
--rpc-access-control-origins http://localhost:8080 \
--fixed-difficulty 500 \
--disable-rpc-ban \
--rpc-max-connections 1000 \
--max-connections-per-ip 10 \
--rpc-max-connections-per-private-ip 1000 \
monerod2-local:
./.localnet/monerod \
--testnet \
--no-igd \
--hide-my-port \
--data-dir .localnet/xmr_local/node2 \
--p2p-bind-ip 127.0.0.1 \
--p2p-bind-port 48080 \
--rpc-bind-port 48081 \
--zmq-rpc-bind-port 48082 \
--log-level 0 \
--add-exclusive-node 127.0.0.1:28080 \
--add-exclusive-node 127.0.0.1:58080 \
--rpc-access-control-origins http://localhost:8080 \
--fixed-difficulty 500 \
--disable-rpc-ban \
--rpc-max-connections 1000 \
--max-connections-per-ip 10 \
--rpc-max-connections-per-private-ip 1000 \
monerod3-local:
./.localnet/monerod \
--testnet \
--no-igd \
--hide-my-port \
--data-dir .localnet/xmr_local/node3 \
--p2p-bind-ip 127.0.0.1 \
--p2p-bind-port 58080 \
--rpc-bind-port 58081 \
--zmq-rpc-bind-port 58082 \
--log-level 0 \
--add-exclusive-node 127.0.0.1:28080 \
--add-exclusive-node 127.0.0.1:48080 \
--rpc-access-control-origins http://localhost:8080 \
--fixed-difficulty 500 \
--disable-rpc-ban \
--rpc-max-connections 1000 \
--max-connections-per-ip 10 \
--rpc-max-connections-per-private-ip 1000 \
#--proxy 127.0.0.1:49775 \
funding-wallet-local:
./.localnet/monero-wallet-rpc \
--testnet \
--daemon-address http://localhost:28081 \
--rpc-bind-port 28084 \
--rpc-login rpc_user:abc123 \
--rpc-access-control-origins http://localhost:8080 \
--wallet-dir ./.localnet \
funding-wallet-stagenet:
./.localnet/monero-wallet-rpc \
--stagenet \
--rpc-bind-port 38084 \
--rpc-login rpc_user:abc123 \
--rpc-access-control-origins http://localhost:8080 \
--wallet-dir ./.localnet \
--daemon-ssl-allow-any-cert \
--daemon-address http://127.0.0.1:38081 \
funding-wallet-mainnet:
./.localnet/monero-wallet-rpc \
--rpc-bind-port 18084 \
--rpc-login rpc_user:abc123 \
--rpc-access-control-origins http://localhost:8080 \
--wallet-dir ./.localnet \
# use .bat extension for windows binaries
APP_EXT :=
ifeq ($(OS),Windows_NT)
APP_EXT := .bat
endif
seednode-local:
./haveno-seednode$(APP_EXT) \
--baseCurrencyNetwork=XMR_LOCAL \
--useLocalhostForP2P=true \
--useDevPrivilegeKeys=true \
--nodePort=2002 \
--appName=haveno-XMR_LOCAL_Seed_2002 \
--xmrNode=http://localhost:28081 \
seednode2-local:
./haveno-seednode$(APP_EXT) \
--baseCurrencyNetwork=XMR_LOCAL \
--useLocalhostForP2P=true \
--useDevPrivilegeKeys=true \
--nodePort=2003 \
--appName=haveno-XMR_LOCAL_Seed_2003 \
--xmrNode=http://localhost:28081 \
arbitrator-daemon-local:
# Arbitrator needs to be registered before making trades
./haveno-daemon$(APP_EXT) \
--baseCurrencyNetwork=XMR_LOCAL \
--useLocalhostForP2P=true \
--useDevPrivilegeKeys=true \
--nodePort=4444 \
--appName=haveno-XMR_LOCAL_arbitrator \
--apiPassword=apitest \
--apiPort=9998 \
--passwordRequired=false \
--useNativeXmrWallet=false \
--xmrNode=http://127.0.0.1:48081 \
arbitrator-desktop-local:
# Arbitrator needs to be registered before making trades
./haveno-desktop$(APP_EXT) \
--baseCurrencyNetwork=XMR_LOCAL \
--useLocalhostForP2P=true \
--useDevPrivilegeKeys=true \
--nodePort=4444 \
--appName=haveno-XMR_LOCAL_arbitrator \
--apiPassword=apitest \
--apiPort=9998 \
--useNativeXmrWallet=false \
--xmrNode=http://127.0.0.1:48081 \
arbitrator2-daemon-local:
# Arbitrator needs to be registered before making trades
./haveno-daemon$(APP_EXT) \
--baseCurrencyNetwork=XMR_LOCAL \
--useLocalhostForP2P=true \
--useDevPrivilegeKeys=true \
--nodePort=7777 \
--appName=haveno-XMR_LOCAL_arbitrator2 \
--apiPassword=apitest \
--apiPort=10001 \
--useNativeXmrWallet=false \
--xmrNode=http://127.0.0.1:48081 \
arbitrator2-desktop-local:
# Arbitrator needs to be registered before making trades
./haveno-desktop$(APP_EXT) \
--baseCurrencyNetwork=XMR_LOCAL \
--useLocalhostForP2P=true \
--useDevPrivilegeKeys=true \
--nodePort=7777 \
--appName=haveno-XMR_LOCAL_arbitrator2 \
--apiPassword=apitest \
--apiPort=10001 \
--useNativeXmrWallet=false \
--xmrNode=http://127.0.0.1:48081 \
user1-daemon-local:
./haveno-daemon$(APP_EXT) \
--baseCurrencyNetwork=XMR_LOCAL \
--useLocalhostForP2P=true \
--useDevPrivilegeKeys=true \
--nodePort=5555 \
--appName=haveno-XMR_LOCAL_user1 \
--apiPassword=apitest \
--apiPort=9999 \
--walletRpcBindPort=38091 \
--passwordRequired=false \
--useNativeXmrWallet=false \
user1-desktop-local:
./haveno-desktop$(APP_EXT) \
--baseCurrencyNetwork=XMR_LOCAL \
--useLocalhostForP2P=true \
--useDevPrivilegeKeys=true \
--nodePort=5555 \
--appName=haveno-XMR_LOCAL_user1 \
--apiPassword=apitest \
--apiPort=9999 \
--walletRpcBindPort=38091 \
--logLevel=info \
--useNativeXmrWallet=false \
user2-desktop-local:
./haveno-desktop$(APP_EXT) \
--baseCurrencyNetwork=XMR_LOCAL \
--useLocalhostForP2P=true \
--useDevPrivilegeKeys=true \
--nodePort=6666 \
--appName=haveno-XMR_LOCAL_user2 \
--apiPassword=apitest \
--apiPort=10000 \
--walletRpcBindPort=38092 \
--useNativeXmrWallet=false \
user2-daemon-local:
./haveno-daemon$(APP_EXT) \
--baseCurrencyNetwork=XMR_LOCAL \
--useLocalhostForP2P=true \
--useDevPrivilegeKeys=true \
--nodePort=6666 \
--appName=haveno-XMR_LOCAL_user2 \
--apiPassword=apitest \
--apiPort=10000 \
--walletRpcBindPort=38092 \
--passwordRequired=false \
--useNativeXmrWallet=false \
user3-desktop-local:
./haveno-desktop$(APP_EXT) \
--baseCurrencyNetwork=XMR_LOCAL \
--useLocalhostForP2P=true \
--useDevPrivilegeKeys=true \
--nodePort=7778 \
--appName=haveno-XMR_LOCAL_user3 \
--apiPassword=apitest \
--apiPort=10002 \
--walletRpcBindPort=38093 \
--useNativeXmrWallet=false \
user3-daemon-local:
./haveno-daemon$(APP_EXT) \
--baseCurrencyNetwork=XMR_LOCAL \
--useLocalhostForP2P=true \
--useDevPrivilegeKeys=true \
--nodePort=7778 \
--appName=haveno-XMR_LOCAL_user3 \
--apiPassword=apitest \
--apiPort=10002 \
--walletRpcBindPort=38093 \
--passwordRequired=false \
--useNativeXmrWallet=false \
# Stagenet network
monerod-stagenet:
./.localnet/monerod \
--stagenet \
--bootstrap-daemon-address auto \
--rpc-access-control-origins http://localhost:8080 \
monerod-stagenet-custom:
./.localnet/monerod \
--stagenet \
--no-zmq \
--p2p-bind-port 39080 \
--rpc-bind-port 39081 \
--bootstrap-daemon-address auto \
--rpc-access-control-origins http://localhost:8080 \
seednode-stagenet:
./haveno-seednode$(APP_EXT) \
--baseCurrencyNetwork=XMR_STAGENET \
--useLocalhostForP2P=false \
--useDevPrivilegeKeys=false \
--nodePort=3002 \
--appName=haveno-XMR_STAGENET_Seed_3002 \
--xmrNode=http://127.0.0.1:38081 \
seednode2-stagenet:
./haveno-seednode$(APP_EXT) \
--baseCurrencyNetwork=XMR_STAGENET \
--useLocalhostForP2P=false \
--useDevPrivilegeKeys=false \
--nodePort=3003 \
--appName=haveno-XMR_STAGENET_Seed_3003 \
--xmrNode=http://127.0.0.1:38081 \
arbitrator-daemon-stagenet:
# Arbitrator needs to be registered before making trades
./haveno-daemon$(APP_EXT) \
--baseCurrencyNetwork=XMR_STAGENET \
--useLocalhostForP2P=false \
--useDevPrivilegeKeys=false \
--nodePort=9999 \
--appName=haveno-XMR_STAGENET_arbitrator \
--apiPassword=apitest \
--apiPort=3200 \
--passwordRequired=false \
--xmrNode=http://127.0.0.1:38081 \
--useNativeXmrWallet=false \
# Arbitrator needs to be registered before making trades
arbitrator-desktop-stagenet:
./haveno-desktop$(APP_EXT) \
--baseCurrencyNetwork=XMR_STAGENET \
--useLocalhostForP2P=false \
--useDevPrivilegeKeys=false \
--nodePort=9999 \
--appName=haveno-XMR_STAGENET_arbitrator \
--apiPassword=apitest \
--apiPort=3200 \
--xmrNode=http://127.0.0.1:38081 \
--useNativeXmrWallet=false \
user1-daemon-stagenet:
./haveno-daemon$(APP_EXT) \
--baseCurrencyNetwork=XMR_STAGENET \
--useLocalhostForP2P=false \
--useDevPrivilegeKeys=false \
--nodePort=9999 \
--appName=haveno-XMR_STAGENET_user1 \
--apiPassword=apitest \
--apiPort=3201 \
--passwordRequired=false \
--useNativeXmrWallet=false \
user1-desktop-stagenet:
./haveno-desktop$(APP_EXT) \
--baseCurrencyNetwork=XMR_STAGENET \
--useLocalhostForP2P=false \
--useDevPrivilegeKeys=false \
--nodePort=9999 \
--appName=haveno-XMR_STAGENET_user1 \
--apiPassword=apitest \
--apiPort=3201 \
--useNativeXmrWallet=false \
user2-daemon-stagenet:
./haveno-daemon$(APP_EXT) \
--baseCurrencyNetwork=XMR_STAGENET \
--useLocalhostForP2P=false \
--useDevPrivilegeKeys=false \
--nodePort=9999 \
--appName=haveno-XMR_STAGENET_user2 \
--apiPassword=apitest \
--apiPort=3202 \
--passwordRequired=false \
--useNativeXmrWallet=false \
user2-desktop-stagenet:
./haveno-desktop$(APP_EXT) \
--baseCurrencyNetwork=XMR_STAGENET \
--useLocalhostForP2P=false \
--useDevPrivilegeKeys=false \
--nodePort=9999 \
--appName=haveno-XMR_STAGENET_user2 \
--apiPassword=apitest \
--apiPort=3202 \
--useNativeXmrWallet=false \
user3-desktop-stagenet:
./haveno-desktop$(APP_EXT) \
--baseCurrencyNetwork=XMR_STAGENET \
--useLocalhostForP2P=false \
--useDevPrivilegeKeys=false \
--nodePort=9999 \
--appName=haveno-XMR_STAGENET_user3 \
--apiPassword=apitest \
--apiPort=3203 \
--useNativeXmrWallet=false \
haveno-desktop-stagenet:
./haveno-desktop$(APP_EXT) \
--baseCurrencyNetwork=XMR_STAGENET \
--useLocalhostForP2P=false \
--useDevPrivilegeKeys=false \
--nodePort=9999 \
--appName=Haveno \
--apiPassword=apitest \
--apiPort=3204 \
--useNativeXmrWallet=false \
haveno-daemon-stagenet:
./haveno-daemon$(APP_EXT) \
--baseCurrencyNetwork=XMR_STAGENET \
--useLocalhostForP2P=false \
--useDevPrivilegeKeys=false \
--nodePort=9999 \
--appName=Haveno \
--apiPassword=apitest \
--apiPort=3204 \
--useNativeXmrWallet=false \
# Mainnet network
monerod:
./.localnet/monerod \
--bootstrap-daemon-address auto \
--rpc-access-control-origins http://localhost:8080 \
--rpc-max-connections 1000 \
--max-connections-per-ip 10 \
--rpc-max-connections-per-private-ip 1000 \
seednode:
./haveno-seednode$(APP_EXT) \
--baseCurrencyNetwork=XMR_MAINNET \
--useLocalhostForP2P=false \
--useDevPrivilegeKeys=false \
--nodePort=1002 \
--appName=haveno-reto-XMR_MAINNET_Seed_1002 \
--xmrNode=http://127.0.0.1:18081 \
seednode2:
./haveno-seednode$(APP_EXT) \
--baseCurrencyNetwork=XMR_MAINNET \
--useLocalhostForP2P=false \
--useDevPrivilegeKeys=false \
--nodePort=1003 \
--appName=haveno-reto-XMR_MAINNET_Seed_1003 \
--xmrNode=http://127.0.0.1:18081 \
arbitrator-daemon-mainnet:
# Arbitrator needs to be registered before making trades
./haveno-daemon$(APP_EXT) \
--baseCurrencyNetwork=XMR_MAINNET \
--useLocalhostForP2P=false \
--useDevPrivilegeKeys=false \
--nodePort=9999 \
--appName=haveno-reto-XMR_MAINNET_arbitrator \
--apiPassword=apitest \
--apiPort=1200 \
--passwordRequired=false \
--xmrNode=http://127.0.0.1:18081 \
--useNativeXmrWallet=false \
arbitrator-desktop-mainnet:
./haveno-desktop$(APP_EXT) \
--baseCurrencyNetwork=XMR_MAINNET \
--useLocalhostForP2P=false \
--useDevPrivilegeKeys=false \
--nodePort=9999 \
--appName=haveno-reto-XMR_MAINNET_arbitrator \
--apiPassword=apitest \
--apiPort=1200 \
--xmrNode=http://127.0.0.1:18081 \
--useNativeXmrWallet=false \
arbitrator2-daemon-mainnet:
./haveno-daemon$(APP_EXT) \
--baseCurrencyNetwork=XMR_MAINNET \
--useLocalhostForP2P=false \
--useDevPrivilegeKeys=false \
--nodePort=9999 \
--appName=haveno-XMR_MAINNET_arbitrator2 \
--apiPassword=apitest \
--apiPort=1205 \
--passwordRequired=false \
--xmrNode=http://127.0.0.1:18081 \
--useNativeXmrWallet=false \
arbitrator2-desktop-mainnet:
./haveno-desktop$(APP_EXT) \
--baseCurrencyNetwork=XMR_MAINNET \
--useLocalhostForP2P=false \
--useDevPrivilegeKeys=false \
--nodePort=9999 \
--appName=haveno-XMR_MAINNET_arbitrator2 \
--apiPassword=apitest \
--apiPort=1205 \
--xmrNode=http://127.0.0.1:18081 \
--useNativeXmrWallet=false \
haveno-daemon-mainnet:
./haveno-daemon$(APP_EXT) \
--baseCurrencyNetwork=XMR_MAINNET \
--useLocalhostForP2P=false \
--useDevPrivilegeKeys=false \
--nodePort=9999 \
--appName=Haveno-reto \
--apiPassword=apitest \
--apiPort=1201 \
--useNativeXmrWallet=false \
--ignoreLocalXmrNode=false \
haveno-desktop-mainnet:
./haveno-desktop$(APP_EXT) \
--baseCurrencyNetwork=XMR_MAINNET \
--useLocalhostForP2P=false \
--useDevPrivilegeKeys=false \
--nodePort=9999 \
--appName=Haveno-reto \
--apiPassword=apitest \
--apiPort=1201 \
--useNativeXmrWallet=false \
--ignoreLocalXmrNode=false \
user1-daemon-mainnet:
./haveno-daemon$(APP_EXT) \
--baseCurrencyNetwork=XMR_MAINNET \
--useLocalhostForP2P=false \
--useDevPrivilegeKeys=false \
--nodePort=9999 \
--appName=haveno-reto-XMR_MAINNET_user1 \
--apiPassword=apitest \
--apiPort=1202 \
--passwordRequired=false \
--useNativeXmrWallet=false \
--ignoreLocalXmrNode=false \
user1-desktop-mainnet:
./haveno-desktop$(APP_EXT) \
--baseCurrencyNetwork=XMR_MAINNET \
--useLocalhostForP2P=false \
--useDevPrivilegeKeys=false \
--nodePort=9999 \
--appName=haveno-reto-XMR_MAINNET_user1 \
--apiPassword=apitest \
--apiPort=1202 \
--useNativeXmrWallet=false \
--ignoreLocalXmrNode=false \
user2-daemon-mainnet:
./haveno-daemon$(APP_EXT) \
--baseCurrencyNetwork=XMR_MAINNET \
--useLocalhostForP2P=false \
--useDevPrivilegeKeys=false \
--nodePort=9999 \
--appName=haveno-reto-XMR_MAINNET_user2 \
--apiPassword=apitest \
--apiPort=1203 \
--passwordRequired=false \
--useNativeXmrWallet=false \
--ignoreLocalXmrNode=false \
user2-desktop-mainnet:
./haveno-desktop$(APP_EXT) \
--baseCurrencyNetwork=XMR_MAINNET \
--useLocalhostForP2P=false \
--useDevPrivilegeKeys=false \
--nodePort=9999 \
--appName=haveno-reto-XMR_MAINNET_user2 \
--apiPassword=apitest \
--apiPort=1203 \
--useNativeXmrWallet=false \
--ignoreLocalXmrNode=false \
user3-desktop-mainnet:
./haveno-desktop$(APP_EXT) \
--baseCurrencyNetwork=XMR_MAINNET \
--useLocalhostForP2P=false \
--useDevPrivilegeKeys=false \
--nodePort=9999 \
--appName=haveno-reto-XMR_MAINNET_user3 \
--apiPassword=apitest \
--apiPort=1204 \
--useNativeXmrWallet=false \
--ignoreLocalXmrNode=false \
buyer-wallet-mainnet:
./.localnet/monero-wallet-rpc \
--daemon-address http://localhost:18081 \
--rpc-bind-port 18084 \
--rpc-login rpc_user:abc123 \
--rpc-access-control-origins http://localhost:8080 \
--wallet-dir ./.localnet \
seller-wallet-mainnet:
./.localnet/monero-wallet-rpc \
--daemon-address http://localhost:18081 \
--rpc-bind-port 18085 \
--rpc-login rpc_user:abc123 \
--rpc-access-control-origins http://localhost:8080 \
--wallet-dir ./.localnet \
================================================
FILE: README.md
================================================
<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/actions)
[](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-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) 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>
================================================
FILE: apitest/scripts/editf2faccountform.py
================================================
import sys, os, json
# Writes a Haveno json F2F payment account form for the given country_code to the current working directory.
if len(sys.argv) < 2:
print("usage: editf2faccountform.py country_code")
exit(1)
country_code = str(sys.argv[1]).upper()
acct_form = {
"_COMMENTS_": [
"Do not manually edit the paymentMethodId field.",
"Edit the salt field only if you are recreating a payment account on a new installation and wish to preserve the account age."
],
"paymentMethodId": "F2F",
"accountName": "Face to Face Payment Account",
"city": "Anytown",
"contact": "Me",
"country": country_code,
"extraInfo": "",
"salt": ""
}
target=os.path.dirname(os.path.realpath(__file__)) + '/' + 'f2f-acct.json'
with open (target, 'w') as outfile:
json.dump(acct_form, outfile, indent=2)
outfile.write('\n')
exit(0)
================================================
FILE: apitest/scripts/get-haveno-pid.sh
================================================
#!/bin/bash
# Find the pid of the java process by grepping for the mainClassName and appName,
# then print the 2nd column of the output to stdout.
#
# Doing this from Java is problematic, probably due to limitation of the
# apitest.linux.BashCommand implementation.
MAIN_CLASS_NAME=$1
APP_NAME=$2
# TODO args validation
ps aux | grep java | grep "${MAIN_CLASS_NAME}" | grep "${APP_NAME}" | awk '{print $2}'
================================================
FILE: apitest/scripts/limit-order-simulation.sh
================================================
#! /bin/bash
# Demonstrates a way to create a limit order (offer) using the API CLI with a local regtest bitcoin node.
#
# A country code argument is used to create a country based face to face payment account for the simulated offer.
#
# Prerequisites:
#
# - Linux or OSX with bash, Java 11-15 (JDK language compatibility 11), and bitcoin-core (v0.19 - v22).
#
# - Haveno must be fully built with apitest dao setup files installed.
# Build command: `./gradlew clean build :apitest:installDaoSetup`
#
# - All supporting nodes must be run locally, in dev/dao/regtest mode:
# bitcoind, seednode, arbdaemon, alicedaemon, bobdaemon
#
# These should be run using the apitest harness. From the root project dir, run:
# `$ ./haveno-apitest --apiPassword=xyz --supportingApps=bitcoind,seednode,arbdaemon,alicedaemon,bobdaemon --shutdownAfterTests=false`
#
# - Only regtest btc can be bought or sold with the test payment account.
#
# Usage:
#
# This script must be run from the root of the project, e.g.:
#
# `$ apitest/scripts/limit-order-simulation.sh -l 40000 -d buy -c fr -m 3.00 -a 0.125`
#
# Script options: -l <limit-price> -d <direction> -c <country-code> (-m <mkt-price-margin(%)> || -f <fixed-price>) -a <amount(btc)> [-w <price-poll-interval(s)>]
#
# Example:
#
# Create a sell/eur offer to sell 0.125 btc at a fixed-price of 38,000 euros, using a France face to face
# payment account, when the BTC market price rises to or above 40,000 EUR:
#
# `$ apitest/scripts/limit-order-simulation.sh -l 40000 -d sell -c fr -m 0.00 -a 0.125`
APP_BASE_NAME=$(basename "$0")
APP_HOME=$(pwd -P)
APITEST_SCRIPTS_HOME="$APP_HOME/apitest/scripts"
source "$APITEST_SCRIPTS_HOME/trade-simulation-env.sh"
source "$APITEST_SCRIPTS_HOME/trade-simulation-utils.sh"
checksetup
parselimitorderopts "$@"
printdate "Started $APP_BASE_NAME with parameters:"
printscriptparams
printbreak
editpaymentaccountform "$COUNTRY_CODE"
exitoncommandalert $?
cat "$APITEST_SCRIPTS_HOME/$F2F_ACCT_FORM"
printbreak
# Create F2F payment accounts for $COUNTRY_CODE, and get the $CURRENCY_CODE.
printdate "Creating Alice's face to face $COUNTRY_CODE payment account."
CMD="$CLI_BASE --port=$ALICE_PORT createpaymentacct --payment-account-form=$APITEST_SCRIPTS_HOME/$F2F_ACCT_FORM"
printdate "ALICE CLI: $CMD"
CMD_OUTPUT=$(createpaymentacct "$CMD")
exitoncommandalert $?
echo "$CMD_OUTPUT"
ALICE_ACCT_ID=$(getnewpaymentacctid "$CMD_OUTPUT")
exitoncommandalert $?
CURRENCY_CODE=$(getnewpaymentacctcurrency "$CMD_OUTPUT")
exitoncommandalert $?
printdate "ALICE F2F payment-account-id = $ALICE_ACCT_ID, currency-code = $CURRENCY_CODE."
printbreak
printdate "Creating Bob's face to face $COUNTRY_CODE payment account."
CMD="$CLI_BASE --port=$BOB_PORT createpaymentacct --payment-account-form=$APITEST_SCRIPTS_HOME/$F2F_ACCT_FORM"
printdate "BOB CLI: $CMD"
CMD_OUTPUT=$(createpaymentacct "$CMD")
exitoncommandalert $?
echo "$CMD_OUTPUT"
BOB_ACCT_ID=$(getnewpaymentacctid "$CMD_OUTPUT")
exitoncommandalert $?
CURRENCY_CODE=$(getnewpaymentacctcurrency "$CMD_OUTPUT")
exitoncommandalert $?
printdate "BOB F2F payment-account-id = $BOB_ACCT_ID, currency-code = $CURRENCY_CODE."
printbreak
# Bob & Alice now have matching payment accounts, now loop until the price limit is reached, then create an offer.
if [ "$DIRECTION" = "BUY" ]
then
printdate "Create a BUY / $CURRENCY_CODE offer when the market price falls to or below $LIMIT_PRICE $CURRENCY_CODE."
else
printdate "Create a SELL / $CURRENCY_CODE offer when the market price rises to or above $LIMIT_PRICE $CURRENCY_CODE."
fi
DONE=0
while : ; do
if [ "$DONE" -ne 0 ]; then
break
fi
CURRENT_PRICE=$(getcurrentprice "$ALICE_PORT" "$CURRENCY_CODE")
exitoncommandalert $?
printdate "Current Market Price: $CURRENT_PRICE"
if [ "$DIRECTION" = "BUY" ] && [ "$CURRENT_PRICE" -le "$LIMIT_PRICE" ]; then
printdate "Limit price reached."
DONE=1
break
fi
if [ "$DIRECTION" = "SELL" ] && [ "$CURRENT_PRICE" -ge "$LIMIT_PRICE" ]; then
printdate "Limit price reached."
DONE=1
break
fi
sleep "$WAIT"
done
printdate "ALICE: Creating $DIRECTION $CURRENCY_CODE offer with payment acct $ALICE_ACCT_ID."
CMD="$CLI_BASE --port=$ALICE_PORT createoffer"
CMD+=" --payment-account=$ALICE_ACCT_ID"
CMD+=" --direction=$DIRECTION"
CMD+=" --currency-code=$CURRENCY_CODE"
CMD+=" --amount=$AMOUNT"
if [ -z "$MKT_PRICE_MARGIN" ]; then
CMD+=" --fixed-price=$FIXED_PRICE"
else
CMD+=" --market-price-margin=$MKT_PRICE_MARGIN"
fi
CMD+=" --security-deposit=50.0"
printdate "ALICE CLI: $CMD"
OFFER_ID=$(createoffer "$CMD")
exitoncommandalert $?
printdate "ALICE: Created offer with id: $OFFER_ID."
printbreak
sleeptraced 3
# Show Alice's new offer.
printdate "ALICE: Looking at her new $DIRECTION $CURRENCY_CODE offer."
CMD="$CLI_BASE --port=$ALICE_PORT getoffer --offer-id=$OFFER_ID"
printdate "ALICE CLI: $CMD"
OFFER=$($CMD)
exitoncommandalert $?
echo "$OFFER"
printbreak
sleeptraced 4
# Generate some btc blocks.
printdate "Generating btc blocks after publishing Alice's offer."
genbtcblocks 3 3
printbreak
# Show Alice's offer in Bob's CLI.
printdate "BOB: Looking at $DIRECTION $CURRENCY_CODE offers."
CMD="$CLI_BASE --port=$BOB_PORT getoffers --direction=$DIRECTION --currency-code=$CURRENCY_CODE"
printdate "BOB CLI: $CMD"
OFFERS=$($CMD)
exitoncommandalert $?
echo "$OFFERS"
exit 0
================================================
FILE: apitest/scripts/mainnet-test.sh
================================================
#!/usr/bin/env bats
#
# Smoke tests for haveno-cli running against a live haveno-daemon (on mainnet)
#
# Prerequisites:
#
# - bats-core 1.2.0+ must be installed (brew install bats-core on macOS)
# see https://github.com/bats-core/bats-core
#
# - Run `./haveno-daemon --apiPassword=xyz --appDataDir=$TESTDIR` where $TESTDIR
# is empty or otherwise contains an unencrypted wallet with a 0 BTC balance
#
# Usage:
#
# This script must be run from the root of the project, e.g.:
#
# bats apitest/scripts/mainnet-test.sh
@test "test unsupported method error" {
run ./haveno-cli --password=xyz bogus
[ "$status" -eq 1 ]
echo "actual output: $output" >&2 # printed only on test failure
[ "$output" = "Error: 'bogus' is not a supported method" ]
}
@test "test unrecognized option error" {
run ./haveno-cli --bogus getversion
[ "$status" -eq 1 ]
echo "actual output: $output" >&2
[ "$output" = "Error: missing required 'password' option" ]
}
@test "test missing required password option error" {
run ./haveno-cli getversion
[ "$status" -eq 1 ]
echo "actual output: $output" >&2
[ "$output" = "Error: missing required 'password' option" ]
}
@test "test incorrect password error" {
run ./haveno-cli --password=bogus getversion
[ "$status" -eq 1 ]
echo "actual output: $output" >&2
[ "$output" = "Error: incorrect 'password' rpc header value" ]
}
@test "test getversion call with quoted password" {
load 'version-parser'
run ./haveno-cli --password="xyz" getversion
[ "$status" -eq 0 ]
echo "actual output: $output" >&2
[ "$output" = "$CURRENT_VERSION" ]
}
@test "test getversion" {
# Wait 1 second before calling getversion again.
sleep 1
load 'version-parser'
run ./haveno-cli --password=xyz getversion
[ "$status" -eq 0 ]
echo "actual output: $output" >&2
[ "$output" = "$CURRENT_VERSION" ]
}
@test "test setwalletpassword \"a b c\"" {
run ./haveno-cli --password=xyz setwalletpassword --wallet-password="a b c"
[ "$status" -eq 0 ]
echo "actual output: $output" >&2
[ "$output" = "wallet encrypted" ]
sleep 1
}
@test "test unlockwallet without password & timeout args" {
run ./haveno-cli --password=xyz unlockwallet
[ "$status" -eq 1 ]
echo "actual output: $output" >&2
[ "$output" = "Error: no password specified" ]
}
@test "test unlockwallet without timeout arg" {
run ./haveno-cli --password=xyz unlockwallet --wallet-password="a b c"
[ "$status" -eq 1 ]
echo "actual output: $output" >&2
[ "$output" = "Error: no unlock timeout specified" ]
}
@test "test unlockwallet \"a b c\" 8" {
run ./haveno-cli --password=xyz unlockwallet --wallet-password="a b c" --timeout=8
[ "$status" -eq 0 ]
echo "actual output: $output" >&2
[ "$output" = "wallet unlocked" ]
}
@test "test getbalance while wallet unlocked for 8s" {
run ./haveno-cli --password=xyz getbalance
[ "$status" -eq 0 ]
sleep 8
}
@test "test unlockwallet \"a b c\" 6" {
run ./haveno-cli --password=xyz unlockwallet --wallet-password="a b c" --timeout=6
[ "$status" -eq 0 ]
echo "actual output: $output" >&2
[ "$output" = "wallet unlocked" ]
}
@test "test lockwallet before unlockwallet timeout=6s expires" {
run ./haveno-cli --password=xyz lockwallet
[ "$status" -eq 0 ]
echo "actual output: $output" >&2
[ "$output" = "wallet locked" ]
}
@test "test setwalletpassword incorrect old pwd error" {
run ./haveno-cli --password=xyz setwalletpassword --wallet-password="z z z" --new-wallet-password="d e f"
[ "$status" -eq 1 ]
echo "actual output: $output" >&2
[ "$output" = "Error: incorrect old password" ]
}
@test "test setwalletpassword oldpwd newpwd" {
# Wait 5 seconds before calling setwalletpassword again.
sleep 5
run ./haveno-cli --password=xyz setwalletpassword --wallet-password="a b c" --new-wallet-password="d e f"
[ "$status" -eq 0 ]
echo "actual output: $output" >&2
[ "$output" = "wallet encrypted with new password" ]
sleep 1
}
@test "test getbalance wallet locked error" {
run ./haveno-cli --password=xyz getbalance
[ "$status" -eq 1 ]
echo "actual output: $output" >&2
[ "$output" = "Error: wallet is locked" ]
}
@test "test removewalletpassword" {
run ./haveno-cli --password=xyz removewalletpassword --wallet-password="d e f"
[ "$status" -eq 0 ]
echo "actual output: $output" >&2
[ "$output" = "wallet decrypted" ]
sleep 3
}
@test "test getbalance when wallet available & unlocked with 0 btc balance" {
run ./haveno-cli --password=xyz getbalance
[ "$status" -eq 0 ]
}
@test "test getfundingaddresses" {
run ./haveno-cli --password=xyz getfundingaddresses
[ "$status" -eq 0 ]
}
@test "test getaddressbalance missing address argument" {
run ./haveno-cli --password=xyz getaddressbalance
[ "$status" -eq 1 ]
echo "actual output: $output" >&2
[ "$output" = "Error: no address specified" ]
}
@test "test getaddressbalance bogus address argument" {
# Wait 1 second before calling getaddressbalance again.
sleep 1
run ./haveno-cli --password=xyz getaddressbalance --address=bogus
[ "$status" -eq 1 ]
echo "actual output: $output" >&2
[ "$output" = "Error: address bogus not found in wallet" ]
}
@test "test getpaymentmethods" {
run ./haveno-cli --password=xyz getpaymentmethods
[ "$status" -eq 0 ]
}
@test "test getpaymentaccts" {
run ./haveno-cli --password=xyz getpaymentaccts
[ "$status" -eq 0 ]
}
@test "test getoffers missing direction argument" {
run ./haveno-cli --password=xyz getoffers
[ "$status" -eq 1 ]
echo "actual output: $output" >&2
[ "$output" = "Error: no direction (buy|sell) specified" ]
}
@test "test getoffers sell eur check return status" {
# Wait 1 second before calling getoffers again.
sleep 1
run ./haveno-cli --password=xyz getoffers --direction=sell --currency-code=eur
[ "$status" -eq 0 ]
}
@test "test getoffers buy eur check return status" {
# Wait 1 second before calling getoffers again.
sleep 1
run ./haveno-cli --password=xyz getoffers --direction=buy --currency-code=eur
[ "$status" -eq 0 ]
}
@test "test getoffers sell gbp check return status" {
# Wait 1 second before calling getoffers again.
sleep 1
run ./haveno-cli --password=xyz getoffers --direction=sell --currency-code=gbp
[ "$status" -eq 0 ]
}
@test "test help displayed on stderr if no options or arguments" {
run ./haveno-cli
[ "$status" -eq 1 ]
[ "${lines[0]}" = "Haveno RPC Client" ]
[ "${lines[1]}" = "Usage: haveno-cli [options] <method> [params]" ]
# TODO add asserts after help text is modified for new endpoints
}
@test "test --help option" {
run ./haveno-cli --help
[ "$status" -eq 0 ]
[ "${lines[0]}" = "Haveno RPC Client" ]
[ "${lines[1]}" = "Usage: haveno-cli [options] <method> [params]" ]
# TODO add asserts after help text is modified for new endpoints
}
@test "test takeoffer method --help" {
run ./haveno-cli --password=xyz takeoffer --help
[ "$status" -eq 0 ]
[ "${lines[0]}" = "takeoffer" ]
}
================================================
FILE: apitest/scripts/rolling-offer-simulation.sh
================================================
#! /bin/bash
# Demonstrates a way to always keep one offer in the market, using the API CLI with a local regtest bitcoin node.
# Alice creates an offer, waits for Bob to take it, and completes the trade protocol with him. Then Alice
# creates a new offer...
#
# Stop the script by entering ^C.
#
# A country code argument is used to create a country based face to face payment account for the simulated offer.
#
# Prerequisites:
#
# - Linux or OSX with bash, Java 11-15 (JDK language compatibility 11), and bitcoin-core (v0.19 - v22).
#
# - Haveno must be fully built with apitest dao setup files installed.
# Build command: `./gradlew clean build :apitest:installDaoSetup`
#
# - All supporting nodes must be run locally, in dev/dao/regtest mode:
# bitcoind, seednode, arbdaemon, alicedaemon, bobdaemon
#
# These should be run using the apitest harness. From the root project dir, run:
# `$ ./haveno-apitest --apiPassword=xyz --supportingApps=bitcoind,seednode,arbdaemon,alicedaemon,bobdaemon --shutdownAfterTests=false`
#
# - Only regtest btc can be bought or sold with the test payment account.
#
# Usage:
#
# This script must be run from the root of the project, e.g.:
#
# `$ apitest/scripts/rolling-offer-simulation.sh -d buy -c us -m 2.00 -a 0.125`
#
# Script options: -d <direction> -c <country-code> (-m <mkt-price-margin(%)> || -f <fixed-price>) -a <amount(btc)>
#
# Example:
#
# Create a buy/usd offer to sell 0.1 btc at 2% above market price, using a US face to face payment account:
#
# `$ apitest/scripts/rolling-offer-simulation.sh -d sell -c us -m 2.00 -a 0.1`
APP_BASE_NAME=$(basename "$0")
APP_HOME=$(pwd -P)
APITEST_SCRIPTS_HOME="$APP_HOME/apitest/scripts"
source "$APITEST_SCRIPTS_HOME/trade-simulation-env.sh"
source "$APITEST_SCRIPTS_HOME/trade-simulation-utils.sh"
checksetup
parseopts "$@"
printdate "Started $APP_BASE_NAME with parameters:"
printscriptparams
printbreak
registerdisputeagents
showcreatepaymentacctsteps "Alice" "$ALICE_PORT"
CMD="$CLI_BASE --port=$ALICE_PORT createpaymentacct --payment-account-form=$APITEST_SCRIPTS_HOME/$F2F_ACCT_FORM"
printdate "ALICE CLI: $CMD"
CMD_OUTPUT=$(createpaymentacct "$CMD")
echo "$CMD_OUTPUT"
printbreak
export ALICE_ACCT_ID=$(getnewpaymentacctid "$CMD_OUTPUT")
export CURRENCY_CODE=$(getnewpaymentacctcurrency "$CMD_OUTPUT")
printdate "Alice's F2F payment-account-id: $ALICE_ACCT_ID, currency-code: $CURRENCY_CODE"
exitoncommandalert $?
printbreak
printdate "Bob creates his F2F payment account."
CMD="$CLI_BASE --port=$BOB_PORT createpaymentacct --payment-account-form=$APITEST_SCRIPTS_HOME/$F2F_ACCT_FORM"
printdate "BOB CLI: $CMD"
CMD_OUTPUT=$(createpaymentacct "$CMD")
echo "$CMD_OUTPUT"
printbreak
export BOB_ACCT_ID=$(getnewpaymentacctid "$CMD_OUTPUT")
export CURRENCY_CODE=$(getnewpaymentacctcurrency "$CMD_OUTPUT")
printdate "Bob's F2F payment-account-id: $BOB_ACCT_ID, currency-code: $CURRENCY_CODE"
exitoncommandalert $?
printbreak
while : ; do
printdate "ALICE $ALICE_ROLE: Creating $DIRECTION $CURRENCY_CODE offer with payment acct $ALICE_ACCT_ID."
CURRENT_PRICE=$(getcurrentprice "$ALICE_PORT" "$CURRENCY_CODE")
exitoncommandalert $?
printdate "Current Market Price: $CURRENT_PRICE"
CMD=$(gencreateoffercommand "$ALICE_PORT" "$ALICE_ACCT_ID")
printdate "ALICE CLI: $CMD"
OFFER_ID=$(createoffer "$CMD")
exitoncommandalert $?
printdate "ALICE $ALICE_ROLE: Created offer with id: $OFFER_ID."
printbreak
sleeptraced 3
# Show Alice's new offer.
printdate "ALICE $ALICE_ROLE: Looking at her new $DIRECTION $CURRENCY_CODE offer."
CMD="$CLI_BASE --port=$ALICE_PORT getoffer --offer-id=$OFFER_ID"
printdate "ALICE CLI: $CMD"
OFFER=$($CMD)
exitoncommandalert $?
echo "$OFFER"
printbreak
sleeptraced 3
# Generate some btc blocks.
printdate "Generating btc blocks after publishing Alice's offer."
genbtcblocks 3 2
printbreak
RANDOM_WAIT=$(echo $[$RANDOM % 10 + 1])
printdate "Bob will take Alice's offer in $RANDOM_WAIT seconds..."
sleeptraced "$RANDOM_WAIT"
executetrade
exitoncommandalert $?
printbreak
done
exit 0
================================================
FILE: apitest/scripts/trade-simulation-env.sh
================================================
#! /bin/bash
# This file must be sourced by the main driver.
export CLI_BASE="./haveno-cli --password=xyz"
export ARBITRATOR_PORT=9997
export ALICE_PORT=9998
export BOB_PORT=9999
export F2F_ACCT_FORM="f2f-acct.json"
checkos() {
LINUX=FALSE
DARWIN=FALSE
UNAME=$(uname)
case "$UNAME" in
Linux* )
export LINUX=TRUE
;;
Darwin* )
export DARWIN=TRUE
;;
esac
if [[ "$LINUX" == "TRUE" ]]; then
printdate "Running on supported Linux OS."
elif [[ "$DARWIN" == "TRUE" ]]; then
printdate "Running on supported Mac OS."
else
printdate "Script cannot run on $OSTYPE OS, only Linux and OSX are supported."
exit 1
fi
}
checksetup() {
checkos
apitestusage() {
echo "The apitest harness must be running a local bitcoin regtest node, a seednode, an arbitration node,"
echo "Bob & Alice daemons, and bitcoin-core's bitcoin-cli must be in the system PATH."
echo ""
echo "From the project's root dir, start all supporting nodes from a terminal:"
echo "./haveno-apitest --apiPassword=xyz --supportingApps=bitcoind,seednode,arbdaemon,alicedaemon,bobdaemon --shutdownAfterTests=false"
exit 1;
}
printdate "Checking $APP_HOME for some expected directories and files."
if [ -d "$APP_HOME/apitest" ]; then
printdate "Subproject apitest exists.";
else
printdate "Error: Subproject apitest not found, maybe because you are not running the script from the project root dir."
exit 1
fi
if [ -f "$APP_HOME/haveno-cli" ]; then
printdate "The haveno-cli script exists.";
else
printdate "Error: The haveno-cli script not found, maybe because you are not running the script from the project root dir."
exit 1
fi
printdate "Checking to see local bitcoind is running, and bitcoin-cli is in PATH."
checkbitcoindrunning
checkbitcoincliinpath
printdate "Checking to see haveno servers are running."
checkseednoderunning
checkarbnoderunning
checkalicenoderunning
checkbobnoderunning
}
parseopts() {
usage() {
echo "Usage: $0 [-d buy|sell] [-c <country-code>] [-f <fixed-price> || -m <margin-from-price>] [-a <amount in btc>]" 1>&2
exit 1;
}
local OPTIND o d c f m a
while getopts "d:c:f:m:a:" o; do
case "${o}" in
d) d=$(echo "${OPTARG}" | tr '[:lower:]' '[:upper:]')
((d == "BUY" || d == "SELL")) || usage
export DIRECTION=${d}
;;
c) c=$(echo "${OPTARG}"| tr '[:lower:]' '[:upper:]')
export COUNTRY_CODE=${c}
;;
f) f=${OPTARG}
export FIXED_PRICE=${f}
;;
m) m=${OPTARG}
export MKT_PRICE_MARGIN=${m}
;;
a) a=${OPTARG}
export AMOUNT=${a}
;;
*) usage ;;
esac
done
shift $((OPTIND-1))
if [ -z "${d}" ] || [ -z "${c}" ] || [ -z "${a}" ]; then
usage
fi
if [ -z "${f}" ] && [ -z "${m}" ]; then
usage
fi
if [ -n "${f}" ] && [ -n "${m}" ]; then
printdate "Must use margin-from-price param (-m) or fixed-price param (-f), not both."
usage
fi
if [ "$DIRECTION" = "SELL" ]
then
export BOB_ROLE="(taker/buyer)"
export ALICE_ROLE="(maker/seller)"
else
export BOB_ROLE="(taker/seller)"
export ALICE_ROLE="(maker/buyer)"
fi
}
parselimitorderopts() {
usage() {
echo "Usage: $0 [-l limit-price] [-d buy|sell] [-c <country-code>] [-f <fixed-price> || -m <margin-from-price>] [-a <amount in btc>] [-w <price-poll-interval(s)>]" 1>&2
exit 1;
}
local OPTIND o l d c f m a w
while getopts "l:d:c:f:m:a:w:" o; do
case "${o}" in
l) l=${OPTARG}
export LIMIT_PRICE=${l}
;;
d) d=$(echo "${OPTARG}" | tr '[:lower:]' '[:upper:]')
((d == "BUY" || d == "SELL")) || usage
export DIRECTION=${d}
;;
c) c=$(echo "${OPTARG}"| tr '[:lower:]' '[:upper:]')
export COUNTRY_CODE=${c}
;;
f) f=${OPTARG}
export FIXED_PRICE=${f}
;;
m) m=${OPTARG}
export MKT_PRICE_MARGIN=${m}
;;
a) a=${OPTARG}
export AMOUNT=${a}
;;
w) w=${OPTARG}
export WAIT=${w}
;;
*) usage ;;
esac
done
shift $((OPTIND-1))
if [ -z "${l}" ]; then
usage
fi
if [ -z "${d}" ] || [ -z "${c}" ] || [ -z "${a}" ]; then
usage
fi
if [ -z "${f}" ] && [ -z "${m}" ]; then
usage
fi
if [ -n "${f}" ] && [ -n "${m}" ]; then
printdate "Must use margin-from-price param (-m) or fixed-price param (-f), not both."
usage
fi
if [ -z "${w}" ]; then
WAIT=120
elif [ "$w" -lt 20 ]; then
printdate "The -w <price-poll-interval(s)> option is too low, minimum allowed is 20s. Using default 120s."
WAIT=120
fi
}
checkbitcoindrunning() {
# There may be a '+' char in the path and we have to escape it for pgrep.
if [[ $APP_HOME == *"+"* ]]; then
ESCAPED_APP_HOME=$(escapepluschar "$APP_HOME")
else
ESCAPED_APP_HOME="$APP_HOME"
fi
if pgrep -f "bitcoind -datadir=$ESCAPED_APP_HOME/apitest/build/resources/main/Bitcoin-regtest" > /dev/null ; then
printdate "The regtest bitcoind node is running on host."
else
printdate "Error: regtest bitcoind node is not running on host, exiting."
apitestusage
fi
}
checkbitcoincliinpath() {
if which bitcoin-cli > /dev/null ; then
printdate "The bitcoin-cli binary is in the system PATH."
else
printdate "Error: bitcoin-cli binary is not in the system PATH, exiting."
apitestusage
fi
}
checkseednoderunning() {
if [[ "$LINUX" == "TRUE" ]]; then
if pgrep -f "haveno.seednode.SeedNodeMain" > /dev/null ; then
printdate "The seed node is running on host."
else
printdate "Error: seed node is not running on host, exiting."
apitestusage
fi
elif [[ "$DARWIN" == "TRUE" ]]; then
if ps -A | awk '/[S]eedNodeMain/ {print $1}' > /dev/null ; then
printdate "The seednode is running on host."
else
printdate "Error: seed node is not running on host, exiting."
apitestusage
fi
else
printdate "Error: seed node is not running on host, exiting."
apitestusage
fi
}
checkarbnoderunning() {
if [[ "$LINUX" == "TRUE" ]]; then
if pgrep -f "haveno.daemon.app.HavenoDaemonMain --appName=haveno-XMR_STAGENET_Arb" > /dev/null ; then
printdate "The arbitration node is running on host."
else
printdate "Error: arbitration node is not running on host, exiting."
apitestusage
fi
elif [[ "$DARWIN" == "TRUE" ]]; then
if ps -A | awk '/[b]isq.daemon.app.HavenoDaemonMain --appName=haveno-XMR_STAGENET_Arb/ {print $1}' > /dev/null ; then
printdate "The arbitration node is running on host."
else
printdate "Error: arbitration node is not running on host, exiting."
apitestusage
fi
else
printdate "Error: arbitration node is not running on host, exiting."
apitestusage
fi
}
checkalicenoderunning() {
if [[ "$LINUX" == "TRUE" ]]; then
if pgrep -f "haveno.daemon.app.HavenoDaemonMain --appName=haveno-XMR_STAGENET_Alice" > /dev/null ; then
printdate "Alice's node is running on host."
else
printdate "Error: Alice's node is not running on host, exiting."
apitestusage
fi
elif [[ "$DARWIN" == "TRUE" ]]; then
if ps -A | awk '/[b]isq.daemon.app.HavenoDaemonMain --appName=haveno-XMR_STAGENET_Alice/ {print $1}' > /dev/null ; then
printdate "Alice's node node is running on host."
else
printdate "Error: Alice's node is not running on host, exiting."
apitestusage
fi
else
printdate "Error: Alice's node is not running on host, exiting."
apitestusage
fi
}
checkbobnoderunning() {
if [[ "$LINUX" == "TRUE" ]]; then
if pgrep -f "haveno.daemon.app.HavenoDaemonMain --appName=haveno-XMR_STAGENET_Alice" > /dev/null ; then
printdate "Bob's node is running on host."
else
printdate "Error: Bob's node is not running on host, exiting."
apitestusage
fi
elif [[ "$DARWIN" == "TRUE" ]]; then
if ps -A | awk '/[b]isq.daemon.app.HavenoDaemonMain --appName=haveno-XMR_STAGENET_Alice/ {print $1}' > /dev/null ; then
printdate "Bob's node node is running on host."
else
printdate "Error: Bob's node is not running on host, exiting."
apitestusage
fi
else
printdate "Error: Bob's node is not running on host, exiting."
apitestusage
fi
}
printscriptparams() {
if [ -n "${LIMIT_PRICE+1}" ]; then
echo " LIMIT_PRICE = $LIMIT_PRICE"
fi
echo " DIRECTION = $DIRECTION"
echo " COUNTRY_CODE = $COUNTRY_CODE"
echo " FIXED_PRICE = $FIXED_PRICE"
echo " MKT_PRICE_MARGIN = $MKT_PRICE_MARGIN"
echo " AMOUNT = $AMOUNT"
if [ -n "${BOB_ROLE+1}" ]; then
echo " BOB_ROLE = $BOB_ROLE"
fi
if [ -n "${ALICE_ROLE+1}" ]; then
echo " ALICE_ROLE = $ALICE_ROLE"
fi
if [ -n "${WAIT+1}" ]; then
echo " WAIT = $WAIT"
fi
}
================================================
FILE: apitest/scripts/trade-simulation-utils.sh
================================================
#! /bin/bash
# This file must be sourced by the main driver.
source "$APITEST_SCRIPTS_HOME/trade-simulation-env.sh"
printdate() {
echo "[$(date)] $@"
}
printbreak() {
echo ""
echo ""
}
printcmd() {
echo -en "$@\n"
}
sleeptraced() {
PERIOD="$1"
printdate "sleeping for $PERIOD"
sleep "$PERIOD"
}
commandalert() {
# Used in a script function when it needs to fail early with an error message, & pass the error code to the caller.
# usage: commandalert <$?> <msg-prefix>
if [ "$1" -ne 0 ]
then
printdate "Error: $2" >&2
exit "$1"
fi
}
# TODO rename exitonalert ?
exitoncommandalert() {
# Used in a parent script when you need it to fail immediately, with no error message.
# usage: exitoncommandalert <$?>
if [ "$1" -ne 0 ]
then
exit "$1"
fi
}
registerdisputeagents() {
# Silently register dev dispute agents. It's easy to forget.
REG_KEY="6ac43ea1df2a290c1c8391736aa42e4339c5cb4f110ff0257a13b63211977b7a"
CMD="$CLI_BASE --port=$ARBITRATOR_PORT registerdisputeagent --dispute-agent-type=mediator --registration-key=$REG_KEY"
SILENT=$($CMD)
commandalert $? "Could not register dev/test mediator."
CMD="$CLI_BASE --port=$ARBITRATOR_PORT registerdisputeagent --dispute-agent-type=refundagent --registration-key=$REG_KEY"
SILENT=$($CMD)
commandalert $? "Could not register dev/test refundagent."
# Do something with $SILENT to keep codacy happy.
echo "$SILENT" > /dev/null
}
getbtcoreaddress() {
CMD="bitcoin-cli -regtest -rpcport=19443 -rpcuser=apitest -rpcpassword=apitest getnewaddress"
NEW_ADDRESS=$($CMD)
echo "$NEW_ADDRESS"
}
genbtcblocks() {
NUM_BLOCKS="$1"
SECONDS_BETWEEN_BLOCKS="$2"
ADDR_PARAM="$(getbtcoreaddress)"
CMD_PREFIX="bitcoin-cli -regtest -rpcport=19443 -rpcuser=apitest -rpcpassword=apitest generatetoaddress 1"
# Print the generatetoaddress command with double quoted address param, to make it cut & pastable from the console.
printdate "$CMD_PREFIX \"$ADDR_PARAM\""
# Now create the full generatetoaddress command to be run now.
CMD="$CMD_PREFIX $ADDR_PARAM"
for i in $(seq -f "%02g" 1 "$NUM_BLOCKS")
do
NEW_BLOCK_HASH=$(genbtcblock "$CMD")
printdate "Block Hash #$i:$NEW_BLOCK_HASH"
sleep "$SECONDS_BETWEEN_BLOCKS"
done
}
genbtcblock() {
CMD="$1"
NEW_BLOCK_HASH=$($CMD | sed -n '2p')
echo "$NEW_BLOCK_HASH"
}
escapepluschar() {
STRING="$1"
NEW_STRING=$(echo "${STRING//+/\\+}")
echo "$NEW_STRING"
}
printbalances() {
PORT="$1"
printcmd "$CLI_BASE --port=$PORT getbalance"
$CLI_BASE --port="$PORT" getbalance
}
getpaymentaccountmethods() {
CMD="$1"
CMD_OUTPUT=$($CMD)
commandalert $? "Could not get payment method ids."
printdate "Payment Method IDs:"
echo "$CMD_OUTPUT"
}
getpaymentaccountform() {
CMD="$1"
CMD_OUTPUT=$($CMD)
commandalert $? "Could not get new payment account form."
echo "$CMD_OUTPUT"
}
editpaymentaccountform() {
COUNTRY_CODE="$1"
CMD="python3 $APITEST_SCRIPTS_HOME/editf2faccountform.py $COUNTRY_CODE"
CMD_OUTPUT=$($CMD)
commandalert $? "Could not edit payment account form."
printdate "Saved payment account form as $F2F_ACCT_FORM."
}
getnewpaymentacctid() {
CREATE_PAYMENT_ACCT_OUTPUT="$1"
PAYMENT_ACCT_DETAIL=$(echo -e "$CREATE_PAYMENT_ACCT_OUTPUT" | sed -n '3p')
ACCT_ID=$(echo -e "$PAYMENT_ACCT_DETAIL" | awk '{print $NF}')
echo "$ACCT_ID"
}
getnewpaymentacctcurrency() {
CREATE_PAYMENT_ACCT_OUTPUT="$1"
PAYMENT_ACCT_DETAIL=$(echo -e "$CREATE_PAYMENT_ACCT_OUTPUT" | sed -n '3p')
# This is brittle; it requires the account name field to have N words,
# e.g, "Face to Face Payment Account" as defined in editf2faccountform.py.
CURRENCY_CODE=$(echo -e "$PAYMENT_ACCT_DETAIL" | awk '{print $6}')
echo "$CURRENCY_CODE"
}
createpaymentacct() {
CMD="$1"
CMD_OUTPUT=$($CMD)
commandalert $? "Could not create new payment account."
echo "$CMD_OUTPUT"
}
getpaymentaccounts() {
PORT="$1"
printcmd "$CLI_BASE --port=$PORT getpaymentaccts"
CMD="$CLI_BASE --port=$PORT getpaymentaccts"
CMD_OUTPUT=$($CMD)
commandalert $? "Could not get payment accounts."
echo "$CMD_OUTPUT"
}
showcreatepaymentacctsteps() {
USER="$1"
PORT="$2"
printdate "$USER looks for the ID of the face to face payment account method (Bob will use same payment method)."
CMD="$CLI_BASE --port=$PORT getpaymentmethods"
printdate "$USER CLI: $CMD"
PAYMENT_ACCT_METHODS=$(getpaymentaccountmethods "$CMD")
echo "$PAYMENT_ACCT_METHODS"
printbreak
printdate "$USER uses the F2F payment method id to create a face to face payment account in country $COUNTRY_CODE."
CMD="$CLI_BASE --port=$PORT getpaymentacctform --payment-method-id=F2F"
printdate "$USER CLI: $CMD"
getpaymentaccountform "$CMD"
printbreak
printdate "$USER edits the $COUNTRY_CODE payment account form, and (optionally) renames it as $F2F_ACCT_FORM"
editpaymentaccountform "$COUNTRY_CODE"
cat "$APITEST_SCRIPTS_HOME/$F2F_ACCT_FORM"
# Remove the autogenerated json template because we are going to use one created by a python script in the next step.
CMD="rm -v $APP_HOME/f2f_*.json"
DELETE_JSON_TEMPLATE=$($CMD)
printdate "$DELETE_JSON_TEMPLATE"
printbreak
}
gencreateoffercommand() {
PORT="$1"
ACCT_ID="$2"
CMD="$CLI_BASE --port=$PORT createoffer"
CMD+=" --payment-account=$ACCT_ID"
CMD+=" --direction=$DIRECTION"
CMD+=" --currency-code=$CURRENCY_CODE"
CMD+=" --amount=$AMOUNT"
if [ -z "$MKT_PRICE_MARGIN" ]; then
CMD+=" --fixed-price=$FIXED_PRICE"
else
CMD+=" --market-price-margin=$MKT_PRICE_MARGIN"
fi
CMD+=" --security-deposit=15.0"
echo "$CMD"
}
createoffer() {
CREATE_OFFER_CMD="$1"
OFFER_DESC=$($CREATE_OFFER_CMD)
# If the CLI command exited with an error, print the CLI error, and
# return from this function now, passing the error status code to the caller.
commandalert $? "Could not create offer."
OFFER_DETAIL=$(echo -e "$OFFER_DESC" | sed -n '2p')
NEW_OFFER_ID=$(echo -e "$OFFER_DETAIL" | awk '{print $NF}')
echo "$NEW_OFFER_ID"
}
getfirstofferid() {
PORT="$1"
CMD="$CLI_BASE --port=$PORT getoffers --direction=$DIRECTION --currency-code=$CURRENCY_CODE"
CMD_OUTPUT=$($CMD)
commandalert $? "Could not get current $DIRECTION / $CURRENCY_CODE offers."
FIRST_OFFER_DETAIL=$(echo -e "$CMD_OUTPUT" | sed -n '2p')
FIRST_OFFER_ID=$(echo -e "$FIRST_OFFER_DETAIL" | awk '{print $NF}')
commandalert $? "Could parse the offer-id from the first listed offer."
echo "$FIRST_OFFER_ID"
}
gettrade() {
GET_TRADE_CMD="$1"
TRADE_DESC=$($GET_TRADE_CMD)
commandalert $? "Could not get trade."
echo "$TRADE_DESC"
}
gettradedetail() {
TRADE_DESC="$1"
# Get 2nd line of gettrade cmd output, and squeeze multi space delimiters into one space.
TRADE_DETAIL=$(echo "$TRADE_DESC" | sed -n '2p' | tr -s ' ')
commandalert $? "Could not get trade detail (line 2 of gettrade output)."
echo "$TRADE_DETAIL"
}
istradedepositpublished() {
TRADE_DETAIL="$1"
ANSWER=$(echo "$TRADE_DETAIL" | awk '{print $10}')
commandalert $? "Could not parse istradedepositpublished from trade detail."
echo "$ANSWER"
}
istradedepositconfirmed() {
TRADE_DETAIL="$1"
ANSWER=$(echo "$TRADE_DETAIL" | awk '{print $11}')
commandalert $? "Could not parse istradedepositconfirmed from trade detail."
echo "$ANSWER"
}
istradepaymentsent() {
TRADE_DETAIL="$1"
ANSWER=$(echo "$TRADE_DETAIL" | awk '{print $13}')
commandalert $? "Could not parse istradepaymentsent from trade detail."
echo "$ANSWER"
}
istradepaymentreceived() {
TRADE_DETAIL="$1"
ANSWER=$(echo "$TRADE_DETAIL" | awk '{print $14}')
commandalert $? "Could not parse istradepaymentreceived from trade detail."
echo "$ANSWER"
}
istradepayoutpublished() {
TRADE_DETAIL="$1"
ANSWER=$(echo "$TRADE_DETAIL" | awk '{print $15}')
commandalert $? "Could not parse istradepayoutpublished from trade detail."
echo "$ANSWER"
}
waitfortradedepositpublished() {
# Loops until Bob's trade deposit is published. (Bob is always the trade taker.)
OFFER_ID="$1"
DONE=0
while : ; do
if [ "$DONE" -ne 0 ]; then
break
fi
printdate "BOB $BOB_ROLE: Looking at his trade with id $OFFER_ID."
CMD="$CLI_BASE --port=$BOB_PORT gettrade --trade-id=$OFFER_ID"
printdate "BOB CLI: $CMD"
GETTRADE_CMD_OUTPUT=$(gettrade "$CMD")
exitoncommandalert $?
echo "$GETTRADE_CMD_OUTPUT"
printbreak
TRADE_DETAIL=$(gettradedetail "$GETTRADE_CMD_OUTPUT")
exitoncommandalert $?
IS_TRADE_DEPOSIT_PUBLISHED=$(istradedepositpublished "$TRADE_DETAIL")
exitoncommandalert $?
printdate "BOB $BOB_ROLE: Has taker's trade deposit been published? $IS_TRADE_DEPOSIT_PUBLISHED"
if [ "$IS_TRADE_DEPOSIT_PUBLISHED" = "YES" ]
then
DONE=1
else
RANDOM_WAIT=$(echo $[$RANDOM % 3 + 1])
sleeptraced "$RANDOM_WAIT"
fi
printbreak
done
}
waitfortradedepositconfirmed() {
# Loops until Bob's trade deposit is confirmed. (Bob is always the trade taker.)
OFFER_ID="$1"
DONE=0
while : ; do
if [ "$DONE" -ne 0 ]; then
break
fi
printdate "BOB $BOB_ROLE: Looking at his trade with id $OFFER_ID."
CMD="$CLI_BASE --port=$BOB_PORT gettrade --trade-id=$OFFER_ID"
printdate "BOB CLI: $CMD"
GETTRADE_CMD_OUTPUT=$(gettrade "$CMD")
exitoncommandalert $?
echo "$GETTRADE_CMD_OUTPUT"
printbreak
TRADE_DETAIL=$(gettradedetail "$GETTRADE_CMD_OUTPUT")
exitoncommandalert $?
IS_TRADE_DEPOSIT_CONFIRMED=$(istradedepositconfirmed "$TRADE_DETAIL")
exitoncommandalert $?
printdate "BOB $BOB_ROLE: Has taker's trade deposit been confirmed? $IS_TRADE_DEPOSIT_CONFIRMED"
printbreak
if [ "$IS_TRADE_DEPOSIT_CONFIRMED" = "YES" ]
then
DONE=1
else
printdate "Generating btc block while Bob waits for trade deposit to be confirmed."
genbtcblocks 1 0
RANDOM_WAIT=$(echo $[$RANDOM % 3 + 1])
sleeptraced "$RANDOM_WAIT"
fi
done
}
waitfortradepaymentsent() {
# Loops until buyer's trade payment has been sent.
PORT="$1"
SELLER="$2"
OFFER_ID="$3"
DONE=0
while : ; do
if [ "$DONE" -ne 0 ]; then
break
fi
printdate "$SELLER: Looking at trade with id $OFFER_ID."
CMD="$CLI_BASE --port=$PORT gettrade --trade-id=$OFFER_ID"
printdate "$SELLER CLI: $CMD"
GETTRADE_CMD_OUTPUT=$(gettrade "$CMD")
exitoncommandalert $?
echo "$GETTRADE_CMD_OUTPUT"
printbreak
TRADE_DETAIL=$(gettradedetail "$GETTRADE_CMD_OUTPUT")
exitoncommandalert $?
IS_TRADE_PAYMENT_SENT=$(istradepaymentsent "$TRADE_DETAIL")
exitoncommandalert $?
printdate "$SELLER: Has buyer's payment been initiated? $IS_TRADE_PAYMENT_SENT"
if [ "$IS_TRADE_PAYMENT_SENT" = "YES" ]
then
DONE=1
else
RANDOM_WAIT=$(echo $[$RANDOM % 3 + 1])
sleeptraced "$RANDOM_WAIT"
fi
printbreak
done
}
waitfortradepaymentreceived() {
# Loops until buyer's trade payment has been received.
PORT="$1"
SELLER="$2"
OFFER_ID="$3"
DONE=0
while : ; do
if [ "$DONE" -ne 0 ]; then
break
fi
printdate "$SELLER: Looking at trade with id $OFFER_ID."
CMD="$CLI_BASE --port=$PORT gettrade --trade-id=$OFFER_ID"
printdate "$SELLER CLI: $CMD"
GETTRADE_CMD_OUTPUT=$(gettrade "$CMD")
exitoncommandalert $?
echo "$GETTRADE_CMD_OUTPUT"
printbreak
TRADE_DETAIL=$(gettradedetail "$GETTRADE_CMD_OUTPUT")
exitoncommandalert $?
# When the seller receives a 'payment sent' message, it is assumed funds (fiat) have already been deposited.
# In a real trade, there is usually a delay between receipt of a 'payment sent' message, and the funds deposit,
# but we do not need to simulate that in this regtest script.
IS_TRADE_PAYMENT_SENT=$(istradepaymentreceived "$TRADE_DETAIL")
exitoncommandalert $?
printdate "$SELLER: Has buyer's payment been transferred to seller's account? $IS_TRADE_PAYMENT_SENT"
if [ "$IS_TRADE_PAYMENT_SENT" = "YES" ]
then
DONE=1
else
RANDOM_WAIT=$(echo $[$RANDOM % 3 + 1])
sleeptraced "$RANDOM_WAIT"
fi
printbreak
done
}
delayconfirmpaymentsent() {
# Confirm payment started after a random delay. This should be run in the background
# while the payee polls the trade status, waiting for the message before confirming
# payment has been received.
PAYER="$1"
PORT="$2"
OFFER_ID="$3"
RANDOM_WAIT=$(echo $[$RANDOM % 5 + 1])
printdate "$PAYER: Sending 'payment sent' message to seller in $RANDOM_WAIT seconds..."
sleeptraced "$RANDOM_WAIT"
CMD="$CLI_BASE --port=$PORT confirmpaymentsent --trade-id=$OFFER_ID"
printdate "$PAYER_CLI: $CMD"
SENT_MSG=$($CMD)
commandalert $? "Could not send confirmpaymentsent message."
# Print the confirmpaymentsent command's console output.
printdate "$SENT_MSG"
printbreak
}
delayconfirmpaymentreceived() {
# Confirm payment received after a random delay. This should be run in the background
# while the payer polls the trade status, waiting for the confirmation from the seller
# that funds have been received.
PAYEE="$1"
PORT="$2"
OFFER_ID="$3"
RANDOM_WAIT=$(echo $[$RANDOM % 5 + 1])
printdate "$PAYEE: Sending 'payment sent' message to seller in $RANDOM_WAIT seconds..."
sleeptraced "$RANDOM_WAIT"
CMD="$CLI_BASE --port=$PORT confirmpaymentreceived --trade-id=$OFFER_ID"
printdate "$PAYEE_CLI: $CMD"
RCVD_MSG=$($CMD)
commandalert $? "Could not send confirmpaymentsent message."
# Print the confirmpaymentsent command's console output.
printdate "$RCVD_MSG"
printbreak
}
# This is a large function that might be split into smaller functions. But we are not testing
# api methods here, just demonstrating how to use them to get through the V1 trade protocol with
# the CLI. It should work for any trade between Bob & Alice, as long as Alice is maker, Bob is
# taker, and the offer to be taken is the first displayed in Bob's getoffers command output.
executetrade() {
# Bob list available offers.
printdate "BOB $BOB_ROLE: Looking at $DIRECTION $CURRENCY_CODE offers."
CMD="$CLI_BASE --port=$BOB_PORT getoffers --direction=$DIRECTION --currency-code=$CURRENCY_CODE"
printdate "BOB CLI: $CMD"
OFFERS=$($CMD)
exitoncommandalert $?
echo "$OFFERS"
printbreak
OFFER_ID=$(getfirstofferid "$BOB_PORT")
exitoncommandalert $?
printdate "First offer found: $OFFER_ID"
# Take Alice's offer.
CMD="$CLI_BASE --port=$BOB_PORT takeoffer --offer-id=$OFFER_ID --payment-account=$BOB_ACCT_ID"
printdate "BOB CLI: $CMD"
TRADE=$($CMD)
commandalert $? "Could not take offer."
# Print the takeoffer command's console output.
printdate "$TRADE"
printbreak
waitfortradedepositpublished "$OFFER_ID"
waitfortradedepositconfirmed "$OFFER_ID"
# Send payment sent and received messages.
if [ "$DIRECTION" = "BUY" ]
then
PAYER="ALICE $ALICE_ROLE"
PAYER_PORT=$ALICE_PORT
PAYER_CLI="ALICE CLI"
PAYEE="BOB $BOB_ROLE"
PAYEE_PORT=$BOB_PORT
PAYEE_CLI="BOB CLI"
else
PAYER="BOB $BOB_ROLE"
PAYER_PORT=$BOB_PORT
PAYER_CLI="BOB CLI"
PAYEE="ALICE $ALICE_ROLE"
PAYEE_PORT=$ALICE_PORT
PAYEE_CLI="ALICE CLI"
fi
# Asynchronously send a confirm payment started message after a random delay.
delayconfirmpaymentsent "$PAYER" "$PAYER_PORT" "$OFFER_ID" &
if [ "$DIRECTION" = "BUY" ]
then
# Bob waits for payment, polling status in taker specific trade detail.
waitfortradepaymentsent "$PAYEE_PORT" "$PAYEE" "$OFFER_ID"
else
# Alice waits for payment, polling status in maker specific trade detail.
waitfortradepaymentsent "$PAYEE_PORT" "$PAYEE" "$OFFER_ID"
fi
# Asynchronously send a confirm payment received message after a random delay.
delayconfirmpaymentreceived "$PAYEE" "$PAYEE_PORT" "$OFFER_ID" &
if [ "$DIRECTION" = "BUY" ]
then
# Alice waits for payment rcvd confirm from Bob, polling status in maker specific trade detail.
waitfortradepaymentreceived "$PAYER_PORT" "$PAYER" "$OFFER_ID"
else
# Bob waits for payment rcvd confirm from Alice, polling status in taker specific trade detail.
waitfortradepaymentreceived "$PAYER_PORT" "$PAYER" "$OFFER_ID"
fi
# Generate some btc blocks
printdate "Generating btc blocks after payment."
genbtcblocks 2 2
printbreak
# Complete the trade on both sides
printdate "BOB $BOB_ROLE: Closing trade and keeping funds in Haveno wallet."
CMD="$CLI_BASE --port=$BOB_PORT closetrade --trade-id=$OFFER_ID"
printdate "BOB CLI: $CMD"
KEEP_FUNDS_MSG=$($CMD)
commandalert $? "Closed trade with closetrade command."
# Print the closetrade command's console output.
printdate "$KEEP_FUNDS_MSG"
sleeptraced 3
printbreak
printdate "ALICE (taker): Closing trade and keeping funds in Haveno wallet."
CMD="$CLI_BASE --port=$ALICE_PORT closetrade --trade-id=$OFFER_ID"
printdate "ALICE CLI: $CMD"
KEEP_FUNDS_MSG=$($CMD)
commandalert $? "Closed trade with closetrade command."
# Print the closetrade command's console output.
printdate "$KEEP_FUNDS_MSG"
sleeptraced 3
printbreak
printdate "Trade $OFFER_ID complete."
}
getcurrentprice() {
PORT="$1"
CURRENCY_CODE="$2"
CMD="$CLI_BASE --port=$PORT getbtcprice --currency-code=$CURRENCY_CODE"
CMD_OUTPUT=$($CMD)
commandalert $? "Could not get current market $CURRENCY_CODE price."
FLOOR=$(echo "$CMD_OUTPUT" | cut -d'.' -f 1)
commandalert $? "Could not get the floor of the current market $CURRENCY_CODE price."
INTEGER=$(echo "$FLOOR" | tr -cd '[[:digit:]]')
commandalert $? "Could not convert the current market $CURRENCY_CODE price string to an integer."
echo "$INTEGER"
}
================================================
FILE: apitest/scripts/trade-simulation.sh
================================================
#! /bin/bash
# Demonstrates a fiat <-> btc trade using the API CLI with a local regtest bitcoin node.
#
# A country code argument is used to create a country based face to face payment account for the simulated
# trade, and the maker's face to face payment account's currency code is used when creating the offer.
#
# Prerequisites:
#
# - Linux or OSX with bash, Java 11-15 (JDK language compatibility 11), and bitcoin-core (v0.19 - v22).
#
# - Haveno must be fully built with apitest dao setup files installed.
# Build command: `./gradlew clean build :apitest:installDaoSetup`
#
# - All supporting nodes must be run locally, in dev/dao/regtest mode:
# bitcoind, seednode, arbdaemon, alicedaemon, bobdaemon
#
# These should be run using the apitest harness. From the root project dir, run:
# `$ ./haveno-apitest --apiPassword=xyz --supportingApps=bitcoind,seednode,arbdaemon,alicedaemon,bobdaemon --shutdownAfterTests=false`
#
# - Only regtest btc can be bought or sold with the test payment account.
#
# Usage:
#
# This script must be run from the root of the project, e.g.:
#
# `$ apitest/scripts/trade-simulation.sh -d buy -c fr -m 3.00 -a 0.125`
#
# Script options: -d <direction> -c <country-code> -m <mkt-price-margin(%)> -f <fixed-price> -a <amount(btc)>
#
# Examples:
#
# Create and take a buy/eur offer to buy 0.125 btc at a mkt-price-margin of 0%, using an Italy face to face
# payment account:
#
# `$ apitest/scripts/trade-simulation.sh -d buy -c it -m 0.00 -a 0.125`
#
# Create and take a sell/eur offer to sell 0.125 btc at a fixed-price of 38,000 euros, using a France face to face
# payment account:
#
# `$ apitest/scripts/trade-simulation.sh -d sell -c fr -f 38000 -a 0.125`
export APP_BASE_NAME=$(basename "$0")
export APP_HOME=$(pwd -P)
export APITEST_SCRIPTS_HOME="$APP_HOME/apitest/scripts"
source "$APITEST_SCRIPTS_HOME/trade-simulation-env.sh"
source "$APITEST_SCRIPTS_HOME/trade-simulation-utils.sh"
checksetup
parseopts "$@"
printdate "Started $APP_BASE_NAME with parameters:"
printscriptparams
printbreak
# Demonstrate how to create a country based, face to face account.
showcreatepaymentacctsteps "Alice" "$ALICE_PORT"
CMD="$CLI_BASE --port=$ALICE_PORT createpaymentacct --payment-account-form=$APITEST_SCRIPTS_HOME/$F2F_ACCT_FORM"
printdate "ALICE CLI: $CMD"
CMD_OUTPUT=$(createpaymentacct "$CMD")
echo "$CMD_OUTPUT"
printbreak
export ALICE_ACCT_ID=$(getnewpaymentacctid "$CMD_OUTPUT")
export CURRENCY_CODE=$(getnewpaymentacctcurrency "$CMD_OUTPUT")
printdate "Alice's F2F payment-account-id: $ALICE_ACCT_ID, currency-code: $CURRENCY_CODE"
exitoncommandalert $?
printbreak
printdate "Bob creates his F2F payment account."
CMD="$CLI_BASE --port=$BOB_PORT createpaymentacct --payment-account-form=$APITEST_SCRIPTS_HOME/$F2F_ACCT_FORM"
printdate "BOB CLI: $CMD"
CMD_OUTPUT=$(createpaymentacct "$CMD")
echo "$CMD_OUTPUT"
printbreak
export BOB_ACCT_ID=$(getnewpaymentacctid "$CMD_OUTPUT")
export CURRENCY_CODE=$(getnewpaymentacctcurrency "$CMD_OUTPUT")
printdate "Bob's F2F payment-account-id: $BOB_ACCT_ID, currency-code: $CURRENCY_CODE"
exitoncommandalert $?
printbreak
# Alice creates an offer.
printdate "ALICE $ALICE_ROLE: Creating $DIRECTION $CURRENCY_CODE offer with payment acct $ALICE_ACCT_ID."
CURRENT_PRICE=$(getcurrentprice "$ALICE_PORT" "$CURRENCY_CODE")
exitoncommandalert $?
printdate "Current Market Price: $CURRENT_PRICE"
CMD=$(gencreateoffercommand "$ALICE_PORT" "$ALICE_ACCT_ID")
printdate "ALICE CLI: $CMD"
OFFER_ID=$(createoffer "$CMD")
exitoncommandalert $?
printdate "ALICE $ALICE_ROLE: Created offer with id: $OFFER_ID."
printbreak
sleeptraced 3
# Show Alice's new offer.
printdate "ALICE $ALICE_ROLE: Looking at her new $DIRECTION $CURRENCY_CODE offer."
CMD="$CLI_BASE --port=$ALICE_PORT getoffer --offer-id=$OFFER_ID"
printdate "ALICE CLI: $CMD"
OFFER=$($CMD)
exitoncommandalert $?
echo "$OFFER"
printbreak
sleeptraced 3
# Generate some btc blocks.
printdate "Generating btc blocks after publishing Alice's offer."
genbtcblocks 3 1
printbreak
# Go through the trade protocol.
executetrade
exitoncommandalert $?
printbreak
# Get balances after trade completion.
printdate "Bob & Alice's balances after trade:"
printdate "ALICE CLI:"
printbalances "$ALICE_PORT"
printbreak
printdate "BOB CLI:"
printbalances "$BOB_PORT"
printbreak
exit 0
================================================
FILE: apitest/scripts/trade-xmr-simulation.sh
================================================
#! /bin/bash
# Runs xmr <-> btc trading scenarios using the API CLI with a local regtest bitcoin node.
#
# Prerequisites:
#
# - Linux or OSX with bash, Java 11-15 (JDK language compatibility 11), and bitcoin-core (v0.19 - v22).
#
# - Haveno must be fully built with apitest dao setup files installed.
# Build command: `./gradlew clean build :apitest:installDaoSetup`
#
# - All supporting nodes must be run locally, in dev/dao/regtest mode:
# bitcoind, seednode, arbdaemon, alicedaemon, bobdaemon
#
# These should be run using the apitest harness. From the root project dir, run:
# `$ ./haveno-apitest --apiPassword=xyz --supportingApps=bitcoind,seednode,arbdaemon,alicedaemon,bobdaemon --shutdownAfterTests=false`
#
# Usage:
#
# This script must be run from the root of the project, e.g.:
#
# `$ apitest/scripts/trade-xmr-simulation.sh -d buy -f 0.05 -a 0.125`
#
# Script options: -d <direction> -m <mkt-price-margin(%)> -f <fixed-price> -a <amount(btc)>
#
# Examples:
#
# Create a buy/xmr offer to buy 0.125 btc at an xmr fixed-price of 0.05 btc, using an xmr payment account:
#
# `$ apitest/scripts/trade-xmr-simulation.sh -d buy -f 0.05 -a 0.125`
#
# Create a sell/xmr offer to sell 0.125 btc at at an xmr mkt-price-margin of 0%, using using an xmr payment account:
#
# `$ apitest/scripts/trade-xmr-simulation.sh -d sell -m 0.00 -a 0.125`
export APP_BASE_NAME=$(basename "$0")
export APP_HOME=$(pwd -P)
export APITEST_SCRIPTS_HOME="$APP_HOME/apitest/scripts"
export CURRENCY_CODE="XMR"
export ALICE_XMR_ADDRESS="44i8xZbd8ecaD6nQQrHjr1BwTp6QfGL22iWqHZKmU4QYSyr1F64XAxM4HgvQHxbny7ehfxemaA9LPDLz2wY3fxhB1bbMEco"
export BOB_XMR_ADDRESS="48xdBkXaCosPxcWwXRZdSGc33M9tYu6k9ga56dqkNrgsjQuJX16xW2qTyWTZstJpXXj87dj5p4H3y1xAfoVjAysoAYrXh2N"
source "$APITEST_SCRIPTS_HOME/trade-simulation-env.sh"
source "$APITEST_SCRIPTS_HOME/trade-simulation-utils.sh"
checksetup
parsexmrscriptopts "$@"
printdate "Started $APP_BASE_NAME with parameters:"
printscriptparams
printbreak
registerdisputeagents
# Demonstrate how to create an XMR payment account.
printdate "Create Alice's XMR Trading Payment Account."
# Note: Having problems passing a double quoted --account-name param to function.
CMD="$CLI_BASE --port=$ALICE_PORT createcryptopaymentacct --account-name=Alice_XMR_Account"
CMD+=" --currency-code=XMR --address=$ALICE_XMR_ADDRESS --trade-instant=false"
printdate "ALICE CLI: $CMD"
CMD_OUTPUT=$(createpaymentacct "$CMD")
echo "$CMD_OUTPUT"
printbreak
export ALICE_ACCT_ID=$(getnewpaymentacctid "$CMD_OUTPUT")
printdate "Alice's XMR payment-account-id: $ALICE_ACCT_ID"
exitoncommandalert $?
printbreak
printdate "Create Bob's XMR Trading Payment Account."
# Note: Having problems passing a double quoted --account-name param to function.
CMD="$CLI_BASE --port=$BOB_PORT createcryptopaymentacct --account-name=Bob_XMR_Account"
CMD+=" --currency-code=XMR --address=$BOB_XMR_ADDRESS --trade-instant=false"
printdate "BOB CLI: $CMD"
CMD_OUTPUT=$(createpaymentacct "$CMD")
echo "$CMD_OUTPUT"
printbreak
export BOB_ACCT_ID=$(getnewpaymentacctid "$CMD_OUTPUT")
printdate "Bob's XMR payment-account-id: $BOB_ACCT_ID"
exitoncommandalert $?
printbreak
# Alice creates an offer.
printdate "ALICE $ALICE_ROLE: Creating $DIRECTION $CURRENCY_CODE offer with payment acct $ALICE_ACCT_ID."
CMD=$(gencreateoffercommand "$ALICE_PORT" "$ALICE_ACCT_ID")
printdate "ALICE CLI: $CMD"
OFFER_ID=$(createoffer "$CMD")
exitoncommandalert $?
printdate "ALICE $ALICE_ROLE: Created offer with id: $OFFER_ID."
printbreak
sleeptraced 3
# Show Alice's new offer.
printdate "ALICE $ALICE_ROLE: Looking at her new $DIRECTION $CURRENCY_CODE offer."
CMD="$CLI_BASE --port=$ALICE_PORT getoffer --offer-id=$OFFER_ID"
printdate "ALICE CLI: $CMD"
OFFER=$($CMD)
exitoncommandalert $?
echo "$OFFER"
printbreak
sleeptraced 3
# Generate some btc blocks.
printdate "Generating btc blocks after publishing Alice's offer."
genbtcblocks 3 1
printbreak
# Go through the trade protocol.
executetrade
exitoncommandalert $?
printbreak
# Get balances after trade completion.
printdate "Bob & Alice's balances after trade:"
printdate "ALICE CLI:"
printbalances "$ALICE_PORT"
printbreak
printdate "BOB CLI:"
printbalances "$BOB_PORT"
printbreak
exit 0
================================================
FILE: apitest/scripts/version-parser.bash
================================================
#!/bin/bash
# Bats helper script for parsing current version from Version.java.
export CURRENT_VERSION=$(grep "String VERSION =" common/src/main/java/haveno/common/app/Version.java | sed 's/[^0-9.]*//g')
================================================
FILE: apitest/src/main/java/haveno/apitest/ApiTestMain.java
================================================
/*
* 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.apitest;
import haveno.apitest.config.ApiTestConfig;
import lombok.extern.slf4j.Slf4j;
import java.io.File;
import static haveno.apitest.Scaffold.EXIT_FAILURE;
import static haveno.apitest.Scaffold.EXIT_SUCCESS;
import static haveno.apitest.config.ApiTestRateMeterInterceptorConfig.appendCallRateMeteringConfigPathOpt;
import static haveno.apitest.config.ApiTestRateMeterInterceptorConfig.getTestRateMeterInterceptorConfig;
import static haveno.apitest.config.ApiTestRateMeterInterceptorConfig.hasCallRateMeteringConfigPathOpt;
import static java.lang.System.err;
import static java.lang.System.exit;
/**
* ApiTestMain is a placeholder for the gradle build file, which requires a valid
* 'mainClassName' property in the :apitest subproject configuration.
*
* It has some uses:
*
* It can be used to print test scaffolding options: haveno-apitest --help.
*
* It can be used to smoke test your bitcoind environment: haveno-apitest.
*
* It can be used to run the regtest environment for release testing:
* haveno-test --shutdownAfterTests=false
*
* All method, scenario and end-to-end tests are found in the test sources folder.
*
* Requires bitcoind v0.19 - v22.
*/
@Slf4j
public class ApiTestMain {
public static void main(String[] args) {
if (!hasCallRateMeteringConfigPathOpt(args))
new ApiTestMain().execute(getAppendedArgs(args));
else
new ApiTestMain().execute(args);
}
public void execute(String[] args) {
try {
log.info("Configuring test harness with options:\n\t{}", String.join("\n\t", args));
Scaffold scaffold = new Scaffold(args).setUp();
ApiTestConfig config = scaffold.config;
if (config.skipTests) {
log.info("Skipping tests ...");
} else {
new SmokeTestBitcoind(config).run();
}
if (config.shutdownAfterTests) {
scaffold.tearDown();
exit(EXIT_SUCCESS);
} else {
log.info("Not shutting down scaffolding background processes will run until ^C / kill -15 is rcvd ...");
}
} catch (Throwable ex) {
err.println("Fault: An unexpected error occurred. " +
"Please file a report at https://github.com/haveno-dex/haveno/issues");
ex.printStackTrace(err);
exit(EXIT_FAILURE);
}
}
private static String[] getAppendedArgs(String[] args) {
File rateMeterInterceptorConfig = getTestRateMeterInterceptorConfig();
return appendCallRateMeteringConfigPathOpt(args, rateMeterInterceptorConfig);
}
}
================================================
FILE: apitest/src/main/java/haveno/apitest/Scaffold.java
================================================
/*
* 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.apitest;
import haveno.apitest.config.ApiTestConfig;
import haveno.apitest.config.HavenoAppConfig;
import haveno.apitest.linux.BashCommand;
import haveno.apitest.linux.BitcoinDaemon;
import haveno.apitest.linux.HavenoProcess;
import haveno.apitest.linux.LinuxProcess;
import haveno.cli.GrpcClient;
import haveno.common.config.HavenoHelpFormatter;
import haveno.common.util.Utilities;
import lombok.extern.slf4j.Slf4j;
import javax.annotation.Nullable;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.PosixFilePermissions;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import static haveno.apitest.Scaffold.BitcoinCoreApp.bitcoind;
import static haveno.apitest.config.ApiTestConfig.MEDIATOR;
import static haveno.apitest.config.ApiTestConfig.REFUND_AGENT;
import static haveno.apitest.config.HavenoAppConfig.alicedaemon;
import static haveno.apitest.config.HavenoAppConfig.alicedesktop;
import static haveno.apitest.config.HavenoAppConfig.arbdaemon;
import static haveno.apitest.config.HavenoAppConfig.arbdesktop;
import static haveno.apitest.config.HavenoAppConfig.bobdaemon;
import static haveno.apitest.config.HavenoAppConfig.bobdesktop;
import static haveno.apitest.config.HavenoAppConfig.seednode;
import static haveno.common.app.DevEnv.DEV_PRIVILEGE_PRIV_KEY;
import static java.lang.String.format;
import static java.lang.System.exit;
import static java.lang.System.out;
import static java.net.InetAddress.getLoopbackAddress;
import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static java.util.concurrent.TimeUnit.SECONDS;
@Slf4j
public class Scaffold {
public static final int EXIT_SUCCESS = 0;
public static final int EXIT_FAILURE = 1;
public enum BitcoinCoreApp {
bitcoind
}
public final ApiTestConfig config;
@Nullable
private SetupTask bitcoindTask;
@Nullable
private Future<SetupTask.Status> bitcoindTaskFuture;
@Nullable
private SetupTask seedNodeTask;
@Nullable
private Future<SetupTask.Status> seedNodeTaskFuture;
@Nullable
private SetupTask arbNodeTask;
@Nullable
private Future<SetupTask.Status> arbNodeTaskFuture;
@Nullable
private SetupTask aliceNodeTask;
@Nullable
private Future<SetupTask.Status> aliceNodeTaskFuture;
@Nullable
private SetupTask bobNodeTask;
@Nullable
private Future<SetupTask.Status> bobNodeTaskFuture;
private final ExecutorService executor;
/**
* Constructor for passing comma delimited list of supporting apps to
* ApiTestConfig, e.g., "bitcoind,seednode,arbdaemon,alicedaemon,bobdaemon".
*
* @param supportingApps String
*/
public Scaffold(String supportingApps) {
this(new ApiTestConfig("--supportingApps", supportingApps));
}
/**
* Constructor for passing options accepted by ApiTestConfig.
*
* @param args String[]
*/
public Scaffold(String[] args) {
this(new ApiTestConfig(args));
}
/**
* Constructor for passing ApiTestConfig instance.
*
* @param config ApiTestConfig
*/
public Scaffold(ApiTestConfig config) {
verifyNotWindows();
this.config = config;
this.executor = Executors.newFixedThreadPool(config.supportingApps.size());
if (config.helpRequested) {
config.printHelp(out,
new HavenoHelpFormatter(
"Haveno ApiTest",
"haveno-apitest",
"0.1.0"));
exit(EXIT_SUCCESS);
}
}
public Scaffold setUp() throws IOException, InterruptedException, ExecutionException {
// Start each background process from an executor, then add a shutdown hook.
CountDownLatch countdownLatch = new CountDownLatch(config.supportingApps.size());
startBackgroundProcesses(executor, countdownLatch);
installShutdownHook();
// Wait for all submitted startup tasks to decrement the count of the latch.
Objects.requireNonNull(countdownLatch).await();
// Verify each startup task's future is done.
verifyStartupCompleted();
maybeRegisterDisputeAgents();
return this;
}
public void tearDown() {
if (!executor.isTerminated()) {
try {
log.info("Shutting down executor service ...");
executor.shutdownNow();
//noinspection ResultOfMethodCallIgnored
executor.awaitTermination(config.supportingApps.size() * 2000L, MILLISECONDS);
SetupTask[] orderedTasks = new SetupTask[]{
bobNodeTask, aliceNodeTask, arbNodeTask, seedNodeTask, bitcoindTask};
Optional<Throwable> firstException = shutDownAll(orderedTasks);
if (firstException.isPresent())
throw new IllegalStateException(
"There were errors shutting down one or more background instances.",
firstException.get());
else
log.info("Teardown complete");
} catch (Exception ex) {
throw new IllegalStateException(ex);
}
}
}
private Optional<Throwable> shutDownAll(SetupTask[] orderedTasks) {
Optional<Throwable> firstException = Optional.empty();
for (SetupTask t : orderedTasks) {
if (t != null && t.getLinuxProcess() != null) {
try {
LinuxProcess p = t.getLinuxProcess();
p.shutdown();
MILLISECONDS.sleep(1000);
if (p.hasShutdownExceptions()) {
// We log shutdown exceptions, but do not throw any from here
// because all the background instances must be shut down.
p.logExceptions(p.getShutdownExceptions(), log);
// We cache only the 1st shutdown exception and move on to the
// next process to be shutdown. This cached exception will be the
// one thrown to the calling test case (the @AfterAll method).
if (!firstException.isPresent())
firstException = Optional.of(p.getShutdownExceptions().get(0));
}
} catch (InterruptedException ignored) {
// empty
}
}
}
return firstException;
}
private void installBitcoinBlocknotify() {
// gradle is not working for this
try {
Path srcPath = Paths.get(config.baseSrcResourcesDir, "blocknotify");
Path destPath = Paths.get(config.bitcoinDatadir, "blocknotify");
Files.copy(srcPath, destPath, REPLACE_EXISTING);
String chmod700Perms = "rwx------";
Files.setPosixFilePermissions(destPath, PosixFilePermissions.fromString(chmod700Perms));
log.info("Installed {} with perms {}.", destPath, chmod700Perms);
} catch (IOException e) {
e.printStackTrace();
}
}
private void installCallRateMeteringConfiguration(String dataDir) throws IOException, InterruptedException {
if (config.callRateMeteringConfigPath.isEmpty())
return;
File testRateMeteringFile = new File(config.callRateMeteringConfigPath);
if (!testRateMeteringFile.exists())
throw new FileNotFoundException(
format("Call rate metering config file '%s' not found", config.callRateMeteringConfigPath));
BashCommand copyRateMeteringConfigFile = new BashCommand(
"cp -rf " + config.callRateMeteringConfigPath + " " + dataDir);
if (copyRateMeteringConfigFile.run().getExitStatus() != 0)
throw new IllegalStateException(
format("Could not install %s file in %s",
testRateMeteringFile.getAbsolutePath(), dataDir));
Path destPath = Paths.get(dataDir, testRateMeteringFile.getName());
String chmod700Perms = "rwx------";
Files.setPosixFilePermissions(destPath, PosixFilePermissions.fromString(chmod700Perms));
log.info("Installed {} with perms {}.", destPath, chmod700Perms);
}
private void installShutdownHook() {
// Background apps can be left running until the jvm is manually shutdown,
// so we add a shutdown hook for that use case.
Runtime.getRuntime().addShutdownHook(new Thread(this::tearDown));
}
// Starts bitcoind and haveno apps (seednode, arbnode, etc...)
private void startBackgroundProcesses(ExecutorService executor,
CountDownLatch countdownLatch)
throws InterruptedException, IOException {
log.info("Starting supporting apps {}", config.supportingApps.toString());
if (config.hasSupportingApp(bitcoind.name())) {
BitcoinDaemon bitcoinDaemon = new BitcoinDaemon(config);
bitcoinDaemon.verifyBitcoinPathsExist(true);
bitcoindTask = new SetupTask(bitcoinDaemon, countdownLatch);
bitcoindTaskFuture = executor.submit(bitcoindTask);
MILLISECONDS.sleep(config.havenoAppInitTime);
LinuxProcess bitcoindProcess = bitcoindTask.getLinuxProcess();
if (bitcoindProcess.hasStartupExceptions()) {
bitcoindProcess.logExceptions(bitcoindProcess.getStartupExceptions(), log);
throw new IllegalStateException(bitcoindProcess.getStartupExceptions().get(0));
}
bitcoinDaemon.verifyBitcoindRunning();
}
// Start Haveno apps defined by the supportingApps option, in the in proper order.
if (config.hasSupportingApp(seednode.name()))
startHavenoApp(seednode, executor, countdownLatch);
if (config.hasSupportingApp(arbdaemon.name()))
startHavenoApp(arbdaemon, executor, countdownLatch);
else if (config.hasSupportingApp(arbdesktop.name()))
startHavenoApp(arbdesktop, executor, countdownLatch);
if (config.hasSupportingApp(alicedaemon.name()))
startHavenoApp(alicedaemon, executor, countdownLatch);
else if (config.hasSupportingApp(alicedesktop.name()))
startHavenoApp(alicedesktop, executor, countdownLatch);
if (config.hasSupportingApp(bobdaemon.name()))
startHavenoApp(bobdaemon, executor, countdownLatch);
else if (config.hasSupportingApp(bobdesktop.name()))
startHavenoApp(bobdesktop, executor, countdownLatch);
}
private void startHavenoApp(HavenoAppConfig HavenoAppConfig,
ExecutorService executor,
CountDownLatch countdownLatch)
throws IOException, InterruptedException {
HavenoProcess HavenoProcess = createHavenoProcess(HavenoAppConfig);
switch (HavenoAppConfig) {
case seednode:
seedNodeTask = new SetupTask(HavenoProcess, countdownLatch);
seedNodeTaskFuture = executor.submit(seedNodeTask);
break;
case arbdaemon:
case arbdesktop:
arbNodeTask = new SetupTask(HavenoProcess, countdownLatch);
arbNodeTaskFuture = executor.submit(arbNodeTask);
break;
case alicedaemon:
case alicedesktop:
aliceNodeTask = new SetupTask(HavenoProcess, countdownLatch);
aliceNodeTaskFuture = executor.submit(aliceNodeTask);
break;
case bobdaemon:
case bobdesktop:
bobNodeTask = new SetupTask(HavenoProcess, countdownLatch);
bobNodeTaskFuture = executor.submit(bobNodeTask);
break;
default:
throw new IllegalStateException("Unknown HavenoAppConfig " + HavenoAppConfig.name());
}
log.info("Giving {} ms for {} to initialize ...", config.havenoAppInitTime, HavenoAppConfig.appName);
MILLISECONDS.sleep(config.havenoAppInitTime);
if (HavenoProcess.hasStartupExceptions()) {
HavenoProcess.logExceptions(HavenoProcess.getStartupExceptions(), log);
throw new IllegalStateException(HavenoProcess.getStartupExceptions().get(0));
}
}
private HavenoProcess createHavenoProcess(HavenoAppConfig HavenoAppConfig)
throws IOException, InterruptedException {
HavenoProcess HavenoProcess = new HavenoProcess(HavenoAppConfig, config);
HavenoProcess.verifyAppNotRunning();
HavenoProcess.verifyAppDataDirInstalled();
return HavenoProcess;
}
private void verifyStartupCompleted()
throws ExecutionException, InterruptedException {
if (bitcoindTaskFuture != null)
verifyStartupCompleted(bitcoindTaskFuture);
if (seedNodeTaskFuture != null)
verifyStartupCompleted(seedNodeTaskFuture);
if (arbNodeTaskFuture != null)
verifyStartupCompleted(arbNodeTaskFuture);
if (aliceNodeTaskFuture != null)
verifyStartupCompleted(aliceNodeTaskFuture);
if (bobNodeTaskFuture != null)
verifyStartupCompleted(bobNodeTaskFuture);
}
private void verifyStartupCompleted(Future<SetupTask.Status> futureStatus)
throws ExecutionException, InterruptedException {
for (int i = 0; i < 10; i++) {
if (futureStatus.isDone()) {
log.info("{} completed startup at {} {}",
futureStatus.get().getName(),
futureStatus.get().getStartTime().toLocalDate(),
futureStatus.get().getStartTime().toLocalTime());
return;
} else {
// We are giving the thread more time to terminate after the countdown
// latch reached 0. If we are running only bitcoind, we need to be even
// more lenient.
SECONDS.sleep(config.supportingApps.size() == 1 ? 2 : 1);
}
}
throw new IllegalStateException(format("%s did not complete startup", futureStatus.get().getName()));
}
private void verifyNotWindows() {
if (Utilities.isWindows())
throw new IllegalStateException("ApiTest not supported on Windows");
}
private void maybeRegisterDisputeAgents() {
if (config.hasSupportingApp(arbdaemon.name()) && config.registerDisputeAgents) {
log.info("Option --registerDisputeAgents=true, registering dispute agents in arbdaemon ...");
GrpcClient arbClient = new GrpcClient(getLoopbackAddress().getHostAddress(),
arbdaemon.apiPort,
config.apiPassword);
arbClient.registerDisputeAgent(MEDIATOR, DEV_PRIVILEGE_PRIV_KEY);
arbClient.registerDisputeAgent(REFUND_AGENT, DEV_PRIVILEGE_PRIV_KEY);
}
}
}
================================================
FILE: apitest/src/main/java/haveno/apitest/SetupTask.java
================================================
/*
* 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.apitest;
import haveno.apitest.linux.LinuxProcess;
import lombok.extern.slf4j.Slf4j;
import java.time.LocalDateTime;
import java.util.Objects;
import java.util.concurrent.Callable;
import java.util.concurrent.CountDownLatch;
import static java.lang.String.format;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
@Slf4j
public class SetupTask implements Callable<SetupTask.Status> {
private final LinuxProcess linuxProcess;
private final CountDownLatch countdownLatch;
public SetupTask(LinuxProcess linuxProcess, CountDownLatch countdownLatch) {
this.linuxProcess = linuxProcess;
this.countdownLatch = countdownLatch;
}
@Override
public Status call() throws Exception {
try {
linuxProcess.start(); // always runs in background
MILLISECONDS.sleep(1000); // give 1s for bg process to init
} catch (InterruptedException ex) {
throw new IllegalStateException(format("Error starting %s", linuxProcess.getName()), ex);
}
Objects.requireNonNull(countdownLatch).countDown();
return new Status(linuxProcess.getName(), LocalDateTime.now());
}
public LinuxProcess getLinuxProcess() {
return linuxProcess;
}
public static class Status {
private final String name;
private final LocalDateTime startTime;
public Status(String name, LocalDateTime startTime) {
super();
this.name = name;
this.startTime = startTime;
}
public String getName() {
return name;
}
public LocalDateTime getStartTime() {
return startTime;
}
@Override
public String toString() {
return "SetupTask.Status [name=" + name + ", completionTime=" + startTime + "]";
}
}
}
================================================
FILE: apitest/src/main/java/haveno/apitest/SmokeTestBashCommand.java
================================================
/*
* 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.apitest;
import haveno.apitest.linux.BashCommand;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
@Slf4j
class SmokeTestBashCommand {
public SmokeTestBashCommand() {
}
public void runSmokeTest() {
try {
BashCommand cmd = new BashCommand("ls -l").run();
log.info("$ {}\n{}", cmd.getCommand(), cmd.getOutput());
cmd = new BashCommand("free -g").run();
log.info("$ {}\n{}", cmd.getCommand(), cmd.getOutput());
cmd = new BashCommand("date").run();
log.info("$ {}\n{}", cmd.getCommand(), cmd.getOutput());
cmd = new BashCommand("netstat -a | grep localhost").run();
log.info("$ {}\n{}", cmd.getCommand(), cmd.getOutput());
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
================================================
FILE: apitest/src/main/java/haveno/apitest/SmokeTestBitcoind.java
================================================
/*
* 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.apitest;
import haveno.apitest.config.ApiTestConfig;
import haveno.apitest.linux.BitcoinCli;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
import static java.lang.String.format;
@Slf4j
class SmokeTestBitcoind {
private final ApiTestConfig config;
public SmokeTestBitcoind(ApiTestConfig config) {
this.config = config;
}
public void run() throws IOException, InterruptedException {
runBitcoinGetWalletInfo(); // smoke test bitcoin-cli
String newBitcoinAddress = getNewAddress();
generateToAddress(1, newBitcoinAddress);
}
public void runBitcoinGetWalletInfo() throws IOException, InterruptedException {
// This might be good for a sanity check to make sure the regtest data was installed.
log.info("Smoke test bitcoin-cli getwalletinfo");
BitcoinCli walletInfo = new BitcoinCli(config, "getwalletinfo").run();
log.info("{}\n{}", walletInfo.getCommandWithOptions(), walletInfo.getOutput());
log.info("balance str = {}", walletInfo.getOutputValueAsString("balance"));
log.info("balance dbl = {}", walletInfo.getOutputValueAsDouble("balance"));
log.info("keypoololdest long = {}", walletInfo.getOutputValueAsLong("keypoololdest"));
log.info("paytxfee dbl = {}", walletInfo.getOutputValueAsDouble("paytxfee"));
log.info("keypoolsize_hd_internal int = {}", walletInfo.getOutputValueAsInt("keypoolsize_hd_internal"));
log.info("private_keys_enabled bool = {}", walletInfo.getOutputValueAsBoolean("private_keys_enabled"));
log.info("hdseedid str = {}", walletInfo.getOutputValueAsString("hdseedid"));
}
public String getNewAddress() throws IOException, InterruptedException {
BitcoinCli newAddress = new BitcoinCli(config, "getnewaddress").run();
log.info("{}\n{}", newAddress.getCommandWithOptions(), newAddress.getOutput());
return newAddress.getOutput();
}
public void generateToAddress(int blocks, String address) throws IOException, InterruptedException {
String generateToAddressCmd = format("generatetoaddress %d \"%s\"", blocks, address);
BitcoinCli generateToAddress = new BitcoinCli(config, generateToAddressCmd).run();
// Return value is an array of TxIDs.
log.info("{}\n{}", generateToAddress.getCommandWithOptions(), generateToAddress.getOutputValueAsStringArray());
}
}
================================================
FILE: apitest/src/main/java/haveno/apitest/config/ApiTestConfig.java
================================================
/*
* 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.apitest.config;
import haveno.common.config.CompositeOptionSet;
import joptsimple.AbstractOptionSpec;
import joptsimple.ArgumentAcceptingOptionSpec;
import joptsimple.HelpFormatter;
import joptsimple.OptionException;
import joptsimple.OptionParser;
import joptsimple.OptionSet;
import joptsimple.OptionSpec;
import lombok.extern.slf4j.Slf4j;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UncheckedIOException;
import java.net.InetAddress;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.Properties;
import static java.lang.String.format;
import static java.lang.System.getProperty;
import static java.lang.System.getenv;
import static java.util.Arrays.asList;
import static java.util.Arrays.stream;
import static joptsimple.internal.Strings.EMPTY;
@Slf4j
public class ApiTestConfig {
// Global constants
public static final String BTC = "BTC";
public static final String EUR = "EUR";
public static final String USD = "USD";
public static final String XMR = "XMR";
public static final String ARBITRATOR = "arbitrator";
public static final String MEDIATOR = "mediator";
public static final String REFUND_AGENT = "refundagent";
// Option name constants
static final String HELP = "help";
static final String BASH_PATH = "bashPath";
static final String BERKELEYDB_LIB_PATH = "berkeleyDbLibPath";
static final String BITCOIN_PATH = "bitcoinPath";
static final String BITCOIN_RPC_PORT = "bitcoinRpcPort";
static final String BITCOIN_RPC_USER = "bitcoinRpcUser";
static final String BITCOIN_RPC_PASSWORD = "bitcoinRpcPassword";
static final String BITCOIN_REGTEST_HOST = "bitcoinRegtestHost";
static final String CONFIG_FILE = "configFile";
static final String ROOT_APP_DATA_DIR = "rootAppDataDir";
static final String API_PASSWORD = "apiPassword";
static final String RUN_SUBPROJECT_JARS = "runSubprojectJars";
static final String HAVENO_APP_INIT_TIME = "havenoAppInitTime";
static final String SKIP_TESTS = "skipTests";
static final String SHUTDOWN_AFTER_TESTS = "shutdownAfterTests";
static final String SUPPORTING_APPS = "supportingApps";
static final String CALL_RATE_METERING_CONFIG_PATH = "callRateMeteringConfigPath";
static final String ENABLE_HAVENO_DEBUGGING = "enableHavenoDebugging";
static final String REGISTER_DISPUTE_AGENTS = "registerDisputeAgents";
// Default values for certain options
static final String DEFAULT_CONFIG_FILE_NAME = "apitest.properties";
// Static fields that provide access to Config properties in locations where injecting
// a Config instance is not feasible.
public static String BASH_PATH_VALUE;
public final File defaultConfigFile;
// Options supported only at the command line, not within a config file.
public final boolean helpRequested;
public final File configFile;
// Options supported at the command line and a config file.
public final File rootAppDataDir;
public final String bashPath;
public final String berkeleyDbLibPath;
public final String bitcoinPath;
public final String bitcoinRegtestHost;
public final int bitcoinRpcPort;
public final String bitcoinRpcUser;
public final String bitcoinRpcPassword;
// Daemon instances can use same gRPC password, but each needs a different apiPort.
public final String apiPassword;
public final boolean runSubprojectJars;
public final long havenoAppInitTime;
public final boolean skipTests;
public final boolean shutdownAfterTests;
public final List<String> supportingApps;
public final String callRateMeteringConfigPath;
public final boolean enableHavenoDebugging;
public final boolean registerDisputeAgents;
// Immutable system configurations set in the constructor.
public final String bitcoinDatadir;
public final String userDir;
public final boolean isRunningTest;
public final String rootProjectDir;
public final String baseBuildResourcesDir;
public final String baseSrcResourcesDir;
// The parser that will be used to parse both cmd line and config file options
private final OptionParser parser = new OptionParser();
public ApiTestConfig(String... args) {
this.userDir = getProperty("user.dir");
// If running a @Test, the current working directory is the :apitest subproject
// folder. If running ApiTestMain, the current working directory is the
// haveno root project folder.
this.isRunningTest = Paths.get(userDir).getFileName().toString().equals("apitest");
this.rootProjectDir = isRunningTest
? Paths.get(userDir).getParent().toFile().getAbsolutePath()
: Paths.get(userDir).toFile().getAbsolutePath();
this.baseBuildResourcesDir = Paths.get(rootProjectDir, "apitest", "build", "resources", "main")
.toFile().getAbsolutePath();
this.baseSrcResourcesDir = Paths.get(rootProjectDir, "apitest", "src", "main", "resources")
.toFile().getAbsolutePath();
this.defaultConfigFile = absoluteConfigFile(baseBuildResourcesDir, DEFAULT_CONFIG_FILE_NAME);
this.bitcoinDatadir = Paths.get(baseBuildResourcesDir, "Bitcoin-regtest").toFile().getAbsolutePath();
AbstractOptionSpec<Void> helpOpt =
parser.accepts(HELP, "Print this help text")
.forHelp();
ArgumentAcceptingOptionSpec<String> configFileOpt =
parser.accepts(CONFIG_FILE, format("Specify configuration file. " +
"Relative paths will be prefixed by %s location.", userDir))
.withRequiredArg()
.ofType(String.class)
.defaultsTo(DEFAULT_CONFIG_FILE_NAME);
ArgumentAcceptingOptionSpec<File> appDataDirOpt =
parser.accepts(ROOT_APP_DATA_DIR, "Application data directory")
.withRequiredArg()
.ofType(File.class)
.defaultsTo(new File(baseBuildResourcesDir));
ArgumentAcceptingOptionSpec<String> bashPathOpt =
parser.accepts(BASH_PATH, "Bash path")
.withRequiredArg()
.ofType(String.class)
.defaultsTo(
(getenv("SHELL") == null || !getenv("SHELL").contains("bash"))
? "/bin/bash"
: getenv("SHELL"));
ArgumentAcceptingOptionSpec<String> berkeleyDbLibPathOpt =
parser.accepts(BERKELEYDB_LIB_PATH, "Berkeley DB lib path")
.withRequiredArg()
.ofType(String.class).defaultsTo(EMPTY);
ArgumentAcceptingOptionSpec<String> bitcoinPathOpt =
parser.accepts(BITCOIN_PATH, "Bitcoin path")
.withRequiredArg()
.ofType(String.class).defaultsTo("/usr/local/bin");
ArgumentAcceptingOptionSpec<String> bitcoinRegtestHostOpt =
parser.accepts(BITCOIN_REGTEST_HOST, "Bitcoin Core regtest host")
.withRequiredArg()
.ofType(String.class).defaultsTo(InetAddress.getLoopbackAddress().getHostAddress());
ArgumentAcceptingOptionSpec<Integer> bitcoinRpcPortOpt =
parser.accepts(BITCOIN_RPC_PORT, "Bitcoin Core rpc port (non-default)")
.withRequiredArg()
.ofType(Integer.class).defaultsTo(19443);
ArgumentAcceptingOptionSpec<String> bitcoinRpcUserOpt =
parser.accepts(BITCOIN_RPC_USER, "Bitcoin rpc user")
.withRequiredArg()
.ofType(String.class).defaultsTo("apitest");
ArgumentAcceptingOptionSpec<String> bitcoinRpcPasswordOpt =
parser.accepts(BITCOIN_RPC_PASSWORD, "Bitcoin rpc password")
.withRequiredArg()
.ofType(String.class).defaultsTo("apitest");
ArgumentAcceptingOptionSpec<String> apiPasswordOpt =
parser.accepts(API_PASSWORD, "gRPC API password")
.withRequiredArg()
.defaultsTo("xyz");
ArgumentAcceptingOptionSpec<Boolean> runSubprojectJarsOpt =
parser.accepts(RUN_SUBPROJECT_JARS,
"Run subproject build jars instead of full build jars")
.withRequiredArg()
.ofType(Boolean.class)
.defaultsTo(false);
ArgumentAcceptingOptionSpec<Long> havenoAppInitTimeOpt =
parser.accepts(HAVENO_APP_INIT_TIME,
"Amount of time (ms) to wait on a Haveno instance's initialization")
.withRequiredArg()
.ofType(Long.class)
.defaultsTo(5000L);
ArgumentAcceptingOptionSpec<Boolean> skipTestsOpt =
parser.accepts(SKIP_TESTS,
"Start apps, but skip tests")
.withRequiredArg()
.ofType(Boolean.class)
.defaultsTo(false);
ArgumentAcceptingOptionSpec<Boolean> shutdownAfterTestsOpt =
parser.accepts(SHUTDOWN_AFTER_TESTS,
"Terminate all processes after tests")
.withRequiredArg()
.ofType(Boolean.class)
.defaultsTo(true);
ArgumentAcceptingOptionSpec<String> supportingAppsOpt =
parser.accepts(SUPPORTING_APPS,
"Comma delimited list of supporting apps (bitcoind,seednode,arbdaemon,...")
.withRequiredArg()
.ofType(String.class)
.defaultsTo("bitcoind,seednode,arbdaemon,alicedaemon,bobdaemon");
ArgumentAcceptingOptionSpec<String> callRateMeteringConfigPathOpt =
parser.accepts(CALL_RATE_METERING_CONFIG_PATH,
"Install a ratemeters.json file to configure call rate metering interceptors")
.withRequiredArg()
.defaultsTo(EMPTY);
ArgumentAcceptingOptionSpec<Boolean> enableHavenoDebuggingOpt =
parser.accepts(ENABLE_HAVENO_DEBUGGING,
"Start Haveno apps with remote debug options")
.withRequiredArg()
.ofType(Boolean.class)
.defaultsTo(false);
ArgumentAcceptingOptionSpec<Boolean> registerDisputeAgentsOpt =
parser.accepts(REGISTER_DISPUTE_AGENTS,
"Register dispute agents in arbitration daemon")
.withRequiredArg()
.ofType(Boolean.class)
.defaultsTo(true);
try {
CompositeOptionSet options = new CompositeOptionSet();
// Parse command line options
OptionSet cliOpts = parser.parse(args);
options.addOptionSet(cliOpts);
// Parse config file specified at the command line only if it was specified as
// an absolute path. Otherwise, the config file will be processed later below.
File configFile = null;
OptionSpec<?>[] disallowedOpts = new OptionSpec<?>[]{helpOpt, configFileOpt};
final boolean cliHasConfigFileOpt = cliOpts.has(configFileOpt);
boolean configFileHasBeenProcessed = false;
if (cliHasConfigFileOpt) {
configFile = new File(cliOpts.valueOf(configFileOpt));
if (configFile.isAbsolute()) {
Optional<OptionSet> configFileOpts = parseOptionsFrom(configFile, disallowedOpts);
if (configFileOpts.isPresent()) {
options.addOptionSet(configFileOpts.get());
configFileHasBeenProcessed = true;
}
}
}
// If the config file has not yet been processed, either because a relative
// path was provided at the command line, or because no value was provided at
// the command line, attempt to process the file now, falling back to the
// default config file location if none was specified at the command line.
if (!configFileHasBeenProcessed) {
configFile = cliHasConfigFileOpt && !configFile.isAbsolute() ?
absoluteConfigFile(userDir, configFile.getPath()) :
defaultConfigFile;
Optional<OptionSet> configFileOpts = parseOptionsFrom(configFile, disallowedOpts);
configFileOpts.ifPresent(options::addOptionSet);
}
// Assign all remaining properties, with command line options taking
// precedence over those provided in the config file (if any)
this.helpRequested = options.has(helpOpt);
this.configFile = configFile;
this.rootAppDataDir = options.valueOf(appDataDirOpt);
bashPath = options.valueOf(bashPathOpt);
this.berkeleyDbLibPath = options.valueOf(berkeleyDbLibPathOpt);
this.bitcoinPath = options.valueOf(bitcoinPathOpt);
this.bitcoinRegtestHost = options.valueOf(bitcoinRegtestHostOpt);
this.bitcoinRpcPort = options.valueOf(bitcoinRpcPortOpt);
this.bitcoinRpcUser = options.valueOf(bitcoinRpcUserOpt);
this.bitcoinRpcPassword = options.valueOf(bitcoinRpcPasswordOpt);
this.apiPassword = options.valueOf(apiPasswordOpt);
this.runSubprojectJars = options.valueOf(runSubprojectJarsOpt);
this.havenoAppInitTime = options.valueOf(havenoAppInitTimeOpt);
this.skipTests = options.valueOf(skipTestsOpt);
this.shutdownAfterTests = options.valueOf(shutdownAfterTestsOpt);
this.supportingApps = asList(options.valueOf(supportingAppsOpt).split(","));
this.callRateMeteringConfigPath = options.valueOf(callRateMeteringConfigPathOpt);
this.enableHavenoDebugging = options.valueOf(enableHavenoDebuggingOpt);
this.registerDisputeAgents = options.valueOf(registerDisputeAgentsOpt);
// Assign values to special-case static fields.
BASH_PATH_VALUE = bashPath;
} catch (OptionException ex) {
throw new IllegalStateException(format("Problem parsing option '%s': %s",
ex.options().get(0),
ex.getCause() != null ?
ex.getCause().getMessage() :
ex.getMessage()));
}
}
public boolean hasSupportingApp(String... supportingApp) {
return stream(supportingApp).anyMatch(this.supportingApps::contains);
}
public void printHelp(OutputStream sink, HelpFormatter formatter) {
try {
parser.formatHelpWith(formatter);
parser.printHelpOn(sink);
} catch (IOException ex) {
throw new UncheckedIOException(ex);
}
}
private Optional<OptionSet> parseOptionsFrom(File configFile, OptionSpec<?>[] disallowedOpts) {
if (!configFile.exists() && !configFile.equals(absoluteConfigFile(userDir, DEFAULT_CONFIG_FILE_NAME)))
throw new IllegalStateException(format("The specified config file '%s' does not exist.", configFile));
Properties properties = getProperties(configFile);
List<String> optionLines = new ArrayList<>();
properties.forEach((k, v) -> {
optionLines.add("--" + k + "=" + v); // dashes expected by jopt parser below
});
OptionSet configFileOpts = parser.parse(optionLines.toArray(new String[0]));
for (OptionSpec<?> disallowedOpt : disallowedOpts)
if (configFileOpts.has(disallowedOpt))
throw new IllegalStateException(
format("The '%s' option is disallowed in config files",
disallowedOpt.options().get(0)));
return Optional.of(configFileOpts);
}
private Properties getProperties(File configFile) {
try {
Properties properties = new Properties();
properties.load(new FileInputStream(configFile.getAbsolutePath()));
return properties;
} catch (IOException ex) {
throw new IllegalStateException(
format("Could not load properties from config file %s",
configFile.getAbsolutePath()), ex);
}
}
private static File absoluteConfigFile(String parentDir, String relativeConfigFilePath) {
return new File(parentDir, relativeConfigFilePath);
}
}
================================================
FILE: apitest/src/main/java/haveno/apitest/config/ApiTestRateMeterInterceptorConfig.java
================================================
package haveno.apitest.config;
import haveno.daemon.grpc.GrpcVersionService;
import haveno.daemon.grpc.interceptor.GrpcServiceRateMeteringConfig;
import java.io.File;
import static haveno.apitest.config.ApiTestConfig.CALL_RATE_METERING_CONFIG_PATH;
import static haveno.proto.grpc.DisputeAgentsGrpc.getRegisterDisputeAgentMethod;
import static haveno.proto.grpc.GetVersionGrpc.getGetVersionMethod;
import static java.lang.System.arraycopy;
import static java.util.Arrays.stream;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static java.util.concurrent.TimeUnit.SECONDS;
public class ApiTestRateMeterInterceptorConfig {
public static File getTestRateMeterInterceptorConfig() {
GrpcServiceRateMeteringConfig.Builder builder = new GrpcServiceRateMeteringConfig.Builder();
builder.addCallRateMeter(GrpcVersionService.class.getSimpleName(),
getGetVersionMethod().getFullMethodName(),
1,
SECONDS);
// Only GrpcVersionService is @VisibleForTesting, so we need to
// hardcode other grpcServiceClassName parameter values used in
// builder.addCallRateMeter(...).
builder.addCallRateMeter("GrpcDisputeAgentsService",
getRegisterDisputeAgentMethod().getFullMethodName(),
10, // Same as default.
SECONDS);
// Define rate meters for non-existent method 'disabled', to override other grpc
// services' default rate meters -- defined in their rateMeteringInterceptor()
// methods.
String[] serviceClassNames = new String[]{
"GrpcGetTradeStatisticsService",
"GrpcHelpService",
"GrpcOffersService",
"GrpcPaymentAccountsService",
"GrpcPriceService",
"GrpcTradesService",
"GrpcWalletsService"
};
for (String service : serviceClassNames) {
builder.addCallRateMeter(service, "disabled", 1, MILLISECONDS);
}
File file = builder.build();
file.deleteOnExit();
return file;
}
public static boolean hasCallRateMeteringConfigPathOpt(String[] args) {
return stream(args).anyMatch(a -> a.contains("--" + CALL_RATE_METERING_CONFIG_PATH));
}
public static String[] appendCallRateMeteringConfigPathOpt(String[] args, File rateMeterInterceptorConfig) {
String[] rateMeteringConfigPathOpt = new String[]{
"--" + CALL_RATE_METERING_CONFIG_PATH + "=" + rateMeterInterceptorConfig.getAbsolutePath()
};
if (args.length == 0) {
return rateMeteringConfigPathOpt;
} else {
String[] appendedOpts = new String[args.length + 1];
arraycopy(args, 0, appendedOpts, 0, args.length);
arraycopy(rateMeteringConfigPathOpt, 0, appendedOpts, args.length, rateMeteringConfigPathOpt.length);
return appendedOpts;
}
}
}
================================================
FILE: apitest/src/main/java/haveno/apitest/config/HavenoAppConfig.java
================================================
/*
* 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.apitest.config;
import haveno.daemon.app.HavenoDaemonMain;
import haveno.desktop.app.HavenoAppMain;
import haveno.seednode.SeedNodeMain;
/**
Some non user configurable Haveno seednode, arb node, bob and alice daemon option values.
@see <a href="https://github.com/bisq-network/bisq/blob/master/docs/dev-setup.md">dev-setup.md</a>
*/
public enum HavenoAppConfig {
seednode("haveno-XMR_STAGENET_Seed_2002",
"haveno-seednode",
"-XX:MaxRAM=2g -Dlogback.configurationFile=apitest/build/resources/main/logback.xml",
SeedNodeMain.class.getName(),
2002,
5120,
-1,
49996),
arbdaemon("haveno-XMR_STAGENET_Arb",
"haveno-daemon",
"-XX:MaxRAM=2g -Dlogback.configurationFile=apitest/build/resources/main/logback.xml",
HavenoDaemonMain.class.getName(),
4444,
5121,
9997,
49997),
arbdesktop("haveno-XMR_STAGENET_Arb",
"haveno-desktop",
"-XX:MaxRAM=3g -Dlogback.configurationFile=apitest/build/resources/main/logback.xml",
HavenoAppMain.class.getName(),
4444,
5121,
-1,
49997),
alicedaemon("haveno-XMR_STAGENET_Alice",
"haveno-daemon",
"-XX:MaxRAM=2g -Dlogback.configurationFile=apitest/build/resources/main/logback.xml",
HavenoDaemonMain.class.getName(),
7777,
5122,
9998,
49998),
alicedesktop("haveno-XMR_STAGENET_Alice",
"haveno-desktop",
"-XX:MaxRAM=4g -Dlogback.configurationFile=apitest/build/resources/main/logback.xml",
HavenoAppMain.class.getName(),
7777,
5122,
-1,
49998),
bobdaemon("haveno-XMR_STAGENET_Bob",
"haveno-daemon",
"-XX:MaxRAM=2g -Dlogback.configurationFile=apitest/build/resources/main/logback.xml",
HavenoDaemonMain.class.getName(),
8888,
5123,
9999,
49999),
bobdesktop("haveno-XMR_STAGENET_Bob",
"haveno-desktop",
"-XX:MaxRAM=4g -Dlogback.configurationFile=apitest/build/resources/main/logback.xml",
HavenoAppMain.class.getName(),
8888,
5123,
-1,
49999);
public final String appName;
public final String startupScript;
public final String javaOpts;
public final String mainClassName;
public final int nodePort;
public final int rpcBlockNotificationPort;
// Daemons can use a global gRPC password, but each needs a unique apiPort.
public final int apiPort;
public final int remoteDebugPort;
HavenoAppConfig(String appName,
String startupScript,
String javaOpts,
String mainClassName,
int nodePort,
int rpcBlockNotificationPort,
int apiPort,
int remoteDebugPort) {
this.appName = appName;
this.startupScript = startupScript;
this.javaOpts = javaOpts;
this.mainClassName = mainClassName;
this.nodePort = nodePort;
this.rpcBlockNotificationPort = rpcBlockNotificationPort;
this.apiPort = apiPort;
this.remoteDebugPort = remoteDebugPort;
}
@Override
public String toString() {
return "HavenoAppConfig{" + "\n" +
" appName='" + appName + '\'' + "\n" +
", startupScript='" + startupScript + '\'' + "\n" +
", javaOpts='" + javaOpts + '\'' + "\n" +
", mainClassName='" + mainClassName + '\'' + "\n" +
", nodePort=" + nodePort + "\n" +
", rpcBlockNotificationPort=" + rpcBlockNotificationPort + "\n" +
", apiPort=" + apiPort + "\n" +
", remoteDebugPort=" + remoteDebugPort + "\n" +
'}';
}
}
================================================
FILE: apitest/src/main/java/haveno/apitest/linux/AbstractLinuxProcess.java
================================================
/*
* 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.apitest.linux;
import haveno.apitest.config.ApiTestConfig;
import lombok.extern.slf4j.Slf4j;
import java.io.File;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import static haveno.apitest.linux.BashCommand.isAlive;
import static java.lang.String.format;
import static joptsimple.internal.Strings.EMPTY;
@Slf4j
abstract class AbstractLinuxProcess implements LinuxProcess {
protected final String name;
protected final ApiTestConfig config;
protected long pid;
protected final List<Throwable> startupExceptions;
protected final List<Throwable> shutdownExceptions;
public AbstractLinuxProcess(String name, ApiTestConfig config) {
this.name = name;
this.config = config;
this.startupExceptions = new ArrayList<>();
this.shutdownExceptions = new ArrayList<>();
}
@Override
public String getName() {
return this.name;
}
@Override
public boolean hasStartupExceptions() {
return !startupExceptions.isEmpty();
}
@Override
public boolean hasShutdownExceptions() {
return !shutdownExceptions.isEmpty();
}
@Override
public void logExceptions(List<Throwable> exceptions, org.slf4j.Logger log) {
for (Throwable t : exceptions) {
log.error("", t);
}
}
@Override
public List<Throwable> getStartupExceptions() {
return startupExceptions;
}
@Override
public List<Throwable> getShutdownExceptions() {
return shutdownExceptions;
}
@SuppressWarnings("unused")
public void verifyBitcoinPathsExist() {
verifyBitcoinPathsExist(false);
}
public void verifyBitcoinPathsExist(boolean verbose) {
if (verbose)
log.info(format("Checking bitcoind env...%n"
+ "\t%-20s%s%n\t%-20s%s%n\t%-20s%s%n\t%-20s%s",
"berkeleyDbLibPath", config.berkeleyDbLibPath,
"bitcoinPath", config.bitcoinPath,
"bitcoinDatadir", config.bitcoinDatadir,
"blocknotify", config.bitcoinDatadir + "/blocknotify"));
if (!config.berkeleyDbLibPath.equals(EMPTY)) {
File berkeleyDbLibPath = new File(config.berkeleyDbLibPath);
if (!berkeleyDbLibPath.exists() || !berkeleyDbLibPath.canExecute())
throw new IllegalStateException(berkeleyDbLibPath + " cannot be found or executed");
}
File bitcoindExecutable = Paths.get(config.bitcoinPath, "bitcoind").toFile();
if (!bitcoindExecutable.exists() || !bitcoindExecutable.canExecute())
throw new IllegalStateException(format("'%s' cannot be found or executed.%n"
+ "A bitcoin-core v0.19 - v22 installation is required," +
" and the 'bitcoinPath' must be configured in 'apitest.properties'",
bitcoindExecutable.getAbsolutePath()));
File bitcoindDatadir = new File(config.bitcoinDatadir);
if (!bitcoindDatadir.exists() || !bitcoindDatadir.canWrite())
throw new IllegalStateException(bitcoindDatadir + " cannot be found or written to");
File blocknotify = new File(bitcoindDatadir, "blocknotify");
if (!blocknotify.exists() || !blocknotify.canExecute())
throw new IllegalStateException(blocknotify.getAbsolutePath() + " cannot be found or executed");
}
public void verifyBitcoindRunning() throws IOException, InterruptedException {
long bitcoindPid = BashCommand.getPid("bitcoind");
if (bitcoindPid < 0 || !isAlive(bitcoindPid))
throw new IllegalStateException("Bitcoind not running");
}
}
================================================
FILE: apitest/src/main/java/haveno/apitest/linux/BashCommand.java
================================================
/*
* 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.apitest.linux;
import lombok.extern.slf4j.Slf4j;
import javax.annotation.Nullable;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import static haveno.apitest.config.ApiTestConfig.BASH_PATH_VALUE;
import static java.lang.management.ManagementFactory.getRuntimeMXBean;
@Slf4j
public class BashCommand {
private int exitStatus = -1;
@Nullable
private String output;
@Nullable
private String error;
private final String command;
private final int numResponseLines;
public BashCommand(String command) {
this(command, 0);
}
public BashCommand(String command, int numResponseLines) {
this.command = command;
this.numResponseLines = numResponseLines; // only want the top N lines of output
}
public BashCommand run() throws IOException, InterruptedException {
SystemCommandExecutor commandExecutor = new SystemCommandExecutor(tokenizeSystemCommand());
exitStatus = commandExecutor.exec();
processOutput(commandExecutor);
return this;
}
public BashCommand runInBackground() throws IOException, InterruptedException {
SystemCommandExecutor commandExecutor = new SystemCommandExecutor(tokenizeSystemCommand());
exitStatus = commandExecutor.exec(false);
processOutput(commandExecutor);
return this;
}
private void processOutput(SystemCommandExecutor commandExecutor) {
// Get the error status and stderr from system command.
StringBuilder stderr = commandExecutor.getStandardErrorFromCommand();
if (stderr.length() > 0)
error = stderr.toString();
if (exitStatus != 0)
return;
// Format and cache the stdout from system command.
StringBuilder stdout = commandExecutor.getStandardOutputFromCommand();
String[] rawLines = stdout.toString().split("\n");
StringBuilder truncatedLines = new StringBuilder();
int limit = numResponseLines > 0 ? Math.min(numResponseLines, rawLines.length) : rawLines.length;
for (int i = 0; i < limit; i++) {
String line = rawLines[i].length() >= 220 ? rawLines[i].substring(0, 220) + " ..." : rawLines[i];
truncatedLines.append(line).append((i < limit - 1) ? "\n" : "");
}
output = truncatedLines.toString();
}
public String getCommand() {
return this.command;
}
public int getExitStatus() {
return this.exitStatus;
}
// TODO return Optional<String>
@Nullable
public String getOutput() {
return this.output;
}
// TODO return Optional<String>
public String getError() {
return this.error;
}
private List<String> tokenizeSystemCommand() {
return new ArrayList<>() {{
add(BASH_PATH_VALUE);
add("-c");
add(command);
}};
}
@SuppressWarnings("unused")
// Convenience method for getting system load info.
public static String printSystemLoadString(Exception tracingException) throws IOException, InterruptedException {
StackTraceElement[] stackTraceElement = tracingException.getStackTrace();
StringBuilder stackTraceBuilder = new StringBuilder(tracingException.getMessage()).append("\n");
int traceLimit = Math.min(stackTraceElement.length, 4);
for (int i = 0; i < traceLimit; i++) {
stackTraceBuilder.append(stackTraceElement[i]).append("\n");
}
stackTraceBuilder.append("...");
log.info(stackTraceBuilder.toString());
BashCommand cmd = new BashCommand("ps -aux --sort -rss --headers", 2).run();
return cmd.getOutput() + "\n"
+ "System load: Memory (MB): " + getUsedMemoryInMB() + " / No. of threads: " + Thread.activeCount()
+ " JVM uptime (ms): " + getRuntimeMXBean().getUptime();
}
public static long getUsedMemoryInMB() {
Runtime runtime = Runtime.getRuntime();
long free = runtime.freeMemory() / 1024 / 1024;
long total = runtime.totalMemory() / 1024 / 1024;
return total - free;
}
public static long getPid(String processName) throws IOException, InterruptedException {
String psCmd = "ps aux | pgrep " + processName + " | grep -v grep";
String psCmdOutput = new BashCommand(psCmd).run().getOutput();
if (psCmdOutput == null || psCmdOutput.isEmpty())
return -1;
return Long.parseLong(psCmdOutput);
}
@SuppressWarnings("unused")
public static BashCommand grep(String processName) throws IOException, InterruptedException {
String c = "ps -aux | grep " + processName + " | grep -v grep";
return new BashCommand(c).run();
}
public static boolean isAlive(long pid) throws IOException, InterruptedException {
String isAliveScript = "if ps -p " + pid + " > /dev/null; then echo true; else echo false; fi";
return new BashCommand(isAliveScript).run().getOutput().equals("true");
}
}
================================================
FILE: apitest/src/main/java/haveno/apitest/linux/BitcoinCli.java
================================================
/*
* 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.apitest.linux;
import haveno.apitest.config.
gitextract_ersdwbkw/
├── .editorconfig
├── .gitattributes
├── .github/
│ ├── CODEOWNERS
│ └── workflows/
│ ├── build.yml
│ ├── codacy-code-reporter.yml
│ ├── codeql-analysis.yml
│ └── label.yml
├── .gitignore
├── LICENSE
├── Makefile
├── README.md
├── apitest/
│ ├── scripts/
│ │ ├── editf2faccountform.py
│ │ ├── get-haveno-pid.sh
│ │ ├── limit-order-simulation.sh
│ │ ├── mainnet-test.sh
│ │ ├── rolling-offer-simulation.sh
│ │ ├── trade-simulation-env.sh
│ │ ├── trade-simulation-utils.sh
│ │ ├── trade-simulation.sh
│ │ ├── trade-xmr-simulation.sh
│ │ └── version-parser.bash
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── haveno/
│ │ │ └── apitest/
│ │ │ ├── ApiTestMain.java
│ │ │ ├── Scaffold.java
│ │ │ ├── SetupTask.java
│ │ │ ├── SmokeTestBashCommand.java
│ │ │ ├── SmokeTestBitcoind.java
│ │ │ ├── config/
│ │ │ │ ├── ApiTestConfig.java
│ │ │ │ ├── ApiTestRateMeterInterceptorConfig.java
│ │ │ │ └── HavenoAppConfig.java
│ │ │ └── linux/
│ │ │ ├── AbstractLinuxProcess.java
│ │ │ ├── BashCommand.java
│ │ │ ├── BitcoinCli.java
│ │ │ ├── BitcoinDaemon.java
│ │ │ ├── HavenoProcess.java
│ │ │ ├── LinuxProcess.java
│ │ │ ├── SystemCommandExecutor.java
│ │ │ └── ThreadedStreamHandler.java
│ │ └── resources/
│ │ ├── apitest.properties
│ │ ├── blocknotify
│ │ ├── haveno.properties
│ │ └── logback.xml
│ └── test/
│ ├── java/
│ │ └── haveno/
│ │ └── apitest/
│ │ ├── ApiTestCase.java
│ │ ├── method/
│ │ │ ├── BitcoinCliHelper.java
│ │ │ ├── CallRateMeteringInterceptorTest.java
│ │ │ ├── GetMethodHelpTest.java
│ │ │ ├── GetVersionTest.java
│ │ │ ├── MethodTest.java
│ │ │ ├── RegisterDisputeAgentsTest.java
│ │ │ ├── offer/
│ │ │ │ ├── AbstractOfferTest.java
│ │ │ │ ├── CancelOfferTest.java
│ │ │ │ ├── CreateOfferUsingFixedPriceTest.java
│ │ │ │ ├── CreateOfferUsingMarketPriceMarginTest.java
│ │ │ │ ├── CreateXMROffersTest.java
│ │ │ │ └── ValidateCreateOfferTest.java
│ │ │ ├── payment/
│ │ │ │ ├── AbstractPaymentAccountTest.java
│ │ │ │ ├── CreatePaymentAccountTest.java
│ │ │ │ └── GetPaymentMethodsTest.java
│ │ │ ├── trade/
│ │ │ │ ├── AbstractTradeTest.java
│ │ │ │ ├── ExpectedProtocolStatus.java
│ │ │ │ ├── TakeBuyBTCOfferTest.java
│ │ │ │ ├── TakeBuyBTCOfferWithNationalBankAcctTest.java
│ │ │ │ ├── TakeBuyXMROfferTest.java
│ │ │ │ ├── TakeSellBTCOfferTest.java
│ │ │ │ └── TakeSellXMROfferTest.java
│ │ │ └── wallet/
│ │ │ ├── BtcWalletTest.java
│ │ │ ├── WalletProtectionTest.java
│ │ │ └── WalletTestUtil.java
│ │ └── scenario/
│ │ ├── LongRunningOfferDeactivationTest.java
│ │ ├── LongRunningTradesTest.java
│ │ ├── OfferTest.java
│ │ ├── PaymentAccountTest.java
│ │ ├── ScriptedBotTest.java
│ │ ├── StartupTest.java
│ │ ├── TradeTest.java
│ │ ├── WalletTest.java
│ │ └── bot/
│ │ ├── AbstractBotTest.java
│ │ ├── Bot.java
│ │ ├── BotClient.java
│ │ ├── BotPaymentAccountGenerator.java
│ │ ├── InvalidRandomOfferException.java
│ │ ├── PaymentAccountNotFoundException.java
│ │ ├── RandomOffer.java
│ │ ├── RobotBob.java
│ │ ├── protocol/
│ │ │ ├── BotProtocol.java
│ │ │ ├── MakerBotProtocol.java
│ │ │ ├── ProtocolStep.java
│ │ │ └── TakerBotProtocol.java
│ │ ├── script/
│ │ │ ├── BashScriptGenerator.java
│ │ │ ├── BotScript.java
│ │ │ └── BotScriptGenerator.java
│ │ └── shutdown/
│ │ ├── ManualBotShutdownException.java
│ │ └── ManualShutdown.java
│ └── resources/
│ └── logback.xml
├── assets/
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── haveno/
│ │ │ └── asset/
│ │ │ ├── AbstractAsset.java
│ │ │ ├── AddressValidationResult.java
│ │ │ ├── AddressValidator.java
│ │ │ ├── Asset.java
│ │ │ ├── AssetRegistry.java
│ │ │ ├── Base58AddressValidator.java
│ │ │ ├── BitcoinAddressValidator.java
│ │ │ ├── BitcoinCashAddressValidator.java
│ │ │ ├── CardanoAddressValidator.java
│ │ │ ├── Coin.java
│ │ │ ├── CryptoAccountDisclaimer.java
│ │ │ ├── CryptoNoteAddressValidator.java
│ │ │ ├── CryptoNoteUtils.java
│ │ │ ├── Erc20Token.java
│ │ │ ├── EtherAddressValidator.java
│ │ │ ├── GrinAddressValidator.java
│ │ │ ├── I18n.java
│ │ │ ├── LiquidBitcoinAddressValidator.java
│ │ │ ├── NetworkParametersAdapter.java
│ │ │ ├── PrintTool.java
│ │ │ ├── RegexAddressValidator.java
│ │ │ ├── RippleAddressValidator.java
│ │ │ ├── SolanaAddressValidator.java
│ │ │ ├── Token.java
│ │ │ ├── Trc20Token.java
│ │ │ ├── TronAddressValidator.java
│ │ │ ├── coins/
│ │ │ │ ├── Bitcoin.java
│ │ │ │ ├── BitcoinCash.java
│ │ │ │ ├── Cardano.java
│ │ │ │ ├── Dogecoin.java
│ │ │ │ ├── Ether.java
│ │ │ │ ├── Litecoin.java
│ │ │ │ ├── Monero.java
│ │ │ │ ├── Ripple.java
│ │ │ │ ├── Solana.java
│ │ │ │ └── Tron.java
│ │ │ ├── package-info.java
│ │ │ └── tokens/
│ │ │ ├── AugmintEuro.java
│ │ │ ├── DaiStablecoinERC20.java
│ │ │ ├── EtherStone.java
│ │ │ ├── TetherUSDERC20.java
│ │ │ ├── TetherUSDTRC20.java
│ │ │ ├── TrueUSD.java
│ │ │ ├── USDCoinERC20.java
│ │ │ └── VectorspaceAI.java
│ │ └── resources/
│ │ ├── META-INF/
│ │ │ └── services/
│ │ │ └── haveno.asset.Asset
│ │ └── i18n/
│ │ └── displayStrings-assets.properties
│ └── test/
│ └── java/
│ └── haveno/
│ └── asset/
│ ├── AbstractAssetTest.java
│ └── coins/
│ ├── BitcoinCashTest.java
│ ├── BitcoinTest.java
│ ├── CardanoTest.java
│ ├── DogecoinTest.java
│ ├── LitecoinTest.java
│ ├── MoneroTest.java
│ ├── RippleTest.java
│ ├── SolanaTest.java
│ ├── TetherUSDERC20Test.java
│ ├── TetherUSDTRC20Test.java
│ └── TronTest.java
├── build.gradle
├── cli/
│ ├── package/
│ │ └── create-cli-dist.sh
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── haveno/
│ │ │ └── cli/
│ │ │ ├── CliMain.java
│ │ │ ├── ColumnHeaderConstants.java
│ │ │ ├── CryptoCurrencyUtil.java
│ │ │ ├── CurrencyFormat.java
│ │ │ ├── DirectionFormat.java
│ │ │ ├── GrpcClient.java
│ │ │ ├── GrpcStubs.java
│ │ │ ├── Method.java
│ │ │ ├── PasswordCallCredentials.java
│ │ │ ├── TransactionFormat.java
│ │ │ ├── opts/
│ │ │ │ ├── AbstractMethodOptionParser.java
│ │ │ │ ├── ArgumentList.java
│ │ │ │ ├── CancelOfferOptionParser.java
│ │ │ │ ├── CreateCryptoCurrencyPaymentAcctOptionParser.java
│ │ │ │ ├── CreateOfferOptionParser.java
│ │ │ │ ├── CreatePaymentAcctOptionParser.java
│ │ │ │ ├── GetAddressBalanceOptionParser.java
│ │ │ │ ├── GetBTCMarketPriceOptionParser.java
│ │ │ │ ├── GetBalanceOptionParser.java
│ │ │ │ ├── GetOfferOptionParser.java
│ │ │ │ ├── GetOffersOptionParser.java
│ │ │ │ ├── GetPaymentAcctFormOptionParser.java
│ │ │ │ ├── GetTradeOptionParser.java
│ │ │ │ ├── GetTradesOptionParser.java
│ │ │ │ ├── GetTransactionOptionParser.java
│ │ │ │ ├── MethodOpts.java
│ │ │ │ ├── OfferIdOptionParser.java
│ │ │ │ ├── OptLabel.java
│ │ │ │ ├── RegisterDisputeAgentOptionParser.java
│ │ │ │ ├── RemoveWalletPasswordOptionParser.java
│ │ │ │ ├── SendBtcOptionParser.java
│ │ │ │ ├── SetTxFeeRateOptionParser.java
│ │ │ │ ├── SetWalletPasswordOptionParser.java
│ │ │ │ ├── SimpleMethodOptionParser.java
│ │ │ │ ├── TakeOfferOptionParser.java
│ │ │ │ ├── UnlockWalletOptionParser.java
│ │ │ │ └── WithdrawFundsOptionParser.java
│ │ │ ├── request/
│ │ │ │ ├── OffersServiceRequest.java
│ │ │ │ ├── PaymentAccountsServiceRequest.java
│ │ │ │ ├── TradesServiceRequest.java
│ │ │ │ └── WalletsServiceRequest.java
│ │ │ └── table/
│ │ │ ├── Table.java
│ │ │ ├── builder/
│ │ │ │ ├── AbstractTableBuilder.java
│ │ │ │ ├── AbstractTradeListBuilder.java
│ │ │ │ ├── AddressBalanceTableBuilder.java
│ │ │ │ ├── BtcBalanceTableBuilder.java
│ │ │ │ ├── ClosedTradeTableBuilder.java
│ │ │ │ ├── FailedTradeTableBuilder.java
│ │ │ │ ├── OfferTableBuilder.java
│ │ │ │ ├── OpenTradeTableBuilder.java
│ │ │ │ ├── PaymentAccountTableBuilder.java
│ │ │ │ ├── TableBuilder.java
│ │ │ │ ├── TableBuilderConstants.java
│ │ │ │ ├── TableType.java
│ │ │ │ ├── TradeDetailTableBuilder.java
│ │ │ │ ├── TradeTableColumnSupplier.java
│ │ │ │ └── TransactionTableBuilder.java
│ │ │ └── column/
│ │ │ ├── AbstractColumn.java
│ │ │ ├── BooleanColumn.java
│ │ │ ├── BtcColumn.java
│ │ │ ├── Column.java
│ │ │ ├── CryptoVolumeColumn.java
│ │ │ ├── DoubleColumn.java
│ │ │ ├── IntegerColumn.java
│ │ │ ├── Iso8601DateTimeColumn.java
│ │ │ ├── LongColumn.java
│ │ │ ├── MixedTradeFeeColumn.java
│ │ │ ├── NumberColumn.java
│ │ │ ├── SatoshiColumn.java
│ │ │ ├── StringColumn.java
│ │ │ └── ZippedStringColumns.java
│ │ └── resources/
│ │ └── logback.xml
│ └── test/
│ └── java/
│ └── haveno/
│ └── cli/
│ ├── AbstractCliTest.java
│ ├── CreateOfferSmokeTest.java
│ ├── EditXmrOffersSmokeTest.java
│ ├── GetOffersSmokeTest.java
│ ├── GetTradesSmokeTest.java
│ ├── opts/
│ │ └── OptionParsersTest.java
│ └── table/
│ ├── AddressCliOutputDiffTest.java
│ ├── GetBalanceCliOutputDiffTest.java
│ ├── GetOffersCliOutputDiffTest.java
│ ├── GetTradeCliOutputDiffTest.java
│ ├── GetTransactionCliOutputDiffTest.java
│ └── PaymentAccountsCliOutputDiffTest.java
├── common/
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── haveno/
│ │ └── common/
│ │ ├── ClockWatcher.java
│ │ ├── Envelope.java
│ │ ├── FrameRateTimer.java
│ │ ├── HavenoException.java
│ │ ├── MasterTimer.java
│ │ ├── Payload.java
│ │ ├── Proto.java
│ │ ├── ThreadUtils.java
│ │ ├── Timer.java
│ │ ├── UserThread.java
│ │ ├── app/
│ │ │ ├── AppModule.java
│ │ │ ├── AsciiLogo.java
│ │ │ ├── Capabilities.java
│ │ │ ├── Capability.java
│ │ │ ├── DevEnv.java
│ │ │ ├── HasCapabilities.java
│ │ │ ├── Log.java
│ │ │ ├── LogHighlighter.java
│ │ │ └── Version.java
│ │ ├── config/
│ │ │ ├── BaseCurrencyNetwork.java
│ │ │ ├── CompositeOptionSet.java
│ │ │ ├── Config.java
│ │ │ ├── ConfigException.java
│ │ │ ├── ConfigFileEditor.java
│ │ │ ├── ConfigFileOption.java
│ │ │ ├── ConfigFileReader.java
│ │ │ ├── EnumValueConverter.java
│ │ │ └── HavenoHelpFormatter.java
│ │ ├── consensus/
│ │ │ └── UsedForTradeContractJson.java
│ │ ├── crypto/
│ │ │ ├── CryptoException.java
│ │ │ ├── CryptoUtils.java
│ │ │ ├── Encryption.java
│ │ │ ├── Hash.java
│ │ │ ├── IncorrectPasswordException.java
│ │ │ ├── KeyConversionException.java
│ │ │ ├── KeyRing.java
│ │ │ ├── KeyStorage.java
│ │ │ ├── PubKeyRing.java
│ │ │ ├── PubKeyRingProvider.java
│ │ │ ├── ScryptUtil.java
│ │ │ ├── SealedAndSigned.java
│ │ │ └── Sig.java
│ │ ├── file/
│ │ │ ├── CorruptedStorageFileHandler.java
│ │ │ ├── FileUtil.java
│ │ │ ├── JsonFileManager.java
│ │ │ └── ResourceNotFoundException.java
│ │ ├── handlers/
│ │ │ ├── ErrorMessageHandler.java
│ │ │ ├── ExceptionHandler.java
│ │ │ ├── FaultHandler.java
│ │ │ └── ResultHandler.java
│ │ ├── persistence/
│ │ │ └── PersistenceManager.java
│ │ ├── proto/
│ │ │ ├── ProtoResolver.java
│ │ │ ├── ProtoUtil.java
│ │ │ ├── ProtobufferException.java
│ │ │ ├── ProtobufferRuntimeException.java
│ │ │ ├── network/
│ │ │ │ ├── GetDataResponsePriority.java
│ │ │ │ ├── NetworkEnvelope.java
│ │ │ │ ├── NetworkPayload.java
│ │ │ │ └── NetworkProtoResolver.java
│ │ │ └── persistable/
│ │ │ ├── NavigationPath.java
│ │ │ ├── PersistableEnvelope.java
│ │ │ ├── PersistableList.java
│ │ │ ├── PersistableListAsObservable.java
│ │ │ ├── PersistablePayload.java
│ │ │ ├── PersistedDataHost.java
│ │ │ └── PersistenceProtoResolver.java
│ │ ├── reactfx/
│ │ │ ├── FxTimer.java
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ └── Timer.java
│ │ ├── setup/
│ │ │ ├── CommonSetup.java
│ │ │ ├── GracefulShutDownHandler.java
│ │ │ └── UncaughtExceptionHandler.java
│ │ ├── taskrunner/
│ │ │ ├── InterceptTaskException.java
│ │ │ ├── Model.java
│ │ │ ├── Task.java
│ │ │ └── TaskRunner.java
│ │ └── util/
│ │ ├── Base64.java
│ │ ├── CollectionUtils.java
│ │ ├── CompletableFutureUtils.java
│ │ ├── DesktopUtil.java
│ │ ├── DoubleSummaryStatisticsWithStdDev.java
│ │ ├── ExtraDataMapValidator.java
│ │ ├── GcUtil.java
│ │ ├── Hex.java
│ │ ├── InvalidVersionException.java
│ │ ├── JsonExclude.java
│ │ ├── MathUtils.java
│ │ ├── PermutationUtil.java
│ │ ├── Preconditions.java
│ │ ├── Profiler.java
│ │ ├── ReflectionUtils.java
│ │ ├── RestartUtil.java
│ │ ├── SingleThreadExecutorUtils.java
│ │ ├── Tuple2.java
│ │ ├── Tuple3.java
│ │ ├── Tuple4.java
│ │ ├── Tuple5.java
│ │ ├── Utilities.java
│ │ └── ZipUtils.java
│ └── test/
│ └── java/
│ └── haveno/
│ └── common/
│ ├── app/
│ │ ├── CapabilitiesTest.java
│ │ └── VersionTest.java
│ ├── config/
│ │ ├── ConfigFileEditorTests.java
│ │ ├── ConfigFileOptionTests.java
│ │ ├── ConfigFileReaderTests.java
│ │ └── ConfigTests.java
│ └── util/
│ ├── MathUtilsTest.java
│ ├── PermutationTest.java
│ ├── PreconditionsTests.java
│ └── UtilitiesTest.java
├── config/
│ └── checkstyle/
│ └── checkstyle.xml
├── core/
│ ├── .tx/
│ │ └── config
│ ├── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── haveno/
│ │ │ │ └── core/
│ │ │ │ ├── account/
│ │ │ │ │ ├── sign/
│ │ │ │ │ │ ├── SignedWitness.java
│ │ │ │ │ │ ├── SignedWitnessService.java
│ │ │ │ │ │ ├── SignedWitnessStorageService.java
│ │ │ │ │ │ └── SignedWitnessStore.java
│ │ │ │ │ └── witness/
│ │ │ │ │ ├── AccountAgeWitness.java
│ │ │ │ │ ├── AccountAgeWitnessService.java
│ │ │ │ │ ├── AccountAgeWitnessStorageService.java
│ │ │ │ │ ├── AccountAgeWitnessStore.java
│ │ │ │ │ └── AccountAgeWitnessUtils.java
│ │ │ │ ├── alert/
│ │ │ │ │ ├── Alert.java
│ │ │ │ │ ├── AlertManager.java
│ │ │ │ │ ├── AlertModule.java
│ │ │ │ │ ├── PrivateNotificationManager.java
│ │ │ │ │ ├── PrivateNotificationMessage.java
│ │ │ │ │ └── PrivateNotificationPayload.java
│ │ │ │ ├── api/
│ │ │ │ │ ├── AccountServiceListener.java
│ │ │ │ │ ├── CoreAccountService.java
│ │ │ │ │ ├── CoreApi.java
│ │ │ │ │ ├── CoreContext.java
│ │ │ │ │ ├── CoreDisputeAgentsService.java
│ │ │ │ │ ├── CoreDisputesService.java
│ │ │ │ │ ├── CoreHelpService.java
│ │ │ │ │ ├── CoreNotificationService.java
│ │ │ │ │ ├── CoreOffersService.java
│ │ │ │ │ ├── CorePaymentAccountsService.java
│ │ │ │ │ ├── CorePriceService.java
│ │ │ │ │ ├── CoreTradesService.java
│ │ │ │ │ ├── CoreWalletsService.java
│ │ │ │ │ ├── NotificationListener.java
│ │ │ │ │ ├── XmrConnectionService.java
│ │ │ │ │ ├── XmrKeyImageListener.java
│ │ │ │ │ ├── XmrKeyImagePoller.java
│ │ │ │ │ ├── XmrLocalNode.java
│ │ │ │ │ ├── XmrLocalNodeListener.java
│ │ │ │ │ └── model/
│ │ │ │ │ ├── AddressBalanceInfo.java
│ │ │ │ │ ├── BalancesInfo.java
│ │ │ │ │ ├── BtcBalanceInfo.java
│ │ │ │ │ ├── ContractInfo.java
│ │ │ │ │ ├── EncryptedConnection.java
│ │ │ │ │ ├── MarketDepthInfo.java
│ │ │ │ │ ├── MarketPriceInfo.java
│ │ │ │ │ ├── OfferInfo.java
│ │ │ │ │ ├── PaymentAccountForm.java
│ │ │ │ │ ├── PaymentAccountFormField.java
│ │ │ │ │ ├── TradeInfo.java
│ │ │ │ │ ├── XmrBalanceInfo.java
│ │ │ │ │ ├── XmrDestination.java
│ │ │ │ │ ├── XmrIncomingTransfer.java
│ │ │ │ │ ├── XmrOutgoingTransfer.java
│ │ │ │ │ ├── XmrTx.java
│ │ │ │ │ └── builder/
│ │ │ │ │ ├── OfferInfoBuilder.java
│ │ │ │ │ └── TradeInfoV1Builder.java
│ │ │ │ ├── app/
│ │ │ │ │ ├── AppStartupState.java
│ │ │ │ │ ├── AvoidStandbyModeService.java
│ │ │ │ │ ├── ConsoleInput.java
│ │ │ │ │ ├── ConsoleInputReadTask.java
│ │ │ │ │ ├── CoreModule.java
│ │ │ │ │ ├── DomainInitialisation.java
│ │ │ │ │ ├── HavenoExecutable.java
│ │ │ │ │ ├── HavenoHeadlessApp.java
│ │ │ │ │ ├── HavenoHeadlessAppMain.java
│ │ │ │ │ ├── HavenoSetup.java
│ │ │ │ │ ├── HeadlessApp.java
│ │ │ │ │ ├── P2PNetworkSetup.java
│ │ │ │ │ ├── TorSetup.java
│ │ │ │ │ ├── WalletAppSetup.java
│ │ │ │ │ └── misc/
│ │ │ │ │ ├── AppSetup.java
│ │ │ │ │ ├── AppSetupWithP2P.java
│ │ │ │ │ ├── ExecutableForAppWithP2p.java
│ │ │ │ │ └── ModuleForAppWithP2p.java
│ │ │ │ ├── exceptions/
│ │ │ │ │ └── TradePriceOutOfToleranceException.java
│ │ │ │ ├── filter/
│ │ │ │ │ ├── Filter.java
│ │ │ │ │ ├── FilterManager.java
│ │ │ │ │ ├── FilterModule.java
│ │ │ │ │ └── PaymentAccountFilter.java
│ │ │ │ ├── locale/
│ │ │ │ │ ├── BankUtil.java
│ │ │ │ │ ├── Country.java
│ │ │ │ │ ├── CountryUtil.java
│ │ │ │ │ ├── CryptoCurrency.java
│ │ │ │ │ ├── CurrencyTuple.java
│ │ │ │ │ ├── CurrencyUtil.java
│ │ │ │ │ ├── GlobalSettings.java
│ │ │ │ │ ├── LanguageUtil.java
│ │ │ │ │ ├── LocaleUtil.java
│ │ │ │ │ ├── Region.java
│ │ │ │ │ ├── Res.java
│ │ │ │ │ ├── TradeCurrency.java
│ │ │ │ │ └── TraditionalCurrency.java
│ │ │ │ ├── monetary/
│ │ │ │ │ ├── CryptoExchangeRate.java
│ │ │ │ │ ├── CryptoMoney.java
│ │ │ │ │ ├── MonetaryWrapper.java
│ │ │ │ │ ├── Price.java
│ │ │ │ │ ├── TraditionalExchangeRate.java
│ │ │ │ │ ├── TraditionalMoney.java
│ │ │ │ │ └── Volume.java
│ │ │ │ ├── network/
│ │ │ │ │ ├── CoreBanFilter.java
│ │ │ │ │ ├── MessageState.java
│ │ │ │ │ └── p2p/
│ │ │ │ │ ├── inventory/
│ │ │ │ │ │ ├── GetInventoryRequestHandler.java
│ │ │ │ │ │ ├── GetInventoryRequestManager.java
│ │ │ │ │ │ ├── GetInventoryRequester.java
│ │ │ │ │ │ ├── messages/
│ │ │ │ │ │ │ ├── GetInventoryRequest.java
│ │ │ │ │ │ │ └── GetInventoryResponse.java
│ │ │ │ │ │ └── model/
│ │ │ │ │ │ ├── Average.java
│ │ │ │ │ │ ├── DeviationByIntegerDiff.java
│ │ │ │ │ │ ├── DeviationByPercentage.java
│ │ │ │ │ │ ├── DeviationOfHashes.java
│ │ │ │ │ │ ├── DeviationSeverity.java
│ │ │ │ │ │ ├── DeviationType.java
│ │ │ │ │ │ ├── InventoryItem.java
│ │ │ │ │ │ └── RequestInfo.java
│ │ │ │ │ └── seed/
│ │ │ │ │ └── DefaultSeedNodeRepository.java
│ │ │ │ ├── notifications/
│ │ │ │ │ ├── MobileMessage.java
│ │ │ │ │ ├── MobileMessageEncryption.java
│ │ │ │ │ ├── MobileMessageType.java
│ │ │ │ │ ├── MobileModel.java
│ │ │ │ │ ├── MobileNotificationService.java
│ │ │ │ │ ├── MobileNotificationValidator.java
│ │ │ │ │ └── alerts/
│ │ │ │ │ ├── DisputeMsgEvents.java
│ │ │ │ │ ├── MyOfferTakenEvents.java
│ │ │ │ │ ├── TradeEvents.java
│ │ │ │ │ ├── market/
│ │ │ │ │ │ ├── MarketAlertFilter.java
│ │ │ │ │ │ └── MarketAlerts.java
│ │ │ │ │ └── price/
│ │ │ │ │ ├── PriceAlert.java
│ │ │ │ │ └── PriceAlertFilter.java
│ │ │ │ ├── offer/
│ │ │ │ │ ├── AvailabilityResult.java
│ │ │ │ │ ├── CreateOfferService.java
│ │ │ │ │ ├── MarketPriceNotAvailableException.java
│ │ │ │ │ ├── Offer.java
│ │ │ │ │ ├── OfferBookService.java
│ │ │ │ │ ├── OfferDirection.java
│ │ │ │ │ ├── OfferFilterService.java
│ │ │ │ │ ├── OfferForJson.java
│ │ │ │ │ ├── OfferModule.java
│ │ │ │ │ ├── OfferPayload.java
│ │ │ │ │ ├── OfferRestrictions.java
│ │ │ │ │ ├── OfferUtil.java
│ │ │ │ │ ├── OpenOffer.java
│ │ │ │ │ ├── OpenOfferManager.java
│ │ │ │ │ ├── SignedOffer.java
│ │ │ │ │ ├── SignedOfferList.java
│ │ │ │ │ ├── TriggerPriceService.java
│ │ │ │ │ ├── availability/
│ │ │ │ │ │ ├── DisputeAgentSelection.java
│ │ │ │ │ │ ├── OfferAvailabilityModel.java
│ │ │ │ │ │ ├── OfferAvailabilityProtocol.java
│ │ │ │ │ │ └── tasks/
│ │ │ │ │ │ ├── ProcessOfferAvailabilityResponse.java
│ │ │ │ │ │ └── SendOfferAvailabilityRequest.java
│ │ │ │ │ ├── messages/
│ │ │ │ │ │ ├── OfferAvailabilityRequest.java
│ │ │ │ │ │ ├── OfferAvailabilityResponse.java
│ │ │ │ │ │ ├── OfferMessage.java
│ │ │ │ │ │ ├── SignOfferRequest.java
│ │ │ │ │ │ └── SignOfferResponse.java
│ │ │ │ │ ├── placeoffer/
│ │ │ │ │ │ ├── PlaceOfferModel.java
│ │ │ │ │ │ ├── PlaceOfferProtocol.java
│ │ │ │ │ │ └── tasks/
│ │ │ │ │ │ ├── MakerProcessSignOfferResponse.java
│ │ │ │ │ │ ├── MakerReserveOfferFunds.java
│ │ │ │ │ │ ├── MakerSendSignOfferRequest.java
│ │ │ │ │ │ ├── MaybeAddToOfferBook.java
│ │ │ │ │ │ └── ValidateOffer.java
│ │ │ │ │ └── takeoffer/
│ │ │ │ │ └── TakeOfferModel.java
│ │ │ │ ├── payment/
│ │ │ │ │ ├── AchTransferAccount.java
│ │ │ │ │ ├── AdvancedCashAccount.java
│ │ │ │ │ ├── AliPayAccount.java
│ │ │ │ │ ├── AmazonGiftCardAccount.java
│ │ │ │ │ ├── AssetAccount.java
│ │ │ │ │ ├── AustraliaPayidAccount.java
│ │ │ │ │ ├── BankAccount.java
│ │ │ │ │ ├── BankNameRestrictedBankAccount.java
│ │ │ │ │ ├── BizumAccount.java
│ │ │ │ │ ├── CapitualAccount.java
│ │ │ │ │ ├── CashAppAccount.java
│ │ │ │ │ ├── CashAtAtmAccount.java
│ │ │ │ │ ├── CashDepositAccount.java
│ │ │ │ │ ├── CelPayAccount.java
│ │ │ │ │ ├── ChargeBackRisk.java
│ │ │ │ │ ├── ChaseQuickPayAccount.java
│ │ │ │ │ ├── CountryBasedPaymentAccount.java
│ │ │ │ │ ├── CryptoCurrencyAccount.java
│ │ │ │ │ ├── DomesticWireTransferAccount.java
│ │ │ │ │ ├── F2FAccount.java
│ │ │ │ │ ├── FasterPaymentsAccount.java
│ │ │ │ │ ├── HalCashAccount.java
│ │ │ │ │ ├── IfscBasedAccount.java
│ │ │ │ │ ├── ImpsAccount.java
│ │ │ │ │ ├── InstantCryptoCurrencyAccount.java
│ │ │ │ │ ├── InteracETransferAccount.java
│ │ │ │ │ ├── JapanBankAccount.java
│ │ │ │ │ ├── JapanBankData.java
│ │ │ │ │ ├── MoneseAccount.java
│ │ │ │ │ ├── MoneyBeamAccount.java
│ │ │ │ │ ├── MoneyGramAccount.java
│ │ │ │ │ ├── NationalBankAccount.java
│ │ │ │ │ ├── NeftAccount.java
│ │ │ │ │ ├── NequiAccount.java
│ │ │ │ │ ├── OKPayAccount.java
│ │ │ │ │ ├── PaxumAccount.java
│ │ │ │ │ ├── PayByMailAccount.java
│ │ │ │ │ ├── PayPalAccount.java
│ │ │ │ │ ├── PaymentAccount.java
│ │ │ │ │ ├── PaymentAccountFactory.java
│ │ │ │ │ ├── PaymentAccountList.java
│ │ │ │ │ ├── PaymentAccountTypeAdapter.java
│ │ │ │ │ ├── PaymentAccountUtil.java
│ │ │ │ │ ├── PaymentAccounts.java
│ │ │ │ │ ├── PaysafeAccount.java
│ │ │ │ │ ├── PayseraAccount.java
│ │ │ │ │ ├── PaytmAccount.java
│ │ │ │ │ ├── PerfectMoneyAccount.java
│ │ │ │ │ ├── PixAccount.java
│ │ │ │ │ ├── PopmoneyAccount.java
│ │ │ │ │ ├── PromptPayAccount.java
│ │ │ │ │ ├── ReceiptPredicates.java
│ │ │ │ │ ├── ReceiptValidator.java
│ │ │ │ │ ├── RevolutAccount.java
│ │ │ │ │ ├── RtgsAccount.java
│ │ │ │ │ ├── SameBankAccount.java
│ │ │ │ │ ├── SameCountryRestrictedBankAccount.java
│ │ │ │ │ ├── SatispayAccount.java
│ │ │ │ │ ├── SepaAccount.java
│ │ │ │ │ ├── SepaInstantAccount.java
│ │ │ │ │ ├── SpecificBanksAccount.java
│ │ │ │ │ ├── StrikeAccount.java
│ │ │ │ │ ├── SwiftAccount.java
│ │ │ │ │ ├── SwishAccount.java
│ │ │ │ │ ├── TikkieAccount.java
│ │ │ │ │ ├── TradeLimits.java
│ │ │ │ │ ├── TransferwiseAccount.java
│ │ │ │ │ ├── TransferwiseUsdAccount.java
│ │ │ │ │ ├── USPostalMoneyOrderAccount.java
│ │ │ │ │ ├── UpholdAccount.java
│ │ │ │ │ ├── UpiAccount.java
│ │ │ │ │ ├── VenmoAccount.java
│ │ │ │ │ ├── VerseAccount.java
│ │ │ │ │ ├── WeChatPayAccount.java
│ │ │ │ │ ├── WesternUnionAccount.java
│ │ │ │ │ ├── ZelleAccount.java
│ │ │ │ │ ├── payload/
│ │ │ │ │ │ ├── AchTransferAccountPayload.java
│ │ │ │ │ │ ├── AdvancedCashAccountPayload.java
│ │ │ │ │ │ ├── AliPayAccountPayload.java
│ │ │ │ │ │ ├── AmazonGiftCardAccountPayload.java
│ │ │ │ │ │ ├── AssetAccountPayload.java
│ │ │ │ │ │ ├── AustraliaPayidAccountPayload.java
│ │ │ │ │ │ ├── BankAccountPayload.java
│ │ │ │ │ │ ├── BizumAccountPayload.java
│ │ │ │ │ │ ├── CapitualAccountPayload.java
│ │ │ │ │ │ ├── CashAppAccountPayload.java
│ │ │ │ │ │ ├── CashAtAtmAccountPayload.java
│ │ │ │ │ │ ├── CashDepositAccountPayload.java
│ │ │ │ │ │ ├── CelPayAccountPayload.java
│ │ │ │ │ │ ├── ChaseQuickPayAccountPayload.java
│ │ │ │ │ │ ├── CountryBasedPaymentAccountPayload.java
│ │ │ │ │ │ ├── CryptoCurrencyAccountPayload.java
│ │ │ │ │ │ ├── DomesticWireTransferAccountPayload.java
│ │ │ │ │ │ ├── F2FAccountPayload.java
│ │ │ │ │ │ ├── FasterPaymentsAccountPayload.java
│ │ │ │ │ │ ├── HalCashAccountPayload.java
│ │ │ │ │ │ ├── IfscBasedAccountPayload.java
│ │ │ │ │ │ ├── ImpsAccountPayload.java
│ │ │ │ │ │ ├── InstantCryptoCurrencyPayload.java
│ │ │ │ │ │ ├── InteracETransferAccountPayload.java
│ │ │ │ │ │ ├── JapanBankAccountPayload.java
│ │ │ │ │ │ ├── MoneseAccountPayload.java
│ │ │ │ │ │ ├── MoneyBeamAccountPayload.java
│ │ │ │ │ │ ├── MoneyGramAccountPayload.java
│ │ │ │ │ │ ├── NationalBankAccountPayload.java
│ │ │ │ │ │ ├── NeftAccountPayload.java
│ │ │ │ │ │ ├── NequiAccountPayload.java
│ │ │ │ │ │ ├── OKPayAccountPayload.java
│ │ │ │ │ │ ├── PaxumAccountPayload.java
│ │ │ │ │ │ ├── PayByMailAccountPayload.java
│ │ │ │ │ │ ├── PayPalAccountPayload.java
│ │ │ │ │ │ ├── PayloadWithHolderName.java
│ │ │ │ │ │ ├── PaymentAccountPayload.java
│ │ │ │ │ │ ├── PaymentMethod.java
│ │ │ │ │ │ ├── PaysafeAccountPayload.java
│ │ │ │ │ │ ├── PayseraAccountPayload.java
│ │ │ │ │ │ ├── PaytmAccountPayload.java
│ │ │ │ │ │ ├── PerfectMoneyAccountPayload.java
│ │ │ │ │ │ ├── PixAccountPayload.java
│ │ │ │ │ │ ├── PopmoneyAccountPayload.java
│ │ │ │ │ │ ├── PromptPayAccountPayload.java
│ │ │ │ │ │ ├── RevolutAccountPayload.java
│ │ │ │ │ │ ├── RtgsAccountPayload.java
│ │ │ │ │ │ ├── SameBankAccountPayload.java
│ │ │ │ │ │ ├── SatispayAccountPayload.java
│ │ │ │ │ │ ├── SepaAccountPayload.java
│ │ │ │ │ │ ├── SepaInstantAccountPayload.java
│ │ │ │ │ │ ├── SpecificBanksAccountPayload.java
│ │ │ │ │ │ ├── StrikeAccountPayload.java
│ │ │ │ │ │ ├── SwiftAccountPayload.java
│ │ │ │ │ │ ├── SwishAccountPayload.java
│ │ │ │ │ │ ├── TikkieAccountPayload.java
│ │ │ │ │ │ ├── TransferwiseAccountPayload.java
│ │ │ │ │ │ ├── TransferwiseUsdAccountPayload.java
│ │ │ │ │ │ ├── USPostalMoneyOrderAccountPayload.java
│ │ │ │ │ │ ├── UpholdAccountPayload.java
│ │ │ │ │ │ ├── UpiAccountPayload.java
│ │ │ │ │ │ ├── VenmoAccountPayload.java
│ │ │ │ │ │ ├── VerseAccountPayload.java
│ │ │ │ │ │ ├── WeChatPayAccountPayload.java
│ │ │ │ │ │ ├── WesternUnionAccountPayload.java
│ │ │ │ │ │ └── ZelleAccountPayload.java
│ │ │ │ │ └── validation/
│ │ │ │ │ ├── AccountNrValidator.java
│ │ │ │ │ ├── AdvancedCashValidator.java
│ │ │ │ │ ├── AliPayValidator.java
│ │ │ │ │ ├── AustraliaPayidAccountNameValidator.java
│ │ │ │ │ ├── AustraliaPayidValidator.java
│ │ │ │ │ ├── BICValidator.java
│ │ │ │ │ ├── BankIdValidator.java
│ │ │ │ │ ├── BankValidator.java
│ │ │ │ │ ├── BranchIdValidator.java
│ │ │ │ │ ├── CapitualValidator.java
│ │ │ │ │ ├── ChaseQuickPayValidator.java
│ │ │ │ │ ├── CountryCallingCodes.java
│ │ │ │ │ ├── CryptoAddressValidator.java
│ │ │ │ │ ├── EmailOrMobileNrOrCashtagValidator.java
│ │ │ │ │ ├── EmailOrMobileNrOrUsernameValidator.java
│ │ │ │ │ ├── EmailOrMobileNrValidator.java
│ │ │ │ │ ├── EmailValidator.java
│ │ │ │ │ ├── F2FValidator.java
│ │ │ │ │ ├── FiatVolumeValidator.java
│ │ │ │ │ ├── HalCashValidator.java
│ │ │ │ │ ├── IBANValidator.java
│ │ │ │ │ ├── InteracETransferAnswerValidator.java
│ │ │ │ │ ├── InteracETransferQuestionValidator.java
│ │ │ │ │ ├── InteracETransferValidator.java
│ │ │ │ │ ├── JapanBankAccountNameValidator.java
│ │ │ │ │ ├── JapanBankAccountNumberValidator.java
│ │ │ │ │ ├── JapanBankBranchCodeValidator.java
│ │ │ │ │ ├── JapanBankBranchNameValidator.java
│ │ │ │ │ ├── JapanBankTransferValidator.java
│ │ │ │ │ ├── LengthValidator.java
│ │ │ │ │ ├── MoneyBeamValidator.java
│ │ │ │ │ ├── NationalAccountIdValidator.java
│ │ │ │ │ ├── PercentageNumberValidator.java
│ │ │ │ │ ├── PerfectMoneyValidator.java
│ │ │ │ │ ├── PhoneNumberValidator.java
│ │ │ │ │ ├── PopmoneyValidator.java
│ │ │ │ │ ├── PromptPayValidator.java
│ │ │ │ │ ├── RevolutValidator.java
│ │ │ │ │ ├── SecurityDepositValidator.java
│ │ │ │ │ ├── SepaIBANValidator.java
│ │ │ │ │ ├── SwishValidator.java
│ │ │ │ │ ├── TransferwiseValidator.java
│ │ │ │ │ ├── USPostalMoneyOrderValidator.java
│ │ │ │ │ ├── UpholdValidator.java
│ │ │ │ │ ├── WeChatPayValidator.java
│ │ │ │ │ └── XmrValidator.java
│ │ │ │ ├── presentation/
│ │ │ │ │ ├── BalancePresentation.java
│ │ │ │ │ ├── CorePresentationModule.java
│ │ │ │ │ ├── SupportTicketsPresentation.java
│ │ │ │ │ └── TradePresentation.java
│ │ │ │ ├── proto/
│ │ │ │ │ ├── CoreProtoResolver.java
│ │ │ │ │ ├── ProtoDevUtil.java
│ │ │ │ │ ├── network/
│ │ │ │ │ │ └── CoreNetworkProtoResolver.java
│ │ │ │ │ └── persistable/
│ │ │ │ │ └── CorePersistenceProtoResolver.java
│ │ │ │ ├── provider/
│ │ │ │ │ ├── FeeHttpClient.java
│ │ │ │ │ ├── HttpClientProvider.java
│ │ │ │ │ ├── MempoolHttpClient.java
│ │ │ │ │ ├── PriceHttpClient.java
│ │ │ │ │ ├── ProvidersRepository.java
│ │ │ │ │ ├── fee/
│ │ │ │ │ │ ├── FeeProvider.java
│ │ │ │ │ │ └── FeeRequest.java
│ │ │ │ │ └── price/
│ │ │ │ │ ├── MarketPrice.java
│ │ │ │ │ ├── PriceFeedService.java
│ │ │ │ │ ├── PriceProvider.java
│ │ │ │ │ ├── PriceRequest.java
│ │ │ │ │ └── PriceRequestException.java
│ │ │ │ ├── setup/
│ │ │ │ │ ├── CoreNetworkCapabilities.java
│ │ │ │ │ ├── CorePersistedDataHost.java
│ │ │ │ │ └── CoreSetup.java
│ │ │ │ ├── support/
│ │ │ │ │ ├── SupportManager.java
│ │ │ │ │ ├── SupportSession.java
│ │ │ │ │ ├── SupportType.java
│ │ │ │ │ ├── dispute/
│ │ │ │ │ │ ├── Attachment.java
│ │ │ │ │ │ ├── Dispute.java
│ │ │ │ │ │ ├── DisputeAlreadyOpenException.java
│ │ │ │ │ │ ├── DisputeList.java
│ │ │ │ │ │ ├── DisputeListService.java
│ │ │ │ │ │ ├── DisputeManager.java
│ │ │ │ │ │ ├── DisputeMessageDeliveryFailedException.java
│ │ │ │ │ │ ├── DisputeResult.java
│ │ │ │ │ │ ├── DisputeSession.java
│ │ │ │ │ │ ├── DisputeSummaryVerification.java
│ │ │ │ │ │ ├── DisputeValidation.java
│ │ │ │ │ │ ├── agent/
│ │ │ │ │ │ │ ├── DisputeAgent.java
│ │ │ │ │ │ │ ├── DisputeAgentLookupMap.java
│ │ │ │ │ │ │ ├── DisputeAgentManager.java
│ │ │ │ │ │ │ ├── DisputeAgentService.java
│ │ │ │ │ │ │ └── MultipleHolderNameDetection.java
│ │ │ │ │ │ ├── arbitration/
│ │ │ │ │ │ │ ├── ArbitrationDisputeList.java
│ │ │ │ │ │ │ ├── ArbitrationDisputeListService.java
│ │ │ │ │ │ │ ├── ArbitrationManager.java
│ │ │ │ │ │ │ ├── ArbitrationSession.java
│ │ │ │ │ │ │ ├── TraderDataItem.java
│ │ │ │ │ │ │ ├── arbitrator/
│ │ │ │ │ │ │ │ ├── Arbitrator.java
│ │ │ │ │ │ │ │ ├── ArbitratorManager.java
│ │ │ │ │ │ │ │ └── ArbitratorService.java
│ │ │ │ │ │ │ └── messages/
│ │ │ │ │ │ │ └── ArbitrationMessage.java
│ │ │ │ │ │ ├── mediation/
│ │ │ │ │ │ │ ├── FileTransferReceiver.java
│ │ │ │ │ │ │ ├── FileTransferSender.java
│ │ │ │ │ │ │ ├── FileTransferSession.java
│ │ │ │ │ │ │ ├── MediationDisputeList.java
│ │ │ │ │ │ │ ├── MediationDisputeListService.java
│ │ │ │ │ │ │ ├── MediationManager.java
│ │ │ │ │ │ │ ├── MediationResultState.java
│ │ │ │ │ │ │ ├── MediationSession.java
│ │ │ │ │ │ │ └── mediator/
│ │ │ │ │ │ │ ├── Mediator.java
│ │ │ │ │ │ │ ├── MediatorManager.java
│ │ │ │ │ │ │ └── MediatorService.java
│ │ │ │ │ │ ├── messages/
│ │ │ │ │ │ │ ├── DisputeClosedMessage.java
│ │ │ │ │ │ │ ├── DisputeMessage.java
│ │ │ │ │ │ │ └── DisputeOpenedMessage.java
│ │ │ │ │ │ └── refund/
│ │ │ │ │ │ ├── RefundDisputeList.java
│ │ │ │ │ │ ├── RefundDisputeListService.java
│ │ │ │ │ │ ├── RefundManager.java
│ │ │ │ │ │ ├── RefundResultState.java
│ │ │ │ │ │ ├── RefundSession.java
│ │ │ │ │ │ └── refundagent/
│ │ │ │ │ │ ├── RefundAgent.java
│ │ │ │ │ │ ├── RefundAgentManager.java
│ │ │ │ │ │ └── RefundAgentService.java
│ │ │ │ │ ├── messages/
│ │ │ │ │ │ ├── ChatMessage.java
│ │ │ │ │ │ └── SupportMessage.java
│ │ │ │ │ └── traderchat/
│ │ │ │ │ ├── TradeChatSession.java
│ │ │ │ │ └── TraderChatManager.java
│ │ │ │ ├── trade/
│ │ │ │ │ ├── ArbitratorTrade.java
│ │ │ │ │ ├── BuyerAsMakerTrade.java
│ │ │ │ │ ├── BuyerAsTakerTrade.java
│ │ │ │ │ ├── BuyerTrade.java
│ │ │ │ │ ├── CleanupMailboxMessages.java
│ │ │ │ │ ├── CleanupMailboxMessagesService.java
│ │ │ │ │ ├── ClosedTradableFormatter.java
│ │ │ │ │ ├── ClosedTradableManager.java
│ │ │ │ │ ├── ClosedTradableUtil.java
│ │ │ │ │ ├── Contract.java
│ │ │ │ │ ├── HavenoUtils.java
│ │ │ │ │ ├── MakerTrade.java
│ │ │ │ │ ├── SellerAsMakerTrade.java
│ │ │ │ │ ├── SellerAsTakerTrade.java
│ │ │ │ │ ├── SellerTrade.java
│ │ │ │ │ ├── TakerTrade.java
│ │ │ │ │ ├── Tradable.java
│ │ │ │ │ ├── TradableList.java
│ │ │ │ │ ├── Trade.java
│ │ │ │ │ ├── TradeDataValidation.java
│ │ │ │ │ ├── TradeManager.java
│ │ │ │ │ ├── TradeModule.java
│ │ │ │ │ ├── TradeTxException.java
│ │ │ │ │ ├── TradeUtil.java
│ │ │ │ │ ├── failed/
│ │ │ │ │ │ └── FailedTradesManager.java
│ │ │ │ │ ├── handlers/
│ │ │ │ │ │ ├── TradeResultHandler.java
│ │ │ │ │ │ └── TransactionResultHandler.java
│ │ │ │ │ ├── messages/
│ │ │ │ │ │ ├── DepositRequest.java
│ │ │ │ │ │ ├── DepositResponse.java
│ │ │ │ │ │ ├── DepositsConfirmedMessage.java
│ │ │ │ │ │ ├── InitMultisigRequest.java
│ │ │ │ │ │ ├── InitTradeRequest.java
│ │ │ │ │ │ ├── MediatedPayoutTxPublishedMessage.java
│ │ │ │ │ │ ├── MediatedPayoutTxSignatureMessage.java
│ │ │ │ │ │ ├── PaymentReceivedMessage.java
│ │ │ │ │ │ ├── PaymentSentMessage.java
│ │ │ │ │ │ ├── SignContractRequest.java
│ │ │ │ │ │ ├── SignContractResponse.java
│ │ │ │ │ │ ├── TradeMailboxMessage.java
│ │ │ │ │ │ ├── TradeMessage.java
│ │ │ │ │ │ └── TradeProtocolVersion.java
│ │ │ │ │ ├── protocol/
│ │ │ │ │ │ ├── ArbitratorProtocol.java
│ │ │ │ │ │ ├── BuyerAsMakerProtocol.java
│ │ │ │ │ │ ├── BuyerAsTakerProtocol.java
│ │ │ │ │ │ ├── BuyerProtocol.java
│ │ │ │ │ │ ├── DisputeProtocol.java
│ │ │ │ │ │ ├── FluentProtocol.java
│ │ │ │ │ │ ├── MakerProtocol.java
│ │ │ │ │ │ ├── ProcessModel.java
│ │ │ │ │ │ ├── ProcessModelServiceProvider.java
│ │ │ │ │ │ ├── SellerAsMakerProtocol.java
│ │ │ │ │ │ ├── SellerAsTakerProtocol.java
│ │ │ │ │ │ ├── SellerProtocol.java
│ │ │ │ │ │ ├── TakerProtocol.java
│ │ │ │ │ │ ├── TradeListener.java
│ │ │ │ │ │ ├── TradePeer.java
│ │ │ │ │ │ ├── TradeProtocol.java
│ │ │ │ │ │ ├── TradeProtocolFactory.java
│ │ │ │ │ │ ├── TradeTaskRunner.java
│ │ │ │ │ │ ├── TraderProtocol.java
│ │ │ │ │ │ └── tasks/
│ │ │ │ │ │ ├── ApplyFilter.java
│ │ │ │ │ │ ├── ArbitratorProcessDepositRequest.java
│ │ │ │ │ │ ├── ArbitratorProcessReserveTx.java
│ │ │ │ │ │ ├── ArbitratorSendDisputeOpenedMessage.java
│ │ │ │ │ │ ├── ArbitratorSendDisputeOpenedMessageToBuyer.java
│ │ │ │ │ │ ├── ArbitratorSendDisputeOpenedMessageToSeller.java
│ │ │ │ │ │ ├── ArbitratorSendInitTradeOrMultisigRequests.java
│ │ │ │ │ │ ├── BuyerPreparePaymentSentMessage.java
│ │ │ │ │ │ ├── BuyerSendPaymentSentMessage.java
│ │ │ │ │ │ ├── BuyerSendPaymentSentMessageToArbitrator.java
│ │ │ │ │ │ ├── BuyerSendPaymentSentMessageToSeller.java
│ │ │ │ │ │ ├── MakerRecreateReserveTx.java
│ │ │ │ │ │ ├── MakerSendInitTradeRequestToArbitrator.java
│ │ │ │ │ │ ├── MakerSetLockTime.java
│ │ │ │ │ │ ├── MaybeResendDisputeClosedMessageWithPayout.java
│ │ │ │ │ │ ├── MaybeSendSignContractRequest.java
│ │ │ │ │ │ ├── ProcessDepositResponse.java
│ │ │ │ │ │ ├── ProcessDepositsConfirmedMessage.java
│ │ │ │ │ │ ├── ProcessInitMultisigRequest.java
│ │ │ │ │ │ ├── ProcessInitTradeRequest.java
│ │ │ │ │ │ ├── ProcessPaymentReceivedMessage.java
│ │ │ │ │ │ ├── ProcessPaymentSentMessage.java
│ │ │ │ │ │ ├── ProcessSignContractRequest.java
│ │ │ │ │ │ ├── SellerPreparePaymentReceivedMessage.java
│ │ │ │ │ │ ├── SellerSendPaymentReceivedMessage.java
│ │ │ │ │ │ ├── SellerSendPaymentReceivedMessageToArbitrator.java
│ │ │ │ │ │ ├── SellerSendPaymentReceivedMessageToBuyer.java
│ │ │ │ │ │ ├── SendDepositRequest.java
│ │ │ │ │ │ ├── SendDepositsConfirmedMessage.java
│ │ │ │ │ │ ├── SendDepositsConfirmedMessageToArbitrator.java
│ │ │ │ │ │ ├── SendDepositsConfirmedMessageToBuyer.java
│ │ │ │ │ │ ├── SendDepositsConfirmedMessageToSeller.java
│ │ │ │ │ │ ├── SendMailboxMessageTask.java
│ │ │ │ │ │ ├── TakerReserveTradeFunds.java
│ │ │ │ │ │ ├── TakerSendInitTradeRequestToArbitrator.java
│ │ │ │ │ │ ├── TakerSendInitTradeRequestToMaker.java
│ │ │ │ │ │ ├── TradeTask.java
│ │ │ │ │ │ ├── VerifyPeersAccountAgeWitness.java
│ │ │ │ │ │ └── mediation/
│ │ │ │ │ │ ├── FinalizeMediatedPayoutTx.java
│ │ │ │ │ │ ├── ProcessMediatedPayoutSignatureMessage.java
│ │ │ │ │ │ ├── ProcessMediatedPayoutTxPublishedMessage.java
│ │ │ │ │ │ ├── SendMediatedPayoutSignatureMessage.java
│ │ │ │ │ │ ├── SendMediatedPayoutTxPublishedMessage.java
│ │ │ │ │ │ ├── SetupMediatedPayoutTxListener.java
│ │ │ │ │ │ └── SignMediatedPayoutTx.java
│ │ │ │ │ └── statistics/
│ │ │ │ │ ├── ReferralId.java
│ │ │ │ │ ├── ReferralIdService.java
│ │ │ │ │ ├── TradeStatistics3.java
│ │ │ │ │ ├── TradeStatistics3StorageService.java
│ │ │ │ │ ├── TradeStatistics3Store.java
│ │ │ │ │ ├── TradeStatisticsForJson.java
│ │ │ │ │ └── TradeStatisticsManager.java
│ │ │ │ ├── user/
│ │ │ │ │ ├── AutoConfirmSettings.java
│ │ │ │ │ ├── BlockChainExplorer.java
│ │ │ │ │ ├── Cookie.java
│ │ │ │ │ ├── CookieKey.java
│ │ │ │ │ ├── DontShowAgainLookup.java
│ │ │ │ │ ├── Preferences.java
│ │ │ │ │ ├── PreferencesPayload.java
│ │ │ │ │ ├── User.java
│ │ │ │ │ └── UserPayload.java
│ │ │ │ ├── util/
│ │ │ │ │ ├── AveragePriceUtil.java
│ │ │ │ │ ├── FormattingUtils.java
│ │ │ │ │ ├── GenerateKeyPairs.java
│ │ │ │ │ ├── InlierUtil.java
│ │ │ │ │ ├── JsonUtil.java
│ │ │ │ │ ├── ParsingUtils.java
│ │ │ │ │ ├── PriceUtil.java
│ │ │ │ │ ├── SimpleMarkdownParser.java
│ │ │ │ │ ├── Validator.java
│ │ │ │ │ ├── VolumeUtil.java
│ │ │ │ │ ├── coin/
│ │ │ │ │ │ ├── CoinFormatter.java
│ │ │ │ │ │ ├── CoinUtil.java
│ │ │ │ │ │ └── ImmutableCoinFormatter.java
│ │ │ │ │ └── validation/
│ │ │ │ │ ├── AmountValidator4Decimals.java
│ │ │ │ │ ├── AmountValidator8Decimals.java
│ │ │ │ │ ├── BtcAddressValidator.java
│ │ │ │ │ ├── HexStringValidator.java
│ │ │ │ │ ├── InputValidator.java
│ │ │ │ │ ├── IntegerValidator.java
│ │ │ │ │ ├── MonetaryValidator.java
│ │ │ │ │ ├── NumberValidator.java
│ │ │ │ │ ├── RegexValidator.java
│ │ │ │ │ ├── RegexValidatorFactory.java
│ │ │ │ │ ├── StringValidator.java
│ │ │ │ │ └── UrlInputValidator.java
│ │ │ │ └── xmr/
│ │ │ │ ├── Balances.java
│ │ │ │ ├── XmrConnectionModule.java
│ │ │ │ ├── XmrModule.java
│ │ │ │ ├── XmrNodeSettings.java
│ │ │ │ ├── exceptions/
│ │ │ │ │ ├── AddressEntryException.java
│ │ │ │ │ ├── InsufficientFundsException.java
│ │ │ │ │ ├── InvalidHostException.java
│ │ │ │ │ ├── RejectedTxException.java
│ │ │ │ │ ├── SigningException.java
│ │ │ │ │ ├── TransactionVerificationException.java
│ │ │ │ │ ├── TxBroadcastException.java
│ │ │ │ │ ├── TxBroadcastTimeoutException.java
│ │ │ │ │ └── WalletException.java
│ │ │ │ ├── listeners/
│ │ │ │ │ ├── AddressConfidenceListener.java
│ │ │ │ │ ├── BalanceListener.java
│ │ │ │ │ ├── TxConfidenceListener.java
│ │ │ │ │ └── XmrBalanceListener.java
│ │ │ │ ├── model/
│ │ │ │ │ ├── AddressEntry.java
│ │ │ │ │ ├── AddressEntryList.java
│ │ │ │ │ ├── EncryptedConnectionList.java
│ │ │ │ │ ├── InputsAndChangeOutput.java
│ │ │ │ │ ├── PreparedDepositTxAndMakerInputs.java
│ │ │ │ │ ├── RawTransactionInput.java
│ │ │ │ │ ├── XmrAddressEntry.java
│ │ │ │ │ └── XmrAddressEntryList.java
│ │ │ │ ├── nodes/
│ │ │ │ │ ├── ProxySocketFactory.java
│ │ │ │ │ ├── SeedPeersSocks5Dns.java
│ │ │ │ │ ├── XmrNetworkConfig.java
│ │ │ │ │ ├── XmrNodeConverter.java
│ │ │ │ │ ├── XmrNodes.java
│ │ │ │ │ ├── XmrNodesRepository.java
│ │ │ │ │ └── XmrNodesSetupPreferences.java
│ │ │ │ ├── setup/
│ │ │ │ │ ├── DownloadListener.java
│ │ │ │ │ ├── HavenoKeyChainFactory.java
│ │ │ │ │ ├── HavenoKeyChainGroupStructure.java
│ │ │ │ │ ├── MoneroWalletRpcManager.java
│ │ │ │ │ ├── RegTestHost.java
│ │ │ │ │ ├── WalletConfig.java
│ │ │ │ │ └── WalletsSetup.java
│ │ │ │ └── wallet/
│ │ │ │ ├── BtcCoinSelector.java
│ │ │ │ ├── BtcWalletService.java
│ │ │ │ ├── HavenoDefaultCoinSelector.java
│ │ │ │ ├── HavenoRiskAnalysis.java
│ │ │ │ ├── NonBsqCoinSelector.java
│ │ │ │ ├── Restrictions.java
│ │ │ │ ├── TradeWalletService.java
│ │ │ │ ├── WalletService.java
│ │ │ │ ├── WalletsManager.java
│ │ │ │ ├── XmrWalletBase.java
│ │ │ │ └── XmrWalletService.java
│ │ │ └── resources/
│ │ │ ├── bip39_english.txt
│ │ │ ├── haveno.policy
│ │ │ ├── haveno.properties
│ │ │ ├── help/
│ │ │ │ ├── canceloffer-help.txt
│ │ │ │ ├── confirmpaymentreceived-help.txt
│ │ │ │ ├── confirmpaymentstarted-help.txt
│ │ │ │ ├── createoffer-help.txt
│ │ │ │ ├── createpaymentacct-help.txt
│ │ │ │ ├── getaddressbalance-help.txt
│ │ │ │ ├── getbalance-help.txt
│ │ │ │ ├── getfundingaddresses-help.txt
│ │ │ │ ├── getmyoffer-help.txt
│ │ │ │ ├── getmyoffers-help.txt
│ │ │ │ ├── getoffer-help.txt
│ │ │ │ ├── getoffers-help.txt
│ │ │ │ ├── getpaymentacctform-help.txt
│ │ │ │ ├── getpaymentaccts-help.txt
│ │ │ │ ├── getpaymentmethods-help.txt
│ │ │ │ ├── gettrade-help.txt
│ │ │ │ ├── gettransaction-help.txt
│ │ │ │ ├── gettxfeerate-help.txt
│ │ │ │ ├── getversion-help.txt
│ │ │ │ ├── getxmrprice-help.txt
│ │ │ │ ├── keepfunds-help.txt
│ │ │ │ ├── lockwallet-help.txt
│ │ │ │ ├── removewalletpassword-help.txt
│ │ │ │ ├── sendxmr-help.txt
│ │ │ │ ├── settxfeerate-help.txt
│ │ │ │ ├── setwalletpassword-help.txt
│ │ │ │ ├── stop-help.txt
│ │ │ │ ├── takeoffer-help.txt
│ │ │ │ ├── unlockwallet-help.txt
│ │ │ │ ├── unsettxfeerate-help.txt
│ │ │ │ └── withdrawfunds-help.txt
│ │ │ ├── i18n/
│ │ │ │ ├── displayStrings.properties
│ │ │ │ ├── displayStrings_cs.properties
│ │ │ │ ├── displayStrings_de.properties
│ │ │ │ ├── displayStrings_es.properties
│ │ │ │ ├── displayStrings_fa.properties
│ │ │ │ ├── displayStrings_fr.properties
│ │ │ │ ├── displayStrings_it.properties
│ │ │ │ ├── displayStrings_ja.properties
│ │ │ │ ├── displayStrings_pt-br.properties
│ │ │ │ ├── displayStrings_pt.properties
│ │ │ │ ├── displayStrings_ru.properties
│ │ │ │ ├── displayStrings_th.properties
│ │ │ │ ├── displayStrings_tr.properties
│ │ │ │ ├── displayStrings_vi.properties
│ │ │ │ ├── displayStrings_zh-hans.properties
│ │ │ │ └── displayStrings_zh-hant.properties
│ │ │ ├── prevent-app-nap-silent-sound.aiff
│ │ │ ├── wallet/
│ │ │ │ ├── checkpoints.testnet.txt
│ │ │ │ └── checkpoints.txt
│ │ │ ├── xmr_local.seednodes
│ │ │ ├── xmr_mainnet.seednodes
│ │ │ └── xmr_stagenet.seednodes
│ │ └── test/
│ │ ├── java/
│ │ │ └── haveno/
│ │ │ └── core/
│ │ │ ├── account/
│ │ │ │ ├── sign/
│ │ │ │ │ ├── SignedWitnessServiceTest.java
│ │ │ │ │ └── SignedWitnessTest.java
│ │ │ │ └── witness/
│ │ │ │ └── AccountAgeWitnessServiceTest.java
│ │ │ ├── app/
│ │ │ │ └── HavenoHelpFormatterTest.java
│ │ │ ├── arbitration/
│ │ │ │ ├── ArbitratorManagerTest.java
│ │ │ │ ├── ArbitratorTest.java
│ │ │ │ ├── MediatorTest.java
│ │ │ │ └── TraderDataItemTest.java
│ │ │ ├── crypto/
│ │ │ │ ├── EncryptionTest.java
│ │ │ │ └── SigTest.java
│ │ │ ├── locale/
│ │ │ │ ├── BankUtilTest.java
│ │ │ │ ├── CurrencyUtilTest.java
│ │ │ │ └── MockTestnetCoin.java
│ │ │ ├── message/
│ │ │ │ └── MarshallerTest.java
│ │ │ ├── monetary/
│ │ │ │ └── PriceTest.java
│ │ │ ├── network/
│ │ │ │ └── p2p/
│ │ │ │ └── seed/
│ │ │ │ └── DefaultSeedNodeRepositoryTest.java
│ │ │ ├── notifications/
│ │ │ │ └── MobileModelTest.java
│ │ │ ├── offer/
│ │ │ │ ├── OfferMaker.java
│ │ │ │ ├── OfferTest.java
│ │ │ │ ├── OpenOfferManagerTest.java
│ │ │ │ └── availability/
│ │ │ │ └── ArbitratorSelectionTest.java
│ │ │ ├── payment/
│ │ │ │ ├── PaymentAccountsTest.java
│ │ │ │ ├── ReceiptPredicatesTest.java
│ │ │ │ ├── ReceiptValidatorTest.java
│ │ │ │ ├── TradeLimitsTest.java
│ │ │ │ └── validation/
│ │ │ │ └── CryptoAddressValidatorTest.java
│ │ │ ├── provider/
│ │ │ │ └── price/
│ │ │ │ └── MarketPriceFeedServiceTest.java
│ │ │ ├── support/
│ │ │ │ └── dispute/
│ │ │ │ └── mediation/
│ │ │ │ └── FileTransferSessionTest.java
│ │ │ ├── trade/
│ │ │ │ └── TradableListTest.java
│ │ │ ├── user/
│ │ │ │ ├── PreferencesTest.java
│ │ │ │ └── UserPayloadModelVOTest.java
│ │ │ ├── util/
│ │ │ │ ├── FormattingUtilsTest.java
│ │ │ │ ├── ProtoUtilTest.java
│ │ │ │ ├── RegexValidatorTest.java
│ │ │ │ └── coin/
│ │ │ │ └── CoinUtilTest.java
│ │ │ └── xmr/
│ │ │ ├── nodes/
│ │ │ │ ├── BtcNetworkConfigTest.java
│ │ │ │ ├── XmrNodeConverterTest.java
│ │ │ │ ├── XmrNodesRepositoryTest.java
│ │ │ │ └── XmrNodesSetupPreferencesTest.java
│ │ │ └── wallet/
│ │ │ └── RestrictionsTest.java
│ │ └── resources/
│ │ ├── haveno/
│ │ │ └── core/
│ │ │ ├── app/
│ │ │ │ ├── cli-output.txt
│ │ │ │ └── cli-output_windows.txt
│ │ │ ├── dao/
│ │ │ │ └── node/
│ │ │ │ └── full/
│ │ │ │ └── rpc/
│ │ │ │ ├── getblock-result-verbosity-0.txt
│ │ │ │ ├── getblock-result-verbosity-1.json
│ │ │ │ ├── getblock-result-verbosity-2.json
│ │ │ │ └── getnetworkinfo-result.json
│ │ │ └── provider/
│ │ │ └── mempool/
│ │ │ ├── badOfferTestData.json
│ │ │ ├── offerTestData.json
│ │ │ └── txInfo.json
│ │ ├── mainnet.seednodes
│ │ ├── mockito-extensions/
│ │ │ └── org.mockito.plugins.MockMaker
│ │ ├── regtest.seednodes
│ │ └── testnet.seednodes
│ └── update_translations.sh
├── daemon/
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── haveno/
│ │ │ └── daemon/
│ │ │ ├── app/
│ │ │ │ ├── HavenoDaemon.java
│ │ │ │ └── HavenoDaemonMain.java
│ │ │ └── grpc/
│ │ │ ├── GrpcAccountService.java
│ │ │ ├── GrpcDisputeAgentsService.java
│ │ │ ├── GrpcDisputesService.java
│ │ │ ├── GrpcErrorMessageHandler.java
│ │ │ ├── GrpcExceptionHandler.java
│ │ │ ├── GrpcGetTradeStatisticsService.java
│ │ │ ├── GrpcHelpService.java
│ │ │ ├── GrpcNotificationsService.java
│ │ │ ├── GrpcOffersService.java
│ │ │ ├── GrpcPaymentAccountsService.java
│ │ │ ├── GrpcPriceService.java
│ │ │ ├── GrpcServer.java
│ │ │ ├── GrpcShutdownService.java
│ │ │ ├── GrpcTradesService.java
│ │ │ ├── GrpcVersionService.java
│ │ │ ├── GrpcWalletsService.java
│ │ │ ├── GrpcXmrConnectionService.java
│ │ │ ├── GrpcXmrNodeService.java
│ │ │ └── interceptor/
│ │ │ ├── CallRateMeteringInterceptor.java
│ │ │ ├── GrpcCallRateMeter.java
│ │ │ ├── GrpcServiceRateMeteringConfig.java
│ │ │ └── PasswordAuthInterceptor.java
│ │ └── resources/
│ │ └── logback.xml
│ └── test/
│ └── java/
│ └── haveno/
│ └── daemon/
│ └── grpc/
│ └── interceptor/
│ └── GrpcServiceRateMeteringConfigTest.java
├── desktop/
│ ├── package/
│ │ ├── 29CDFD3B.asc
│ │ ├── 5BC5ED73.asc
│ │ ├── F379A1C6.asc
│ │ ├── README.md
│ │ ├── linux/
│ │ │ ├── Dockerfile
│ │ │ ├── Haveno.desktop
│ │ │ ├── exchange.haveno.Haveno.metainfo.xml
│ │ │ ├── exchange.haveno.Haveno.yml
│ │ │ └── jpackage.deb/
│ │ │ └── Haveno.desktop
│ │ ├── macosx/
│ │ │ ├── Haveno-volume.icns
│ │ │ ├── Haveno.icns
│ │ │ ├── Info.plist
│ │ │ ├── copy_dbs.sh
│ │ │ ├── finalize.sh
│ │ │ ├── insert_snapshot_version.sh
│ │ │ ├── macos.entitlements
│ │ │ └── replace_version_number.sh
│ │ ├── package.gradle
│ │ ├── signingkey.asc
│ │ ├── tools-1.0.jar
│ │ └── windows/
│ │ ├── main.wxs
│ │ └── overrides.wxi
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── haveno/
│ │ │ └── desktop/
│ │ │ ├── CandleStickChart.css
│ │ │ ├── DesktopModule.java
│ │ │ ├── Navigation.java
│ │ │ ├── app/
│ │ │ │ ├── HavenoApp.java
│ │ │ │ ├── HavenoAppMain.java
│ │ │ │ └── HavenoAppModule.java
│ │ │ ├── common/
│ │ │ │ ├── UITimer.java
│ │ │ │ ├── ViewfxException.java
│ │ │ │ ├── fxml/
│ │ │ │ │ └── FxmlViewLoader.java
│ │ │ │ ├── model/
│ │ │ │ │ ├── Activatable.java
│ │ │ │ │ ├── ActivatableDataModel.java
│ │ │ │ │ ├── ActivatableViewModel.java
│ │ │ │ │ ├── ActivatableWithDataModel.java
│ │ │ │ │ ├── DataModel.java
│ │ │ │ │ ├── Model.java
│ │ │ │ │ ├── ViewModel.java
│ │ │ │ │ └── WithDataModel.java
│ │ │ │ └── view/
│ │ │ │ ├── AbstractView.java
│ │ │ │ ├── ActivatableView.java
│ │ │ │ ├── ActivatableViewAndModel.java
│ │ │ │ ├── CachingViewLoader.java
│ │ │ │ ├── DefaultPathConvention.java
│ │ │ │ ├── FxmlView.java
│ │ │ │ ├── InitializableView.java
│ │ │ │ ├── View.java
│ │ │ │ ├── ViewFactory.java
│ │ │ │ ├── ViewLoader.java
│ │ │ │ ├── ViewPath.java
│ │ │ │ └── guice/
│ │ │ │ └── InjectorViewFactory.java
│ │ │ ├── components/
│ │ │ │ ├── AccountStatusTooltipLabel.java
│ │ │ │ ├── AddressTextField.java
│ │ │ │ ├── AddressWithIconAndDirection.java
│ │ │ │ ├── AutoTooltipButton.java
│ │ │ │ ├── AutoTooltipCheckBox.java
│ │ │ │ ├── AutoTooltipLabel.java
│ │ │ │ ├── AutoTooltipRadioButton.java
│ │ │ │ ├── AutoTooltipSlideToggleButton.java
│ │ │ │ ├── AutoTooltipTableColumn.java
│ │ │ │ ├── AutoTooltipTextField.java
│ │ │ │ ├── AutoTooltipToggleButton.java
│ │ │ │ ├── AutocompleteComboBox.java
│ │ │ │ ├── BalanceTextField.java
│ │ │ │ ├── BusyAnimation.java
│ │ │ │ ├── ColoredDecimalPlacesWithZerosText.java
│ │ │ │ ├── ExplorerAddressTextField.java
│ │ │ │ ├── ExternalHyperlink.java
│ │ │ │ ├── FundsTextField.java
│ │ │ │ ├── HavenoTextArea.java
│ │ │ │ ├── HavenoTextField.java
│ │ │ │ ├── HyperlinkWithIcon.java
│ │ │ │ ├── InfoAutoTooltipLabel.java
│ │ │ │ ├── InfoDisplay.java
│ │ │ │ ├── InfoInputTextField.java
│ │ │ │ ├── InfoTextField.java
│ │ │ │ ├── InputTextArea.java
│ │ │ │ ├── InputTextField.java
│ │ │ │ ├── JFXRadioButtonSkinHavenoStyle.java
│ │ │ │ ├── JFXTextAreaSkinHavenoStyle.java
│ │ │ │ ├── JFXTextFieldSkinHavenoStyle.java
│ │ │ │ ├── MenuItem.java
│ │ │ │ ├── NewBadge.java
│ │ │ │ ├── PasswordTextField.java
│ │ │ │ ├── PeerInfoIcon.java
│ │ │ │ ├── PeerInfoIconDispute.java
│ │ │ │ ├── PeerInfoIconMap.java
│ │ │ │ ├── PeerInfoIconSmall.java
│ │ │ │ ├── PeerInfoIconTrading.java
│ │ │ │ ├── PopOverWrapper.java
│ │ │ │ ├── SimpleMarkdownLabel.java
│ │ │ │ ├── TableGroupHeadline.java
│ │ │ │ ├── TextFieldWithCopyIcon.java
│ │ │ │ ├── TextFieldWithIcon.java
│ │ │ │ ├── TitledGroupBg.java
│ │ │ │ ├── TooltipUtil.java
│ │ │ │ ├── TxIdTextField.java
│ │ │ │ ├── chart/
│ │ │ │ │ ├── ChartDataModel.java
│ │ │ │ │ ├── ChartView.java
│ │ │ │ │ ├── ChartViewModel.java
│ │ │ │ │ └── TemporalAdjusterModel.java
│ │ │ │ ├── controlsfx/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── control/
│ │ │ │ │ │ ├── PopOver.java
│ │ │ │ │ │ └── popover.css
│ │ │ │ │ └── skin/
│ │ │ │ │ └── PopOverSkin.java
│ │ │ │ ├── indicator/
│ │ │ │ │ ├── TxConfidenceIndicator.java
│ │ │ │ │ └── skin/
│ │ │ │ │ └── StaticProgressIndicatorSkin.java
│ │ │ │ ├── list/
│ │ │ │ │ └── FilterBox.java
│ │ │ │ └── paymentmethods/
│ │ │ │ ├── AchTransferForm.java
│ │ │ │ ├── AdvancedCashForm.java
│ │ │ │ ├── AliPayForm.java
│ │ │ │ ├── AmazonGiftCardForm.java
│ │ │ │ ├── AssetsForm.java
│ │ │ │ ├── AustraliaPayidForm.java
│ │ │ │ ├── BankForm.java
│ │ │ │ ├── BizumForm.java
│ │ │ │ ├── CapitualForm.java
│ │ │ │ ├── CashAppForm.java
│ │ │ │ ├── CashAtAtmForm.java
│ │ │ │ ├── CashDepositForm.java
│ │ │ │ ├── CelPayForm.java
│ │ │ │ ├── ChaseQuickPayForm.java
│ │ │ │ ├── DomesticWireTransferForm.java
│ │ │ │ ├── F2FForm.java
│ │ │ │ ├── FasterPaymentsForm.java
│ │ │ │ ├── GeneralAccountNumberForm.java
│ │ │ │ ├── GeneralBankForm.java
│ │ │ │ ├── GeneralSepaForm.java
│ │ │ │ ├── GeneralUsBankForm.java
│ │ │ │ ├── HalCashForm.java
│ │ │ │ ├── IfscBankForm.java
│ │ │ │ ├── ImpsForm.java
│ │ │ │ ├── InteracETransferForm.java
│ │ │ │ ├── JapanBankTransferForm.java
│ │ │ │ ├── MoneseForm.java
│ │ │ │ ├── MoneyBeamForm.java
│ │ │ │ ├── MoneyGramForm.java
│ │ │ │ ├── NationalBankForm.java
│ │ │ │ ├── NeftForm.java
│ │ │ │ ├── NequiForm.java
│ │ │ │ ├── PaxumForm.java
│ │ │ │ ├── PayByMailForm.java
│ │ │ │ ├── PayPalForm.java
│ │ │ │ ├── PaymentMethodForm.java
│ │ │ │ ├── PaysafeForm.java
│ │ │ │ ├── PayseraForm.java
│ │ │ │ ├── PaytmForm.java
│ │ │ │ ├── PerfectMoneyForm.java
│ │ │ │ ├── PixForm.java
│ │ │ │ ├── PopmoneyForm.java
│ │ │ │ ├── PromptPayForm.java
│ │ │ │ ├── RevolutForm.java
│ │ │ │ ├── RtgsForm.java
│ │ │ │ ├── SameBankForm.java
│ │ │ │ ├── SatispayForm.java
│ │ │ │ ├── SepaForm.java
│ │ │ │ ├── SepaInstantForm.java
│ │ │ │ ├── SpecificBankForm.java
│ │ │ │ ├── StrikeForm.java
│ │ │ │ ├── SwiftForm.java
│ │ │ │ ├── SwishForm.java
│ │ │ │ ├── TikkieForm.java
│ │ │ │ ├── TransferwiseForm.java
│ │ │ │ ├── TransferwiseUsdForm.java
│ │ │ │ ├── USPostalMoneyOrderForm.java
│ │ │ │ ├── UpholdForm.java
│ │ │ │ ├── UpiForm.java
│ │ │ │ ├── VenmoForm.java
│ │ │ │ ├── VerseForm.java
│ │ │ │ ├── WeChatPayForm.java
│ │ │ │ ├── WesternUnionForm.java
│ │ │ │ └── ZelleForm.java
│ │ │ ├── haveno.css
│ │ │ ├── images.css
│ │ │ ├── main/
│ │ │ │ ├── MainView.fxml
│ │ │ │ ├── MainView.java
│ │ │ │ ├── MainViewModel.java
│ │ │ │ ├── SharedPresentation.java
│ │ │ │ ├── account/
│ │ │ │ │ ├── AccountView.fxml
│ │ │ │ │ ├── AccountView.java
│ │ │ │ │ ├── content/
│ │ │ │ │ │ ├── PaymentAccountsView.java
│ │ │ │ │ │ ├── backup/
│ │ │ │ │ │ │ ├── BackupView.fxml
│ │ │ │ │ │ │ └── BackupView.java
│ │ │ │ │ │ ├── cryptoaccounts/
│ │ │ │ │ │ │ ├── CryptoAccountsDataModel.java
│ │ │ │ │ │ │ ├── CryptoAccountsView.fxml
│ │ │ │ │ │ │ ├── CryptoAccountsView.java
│ │ │ │ │ │ │ └── CryptoAccountsViewModel.java
│ │ │ │ │ │ ├── notifications/
│ │ │ │ │ │ │ ├── ManageMarketAlertsWindow.java
│ │ │ │ │ │ │ ├── MobileNotificationsView.fxml
│ │ │ │ │ │ │ ├── MobileNotificationsView.java
│ │ │ │ │ │ │ └── NoWebCamFoundException.java
│ │ │ │ │ │ ├── password/
│ │ │ │ │ │ │ ├── PasswordView.fxml
│ │ │ │ │ │ │ └── PasswordView.java
│ │ │ │ │ │ ├── seedwords/
│ │ │ │ │ │ │ ├── SeedWordsView.fxml
│ │ │ │ │ │ │ └── SeedWordsView.java
│ │ │ │ │ │ ├── traditionalaccounts/
│ │ │ │ │ │ │ ├── TraditionalAccountsDataModel.java
│ │ │ │ │ │ │ ├── TraditionalAccountsView.fxml
│ │ │ │ │ │ │ ├── TraditionalAccountsView.java
│ │ │ │ │ │ │ └── TraditionalAccountsViewModel.java
│ │ │ │ │ │ └── walletinfo/
│ │ │ │ │ │ ├── WalletInfoView.fxml
│ │ │ │ │ │ └── WalletInfoView.java
│ │ │ │ │ └── register/
│ │ │ │ │ ├── AgentRegistrationView.java
│ │ │ │ │ ├── AgentRegistrationViewModel.java
│ │ │ │ │ ├── arbitrator/
│ │ │ │ │ │ ├── ArbitratorRegistrationView.fxml
│ │ │ │ │ │ ├── ArbitratorRegistrationView.java
│ │ │ │ │ │ └── ArbitratorRegistrationViewModel.java
│ │ │ │ │ ├── mediator/
│ │ │ │ │ │ ├── MediatorRegistrationView.fxml
│ │ │ │ │ │ ├── MediatorRegistrationView.java
│ │ │ │ │ │ └── MediatorRegistrationViewModel.java
│ │ │ │ │ ├── refundagent/
│ │ │ │ │ │ ├── RefundAgentRegistrationView.fxml
│ │ │ │ │ │ ├── RefundAgentRegistrationView.java
│ │ │ │ │ │ └── RefundAgentRegistrationViewModel.java
│ │ │ │ │ └── signing/
│ │ │ │ │ ├── SigningView.fxml
│ │ │ │ │ └── SigningView.java
│ │ │ │ ├── debug/
│ │ │ │ │ ├── DebugView.fxml
│ │ │ │ │ └── DebugView.java
│ │ │ │ ├── funds/
│ │ │ │ │ ├── FundsView.fxml
│ │ │ │ │ ├── FundsView.java
│ │ │ │ │ ├── deposit/
│ │ │ │ │ │ ├── DepositListItem.java
│ │ │ │ │ │ ├── DepositView.fxml
│ │ │ │ │ │ └── DepositView.java
│ │ │ │ │ ├── locked/
│ │ │ │ │ │ ├── LockedListItem.java
│ │ │ │ │ │ ├── LockedView.fxml
│ │ │ │ │ │ └── LockedView.java
│ │ │ │ │ ├── reserved/
│ │ │ │ │ │ ├── ReservedListItem.java
│ │ │ │ │ │ ├── ReservedView.fxml
│ │ │ │ │ │ └── ReservedView.java
│ │ │ │ │ ├── transactions/
│ │ │ │ │ │ ├── DisplayedTransactions.java
│ │ │ │ │ │ ├── DisplayedTransactionsFactory.java
│ │ │ │ │ │ ├── DummyTransactionAwareTradable.java
│ │ │ │ │ │ ├── ObservableListDecorator.java
│ │ │ │ │ │ ├── TradableRepository.java
│ │ │ │ │ │ ├── TransactionAwareOpenOffer.java
│ │ │ │ │ │ ├── TransactionAwareTradable.java
│ │ │ │ │ │ ├── TransactionAwareTradableFactory.java
│ │ │ │ │ │ ├── TransactionAwareTrade.java
│ │ │ │ │ │ ├── TransactionListItemFactory.java
│ │ │ │ │ │ ├── TransactionsListItem.java
│ │ │ │ │ │ ├── TransactionsView.fxml
│ │ │ │ │ │ └── TransactionsView.java
│ │ │ │ │ └── withdrawal/
│ │ │ │ │ ├── WithdrawalListItem.java
│ │ │ │ │ ├── WithdrawalView.fxml
│ │ │ │ │ └── WithdrawalView.java
│ │ │ │ ├── market/
│ │ │ │ │ ├── MarketView.fxml
│ │ │ │ │ ├── MarketView.java
│ │ │ │ │ ├── offerbook/
│ │ │ │ │ │ ├── OfferBookChartView.fxml
│ │ │ │ │ │ ├── OfferBookChartView.java
│ │ │ │ │ │ ├── OfferBookChartViewModel.java
│ │ │ │ │ │ └── OfferListItem.java
│ │ │ │ │ ├── spread/
│ │ │ │ │ │ ├── SpreadItem.java
│ │ │ │ │ │ ├── SpreadView.fxml
│ │ │ │ │ │ ├── SpreadView.java
│ │ │ │ │ │ ├── SpreadViewModel.java
│ │ │ │ │ │ ├── SpreadViewPaymentMethod.fxml
│ │ │ │ │ │ └── SpreadViewPaymentMethod.java
│ │ │ │ │ └── trades/
│ │ │ │ │ ├── ChartCalculations.java
│ │ │ │ │ ├── TradeStatistics3ListItem.java
│ │ │ │ │ ├── TradesChartsView.fxml
│ │ │ │ │ ├── TradesChartsView.java
│ │ │ │ │ ├── TradesChartsViewModel.java
│ │ │ │ │ └── charts/
│ │ │ │ │ ├── CandleData.java
│ │ │ │ │ ├── price/
│ │ │ │ │ │ ├── Candle.java
│ │ │ │ │ │ ├── CandleStickChart.java
│ │ │ │ │ │ └── CandleTooltip.java
│ │ │ │ │ └── volume/
│ │ │ │ │ ├── VolumeBar.java
│ │ │ │ │ └── VolumeChart.java
│ │ │ │ ├── offer/
│ │ │ │ │ ├── BuyOfferView.fxml
│ │ │ │ │ ├── BuyOfferView.java
│ │ │ │ │ ├── ClosableView.java
│ │ │ │ │ ├── InitializableViewWithTakeOfferData.java
│ │ │ │ │ ├── MutableOfferDataModel.java
│ │ │ │ │ ├── MutableOfferView.java
│ │ │ │ │ ├── MutableOfferViewModel.java
│ │ │ │ │ ├── OfferDataModel.java
│ │ │ │ │ ├── OfferView.java
│ │ │ │ │ ├── OfferViewModelUtil.java
│ │ │ │ │ ├── OfferViewUtil.java
│ │ │ │ │ ├── SelectableView.java
│ │ │ │ │ ├── SellOfferView.fxml
│ │ │ │ │ ├── SellOfferView.java
│ │ │ │ │ ├── createoffer/
│ │ │ │ │ │ ├── CreateOfferDataModel.java
│ │ │ │ │ │ ├── CreateOfferView.fxml
│ │ │ │ │ │ ├── CreateOfferView.java
│ │ │ │ │ │ └── CreateOfferViewModel.java
│ │ │ │ │ ├── offerbook/
│ │ │ │ │ │ ├── CryptoOfferBookView.fxml
│ │ │ │ │ │ ├── CryptoOfferBookView.java
│ │ │ │ │ │ ├── CryptoOfferBookViewModel.java
│ │ │ │ │ │ ├── FiatOfferBookView.fxml
│ │ │ │ │ │ ├── FiatOfferBookView.java
│ │ │ │ │ │ ├── FiatOfferBookViewModel.java
│ │ │ │ │ │ ├── OfferBook.java
│ │ │ │ │ │ ├── OfferBookListItem.java
│ │ │ │ │ │ ├── OfferBookView.fxml
│ │ │ │ │ │ ├── OfferBookView.java
│ │ │ │ │ │ ├── OfferBookViewModel.java
│ │ │ │ │ │ ├── OtherOfferBookView.fxml
│ │ │ │ │ │ ├── OtherOfferBookView.java
│ │ │ │ │ │ └── OtherOfferBookViewModel.java
│ │ │ │ │ ├── signedoffer/
│ │ │ │ │ │ ├── SignedOfferListItem.java
│ │ │ │ │ │ ├── SignedOfferView.fxml
│ │ │ │ │ │ ├── SignedOfferView.java
│ │ │ │ │ │ ├── SignedOffersDataModel.java
│ │ │ │ │ │ └── SignedOffersViewModel.java
│ │ │ │ │ └── takeoffer/
│ │ │ │ │ ├── TakeOfferDataModel.java
│ │ │ │ │ ├── TakeOfferView.fxml
│ │ │ │ │ ├── TakeOfferView.java
│ │ │ │ │ └── TakeOfferViewModel.java
│ │ │ │ ├── overlays/
│ │ │ │ │ ├── Overlay.java
│ │ │ │ │ ├── TabbedOverlay.java
│ │ │ │ │ ├── editor/
│ │ │ │ │ │ ├── PasswordPopup.java
│ │ │ │ │ │ └── PeerInfoWithTagEditor.java
│ │ │ │ │ ├── notifications/
│ │ │ │ │ │ ├── Notification.java
│ │ │ │ │ │ ├── NotificationCenter.java
│ │ │ │ │ │ └── NotificationManager.java
│ │ │ │ │ ├── popups/
│ │ │ │ │ │ ├── Popup.java
│ │ │ │ │ │ └── PopupManager.java
│ │ │ │ │ └── windows/
│ │ │ │ │ ├── ClosedTradesSummaryWindow.java
│ │ │ │ │ ├── ContractWindow.java
│ │ │ │ │ ├── DisplayAlertMessageWindow.java
│ │ │ │ │ ├── DisputeSummaryWindow.java
│ │ │ │ │ ├── EditCustomExplorerWindow.java
│ │ │ │ │ ├── FilterWindow.java
│ │ │ │ │ ├── GenericMessageWindow.java
│ │ │ │ │ ├── OfferDetailsWindow.java
│ │ │ │ │ ├── QRCodeWindow.java
│ │ │ │ │ ├── SelectDepositTxWindow.java
│ │ │ │ │ ├── SendAlertMessageWindow.java
│ │ │ │ │ ├── SendLogFilesWindow.java
│ │ │ │ │ ├── SendPrivateNotificationWindow.java
│ │ │ │ │ ├── ShowWalletDataWindow.java
│ │ │ │ │ ├── SignPaymentAccountsWindow.java
│ │ │ │ │ ├── SignSpecificWitnessWindow.java
│ │ │ │ │ ├── SignUnsignedPubKeysWindow.java
│ │ │ │ │ ├── SwiftPaymentDetails.java
│ │ │ │ │ ├── TacWindow.java
│ │ │ │ │ ├── TorNetworkSettingsWindow.java
│ │ │ │ │ ├── TradeDetailsWindow.java
│ │ │ │ │ ├── TradeFeedbackWindow.java
│ │ │ │ │ ├── TxDetailsWindow.java
│ │ │ │ │ ├── TxWithdrawWindow.java
│ │ │ │ │ ├── UnlockDisputeAgentRegistrationWindow.java
│ │ │ │ │ ├── UpdateAmazonGiftCardAccountWindow.java
│ │ │ │ │ ├── UpdateRevolutAccountWindow.java
│ │ │ │ │ ├── VerifyDisputeResultSignatureWindow.java
│ │ │ │ │ ├── WalletPasswordWindow.java
│ │ │ │ │ ├── WebCamWindow.java
│ │ │ │ │ └── downloadupdate/
│ │ │ │ │ ├── DisplayUpdateDownloadWindow.java
│ │ │ │ │ ├── DownloadTask.java
│ │ │ │ │ ├── HavenoInstaller.java
│ │ │ │ │ └── VerifyTask.java
│ │ │ │ ├── portfolio/
│ │ │ │ │ ├── PortfolioView.fxml
│ │ │ │ │ ├── PortfolioView.java
│ │ │ │ │ ├── cloneoffer/
│ │ │ │ │ │ ├── CloneOfferDataModel.java
│ │ │ │ │ │ ├── CloneOfferView.fxml
│ │ │ │ │ │ ├── CloneOfferView.java
│ │ │ │ │ │ └── CloneOfferViewModel.java
│ │ │ │ │ ├── closedtrades/
│ │ │ │ │ │ ├── ClosedTradableListItem.java
│ │ │ │ │ │ ├── ClosedTradesDataModel.java
│ │ │ │ │ │ ├── ClosedTradesListItem.java
│ │ │ │ │ │ ├── ClosedTradesView.fxml
│ │ │ │ │ │ ├── ClosedTradesView.java
│ │ │ │ │ │ └── ClosedTradesViewModel.java
│ │ │ │ │ ├── duplicateoffer/
│ │ │ │ │ │ ├── DuplicateOfferDataModel.java
│ │ │ │ │ │ ├── DuplicateOfferView.fxml
│ │ │ │ │ │ ├── DuplicateOfferView.java
│ │ │ │ │ │ └── DuplicateOfferViewModel.java
│ │ │ │ │ ├── editoffer/
│ │ │ │ │ │ ├── EditOfferDataModel.java
│ │ │ │ │ │ ├── EditOfferView.fxml
│ │ │ │ │ │ ├── EditOfferView.java
│ │ │ │ │ │ └── EditOfferViewModel.java
│ │ │ │ │ ├── failedtrades/
│ │ │ │ │ │ ├── FailedTradesDataModel.java
│ │ │ │ │ │ ├── FailedTradesListItem.java
│ │ │ │ │ │ ├── FailedTradesView.fxml
│ │ │ │ │ │ ├── FailedTradesView.java
│ │ │ │ │ │ └── FailedTradesViewModel.java
│ │ │ │ │ ├── openoffer/
│ │ │ │ │ │ ├── OpenOfferListItem.java
│ │ │ │ │ │ ├── OpenOffersDataModel.java
│ │ │ │ │ │ ├── OpenOffersView.fxml
│ │ │ │ │ │ ├── OpenOffersView.java
│ │ │ │ │ │ └── OpenOffersViewModel.java
│ │ │ │ │ ├── pendingtrades/
│ │ │ │ │ │ ├── BuyerSubView.java
│ │ │ │ │ │ ├── PendingTradesDataModel.java
│ │ │ │ │ │ ├── PendingTradesListItem.java
│ │ │ │ │ │ ├── PendingTradesView.fxml
│ │ │ │ │ │ ├── PendingTradesView.java
│ │ │ │ │ │ ├── PendingTradesViewModel.java
│ │ │ │ │ │ ├── SellerSubView.java
│ │ │ │ │ │ ├── TradeStepInfo.java
│ │ │ │ │ │ ├── TradeSubView.java
│ │ │ │ │ │ └── steps/
│ │ │ │ │ │ ├── TradeStepView.java
│ │ │ │ │ │ ├── TradeWizardItem.java
│ │ │ │ │ │ ├── buyer/
│ │ │ │ │ │ │ ├── BuyerStep1View.java
│ │ │ │ │ │ │ ├── BuyerStep2View.java
│ │ │ │ │ │ │ ├── BuyerStep3View.java
│ │ │ │ │ │ │ └── BuyerStep4View.java
│ │ │ │ │ │ └── seller/
│ │ │ │ │ │ ├── SellerStep1View.java
│ │ │ │ │ │ ├── SellerStep2View.java
│ │ │ │ │ │ ├── SellerStep3View.java
│ │ │ │ │ │ └── SellerStep4View.java
│ │ │ │ │ └── presentation/
│ │ │ │ │ └── PortfolioUtil.java
│ │ │ │ ├── presentation/
│ │ │ │ │ ├── AccountPresentation.java
│ │ │ │ │ ├── MarketPricePresentation.java
│ │ │ │ │ └── SettingsPresentation.java
│ │ │ │ ├── settings/
│ │ │ │ │ ├── SettingsView.fxml
│ │ │ │ │ ├── SettingsView.java
│ │ │ │ │ ├── about/
│ │ │ │ │ │ ├── AboutView.fxml
│ │ │ │ │ │ └── AboutView.java
│ │ │ │ │ ├── network/
│ │ │ │ │ │ ├── MoneroNetworkListItem.java
│ │ │ │ │ │ ├── NetworkSettingsView.fxml
│ │ │ │ │ │ ├── NetworkSettingsView.java
│ │ │ │ │ │ └── P2pNetworkListItem.java
│ │ │ │ │ └── preferences/
│ │ │ │ │ ├── PreferencesView.fxml
│ │ │ │ │ ├── PreferencesView.java
│ │ │ │ │ └── PreferencesViewModel.java
│ │ │ │ ├── shared/
│ │ │ │ │ ├── ChatView.java
│ │ │ │ │ └── PriceFeedComboBoxItem.java
│ │ │ │ └── support/
│ │ │ │ ├── SupportView.fxml
│ │ │ │ ├── SupportView.java
│ │ │ │ └── dispute/
│ │ │ │ ├── DisputeChatPopup.java
│ │ │ │ ├── DisputeView.java
│ │ │ │ ├── agent/
│ │ │ │ │ ├── DisputeAgentView.java
│ │ │ │ │ ├── arbitration/
│ │ │ │ │ │ ├── ArbitratorView.fxml
│ │ │ │ │ │ └── ArbitratorView.java
│ │ │ │ │ ├── mediation/
│ │ │ │ │ │ ├── MediatorView.fxml
│ │ │ │ │ │ └── MediatorView.java
│ │ │ │ │ └── refund/
│ │ │ │ │ ├── RefundAgentView.fxml
│ │ │ │ │ └── RefundAgentView.java
│ │ │ │ └── client/
│ │ │ │ ├── DisputeClientView.java
│ │ │ │ ├── arbitration/
│ │ │ │ │ ├── ArbitrationClientView.fxml
│ │ │ │ │ └── ArbitrationClientView.java
│ │ │ │ ├── mediation/
│ │ │ │ │ ├── MediationClientView.fxml
│ │ │ │ │ └── MediationClientView.java
│ │ │ │ └── refund/
│ │ │ │ ├── RefundClientView.fxml
│ │ │ │ └── RefundClientView.java
│ │ │ ├── setup/
│ │ │ │ └── DesktopPersistedDataHost.java
│ │ │ ├── theme-dark.css
│ │ │ ├── theme-dev.css
│ │ │ ├── theme-light.css
│ │ │ └── util/
│ │ │ ├── AxisInlierUtils.java
│ │ │ ├── Colors.java
│ │ │ ├── CssTheme.java
│ │ │ ├── CurrencyList.java
│ │ │ ├── CurrencyListItem.java
│ │ │ ├── CurrencyPredicates.java
│ │ │ ├── DisplayUtils.java
│ │ │ ├── FormBuilder.java
│ │ │ ├── GUIProfiler.java
│ │ │ ├── GUIUtil.java
│ │ │ ├── ImageUtil.java
│ │ │ ├── Layout.java
│ │ │ ├── MovingAverageUtils.java
│ │ │ ├── Transitions.java
│ │ │ ├── filtering/
│ │ │ │ ├── FilterableListItem.java
│ │ │ │ └── FilteringUtils.java
│ │ │ ├── normalization/
│ │ │ │ └── IBANNormalizer.java
│ │ │ └── validation/
│ │ │ ├── JFXInputValidator.java
│ │ │ └── PasswordValidator.java
│ │ └── resources/
│ │ ├── fonts/
│ │ │ └── OFL.txt
│ │ ├── keys/
│ │ │ ├── 29CDFD3B.asc
│ │ │ ├── 5BC5ED73.asc
│ │ │ └── F379A1C6.asc
│ │ └── logback.xml
│ └── test/
│ ├── java/
│ │ ├── haveno/
│ │ │ └── desktop/
│ │ │ ├── AwesomeFontDemo.java
│ │ │ ├── AwesomeFontDemoLauncher.java
│ │ │ ├── BindingTest.java
│ │ │ ├── ComponentsDemo.java
│ │ │ ├── ComponentsDemoLauncher.java
│ │ │ ├── GuiceSetupTest.java
│ │ │ ├── MarketsPrintTool.java
│ │ │ ├── MaterialDesignIconDemo.java
│ │ │ ├── MaterialDesignIconDemoLauncher.java
│ │ │ ├── common/
│ │ │ │ ├── fxml/
│ │ │ │ │ ├── FxmlViewLoaderTests$Malformed.fxml
│ │ │ │ │ ├── FxmlViewLoaderTests$MissingFxController.fxml
│ │ │ │ │ ├── FxmlViewLoaderTests$MissingFxmlViewAnnotation.fxml
│ │ │ │ │ ├── FxmlViewLoaderTests$WellFormed.fxml
│ │ │ │ │ └── FxmlViewLoaderTests.java
│ │ │ │ └── support/
│ │ │ │ └── CachingViewLoaderTests.java
│ │ │ ├── components/
│ │ │ │ └── ColoredDecimalPlacesWithZerosTextTest.java
│ │ │ ├── main/
│ │ │ │ ├── funds/
│ │ │ │ │ └── transactions/
│ │ │ │ │ ├── DisplayedTransactionsTest.java
│ │ │ │ │ ├── ObservableListDecoratorTest.java
│ │ │ │ │ ├── TransactionAwareTradableFactoryTest.java
│ │ │ │ │ └── TransactionAwareTradeTest.java
│ │ │ │ ├── market/
│ │ │ │ │ ├── offerbook/
│ │ │ │ │ │ └── OfferBookChartViewModelTest.java
│ │ │ │ │ ├── spread/
│ │ │ │ │ │ └── SpreadViewModelTest.java
│ │ │ │ │ └── trades/
│ │ │ │ │ └── TradesChartsViewModelTest.java
│ │ │ │ ├── offer/
│ │ │ │ │ ├── createoffer/
│ │ │ │ │ │ ├── CreateOfferDataModelTest.java
│ │ │ │ │ │ └── CreateOfferViewModelTest.java
│ │ │ │ │ └── offerbook/
│ │ │ │ │ ├── OfferBookListItemMaker.java
│ │ │ │ │ └── OfferBookViewModelTest.java
│ │ │ │ ├── overlays/
│ │ │ │ │ ├── OverlayTest.java
│ │ │ │ │ └── windows/
│ │ │ │ │ └── downloadupdate/
│ │ │ │ │ ├── HavenoInstallerTest.java
│ │ │ │ │ └── VerifyTaskTest.java
│ │ │ │ └── settings/
│ │ │ │ └── preferences/
│ │ │ │ └── PreferencesViewModelTest.java
│ │ │ ├── maker/
│ │ │ │ ├── CurrencyListItemMakers.java
│ │ │ │ ├── OfferMaker.java
│ │ │ │ ├── PreferenceMakers.java
│ │ │ │ ├── PriceMaker.java
│ │ │ │ ├── TradeCurrencyMakers.java
│ │ │ │ └── VolumeMaker.java
│ │ │ └── util/
│ │ │ ├── CurrencyListTest.java
│ │ │ ├── DisplayUtilsTest.java
│ │ │ ├── GUIUtilTest.java
│ │ │ ├── ImmutableCoinFormatterTest.java
│ │ │ ├── MovingAverageUtilsTest.java
│ │ │ └── validation/
│ │ │ ├── AccountNrValidatorTest.java
│ │ │ ├── AdvancedCashValidatorTest.java
│ │ │ ├── BranchIdValidatorTest.java
│ │ │ ├── CapitualValidatorTest.java
│ │ │ ├── FiatVolumeValidatorTest.java
│ │ │ ├── InteracETransferAnswerValidatorTest.java
│ │ │ ├── InteracETransferQuestionValidatorTest.java
│ │ │ ├── InteracETransferValidatorTest.java
│ │ │ ├── LengthValidatorTest.java
│ │ │ ├── NationalAccountIdValidatorTest.java
│ │ │ ├── PhoneNumberValidatorTest.java
│ │ │ ├── RegexValidatorTest.java
│ │ │ └── XmrValidatorTest.java
│ │ └── org/
│ │ └── bitcoinj/
│ │ └── core/
│ │ └── CoinMaker.java
│ └── resources/
│ ├── downloadUpdate/
│ │ ├── F379A1C6.asc
│ │ ├── test.txt
│ │ ├── test.txt.asc
│ │ ├── test_bad.txt
│ │ └── test_bad.txt.asc
│ └── mockito-extensions/
│ └── org.mockito.plugins.MockMaker
├── docs/
│ ├── CONTRIBUTING.md
│ ├── README.md
│ ├── bounties.md
│ ├── create-mainnet.md
│ ├── data-stores.md
│ ├── deployment-guide.md
│ ├── developer-guide.md
│ ├── external-tor-usage.md
│ ├── flatpak.md
│ ├── import-haveno.md
│ ├── installing.md
│ ├── tor-upgrade.md
│ ├── trade_protocol/
│ │ ├── trade-protocol.drawio
│ │ └── trade-protocol.md
│ └── user-guide.md
├── gpg_keys/
│ ├── reto_public.asc
│ └── woodser.asc
├── gradle/
│ ├── README.md
│ ├── verification-metadata.xml
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── inventory/
│ └── src/
│ └── main/
│ └── resources/
│ ├── inv_btc_mainnet.seednodes
│ └── logback.xml
├── monitor/
│ ├── README.md
│ ├── collectd.conf
│ ├── haveno-monitor.service
│ ├── install_collectd_debian.sh
│ ├── nginx.conf
│ ├── src/
│ │ └── main/
│ │ └── resources/
│ │ ├── logback.xml
│ │ └── metrics.properties
│ └── uninstall_collectd_debian.sh
├── p2p/
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── haveno/
│ │ └── network/
│ │ ├── DnsLookupException.java
│ │ ├── DnsLookupTor.java
│ │ ├── Socks5DnsDiscovery.java
│ │ ├── Socks5MultiDiscovery.java
│ │ ├── Socks5ProxyProvider.java
│ │ ├── Socks5SeedOnionDiscovery.java
│ │ ├── crypto/
│ │ │ ├── DecryptedDataTuple.java
│ │ │ ├── EncryptionService.java
│ │ │ └── EncryptionServiceModule.java
│ │ ├── http/
│ │ │ ├── FakeDnsResolver.java
│ │ │ ├── HttpClient.java
│ │ │ ├── HttpClientImpl.java
│ │ │ ├── HttpException.java
│ │ │ ├── HttpMethod.java
│ │ │ ├── SocksConnectionSocketFactory.java
│ │ │ └── SocksSSLConnectionSocketFactory.java
│ │ ├── p2p/
│ │ │ ├── AckMessage.java
│ │ │ ├── AckMessageSourceType.java
│ │ │ ├── AnonymousMessage.java
│ │ │ ├── BootstrapListener.java
│ │ │ ├── BundleOfEnvelopes.java
│ │ │ ├── CloseConnectionMessage.java
│ │ │ ├── DecryptedDirectMessageListener.java
│ │ │ ├── DecryptedMessageWithPubKey.java
│ │ │ ├── DirectMessage.java
│ │ │ ├── ExtendedDataSizePermission.java
│ │ │ ├── FileTransferPart.java
│ │ │ ├── InitialDataRequest.java
│ │ │ ├── InitialDataResponse.java
│ │ │ ├── NetworkNodeProvider.java
│ │ │ ├── NetworkNotReadyException.java
│ │ │ ├── NodeAddress.java
│ │ │ ├── P2PModule.java
│ │ │ ├── P2PService.java
│ │ │ ├── P2PServiceListener.java
│ │ │ ├── PrefixedSealedAndSignedMessage.java
│ │ │ ├── SendDirectMessageListener.java
│ │ │ ├── SendMailboxMessageListener.java
│ │ │ ├── SendersNodeAddressMessage.java
│ │ │ ├── SupportedCapabilitiesMessage.java
│ │ │ ├── UidMessage.java
│ │ │ ├── mailbox/
│ │ │ │ ├── IgnoredMailboxMap.java
│ │ │ │ ├── IgnoredMailboxService.java
│ │ │ │ ├── MailboxItem.java
│ │ │ │ ├── MailboxMessage.java
│ │ │ │ ├── MailboxMessageList.java
│ │ │ │ └── MailboxMessageService.java
│ │ │ ├── messaging/
│ │ │ │ └── DecryptedMailboxListener.java
│ │ │ ├── network/
│ │ │ │ ├── BanFilter.java
│ │ │ │ ├── BridgeAddressProvider.java
│ │ │ │ ├── CloseConnectionReason.java
│ │ │ │ ├── Connection.java
│ │ │ │ ├── ConnectionListener.java
│ │ │ │ ├── ConnectionState.java
│ │ │ │ ├── ConnectionStatistics.java
│ │ │ │ ├── DefaultPluggableTransports.java
│ │ │ │ ├── DirectBindTor.java
│ │ │ │ ├── HavenoRuntimeException.java
│ │ │ │ ├── InboundConnection.java
│ │ │ │ ├── LocalhostNetworkNode.java
│ │ │ │ ├── MessageListener.java
│ │ │ │ ├── NetworkNode.java
│ │ │ │ ├── NewTor.java
│ │ │ │ ├── OutboundConnection.java
│ │ │ │ ├── PeerType.java
│ │ │ │ ├── ProtoOutputStream.java
│ │ │ │ ├── RuleViolation.java
│ │ │ │ ├── RunningTor.java
│ │ │ │ ├── Server.java
│ │ │ │ ├── SetupListener.java
│ │ │ │ ├── Statistic.java
│ │ │ │ ├── SupportedCapabilitiesListener.java
│ │ │ │ ├── TorMode.java
│ │ │ │ ├── TorNetworkNode.java
│ │ │ │ ├── TorNetworkNodeDirectBind.java
│ │ │ │ └── TorNetworkNodeNetlayer.java
│ │ │ ├── peers/
│ │ │ │ ├── BroadcastHandler.java
│ │ │ │ ├── Broadcaster.java
│ │ │ │ ├── PeerManager.java
│ │ │ │ ├── getdata/
│ │ │ │ │ ├── GetDataRequestHandler.java
│ │ │ │ │ ├── RequestDataHandler.java
│ │ │ │ │ ├── RequestDataManager.java
│ │ │ │ │ └── messages/
│ │ │ │ │ ├── GetDataRequest.java
│ │ │ │ │ ├── GetDataResponse.java
│ │ │ │ │ ├── GetUpdatedDataRequest.java
│ │ │ │ │ └── PreliminaryGetDataRequest.java
│ │ │ │ ├── keepalive/
│ │ │ │ │ ├── KeepAliveHandler.java
│ │ │ │ │ ├── KeepAliveManager.java
│ │ │ │ │ └── messages/
│ │ │ │ │ ├── KeepAliveMessage.java
│ │ │ │ │ ├── Ping.java
│ │ │ │ │ └── Pong.java
│ │ │ │ └── peerexchange/
│ │ │ │ ├── GetPeersRequestHandler.java
│ │ │ │ ├── Peer.java
│ │ │ │ ├── PeerExchangeHandler.java
│ │ │ │ ├── PeerExchangeManager.java
│ │ │ │ ├── PeerList.java
│ │ │ │ └── messages/
│ │ │ │ ├── GetPeersRequest.java
│ │ │ │ ├── GetPeersResponse.java
│ │ │ │ └── PeerExchangeMessage.java
│ │ │ ├── seed/
│ │ │ │ └── SeedNodeRepository.java
│ │ │ └── storage/
│ │ │ ├── HashMapChangedListener.java
│ │ │ ├── P2PDataStorage.java
│ │ │ ├── messages/
│ │ │ │ ├── AddDataMessage.java
│ │ │ │ ├── AddOncePayload.java
│ │ │ │ ├── AddPersistableNetworkPayloadMessage.java
│ │ │ │ ├── BroadcastMessage.java
│ │ │ │ ├── RefreshOfferMessage.java
│ │ │ │ ├── RemoveDataMessage.java
│ │ │ │ └── RemoveMailboxDataMessage.java
│ │ │ ├── payload/
│ │ │ │ ├── CapabilityRequiringPayload.java
│ │ │ │ ├── DateSortedTruncatablePayload.java
│ │ │ │ ├── DateTolerantPayload.java
│ │ │ │ ├── ExpirablePayload.java
│ │ │ │ ├── MailboxStoragePayload.java
│ │ │ │ ├── PersistableNetworkPayload.java
│ │ │ │ ├── PersistableProtectedPayload.java
│ │ │ │ ├── ProcessOncePersistableNetworkPayload.java
│ │ │ │ ├── ProtectedMailboxStorageEntry.java
│ │ │ │ ├── ProtectedStorageEntry.java
│ │ │ │ ├── ProtectedStoragePayload.java
│ │ │ │ └── RequiresOwnerIsOnlinePayload.java
│ │ │ └── persistence/
│ │ │ ├── AppendOnlyDataStoreListener.java
│ │ │ ├── AppendOnlyDataStoreService.java
│ │ │ ├── HistoricalDataStoreService.java
│ │ │ ├── MapStoreService.java
│ │ │ ├── PersistableNetworkPayloadStore.java
│ │ │ ├── ProtectedDataStoreService.java
│ │ │ ├── RemovedPayloadsMap.java
│ │ │ ├── RemovedPayloadsService.java
│ │ │ ├── ResourceDataStoreService.java
│ │ │ ├── SequenceNumberMap.java
│ │ │ └── StoreService.java
│ │ └── utils/
│ │ ├── CapabilityUtils.java
│ │ └── Utils.java
│ └── test/
│ ├── java/
│ │ └── haveno/
│ │ └── network/
│ │ ├── crypto/
│ │ │ └── EncryptionServiceTests.java
│ │ ├── p2p/
│ │ │ ├── DummySeedNode.java
│ │ │ ├── MockNode.java
│ │ │ ├── PeerServiceTest.java
│ │ │ ├── TestUtils.java
│ │ │ ├── mocks/
│ │ │ │ ├── MockMailboxPayload.java
│ │ │ │ └── MockPayload.java
│ │ │ ├── network/
│ │ │ │ ├── LocalhostNetworkNodeTest.java
│ │ │ │ └── TorNetworkNodeTest.java
│ │ │ ├── peers/
│ │ │ │ └── PeerManagerTest.java
│ │ │ └── storage/
│ │ │ ├── P2PDataStorageBuildGetDataResponseTest.java
│ │ │ ├── P2PDataStorageClientAPITest.java
│ │ │ ├── P2PDataStorageGetDataIntegrationTest.java
│ │ │ ├── P2PDataStorageOnMessageHandlerTest.java
│ │ │ ├── P2PDataStoragePersistableNetworkPayloadTest.java
│ │ │ ├── P2PDataStorageProcessGetDataResponse.java
│ │ │ ├── P2PDataStorageProtectedStorageEntryTest.java
│ │ │ ├── P2PDataStorageRemoveExpiredTest.java
│ │ │ ├── P2PDataStorageRequestDataTest.java
│ │ │ ├── P2PDataStoreDisconnectTest.java
│ │ │ ├── TestState.java
│ │ │ ├── messages/
│ │ │ │ └── AddDataMessageTest.java
│ │ │ ├── mocks/
│ │ │ │ ├── AppendOnlyDataStoreServiceFake.java
│ │ │ │ ├── ClockFake.java
│ │ │ │ ├── DateTolerantPayloadStub.java
│ │ │ │ ├── ExpirableProtectedStoragePayloadStub.java
│ │ │ │ ├── MapStoreServiceFake.java
│ │ │ │ ├── MockData.java
│ │ │ │ ├── PersistableExpirableProtectedStoragePayloadStub.java
│ │ │ │ ├── PersistableNetworkPayloadStub.java
│ │ │ │ └── ProtectedStoragePayloadStub.java
│ │ │ └── payload/
│ │ │ ├── ProtectedMailboxStorageEntryTest.java
│ │ │ └── ProtectedStorageEntryTest.java
│ │ └── utils/
│ │ └── UtilsTest.java
│ └── resources/
│ └── mockito-extensions/
│ └── org.mockito.plugins.MockMaker
├── proto/
│ └── src/
│ └── main/
│ └── proto/
│ ├── grpc.proto
│ └── pb.proto
├── relay/
│ ├── Procfile
│ ├── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── haveno/
│ │ │ └── relay/
│ │ │ ├── RelayMain.java
│ │ │ └── RelayService.java
│ │ └── resources/
│ │ ├── logback.xml
│ │ └── version.txt
│ └── torrc
├── scripts/
│ ├── deployment/
│ │ ├── haveno-pricenode.env
│ │ ├── haveno-pricenode.service
│ │ ├── haveno-seednode.service
│ │ ├── haveno-seednode2.service
│ │ ├── monero-stagenet.service
│ │ ├── private-stagenet.conf
│ │ ├── private-stagenet.service
│ │ ├── run-arbitrator-daemon.sh
│ │ ├── run-arbitrator-gui.sh
│ │ └── shared-stagenet.conf
│ ├── install_java.bat
│ ├── install_java.sh
│ ├── install_tails/
│ │ ├── README.md
│ │ ├── assets/
│ │ │ ├── exec.sh
│ │ │ ├── haveno.desktop
│ │ │ ├── haveno.yml
│ │ │ └── install.sh
│ │ ├── deprecated/
│ │ │ ├── README.md
│ │ │ └── haveno-install.sh
│ │ └── haveno-install.sh
│ └── install_whonix_qubes/
│ ├── INSTALL.md
│ ├── README.md
│ └── scripts/
│ ├── 0-dom0/
│ │ ├── 0.0-dom0.sh
│ │ ├── 0.1-dom0.sh
│ │ ├── 0.2-dom0.sh
│ │ └── 0.3-dom0.sh
│ ├── 1-TemplateVM/
│ │ └── 1.0-haveno-templatevm.sh
│ ├── 2-NetVM/
│ │ └── 2.0-haveno-netvm.sh
│ └── 3-AppVM/
│ └── 3.0-haveno-appvm.sh
├── seednode/
│ ├── .dockerignore
│ ├── README.md
│ ├── blocknotify.sh
│ ├── create_jar.sh
│ ├── create_jaronly_archive.sh
│ ├── docker/
│ │ └── Dockerfile
│ ├── haveno-seednode.service
│ ├── haveno.env
│ ├── install_seednode_debian.sh
│ ├── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── haveno/
│ │ │ │ └── seednode/
│ │ │ │ ├── SeedNode.java
│ │ │ │ └── SeedNodeMain.java
│ │ │ └── resources/
│ │ │ └── logback.xml
│ │ └── test/
│ │ └── java/
│ │ └── haveno/
│ │ └── seednode/
│ │ └── GuiceSetupTest.java
│ ├── torrc
│ └── uninstall_seednode_debian.sh
├── settings.gradle
├── shell.nix
└── statsnode/
└── src/
└── main/
├── java/
│ └── haveno/
│ └── statistics/
│ ├── Statistics.java
│ └── StatisticsMain.java
└── resources/
└── logback.xml
Showing preview only (1,319K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (14661 symbols across 1598 files)
FILE: apitest/src/main/java/haveno/apitest/ApiTestMain.java
class ApiTestMain (line 50) | @Slf4j
method main (line 53) | public static void main(String[] args) {
method execute (line 60) | public void execute(String[] args) {
method getAppendedArgs (line 87) | private static String[] getAppendedArgs(String[] args) {
FILE: apitest/src/main/java/haveno/apitest/Scaffold.java
class Scaffold (line 66) | @Slf4j
type BitcoinCoreApp (line 72) | public enum BitcoinCoreApp {
method Scaffold (line 107) | public Scaffold(String supportingApps) {
method Scaffold (line 116) | public Scaffold(String[] args) {
method Scaffold (line 125) | public Scaffold(ApiTestConfig config) {
method setUp (line 140) | public Scaffold setUp() throws IOException, InterruptedException, Exec...
method tearDown (line 157) | public void tearDown() {
method shutDownAll (line 182) | private Optional<Throwable> shutDownAll(SetupTask[] orderedTasks) {
method installBitcoinBlocknotify (line 209) | private void installBitcoinBlocknotify() {
method installCallRateMeteringConfiguration (line 223) | private void installCallRateMeteringConfiguration(String dataDir) thro...
method installShutdownHook (line 245) | private void installShutdownHook() {
method startBackgroundProcesses (line 252) | private void startBackgroundProcesses(ExecutorService executor,
method startHavenoApp (line 295) | private void startHavenoApp(HavenoAppConfig HavenoAppConfig,
method createHavenoProcess (line 332) | private HavenoProcess createHavenoProcess(HavenoAppConfig HavenoAppCon...
method verifyStartupCompleted (line 340) | private void verifyStartupCompleted()
method verifyStartupCompleted (line 358) | private void verifyStartupCompleted(Future<SetupTask.Status> futureSta...
method verifyNotWindows (line 377) | private void verifyNotWindows() {
method maybeRegisterDisputeAgents (line 382) | private void maybeRegisterDisputeAgents() {
FILE: apitest/src/main/java/haveno/apitest/SetupTask.java
class SetupTask (line 31) | @Slf4j
method SetupTask (line 37) | public SetupTask(LinuxProcess linuxProcess, CountDownLatch countdownLa...
method call (line 42) | @Override
method getLinuxProcess (line 54) | public LinuxProcess getLinuxProcess() {
class Status (line 58) | public static class Status {
method Status (line 62) | public Status(String name, LocalDateTime startTime) {
method getName (line 68) | public String getName() {
method getStartTime (line 72) | public LocalDateTime getStartTime() {
method toString (line 76) | @Override
FILE: apitest/src/main/java/haveno/apitest/SmokeTestBashCommand.java
class SmokeTestBashCommand (line 25) | @Slf4j
method SmokeTestBashCommand (line 28) | public SmokeTestBashCommand() {
method runSmokeTest (line 31) | public void runSmokeTest() {
FILE: apitest/src/main/java/haveno/apitest/SmokeTestBitcoind.java
class SmokeTestBitcoind (line 28) | @Slf4j
method SmokeTestBitcoind (line 33) | public SmokeTestBitcoind(ApiTestConfig config) {
method run (line 37) | public void run() throws IOException, InterruptedException {
method runBitcoinGetWalletInfo (line 43) | public void runBitcoinGetWalletInfo() throws IOException, InterruptedE...
method getNewAddress (line 57) | public String getNewAddress() throws IOException, InterruptedException {
method generateToAddress (line 63) | public void generateToAddress(int blocks, String address) throws IOExc...
FILE: apitest/src/main/java/haveno/apitest/config/ApiTestConfig.java
class ApiTestConfig (line 49) | @Slf4j
method ApiTestConfig (line 126) | public ApiTestConfig(String... args) {
method hasSupportingApp (line 329) | public boolean hasSupportingApp(String... supportingApp) {
method printHelp (line 333) | public void printHelp(OutputStream sink, HelpFormatter formatter) {
method parseOptionsFrom (line 342) | private Optional<OptionSet> parseOptionsFrom(File configFile, OptionSp...
method getProperties (line 362) | private Properties getProperties(File configFile) {
method absoluteConfigFile (line 374) | private static File absoluteConfigFile(String parentDir, String relati...
FILE: apitest/src/main/java/haveno/apitest/config/ApiTestRateMeterInterceptorConfig.java
class ApiTestRateMeterInterceptorConfig (line 16) | public class ApiTestRateMeterInterceptorConfig {
method getTestRateMeterInterceptorConfig (line 18) | public static File getTestRateMeterInterceptorConfig() {
method hasCallRateMeteringConfigPathOpt (line 51) | public static boolean hasCallRateMeteringConfigPathOpt(String[] args) {
method appendCallRateMeteringConfigPathOpt (line 55) | public static String[] appendCallRateMeteringConfigPathOpt(String[] ar...
FILE: apitest/src/main/java/haveno/apitest/config/HavenoAppConfig.java
type HavenoAppConfig (line 28) | public enum HavenoAppConfig {
method HavenoAppConfig (line 97) | HavenoAppConfig(String appName,
method toString (line 115) | @Override
FILE: apitest/src/main/java/haveno/apitest/linux/AbstractLinuxProcess.java
class AbstractLinuxProcess (line 33) | @Slf4j
method AbstractLinuxProcess (line 44) | public AbstractLinuxProcess(String name, ApiTestConfig config) {
method getName (line 51) | @Override
method hasStartupExceptions (line 56) | @Override
method hasShutdownExceptions (line 61) | @Override
method logExceptions (line 66) | @Override
method getStartupExceptions (line 73) | @Override
method getShutdownExceptions (line 78) | @Override
method verifyBitcoinPathsExist (line 83) | @SuppressWarnings("unused")
method verifyBitcoinPathsExist (line 88) | public void verifyBitcoinPathsExist(boolean verbose) {
method verifyBitcoindRunning (line 119) | public void verifyBitcoindRunning() throws IOException, InterruptedExc...
FILE: apitest/src/main/java/haveno/apitest/linux/BashCommand.java
class BashCommand (line 30) | @Slf4j
method BashCommand (line 42) | public BashCommand(String command) {
method BashCommand (line 46) | public BashCommand(String command, int numResponseLines) {
method run (line 51) | public BashCommand run() throws IOException, InterruptedException {
method runInBackground (line 58) | public BashCommand runInBackground() throws IOException, InterruptedEx...
method processOutput (line 65) | private void processOutput(SystemCommandExecutor commandExecutor) {
method getCommand (line 86) | public String getCommand() {
method getExitStatus (line 90) | public int getExitStatus() {
method getOutput (line 95) | @Nullable
method getError (line 101) | public String getError() {
method tokenizeSystemCommand (line 105) | private List<String> tokenizeSystemCommand() {
method printSystemLoadString (line 113) | @SuppressWarnings("unused")
method getUsedMemoryInMB (line 130) | public static long getUsedMemoryInMB() {
method getPid (line 137) | public static long getPid(String processName) throws IOException, Inte...
method grep (line 146) | @SuppressWarnings("unused")
method isAlive (line 152) | public static boolean isAlive(long pid) throws IOException, Interrupte...
FILE: apitest/src/main/java/haveno/apitest/linux/BitcoinCli.java
class BitcoinCli (line 25) | @Slf4j
method BitcoinCli (line 35) | public BitcoinCli(ApiTestConfig config, String command) {
method run (line 42) | public BitcoinCli run() throws IOException, InterruptedException {
method getCommandWithOptions (line 47) | public String getCommandWithOptions() {
method getOutput (line 51) | public String getOutput() {
method getOutputValueAsStringArray (line 61) | public String[] getOutputValueAsStringArray() {
method getOutputValueAsString (line 77) | public String getOutputValueAsString(String key) {
method getOutputValueAsBoolean (line 115) | public boolean getOutputValueAsBoolean(String key) {
method getOutputValueAsInt (line 121) | public int getOutputValueAsInt(String key) {
method getOutputValueAsDouble (line 126) | public double getOutputValueAsDouble(String key) {
method getOutputValueAsLong (line 131) | public long getOutputValueAsLong(String key) {
method isError (line 136) | public boolean isError() {
method getErrorMessage (line 140) | public String getErrorMessage() {
method start (line 144) | @Override
method getPid (line 166) | @Override
method shutdown (line 173) | @Override
FILE: apitest/src/main/java/haveno/apitest/linux/BitcoinDaemon.java
class BitcoinDaemon (line 30) | @Slf4j
method BitcoinDaemon (line 33) | public BitcoinDaemon(ApiTestConfig config) {
method start (line 37) | @Override
method getPid (line 79) | @Override
method shutdown (line 84) | @Override
FILE: apitest/src/main/java/haveno/apitest/linux/HavenoProcess.java
class HavenoProcess (line 38) | @Slf4j
method HavenoProcess (line 51) | public HavenoProcess(HavenoAppConfig havenoAppConfig, ApiTestConfig co...
method start (line 67) | @Override
method getPid (line 79) | @Override
method shutdown (line 84) | @Override
method verifyAppNotRunning (line 117) | public void verifyAppNotRunning() throws IOException, InterruptedExcep...
method verifyAppDataDirInstalled (line 124) | public void verifyAppDataDirInstalled() {
method runJar (line 145) | private void runJar() throws IOException, InterruptedException {
method runStartupScript (line 159) | private void runStartupScript() throws IOException, InterruptedExcepti...
method runBashCommand (line 169) | private void runBashCommand(String havenoCmd) throws IOException, Inte...
method findHavenoAppPid (line 198) | private long findHavenoAppPid() throws IOException, InterruptedExcepti...
method getJavaOptsSpec (line 205) | private String getJavaOptsSpec() {
method getOptsList (line 209) | private List<String> getOptsList() {
method getJavaExecutable (line 244) | private File getJavaExecutable() {
FILE: apitest/src/main/java/haveno/apitest/linux/LinuxProcess.java
type LinuxProcess (line 23) | public interface LinuxProcess {
method start (line 24) | void start() throws InterruptedException, IOException;
method getName (line 26) | String getName();
method getPid (line 28) | long getPid();
method hasStartupExceptions (line 30) | boolean hasStartupExceptions();
method hasShutdownExceptions (line 32) | boolean hasShutdownExceptions();
method logExceptions (line 34) | void logExceptions(List<Throwable> exceptions, org.slf4j.Logger log);
method getStartupExceptions (line 36) | List<Throwable> getStartupExceptions();
method getShutdownExceptions (line 38) | List<Throwable> getShutdownExceptions();
method shutdown (line 40) | void shutdown();
FILE: apitest/src/main/java/haveno/apitest/linux/SystemCommandExecutor.java
class SystemCommandExecutor (line 52) | @Slf4j
method SystemCommandExecutor (line 58) | public SystemCommandExecutor(final List<String> cmdOptions) {
method exec (line 71) | public int exec() throws IOException, InterruptedException {
method exec (line 79) | public int exec(boolean waitOnErrStream) throws IOException, Interrupt...
method getStandardErrorFromCommand (line 110) | public StringBuilder getStandardErrorFromCommand() {
method getStandardOutputFromCommand (line 115) | public StringBuilder getStandardOutputFromCommand() {
FILE: apitest/src/main/java/haveno/apitest/linux/ThreadedStreamHandler.java
class ThreadedStreamHandler (line 58) | @Slf4j
method ThreadedStreamHandler (line 63) | ThreadedStreamHandler(InputStream inputStream) {
method run (line 67) | public void run() {
method doSleep (line 78) | @SuppressWarnings("unused")
method getOutputBuffer (line 87) | public StringBuilder getOutputBuffer() {
FILE: apitest/src/test/java/haveno/apitest/ApiTestCase.java
class ApiTestCase (line 65) | @Slf4j
method setUpScaffold (line 79) | public static void setUpScaffold(Enum<?>... supportingApps)
method setUpScaffold (line 89) | public static void setUpScaffold(String[] params)
method tearDownScaffold (line 101) | public static void tearDownScaffold() {
method createGrpcClients (line 105) | protected static void createGrpcClients() {
method genBtcBlocksThenWait (line 123) | protected static void genBtcBlocksThenWait(int numBlocks, long wait) {
method sleep (line 128) | protected static void sleep(long ms) {
method testName (line 132) | protected final String testName(TestInfo testInfo) {
FILE: apitest/src/test/java/haveno/apitest/method/BitcoinCliHelper.java
class BitcoinCliHelper (line 28) | public final class BitcoinCliHelper {
method BitcoinCliHelper (line 32) | public BitcoinCliHelper(ApiTestConfig config) {
method getNewBtcAddress (line 38) | public String getNewBtcAddress() {
method generateToAddress (line 52) | public String[] generateToAddress(int blocks, String address) {
method generateBlocks (line 67) | public void generateBlocks(int blocks) {
method sendToAddress (line 71) | public String sendToAddress(String address, String amount) {
FILE: apitest/src/test/java/haveno/apitest/method/CallRateMeteringInterceptorTest.java
class CallRateMeteringInterceptorTest (line 36) | @Disabled
method setUp (line 43) | @BeforeAll
method sleep200Milliseconds (line 50) | @BeforeEach
method testGetVersionCall1IsAllowed (line 55) | @Test
method testGetVersionCall2ShouldThrowException (line 61) | @Test
method testGetVersionCall3ShouldThrowException (line 69) | @Test
method testGetVersionCall4IsAllowed (line 77) | @Test
method tearDown (line 84) | @AfterAll
FILE: apitest/src/test/java/haveno/apitest/method/GetMethodHelpTest.java
class GetMethodHelpTest (line 34) | @Disabled
method setUp (line 39) | @BeforeAll
method testGetCreateOfferHelp (line 48) | @Test
method tearDown (line 55) | @AfterAll
FILE: apitest/src/test/java/haveno/apitest/method/GetVersionTest.java
class GetVersionTest (line 34) | @Disabled
method setUp (line 39) | @BeforeAll
method testGetVersion (line 48) | @Test
method tearDown (line 55) | @AfterAll
FILE: apitest/src/test/java/haveno/apitest/method/MethodTest.java
class MethodTest (line 52) | public class MethodTest extends ApiTestCase {
method startSupportingApps (line 59) | public static void startSupportingApps(File callRateMeteringConfigFile,
method startSupportingApps (line 75) | public static void startSupportingApps(boolean generateBtcBlock,
method doPostStartup (line 92) | protected static void doPostStartup(boolean generateBtcBlock) {
method getPaymentAccountForm (line 99) | protected final File getPaymentAccountForm(GrpcClient grpcClient, Stri...
method createDummyF2FAccount (line 115) | protected haveno.core.payment.PaymentAccount createDummyF2FAccount(Grp...
method createDummyBRLAccount (line 131) | protected haveno.core.payment.PaymentAccount createDummyBRLAccount(Grp...
method createPaymentAccount (line 152) | protected final haveno.core.payment.PaymentAccount createPaymentAccoun...
method formatBalancesTbls (line 171) | public static String formatBalancesTbls(BalancesInfo allBalances) {
method encodeToHex (line 178) | protected static String encodeToHex(String s) {
method getStatusRuntimeExceptionStatusCode (line 182) | protected static Status.Code getStatusRuntimeExceptionStatusCode(Excep...
method verifyNoLoggedNodeExceptions (line 191) | protected void verifyNoLoggedNodeExceptions() {
method printNodeExceptionMessages (line 199) | protected void printNodeExceptionMessages(Logger log) {
method getNodeExceptionMessages (line 205) | @Nullable
FILE: apitest/src/test/java/haveno/apitest/method/RegisterDisputeAgentsTest.java
class RegisterDisputeAgentsTest (line 42) | @SuppressWarnings("ResultOfMethodCallIgnored")
method setUp (line 48) | @BeforeAll
method testRegisterArbitratorShouldThrowException (line 57) | @Test
method testInvalidDisputeAgentTypeArgShouldThrowException (line 66) | @Test
method testInvalidRegistrationKeyArgShouldThrowException (line 75) | @Test
method testRegisterMediator (line 84) | @Test
method testRegisterRefundAgent (line 90) | @Test
method tearDown (line 96) | @AfterAll
FILE: apitest/src/test/java/haveno/apitest/method/offer/AbstractOfferTest.java
class AbstractOfferTest (line 45) | @Slf4j
method setUp (line 61) | @BeforeAll
method setUp (line 66) | public static void setUp(boolean startSupportingAppsInDebugMode) {
method calcPriceAsString (line 83) | protected static String calcPriceAsString(double base, double delta, i...
method initPaymentAccounts (line 91) | @SuppressWarnings("ConstantConditions")
method createXmrPaymentAccounts (line 97) | @SuppressWarnings("ConstantConditions")
method tearDown (line 111) | @AfterAll
method runCliGetOffer (line 116) | protected static void runCliGetOffer(String offerId) {
FILE: apitest/src/test/java/haveno/apitest/method/offer/CancelOfferTest.java
class CancelOfferTest (line 35) | @Disabled
method testCancelOffer (line 55) | @Test
FILE: apitest/src/test/java/haveno/apitest/method/offer/CreateOfferUsingFixedPriceTest.java
class CreateOfferUsingFixedPriceTest (line 38) | @Disabled
method testCreateAUDBTCBuyOfferUsingFixedPrice16000 (line 43) | @Test
method testCreateUSDBTCBuyOfferUsingFixedPrice100001234 (line 91) | @Test
method testCreateEURBTCSellOfferUsingFixedPrice95001234 (line 139) | @Test
FILE: apitest/src/test/java/haveno/apitest/method/offer/CreateOfferUsingMarketPriceMarginTest.java
class CreateOfferUsingMarketPriceMarginTest (line 47) | @SuppressWarnings("ConstantConditions")
method testCreateUSDBTCBuyOffer5PctPriceMargin (line 59) | @Test
method testCreateNZDBTCBuyOfferMinus2PctPriceMargin (line 107) | @Test
method testCreateGBPBTCSellOfferMinus1Point5PctPriceMargin (line 155) | @Test
method testCreateBRLBTCSellOffer6Point55PctPriceMargin (line 203) | @Test
method testCreateUSDBTCBuyOfferWithTriggerPrice (line 251) | @Test
method assertCalculatedPriceIsCorrect (line 276) | private void assertCalculatedPriceIsCorrect(OfferInfo offer, double pr...
method getPercentageDifference (line 295) | private double getPercentageDifference(double price1, double price2) {
method isCalculatedPriceWithinErrorTolerance (line 301) | private boolean isCalculatedPriceWithinErrorTolerance(double delta,
method logCalculatedPricePoppedWarningTolerance (line 327) | private void logCalculatedPricePoppedWarningTolerance(double expectedD...
method logCalculatedPricePoppedErrorTolerance (line 341) | private void logCalculatedPricePoppedErrorTolerance(double expectedDif...
FILE: apitest/src/test/java/haveno/apitest/method/offer/CreateXMROffersTest.java
class CreateXMROffersTest (line 40) | @SuppressWarnings("ConstantConditions")
method setUp (line 48) | @BeforeAll
method testCreateFixedPriceBuy1BTCFor200KXMROffer (line 54) | @Test
method testCreateFixedPriceSell1BTCFor200KXMROffer (line 102) | @Test
method testCreatePriceMarginBasedBuy1BTCOfferWithTriggerPrice (line 148) | @Test
method testCreatePriceMarginBasedSell1BTCOffer (line 204) | @Test
method testGetAllMyXMROffers (line 250) | @Test
method testGetAvailableXMROffers (line 259) | @Test
method genBtcBlockAndWaitForOfferPreparation (line 268) | private void genBtcBlockAndWaitForOfferPreparation() {
FILE: apitest/src/test/java/haveno/apitest/method/offer/ValidateCreateOfferTest.java
class ValidateCreateOfferTest (line 34) | @Disabled
method testAmtTooLargeShouldThrowException (line 39) | @Test
method testNoMatchingEURPaymentAccountShouldThrowException (line 55) | @Test
method testNoMatchingCADPaymentAccountShouldThrowException (line 72) | @Test
FILE: apitest/src/test/java/haveno/apitest/method/payment/AbstractPaymentAccountTest.java
class AbstractPaymentAccountTest (line 40) | @Slf4j
method setup (line 114) | @BeforeEach
method getEmptyForm (line 119) | protected final File getEmptyForm(TestInfo testInfo, String paymentMet...
method verifyEmptyForm (line 135) | protected final void verifyEmptyForm(File jsonForm, String paymentMeth...
method verifyCommonFormEntries (line 158) | protected final void verifyCommonFormEntries(PaymentAccount paymentAcc...
method verifyAccountSingleTradeCurrency (line 166) | protected final void verifyAccountSingleTradeCurrency(String expectedC...
method verifyAccountTradeCurrencies (line 171) | protected final void verifyAccountTradeCurrencies(Collection<Tradition...
method verifyAccountTradeCurrencies (line 180) | protected final void verifyAccountTradeCurrencies(List<TradeCurrency> ...
method verifyUserPayloadHasPaymentAccountWithId (line 186) | protected final void verifyUserPayloadHasPaymentAccountWithId(GrpcClie...
method getCompletedFormAsJsonString (line 195) | protected final String getCompletedFormAsJsonString(List<String> comme...
method getCompletedFormAsJsonString (line 202) | protected final String getCompletedFormAsJsonString() {
method getCommaDelimitedTraditionalCurrencyCodes (line 209) | protected final String getCommaDelimitedTraditionalCurrencyCodes(Colle...
method getSwiftFormComments (line 216) | protected final List<String> getSwiftFormComments() {
method fillPaymentAccountForm (line 224) | private File fillPaymentAccountForm(List<String> comments) {
FILE: apitest/src/test/java/haveno/apitest/method/payment/CreatePaymentAccountTest.java
class CreatePaymentAccountTest (line 120) | @SuppressWarnings({"OptionalGetWithoutIsPresent", "ConstantConditions"})
method setUp (line 126) | @BeforeAll
method testCreateAdvancedCashAccount (line 135) | @Test
method testCreateAliPayAccount (line 162) | @Test
method testCreateAustraliaPayidAccount (line 181) | @Test
method testCreateCapitualAccount (line 203) | @Test
method testCreateCashDepositAccount (line 230) | @Test
method testCreateBrazilNationalBankAccount (line 282) | @Test
method testCreateZelleAccount (line 327) | @Test
method testCreateF2FAccount (line 350) | @Test
method testCreateFasterPaymentsAccount (line 379) | @Test
method testCreateHalCashAccount (line 402) | @Test
method testCreateInteracETransferAccount (line 421) | @Test
method testCreateJapanBankAccount (line 450) | @Test
method testCreateMoneyBeamAccount (line 487) | @Test
method testCreateMoneyGramAccount (line 507) | @Test
method testCreatePerfectMoneyAccount (line 543) | @Test
method testCreatePaxumAccount (line 563) | @Test
method testCreatePayseraAccount (line 589) | @Test
method testCreatePopmoneyAccount (line 615) | @Test
method testCreatePromptPayAccount (line 637) | @Test
method testCreateRevolutAccount (line 657) | @Test
method testCreateSameBankAccount (line 683) | @Test
method testCreateSepaInstantAccount (line 728) | @Test
method testCreateSepaAccount (line 759) | @Test
method testCreateSpecificBanksAccount (line 791) | @Test
method testCreateSwiftAccount (line 838) | @Test
method testCreateSwishAccount (line 896) | @Test
method testCreateTransferwiseAccountWith1TradeCurrency (line 919) | @Test
method testCreateTransferwiseAccountWith10TradeCurrencies (line 942) | @Test
method testCreateTransferwiseAccountWithSupportedTradeCurrencies (line 977) | @Test
method testCreateTransferwiseAccountWithInvalidBrlTradeCurrencyShouldThrowException (line 1003) | @Test
method testCreateTransferwiseAccountWithoutTradeCurrenciesShouldThrowException (line 1022) | @Test
method testCreateUpholdAccount (line 1041) | @Test
method testCreateUSPostalMoneyOrderAccount (line 1068) | @Test
method testCreateWeChatPayAccount (line 1090) | @Test
method testCreateWesternUnionAccount (line 1110) | @Test
method tearDown (line 1142) | @AfterAll
method print (line 1147) | private void print(PaymentAccount paymentAccount) {
FILE: apitest/src/test/java/haveno/apitest/method/payment/GetPaymentMethodsTest.java
class GetPaymentMethodsTest (line 22) | @Disabled
method setUp (line 27) | @BeforeAll
method testGetPaymentMethods (line 36) | @Test
method tearDown (line 46) | @AfterAll
FILE: apitest/src/test/java/haveno/apitest/method/trade/AbstractTradeTest.java
class AbstractTradeTest (line 29) | public class AbstractTradeTest extends AbstractOfferTest {
method initStaticFixtures (line 42) | @BeforeAll
method takeAlicesOffer (line 47) | protected final TradeInfo takeAlicesOffer(String offerId,
method takeAlicesOffer (line 54) | protected final TradeInfo takeAlicesOffer(String offerId,
method waitForDepositUnlocked (line 72) | protected final void waitForDepositUnlocked(Logger log,
method verifyTakerDepositConfirmed (line 106) | protected final void verifyTakerDepositConfirmed(TradeInfo trade) {
method waitForBuyerSeesPaymentInitiatedMessage (line 115) | protected final void waitForBuyerSeesPaymentInitiatedMessage(Logger log,
method waitForSellerSeesPaymentInitiatedMessage (line 142) | protected final void waitForSellerSeesPaymentInitiatedMessage(Logger log,
method verifyExpectedProtocolStatus (line 174) | protected final void verifyExpectedProtocolStatus(TradeInfo trade) {
method logBalances (line 189) | protected final void logBalances(Logger log, TestInfo testInfo) {
method logTrade (line 200) | protected final void logTrade(Logger log,
method runCliGetTrade (line 212) | protected static void runCliGetTrade(String tradeId) {
method runCliGetOpenTrades (line 219) | protected static void runCliGetOpenTrades() {
method runCliGetClosedTrades (line 226) | protected static void runCliGetClosedTrades() {
FILE: apitest/src/test/java/haveno/apitest/method/trade/ExpectedProtocolStatus.java
class ExpectedProtocolStatus (line 9) | public class ExpectedProtocolStatus {
method setState (line 19) | public ExpectedProtocolStatus setState(Trade.State state) {
method setPhase (line 24) | public ExpectedProtocolStatus setPhase(Trade.Phase phase) {
method setDepositPublished (line 29) | public ExpectedProtocolStatus setDepositPublished(boolean depositPubli...
method setDepositConfirmed (line 34) | public ExpectedProtocolStatus setDepositConfirmed(boolean depositConfi...
method setPaymentSentMessageSent (line 39) | public ExpectedProtocolStatus setPaymentSentMessageSent(boolean paymen...
method setPaymentReceivedMessageSent (line 44) | public ExpectedProtocolStatus setPaymentReceivedMessageSent(boolean pa...
method setPayoutPublished (line 49) | public ExpectedProtocolStatus setPayoutPublished(boolean payoutPublish...
method setCompleted (line 54) | public ExpectedProtocolStatus setCompleted(boolean completed) {
method init (line 59) | public void init() {
FILE: apitest/src/test/java/haveno/apitest/method/trade/TakeBuyBTCOfferTest.java
class TakeBuyBTCOfferTest (line 38) | @Disabled
method testTakeAlicesBuyOffer (line 45) | @Test
method testAlicesConfirmPaymentSent (line 85) | @Test
method testBobsConfirmPaymentReceived (line 99) | @Test
FILE: apitest/src/test/java/haveno/apitest/method/trade/TakeBuyBTCOfferWithNationalBankAcctTest.java
class TakeBuyBTCOfferWithNationalBankAcctTest (line 64) | @SuppressWarnings("ConstantConditions")
method setUp (line 77) | @BeforeAll
method testTakeAlicesBuyOffer (line 82) | @Test
method testBankAcctDetailsIncludedInContracts (line 153) | @Test
method testAlicesConfirmPaymentSent (line 174) | @Test
method testBobsConfirmPaymentReceived (line 192) | @Test
method verifyJsonContractExcludesBankAccountDetails (line 214) | private void verifyJsonContractExcludesBankAccountDetails(String jsonC...
method verifyJsonContractIncludesBankAccountDetails (line 243) | private void verifyJsonContractIncludesBankAccountDetails(String jsonC...
FILE: apitest/src/test/java/haveno/apitest/method/trade/TakeBuyXMROfferTest.java
class TakeBuyXMROfferTest (line 41) | @Disabled
method setUp (line 48) | @BeforeAll
method testTakeAlicesSellBTCForXMROffer (line 55) | @Test
method testBobsConfirmPaymentSent (line 91) | @Test
method testAlicesConfirmPaymentReceived (line 110) | @Test
FILE: apitest/src/test/java/haveno/apitest/method/trade/TakeSellBTCOfferTest.java
class TakeSellBTCOfferTest (line 39) | @Disabled
method testTakeAlicesSellOffer (line 51) | @Test
method testBobsConfirmPaymentSent (line 91) | @Test
method testAlicesConfirmPaymentReceived (line 105) | @Test
FILE: apitest/src/test/java/haveno/apitest/method/trade/TakeSellXMROfferTest.java
class TakeSellXMROfferTest (line 41) | @Disabled
method setUp (line 53) | @BeforeAll
method testTakeAlicesBuyBTCForXMROffer (line 60) | @Test
method testAlicesConfirmPaymentSent (line 99) | @Test
method testBobsConfirmPaymentReceived (line 117) | @Test
FILE: apitest/src/test/java/haveno/apitest/method/wallet/BtcWalletTest.java
class BtcWalletTest (line 26) | @Disabled
method setUp (line 33) | @BeforeAll
method testInitialBtcBalances (line 43) | @Test
method testFundAlicesBtcWallet (line 62) | @Test
method tearDown (line 91) | @AfterAll
FILE: apitest/src/test/java/haveno/apitest/method/wallet/WalletProtectionTest.java
class WalletProtectionTest (line 20) | @SuppressWarnings("ResultOfMethodCallIgnored")
method setUp (line 26) | @BeforeAll
method testSetWalletPassword (line 36) | @Test
method testGetBalanceOnEncryptedWalletShouldThrowException (line 42) | @Test
method testUnlockWalletFor4Seconds (line 49) | @Test
method testGetBalanceAfterUnlockTimeExpiryShouldThrowException (line 59) | @Test
method testLockWalletBeforeUnlockTimeoutExpiry (line 68) | @Test
method testLockWalletWhenWalletAlreadyLockedShouldThrowException (line 77) | @Test
method testUnlockWalletTimeoutOverride (line 84) | @Test
method testSetNewWalletPassword (line 94) | @Test
method testSetNewWalletPasswordWithIncorrectNewPasswordShouldThrowException (line 103) | @Test
method testRemoveNewWalletPassword (line 111) | @Test
method tearDown (line 118) | @AfterAll
FILE: apitest/src/test/java/haveno/apitest/method/wallet/WalletTestUtil.java
class WalletTestUtil (line 8) | @Slf4j
method verifyBtcBalances (line 19) | public static void verifyBtcBalances(haveno.core.api.model.BtcBalanceI...
FILE: apitest/src/test/java/haveno/apitest/scenario/LongRunningOfferDeactivationTest.java
class LongRunningOfferDeactivationTest (line 41) | @EnabledIf("envLongRunningTestEnabled")
method testSellOfferAutoDisable (line 48) | @Test
method testBuyOfferAutoDisable (line 94) | @Test
method envLongRunningTestEnabled (line 141) | protected static boolean envLongRunningTestEnabled() {
FILE: apitest/src/test/java/haveno/apitest/scenario/LongRunningTradesTest.java
class LongRunningTradesTest (line 33) | @EnabledIf("envLongRunningTestEnabled")
method TradeLoop (line 38) | @Test
method testTakeBuyBTCOffer (line 64) | public void testTakeBuyBTCOffer(final TestInfo testInfo) {
method testTakeSellBTCOffer (line 72) | public void testTakeSellBTCOffer(final TestInfo testInfo) {
method envLongRunningTestEnabled (line 80) | protected static boolean envLongRunningTestEnabled() {
FILE: apitest/src/test/java/haveno/apitest/scenario/OfferTest.java
class OfferTest (line 34) | @Slf4j
method setUp (line 38) | @BeforeAll
method testCreateOfferValidation (line 43) | @Test
method testCancelOffer (line 52) | @Test
method testCreateOfferUsingFixedPrice (line 59) | @Test
method testCreateOfferUsingMarketPriceMarginPct (line 68) | @Test
method testCreateXMROffers (line 79) | @Test
FILE: apitest/src/test/java/haveno/apitest/scenario/PaymentAccountTest.java
class PaymentAccountTest (line 20) | @Slf4j
method setUp (line 24) | @BeforeAll
method testGetPaymentMethods (line 33) | @Test
method testCreatePaymentAccount (line 40) | @Test
method tearDown (line 84) | @AfterAll
FILE: apitest/src/test/java/haveno/apitest/scenario/ScriptedBotTest.java
class ScriptedBotTest (line 46) | @EnabledIf("botScriptExists")
method startTestHarness (line 53) | @BeforeAll
method initRobotBob (line 78) | @BeforeEach
method runRobotBob (line 88) | @Test
method tearDown (line 112) | @AfterAll
FILE: apitest/src/test/java/haveno/apitest/scenario/StartupTest.java
class StartupTest (line 45) | @Slf4j
method setUp (line 51) | @BeforeAll
method testCallRateMeteringInterceptor (line 64) | @Test
method testGetVersion (line 78) | @Test
method testRegisterDisputeAgents (line 85) | @Test
method testGetCreateOfferHelp (line 96) | @Test
method tearDown (line 103) | @AfterAll
FILE: apitest/src/test/java/haveno/apitest/scenario/TradeTest.java
class TradeTest (line 35) | @Slf4j
method init (line 39) | @BeforeEach
method testTakeBuyBTCOffer (line 44) | @Test
method testTakeSellBTCOffer (line 53) | @Test
method testTakeBuyBTCOfferWithNationalBankAcct (line 62) | @Test
method testTakeBuyXMROffer (line 72) | @Test
method testTakeSellXMROffer (line 82) | @Test
FILE: apitest/src/test/java/haveno/apitest/scenario/WalletTest.java
class WalletTest (line 38) | @Slf4j
method setUp (line 46) | @BeforeAll
method testBtcWalletFunding (line 57) | @Test
method testWalletProtection (line 66) | @Test
method tearDown (line 83) | @AfterAll
FILE: apitest/src/test/java/haveno/apitest/scenario/bot/AbstractBotTest.java
class AbstractBotTest (line 39) | @Slf4j
method getBashScriptGenerator (line 46) | protected BashScriptGenerator getBashScriptGenerator() {
method createAlicesPaymentAccount (line 57) | private PaymentAccount createAlicesPaymentAccount() {
method deserializeBotScript (line 81) | protected static BotScript deserializeBotScript() {
method botScriptExists (line 91) | @SuppressWarnings("unused") // This is used by the jupiter framework.
FILE: apitest/src/test/java/haveno/apitest/scenario/bot/Bot.java
class Bot (line 16) | @Slf4j
method Bot (line 32) | public Bot(BotClient botClient,
method createBotPaymentAccount (line 49) | private PaymentAccount createBotPaymentAccount(BotScript botScript) {
method findCountry (line 68) | private Country findCountry(String countryCode) {
FILE: apitest/src/test/java/haveno/apitest/scenario/bot/BotClient.java
class BotClient (line 37) | @SuppressWarnings({"unused"})
method BotClient (line 45) | public BotClient(GrpcClient grpcClient) {
method getBalance (line 53) | public BalancesInfo getBalance() {
method getCurrentBTCMarketPrice (line 62) | public double getCurrentBTCMarketPrice(String currencyCode) {
method getCurrentBTCMarketPriceAsIntegerString (line 71) | public String getCurrentBTCMarketPriceAsIntegerString(String currencyC...
method getOffers (line 80) | public List<OfferInfo> getOffers(String currencyCode) {
method getBuyOffers (line 94) | public List<OfferInfo> getBuyOffers(String currencyCode) {
method getSellOffers (line 103) | public List<OfferInfo> getSellOffers(String currencyCode) {
method createOfferAtMarketBasedPrice (line 120) | public OfferInfo createOfferAtMarketBasedPrice(PaymentAccount paymentA...
method createOfferAtFixedPrice (line 150) | public OfferInfo createOfferAtFixedPrice(PaymentAccount paymentAccount,
method takeOffer (line 166) | public TradeInfo takeOffer(String offerId, PaymentAccount paymentAccou...
method getTrade (line 175) | public TradeInfo getTrade(String tradeId) {
method getTradeContract (line 200) | public String getTradeContract(String tradeId) {
method isTakerDepositFeeTxPublished (line 217) | public boolean isTakerDepositFeeTxPublished(String tradeId) {
method isTakerDepositFeeTxConfirmed (line 226) | public boolean isTakerDepositFeeTxConfirmed(String tradeId) {
method isTradePaymentSentSent (line 235) | public boolean isTradePaymentSentSent(String tradeId) {
method isTradePaymentReceivedConfirmationSent (line 244) | public boolean isTradePaymentReceivedConfirmationSent(String tradeId) {
method isTradePayoutTxPublished (line 253) | public boolean isTradePayoutTxPublished(String tradeId) {
method sendConfirmPaymentSentMessage (line 262) | public void sendConfirmPaymentSentMessage(String tradeId) {
method sendConfirmPaymentReceivedMessage (line 271) | public void sendConfirmPaymentReceivedMessage(String tradeId) {
method createNewPaymentAccount (line 280) | public PaymentAccount createNewPaymentAccount(String json) {
method getPaymentAccount (line 290) | public PaymentAccount getPaymentAccount(String paymentAccountId) {
method getPaymentAccountWithName (line 305) | public PaymentAccount getPaymentAccountWithName(String accountName) {
method toCleanGrpcExceptionMessage (line 315) | public String toCleanGrpcExceptionMessage(Exception ex) {
FILE: apitest/src/test/java/haveno/apitest/scenario/bot/BotPaymentAccountGenerator.java
class BotPaymentAccountGenerator (line 16) | @Slf4j
method BotPaymentAccountGenerator (line 23) | public BotPaymentAccountGenerator(BotClient botClient) {
method createF2FPaymentAccount (line 27) | public PaymentAccount createF2FPaymentAccount(Country country, String ...
method createZellePaymentAccount (line 43) | public PaymentAccount createZellePaymentAccount(String accountName, St...
method getPaymentAccountFormMap (line 56) | private Map<String, Object> getPaymentAccountFormMap(String paymentMet...
FILE: apitest/src/test/java/haveno/apitest/scenario/bot/InvalidRandomOfferException.java
class InvalidRandomOfferException (line 22) | @SuppressWarnings("unused")
method InvalidRandomOfferException (line 24) | public InvalidRandomOfferException(Throwable cause) {
method InvalidRandomOfferException (line 28) | public InvalidRandomOfferException(String format, Object... args) {
method InvalidRandomOfferException (line 32) | public InvalidRandomOfferException(Throwable cause, String format, Obj...
FILE: apitest/src/test/java/haveno/apitest/scenario/bot/PaymentAccountNotFoundException.java
class PaymentAccountNotFoundException (line 22) | @SuppressWarnings("unused")
method PaymentAccountNotFoundException (line 24) | public PaymentAccountNotFoundException(Throwable cause) {
method PaymentAccountNotFoundException (line 28) | public PaymentAccountNotFoundException(String format, Object... args) {
method PaymentAccountNotFoundException (line 32) | public PaymentAccountNotFoundException(Throwable cause, String format,...
FILE: apitest/src/test/java/haveno/apitest/scenario/bot/RandomOffer.java
class RandomOffer (line 39) | @Slf4j
method RandomOffer (line 101) | public RandomOffer(BotClient botClient, PaymentAccount paymentAccount) {
method create (line 112) | public RandomOffer create() throws InvalidRandomOfferException {
method printDescription (line 144) | private void printDescription() {
FILE: apitest/src/test/java/haveno/apitest/scenario/bot/RobotBob.java
class RobotBob (line 36) | @Slf4j
method RobotBob (line 43) | public RobotBob(BotClient botClient,
method run (line 50) | public void run() {
method checkActionIsValid (line 100) | private void checkActionIsValid(String action) {
method waitForManualShutdown (line 105) | private void waitForManualShutdown() {
method warnCLIUserBeforeShutdown (line 128) | private void warnCLIUserBeforeShutdown() {
FILE: apitest/src/test/java/haveno/apitest/scenario/bot/protocol/BotProtocol.java
class BotProtocol (line 56) | @Slf4j
method BotProtocol (line 84) | public BotProtocol(BotClient botClient,
method run (line 98) | public abstract void run();
method isWithinProtocolStepTimeLimit (line 100) | protected boolean isWithinProtocolStepTimeLimit() {
method checkIsStartStep (line 104) | protected void checkIsStartStep() {
method printBotProtocolStep (line 110) | protected void printBotProtocolStep() {
method createPaymentSentScript (line 225) | protected void createPaymentSentScript(TradeInfo trade) {
method createPaymentReceivedScript (line 230) | protected void createPaymentReceivedScript(TradeInfo trade) {
method createKeepFundsScript (line 235) | protected void createKeepFundsScript(TradeInfo trade) {
method createGetBalanceScript (line 240) | protected void createGetBalanceScript() {
method createGenerateBtcBlockScript (line 245) | protected void createGenerateBtcBlockScript() {
method printCliHintAndOrScript (line 251) | protected void printCliHintAndOrScript(File script, String hint) {
method sleep (line 259) | protected void sleep(long ms) {
method waitForTakerFeeTxPublished (line 267) | private void waitForTakerFeeTxPublished(String tradeId) {
method waitForTakerFeeTxConfirmed (line 271) | private void waitForTakerFeeTxConfirmed(String tradeId) {
method waitForTakerDepositFee (line 275) | private void waitForTakerDepositFee(String tradeId, ProtocolStep depos...
method validateCurrentProtocolStep (line 315) | private void validateCurrentProtocolStep(Enum<?>... validBotSteps) {
method waitingForDepositFeeTxMsg (line 326) | private String waitingForDepositFeeTxMsg(String tradeId) {
method stoppedWaitingForDepositFeeTxMsg (line 332) | private String stoppedWaitingForDepositFeeTxMsg(String txId) {
FILE: apitest/src/test/java/haveno/apitest/scenario/bot/protocol/MakerBotProtocol.java
class MakerBotProtocol (line 25) | @Slf4j
method MakerBotProtocol (line 28) | public MakerBotProtocol(BotClient botClient,
method run (line 40) | @Override
method getNewTrade (line 89) | private Optional<TradeInfo> getNewTrade(String offerId) {
method createTakeOfferCliScript (line 103) | private void createTakeOfferCliScript(OfferInfo offer) {
FILE: apitest/src/test/java/haveno/apitest/scenario/bot/protocol/ProtocolStep.java
type ProtocolStep (line 3) | public enum ProtocolStep {
FILE: apitest/src/test/java/haveno/apitest/scenario/bot/protocol/TakerBotProtocol.java
class TakerBotProtocol (line 25) | @Slf4j
method TakerBotProtocol (line 28) | public TakerBotProtocol(BotClient botClient,
method run (line 40) | @Override
method createMakeOfferScript (line 100) | private void createMakeOfferScript() {
FILE: apitest/src/test/java/haveno/apitest/scenario/bot/script/BashScriptGenerator.java
class BashScriptGenerator (line 40) | @Slf4j
method BashScriptGenerator (line 50) | public BashScriptGenerator(String apiPassword,
method createMakeMarginPricedOfferScript (line 61) | public File createMakeMarginPricedOfferScript(String direction,
method createMakeFixedPricedOfferScript (line 90) | public File createMakeFixedPricedOfferScript(String direction,
method createTakeOfferScript (line 119) | public File createTakeOfferScript(OfferInfo offer) {
method createPaymentSentScript (line 138) | public File createPaymentSentScript(TradeInfo trade) {
method createPaymentReceivedScript (line 149) | public File createPaymentReceivedScript(TradeInfo trade) {
method createKeepFundsScript (line 160) | public File createKeepFundsScript(TradeInfo trade) {
method createGetBalanceScript (line 171) | public File createGetBalanceScript() {
method createGenerateBtcBlockScript (line 176) | public File createGenerateBtcBlockScript(String address) {
method createCliScript (line 184) | public File createCliScript(String scriptName, String... commands) {
method printCliScript (line 217) | public void printCliScript(File cliScript,
FILE: apitest/src/test/java/haveno/apitest/scenario/bot/script/BotScript.java
class BotScript (line 26) | @Getter
method BotScript (line 56) | @SuppressWarnings("NullableProblems")
FILE: apitest/src/test/java/haveno/apitest/scenario/bot/script/BotScriptGenerator.java
class BotScriptGenerator (line 38) | @Slf4j
method BotScriptGenerator (line 56) | public BotScriptGenerator(String[] args) {
method printHelp (line 161) | private void printHelp(OptionParser parser, PrintStream stream) {
method examplesUsingTestHarness (line 177) | private String examplesUsingTestHarness() {
method examplesNotUsingTestHarness (line 198) | private String examplesNotUsingTestHarness() {
method generateBotScriptTemplate (line 213) | private String generateBotScriptTemplate() {
method main (line 227) | public static void main(String[] args) {
class HelpFormatter (line 239) | private static class HelpFormatter extends BuiltinHelpFormatter {
method HelpFormatter (line 240) | public HelpFormatter() {
FILE: apitest/src/test/java/haveno/apitest/scenario/bot/shutdown/ManualBotShutdownException.java
class ManualBotShutdownException (line 22) | @SuppressWarnings("unused")
method ManualBotShutdownException (line 24) | public ManualBotShutdownException(Throwable cause) {
method ManualBotShutdownException (line 28) | public ManualBotShutdownException(String format, Object... args) {
method ManualBotShutdownException (line 32) | public ManualBotShutdownException(Throwable cause, String format, Obje...
FILE: apitest/src/test/java/haveno/apitest/scenario/bot/shutdown/ManualShutdown.java
class ManualShutdown (line 13) | @Slf4j
method startShutdownTimer (line 27) | public static void startShutdownTimer() {
method isShutdownCalled (line 45) | public static boolean isShutdownCalled() {
method checkIfShutdownCalled (line 49) | public static void checkIfShutdownCalled(String warning) throws Manual...
method deleteStaleShutdownFile (line 54) | private static void deleteStaleShutdownFile() {
FILE: assets/src/main/java/haveno/asset/AbstractAsset.java
class AbstractAsset (line 31) | public abstract class AbstractAsset implements Asset {
method AbstractAsset (line 37) | public AbstractAsset(String name, String tickerSymbol, AddressValidato...
method getName (line 43) | @Override
method getTickerSymbol (line 48) | @Override
method validateAddress (line 53) | @Override
method toString (line 58) | @Override
FILE: assets/src/main/java/haveno/asset/AddressValidationResult.java
class AddressValidationResult (line 28) | public class AddressValidationResult {
method AddressValidationResult (line 36) | private AddressValidationResult(boolean isValid, String message, Strin...
method isValid (line 42) | public boolean isValid() {
method getI18nKey (line 46) | public String getI18nKey() {
method getMessage (line 50) | public String getMessage() {
method validAddress (line 54) | public static AddressValidationResult validAddress() {
method invalidAddress (line 58) | public static AddressValidationResult invalidAddress(Throwable cause) {
method invalidAddress (line 62) | public static AddressValidationResult invalidAddress(String cause) {
method invalidAddress (line 66) | public static AddressValidationResult invalidAddress(String cause, Str...
method invalidStructure (line 70) | public static AddressValidationResult invalidStructure() {
FILE: assets/src/main/java/haveno/asset/AddressValidator.java
type AddressValidator (line 26) | public interface AddressValidator {
method validate (line 28) | AddressValidationResult validate(String address);
FILE: assets/src/main/java/haveno/asset/Asset.java
type Asset (line 39) | public interface Asset {
method getName (line 41) | String getName();
method getTickerSymbol (line 43) | String getTickerSymbol();
method validateAddress (line 45) | AddressValidationResult validateAddress(String address);
FILE: assets/src/main/java/haveno/asset/AssetRegistry.java
class AssetRegistry (line 33) | public class AssetRegistry {
method stream (line 43) | public Stream<Asset> stream() {
FILE: assets/src/main/java/haveno/asset/Base58AddressValidator.java
class Base58AddressValidator (line 32) | public class Base58AddressValidator implements AddressValidator {
method Base58AddressValidator (line 36) | public Base58AddressValidator() {
method Base58AddressValidator (line 40) | public Base58AddressValidator(NetworkParameters networkParameters) {
method validate (line 44) | @Override
FILE: assets/src/main/java/haveno/asset/BitcoinAddressValidator.java
class BitcoinAddressValidator (line 30) | public class BitcoinAddressValidator implements AddressValidator {
method BitcoinAddressValidator (line 34) | public BitcoinAddressValidator() {
method BitcoinAddressValidator (line 38) | public BitcoinAddressValidator(NetworkParameters networkParameters) {
method validate (line 42) | @Override
FILE: assets/src/main/java/haveno/asset/BitcoinCashAddressValidator.java
class BitcoinCashAddressValidator (line 23) | public class BitcoinCashAddressValidator extends RegexAddressValidator {
method BitcoinCashAddressValidator (line 25) | public BitcoinCashAddressValidator() {
method BitcoinCashAddressValidator (line 29) | public BitcoinCashAddressValidator(String errorMessageI18nKey) {
FILE: assets/src/main/java/haveno/asset/CardanoAddressValidator.java
class CardanoAddressValidator (line 23) | public class CardanoAddressValidator extends RegexAddressValidator {
method CardanoAddressValidator (line 30) | public CardanoAddressValidator() {
method CardanoAddressValidator (line 34) | public CardanoAddressValidator(String errorMessageI18nKey) {
method validate (line 38) | @Override
method isValidShelleyMainnet (line 54) | private static boolean isValidShelleyMainnet(String addr) {
method hrpExpand (line 85) | private static int[] hrpExpand(String hrp) {
method polymod (line 94) | private static int polymod(int[] values) {
FILE: assets/src/main/java/haveno/asset/Coin.java
class Coin (line 34) | public abstract class Coin extends AbstractAsset {
type Network (line 36) | public enum Network { MAINNET, TESTNET, STAGENET }
method Coin (line 40) | public Coin(String name, String tickerSymbol, AddressValidator address...
method Coin (line 44) | public Coin(String name, String tickerSymbol, AddressValidator address...
method getNetwork (line 49) | public Network getNetwork() {
FILE: assets/src/main/java/haveno/asset/CryptoNoteAddressValidator.java
class CryptoNoteAddressValidator (line 25) | public class CryptoNoteAddressValidator implements AddressValidator {
method CryptoNoteAddressValidator (line 30) | public CryptoNoteAddressValidator(boolean validateChecksum, long... va...
method CryptoNoteAddressValidator (line 35) | public CryptoNoteAddressValidator(long... validPrefixes) {
method validate (line 39) | @Override
FILE: assets/src/main/java/haveno/asset/CryptoNoteUtils.java
class CryptoNoteUtils (line 28) | public class CryptoNoteUtils {
method getRawSpendKeyAndViewKey (line 29) | public static String getRawSpendKeyAndViewKey(String address) throws C...
class CryptoNoteException (line 53) | public static class CryptoNoteException extends Exception {
method CryptoNoteException (line 54) | CryptoNoteException(String msg) {
method CryptoNoteException (line 58) | public CryptoNoteException(CryptoNoteException exception) {
class Keccak (line 63) | static class Keccak {
method rotateLeft (line 86) | private static long rotateLeft(long value, int shift) {
method keccakf (line 90) | private static void keccakf(long[] st, int rounds) {
method keccak1600 (line 126) | static ByteBuffer keccak1600(ByteBuffer input) {
class MoneroBase58 (line 157) | static class MoneroBase58 {
method decodeChunk (line 173) | private static void decodeChunk(String input,
method decode (line 205) | public static byte[] decode(String input) throws CryptoNoteException {
method readVarInt (line 229) | private static long readVarInt(ByteBuffer buffer) {
method decodeAddress (line 241) | static long decodeAddress(String address, boolean validateChecksum) ...
FILE: assets/src/main/java/haveno/asset/Erc20Token.java
class Erc20Token (line 28) | public abstract class Erc20Token extends Token {
method Erc20Token (line 30) | public Erc20Token(String name, String tickerSymbol) {
FILE: assets/src/main/java/haveno/asset/EtherAddressValidator.java
class EtherAddressValidator (line 31) | public class EtherAddressValidator extends RegexAddressValidator {
method EtherAddressValidator (line 33) | public EtherAddressValidator() {
method EtherAddressValidator (line 37) | public EtherAddressValidator(String errorMessageI18nKey) {
FILE: assets/src/main/java/haveno/asset/GrinAddressValidator.java
class GrinAddressValidator (line 51) | public class GrinAddressValidator implements AddressValidator {
method GrinAddressValidator (line 61) | public GrinAddressValidator() {
method validate (line 64) | @Override
FILE: assets/src/main/java/haveno/asset/I18n.java
class I18n (line 5) | public class I18n {
FILE: assets/src/main/java/haveno/asset/LiquidBitcoinAddressValidator.java
class LiquidBitcoinAddressValidator (line 3) | public class LiquidBitcoinAddressValidator extends RegexAddressValidator {
method LiquidBitcoinAddressValidator (line 6) | public LiquidBitcoinAddressValidator() {
FILE: assets/src/main/java/haveno/asset/NetworkParametersAdapter.java
class NetworkParametersAdapter (line 37) | public abstract class NetworkParametersAdapter extends NetworkParameters {
method getPaymentProtocolId (line 39) | @Override
method checkDifficultyTransitions (line 44) | @Override
method getMaxMoney (line 49) | @Override
method getMinNonDustOutput (line 54) | @Override
method getMonetaryFormat (line 59) | @Override
method getUriScheme (line 64) | @Override
method hasMaxMoney (line 69) | @Override
method getSerializer (line 74) | @Override
method getProtocolVersionNum (line 79) | @Override
FILE: assets/src/main/java/haveno/asset/PrintTool.java
class PrintTool (line 22) | public class PrintTool {
method main (line 24) | public static void main(String[] args) {
class Pair (line 42) | private static class Pair {
method Pair (line 46) | Pair(String left, String right) {
FILE: assets/src/main/java/haveno/asset/RegexAddressValidator.java
class RegexAddressValidator (line 26) | public class RegexAddressValidator implements AddressValidator {
method RegexAddressValidator (line 31) | public RegexAddressValidator(String regex) {
method RegexAddressValidator (line 35) | public RegexAddressValidator(String regex, String errorMessageI18nKey) {
method validate (line 40) | @Override
FILE: assets/src/main/java/haveno/asset/RippleAddressValidator.java
class RippleAddressValidator (line 23) | public class RippleAddressValidator extends RegexAddressValidator {
method RippleAddressValidator (line 25) | public RippleAddressValidator() {
method RippleAddressValidator (line 29) | public RippleAddressValidator(String errorMessageI18nKey) {
FILE: assets/src/main/java/haveno/asset/SolanaAddressValidator.java
class SolanaAddressValidator (line 25) | public class SolanaAddressValidator implements AddressValidator {
method SolanaAddressValidator (line 29) | public SolanaAddressValidator() {
method validate (line 32) | @Override
method isValidSolanaAddress (line 48) | private static boolean isValidSolanaAddress(String address) {
method decodeBase58 (line 62) | private static byte[] decodeBase58(String input) {
FILE: assets/src/main/java/haveno/asset/Token.java
class Token (line 32) | public abstract class Token extends AbstractAsset {
method Token (line 34) | public Token(String name, String tickerSymbol, AddressValidator addres...
FILE: assets/src/main/java/haveno/asset/Trc20Token.java
class Trc20Token (line 24) | public abstract class Trc20Token extends Token {
method Trc20Token (line 26) | public Trc20Token(String name, String tickerSymbol) {
FILE: assets/src/main/java/haveno/asset/TronAddressValidator.java
class TronAddressValidator (line 27) | public class TronAddressValidator implements AddressValidator {
method TronAddressValidator (line 32) | public TronAddressValidator() {
method validate (line 35) | @Override
method isValidTronAddress (line 51) | private static boolean isValidTronAddress(String address) {
method decodeBase58 (line 68) | private static byte[] decodeBase58(String input) {
method doubleSHA256 (line 96) | private static byte[] doubleSHA256(byte[] data) {
FILE: assets/src/main/java/haveno/asset/coins/Bitcoin.java
class Bitcoin (line 27) | public abstract class Bitcoin extends Coin {
method Bitcoin (line 29) | public Bitcoin(Network network, NetworkParameters networkParameters) {
class Mainnet (line 34) | public static class Mainnet extends Bitcoin {
method Mainnet (line 36) | public Mainnet() {
class Testnet (line 42) | public static class Testnet extends Bitcoin {
method Testnet (line 44) | public Testnet() {
class Regtest (line 50) | public static class Regtest extends Bitcoin {
method Regtest (line 52) | public Regtest() {
FILE: assets/src/main/java/haveno/asset/coins/BitcoinCash.java
class BitcoinCash (line 23) | public class BitcoinCash extends Coin {
method BitcoinCash (line 25) | public BitcoinCash() {
FILE: assets/src/main/java/haveno/asset/coins/Cardano.java
class Cardano (line 23) | public class Cardano extends Coin {
method Cardano (line 25) | public Cardano() {
FILE: assets/src/main/java/haveno/asset/coins/Dogecoin.java
class Dogecoin (line 24) | public class Dogecoin extends Coin {
method Dogecoin (line 26) | public Dogecoin() {
class DogecoinMainNetParams (line 30) | public static class DogecoinMainNetParams extends NetworkParametersAda...
method DogecoinMainNetParams (line 31) | public DogecoinMainNetParams() {
FILE: assets/src/main/java/haveno/asset/coins/Ether.java
class Ether (line 23) | public class Ether extends Coin {
method Ether (line 25) | public Ether() {
FILE: assets/src/main/java/haveno/asset/coins/Litecoin.java
class Litecoin (line 24) | public class Litecoin extends Coin {
method Litecoin (line 25) | public Litecoin() {
class LitecoinMainNetParams (line 29) | public static class LitecoinMainNetParams extends NetworkParametersAda...
method LitecoinMainNetParams (line 30) | public LitecoinMainNetParams() {
FILE: assets/src/main/java/haveno/asset/coins/Monero.java
class Monero (line 24) | @CryptoAccountDisclaimer("account.crypto.popup.xmr.msg")
method Monero (line 27) | public Monero() {
FILE: assets/src/main/java/haveno/asset/coins/Ripple.java
class Ripple (line 23) | public class Ripple extends Coin {
method Ripple (line 25) | public Ripple() {
FILE: assets/src/main/java/haveno/asset/coins/Solana.java
class Solana (line 23) | public class Solana extends Coin {
method Solana (line 25) | public Solana() {
FILE: assets/src/main/java/haveno/asset/coins/Tron.java
class Tron (line 23) | public class Tron extends Coin {
method Tron (line 25) | public Tron() {
FILE: assets/src/main/java/haveno/asset/tokens/AugmintEuro.java
class AugmintEuro (line 22) | public class AugmintEuro extends Erc20Token {
method AugmintEuro (line 24) | public AugmintEuro() {
FILE: assets/src/main/java/haveno/asset/tokens/DaiStablecoinERC20.java
class DaiStablecoinERC20 (line 22) | public class DaiStablecoinERC20 extends Erc20Token {
method DaiStablecoinERC20 (line 24) | public DaiStablecoinERC20() {
FILE: assets/src/main/java/haveno/asset/tokens/EtherStone.java
class EtherStone (line 22) | public class EtherStone extends Erc20Token {
method EtherStone (line 24) | public EtherStone() {
FILE: assets/src/main/java/haveno/asset/tokens/TetherUSDERC20.java
class TetherUSDERC20 (line 5) | public class TetherUSDERC20 extends Erc20Token {
method TetherUSDERC20 (line 6) | public TetherUSDERC20() {
FILE: assets/src/main/java/haveno/asset/tokens/TetherUSDTRC20.java
class TetherUSDTRC20 (line 5) | public class TetherUSDTRC20 extends Trc20Token {
method TetherUSDTRC20 (line 6) | public TetherUSDTRC20() {
FILE: assets/src/main/java/haveno/asset/tokens/TrueUSD.java
class TrueUSD (line 22) | public class TrueUSD extends Erc20Token {
method TrueUSD (line 24) | public TrueUSD() {
FILE: assets/src/main/java/haveno/asset/tokens/USDCoinERC20.java
class USDCoinERC20 (line 22) | public class USDCoinERC20 extends Erc20Token {
method USDCoinERC20 (line 24) | public USDCoinERC20() {
FILE: assets/src/main/java/haveno/asset/tokens/VectorspaceAI.java
class VectorspaceAI (line 22) | public class VectorspaceAI extends Erc20Token {
method VectorspaceAI (line 24) | public VectorspaceAI() {
FILE: assets/src/test/java/haveno/asset/AbstractAssetTest.java
class AbstractAssetTest (line 42) | public abstract class AbstractAssetTest {
method AbstractAssetTest (line 48) | public AbstractAssetTest(Asset asset) {
method testPresenceInAssetRegistry (line 52) | @Test
method testBlank (line 58) | @Test
method testValidAddresses (line 63) | @Test
method testInvalidAddresses (line 66) | @Test
method assertValidAddress (line 69) | protected void assertValidAddress(String address) {
method assertInvalidAddress (line 74) | protected void assertInvalidAddress(String address) {
method hasSameTickerSymbol (line 78) | private boolean hasSameTickerSymbol(Asset asset) {
FILE: assets/src/test/java/haveno/asset/coins/BitcoinCashTest.java
class BitcoinCashTest (line 23) | public class BitcoinCashTest extends AbstractAssetTest {
method BitcoinCashTest (line 25) | public BitcoinCashTest() {
method testValidAddresses (line 29) | @Test
method testInvalidAddresses (line 37) | @Test
FILE: assets/src/test/java/haveno/asset/coins/BitcoinTest.java
class BitcoinTest (line 23) | public class BitcoinTest extends AbstractAssetTest {
method BitcoinTest (line 25) | public BitcoinTest() {
method testValidAddresses (line 29) | @Test
method testInvalidAddresses (line 38) | @Test
FILE: assets/src/test/java/haveno/asset/coins/CardanoTest.java
class CardanoTest (line 23) | public class CardanoTest extends AbstractAssetTest {
method CardanoTest (line 25) | public CardanoTest() {
method testValidAddresses (line 29) | @Test
method testInvalidAddresses (line 35) | @Test
FILE: assets/src/test/java/haveno/asset/coins/DogecoinTest.java
class DogecoinTest (line 24) | public class DogecoinTest extends AbstractAssetTest {
method DogecoinTest (line 26) | public DogecoinTest() {
method testValidAddresses (line 30) | @Test
method testInvalidAddresses (line 37) | @Test
FILE: assets/src/test/java/haveno/asset/coins/LitecoinTest.java
class LitecoinTest (line 23) | public class LitecoinTest extends AbstractAssetTest {
method LitecoinTest (line 25) | public LitecoinTest() {
method testValidAddresses (line 29) | @Test
method testInvalidAddresses (line 47) | @Test
FILE: assets/src/test/java/haveno/asset/coins/MoneroTest.java
class MoneroTest (line 23) | public class MoneroTest extends AbstractAssetTest {
method MoneroTest (line 25) | public MoneroTest() {
method testValidAddresses (line 29) | @Test
method testInvalidAddresses (line 41) | @Test
FILE: assets/src/test/java/haveno/asset/coins/RippleTest.java
class RippleTest (line 23) | public class RippleTest extends AbstractAssetTest {
method RippleTest (line 25) | public RippleTest() {
method testValidAddresses (line 29) | @Test
method testInvalidAddresses (line 38) | @Test
FILE: assets/src/test/java/haveno/asset/coins/SolanaTest.java
class SolanaTest (line 23) | public class SolanaTest extends AbstractAssetTest {
method SolanaTest (line 25) | public SolanaTest() {
method testValidAddresses (line 29) | @Test
method testInvalidAddresses (line 39) | @Test
FILE: assets/src/test/java/haveno/asset/coins/TetherUSDERC20Test.java
class TetherUSDERC20Test (line 25) | public class TetherUSDERC20Test extends AbstractAssetTest {
method TetherUSDERC20Test (line 27) | public TetherUSDERC20Test() {
method testValidAddresses (line 31) | @Test
method testInvalidAddresses (line 37) | @Test
FILE: assets/src/test/java/haveno/asset/coins/TetherUSDTRC20Test.java
class TetherUSDTRC20Test (line 25) | public class TetherUSDTRC20Test extends AbstractAssetTest {
method TetherUSDTRC20Test (line 27) | public TetherUSDTRC20Test() {
method testValidAddresses (line 31) | @Test
method testInvalidAddresses (line 36) | @Test
FILE: assets/src/test/java/haveno/asset/coins/TronTest.java
class TronTest (line 23) | public class TronTest extends AbstractAssetTest {
method TronTest (line 25) | public TronTest() {
method testValidAddresses (line 29) | @Test
method testInvalidAddresses (line 38) | @Test
FILE: cli/src/main/java/haveno/cli/CliMain.java
class CliMain (line 121) | @Slf4j
method main (line 124) | public static void main(String[] args) {
method run (line 133) | public static void run(String[] args) {
method getMethodFromCmd (line 605) | private static Method getMethodFromCmd(String methodName) {
method verifyStringIsValidDecimal (line 612) | @SuppressWarnings("SameParameterValue")
method verifyStringIsValidLong (line 624) | @SuppressWarnings("SameParameterValue")
method toLong (line 636) | private static long toLong(String param) {
method saveFileToDisk (line 644) | private static File saveFileToDisk(String prefix,
method printHelp (line 664) | private static void printHelp(OptionParser parser, @SuppressWarnings("...
FILE: cli/src/main/java/haveno/cli/ColumnHeaderConstants.java
class ColumnHeaderConstants (line 23) | class ColumnHeaderConstants {
FILE: cli/src/main/java/haveno/cli/CryptoCurrencyUtil.java
class CryptoCurrencyUtil (line 23) | public class CryptoCurrencyUtil {
method apiDoesSupportCryptoCurrency (line 25) | public static boolean apiDoesSupportCryptoCurrency(String currencyCode) {
method getSupportedCryptoCurrencies (line 29) | public static List<String> getSupportedCryptoCurrencies() {
FILE: cli/src/main/java/haveno/cli/CurrencyFormat.java
class CurrencyFormat (line 35) | @VisibleForTesting
method formatSatoshis (line 55) | public static String formatSatoshis(String sats) {
method formatSatoshis (line 60) | @SuppressWarnings("BigDecimalMethodWithoutRoundingCalled")
method formatBtc (line 65) | @SuppressWarnings("BigDecimalMethodWithoutRoundingCalled")
method formatBsq (line 70) | @SuppressWarnings("BigDecimalMethodWithoutRoundingCalled")
method formatInternalFiatPrice (line 75) | public static String formatInternalFiatPrice(BigDecimal price) {
method formatInternalFiatPrice (line 81) | public static String formatInternalFiatPrice(double price) {
method formatPrice (line 87) | public static String formatPrice(long price) {
method formatFiatVolume (line 94) | public static String formatFiatVolume(long volume) {
method toSatoshis (line 101) | public static long toSatoshis(String btc) {
method formatFeeSatoshis (line 112) | public static String formatFeeSatoshis(long sats) {
FILE: cli/src/main/java/haveno/cli/DirectionFormat.java
class DirectionFormat (line 30) | class DirectionFormat {
method getLongestDirectionColWidth (line 32) | static int getLongestDirectionColWidth(List<OfferInfo> offers) {
method getMirroredDirection (line 57) | static String getMirroredDirection(String directionAsString) {
FILE: cli/src/main/java/haveno/cli/GrpcClient.java
class GrpcClient (line 41) | @SuppressWarnings("ResultOfMethodCallIgnored")
method GrpcClient (line 51) | public GrpcClient(String apiHost,
method getVersion (line 61) | public String getVersion() {
method getBalances (line 66) | public BalancesInfo getBalances() {
method getBtcBalances (line 70) | public BtcBalanceInfo getBtcBalances() {
method getBalances (line 74) | public BalancesInfo getBalances(String currencyCode) {
method getAddressBalance (line 78) | public AddressBalanceInfo getAddressBalance(String address) {
method getBtcPrice (line 82) | public double getBtcPrice(String currencyCode) {
method getFundingAddresses (line 86) | public List<AddressBalanceInfo> getFundingAddresses() {
method getUnusedBtcAddress (line 90) | public String getUnusedBtcAddress() {
method createFixedPricedOffer (line 94) | public OfferInfo createFixedPricedOffer(String direction,
method createMarketBasedPricedOffer (line 113) | public OfferInfo createMarketBasedPricedOffer(String direction,
method createOffer (line 133) | public OfferInfo createOffer(String direction,
method cancelOffer (line 155) | public void cancelOffer(String offerId) {
method getOffer (line 159) | public OfferInfo getOffer(String offerId) {
method getMyOffer (line 163) | @Deprecated // Since 5-Dec-2021.
method getOffers (line 169) | public List<OfferInfo> getOffers(String direction, String currencyCode) {
method getOffersSortedByDate (line 173) | public List<OfferInfo> getOffersSortedByDate(String currencyCode) {
method getOffersSortedByDate (line 177) | public List<OfferInfo> getOffersSortedByDate(String direction, String ...
method getMyOffers (line 181) | public List<OfferInfo> getMyOffers(String direction, String currencyCo...
method getMyOffersSortedByDate (line 185) | public List<OfferInfo> getMyOffersSortedByDate(String currencyCode) {
method getMyOffersSortedByDate (line 189) | public List<OfferInfo> getMyOffersSortedByDate(String direction, Strin...
method takeOffer (line 193) | public TradeInfo takeOffer(String offerId, String paymentAccountId) {
method getTrade (line 197) | public TradeInfo getTrade(String tradeId) {
method getOpenTrades (line 201) | public List<TradeInfo> getOpenTrades() {
method getTradeHistory (line 205) | public List<TradeInfo> getTradeHistory(GetTradesRequest.Category categ...
method confirmPaymentSent (line 209) | public void confirmPaymentSent(String tradeId) {
method confirmPaymentReceived (line 213) | public void confirmPaymentReceived(String tradeId) {
method withdrawFunds (line 217) | public void withdrawFunds(String tradeId, String address, String memo) {
method getPaymentMethods (line 221) | public List<PaymentMethod> getPaymentMethods() {
method getPaymentAcctFormAsJson (line 225) | public String getPaymentAcctFormAsJson(String paymentMethodId) {
method createPaymentAccount (line 229) | public PaymentAccount createPaymentAccount(String json) {
method getPaymentAccounts (line 233) | public List<PaymentAccount> getPaymentAccounts() {
method getPaymentAccount (line 237) | public PaymentAccount getPaymentAccount(String accountName) {
method createCryptoCurrencyPaymentAccount (line 241) | public PaymentAccount createCryptoCurrencyPaymentAccount(String accoun...
method getCryptoPaymentMethods (line 251) | public List<PaymentMethod> getCryptoPaymentMethods() {
method lockWallet (line 255) | public void lockWallet() {
method unlockWallet (line 259) | public void unlockWallet(String walletPassword, long timeout) {
method removeWalletPassword (line 263) | public void removeWalletPassword(String walletPassword) {
method setWalletPassword (line 267) | public void setWalletPassword(String walletPassword) {
method setWalletPassword (line 271) | public void setWalletPassword(String oldWalletPassword, String newWall...
method registerDisputeAgent (line 275) | public void registerDisputeAgent(String disputeAgentType, String regis...
method stopServer (line 281) | public void stopServer() {
method getMethodHelp (line 286) | public String getMethodHelp(Method method) {
FILE: cli/src/main/java/haveno/cli/GrpcStubs.java
class GrpcStubs (line 34) | public final class GrpcStubs {
method GrpcStubs (line 46) | public GrpcStubs(String apiHost, int apiPort, String apiPassword) {
FILE: cli/src/main/java/haveno/cli/Method.java
type Method (line 23) | public enum Method {
FILE: cli/src/main/java/haveno/cli/PasswordCallCredentials.java
class PasswordCallCredentials (line 33) | class PasswordCallCredentials extends CallCredentials {
method PasswordCallCredentials (line 39) | public PasswordCallCredentials(String passwordValue) {
method applyRequestMetadata (line 45) | @Override
method thisUsesUnstableApi (line 59) | @Override
FILE: cli/src/main/java/haveno/cli/TransactionFormat.java
class TransactionFormat (line 23) | @VisibleForTesting
FILE: cli/src/main/java/haveno/cli/opts/AbstractMethodOptionParser.java
class AbstractMethodOptionParser (line 33) | @SuppressWarnings("unchecked")
method AbstractMethodOptionParser (line 50) | protected AbstractMethodOptionParser(String[] args) {
method parse (line 54) | public AbstractMethodOptionParser parse() {
method isForHelp (line 64) | public boolean isForHelp() {
method verifyStringIsValidDouble (line 68) | protected void verifyStringIsValidDouble(String string) {
FILE: cli/src/main/java/haveno/cli/opts/ArgumentList.java
class ArgumentList (line 32) | public class ArgumentList {
method ArgumentList (line 50) | public ArgumentList(String... arguments) {
method getCLIArguments (line 63) | public String[] getCLIArguments() {
method getMethodArguments (line 98) | public String[] getMethodArguments() {
method hasMore (line 112) | boolean hasMore() {
method next (line 116) | @SuppressWarnings("UnusedReturnValue")
method peek (line 121) | String peek() {
FILE: cli/src/main/java/haveno/cli/opts/CancelOfferOptionParser.java
class CancelOfferOptionParser (line 21) | public class CancelOfferOptionParser extends OfferIdOptionParser impleme...
method CancelOfferOptionParser (line 23) | public CancelOfferOptionParser(String[] args) {
method parse (line 27) | public CancelOfferOptionParser parse() {
method getOfferId (line 35) | public String getOfferId() {
FILE: cli/src/main/java/haveno/cli/opts/CreateCryptoCurrencyPaymentAcctOptionParser.java
class CreateCryptoCurrencyPaymentAcctOptionParser (line 30) | public class CreateCryptoCurrencyPaymentAcctOptionParser extends Abstrac...
method CreateCryptoCurrencyPaymentAcctOptionParser (line 46) | public CreateCryptoCurrencyPaymentAcctOptionParser(String[] args) {
method parse (line 50) | public CreateCryptoCurrencyPaymentAcctOptionParser parse() {
method getAccountName (line 75) | public String getAccountName() {
method getCurrencyCode (line 79) | public String getCurrencyCode() {
method getAddress (line 83) | public String getAddress() {
method getIsTradeInstant (line 87) | public boolean getIsTradeInstant() {
FILE: cli/src/main/java/haveno/cli/opts/CreateOfferOptionParser.java
class CreateOfferOptionParser (line 33) | public class CreateOfferOptionParser extends AbstractMethodOptionParser ...
method CreateOfferOptionParser (line 63) | public CreateOfferOptionParser(String[] args) {
method parse (line 67) | @Override
method getPaymentAccountId (line 109) | public String getPaymentAccountId() {
method getDirection (line 113) | public String getDirection() {
method getCurrencyCode (line 117) | public String getCurrencyCode() {
method getAmount (line 121) | public String getAmount() {
method getMinAmount (line 125) | public String getMinAmount() {
method isUsingMktPriceMargin (line 129) | public boolean isUsingMktPriceMargin() {
method getMktPriceMarginPct (line 133) | public double getMktPriceMarginPct() {
method getFixedPrice (line 137) | public String getFixedPrice() {
method getSecurityDepositPct (line 141) | public double getSecurityDepositPct() {
FILE: cli/src/main/java/haveno/cli/opts/CreatePaymentAcctOptionParser.java
class CreatePaymentAcctOptionParser (line 29) | public class CreatePaymentAcctOptionParser extends AbstractMethodOptionP...
method CreatePaymentAcctOptionParser (line 35) | public CreatePaymentAcctOptionParser(String[] args) {
method parse (line 39) | public CreatePaymentAcctOptionParser parse() {
method getPaymentAcctForm (line 58) | public Path getPaymentAcctForm() {
FILE: cli/src/main/java/haveno/cli/opts/GetAddressBalanceOptionParser.java
class GetAddressBalanceOptionParser (line 25) | public class GetAddressBalanceOptionParser extends AbstractMethodOptionP...
method GetAddressBalanceOptionParser (line 30) | public GetAddressBalanceOptionParser(String[] args) {
method parse (line 34) | public GetAddressBalanceOptionParser parse() {
method getAddress (line 47) | public String getAddress() {
FILE: cli/src/main/java/haveno/cli/opts/GetBTCMarketPriceOptionParser.java
class GetBTCMarketPriceOptionParser (line 25) | public class GetBTCMarketPriceOptionParser extends AbstractMethodOptionP...
method GetBTCMarketPriceOptionParser (line 30) | public GetBTCMarketPriceOptionParser(String[] args) {
method parse (line 34) | public GetBTCMarketPriceOptionParser parse() {
method getCurrencyCode (line 47) | public String getCurrencyCode() {
FILE: cli/src/main/java/haveno/cli/opts/GetBalanceOptionParser.java
class GetBalanceOptionParser (line 26) | public class GetBalanceOptionParser extends AbstractMethodOptionParser i...
method GetBalanceOptionParser (line 32) | public GetBalanceOptionParser(String[] args) {
method parse (line 36) | public GetBalanceOptionParser parse() {
method getCurrencyCode (line 40) | public String getCurrencyCode() {
FILE: cli/src/main/java/haveno/cli/opts/GetOfferOptionParser.java
class GetOfferOptionParser (line 25) | public class GetOfferOptionParser extends AbstractMethodOptionParser imp...
method GetOfferOptionParser (line 30) | public GetOfferOptionParser(String[] args) {
method parse (line 34) | public GetOfferOptionParser parse() {
method getOfferId (line 47) | public String getOfferId() {
FILE: cli/src/main/java/haveno/cli/opts/GetOffersOptionParser.java
class GetOffersOptionParser (line 26) | public class GetOffersOptionParser extends AbstractMethodOptionParser im...
method GetOffersOptionParser (line 34) | public GetOffersOptionParser(String[] args) {
method parse (line 38) | public GetOffersOptionParser parse() {
method getDirection (line 54) | public String getDirection() {
method getCurrencyCode (line 58) | public String getCurrencyCode() {
FILE: cli/src/main/java/haveno/cli/opts/GetPaymentAcctFormOptionParser.java
class GetPaymentAcctFormOptionParser (line 25) | public class GetPaymentAcctFormOptionParser extends AbstractMethodOption...
method GetPaymentAcctFormOptionParser (line 31) | public GetPaymentAcctFormOptionParser(String[] args) {
method parse (line 35) | public GetPaymentAcctFormOptionParser parse() {
method getPaymentMethodId (line 48) | public String getPaymentMethodId() {
FILE: cli/src/main/java/haveno/cli/opts/GetTradeOptionParser.java
class GetTradeOptionParser (line 26) | public class GetTradeOptionParser extends AbstractMethodOptionParser imp...
method GetTradeOptionParser (line 36) | public GetTradeOptionParser(String[] args) {
method parse (line 40) | public GetTradeOptionParser parse() {
method getTradeId (line 53) | public String getTradeId() {
method getShowContract (line 57) | public boolean getShowContract() {
FILE: cli/src/main/java/haveno/cli/opts/GetTradesOptionParser.java
class GetTradesOptionParser (line 32) | public class GetTradesOptionParser extends AbstractMethodOptionParser im...
type CATEGORY (line 35) | private enum CATEGORY {
method CATEGORY (line 43) | CATEGORY(GetTradesRequest.Category grpcRequestCategory) {
method GetTradesOptionParser (line 56) | public GetTradesOptionParser(String[] args) {
method parse (line 60) | public GetTradesOptionParser parse() {
method getCategory (line 79) | public GetTradesRequest.Category getCategory() {
FILE: cli/src/main/java/haveno/cli/opts/GetTransactionOptionParser.java
class GetTransactionOptionParser (line 25) | public class GetTransactionOptionParser extends AbstractMethodOptionPars...
method GetTransactionOptionParser (line 30) | public GetTransactionOptionParser(String[] args) {
method parse (line 34) | public GetTransactionOptionParser parse() {
method getTxId (line 47) | public String getTxId() {
FILE: cli/src/main/java/haveno/cli/opts/MethodOpts.java
type MethodOpts (line 20) | public interface MethodOpts {
method parse (line 22) | MethodOpts parse();
method isForHelp (line 24) | boolean isForHelp();
FILE: cli/src/main/java/haveno/cli/opts/OfferIdOptionParser.java
class OfferIdOptionParser (line 29) | public class OfferIdOptionParser extends AbstractMethodOptionParser impl...
method OfferIdOptionParser (line 34) | public OfferIdOptionParser(String[] args) {
method OfferIdOptionParser (line 38) | public OfferIdOptionParser(String[] args, boolean allowsUnrecognizedOp...
method parse (line 44) | public OfferIdOptionParser parse() {
method getOfferId (line 57) | public String getOfferId() {
FILE: cli/src/main/java/haveno/cli/opts/OptLabel.java
class OptLabel (line 23) | public class OptLabel {
FILE: cli/src/main/java/haveno/cli/opts/RegisterDisputeAgentOptionParser.java
class RegisterDisputeAgentOptionParser (line 26) | public class RegisterDisputeAgentOptionParser extends AbstractMethodOpti...
method RegisterDisputeAgentOptionParser (line 34) | public RegisterDisputeAgentOptionParser(String[] args) {
method parse (line 38) | public RegisterDisputeAgentOptionParser parse() {
method getDisputeAgentType (line 54) | public String getDisputeAgentType() {
method getRegistrationKey (line 58) | public String getRegistrationKey() {
FILE: cli/src/main/java/haveno/cli/opts/RemoveWalletPasswordOptionParser.java
class RemoveWalletPasswordOptionParser (line 25) | public class RemoveWalletPasswordOptionParser extends AbstractMethodOpti...
method RemoveWalletPasswordOptionParser (line 30) | public RemoveWalletPasswordOptionParser(String[] args) {
method parse (line 34) | public RemoveWalletPasswordOptionParser parse() {
method getPassword (line 47) | public String getPassword() {
FILE: cli/src/main/java/haveno/cli/opts/SendBtcOptionParser.java
class SendBtcOptionParser (line 29) | public class SendBtcOptionParser extends AbstractMethodOptionParser impl...
method SendBtcOptionParser (line 45) | public SendBtcOptionParser(String[] args) {
method parse (line 49) | public SendBtcOptionParser parse() {
method getAddress (line 65) | public String getAddress() {
method getAmount (line 69) | public String getAmount() {
method getFeeRate (line 73) | public String getFeeRate() {
method getMemo (line 77) | public String getMemo() {
FILE: cli/src/main/java/haveno/cli/opts/SetTxFeeRateOptionParser.java
class SetTxFeeRateOptionParser (line 25) | public class SetTxFeeRateOptionParser extends AbstractMethodOptionParser...
method SetTxFeeRateOptionParser (line 31) | public SetTxFeeRateOptionParser(String[] args) {
method parse (line 35) | public SetTxFeeRateOptionParser parse() {
method getFeeRate (line 48) | public String getFeeRate() {
FILE: cli/src/main/java/haveno/cli/opts/SetWalletPasswordOptionParser.java
class SetWalletPasswordOptionParser (line 27) | public class SetWalletPasswordOptionParser extends AbstractMethodOptionP...
method SetWalletPasswordOptionParser (line 36) | public SetWalletPasswordOptionParser(String[] args) {
method parse (line 40) | public SetWalletPasswordOptionParser parse() {
method getPassword (line 53) | public String getPassword() {
method getNewPassword (line 57) | public String getNewPassword() {
FILE: cli/src/main/java/haveno/cli/opts/SimpleMethodOptionParser.java
class SimpleMethodOptionParser (line 21) | public class SimpleMethodOptionParser extends AbstractMethodOptionParser...
method SimpleMethodOptionParser (line 23) | public SimpleMethodOptionParser(String[] args) {
method parse (line 27) | public SimpleMethodOptionParser parse() {
FILE: cli/src/main/java/haveno/cli/opts/TakeOfferOptionParser.java
class TakeOfferOptionParser (line 25) | public class TakeOfferOptionParser extends OfferIdOptionParser implement...
method TakeOfferOptionParser (line 30) | public TakeOfferOptionParser(String[] args) {
method parse (line 34) | public TakeOfferOptionParser parse() {
method getPaymentAccountId (line 45) | public String getPaymentAccountId() {
FILE: cli/src/main/java/haveno/cli/opts/UnlockWalletOptionParser.java
class UnlockWalletOptionParser (line 26) | public class UnlockWalletOptionParser extends AbstractMethodOptionParser...
method UnlockWalletOptionParser (line 36) | public UnlockWalletOptionParser(String[] args) {
method parse (line 40) | public UnlockWalletOptionParser parse() {
method getPassword (line 56) | public String getPassword() {
method getUnlockTimeout (line 60) | public long getUnlockTimeout() {
FILE: cli/src/main/java/haveno/cli/opts/WithdrawFundsOptionParser.java
class WithdrawFundsOptionParser (line 28) | public class WithdrawFundsOptionParser extends AbstractMethodOptionParse...
method WithdrawFundsOptionParser (line 40) | public WithdrawFundsOptionParser(String[] args) {
method parse (line 44) | public WithdrawFundsOptionParser parse() {
method getTradeId (line 60) | public String getTradeId() {
method getAddress (line 64) | public String getAddress() {
method getMemo (line 68) | public String getMemo() {
FILE: cli/src/main/java/haveno/cli/request/OffersServiceRequest.java
class OffersServiceRequest (line 37) | public class OffersServiceRequest {
method OffersServiceRequest (line 41) | public OffersServiceRequest(GrpcStubs grpcStubs) {
method createFixedPricedOffer (line 45) | @SuppressWarnings("unused")
method createOffer (line 66) | public OfferInfo createOffer(String direction,
method cancelOffer (line 91) | public void cancelOffer(String offerId) {
method getOffer (line 99) | public OfferInfo getOffer(String offerId) {
method getMyOffer (line 106) | public OfferInfo getMyOffer(String offerId) {
method getOffers (line 113) | public List<OfferInfo> getOffers(String direction, String currencyCode) {
method getOffersSortedByDate (line 121) | public List<OfferInfo> getOffersSortedByDate(String currencyCode) {
method getOffersSortedByDate (line 128) | public List<OfferInfo> getOffersSortedByDate(String direction, String ...
method getMyOffers (line 133) | public List<OfferInfo> getMyOffers(String direction, String currencyCo...
method getMyOffersSortedByDate (line 141) | public List<OfferInfo> getMyOffersSortedByDate(String currencyCode) {
method getMyOffersSortedByDate (line 148) | public List<OfferInfo> getMyOffersSortedByDate(String direction, Strin...
method getMostRecentOffer (line 153) | public OfferInfo getMostRecentOffer(String direction, String currencyC...
method sortOffersByDate (line 158) | public List<OfferInfo> sortOffersByDate(List<OfferInfo> offerInfoList) {
FILE: cli/src/main/java/haveno/cli/request/PaymentAccountsServiceRequest.java
class PaymentAccountsServiceRequest (line 34) | public class PaymentAccountsServiceRequest {
method PaymentAccountsServiceRequest (line 38) | public PaymentAccountsServiceRequest(GrpcStubs grpcStubs) {
method getPaymentMethods (line 42) | public List<PaymentMethod> getPaymentMethods() {
method getPaymentAcctFormAsJson (line 47) | public String getPaymentAcctFormAsJson(String paymentMethodId) {
method createPaymentAccount (line 54) | public PaymentAccount createPaymentAccount(String json) {
method getPaymentAccounts (line 61) | public List<PaymentAccount> getPaymentAccounts() {
method getPaymentAccount (line 74) | public PaymentAccount getPaymentAccount(String accountName) {
method createCryptoCurrencyPaymentAccount (line 82) | public PaymentAccount createCryptoCurrencyPaymentAccount(String accoun...
method getCryptoPaymentMethods (line 95) | public List<PaymentMethod> getCryptoPaymentMethods() {
FILE: cli/src/main/java/haveno/cli/request/TradesServiceRequest.java
class TradesServiceRequest (line 35) | public class TradesServiceRequest {
method TradesServiceRequest (line 39) | public TradesServiceRequest(GrpcStubs grpcStubs) {
method getTakeOfferReply (line 43) | public TakeOfferReply getTakeOfferReply(String offerId, String payment...
method takeOffer (line 51) | public TradeInfo takeOffer(String offerId, String paymentAccountId) {
method getTrade (line 59) | public TradeInfo getTrade(String tradeId) {
method getOpenTrades (line 66) | public List<TradeInfo> getOpenTrades() {
method getTradeHistory (line 72) | public List<TradeInfo> getTradeHistory(GetTradesRequest.Category categ...
method confirmPaymentSent (line 82) | public void confirmPaymentSent(String tradeId) {
method confirmPaymentReceived (line 90) | public void confirmPaymentReceived(String tradeId) {
method withdrawFunds (line 98) | public void withdrawFunds(String tradeId, String address, String memo) {
FILE: cli/src/main/java/haveno/cli/request/WalletsServiceRequest.java
class WalletsServiceRequest (line 35) | public class WalletsServiceRequest {
method WalletsServiceRequest (line 39) | public WalletsServiceRequest(GrpcStubs grpcStubs) {
method getBalances (line 43) | public BalancesInfo getBalances() {
method getBtcBalances (line 47) | public BtcBalanceInfo getBtcBalances() {
method getBalances (line 51) | public BalancesInfo getBalances(String currencyCode) {
method getAddressBalance (line 58) | public AddressBalanceInfo getAddressBalance(String address) {
method getBtcPrice (line 64) | public double getBtcPrice(String currencyCode) {
method getFundingAddresses (line 71) | public List<AddressBalanceInfo> getFundingAddresses() {
method getUnusedBtcAddress (line 76) | public String getUnusedBtcAddress() {
method lockWallet (line 88) | public void lockWallet() {
method unlockWallet (line 94) | public void unlockWallet(String walletPassword, long timeout) {
method removeWalletPassword (line 102) | public void removeWalletPassword(String walletPassword) {
method setWalletPassword (line 109) | public void setWalletPassword(String walletPassword) {
method setWalletPassword (line 116) | public void setWalletPassword(String oldWalletPassword, String newWall...
FILE: cli/src/main/java/haveno/cli/table/Table.java
class Table (line 44) | public class Table {
method Table (line 57) | public Table(Column<?>... columns) {
method print (line 68) | public void print(PrintStream printStream) {
method printColumnNames (line 80) | private void printColumnNames(PrintStream printStream) {
method printRow (line 99) | private void printRow(PrintStream printStream, int rowIndex) {
method toString (line 115) | @Override
method validateStructure (line 127) | private void validateStructure() {
FILE: cli/src/main/java/haveno/cli/table/builder/AbstractTableBuilder.java
class AbstractTableBuilder (line 29) | abstract class AbstractTableBuilder {
method AbstractTableBuilder (line 36) | AbstractTableBuilder(TableType tableType, List<?> protos) {
method build (line 43) | public abstract Table build();
FILE: cli/src/main/java/haveno/cli/table/builder/AbstractTradeListBuilder.java
class AbstractTradeListBuilder (line 40) | abstract class AbstractTradeListBuilder extends AbstractTableBuilder {
method AbstractTradeListBuilder (line 96) | AbstractTradeListBuilder(TableType tableType, List<?> protos) {
method validate (line 133) | protected void validate() {
FILE: cli/src/main/java/haveno/cli/table/builder/AddressBalanceTableBuilder.java
class AddressBalanceTableBuilder (line 42) | class AddressBalanceTableBuilder extends AbstractTableBuilder {
method AddressBalanceTableBuilder (line 50) | AddressBalanceTableBuilder(List<?> protos) {
method build (line 58) | public Table build() {
FILE: cli/src/main/java/haveno/cli/table/builder/BtcBalanceTableBuilder.java
class BtcBalanceTableBuilder (line 37) | class BtcBalanceTableBuilder extends AbstractTableBuilder {
method BtcBalanceTableBuilder (line 45) | BtcBalanceTableBuilder(List<?> protos) {
method build (line 53) | @Override
FILE: cli/src/main/java/haveno/cli/table/builder/ClosedTradeTableBuilder.java
class ClosedTradeTableBuilder (line 26) | @SuppressWarnings("ConstantConditions")
method ClosedTradeTableBuilder (line 29) | ClosedTradeTableBuilder(List<?> protos) {
method build (line 33) | @Override
method populateColumns (line 51) | private void populateColumns() {
FILE: cli/src/main/java/haveno/cli/table/builder/FailedTradeTableBuilder.java
class FailedTradeTableBuilder (line 29) | @SuppressWarnings("ConstantConditions")
method FailedTradeTableBuilder (line 32) | FailedTradeTableBuilder(List<?> protos) {
method build (line 36) | public Table build() {
method populateColumns (line 50) | private void populateColumns() {
FILE: cli/src/main/java/haveno/cli/table/builder/OfferTableBuilder.java
class OfferTableBuilder (line 57) | class OfferTableBuilder extends AbstractTableBuilder {
method OfferTableBuilder (line 67) | OfferTableBuilder(List<?> protos) {
method build (line 71) | @Override
method buildTraditionalOfferTable (line 79) | @SuppressWarnings("ConstantConditions")
method buildCryptoCurrencyOfferTable (line 141) | @SuppressWarnings("ConstantConditions")
FILE: cli/src/main/java/haveno/cli/table/builder/OpenTradeTableBuilder.java
class OpenTradeTableBuilder (line 29) | @SuppressWarnings("ConstantConditions")
method OpenTradeTableBuilder (line 32) | OpenTradeTableBuilder(List<?> protos) {
method build (line 36) | public Table build() {
method populateColumns (line 49) | private void populateColumns() {
FILE: cli/src/main/java/haveno/cli/table/builder/PaymentAccountTableBuilder.java
class PaymentAccountTableBuilder (line 38) | class PaymentAccountTableBuilder extends AbstractTableBuilder {
method PaymentAccountTableBuilder (line 46) | PaymentAccountTableBuilder(List<?> protos) {
method build (line 54) | public Table build() {
FILE: cli/src/main/java/haveno/cli/table/builder/TableBuilder.java
class TableBuilder (line 32) | public class TableBuilder extends AbstractTableBuilder {
method TableBuilder (line 34) | public TableBuilder(TableType tableType, Object proto) {
method TableBuilder (line 38) | public TableBuilder(TableType tableType, List<?> protos) {
method build (line 42) | @Override
FILE: cli/src/main/java/haveno/cli/table/builder/TableBuilderConstants.java
class TableBuilderConstants (line 23) | class TableBuilderConstants {
FILE: cli/src/main/java/haveno/cli/table/builder/TableType.java
type TableType (line 24) | public enum TableType {
FILE: cli/src/main/java/haveno/cli/table/builder/TradeDetailTableBuilder.java
class TradeDetailTableBuilder (line 32) | @SuppressWarnings("ConstantConditions")
method TradeDetailTableBuilder (line 35) | TradeDetailTableBuilder(List<?> protos) {
method build (line 43) | @Override
method populateColumns (line 52) | private void populateColumns(TradeInfo trade) {
method populateHavenoV1TradeColumns (line 56) | private void populateHavenoV1TradeColumns(TradeInfo trade) {
method defineColumnList (line 73) | private List<Column<?>> defineColumnList(TradeInfo trade) {
method getHavenoV1TradeColumnList (line 77) | private List<Column<?>> getHavenoV1TradeColumnList() {
FILE: cli/src/main/java/haveno/cli/table/builder/TradeTableColumnSupplier.java
class TradeTableColumnSupplier (line 83) | @Slf4j
method TradeTableColumnSupplier (line 91) | public TradeTableColumnSupplier(TableType tableType, List<TradeInfo> t...
FILE: cli/src/main/java/haveno/cli/table/builder/TransactionTableBuilder.java
class TransactionTableBuilder (line 41) | class TransactionTableBuilder extends AbstractTableBuilder {
method TransactionTableBuilder (line 51) | TransactionTableBuilder(List<?> protos) {
method build (line 61) | public Table build() {
FILE: cli/src/main/java/haveno/cli/table/column/AbstractColumn.java
class AbstractColumn (line 27) | abstract class AbstractColumn<C extends Column<T>, T> implements Column<...
method AbstractColumn (line 40) | public AbstractColumn(String name, JUSTIFICATION justification) {
method getName (line 46) | @Override
method setName (line 51) | @Override
method getWidth (line 56) | @Override
method getJustification (line 61) | @Override
method justify (line 66) | @Override
method toJustifiedString (line 74) | protected final String toJustifiedString(String s) {
FILE: cli/src/main/java/haveno/cli/table/column/BooleanColumn.java
class BooleanColumn (line 31) | public class BooleanColumn extends AbstractColumn<BooleanColumn, Boolean> {
method BooleanColumn (line 46) | public BooleanColumn(String name) {
method BooleanColumn (line 51) | @SuppressWarnings("unused")
method BooleanColumn (line 57) | public BooleanColumn(String name, String trueAsString, String falseAsS...
method BooleanColumn (line 62) | public BooleanColumn(String name,
method addRow (line 72) | @Override
method getRows (line 84) | @Override
method rowCount (line 89) | @Override
method isEmpty (line 94) | @Override
method getRow (line 99) | @Override
method updateRow (line 104) | @Override
method getRowAsFormattedString (line 109) | @Override
method asStringColumn (line 116) | @Override
method asString (line 128) | private String asString(boolean value) {
FILE: cli/src/main/java/haveno/cli/table/column/BtcColumn.java
class BtcColumn (line 9) | public class BtcColumn extends SatoshiColumn {
method BtcColumn (line 11) | public BtcColumn(String name) {
method addRow (line 15) | @Override
method getRowAsFormattedString (line 26) | @Override
method asStringColumn (line 31) | @Override
FILE: cli/src/main/java/haveno/cli/table/column/Column.java
type Column (line 22) | public interface Column<T> {
type JUSTIFICATION (line 24) | enum JUSTIFICATION {
method getName (line 35) | String getName();
method setName (line 42) | void setName(String name);
method addRow (line 49) | void addRow(T value);
method getRows (line 56) | List<T> getRows();
method getWidth (line 64) | int getWidth();
method rowCount (line 71) | int rowCount();
method isEmpty (line 78) | boolean isEmpty();
method getRow (line 85) | T getRow(int rowIndex);
method updateRow (line 93) | void updateRow(int rowIndex, T newValue);
method getRowAsFormattedString (line 100) | String getRowAsFormattedString(int rowIndex);
method asStringColumn (line 108) | StringColumn asStringColumn();
method justify (line 114) | Column<T> justify();
method getJustification (line 121) | JUSTIFICATION getJustification();
FILE: cli/src/main/java/haveno/cli/table/column/CryptoVolumeColumn.java
class CryptoVolumeColumn (line 29) | public class CryptoVolumeColumn extends LongColumn {
type DISPLAY_MODE (line 31) | public enum DISPLAY_MODE {
method CryptoVolumeColumn (line 39) | public CryptoVolumeColumn(String name, DISPLAY_MODE displayMode) {
method CryptoVolumeColumn (line 43) | public CryptoVolumeColumn(String name,
method addRow (line 50) | @Override
method getRowAsFormattedString (line 61) | @Override
method asStringColumn (line 66) | @Override
FILE: cli/src/main/java/haveno/cli/table/column/DoubleColumn.java
class DoubleColumn (line 30) | public class DoubleColumn extends NumberColumn<DoubleColumn, Double> {
method DoubleColumn (line 37) | public DoubleColumn(String name) {
method DoubleColumn (line 41) | public DoubleColumn(String name, JUSTIFICATION justification) {
method addRow (line 46) | @Override
method getRows (line 55) | @Override
method rowCount (line 60) | @Override
method isEmpty (line 65) | @Override
method getRow (line 70) | @Override
method updateRow (line 75) | @Override
method getRowAsFormattedString (line 80) | @Override
method asStringColumn (line 86) | @Override
FILE: cli/src/main/java/haveno/cli/table/column/IntegerColumn.java
class IntegerColumn (line 30) | public class IntegerColumn extends NumberColumn<IntegerColumn, Integer> {
method IntegerColumn (line 37) | public IntegerColumn(String name) {
method IntegerColumn (line 41) | public IntegerColumn(String name, JUSTIFICATION justification) {
method addRow (line 46) | @Override
method getRows (line 55) | @Override
method rowCount (line 60) | @Override
method isEmpty (line 65) | @Override
method getRow (line 70) | @Override
method updateRow (line 75) | @Override
method getRowAsFormattedString (line 80) | @Override
method asStringColumn (line 86) | @Override
FILE: cli/src/main/java/haveno/cli/table/column/Iso8601DateTimeColumn.java
class Iso8601DateTimeColumn (line 33) | public class Iso8601DateTimeColumn extends LongColumn {
method Iso8601DateTimeColumn (line 38) | public Iso8601DateTimeColumn(String name) {
method Iso8601DateTimeColumn (line 42) | public Iso8601DateTimeColumn(String name, JUSTIFICATION justification) {
method getRowAsFormattedString (line 48) | @Override
method asStringColumn (line 56) | @Override
FILE: cli/src/main/java/haveno/cli/table/column/LongColumn.java
class LongColumn (line 30) | public class LongColumn extends NumberColumn<LongColumn, Long> {
method LongColumn (line 37) | public LongColumn(String name) {
method LongColumn (line 41) | public LongColumn(String name, JUSTIFICATION justification) {
method addRow (line 46) | @Override
method getRows (line 55) | @Override
method rowCount (line 60) | @Override
method isEmpty (line 65) | @Override
method getRow (line 70) | @Override
method updateRow (line 75) | @Override
method getRowAsFormattedString (line 80) | @Override
method asStringColumn (line 86) | @Override
FILE: cli/src/main/java/haveno/cli/table/column/MixedTradeFeeColumn.java
class MixedTradeFeeColumn (line 27) | public class MixedTradeFeeColumn extends LongColumn {
method MixedTradeFeeColumn (line 29) | public MixedTradeFeeColumn(String name) {
method addRow (line 33) | @Override
method addRow (line 38) | public void addRow(Long value, boolean isBsq) {
method getRowAsFormattedString (line 50) | @Override
method asStringColumn (line 55) | @Override
FILE: cli/src/main/java/haveno/cli/table/column/NumberColumn.java
class NumberColumn (line 26) | abstract class NumberColumn<C extends NumberColumn<C, T>,
method NumberColumn (line 29) | public NumberColumn(String name, JUSTIFICATION justification) {
FILE: cli/src/main/java/haveno/cli/table/column/SatoshiColumn.java
class SatoshiColumn (line 27) | public class SatoshiColumn extends LongColumn {
method SatoshiColumn (line 32) | public SatoshiColumn(String name) {
method SatoshiColumn (line 36) | public SatoshiColumn(String name, boolean isBsqSatoshis) {
method SatoshiColumn (line 40) | public SatoshiColumn(String name, JUSTIFICATION justification) {
method SatoshiColumn (line 44) | public SatoshiColumn(String name, JUSTIFICATION justification, boolean...
method addRow (line 49) | @Override
method getRowAsFormattedString (line 61) | @Override
method asStringColumn (line 68) | @Override
FILE: cli/src/main/java/haveno/cli/table/column/StringColumn.java
class StringColumn (line 32) | public class StringColumn extends AbstractColumn<StringColumn, String> {
method StringColumn (line 39) | public StringColumn(String name) {
method StringColumn (line 44) | public StringColumn(String name, JUSTIFICATION justification) {
method addRow (line 49) | @Override
method getRows (line 56) | @Override
method rowCount (line 61) | @Override
method isEmpty (line 66) | @Override
method getRow (line 71) | @Override
method updateRow (line 76) | @Override
method getRowAsFormattedString (line 81) | @Override
method asStringColumn (line 86) | @Override
method justify (line 91) | @Override
FILE: cli/src/main/java/haveno/cli/table/column/ZippedStringColumns.java
class ZippedStringColumns (line 34) | public class ZippedStringColumns {
type DUPLICATION_MODE (line 36) | public enum DUPLICATION_MODE {
method ZippedStringColumns (line 46) | public ZippedStringColumns(String name,
method asStringColumn (line 57) | public StringColumn asStringColumn(DUPLICATION_MODE duplicationMode) {
method buildRows (line 69) | private void buildRows(StringColumn stringColumn, DUPLICATION_MODE dup...
method buildRow (line 80) | private String buildRow(int rowIndex, DUPLICATION_MODE duplicationMode) {
method formatRows (line 105) | private void formatRows(StringColumn stringColumn) {
method validateColumnData (line 114) | private void validateColumnData() {
FILE: cli/src/test/java/haveno/cli/AbstractCliTest.java
class AbstractCliTest (line 35) | @Slf4j
method AbstractCliTest (line 60) | public AbstractCliTest() {
method getGrpcClient (line 65) | protected GrpcClient getGrpcClient(String[] args) {
method checkDiffsIgnoreWhitespace (line 87) | protected void checkDiffsIgnoreWhitespace(String oldOutput, String new...
method printOldTbl (line 109) | protected void printOldTbl(String tbl) {
method printNewTbl (line 113) | protected void printNewTbl(String tbl) {
method getMyCryptoOffers (line 117) | protected List<OfferInfo> getMyCryptoOffers(String currencyCode) {
method getMyOffersCommand (line 135) | protected String[] getMyOffersCommand(String direction, String currenc...
method getAvailableOffersCommand (line 145) | protected String[] getAvailableOffersCommand(String direction, String ...
method editOfferPriceMargin (line 156) | protected void editOfferPriceMargin(OfferInfo offer, String priceMargi...
method editOfferTriggerPrice (line 172) | protected void editOfferTriggerPrice(OfferInfo offer, String triggerPr...
method editOfferPriceMarginAndTriggerPrice (line 188) | protected void editOfferPriceMarginAndTriggerPrice(OfferInfo offer,
method editOfferFixedPrice (line 208) | protected void editOfferFixedPrice(OfferInfo offer, String fixedPrice,...
method disableOffers (line 224) | protected void disableOffers(List<OfferInfo> offers) {
method enableOffers (line 232) | protected void enableOffers(List<OfferInfo> offers) {
method editOfferEnable (line 240) | protected void editOfferEnable(OfferInfo offer, boolean enable) {
method sleep (line 255) | protected void sleep(long seconds) {
FILE: cli/src/test/java/haveno/cli/CreateOfferSmokeTest.java
class CreateOfferSmokeTest (line 18) | @SuppressWarnings({"CommentedOutCode", "unused"})
method main (line 21) | public static void main(String[] args) {
method createBsqSwapOffer (line 27) | private void createBsqSwapOffer(String direction) {
method createBsqSwapOfferCommand (line 50) | private String[] createBsqSwapOfferCommand(String direction,
FILE: cli/src/test/java/haveno/cli/EditXmrOffersSmokeTest.java
class EditXmrOffersSmokeTest (line 24) | public class EditXmrOffersSmokeTest extends AbstractCliTest {
method main (line 26) | public static void main(String[] args) {
method doOfferPriceEdits (line 43) | private void doOfferPriceEdits() {
method editPriceMargin (line 50) | private void editPriceMargin() {
method editTriggerPrice (line 61) | private void editTriggerPrice() {
method editPriceMarginAndTriggerPrice (line 76) | private void editPriceMarginAndTriggerPrice() {
method editFixedPrice (line 91) | private void editFixedPrice() {
FILE: cli/src/test/java/haveno/cli/GetOffersSmokeTest.java
class GetOffersSmokeTest (line 14) | @SuppressWarnings({"CommentedOutCode", "unused"})
method main (line 19) | public static void main(String[] args) {
method getMyBsqOffers (line 26) | private static void getMyBsqOffers() {
method getAvailableBsqOffers (line 35) | private static void getAvailableBsqOffers() {
method getMyUsdOffers (line 42) | private static void getMyUsdOffers() {
method getAvailableUsdOffers (line 49) | private static void getAvailableUsdOffers() {
method TODO (line 56) | private static void TODO() {
FILE: cli/src/test/java/haveno/cli/GetTradesSmokeTest.java
class GetTradesSmokeTest (line 12) | @SuppressWarnings("unused")
method main (line 15) | public static void main(String[] args) {
method GetTradesSmokeTest (line 24) | public GetTradesSmokeTest() {
method printAlicesTrades (line 30) | private void printAlicesTrades() {
method printBobsTrades (line 37) | private void printBobsTrades() {
method printTrade (line 44) | private void printTrade(GrpcClient client, String tradeId) {
FILE: cli/src/test/java/haveno/cli/opts/OptionParsersTest.java
class OptionParsersTest (line 24) | public class OptionParsersTest {
method testCancelOfferWithMissingOfferIdOptShouldThrowException (line 30) | @Test
method testCancelOfferWithEmptyOfferIdOptShouldThrowException (line 41) | @Test
method testCancelOfferWithMissingOfferIdValueShouldThrowException (line 53) | @Test
method testValidCancelOfferOpts (line 65) | @Test
method testCreateOfferWithMissingPaymentAccountIdOptShouldThrowException (line 77) | @Test
method testCreateOfferWithEmptyPaymentAccountIdOptShouldThrowException (line 91) | @Test
method testCreateOfferWithMissingDirectionOptShouldThrowException (line 103) | @Test
method testCreateOfferWithMissingDirectionOptValueShouldThrowException (line 116) | @Test
method testValidCreateOfferOpts (line 129) | @Test
method testCreatePaymentAcctWithMissingPaymentFormOptShouldThrowException (line 152) | @Test
method testCreatePaymentAcctWithMissingPaymentFormOptValueShouldThrowException (line 164) | @Test
method testCreatePaymentAcctWithInvalidPaymentFormOptValueShouldThrowException (line 176) | @Test
method testCreateCryptoCurrencyPaymentAcctWithMissingAcctNameOptShouldThrowException (line 195) | @Test
method testCreateCryptoCurrencyPaymentAcctWithEmptyAcctNameOptShouldThrowException (line 206) | @Test
method testCreateCryptoCurrencyPaymentAcctWithInvalidCurrencyCodeOptShouldThrowException (line 218) | @Test
method testCreateBchPaymentAcct (line 231) | @Test
FILE: cli/src/test/java/haveno/cli/table/AddressCliOutputDiffTest.java
class AddressCliOutputDiffTest (line 13) | @SuppressWarnings("unused")
method main (line 16) | public static void main(String[] args) {
method AddressCliOutputDiffTest (line 22) | public AddressCliOutputDiffTest() {
method getFundingAddresses (line 26) | private void getFundingAddresses() {
method getAddressBalance (line 41) | private void getAddressBalance() {
method getAddressBalance (line 51) | private void getAddressBalance(String address) {
FILE: cli/src/test/java/haveno/cli/table/GetBalanceCliOutputDiffTest.java
class GetBalanceCliOutputDiffTest (line 8) | @SuppressWarnings("unused")
method main (line 11) | public static void main(String[] args) {
method GetBalanceCliOutputDiffTest (line 16) | public GetBalanceCliOutputDiffTest() {
method getBtcBalance (line 20) | private void getBtcBalance() {
FILE: cli/src/test/java/haveno/cli/table/GetOffersCliOutputDiffTest.java
class GetOffersCliOutputDiffTest (line 14) | @SuppressWarnings("unused")
method main (line 21) | public static void main(String[] args) {
method GetOffersCliOutputDiffTest (line 43) | public GetOffersCliOutputDiffTest() {
method getMyBuyUsdOffers (line 47) | private void getMyBuyUsdOffers() {
method getMySellUsdOffers (line 52) | private void getMySellUsdOffers() {
method getAvailableBuyUsdOffers (line 57) | private void getAvailableBuyUsdOffers() {
method getAvailableSellUsdOffers (line 62) | private void getAvailableSellUsdOffers() {
method getMyBuyXmrOffers (line 67) | private void getMyBuyXmrOffers() {
method getMySellXmrOffers (line 72) | private void getMySellXmrOffers() {
method getAvailableBuyXmrOffers (line 77) | private void getAvailableBuyXmrOffers() {
method getAvailableSellXmrOffers (line 82) | private void getAvailableSellXmrOffers() {
method getMyBuyBsqOffers (line 87) | private void getMyBuyBsqOffers() {
method getMySellBsqOffers (line 92) | private void getMySellBsqOffers() {
method getAvailableBuyBsqOffers (line 97) | private void getAvailableBuyBsqOffers() {
method getAvailableSellBsqOffers (line 102) | private void getAvailableSellBsqOffers() {
method printAndCheckDiffs (line 107) | private void printAndCheckDiffs(List<OfferInfo> offers,
FILE: cli/src/test/java/haveno/cli/table/GetTradeCliOutputDiffTest.java
class GetTradeCliOutputDiffTest (line 11) | @SuppressWarnings("unused")
method main (line 15) | public static void main(String[] args) {
method GetTradeCliOutputDiffTest (line 27) | public GetTradeCliOutputDiffTest(String tradeId) {
method getAlicesTrade (line 32) | private void getAlicesTrade() {
method getBobsTrade (line 36) | private void getBobsTrade() {
method getTrade (line 40) | private void getTrade(GrpcClient client) {
FILE: cli/src/test/java/haveno/cli/table/GetTransactionCliOutputDiffTest.java
class GetTransactionCliOutputDiffTest (line 6) | @SuppressWarnings("unused")
method main (line 10) | public static void main(String[] args) {
method GetTransactionCliOutputDiffTest (line 19) | public GetTransactionCliOutputDiffTest(String transactionId) {
FILE: cli/src/test/java/haveno/cli/table/PaymentAccountsCliOutputDiffTest.java
class PaymentAccountsCliOutputDiffTest (line 9) | @SuppressWarnings("unused")
method main (line 13) | public static void main(String[] args) {
method PaymentAccountsCliOutputDiffTest (line 18) | public PaymentAccountsCliOutputDiffTest() {
method getPaymentAccounts (line 22) | private void getPaymentAccounts() {
FILE: common/src/main/java/haveno/common/ClockWatcher.java
class ClockWatcher (line 28) | @Slf4j
type Listener (line 33) | public interface Listener {
method onSecondTick (line 34) | void onSecondTick();
method onMinuteTick (line 36) | void onMinuteTick();
method onMissedSecondTick (line 38) | default void onMissedSecondTick(long missedMs) {
method onAwakeFromStandby (line 41) | default void onAwakeFromStandby(long missedMs) {
method ClockWatcher (line 50) | public ClockWatcher() {
method start (line 53) | public void start() {
method stop (line 82) | public void stop() {
method addListener (line 88) | public void addListener(Listener listener) {
method removeListener (line 94) | public void removeListener(Listener listener) {
FILE: common/src/main/java/haveno/common/Envelope.java
type Envelope (line 23) | public interface Envelope extends Proto {
FILE: common/src/main/java/haveno/common/FrameRateTimer.java
class FrameRateTimer (line 30) | public class FrameRateTimer implements Timer, Runnable {
method FrameRateTimer (line 40) | public FrameRateTimer() {
method run (line 43) | @Override
method runLater (line 63) | @Override
method runPeriodically (line 72) | @Override
method stop (line 82) | @Override
method equals (line 89) | @Override
method hashCode (line 100) | @Override
FILE: common/src/main/java/haveno/common/HavenoException.java
class HavenoException (line 20) | public class HavenoException extends RuntimeException {
method HavenoException (line 22) | public HavenoException(Throwable cause) {
method HavenoException (line 26) | public HavenoException(String format, Object... args) {
method HavenoException (line 30) | public HavenoException(Throwable cause, String format, Object... args) {
FILE: common/src/main/java/haveno/common/MasterTimer.java
class MasterTimer (line 28) | public class MasterTimer {
method run (line 36) | @Override
method addListener (line 45) | public static void addListener(Runnable runnable) {
method removeListener (line 49) | public static void removeListener(Runnable runnable) {
FILE: common/src/main/java/haveno/common/Payload.java
type Payload (line 23) | public interface Payload extends Proto {
FILE: common/src/main/java/haveno/common/Proto.java
type Proto (line 25) | public interface Proto {
method toProtoMessage (line 26) | Message toProtoMessage();
FILE: common/src/main/java/haveno/common/ThreadUtils.java
class ThreadUtils (line 32) | @Slf4j
method execute (line 46) | public static Future<?> execute(Runnable command, String threadId) {
method await (line 67) | public static void await(Runnable command, String threadId) {
method shutDown (line 75) | public static void shutDown(String threadId) {
method shutDown (line 79) | public static void shutDown(String threadId, Long timeoutMs) {
method reset (line 101) | public static void reset(String threadId) {
method remove (line 105) | public static void remove(String threadId) {
method isShutDown (line 114) | public static boolean isShutDown(String threadId) {
method submitToPool (line 124) | public static Future<?> submitToPool(Runnable task) {
method submitToPool (line 128) | public static List<Future<?>> submitToPool(List<Runnable> tasks) {
method awaitTask (line 134) | public static Future<?> awaitTask(Runnable task) {
method awaitTask (line 138) | public static Future<?> awaitTask(Runnable task, Long timeoutMs) {
method awaitTasks (line 142) | public static List<Future<?>> awaitTasks(Collection<Runnable> tasks) {
method awaitTasks (line 146) | public static List<Future<?>> awaitTasks(Collection<Runnable> tasks, i...
method awaitTasks (line 150) | public static List<Future<?>> awaitTasks(Collection<Runnable> tasks, i...
method isCurrentThread (line 166) | private static boolean isCurrentThread(Thread thread, String threadId) {
FILE: common/src/main/java/haveno/common/Timer.java
type Timer (line 22) | public interface Timer {
method runLater (line 23) | Timer runLater(java.time.Duration delay, Runnable action);
method runPeriodically (line 25) | Timer runPeriodically(Duration interval, Runnable runnable);
method stop (line 27) | void stop();
FILE: common/src/main/java/haveno/common/UserThread.java
class UserThread (line 42) | @Slf4j
method setTimerClass (line 50) | public static void setTimerClass(Class<? extends Timer> timerClass) {
method execute (line 60) | public static void execute(Runnable command) {
method await (line 69) | public static void await(Runnable command) {
method isUserThread (line 91) | public static boolean isUserThread(Thread thread) {
method runAfterRandomDelay (line 97) | public static Timer runAfterRandomDelay(Runnable runnable, long minDel...
method runAfterRandomDelay (line 101) | @SuppressWarnings("WeakerAccess")
method runAfter (line 106) | public static Timer runAfter(Runnable runnable, long delayInSec) {
method runAfter (line 110) | public static Timer runAfter(Runnable runnable, long delay, TimeUnit t...
method runPeriodically (line 114) | public static Timer runPeriodically(Runnable runnable, long intervalIn...
method runPeriodically (line 118) | public static Timer runPeriodically(Runnable runnable, long interval, ...
method getTimer (line 122) | private static Timer getTimer() {
FILE: common/src/main/java/haveno/common/app/AppModule.java
class AppModule (line 27) | public abstract class AppModule extends AbstractModule {
method AppModule (line 33) | protected AppModule(Config config) {
method install (line 37) | protected void install(AppModule module) {
method close (line 51) | public final void close(Injector injector) {
method doClose (line 62) | @SuppressWarnings({"WeakerAccess", "EmptyMethod", "UnusedParameters"})
FILE: common/src/main/java/haveno/common/app/AsciiLogo.java
class AsciiLogo (line 22) | @Slf4j
method showAsciiLogo (line 24) | public static void showAsciiLogo() {
FILE: common/src/main/java/haveno/common/app/Capabilities.java
class Capabilities (line 38) | @EqualsAndHashCode
method Capabilities (line 53) | public Capabilities(Capability... capabilities) {
method Capabilities (line 57) | public Capabilities(Capabilities capabilities) {
method Capabilities (line 61) | public Capabilities(Collection<Capability> capabilities) {
method set (line 69) | public void set(Capability... capabilities) {
method set (line 73) | public void set(Capabilities capabilities) {
method set (line 77) | public void set(Collection<Capability> capabilities) {
method addAll (line 86) | public void addAll(Capability... capabilities) {
method addAll (line 92) | public void addAll(Capabilities capabilities) {
method containsAll (line 102) | public boolean containsAll(final Set<Capability> requiredItems) {
method containsAll (line 110) | public boolean containsAll(final Capabilities capabilities) {
method containsAll (line 114) | public boolean containsAll(Capability... capabilities) {
method contains (line 120) | public boolean contains(Capability capability) {
method isEmpty (line 126) | public boolean isEmpty() {
method toIntList (line 139) | public static List<Integer> toIntList(Capabilities capabilities) {
method fromIntList (line 151) | public static Capabilities fromIntList(List<Integer> capabilities) {
method fromStringList (line 166) | public static Capabilities fromStringList(String list) {
method toStringList (line 187) | public String toStringList() {
method hasMandatoryCapability (line 191) | public static boolean hasMandatoryCapability(Capabilities capabilities) {
method hasMandatoryCapability (line 195) | public static boolean hasMandatoryCapability(Capabilities capabilities...
method toString (line 201) | @Override
method prettyPrint (line 206) | public String prettyPrint() {
method size (line 215) | public int size() {
method hasLess (line 220) | public boolean hasLess(Capabilities other) {
method findHighestCapability (line 227) | public int findHighestCapability(Capabilities capabilities) {
FILE: common/src/main/java/haveno/common/app/Capability.java
type Capability (line 26) | public enum Capability {
FILE: common/src/main/java/haveno/common/app/DevEnv.java
class DevEnv (line 23) | @Slf4j
method setup (line 34) | public static void setup(Config config) {
method isDevMode (line 42) | public static boolean isDevMode() {
method setDevMode (line 46) | public static void setDevMode(boolean devMode) {
method logErrorAndThrowIfDevMode (line 50) | public static void logErrorAndThrowIfDevMode(String msg) {
FILE: common/src/main/java/haveno/common/app/HasCapabilities.java
type HasCapabilities (line 25) | public interface HasCapabilities {
method getCapabilities (line 27) | Capabilities getCapabilities();
FILE: common/src/main/java/haveno/common/app/Log.java
class Log (line 33) | public class Log {
method setLevel (line 36) | public static void setLevel(Level logLevel) {
method setup (line 40) | public static void setup(String fileName) {
method setCustomLogLevel (line 113) | public static void setCustomLogLevel(String pattern, Level logLevel) {
method stopFileLogging (line 117) | public static void stopFileLogging() {
FILE: common/src/main/java/haveno/common/app/LogHighlighter.java
class LogHighlighter (line 32) | public class LogHighlighter extends ForegroundCompositeConverterBase<ILo...
method getForegroundColorCode (line 34) | @Override
FILE: common/src/main/java/haveno/common/app/Version.java
class Version (line 27) | @Slf4j
method getMajorVersion (line 42) | public static int getMajorVersion(String version) {
method getMinorVersion (line 46) | public static int getMinorVersion(String version) {
method getPatchVersion (line 50) | public static int getPatchVersion(String version) {
method getBuildVersion (line 54) | public static int getBuildVersion(String version) {
method isNewVersion (line 58) | public static boolean isNewVersion(String newVersion) {
method isNewVersion (line 62) | public static boolean isNewVersion(String newVersion, String currentVe...
method compare (line 85) | public static int compare(String version1, String version2) {
method getSubVersion (line 108) | private static int getSubVersion(String version, int index) {
method getP2PMessageVersion (line 132) | public static String getP2PMessageVersion() {
method setBaseCryptoNetworkId (line 139) | public static void setBaseCryptoNetworkId(int baseCryptoNetworkId) {
method getBaseCurrencyNetwork (line 152) | public static int getBaseCurrencyNetwork() {
method printVersion (line 156) | public static void printVersion() {
FILE: common/src/main/java/haveno/common/config/BaseCurrencyNetwork.java
type BaseCurrencyNetwork (line 26) | public enum BaseCurrencyNetwork {
method BaseCurrencyNetwork (line 40) | BaseCurrencyNetwork(NetworkParameters parameters, String currencyCode,...
method isMainnet (line 47) | public boolean isMainnet() {
method isTestnet (line 51) | public boolean isTestnet() {
method isStagenet (line 55) | public boolean isStagenet() {
method getDefaultMinFeePerVbyte (line 59) | public long getDefaultMinFeePerVbyte() {
class XmrMainNetParams (line 65) | private static class XmrMainNetParams extends MainNetParams {
method getMonetaryFormat (line 66) | @Override
class XmrTestNetParams (line 72) | private static class XmrTestNetParams extends RegTestParams {
method getMonetaryFormat (line 73) | @Override
class XmrStageNetParams (line 79) | private static class XmrStageNetParams extends MainNetParams {
method getMonetaryFormat (line 80) | @Override
FILE: common/src/main/java/haveno/common/config/CompositeOptionSet.java
class CompositeOptionSet (line 21) | @VisibleForTesting
method addOptionSet (line 26) | public void addOptionSet(OptionSet optionSet) {
method has (line 30) | public boolean has(OptionSpec<?> option) {
method valueOf (line 38) | public <V> V valueOf(OptionSpec<V> option) {
method valuesOf (line 48) | public List<String> valuesOf(ArgumentAcceptingOptionSpec<String> optio...
FILE: common/src/main/java/haveno/common/config/Config.java
class Config (line 51) | public class Config {
type UseTorForXmr (line 146) | public enum UseTorForXmr {
method Config (line 235) | public Config(String... args) {
method Config (line 256) | public Config(String defaultAppName, File defaultUserDataDir, String.....
method absoluteConfigFile (line 786) | private static File absoluteConfigFile(File parentDir, String relative...
method parseOptionsFrom (line 790) | private Optional<OptionSet> parseOptionsFrom(File configFile, OptionSp...
method printHelp (line 812) | public void printHelp(OutputStream sink, HelpFormatter formatter) {
method randomAppName (line 824) | private static String randomAppName() {
method tempUserDataDir (line 835) | private static File tempUserDataDir() {
method mkAppDataDir (line 848) | private static File mkAppDataDir(File dir) {
method mkdir (line 864) | private static File mkdir(File parent, String child) {
method appDataDir (line 890) | public static File appDataDir() {
method baseCurrencyNetwork (line 905) | public static BaseCurrencyNetwork baseCurrencyNetwork() {
method baseCurrencyNetworkParameters (line 917) | public static NetworkParameters baseCurrencyNetworkParameters() {
FILE: common/src/main/java/haveno/common/config/ConfigException.java
class ConfigException (line 5) | public class ConfigException extends HavenoException {
method ConfigException (line 7) | public ConfigException(String format, Object... args) {
FILE: common/src/main/java/haveno/common/config/ConfigFileEditor.java
class ConfigFileEditor (line 13) | public class ConfigFileEditor {
method ConfigFileEditor (line 20) | public ConfigFileEditor(File file) {
method setOption (line 25) | public void setOption(String name) {
method setOption (line 29) | public void setOption(String name, String arg) {
method clearOption (line 56) | public void clearOption(String name) {
method tryCreate (line 77) | private void tryCreate(File file) {
FILE: common/src/main/java/haveno/common/config/ConfigFileOption.java
class ConfigFileOption (line 3) | class ConfigFileOption {
method ConfigFileOption (line 8) | public ConfigFileOption(String name, String arg) {
method isOption (line 13) | public static boolean isOption(String line) {
method parse (line 17) | public static ConfigFileOption parse(String option) {
method toString (line 27) | public String toString() {
method clean (line 31) | public static String clean(String option) {
FILE: common/src/main/java/haveno/common/config/ConfigFileReader.java
class ConfigFileReader (line 11) | class ConfigFileReader {
method ConfigFileReader (line 15) | public ConfigFileReader(File file) {
method getLines (line 19) | public List<String> getLines() {
method getOptionLines (line 35) | public List<String> getOptionLines() {
method cleanLine (line 41) | private static String cleanLine(String line) {
FILE: common/src/main/java/haveno/common/config/EnumValueConverter.java
class EnumValueConverter (line 33) | class EnumValueConverter implements ValueConverter<Enum> {
method EnumValueConverter (line 37) | public EnumValueConverter(Class<? extends Enum> enumType) {
method convert (line 48) | @Override
method valueType (line 60) | @Override
method valuePattern (line 65) | @Override
FILE: common/src/main/java/haveno/common/config/HavenoHelpFormatter.java
class HavenoHelpFormatter (line 28) | public class HavenoHelpFormatter implements HelpFormatter {
method HavenoHelpFormatter (line 34) | public HavenoHelpFormatter(String fullName, String scriptName, String ...
method format (line 40) | public String format(Map<String, ? extends OptionDescriptor> descripto...
method formatOptionSyntax (line 61) | private String formatOptionSyntax(String optionName, OptionDescriptor ...
method formatArgDescription (line 74) | private String formatArgDescription(OptionDescriptor optionDesc) {
method formatDefaultValues (line 97) | private Object formatDefaultValues(List<?> defaultValues) {
method formatOptionDescription (line 103) | private String formatOptionDescription(OptionDescriptor optionDesc) {
method formatLine (line 128) | private String formatLine(String line) {
FILE: common/src/main/java/haveno/common/consensus/UsedForTradeContractJson.java
type UsedForTradeContractJson (line 27) | public interface UsedForTradeContractJson {
FILE: common/src/main/java/haveno/common/crypto/CryptoException.java
class CryptoException (line 20) | public class CryptoException extends Exception {
method CryptoException (line 21) | public CryptoException(String message) {
method CryptoException (line 25) | public CryptoException(String message, Throwable cause) {
method CryptoException (line 29) | public CryptoException(Throwable cause) {
FILE: common/src/main/java/haveno/common/crypto/CryptoUtils.java
class CryptoUtils (line 27) | @Slf4j
method pubKeyToString (line 29) | public static String pubKeyToString(PublicKey publicKey) {
method getRandomBytes (line 34) | public static byte[] getRandomBytes(int size) {
FILE: common/src/main/java/haveno/common/crypto/Encryption.java
class Encryption (line 44) | @Slf4j
method generateKeyPair (line 56) | public static KeyPair generateKeyPair() {
method encrypt (line 73) | public static byte[] encrypt(byte[] payload, SecretKey secretKey) thro...
method decrypt (line 84) | public static byte[] decrypt(byte[] encryptedPayload, SecretKey secret...
method getSecretKeyFromBytes (line 94) | public static SecretKey getSecretKeyFromBytes(byte[] secretKeyBytes) {
method getPayloadWithHmac (line 102) | private static byte[] getPayloadWithHmac(byte[] payload, SecretKey sec...
method verifyHmac (line 116) | private static boolean verifyHmac(byte[] message, byte[] hmac, SecretK...
method getHmac (line 126) | private static byte[] getHmac(byte[] payload, SecretKey secretKey) thr...
method encryptPayloadWithHmac (line 138) | public static byte[] encryptPayloadWithHmac(byte[] payload, SecretKey ...
method decryptPayloadWithHmac (line 142) | public static byte[] decryptPayloadWithHmac(byte[] encryptedPayloadWit...
method encryptSecretKey (line 163) | public static byte[] encryptSecretKey(SecretKey secretKey, PublicKey p...
method decryptSecretKey (line 176) | public static SecretKey decryptSecretKey(byte[] encryptedSecretKey, Pr...
method generateSecretKey (line 194) | public static SecretKey generateSecretKey(int bits) {
method getPublicKeyBytes (line 205) | public static byte[] getPublicKeyBytes(PublicKey encryptionPubKey) {
method getPublicKeyFromBytes (line 213) | public static PublicKey getPublicKeyFromBytes(byte[] encryptionPubKeyB...
FILE: common/src/main/java/haveno/common/crypto/Hash.java
class Hash (line 29) | @Slf4j
method getSha256Hash (line 36) | public static byte[] getSha256Hash(byte[] data) {
method getSha256Hash (line 51) | public static byte[] getSha256Hash(String message) {
method getSha256Hash (line 59) | public static byte[] getSha256Hash(Integer data) {
method getSha256Ripemd160hash (line 66) | public static byte[] getSha256Ripemd160hash(byte[] data) {
method getRipemd160hash (line 73) | public static byte[] getRipemd160hash(byte[] data) {
FILE: common/src/main/java/haveno/common/crypto/IncorrectPasswordException.java
class IncorrectPasswordException (line 19) | public class IncorrectPasswordException extends Exception {
method IncorrectPasswordException (line 20) | public IncorrectPasswordException(String message) {
FILE: common/src/main/java/haveno/common/crypto/KeyConversionException.java
class KeyConversionException (line 20) | public class KeyConversionException extends RuntimeException {
method KeyConversionException (line 21) | public KeyConversionException(Throwable cause) {
method KeyConversionException (line 25) | public KeyConversionException(String msg) {
FILE: common/src/main/java/haveno/common/crypto/KeyRing.java
class KeyRing (line 29) | @Getter
method KeyRing (line 47) | @Inject
method KeyRing (line 59) | public KeyRing(KeyStorage keyStorage, String password, boolean generat...
method isUnlocked (line 68) | public boolean isUnlocked() {
method lockKeys (line 80) | public void lockKeys() {
method unlockKeys (line 94) | public boolean unlockKeys(@Nullable String password, boolean generateK...
method generateKeys (line 112) | public void generateKeys(String password) {
method toString (line 122) | @Override
FILE: common/src/main/java/haveno/common/crypto/KeyStorage.java
class KeyStorage (line 58) | @Singleton
type KeyEntry (line 63) | public enum KeyEntry {
method KeyEntry (line 72) | KeyEntry(String fileName, String algorithm, String alias) {
method getFileName (line 78) | public String getFileName() {
method getAlgorithm (line 82) | public String getAlgorithm() {
method getAlias (line 86) | public String getAlias() {
method toString (line 90) | @NotNull
method KeyStorage (line 102) | @Inject
method allKeyFilesExist (line 107) | public boolean allKeyFilesExist() {
method fileExists (line 111) | private boolean fileExists(KeyEntry keyEntry) {
method loadKeyBytes (line 115) | private byte[] loadKeyBytes(KeyEntry keyEntry, SecretKey secretKey) {
method loadKeyPair (line 135) | public KeyPair loadKeyPair(KeyEntry keyEntry, SecretKey secretKey) {
method loadSecretKey (line 172) | public SecretKey loadSecretKey(KeyEntry keyEntry, String password) thr...
method saveKeyRing (line 205) | public void saveKeyRing(KeyRing keyRing, String oldPassword, String pa...
method saveKey (line 223) | private void saveKey(PrivateKey key, String fileName, SecretKey secret...
method saveKey (line 248) | private void saveKey(SecretKey key, String alias, String fileName, Str...
FILE: common/src/main/java/haveno/common/crypto/PubKeyRing.java
class PubKeyRing (line 35) | @Slf4j
method PubKeyRing (line 45) | public PubKeyRing(PublicKey signaturePubKey, PublicKey encryptionPubKe...
method PubKeyRing (line 57) | @VisibleForTesting
method toProtoMessage (line 65) | @Override
method fromProto (line 73) | public static PubKeyRing fromProto(protobuf.PubKeyRing proto) {
method toString (line 79) | @Override
FILE: common/src/main/java/haveno/common/crypto/PubKeyRingProvider.java
class PubKeyRingProvider (line 11) | public class PubKeyRingProvider implements Provider<PubKeyRing> {
method PubKeyRingProvider (line 15) | @Inject
method get (line 20) | @Override
FILE: common/src/main/java/haveno/common/crypto/ScryptUtil.java
class ScryptUtil (line 30) | public class ScryptUtil {
type DeriveKeyResultHandler (line 33) | public interface DeriveKeyResultHandler {
method handleResult (line 34) | void handleResult(KeyParameter aesKey);
method getKeyCrypterScrypt (line 37) | public static KeyCrypterScrypt getKeyCrypterScrypt() {
method getKeyCrypterScrypt (line 41) | public static KeyCrypterScrypt getKeyCrypterScrypt(byte[] salt) {
method deriveKeyWithScrypt (line 51) | public static KeyParameter deriveKeyWithScrypt(KeyCrypterScrypt keyCry...
method deriveKeyWithScrypt (line 66) | public static void deriveKeyWithScrypt(KeyCrypterScrypt keyCrypterScry...
FILE: common/src/main/java/haveno/common/crypto/SealedAndSigned.java
class SealedAndSigned (line 26) | @Value
method SealedAndSigned (line 34) | public SealedAndSigned(byte[] encryptedSecretKey,
method SealedAndSigned (line 51) | private SealedAndSigned(byte[] encryptedSecretKey,
method toProtoMessage (line 63) | public protobuf.SealedAndSigned toProtoMessage() {
method fromProto (line 72) | public static SealedAndSigned fromProto(protobuf.SealedAndSigned proto) {
FILE: common/src/main/java/haveno/common/crypto/Sig.java
class Sig (line 46) | public class Sig {
method generateKeyPair (line 56) | public static KeyPair generateKeyPair() {
method sign (line 74) | public static byte[] sign(PrivateKey privateKey, byte[] data) throws C...
method sign (line 90) | public static String sign(PrivateKey privateKey, String message) throw...
method verify (line 101) | public static boolean verify(PublicKey publicKey, byte[] data, byte[] ...
method verify (line 118) | public static boolean verify(PublicKey publicKey, String message, Stri...
method getPublicKeyFromBytes (line 126) | public static PublicKey getPublicKeyFromBytes(byte[] sigPublicKeyBytes) {
method getPublicKeyBytes (line 136) | public static byte[] getPublicKeyBytes(PublicKey sigPublicKey) {
FILE: common/src/main/java/haveno/common/file/CorruptedStorageFileHandler.java
class CorruptedStorageFileHandler (line 27) | @Slf4j
method CorruptedStorageFileHandler (line 32) | @Inject
method addFile (line 36) | public void addFile(String fileName) {
method getFiles (line 40) | public Optional<List<String>> getFiles() {
FILE: common/src/main/java/haveno/common/file/FileUtil.java
class FileUtil (line 42) | @Slf4j
method rollingBackup (line 47) | public static void rollingBackup(File dir, String fileName, int numMax...
method getBackupFiles (line 78) | public static List<File> getBackupFiles(File dir, String fileName) {
method getLatestBackupFile (line 89) | public static File getLatestBackupFile(File dir, String fileName) {
method deleteRollingBackup (line 96) | public static void deleteRollingBackup(File dir, String fileName) {
method pruneBackup (line 109) | private static void pruneBackup(File backupDir, int numMaxBackupFiles) {
method deleteDirectory (line 131) | public static void deleteDirectory(File file) throws IOException {
method deleteDirectory (line 135) | public static void deleteDirectory(File file,
method deleteFileIfExists (line 160) | public static void deleteFileIfExists(File file) throws IOException {
method deleteFileIfExists (line 164) | public static void deleteFileIfExists(File file, boolean ignoreLockedF...
method isFileLocked (line 186) | private static boolean isFileLocked(File file) {
method resourceToFile (line 190) | public static void resourceToFile(String resourcePath,
method resourceEqualToFile (line 202) | public static boolean resourceEqualToFile(String resourcePath,
method renameFile (line 212) | public static void renameFile(File oldFile, File newFile) throws IOExc...
method copyFile (line 227) | public static void copyFile(File origin, File target) throws IOExcepti...
method copyDirectory (line 241) | public static void copyDirectory(File source, File destination) throws...
method createNewFile (line 245) | public static File createNewFile(Path path) throws IOException {
method removeAndBackupFile (line 253) | public static void removeAndBackupFile(File dbDir, File storageFile, S...
method doesFileContainKeyword (line 266) | public static boolean doesFileContainKeyword(File file, String keyword...
FILE: common/src/main/java/haveno/common/file/JsonFileManager.java
class JsonFileManager (line 32) | @Slf4j
method shutDownAllInstances (line 36) | public static void shutDownAllInstances() {
method JsonFileManager (line 50) | public JsonFileManager(File dir) {
method getExecutor (line 60) | @NotNull
method shutDown (line 68) | public void shutDown() {
method writeToDiscThreaded (line 74) | public void writeToDiscThreaded(String json, String fileName) {
method writeToDisc (line 78) | public void writeToDisc(String json, String fileName) {
FILE: common/src/main/java/haveno/common/file/ResourceNotFoundException.java
class ResourceNotFoundException (line 20) | public class ResourceNotFoundException extends Exception {
method ResourceNotFoundException (line 21) | public ResourceNotFoundException(String path) {
FILE: common/src/main/java/haveno/common/handlers/ErrorMessageHandler.java
type ErrorMessageHandler (line 23) | public interface ErrorMessageHandler {
method handleErrorMessage (line 24) | void handleErrorMessage(String errorMessage);
FILE: common/src/main/java/haveno/common/handlers/ExceptionHandler.java
type ExceptionHandler (line 23) | public interface ExceptionHandler {
method handleException (line 24) | void handleException(Throwable throwable);
FILE: common/src/main/java/haveno/common/handlers/FaultHandler.java
type FaultHandler (line 23) | public interface FaultHandler {
method handleFault (line 24) | void handleFault(String errorMessage, Throwable throwable);
FILE: common/src/main/java/haveno/common/handlers/ResultHandler.java
type ResultHandler (line 20) | public interface ResultHandler {
method handleResult (line 21) | void handleResult();
FILE: common/src/main/java/haveno/common/persistence/PersistenceManager.java
class PersistenceManager (line 72) | @Slf4j
method onAllServicesInitialized (line 83) | public static void onAllServicesInitialized() {
method flushAllDataToDiskAtBackup (line 95) | public static void flushAllDataToDiskAtBackup(ResultHandler completeHa...
method flushAllDataToDiskAtShutdown (line 99) | public static void flushAllDataToDiskAtShutdown(ResultHandler complete...
method reset (line 106) | public static void reset() {
method flushAllDataToDisk (line 116) | private static void flushAllDataToDisk(ResultHandler completeHandler, ...
method onWriteCompleted (line 171) | private static void onWriteCompleted(ResultHandler completeHandler,
type Source (line 189) | public enum Source {
method Source (line 206) | Source(int numMaxBackupFiles, long delay, boolean flushAtShutDown) {
method PersistenceManager (line 239) | @Inject
method initialize (line 254) | public void initialize(T persistable, Source source) {
method initialize (line 258) | public void initialize(T persistable, String fileName, Source source) {
method shutdown (line 289) | public void shutdown() {
method readPersisted (line 311) | public void readPersisted(Consumer<T> resultHandler, Runnable orElse) {
method readPersisted (line 323) | public void readPersisted(String fileName, Consumer<T> resultHandler, ...
method getPersisted (line 345) | @Nullable
method getPersisted (line 350) | @Nullable
method requestPersistence (line 411) | public void requestPersistence() {
method maybeStartTimerForPersistence (line 433) | private void maybeStartTimerForPersistence() {
method forcePersistNow (line 446) | public void forcePersistNow() {
method persistNow (line 451) | public void persistNow(@Nullable Runnable completeHandler) {
method persistNow (line 455) | private synchronized void persistNow(@Nullable Runnable completeHandle...
method writeToDisk (line 478) | private void writeToDisk(protobuf.PersistableEnvelope serialized, @Nul...
method getWriteToDiskExecutor (line 563) | private ExecutorService getWriteToDiskExecutor() {
method toString (line 571) | @Override
FILE: common/src/main/java/haveno/common/proto/ProtoResolver.java
type ProtoResolver (line 23) | public interface ProtoResolver {
method fromProto (line 24) | Payload fromProto(protobuf.PaymentAccountPayload proto);
method fromProto (line 26) | PersistablePayload fromProto(protobuf.PersistableNetworkPayload proto);
FILE: common/src/main/java/haveno/common/proto/ProtoUtil.java
class ProtoUtil (line 38) | @Slf4j
method byteSetFromProtoByteStringList (line 41) | public static Set<byte[]> byteSetFromProtoByteStringList(List<ByteStri...
method stringOrNullFromProto (line 49) | @Nullable
method byteArrayOrNullFromProto (line 54) | @Nullable
method enumFromProto (line 67) | @Nullable
method collectionToProto (line 80) | public static <T extends Message> Iterable<T> collectionToProto(Collec...
method collectionToProto (line 96) | public static <T> Iterable<T> collectionToProto(Collection<? extends P...
method protocolStringListToList (line 101) | public static List<String> protocolStringListToList(ProtocolStringList...
method protocolStringListToSet (line 105) | public static Set<String> protocolStringListToSet(ProtocolStringList p...
FILE: common/src/main/java/haveno/common/proto/ProtobufferException.java
class ProtobufferException (line 22) | public class ProtobufferException extends IOException {
method ProtobufferException (line 23) | public ProtobufferException(String message) {
method ProtobufferException (line 27) | public ProtobufferException(String message, Throwable e) {
FILE: common/src/main/java/haveno/common/proto/ProtobufferRuntimeException.java
class ProtobufferRuntimeException (line 20) | public class ProtobufferRuntimeException extends RuntimeException {
method ProtobufferRuntimeException (line 21) | public ProtobufferRuntimeException(String message) {
method ProtobufferRuntimeException (line 25) | public ProtobufferRuntimeException(String message, Throwable e) {
FILE: common/src/main/java/haveno/common/proto/network/GetDataResponsePriority.java
type GetDataResponsePriority (line 23) | public enum GetDataResponsePriority {
FILE: common/src/main/java/haveno/common/proto/network/NetworkEnvelope.java
class NetworkEnvelope (line 26) | @EqualsAndHashCode
method NetworkEnvelope (line 36) | protected NetworkEnvelope(String messageVersion) {
method getNetworkEnvelopeBuilder (line 40) | public protobuf.NetworkEnvelope.Builder getNetworkEnvelopeBuilder() {
method toProtoMessage (line 44) | @Override
method toProtoNetworkEnvelope (line 49) | public protobuf.NetworkEnvelope toProtoNetworkEnvelope() {
method getMessageVersion (line 57) | public String getMessageVersion() {
method toString (line 64) | @Override
FILE: common/src/main/java/haveno/common/proto/network/NetworkPayload.java
type NetworkPayload (line 25) | public interface NetworkPayload extends Payload {
method getGetDataResponsePriority (line 26) | default GetDataResponsePriority getGetDataResponsePriority() {
FILE: common/src/main/java/haveno/common/proto/network/NetworkProtoResolver.java
type NetworkProtoResolver (line 26) | public interface NetworkProtoResolver extends ProtoResolver {
method fromProto (line 27) | NetworkEnvelope fromProto(protobuf.NetworkEnvelope proto) throws Proto...
method fromProto (line 29) | NetworkPayload fromProto(protobuf.StoragePayload proto);
method fromProto (line 31) | NetworkPayload fromProto(protobuf.StorageEntryWrapper proto);
method getClock (line 33) | Clock getClock();
FILE: common/src/main/java/haveno/common/proto/persistable/NavigationPath.java
class NavigationPath (line 30) | @EqualsAndHashCode
method toProtoMessage (line 38) | @Override
method fromProto (line 45) | public static NavigationPath fromProto(protobuf.NavigationPath proto) {
FILE: common/src/main/java/haveno/common/proto/persistable/PersistableEnvelope.java
type PersistableEnvelope (line 26) | public interface PersistableEnvelope extends Envelope {
method toPersistableMessage (line 28) | default Message toPersistableMessage() {
method getDefaultStorageFileName (line 32) | default String getDefaultStorageFileName() {
FILE: common/src/main/java/haveno/common/proto/persistable/PersistableList.java
class PersistableList (line 28) | public abstract class PersistableList<T extends PersistablePayload> impl...
method createList (line 33) | protected List<T> createList() {
method PersistableList (line 37) | public PersistableList() {
method PersistableList (line 40) | protected PersistableList(Collection<T> collection) {
method setAll (line 44) | public void setAll(Collection<T> collection) {
method add (line 51) | public boolean add(T item) {
method remove (line 61) | public boolean remove(T item) {
method stream (line 67) | public Stream<T> stream() {
method size (line 73) | public int size() {
method contains (line 79) | public boolean contains(T item) {
method isEmpty (line 85) | public boolean isEmpty() {
method forEach (line 91) | public void forEach(Consumer<? super T> action) {
method clear (line 97) | public void clear() {
FILE: common/src/main/java/haveno/common/proto/persistable/PersistableListAsObservable.java
class PersistableListAsObservable (line 27) | public abstract class PersistableListAsObservable<T extends PersistableP...
method PersistableListAsObservable (line 29) | public PersistableListAsObservable() {
method PersistableListAsObservable (line 32) | protected PersistableListAsObservable(Collection<T> collection) {
method createList (line 36) | protected List<T> createList() {
method getObservableList (line 40) | public ObservableList<T> getObservableList() {
method addListener (line 44) | public void addListener(ListChangeListener<T> listener) {
method removeListener (line 48) | public void removeListener(ListChangeListener<T> listener) {
FILE: common/src/main/java/haveno/common/proto/persistable/PersistablePayload.java
type PersistablePayload (line 25) | public interface PersistablePayload extends Payload {
FILE: common/src/main/java/haveno/common/proto/persistable/PersistedDataHost.java
type PersistedDataHost (line 20) | public interface PersistedDataHost {
method readPersisted (line 21) | void readPersisted(Runnable completeHandler);
FILE: common/src/main/java/haveno/common/proto/persistable/PersistenceProtoResolver.java
type PersistenceProtoResolver (line 23) | public interface PersistenceProtoResolver extends ProtoResolver {
method fromProto (line 24) | PersistableEnvelope fromProto(protobuf.PersistableEnvelope persistable);
FILE: common/src/main/java/haveno/common/reactfx/FxTimer.java
class FxTimer (line 16) | public class FxTimer implements Timer {
method create (line 21) | public static Timer create(java.time.Duration delay, Runnable action) {
method runLater (line 28) | public static Timer runLater(java.time.Duration delay, Runnable action) {
method createPeriodic (line 38) | public static Timer createPeriodic(java.time.Duration interval, Runnab...
method runPeriodically (line 45) | public static Timer runPeriodically(java.time.Duration interval, Runna...
method createPeriodic0 (line 55) | public static Timer createPeriodic0(java.time.Duration interval, Runna...
method runPeriodically0 (line 62) | public static Timer runPeriodically0(java.time.Duration interval, Runn...
method FxTimer (line 74) | private FxTimer(java.time.Duration actionTime, java.time.Duration peri...
method restart (line 87) | @Override
method stop (line 99) | @Override
FILE: common/src/main/java/haveno/common/reactfx/Timer.java
type Timer (line 17) | public interface Timer {
method restart (line 24) | void restart();
method stop (line 65) | void stop();
FILE: common/src/main/java/haveno/common/setup/CommonSetup.java
class CommonSetup (line 38) | @Slf4j
method setup (line 41) | public static void setup(Config config, GracefulShutDownHandler gracef...
method printSystemLoadPeriodically (line 55) | public static void printSystemLoadPeriodically(int delayMin) {
method setupUncaughtExceptionHandler (line 59) | public static void setupUncaughtExceptionHandler(UncaughtExceptionHand...
method setupLog (line 82) | private static void setupLog(Config config) {
method setSystemProperties (line 89) | protected static void setSystemProperties() {
method setupSigIntHandlers (line 94) | protected static void setupSigIntHandlers(GracefulShutDownHandler grac...
method maybePrintPathOfCodeSource (line 108) | protected static void maybePrintPathOfCodeSource() {
FILE: common/src/main/java/haveno/common/setup/GracefulShutDownHandler.java
type GracefulShutDownHandler (line 22) | public interface GracefulShutDownHandler {
method gracefulShutDown (line 23) | void gracefulShutDown(ResultHandler resultHandler);
method gracefulShutDown (line 24) | void gracefulShutDown(ResultHandler resultHandler, boolean systemExit);
FILE: common/src/main/java/haveno/common/setup/UncaughtExceptionHandler.java
type UncaughtExceptionHandler (line 20) | public interface UncaughtExceptionHandler {
method handleUncaughtException (line 21) | void handleUncaughtException(Throwable throwable, boolean doShutDown);
FILE: common/src/main/java/haveno/common/taskrunner/InterceptTaskException.java
class InterceptTaskException (line 20) | public class InterceptTaskException extends RuntimeException {
method InterceptTaskException (line 21) | public InterceptTaskException(String message) {
FILE: common/src/main/java/haveno/common/taskrunner/Model.java
type Model (line 20) | public interface Model {
method onComplete (line 21) | void onComplete();
FILE: common/src/main/java/haveno/common/taskrunner/Task.java
class Task (line 23) | public abstract class Task<T extends Model> {
method Task (line 33) | public Task(TaskRunner taskHandler, T model) {
method run (line 38) | protected abstract void run();
method runInterceptHook (line 40) | protected void runInterceptHook() {
method appendToErrorMessage (line 45) | protected void appendToErrorMessage(String message) {
method appendExceptionToErrorMessage (line 49) | protected void appendExceptionToErrorMessage(Throwable t) {
method complete (line 56) | protected void complete() {
method isCompleted (line 61) | public boolean isCompleted() {
method failed (line 65) | protected void failed(String message) {
method failed (line 70) | protected void failed(Throwable t) {
method failed (line 83) | protected void failed() {
FILE: common/src/main/java/haveno/common/taskrunner/TaskRunner.java
class TaskRunner (line 30) | @Slf4j
method TaskRunner (line 43) | public TaskRunner(T sharedModel, ResultHandler resultHandler, ErrorMes...
method TaskRunner (line 48) | public TaskRunner(T sharedModel, Class<T> sharedModelClass, ResultHand...
method addTasks (line 55) | @SafeVarargs
method run (line 60) | public void run() {
method next (line 64) | private void next() {
method cancel (line 81) | public void cancel() {
method isCanceled (line 85) | public boolean isCanceled() {
method handleComplete (line 89) | void handleComplete() {
method handleErrorMessage (line 93) | void handleErrorMessage(String errorMessage) {
FILE: common/src/main/java/haveno/common/util/Base64.java
class Base64 (line 24) | public class Base64 {
method decode (line 26) | public static byte[] decode(String base64) {
method encode (line 30) | public static String encode(byte[] bytes) {
FILE: common/src/main/java/haveno/common/util/CollectionUtils.java
class CollectionUtils (line 14) | public class CollectionUtils {
method isEmpty (line 22) | public static boolean isEmpty(Collection<?> collection) {
method isEmpty (line 32) | public static boolean isEmpty(Map<?, ?> map) {
FILE: common/src/main/java/haveno/common/util/CompletableFutureUtils.java
class CompletableFutureUtils (line 24) | public class CompletableFutureUtils {
method allOf (line 31) | public static <T> CompletableFuture<List<T>> allOf(List<CompletableFut...
FILE: common/src/main/java/haveno/common/util/DesktopUtil.java
class DesktopUtil (line 30) | @Slf4j
method browse (line 33) | public static boolean browse(URI uri) {
method open (line 38) | public static boolean open(File file) {
method edit (line 43) | public static boolean edit(File file) {
method openSystemSpecific (line 51) | private static boolean openSystemSpecific(String what) {
method runCommand (line 71) | @SuppressWarnings("SameParameterValue")
method prepareCommand (line 101) | private static String[] prepareCommand(String command, String args, St...
type EnumOS (line 117) | public enum EnumOS {
method isLinux (line 124) | public boolean isLinux() {
method isMac (line 130) | public boolean isMac() {
method isWindows (line 136) | public boolean isWindows() {
method getOs (line 143) | private static EnumOS getOs() {
FILE: common/src/main/java/haveno/common/util/DoubleSummaryStatisticsWithStdDev.java
class DoubleSummaryStatisticsWithStdDev (line 27) | public class DoubleSummaryStatisticsWithStdDev extends DoubleSummaryStat...
method accept (line 32) | @Override
method combine (line 40) | public void combine(DoubleSummaryStatisticsWithStdDev other) {
method sumOfSquaresWithCompensation (line 50) | private void sumOfSquaresWithCompensation(double valueSquared) {
method getSumOfSquares (line 57) | private double getSumOfSquares() {
method getVariance (line 70) | private double getVariance() {
method getStandardDeviation (line 77) | public final double getStandardDeviation() {
FILE: common/src/main/java/haveno/common/util/ExtraDataMapValidator.java
class ExtraDataMapValidator (line 32) | @Slf4j
method getValidatedExtraDataMap (line 40) | public static Map<String, String> getValidatedExtraDataMap(@Nullable M...
method getValidatedExtraDataMap (line 44) | public static Map<String, String> getValidatedExtraDataMap(@Nullable M...
method validate (line 64) | public static void validate(@Nullable Map<String, String> extraDataMap) {
method validate (line 68) | public static void validate(@Nullable Map<String, String> extraDataMap...
FILE: common/src/main/java/haveno/common/util/GcUtil.java
class GcUtil (line 24) | @Slf4j
method autoReleaseMemory (line 33) | public static void autoReleaseMemory() {
method maybeReleaseMemory (line 40) | public static void maybeReleaseMemory() {
method autoReleaseMemory (line 50) | private static void autoReleaseMemory(long trigger) {
method maybeReleaseMemory (line 57) | private static void maybeReleaseMemory(long trigger) {
FILE: common/src/main/java/haveno/common/util/Hex.java
class Hex (line 22) | public class Hex {
method decode (line 24) | public static byte[] decode(String hex) {
method encode (line 28) | public static String encode(byte[] bytes) {
FILE: common/src/main/java/haveno/common/util/InvalidVersionException.java
class InvalidVersionException (line 20) | public class InvalidVersionException extends Exception {
method InvalidVersionException (line 21) | public InvalidVersionException(String msg) {
FILE: common/src/main/java/haveno/common/util/MathUtils.java
class MathUtils (line 33) | public class MathUtils {
method roundDouble (line 36) | public static double roundDouble(double value, int precision) {
method roundDouble (line 40) | @SuppressWarnings("SameParameterValue")
method roundDoubleToLong (line 57) | public static long roundDoubleToLong(double value) {
method roundDoubleToLong (line 61) | @SuppressWarnings("SameParameterValue")
method roundDoubleToInt (line 66) | public static int roundDoubleToInt(double value) {
method roundDoubleToInt (line 70) | @SuppressWarnings("SameParameterValue")
method doubleToLong (line 75) | public static long doubleToLong(double value) {
method scaleUpByPowerOf10 (line 79) | public static double scaleUpByPowerOf10(double value, int exponent) {
method scaleUpByPowerOf10 (line 84) | public static double scaleUpByPowerOf10(long value, int exponent) {
method scaleUpByPowerOf10 (line 89) | public static BigInteger scaleUpByPowerOf10(BigInteger value, int expo...
method scaleDownByPowerOf10 (line 94) | public static double scaleDownByPowerOf10(double value, int exponent) {
method scaleDownByPowerOf10 (line 99) | public static double scaleDownByPowerOf10(long value, int exponent) {
method scaleDownByPowerOf10 (line 104) | public static BigInteger scaleDownByPowerOf10(BigInteger value, int ex...
method exactMultiply (line 109) | public static double exactMultiply(double value1, double value2) {
method getMedian (line 113) | public static long getMedian(Long[] list) {
class MovingAverage (line 128) | public static class MovingAverage {
method MovingAverage (line 135) | public MovingAverage(int size, double outlier) {
method next (line 142) | public Optional<Double> next(long val) {
method isFull (line 169) | boolean isFull() {
method removeInitialOutlier (line 173) | private void removeInitialOutlier() {
method current (line 187) | public Optional<Double> current() {
FILE: common/src/main/java/haveno/common/util/PermutationUtil.java
class PermutationUtil (line 30) | @Slf4j
method getPartialList (line 39) | public static <T> List<T> getPartialList(List<T> list, List<Integer> i...
method findMatchingPermutation (line 59) | public static <T, R> List<T> findMatchingPermutation(R targetValue,
method findMatchingPermutation (line 74) | private static <T, R> List<T> findMatchingPermutation(R targetValue,
method checkLevel (line 90) | @NonNull
method findAllPermutations (line 141) | public static <T> List<List<T>> findAllPermutations(List<T> list, int ...
FILE: common/src/main/java/haveno/common/util/Preconditions.java
class Preconditions (line 11) | public class Preconditions {
method checkDir (line 18) | public static File checkDir(File dir) {
FILE: common/src/main/java/haveno/common/util/Profiler.java
class Profiler (line 25) | @Slf4j
method printSystemLoadPeriodically (line 27) | public static void printSystemLoadPeriodically(long delay, TimeUnit ti...
method printSystemLoad (line 31) | public static void printSystemLoad() {
method getUsedMemoryInMB (line 45) | public static long getUsedMemoryInMB() {
method getUsedMemoryInBytes (line 49) | public static long getUsedMemoryInBytes() {
method getFreeMemoryInMB (line 56) | public static long getFreeMemoryInMB() {
method getTotalMemoryInMB (line 60) | public static long getTotalMemoryInMB() {
FILE: common/src/main/java/haveno/common/util/ReflectionUtils.java
class ReflectionUtils (line 36) | @Slf4j
method loadFieldListForClassHierarchy (line 47) | public static void loadFieldListForClassHierarchy(List<Field> fields,
method getSetterMethodForFieldInClassHierarchy (line 70) | public static Optional<Method> getSetterMethodForFieldInClassHierarchy...
method isSetterForField (line 89) | public static boolean isSetterForField(Method m, Field f) {
method isSetterOnClass (line 97) | public static boolean isSetterOnClass(Method setter, Class<?> clazz) {
method getVisibilityModifierAsString (line 101) | public static String getVisibilityModifierAsString(Field field) {
method getField (line 112) | public static Field getField(String name, Class<?> clazz) {
method getMethod (line 121) | public static Method getMethod(String name, Class<?> clazz) {
method handleSetFieldValueError (line 130) | public static void handleSetFieldValueError(Object object,
FILE: common/src/main/java/haveno/common/util/RestartUtil.java
class RestartUtil (line 29) | public class RestartUtil {
method restartApplication (line 38) | public static void restartApplication(String logPath) throws IOExcepti...
FILE: common/src/main/java/haveno/common/util/SingleThreadExecutorUtils.java
class SingleThreadExecutorUtils (line 31) | public class SingleThreadExecutorUtils {
method SingleThreadExecutorUtils (line 33) | private SingleThreadExecutorUtils() {
method getSingleThreadExecutor (line 37) | public static ExecutorService getSingleThreadExecutor(Class<?> aClass) {
method getNonDaemonSingleThreadExecutor (line 42) | public static ExecutorService getNonDaemonSingleThreadExecutor(Class<?...
method getSingleThreadExecutor (line 47) | public static ExecutorService getSingleThreadExecutor(String name) {
method getSingleThreadListeningExecutor (line 52) | public static ListeningExecutorService getSingleThreadListeningExecuto...
method getSingleThreadExecutor (line 57) | public static ExecutorService getSingleThreadExecutor(ThreadFactory th...
method getSingleThreadExecutor (line 62) | private static ExecutorService getSingleThreadExecutor(String name, bo...
method getThreadFactory (line 67) | private static ThreadFactory getThreadFactory(String name, boolean isD...
method validateClass (line 74) | private static void validateClass(Class<?> aClass) {
method validateName (line 80) | private static void validateName(String name) {
method validateThreadFactory (line 86) | private static void validateThreadFactory(ThreadFactory threadFactory) {
FILE: common/src/main/java/haveno/common/util/Tuple2.java
class Tuple2 (line 23) | public class Tuple2<A, B> implements Serializable {
method Tuple2 (line 29) | public Tuple2(A first, B second) {
method equals (line 34) | @SuppressWarnings("SimplifiableIfStatement")
method hashCode (line 47) | @Override
method toString (line 54) | @Override
FILE: common/src/main/java/haveno/common/util/Tuple3.java
class Tuple3 (line 22) | public class Tuple3<A, B, C> {
method Tuple3 (line 27) | public Tuple3(A first, B second, C third) {
method equals (line 33) | @SuppressWarnings("SimplifiableIfStatement")
method hashCode (line 47) | @Override
FILE: common/src/main/java/haveno/common/util/Tuple4.java
class Tuple4 (line 22) | public class Tuple4<A, B, C, D> {
method Tuple4 (line 28) | public Tuple4(A first, B second, C third, D fourth) {
method equals (line 35) | @SuppressWarnings("SimplifiableIfStatement")
method hashCode (line 50) | @Override
FILE: common/src/main/java/haveno/common/util/Tuple5.java
class Tuple5 (line 22) | public class Tuple5<A, B, C, D, E> {
method Tuple5 (line 29) | public Tuple5(A first, B second, C third, D fourth, E fifth) {
method equals (line 37) | @SuppressWarnings("SimplifiableIfStatement")
method hashCode (line 52) | @Override
FILE: common/src/main/java/haveno/common/util/Utilities.java
class Utilities (line 83) | @Slf4j
method getFixedThreadPoolExecutor (line 86) | public static ExecutorService getFixedThreadPoolExecutor(int nThreads,...
method getListeningExecutorService (line 90) | public static ListeningExecutorService getListeningExecutorService(Str...
method getListeningExecutorService (line 97) | public static ListeningExecutorService getListeningExecutorService(Str...
method getListeningExecutorService (line 105) | public static ListeningExecutorService getListeningExecutorService(Str...
method getThreadPoolExecutor (line 113) | public static ThreadPoolExecutor getThreadPoolExecutor(String name,
method getThreadPoolExecutor (line 120) | public static ThreadPoolExecutor getThreadPoolExecutor(String name,
method getThreadPoolExecutor (line 129) | private static ThreadPoolExecutor getThreadPoolExecutor(String name,
method shutdownAndAwaitTermination (line 144) | public static void shutdownAndAwaitTermination(ExecutorService executo...
method failureCallback (line 149) | public static <V> FutureCallback<V> failureCallback(Consumer<Throwable...
method isMacMenuBarDarkMode (line 165) | public static boolean isMacMenuBarDarkMode() {
method isUnix (line 177) | public static boolean isUnix() {
method isWindows (line 181) | public static boolean isWindows() {
method isQubesOS (line 188) | public static boolean isQubesOS() {
method isOSX (line 198) | public static boolean isOSX() {
method isLinux (line 202) | public static boolean isLinux() {
method isDebianLinux (line 206) | public static boolean isDebianLinux() {
method isRedHatLinux (line 210) | public static boolean isRedHatLinux() {
method getOSName (line 214) | private static String getOSName() {
method getOSVersion (line 218) | public static String getOSVersion() {
method getUserDataDir (line 225) | public static File getUserDataDir() {
method getMinorVersion (line 236) | public static int getMinorVersion() throws InvalidVersionException {
method getMajorVersion (line 248) | public static int getMajorVersion() throws InvalidVersionException {
method getOSArchitecture (line 260) | public static String getOSArchitecture() {
method printSysInfo (line 280) | public static void printSysInfo() {
method getJVMArchitecture (line 290) | public static String getJVMArchitecture() {
method isCorrectOSArchitecture (line 294) | public static boolean isCorrectOSArchitecture() {
method openURI (line 306) | public static void openURI(URI uri) throws IOException {
method openFile (line 311) | public static void openFile(File file) throws IOException {
method getDownloadOfHomeDir (line 316) | public static String getDownloadOfHomeDir() {
method copyToClipboard (line 325) | public static void copyToClipboard(String content) {
method setThreadName (line 338) | public static void setThreadName(String name) {
method isDirectory (line 342) | public static boolean isDirectory(String path) {
method getSystemHomeDirectory (line 346) | public static String getSystemHomeDirectory() {
method encodeToHex (line 350) | public static String encodeToHex(@Nullable byte[] bytes, boolean allow...
method bytesAsHexString (line 357) | public static String bytesAsHexString(@Nullable byte[] bytes) {
method encodeToHex (line 361) | public static String encodeToHex(@Nullable byte[] bytes) {
method decodeFromHex (line 365) | public static byte[] decodeFromHex(String encoded) {
method isAltOrCtrlPressed (line 369) | public static boolean isAltOrCtrlPressed(KeyCode keyCode, KeyEvent key...
method isCtrlPressed (line 373) | public static boolean isCtrlPressed(KeyCode keyCode, KeyEvent keyEvent) {
method isAltPressed (line 378) | public static boolean isAltPressed(KeyCode keyCode, KeyEvent keyEvent) {
method isCtrlShiftPressed (line 382) | public static boolean isCtrlShiftPressed(KeyCode keyCode, KeyEvent key...
method concatenateByteArrays (line 386) | public static byte[] concatenateByteArrays(byte[] array1, byte[] array...
method getUTCDate (line 390) | public static Date getUTCDate(int year, int month, int dayOfMonth) {
method commaSeparatedListToSet (line 401) | public static Set<String> commaSeparatedListToSet(String stringList, b...
method getPathOfCodeSource (line 413) | public static String getPathOfCodeSource() throws URISyntaxException {
method toTruncatedString (line 417) | public static String toTruncatedString(Object message) {
method toTruncatedString (line 421) | public static String toTruncatedString(Object message, int maxLength) {
method toTruncatedString (line 425) | public static String toTruncatedString(Object message, int maxLength, ...
method toListOfWrappedStrings (line 437) | public static List<String> toListOfWrappedStrings(String s, int wrapLe...
method getRandomPrefix (line 447) | public static String getRandomPrefix(int minLength, int maxLength) {
method getShortId (line 476) | public static String getShortId(String id) {
method getShortId (line 480) | @SuppressWarnings("SameParameterValue")
method integerToByteArray (line 489) | public static byte[] integerToByteArray(int intValue, int numBytes) {
method byteArrayToInteger (line 498) | public static int byteArrayToInteger(byte[] bytes) {
method copyRightAligned (line 506) | public static byte[] copyRightAligned(byte[] src, int newLength) {
method intsToBytesBE (line 514) | public static byte[] intsToBytesBE(int[] ints) {
method bytesToIntsBE (line 526) | public static int[] bytesToIntsBE(byte[] bytes) {
method distinctByKey (line 535) | public static <T> Predicate<T> distinctByKey(Function<? super T, Objec...
method readableFileSize (line 540) | public static String readableFileSize(long size) {
method formatDurationAsWords (line 548) | public static String formatDurationAsWords(long durationMillis) {
method cleanString (line 587) | public static String cleanString(String string) {
FILE: common/src/main/java/haveno/common/util/ZipUtils.java
class ZipUtils (line 33) | @Slf4j
method zipDirToStream (line 42) | public static void zipDirToStream(File dir, OutputStream out, int buff...
method getFilesRecursive (line 78) | public static void getFilesRecursive(File directory, List<File> fileLi...
method unzipToDir (line 100) | public static void unzipToDir(File dir, InputStream inputStream, int b...
FILE: common/src/test/java/haveno/common/app/CapabilitiesTest.java
class CapabilitiesTest (line 33) | public class CapabilitiesTest {
method testNoCapabilitiesAvailable (line 35) | @Test
method testHasLess (line 43) | @Test
method testO (line 76) | @Test
method testSingleMatch (line 83) | @Test
method testMultiMatch (line 92) | @Test
method testToIntList (line 102) | @Test
method testFromIntList (line 109) | @Test
method testToStringList (line 121) | @Test
method testFromStringList (line 130) | @Test
FILE: common/src/test/java/haveno/common/app/VersionTest.java
class VersionTest (line 26) | public class VersionTest {
method testVersionNumber (line 28) | @Test
method testIsNewVersion (line 40) | @Test
FILE: common/src/test/java/haveno/common/config/ConfigFileEditorTests.java
class ConfigFileEditorTests (line 15) | public class ConfigFileEditorTests {
method setUp (line 22) | @BeforeEach
method whenFileDoesNotExist_thenSetOptionCreatesItAndAppendsOneLine (line 30) | @Test
method whenFileContainsOptionBeingSet_thenSetOptionOverwritesIt (line 40) | @Test
method whenOptionBeingSetHasNoArg_thenSetOptionWritesItWithNoEqualsSign (line 55) | @Test
method whenFileHasBlankOrCommentLines_thenTheyArePreserved (line 69) | @Test
method whenFileContainsOptionBeingCleared_thenClearOptionRemovesIt (line 89) | @Test
method whenFileDoesNotContainOptionBeingCleared_thenClearOptionIsNoOp (line 100) | @Test
method whenFileDoesNotExist_thenClearOptionIsNoOp (line 113) | @Test
FILE: common/src/test/java/haveno/common/config/ConfigFileOptionTests.java
class ConfigFileOptionTests (line 8) | public class ConfigFileOptionTests {
method whenOptionHasWhitespaceAroundEqualsSign_thenItGetsTrimmed (line 10) | @Test
method whenOptionHasLeadingOrTrailingWhitespace_thenItGetsTrimmed (line 19) | @Test
method whenOptionHasEscapedColons_thenTheyGetUnescaped (line 28) | @Test
method whenOptionHasNoValue_thenItSetsEmptyValue (line 37) | @Test
FILE: common/src/test/java/haveno/common/config/ConfigFileReaderTests.java
class ConfigFileReaderTests (line 15) | public class ConfigFileReaderTests {
method setUp (line 21) | @BeforeEach
method whenFileDoesNotExist_thenGetLinesThrows (line 28) | @Test
method whenOptionHasWhitespaceAroundEqualsSign_thenGetLinesPreservesIt (line 41) | @Test
method whenOptionHasEscapedColons_thenTheyGetUnescaped (line 54) | @Test
method whenFileContainsNonOptionLines_getOptionLinesReturnsOnlyOptionLines (line 65) | @Test
FILE: common/src/test/java/haveno/common/config/ConfigTests.java
class ConfigTests (line 36) | public class ConfigTests {
method whenNoArgCtorIsCalled_thenDefaultAppNameIsSetToTempValue (line 42) | @Test
method whenAppNameOptionIsSet_thenAppNamePropertyDiffersFromDefaultAppNameProperty (line 51) | @Test
method whenNoOptionsAreSet_thenDataDirPropertiesEqualDefaultValues (line 58) | @Test
method whenAppNameOptionIsSet_thenDataDirPropertiesReflectItsValue (line 67) | @Test
method whenAppDataDirOptionIsSet_thenDataDirPropertiesReflectItsValue (line 76) | @Test
method whenUserDataDirOptionIsSet_thenDataDirPropertiesReflectItsValue (line 86) | @Test
method whenAppNameAndAppDataDirOptionsAreSet_thenDataDirPropertiesReflectTheirValues (line 96) | @Test
method whenOptionIsSetAtCommandLineAndInConfigFile_thenCommandLineValueTakesPrecedence (line 106) | @Test
method whenUnrecognizedOptionIsSet_thenConfigExceptionIsThrown (line 116) | @Test
method whenUnrecognizedOptionIsSetInConfigFile_thenNoExceptionIsThrown (line 126) | @Test
method whenOptionFileArgumentDoesNotExist_thenConfigExceptionIsThrown (line 137) | @Test
method whenConfigFileOptionIsSetToNonExistentFile_thenConfigExceptionIsThrown (line 148) | @Test
method whenConfigFileOptionIsSetInConfigFile_thenConfigExceptionIsThrown (line 159) | @Test
method whenConfigFileOptionIsSetToExistingFile_thenConfigFilePropertyReflectsItsValue (line 173) | @Test
method whenConfigFileOptionIsSetToRelativePath_thenThePathIsPrefixedByAppDataDir (line 180) | @Test
method whenAppNameIsSetInConfigFile_thenDataDirPropertiesReflectItsValue (line 189) | @Test
method whenBannedXmrNodesOptionIsSet_thenBannedXmrNodesPropertyReturnsItsValue (line 202) | @Test
method whenHelpOptionIsSet_thenIsHelpRequestedIsTrue (line 208) | @Test
method whenConfigIsConstructed_thenNoConsoleOutputSideEffectsShouldOccur (line 214) | @Test
method whenConfigIsConstructed_thenAppDataDirAndSubdirsAreCreated (line 233) | @Test
method whenAppDataDirCannotBeCreatedThenUncheckedIoExceptionIsThrown (line 243) | @Test
method whenAppDataDirIsSymbolicLink_thenAppDataDirCreationIsNoOp (line 257) | @Test
method configWithOpts (line 276) | static Config configWithOpts(Opt... opts) {
method opt (line 283) | static Opt opt(String name) {
method opt (line 287) | static Opt opt(String name, Object arg) {
class Opt (line 291) | static class Opt {
method Opt (line 295) | public Opt(String name) {
method Opt (line 299) | public Opt(String name, String arg) {
method toString (line 304) | @Override
FILE: common/src/test/java/haveno/common/util/MathUtilsTest.java
class MathUtilsTest (line 26) | public class MathUtilsTest {
method testRoundDoubleWithInfiniteArg (line 28) | @Test
method testRoundDoubleWithNaNArg (line 33) | @Test
method testRoundDoubleWithNegativePrecision (line 38) | @Test
method testMovingAverageWithoutOutlierExclusion (line 43) | @SuppressWarnings("OptionalGetWithoutIsPresent")
method testMovingAverageWithOutlierExclusion (line 58) | @SuppressWarnings("OptionalGetWithoutIsPresent")
FILE: common/src/test/java/haveno/common/util/PermutationTest.java
class PermutationTest (line 30) | public class PermutationTest {
method testGetPartialList (line 34) | public void testGetPartialList() {
method testFindMatchingPermutation (line 99) | @Test
method testBreakAtLimit (line 124) | @Test
method testFindAllPermutations (line 142) | public void testFindAllPermutations() {
FILE: common/src/test/java/haveno/common/util/PreconditionsTests.java
class PreconditionsTests (line 16) | public class PreconditionsTests {
method whenDirIsValid_thenDirIsReturned (line 18) | @Test
method whenDirDoesNotExist_thenThrow (line 25) | @Test
FILE: common/src/test/java/haveno/common/util/UtilitiesTest.java
class UtilitiesTest (line 25) | public class UtilitiesTest {
method testToStringList (line 27) | @Test
method testIntegerToByteArray (line 46) | @Test
method testByteArrayToInteger (line 59) | @Test
FILE: core/src/main/java/haveno/core/account/sign/SignedWitness.java
class SignedWitness (line 40) | @Slf4j
type VerificationMethod (line 45) | public enum VerificationMethod {
method fromProto (line 49) | public static SignedWitness.VerificationMethod fromProto(protobuf.Si...
method toProtoMessage (line 53) | public static protobuf.SignedWitness.VerificationMethod toProtoMessa...
method SignedWitness (line 70) | public SignedWitness(VerificationMethod verificationMethod,
method toProtoMessage (line 102) | @Override
method toProtoSignedWitness (line 115) | public protobuf.SignedWitness toProtoSignedWitness() {
method fromProto (line 119) | public static SignedWitness fromProto(protobuf.SignedWitness proto) {
method isDateInTolerance (line 135) | @Override
method verifyHashSize (line 142) | @Override
method getRequiredCapabilities (line 148) | @Override
method getHash (line 153) | @Override
method isSignedByArbitrator (line 158) | public boolean isSignedByArbitrator() {
method getHashAsByteArray (line 166) | public P2PDataStorage.ByteArray getHashAsByteArray() {
method toString (line 170) | @Override
FILE: core/src/main/java/haveno/core/account/sign/SignedWitnessService.java
class SignedWitnessService (line 59) | @Slf4j
method SignedWitnessService (line 94) | @Inject
method onAllServicesInitialized (line 118) | public void onAllServicesInitialized() {
method onBootstrapComplete (line 144) | private void onBootstrapComplete() {
method getSignedWitnessMapValues (line 154) | public Collection<SignedWitness> getSignedWitnessMapValues() {
method getVerifiedWitnessDateList (line 163) | public List<Long> getVerifiedWitnessDateList(AccountAgeWitness account...
method getWitnessDateList (line 178) | public List<Long> getWitnessDateList(AccountAgeWitness accountAgeWitne...
method isSignedByArbitrator (line 186) | public boolean isSignedByArbitrator(AccountAgeWitness accountAgeWitnes...
method isFilteredWitness (line 193) | public boolean isFilteredWitness(AccountAgeWitness accountAgeWitness) {
method ownerPubKey (line 199) | private byte[] ownerPubKey(AccountAgeWitness accountAgeWitness) {
method ownerPubKeyAsString (line 206) | public String ownerPubKeyAsString(AccountAgeWitness accountAgeWitness) {
method getSignedWitnessSetByOwnerPubKey (line 213) | @VisibleForTesting
method publishOwnSignedWitness (line 220) | public boolean publishOwnSignedWitness(SignedWitness signedWitness) {
method signAndPublishAccountAgeWitness (line 232) | public void signAndPublishAccountAgeWitness(BigInteger tradeAmount,
method signAndPublishAccountAgeWitness (line 240) | public String signAndPublishAccountAgeWitness(AccountAgeWitness accoun...
method signTraderPubKey (line 249) | public String signTraderPubKey(ECKey key,
method signAndPublishAccountAgeWitness (line 258) | private String signAndPublishAccountAgeWitness(BigInteger tradeAmount,
method selfSignAndPublishAccountAgeWitness (line 288) | public void selfSignAndPublishAccountAgeWitness(AccountAgeWitness acco...
method signAndPublishAccountAgeWitness (line 295) | public Optional<SignedWitness> signAndPublishAccountAgeWitness(BigInte...
method verifySignature (line 321) | public boolean verifySignature(SignedWitness signedWitness) {
method verifySignatureWithECKey (line 329) | private boolean verifySignatureWithECKey(SignedWitness signedWitness) {
method verifySignatureWithDSAKey (line 356) | private boolean verifySignatureWithDSAKey(SignedWitness signedWitness) {
method getSignedWitnessSet (line 374) | public Set<SignedWitness> getSignedWitnessSet(AccountAgeWitness accoun...
method getArbitratorsSignedWitnessSet (line 380) | public Set<SignedWitness> getArbitratorsSignedWitnessSet(AccountAgeWit...
method getTrustedPeerSignedWitnessSet (line 387) | public Set<SignedWitness> getTrustedPeerSignedWitnessSet(AccountAgeWit...
method getRootSignedWitnessSet (line 393) | public Set<SignedWitness> getRootSignedWitnessSet(boolean includeSigne...
method getUnsignedSignerPubKeys (line 402) | public Set<SignedWitness> getUnsignedSignerPubKeys() {
method getSignedWitnessSetByOwnerPubKey (line 413) | private Set<SignedWitness> getSignedWitnessSetByOwnerPubKey(byte[] own...
method isSignedAccountAgeWitness (line 426) | public boolean isSignedAccountAgeWitness(AccountAgeWitness accountAgeW...
method isSignerAccountAgeWitness (line 430) | public boolean isSignerAccountAgeWitness(AccountAgeWitness accountAgeW...
method isSufficientTradeAmountForSigning (line 434) | public boolean isSufficientTradeAmountForSigning(BigInteger tradeAmoun...
method verifySigner (line 438) | private boolean verifySigner(SignedWitness signedWitness) {
method isSignerAccountAgeWitness (line 451) | private boolean isSignerAccountAgeWitness(AccountAgeWitness accountAge...
method isValidSignerWitnessInternal (line 471) | private boolean isValidSignerWitnessInternal(SignedWitness signedWitness,
method verifyDate (line 507) | private boolean verifyDate(SignedWitness signedWitness, long childSign...
method addToMap (line 518) | @VisibleForTesting
method publishSignedWitness (line 531) | private void publishSignedWitness(SignedWitness signedWitness) {
method doRepublishAllSignedWitnesses (line 540) | private void doRepublishAllSignedWitnesses() {
method removeSignedWitness (line 545) | @VisibleForTesting
FILE: core/src/main/java/haveno/core/account/sign/SignedWitnessStorageService.java
class SignedWitnessStorageService (line 31) | @Slf4j
method SignedWitnessStorageService (line 40) | @Inject
method initializePersistenceManager (line 50) | @Override
method getFileName (line 55) | @Override
method getMap (line 60) | @Override
method canHandle (line 65) | @Override
method createStore (line 75) | @Override
FILE: core/src/main/java/haveno/core/account/sign/SignedWitnessStore.java
class SignedWitnessStore (line 34) | @Slf4j
method SignedWitnessStore (line 37) | SignedWitnessStore() {
method SignedWitnessStore (line 45) | private SignedWitnessStore(List<SignedWitness> list) {
method toProtoMessage (line 49) | public Message toProtoMessage() {
method getBuilder (line 55) | private protobuf.SignedWitnessStore.Builder getBuilder() {
method fromProto (line 63) | public static SignedWitnessStore fromProto(protobuf.SignedWitnessStore...
FILE: core/src/main/java/haveno/core/account/witness/AccountAgeWitness.java
class AccountAgeWitness (line 36) | @Slf4j
method AccountAgeWitness (line 44) | public AccountAgeWitness(byte[] hash,
method toProtoMessage (line 55) | @Override
method toProtoAccountAgeWitness (line 63) | public protobuf.AccountAgeWitness toProtoAccountAgeWitness() {
method fromProto (line 67) | public static AccountAgeWitness fromProto(protobuf.AccountAgeWitness p...
method isDateInTolerance (line 83) | @Override
method verifyHashSize (line 90) | @Override
method getHash (line 95) | @Override
method getHashAsByteArray (line 105) | P2PDataStorage.ByteArray getHashAsByteArray() {
method toString (line 109) | @Override
FILE: core/src/main/java/haveno/core/account/witness/AccountAgeWitnessService.java
class AccountAgeWitnessService (line 79) | @Slf4j
type AccountAge (line 84) | public enum AccountAge {
type SignState (line 91) | public enum SignState {
method SignState (line 103) | SignState(String displayString) {
method addHash (line 107) | public SignState addHash(String hash) {
method setDaysUntilLimitLifted (line 112) | public SignState setDaysUntilLimitLifted(long days) {
method getDisplayString (line 117) | public String getDisplayString() {
method isLimitLifted (line 124) | public boolean isLimitLifted() {
method AccountAgeWitnessService (line 154) | @Inject
method onAllServicesInitialized (line 187) | public void onAllServicesInitialized() {
method onBootStrapped (line 211) | private void onBootStrapped() {
method republishAllTraditionalAccounts (line 218) | private void republishAllTraditionalAccounts() {
method addToMap (line 236) | @VisibleForTesting
method publishMyAccountAgeWitness (line 248) | public void publishMyAccountAgeWitness(PaymentAccountPayload paymentAc...
method getPeerAccountAgeWitnessHash (line 265) | public byte[] getPeerAccountAgeWitnessHash(Trade trade) {
method getAccountInputDataWithSalt (line 271) | byte[] getAccountInputDataWithSalt(PaymentAccountPayload paymentAccoun...
method getNewWitness (line 276) | @VisibleForTesting
method findWitness (line 284) | public Optional<AccountAgeWitness> findWitness(PaymentAccountPayload p...
method findWitness (line 297) | public Optional<AccountAgeWitness> findWitness(Offer offer) {
method findTradePeerWitness (line 304) | private Optional<AccountAgeWitness> findTradePeerWitness(Trade trade) {
method getWitnessByHash (line 314) | private Optional<AccountAgeWitness> getWitnessByHash(byte[] hash) {
method getWitnessByHashAsHex (line 336) | private Optional<AccountAgeWitness> getWitnessByHashAsHex(String hashA...
method getAccountAge (line 344) | public long getAccountAge(AccountAgeWitness accountAgeWitness, Date no...
method getAccountAge (line 350) | public long getAccountAge(PaymentAccountPayload paymentAccountPayload,...
method getAccountAge (line 356) | public long getAccountAge(Offer offer) {
method getAccountAge (line 362) | public long getAccountAge(Trade trade) {
method getWitnessSignAge (line 373) | public long getWitnessSignAge(AccountAgeWitness accountAgeWitness, Dat...
method getWitnessSignAge (line 383) | public long getWitnessSignAge(Offer offer, Date now) {
method getWitnessSignAge (line 389) | public long getWitnessSignAge(Trade trade, Date now) {
method getPeersAccountAgeCategory (line 395) | public AccountAge getPeersAccountAgeCategory(long peersAccountAge) {
method getAccountAgeCategory (line 399) | private AccountAge getAccountAgeCategory(long accountAge) {
method getTradeLimit (line 417) | private BigInteger getTradeLimit(BigInteger maxTradeLimit,
method signedBuyFactor (line 444) | private double signedBuyFactor(AccountAge accountAgeCategory) {
method normalFactor (line 457) | private double normalFactor() {
method isImmature (line 465) | private boolean isImmature(AccountAgeWitness accountAgeWitness) {
method myHasTradeLimitException (line 469) | public boolean myHasTradeLimitException(PaymentAccount myPaymentAccoun...
method hasTradeLimitException (line 476) | private boolean hasTradeLimitException(AccountAgeWitness accountAgeWit...
method getMyWitness (line 484) | public AccountAgeWitness getMyWitness(PaymentAccountPayload paymentAcc...
method getMyWitnessHash (line 490) | private byte[] getMyWitnessHash(PaymentAccountPayload paymentAccountPa...
method getMyWitnessHashAsHex (line 494) | public String getMyWitnessHashAsHex(PaymentAccountPayload paymentAccou...
method getMyAccountAge (line 498) | public long getMyAccountAge(PaymentAccountPayload paymentAccountPayloa...
method getMyTradeLimit (line 502) | public long getMyTradeLimit(PaymentAccount paymentAccount, String curr...
method getUnsignedTradeLimit (line 527) | public long getUnsignedTradeLimit(PaymentMethod paymentMethod, String ...
method verifyAccountAgeWitness (line 540) | public boolean verifyAccountAgeWitness(Trade trade,
method verifyPeersTradeAmount (line 591) | public boolean verifyPeersTradeAmount(Offer offer,
method isToleratedSmalleAmount (line 603) | private boolean isToleratedSmalleAmount(BigInteger tradeAmount) {
method isDateAfterReleaseDate (line 612) | boolean isDateAfterReleaseDate(long witnessDateAsLong,
method verifyPeersCurrentDate (line 628) | public boolean verifyPeersCurrentDate(Date peersCurrentDate) {
method verifyWitnessHash (line 638) | private boolean verifyWitnessHash(byte[] witnessHash,
method verifyPeersTradeLimit (line 651) | private boolean verifyPeersTradeLimit(Offer offer,
method verifySignature (line 683) | boolean verifySignature(PublicKey peersPublicKey,
method arbitratorSignAccountAgeWitness (line 708) | public void arbitratorSignAccountAgeWitness(BigInteger tradeAmount,
method arbitratorSignOrphanWitness (line 715) | public String arbitratorSignOrphanWitness(AccountAgeWitness accountAge...
method arbitratorSignOrphanPubKey (line 732) | public String arbitratorSignOrphanPubKey(ECKey key,
method arbitratorSignAccountAgeWitness (line 738) | public void arbitratorSignAccountAgeWitness(AccountAgeWitness accountA...
method traderSignAndPublishPeersAccountAgeWitness (line 745) | public Optional<SignedWitness> traderSignAndPublishPeersAccountAgeWitn...
method publishOwnSignedWitness (line 762) | public boolean publishOwnSignedWitness(SignedWitness signedWitness) {
method getTraderPaymentAccounts (line 767) | public List<TraderDataItem> getTraderPaymentAccounts(long safeDate,
method isNotFiltered (line 784) | private boolean isNotFiltered(Dispute dispute) {
method hasChargebackRisk (line 796) | @VisibleForTesting
method isBuyerWinner (line 802) | private boolean isBuyerWinner(Dispute dispute) {
method getTraderData (line 808) | private Stream<TraderDataItem> getTraderData(Dispute dispute) {
method hasSignedWitness (line 834) | public boolean hasSignedWitness(Offer offer) {
method peerHasSignedWitness (line 840) | public boolean peerHasSignedWitness(Trade trade) {
method accountIsSigner (line 846) | public boolean accountIsSigner(AccountAgeWitness accountAgeWitness) {
method tradeAmountIsSufficient (line 850) | public boolean tradeAmountIsSufficient(BigInteger tradeAmount) {
method getSignState (line 854) | public SignState getSignState(Offer offer) {
method getSignState (line 860) | public SignState getSignState(Trade trade) {
method getSignState (line 867) | public SignState getSignState(AccountAgeWitness accountAgeWitness) {
method getOrphanSignedWitnesses (line 892) | public Set<AccountAgeWitness> getOrphanSignedWitnesses() {
method signAndPublishSameNameAccounts (line 899) | public void signAndPublishSameNameAccounts() {
method getUnsignedSignerPubKeys (line 923) | public Set<SignedWitness> getUnsignedSignerPubKeys() {
method isSignWitnessTrade (line 927) | public boolean isSignWitnessTrade(Trade trade) {
method getSignInfoFromAccount (line 940) | public String getSignInfoFromAccount(PaymentAccount paymentAccount) {
method getSignInfoFromString (line 946) | public Tuple2<AccountAgeWitness, byte[]> getSignInfoFromString(String ...
FILE: core/src/main/java/haveno/core/account/witness/AccountAgeWitnessStorageService.java
class AccountAgeWitnessStorageService (line 29) | @Slf4j
method AccountAgeWitnessStorageService (line 38) | @Inject
method getFileName (line 49) | @Override
method initializePersistenceManager (line 54) | @Override
method canHandle (line 59) | @Override
method createStore (line 69) | @Override
FILE: core/src/main/java/haveno/core/account/witness/AccountAgeWitnessStore.java
class AccountAgeWitnessStore (line 33) | @Slf4j
method AccountAgeWitnessStore (line 36) | public AccountAgeWitnessStore() {
method AccountAgeWitnessStore (line 44) | private AccountAgeWitnessStore(List<AccountAgeWitness> list) {
method toProtoMessage (line 48) | public Message toProtoMessage() {
method getBuilder (line 54) | private protobuf.AccountAgeWitnessStore.Builder getBuilder() {
method fromProto (line 62) | public static AccountAgeWitnessStore fromProto(protobuf.AccountAgeWitn...
FILE: core/src/main/java/haveno/core/account/witness/AccountAgeWitnessUtils.java
class AccountAgeWitnessUtils (line 39) | @Slf4j
method AccountAgeWitnessUtils (line 45) | AccountAgeWitnessUtils(AccountAgeWitnessService accountAgeWitnessService,
method logSignedWitnesses (line 54) | public void logSignedWitnesses() {
method logChild (line 66) | private void logChild(SignedWitness sigWit, String initString, Stack<P...
method logSigners (line 82) | public void logSigners() {
method logUnsignedSignerPubKeys (line 96) | public void logUnsignedSignerPubKeys() {
method getWitnessDebugLog (line 108) | private String getWitnessDebugLog(PaymentAccountPayload paymentAccount...
method witnessDebugLog (line 126) | public void witnessDebugLog(Trade trade, @Nullable AccountAgeWitness m...
FILE: core/src/main/java/haveno/core/alert/Alert.java
class Alert (line 41) | @EqualsAndHashCode
method Alert (line 66) | public Alert(String message,
method Alert (line 81) | @SuppressWarnings("NullableProblems")
method toProtoMessage (line 100) | @Override
method fromProto (line 115) | @Nullable
method getTTL (line 137) | @Override
method setSigAndPubKey (line 142) | public void setSigAndPubKey(String signatureAsBase64, PublicKey ownerP...
method isNewVersion (line 149) | public boolean isNewVersion(Preferences preferences) {
method isSoftwareUpdateNotification (line 159) | public boolean isSoftwareUpdateNotification() {
method canShowPopup (line 163) | public boolean canShowPopup(Preferences preferences) {
method showAgainKey (line 169) | public String showAgainKey() {
FILE: core/src/main/java/haveno/core/alert/AlertManager.java
class AlertManager (line 44) | public class AlertManager {
method AlertManager (line 60) | @Inject
method getPubKeyList (line 99) | protected List<String> getPubKeyList() {
method alertMessageProperty (line 126) | public ReadOnlyObjectProperty<Alert> alertMessageProperty() {
method addAlertMessageIfKeyIsValid (line 130) | public boolean addAlertMessageIfKeyIsValid(Alert alert, String privKey...
method removeAlertMessageIfKeyIsValid (line 148) | public boolean removeAlertMessageIfKeyIsValid(String privKeyString) {
method isKeyValid (line 161) | private boolean isKeyValid(String privKeyString) {
method signAndAddSignatureToAlertMess
Copy disabled (too large)
Download .json
Condensed preview — 1890 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (15,514K chars).
[
{
"path": ".editorconfig",
"chars": 394,
"preview": "root = true\n\n[*]\nindent_style = space\nindent_size = 4\ncontinuation_indent_size = 8\nend_of_line = lf\ncharset = utf-8\ntrim"
},
{
"path": ".gitattributes",
"chars": 451,
"preview": "# Auto detect text files and normalize line endings to LF\n# This will handle all files NOT found below\n* text=auto\n# The"
},
{
"path": ".github/CODEOWNERS",
"chars": 235,
"preview": "# This doc specifies who gets requested to review GitHub pull requests.\n# See https://help.github.com/articles/about-cod"
},
{
"path": ".github/workflows/build.yml",
"chars": 13966,
"preview": "# GitHub Releases requires a tag, e.g:\n# git tag -s 1.0.19-1 -m \"haveno-v1.0.19-1\"\n# git push origin 1.0.19-1\nname: CI"
},
{
"path": ".github/workflows/codacy-code-reporter.yml",
"chars": 1029,
"preview": "name: Codacy Coverage Reporter\n\non: [\"push\"]\n\npermissions:\n contents: read\n\njobs:\n build:\n if: github.repository =="
},
{
"path": ".github/workflows/codeql-analysis.yml",
"chars": 2315,
"preview": "# For most projects, this workflow file will not need changing; you simply need\n# to commit it to your repository.\n#\n# Y"
},
{
"path": ".github/workflows/label.yml",
"chars": 1028,
"preview": "name: Comment to label\n\non:\n issues:\n types: [labeled]\n workflow_call:\n\njobs:\n issueLabeled:\n runs-on: ubuntu-2"
},
{
"path": ".gitignore",
"chars": 519,
"preview": "bin/\n*/docs\n*/log\n*/out\n.idea\n!.idea/copyright/haveno_Affero_GPLv3.xml\n!.idea/copyright/profiles_settings.xml\n!.idea/cod"
},
{
"path": "LICENSE",
"chars": 34554,
"preview": " GNU AFFERO GENERAL PUBLIC LICENSE\n Version 3, 19 November 2007\n\n Copyright (C)"
},
{
"path": "Makefile",
"chars": 17189,
"preview": "# See docs/installing.md\n\nbuild: localnet haveno\n\nclean:\n\t./gradlew clean\n\nclean-localnet:\n\trm -rf .localnet\n\nlocalnet:\n"
},
{
"path": "README.md",
"chars": 5066,
"preview": "<div align=\"center\">\n <img src=\"https://raw.githubusercontent.com/haveno-dex/haveno-meta/721e52919b28b44d12b6e1e5dac572"
},
{
"path": "apitest/scripts/editf2faccountform.py",
"chars": 845,
"preview": "import sys, os, json\n\n# Writes a Haveno json F2F payment account form for the given country_code to the current working "
},
{
"path": "apitest/scripts/get-haveno-pid.sh",
"chars": 412,
"preview": "#!/bin/bash\n\n# Find the pid of the java process by grepping for the mainClassName and appName,\n# then print the 2nd colu"
},
{
"path": "apitest/scripts/limit-order-simulation.sh",
"chars": 5433,
"preview": "#! /bin/bash\n\n# Demonstrates a way to create a limit order (offer) using the API CLI with a local regtest bitcoin node.\n"
},
{
"path": "apitest/scripts/mainnet-test.sh",
"chars": 6980,
"preview": "#!/usr/bin/env bats\n#\n# Smoke tests for haveno-cli running against a live haveno-daemon (on mainnet)\n#\n# Prerequisites:\n"
},
{
"path": "apitest/scripts/rolling-offer-simulation.sh",
"chars": 4171,
"preview": "#! /bin/bash\n\n# Demonstrates a way to always keep one offer in the market, using the API CLI with a local regtest bitcoi"
},
{
"path": "apitest/scripts/trade-simulation-env.sh",
"chars": 9846,
"preview": "#! /bin/bash\n\n# This file must be sourced by the main driver.\n\nexport CLI_BASE=\"./haveno-cli --password=xyz\"\nexport ARBI"
},
{
"path": "apitest/scripts/trade-simulation-utils.sh",
"chars": 18720,
"preview": "#! /bin/bash\n\n# This file must be sourced by the main driver.\n\nsource \"$APITEST_SCRIPTS_HOME/trade-simulation-env.sh\"\n\np"
},
{
"path": "apitest/scripts/trade-simulation.sh",
"chars": 4360,
"preview": "#! /bin/bash\n\n# Demonstrates a fiat <-> btc trade using the API CLI with a local regtest bitcoin node.\n#\n# A country cod"
},
{
"path": "apitest/scripts/trade-xmr-simulation.sh",
"chars": 4255,
"preview": "#! /bin/bash\n\n# Runs xmr <-> btc trading scenarios using the API CLI with a local regtest bitcoin node.\n#\n# Prerequisite"
},
{
"path": "apitest/scripts/version-parser.bash",
"chars": 206,
"preview": "#!/bin/bash\n\n# Bats helper script for parsing current version from Version.java.\n\nexport CURRENT_VERSION=$(grep \"String "
},
{
"path": "apitest/src/main/java/haveno/apitest/ApiTestMain.java",
"chars": 3367,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/main/java/haveno/apitest/Scaffold.java",
"chars": 16218,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/main/java/haveno/apitest/SetupTask.java",
"chars": 2562,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/main/java/haveno/apitest/SmokeTestBashCommand.java",
"chars": 1561,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/main/java/haveno/apitest/SmokeTestBitcoind.java",
"chars": 3121,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/main/java/haveno/apitest/config/ApiTestConfig.java",
"chars": 17871,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/main/java/haveno/apitest/config/ApiTestRateMeterInterceptorConfig.java",
"chars": 2987,
"preview": "package haveno.apitest.config;\n\nimport haveno.daemon.grpc.GrpcVersionService;\nimport haveno.daemon.grpc.interceptor.Grpc"
},
{
"path": "apitest/src/main/java/haveno/apitest/config/HavenoAppConfig.java",
"chars": 4710,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/main/java/haveno/apitest/linux/AbstractLinuxProcess.java",
"chars": 4454,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/main/java/haveno/apitest/linux/BashCommand.java",
"chars": 5757,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/main/java/haveno/apitest/linux/BitcoinCli.java",
"chars": 6130,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/main/java/haveno/apitest/linux/BitcoinDaemon.java",
"chars": 4216,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/main/java/haveno/apitest/linux/HavenoProcess.java",
"chars": 10982,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/main/java/haveno/apitest/linux/LinuxProcess.java",
"chars": 1164,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/main/java/haveno/apitest/linux/SystemCommandExecutor.java",
"chars": 4617,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/main/java/haveno/apitest/linux/ThreadedStreamHandler.java",
"chars": 3033,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/main/resources/apitest.properties",
"chars": 0,
"preview": ""
},
{
"path": "apitest/src/main/resources/blocknotify",
"chars": 479,
"preview": "#!/bin/bash\n\n# Regtest ports start with 512*\n\n# To avoid pesky bitcoind io errors, do not specify ports Haveno is not li"
},
{
"path": "apitest/src/main/resources/haveno.properties",
"chars": 364,
"preview": "# Haveno core properties file loaded by Haveno instances started by the test harness.\n# Normally, it would be left empty"
},
{
"path": "apitest/src/main/resources/logback.xml",
"chars": 865,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n <!--\n The :daemon & :cli jars contain their own logback.xm"
},
{
"path": "apitest/src/test/java/haveno/apitest/ApiTestCase.java",
"chars": 5701,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/method/BitcoinCliHelper.java",
"chars": 3162,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/method/CallRateMeteringInterceptorTest.java",
"chars": 2930,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/method/GetMethodHelpTest.java",
"chars": 1809,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/method/GetVersionTest.java",
"chars": 1801,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/method/MethodTest.java",
"chars": 10180,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/method/RegisterDisputeAgentsTest.java",
"chars": 3604,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/method/offer/AbstractOfferTest.java",
"chars": 4715,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/method/offer/CancelOfferTest.java",
"chars": 2963,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/method/offer/CreateOfferUsingFixedPriceTest.java",
"chars": 8637,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/method/offer/CreateOfferUsingMarketPriceMarginTest.java",
"chars": 16789,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/method/offer/CreateXMROffersTest.java",
"chars": 12025,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/method/offer/ValidateCreateOfferTest.java",
"chars": 3715,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/method/payment/AbstractPaymentAccountTest.java",
"chars": 12304,
"preview": "package haveno.apitest.method.payment;\n\nimport com.google.gson.Gson;\nimport com.google.gson.GsonBuilder;\nimport com.goog"
},
{
"path": "apitest/src/test/java/haveno/apitest/method/payment/CreatePaymentAccountTest.java",
"chars": 69311,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/method/payment/GetPaymentMethodsTest.java",
"chars": 1437,
"preview": "package haveno.apitest.method.payment;\n\nimport haveno.apitest.method.MethodTest;\nimport lombok.extern.slf4j.Slf4j;\nimpor"
},
{
"path": "apitest/src/test/java/haveno/apitest/method/trade/AbstractTradeTest.java",
"chars": 10807,
"preview": "package haveno.apitest.method.trade;\n\nimport haveno.apitest.method.offer.AbstractOfferTest;\nimport haveno.cli.CliMain;\ni"
},
{
"path": "apitest/src/test/java/haveno/apitest/method/trade/ExpectedProtocolStatus.java",
"chars": 2026,
"preview": "package haveno.apitest.method.trade;\n\nimport haveno.core.trade.Trade;\n\n/**\n * A test fixture encapsulating expected trad"
},
{
"path": "apitest/src/test/java/haveno/apitest/method/trade/TakeBuyBTCOfferTest.java",
"chars": 5019,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/method/trade/TakeBuyBTCOfferWithNationalBankAcctTest.java",
"chars": 12197,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/method/trade/TakeBuyXMROfferTest.java",
"chars": 6058,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/method/trade/TakeSellBTCOfferTest.java",
"chars": 5270,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/method/trade/TakeSellXMROfferTest.java",
"chars": 6340,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/method/wallet/BtcWalletTest.java",
"chars": 3697,
"preview": "package haveno.apitest.method.wallet;\n\nimport haveno.apitest.method.MethodTest;\nimport haveno.cli.table.builder.TableBui"
},
{
"path": "apitest/src/test/java/haveno/apitest/method/wallet/WalletProtectionTest.java",
"chars": 4452,
"preview": "package haveno.apitest.method.wallet;\n\nimport haveno.apitest.method.MethodTest;\nimport io.grpc.StatusRuntimeException;\ni"
},
{
"path": "apitest/src/test/java/haveno/apitest/method/wallet/WalletTestUtil.java",
"chars": 1101,
"preview": "package haveno.apitest.method.wallet;\n\nimport haveno.proto.grpc.BtcBalanceInfo;\nimport lombok.extern.slf4j.Slf4j;\n\nimpor"
},
{
"path": "apitest/src/test/java/haveno/apitest/scenario/LongRunningOfferDeactivationTest.java",
"chars": 6441,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/scenario/LongRunningTradesTest.java",
"chars": 3627,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/scenario/OfferTest.java",
"chars": 3428,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/scenario/PaymentAccountTest.java",
"chars": 3502,
"preview": "package haveno.apitest.scenario;\n\nimport haveno.apitest.method.payment.AbstractPaymentAccountTest;\nimport haveno.apitest"
},
{
"path": "apitest/src/test/java/haveno/apitest/scenario/ScriptedBotTest.java",
"chars": 4478,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/scenario/StartupTest.java",
"chars": 3865,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/scenario/TradeTest.java",
"chars": 3368,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/scenario/WalletTest.java",
"chars": 3277,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/scenario/bot/AbstractBotTest.java",
"chars": 4444,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/scenario/bot/Bot.java",
"chars": 3035,
"preview": "package haveno.apitest.scenario.bot;\n\nimport haveno.apitest.method.BitcoinCliHelper;\nimport haveno.apitest.scenario.bot."
},
{
"path": "apitest/src/test/java/haveno/apitest/scenario/bot/BotClient.java",
"chars": 10975,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/scenario/bot/BotPaymentAccountGenerator.java",
"chars": 2470,
"preview": "package haveno.apitest.scenario.bot;\n\nimport com.google.gson.Gson;\nimport com.google.gson.GsonBuilder;\nimport haveno.cor"
},
{
"path": "apitest/src/test/java/haveno/apitest/scenario/bot/InvalidRandomOfferException.java",
"chars": 1182,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/scenario/bot/PaymentAccountNotFoundException.java",
"chars": 1198,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/scenario/bot/RandomOffer.java",
"chars": 6780,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/scenario/bot/RobotBob.java",
"chars": 5441,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/scenario/bot/protocol/BotProtocol.java",
"chars": 15844,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/scenario/bot/protocol/MakerBotProtocol.java",
"chars": 4661,
"preview": "package haveno.apitest.scenario.bot.protocol;\n\nimport haveno.apitest.method.BitcoinCliHelper;\nimport haveno.apitest.scen"
},
{
"path": "apitest/src/test/java/haveno/apitest/scenario/bot/protocol/ProtocolStep.java",
"chars": 443,
"preview": "package haveno.apitest.scenario.bot.protocol;\n\npublic enum ProtocolStep {\n START,\n FIND_OFFER,\n TAKE_OFFER,\n "
},
{
"path": "apitest/src/test/java/haveno/apitest/scenario/bot/protocol/TakerBotProtocol.java",
"chars": 5266,
"preview": "package haveno.apitest.scenario.bot.protocol;\n\nimport haveno.apitest.method.BitcoinCliHelper;\nimport haveno.apitest.scen"
},
{
"path": "apitest/src/test/java/haveno/apitest/scenario/bot/script/BashScriptGenerator.java",
"chars": 9156,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/scenario/bot/script/BotScript.java",
"chars": 2691,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/scenario/bot/script/BotScriptGenerator.java",
"chars": 12176,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/scenario/bot/shutdown/ManualBotShutdownException.java",
"chars": 1187,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "apitest/src/test/java/haveno/apitest/scenario/bot/shutdown/ManualShutdown.java",
"chars": 2026,
"preview": "package haveno.apitest.scenario.bot.shutdown;\n\nimport haveno.common.UserThread;\nimport lombok.extern.slf4j.Slf4j;\n\nimpor"
},
{
"path": "apitest/src/test/resources/logback.xml",
"chars": 865,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n <!--\n The :daemon & :cli jars contain their own logback.xm"
},
{
"path": "assets/src/main/java/haveno/asset/AbstractAsset.java",
"chars": 1913,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/main/java/haveno/asset/AddressValidationResult.java",
"chars": 2258,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/main/java/haveno/asset/AddressValidator.java",
"chars": 897,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/main/java/haveno/asset/Asset.java",
"chars": 1608,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/main/java/haveno/asset/AssetRegistry.java",
"chars": 1386,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/main/java/haveno/asset/Base58AddressValidator.java",
"chars": 1741,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/main/java/haveno/asset/BitcoinAddressValidator.java",
"chars": 1636,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/main/java/haveno/asset/BitcoinCashAddressValidator.java",
"chars": 1232,
"preview": "/*\n * This file is part of Haveno.\n *\n * Haveno is free software: you can redistribute it and/or modify it\n * under the "
},
{
"path": "assets/src/main/java/haveno/asset/CardanoAddressValidator.java",
"chars": 3852,
"preview": "/*\n * This file is part of Haveno.\n *\n * Haveno is free software: you can redistribute it and/or modify it\n * under the "
},
{
"path": "assets/src/main/java/haveno/asset/Coin.java",
"chars": 1983,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/main/java/haveno/asset/CryptoAccountDisclaimer.java",
"chars": 851,
"preview": "package haveno.asset;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang."
},
{
"path": "assets/src/main/java/haveno/asset/CryptoNoteAddressValidator.java",
"chars": 1872,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/main/java/haveno/asset/CryptoNoteUtils.java",
"chars": 11035,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/main/java/haveno/asset/Erc20Token.java",
"chars": 1112,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/main/java/haveno/asset/EtherAddressValidator.java",
"chars": 1472,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/main/java/haveno/asset/GrinAddressValidator.java",
"chars": 4577,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/main/java/haveno/asset/I18n.java",
"chars": 185,
"preview": "package haveno.asset;\n\nimport java.util.ResourceBundle;\n\npublic class I18n {\n\t\n\tpublic static ResourceBundle DISPLAY_STR"
},
{
"path": "assets/src/main/java/haveno/asset/LiquidBitcoinAddressValidator.java",
"chars": 392,
"preview": "package haveno.asset;\n\npublic class LiquidBitcoinAddressValidator extends RegexAddressValidator {\n static private fin"
},
{
"path": "assets/src/main/java/haveno/asset/NetworkParametersAdapter.java",
"chars": 2204,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/main/java/haveno/asset/PrintTool.java",
"chars": 1888,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/main/java/haveno/asset/RegexAddressValidator.java",
"chars": 1587,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/main/java/haveno/asset/RippleAddressValidator.java",
"chars": 1084,
"preview": "/*\n * This file is part of Haveno.\n *\n * Haveno is free software: you can redistribute it and/or modify it\n * under the "
},
{
"path": "assets/src/main/java/haveno/asset/SolanaAddressValidator.java",
"chars": 3175,
"preview": "/*\n * This file is part of Haveno.\n *\n * Haveno is free software: you can redistribute it and/or modify it\n * under the "
},
{
"path": "assets/src/main/java/haveno/asset/Token.java",
"chars": 1443,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/main/java/haveno/asset/Trc20Token.java",
"chars": 1017,
"preview": "/*\n * This file is part of Haveno.\n *\n * Haveno is free software: you can redistribute it and/or modify it\n * under the "
},
{
"path": "assets/src/main/java/haveno/asset/TronAddressValidator.java",
"chars": 3544,
"preview": "/*\n * This file is part of Haveno.\n *\n * Haveno is free software: you can redistribute it and/or modify it\n * under the "
},
{
"path": "assets/src/main/java/haveno/asset/coins/Bitcoin.java",
"chars": 1634,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/main/java/haveno/asset/coins/BitcoinCash.java",
"chars": 944,
"preview": "/*\n * This file is part of Haveno.\n *\n * Haveno is free software: you can redistribute it and/or modify it\n * under the "
},
{
"path": "assets/src/main/java/haveno/asset/coins/Cardano.java",
"chars": 923,
"preview": "/*\n * This file is part of Haveno.\n *\n * Haveno is free software: you can redistribute it and/or modify it\n * under the "
},
{
"path": "assets/src/main/java/haveno/asset/coins/Dogecoin.java",
"chars": 1217,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/main/java/haveno/asset/coins/Ether.java",
"chars": 905,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/main/java/haveno/asset/coins/Litecoin.java",
"chars": 1259,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/main/java/haveno/asset/coins/Monero.java",
"chars": 1030,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/main/java/haveno/asset/coins/Ripple.java",
"chars": 918,
"preview": "/*\n * This file is part of Haveno.\n *\n * Haveno is free software: you can redistribute it and/or modify it\n * under the "
},
{
"path": "assets/src/main/java/haveno/asset/coins/Solana.java",
"chars": 918,
"preview": "/*\n * This file is part of Haveno.\n *\n * Haveno is free software: you can redistribute it and/or modify it\n * under the "
},
{
"path": "assets/src/main/java/haveno/asset/coins/Tron.java",
"chars": 908,
"preview": "/*\n * This file is part of Haveno.\n *\n * Haveno is free software: you can redistribute it and/or modify it\n * under the "
},
{
"path": "assets/src/main/java/haveno/asset/package-info.java",
"chars": 1581,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/main/java/haveno/asset/tokens/AugmintEuro.java",
"chars": 866,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/main/java/haveno/asset/tokens/DaiStablecoinERC20.java",
"chars": 887,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/main/java/haveno/asset/tokens/EtherStone.java",
"chars": 862,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/main/java/haveno/asset/tokens/TetherUSDERC20.java",
"chars": 383,
"preview": "package haveno.asset.tokens;\n\nimport haveno.asset.Erc20Token;\n\npublic class TetherUSDERC20 extends Erc20Token {\n publ"
},
{
"path": "assets/src/main/java/haveno/asset/tokens/TetherUSDTRC20.java",
"chars": 383,
"preview": "package haveno.asset.tokens;\n\nimport haveno.asset.Trc20Token;\n\npublic class TetherUSDTRC20 extends Trc20Token {\n publ"
},
{
"path": "assets/src/main/java/haveno/asset/tokens/TrueUSD.java",
"chars": 853,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/main/java/haveno/asset/tokens/USDCoinERC20.java",
"chars": 870,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/main/java/haveno/asset/tokens/VectorspaceAI.java",
"chars": 870,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/main/resources/META-INF/services/haveno.asset.Asset",
"chars": 710,
"preview": "# All assets available for trading on the Haveno network.\n# Contents are sorted according to the output of `sort --ignor"
},
{
"path": "assets/src/main/resources/i18n/displayStrings-assets.properties",
"chars": 1859,
"preview": "# Keep display strings organized by domain\n# Naming convention: We use camelCase and dot separated name spaces.\n# Use as"
},
{
"path": "assets/src/test/java/haveno/asset/AbstractAssetTest.java",
"chars": 2724,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/test/java/haveno/asset/coins/BitcoinCashTest.java",
"chars": 1503,
"preview": "/*\n * This file is part of Haveno.\n *\n * Haveno is free software: you can redistribute it and/or modify it\n * under the "
},
{
"path": "assets/src/test/java/haveno/asset/coins/BitcoinTest.java",
"chars": 1565,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/test/java/haveno/asset/coins/CardanoTest.java",
"chars": 1711,
"preview": "/*\n * This file is part of Haveno.\n *\n * Haveno is free software: you can redistribute it and/or modify it\n * under the "
},
{
"path": "assets/src/test/java/haveno/asset/coins/DogecoinTest.java",
"chars": 1428,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/test/java/haveno/asset/coins/LitecoinTest.java",
"chars": 3184,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/test/java/haveno/asset/coins/MoneroTest.java",
"chars": 2394,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/test/java/haveno/asset/coins/RippleTest.java",
"chars": 1559,
"preview": "/*\n * This file is part of Haveno.\n *\n * Haveno is free software: you can redistribute it and/or modify it\n * under the "
},
{
"path": "assets/src/test/java/haveno/asset/coins/SolanaTest.java",
"chars": 1765,
"preview": "/*\n * This file is part of Haveno.\n *\n * Haveno is free software: you can redistribute it and/or modify it\n * under the "
},
{
"path": "assets/src/test/java/haveno/asset/coins/TetherUSDERC20Test.java",
"chars": 1476,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "assets/src/test/java/haveno/asset/coins/TetherUSDTRC20Test.java",
"chars": 1403,
"preview": "/*\n * This file is part of Haveno.\n *\n * Haveno is free software: you can redistribute it and/or modify it\n * under the "
},
{
"path": "assets/src/test/java/haveno/asset/coins/TronTest.java",
"chars": 1620,
"preview": "/*\n * This file is part of Haveno.\n *\n * Haveno is free software: you can redistribute it and/or modify it\n * under the "
},
{
"path": "build.gradle",
"chars": 44693,
"preview": "import org.apache.tools.ant.taskdefs.condition.Os\nimport org.gradle.internal.logging.ConsoleRenderer\n\nbuildscript {\n "
},
{
"path": "cli/package/create-cli-dist.sh",
"chars": 1942,
"preview": "#! /bin/bash\n\nVERSION=\"$1\"\nif [[ -z \"$VERSION\" ]]; then\n VERSION=\"SNAPSHOT\"\nfi\n\nexport HAVENO_RELEASE_NAME=\"haveno-cli"
},
{
"path": "cli/src/main/java/haveno/cli/CliMain.java",
"chars": 38637,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/ColumnHeaderConstants.java",
"chars": 4766,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/CryptoCurrencyUtil.java",
"chars": 1176,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/CurrencyFormat.java",
"chars": 4913,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/DirectionFormat.java",
"chars": 2335,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/GrpcClient.java",
"chars": 11025,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/GrpcStubs.java",
"chars": 3315,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/Method.java",
"chars": 1601,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/PasswordCallCredentials.java",
"chars": 2070,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/TransactionFormat.java",
"chars": 816,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/opts/AbstractMethodOptionParser.java",
"chars": 3117,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/opts/ArgumentList.java",
"chars": 4258,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/opts/CancelOfferOptionParser.java",
"chars": 1139,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/opts/CreateCryptoCurrencyPaymentAcctOptionParser.java",
"chars": 3382,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/opts/CreateOfferOptionParser.java",
"chars": 5597,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/opts/CreatePaymentAcctOptionParser.java",
"chars": 2090,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/opts/GetAddressBalanceOptionParser.java",
"chars": 1572,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/opts/GetBTCMarketPriceOptionParser.java",
"chars": 1610,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/opts/GetBalanceOptionParser.java",
"chars": 1435,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/opts/GetOfferOptionParser.java",
"chars": 1548,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/opts/GetOffersOptionParser.java",
"chars": 2052,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/opts/GetPaymentAcctFormOptionParser.java",
"chars": 1698,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/opts/GetTradeOptionParser.java",
"chars": 1952,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/opts/GetTradesOptionParser.java",
"chars": 2890,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/opts/GetTransactionOptionParser.java",
"chars": 1559,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/opts/MethodOpts.java",
"chars": 791,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/opts/OfferIdOptionParser.java",
"chars": 1864,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/opts/OptLabel.java",
"chars": 2839,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/opts/RegisterDisputeAgentOptionParser.java",
"chars": 2137,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/opts/RemoveWalletPasswordOptionParser.java",
"chars": 1607,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/opts/SendBtcOptionParser.java",
"chars": 2660,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/opts/SetTxFeeRateOptionParser.java",
"chars": 1605,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/opts/SetWalletPasswordOptionParser.java",
"chars": 2018,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/opts/SimpleMethodOptionParser.java",
"chars": 999,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/opts/TakeOfferOptionParser.java",
"chars": 1596,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/opts/UnlockWalletOptionParser.java",
"chars": 2091,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/opts/WithdrawFundsOptionParser.java",
"chars": 2338,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/request/OffersServiceRequest.java",
"chars": 6459,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/request/PaymentAccountsServiceRequest.java",
"chars": 4321,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/request/TradesServiceRequest.java",
"chars": 3947,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/request/WalletsServiceRequest.java",
"chars": 4648,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/table/Table.java",
"chars": 5470,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/table/builder/AbstractTableBuilder.java",
"chars": 1426,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/table/builder/AbstractTradeListBuilder.java",
"chars": 10239,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/table/builder/AddressBalanceTableBuilder.java",
"chars": 3216,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
},
{
"path": "cli/src/main/java/haveno/cli/table/builder/BtcBalanceTableBuilder.java",
"chars": 2954,
"preview": "/*\n * This file is part of Bisq.\n *\n * Bisq is free software: you can redistribute it and/or modify it\n * under the term"
}
]
// ... and 1690 more files (download for full content)
About this extraction
This page contains the full source code of the retoaccess1/haveno-reto GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1890 files (13.8 MB), approximately 3.7M tokens, and a symbol index with 14661 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.