Merge remote-tracking branch 'origin/Development' into api-pr1

Conflicts:
	common/src/main/java/io/bisq/common/locale/LocaleUtil.java
This commit is contained in:
Mike Rosseel 2017-10-11 14:38:34 +02:00
commit 0755cac9d1
No known key found for this signature in database
GPG Key ID: 1D9920AF2A8E6BF0
134 changed files with 1535 additions and 1120 deletions

View File

@ -1,4 +1,4 @@
<img src="https://bisq.io/wp-content/uploads/2014/09/bitsquare-home2.jpg"/>
<img src="https://bisq.network/images/logo_white_bg.png"/>
What is Bisq?
@ -12,12 +12,12 @@ There are no central points of control or failure in the Bisq network. There are
Because the national currency portion of any trade must be transferred via traditional means such as a wire transfer, Bisq incorporates first-class support for human arbitration to resolve any errors or disputes.
You can read about all of this and more in the [whitepaper](https://bisq.io/bitsquare.pdf) and [arbitration](https://bisq.io/arbitration_system.pdf) documents. Several [videos](https://bisq.io/blog/category/video) are available as well.
You can read about all of this and more in the [whitepaper](https://bisq.network/bitsquare.pdf) and [arbitration](https://bisq.network/arbitration_system.pdf) documents. Several [videos](https://bisq.network/blog/category/video) are available as well.
Status
------
Bisq has released the beta version on the 27th of April 2016. It is operational since that time without any major incident.
Please follow the current development state at our [road map]( https://bisq.io/roadmap).
Please follow the current development state at our [road map]( https://bisq.network/roadmap).
For the latest version checkout our [releases page](https://github.com/bisq-network/exchange/releases) at Github.
Building from source
@ -33,9 +33,9 @@ Staying in Touch
Contact the team and keep up to date using any of the following:
- The [Bisq Website](https://bisq.io)
- The [Bisq Website](https://bisq.network)
- GitHub [Issues](https://github.com/bisq-network/exchange/issues)
- The [Bisq Forum]( https://forum.bisq.io)
- The [Bisq Forum]( https://forum.bisq.network)
- The [#bitsquare](https://webchat.freenode.net/?channels=bitsquare) IRC channel on Freenode ([logs](https://botbot.me/freenode/bitsquare))
- Our [mailing list](https://groups.google.com/forum/#!forum/bitsquare)
- [@Bitsquare_](https://twitter.com/bitsquare_) on Twitter

View File

@ -20,6 +20,5 @@ public class DevEnv {
@SuppressWarnings("PointlessBooleanExpression")
public static final boolean DEV_MODE = STRESS_TEST_MODE || true;
public static final boolean DAO_ACTIVATED = false;
public static final boolean DAO_PHASE2_ACTIVATED = false;
}

View File

@ -170,6 +170,7 @@ public class CountryUtil {
}
private static final Map<String, String> regionCodeToNameMap = new HashMap<>();
// Key is: ISO 3166 code, value is region code as defined in regionCodeToNameMap
private static final Map<String, String> regionByCountryCodeMap = new HashMap<>();
static {

View File

@ -82,150 +82,55 @@ public class CurrencyUtil {
}
// Don't make a PR for adding a coin but follow the steps described here:
// https://forum.bisq.io/t/how-to-add-your-favorite-altcoin/
// https://forum.bisq.network/t/how-to-add-your-favorite-altcoin/
public static List<CryptoCurrency> createAllSortedCryptoCurrenciesList() {
final List<CryptoCurrency> result = new ArrayList<>();
result.add(new CryptoCurrency("AIB", "Advanced Internet Blocks"));
result.add(new CryptoCurrency("ANC", "Anoncoin"));
result.add(new CryptoCurrency("ANTI", "Anti"));
result.add(new CryptoCurrency("ARCO", "AquariusCoin"));
result.add(new CryptoCurrency("ARG", "Argentum"));
result.add(new CryptoCurrency("REP", "Augur", true));
result.add(new CryptoCurrency("BATL", "Battlestars"));
result.add(new CryptoCurrency("BIGUP", "BigUp"));
// result.add(new CryptoCurrency("BSQ", "Bisq Token"));
if (!baseCurrencyCode.equals("BTC"))
result.add(new CryptoCurrency("BTC", "Bitcoin"));
result.add(new CryptoCurrency("BITAUD", "BitAUD", true));
result.add(new CryptoCurrency("BITCHF", "BitCHF", true));
result.add(new CryptoCurrency("BITCNY", "BitCNY", true));
result.add(new CryptoCurrency("BITEUR", "BitEUR", true));
result.add(new CryptoCurrency("BITGBP", "BitGBP", true));
result.add(new CryptoCurrency("BITHKD", "BitHKD", true));
result.add(new CryptoCurrency("BITNZD", "BitNZD", true));
result.add(new CryptoCurrency("BITSEK", "BitSEK", true));
result.add(new CryptoCurrency("BITSGD", "BitSGD", true));
result.add(new CryptoCurrency("SYNQ", "BitSYNQ"));
result.add(new CryptoCurrency("BTS", "BitShares"));
result.add(new CryptoCurrency("BITUSD", "BitUSD", true));
result.add(new CryptoCurrency("BLK", "Blackcoin"));
result.add(new CryptoCurrency("BURST", "Burstcoin"));
result.add(new CryptoCurrency("GBYTE", "Byte"));
result.add(new CryptoCurrency("CLAM", "Clams"));
result.add(new CryptoCurrency("CLOAK", "CloakCoin"));
result.add(new CryptoCurrency("CMT", "Comet"));
result.add(new CryptoCurrency("XCP", "Counterparty"));
result.add(new CryptoCurrency("CRBIT", "Creditbit"));
result.add(new CryptoCurrency("CRW", "Crown"));
result.add(new CryptoCurrency("CBX", "Crypto Bullion"));
result.add(new CryptoCurrency("DNET", "DarkNet"));
result.add(new CryptoCurrency("DIBC", "DIBCOIN"));
if (!baseCurrencyCode.equals("DASH"))
result.add(new CryptoCurrency("DASH", "Dash"));
result.add(new CryptoCurrency("DEC", "DECENT"));
result.add(new CryptoCurrency("DCR", "Decred"));
result.add(new CryptoCurrency("DGB", "Digibyte"));
result.add(new CryptoCurrency("DRS", "Digital Rupees"));
result.add(new CryptoCurrency("DGD", "DigixDAO Tokens", true));
if (!baseCurrencyCode.equals("DOGE"))
result.add(new CryptoCurrency("DOGE", "Dogecoin"));
result.add(new CryptoCurrency("DMC", "DynamicCoin"));
result.add(new CryptoCurrency("EMC", "Emercoin"));
result.add(new CryptoCurrency("EURT", "EUR Tether"));
result.add(new CryptoCurrency("ELLA", "Ellaism"));
result.add(new CryptoCurrency("ESP", "Espers"));
result.add(new CryptoCurrency("ENT", "Eternity"));
result.add(new CryptoCurrency("ETH", "Ether"));
result.add(new CryptoCurrency("ETC", "Ether Classic"));
result.add(new CryptoCurrency("ERC", "Europecoin"));
result.add(new CryptoCurrency("EGC", "EverGreenCoin"));
result.add(new CryptoCurrency("EOS", "EOS", true));
result.add(new CryptoCurrency("FCT", "Factom"));
result.add(new CryptoCurrency("FAIR", "FairCoin"));
result.add(new CryptoCurrency("FLO", "FlorinCoin"));
//TODO ticker?
//result.add(new CryptoCurrency("FILE", "Filecoin", true));
result.add(new CryptoCurrency("GAME", "GameCredits"));
result.add(new CryptoCurrency("GEMZ", "Gemz"));
result.add(new CryptoCurrency("GRC", "Gridcoin"));
result.add(new CryptoCurrency("GRS", "Groestlcoin"));
result.add(new CryptoCurrency("NLG", "Gulden"));
result.add(new CryptoCurrency("HODL", "HOdlcoin"));
result.add(new CryptoCurrency("HNC", "HunCoin"));
result.add(new CryptoCurrency("IOC", "I/O Coin"));
result.add(new CryptoCurrency("IOTA", "IOTA", true));
result.add(new CryptoCurrency("ELLA", "Ellaism"));
result.add(new CryptoCurrency("IOP", "Fermat"));
result.add(new CryptoCurrency("JNS", "Janus", true));
result.add(new CryptoCurrency("JPYT", "JPY Tether"));
result.add(new CryptoCurrency("JBS", "Jumbucks"));
result.add(new CryptoCurrency("GRC", "Gridcoin"));
result.add(new CryptoCurrency("LBC", "LBRY Credits"));
result.add(new CryptoCurrency("LTBC", "LTBcoin"));
result.add(new CryptoCurrency("LSK", "Lisk"));
if (!baseCurrencyCode.equals("LTC"))
result.add(new CryptoCurrency("LTC", "Litecoin"));
result.add(new CryptoCurrency("MAID", "MaidSafeCoin"));
result.add(new CryptoCurrency("MKR", "Maker", true));
result.add(new CryptoCurrency("MXT", "MarteXcoin"));
result.add(new CryptoCurrency("MOIN", "Moin"));
result.add(new CryptoCurrency("XMR", "Monero"));
result.add(new CryptoCurrency("MT", "Mycelium Token", true));
result.add(new CryptoCurrency("XMY", "Myriadcoin"));
result.add(new CryptoCurrency("NAV", "Nav Coin"));
result.add(new CryptoCurrency("XEM", "NEM"));
result.add(new CryptoCurrency("NEVA", "Nevacoin"));
result.add(new CryptoCurrency("NMC", "Namecoin"));
result.add(new CryptoCurrency("NBT", "NuBits"));
result.add(new CryptoCurrency("NSR", "NuShares"));
result.add(new CryptoCurrency("NXT", "Nxt"));
result.add(new CryptoCurrency("888", "OctoCoin"));
result.add(new CryptoCurrency("OK", "OKCash"));
result.add(new CryptoCurrency("OMNI", "Omni"));
result.add(new CryptoCurrency("OPAL", "Opal"));
result.add(new CryptoCurrency("PART", "Particl"));
result.add(new CryptoCurrency("PASC", "Pascal Coin", true));
result.add(new CryptoCurrency("PPC", "Peercoin"));
result.add(new CryptoCurrency("PEPECASH", "Pepe Cash"));
result.add(new CryptoCurrency("PINK", "Pinkcoin"));
result.add(new CryptoCurrency("PIVX", "PIVX"));
result.add(new CryptoCurrency("XPTX", "PlatinumBar"));
result.add(new CryptoCurrency("PLU", "Plutons", true));
result.add(new CryptoCurrency("PNC", "Pranacoin"));
result.add(new CryptoCurrency("POST", "PostCoin"));
result.add(new CryptoCurrency("POT", "PotCoin"));
result.add(new CryptoCurrency("XPM", "Primecoin"));
result.add(new CryptoCurrency("RADS", "Radium"));
result.add(new CryptoCurrency("REALEST", "RealEst. Coin"));
result.add(new CryptoCurrency("PNC", "Pranacoin"));
result.add(new CryptoCurrency("RDD", "ReddCoin"));
result.add(new CryptoCurrency("XRP", "Ripple"));
result.add(new CryptoCurrency("SFSC", "Safe FileSystem Coin"));
result.add(new CryptoCurrency("SHIFT", "Shift"));
result.add(new CryptoCurrency("SC", "Siacoin"));
result.add(new CryptoCurrency("SF", "Siafund"));
result.add(new CryptoCurrency("SIB", "Sibcoin"));
result.add(new CryptoCurrency("SMLY", "Smileycoin"));
result.add(new CryptoCurrency("SLR", "SolarCoin"));
result.add(new CryptoCurrency("STEEM", "STEEM"));
result.add(new CryptoCurrency("STEEMUSD", "Steem Dollars", true));
result.add(new CryptoCurrency("XLM", "Stellar Lumens"));
result.add(new CryptoCurrency("SJCX", "StorjcoinX"));
result.add(new CryptoCurrency("STRAT", "Stratis"));
result.add(new CryptoCurrency("SWT", "Swarm City Token", true));
result.add(new CryptoCurrency("SYNX", "Syndicate"));
result.add(new CryptoCurrency("AMP", "Synereo", true));
result.add(new CryptoCurrency("TRI", "Triangles"));
result.add(new CryptoCurrency("USDT", "USD Tether"));
result.add(new CryptoCurrency("UNO", "Unobtanium"));
result.add(new CryptoCurrency("VCN", "VCoin"));
result.add(new CryptoCurrency("VPN", "VPNCoin"));
result.add(new CryptoCurrency("XVG", "Verge"));
result.add(new CryptoCurrency("VRC", "VeriCoin"));
result.add(new CryptoCurrency("WAC", "WACoins"));
result.add(new CryptoCurrency("WAVES", "Waves"));
result.add(new CryptoCurrency("WDC", "Worldcoin"));
result.add(new CryptoCurrency("XAUR", "Xaurum"));
result.add(new CryptoCurrency("YACC", "YACCoin"));
result.add(new CryptoCurrency("YBC", "YbCoin"));
result.add(new CryptoCurrency("ZEC", "Zcash"));
result.add(new CryptoCurrency("XZC", "Zcoin"));
result.add(new CryptoCurrency("ZEN", "ZenCash"));
@ -254,6 +159,8 @@ public class CurrencyUtil {
if (!baseCurrencyCode.equals("DASH"))
result.add(new CryptoCurrency("DASH", "Dash"));
result.add(new CryptoCurrency("DCR", "Decred"));
if (!baseCurrencyCode.equals("DOGE"))
result.add(new CryptoCurrency("DOGE", "Dogecoin"));
result.add(new CryptoCurrency("ETH", "Ether"));
result.add(new CryptoCurrency("ETC", "Ether Classic"));
result.add(new CryptoCurrency("GRC", "Gridcoin"));

View File

@ -30,6 +30,7 @@ public class LocaleUtil {
public static List<Locale> getAllLocales() {
// derived form Locale.getAvailableLocales() and added some missing locales
// Key is ISO 639-1 code (https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes), value is ISO 3166 country code
List<Locale> allLocales = new ArrayList<>();
allLocales.add(new Locale("bg", "", ""));
@ -160,7 +161,7 @@ public class LocaleUtil {
allLocales.add(new Locale("es", "PE", ""));
allLocales.add(new Locale("en", "PH", ""));
allLocales.add(new Locale("pl", "PL", ""));
allLocales.add(new Locale("es", "PR", ""));
allLocales.add(new Locale("es", "PR", "")); // Puerto Rico
allLocales.add(new Locale("pt", "PT", ""));
allLocales.add(new Locale("es", "PY", ""));
allLocales.add(new Locale("ar", "QA", ""));

View File

@ -410,24 +410,10 @@ message PubKeyScript {
string hex = 5;
}
message TxInputVo {
message TxInput {
string tx_id = 1;
int32 tx_output_index = 2;
}
message TxInput {
TxInputVo tx_input_vo = 1;
TxOutput connected_tx_output = 2;
}
message TxOutputVo {
int32 index = 1;
int64 value = 2;
string tx_id = 3;
PubKeyScript pub_key_script = 4;
string address = 5;
bytes op_return_data = 6;
int32 block_height= 7;
TxOutput connected_tx_output = 3;
}
message SpentInfo {
@ -449,11 +435,17 @@ enum TxOutputType {
}
message TxOutput {
TxOutputVo tx_output_vo = 1;
bool is_unspent = 2;
bool is_verified = 3;
TxOutputType tx_output_type = 4;
SpentInfo spent_info = 5;
int32 index = 1;
int64 value = 2;
string tx_id = 3;
PubKeyScript pub_key_script = 4;
string address = 5;
bytes op_return_data = 6;
int32 block_height= 7;
bool is_unspent = 8;
bool is_verified = 9;
TxOutputType tx_output_type = 10;
SpentInfo spent_info = 11;
}
message TxVo {
@ -486,16 +478,12 @@ message Tx {
int64 burnt_fee = 4;
TxType tx_type = 5;
}
message BsqBlockVo {
message BsqBlock {
int32 height = 1;
string hash = 2;
string previous_block_hash = 3;
}
message BsqBlock {
BsqBlockVo bsq_block_vo = 1;
repeated Tx txs = 2;
repeated Tx txs = 4;
}
message TxIdIndexTuple {
@ -551,6 +539,8 @@ message Filter {
string signature_as_base64 = 4;
bytes owner_pub_key_bytes = 5;
map<string, string> extra_data = 6;
repeated string banned_currencies = 7;
repeated string banned_payment_methods = 8;
}
message TradeStatistics {

View File

@ -166,6 +166,7 @@ shared.viewContractAsJson=View contract in JSON format
shared.contract.title=Contract for trade with ID: {0}
shared.paymentDetails=BTC {0} payment details:
shared.securityDeposit=Security deposit
shared.yourSecurityDeposit=Your security deposit
shared.contract=Contract
shared.messageArrived=Message arrived.
shared.messageStoredInMailbox=Message stored in mailbox.
@ -210,6 +211,9 @@ mainView.menu.account=Account
mainView.menu.dao=DAO
mainView.marketPrice.provider=Market price provider:
mainView.marketPrice.bisqInternalPrice=Price of latest Bisq trade
mainView.marketPrice.tooltip.bisqInternalPrice=There is no market price from external price feed providers available.\n\
The displayed price is the latest Bisq trade price for that currency.
mainView.marketPrice.tooltip=Market price is provided by {0}{1}\nLast update: {2}\nProvider node URL: {3}
mainView.marketPrice.tooltip.altcoinExtra=If the altcoin is not available at Poloniex we use https://coinmarketcap.com
mainView.balance.available=Available balance
@ -315,6 +319,8 @@ offerbook.warning.noMatchingAccount.msg=You don't have a trading account with th
offerbook.warning.wrongTradeProtocol=That offer requires a different protocol version as the one used in your version of the software.\n\nPlease check if you have the latest version installed, otherwise the user who created the offer has used an older version.\n\nUsers cannot trade with an incompatible trade protocol version.
offerbook.warning.userIgnored=You have added that user's onion address to your ignore list.
offerbook.warning.offerBlocked=That offer was blocked by the Bisq developers.\nProbably there is an unhandled bug causing issues when taking that offer.
offerbook.warning.currencyBanned=The currency used in that offer was blocked by the Bisq developers.\nPlease visit the Bisq Forum for more information.
offerbook.warning.paymentMethodBanned=The payment method used in that offer was blocked by the Bisq developers.\nPlease visit the Bisq Forum for more information.
offerbook.warning.nodeBlocked=The onion address of that trader was blocked by the Bisq developers.\nProbably there is an unhandled bug causing issues when taking offers from that trader.
@ -333,7 +339,7 @@ createOffer.amountPriceBox.minAmountDescription=Minimum amount of BTC
createOffer.securityDeposit.prompt=Security deposit in BTC
createOffer.fundsBox.title=Fund your offer
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.offerFee=Maker fee:
createOffer.fundsBox.offerFee=Trade fee:
createOffer.fundsBox.networkFee=Mining fee:
createOffer.fundsBox.placeOfferSpinnerInfo=Offer publishing is in progress ...
createOffer.fundsBox.paymentLabel=Bisq trade with ID {0}
@ -347,7 +353,7 @@ createOffer.alreadyFunded=You had already funded that offer.\nYour funds have be
createOffer.createOfferFundWalletInfo.headline=Fund your offer
# suppress inspection "TrailingSpacesInProperty"
createOffer.createOfferFundWalletInfo.tradeAmount=- Trade amount: {0} \n
createOffer.createOfferFundWalletInfo.msg=You need to deposit {0} to this offer.\n\nThose funds are reserved in your local wallet and will get locked into the Multisig deposit address once someone takes your offer.\n\nThe amount is the sum of:\n{1}- Security deposit: {2}\n- Trading fee: {3}\n- Mining fee: {4}\n\nYou can choose between two options when funding your trade:\n- Use your Bisq wallet (convenient, but transactions may be linkable) OR\n- Transfer from an external wallet (potentially more private)\n\nYou will see all funding options and details after closing this popup.
createOffer.createOfferFundWalletInfo.msg=You need to deposit {0} to this offer.\n\nThose funds are reserved in your local wallet and will get locked into the Multisig deposit address once someone takes your offer.\n\nThe amount is the sum of:\n{1}- Your security deposit: {2}\n- Trading fee: {3}\n- Mining fee: {4}\n\nYou can choose between two options when funding your trade:\n- Use your Bisq wallet (convenient, but transactions may be linkable) OR\n- Transfer from an external wallet (potentially more private)\n\nYou will see all funding options and details after closing this popup.
# only first part "An error occurred when placing the offer:" has been used before. We added now the rest (need update in existing translations!)
createOffer.amountPriceBox.error.message=An error occurred when placing the offer:\n\n{0}\n\n\
@ -369,8 +375,9 @@ createOffer.useLowerValue=Yes, use my lower value
createOffer.priceOutSideOfDeviation=The price you have entered is outside the max. allowed deviation from the market price.\nThe max. allowed deviation is {0} and can be adjusted in the preferences.
createOffer.changePrice=Change price
createOffer.tac=With publishing that offer I agree to trade with any trader who fulfills the conditions as defined in that screen.
createOffer.currencyForFee=Maker fee
createOffer.currencyForFee=Trade fee
createOffer.feeCurrencyAndDeposit=Set fee currency and security deposit
createOffer.setDeposit=Set buyer's security deposit
####################################################################
@ -389,8 +396,8 @@ takeOffer.validation.amountLargerThanOfferAmountMinusFee=That input amount would
takeOffer.fundsBox.title=Fund your trade
takeOffer.fundsBox.isOfferAvailable=Check if offer is available ...
takeOffer.fundsBox.tradeAmount=Amount to sell:
takeOffer.fundsBox.offerFee=Taker fee:
takeOffer.fundsBox.networkFee=Mining fees (3x):
takeOffer.fundsBox.offerFee=Trade fee:
takeOffer.fundsBox.networkFee=Total mining fees:
takeOffer.fundsBox.takeOfferSpinnerInfo=Take offer in progress ...
takeOffer.fundsBox.paymentLabel=Bisq trade with ID {0}
takeOffer.success.headline=You have successfully taken an offer.
@ -404,7 +411,7 @@ takeOffer.alreadyFunded.movedFunds=You had already funded that offer.\nYour fund
takeOffer.takeOfferFundWalletInfo.headline=Fund your trade
# suppress inspection "TrailingSpacesInProperty"
takeOffer.takeOfferFundWalletInfo.tradeAmount=- Trade amount: {0} \n
takeOffer.takeOfferFundWalletInfo.msg=You need to deposit {0} for taking this offer.\n\nThe amount is the sum of:\n{1}- Security deposit: {2}\n- Trading fee: {3}\n- Mining fee (3x): {4}\n\nYou can choose between two options when funding your trade:\n- Use your Bisq wallet (convenient, but transactions may be linkable) OR\n- Transfer from an external wallet (potentially more private)\n\nYou will see all funding options and details after closing this popup.
takeOffer.takeOfferFundWalletInfo.msg=You need to deposit {0} for taking this offer.\n\nThe amount is the sum of:\n{1}- Your security deposit: {2}\n- Trading fee: {3}\n- Total mining fees: {4}\n\nYou can choose between two options when funding your trade:\n- Use your Bisq wallet (convenient, but transactions may be linkable) OR\n- Transfer from an external wallet (potentially more private)\n\nYou will see all funding options and details after closing this popup.
takeOffer.alreadyPaidInFunds=If you have already paid in funds you can withdraw it in the \"Funds/Send funds\" screen.
takeOffer.paymentInfo=Payment info
takeOffer.setAmountPrice=Set amount
@ -422,7 +429,7 @@ takeOffer.error.depositPublished=\n\nThe deposit transaction is already publishe
takeOffer.error.payoutPublished=\n\nThe payout transaction is already published.\nPlease try to restart your application and check your network connection to see if you can resolve the issue.\nIf the problem still remains please contact the developers for support.
takeOffer.tac=With taking that offer I agree to the trade conditions as defined in that screen.
takeOffer.currencyForFee=Taker fee
takeOffer.currencyForFee=Trade fee
takeOffer.feeCurrency=Set fee currency
@ -689,7 +696,7 @@ In cases where a user got stuck by a bug without getting displayed that \"Open s
you can open a support ticket manually with a special short cut.\n\n\
Please use that only if you are sure that the software is not working like expected. \
If you have problems how to use Bisq or any questions please review the FAQ at the \
bisq.io web page or post in the Bisq forum at the support section.\n\n\
bisq.network web page or post in the Bisq forum at the support section.\n\n\
If you are sure that you want to open a support ticket please select the trade which causes the problem \
under \"Portfolio/Open trades\" and type the key combination \"alt + o\" or \"option + o\" to open \
the support ticket.
@ -954,9 +961,21 @@ dao.wallet.menuItem.send=Send
dao.wallet.menuItem.receive=Receive
dao.wallet.menuItem.transactions=Transactions
dao.wallet.dashboard.statistics=Statistics
dao.wallet.dashboard.genesisBlockHeight=Genesis block height:
dao.wallet.dashboard.genesisTxId=Genesis transaction ID:
dao.wallet.dashboard.issuedAmount=Total issued amount:
dao.wallet.dashboard.availableAmount=Available amount:
dao.wallet.dashboard.burntAmount=Burnt amount (fees):
dao.wallet.dashboard.allTx=No. of all BSQ transactions:
dao.wallet.dashboard.utxo=No. of all unspent transaction outputs:
dao.wallet.dashboard.spentTxo=No. of all spent transaction outputs:
dao.wallet.dashboard.burntTx=No. of all fee payments transactions (burnt):
dao.wallet.dashboard.price=Price:
dao.wallet.dashboard.marketCap=Market capitalisation:
dao.wallet.receive.fundBSQWallet=Fund Bisq BSQ wallet
dao.wallet.receive.fundYourWallet=Fund your BSQ wallet
dao.wallet.receive.amountOptional=Amount (optional)
dao.wallet.send.sendFunds=Send funds
dao.wallet.send.amount=Amount in BSQ:
@ -967,8 +986,8 @@ dao.wallet.send.send=Send BSQ funds
dao.wallet.send.sendFunds.headline=Confirm withdrawal request
dao.wallet.send.sendFunds.details=Sending: {0}\nTo receiving address: {1}.\nRequired transaction fee is: {2} ({3} Satoshis/byte)\nTransaction size: {4} Kb\n\nThe recipient will receive: {5}\n\nAre you sure you want to withdraw that amount?
dao.wallet.bsqFee=BSQ fee payment
dao.wallet.chainHeightSynced=Synchronized with blockchain height. Current height: {0} / Best chain height: {1}
dao.wallet.chainHeightSyncing=Synchronizing with blockchain height. Current height: {0} / Best chain height: {1}
dao.wallet.chainHeightSynced=Synchronized up to block:{0} (latest block: {1})
dao.wallet.chainHeightSyncing=Synchronizing block: {0} (latest block: {1})
dao.wallet.tx.type=Type
dao.tx.type.enum.UNVERIFIED=Unverified BSQ transaction
@ -1001,17 +1020,17 @@ displayAlertMessageWindow.update.headline=Important update information!
displayAlertMessageWindow.update.download=Download:
displayUpdateDownloadWindow.downloadedFiles=Downloaded files:
displayUpdateDownloadWindow.downloadingFile=Downloading: {0}
displayUpdateDownloadWindow.verifiedSigs=Verified signatures:
displayUpdateDownloadWindow.verifiedSigs=Signature verified with keys:
displayUpdateDownloadWindow.status.downloading=Downloading files...
displayUpdateDownloadWindow.status.verifying=Verifying signature(s)...
displayUpdateDownloadWindow.button.label=Download installer and verify signature(s)
displayUpdateDownloadWindow.status.verifying=Verifying signature...
displayUpdateDownloadWindow.button.label=Download installer and verify signature
displayUpdateDownloadWindow.headline=A new Bisq update is available!
displayUpdateDownloadWindow.download.failed=Download failed.\n\
Please download and verify manually at https://bisq.io/downloads
displayUpdateDownloadWindow.installer.failed=Unable to determine the correct installer. Please download and verify manually at https://bisq.io/downloads
Please download and verify manually at https://bisq.network/downloads
displayUpdateDownloadWindow.installer.failed=Unable to determine the correct installer. Please download and verify manually at https://bisq.network/downloads
displayUpdateDownloadWindow.verify.failed=Verification failed.\n\
Please download and verify manually at https://bisq.io/downloads
displayUpdateDownloadWindow.success=The new version has been successfully downloaded and the signature(s) verified.\n\n\
Please download and verify manually at https://bisq.network/downloads
displayUpdateDownloadWindow.success=The new version has been successfully downloaded and the signature verified.\n\n\
Please open the download directory, shut down the application and install the new version.
displayUpdateDownloadWindow.download.openDir=Open download directory
@ -1071,6 +1090,8 @@ filterWindow.headline=Edit filter list
filterWindow.offers=Filtered offers (comma sep.):
filterWindow.onions=Filtered onion addresses (comma sep.):
filterWindow.accounts=Filtered trading account data:\nFormat: comma sep. list of [payment method id | data field | value]
filterWindow.bannedCurrencies=Filtered currency codes (comma sep.):
filterWindow.bannedPaymentMethods=Filtered payment method IDs (comma sep.):
filterWindow.add=Add filter
filterWindow.remove=Remove filter
@ -1187,7 +1208,7 @@ The backup is located at:\n\
{1}/db/backup_of_corrupted_data.\n\n\
Please check if you have the latest version of Bisq installed.\n\
You can download it at:\n\
https://bisq.io/downloads\n\n\
https://bisq.network/downloads\n\n\
Please restart the application.
popup.warning.cannotConnectAtStartup=You still did not get connected to the {0} network.\nIf you use Tor for Bitcoin it might be that you got an unstable Tor circuit.\nYou can wait longer or try to restart.
popup.warning.unknownProblemAtStartup=There is an unknown problem at startup.\nPlease restart and if the problem continues file a bug report.
@ -1322,6 +1343,7 @@ confidence.invalid=Transaction is invalid
peerInfo.title=Peer info
peerInfo.nrOfTrades=Number of completed trades:
peerInfo.notTradedYet=You have not traded with that user so far.
peerInfo.setTag=Set tag for that peer:
addressTextField.openWallet=Open your default bitcoin wallet
@ -1457,10 +1479,10 @@ seed.restore.error=An error occurred when restoring the wallets with seed words.
payment.account.no=Account no.:
payment.account.name=Account name:
payment.account.owner=Account holder name
payment.account.owner=Account owner full name
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.emailAndHolderId=Account holder name / email / {0}
payment.account.name.email=Account owner full name / email
payment.account.name.emailAndHolderId=Account owner full name / email / {0}
payment.bank.name=Bank name:
payment.select.account=Select account type
payment.select.region=Select region
@ -1536,7 +1558,7 @@ popup.info.revertIdCheckRequirement=With this version we remove the requirement
with bank transfer or Faster Payment was used.\n\n\
The email address is not exposed anymore in Sepa, Faster Payment and national bank transfer payment methods.\n\n\
Please see the discussion on the Bisq Forum for further background:\n\
https://forum.bisq.io/t/new-requirement-for-payment-accounts-with-charge-back-risk/2376
https://forum.bisq.network/t/new-requirement-for-payment-accounts-with-charge-back-risk/2376
# We use constants from the code so we do not use our normal naming convention
# dynamic values are not recognized by IntelliJ

View File

@ -386,7 +386,7 @@ takeOffer.fundsBox.title=Ihren Handel finanzieren
takeOffer.fundsBox.isOfferAvailable=Überprüfe ob Angebot verfügbar ist ...
takeOffer.fundsBox.tradeAmount=Zu verkaufender Betrag:
takeOffer.fundsBox.offerFee=Abnehmergebühr:
takeOffer.fundsBox.networkFee=Mining Gebühren (3x):
takeOffer.fundsBox.networkFee=Gesamte Mining Gebühren:
takeOffer.fundsBox.takeOfferSpinnerInfo=Angebotsannahme im Gange ...
takeOffer.fundsBox.paymentLabel=Bisq Handel mit Kennung {0}
takeOffer.success.headline=Sie haben ein Angebot erfolgreich angenommen.
@ -660,7 +660,7 @@ support.buyerOfferer=BTC Käufer/Ersteller
support.sellerOfferer=BTC Verkäufer/Ersteller
support.buyerTaker=BTC Käufer/Abnehmer
support.sellerTaker=BTC Verkäufer/Abnehmer
support.backgroundInfo=Bisq ist keine Firma und betreibt keine Form von Kundendienst.\n\nGibt es Konflikte während des Handelsprozess (z.B. ein Händler befolgt nicht das Handelsprotokoll), wird die Anwendung nach der Handelsdauer eine \"Konflikt öffnen\" Schaltfläche anzeigen, um den Vermittler zu kontaktieren.\nIm Falle von Softwarefehlern oder anderen Problemen, die von der Anwendung entdeckt werden, wird eine \"Unterstützungsticket öffnen\" Schaltfläche angezeigt, um den Vermittler zu kontaktieren, der die Probleme an die Entwickler weiterleitet.\n\nIm Falle, dass ein Nutzer durch einen Fehler fest hängt, ohne dass die \"Unterstützungsticket öffnen\" Schaltfläche angezeigt wird, können Sie ein Unterstützungsticket mit einer speziellen Tastenkombination manuell öffnen.\n\nBitte nutzen Sie diese nur, wenn Sie sicher sind, dass die Software sich nicht wie erwartet verhält. Falls Sie Probleme wie man Bisq verwendet oder andere Fragen haben, überprüfen Sie bitte das FAQ auf der bisq.io Website oder posten Sie in das Bisq Forum in die Unterstützungsabteilung.\n\nFalls Sie sicher sind, dass Sie ein Unterstützungsticket öffnen wollen, wählen Sie bitte den Handel, der Probleme bereitet, unter \"Mappe/Offene Händel\" und drücken Sie die Tastenkombination \"alt + o\" oder \"option + o\" um das Unterstützungsticket zu öffnen.
support.backgroundInfo=Bisq ist keine Firma und betreibt keine Form von Kundendienst.\n\nGibt es Konflikte während des Handelsprozess (z.B. ein Händler befolgt nicht das Handelsprotokoll), wird die Anwendung nach der Handelsdauer eine \"Konflikt öffnen\" Schaltfläche anzeigen, um den Vermittler zu kontaktieren.\nIm Falle von Softwarefehlern oder anderen Problemen, die von der Anwendung entdeckt werden, wird eine \"Unterstützungsticket öffnen\" Schaltfläche angezeigt, um den Vermittler zu kontaktieren, der die Probleme an die Entwickler weiterleitet.\n\nIm Falle, dass ein Nutzer durch einen Fehler fest hängt, ohne dass die \"Unterstützungsticket öffnen\" Schaltfläche angezeigt wird, können Sie ein Unterstützungsticket mit einer speziellen Tastenkombination manuell öffnen.\n\nBitte nutzen Sie diese nur, wenn Sie sicher sind, dass die Software sich nicht wie erwartet verhält. Falls Sie Probleme wie man Bisq verwendet oder andere Fragen haben, überprüfen Sie bitte das FAQ auf der bisq.network Website oder posten Sie in das Bisq Forum in die Unterstützungsabteilung.\n\nFalls Sie sicher sind, dass Sie ein Unterstützungsticket öffnen wollen, wählen Sie bitte den Handel, der Probleme bereitet, unter \"Mappe/Offene Händel\" und drücken Sie die Tastenkombination \"alt + o\" oder \"option + o\" um das Unterstützungsticket zu öffnen.
support.initialInfo=Bitte beachten Sie die grundlegenen Regeln für den Konfliktprozess:\n1. Sie müssen innerhalb von 2 Tagen auf die Anfrage des Vermittlers reagieren.\n2. Die maximale Dauer des Konflikts ist 14 Tage.\n3. Sie müssen erfüllen, was der Vermittler von ihnen verlangt, um Beweise für ihren Fall zu liefern.\n4. Sie akzeptieren die Regeln, die im Wiki im Nutzungsvereinbarung umrissen wurden, als Sie das erste Mal die Anwendung gestartet haben.\n\nErfahren Sie mehr über den Konfliktprozess in unserem Wiki:\nhttps://github.com/bisq-network/exchange/wiki/Arbitration-system
support.systemMsg=Systemnachricht: {0}
support.youOpenedTicket=Sie haben eine Anfrage auf Unterstützung geöffnet.
@ -1064,7 +1064,7 @@ error.spvFileCorrupted=Beim Einlesen der SPV Kettendatei ist ein Fehler aufgetre
popup.warning.walletNotInitialized=Die Wallet ist noch nicht initialisiert
popup.warning.wrongVersion=Sie haben vermutlich die falsche Bisq Version für diesen Computer.\nDie Architektur ihres Computers ist: {0}.\nDie installierten Bisq Binärdateien sind: {1}.\nBitte fahren Sie diese herunter und installieren die korrekte Version ({2}).
popup.warning.incompatibleDB=Wir haben nicht kompatible Datenbankdateien entdeckt!\n\nDie Datenbankdatei(en) sind mit unserer momentanen Codebasis nicht kompatibel:\n{0}\n\nWir haben ein Backup der beschädigten Datei(en) erstellt und die Standardwerte auf eine neue Datenbankversion angewendet.\n\nDas Backup befindet sich in:\n{1}/db/backup_of_corrupted_data.\n\nBitte überprüfen Sie, ob Sie die letzte Version von Bisq installiert haben.\nSie können diese hier herunterladen:\nhttps://bisq.io/downloads\n\nBitte starten Sie die Anwendung neu.
popup.warning.incompatibleDB=Wir haben nicht kompatible Datenbankdateien entdeckt!\n\nDie Datenbankdatei(en) sind mit unserer momentanen Codebasis nicht kompatibel:\n{0}\n\nWir haben ein Backup der beschädigten Datei(en) erstellt und die Standardwerte auf eine neue Datenbankversion angewendet.\n\nDas Backup befindet sich in:\n{1}/db/backup_of_corrupted_data.\n\nBitte überprüfen Sie, ob Sie die letzte Version von Bisq installiert haben.\nSie können diese hier herunterladen:\nhttps://bisq.network/downloads\n\nBitte starten Sie die Anwendung neu.
popup.warning.cannotConnectAtStartup=Sie wurden immer noch nicht mit dem {0} Netzwerk verbunden.\nSollten Sie Tor für Bitcoin verwenden kann es sein, dass Sie eine labile Torverbindung haben.\nSie können versuchen länger zu warten oder neu zu starten.
popup.warning.unknownProblemAtStartup=Es gibt ein unbekanntes Problem beim Starten.\nBitte starten Sie neu und wenn das Problem besteht, füllen Sie eine Bugmeldung aus.
popup.warning.startupFailed.timeout=Die Anwendung konnte nicht nach 4 Minuten starten.\n\n{0}

View File

@ -365,7 +365,7 @@ createOffer.useLowerValue=Ναι, χρησιμοποίησε τη χαμηλή
createOffer.priceOutSideOfDeviation=Η τιμή που εισήγαγες είναι εκτός της μέγιστης επιτρεπόμενης απόκλισης από την τιμή αγοράς.\nΗ μέγιστη επιτρεπόμενη απόκλιση είναι {0} και μπορεί να προσαρμοστεί στις προτιμήσεις.
createOffer.changePrice=Άλλαξε την τιμή
createOffer.tac=Τοποθετώντας αυτή την προσφορά συμφωνώ να συναλλαχθώ με οποιονδήποτε ικανοποιεί τις συνθήκες που καθορίζονται πιο πάνω.
createOffer.currencyForFee=Maker fee
createOffer.currencyForFee=Trade fee
createOffer.feeCurrencyAndDeposit=Καθόρισε νόμισμα προμήθειας και ποσού εγγύησης
@ -386,7 +386,7 @@ takeOffer.fundsBox.title=Χρηματοδότησε τη συναλλαγή σο
takeOffer.fundsBox.isOfferAvailable=Έλεγχος διαθεσιμότητας προσφοράς...
takeOffer.fundsBox.tradeAmount=Ποσό προς πώληση:
takeOffer.fundsBox.offerFee=Προμήθεια Taker:
takeOffer.fundsBox.networkFee=Προμήθεια εξόρυξης (3x):
takeOffer.fundsBox.networkFee=Προμήθεια εξόρυξης:
takeOffer.fundsBox.takeOfferSpinnerInfo=Αποδοχή προσφοράς σε εξέλιξη...
takeOffer.fundsBox.paymentLabel=Συναλλαγή Bisq με ταυτότητα {0}
takeOffer.success.headline=Αποδέχτηκες επιτυχώς μία προσφορά.
@ -400,7 +400,7 @@ takeOffer.alreadyFunded.movedFunds=Είχες ήδη χρηματοδοτήσε
takeOffer.takeOfferFundWalletInfo.headline=Χρηματοδότησε τη συναλλαγή σου
# suppress inspection "TrailingSpacesInProperty"
takeOffer.takeOfferFundWalletInfo.tradeAmount=- Ποσό συναλλαγής: {0}\n
takeOffer.takeOfferFundWalletInfo.msg=You need to deposit {0} for taking this offer.\n\nThe amount is the sum of:\n{1}- Security deposit: {2}\n- Trading fee: {3}\n- Mining fee (3x): {4}\n\nYou can choose between two options when funding your trade:\n- Use your Bisq wallet (convenient, but transactions may be linkable) OR\n- Transfer from an external wallet (potentially more private)\n\nYou will see all funding options and details after closing this popup.
takeOffer.takeOfferFundWalletInfo.msg=You need to deposit {0} for taking this offer.\n\nThe amount is the sum of:\n{1}- Your security deposit: {2}\n- Trading fee: {3}\n- Mining fee (3x): {4}\n\nYou can choose between two options when funding your trade:\n- Use your Bisq wallet (convenient, but transactions may be linkable) OR\n- Transfer from an external wallet (potentially more private)\n\nYou will see all funding options and details after closing this popup.
takeOffer.alreadyPaidInFunds=Αν έχεις ήδη κατατεθιμένα κεφάλαια, μπορείς να τα αποσύρεις στο \"Κεφάλαια/Αποστολή κεφαλαίων\".
takeOffer.paymentInfo=Πληροφορίες πληρωμής
takeOffer.setAmountPrice=Θέσε ποσό
@ -418,7 +418,7 @@ takeOffer.error.depositPublished=\n\nΗ κατάθεση κοινοποιήθη
takeOffer.error.payoutPublished=\n\nΗ συναλλαγή αποπληρωμής κοινοποιήθηκε ήδη.\nΠροσπάθησε να επανεκκινήσεις την εφαρμογή και έλεγξε τη σύνδεσή σου στο διαδίκτυο ώστε να λυθεί το πρόβλημα.\nΑν το πρόβλημα επιμένει, επικοινώνησε με την ομάδα προγραμματιστών για υποστήριξη.
takeOffer.tac=Αποδεχόμενος/η αυτή την προσφορά συμφωνώ με τους όρους συναλλαγών, όπως αυτοί ορίζονται ανωτέρω.
takeOffer.currencyForFee=Taker fee
takeOffer.currencyForFee=Trade fee
takeOffer.feeCurrency=Καθόρισε νόμισμα προμήθειας
@ -660,7 +660,7 @@ support.buyerOfferer=Αγοραστής/Maker BTC
support.sellerOfferer=Πωλητής/Maker BTC
support.buyerTaker=Αγοραστής/Taker BTC
support.sellerTaker=Πωλητής/Taker BTC
support.backgroundInfo=Bisq is not a company and not operating any kind of customer support.\n\nIf there are disputes in the trade process (e.g. one trader does not follow the trade protocol) the application will display a \"Open dispute\" button after the trade period is over for contacting the arbitrator.\nIn cases of software bugs or other problems, which are detected by the application there will be displayed a \"Open support ticket\" button to contact the arbitrator who will forward the issue to the developers.\n\nIn cases where a user got stuck by a bug without getting displayed that \"Open support ticket\" button, you can open a support ticket manually with a special short cut.\n\nPlease use that only if you are sure that the software is not working like expected. If you have problems how to use Bisq or any questions please review the FAQ at the bisq.io web page or post in the Bisq forum at the support section.\n\nIf you are sure that you want to open a support ticket please select the trade which causes the problem under \"Portfolio/Open trades\" and type the key combination \"alt + o\" or \"option + o\" to open the support ticket.
support.backgroundInfo=Bisq is not a company and not operating any kind of customer support.\n\nIf there are disputes in the trade process (e.g. one trader does not follow the trade protocol) the application will display a \"Open dispute\" button after the trade period is over for contacting the arbitrator.\nIn cases of software bugs or other problems, which are detected by the application there will be displayed a \"Open support ticket\" button to contact the arbitrator who will forward the issue to the developers.\n\nIn cases where a user got stuck by a bug without getting displayed that \"Open support ticket\" button, you can open a support ticket manually with a special short cut.\n\nPlease use that only if you are sure that the software is not working like expected. If you have problems how to use Bisq or any questions please review the FAQ at the bisq.network web page or post in the Bisq forum at the support section.\n\nIf you are sure that you want to open a support ticket please select the trade which causes the problem under \"Portfolio/Open trades\" and type the key combination \"alt + o\" or \"option + o\" to open the support ticket.
support.initialInfo=Please note the basic rules for the dispute process:\n1. You need to respond to the arbitrators requests in between 2 days.\n2. The maximum period for the dispute is 14 days.\n3. You need to fulfill what the arbitrator is requesting from you to deliver evidence for your case.\n4. You accepted the rules outlined in the wiki in the user agreement when you first started the application.\n\nPlease read more in detail about the dispute process in our wiki:\nhttps://github.com/bisq-network/exchange/wiki/Arbitration-system
support.systemMsg=Μήνυμα συστήματος: {0}
support.youOpenedTicket=Άνοιξες ένα αίτημα υποστήριξης.
@ -1066,7 +1066,7 @@ error.spvFileCorrupted=Προέκυψε σφάλμα κατά την ανάγν
popup.warning.walletNotInitialized=Δεν έχει δημιουργηθεί το πορτοφόλι μέχρι στιγμής
popup.warning.wrongVersion=You probably have the wrong Bisq version for this computer.\nYour computer''s architecture is: {0}.\nThe Bisq binary you installed is: {1}.\nPlease shut down and re-install the correct version ({2}).
popup.warning.incompatibleDB=We detected incompatible data base files!\n\nThose database file(s) are not compatible with our current code base:\n{0}\n\nWe made a backup of the corrupted file(s) and applied the default values to a new database version.\n\nThe backup is located at:\n{1}/db/backup_of_corrupted_data.\n\nPlease check if you have the latest version of Bisq installed.\nYou can download it at:\nhttps://bisq.io/downloads\n\nPlease restart the application.
popup.warning.incompatibleDB=We detected incompatible data base files!\n\nThose database file(s) are not compatible with our current code base:\n{0}\n\nWe made a backup of the corrupted file(s) and applied the default values to a new database version.\n\nThe backup is located at:\n{1}/db/backup_of_corrupted_data.\n\nPlease check if you have the latest version of Bisq installed.\nYou can download it at:\nhttps://bisq.network/downloads\n\nPlease restart the application.
popup.warning.cannotConnectAtStartup=Παραμένεις αποσυνδεδεμένος από το δίκτυο {0}.\nΑν χρησιμοποιείς το Tor για το Bitcoin ίσως έχεις ασταθές κύκλωμα Tor.\nΜπορείς να περιμένεις περαιτέρω ή να επανεκκινήσεις.
popup.warning.unknownProblemAtStartup=Υπάρχει άγνωστο πρόβλημα κατά την εκκίνηση.\nΕπανεκκίνησε την εφαρμογή και αν το πρόβλημα επιμείνει, κατάθεσε μια αναφορά σφάλματος.
popup.warning.startupFailed.timeout=Η εφαρμογή δεν μπόρεσε να εκκινήσει εντός 4 λεπτών.\n\n{0}

View File

@ -365,7 +365,7 @@ createOffer.useLowerValue=Sí, usar mi valor más bajo
createOffer.priceOutSideOfDeviation=El precio que ha introducido está fuera de la máxima desviación permitida del precio de mercado. La desviación máxima permitida es {0} y puede ajustarse en las preferencias.
createOffer.changePrice=Cambiar precio
createOffer.tac=Al colocar esta oferta estoy de acuerdo en comerciar con cualquier comerciante que cumpla con las condiciones definidas anteriormente.
createOffer.currencyForFee=Maker fee
createOffer.currencyForFee=Trade fee
createOffer.feeCurrencyAndDeposit=Establecer moneda para las tasas y el depósito de seguridad
@ -386,7 +386,7 @@ takeOffer.fundsBox.title=Dote de fondos su intercambio.
takeOffer.fundsBox.isOfferAvailable=Comprobar si la oferta está disponible...
takeOffer.fundsBox.tradeAmount=Cantidad a vender:
takeOffer.fundsBox.offerFee=Tasa al tomador de oferta:
takeOffer.fundsBox.networkFee=Tasas de minería (3x):
takeOffer.fundsBox.networkFee=Total tasas de minería:
takeOffer.fundsBox.takeOfferSpinnerInfo=Aceptación de oferta en espera...
takeOffer.fundsBox.paymentLabel=Trato de Bitsquare con ID {0}
takeOffer.success.headline=Ha aceptado la oferta con éxito.
@ -418,7 +418,7 @@ takeOffer.error.depositPublished=\n\nLa transacción de depósito ya se ha publi
takeOffer.error.payoutPublished=\n\nLa transacción de pago ya se ha publicado.\nPor favor pruebe reiniciando la aplicación y compruebe su conexión a la red para ver si puede resolver el problema.\nSi el problema continúa por favor contacte con los desarrolladores para ayuda.
takeOffer.tac=Al aceptar esta oferta afirmo estar de acuerdo en las condiciones de intercambio definidas anteriormente.
takeOffer.currencyForFee=Taker fee
takeOffer.currencyForFee=Trade fee
takeOffer.feeCurrency=Establecer moneda de tasa
@ -660,7 +660,7 @@ support.buyerOfferer= comprador/creador BTC
support.sellerOfferer=vendedor/creador BTC
support.buyerTaker=comprador/Tomador BTC
support.sellerTaker=vendedor/Tomador BTC
support.backgroundInfo=Bisq is not a company and not operating any kind of customer support.\n\nIf there are disputes in the trade process (e.g. one trader does not follow the trade protocol) the application will display a \"Open dispute\" button after the trade period is over for contacting the arbitrator.\nIn cases of software bugs or other problems, which are detected by the application there will be displayed a \"Open support ticket\" button to contact the arbitrator who will forward the issue to the developers.\n\nIn cases where a user got stuck by a bug without getting displayed that \"Open support ticket\" button, you can open a support ticket manually with a special short cut.\n\nPlease use that only if you are sure that the software is not working like expected. If you have problems how to use Bisq or any questions please review the FAQ at the bisq.io web page or post in the Bisq forum at the support section.\n\nIf you are sure that you want to open a support ticket please select the trade which causes the problem under \"Portfolio/Open trades\" and type the key combination \"alt + o\" or \"option + o\" to open the support ticket.
support.backgroundInfo=Bisq is not a company and not operating any kind of customer support.\n\nIf there are disputes in the trade process (e.g. one trader does not follow the trade protocol) the application will display a \"Open dispute\" button after the trade period is over for contacting the arbitrator.\nIn cases of software bugs or other problems, which are detected by the application there will be displayed a \"Open support ticket\" button to contact the arbitrator who will forward the issue to the developers.\n\nIn cases where a user got stuck by a bug without getting displayed that \"Open support ticket\" button, you can open a support ticket manually with a special short cut.\n\nPlease use that only if you are sure that the software is not working like expected. If you have problems how to use Bisq or any questions please review the FAQ at the bisq.network web page or post in the Bisq forum at the support section.\n\nIf you are sure that you want to open a support ticket please select the trade which causes the problem under \"Portfolio/Open trades\" and type the key combination \"alt + o\" or \"option + o\" to open the support ticket.
support.initialInfo=Por favor, tenga en cuenta las reglas básicas para el proceso de disputa:\n1. Necesita responder a las peticiones de los árbitros en menos de 2 días.\n2. El periodo máximo total de la disputa es de 14 días.\n3. Necesitará completar todas las peticiones del árbitro para entregar evidencia de su caso.\n4. Acepta las reglas destacadas en la wiki de acuerdo de usuario al comenzar la aplicación.\n\nPor favor lea en más detalle acerca del proceso de disputa en nuestra wiki:\nhttps://github.com/bisq-network/exchange/wiki/Arbitration-system
support.systemMsg=Mensaje de sistema: {0}
support.youOpenedTicket=Ha abierto una solicitud de soporte.
@ -1064,7 +1064,7 @@ error.spvFileCorrupted=Ocurrió un error al leer el archivo de cadena SPV.\nPued
popup.warning.walletNotInitialized=La cartera aún no sea ha iniciado
popup.warning.wrongVersion=Probablemente tenga una versión de Bisq incorrecta para este ordenador.\nLa arquitectura de su ordenador es: {0}.\nLos binarios de Bisq instalados son: {1}.\nPor favor cierre y reinstale la versión correcta ({2}).
popup.warning.incompatibleDB=Hemos detectado archivos de base de datos incompatibles!\n\nEstos archivos de base de datos no son compatibles con nuestro actual código base:\n{0}\n\nHemos hecho una copia de seguridad de los archivos corruptos y aplicado los valores por defecto a la nueva versión de base de datos.\n\nLa copia de seguridad se localiza en:\n{1}/db/backup_of_corrupted_data.\n\nPor favor, compruebe si tiene la última versión de Bisq instalada.\nPuede descargarla en:\nhttps://bisq.io/downloads\n\nPor favor, reinicie la aplicación.
popup.warning.incompatibleDB=Hemos detectado archivos de base de datos incompatibles!\n\nEstos archivos de base de datos no son compatibles con nuestro actual código base:\n{0}\n\nHemos hecho una copia de seguridad de los archivos corruptos y aplicado los valores por defecto a la nueva versión de base de datos.\n\nLa copia de seguridad se localiza en:\n{1}/db/backup_of_corrupted_data.\n\nPor favor, compruebe si tiene la última versión de Bisq instalada.\nPuede descargarla en:\nhttps://bisq.network/downloads\n\nPor favor, reinicie la aplicación.
popup.warning.cannotConnectAtStartup=Aún no se ha conecta a la red {0}.\nSi usa Tor para Bitcoin puede ser que tenga un circuito Tor inestable.\nPuede esperar más o probar reiniciando.
popup.warning.unknownProblemAtStartup=Hay un problema desconocido al inicio.\nPor favor, reinicia y si el problema continua realice un reporte de error.
popup.warning.startupFailed.timeout=La aplicación no se pudo iniciar después de 4 minutos.\n\n{0}

View File

@ -365,7 +365,7 @@ createOffer.useLowerValue=Sim, usar meu valor mais baixo
createOffer.priceOutSideOfDeviation=O preço submetido está fora do desvio máximo com relação ao preço de mercado.\nO desvio máximo é {0} e pode ser alterado nas preferências.
createOffer.changePrice=Alterar preço
createOffer.tac=Ao submeter esta oferta eu concordo em negociar com qualquer negociar que satisfaça as condições definidas acima.
createOffer.currencyForFee=Maker fee
createOffer.currencyForFee=Trade fee
createOffer.feeCurrencyAndDeposit=Definir moeda da taxa e depósito de segurança
@ -386,7 +386,7 @@ takeOffer.fundsBox.title=Financiar sua negociação
takeOffer.fundsBox.isOfferAvailable=Verificar se oferta está disponível ...
takeOffer.fundsBox.tradeAmount=Quantidade a se vender:
takeOffer.fundsBox.offerFee=Taxa de aceitação:
takeOffer.fundsBox.networkFee=Taxas de mineração (3x):
takeOffer.fundsBox.networkFee=Taxas de mineração:
takeOffer.fundsBox.takeOfferSpinnerInfo=Aceitação da oferta em progresso ...
takeOffer.fundsBox.paymentLabel=negociação Bisq com ID {0}
takeOffer.success.headline=Você aceitou uma oferta com sucesso.
@ -418,7 +418,7 @@ takeOffer.error.depositPublished=\n\nA transação do depósito já foi publicad
takeOffer.error.payoutPublished=\n\nA transação de pagamento já foi publicada.\nPor gentileza reinicie o programa e verifique sua conexão de Internet para tentar resolver o problema.\nSe o problema persistir, favor entrar em contato com os desenvolvedores.
takeOffer.tac=Ao aceitar essa oferta eu concordo com as condições de negociação definidas acima.
takeOffer.currencyForFee=Taker fee
takeOffer.currencyForFee=Trade fee
takeOffer.feeCurrency=Definir moeda para taxa
@ -660,7 +660,7 @@ support.buyerOfferer=Comprador de BTC / Ofetante
support.sellerOfferer=Vendedor de BTC / Ofertante
support.buyerTaker=Comprador de BTC / Aceitador da oferta
support.sellerTaker=Vendedor de BTC / Aceitador da oferta
support.backgroundInfo=Bisq is not a company and not operating any kind of customer support.\n\nIf there are disputes in the trade process (e.g. one trader does not follow the trade protocol) the application will display a \"Open dispute\" button after the trade period is over for contacting the arbitrator.\nIn cases of software bugs or other problems, which are detected by the application there will be displayed a \"Open support ticket\" button to contact the arbitrator who will forward the issue to the developers.\n\nIn cases where a user got stuck by a bug without getting displayed that \"Open support ticket\" button, you can open a support ticket manually with a special short cut.\n\nPlease use that only if you are sure that the software is not working like expected. If you have problems how to use Bisq or any questions please review the FAQ at the bisq.io web page or post in the Bisq forum at the support section.\n\nIf you are sure that you want to open a support ticket please select the trade which causes the problem under \"Portfolio/Open trades\" and type the key combination \"alt + o\" or \"option + o\" to open the support ticket.
support.backgroundInfo=Bisq is not a company and not operating any kind of customer support.\n\nIf there are disputes in the trade process (e.g. one trader does not follow the trade protocol) the application will display a \"Open dispute\" button after the trade period is over for contacting the arbitrator.\nIn cases of software bugs or other problems, which are detected by the application there will be displayed a \"Open support ticket\" button to contact the arbitrator who will forward the issue to the developers.\n\nIn cases where a user got stuck by a bug without getting displayed that \"Open support ticket\" button, you can open a support ticket manually with a special short cut.\n\nPlease use that only if you are sure that the software is not working like expected. If you have problems how to use Bisq or any questions please review the FAQ at the bisq.network web page or post in the Bisq forum at the support section.\n\nIf you are sure that you want to open a support ticket please select the trade which causes the problem under \"Portfolio/Open trades\" and type the key combination \"alt + o\" or \"option + o\" to open the support ticket.
support.initialInfo=Favor note as regras básicas para o processo de disputa:\n1. Você precisa responder aos pedidos de árbitros em até 2 dias.\n2. O período máximo de uma disputa é 14 dias.\n3. Você precisa atender ao que o árbitro está pedindo e fornecer evidências necessárias para seu caso.\n4. Você aceitou as regras delineadas na wiki no acordo de usuário quando você iniciou o programa.\n\nMais detalhes sobre o processo de disputa se encontram na wiki:\nhttps://github.com/bisq-network/exchange/wiki/Arbitration-system
support.systemMsg=Mensagem do sistema: {0}
support.youOpenedTicket=Você abriu uma solicitação para suporte.
@ -1066,7 +1066,7 @@ error.spvFileCorrupted=Um erro ocorreu ao ler o arquivo SPV chain.\nPode ser que
popup.warning.walletNotInitialized=A carteira ainda não foi inicializada
popup.warning.wrongVersion=You probably have the wrong Bisq version for this computer.\nYour computer''s architecture is: {0}.\nThe Bisq binary you installed is: {1}.\nPlease shut down and re-install the correct version ({2}).
popup.warning.incompatibleDB=We detected incompatible data base files!\n\nThose database file(s) are not compatible with our current code base:\n{0}\n\nWe made a backup of the corrupted file(s) and applied the default values to a new database version.\n\nThe backup is located at:\n{1}/db/backup_of_corrupted_data.\n\nPlease check if you have the latest version of Bisq installed.\nYou can download it at:\nhttps://bisq.io/downloads\n\nPlease restart the application.
popup.warning.incompatibleDB=We detected incompatible data base files!\n\nThose database file(s) are not compatible with our current code base:\n{0}\n\nWe made a backup of the corrupted file(s) and applied the default values to a new database version.\n\nThe backup is located at:\n{1}/db/backup_of_corrupted_data.\n\nPlease check if you have the latest version of Bisq installed.\nYou can download it at:\nhttps://bisq.network/downloads\n\nPlease restart the application.
popup.warning.cannotConnectAtStartup=Você ainda não foi conectado à rede {0}.\nSe você utilizar Tor para acessar Bitcoin pode ser que você tem um circuito Tor instável.\nVocê pode aguardar mais ou tentar reiniciar.
popup.warning.unknownProblemAtStartup=Houve um problema desconhecido ao iniciar.\nFavor reiniciar e se o problema persistir abrir um bug report (informe de problema).
popup.warning.startupFailed.timeout=Falha ao iniciar aplicativo após 4 minutos.\n\n{0}

View File

@ -365,7 +365,7 @@ createOffer.useLowerValue=Da, koristi moju manju vrednost
createOffer.priceOutSideOfDeviation=Cena koju ste uneli je van maks. dozvoljenog odstupanja od tržišne cene.\nMaks. dozvoljeno odstupanje je {0} i može se podesiti u preferencama.
createOffer.changePrice=Izmeni cenu
createOffer.tac=Sa postavljanjem te ponude slažem se da trgujem sa bilo kojim trgovcem koji ispunjava uslove definisane iznad.
createOffer.currencyForFee=Maker fee
createOffer.currencyForFee=Trade fee
createOffer.feeCurrencyAndDeposit=Podesi valutu provizije i bezbednosni depozit
@ -386,7 +386,7 @@ takeOffer.fundsBox.title=Finansirajte vašu trgovinu
takeOffer.fundsBox.isOfferAvailable=Proveri da li je ponuda dostupna ...
takeOffer.fundsBox.tradeAmount=Iznos za prodaju:
takeOffer.fundsBox.offerFee=Provizija prihvatanja:
takeOffer.fundsBox.networkFee=Provizija rudara (3x):
takeOffer.fundsBox.networkFee=Provizija rudara:
takeOffer.fundsBox.takeOfferSpinnerInfo=Prihvatanje ponude je u toku ...
takeOffer.fundsBox.paymentLabel=Bisq trgovina sa ID {0}
takeOffer.success.headline=Uspešno se prihvatili ponudu.
@ -418,7 +418,7 @@ takeOffer.error.depositPublished=\n\nTransakcija depozita je već objavljena.\nM
takeOffer.error.payoutPublished=\n\nTransakcija isplate je već objavljena.\nMolimo vas pokušajte ponovo pokrenite aplikaciju i proverite vašu mrežnu konekciju da vidite da li možete da rešite problem.\nAko problem i dalje postoji molimo kontaktirajte programere za podršku.
takeOffer.tac=Sa postavljanjem te ponude slažem se sa uslovima trgovine definisanim iznad.
takeOffer.currencyForFee=Taker fee
takeOffer.currencyForFee=Trade fee
takeOffer.feeCurrency=Podesi valutu provizije
@ -660,7 +660,7 @@ support.buyerOfferer=BTC kupac/Tvorac
support.sellerOfferer=BTC prodavac/Tvorac
support.buyerTaker=BTC kupac/Uzimalac
support.sellerTaker=BTC prodavac/Tvorac
support.backgroundInfo=Bisq is not a company and not operating any kind of customer support.\n\nIf there are disputes in the trade process (e.g. one trader does not follow the trade protocol) the application will display a \"Open dispute\" button after the trade period is over for contacting the arbitrator.\nIn cases of software bugs or other problems, which are detected by the application there will be displayed a \"Open support ticket\" button to contact the arbitrator who will forward the issue to the developers.\n\nIn cases where a user got stuck by a bug without getting displayed that \"Open support ticket\" button, you can open a support ticket manually with a special short cut.\n\nPlease use that only if you are sure that the software is not working like expected. If you have problems how to use Bisq or any questions please review the FAQ at the bisq.io web page or post in the Bisq forum at the support section.\n\nIf you are sure that you want to open a support ticket please select the trade which causes the problem under \"Portfolio/Open trades\" and type the key combination \"alt + o\" or \"option + o\" to open the support ticket.
support.backgroundInfo=Bisq is not a company and not operating any kind of customer support.\n\nIf there are disputes in the trade process (e.g. one trader does not follow the trade protocol) the application will display a \"Open dispute\" button after the trade period is over for contacting the arbitrator.\nIn cases of software bugs or other problems, which are detected by the application there will be displayed a \"Open support ticket\" button to contact the arbitrator who will forward the issue to the developers.\n\nIn cases where a user got stuck by a bug without getting displayed that \"Open support ticket\" button, you can open a support ticket manually with a special short cut.\n\nPlease use that only if you are sure that the software is not working like expected. If you have problems how to use Bisq or any questions please review the FAQ at the bisq.network web page or post in the Bisq forum at the support section.\n\nIf you are sure that you want to open a support ticket please select the trade which causes the problem under \"Portfolio/Open trades\" and type the key combination \"alt + o\" or \"option + o\" to open the support ticket.
support.initialInfo=Imajte na umu osnovna pravila za proces rasprave:\n1. Potrebno je da odgovorite zahtevima arbitra u razmaku od 2 dana.\n2. Maksimalni period rasprave je 14 dana.\n3. Morate da ispunite što arbitar zahteva od vas radi dostavljanja dokaza za vaš slučaj.\n4. Prihvatili ste pravila navedena u wiki u korisničkom ugovoru kada ste prvi put pokrenuli aplikaciju.\n\nMolimo pročitajte detaljnije o procesu rasprave u našoj wiki:\nhttps://github.com/bisq-network/exchange/wiki/Arbitration-system
support.systemMsg=Poruka sistema: {0}
support.youOpenedTicket=Otvorili ste zahtev za podršku.
@ -1064,7 +1064,7 @@ error.spvFileCorrupted=Došlo je do greške prilikom čitanja SPV lanac fajla.\n
popup.warning.walletNotInitialized=Novčanik još nije inicijalizovan
popup.warning.wrongVersion=Verovatno imate pogrešnu verziju Bisq za ovaj računar.\nArhitektura vašeg računara je: {0}.\nBisq program koji ste vi instalirali je: {1}.\nMolimo isključite i reinstalirajte tačnu verziju ({2}).
popup.warning.incompatibleDB=Otkrili smo nekompitabilne fajlove baze podataka!\n\nTaj fajl(ovi) baze podataka nisu kompitabilni sa trenutnom kod bazom:\n{0}\n\nNapravili smo rezervu iskvarenih fajlova i primenili podrazumevane vrednosti novoj verziji baze podataka.\n\nRezerva se nalazi na:\n{1}/db/backup_of_corrupted_data.\n\nMolimo proverite da li imate instaliranu najnoviju verziju Bisq.\nMožete je preuzeti na:\nhttps://bisq.io/downloads\n\nMolimo pokrenite ponovo aplikaciju.
popup.warning.incompatibleDB=Otkrili smo nekompitabilne fajlove baze podataka!\n\nTaj fajl(ovi) baze podataka nisu kompitabilni sa trenutnom kod bazom:\n{0}\n\nNapravili smo rezervu iskvarenih fajlova i primenili podrazumevane vrednosti novoj verziji baze podataka.\n\nRezerva se nalazi na:\n{1}/db/backup_of_corrupted_data.\n\nMolimo proverite da li imate instaliranu najnoviju verziju Bisq.\nMožete je preuzeti na:\nhttps://bisq.network/downloads\n\nMolimo pokrenite ponovo aplikaciju.
popup.warning.cannotConnectAtStartup=Još uvek niste povezani na {0} mrežu.\nAko koristite Tor za Bitcoin moguće je da imate nestabilnu Tor rutu.\nMožete još čekati ili pokušati da ponovo pokrenete.
popup.warning.unknownProblemAtStartup=Postoji nepoznat problem pri pokretanju.\nMolimo pokrenite ponovo i ako se problem nastavi podnesite prijavu o grešci.
popup.warning.startupFailed.timeout=Aplikacija nije mogla da se pokrene nakon 4 minuta.\n\n{0}

View File

@ -390,7 +390,7 @@ takeOffer.fundsBox.title=为交易充值
takeOffer.fundsBox.isOfferAvailable=检查委托是否有效 ...
takeOffer.fundsBox.tradeAmount=卖出数量:
takeOffer.fundsBox.offerFee=买单费:
takeOffer.fundsBox.networkFee=矿工手续费 (3x):
takeOffer.fundsBox.networkFee=矿工手续费:
takeOffer.fundsBox.takeOfferSpinnerInfo=正在下单 ...
takeOffer.fundsBox.paymentLabel=Bisq交易ID {0}
takeOffer.success.headline=你已成功下单一个委托.

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Currency:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -120,7 +120,7 @@ createOffer.fundsBox.totalsNeeded=Funds needed:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Trade wallet address:
createOffer.fundsBox.balance=Trade wallet balance:
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Trade amount:
createOffer.fundsBox.securityDeposit=Security deposit:
createOffer.fundsBox.offerFee=Create offer fee:

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Currency:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -120,7 +120,7 @@ createOffer.fundsBox.totalsNeeded=Funds needed:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Trade wallet address:
createOffer.fundsBox.balance=Trade wallet balance:
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Trade amount:
createOffer.fundsBox.securityDeposit=Security deposit:
createOffer.fundsBox.offerFee=Create offer fee:

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Currency:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -120,7 +120,7 @@ createOffer.fundsBox.totalsNeeded=Funds needed:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Trade wallet address:
createOffer.fundsBox.balance=Trade wallet balance:
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Trade amount:
createOffer.fundsBox.securityDeposit=Security deposit:
createOffer.fundsBox.offerFee=Create offer fee:

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Currency:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -120,7 +120,7 @@ createOffer.fundsBox.totalsNeeded=Funds needed:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Trade wallet address:
createOffer.fundsBox.balance=Trade wallet balance:
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Trade amount:
createOffer.fundsBox.securityDeposit=Security deposit:
createOffer.fundsBox.offerFee=Create offer fee:

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Currency:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -120,7 +120,7 @@ createOffer.fundsBox.totalsNeeded=Funds needed:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Trade wallet address:
createOffer.fundsBox.balance=Trade wallet balance:
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Trade amount:
createOffer.fundsBox.securityDeposit=Security deposit:
createOffer.fundsBox.offerFee=Create offer fee:

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Currency:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -120,7 +120,7 @@ createOffer.fundsBox.totalsNeeded=Funds needed:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Trade wallet address:
createOffer.fundsBox.balance=Trade wallet balance:
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Trade amount:
createOffer.fundsBox.securityDeposit=Security deposit:
createOffer.fundsBox.offerFee=Create offer fee:

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Currency:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -120,7 +120,7 @@ createOffer.fundsBox.totalsNeeded=Funds needed:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Trade wallet address:
createOffer.fundsBox.balance=Trade wallet balance:
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Trade amount:
createOffer.fundsBox.securityDeposit=Security deposit:
createOffer.fundsBox.offerFee=Create offer fee:

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Currency:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -120,7 +120,7 @@ createOffer.fundsBox.totalsNeeded=Funds needed:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Trade wallet address:
createOffer.fundsBox.balance=Trade wallet balance:
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Trade amount:
createOffer.fundsBox.securityDeposit=Security deposit:
createOffer.fundsBox.offerFee=Create offer fee:

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Devise:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -122,7 +122,7 @@ createOffer.fundsBox.totalsNeeded=Funds needed:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Trade wallet address:
createOffer.fundsBox.balance=Trade wallet balance:
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Trade amount:
createOffer.fundsBox.securityDeposit=Security deposit:
createOffer.fundsBox.offerFee=Create offer fee:
@ -183,7 +183,7 @@ takeOffer.fundsBox.balance=Trade wallet balance:
takeOffer.fundsBox.tradeAmount=Montant à vendre:
takeOffer.fundsBox.securityDeposit=Security deposit:
takeOffer.fundsBox.offerFee=Frais du client:
takeOffer.fundsBox.networkFee=Frais d'exploitation minière (3x):
takeOffer.fundsBox.networkFee=Frais d'exploitation minière:
takeOffer.fundsBox.total=Total:
# TODO remove takeOffer.fundsBox.showAdvanced=Show advanced settings
# TODO remove takeOffer.fundsBox.hideAdvanced=Hide advanced settings
@ -1081,7 +1081,7 @@ popup.error.createTx=Erreur à la création de la transaction {0}
error.spvFileCorrupted=Une erreur s'est produite lors de la lecture du fichier de la chaîne SPV. \nIl se pourrait être que le fichier de la chaîne SPV soit endommagé. \n\nMessage d''erreur: {0} \n\n Voulez-vous le supprimer et démarrer une resynchronisation?
popup.warning.walletNotInitialized=Le portefeuille n'est pas encore initialisé
popup.warning.wrongVersion=Vous avez probablement la mauvaise version Bisq pour cet ordinateur. \nL'architecture de votre ordinateur est: {0}. \nLa binaire Bisq que vous avez installée est: {1}. \nFermez et réinstallez la version correcte ({2}).
popup.warning.incompatibleDB=Nous avons détecté des fichiers de base de données incompatibles! \n \nCes fichiers de base de données ne sont pas compatibles avec notre base de code actuelle: \n {0} \n \nNous avons sauvegardé les fichiers corrompus et appliqué les valeurs par défaut à une nouvelle version de base de données. \n \nLa sauvegarde se trouve à: \n{1} /db/backup_of_corrupted_data.\n\nVérifiez si vous avez installé la dernière version de Bisq. \nVous pouvez le télécharger à: \n Https://bisq.io/downloads \n\nRedémarrez l'application.
popup.warning.incompatibleDB=Nous avons détecté des fichiers de base de données incompatibles! \n \nCes fichiers de base de données ne sont pas compatibles avec notre base de code actuelle: \n {0} \n \nNous avons sauvegardé les fichiers corrompus et appliqué les valeurs par défaut à une nouvelle version de base de données. \n \nLa sauvegarde se trouve à: \n{1} /db/backup_of_corrupted_data.\n\nVérifiez si vous avez installé la dernière version de Bisq. \nVous pouvez le télécharger à: \n Https://bisq.network/downloads \n\nRedémarrez l'application.
popup.warning.cannotConnectAtStartup=Vous ne vous êtes toujours pas connecté au {0} réseau.\nSi vous utilisez Tor pour Bitcoin, il se pourrait que vous ayez un circuit Tor instable. \nVous pouvez attendre plus longtemps ou essayer de redémarrer.
popup.warning.unknownProblemAtStartup=Il y a un problème inconnu lors du démarrage.\nVeuillez redémarrer et si le problème continue de déposer un rapport de bogue.
popup.warning.startupFailed.timeout=L'application n'a pas pu démarrer après 4 minutes. \n \n {0}\

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Currency:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -120,7 +120,7 @@ createOffer.fundsBox.totalsNeeded=Funds needed:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Trade wallet address:
createOffer.fundsBox.balance=Trade wallet balance:
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Trade amount:
createOffer.fundsBox.securityDeposit=Security deposit:
createOffer.fundsBox.offerFee=Create offer fee:

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Currency:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -120,7 +120,7 @@ createOffer.fundsBox.totalsNeeded=Funds needed:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Trade wallet address:
createOffer.fundsBox.balance=Trade wallet balance:
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Trade amount:
createOffer.fundsBox.securityDeposit=Security deposit:
createOffer.fundsBox.offerFee=Create offer fee:

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Currency:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -118,7 +118,7 @@ createOffer.fundsBox.totalsNeeded=Potrebna sredstva:
createOffer.fundsBox.totalsNeeded.prompt=Biti će izračunata iz iznosa bitcoina koje ste unijeli iznad
createOffer.fundsBox.address=Adresa novčanika za razmjenu:
createOffer.fundsBox.balance=Stanje novčanika za razmjenu:
# TODO remove createOffer.fundsBox.info=Svaka ponuda koristi zasebni novčanik za razmjenu. Morate napuniti taj novčanik potrebnim iznosom bitcoina. Ta su sredstva rezervirana te će se koristiti u slučaju da ponuda bude prihvaćena. U slučaju da otkažete svoju ponudu možete povući svoja sredstva iz tog novčanika. Jedina uplata koja će biti izvršena prilikom postavljanja ponude je sama naknada za postavljanje ponude. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=Svaka ponuda koristi zasebni novčanik za razmjenu. Morate napuniti taj novčanik potrebnim iznosom bitcoina. Ta su sredstva rezervirana te će se koristiti u slučaju da ponuda bude prihvaćena. U slučaju da otkažete svoju ponudu možete povući svoja sredstva iz tog novčanika. Jedina uplata koja će biti izvršena prilikom postavljanja ponude je sama naknada za postavljanje ponude. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Iznos razmjene:
createOffer.fundsBox.securityDeposit=Sigurnosni depozit:
createOffer.fundsBox.offerFee=Naknada za izradu ponude:

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Currency:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -120,7 +120,7 @@ createOffer.fundsBox.totalsNeeded=Funds needed:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Trade wallet address:
createOffer.fundsBox.balance=Trade wallet balance:
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Trade amount:
createOffer.fundsBox.securityDeposit=Security deposit:
createOffer.fundsBox.offerFee=Create offer fee:

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Currency:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -120,7 +120,7 @@ createOffer.fundsBox.totalsNeeded=Funds needed:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Trade wallet address:
createOffer.fundsBox.balance=Trade wallet balance:
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Trade amount:
createOffer.fundsBox.securityDeposit=Security deposit:
createOffer.fundsBox.offerFee=Create offer fee:

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Currency:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -120,7 +120,7 @@ createOffer.fundsBox.totalsNeeded=Funds needed:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Trade wallet address:
createOffer.fundsBox.balance=Trade wallet balance:
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Trade amount:
createOffer.fundsBox.securityDeposit=Security deposit:
createOffer.fundsBox.offerFee=Create offer fee:

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Currency:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -120,7 +120,7 @@ createOffer.fundsBox.totalsNeeded=Funds needed:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Trade wallet address:
createOffer.fundsBox.balance=Trade wallet balance:
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Trade amount:
createOffer.fundsBox.securityDeposit=Security deposit:
createOffer.fundsBox.offerFee=Create offer fee:

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Currency:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -120,7 +120,7 @@ createOffer.fundsBox.totalsNeeded=Funds needed:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Trade wallet address:
createOffer.fundsBox.balance=Trade wallet balance:
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Trade amount:
createOffer.fundsBox.securityDeposit=Security deposit:
createOffer.fundsBox.offerFee=Create offer fee:

View File

@ -120,7 +120,7 @@ createOffer.fundsBox.totalsNeeded=Fondi richiesti:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Indirizzo portafoglio per lo scambio:
createOffer.fundsBox.balance=Saldo portafoglio per lo scambio:
# TODO remove createOffer.fundsBox.info=Per ogni offerta c'è un portamonete di scambio dedicato. Devi finanziare il portamonete di scambio con la quantità di bitcoin necessaria. Questi fondi sono riservati e saranno utilizzati nel caso in cui la tua offerta venga eseguita. Se cancelli la tua offerta puoi ritirare i fondi da quel portamonete di scambio. L'unico pagamento eseguito quando disponi un'offerta è la commissione di pagamento per offerta. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=Per ogni offerta c'è un portamonete di scambio dedicato. Devi finanziare il portamonete di scambio con la quantità di bitcoin necessaria. Questi fondi sono riservati e saranno utilizzati nel caso in cui la tua offerta venga eseguita. Se cancelli la tua offerta puoi ritirare i fondi da quel portamonete di scambio. L'unico pagamento eseguito quando disponi un'offerta è la commissione di pagamento per offerta. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Importo per lo scambio:
createOffer.fundsBox.securityDeposit=Deposito di sicurezza:
createOffer.fundsBox.offerFee=Crea commissione di offerta:

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Currency:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -120,7 +120,7 @@ createOffer.fundsBox.totalsNeeded=Funds needed:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Trade wallet address:
createOffer.fundsBox.balance=Trade wallet balance:
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Trade amount:
createOffer.fundsBox.securityDeposit=Security deposit:
createOffer.fundsBox.offerFee=Create offer fee:

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Currency:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -120,7 +120,7 @@ createOffer.fundsBox.totalsNeeded=Funds needed:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Trade wallet address:
createOffer.fundsBox.balance=Trade wallet balance:
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Trade amount:
createOffer.fundsBox.securityDeposit=Security deposit:
createOffer.fundsBox.offerFee=Create offer fee:

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Currency:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -120,7 +120,7 @@ createOffer.fundsBox.totalsNeeded=Funds needed:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Trade wallet address:
createOffer.fundsBox.balance=Trade wallet balance:
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Trade amount:
createOffer.fundsBox.securityDeposit=Security deposit:
createOffer.fundsBox.offerFee=Create offer fee:

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Currency:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -120,7 +120,7 @@ createOffer.fundsBox.totalsNeeded=Funds needed:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Trade wallet address:
createOffer.fundsBox.balance=Trade wallet balance:
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Trade amount:
createOffer.fundsBox.securityDeposit=Security deposit:
createOffer.fundsBox.offerFee=Create offer fee:

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Currency:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -120,7 +120,7 @@ createOffer.fundsBox.totalsNeeded=Funds needed:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Trade wallet address:
createOffer.fundsBox.balance=Trade wallet balance:
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Trade amount:
createOffer.fundsBox.securityDeposit=Security deposit:
createOffer.fundsBox.offerFee=Create offer fee:

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Currency:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -120,7 +120,7 @@ createOffer.fundsBox.totalsNeeded=Funds needed:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Trade wallet address:
createOffer.fundsBox.balance=Trade wallet balance:
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Trade amount:
createOffer.fundsBox.securityDeposit=Security deposit:
createOffer.fundsBox.offerFee=Create offer fee:

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Currency:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -120,7 +120,7 @@ createOffer.fundsBox.totalsNeeded=Funds needed:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Trade wallet address:
createOffer.fundsBox.balance=Trade wallet balance:
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Trade amount:
createOffer.fundsBox.securityDeposit=Security deposit:
createOffer.fundsBox.offerFee=Create offer fee:

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Currency:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -120,7 +120,7 @@ createOffer.fundsBox.totalsNeeded=Funds needed:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Trade wallet address:
createOffer.fundsBox.balance=Trade wallet balance:
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Trade amount:
createOffer.fundsBox.securityDeposit=Security deposit:
createOffer.fundsBox.offerFee=Create offer fee:

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Currency:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -120,7 +120,7 @@ createOffer.fundsBox.totalsNeeded=Funds needed:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Trade wallet address:
createOffer.fundsBox.balance=Trade wallet balance:
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Trade amount:
createOffer.fundsBox.securityDeposit=Security deposit:
createOffer.fundsBox.offerFee=Create offer fee:

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Currency:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -120,7 +120,7 @@ createOffer.fundsBox.totalsNeeded=Funds needed:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Trade wallet address:
createOffer.fundsBox.balance=Trade wallet balance:
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Trade amount:
createOffer.fundsBox.securityDeposit=Security deposit:
createOffer.fundsBox.offerFee=Create offer fee:

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Currency:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -120,7 +120,7 @@ createOffer.fundsBox.totalsNeeded=Funds needed:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Trade wallet address:
createOffer.fundsBox.balance=Trade wallet balance:
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Trade amount:
createOffer.fundsBox.securityDeposit=Security deposit:
createOffer.fundsBox.offerFee=Create offer fee:

View File

@ -67,7 +67,7 @@ createOffer.fundsBox.totalsNeeded=Fundos necessários:
createOffer.fundsBox.totalsNeeded.prompt=Será calculado pelos montantes de bitcoin introduzidos acima
createOffer.fundsBox.address=Endereço da carteira da troca:
createOffer.fundsBox.balance=Saldo da carteira da troca:
# TODO remove createOffer.fundsBox.info=Para cada oferta há uma carteira de troca dedicada. Precisa de provisionar essa carteira da troca com o montante de bitcoin necessário. Esses fundos serão reservados e usados no caso de a oferta ser executada. Se cancelar a sua oferta pode levantar os seus fundos dessa carteira de troca. O único pagamento feito ao criar uma oferta é o pagamento da taxa da oferta. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=Para cada oferta há uma carteira de troca dedicada. Precisa de provisionar essa carteira da troca com o montante de bitcoin necessário. Esses fundos serão reservados e usados no caso de a oferta ser executada. Se cancelar a sua oferta pode levantar os seus fundos dessa carteira de troca. O único pagamento feito ao criar uma oferta é o pagamento da taxa da oferta. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Montante da troca:
createOffer.fundsBox.securityDeposit=Depósito de segurança:
createOffer.fundsBox.offerFee=Taxa de criação de oferta:

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Currency:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -120,7 +120,7 @@ createOffer.fundsBox.totalsNeeded=Funds needed:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Trade wallet address:
createOffer.fundsBox.balance=Trade wallet balance:
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Trade amount:
createOffer.fundsBox.securityDeposit=Security deposit:
createOffer.fundsBox.offerFee=Create offer fee:

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Currency:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -120,7 +120,7 @@ createOffer.fundsBox.totalsNeeded=Funds needed:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Trade wallet address:
createOffer.fundsBox.balance=Trade wallet balance:
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Trade amount:
createOffer.fundsBox.securityDeposit=Security deposit:
createOffer.fundsBox.offerFee=Create offer fee:

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Currency:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -120,7 +120,7 @@ createOffer.fundsBox.totalsNeeded=Funds needed:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Trade wallet address:
createOffer.fundsBox.balance=Trade wallet balance:
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Trade amount:
createOffer.fundsBox.securityDeposit=Security deposit:
createOffer.fundsBox.offerFee=Create offer fee:

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Currency:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -120,7 +120,7 @@ createOffer.fundsBox.totalsNeeded=Funds needed:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Trade wallet address:
createOffer.fundsBox.balance=Trade wallet balance:
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Trade amount:
createOffer.fundsBox.securityDeposit=Security deposit:
createOffer.fundsBox.offerFee=Create offer fee:

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Currency:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -120,7 +120,7 @@ createOffer.fundsBox.totalsNeeded=Funds needed:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Trade wallet address:
createOffer.fundsBox.balance=Trade wallet balance:
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Trade amount:
createOffer.fundsBox.securityDeposit=Security deposit:
createOffer.fundsBox.offerFee=Create offer fee:

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Currency:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -120,7 +120,7 @@ createOffer.fundsBox.totalsNeeded=Funds needed:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Trade wallet address:
createOffer.fundsBox.balance=Trade wallet balance:
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Trade amount:
createOffer.fundsBox.securityDeposit=Security deposit:
createOffer.fundsBox.offerFee=Create offer fee:

View File

@ -30,9 +30,9 @@ payment.account.no=Account no.:
shared.currency=Currency:
payment.account.name=Account name:
# TODO remove payment.payment.method=Payment method:
payment.account.owner=Account holder name:
payment.account.owner=Account owner full name:
payment.bank.country=Country of bank:
payment.account.name.email=Account holder name / email
payment.account.name.email=Account owner full name / email
payment.bank.name=Bank name:
payment.select.account=Select account type
list.currency.select=Select currency
@ -120,7 +120,7 @@ createOffer.fundsBox.totalsNeeded=Funds needed:
createOffer.fundsBox.totalsNeeded.prompt=Will be calculated from the bitcoin amount entered above
createOffer.fundsBox.address=Trade wallet address:
createOffer.fundsBox.balance=Trade wallet balance:
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.io/faq/#6
# TODO remove createOffer.fundsBox.info=For every offer there is a dedicated trade wallet. You need to fund that trade wallet with the necessary bitcoin amount. Those funds are reserved and will be used in the case that your offer gets executed. If you cancel your offer you can withdraw your funds from that trading wallet. The only payment made when placing an offer is the offer fee payment. https://bisq.network/faq/#6
createOffer.fundsBox.tradeAmount=Trade amount:
createOffer.fundsBox.securityDeposit=Security deposit:
createOffer.fundsBox.offerFee=Create offer fee:

View File

@ -68,10 +68,17 @@ public class AppSetupWithP2P extends AppSetup {
@Override
protected void initBasicServices() {
p2pNetWorkReady = initP2PNetwork();
p2pNetWorkReady.addListener((observable, oldValue, newValue) -> {
BooleanProperty result = SetupUtils.loadEntryMap(p2PService);
result.addListener((observable, oldValue, newValue) -> {
if (newValue)
startInitP2PNetwork();
});
}
private void startInitP2PNetwork() {
p2pNetWorkReady = initP2PNetwork();
p2pNetWorkReady.addListener((observable, oldValue, newValue) -> {
if (newValue)
onBasicServicesInitialized();
});
}
@ -149,10 +156,9 @@ public class AppSetupWithP2P extends AppSetup {
protected void onBasicServicesInitialized() {
log.info("onBasicServicesInitialized");
// Used to load different EntryMap files per base currency (EntryMap_BTC, EntryMap_LTC,...)
final String storageFileName = "EntryMap_" + BisqEnvironment.getBaseCurrencyNetwork().getCurrencyCode();
p2PService.readEntryMapFromResources(storageFileName);
p2PService.onAllServicesInitialized();
tradeStatisticsManager.onAllServicesInitialized();
}
}

View File

@ -19,7 +19,6 @@ package io.bisq.core.app;
import ch.qos.logback.classic.Level;
import io.bisq.common.CommonOptionKeys;
import io.bisq.common.app.DevEnv;
import io.bisq.common.app.Version;
import io.bisq.common.crypto.KeyStorage;
import io.bisq.common.storage.Storage;
@ -84,7 +83,12 @@ public class BisqEnvironment extends StandardEnvironment {
public static boolean isDAOActivatedAndBaseCurrencySupportingBsq() {
//noinspection ConstantConditions,PointlessBooleanExpression
return DevEnv.DAO_ACTIVATED && isBaseCurrencySupportingBsq();
return isDAOEnabled() && isBaseCurrencySupportingBsq();
}
public static boolean isDAOEnabled() {
//noinspection ConstantConditions,PointlessBooleanExpression
return !getBaseCurrencyNetwork().isMainnet() && isBaseCurrencySupportingBsq();
}
public static boolean isBaseCurrencySupportingBsq() {

View File

@ -22,9 +22,13 @@ import io.bisq.common.crypto.CryptoException;
import io.bisq.common.crypto.KeyRing;
import io.bisq.common.crypto.SealedAndSigned;
import io.bisq.common.handlers.ResultHandler;
import io.bisq.core.btc.BaseCurrencyNetwork;
import io.bisq.network.crypto.DecryptedDataTuple;
import io.bisq.network.crypto.EncryptionService;
import io.bisq.network.p2p.P2PService;
import io.bisq.network.p2p.peers.keepalive.messages.Ping;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import lombok.extern.slf4j.Slf4j;
import java.security.Security;
@ -74,4 +78,23 @@ public class SetupUtils {
};
checkCryptoThread.start();
}
public static BooleanProperty loadEntryMap(P2PService p2PService) {
BooleanProperty result = new SimpleBooleanProperty();
Thread loadEntryMapThread = new Thread() {
@Override
public void run() {
Thread.currentThread().setName("loadEntryMapThread");
// Used to load different EntryMap files per base currency (EntryMap_BTC_MAINNET, EntryMap_LTC,...)
final BaseCurrencyNetwork baseCurrencyNetwork = BisqEnvironment.getBaseCurrencyNetwork();
final String storageFileName = "EntryMap_"
+ baseCurrencyNetwork.getCurrencyCode() + "_"
+ baseCurrencyNetwork.getNetwork();
p2PService.readEntryMapFromResources(storageFileName);
UserThread.execute(() -> result.set(true));
}
};
loadEntryMapThread.start();
return result;
}
}

View File

@ -76,6 +76,15 @@ public enum BaseCurrencyNetwork {
return "LTC".equals(currencyCode);
}
public boolean isDash() {
return "DASH".equals(currencyCode);
}
public boolean isDoge() {
return "DOGE".equals(currencyCode);
}
public Coin getDefaultMinFee() {
switch (BisqEnvironment.getBaseCurrencyNetwork().getCurrencyCode()) {
case "BTC":

View File

@ -410,12 +410,12 @@ public class BtcWalletService extends WalletService {
if (!Arrays.equals(pubKey, multiSigAddressEntry.getPubKey())) {
log.error("Pub Key from AddressEntry does not match key pair from trade data. Trade ID={}\n" +
"We try to find the keypair in the wallet with the pubKey we found in the trade data.", tradeId);
multiSigKeyPair = findKeyFromPubKeyHash(pubKey);
multiSigKeyPair = findKeyFromPubKey(pubKey);
}
} else {
log.error("multiSigAddressEntry not found for trade ID={}.\n" +
"We try to find the keypair in the wallet with the pubKey we found in the trade data.", tradeId);
multiSigKeyPair = findKeyFromPubKeyHash(pubKey);
multiSigKeyPair = findKeyFromPubKey(pubKey);
}
return multiSigKeyPair;

View File

@ -101,8 +101,6 @@ public class WalletConfig extends AbstractIdleService {
private InputStream checkpoints;
private boolean blockingStartup = true;
private String userAgent;
private String version;
@Nullable
private PeerDiscovery discovery;
@ -265,18 +263,6 @@ public class WalletConfig extends AbstractIdleService {
return this;
}
/**
* Sets the string that will appear in the subver field of the version message.
*
* @param userAgent A short string that should be the name of your app, e.g. "My Wallet"
* @param version A short string that contains the version number, e.g. "1.0-BETA"
*/
public WalletConfig setUserAgent(String userAgent, String version) {
this.userAgent = checkNotNull(userAgent);
this.version = checkNotNull(version);
return this;
}
/**
* If a seed is set here then any existing wallet that matches the file name will be renamed to a backup name,
* the chain file will be deleted, and the wallet object will be instantiated with the given seed instead of
@ -440,7 +426,9 @@ public class WalletConfig extends AbstractIdleService {
vPeerGroup.addWallet(vBtcWallet);
if (vBsqWallet != null) {
//noinspection ConstantConditions
vChain.addWallet(vBsqWallet);
//noinspection ConstantConditions
vPeerGroup.addWallet(vBsqWallet);
}
@ -560,6 +548,7 @@ public class WalletConfig extends AbstractIdleService {
vPeerGroup.stop();
vBtcWallet.saveToFile(vBtcWalletFile);
if (vBsqWallet != null && vBsqWalletFile != null)
//noinspection ConstantConditions,ConstantConditions
vBsqWallet.saveToFile(vBsqWalletFile);
vStore.close();

View File

@ -517,6 +517,10 @@ public abstract class WalletService {
public DeterministicKey findKeyFromPubKeyHash(byte[] pubKeyHash) {
return wallet.getActiveKeychain().findKeyFromPubHash(pubKeyHash);
}
public DeterministicKey findKeyFromPubKey(byte[] pubKey) {
return wallet.getActiveKeychain().findKeyFromPubKey(pubKey);
}
public Address freshReceiveAddress() {
return wallet.freshReceiveAddress();

View File

@ -29,7 +29,10 @@ import io.bisq.common.handlers.ExceptionHandler;
import io.bisq.common.handlers.ResultHandler;
import io.bisq.common.storage.FileUtil;
import io.bisq.core.app.BisqEnvironment;
import io.bisq.core.btc.*;
import io.bisq.core.btc.AddressEntry;
import io.bisq.core.btc.AddressEntryList;
import io.bisq.core.btc.BtcOptionKeys;
import io.bisq.core.btc.RegTestHost;
import io.bisq.core.user.Preferences;
import io.bisq.network.DnsLookupTor;
import io.bisq.network.Socks5MultiDiscovery;
@ -74,7 +77,6 @@ public class WalletsSetup {
private final RegTestHost regTestHost;
private final AddressEntryList addressEntryList;
private final UserAgent userAgent;
private final Preferences preferences;
private final Socks5ProxyProvider socks5ProxyProvider;
private final BisqEnvironment bisqEnvironment;
@ -96,7 +98,6 @@ public class WalletsSetup {
@Inject
public WalletsSetup(RegTestHost regTestHost,
AddressEntryList addressEntryList,
UserAgent userAgent,
Preferences preferences,
Socks5ProxyProvider socks5ProxyProvider,
BisqEnvironment bisqEnvironment,
@ -104,7 +105,6 @@ public class WalletsSetup {
@Named(BtcOptionKeys.SOCKS5_DISCOVER_MODE) String socks5DiscoverModeString) {
this.regTestHost = regTestHost;
this.addressEntryList = addressEntryList;
this.userAgent = userAgent;
this.preferences = preferences;
this.socks5ProxyProvider = socks5ProxyProvider;
this.bisqEnvironment = bisqEnvironment;
@ -179,8 +179,7 @@ public class WalletsSetup {
configPeerNodes(socks5Proxy);
walletConfig.setDownloadListener(downloadListener)
.setBlockingStartup(false)
.setUserAgent(userAgent.getName(), userAgent.getVersion());
.setBlockingStartup(false);
// If seed is non-null it means we are restoring from backup.
walletConfig.setSeed(seed);

View File

@ -89,10 +89,11 @@ public class BsqFullNode extends BsqNode {
@Override
protected void parseBlocksWithChainHeadHeight(int startBlockHeight, int genesisBlockHeight, String genesisTxId) {
log.info("parseBlocksWithChainHeadHeight startBlockHeight={}", startBlockHeight);
bsqFullNodeExecutor.requestChainHeadHeight(chainHeadHeight -> parseBlocks(startBlockHeight, genesisBlockHeight, genesisTxId, chainHeadHeight), throwable -> {
log.error(throwable.toString());
throwable.printStackTrace();
});
bsqFullNodeExecutor.requestChainHeadHeight(chainHeadHeight -> parseBlocks(startBlockHeight, genesisBlockHeight, genesisTxId, chainHeadHeight),
throwable -> {
log.error(throwable.toString());
throwable.printStackTrace();
});
}
@Override

View File

@ -85,7 +85,7 @@ public class BsqLiteNode extends BsqNode {
@Override
public void onBlockReceived(GetBsqBlocksResponse getBsqBlocksResponse) {
List<BsqBlock> bsqBlockList = new ArrayList<>(getBsqBlocksResponse.getBsqBlocks());
log.info("received msg with {} items", bsqBlockList.size(), bsqBlockList.get(bsqBlockList.size() - 1).getHeight());
log.info("received msg with {} items", bsqBlockList.size());
if (bsqBlockList.size() > 0)
log.info("block height of last item: {}", bsqBlockList.get(bsqBlockList.size() - 1).getHeight());
// Be safe and reset all mutable data in case the provider would not have done it

View File

@ -174,7 +174,7 @@ public class RequestManager implements MessageListener, ConnectionListener, Peer
@Override
public void onAwakeFromStandby() {
Log.traceCall();
log.info("onAwakeFromStandby");
closeAllHandlers();
stopped = false;
if (!networkNode.getAllConnections().isEmpty())
@ -271,7 +271,7 @@ public class RequestManager implements MessageListener, ConnectionListener, Peer
@Override
public void onFault(String errorMessage, @Nullable Connection connection) {
log.trace("requestBlocksHandler with outbound connection failed.\n\tnodeAddress={}\n\t" +
log.warn("requestBlocksHandler with outbound connection failed.\n\tnodeAddress={}\n\t" +
"ErrorMessage={}", peersNodeAddress, errorMessage);
peerManager.handleConnectionFault(peersNodeAddress);
@ -327,9 +327,11 @@ public class RequestManager implements MessageListener, ConnectionListener, Peer
List<NodeAddress> list = seedNodeAddresses.stream()
.filter(e -> peerManager.isSeedNode(e) && !peerManager.isSelf(e))
.collect(Collectors.toList());
Collections.shuffle(list);
if (!list.isEmpty()) {
NodeAddress nextCandidate = list.get(0);
seedNodeAddresses.remove(nextCandidate);
log.info("We try requestBlocks with {}", nextCandidate);
requestBlocks(nextCandidate, startBlockHeight);
} else {

View File

@ -29,6 +29,7 @@ import io.bisq.core.dao.blockchain.exceptions.BlockNotConnectingException;
import io.bisq.core.dao.blockchain.vo.*;
import io.bisq.generated.protobuffer.PB;
import lombok.extern.slf4j.Slf4j;
import org.bitcoinj.core.Coin;
import javax.annotation.Nullable;
import javax.inject.Inject;
@ -61,50 +62,27 @@ public class BsqChainState implements PersistableEnvelope {
private static final int SNAPSHOT_GRID = 100; // set high to deactivate
private static final int ISSUANCE_MATURITY = 144 * 30; // 30 days
public static final Coin GENESIS_TOTAL_SUPPLY = Coin.COIN.multiply(25);
//mainnet
// this tx has a lot of outputs
// https://blockchain.info/de/tx/ee921650ab3f978881b8fe291e0c025e0da2b7dc684003d7a03d9649dfee2e15
// BLOCK_HEIGHT 411779
// 411812 has 693 recursions
// block 376078 has 2843 recursions and caused once a StackOverflowError, a second run worked. Took 1,2 sec.
// BTC MAIN NET
// private static final String BTC_GENESIS_TX_ID = "b26371e2145f52c94b3d30713a9e38305bfc665fc27cd554e794b5e369d99ef5";
//private static final int BTC_GENESIS_BLOCK_HEIGHT = 461718; // 2017-04-13
private static final String BTC_GENESIS_TX_ID = "4371a1579bccc672231178cc5fe9fbb9366774d3bcbf21545a82f637f4b61a06";
private static final int BTC_GENESIS_BLOCK_HEIGHT = 473000; // 2017-06-26
private static final String BTC_GENESIS_TX_ID = "e5c8313c4144d219b5f6b2dacf1d36f2d43a9039bb2fcd1bd57f8352a9c9809a";
private static final int BTC_GENESIS_BLOCK_HEIGHT = 477865; // 2017-07-28
// LTC MAIN NET
private static final String LTC_GENESIS_TX_ID = "44074e68c1168d67871b3e9af0e65d6d7c820b03ba15445df2c4089729985fb6";
private static final int LTC_GENESIS_BLOCK_HEIGHT = 1220170; // 2017-06-11
// 1186935
//1220127
// block 300000 2014-05-10
// block 350000 2015-03-30
// block 400000 2016-02-25
// block 450000 2017-01-25
// REG TEST
private static final String BTC_REG_TEST_GENESIS_TX_ID = "da216721fb915da499fe0400d08362f44b672096f37c74501c2f9bcaa7760656";
private static final int BTC_REG_TEST_GENESIS_BLOCK_HEIGHT = 363;
// LTC REG TEST
private static final String LTC_REG_TEST_GENESIS_TX_ID = "3551aa22fbf2e237df3d96d94f286aecc4f3109a7dcd873c5c51e30a6398172c";
private static final int LTC_REG_TEST_GENESIS_BLOCK_HEIGHT = 105;
// TEST NET
// TEST NET
// Phase 0 initial genesis tx 6.10.2017: 2f194230e23459a9211322c4b1c182cf3f367086e8059aca2f8f44e20dac527a
private static final String BTC_TEST_NET_GENESIS_TX_ID = "2f194230e23459a9211322c4b1c182cf3f367086e8059aca2f8f44e20dac527a";
private static final int BTC_TEST_NET_GENESIS_BLOCK_HEIGHT = 1209140;
private static final String LTC_TEST_NET_GENESIS_TX_ID = "not set";
private static final int LTC_TEST_NET_GENESIS_BLOCK_HEIGHT = 1;
// block 376078 has 2843 recursions and caused once a StackOverflowError, a second run worked. Took 1,2 sec.
// REG TEST
private static final String BTC_REG_TEST_GENESIS_TX_ID = "321a2156d6cac631d3e574caf54a5a401e51971280c14b18b5f5877026a94d47";
private static final int BTC_REG_TEST_GENESIS_BLOCK_HEIGHT = 111;
///////////////////////////////////////////////////////////////////////////////////////////
@ -118,6 +96,7 @@ public class BsqChainState implements PersistableEnvelope {
private final String genesisTxId;
private final int genesisBlockHeight;
private int chainHeadHeight = 0;
@Nullable
private Tx genesisTx;
// not impl in PB yet
@ -150,10 +129,6 @@ public class BsqChainState implements PersistableEnvelope {
storage = new Storage<>(storageDir, persistenceProtoResolver);
switch (BisqEnvironment.getBaseCurrencyNetwork()) {
case BTC_MAINNET:
genesisTxId = BTC_GENESIS_TX_ID;
genesisBlockHeight = BTC_GENESIS_BLOCK_HEIGHT;
break;
case BTC_TESTNET:
genesisTxId = BTC_TEST_NET_GENESIS_TX_ID;
genesisBlockHeight = BTC_TEST_NET_GENESIS_BLOCK_HEIGHT;
@ -162,19 +137,10 @@ public class BsqChainState implements PersistableEnvelope {
genesisTxId = BTC_REG_TEST_GENESIS_TX_ID;
genesisBlockHeight = BTC_REG_TEST_GENESIS_BLOCK_HEIGHT;
break;
case LTC_TESTNET:
genesisTxId = LTC_TEST_NET_GENESIS_TX_ID;
genesisBlockHeight = LTC_TEST_NET_GENESIS_BLOCK_HEIGHT;
break;
case LTC_REGTEST:
genesisTxId = LTC_REG_TEST_GENESIS_TX_ID;
genesisBlockHeight = LTC_REG_TEST_GENESIS_BLOCK_HEIGHT;
break;
case LTC_MAINNET:
case BTC_MAINNET:
default:
genesisTxId = LTC_GENESIS_TX_ID;
genesisBlockHeight = LTC_GENESIS_BLOCK_HEIGHT;
genesisTxId = BTC_GENESIS_TX_ID;
genesisBlockHeight = BTC_GENESIS_BLOCK_HEIGHT;
break;
}
@ -191,7 +157,7 @@ public class BsqChainState implements PersistableEnvelope {
String genesisTxId,
int genesisBlockHeight,
int chainHeadHeight,
Tx genesisTx) {
@Nullable Tx genesisTx) {
this.bsqBlocks = bsqBlocks;
this.txMap = txMap;
this.unspentTxOutputsMap = unspentTxOutputsMap;
@ -213,7 +179,7 @@ public class BsqChainState implements PersistableEnvelope {
}
private PB.BsqChainState.Builder getBsqChainStateBuilder() {
return PB.BsqChainState.newBuilder()
final PB.BsqChainState.Builder builder = PB.BsqChainState.newBuilder()
.addAllBsqBlocks(bsqBlocks.stream()
.map(BsqBlock::toProtoMessage)
.collect(Collectors.toList()))
@ -225,8 +191,11 @@ public class BsqChainState implements PersistableEnvelope {
v -> v.getValue().toProtoMessage())))
.setGenesisTxId(genesisTxId)
.setGenesisBlockHeight(genesisBlockHeight)
.setChainHeadHeight(chainHeadHeight)
.setGenesisTx(genesisTx.toProtoMessage());
.setChainHeadHeight(chainHeadHeight);
Optional.ofNullable(genesisTx).ifPresent(e -> builder.setGenesisTx(genesisTx.toProtoMessage()));
return builder;
}
public static PersistableEnvelope fromProto(PB.BsqChainState proto) {
@ -240,8 +209,7 @@ public class BsqChainState implements PersistableEnvelope {
proto.getGenesisTxId(),
proto.getGenesisBlockHeight(),
proto.getChainHeadHeight(),
Tx.fromProto(proto.getGenesisTx())
);
proto.hasGenesisTx() ? Tx.fromProto(proto.getGenesisTx()) : null);
}
@ -404,6 +372,29 @@ public class BsqChainState implements PersistableEnvelope {
});
}
public Coin getTotalBurntFee() {
return lock.read(() -> Coin.valueOf(getTxMap().entrySet().stream().mapToLong(e -> e.getValue().getBurntFee()).sum()));
}
public Set<Tx> getFeeTransactions() {
return lock.read(() -> getTxMap().entrySet().stream().filter(e -> e.getValue().getBurntFee() > 0).map(Map.Entry::getValue).collect(Collectors.toSet()));
}
public Coin getIssuedAmount() {
return lock.read(() -> BsqChainState.GENESIS_TOTAL_SUPPLY);
}
public Set<TxOutput> getUnspentTxOutputs() {
return lock.read(() -> getAllTxOutputs().stream().filter(e -> e.isVerified() && e.isUnspent()).collect(Collectors.toSet()));
}
public Set<TxOutput> getSpentTxOutputs() {
return lock.read(() -> getAllTxOutputs().stream().filter(e -> e.isVerified() && !e.isUnspent()).collect(Collectors.toSet()));
}
public Set<Tx> getTransactions() {
return lock.read(() -> getTxMap().entrySet().stream().map(Map.Entry::getValue).collect(Collectors.toSet()));
}
///////////////////////////////////////////////////////////////////////////////////////////
// Package scope read access

View File

@ -108,10 +108,9 @@ public class BsqParser {
List<Tx> bsqTxsInBlock = findBsqTxsInBlock(btcdBlock,
genesisBlockHeight,
genesisTxId);
final BsqBlockVo bsqBlockVo = new BsqBlockVo(btcdBlock.getHeight(),
final BsqBlock bsqBlock = new BsqBlock(btcdBlock.getHeight(),
btcdBlock.getHash(),
btcdBlock.getPreviousBlockHash());
final BsqBlock bsqBlock = new BsqBlock(bsqBlockVo,
btcdBlock.getPreviousBlockHash(),
ImmutableList.copyOf(bsqTxsInBlock));
bsqChainState.addBlock(bsqBlock);
@ -173,10 +172,9 @@ public class BsqParser {
List<Tx> bsqTxsInBlock = findBsqTxsInBlock(btcdBlock,
genesisBlockHeight,
genesisTxId);
final BsqBlockVo bsqBlockVo = new BsqBlockVo(btcdBlock.getHeight(),
final BsqBlock bsqBlock = new BsqBlock(btcdBlock.getHeight(),
btcdBlock.getHash(),
btcdBlock.getPreviousBlockHash());
final BsqBlock bsqBlock = new BsqBlock(bsqBlockVo,
btcdBlock.getPreviousBlockHash(),
ImmutableList.copyOf(bsqTxsInBlock));
bsqChainState.addBlock(bsqBlock);
return bsqBlock;
@ -252,7 +250,7 @@ public class BsqParser {
// we check if we have any valid BSQ from that tx set
bsqTxsInBlock.addAll(txsWithoutInputsFromSameBlock.stream()
.filter(tx -> isValidBsqTx(blockHeight, tx))
.filter(tx -> isBsqTx(blockHeight, tx))
.collect(Collectors.toList()));
log.debug("Parsing of all txsWithoutInputsFromSameBlock is done.");
@ -277,7 +275,7 @@ public class BsqParser {
}
}
private boolean isValidBsqTx(int blockHeight, Tx tx) {
private boolean isBsqTx(int blockHeight, Tx tx) {
boolean isBsqTx = false;
long availableValue = 0;
for (int inputIndex = 0; inputIndex < tx.getInputs().size(); inputIndex++) {

View File

@ -33,7 +33,10 @@ import com.neemre.btcdcli4j.daemon.event.BlockListener;
import io.bisq.core.dao.DaoOptionKeys;
import io.bisq.core.dao.blockchain.btcd.PubKeyScript;
import io.bisq.core.dao.blockchain.exceptions.BsqBlockchainException;
import io.bisq.core.dao.blockchain.vo.*;
import io.bisq.core.dao.blockchain.vo.Tx;
import io.bisq.core.dao.blockchain.vo.TxInput;
import io.bisq.core.dao.blockchain.vo.TxOutput;
import io.bisq.core.dao.blockchain.vo.TxVo;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
@ -96,6 +99,9 @@ public class RpcService {
nodeConfig.setProperty("node.bitcoind.rpc.password", rpcPassword);
nodeConfig.setProperty("node.bitcoind.rpc.port", rpcPort);
nodeConfig.setProperty("node.bitcoind.notification.block.port", rpcBlockPort);
nodeConfig.setProperty("node.bitcoind.notification.alert.port", "64647");
nodeConfig.setProperty("node.bitcoind.notification.wallet.port", "64648");
nodeConfig.setProperty("node.bitcoind.http.auth_scheme", "Basic");
BtcdClientImpl client = new BtcdClientImpl(httpProvider, nodeConfig);
daemon = new BtcdDaemonImpl(client);
log.info("Setup took {} ms", System.currentTimeMillis() - startTs);
@ -120,9 +126,13 @@ public class RpcService {
public void blockDetected(Block block) {
if (block != null) {
log.info("New block received: height={}, id={}", block.getHeight(), block.getHash());
blockHandler.accept(block);
if (block.getHeight() != null && block.getHash() != null) {
blockHandler.accept(block);
} else {
log.warn("We received a block with block.getHeight()=null or block.getHash()=null. That should not happen.");
}
} else {
log.error("We received a block with value null. That should not happen.");
log.warn("We received a block with value null. That should not happen.");
}
}
});
@ -157,7 +167,7 @@ public class RpcService {
final List<TxInput> txInputs = rawTransaction.getVIn()
.stream()
.filter(rawInput -> rawInput != null && rawInput.getVOut() != null && rawInput.getTxId() != null)
.map(rawInput -> new TxInput(new TxInputVo(rawInput.getTxId(), rawInput.getVOut())))
.map(rawInput -> new TxInput(rawInput.getTxId(), rawInput.getVOut()))
.collect(Collectors.toList());
final List<TxOutput> txOutputs = rawTransaction.getVOut()
@ -169,14 +179,16 @@ public class RpcService {
if (scriptPubKey.getType().equals(ScriptTypes.NULL_DATA)) {
String[] chunks = scriptPubKey.getAsm().split(" ");
// TODO only store BSQ OP_RETURN date filtered by type byte
if (chunks.length == 2 && chunks[0].equals("OP_RETURN")) {
// We get on testnet a lot of "OP_RETURN 0" data, so we filter those away
if (chunks.length == 2 && chunks[0].equals("OP_RETURN") && !"0".equals(chunks[1])) {
try {
opReturnData = Utils.HEX.decode(chunks[1]);
} catch (Throwable t) {
// We get sometimes exceptions, seems BitcoinJ
// cannot handle all existing OP_RETURN data, but we ignore them
// anyway as our OP_RETURN data is valid in BitcoinJ
log.warn(t.toString());
log.warn("Error at Utils.HEX.decode(chunks[1]): " + t.toString() + " / chunks[1]=" + chunks[1]);
}
}
}
@ -184,14 +196,13 @@ public class RpcService {
String address = scriptPubKey.getAddresses() != null &&
scriptPubKey.getAddresses().size() == 1 ? scriptPubKey.getAddresses().get(0) : null;
final PubKeyScript pubKeyScript = dumpBlockchainData ? new PubKeyScript(scriptPubKey) : null;
final TxOutputVo txOutputVo = new TxOutputVo(rawOutput.getN(),
return new TxOutput(rawOutput.getN(),
rawOutput.getValue().movePointRight(8).longValue(),
rawTransaction.getTxId(),
pubKeyScript,
address,
opReturnData,
blockHeight);
return new TxOutput(txOutputVo);
}
)
.collect(Collectors.toList());

View File

@ -27,11 +27,15 @@ import java.util.stream.Collectors;
@Data
public class BsqBlock implements PersistablePayload {
private final BsqBlockVo bsqBlockVo;
private final int height;
private final String hash;
private final String previousBlockHash;
private final List<Tx> txs;
public BsqBlock(BsqBlockVo bsqBlockVo, List<Tx> txs) {
this.bsqBlockVo = bsqBlockVo;
public BsqBlock(int height, String hash, String previousBlockHash, List<Tx> txs) {
this.height = height;
this.hash = hash;
this.previousBlockHash = previousBlockHash;
this.txs = txs;
}
@ -42,7 +46,9 @@ public class BsqBlock implements PersistablePayload {
public PB.BsqBlock toProtoMessage() {
return PB.BsqBlock.newBuilder()
.setBsqBlockVo(bsqBlockVo.toProtoMessage())
.setHeight(height)
.setHash(hash)
.setPreviousBlockHash(previousBlockHash)
.addAllTxs(txs.stream()
.map(Tx::toProtoMessage)
.collect(Collectors.toList()))
@ -50,7 +56,9 @@ public class BsqBlock implements PersistablePayload {
}
public static BsqBlock fromProto(PB.BsqBlock proto) {
return new BsqBlock(BsqBlockVo.fromProto(proto.getBsqBlockVo()),
return new BsqBlock(proto.getHeight(),
proto.getHash(),
proto.getPreviousBlockHash(),
proto.getTxsList().isEmpty() ?
new ArrayList<>() :
proto.getTxsList().stream()
@ -67,7 +75,6 @@ public class BsqBlock implements PersistablePayload {
txs.stream().forEach(Tx::reset);
}
@Override
public String toString() {
return "BsqBlock{" +
@ -77,23 +84,4 @@ public class BsqBlock implements PersistablePayload {
",\n txs='" + txs + '\'' +
"\n}";
}
///////////////////////////////////////////////////////////////////////////////////////////
// Delegates
///////////////////////////////////////////////////////////////////////////////////////////
public int getHeight() {
return bsqBlockVo.getHeight();
}
public String getHash() {
return bsqBlockVo.getHash();
}
public String getPreviousBlockHash() {
return bsqBlockVo.getPreviousBlockHash();
}
}

View File

@ -1,56 +0,0 @@
/*
* 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 io.bisq.core.dao.blockchain.vo;
import io.bisq.common.proto.persistable.PersistablePayload;
import io.bisq.generated.protobuffer.PB;
import lombok.Getter;
import lombok.Value;
@Value
@Getter
public class BsqBlockVo implements PersistablePayload {
private final int height;
private final String hash;
private final String previousBlockHash;
public BsqBlockVo(int height, String hash, String previousBlockHash) {
this.height = height;
this.hash = hash;
this.previousBlockHash = previousBlockHash;
}
///////////////////////////////////////////////////////////////////////////////////////////
// PROTO BUFFER
///////////////////////////////////////////////////////////////////////////////////////////
public PB.BsqBlockVo toProtoMessage() {
return PB.BsqBlockVo.newBuilder()
.setHeight(height)
.setHash(hash)
.setPreviousBlockHash(previousBlockHash).build();
}
public static BsqBlockVo fromProto(PB.BsqBlockVo proto) {
return new BsqBlockVo(proto.getHeight(),
proto.getHash(),
proto.getPreviousBlockHash());
}
}

View File

@ -26,12 +26,13 @@ import java.util.Optional;
@Data
public class TxInput implements PersistablePayload {
private final TxInputVo txInputVo;
private final String txId;
private final int txOutputIndex;
@Nullable
private TxOutput connectedTxOutput;
public TxInput(TxInputVo txInputVo) {
this(txInputVo, null);
public TxInput(String txId, int txOutputIndex) {
this(txId, txOutputIndex, null);
}
@ -39,20 +40,25 @@ public class TxInput implements PersistablePayload {
// PROTO BUFFER
///////////////////////////////////////////////////////////////////////////////////////////
private TxInput(TxInputVo txInputVo, @Nullable TxOutput connectedTxOutput) {
this.txInputVo = txInputVo;
private TxInput(String txId, int txOutputIndex, @Nullable TxOutput connectedTxOutput) {
this.txId = txId;
this.txOutputIndex = txOutputIndex;
this.connectedTxOutput = connectedTxOutput;
}
public PB.TxInput toProtoMessage() {
final PB.TxInput.Builder builder = PB.TxInput.newBuilder()
.setTxInputVo(txInputVo.toProtoMessage());
.setTxId(txId)
.setTxOutputIndex(txOutputIndex);
Optional.ofNullable(connectedTxOutput).ifPresent(e -> builder.setConnectedTxOutput(e.toProtoMessage()));
return builder.build();
}
public static TxInput fromProto(PB.TxInput proto) {
return new TxInput(TxInputVo.fromProto(proto.getTxInputVo()),
return new TxInput(proto.getTxId(),
proto.getTxOutputIndex(),
proto.hasConnectedTxOutput() ? TxOutput.fromProto(proto.getConnectedTxOutput()) : null);
}
@ -65,28 +71,16 @@ public class TxInput implements PersistablePayload {
connectedTxOutput = null;
}
public TxIdIndexTuple getTxIdIndexTuple() {
return new TxIdIndexTuple(txId, txOutputIndex);
}
@Override
public String toString() {
return "TxInput{" +
"\n txId=" + getTxId() +
",\n txOutputIndex=" + getTxOutputIndex() +
",\n txOutput='" + connectedTxOutput + '\'' +
"\n txId=" + txId +
",\n txOutputIndex=" + txOutputIndex +
",\n connectedTxOutput='" + connectedTxOutput + '\'' +
"\n}";
}
///////////////////////////////////////////////////////////////////////////////////////////
// Delegates
///////////////////////////////////////////////////////////////////////////////////////////
public String getTxId() {
return txInputVo.getTxId();
}
public int getTxOutputIndex() {
return txInputVo.getTxOutputIndex();
}
public TxIdIndexTuple getTxIdIndexTuple() {
return txInputVo.getTxIdIndexTuple();
}
}

View File

@ -1,49 +0,0 @@
/*
* 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 io.bisq.core.dao.blockchain.vo;
import io.bisq.common.proto.persistable.PersistablePayload;
import io.bisq.generated.protobuffer.PB;
import lombok.Value;
@Value
public class TxInputVo implements PersistablePayload {
private final String txId;
private final int txOutputIndex;
///////////////////////////////////////////////////////////////////////////////////////////
// PROTO BUFFER
///////////////////////////////////////////////////////////////////////////////////////////
public PB.TxInputVo toProtoMessage() {
return PB.TxInputVo.newBuilder()
.setTxId(txId)
.setTxOutputIndex(txOutputIndex)
.build();
}
public static TxInputVo fromProto(PB.TxInputVo proto) {
return new TxInputVo(proto.getTxId(),
proto.getTxOutputIndex());
}
public TxIdIndexTuple getTxIdIndexTuple() {
return new TxIdIndexTuple(txId, txOutputIndex);
}
}

View File

@ -17,10 +17,11 @@
package io.bisq.core.dao.blockchain.vo;
import com.google.protobuf.ByteString;
import io.bisq.common.proto.persistable.PersistablePayload;
import io.bisq.common.util.JsonExclude;
import io.bisq.core.dao.blockchain.btcd.PubKeyScript;
import io.bisq.generated.protobuffer.PB;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.bitcoinj.core.Utils;
@ -29,18 +30,43 @@ import javax.annotation.Nullable;
import java.util.Optional;
@Data
@AllArgsConstructor
@Slf4j
public class TxOutput implements PersistablePayload {
private final TxOutputVo txOutputVo;
private final int index;
private final long value;
private final String txId;
@Nullable
private final PubKeyScript pubKeyScript;
@Nullable
private final String address;
@Nullable
@JsonExclude
private final byte[] opReturnData;
private final int blockHeight;
private boolean isUnspent;
private boolean isVerified;
private TxOutputType txOutputType = TxOutputType.UNDEFINED;
@Nullable
private SpentInfo spentInfo;
public TxOutput(TxOutputVo txOutputVo) {
this.txOutputVo = txOutputVo;
public TxOutput(int index,
long value,
String txId,
@Nullable PubKeyScript pubKeyScript,
@Nullable String address,
@Nullable byte[] opReturnData,
int blockHeight) {
this(index,
value,
txId,
pubKeyScript,
address,
opReturnData,
blockHeight,
false,
false,
TxOutputType.UNDEFINED,
null);
}
@ -48,20 +74,56 @@ public class TxOutput implements PersistablePayload {
// PROTO BUFFER
///////////////////////////////////////////////////////////////////////////////////////////
private TxOutput(int index,
long value,
String txId,
@Nullable PubKeyScript pubKeyScript,
@Nullable String address,
@Nullable byte[] opReturnData,
int blockHeight,
boolean isUnspent,
boolean isVerified,
TxOutputType txOutputType,
@Nullable SpentInfo spentInfo) {
this.index = index;
this.value = value;
this.txId = txId;
this.pubKeyScript = pubKeyScript;
this.address = address;
this.opReturnData = opReturnData;
this.blockHeight = blockHeight;
this.isUnspent = isUnspent;
this.isVerified = isVerified;
this.txOutputType = txOutputType;
this.spentInfo = spentInfo;
}
public PB.TxOutput toProtoMessage() {
final PB.TxOutput.Builder builder = PB.TxOutput.newBuilder()
.setTxOutputVo(txOutputVo.toProtoMessage())
.setIndex(index)
.setValue(value)
.setTxId(txId)
.setBlockHeight(blockHeight)
.setIsUnspent(isUnspent)
.setIsVerified(isVerified)
.setTxOutputType(txOutputType.toProtoMessage());
Optional.ofNullable(pubKeyScript).ifPresent(e -> builder.setPubKeyScript(pubKeyScript.toProtoMessage()));
Optional.ofNullable(address).ifPresent(e -> builder.setAddress(address));
Optional.ofNullable(opReturnData).ifPresent(e -> builder.setOpReturnData(ByteString.copyFrom(opReturnData)));
Optional.ofNullable(spentInfo).ifPresent(e -> builder.setSpentInfo(e.toProtoMessage()));
return builder.build();
}
public static TxOutput fromProto(PB.TxOutput proto) {
return new TxOutput(TxOutputVo.fromProto(proto.getTxOutputVo()),
return new TxOutput(proto.getIndex(),
proto.getValue(),
proto.getTxId(),
proto.hasPubKeyScript() ? PubKeyScript.fromProto(proto.getPubKeyScript()) : null,
proto.getAddress().isEmpty() ? null : proto.getAddress(),
proto.getOpReturnData().isEmpty() ? null : proto.getOpReturnData().toByteArray(),
proto.getBlockHeight(),
proto.getIsUnspent(),
proto.getIsVerified(),
TxOutputType.fromProto(proto.getTxOutputType()),
@ -80,23 +142,6 @@ public class TxOutput implements PersistablePayload {
spentInfo = null;
}
@Override
public String toString() {
return "TxOutput{" +
"\n index=" + getIndex() +
",\n value=" + getValue() +
",\n txId='" + getId() + '\'' +
",\n pubKeyScript=" + getPubKeyScript() +
",\n address='" + getAddress() + '\'' +
",\n opReturnData=" + (getOpReturnData() != null ? Utils.HEX.encode(getOpReturnData()) : "null") +
",\n blockHeight=" + getBlockHeight() +
",\n isUnspent=" + isUnspent +
",\n isVerified=" + isVerified +
",\n txOutputType=" + txOutputType +
",\n spentInfo=" + (spentInfo != null ? spentInfo.toString() : "null") +
"\n}";
}
public boolean isCompensationRequestBtcOutput() {
return txOutputType == TxOutputType.COMPENSATION_REQUEST_BTC_OUTPUT;
}
@ -105,46 +150,28 @@ public class TxOutput implements PersistablePayload {
return txOutputType == TxOutputType.SPONSORING_BTC_OUTPUT;
}
///////////////////////////////////////////////////////////////////////////////////////////
// Delegates
///////////////////////////////////////////////////////////////////////////////////////////
public int getIndex() {
return txOutputVo.getIndex();
}
public long getValue() {
return txOutputVo.getValue();
}
public String getTxId() {
return txOutputVo.getTxId();
}
public PubKeyScript getPubKeyScript() {
return txOutputVo.getPubKeyScript();
}
@Nullable
public String getAddress() {
return txOutputVo.getAddress();
}
@Nullable
public byte[] getOpReturnData() {
return txOutputVo.getOpReturnData();
}
public int getBlockHeight() {
return txOutputVo.getBlockHeight();
}
public String getId() {
return txOutputVo.getId();
return txId + ":" + index;
}
public TxIdIndexTuple getTxIdIndexTuple() {
return txOutputVo.getTxIdIndexTuple();
return new TxIdIndexTuple(txId, index);
}
@Override
public String toString() {
return "TxOutput{" +
"\n index=" + index +
",\n value=" + value +
",\n txId='" + getId() + '\'' +
",\n pubKeyScript=" + pubKeyScript +
",\n address='" + address + '\'' +
",\n opReturnData=" + (opReturnData != null ? Utils.HEX.encode(opReturnData) : "null") +
",\n blockHeight=" + blockHeight +
",\n isUnspent=" + isUnspent +
",\n isVerified=" + isVerified +
",\n txOutputType=" + txOutputType +
",\n spentInfo=" + (spentInfo != null ? spentInfo.toString() : "null") +
"\n}";
}
}

View File

@ -1,79 +0,0 @@
/*
* 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 io.bisq.core.dao.blockchain.vo;
import com.google.protobuf.ByteString;
import io.bisq.common.proto.persistable.PersistablePayload;
import io.bisq.common.util.JsonExclude;
import io.bisq.core.dao.blockchain.btcd.PubKeyScript;
import io.bisq.generated.protobuffer.PB;
import lombok.Value;
import javax.annotation.Nullable;
import java.util.Optional;
@Value
public class TxOutputVo implements PersistablePayload {
private final int index;
private final long value;
private final String txId;
@Nullable
private final PubKeyScript pubKeyScript;
@Nullable
private final String address;
@Nullable
@JsonExclude
private final byte[] opReturnData;
private final int blockHeight;
///////////////////////////////////////////////////////////////////////////////////////////
// PROTO BUFFER
///////////////////////////////////////////////////////////////////////////////////////////
public PB.TxOutputVo toProtoMessage() {
final PB.TxOutputVo.Builder builder = PB.TxOutputVo.newBuilder()
.setIndex(index)
.setValue(value)
.setTxId(txId)
.setBlockHeight(blockHeight);
Optional.ofNullable(pubKeyScript).ifPresent(e -> builder.setPubKeyScript(pubKeyScript.toProtoMessage()));
Optional.ofNullable(address).ifPresent(e -> builder.setAddress(address));
Optional.ofNullable(opReturnData).ifPresent(e -> builder.setOpReturnData(ByteString.copyFrom(opReturnData)));
return builder.build();
}
public static TxOutputVo fromProto(PB.TxOutputVo proto) {
return new TxOutputVo(proto.getIndex(),
proto.getValue(),
proto.getTxId(),
proto.hasPubKeyScript() ? PubKeyScript.fromProto(proto.getPubKeyScript()) : null,
proto.getAddress().isEmpty() ? null : proto.getAddress(),
proto.getOpReturnData().isEmpty() ? null : proto.getOpReturnData().toByteArray(),
proto.getBlockHeight());
}
public String getId() {
return txId + ":" + index;
}
public TxIdIndexTuple getTxIdIndexTuple() {
return new TxIdIndexTuple(txId, index);
}
}

View File

@ -47,6 +47,12 @@ public final class Filter implements StoragePayload {
private final List<String> bannedNodeAddress;
private final List<PaymentAccountFilter> bannedPaymentAccounts;
// Because we added those fields in v 0.5.4 and old versions do not have it we annotate it with @Nullable
@Nullable
private final List<String> bannedCurrencies;
@Nullable
private final List<String> bannedPaymentMethods;
private String signatureAsBase64;
private byte[] ownerPubKeyBytes;
// Should be only used in emergency case if we need to add data but do not want to break backward compatibility
@ -58,10 +64,14 @@ public final class Filter implements StoragePayload {
public Filter(List<String> bannedOfferIds,
List<String> bannedNodeAddress,
List<PaymentAccountFilter> bannedPaymentAccounts) {
List<PaymentAccountFilter> bannedPaymentAccounts,
@Nullable List<String> bannedCurrencies,
@Nullable List<String> bannedPaymentMethods) {
this.bannedOfferIds = bannedOfferIds;
this.bannedNodeAddress = bannedNodeAddress;
this.bannedPaymentAccounts = bannedPaymentAccounts;
this.bannedCurrencies = bannedCurrencies;
this.bannedPaymentMethods = bannedPaymentMethods;
}
@ -73,12 +83,16 @@ public final class Filter implements StoragePayload {
public Filter(List<String> bannedOfferIds,
List<String> bannedNodeAddress,
List<PaymentAccountFilter> bannedPaymentAccounts,
@Nullable List<String> bannedCurrencies,
@Nullable List<String> bannedPaymentMethods,
String signatureAsBase64,
byte[] ownerPubKeyBytes,
@Nullable Map<String, String> extraDataMap) {
this(bannedOfferIds,
bannedNodeAddress,
bannedPaymentAccounts);
bannedPaymentAccounts,
bannedCurrencies,
bannedPaymentMethods);
this.signatureAsBase64 = signatureAsBase64;
this.ownerPubKeyBytes = ownerPubKeyBytes;
this.extraDataMap = extraDataMap;
@ -99,7 +113,11 @@ public final class Filter implements StoragePayload {
.addAllBannedPaymentAccounts(paymentAccountFilterList)
.setSignatureAsBase64(signatureAsBase64)
.setOwnerPubKeyBytes(ByteString.copyFrom(ownerPubKeyBytes));
Optional.ofNullable(bannedCurrencies).ifPresent(builder::addAllBannedCurrencies);
Optional.ofNullable(bannedPaymentMethods).ifPresent(builder::addAllBannedPaymentMethods);
Optional.ofNullable(extraDataMap).ifPresent(builder::putAllExtraData);
return PB.StoragePayload.newBuilder().setFilter(builder).build();
}
@ -109,6 +127,8 @@ public final class Filter implements StoragePayload {
proto.getBannedPaymentAccountsList().stream()
.map(PaymentAccountFilter::fromProto)
.collect(Collectors.toList()),
CollectionUtils.isEmpty(proto.getBannedCurrenciesList()) ? null : proto.getBannedCurrenciesList().stream().collect(Collectors.toList()),
CollectionUtils.isEmpty(proto.getBannedPaymentMethodsList()) ? null : proto.getBannedPaymentMethodsList().stream().collect(Collectors.toList()),
proto.getSignatureAsBase64(),
proto.getOwnerPubKeyBytes().toByteArray(),
CollectionUtils.isEmpty(proto.getExtraDataMap()) ? null : proto.getExtraDataMap());

View File

@ -22,6 +22,8 @@ import com.google.inject.name.Named;
import io.bisq.common.app.DevEnv;
import io.bisq.common.crypto.KeyRing;
import io.bisq.core.app.AppOptionKeys;
import io.bisq.core.payment.payload.PaymentAccountPayload;
import io.bisq.core.payment.payload.PaymentMethod;
import io.bisq.core.user.User;
import io.bisq.generated.protobuffer.PB;
import io.bisq.network.p2p.P2PService;
@ -36,8 +38,10 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.annotation.Nullable;
import java.lang.reflect.Method;
import java.math.BigInteger;
import java.security.SignatureException;
import java.util.Optional;
import java.util.stream.Collectors;
import static org.bitcoinj.core.Utils.HEX;
@ -162,12 +166,18 @@ public class FilterManager {
}
}
// We dont use full data from Filter as we are only interested in the filter data not the sig and keys
private String getHexFromData(Filter filter) {
PB.Filter.Builder builder = PB.Filter.newBuilder().addAllBannedNodeAddress(filter.getBannedNodeAddress())
PB.Filter.Builder builder = PB.Filter.newBuilder()
.addAllBannedOfferIds(filter.getBannedOfferIds())
.addAllBannedNodeAddress(filter.getBannedNodeAddress())
.addAllBannedPaymentAccounts(filter.getBannedPaymentAccounts().stream()
.map(PaymentAccountFilter::toProtoMessage)
.collect(Collectors.toList()));
Optional.ofNullable(filter.getBannedCurrencies()).ifPresent(builder::addAllBannedCurrencies);
Optional.ofNullable(filter.getBannedPaymentMethods()).ifPresent(builder::addAllBannedPaymentMethods);
return Utils.HEX.encode(builder.build().toByteArray());
}
@ -175,4 +185,63 @@ public class FilterManager {
public Filter getDevelopersFilter() {
return user.getDevelopersFilter();
}
public boolean isCurrencyBanned(String currencyCode) {
return getFilter() != null &&
getFilter().getBannedCurrencies() != null &&
getFilter().getBannedCurrencies().stream()
.filter(e -> e.equals(currencyCode))
.findAny()
.isPresent();
}
public boolean isPaymentMethodBanned(PaymentMethod paymentMethod) {
return getFilter() != null &&
getFilter().getBannedPaymentMethods() != null &&
getFilter().getBannedPaymentMethods().stream()
.filter(e -> e.equals(paymentMethod.getId()))
.findAny()
.isPresent();
}
public boolean isOfferIdBanned(String offerId) {
return getFilter() != null &&
getFilter().getBannedOfferIds().stream()
.filter(e -> e.equals(offerId))
.findAny()
.isPresent();
}
public boolean isNodeAddressBanned(String nodeAddress) {
return getFilter() != null &&
getFilter().getBannedNodeAddress().stream()
.filter(e -> e.equals(nodeAddress))
.findAny()
.isPresent();
}
public boolean isPeersPaymentAccountDataAreBanned(PaymentAccountPayload paymentAccountPayload,
PaymentAccountFilter[] appliedPaymentAccountFilter) {
return getFilter() != null &&
getFilter().getBannedPaymentAccounts().stream()
.filter(paymentAccountFilter -> {
final boolean samePaymentMethodId = paymentAccountFilter.getPaymentMethodId().equals(
paymentAccountPayload.getPaymentMethodId());
if (samePaymentMethodId) {
try {
Method method = paymentAccountPayload.getClass().getMethod(paymentAccountFilter.getGetMethodName());
String result = (String) method.invoke(paymentAccountPayload);
appliedPaymentAccountFilter[0] = paymentAccountFilter;
return result.equals(paymentAccountFilter.getValue());
} catch (Throwable e) {
log.error(e.getMessage());
return false;
}
} else {
return false;
}
})
.findAny()
.isPresent();
}
}

View File

@ -128,7 +128,7 @@ public class Offer implements NetworkPayload, PersistablePayload {
if (offerPayload.isUseMarketBasedPrice()) {
checkNotNull(priceFeedService, "priceFeed must not be null");
MarketPrice marketPrice = priceFeedService.getMarketPrice(currencyCode);
if (marketPrice != null && marketPrice.isValid()) {
if (marketPrice != null && marketPrice.isRecentExternalPriceAvailable()) {
double factor;
double marketPriceMargin = offerPayload.getMarketPriceMargin();
if (CurrencyUtil.isCryptoCurrency(currencyCode)) {

View File

@ -24,6 +24,9 @@ import lombok.Getter;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
// That class is used in the contract for creating the contract json. Any change will break the contract.
// If a field gets added it need to be be annotated with @JsonExclude (excluded from contract).
@Getter
@EqualsAndHashCode
@ToString

View File

@ -27,15 +27,24 @@ public class MarketPrice {
private final String currencyCode;
private final double price;
private final long timestampSec;
private final boolean isExternallyProvidedPrice; // if we get it from btc average or others.
public MarketPrice(String currencyCode, double price, long timestampSec) {
public MarketPrice(String currencyCode, double price, long timestampSec, boolean isExternallyProvidedPrice) {
this.currencyCode = currencyCode;
this.price = price;
this.timestampSec = timestampSec;
this.isExternallyProvidedPrice = isExternallyProvidedPrice;
}
public boolean isValid() {
long limit = Instant.now().getEpochSecond() - MARKET_PRICE_MAX_AGE_SEC;
return timestampSec > limit && price > 0;
public boolean isPriceAvailable() {
return price > 0;
}
private boolean isRecentPriceAvailable() {
return timestampSec > (Instant.now().getEpochSecond() - MARKET_PRICE_MAX_AGE_SEC) && isPriceAvailable();
}
public boolean isRecentExternalPriceAvailable() {
return isExternallyProvidedPrice && isRecentPriceAvailable();
}
}

View File

@ -25,6 +25,8 @@ import io.bisq.common.app.Log;
import io.bisq.common.handlers.FaultHandler;
import io.bisq.common.locale.CurrencyUtil;
import io.bisq.common.locale.TradeCurrency;
import io.bisq.common.monetary.Price;
import io.bisq.common.util.MathUtils;
import io.bisq.common.util.Tuple2;
import io.bisq.core.app.BisqEnvironment;
import io.bisq.core.provider.ProvidersRepository;
@ -138,6 +140,16 @@ public class PriceFeedService {
else
return null;
}
public void setBisqMarketPrice(String currencyCode, Price price) {
if (!cache.containsKey(currencyCode) || !cache.get(currencyCode).isExternallyProvidedPrice()) {
cache.put(currencyCode, new MarketPrice(currencyCode,
MathUtils.scaleDownByPowerOf10(price.getValue(), CurrencyUtil.isCryptoCurrency(currencyCode) ? 8 : 4),
0,
false));
updateCounter.set(updateCounter.get() + 1);
}
}
///////////////////////////////////////////////////////////////////////////////////////////
// Setter
@ -198,7 +210,7 @@ public class PriceFeedService {
if (cache.containsKey(currencyCode)) {
try {
MarketPrice marketPrice = cache.get(currencyCode);
if (marketPrice.isValid())
if (marketPrice.isRecentExternalPriceAvailable())
priceConsumer.accept(marketPrice.getPrice());
} catch (Throwable t) {
log.warn("Error at applyPriceToConsumer " + t.getMessage());
@ -235,20 +247,36 @@ public class PriceFeedService {
case "DASH":
// apply conversion of btc based price to baseCurrencyCode based with btc/baseCurrencyCode price
MarketPrice baseCurrencyPrice = priceMap.get(baseCurrencyCode);
Map<String, MarketPrice> convertedPriceMap = new HashMap<>();
priceMap.entrySet().stream().forEach(e -> {
final MarketPrice value = e.getValue();
double convertedPrice;
if (CurrencyUtil.isCryptoCurrency(e.getKey()))
convertedPrice = value.getPrice() / baseCurrencyPrice.getPrice();
else
convertedPrice = value.getPrice() * baseCurrencyPrice.getPrice();
convertedPriceMap.put(e.getKey(), new MarketPrice(value.getCurrencyCode(), convertedPrice, value.getTimestampSec()));
});
cache.putAll(convertedPriceMap);
if (baseCurrencyPrice != null) {
Map<String, MarketPrice> convertedPriceMap = new HashMap<>();
priceMap.entrySet().stream().forEach(e -> {
final MarketPrice marketPrice = e.getValue();
if (marketPrice != null) {
double convertedPrice;
final double marketPriceAsDouble = marketPrice.getPrice();
final double baseCurrencyPriceAsDouble = baseCurrencyPrice.getPrice();
if (marketPriceAsDouble > 0 && baseCurrencyPriceAsDouble > 0) {
if (CurrencyUtil.isCryptoCurrency(e.getKey()))
convertedPrice = marketPriceAsDouble / baseCurrencyPriceAsDouble;
else
convertedPrice = marketPriceAsDouble * baseCurrencyPriceAsDouble;
convertedPriceMap.put(e.getKey(),
new MarketPrice(marketPrice.getCurrencyCode(), convertedPrice, marketPrice.getTimestampSec(), true));
} else {
log.warn("marketPriceAsDouble or baseCurrencyPriceAsDouble is 0: marketPriceAsDouble={}, " +
"baseCurrencyPriceAsDouble={}", marketPriceAsDouble, baseCurrencyPriceAsDouble);
}
} else {
log.warn("marketPrice is null");
}
});
cache.putAll(convertedPriceMap);
} else {
log.warn("baseCurrencyPrice is null");
}
break;
default:
throw new RuntimeException("baseCurrencyCode not dfined. baseCurrencyCode=" + baseCurrencyCode);
throw new RuntimeException("baseCurrencyCode not defined. baseCurrencyCode=" + baseCurrencyCode);
}
resultHandler.run();

View File

@ -58,7 +58,7 @@ public class PriceProvider extends HttpClientProvider {
final double price = (double) treeMap.get("price");
// json uses double for our timestampSec long value...
final long timestampSec = MathUtils.doubleToLong((double) treeMap.get("timestampSec"));
marketPriceMap.put(currencyCode, new MarketPrice(currencyCode, price, timestampSec));
marketPriceMap.put(currencyCode, new MarketPrice(currencyCode, price, timestampSec, true));
} catch (Throwable t) {
log.error(t.toString());
t.printStackTrace();

View File

@ -29,12 +29,15 @@ import io.bisq.core.proto.CoreProtoResolver;
import io.bisq.generated.protobuffer.PB;
import io.bisq.network.p2p.NodeAddress;
import lombok.Value;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.bitcoinj.core.Coin;
import javax.annotation.Nullable;
import static com.google.common.base.Preconditions.checkArgument;
@Slf4j
@Value
public final class Contract implements NetworkPayload {
private final OfferPayload offerPayload;
@ -210,6 +213,25 @@ public final class Contract implements NetworkPayload {
return Price.valueOf(offerPayload.getCurrencyCode(), tradePrice);
}
public void printDiff(@Nullable String peersContractAsJson) {
final String json = Utilities.objectToJson(this);
String diff = StringUtils.difference(json, peersContractAsJson);
if (!diff.isEmpty()) {
log.warn("Diff of both contracts: \n" + diff);
log.warn("\n\n------------------------------------------------------------\n"
+ "Contract as json\n"
+ json
+ "\n------------------------------------------------------------\n");
log.warn("\n\n------------------------------------------------------------\n"
+ "Peers contract as json\n"
+ peersContractAsJson
+ "\n------------------------------------------------------------\n");
} else {
log.debug("Both contracts are the same");
}
}
@Override
public String toString() {
return "Contract{" +

View File

@ -29,7 +29,6 @@ import io.bisq.core.btc.wallet.BsqWalletService;
import io.bisq.core.btc.wallet.BtcWalletService;
import io.bisq.core.btc.wallet.TradeWalletService;
import io.bisq.core.filter.FilterManager;
import io.bisq.core.filter.PaymentAccountFilter;
import io.bisq.core.offer.Offer;
import io.bisq.core.offer.OpenOfferManager;
import io.bisq.core.payment.PaymentAccount;
@ -48,13 +47,11 @@ import io.bisq.network.p2p.P2PService;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.NotImplementedException;
import org.bitcoinj.core.Coin;
import org.bitcoinj.core.Sha256Hash;
import org.bitcoinj.core.Transaction;
import javax.annotation.Nullable;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
@ -239,12 +236,11 @@ public class ProcessModel implements Model, PersistablePayload {
@Override
public void persist() {
throw new NotImplementedException("persist is not implemented in that class");
log.warn("persist is not implemented in that class");
}
@Override
public void onComplete() {
throw new NotImplementedException("persist is not implemented in that class");
}
public void setTakeOfferFeeTx(Transaction takeOfferFeeTx) {
@ -262,39 +258,6 @@ public class ProcessModel implements Model, PersistablePayload {
return paymentAccount != null ? paymentAccount.getPaymentAccountPayload() : null;
}
public boolean isPeersPaymentAccountDataAreBanned(PaymentAccountPayload paymentAccountPayload,
PaymentAccountFilter[] appliedPaymentAccountFilter) {
return filterManager.getFilter() != null &&
filterManager.getFilter().getBannedPaymentAccounts().stream()
.filter(paymentAccountFilter -> {
final boolean samePaymentMethodId = paymentAccountFilter.getPaymentMethodId().equals(
paymentAccountPayload.getPaymentMethodId());
if (samePaymentMethodId) {
try {
Method method = paymentAccountPayload.getClass().getMethod(paymentAccountFilter.getGetMethodName());
String result = (String) method.invoke(paymentAccountPayload);
appliedPaymentAccountFilter[0] = paymentAccountFilter;
return result.equals(paymentAccountFilter.getValue());
} catch (Throwable e) {
log.error(e.getMessage());
return false;
}
} else {
return false;
}
})
.findAny()
.isPresent();
}
public boolean isNodeBanned(NodeAddress nodeAddress) {
return filterManager.getFilter() != null &&
filterManager.getFilter().getBannedNodeAddress().stream()
.filter(e -> e.equals(nodeAddress.getHostNameWithoutPostFix()))
.findAny()
.isPresent();
}
public Coin getFundsNeededForTradeAsLong() {
return Coin.valueOf(fundsNeededForTradeAsLong);
}

View File

@ -38,18 +38,26 @@ public class CheckIfPeerIsBanned extends TradeTask {
try {
runInterceptHook();
final NodeAddress tempTradingPeerNodeAddress = processModel.getTempTradingPeerNodeAddress();
if (tempTradingPeerNodeAddress != null && processModel.isNodeBanned(tempTradingPeerNodeAddress)) {
failed("Other trader is banned by his node address.\n" +
"tradingPeerNodeAddress=" + tempTradingPeerNodeAddress);
final NodeAddress nodeAddress = processModel.getTempTradingPeerNodeAddress();
PaymentAccountPayload paymentAccountPayload = checkNotNull(processModel.getTradingPeer().getPaymentAccountPayload());
final PaymentAccountFilter[] appliedPaymentAccountFilter = new PaymentAccountFilter[1];
PaymentAccountPayload paymentAccountPayload = checkNotNull(processModel.getTradingPeer().getPaymentAccountPayload());
final PaymentAccountFilter[] appliedPaymentAccountFilter = new PaymentAccountFilter[1];
if (processModel.isPeersPaymentAccountDataAreBanned(paymentAccountPayload, appliedPaymentAccountFilter)) {
failed("Other trader is banned by his trading account data.\n" +
"paymentAccountPayload=" + paymentAccountPayload.getPaymentDetails() + "\n" +
"banFilter=" + appliedPaymentAccountFilter[0].toString());
}
if (nodeAddress != null && processModel.getFilterManager().isNodeAddressBanned(nodeAddress.getHostNameWithoutPostFix())) {
failed("Other trader is banned by his node address.\n" +
"tradingPeerNodeAddress=" + nodeAddress);
} else if (processModel.getFilterManager().isOfferIdBanned(trade.getId())) {
failed("Offer ID is banned.\n" +
"Offer ID=" + trade.getId());
} else if (processModel.getFilterManager().isCurrencyBanned(trade.getOffer().getCurrencyCode())) {
failed("Currency is banned.\n" +
"Currency code=" + trade.getOffer().getCurrencyCode());
} else if (processModel.getFilterManager().isPaymentMethodBanned(trade.getOffer().getPaymentMethod())) {
failed("Payment method is banned.\n" +
"Payment method=" + trade.getOffer().getPaymentMethod().getId());
} else if (processModel.getFilterManager().isPeersPaymentAccountDataAreBanned(paymentAccountPayload, appliedPaymentAccountFilter)) {
failed("Other trader is banned by his trading account data.\n" +
"paymentAccountPayload=" + paymentAccountPayload.getPaymentDetails() + "\n" +
"banFilter=" + appliedPaymentAccountFilter[0].toString());
} else {
complete();
}

View File

@ -124,6 +124,7 @@ public class SellerAsTakerSignAndPublishDepositTx extends TradeTask {
});
trade.setDepositTx(depositTx);
} catch (Throwable t) {
trade.getContract().printDiff(processModel.getTradingPeer().getContractAsJson());
failed(t);
}
}

View File

@ -97,11 +97,14 @@ public class TakerVerifyAndSignContract extends TradeTask {
);
String contractAsJson = Utilities.objectToJson(contract);
log.trace("Contract as json:{}", contractAsJson);
contract.printDiff(processModel.getTradingPeer().getContractAsJson());
checkArgument(contractAsJson.equals(processModel.getTradingPeer().getContractAsJson()), "Contracts are not matching");
String signature = Sig.sign(processModel.getKeyRing().getSignatureKeyPair().getPrivate(), contractAsJson);
trade.setContract(contract);
trade.setContractAsJson(contractAsJson);
trade.setTakerContractSignature(signature);
try {
checkNotNull(maker.getPubKeyRing(), "maker.getPubKeyRing() must nto be null");
Sig.verify(maker.getPubKeyRing().getSignaturePubKey(),

View File

@ -13,6 +13,7 @@ import io.bisq.common.storage.Storage;
import io.bisq.common.util.Utilities;
import io.bisq.core.app.AppOptionKeys;
import io.bisq.core.app.BisqEnvironment;
import io.bisq.core.provider.price.PriceFeedService;
import io.bisq.network.p2p.P2PService;
import io.bisq.network.p2p.storage.HashMapChangedListener;
import io.bisq.network.p2p.storage.payload.ProtectedStorageEntry;
@ -32,6 +33,7 @@ public class TradeStatisticsManager implements PersistedDataHost {
private final Storage<TradeStatisticsList> statisticsStorage;
private final JsonFileManager jsonFileManager;
private final P2PService p2PService;
private final PriceFeedService priceFeedService;
private final boolean dumpStatistics;
private final ObservableSet<TradeStatistics> observableTradeStatisticsSet = FXCollections.observableSet();
private final HashSet<TradeStatistics> tradeStatisticsSet = new HashSet<>();
@ -40,10 +42,12 @@ public class TradeStatisticsManager implements PersistedDataHost {
@Inject
public TradeStatisticsManager(Storage<TradeStatisticsList> statisticsStorage,
P2PService p2PService,
PriceFeedService priceFeedService,
@Named(Storage.STORAGE_DIR) File storageDir,
@Named(AppOptionKeys.DUMP_STATISTICS) boolean dumpStatistics) {
this.statisticsStorage = statisticsStorage;
this.p2PService = p2PService;
this.priceFeedService = priceFeedService;
this.dumpStatistics = dumpStatistics;
jsonFileManager = new JsonFileManager(storageDir);
@ -129,6 +133,8 @@ public class TradeStatisticsManager implements PersistedDataHost {
});
applyBisqMarketPrice();
statisticsStorage.queueUpForSave(new TradeStatisticsList(new ArrayList<>(tradeStatisticsSet)), 2000);
dump();
@ -137,6 +143,16 @@ public class TradeStatisticsManager implements PersistedDataHost {
}
private void applyBisqMarketPrice() {
List<TradeStatistics> sortedList = new ArrayList<>(tradeStatisticsSet);
// sort by date so we have most recent as last entry which we use for displaying the latest price
sortedList.sort((o1, o2) -> o1.getTradeDate().compareTo(o2.getTradeDate()));
if (!sortedList.isEmpty()) {
TradeStatistics tradeStatistics = sortedList.get(sortedList.size() - 1);
priceFeedService.setBisqMarketPrice(tradeStatistics.getCurrencyCode(), tradeStatistics.getTradePrice());
}
}
public void add(TradeStatistics tradeStatistics, boolean storeLocally) {
if (!tradeStatisticsSet.contains(tradeStatistics)) {
boolean itemAlreadyAdded = tradeStatisticsSet.stream().filter(e -> (e.getOfferId().equals(tradeStatistics.getOfferId()))).findAny().isPresent();
@ -144,7 +160,11 @@ public class TradeStatisticsManager implements PersistedDataHost {
tradeStatisticsSet.add(tradeStatistics);
observableTradeStatisticsSet.add(tradeStatistics);
tradeStatistics.getTradePrice().getValue();
if (storeLocally) {
applyBisqMarketPrice();
statisticsStorage.queueUpForSave(new TradeStatisticsList(new ArrayList<>(tradeStatisticsSet)), 2000);
dump();
}
@ -186,7 +206,7 @@ public class TradeStatisticsManager implements PersistedDataHost {
}
}
StringBuilder sb1 = new StringBuilder();
StringBuilder sb1 = new StringBuilder("\nAll traded Fiat currencies:\n");
map1.entrySet().stream()
.sorted((o1, o2) -> Integer.valueOf(o2.getValue().size()).compareTo(o1.getValue().size()))
.forEach(e -> sb1.append(e.getKey()).append(": ").append(e.getValue().size()).append("\n"));
@ -194,19 +214,65 @@ public class TradeStatisticsManager implements PersistedDataHost {
Map<String, Set<TradeStatistics>> map2 = new HashMap<>();
for (TradeStatistics tradeStatistics : tradeStatisticsSet) {
if (CurrencyUtil.isCryptoCurrency(tradeStatistics.getCounterCurrency())) {
final String counterCurrency = CurrencyUtil.getNameAndCode(tradeStatistics.getCounterCurrency());
if (!map2.containsKey(counterCurrency))
map2.put(counterCurrency, new HashSet<>());
if (CurrencyUtil.isCryptoCurrency(tradeStatistics.getBaseCurrency())) {
final String code = CurrencyUtil.getNameAndCode(tradeStatistics.getBaseCurrency());
if (!map2.containsKey(code))
map2.put(code, new HashSet<>());
map2.get(counterCurrency).add(tradeStatistics);
map2.get(code).add(tradeStatistics);
}
}
StringBuilder sb2 = new StringBuilder();
List<String> allCryptoCurrencies = new ArrayList<>();
Set<String> coinsWithValidator = new HashSet<>();
coinsWithValidator.add("BTC");
coinsWithValidator.add("LTC");
coinsWithValidator.add("DOGE");
coinsWithValidator.add("DASH");
coinsWithValidator.add("ETH");
coinsWithValidator.add("PIVX");
coinsWithValidator.add("IOP");
coinsWithValidator.add("888");
coinsWithValidator.add("ZEC");
coinsWithValidator.add("GBYTE");
coinsWithValidator.add("NXT");
coinsWithValidator.add("PNC");
coinsWithValidator.add("ZEN");
coinsWithValidator.add("WAC");
coinsWithValidator.add("DEC");
// As of: 17.Sept 2017
Set<String> newlyAdded = new HashSet<>();
newlyAdded.add("PNC");
newlyAdded.add("WAC");
newlyAdded.add("ZEN");
newlyAdded.add("DEC");
CurrencyUtil.getAllSortedCryptoCurrencies().stream()
.forEach(e -> allCryptoCurrencies.add(e.getNameAndCode()));
StringBuilder sb2 = new StringBuilder("\nAll traded Crypto currencies:\n");
StringBuilder sb3 = new StringBuilder("\nNever traded Crypto currencies:\n");
map2.entrySet().stream()
.sorted((o1, o2) -> Integer.valueOf(o2.getValue().size()).compareTo(o1.getValue().size()))
.forEach(e -> sb2.append(e.getKey()).append(": ").append(e.getValue().size()).append("\n"));
.forEach(e -> {
final String key = e.getKey();
sb2.append(key).append(": ").append(e.getValue().size()).append("\n");
// key is: USD Tether (USDT)
String code = key.substring(key.indexOf("(")+1, key.length() - 1);
if (!coinsWithValidator.contains(code) && !newlyAdded.contains(code))
allCryptoCurrencies.remove(key);
});
log.error(sb2.toString());
// Not considered age of newly added coins, so take care with removal if coin was added recently.
allCryptoCurrencies.sort(String::compareTo);
allCryptoCurrencies.stream()
.forEach(e -> {
// key is: USD Tether (USDT)
String code = e.substring(e.indexOf("(") + 1, e.length() - 1);
if (!coinsWithValidator.contains(code) && !newlyAdded.contains(code))
sb3.append(e).append("\n");
});
log.error(sb3.toString());
}
}

View File

@ -35,8 +35,8 @@ import static com.google.common.base.Preconditions.checkNotNull;
public final class Preferences implements PersistedDataHost {
private static final ArrayList<BlockChainExplorer> BTC_MAIN_NET_EXPLORERS = new ArrayList<>(Arrays.asList(
new BlockChainExplorer("Tradeblock.com", "https://tradeblock.com/bitcoin/tx/", "https://tradeblock.com/bitcoin/address/"),
new BlockChainExplorer("Insight", "https://insight.bitpay.com/tx/", "https://insight.bitpay.com/address/"),
new BlockChainExplorer("Tradeblock", "https://tradeblock.com/bitcoin/tx/", "https://tradeblock.com/bitcoin/address/"),
new BlockChainExplorer("OXT", "https://oxt.me/transaction/", "https://oxt.me/address/"),
new BlockChainExplorer("Blockchain.info", "https://blockchain.info/tx/", "https://blockchain.info/address/"),
new BlockChainExplorer("Blockexplorer", "https://blockexplorer.com/tx/", "https://blockexplorer.com/address/"),
new BlockChainExplorer("Biteasy", "https://www.biteasy.com/transactions/", "https://www.biteasy.com/addresses/"),
@ -44,6 +44,8 @@ public final class Preferences implements PersistedDataHost {
new BlockChainExplorer("Chainflyer", "http://chainflyer.bitflyer.jp/Transaction/", "http://chainflyer.bitflyer.jp/Address/"),
new BlockChainExplorer("Smartbit", "https://www.smartbit.com.au/tx/", "https://www.smartbit.com.au/address/"),
new BlockChainExplorer("SoChain. Wow.", "https://chain.so/tx/BTC/", "https://chain.so/address/BTC/"),
new BlockChainExplorer("Bitaps", "https://bitaps.com/", "https://bitaps.com/"),
new BlockChainExplorer("Insight", "https://insight.bitpay.com/tx/", "https://insight.bitpay.com/address/"),
new BlockChainExplorer("Bitaps", "https://bitaps.com/", "https://bitaps.com/")
));
private static final ArrayList<BlockChainExplorer> BTC_TEST_NET_EXPLORERS = new ArrayList<>(Arrays.asList(
@ -54,6 +56,11 @@ public final class Preferences implements PersistedDataHost {
new BlockChainExplorer("SoChain. Wow.", "https://chain.so/tx/BTCTEST/", "https://chain.so/address/BTCTEST/")
));
public static final BlockChainExplorer BSQ_MAIN_NET_EXPLORER = new BlockChainExplorer("BSQ", "https://explorer.bisq.network/tx.html?tx=",
"https://explorer.bisq.network/Address.html?addr=");
public static final BlockChainExplorer BSQ_TEST_NET_EXPLORER = new BlockChainExplorer("BSQ", "https://explorer.bisq.network/testnet/tx.html?tx=",
"https://explorer.bisq.network/testnet/Address.html?addr=");
private static final ArrayList<BlockChainExplorer> LTC_MAIN_NET_EXPLORERS = new ArrayList<>(Arrays.asList(
new BlockChainExplorer("CryptoID", "https://chainz.cryptoid.info/ltc/tx.dws?", "https://chainz.cryptoid.info/ltc/address.dws?"),
new BlockChainExplorer("Abe Search", "http://explorer.litecoin.net/tx/", "http://explorer.litecoin.net/address/"),
@ -158,6 +165,7 @@ public final class Preferences implements PersistedDataHost {
@Override
public void readPersisted() {
PreferencesPayload persisted = storage.initAndGetPersistedWithFileName("PreferencesPayload");
final BaseCurrencyNetwork baseCurrencyNetwork = BisqEnvironment.getBaseCurrencyNetwork();
TradeCurrency preferredTradeCurrency;
if (persisted != null) {
prefPayload = persisted;
@ -179,7 +187,6 @@ public final class Preferences implements PersistedDataHost {
setFiatCurrencies(CurrencyUtil.getMainFiatCurrencies());
setCryptoCurrencies(CurrencyUtil.getMainCryptoCurrencies());
final BaseCurrencyNetwork baseCurrencyNetwork = BisqEnvironment.getBaseCurrencyNetwork();
switch (baseCurrencyNetwork.getCurrencyCode()) {
case "BTC":
setBlockChainExplorerMainNet(BTC_MAIN_NET_EXPLORERS.get(0));
@ -209,6 +216,7 @@ public final class Preferences implements PersistedDataHost {
prefPayload.setSellScreenCurrencyCode(preferredTradeCurrency.getCode());
}
prefPayload.setBsqBlockChainExplorer(baseCurrencyNetwork.isMainnet() ? BSQ_MAIN_NET_EXPLORER : BSQ_TEST_NET_EXPLORER);
// We don't want to pass Preferences to all popups where the dont show again checkbox is used, so we use
// that static lookup class to avoid static access to the Preferences directly.
@ -437,11 +445,6 @@ public final class Preferences implements PersistedDataHost {
persist();
}
public void setBsqBlockChainExplorer(BlockChainExplorer bsqBlockChainExplorer) {
prefPayload.setBsqBlockChainExplorer(bsqBlockChainExplorer);
persist();
}
public void setPayFeeInBtc(boolean payFeeInBtc) {
prefPayload.setPayFeeInBtc(payFeeInBtc);
persist();

View File

@ -32,8 +32,7 @@ public final class PreferencesPayload implements PersistableEnvelope {
private List<CryptoCurrency> cryptoCurrencies = new ArrayList<>();
private BlockChainExplorer blockChainExplorerMainNet;
private BlockChainExplorer blockChainExplorerTestNet;
private BlockChainExplorer bsqBlockChainExplorer = new BlockChainExplorer("BSQ", "https://explorer.bisq.io/tx.html?tx=",
"https://explorer.bisq.io/Address.html?addr=");
private BlockChainExplorer bsqBlockChainExplorer = Preferences.BSQ_MAIN_NET_EXPLORER;
@Nullable
private String backupDirectory;
private boolean autoSelectArbitrators = true;

View File

@ -41,7 +41,8 @@ public class UserPayloadModelVOTest {
UserPayload vo = new UserPayload();
vo.setAccountId("accountId");
vo.setDisplayedAlert(new Alert("message", true, "version", new byte[]{12, -64, 12}, "string", null));
vo.setDevelopersFilter(new Filter(Lists.newArrayList(), Lists.newArrayList(), Lists.newArrayList(), "string", new byte[]{10, 0, 0}, null));
vo.setDevelopersFilter(new Filter(Lists.newArrayList(), Lists.newArrayList(), Lists.newArrayList(),
Lists.newArrayList(), Lists.newArrayList(), "string", new byte[]{10, 0, 0}, null));
vo.setRegisteredArbitrator(ArbitratorTest.getArbitratorMock());
vo.setRegisteredMediator(MediatorTest.getMediatorMock());
vo.setAcceptedArbitrators(Lists.newArrayList(ArbitratorTest.getArbitratorMock()));

View File

@ -95,6 +95,7 @@ Build bisq
Now we have all prepared to build the correct bisq jar.
$ git clone https://github.com/bitsquare/bitsquare.git bisq
$ cd bisq
$ mvn clean package verify -DskipTests -Dmaven.javadoc.skip=true

View File

@ -4,10 +4,13 @@ regtest=1
txindex=1
#rpc
whitelist=127.0.0.1
rpcallowip=127.0.0.1
server=1
rpcuser=bisq
rpcpassword=bisqPW
# we want to test with 2 local apps so we need the output at 2 diff ports.
# Unix process substitution does not work from Bitcoin Core, so we use a bash script
blocknotify=bash /Users/dev/Library/Application\ Support/Bitcoin-rt/blocknotify %s
blocknotify=bash [PATH_TO_BTC_APP_DIR]/blocknotify %s

View File

@ -123,7 +123,7 @@ public class SystemTray {
aboutItem.addActionListener(e -> {
try {
UserThread.execute(() -> GUIUtil.openWebPage("https://bisq.io"));
UserThread.execute(() -> GUIUtil.openWebPage("https://bisq.network"));
} catch (Exception e1) {
e1.printStackTrace();
}

View File

@ -101,23 +101,21 @@ public class BisqApp extends Application {
private static final long LOG_MEMORY_PERIOD_MIN = 10;
private static BisqEnvironment bisqEnvironment;
private BisqAppModule bisqAppModule;
private Injector injector;
private boolean popupOpened;
private static Stage primaryStage;
private Scene scene;
private final List<String> corruptedDatabaseFiles = new ArrayList<>();
private MainView mainView;
public static Runnable shutDownHandler;
private boolean shutDownRequested;
private static Stage primaryStage;
public static void setEnvironment(BisqEnvironment bisqEnvironment) {
BisqApp.bisqEnvironment = bisqEnvironment;
}
private BisqAppModule bisqAppModule;
private Injector injector;
private boolean popupOpened;
private Scene scene;
private final List<String> corruptedDatabaseFiles = new ArrayList<>();
private MainView mainView;
private boolean shutDownRequested;
@SuppressWarnings("PointlessBooleanExpression")
@Override
public void start(Stage stage) throws IOException {

View File

@ -159,7 +159,7 @@ public class MainView extends InitializableView<StackPane, MainViewModel> {
});
}, 1);
}
HBox leftNavPane = new HBox(marketButton, buyButton, sellButton, portfolioButtonHolder, fundsButton, disputesButtonHolder) {{
setLeftAnchor(this, 10d);
setTopAnchor(this, 0d);
@ -330,7 +330,7 @@ public class MainView extends InitializableView<StackPane, MainViewModel> {
HBox.setMargin(btcAverageIconButton, new Insets(0, 5, 0, 0));
btcAverageIconButton.setOnAction(e -> GUIUtil.openWebPage("https://bitcoinaverage.com"));
btcAverageIconButton.setVisible(model.isFiatCurrencyPriceFeedSelected.get());
btcAverageIconButton.setManaged(model.isFiatCurrencyPriceFeedSelected.get());
btcAverageIconButton.setManaged(btcAverageIconButton.isVisible());
btcAverageIconButton.visibleProperty().bind(model.isFiatCurrencyPriceFeedSelected);
btcAverageIconButton.managedProperty().bind(model.isFiatCurrencyPriceFeedSelected);
btcAverageIconButton.setOnMouseEntered(e -> {
@ -354,7 +354,7 @@ public class MainView extends InitializableView<StackPane, MainViewModel> {
HBox.setMargin(poloniexIconButton, new Insets(2, 3, 0, 0));
poloniexIconButton.setOnAction(e -> GUIUtil.openWebPage("https://poloniex.com"));
poloniexIconButton.setVisible(model.isCryptoCurrencyPriceFeedSelected.get());
poloniexIconButton.setManaged(model.isCryptoCurrencyPriceFeedSelected.get());
poloniexIconButton.setManaged(poloniexIconButton.isVisible());
poloniexIconButton.visibleProperty().bind(model.isCryptoCurrencyPriceFeedSelected);
poloniexIconButton.managedProperty().bind(model.isCryptoCurrencyPriceFeedSelected);
poloniexIconButton.setOnMouseEntered(e -> {
@ -372,10 +372,28 @@ public class MainView extends InitializableView<StackPane, MainViewModel> {
Label label = new Label(Res.get("mainView.marketPrice.provider"));
label.setId("nav-balance-label");
label.setPadding(new Insets(0, 5, 0, 2));
label.visibleProperty().bind(createBooleanBinding(() -> model.isCryptoCurrencyPriceFeedSelected.get() || model.isFiatCurrencyPriceFeedSelected.get(),
model.isCryptoCurrencyPriceFeedSelected, model.isFiatCurrencyPriceFeedSelected));
label.visibleProperty().bind(createBooleanBinding(() -> model.isPriceAvailable.get() &&
(model.isCryptoCurrencyPriceFeedSelected.get() ||
model.isFiatCurrencyPriceFeedSelected.get() ||
!model.isExternallyProvidedPrice.get()),
model.isPriceAvailable,
model.isCryptoCurrencyPriceFeedSelected,
model.isFiatCurrencyPriceFeedSelected,
model.isExternallyProvidedPrice));
label.managedProperty().bind(label.visibleProperty());
model.isExternallyProvidedPrice.addListener((observable, oldValue, newValue) -> {
if (newValue) {
label.setText(Res.get("mainView.marketPrice.provider"));
label.setTooltip(null);
} else {
label.setText(Res.get("mainView.marketPrice.bisqInternalPrice"));
final Tooltip tooltip = new Tooltip(Res.get("mainView.marketPrice.tooltip.bisqInternalPrice"));
tooltip.setStyle("-fx-font-size: 12");
label.setTooltip(tooltip);
}
});
HBox hBox2 = new HBox();
hBox2.getChildren().setAll(label, btcAverageIconButton, poloniexIconButton);

View File

@ -37,6 +37,7 @@ import io.bisq.core.alert.PrivateNotificationManager;
import io.bisq.core.alert.PrivateNotificationPayload;
import io.bisq.core.app.AppOptionKeys;
import io.bisq.core.app.BisqEnvironment;
import io.bisq.core.app.SetupUtils;
import io.bisq.core.arbitration.ArbitratorManager;
import io.bisq.core.arbitration.Dispute;
import io.bisq.core.arbitration.DisputeManager;
@ -148,6 +149,8 @@ public class MainViewModel implements ViewModel {
final ObjectProperty<PriceFeedComboBoxItem> selectedPriceFeedComboBoxItemProperty = new SimpleObjectProperty<>();
final BooleanProperty isFiatCurrencyPriceFeedSelected = new SimpleBooleanProperty(true);
final BooleanProperty isCryptoCurrencyPriceFeedSelected = new SimpleBooleanProperty(false);
final BooleanProperty isExternallyProvidedPrice = new SimpleBooleanProperty(true);
final BooleanProperty isPriceAvailable = new SimpleBooleanProperty(false);
final StringProperty availableBalance = new SimpleStringProperty();
final StringProperty reservedBalance = new SimpleStringProperty();
final StringProperty lockedBalance = new SimpleStringProperty();
@ -190,7 +193,6 @@ public class MainViewModel implements ViewModel {
private BooleanProperty p2pNetWorkReady;
private final BooleanProperty walletInitialized = new SimpleBooleanProperty();
private boolean allBasicServicesInitialized;
private BooleanProperty loadEntryMapResult, checkCryptoSetupResult;
///////////////////////////////////////////////////////////////////////////////////////////
@ -255,81 +257,36 @@ public class MainViewModel implements ViewModel {
public void start() {
//noinspection ConstantConditions,ConstantConditions
bisqEnvironment.saveBaseCryptoNetwork(BisqEnvironment.getBaseCurrencyNetwork());
if (!preferences.isTacAccepted() && !DevEnv.DEV_MODE) {
UserThread.runAfter(() -> {
tacWindow.onAction(() -> {
preferences.setTacAccepted(true);
showSelectBaseCurrencyWindow();
checkIfLocalHostNodeIsRunning();
}).show();
}, 1);
} else {
showSelectBaseCurrencyWindow();
checkIfLocalHostNodeIsRunning();
}
}
private void showSelectBaseCurrencyWindow() {
String key = "showSelectBaseCurrencyWindowAtFistStartup";
if (preferences.showAgain(key)) {
bisqEnvironment.saveBaseCryptoNetwork(BisqEnvironment.getBaseCurrencyNetwork());
preferences.dontShowAgain(key, true);
showRevertIdCheckRequirement();
/* new SelectBaseCurrencyWindow()
.onSelect(baseCurrencyNetwork -> {
preferences.dontShowAgain(key, true);
final boolean hasChanged = !BisqEnvironment.getBaseCurrencyNetwork().equals(baseCurrencyNetwork);
bisqEnvironment.saveBaseCryptoNetwork(baseCurrencyNetwork);
if (hasChanged) {
new Popup().warning(Res.get("settings.net.needRestart"))
.onAction(() -> {
UserThread.runAfter(BisqApp.shutDownHandler::run, 500, TimeUnit.MILLISECONDS);
})
.actionButtonText(Res.get("shared.shutDown"))
.hideCloseButton()
.show();
}
})
.actionButtonText(Res.get("selectBaseCurrencyWindow.default", BisqEnvironment.getBaseCurrencyNetwork().getCurrencyName()))
.onAction(() -> {
bisqEnvironment.saveBaseCryptoNetwork(BisqEnvironment.getBaseCurrencyNetwork());
preferences.dontShowAgain(key, true);
showRevertIdCheckRequirement();
})
.hideCloseButton()
.show();*/
} else {
showRevertIdCheckRequirement();
}
}
private void startLoadEntryMap() {
log.info("startLoadEntryMap");
private void showRevertIdCheckRequirement() {
//TODO remove after v0.5.2
String key = "revertIdCheckRequirement";
if (preferences.showAgain(key) &&
user.getPaymentAccounts() != null &&
user.getPaymentAccounts().stream()
.filter(e -> e.getPaymentMethod().getId().equals(PaymentMethod.SEPA_ID) ||
e.getPaymentMethod().getId().equals(PaymentMethod.FASTER_PAYMENTS_ID) ||
e.getPaymentMethod().getId().equals(PaymentMethod.NATIONAL_BANK_ID) ||
e.getPaymentMethod().getId().equals(PaymentMethod.SAME_BANK_ID) ||
e.getPaymentMethod().getId().equals(PaymentMethod.SPECIFIC_BANKS_ID) ||
e.getPaymentMethod().getId().equals(PaymentMethod.CLEAR_X_CHANGE_ID) ||
e.getPaymentMethod().getId().equals(PaymentMethod.CHASE_QUICK_PAY_ID) ||
e.getPaymentMethod().getId().equals(PaymentMethod.INTERAC_E_TRANSFER_ID))
.findAny()
.isPresent()) {
new Popup<>().information(Res.get("popup.info.revertIdCheckRequirement")).show();
}
preferences.dontShowAgain(key, true);
checkIfLocalHostNodeIsRunning();
BooleanProperty result = SetupUtils.loadEntryMap(p2PService);
result.addListener((observable, oldValue, newValue) -> {
if (newValue)
startBasicServices();
});
// TODO can be removed in jdk 9
checkCryptoSetup();
}
private void startBasicServices() {
log.info("startBasicServices");
loadEntryMapResult = loadEntryMap();
checkCryptoSetupResult = checkCryptoSetup();
ChangeListener<Boolean> walletInitializedListener = (observable, oldValue, newValue) -> {
if (newValue && !p2pNetWorkReady.get())
showStartupTimeoutPopup();
@ -351,14 +308,12 @@ public class MainViewModel implements ViewModel {
initWalletService();
// need to store it to not get garbage collected
allServicesDone = EasyBind.combine(checkCryptoSetupResult, loadEntryMapResult, walletInitialized, p2pNetWorkReady,
(a, b, c, d) -> {
log.info("\ncheckCryptoSetupResult={}\n" +
"loadEntryMapResult={}\n" +
"walletInitialized={}\n" +
allServicesDone = EasyBind.combine(walletInitialized, p2pNetWorkReady,
(a, b) -> {
log.info("\nwalletInitialized={}\n" +
"p2pNetWorkReady={}",
a, b, c, d);
return a && b && c && d;
a, b);
return a && b;
});
allServicesDone.subscribe((observable, oldValue, newValue) -> {
if (newValue) {
@ -393,22 +348,6 @@ public class MainViewModel implements ViewModel {
// Initialisation
///////////////////////////////////////////////////////////////////////////////////////////
private BooleanProperty loadEntryMap() {
BooleanProperty result = new SimpleBooleanProperty();
Thread loadEntryMapThread = new Thread() {
@Override
public void run() {
Thread.currentThread().setName("loadEntryMapThread");
// Used to load different EntryMap files per base currency (EntryMap_BTC, EntryMap_LTC,...)
final String storageFileName = "EntryMap_" + BisqEnvironment.getBaseCurrencyNetwork().getCurrencyCode();
p2PService.readEntryMapFromResources(storageFileName);
UserThread.execute(() -> result.set(true));
}
};
loadEntryMapThread.start();
return result;
}
private BooleanProperty initP2PNetwork() {
log.info("initP2PNetwork");
@ -756,11 +695,11 @@ public class MainViewModel implements ViewModel {
log.info("Localhost peer detected.");
UserThread.execute(() -> {
bisqEnvironment.setBitcoinLocalhostNodeRunning(true);
startBasicServices();
startLoadEntryMap();
});
} catch (Throwable e) {
log.info("Localhost peer not detected.");
UserThread.execute(MainViewModel.this::startBasicServices);
UserThread.execute(MainViewModel.this::startLoadEntryMap);
} finally {
if (socket != null) {
try {
@ -1026,12 +965,13 @@ public class MainViewModel implements ViewModel {
String currencyCode = item.currencyCode;
MarketPrice marketPrice = priceFeedService.getMarketPrice(currencyCode);
String priceString;
if (marketPrice != null && marketPrice.isValid()) {
if (marketPrice != null && marketPrice.isPriceAvailable()) {
priceString = formatter.formatMarketPrice(marketPrice.getPrice(), currencyCode);
item.setIsPriceAvailable(true);
item.setPriceAvailable(true);
item.setExternallyProvidedPrice(marketPrice.isExternallyProvidedPrice());
} else {
priceString = Res.get("shared.na");
item.setIsPriceAvailable(false);
item.setPriceAvailable(false);
}
item.setDisplayString(formatter.getCurrencyPair(currencyCode) + ": " + priceString);
});
@ -1057,8 +997,10 @@ public class MainViewModel implements ViewModel {
UserThread.runAfter(() -> {
if (item != null) {
String code = item.currencyCode;
isFiatCurrencyPriceFeedSelected.set(CurrencyUtil.isFiatCurrency(code) && CurrencyUtil.getFiatCurrency(code).isPresent() && item.isPriceAvailable());
isCryptoCurrencyPriceFeedSelected.set(CurrencyUtil.isCryptoCurrency(code) && CurrencyUtil.getCryptoCurrency(code).isPresent() && item.isPriceAvailable());
isFiatCurrencyPriceFeedSelected.set(CurrencyUtil.isFiatCurrency(code) && CurrencyUtil.getFiatCurrency(code).isPresent() && item.isPriceAvailable() && item.isExternallyProvidedPrice());
isCryptoCurrencyPriceFeedSelected.set(CurrencyUtil.isCryptoCurrency(code) && CurrencyUtil.getCryptoCurrency(code).isPresent() && item.isPriceAvailable() && item.isExternallyProvidedPrice());
isExternallyProvidedPrice.set(item.isExternallyProvidedPrice());
isPriceAvailable.set(item.isPriceAvailable());
}
}, 100, TimeUnit.MILLISECONDS);
}

View File

@ -2,15 +2,18 @@ package io.bisq.gui.main;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import lombok.Getter;
import lombok.Setter;
public class PriceFeedComboBoxItem {
private static final Logger log = LoggerFactory.getLogger(PriceFeedComboBoxItem.class);
public final String currencyCode;
public final StringProperty displayStringProperty = new SimpleStringProperty();
@Setter
@Getter
private boolean isPriceAvailable;
@Setter
@Getter
private boolean isExternallyProvidedPrice;
public PriceFeedComboBoxItem(String currencyCode) {
this.currencyCode = currencyCode;
@ -19,12 +22,4 @@ public class PriceFeedComboBoxItem {
public void setDisplayString(String displayString) {
this.displayStringProperty.set(displayString);
}
public void setIsPriceAvailable(boolean isPriceAvailable) {
this.isPriceAvailable = isPriceAvailable;
}
public boolean isPriceAvailable() {
return isPriceAvailable;
}
}

View File

@ -19,6 +19,7 @@ package io.bisq.gui.main.dao;
import io.bisq.common.app.DevEnv;
import io.bisq.common.locale.Res;
import io.bisq.core.app.BisqEnvironment;
import io.bisq.gui.Navigation;
import io.bisq.gui.common.model.Activatable;
import io.bisq.gui.common.view.*;
@ -63,7 +64,7 @@ public class DaoView extends ActivatableViewAndModel<TabPane, Activatable> {
votingTab.setClosable(false);
root.getTabs().addAll(compensationTab, votingTab);
if (!DevEnv.DAO_PHASE2_ACTIVATED) {
if (BisqEnvironment.isDAOActivatedAndBaseCurrencySupportingBsq() && !DevEnv.DAO_PHASE2_ACTIVATED) {
votingTab.setDisable(true);
compensationTab.setDisable(true);
}

View File

@ -19,8 +19,8 @@ package io.bisq.gui.main.dao.wallet;
import de.jensd.fx.fontawesome.AwesomeDude;
import de.jensd.fx.fontawesome.AwesomeIcon;
import io.bisq.common.app.DevEnv;
import io.bisq.common.locale.Res;
import io.bisq.core.app.BisqEnvironment;
import io.bisq.gui.Navigation;
import io.bisq.gui.common.view.*;
import io.bisq.gui.main.MainView;
@ -83,7 +83,7 @@ public class BsqWalletView extends ActivatableViewAndModel {
leftVBox.getChildren().addAll(dashboard, send, receive, transactions);
// TODO just until DAO is enabled
if (!DevEnv.DAO_ACTIVATED) {
if (!BisqEnvironment.isDAOActivatedAndBaseCurrencySupportingBsq()) {
dashboard.setDisable(true);
send.setDisable(true);
transactions.setDisable(true);
@ -105,7 +105,7 @@ public class BsqWalletView extends ActivatableViewAndModel {
selectedViewClass = BsqDashboardView.class;
// TODO just until DAO is enabled
if (!DevEnv.DAO_ACTIVATED)
if (!BisqEnvironment.isDAOActivatedAndBaseCurrencySupportingBsq())
selectedViewClass = BsqReceiveView.class;
loadView(selectedViewClass);

View File

@ -17,45 +17,149 @@
package io.bisq.gui.main.dao.wallet.dashboard;
import de.jensd.fx.fontawesome.AwesomeIcon;
import io.bisq.common.locale.Res;
import io.bisq.common.monetary.Altcoin;
import io.bisq.common.monetary.Price;
import io.bisq.common.util.MathUtils;
import io.bisq.core.dao.blockchain.BsqBlockchainManager;
import io.bisq.core.dao.blockchain.BsqChainStateListener;
import io.bisq.core.dao.blockchain.parse.BsqChainState;
import io.bisq.core.provider.price.MarketPrice;
import io.bisq.core.provider.price.PriceFeedService;
import io.bisq.core.user.Preferences;
import io.bisq.gui.common.view.ActivatableView;
import io.bisq.gui.common.view.FxmlView;
import io.bisq.gui.components.HyperlinkWithIcon;
import io.bisq.gui.main.dao.wallet.BsqBalanceUtil;
import io.bisq.gui.util.BsqFormatter;
import io.bisq.gui.util.GUIUtil;
import io.bisq.gui.util.Layout;
import javafx.beans.value.ChangeListener;
import javafx.geometry.Insets;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.control.Tooltip;
import javafx.scene.layout.GridPane;
import org.bitcoinj.core.Coin;
import javax.inject.Inject;
@FxmlView
public class BsqDashboardView extends ActivatableView<GridPane, Void> {
import static io.bisq.gui.util.FormBuilder.addLabelTextField;
import static io.bisq.gui.util.FormBuilder.addTitledGroupBg;
private TextField balanceTextField;
@FxmlView
public class BsqDashboardView extends ActivatableView<GridPane, Void> implements BsqChainStateListener {
private final BsqBalanceUtil bsqBalanceUtil;
private final BsqBlockchainManager bsqBlockchainManager;
private final BsqChainState bsqChainState;
private final PriceFeedService priceFeedService;
private final Preferences preferences;
private final BsqFormatter bsqFormatter;
private int gridRow = 0;
private TextField issuedAmountTextField, availableAmountTextField, burntAmountTextField, allTxTextField,
burntTxTextField, spentTxTextField,
utxoTextField, priceTextField, marketCapTextField;
private ChangeListener<Number> priceChangeListener;
private HyperlinkWithIcon hyperlinkWithIcon;
///////////////////////////////////////////////////////////////////////////////////////////
// Constructor, lifecycle
///////////////////////////////////////////////////////////////////////////////////////////
@Inject
private BsqDashboardView(BsqBalanceUtil bsqBalanceUtil) {
private BsqDashboardView(BsqBalanceUtil bsqBalanceUtil, BsqBlockchainManager bsqBlockchainManager,
BsqChainState bsqChainState, PriceFeedService priceFeedService,
Preferences preferences, BsqFormatter bsqFormatter) {
this.bsqBalanceUtil = bsqBalanceUtil;
this.bsqBlockchainManager = bsqBlockchainManager;
this.bsqChainState = bsqChainState;
this.priceFeedService = priceFeedService;
this.preferences = preferences;
this.bsqFormatter = bsqFormatter;
}
@Override
public void initialize() {
gridRow = bsqBalanceUtil.addGroup(root, gridRow);
addTitledGroupBg(root, ++gridRow, 12, Res.get("dao.wallet.dashboard.statistics"), Layout.GROUP_DISTANCE);
addLabelTextField(root, gridRow, Res.get("dao.wallet.dashboard.genesisBlockHeight"),
String.valueOf(bsqChainState.getGenesisBlockHeight()), Layout.FIRST_ROW_AND_GROUP_DISTANCE);
Label label = new Label(Res.get("dao.wallet.dashboard.genesisTxId"));
GridPane.setRowIndex(label, ++gridRow);
root.getChildren().add(label);
hyperlinkWithIcon = new HyperlinkWithIcon(bsqChainState.getGenesisTxId(), AwesomeIcon.EXTERNAL_LINK);
hyperlinkWithIcon.setTooltip(new Tooltip(Res.get("tooltip.openBlockchainForTx", bsqChainState.getGenesisTxId())));
GridPane.setRowIndex(hyperlinkWithIcon, gridRow);
GridPane.setColumnIndex(hyperlinkWithIcon, 1);
GridPane.setMargin(hyperlinkWithIcon, new Insets(0, 0, 0, -4));
root.getChildren().add(hyperlinkWithIcon);
issuedAmountTextField = addLabelTextField(root, ++gridRow, Res.get("dao.wallet.dashboard.issuedAmount")).second;
availableAmountTextField = addLabelTextField(root, ++gridRow, Res.get("dao.wallet.dashboard.availableAmount")).second;
burntAmountTextField = addLabelTextField(root, ++gridRow, Res.get("dao.wallet.dashboard.burntAmount")).second;
allTxTextField = addLabelTextField(root, ++gridRow, Res.get("dao.wallet.dashboard.allTx")).second;
utxoTextField = addLabelTextField(root, ++gridRow, Res.get("dao.wallet.dashboard.utxo")).second;
spentTxTextField = addLabelTextField(root, ++gridRow, Res.get("dao.wallet.dashboard.spentTxo")).second;
burntTxTextField = addLabelTextField(root, ++gridRow, Res.get("dao.wallet.dashboard.burntTx")).second;
priceTextField = addLabelTextField(root, ++gridRow, Res.get("dao.wallet.dashboard.price")).second;
marketCapTextField = addLabelTextField(root, ++gridRow, Res.get("dao.wallet.dashboard.marketCap")).second;
priceChangeListener = (observable, oldValue, newValue) -> updatePrice();
}
@Override
protected void activate() {
bsqBalanceUtil.activate();
bsqBlockchainManager.addBsqChainStateListener(this);
priceFeedService.updateCounterProperty().addListener(priceChangeListener);
hyperlinkWithIcon.setOnAction(event -> GUIUtil.openWebPage(preferences.getBsqBlockChainExplorer().txUrl + bsqChainState.getGenesisTxId()));
onBsqChainStateChanged();
updatePrice();
}
@Override
protected void deactivate() {
bsqBalanceUtil.deactivate();
bsqBlockchainManager.removeBsqChainStateListener(this);
priceFeedService.updateCounterProperty().removeListener(priceChangeListener);
hyperlinkWithIcon.setOnAction(null);
}
@Override
public void onBsqChainStateChanged() {
issuedAmountTextField.setText(bsqFormatter.formatAmountWithGroupSeparatorAndCode(bsqChainState.getIssuedAmount()));
final Coin burntFee = bsqChainState.getTotalBurntFee();
final Coin availableAmount = bsqChainState.getIssuedAmount().subtract(burntFee);
availableAmountTextField.setText(bsqFormatter.formatAmountWithGroupSeparatorAndCode(availableAmount));
burntAmountTextField.setText(bsqFormatter.formatAmountWithGroupSeparatorAndCode(burntFee));
allTxTextField.setText(String.valueOf(bsqChainState.getTransactions().size()));
utxoTextField.setText(String.valueOf(bsqChainState.getUnspentTxOutputs().size()));
spentTxTextField.setText(String.valueOf(bsqChainState.getSpentTxOutputs().size()));
burntTxTextField.setText(String.valueOf(bsqChainState.getFeeTransactions().size()));
}
private void updatePrice() {
final Coin issuedAmount = bsqChainState.getIssuedAmount();
final MarketPrice bsqMarketPrice = priceFeedService.getMarketPrice("BSQ");
if (bsqMarketPrice != null) {
long bsqPrice = MathUtils.roundDoubleToLong(MathUtils.scaleUpByPowerOf10(bsqMarketPrice.getPrice(), Altcoin.SMALLEST_UNIT_EXPONENT));
priceTextField.setText(bsqFormatter.formatPrice(Price.valueOf("BSQ", bsqPrice)) + " BSQ/BTC");
marketCapTextField.setText(bsqFormatter.formatMarketCap(bsqMarketPrice, priceFeedService.getMarketPrice("USD"), issuedAmount));
}
}
}

View File

@ -410,8 +410,9 @@ public class OfferBookChartView extends ActivatableViewAndModel<VBox, OfferBookC
}
});
// Lets remove that as it is not really relevant and seems to be confusing to some users
// accumulated
TableColumn<OfferListItem, OfferListItem> accumulatedColumn = new TableColumn<>(Res.get("shared.sumWithCur", Res.getBaseCurrencyCode()));
/* TableColumn<OfferListItem, OfferListItem> accumulatedColumn = new TableColumn<>(Res.get("shared.sumWithCur", Res.getBaseCurrencyCode()));
accumulatedColumn.setMinWidth(100);
accumulatedColumn.setSortable(false);
accumulatedColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue()));
@ -431,9 +432,9 @@ public class OfferBookChartView extends ActivatableViewAndModel<VBox, OfferBookC
};
}
});
*/
if (direction == OfferPayload.Direction.BUY) {
tableView.getColumns().add(accumulatedColumn);
// tableView.getColumns().add(accumulatedColumn);
tableView.getColumns().add(volumeColumn);
tableView.getColumns().add(amountColumn);
tableView.getColumns().add(priceColumn);
@ -441,7 +442,7 @@ public class OfferBookChartView extends ActivatableViewAndModel<VBox, OfferBookC
tableView.getColumns().add(priceColumn);
tableView.getColumns().add(amountColumn);
tableView.getColumns().add(volumeColumn);
tableView.getColumns().add(accumulatedColumn);
//tableView.getColumns().add(accumulatedColumn);
}
tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);

View File

@ -146,7 +146,7 @@ class SpreadViewModel extends ActivatableViewModel {
// TODO maybe show extra colums with spread and use real amount diff
// not % based. e.g. diff between best buy and sell offer (of small amounts its a smaller gain)
if (spread != null && marketPrice != null && marketPrice.isValid()) {
if (spread != null && marketPrice != null && marketPrice.isPriceAvailable()) {
double marketPriceAsDouble = marketPrice.getPrice();
final double precision = isFiatCurrency ?
Math.pow(10, Fiat.SMALLEST_UNIT_EXPONENT) :

View File

@ -35,6 +35,7 @@ import io.bisq.core.btc.listeners.BalanceListener;
import io.bisq.core.btc.wallet.BsqBalanceListener;
import io.bisq.core.btc.wallet.BsqWalletService;
import io.bisq.core.btc.wallet.BtcWalletService;
import io.bisq.core.filter.FilterManager;
import io.bisq.core.offer.Offer;
import io.bisq.core.offer.OfferPayload;
import io.bisq.core.offer.OfferUtil;
@ -78,6 +79,7 @@ class CreateOfferDataModel extends ActivatableDataModel {
private final P2PService p2PService;
private final PriceFeedService priceFeedService;
final String shortOfferId;
private final FilterManager filterManager;
private final FeeService feeService;
private final BSFormatter formatter;
private final String offerId;
@ -127,7 +129,7 @@ class CreateOfferDataModel extends ActivatableDataModel {
@Inject
CreateOfferDataModel(OpenOfferManager openOfferManager, BtcWalletService btcWalletService, BsqWalletService bsqWalletService,
Preferences preferences, User user, KeyRing keyRing, P2PService p2PService,
PriceFeedService priceFeedService,
PriceFeedService priceFeedService, FilterManager filterManager,
FeeService feeService, BSFormatter formatter) {
this.openOfferManager = openOfferManager;
this.btcWalletService = btcWalletService;
@ -137,6 +139,7 @@ class CreateOfferDataModel extends ActivatableDataModel {
this.keyRing = keyRing;
this.p2PService = p2PService;
this.priceFeedService = priceFeedService;
this.filterManager = filterManager;
this.feeService = feeService;
this.formatter = formatter;
@ -347,6 +350,12 @@ class CreateOfferDataModel extends ActivatableDataModel {
checkArgument(buyerSecurityDepositAsCoin.compareTo(Restrictions.getMinBuyerSecurityDeposit()) >= 0,
"securityDeposit must be not be less than " +
Restrictions.getMinBuyerSecurityDeposit().toFriendlyString());
checkArgument(!filterManager.isCurrencyBanned(currencyCode),
Res.get("offerbook.warning.currencyBanned"));
checkArgument(!filterManager.isPaymentMethodBanned(paymentAccount.getPaymentMethod()),
Res.get("offerbook.warning.paymentMethodBanned"));
OfferPayload offerPayload = new OfferPayload(offerId,
new Date().getTime(),
p2PService.getAddress(),

View File

@ -194,7 +194,8 @@ public class CreateOfferView extends ActivatableViewAndModel<AnchorPane, CreateO
addListeners();
addSubscriptions();
sellerSecurityDepositTextField.setText(model.sellerSecurityDeposit);
if (sellerSecurityDepositTextField != null)
sellerSecurityDepositTextField.setText(model.sellerSecurityDeposit);
if (waitingForFundsBusyAnimation != null)
waitingForFundsBusyAnimation.play();
@ -372,7 +373,7 @@ public class CreateOfferView extends ActivatableViewAndModel<AnchorPane, CreateO
String key = "securityDepositInfo";
new Popup<>().backgroundInfo(Res.get("popup.info.securityDepositInfo"))
.actionButtonText(Res.get("shared.faq"))
.onAction(() -> GUIUtil.openWebPage("https://bisq.io/faq#6"))
.onAction(() -> GUIUtil.openWebPage("https://bisq.network/faq#6"))
.useIUnderstandButton()
.dontShowAgainId(key)
.show();
@ -495,8 +496,11 @@ public class CreateOfferView extends ActivatableViewAndModel<AnchorPane, CreateO
totalToPayTextField.textProperty().bind(model.totalToPay);
addressTextField.amountAsCoinProperty().bind(model.dataModel.getMissingCoin());
buyerSecurityDepositInputTextField.textProperty().bindBidirectional(model.buyerSecurityDeposit);
makerFeeTextField.textProperty().bind(model.makerFee);
makerFeeCurrencyLabel.textProperty().bind(model.makerFeeCurrencyCode);
if (model.dataModel.isBsqForFeeAvailable()) {
makerFeeTextField.textProperty().bind(model.makerFee);
makerFeeCurrencyLabel.textProperty().bind(model.makerFeeCurrencyCode);
}
// Validation
amountTextField.validationResultProperty().bind(model.amountValidationResult);
@ -545,8 +549,11 @@ public class CreateOfferView extends ActivatableViewAndModel<AnchorPane, CreateO
totalToPayTextField.textProperty().unbind();
addressTextField.amountAsCoinProperty().unbind();
buyerSecurityDepositInputTextField.textProperty().unbindBidirectional(model.buyerSecurityDeposit);
makerFeeTextField.textProperty().unbind();
makerFeeCurrencyLabel.textProperty().unbind();
if (model.dataModel.isBsqForFeeAvailable()) {
makerFeeTextField.textProperty().unbind();
makerFeeCurrencyLabel.textProperty().unbind();
}
// Validation
amountTextField.validationResultProperty().unbind();
@ -846,12 +853,19 @@ public class CreateOfferView extends ActivatableViewAndModel<AnchorPane, CreateO
}
private void addOptionsGroup() {
TitledGroupBg titledGroupBg = addTitledGroupBg(gridPane, ++gridRow, 3, Res.get("createOffer.feeCurrencyAndDeposit"), Layout.GROUP_DISTANCE);
GridPane.setColumnSpan(titledGroupBg, 3);
final boolean bsqForFeeAvailable = model.dataModel.isBsqForFeeAvailable();
final String title = bsqForFeeAvailable ?
Res.get("createOffer.feeCurrencyAndDeposit") : Res.get("createOffer.setDeposit");
TitledGroupBg titledGroupBg = addTitledGroupBg(gridPane, ++gridRow, bsqForFeeAvailable ? 3 : 2, title, Layout.GROUP_DISTANCE);
// GridPane.setColumnSpan(titledGroupBg, bsqForFeeAvailable ? 3 : 2);
if (bsqForFeeAvailable)
addMakerFeeRow();
addMakerFeeRow();
addBuyerSecurityDepositRow();
addSellerSecurityDepositRow();
// Let's hide that as the user cannot edit it anyway...
// addSellerSecurityDepositRow();
Tuple2<Button, Button> tuple = add2ButtonsAfterGroup(gridPane, ++gridRow,
Res.get("shared.nextStep"), Res.get("shared.cancel"));
@ -880,15 +894,20 @@ public class CreateOfferView extends ActivatableViewAndModel<AnchorPane, CreateO
int delay = 500;
int diff = 100;
transitions.fadeOutAndRemove(titledGroupBg, delay, (event) -> onShowPayFundsScreen());
delay -= diff;
transitions.fadeOutAndRemove(makerFeeTextLabel, delay);
transitions.fadeOutAndRemove(makerFeeRowHBox, delay);
if (model.dataModel.isBsqForFeeAvailable()) {
delay -= diff;
transitions.fadeOutAndRemove(makerFeeTextLabel, delay);
transitions.fadeOutAndRemove(makerFeeRowHBox, delay);
}
delay -= diff;
transitions.fadeOutAndRemove(buyerSecurityDepositLabel, delay);
transitions.fadeOutAndRemove(buyerSecurityDepositValueCurrencyBox, delay);
// We hide that, but leave it in code as it might be reconsidered to show it
/*
delay -= diff;
transitions.fadeOutAndRemove(sellerSecurityDepositLabel, delay);
transitions.fadeOutAndRemove(sellerSecurityDepositValueCurrencyBox, delay);
transitions.fadeOutAndRemove(sellerSecurityDepositValueCurrencyBox, delay);*/
}
});
}
@ -953,17 +972,21 @@ public class CreateOfferView extends ActivatableViewAndModel<AnchorPane, CreateO
}
private void addBuyerSecurityDepositRow() {
final double top = model.dataModel.isBsqForFeeAvailable() ? 0 : Layout.FIRST_ROW_AND_GROUP_DISTANCE;
buyerSecurityDepositLabel = addLabel(gridPane, ++gridRow,
Res.getWithCol("shared.securityDepositBox.description", Res.get("shared.buyer")),
0);
top);
Tuple3<HBox, InputTextField, Label> tuple = getEditableValueCurrencyBox(
Res.get("createOffer.securityDeposit.prompt"));
buyerSecurityDepositValueCurrencyBox = tuple.first;
buyerSecurityDepositInputTextField = tuple.second;
buyerSecurityDepositBtcLabel = tuple.third;
buyerSecurityDepositBtcLabel.setMinWidth(makerFeeCurrencyLabel.getMinWidth());
buyerSecurityDepositBtcLabel.setMaxWidth(makerFeeCurrencyLabel.getMaxWidth());
if (makerFeeCurrencyLabel != null) {
buyerSecurityDepositBtcLabel.setMinWidth(makerFeeCurrencyLabel.getMinWidth());
buyerSecurityDepositBtcLabel.setMaxWidth(makerFeeCurrencyLabel.getMaxWidth());
}
editOfferElements.add(buyerSecurityDepositInputTextField);
editOfferElements.add(buyerSecurityDepositBtcLabel);
@ -971,6 +994,7 @@ public class CreateOfferView extends ActivatableViewAndModel<AnchorPane, CreateO
GridPane.setRowIndex(buyerSecurityDepositValueCurrencyBox, gridRow);
GridPane.setColumnIndex(buyerSecurityDepositValueCurrencyBox, 1);
GridPane.setColumnSpan(buyerSecurityDepositValueCurrencyBox, 2);
GridPane.setMargin(buyerSecurityDepositValueCurrencyBox, new Insets(top, 0, 0, 0));
gridPane.getChildren().add(buyerSecurityDepositValueCurrencyBox);
}
@ -984,8 +1008,10 @@ public class CreateOfferView extends ActivatableViewAndModel<AnchorPane, CreateO
sellerSecurityDepositTextField = tuple.second;
sellerSecurityDepositTextField.setPrefWidth(buyerSecurityDepositInputTextField.getPrefWidth());
sellerSecurityDepositBtcLabel = tuple.third;
sellerSecurityDepositBtcLabel.setMinWidth(makerFeeCurrencyLabel.getMinWidth());
sellerSecurityDepositBtcLabel.setMaxWidth(makerFeeCurrencyLabel.getMaxWidth());
if (makerFeeCurrencyLabel != null) {
sellerSecurityDepositBtcLabel.setMinWidth(makerFeeCurrencyLabel.getMinWidth());
sellerSecurityDepositBtcLabel.setMaxWidth(makerFeeCurrencyLabel.getMaxWidth());
}
editOfferElements.add(sellerSecurityDepositTextField);
editOfferElements.add(buyerSecurityDepositBtcLabel);
@ -1285,20 +1311,22 @@ public class CreateOfferView extends ActivatableViewAndModel<AnchorPane, CreateO
}
private void updateFeeToggleButtons(boolean btcSelected) {
model.setCurrencyForMakerFeeBtc(btcSelected);
if (btcSelected || model.dataModel.isBsqForFeeAvailable()) {
if (!payFeeInBtcButton.isSelected() && btcSelected)
payFeeInBtcButton.setSelected(true);
if (payFeeInBsqButton.isSelected() && !btcSelected)
payFeeInBsqButton.setSelected(false);
if (model.dataModel.isBsqForFeeAvailable()) {
model.setCurrencyForMakerFeeBtc(btcSelected);
if (btcSelected || model.dataModel.isBsqForFeeAvailable()) {
if (!payFeeInBtcButton.isSelected() && btcSelected)
payFeeInBtcButton.setSelected(true);
if (payFeeInBsqButton.isSelected() && !btcSelected)
payFeeInBsqButton.setSelected(false);
payFeeInBtcButton.setMouseTransparent(btcSelected);
payFeeInBsqButton.setMouseTransparent(!btcSelected);
payFeeInBtcButton.setMouseTransparent(btcSelected);
payFeeInBsqButton.setMouseTransparent(!btcSelected);
payFeeInBtcButton.setStyle(btcSelected ?
"-fx-background-color: -bs-blue-transparent" : "-fx-background-color: -bs-very-light-grey");
payFeeInBsqButton.setStyle(!btcSelected ?
"-fx-background-color: -bs-blue-transparent" : "-fx-background-color: -bs-very-light-grey");
payFeeInBtcButton.setStyle(btcSelected ?
"-fx-background-color: -bs-blue-transparent" : "-fx-background-color: -bs-very-light-grey");
payFeeInBsqButton.setStyle(!btcSelected ?
"-fx-background-color: -bs-blue-transparent" : "-fx-background-color: -bs-very-light-grey");
}
}
}
@ -1328,7 +1356,7 @@ public class CreateOfferView extends ActivatableViewAndModel<AnchorPane, CreateO
if (model.isSellOffer())
addPayInfoEntry(infoGridPane, i++, Res.getWithCol("shared.tradeAmount"), model.tradeAmount.get());
addPayInfoEntry(infoGridPane, i++, Res.getWithCol("shared.securityDeposit"), model.getSecurityDepositInfo());
addPayInfoEntry(infoGridPane, i++, Res.getWithCol("shared.yourSecurityDeposit"), model.getSecurityDepositInfo());
addPayInfoEntry(infoGridPane, i++, Res.get("createOffer.fundsBox.offerFee"), model.getMakerFee());
addPayInfoEntry(infoGridPane, i++, Res.get("createOffer.fundsBox.networkFee"), model.getTxFee());
Separator separator = new Separator();

Some files were not shown because too many files have changed in this diff Show More