From ffa19210e07ab8c1feafe3efe97d4b5ac63cb82e Mon Sep 17 00:00:00 2001 From: CalDescent <> Date: Fri, 6 May 2022 11:43:17 +0100 Subject: [PATCH 01/33] Added support for coins with 2 address prefix bytes. Address derivation still needs more work for Pirate Chain (Zcash address format) --- qortal-ui-crypto/api/bitcoin/AltcoinHDWallet.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/qortal-ui-crypto/api/bitcoin/AltcoinHDWallet.js b/qortal-ui-crypto/api/bitcoin/AltcoinHDWallet.js index 2050c87e..0c7c70f8 100644 --- a/qortal-ui-crypto/api/bitcoin/AltcoinHDWallet.js +++ b/qortal-ui-crypto/api/bitcoin/AltcoinHDWallet.js @@ -687,8 +687,14 @@ export default class AltcoinHDWallet { * Derive Litecoin Legacy Address */ - // Append Address Prefix - const k = [this.versionBytes.mainnet.prefix].concat(...this.grandChildPublicKeyHash) + // Append Address Prefix + let prefix = [this.versionBytes.mainnet.prefix] + if (2 == this.versionBytes.mainnet.prefix.length) { + prefix = [this.versionBytes.mainnet.prefix[0]] + prefix.push([this.versionBytes.mainnet.prefix[1]]) + } + + const k = prefix.concat(...this.grandChildPublicKeyHash) // Derive Checksum const _addressCheckSum = new Sha256().process(new Sha256().process(new Uint8Array(k)).finish().result).finish().result From 9b4a763bcad46700ac95b2954ed8b6875811e9a8 Mon Sep 17 00:00:00 2001 From: CalDescent <> Date: Fri, 6 May 2022 12:03:47 +0100 Subject: [PATCH 02/33] Added Pirate Chain to wallet (unfinished) - Address derivation isn't working yet as it appears to be different for Zcash derived coins - Core APIs will be different for ARRR, and these aren't in place in the UI yet IMPORTANT: Do not use this branch for anything other than development, or coins could be lost. --- qortal-ui-core/src/plugins/routes.js | 14 + qortal-ui-crypto/api/PhraseWallet.js | 16 + qortal-ui-crypto/api/api.js | 2 +- qortal-ui-crypto/api/tradeRequest.js | 13 + .../plugins/core/wallet/wallet-app.src.js | 336 +++++++++++++++++- 5 files changed, 374 insertions(+), 7 deletions(-) diff --git a/qortal-ui-core/src/plugins/routes.js b/qortal-ui-core/src/plugins/routes.js index 2567d201..a546f0ad 100644 --- a/qortal-ui-core/src/plugins/routes.js +++ b/qortal-ui-core/src/plugins/routes.js @@ -22,6 +22,7 @@ const sendLtc = api.sendLtc const sendDoge = api.sendDoge const sendDgb = api.sendDgb const sendRvn = api.sendRvn +const sendArrr = api.sendArrr export const routes = { hello: async (req) => { @@ -361,4 +362,17 @@ export const routes = { } return response }, + + sendArrr: async (req) => { + let response + try { + const res = await sendArrr(req.data) + response = res + } catch (e) { + console.error(e) + console.error(e.message) + response = e.message + } + return response + }, } diff --git a/qortal-ui-crypto/api/PhraseWallet.js b/qortal-ui-crypto/api/PhraseWallet.js index 34929ee4..64baa02b 100644 --- a/qortal-ui-crypto/api/PhraseWallet.js +++ b/qortal-ui-crypto/api/PhraseWallet.js @@ -168,6 +168,21 @@ export default class PhraseWallet { } }).createWallet(new Uint8Array(rvnSeed), false, 'RVN'); + // Create Pirate Chain HD Wallet + const arrrSeed = [...addrSeed]; + const arrrWallet = new AltcoinHDWallet({ + mainnet: { + private: 0x0488ADE4, + public: 0x0488B21E, + prefix: [0x16, 0x9A] + }, + testnet: { + private: 0x04358394, + public: 0x043587CF, + prefix: [0x14, 0x51] + } + }).createWallet(new Uint8Array(arrrSeed), false, 'ARRR'); + this._addresses[nonce] = { address, btcWallet, @@ -175,6 +190,7 @@ export default class PhraseWallet { dogeWallet, dgbWallet, rvnWallet, + arrrWallet, qoraAddress, keyPair: { publicKey: addrKeyPair.publicKey, diff --git a/qortal-ui-crypto/api/api.js b/qortal-ui-crypto/api/api.js index 30ca6d27..bf40d58a 100644 --- a/qortal-ui-crypto/api/api.js +++ b/qortal-ui-crypto/api/api.js @@ -4,6 +4,6 @@ export { transactionTypes as transactions } from './transactions/transactions.js export { processTransaction, createTransaction, computeChatNonce, signChatTransaction, signArbitraryTransaction } from './createTransaction.js' -export { tradeBotCreateRequest, tradeBotRespondRequest, signTradeBotTxn, deleteTradeOffer, sendBtc, sendLtc, sendDoge, sendDgb, sendRvn } from './tradeRequest.js' +export { tradeBotCreateRequest, tradeBotRespondRequest, signTradeBotTxn, deleteTradeOffer, sendBtc, sendLtc, sendDoge, sendDgb, sendRvn, sendArrr } from './tradeRequest.js' export { cancelAllOffers } from './transactions/trade-portal/tradeoffer/cancelAllOffers.js' diff --git a/qortal-ui-crypto/api/tradeRequest.js b/qortal-ui-crypto/api/tradeRequest.js index fb4a2700..f3ae00f0 100644 --- a/qortal-ui-crypto/api/tradeRequest.js +++ b/qortal-ui-crypto/api/tradeRequest.js @@ -130,3 +130,16 @@ export const sendRvn = (requestObject) => { }) } +// Send ARRR +export const sendArrr = (requestObject) => { + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]; + + return request(`/crosschain/arrr/send?apiKey=${myNode.apiKey}`, { + method: 'POST', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + }, + body: JSON.stringify(requestObject) + }) +} diff --git a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js index 1ff75b59..5d968e62 100644 --- a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js +++ b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js @@ -25,7 +25,7 @@ import '@github/time-elements' const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) -const coinsNames = ['qort', 'btc', 'ltc', 'doge', 'dgb', 'rvn'] +const coinsNames = ['qort', 'btc', 'ltc', 'doge', 'dgb', 'rvn', 'arrr'] class MultiWallet extends LitElement { static get properties() { @@ -50,6 +50,8 @@ class MultiWallet extends LitElement { dgbAmount: { type: Number }, rvnRecipient: { type: String }, rvnAmount: { type: Number }, + arrrRecipient: { type: String }, + arrrAmount: { type: Number }, errorMessage: { type: String }, successMessage: { type: String }, sendMoneyLoading: { type: Boolean }, @@ -61,6 +63,7 @@ class MultiWallet extends LitElement { dogeFeePerByte: { type: Number }, dgbFeePerByte: { type: Number }, rvnFeePerByte: { type: Number }, + arrrFeePerByte: { type: Number }, balanceString: { type: String } } } @@ -261,7 +264,7 @@ class MultiWallet extends LitElement { } .wallet { - width: 170px; + width: 200px; height: 100vh; border-top-left-radius: inherit; border-bottom-left-radius: inherit; @@ -435,6 +438,10 @@ class MultiWallet extends LitElement { background-image: url('/img/rvn.png'); } + .arrr .currency-image { + background-image: url('/img/arrr.png'); + } + .card-list { margin-top: 20px; } @@ -569,6 +576,7 @@ class MultiWallet extends LitElement { this.dogeRecipient = '' this.dgbRecipient = '' this.rvnRecipient = '' + this.arrrRecipient = '' this.errorMessage = '' this.successMessage = '' this.sendMoneyLoading = false @@ -581,6 +589,7 @@ class MultiWallet extends LitElement { this.dogeAmount = 0 this.dgbAmount = 0 this.rvnAmount = 0 + this.arrrAmount = 0 this.btcFeePerByte = 100 this.btcSatMinFee = 20 this.btcSatMaxFee = 150 @@ -596,6 +605,9 @@ class MultiWallet extends LitElement { this.rvnFeePerByte = 1125 this.rvnSatMinFee = 1000 this.rvnSatMaxFee = 10000 + this.arrrFeePerByte = 8 + this.arrrSatMinFee = 1 + this.arrrSatMaxFee = 50 this.wallets = new Map() @@ -617,6 +629,7 @@ class MultiWallet extends LitElement { this.wallets.get('doge').wallet = window.parent.reduxStore.getState().app.selectedAddress.dogeWallet this.wallets.get('dgb').wallet = window.parent.reduxStore.getState().app.selectedAddress.dgbWallet this.wallets.get('rvn').wallet = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet + this.wallets.get('arrr').wallet = window.parent.reduxStore.getState().app.selectedAddress.arrWallet this._selectedWallet = 'qort' @@ -630,6 +643,7 @@ class MultiWallet extends LitElement { this.wallets.get('ltc').wallet = window.parent.reduxStore.getState().app.selectedAddress.ltcWallet this.wallets.get('doge').wallet = window.parent.reduxStore.getState().app.selectedAddress.dogeWallet this.wallets.get('dgb').wallet = window.parent.reduxStore.getState().app.selectedAddress.dgbWallet + this.wallets.get('arrr').wallet = window.parent.reduxStore.getState().app.selectedAddress.arrrWallet }) parentEpml.subscribe('copy_menu_switch', async (value) => { @@ -671,6 +685,10 @@ class MultiWallet extends LitElement {
Ravencoin
+
+
+
Pirate Chain
+
@@ -997,6 +1015,56 @@ class MultiWallet extends LitElement { + +
+

${translate("walletpage.wchange5")}

+
+
+
+ ${translate("walletpage.wchange6")} +
+
+ ${translate("walletpage.wchange40")} + ${this.selectedTransaction.arrrTxnFlow === 'OUT' ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} +
+ ${translate("walletpage.wchange9")} +
+
+ ${this.selectedTransaction.arrrSender} +
+ ${translate("walletpage.wchange10")} +
+
+ ${this.selectedTransaction.arrrReceiver} +
+ ${translate("walletpage.wchange12")} +
+
+ ${(this.selectedTransaction.feeAmount / 1e8).toFixed(8)} ARRR +
+ ${translate("walletpage.wchange37")} +
+
+ ${(this.selectedTransaction.totalAmount / 1e8).toFixed(8)} ARRR +
+ ${translate("walletpage.wchange14")} +
+
${new Date(this.selectedTransaction.timestamp).toString()}
+ ${translate("walletpage.wchange16")} +
+
+ ${this.selectedTransaction.txHash} +
+
+ + ${translate("general.close")} + +
+
@@ -1435,6 +1503,82 @@ class MultiWallet extends LitElement { ${translate("general.close")} + + +
+
+ +

${translate("walletpage.wchange17")} ARRR

+
+
+

+ ${translate("walletpage.wchange18")}:
+ ${this.getSelectedWalletAddress()} +

+

+ ${translate("walletpage.wchange19")}:
+ ${this.balanceString} +

+

+ + +

+

+ + +

+
+

+ ${translate("walletpage.wchange24")}: ${(this.arrrFeePerByte / 1e8).toFixed(8)} ARRR
L${translate("walletpage.wchange25")} +

+ + +
+

${this.errorMessage}

+

${this.successMessage}

+ ${this.sendMoneyLoading ? html` ` : ''} +
+
+ this.sendArrr()}> + + ${translate("walletpage.wchange17")} ARRR + +
+
+
+ + ${translate("general.close")} + +
` } @@ -1700,6 +1844,29 @@ class MultiWallet extends LitElement { checkSelectedTextAndShowMenu() }) + this.shadowRoot.getElementById('dgbRecipient').addEventListener('contextmenu', (event) => { + const getSelectedText = () => { + var text = '' + if (typeof window.getSelection != 'undefined') { + text = window.getSelection().toString() + } else if (typeof this.shadowRoot.selection != 'undefined' && this.shadowRoot.selection.type == 'Text') { + text = this.shadowRoot.selection.createRange().text + } + return text + } + const checkSelectedTextAndShowMenu = () => { + let selectedText = getSelectedText() + if (selectedText && typeof selectedText === 'string') { + } else { + this.pasteMenu(event, 'dgbRecipient') + this.isPasteMenuOpen = true + event.preventDefault() + event.stopPropagation() + } + } + checkSelectedTextAndShowMenu() + }) + this.shadowRoot.getElementById('rvnAmountInput').addEventListener('contextmenu', (event) => { const getSelectedText = () => { var text = '' @@ -1746,7 +1913,7 @@ class MultiWallet extends LitElement { checkSelectedTextAndShowMenu() }) - this.shadowRoot.getElementById('dgbRecipient').addEventListener('contextmenu', (event) => { + this.shadowRoot.getElementById('arrrAmountInput').addEventListener('contextmenu', (event) => { const getSelectedText = () => { var text = '' if (typeof window.getSelection != 'undefined') { @@ -1760,7 +1927,30 @@ class MultiWallet extends LitElement { let selectedText = getSelectedText() if (selectedText && typeof selectedText === 'string') { } else { - this.pasteMenu(event, 'dgbRecipient') + this.pasteMenu(event, 'arrrAmountInput') + this.isPasteMenuOpen = true + event.preventDefault() + event.stopPropagation() + } + } + checkSelectedTextAndShowMenu() + }) + + this.shadowRoot.getElementById('arrrRecipient').addEventListener('contextmenu', (event) => { + const getSelectedText = () => { + var text = '' + if (typeof window.getSelection != 'undefined') { + text = window.getSelection().toString() + } else if (typeof this.shadowRoot.selection != 'undefined' && this.shadowRoot.selection.type == 'Text') { + text = this.shadowRoot.selection.createRange().text + } + return text + } + const checkSelectedTextAndShowMenu = () => { + let selectedText = getSelectedText() + if (selectedText && typeof selectedText === 'string') { + } else { + this.pasteMenu(event, 'arrrRecipient') this.isPasteMenuOpen = true event.preventDefault() event.stopPropagation() @@ -2237,6 +2427,52 @@ class MultiWallet extends LitElement { this.showWallet() } + async sendArrr() { + const arrrAmount = this.shadowRoot.getElementById('arrrAmountInput').value + let arrrRecipient = this.shadowRoot.getElementById('arrrRecipient').value + const xprv58 = this.wallets.get(this._selectedWallet).wallet.derivedMasterPrivateKey + + this.sendMoneyLoading = true + this.btnDisable = true + + const makeRequest = async () => { + const opts = { + xprv58: xprv58, + receivingAddress: arrrRecipient, + ravencoinAmount: arrrAmount, + feePerByte: (this.arrrFeePerByte / 1e8).toFixed(8), + } + const response = await parentEpml.request('sendArrr', opts) + return response + } + + const manageResponse = (response) => { + if (response.length === 64) { + this.shadowRoot.getElementById('arrrAmountInput').value = 0 + this.shadowRoot.getElementById('arrrRecipient').value = '' + this.errorMessage = '' + this.arrrRecipient = '' + this.arrrAmount = 0 + this.successMessage = this.renderSuccessText() + this.sendMoneyLoading = false + this.btnDisable = false + } else if (response === false) { + this.errorMessage = this.renderFailText() + this.sendMoneyLoading = false + this.btnDisable = false + throw new Error(txnResponse) + } else { + this.errorMessage = response.message + this.sendMoneyLoading = false + this.btnDisable = false + throw new Error(response) + } + } + const res = await makeRequest() + manageResponse(res) + this.showWallet() + } + async showWallet() { this.transactionsDOM.hidden = true this.loading = true @@ -2289,6 +2525,7 @@ class MultiWallet extends LitElement { case 'doge': case 'dgb': case 'rvn': + case 'arrr': const walletName = `${coin}Wallet` parentEpml.request('apiCall', { url: `/crosschain/${coin}/walletbalance?apiKey=${this.getApiKey()}`, @@ -2343,6 +2580,8 @@ class MultiWallet extends LitElement { return html` this.openSendDgb()}> ${translate("walletpage.wchange17")} DGB` } else if ( this._selectedWallet === "rvn" ) { return html` this.openSendRvn()}> ${translate("walletpage.wchange17")} RVN` + } else if ( this._selectedWallet === "arrr" ) { + return html` this.openSendArrr()}> ${translate("walletpage.wchange17")} ARRR` } else { return html`` } @@ -2372,6 +2611,10 @@ class MultiWallet extends LitElement { this.shadowRoot.querySelector("#sendRvnDialog").show(); } + openSendArrr() { + this.shadowRoot.querySelector("#sendArrrDialog").show(); + } + changeTheme() { const checkTheme = localStorage.getItem('qortalTheme') if (checkTheme === 'dark') { @@ -2446,12 +2689,12 @@ class MultiWallet extends LitElement { }, { passive: true } ) - } else if (coin === 'dgb') { + } else if (coin === 'arrr') { this.transactionsGrid.addEventListener( 'click', (e) => { let dgbItem = this.transactionsGrid.getEventContext(e).item - this.showDgbTransactionDetails(dgbItem, this.wallets.get(this._selectedWallet).transactions) + this.showArrrTransactionDetails(dgbItem, this.wallets.get(this._selectedWallet).transactions) }, { passive: true } ) @@ -2474,6 +2717,8 @@ class MultiWallet extends LitElement { render(this.renderDgbTransactions(this.wallets.get(this._selectedWallet).transactions, this._selectedWallet), this.transactionsDOM) } else if (this._selectedWallet === 'rvn') { render(this.renderRvnTransactions(this.wallets.get(this._selectedWallet).transactions, this._selectedWallet), this.transactionsDOM) + } else if (this._selectedWallet === 'arrr') { + render(this.renderArrrTransactions(this.wallets.get(this._selectedWallet).transactions, this._selectedWallet), this.transactionsDOM) } } @@ -2859,6 +3104,71 @@ class MultiWallet extends LitElement { ` } + renderArrrTransactions(transactions, coin) { + return html` +
${translate("walletpage.wchange38")}
+ + { + render(html`check`, root) + }} + > + + { + render(html` ${translate("walletpage.wchange40")} ${data.item.amount > 0 ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} `, root) + }} + > + + + + { + const amount = (Number(data.item.totalAmount) / 1e8).toFixed(8) + render(html`${amount}`, root) + }} + > + + { + const time = new Date(data.item.timestamp * 1000) + render(html` `, root) + }} + > + + +
+ ` + } + async updateItemsFromPage(page, changeWallet = false) { if (page === undefined) { return @@ -3059,6 +3369,20 @@ class MultiWallet extends LitElement { }) } + showArrrTransactionDetails(myTransaction, allTransactions) { + allTransactions.forEach((transaction) => { + if (myTransaction.txHash === transaction.txHash) { + let arrrTxnFlow = myTransaction.inputs[0].address === this.wallets.get(this._selectedWallet).wallet.address ? 'OUT' : 'IN' + let arrrSender = myTransaction.inputs[0].address + let arrrReceiver = myTransaction.outputs[0].address + this.selectedTransaction = { ...transaction, arrrTxnFlow, arrrSender, arrrReceiver } + if (this.selectedTransaction.txHash.length != 0) { + this.shadowRoot.querySelector('#showArrrTransactionDetailsDialog').show() + } + } + }) + } + isEmptyArray(arr) { if (!arr) { return true From b2ecd7a3af56c7959808752b1661b13123ffb10b Mon Sep 17 00:00:00 2001 From: CalDescent <> Date: Fri, 6 May 2022 16:04:09 +0100 Subject: [PATCH 03/33] Send a base58 encoded, ARRR-specific seed derived from the master seed, to use as the entropy for the ARRR wallet seed in the core. This will need a lot of sanity checking before going live, as it may not be the best approach. --- .../api/bitcoin/AltcoinHDWallet.js | 3 ++ .../plugins/core/wallet/wallet-app.src.js | 42 +++++++++++++++++-- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/qortal-ui-crypto/api/bitcoin/AltcoinHDWallet.js b/qortal-ui-crypto/api/bitcoin/AltcoinHDWallet.js index 0c7c70f8..0d416d54 100644 --- a/qortal-ui-crypto/api/bitcoin/AltcoinHDWallet.js +++ b/qortal-ui-crypto/api/bitcoin/AltcoinHDWallet.js @@ -276,6 +276,8 @@ export default class AltcoinHDWallet { const privateKeyHash = seedHash.slice(0, 32); + this.seed58 = Base58.encode(privateKeyHash); + const _privateKeyHash = [...privateKeyHash] let privateKeyBigInt = BigInteger.fromByteArrayUnsigned(_privateKeyHash); @@ -865,6 +867,7 @@ export default class AltcoinHDWallet { derivedMasterPublicKey: this.masterPublicKey, _tDerivedMasterPrivateKey: this._tMasterPrivateKey, _tDerivedmasterPublicKey: this._tmasterPublicKey, + seed58: this.seed58, // derivedPrivateChildKey: this.xPrivateChildKey, // derivedPublicChildKey: this.xPublicChildKey, // derivedPrivateGrandChildKey: this.xPrivateGrandChildKey, diff --git a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js index 5d968e62..3ad60f5f 100644 --- a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js +++ b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js @@ -2430,14 +2430,14 @@ class MultiWallet extends LitElement { async sendArrr() { const arrrAmount = this.shadowRoot.getElementById('arrrAmountInput').value let arrrRecipient = this.shadowRoot.getElementById('arrrRecipient').value - const xprv58 = this.wallets.get(this._selectedWallet).wallet.derivedMasterPrivateKey + const seed58 = this.wallets.get(this._selectedWallet).wallet.seed58 this.sendMoneyLoading = true this.btnDisable = true const makeRequest = async () => { const opts = { - xprv58: xprv58, + xprv58: seed58, receivingAddress: arrrRecipient, ravencoinAmount: arrrAmount, feePerByte: (this.arrrFeePerByte / 1e8).toFixed(8), @@ -2525,7 +2525,6 @@ class MultiWallet extends LitElement { case 'doge': case 'dgb': case 'rvn': - case 'arrr': const walletName = `${coin}Wallet` parentEpml.request('apiCall', { url: `/crosschain/${coin}/walletbalance?apiKey=${this.getApiKey()}`, @@ -2562,6 +2561,43 @@ class MultiWallet extends LitElement { this.wallets.get(this._selectedWallet).transactions = sortedTransactions } break + case 'arrr': + const arrrWalletName = `${coin}Wallet` + parentEpml.request('apiCall', { + url: `/crosschain/${coin}/walletbalance?apiKey=${this.getApiKey()}`, + method: 'POST', + body: `${window.parent.reduxStore.getState().app.selectedAddress[arrrWalletName].seed58}`, + }) + .then((res) => { + if (isNaN(Number(res))) { + let snack5string = get("walletpage.wchange33") + let snack6string = get("walletpage.wchange34") + parentEpml.request('showSnackBar', `${snack5string} ${coin.toLocaleUpperCase()} ${snack6string}!`) + } else { + if (this._selectedWallet == coin) { + this.wallets.get(this._selectedWallet).balance = (Number(res) / 1e8).toFixed(8) + this.balanceString = this.wallets.get(this._selectedWallet).balance + " " + this._selectedWallet.toLocaleUpperCase() + this.balance = this.wallets.get(this._selectedWallet).balance + } + } + }) + + const arrrTxs = await parentEpml.request('apiCall', { + url: `/crosschain/${coin}/wallettransactions?apiKey=${this.getApiKey()}`, + method: 'POST', + body: `${window.parent.reduxStore.getState().app.selectedAddress[arrrWalletName].seed58}`, + }) + + const arrrCompareFn = (a, b) => { + return b.timestamp - a.timestamp + } + + const arrrSortedTransactions = arrrTxs.sort(arrrCompareFn) + console.log(arrrSortedTransactions) + if (this._selectedWallet == coin) { + this.wallets.get(this._selectedWallet).transactions = arrrSortedTransactions + } + break default: break } From 0c682d0cbc3b99e8190c951627f8f96a1e7d168a Mon Sep 17 00:00:00 2001 From: CalDescent <> Date: Fri, 6 May 2022 17:04:41 +0100 Subject: [PATCH 04/33] ARRR wallet now uses address returned by the core API. It would be great if we could derive the z addresses directly in the UI by the time this is released, but this is an alternative for now. --- .../plugins/core/wallet/wallet-app.src.js | 36 +++++++++++++++++-- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js index 3ad60f5f..d81042fb 100644 --- a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js +++ b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js @@ -53,6 +53,7 @@ class MultiWallet extends LitElement { arrrRecipient: { type: String }, arrrAmount: { type: Number }, errorMessage: { type: String }, + arrrWalletAddress: { type: String }, successMessage: { type: String }, sendMoneyLoading: { type: Boolean }, btnDisable: { type: Boolean }, @@ -577,6 +578,7 @@ class MultiWallet extends LitElement { this.dgbRecipient = '' this.rvnRecipient = '' this.arrrRecipient = '' + this.arrrWalletAddress = '' this.errorMessage = '' this.successMessage = '' this.sendMoneyLoading = false @@ -2484,6 +2486,7 @@ class MultiWallet extends LitElement { } } const coin = this._selectedWallet + await this.fetchWalletAddress(this._selectedWallet) await this.fetchWalletDetails(this._selectedWallet) if (this._selectedWallet == coin) { await this.renderTransactions() @@ -2603,6 +2606,27 @@ class MultiWallet extends LitElement { } } + async fetchWalletAddress(coin) { + switch (coin) { + case 'arrr': + const arrrWalletName = `${coin}Wallet` + let res = await parentEpml.request('apiCall', { + url: `/crosschain/${coin}/walletaddress?apiKey=${this.getApiKey()}`, + method: 'POST', + body: `${window.parent.reduxStore.getState().app.selectedAddress[arrrWalletName].seed58}`, + }) + if (res != null) { + this.arrrWalletAddress = res + console.log("this.arrrWalletAddress set to " + this.arrrWalletAddress) + } + break + + default: + // Not used for other coins yet + break + } + } + renderSendButton() { if ( this._selectedWallet === "qort" ) { return html` this.openSendQort()}> ${translate("walletpage.wchange17")} QORT` @@ -2673,9 +2697,15 @@ class MultiWallet extends LitElement { } getSelectedWalletAddress() { - return this._selectedWallet === 'qort' - ? this.wallets.get(this._selectedWallet).wallet.address - : this.wallets.get(this._selectedWallet).wallet.address + switch (this._selectedWallet) { + case "arrr": + // Use address returned by core API + return this.arrrWalletAddress + + default: + // Use locally derived address + return this.wallets.get(this._selectedWallet).wallet.address + } } async getTransactionGrid(coin) { From c64ee0aa11308fd81a3f657a94424b00bc2e5998 Mon Sep 17 00:00:00 2001 From: CalDescent <> Date: Sat, 7 May 2022 11:43:08 +0100 Subject: [PATCH 05/33] Removed fee slider from ARRR since fees are determined automatically by the wallet (currently 0.0001 ARRR per transaction, regardless of size) --- .../plugins/core/wallet/wallet-app.src.js | 22 +------------------ 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js index d81042fb..54cac360 100644 --- a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js +++ b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js @@ -64,7 +64,6 @@ class MultiWallet extends LitElement { dogeFeePerByte: { type: Number }, dgbFeePerByte: { type: Number }, rvnFeePerByte: { type: Number }, - arrrFeePerByte: { type: Number }, balanceString: { type: String } } } @@ -607,9 +606,6 @@ class MultiWallet extends LitElement { this.rvnFeePerByte = 1125 this.rvnSatMinFee = 1000 this.rvnSatMaxFee = 10000 - this.arrrFeePerByte = 8 - this.arrrSatMinFee = 1 - this.arrrSatMaxFee = 50 this.wallets = new Map() @@ -1545,22 +1541,6 @@ class MultiWallet extends LitElement { >

-
-

- ${translate("walletpage.wchange24")}: ${(this.arrrFeePerByte / 1e8).toFixed(8)} ARRR
L${translate("walletpage.wchange25")} -

- - -

${this.errorMessage}

${this.successMessage}

${this.sendMoneyLoading ? html` ` : ''} @@ -2442,7 +2422,7 @@ class MultiWallet extends LitElement { xprv58: seed58, receivingAddress: arrrRecipient, ravencoinAmount: arrrAmount, - feePerByte: (this.arrrFeePerByte / 1e8).toFixed(8), + //feePerByte: (this.arrrFeePerByte / 1e8).toFixed(8), // Not supported in ARRR } const response = await parentEpml.request('sendArrr', opts) return response From 686e65e512cd704ba67013b8328a35b0fadbce16 Mon Sep 17 00:00:00 2001 From: CalDescent <> Date: Sat, 7 May 2022 11:43:18 +0100 Subject: [PATCH 06/33] Fixed send coin request params --- qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js index 54cac360..72e58a24 100644 --- a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js +++ b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js @@ -2419,9 +2419,9 @@ class MultiWallet extends LitElement { const makeRequest = async () => { const opts = { - xprv58: seed58, + entropy58: seed58, receivingAddress: arrrRecipient, - ravencoinAmount: arrrAmount, + arrrAmount: arrrAmount, //feePerByte: (this.arrrFeePerByte / 1e8).toFixed(8), // Not supported in ARRR } const response = await parentEpml.request('sendArrr', opts) From 3eec5b0c5f3f7619f7a70afbfdd5a9ab81e362f5 Mon Sep 17 00:00:00 2001 From: CalDescent <> Date: Sat, 7 May 2022 11:43:26 +0100 Subject: [PATCH 07/33] Reduce log spam --- qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js | 1 - 1 file changed, 1 deletion(-) diff --git a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js index 72e58a24..c5d15795 100644 --- a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js +++ b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js @@ -2597,7 +2597,6 @@ class MultiWallet extends LitElement { }) if (res != null) { this.arrrWalletAddress = res - console.log("this.arrrWalletAddress set to " + this.arrrWalletAddress) } break From 2f2577f8494d2360384dc4e0a85997567d1535c0 Mon Sep 17 00:00:00 2001 From: QuickMythril Date: Fri, 6 May 2022 19:49:50 -0400 Subject: [PATCH 08/33] Added tx fee estimates to Trade Portal This can be updated with a more exact system later. --- .../core/trade-portal/trade-portal.src.js | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js b/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js index be67d43f..22dc2b27 100644 --- a/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js +++ b/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js @@ -239,7 +239,7 @@ class TradePortal extends LitElement { overflow: hidden; } - .you-have { + .amt-text { color: var(--tradehave); font-size: 15px; text-align: right; @@ -419,7 +419,8 @@ class TradePortal extends LitElement { name: "QORTAL", balance: "0", coinCode: "QORT", - coinAmount: this.amountString + coinAmount: this.amountString, + tradeFee: "0.002" } let litecoin = { @@ -434,7 +435,8 @@ class TradePortal extends LitElement { myOfferingOrders: [], openTradeOrders: null, tradeOffersSocketCounter: 1, - coinAmount: this.amountString + coinAmount: this.amountString, + tradeFee: "~0.00005" } let dogecoin = { @@ -449,7 +451,8 @@ class TradePortal extends LitElement { myOfferingOrders: [], openTradeOrders: null, tradeOffersSocketCounter: 1, - coinAmount: this.amountString + coinAmount: this.amountString, + tradeFee: "~0.005" } let digibyte = { @@ -687,7 +690,8 @@ class TradePortal extends LitElement { >

- ${translate("tradepage.tchange16")}: ${this.listedCoins.get(this.selectedCoin).balance} ${this.listedCoins.get(this.selectedCoin).coinCode} + ${translate("tradepage.tchange16")}: ${this.listedCoins.get(this.selectedCoin).balance} ${this.listedCoins.get(this.selectedCoin).coinCode} + ${translate("walletpage.wchange12")}: ${this.listedCoins.get(this.selectedCoin).tradeFee} ${this.listedCoins.get(this.selectedCoin).coinCode}
@@ -746,7 +750,8 @@ class TradePortal extends LitElement { >

- ${translate("tradepage.tchange16")}: ${this.listedCoins.get("QORTAL").balance} QORT + ${translate("tradepage.tchange16")}: ${this.listedCoins.get("QORTAL").balance} QORT + ${translate("walletpage.wchange12")}: ${this.listedCoins.get("QORTAL").tradeFee} QORT
From 8f7a8212dfce431103294d7bf08d19232a965cc7 Mon Sep 17 00:00:00 2001 From: QuickMythril Date: Sat, 7 May 2022 03:02:34 -0400 Subject: [PATCH 09/33] Update DGB/RVN to match master Added trade fees to new-coins since they were not part of the master branch. --- .../plugins/core/trade-portal/trade-portal.src.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js b/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js index 22dc2b27..5ef9ef91 100644 --- a/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js +++ b/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js @@ -467,7 +467,8 @@ class TradePortal extends LitElement { myOfferingOrders: [], openTradeOrders: null, tradeOffersSocketCounter: 1, - coinAmount: this.amountString + coinAmount: this.amountString, + tradeFee: "~0.0005" } let ravencoin = { @@ -482,7 +483,8 @@ class TradePortal extends LitElement { myOfferingOrders: [], openTradeOrders: null, tradeOffersSocketCounter: 1, - coinAmount: this.amountString + coinAmount: this.amountString, + tradeFee: "~0.006" } this.listedCoins = new Map() From cf53dfa695a608f699c3941b253eecdb900673a7 Mon Sep 17 00:00:00 2001 From: CalDescent <> Date: Sun, 8 May 2022 09:07:53 +0100 Subject: [PATCH 10/33] Show sync status of ARRR wallet in place of the balance, if not synced --- .../plugins/core/wallet/wallet-app.src.js | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js index c5d15795..04b22a7b 100644 --- a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js +++ b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js @@ -2478,9 +2478,9 @@ class MultiWallet extends LitElement { } async fetchWalletDetails(coin) { - this.balanceString = this.renderFetchText() switch (coin) { case 'qort': + this.balanceString = this.renderFetchText() parentEpml.request('apiCall', { url: `/addresses/balance/${this.wallets.get('qort').wallet.address}?apiKey=${this.getApiKey()}`, }) @@ -2508,6 +2508,7 @@ class MultiWallet extends LitElement { case 'doge': case 'dgb': case 'rvn': + this.balanceString = this.renderFetchText() const walletName = `${coin}Wallet` parentEpml.request('apiCall', { url: `/crosschain/${coin}/walletbalance?apiKey=${this.getApiKey()}`, @@ -2546,6 +2547,26 @@ class MultiWallet extends LitElement { break case 'arrr': const arrrWalletName = `${coin}Wallet` + + const res = await parentEpml.request('apiCall', { + url: `/crosschain/${coin}/syncstatus?apiKey=${this.getApiKey()}`, + method: 'POST', + body: `${window.parent.reduxStore.getState().app.selectedAddress[arrrWalletName].seed58}`, + }) + if (res !== null && res !== "Synchronized") { + // Not synchronized yet - display sync status instead of balance + this.balanceString = res; + + // Check again shortly after + await new Promise(resolve => setTimeout(resolve, 2000)); + window.setTimeout(this.fetchWalletDetails(this._selectedWallet), 1) + + // No need to make balance or transaction list calls yet + return + } + + this.balanceString = this.renderFetchText() + parentEpml.request('apiCall', { url: `/crosschain/${coin}/walletbalance?apiKey=${this.getApiKey()}`, method: 'POST', From affb69dcde5a2d7edfda714e6775df0416da8dbd Mon Sep 17 00:00:00 2001 From: CalDescent <> Date: Sun, 8 May 2022 09:13:07 +0100 Subject: [PATCH 11/33] Fixed console error --- qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js index 04b22a7b..0d7e617c 100644 --- a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js +++ b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js @@ -2559,7 +2559,7 @@ class MultiWallet extends LitElement { // Check again shortly after await new Promise(resolve => setTimeout(resolve, 2000)); - window.setTimeout(this.fetchWalletDetails(this._selectedWallet), 1) + this.fetchWalletDetails(coin) // No need to make balance or transaction list calls yet return From 40ab7fc31dcb15f96cdf4c70a93e372a22ace78b Mon Sep 17 00:00:00 2001 From: CalDescent <> Date: Sun, 8 May 2022 11:07:52 +0100 Subject: [PATCH 12/33] Added Pirate Chain to the trade portal (trading not functional yet) --- .../core/trade-portal/trade-portal.src.js | 109 +++++++++++++++++- 1 file changed, 108 insertions(+), 1 deletion(-) diff --git a/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js b/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js index 5ef9ef91..867effff 100644 --- a/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js +++ b/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js @@ -40,7 +40,8 @@ class TradePortal extends LitElement { isLoadingHistoricTrades: { type: Boolean }, isLoadingOpenTrades: { type: Boolean }, isLoadingMyOpenOrders: { type: Boolean }, - theme: { type: String, reflect: true } + theme: { type: String, reflect: true }, + arrrWalletAddress: { type: String }, } } @@ -354,6 +355,10 @@ class TradePortal extends LitElement { background-image: url('/img/qortrvn.png'); } + .arrr.coinName:before { + background-image: url('/img/qortarrr.png'); + } + .coinName { display: inline-block; height: 26px; @@ -487,12 +492,29 @@ class TradePortal extends LitElement { tradeFee: "~0.006" } + let piratechain = { + name: "PIRATECHAIN", + balance: "0", + coinCode: "ARRR", + openOrders: [], + openFilteredOrders: [], + historicTrades: [], + myOrders: [], + myHistoricTrades: [], + myOfferingOrders: [], + openTradeOrders: null, + tradeOffersSocketCounter: 1, + coinAmount: this.amountString, + tradeFee: "~0.0002" + } + this.listedCoins = new Map() this.listedCoins.set("QORTAL", qortal) this.listedCoins.set("LITECOIN", litecoin) this.listedCoins.set("DOGECOIN", dogecoin) this.listedCoins.set("DIGIBYTE", digibyte) this.listedCoins.set("RAVENCOIN", ravencoin) + this.listedCoins.set("PIRATECHAIN", piratechain) workers.set("QORTAL", { tradesConnectedWorker: null, @@ -519,6 +541,11 @@ class TradePortal extends LitElement { handleStuckTradesConnectedWorker: null }) + workers.set("PIRATECHAIN", { + tradesConnectedWorker: null, + handleStuckTradesConnectedWorker: null + }) + this.selectedCoin = "LITECOIN" this.selectedAddress = {} this.config = {} @@ -533,6 +560,7 @@ class TradePortal extends LitElement { this.isLoadingOpenTrades = true this.isLoadingMyOpenOrders = false this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light' + this.arrrWalletAddress = '' } // TODO: Move each template to a separate components! Maybe @@ -905,6 +933,7 @@ class TradePortal extends LitElement { QORT / DOGE QORT / DGB QORT / RVN + QORT / ARRR
@@ -945,6 +974,7 @@ class TradePortal extends LitElement { this.changeTheme() this.changeLanguage() this.updateWalletBalance() + this.fetchWalletAddress(this.selectedCoin) setTimeout(() => { this.displayTabContent('buy') @@ -1075,6 +1105,10 @@ class TradePortal extends LitElement { _url = `/crosschain/rvn/walletbalance?apiKey=${this.getApiKey()}` _body = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet.derivedMasterPublicKey break + case 'PIRATECHAIN': + _url = `/crosschain/arrr/walletbalance?apiKey=${this.getApiKey()}` + _body = window.parent.reduxStore.getState().app.selectedAddress.arrrWallet.seed58 + break default: break } @@ -1094,6 +1128,26 @@ class TradePortal extends LitElement { }) } + async fetchWalletAddress(coin) { + console.log("fetchWalletAddress: " + coin) + switch (coin) { + case 'PIRATECHAIN': + let res = await parentEpml.request('apiCall', { + url: `/crosschain/arrr/walletaddress?apiKey=${this.getApiKey()}`, + method: 'POST', + body: `${window.parent.reduxStore.getState().app.selectedAddress.arrrWallet.seed58}`, + }) + if (res != null) { + this.arrrWalletAddress = res + } + break + + default: + // Not used for other coins yet + break + } + } + setForeignCoin(coin) { let _this = this this.selectedCoin = coin @@ -1107,6 +1161,7 @@ class TradePortal extends LitElement { this.clearSellForm() this.clearBuyForm() this.updateWalletBalance() + this.fetchWalletAddress(coin) } displayTabContent(tab) { @@ -1538,6 +1593,49 @@ class TradePortal extends LitElement { }) } + /** + * PirateChainACCTv1 TRADEBOT STATES + * - BOB_WAITING_FOR_AT_CONFIRM + * - BOB_WAITING_FOR_MESSAGE + * - BOB_WAITING_FOR_AT_REDEEM + * - BOB_DONE + * - BOB_REFUNDED + * - ALICE_WAITING_FOR_AT_LOCK + * - ALICE_DONE + * - ALICE_REFUNDING_A + * - ALICE_REFUNDED + * + * @param {[{}]} states + */ + + const PirateChainACCTv1 = (states) => { + // Reverse the states + states.reverse() + states.forEach((state) => { + if (state.creatorAddress === this.selectedAddress.address) { + if (state.tradeState == 'BOB_WAITING_FOR_AT_CONFIRM') { + this.changeTradeBotState(state, 'PENDING') + } else if (state.tradeState == 'BOB_WAITING_FOR_MESSAGE') { + this.changeTradeBotState(state, 'LISTED') + } else if (state.tradeState == 'BOB_WAITING_FOR_AT_REDEEM') { + this.changeTradeBotState(state, 'TRADING') + } else if (state.tradeState == 'BOB_DONE') { + this.handleCompletedState(state) + } else if (state.tradeState == 'BOB_REFUNDED') { + this.handleCompletedState(state) + } else if (state.tradeState == 'ALICE_WAITING_FOR_AT_LOCK') { + this.changeTradeBotState(state, 'BUYING') + } else if (state.tradeState == 'ALICE_DONE') { + this.handleCompletedState(state) + } else if (state.tradeState == 'ALICE_REFUNDING_A') { + this.changeTradeBotState(state, 'REFUNDING') + } else if (state.tradeState == 'ALICE_REFUNDED') { + this.handleCompletedState(state) + } + } + }) + } + switch (this.selectedCoin) { case 'BITCOIN': BitcoinACCTv1(tradeStates) @@ -1554,6 +1652,9 @@ class TradePortal extends LitElement { case 'RAVENCOIN': RavencoinACCTv1(tradeStates) break + case 'PIRATECHAIN': + PirateChainACCTv1(tradeStates) + break default: break } @@ -1849,6 +1950,9 @@ class TradePortal extends LitElement { case 'RAVENCOIN': _receivingAddress = this.selectedAddress.rvnWallet.address break + case 'PIRATECHAIN': + _receivingAddress = this.arrrWalletAddress + break default: break } @@ -1915,6 +2019,9 @@ class TradePortal extends LitElement { case 'RAVENCOIN': _foreignKey = this.selectedAddress.rvnWallet.derivedMasterPrivateKey break + case 'PIRATECHAIN': + _foreignKey = this.selectedAddress.arrrWallet.seed58 + break default: break } From 37e0a37f59caee1501765e7adea86a1dc56b4e76 Mon Sep 17 00:00:00 2001 From: CalDescent <> Date: Fri, 15 Jul 2022 12:29:52 +0100 Subject: [PATCH 13/33] Fixed UI wallet display bug introduced in ARRR support. --- qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js index 9076e784..23241464 100644 --- a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js +++ b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js @@ -2650,13 +2650,16 @@ class MultiWallet extends LitElement { method: 'POST', body: `${window.parent.reduxStore.getState().app.selectedAddress[arrrWalletName].seed58}`, }) + if (coin != this._selectedWallet) { + // We've switched away from this coin + } if (res !== null && res !== "Synchronized") { // Not synchronized yet - display sync status instead of balance this.balanceString = res; // Check again shortly after await new Promise(resolve => setTimeout(resolve, 2000)); - this.fetchWalletDetails(coin) + this.showWallet() // No need to make balance or transaction list calls yet return From 08be256f1a978dbd1d2cc2873c3e6d57715469c4 Mon Sep 17 00:00:00 2001 From: CalDescent <> Date: Fri, 15 Jul 2022 15:01:46 +0100 Subject: [PATCH 14/33] Fixed issue causing the time to show as "now" in the transaction list for Pirate Chain --- qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js index 3304d972..df1c8647 100644 --- a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js +++ b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js @@ -3347,7 +3347,7 @@ class MultiWallet extends LitElement { resizable header="${translate("walletpage.wchange14")}" .renderer=${(root, column, data) => { - const time = new Date(data.item.timestamp * 1000) + const time = new Date(data.item.timestamp) render(html` `, root) }} > From 67c40ee3801b8b01a9473273607358be852cddd8 Mon Sep 17 00:00:00 2001 From: CalDescent <> Date: Fri, 15 Jul 2022 15:36:16 +0100 Subject: [PATCH 15/33] Move QR code to the right, as a quick fix to avoid overlapping ARRR sapling address. We might need to rethink the layout of this screen. --- qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js index df1c8647..16bae5fb 100644 --- a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js +++ b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js @@ -510,7 +510,7 @@ class MultiWallet extends LitElement { .qrcode-pos { margin-top: -180px; - margin-left: 425px; + margin-left: 800px; } @media (max-width: 863px) { From 4d15d5df40bec5fb0e454eefd734cf7d5b91bdd3 Mon Sep 17 00:00:00 2001 From: CalDescent <> Date: Sat, 13 Aug 2022 09:48:52 +0100 Subject: [PATCH 16/33] Temporarily show all trade portal offers, for ARRR testing. Revert this. --- qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js b/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js index a277240d..f20ece60 100644 --- a/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js +++ b/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js @@ -643,7 +643,7 @@ class TradePortal extends LitElement {
${translate("tradepage.tchange5")}
${translate("login.loading")}
- + Date: Sat, 13 Aug 2022 11:32:45 +0100 Subject: [PATCH 17/33] Fixed display error when ARRR wallet address isn't available yet. --- qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js | 2 +- qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js b/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js index f20ece60..ea52ee51 100644 --- a/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js +++ b/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js @@ -1183,7 +1183,7 @@ class TradePortal extends LitElement { method: 'POST', body: `${window.parent.reduxStore.getState().app.selectedAddress.arrrWallet.seed58}`, }) - if (res != null) { + if (res != null && res.error != 1201) { this.arrrWalletAddress = res } break diff --git a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js index 16bae5fb..bb5b3751 100644 --- a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js +++ b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js @@ -2725,7 +2725,7 @@ class MultiWallet extends LitElement { method: 'POST', body: `${window.parent.reduxStore.getState().app.selectedAddress[arrrWalletName].seed58}`, }) - if (res != null) { + if (res != null && res.error != 1201) { this.arrrWalletAddress = res } break From 04b2be70077a9721a8860f0db68039d20b8d2a8f Mon Sep 17 00:00:00 2001 From: proto <34919827+protoniuman@users.noreply.github.com> Date: Mon, 8 Aug 2022 15:41:08 +0100 Subject: [PATCH 18/33] Filtering offers based on foreign chain fixed an issue with websocket offers being shown even though it's not the correct selected coin --- .../core/trade-portal/trade-portal.src.js | 199 ++++++++++-------- 1 file changed, 117 insertions(+), 82 deletions(-) diff --git a/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js b/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js index ea52ee51..f2fc6da3 100644 --- a/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js +++ b/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js @@ -1254,106 +1254,142 @@ class TradePortal extends LitElement { } processOfferingTrade(offer) { - const offerItem = { - ...offer, - qortAmount: parseFloat(offer.qortAmount), - price: parseFloat(offer.foreignAmount) / parseFloat(offer.qortAmount), - } - const addOffer = () => { - this.listedCoins.get(this.selectedCoin).openOrders.unshift(offerItem) - } - const initOffer = () => { - this.listedCoins.get(this.selectedCoin).openOrders.push(offerItem) + try{ + if(this.listedCoins.get(offer.foreignBlockchain).name!=''){//check if the foreignBlockchain value is part of supported blockchains + const offerItem = { + ...offer, + qortAmount: parseFloat(offer.qortAmount), + price: parseFloat(offer.foreignAmount) / parseFloat(offer.qortAmount), + } + const addOffer = () => { + this.listedCoins.get(offer.foreignBlockchain).openOrders.unshift(offerItem) + } + const initOffer = () => { + this.listedCoins.get(offer.foreignBlockchain).openOrders.push(offerItem) + } + this.listedCoins.get(offer.foreignBlockchain).openOrders.length === 0 ? initOffer() : addOffer() + this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._openOrdersGrid.clearCache() : null + } + }catch(e){ + console.log("Error adding offer from "+offer.foreignBlockchain) } - this.listedCoins.get(this.selectedCoin).openOrders.length === 0 ? initOffer() : addOffer() - this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter > 1 ? this._openOrdersGrid.clearCache() : null } processRedeemedTrade(offer) { - // If trade is mine, add it to my historic trades and also add it to historic trades - if (offer.qortalCreator === this.selectedAddress.address) { - // Check and Update Wallet Balance - if (this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter > 1) { - this.updateWalletBalance() - } - const offerItem = { - ...offer, - mode: 'SOLD', - } - // Add to my historic trades - this._myHistoricTradesGrid.items.unshift(offerItem) - this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter > 1 ? this._myHistoricTradesGrid.clearCache() : null - } else if (offer.partnerQortalReceivingAddress === this.selectedAddress.address) { - // Check and Update Wallet Balance - if (this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter > 1) { - this.updateWalletBalance() - } - const offerItem = { - ...offer, - mode: 'BOUGHT', + try{ + if(this.listedCoins.get(offer.foreignBlockchain).name!=''){//check if the foreignBlockchain value is part of supported blockchains + + // If trade is mine, add it to my historic trades and also add it to historic trades + if (offer.qortalCreator === this.selectedAddress.address) { + // Check and Update Wallet Balance + if (this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1) { + this.updateWalletBalance() + } + const offerItem = { + ...offer, + mode: 'SOLD', + } + // Add to my historic trades + this._myHistoricTradesGrid.items.unshift(offerItem) + this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._myHistoricTradesGrid.clearCache() : null + } else if (offer.partnerQortalReceivingAddress === this.selectedAddress.address) { + // Check and Update Wallet Balance + if (this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1) { + this.updateWalletBalance() + } + const offerItem = { + ...offer, + mode: 'BOUGHT', + } + // Add to my historic trades + this._myHistoricTradesGrid.items.unshift(offerItem) + this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._myHistoricTradesGrid.clearCache() : null + } + // Add to historic trades + const addNewHistoricTrade = () => { + this._historicTradesGrid.items.unshift(offer) + this._historicTradesGrid.clearCache() + } + this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? addNewHistoricTrade() : null + } - // Add to my historic trades - this._myHistoricTradesGrid.items.unshift(offerItem) - this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter > 1 ? this._myHistoricTradesGrid.clearCache() : null + }catch(e){ + console.log("Error processing redeemed trade offer from "+offer.foreignBlockchain) } - // Add to historic trades - const addNewHistoricTrade = () => { - this._historicTradesGrid.items.unshift(offer) - this._historicTradesGrid.clearCache() - } - this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter > 1 ? addNewHistoricTrade() : null } processTradingTrade(offer) { - // Remove from open market orders - if (offer.qortalCreator === this.selectedAddress.address && this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter > 1) { - // Check and Update Wallet Balance - this.updateWalletBalance() - } - this._openOrdersGrid.items.forEach((item, index) => { - if (item.qortalAtAddress === offer.qortalAtAddress) { - this._openOrdersGrid.items.splice(index, 1) - this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter > 1 ? this._openOrdersGrid.clearCache() : null + try{ + if(this.listedCoins.get(offer.foreignBlockchain).name!=''){//check if the foreignBlockchain value is part of supported blockchains + + // Remove from open market orders + if (offer.qortalCreator === this.selectedAddress.address && this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1) { + // Check and Update Wallet Balance + this.updateWalletBalance() + } + this._openOrdersGrid.items.forEach((item, index) => { + if (item.qortalAtAddress === offer.qortalAtAddress) { + this._openOrdersGrid.items.splice(index, 1) + this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._openOrdersGrid.clearCache() : null + } + }) + this.listedCoins.get(offer.foreignBlockchain).openOrders = this.listedCoins.get(offer.foreignBlockchain).openOrders.filter((order) => order.qortalAtAddress !== offer.qortalAtAddress) } - }) - this.listedCoins.get(this.selectedCoin).openOrders = this.listedCoins.get(this.selectedCoin).openOrders.filter((order) => order.qortalAtAddress !== offer.qortalAtAddress) + }catch(e){ + console.log("Error processing trading trade offer from "+offer.foreignBlockchain) + } } processRefundedTrade(offer) { - if (offer.qortalCreator === this.selectedAddress.address) { - // Check and Update Wallet Balance - if (this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter > 1) { - this.updateWalletBalance() + try{ + if(this.listedCoins.get(offer.foreignBlockchain).name!=''){//check if the foreignBlockchain value is part of supported blockchains + + if (offer.qortalCreator === this.selectedAddress.address) { + // Check and Update Wallet Balance + if (this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1) { + this.updateWalletBalance() + } + // Add to my historic trades + this._myHistoricTradesGrid.items.unshift(offer) + this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._myHistoricTradesGrid.clearCache() : null } - // Add to my historic trades - this._myHistoricTradesGrid.items.unshift(offer) - this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter > 1 ? this._myHistoricTradesGrid.clearCache() : null + + } + }catch(e){ + console.log("Error processing refunded trade offer from "+offer.foreignBlockchain) } } processCancelledTrade(offer) { - if (offer.qortalCreator === this.selectedAddress.address) { - // Check and Update Wallet Balance - if (this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter > 1) { - this.updateWalletBalance() - } - // Add to my historic trades - this._myHistoricTradesGrid.items.unshift(offer) - this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter > 1 ? this._myHistoricTradesGrid.clearCache() : null - } - this._openOrdersGrid.items.forEach((item, index) => { - if (item.qortalAtAddress === offer.qortalAtAddress) { - this._openOrdersGrid.items.splice(index, 1) - this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter > 1 ? this._openOrdersGrid.clearCache() : null - } - }) - this.listedCoins.get(this.selectedCoin).openOrders = this.listedCoins.get(this.selectedCoin).openOrders.filter((order) => order.qortalAtAddress !== offer.qortalAtAddress) - this._stuckOrdersGrid.items.forEach((item, index) => { - if (item.qortalAtAddress === offer.qortalAtAddress) { - this._stuckOrdersGrid.items.splice(index, 1) - this._stuckOrdersGrid.clearCache() + try{ + if(this.listedCoins.get(offer.foreignBlockchain).name!=''){//check if the foreignBlockchain value is part of supported blockchains + + if (offer.qortalCreator === this.selectedAddress.address) { + // Check and Update Wallet Balance + if (this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1) { + this.updateWalletBalance() + } + // Add to my historic trades + this._myHistoricTradesGrid.items.unshift(offer) + this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._myHistoricTradesGrid.clearCache() : null + } + this._openOrdersGrid.items.forEach((item, index) => { + if (item.qortalAtAddress === offer.qortalAtAddress) { + this._openOrdersGrid.items.splice(index, 1) + this.listedCoins.get(offer.foreignBlockchain).tradeOffersSocketCounter > 1 ? this._openOrdersGrid.clearCache() : null + } + }) + this.listedCoins.get(offer.foreignBlockchain).openOrders = this.listedCoins.get(offer.foreignBlockchain).openOrders.filter((order) => order.qortalAtAddress !== offer.qortalAtAddress) + this._stuckOrdersGrid.items.forEach((item, index) => { + if (item.qortalAtAddress === offer.qortalAtAddress) { + this._stuckOrdersGrid.items.splice(index, 1) + this._stuckOrdersGrid.clearCache() + } + }) } - }) + }catch(e){ + console.log("Error processing cancelled trade offer from "+offer.foreignBlockchain) + } } /** @@ -1369,7 +1405,6 @@ class TradePortal extends LitElement { offers.forEach((offer) => { if (offer.mode === 'OFFERING') { this.processOfferingTrade(offer) - this.listedCoins.get(this.selectedCoin).tradeOffersSocketCounter > 1 ? this._openOrdersGrid.clearCache() : null } else if (offer.mode === 'REDEEMED') { this.processRedeemedTrade(offer) } else if (offer.mode === 'TRADING') { From 01c214cf4bbd5367b2af6be08fb9fe5c5a0ab823 Mon Sep 17 00:00:00 2001 From: CalDescent <> Date: Mon, 15 Aug 2022 20:13:31 +0100 Subject: [PATCH 19/33] Added QORT/ARRR trade pair image --- img/qortarrr.png | Bin 0 -> 3750 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 img/qortarrr.png diff --git a/img/qortarrr.png b/img/qortarrr.png new file mode 100644 index 0000000000000000000000000000000000000000..db1b2b6c126b62f92adccfac667b52a93cc72f44 GIT binary patch literal 3750 zcmZu!c{~(c_qSykTb3GIwwY3v8GDSOFtU`f@5E#V!;E!=?1d~dA`)4PMD`^qYh))O zWt4p%YuSl@JkRsK?{B-G&$;)UbH8W#p8MC0F+^&!0{8$_R8*|GItb&FQ|d(c80k-T z5N7z%$wBR7tgS&+`bl8v#9;E&vGSp!V*7Y1)K4VX_)h>mSW`=arT#6LqX!;>LVMi7 zK>YEZCuk}vxIgSf#bXF4VShZ%-3R8cD*6`!cA}rUp`yZnK?rWDqL%uG!kQl57-0p7 zJVaVl4InHm4EIJm!Hf|%{s}*^R7G6~1WygVSN@sopicsoO7l$DjC(y~xlS*a6* zluv*=0p%~{?gRQe$-nX-Fg}jnSWg1h!(I3^FY1nmFF{pQ^t8~w*FSyYJ^x+E-RB=x zC;XuPC{L&iL>l`41re}L|7q`kM4jIJ9rhQizl*_7Mg!CI#-Iou-liTNI5qXt*$M07 zQO+1+3<@0phyHKGe>#Pqri2-IV=*UOPZ_Dnz@h)g_YWQpJ*E5K=>I+2zq}{IRRf$< z`qx9L0j@y$RH>*~2)YP$Q%fdaOJ<_!Fz@lF2EVm>Kfk*`I@_%KaD=3WI?nKV+@6aY z{`si+&rHY+snue2eru|`8GnNQgf?zw{;`c5iu(#!u1V{JZs$_A*GU>K_UH(TXrom@ zI5|v@_Sst{R~i)>(&}ed{8?&;BUyDynCIjMFF_NF3s{sK? zWLO*W2=F=%uc9$2C00IOPnieOfBf?GH>X?IC_db{fb5j{7-$qjwW(aDQM?}Cy4%S7 z(nFTTQ9Tt$l`Yd=mScp~m!}j|8pU5Ehu4U=(UkR99%c zHnIPK8YwKEsthz46n&_Yf1Q6-7E-wTwrve;}%~NFv{>{$v zj$W-gc^oMR3?qJ-jgDUr5#H_6lzP4qa7N`heW{^S$QH6-SZg^orU8MzYqg!3biISTYqShc!&7- zc4+v}dDUi*hMlW=)ijj6lA9tJCQPHoQe#j#iz|xBji@F4vX$g$M|@V;RlID4t6A6~ zOiY}se~B<8z{2j&l?QYX6u$0RyDWCmYi7UC($gFSzz9JJTQg5DoDmS(=+xtqTWTIK ztkW8*p}o70U$IXIl9!v%wN9&ngk6pTGxt;frH)rHE3R6-vBhV8ZmSAK#$4cW>|Ak{f%C9$HFxH&XZ&5 z>o;)lJ6%@Avj_Kge5}3;O1_8s>mHT#xcdjBnzRj8?beMVgXBygIUl>0#P{fp>DTPP z5X*Y8?N-itFPvW4qkGBtw8gPD=W`niyN5qJwQc?GlIvejDP$I_X-8MFLXgbF+mpZ% z(DmgnZ*-hGIFts0OLcg_HPm`XW0%=iUO3u5H=Msdpe2j4D=Zo(;i}cA4D75}&e(9q z^xk)U12%RZA5Ss;)`xHZq01UQET*|~XuBjN2+bA2qHtWmCG5+l#hivJB5mMAd*oU} zG(Vr9tSy#0*J5sjK3}q)883IfH8zg&dG%iPa!|g4h;LYHV9j*yD!U=7Te=Tii~fNV zcY4}AE(pFO!NUFEB>}5mWI_G$6RzSCBJ`&4RQZes{+!<`tvmcv9b*2=SS>!lmrD0y3|O8#V3h>iT;e7Tl2( zFtvxK#{#ow&w9l;ak1b0JawGpr>|za#&N~=`7WKFx-5EwX}ruOWJ@|QnlVaTZTxpm z*!S_p)^HG;InrQe{ftn$kV-@yP=4zBrj6Im2pHEBp%N53IG`)Qdz=(7Tgs+2ZHv~{ z$7HJ8v3dT^^^@@@2(iRfwaFxlYwEK-$b_2#&9T2siJO$1ZtF61E29rN(=(6m6FP+zSYw;))3?&ad zted#-(St3eVwoSGD)*eaEu4!7PCnC$i_M5{0autZ-FA!Rpr^jKQ#~`11z%a=f%y{G z@$qvl(%z}{dmg{oJcgR^mDR;S1#;k(-kKCHlb5i=@(- zS&-ROVOb68JTNPHp1|T)%JV2CIWk=_yE&{=G|pyze0q0)5m>6@JyuX|LuVO#E>5O} z3GBUzdX-<1*0ZBX<8d}Wv#oXs2ukewP?9pzk<0YyUP;l1zNjnIqm0&G*Cqio`snTI zIHiP~>MZ^4i~++W74kjDl&?%5=F}i&C_e*rc0|K z3@?)|5PvYiblsC+v8zWEWa>C~j0;+V#rF7Du&HZ}zeE>l1(|LBg+EBJflkL7;ihHX zdFzYK4c|PIS?|?h?6+r}IwnI|5hkiC`%TOZb)mOdv*JzNb-8t)C&hID#H zapDj3t}rX=T}6Ln)Y<}VEjpK_Tpm?GZ<~@7GEg1t1ATVu4;(SJ&3$d>m(W){!|w`$ zd@sj+IEHj+Q@O$^o^s z$e+QMF-wF_lwO_&J+YoGzEc3_?4KeVLI6G+Eq?sdS{~CYu~0L8t%M1_H_!B={w2FZ zV>qXUj1Q?tyJH|^kmQ7D$KwPaw5RYY4Ijd@+Xr8iLvu2=9k#51sI9zBQUBJ+nT@W{ z#P=>=bFBx#&n}P}TkAHuK56q%Rj8Mo$Dkky#Pq23CA`KXsrSaeb6hX0m=1UtRvD8l82Y(yH!%sUiTI_q#Dg~H^>xmxT*ba!`F_C#qncq`oNlm?~WiqaBK#ZW+)G`FpdqJ_Fz`DIgjTlDPH-ps~fH& z;dOnyHzm8{PS+gv`?pY)IZF4ndtcZW=F5|HjZ^MPU2Odr+!j!>x0_54#>?GXQ!yJ=4-_V9?z?N8~y#ut9S`A9knl| zl$}_E_+yFe--^CCy_K|{-7@v~p>rV5*cU`b_H6;=z$1{MJ_}J-zV{jh?ioZP4;%vV#0gKft`;Pyi)6Vs?MLON(E?Wi=$xA&8Brl^J47JBywa|vk}+K z4e1<*l|`SQoe#CpQ3AxNuj9RWL3yTy;x=^vm-Uj#Oc9~OnT#Og0TTY@4<};;FMun zrO2MM+W(<-8=+m^j_Vaqu0N{Y*oKyoD-GD*zfl&VK5kx<>nzbWtDFL?Cb)$IH|S`e z)-6;38l3O`9yapYGNrBe>;9&5d2IuLi2|KHqn}5Lay4TAPY}Q2kyu{E>~@w{EW@ z^Vty$qN8+TwNKit)92wkGqElvJ(H;K>z4r^I(`{l7d1$Uuh8$?OrUU;59Dj)dy#!6 zvwtFvZO0%rINK0~^s#i^w)}vtp*f>OeunfIS^@jB8}Xk$bN;bR?fby4q2#_-EHqhq z&h0j=IT2Lc@{HrNQJFz_&(Kle(}7Vw`rX0LNO?o~0lj4`Ojt Date: Wed, 17 Aug 2022 17:51:21 +0100 Subject: [PATCH 20/33] Added memo field to the send ARRR dialog added a memo text field to be set while sending ARRR to another wallets --- qortal-ui-core/language/us.json | 4 +- .../plugins/core/wallet/wallet-app.src.js | 42 ++++++++++++++++++- 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/qortal-ui-core/language/us.json b/qortal-ui-core/language/us.json index 6ed4f7f1..2caeb32a 100644 --- a/qortal-ui-core/language/us.json +++ b/qortal-ui-core/language/us.json @@ -235,7 +235,9 @@ "wchange42":"Confirmations", "wchange43":"Your transaction will not show until confirmed, be patient...", "wchange44":"Please try again...", - "wchange45":"Send all" + "wchange45":"Send all", + "wchange46":"Memo" + }, "tradepage":{ "tchange1":"Trade Portal", diff --git a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js index 5de5ac32..e6bef4d8 100644 --- a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js +++ b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js @@ -52,10 +52,11 @@ class MultiWallet extends LitElement { dogeAmount: { type: Number }, dgbRecipient: { type: String }, dgbAmount: { type: Number }, - rvnRecipient: { type: String }, + rvnRecipient: { type: String }, rvnAmount: { type: Number }, arrrRecipient: { type: String }, arrrAmount: { type: Number }, + arrrMemo: { type: String }, errorMessage: { type: String }, arrrWalletAddress: { type: String }, successMessage: { type: String }, @@ -616,6 +617,7 @@ class MultiWallet extends LitElement { this.dgbRecipient = '' this.rvnRecipient = '' this.arrrRecipient = '' + this.arrrMemo = '' this.arrrWalletAddress = '' this.errorMessage = '' this.successMessage = '' @@ -1598,6 +1600,17 @@ class MultiWallet extends LitElement { >

+

+ + +

${this.errorMessage}

${this.successMessage}

${this.sendMoneyLoading ? html` ` : ''} @@ -1989,6 +2002,29 @@ class MultiWallet extends LitElement { } checkSelectedTextAndShowMenu() }) + + this.shadowRoot.getElementById('arrrMemo').addEventListener('contextmenu', (event) => { + const getSelectedText = () => { + var text = '' + if (typeof window.getSelection != 'undefined') { + text = window.getSelection().toString() + } else if (typeof this.shadowRoot.selection != 'undefined' && this.shadowRoot.selection.type == 'Text') { + text = this.shadowRoot.selection.createRange().text + } + return text + } + const checkSelectedTextAndShowMenu = () => { + let selectedText = getSelectedText() + if (selectedText && typeof selectedText === 'string') { + } else { + this.pasteMenu(event, 'arrrMemo') + this.isPasteMenuOpen = true + event.preventDefault() + event.stopPropagation() + } + } + checkSelectedTextAndShowMenu() + }) } renderClearSuccess() { @@ -2571,6 +2607,7 @@ class MultiWallet extends LitElement { async sendArrr() { const arrrAmount = this.shadowRoot.getElementById('arrrAmountInput').value let arrrRecipient = this.shadowRoot.getElementById('arrrRecipient').value + let arrrMemo = this.shadowRoot.getElementById('arrrMemo').value const seed58 = this.wallets.get(this._selectedWallet).wallet.seed58 this.sendMoneyLoading = true @@ -2581,6 +2618,7 @@ class MultiWallet extends LitElement { entropy58: seed58, receivingAddress: arrrRecipient, arrrAmount: arrrAmount, + arrrMemo: arrrMemo //feePerByte: (this.arrrFeePerByte / 1e8).toFixed(8), // Not supported in ARRR } const response = await parentEpml.request('sendArrr', opts) @@ -2591,8 +2629,10 @@ class MultiWallet extends LitElement { if (response.length === 64) { this.shadowRoot.getElementById('arrrAmountInput').value = 0 this.shadowRoot.getElementById('arrrRecipient').value = '' + this.shadowRoot.getElementById('arrrMemo').value = '' this.errorMessage = '' this.arrrRecipient = '' + this.arrrMemo='' this.arrrAmount = 0 this.successMessage = this.renderSuccessText() this.sendMoneyLoading = false From 2f4fc435b534e723518b990c1d01cbdf08c2ad86 Mon Sep 17 00:00:00 2001 From: proto <34919827+protoniuman@users.noreply.github.com> Date: Wed, 17 Aug 2022 18:38:53 +0100 Subject: [PATCH 21/33] Memo field 2 - Added translation slots for other languages - The memo field is no longer required - The memo field max length is 256 characters --- qortal-ui-core/language/de.json | 3 ++- qortal-ui-core/language/es.json | 3 ++- qortal-ui-core/language/fr.json | 3 ++- qortal-ui-core/language/hindi.json | 3 ++- qortal-ui-core/language/hr.json | 3 ++- qortal-ui-core/language/hu.json | 3 ++- qortal-ui-core/language/it.json | 3 ++- qortal-ui-core/language/ko.json | 3 ++- qortal-ui-core/language/no.json | 3 ++- qortal-ui-core/language/pl.json | 3 ++- qortal-ui-core/language/pt.json | 3 ++- qortal-ui-core/language/ro.json | 11 ++++++----- qortal-ui-core/language/rs.json | 3 ++- qortal-ui-core/language/ru.json | 3 ++- qortal-ui-core/language/zhc.json | 3 ++- qortal-ui-core/language/zht.json | 3 ++- .../plugins/core/wallet/wallet-app.src.js | 2 +- 17 files changed, 37 insertions(+), 21 deletions(-) diff --git a/qortal-ui-core/language/de.json b/qortal-ui-core/language/de.json index 189db09c..f168d3ff 100644 --- a/qortal-ui-core/language/de.json +++ b/qortal-ui-core/language/de.json @@ -240,7 +240,8 @@ "wchange42":"Bestätigungen", "wchange43":"Ihre Transaktion wird erst angezeigt, wenn sie bestätigt wurde. Seien Sie geduldig...", "wchange44":"Bitte versuche es erneut...", - "wchange45":"Sende alle" + "wchange45":"Sende alle", + "wchange46":"Memo" }, "tradepage":{ "tchange1":"Handelsportal", diff --git a/qortal-ui-core/language/es.json b/qortal-ui-core/language/es.json index c495083e..d9178b02 100644 --- a/qortal-ui-core/language/es.json +++ b/qortal-ui-core/language/es.json @@ -240,7 +240,8 @@ "wchange42":"Confirmaciones", "wchange43":"Su transacción no se mostrará hasta que se confirme, sea paciente...", "wchange44":"Inténtalo de nuevo...", - "wchange45":"Envia todo" + "wchange45":"Envia todo", + "wchange46":"Memo" }, "tradepage":{ "tchange1":"Portal de Comercio", diff --git a/qortal-ui-core/language/fr.json b/qortal-ui-core/language/fr.json index a77e729e..7bf4e070 100644 --- a/qortal-ui-core/language/fr.json +++ b/qortal-ui-core/language/fr.json @@ -240,7 +240,8 @@ "wchange42":"Confirmations", "wchange43":"Votre transaction ne s'affichera pas tant qu'elle n'aura pas été confirmée, soyez patient...", "wchange44":"Veuillez réessayer...", - "wchange45":"Envoyer tout" + "wchange45":"Envoyer tout", + "wchange46":"Memo" }, "tradepage":{ "tchange1":"Portail de commerce", diff --git a/qortal-ui-core/language/hindi.json b/qortal-ui-core/language/hindi.json index 98cba547..2e4f0e03 100644 --- a/qortal-ui-core/language/hindi.json +++ b/qortal-ui-core/language/hindi.json @@ -241,7 +241,8 @@ "wchange42":"पुष्टियों", "wchange43":"कन्फर्म होने तक आपका ट्रांजैक्शन नहीं दिखेगा, धैर्य रखें...", "wchange44":"कृपया पुन: प्रयास करें...", - "wchange45":"सब भेजें" + "wchange45":"सब भेजें", + "wchange46":"Memo" }, "tradepage":{ "tchange1":"व्यापार पोर्टल", diff --git a/qortal-ui-core/language/hr.json b/qortal-ui-core/language/hr.json index 6b2479ff..351dc1ed 100644 --- a/qortal-ui-core/language/hr.json +++ b/qortal-ui-core/language/hr.json @@ -240,7 +240,8 @@ "wchange42":"Potvrde", "wchange43":"Vaša transakcija se neće prikazati dok se ne potvrdi, budite strpljivi...", "wchange44":"Molim te pokušaj ponovno...", - "wchange45":"Pošalji sve" + "wchange45":"Pošalji sve", + "wchange46":"Memo" }, "tradepage":{ "tchange1":"Portal razmjene", diff --git a/qortal-ui-core/language/hu.json b/qortal-ui-core/language/hu.json index ff480433..a2ec8924 100644 --- a/qortal-ui-core/language/hu.json +++ b/qortal-ui-core/language/hu.json @@ -240,7 +240,8 @@ "wchange42":"Visszaigazolások", "wchange43":"A tranzakció nem jelenik meg a megerősítésig, legyen türelemmel...", "wchange44":"Kérlek próbáld újra...", - "wchange45":"Az összes elküldése" + "wchange45":"Az összes elküldése", + "wchange46":"Memo" }, "tradepage":{ "tchange1":"Kereskedelmi Portál", diff --git a/qortal-ui-core/language/it.json b/qortal-ui-core/language/it.json index 92e6f02d..bd0b115a 100644 --- a/qortal-ui-core/language/it.json +++ b/qortal-ui-core/language/it.json @@ -240,7 +240,8 @@ "wchange42":"Conferme", "wchange43":"La tua transazione non verrà mostrata fino a quando non sarà confermata, sii paziente...", "wchange44":"Per favore riprova...", - "wchange45":"Invia tutto" + "wchange45":"Invia tutto", + "wchange46":"Memo" }, "tradepage":{ "tchange1":"Portale commerciale", diff --git a/qortal-ui-core/language/ko.json b/qortal-ui-core/language/ko.json index 8994777f..80e25c57 100644 --- a/qortal-ui-core/language/ko.json +++ b/qortal-ui-core/language/ko.json @@ -240,7 +240,8 @@ "wchange42":"확인", "wchange43":"확인될 때까지 거래가 표시되지 않습니다. 기다려 주십시오.", "wchange44":"다시 시도하십시오...", - "wchange45":"모두 보내기" + "wchange45":"모두 보내기", + "wchange46":"Memo" }, "tradepage":{ "tchange1":"무역 포털", diff --git a/qortal-ui-core/language/no.json b/qortal-ui-core/language/no.json index 697ebf33..0de622d6 100644 --- a/qortal-ui-core/language/no.json +++ b/qortal-ui-core/language/no.json @@ -240,7 +240,8 @@ "wchange42":"Bekreftelser", "wchange43":"Transaksjonen din vises ikke før den er bekreftet, vær tålmodig...", "wchange44":"Vær så snill, prøv på nytt...", - "wchange45":"Send alle" + "wchange45":"Send alle", + "wchange46":"Memo" }, "tradepage":{ "tchange1":"Handelsportal", diff --git a/qortal-ui-core/language/pl.json b/qortal-ui-core/language/pl.json index 6e557c1d..13437487 100644 --- a/qortal-ui-core/language/pl.json +++ b/qortal-ui-core/language/pl.json @@ -240,7 +240,8 @@ "wchange42":"Potwierdzenia", "wchange43":"Twoja transakcja nie pojawi się, dopóki nie zostanie potwierdzona, bądź cierpliwy...", "wchange44":"Proszę spróbuj ponownie...", - "wchange45":"Wyślij wszystko" + "wchange45":"Wyślij wszystko", + "wchange46":"Memo" }, "tradepage":{ "tchange1":"Portal Handlowy", diff --git a/qortal-ui-core/language/pt.json b/qortal-ui-core/language/pt.json index f4fd9e00..b20deef1 100644 --- a/qortal-ui-core/language/pt.json +++ b/qortal-ui-core/language/pt.json @@ -240,7 +240,8 @@ "wchange42":"Confirmações", "wchange43":"Sua transação não será exibida até ser confirmada, seja paciente...", "wchange44":"Por favor, tente novamente...", - "wchange45":"Envie todos" + "wchange45":"Envie todos", + "wchange46":"Memo" }, "tradepage":{ "tchange1":"Portal do Comércio", diff --git a/qortal-ui-core/language/ro.json b/qortal-ui-core/language/ro.json index 02f5df31..017b8596 100644 --- a/qortal-ui-core/language/ro.json +++ b/qortal-ui-core/language/ro.json @@ -177,9 +177,9 @@ "mchange31":"Apasa pentru Ajutor", "mchange32":"Devino Producator de Moneda", "mchange33":"Introducere", - "mchange34":"In Qortal, pentru a deveni un productor de moneda si a incepe sa castigi recompense QORT odata cu cresterea nivelului de productor de moneda, trebuie mai intai sa devii sponsorizat. Un sponsor in Qortal este orice alt productor de moneda de nivel 5 sau mai mare, sau un Fondator Qortal. Veti obtine o cheie de sponsorizare de la sponsor si veti folosi acea cheie pentru a ajunge la nivelul 1. Odata ce ati ajuns la nivelul 1, veti putea sa va creati propria cheie de producere a monedei si sa incepeti sa castigati recompense pentru a ajuta la securizarea Qortal Blockchain.", + "mchange34":"In Qortal, pentru a deveni un productor de moneda si a incepe sa castigi recompense QORT odata cu cresterea nivelului de productor de moneda, trebuie mai intai sa devii �sponsorizat�. Un sponsor in Qortal este orice alt productor de moneda de nivel 5 sau mai mare, sau un Fondator Qortal. Veti obtine o cheie de sponsorizare de la sponsor si veti folosi acea cheie pentru a ajunge la nivelul 1. Odata ce ati ajuns la nivelul 1, veti putea sa va creati propria cheie de producere a monedei si sa incepeti sa castigati recompense pentru a ajuta la securizarea Qortal Blockchain.", "mchange35":"Sponsorizare", - "mchange36":"Sponsorul dvs. va va emite o Cheie de sponsorizare pe care o veti folosi pentru a o adauga la nodul dvs. si pentru a incepe sa produceti moneda (fara recompense pana la atingerea nivelului 1.) Odata ce ati atins nivelul 1, va creati/atribuiti propria Cheie de producere a monedei si incepeti sa castigati recompense. Aveti XXXX blocuri ramase in perioada de sponsorizare..", + "mchange36":"Sponsorul dvs. va va emite o �Cheie de sponsorizare� pe care o veti folosi pentru a o adauga la nodul dvs. si pentru a incepe sa produceti moneda (fara recompense pana la atingerea nivelului 1.) Odata ce ati atins nivelul 1, va creati/atribuiti propria �Cheie de producere a monedei� si incepeti sa castigati recompense. Aveti XXXX blocuri ramase in perioada de sponsorizare..", "mchange37":"Pur si simplu contactati un productor de moneda din Qortal care are un nivel suficient de ridicat pentru a emite o cheie de sponsorizare, obtineti acea cheie, apoi reveniti aici si introduceti cheia pentru a va incepe calatoria de productor de moneda !", "mchange38":"in" }, @@ -188,7 +188,7 @@ "bchange8":"Cheia de introducere de la sponsorul dvs. aici", "bchange10":"Starea actuala a sponsorizarii", "bchange12":"Minting cu cheia sponsorului", - "bchange13":"Blocuri ramase n perioada de sponsorizare", + "bchange13":"Blocuri ramase �n perioada de sponsorizare", "bchange15":"Relatia de sponsorizare", "bchange16":"Cont de sponsor", "bchange17":"Copiati cheia de sponsorizare", @@ -240,7 +240,8 @@ "wchange42":"Confirmari", "wchange43":"Tranzactia nu va aparea pana ce nu este confirmata, ai rabdare...", "wchange44":"Te rog incearca din nou...", - "wchange45":"Trimite toate" + "wchange45":"Trimite toate", + "wchange46":"Memo" }, "tradepage":{ "tchange1":"Portal de Tranzactionare", @@ -592,7 +593,7 @@ "apipage":{ "achange1":"Adauga cheia API", "achange2":"API key", - "achange3":"Va rugam sa introduceti cheia API pentru acest nod. Aceasta poate fi gasita intr-un fisier numit apikey.txt in directorul in care este instalat nucleul. Alternativ, faceti clic pe Anulare (Anulare) pentru a utiliza nucleul cu functionalitate redusa.", + "achange3":"Va rugam sa introduceti cheia API pentru acest nod. Aceasta poate fi gasita intr-un fisier numit �apikey.txt� in directorul in care este instalat nucleul. Alternativ, faceti clic pe Anulare (Anulare) pentru a utiliza nucleul cu functionalitate redusa.", "achange4":"Anulare", "achange5":"Adauga", "achange6":"S-a adaugat cu succes cheia API", diff --git a/qortal-ui-core/language/rs.json b/qortal-ui-core/language/rs.json index 7196810d..67c67f8a 100644 --- a/qortal-ui-core/language/rs.json +++ b/qortal-ui-core/language/rs.json @@ -240,7 +240,8 @@ "wchange42":"Potvrde", "wchange43":"Vaša transakcija se neće prikazati dok se ne potvrdi, budite strpljivi...", "wchange44":"Molim vas, pokušajte ponovo...", - "wchange45":"Poslati sve" + "wchange45":"Poslati sve", + "wchange46":"Memo" }, "tradepage":{ "tchange1":"Trgovinski prozor", diff --git a/qortal-ui-core/language/ru.json b/qortal-ui-core/language/ru.json index df148445..d0762260 100644 --- a/qortal-ui-core/language/ru.json +++ b/qortal-ui-core/language/ru.json @@ -240,7 +240,8 @@ "wchange42":"Подтверждено", "wchange43":"Ваша транзакция не будет отображаться, пока не будет подтверждена, наберитесь терпения...", "wchange44":"Пожалуйста, попробуйте еще раз...", - "wchange45":"Отправь все" + "wchange45":"Отправь все", + "wchange46":"Memo" }, "tradepage":{ "tchange1":"Торговый портал", diff --git a/qortal-ui-core/language/zhc.json b/qortal-ui-core/language/zhc.json index 5982c765..78a3aeb7 100644 --- a/qortal-ui-core/language/zhc.json +++ b/qortal-ui-core/language/zhc.json @@ -240,7 +240,8 @@ "wchange42":"确认数", "wchange43":"您的交易在确认之前不会显示,请耐心等待...", "wchange44":"请再试一次...", - "wchange45":"全部发送" + "wchange45":"全部发送", + "wchange46":"Memo" }, "tradepage":{ "tchange1":"交易门户", diff --git a/qortal-ui-core/language/zht.json b/qortal-ui-core/language/zht.json index 28d75353..2ae49924 100644 --- a/qortal-ui-core/language/zht.json +++ b/qortal-ui-core/language/zht.json @@ -240,7 +240,8 @@ "wchange42":"確認數", "wchange43":"您的交易在確認之前不會顯示,請耐心等待...", "wchange44":"請再試一次...", - "wchange45":"全部發送" + "wchange45":"全部發送", + "wchange46":"Memo" }, "tradepage":{ "tchange1":"交易門戶", diff --git a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js index e6bef4d8..04f5e81a 100644 --- a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js +++ b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js @@ -1603,11 +1603,11 @@ class MultiWallet extends LitElement {

From 67c7f2dd61d79f2c915f0039defb6cf9ca69dbae Mon Sep 17 00:00:00 2001 From: CalDescent <> Date: Wed, 17 Aug 2022 18:41:48 +0100 Subject: [PATCH 22/33] Only show ARRR addresses when response is 78 characters long. --- qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js index 5de5ac32..57402b1e 100644 --- a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js +++ b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js @@ -2780,7 +2780,7 @@ class MultiWallet extends LitElement { method: 'POST', body: `${window.parent.reduxStore.getState().app.selectedAddress[arrrWalletName].seed58}`, }) - if (res != null && res.error != 1201) { + if (res != null && res.error != 1201 && res.length === 78) { this.arrrWalletAddress = res } break From 9982a24c0aed4a4853c4b6fe460c2625360c3f0b Mon Sep 17 00:00:00 2001 From: CalDescent <> Date: Wed, 17 Aug 2022 18:42:04 +0100 Subject: [PATCH 23/33] Hide QR code when there is no address to display. --- qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js index 57402b1e..a09264b0 100644 --- a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js +++ b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js @@ -752,7 +752,7 @@ class MultiWallet extends LitElement { ${this.renderSendButton()} -
+
From b5422855d98e917b79c3f4d408c4fa345875fedd Mon Sep 17 00:00:00 2001 From: CalDescent <> Date: Wed, 17 Aug 2022 19:27:42 +0100 Subject: [PATCH 24/33] Show memo in ARRR transaction list --- qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js index 6dea694e..860a179a 100644 --- a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js +++ b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js @@ -3447,6 +3447,15 @@ class MultiWallet extends LitElement { }} > + { + render(html`${data.item.memo}`, root) + }} + > +
` From 6fc3732cb6aa354c4dd38be88ed0b8a30edffe15 Mon Sep 17 00:00:00 2001 From: CalDescent <> Date: Wed, 17 Aug 2022 19:41:15 +0100 Subject: [PATCH 25/33] Key renamed from "arrrMemo" to "memo" when sending to the core. --- qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js index 860a179a..42aa51e2 100644 --- a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js +++ b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js @@ -2618,7 +2618,7 @@ class MultiWallet extends LitElement { entropy58: seed58, receivingAddress: arrrRecipient, arrrAmount: arrrAmount, - arrrMemo: arrrMemo + memo: arrrMemo //feePerByte: (this.arrrFeePerByte / 1e8).toFixed(8), // Not supported in ARRR } const response = await parentEpml.request('sendArrr', opts) From b0f29ac1f495ce34f3f892c8b1f9551982ae5ad9 Mon Sep 17 00:00:00 2001 From: CalDescent <> Date: Wed, 17 Aug 2022 19:46:36 +0100 Subject: [PATCH 26/33] Fix IN / OUT tag for ARRR transactions --- qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js index 42aa51e2..45d27417 100644 --- a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js +++ b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js @@ -3404,7 +3404,7 @@ class MultiWallet extends LitElement { resizable header="${translate("walletpage.wchange35")}" .renderer=${(root, column, data) => { - render(html` ${translate("walletpage.wchange40")} ${data.item.amount > 0 ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} `, root) + render(html` ${translate("walletpage.wchange40")} ${data.item.totalAmount > 0 ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} `, root) }} > From 9fb693bae2760780788e2b16ca091917fe1f1a03 Mon Sep 17 00:00:00 2001 From: CalDescent <> Date: Wed, 17 Aug 2022 19:51:03 +0100 Subject: [PATCH 27/33] Fixed bug --- qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js index 45d27417..31ec57ce 100644 --- a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js +++ b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js @@ -3404,7 +3404,7 @@ class MultiWallet extends LitElement { resizable header="${translate("walletpage.wchange35")}" .renderer=${(root, column, data) => { - render(html` ${translate("walletpage.wchange40")} ${data.item.totalAmount > 0 ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} `, root) + render(html` ${translate("walletpage.wchange40")} ${data.item.totalAmount < 0 ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} `, root) }} > From f176f034d10698f399f422852da3a450d958e64d Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Mon, 22 Aug 2022 17:04:11 +0200 Subject: [PATCH 28/33] Update wallet-app.src.js --- .../plugins/core/wallet/wallet-app.src.js | 2161 ++++++++++++++--- 1 file changed, 1864 insertions(+), 297 deletions(-) diff --git a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js index 7aa2f937..dc3e209d 100644 --- a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js +++ b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js @@ -9,6 +9,9 @@ registerTranslateConfig({ import '../components/ButtonIconCopy.js' import '../components/QortalQrcodeGenerator.js' +import '../components/frag-file-input.js' +import FileSaver from 'file-saver' +import '@github/time-elements' import '@material/mwc-button' import '@material/mwc-checkbox' import '@material/mwc-dialog' @@ -25,7 +28,6 @@ import '@vaadin/button' import '@vaadin/grid' import '@vaadin/icon' import '@vaadin/icons' -import '@github/time-elements' const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) @@ -52,13 +54,12 @@ class MultiWallet extends LitElement { dogeAmount: { type: Number }, dgbRecipient: { type: String }, dgbAmount: { type: Number }, - rvnRecipient: { type: String }, + rvnRecipient: { type: String }, rvnAmount: { type: Number }, arrrRecipient: { type: String }, arrrAmount: { type: Number }, arrrMemo: { type: String }, errorMessage: { type: String }, - arrrWalletAddress: { type: String }, successMessage: { type: String }, sendMoneyLoading: { type: Boolean }, btnDisable: { type: Boolean }, @@ -69,7 +70,30 @@ class MultiWallet extends LitElement { dogeFeePerByte: { type: Number }, dgbFeePerByte: { type: Number }, rvnFeePerByte: { type: Number }, - balanceString: { type: String } + balanceString: { type: String }, + arrrWalletAddress: { type: String }, + exportErrorMessage: { type: String }, + qortBook: { type: Array }, + btcBook: { type: Array }, + ltcBook: { type: Array }, + dogeBook: { type: Array }, + dgbBook: { type: Array }, + rvnBook: { type: Array }, + arrrBook: { type: Array }, + qortBookName: { type: String }, + btcBookName: { type: String }, + ltcBookName: { type: String }, + dogeBookName: { type: String }, + dgbBookName: { type: String }, + rvnBookName: { type: String }, + arrrBookName: { type: String }, + qortBookAddress: { type: String }, + btcBookAddress: { type: String }, + ltcBookAddress: { type: String }, + dogeBookAddress: { type: String }, + dgbBookAddress: { type: String }, + rvnBookAddress: { type: String }, + arrrBookAddress: { type: String } } } @@ -85,6 +109,8 @@ class MultiWallet extends LitElement { --mdc-theme-secondary: var(--mdc-theme-primary); --mdc-theme-surface: var(--white); --mdc-dialog-content-ink-color: var(--black); + --mdc-dialog-min-width: 400px; + --mdc-dialog-max-width: 1024px; --paper-input-container-focus-color: var(--mdc-theme-primary); --lumo-primary-text-color: rgb(0, 167, 245); --lumo-primary-color-50pct: rgba(0, 167, 245, 0.5); @@ -200,6 +226,14 @@ class MultiWallet extends LitElement { word-break: break-all; } + .floatleft { + float: left; + } + + .floatright { + float: right; + } + .title { font-weight: 600; font-size: 12px; @@ -512,8 +546,20 @@ class MultiWallet extends LitElement { } .qrcode-pos { - margin-top: -180px; - margin-left: 800px; + margin-top: -175px; + margin-left: 450px; + } + + .send-pos { + margin-top: 20px; + margin-left: 20px; + width: 185px; + } + + .book-pos { + margin-top: -44px; + margin-left: 215px; + width: 185px; } @media (max-width: 863px) { @@ -610,12 +656,35 @@ class MultiWallet extends LitElement { this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'; + this.exportErrorMessage = '' + this.qortBook = [] + this.btcBook = [] + this.ltcBook = [] + this.dogeBook = [] + this.dgbBook = [] + this.rvnBook = [] + this.arrrBook = [] + this.qortBookName = '' + this.btcBookName = '' + this.ltcBookName = '' + this.dogeBookName = '' + this.dgbBookName = '' + this.rvnBookName = '' + this.arrrBookName = '' + this.qortBookAddress = '' + this.btcBookAddress = '' + this.ltcBookAddress = '' + this.dogeBookAddress = '' + this.dgbBookAddress = '' + this.rvnBookAddress = '' + this.arrrBookAddress = '' + this.recipient = '' this.btcRecipient = '' this.ltcRecipient = '' this.dogeRecipient = '' this.dgbRecipient = '' - this.rvnRecipient = '' + this.rvnRecipient = '' this.arrrRecipient = '' this.arrrMemo = '' this.arrrWalletAddress = '' @@ -630,7 +699,7 @@ class MultiWallet extends LitElement { this.ltcAmount = 0 this.dogeAmount = 0 this.dgbAmount = 0 - this.rvnAmount = 0 + this.rvnAmount = 0 this.arrrAmount = 0 this.btcFeePerByte = 100 this.btcSatMinFee = 20 @@ -667,7 +736,7 @@ class MultiWallet extends LitElement { this.wallets.get('ltc').wallet = window.parent.reduxStore.getState().app.selectedAddress.ltcWallet this.wallets.get('doge').wallet = window.parent.reduxStore.getState().app.selectedAddress.dogeWallet this.wallets.get('dgb').wallet = window.parent.reduxStore.getState().app.selectedAddress.dgbWallet - this.wallets.get('rvn').wallet = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet + this.wallets.get('rvn').wallet = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet this.wallets.get('arrr').wallet = window.parent.reduxStore.getState().app.selectedAddress.arrWallet this._selectedWallet = 'qort' @@ -750,11 +819,17 @@ class MultiWallet extends LitElement {
- ${this.balanceString}

- ${this.renderSendButton()} + ${this.balanceString}
+
-
+
+ ${this.renderSendButton()} +
+
+ ${this.renderAddressbookButton()} +
+
@@ -831,7 +906,9 @@ class MultiWallet extends LitElement { ${translate("walletpage.wchange10")}
- ${this.selectedTransaction.btcReceiver} this.sendToBtcAddress()} title="${translate("walletpage.wchange46")}"> + ${this.selectedTransaction.btcReceiver} + this.sendToBtcAddress()} title="${translate("walletpage.wchange46")}"> + this.openAddBtcAddressDialog()} title="${translate("walletpage.wchange49")}">

${translate("walletpage.wchange12")} @@ -882,7 +959,9 @@ class MultiWallet extends LitElement { ${translate("walletpage.wchange10")}
- ${this.selectedTransaction.ltcReceiver} this.sendToLtcAddress()} title="${translate("walletpage.wchange46")}"> + ${this.selectedTransaction.ltcReceiver} + this.sendToLtcAddress()} title="${translate("walletpage.wchange46")}"> + this.openAddLtcAddressDialog()} title="${translate("walletpage.wchange49")}">

${translate("walletpage.wchange12")} @@ -934,7 +1013,9 @@ class MultiWallet extends LitElement { ${translate("walletpage.wchange10")}
- ${this.selectedTransaction.dogeReceiver} this.sendToDogeAddress()} title="${translate("walletpage.wchange46")}"> + ${this.selectedTransaction.dogeReceiver} + this.sendToDogeAddress()} title="${translate("walletpage.wchange46")}"> + this.openAddDogeAddressDialog()} title="${translate("walletpage.wchange49")}">

${translate("walletpage.wchange12")} @@ -985,7 +1066,9 @@ class MultiWallet extends LitElement { ${translate("walletpage.wchange10")}
- ${this.selectedTransaction.dgbReceiver} this.sendToDgbAddress()} title="${translate("walletpage.wchange46")}"> + ${this.selectedTransaction.dgbReceiver} + this.sendToDgbAddress()} title="${translate("walletpage.wchange46")}"> + this.openAddDgbAddressDialog()} title="${translate("walletpage.wchange49")}">

${translate("walletpage.wchange12")} @@ -1036,7 +1119,9 @@ class MultiWallet extends LitElement { ${translate("walletpage.wchange10")}
- ${this.selectedTransaction.rvnReceiver} this.sendToRvnAddress()} title="${translate("walletpage.wchange46")}"> + ${this.selectedTransaction.rvnReceiver} + this.sendToRvnAddress()} title="${translate("walletpage.wchange46")}"> + this.openAddRvnAddressDialog()} title="${translate("walletpage.wchange49")}">

${translate("walletpage.wchange12")} @@ -1086,9 +1171,12 @@ class MultiWallet extends LitElement {
${translate("walletpage.wchange10")}
-
+
${this.selectedTransaction.arrrReceiver} + this.sendToArrrAddress()} title="${translate("walletpage.wchange46")}"> + this.openAddArrrAddressDialog()} title="${translate("walletpage.wchange49")}">
+
${translate("walletpage.wchange12")}
@@ -1587,7 +1675,10 @@ class MultiWallet extends LitElement {

${translate("walletpage.wchange19")}:
- ${this.balanceString} + ${this.balanceString}
+ + this.calculateArrrAll()}> ${translate("walletpage.wchange45")} ARRR +
 

${translate("general.close")} -

- ` - } - - firstUpdated() { - this.changeTheme() - this.changeLanguage() + +
+ +

Qortal ${translate("walletpage.wchange47")}

+
+
${this.renderExportAddressbookButton()}
${this.renderImportAddressbookButton()}


+
+
+ + + + { + render(html`${this.renderSendFromQortAddressbookButton(data.item)}`, root); + }}> + + + ${this.isEmptyArray(this.qortBook) ? html` + ${translate("walletpage.wchange48")} + `: ''} + + ${translate("general.close")} + + this.openAddToQortAddressbook()} + > + ${translate("rewardsharepage.rchange14")} + +
- this.currencyBoxes = this.shadowRoot.querySelectorAll('.currency-box') - this.transactionsDOM = this.shadowRoot.getElementById('transactionsDOM') + +
+ +

Bitcoin ${translate("walletpage.wchange47")}

+
+
${this.renderExportAddressbookButton()}
${this.renderImportAddressbookButton()}


+
+
+ + + + { + render(html`${this.renderSendFromBtcAddressbookButton(data.item)}`, root); + }}> + + + ${this.isEmptyArray(this.btcBook) ? html` + ${translate("walletpage.wchange48")} + `: ''} + + ${translate("general.close")} + + this.openAddToBtcAddressbook()} + > + ${translate("rewardsharepage.rchange14")} + +
- this.currencyBoxes.forEach((currencyBox) => { - currencyBox.addEventListener('click', this.selectWallet) - }) + +
+ +

Litecoin ${translate("walletpage.wchange47")}

+
+
${this.renderExportAddressbookButton()}
${this.renderImportAddressbookButton()}


+
+
+ + + + { + render(html`${this.renderSendFromLtcAddressbookButton(data.item)}`, root); + }}> + + + ${this.isEmptyArray(this.ltcBook) ? html` + ${translate("walletpage.wchange48")} + `: ''} + + ${translate("general.close")} + + this.openAddToLtcAddressbook()} + > + ${translate("rewardsharepage.rchange14")} + +
- this.showWallet() + +
+ +

Dogecoin ${translate("walletpage.wchange47")}

+
+
${this.renderExportAddressbookButton()}
${this.renderImportAddressbookButton()}


+
+
+ + + + { + render(html`${this.renderSendFromDogeAddressbookButton(data.item)}`, root); + }}> + + + ${this.isEmptyArray(this.dogeBook) ? html` + ${translate("walletpage.wchange48")} + `: ''} + + ${translate("general.close")} + + this.openAddToDogeAddressbook()} + > + ${translate("rewardsharepage.rchange14")} + +
- window.addEventListener('contextmenu', (event) => { - event.preventDefault() - this.isTextMenuOpen = true - this._textMenu(event) - }) + +
+ +

Digibyte ${translate("walletpage.wchange47")}

+
+
${this.renderExportAddressbookButton()}
${this.renderImportAddressbookButton()}


+
+
+ + + + { + render(html`${this.renderSendFromDgbAddressbookButton(data.item)}`, root); + }}> + + + ${this.isEmptyArray(this.dgbBook) ? html` + ${translate("walletpage.wchange48")} + `: ''} + + ${translate("general.close")} + + this.openAddToDgbAddressbook()} + > + ${translate("rewardsharepage.rchange14")} + +
- window.addEventListener('click', () => { - if (this.isTextMenuOpen) { - parentEpml.request('closeCopyTextMenu', null) - } - }) + +
+ +

Ravencoin ${translate("walletpage.wchange47")}

+
+
${this.renderExportAddressbookButton()}
${this.renderImportAddressbookButton()}


+
+
+ + + + { + render(html`${this.renderSendFromRvnAddressbookButton(data.item)}`, root); + }}> + + + ${this.isEmptyArray(this.rvnBook) ? html` + ${translate("walletpage.wchange48")} + `: ''} + + ${translate("general.close")} + + this.openAddToRvnAddressbook()} + > + ${translate("rewardsharepage.rchange14")} + +
- window.addEventListener('storage', () => { - const checkLanguage = localStorage.getItem('qortalLanguage') - const checkTheme = localStorage.getItem('qortalTheme') - use(checkLanguage) + +
+ +

Pirate Chain ${translate("walletpage.wchange47")}

+
+
${this.renderExportAddressbookButton()}
${this.renderImportAddressbookButton()}


+
+
+ + + + { + render(html`${this.renderSendFromArrrAddressbookButton(data.item)}`, root); + }}> + + + ${this.isEmptyArray(this.arrrBook) ? html` + ${translate("walletpage.wchange48")} + `: ''} + + ${translate("general.close")} + + this.openAddToArrrAddressbook()} + > + ${translate("rewardsharepage.rchange14")} + +
- if (checkTheme === 'dark') { - this.theme = 'dark' - } else { - this.theme = 'light' - } - document.querySelector('html').setAttribute('theme', this.theme) - }) + +
+ +

Qortal ${translate("walletpage.wchange47")}


+

${translate("walletpage.wchange49")}

+
+
+
+
+

+ + +

+

+ + +

+
+
+
+ this.addToQortalAddressbook()}> + + ${translate("walletpage.wchange49")} + +
+
+ + ${translate("general.close")} + +
- window.onkeyup = (e) => { - if (e.keyCode === 27) { - parentEpml.request('closeCopyTextMenu', null) - } - } + +
+ +

Bitcoin ${translate("walletpage.wchange47")}


+

${translate("walletpage.wchange49")}

+
+
+
+
+

+ + +

+

+ + +

+
+
+
+ this.addToBitcoinAddressbook()}> + + ${translate("walletpage.wchange49")} + +
+
+ + ${translate("general.close")} + +
- this.shadowRoot.getElementById('amountInput').addEventListener('contextmenu', (event) => { - const getSelectedText = () => { - var text = '' - if (typeof window.getSelection != 'undefined') { - text = window.getSelection().toString() - } else if (typeof this.shadowRoot.selection != 'undefined' && this.shadowRoot.selection.type == 'Text') { - text = this.shadowRoot.selection.createRange().text - } - return text - } - const checkSelectedTextAndShowMenu = () => { - let selectedText = getSelectedText() - if (selectedText && typeof selectedText === 'string') { - } else { - this.pasteMenu(event, 'amountInput') - this.isPasteMenuOpen = true - event.preventDefault() - event.stopPropagation() - } - } - checkSelectedTextAndShowMenu() - }) + +
+ +

Litecoin ${translate("walletpage.wchange47")}


+

${translate("walletpage.wchange49")}

+
+
+
+
+

+ + +

+

+ + +

+
+
+
+ this.addToLitecoinAddressbook()}> + + ${translate("walletpage.wchange49")} + +
+
+ + ${translate("general.close")} + +
- this.shadowRoot.getElementById('recipient').addEventListener('contextmenu', (event) => { - const getSelectedText = () => { - var text = '' + +
+ +

Dogecoin ${translate("walletpage.wchange47")}


+

${translate("walletpage.wchange49")}

+
+
+
+
+

+ + +

+

+ + +

+
+
+
+ this.addToDogecoinAddressbook()}> + + ${translate("walletpage.wchange49")} + +
+
+ + ${translate("general.close")} + +
+ + +
+ +

Digibyte ${translate("walletpage.wchange47")}


+

${translate("walletpage.wchange49")}

+
+
+
+
+

+ + +

+

+ + +

+
+
+
+ this.addToDigibyteAddressbook()}> + + ${translate("walletpage.wchange49")} + +
+
+ + ${translate("general.close")} + +
+ + +
+ +

Ravencoin ${translate("walletpage.wchange47")}


+

${translate("walletpage.wchange49")}

+
+
+
+
+

+ + +

+

+ + +

+
+
+
+ this.addToRavencoinAddressbook()}> + + ${translate("walletpage.wchange49")} + +
+
+ + ${translate("general.close")} + +
+ + +
+ +

Pirate Chain ${translate("walletpage.wchange47")}


+

${translate("walletpage.wchange49")}

+
+
+
+
+

+ + +

+

+ + +

+
+
+
+ this.addToPiratechainAddressbook()}> + + ${translate("walletpage.wchange49")} + +
+
+ + ${translate("general.close")} + +
+ + +
+ +

Qortal ${translate("walletpage.wchange53")}


+
+
+
+
+ +

${translate("walletpage.wchange56")}

+
${translate("walletpage.wchange55")}
+
+ + ${translate("general.close")} + +
+ + +
+ +

Bitcoin ${translate("walletpage.wchange53")}


+
+
+
+
+ +

${translate("walletpage.wchange56")}

+
${translate("walletpage.wchange55")}
+
+ + ${translate("general.close")} + +
+ + +
+ +

Litecoin ${translate("walletpage.wchange53")}


+
+
+
+
+ +

${translate("walletpage.wchange56")}

+
${translate("walletpage.wchange55")}
+
+ + ${translate("general.close")} + +
+ + +
+ +

Dogecoin ${translate("walletpage.wchange53")}


+
+
+
+
+ +

${translate("walletpage.wchange56")}

+
${translate("walletpage.wchange55")}
+
+ + ${translate("general.close")} + +
+ + +
+ +

Digibyte ${translate("walletpage.wchange53")}


+
+
+
+
+ +

${translate("walletpage.wchange56")}

+
${translate("walletpage.wchange55")}
+
+ + ${translate("general.close")} + +
+ + +
+ +

Litecoin ${translate("walletpage.wchange53")}


+
+
+
+
+ +

${translate("walletpage.wchange56")}

+
${translate("walletpage.wchange55")}
+
+ + ${translate("general.close")} + +
+ + +
+ +

Pirate Chain ${translate("walletpage.wchange53")}


+
+
+
+
+ +

${translate("walletpage.wchange56")}

+
${translate("walletpage.wchange55")}
+
+ + ${translate("general.close")} + +
+
+ ` + } + + firstUpdated() { + + this.changeTheme() + this.changeLanguage() + this.qortAddressbook() + this.btcAddressbook() + this.ltcAddressbook() + this.dogeAddressbook() + this.dgbAddressbook() + this.rvnAddressbook() + this.arrrAddressbook() + + this.currencyBoxes = this.shadowRoot.querySelectorAll('.currency-box') + this.transactionsDOM = this.shadowRoot.getElementById('transactionsDOM') + + this.currencyBoxes.forEach((currencyBox) => { + currencyBox.addEventListener('click', this.selectWallet) + }) + + this.showWallet() + + window.addEventListener('contextmenu', (event) => { + event.preventDefault() + this.isTextMenuOpen = true + this._textMenu(event) + }) + + window.addEventListener('click', () => { + if (this.isTextMenuOpen) { + parentEpml.request('closeCopyTextMenu', null) + } + }) + + window.addEventListener('storage', () => { + const checkLanguage = localStorage.getItem('qortalLanguage') + const checkTheme = localStorage.getItem('qortalTheme') + + use(checkLanguage) + + if (checkTheme === 'dark') { + this.theme = 'dark' + } else { + this.theme = 'light' + } + document.querySelector('html').setAttribute('theme', this.theme) + }) + + window.onkeyup = (e) => { + if (e.keyCode === 27) { + parentEpml.request('closeCopyTextMenu', null) + } + } + + this.shadowRoot.getElementById('amountInput').addEventListener('contextmenu', (event) => { + const getSelectedText = () => { + var text = '' if (typeof window.getSelection != 'undefined') { text = window.getSelection().toString() } else if (typeof this.shadowRoot.selection != 'undefined' && this.shadowRoot.selection.type == 'Text') { @@ -1731,7 +2535,7 @@ class MultiWallet extends LitElement { let selectedText = getSelectedText() if (selectedText && typeof selectedText === 'string') { } else { - this.pasteMenu(event, 'recipient') + this.pasteMenu(event, 'amountInput') this.isPasteMenuOpen = true event.preventDefault() event.stopPropagation() @@ -1740,7 +2544,7 @@ class MultiWallet extends LitElement { checkSelectedTextAndShowMenu() }) - this.shadowRoot.getElementById('btcAmountInput').addEventListener('contextmenu', (event) => { + this.shadowRoot.getElementById('recipient').addEventListener('contextmenu', (event) => { const getSelectedText = () => { var text = '' if (typeof window.getSelection != 'undefined') { @@ -1754,7 +2558,7 @@ class MultiWallet extends LitElement { let selectedText = getSelectedText() if (selectedText && typeof selectedText === 'string') { } else { - this.pasteMenu(event, 'btcAmountInput') + this.pasteMenu(event, 'recipient') this.isPasteMenuOpen = true event.preventDefault() event.stopPropagation() @@ -1763,7 +2567,7 @@ class MultiWallet extends LitElement { checkSelectedTextAndShowMenu() }) - this.shadowRoot.getElementById('btcRecipient').addEventListener('contextmenu', (event) => { + this.shadowRoot.getElementById('btcAmountInput').addEventListener('contextmenu', (event) => { const getSelectedText = () => { var text = '' if (typeof window.getSelection != 'undefined') { @@ -1777,7 +2581,7 @@ class MultiWallet extends LitElement { let selectedText = getSelectedText() if (selectedText && typeof selectedText === 'string') { } else { - this.pasteMenu(event, 'btcRecipient') + this.pasteMenu(event, 'btcAmountInput') this.isPasteMenuOpen = true event.preventDefault() event.stopPropagation() @@ -1786,7 +2590,30 @@ class MultiWallet extends LitElement { checkSelectedTextAndShowMenu() }) - this.shadowRoot.getElementById('ltcAmountInput').addEventListener('contextmenu', (event) => { + this.shadowRoot.getElementById('btcRecipient').addEventListener('contextmenu', (event) => { + const getSelectedText = () => { + var text = '' + if (typeof window.getSelection != 'undefined') { + text = window.getSelection().toString() + } else if (typeof this.shadowRoot.selection != 'undefined' && this.shadowRoot.selection.type == 'Text') { + text = this.shadowRoot.selection.createRange().text + } + return text + } + const checkSelectedTextAndShowMenu = () => { + let selectedText = getSelectedText() + if (selectedText && typeof selectedText === 'string') { + } else { + this.pasteMenu(event, 'btcRecipient') + this.isPasteMenuOpen = true + event.preventDefault() + event.stopPropagation() + } + } + checkSelectedTextAndShowMenu() + }) + + this.shadowRoot.getElementById('ltcAmountInput').addEventListener('contextmenu', (event) => { const getSelectedText = () => { var text = '' if (typeof window.getSelection != 'undefined') { @@ -1878,200 +2705,858 @@ class MultiWallet extends LitElement { checkSelectedTextAndShowMenu() }) - this.shadowRoot.getElementById('dgbAmountInput').addEventListener('contextmenu', (event) => { - const getSelectedText = () => { - var text = '' - if (typeof window.getSelection != 'undefined') { - text = window.getSelection().toString() - } else if (typeof this.shadowRoot.selection != 'undefined' && this.shadowRoot.selection.type == 'Text') { - text = this.shadowRoot.selection.createRange().text - } - return text - } - const checkSelectedTextAndShowMenu = () => { - let selectedText = getSelectedText() - if (selectedText && typeof selectedText === 'string') { - } else { - this.pasteMenu(event, 'dgbAmountInput') - this.isPasteMenuOpen = true - event.preventDefault() - event.stopPropagation() - } - } - checkSelectedTextAndShowMenu() - }) + this.shadowRoot.getElementById('dgbAmountInput').addEventListener('contextmenu', (event) => { + const getSelectedText = () => { + var text = '' + if (typeof window.getSelection != 'undefined') { + text = window.getSelection().toString() + } else if (typeof this.shadowRoot.selection != 'undefined' && this.shadowRoot.selection.type == 'Text') { + text = this.shadowRoot.selection.createRange().text + } + return text + } + const checkSelectedTextAndShowMenu = () => { + let selectedText = getSelectedText() + if (selectedText && typeof selectedText === 'string') { + } else { + this.pasteMenu(event, 'dgbAmountInput') + this.isPasteMenuOpen = true + event.preventDefault() + event.stopPropagation() + } + } + checkSelectedTextAndShowMenu() + }) + + this.shadowRoot.getElementById('dgbRecipient').addEventListener('contextmenu', (event) => { + const getSelectedText = () => { + var text = '' + if (typeof window.getSelection != 'undefined') { + text = window.getSelection().toString() + } else if (typeof this.shadowRoot.selection != 'undefined' && this.shadowRoot.selection.type == 'Text') { + text = this.shadowRoot.selection.createRange().text + } + return text + } + const checkSelectedTextAndShowMenu = () => { + let selectedText = getSelectedText() + if (selectedText && typeof selectedText === 'string') { + } else { + this.pasteMenu(event, 'dgbRecipient') + this.isPasteMenuOpen = true + event.preventDefault() + event.stopPropagation() + } + } + checkSelectedTextAndShowMenu() + }) + + this.shadowRoot.getElementById('rvnAmountInput').addEventListener('contextmenu', (event) => { + const getSelectedText = () => { + var text = '' + if (typeof window.getSelection != 'undefined') { + text = window.getSelection().toString() + } else if (typeof this.shadowRoot.selection != 'undefined' && this.shadowRoot.selection.type == 'Text') { + text = this.shadowRoot.selection.createRange().text + } + return text + } + const checkSelectedTextAndShowMenu = () => { + let selectedText = getSelectedText() + if (selectedText && typeof selectedText === 'string') { + } else { + this.pasteMenu(event, 'rvnAmountInput') + this.isPasteMenuOpen = true + event.preventDefault() + event.stopPropagation() + } + } + checkSelectedTextAndShowMenu() + }) + + this.shadowRoot.getElementById('rvnRecipient').addEventListener('contextmenu', (event) => { + const getSelectedText = () => { + var text = '' + if (typeof window.getSelection != 'undefined') { + text = window.getSelection().toString() + } else if (typeof this.shadowRoot.selection != 'undefined' && this.shadowRoot.selection.type == 'Text') { + text = this.shadowRoot.selection.createRange().text + } + return text + } + const checkSelectedTextAndShowMenu = () => { + let selectedText = getSelectedText() + if (selectedText && typeof selectedText === 'string') { + } else { + this.pasteMenu(event, 'rvnRecipient') + this.isPasteMenuOpen = true + event.preventDefault() + event.stopPropagation() + } + } + checkSelectedTextAndShowMenu() + }) + + this.shadowRoot.getElementById('arrrAmountInput').addEventListener('contextmenu', (event) => { + const getSelectedText = () => { + var text = '' + if (typeof window.getSelection != 'undefined') { + text = window.getSelection().toString() + } else if (typeof this.shadowRoot.selection != 'undefined' && this.shadowRoot.selection.type == 'Text') { + text = this.shadowRoot.selection.createRange().text + } + return text + } + const checkSelectedTextAndShowMenu = () => { + let selectedText = getSelectedText() + if (selectedText && typeof selectedText === 'string') { + } else { + this.pasteMenu(event, 'arrrAmountInput') + this.isPasteMenuOpen = true + event.preventDefault() + event.stopPropagation() + } + } + checkSelectedTextAndShowMenu() + }) + + this.shadowRoot.getElementById('arrrRecipient').addEventListener('contextmenu', (event) => { + const getSelectedText = () => { + var text = '' + if (typeof window.getSelection != 'undefined') { + text = window.getSelection().toString() + } else if (typeof this.shadowRoot.selection != 'undefined' && this.shadowRoot.selection.type == 'Text') { + text = this.shadowRoot.selection.createRange().text + } + return text + } + const checkSelectedTextAndShowMenu = () => { + let selectedText = getSelectedText() + if (selectedText && typeof selectedText === 'string') { + } else { + this.pasteMenu(event, 'arrrRecipient') + this.isPasteMenuOpen = true + event.preventDefault() + event.stopPropagation() + } + } + checkSelectedTextAndShowMenu() + }) + + this.shadowRoot.getElementById('arrrMemo').addEventListener('contextmenu', (event) => { + const getSelectedText = () => { + var text = '' + if (typeof window.getSelection != 'undefined') { + text = window.getSelection().toString() + } else if (typeof this.shadowRoot.selection != 'undefined' && this.shadowRoot.selection.type == 'Text') { + text = this.shadowRoot.selection.createRange().text + } + return text + } + const checkSelectedTextAndShowMenu = () => { + let selectedText = getSelectedText() + if (selectedText && typeof selectedText === 'string') { + } else { + this.pasteMenu(event, 'arrrMemo') + this.isPasteMenuOpen = true + event.preventDefault() + event.stopPropagation() + } + } + checkSelectedTextAndShowMenu() + }) + } + + renderClearSuccess() { + let strSuccessValue = this.successMessage + if (strSuccessValue === "") { + return html`` + } else { + return html` +
+ ${this.successMessage} + +
+
+

${translate("walletpage.wchange43")}

+
+ ` + } + } + + renderClearError() { + let strErrorValue = this.errorMessage + if (strErrorValue === "") { + return html`` + } else { + return html` +
+ ${this.errorMessage} + +
+
+

${translate("walletpage.wchange44")}

+
+ ` + } + } + + qortAddressbook() { + if (localStorage.getItem("addressbookQort") === null) { + localStorage.setItem("addressbookQort", "") + } else { + this.qortBook = JSON.parse(localStorage.getItem("addressbookQort") || "[]") + } + } + + btcAddressbook() { + if (localStorage.getItem("addressbookBtc") === null) { + localStorage.setItem("addressbookBtc", "") + } else { + this.btcBook = JSON.parse(localStorage.getItem("addressbookBtc") || "[]") + } + } + + ltcAddressbook() { + if (localStorage.getItem("addressbookLtc") === null) { + localStorage.setItem("addressbookLtc", "") + } else { + this.ltcBook = JSON.parse(localStorage.getItem("addressbookLtc") || "[]") + } + } + + dogeAddressbook() { + if (localStorage.getItem("addressbookDoge") === null) { + localStorage.setItem("addressbookDoge", "") + } else { + this.dogeBook = JSON.parse(localStorage.getItem("addressbookDoge") || "[]") + } + } + + dgbAddressbook() { + if (localStorage.getItem("addressbookDgb") === null) { + localStorage.setItem("addressbookDgb", "") + } else { + this.dgbBook = JSON.parse(localStorage.getItem("addressbookDgb") || "[]") + } + } + + rvnAddressbook() { + if (localStorage.getItem("addressbookRvn") === null) { + localStorage.setItem("addressbookRvn", "") + } else { + this.rvnBook = JSON.parse(localStorage.getItem("addressbookRvn") || "[]") + } + } + + arrrAddressbook() { + if (localStorage.getItem("addressbookArrr") === null) { + localStorage.setItem("addressbookArrr", "") + } else { + this.arrrBook = JSON.parse(localStorage.getItem("addressbookArrr") || "[]") + } + } + + openQortAddressbook() { + this.shadowRoot.querySelector("#qortBookDialog").show() + } + + openBtcAddressbook() { + this.shadowRoot.querySelector("#btcBookDialog").show() + } + + openLtcAddressbook() { + this.shadowRoot.querySelector("#ltcBookDialog").show() + } + + openDogeAddressbook() { + this.shadowRoot.querySelector("#dogeBookDialog").show() + } + + openDgbAddressbook() { + this.shadowRoot.querySelector("#dgbBookDialog").show() + } + + openRvnAddressbook() { + this.shadowRoot.querySelector("#rvnBookDialog").show() + } + + openArrrAddressbook() { + this.shadowRoot.querySelector("#arrrBookDialog").show() + } + + openAddQortAddressDialog() { + this.qortBookAddress = this.selectedTransaction.recipient + this.openAddToQortAddressbook() + this.shadowRoot.querySelector('#showTransactionDetailsDialog').close() + } + + openAddBtcAddressDialog() { + this.btcBookAddress = this.selectedTransaction.btcReceiver + this.openAddToBtcAddressbook() + this.shadowRoot.querySelector('#showBtcTransactionDetailsDialog').close() + } + + openAddLtcAddressDialog() { + this.ltcBookAddress = this.selectedTransaction.ltcReceiver + this.openAddToLtcAddressbook() + this.shadowRoot.querySelector('#showLtcTransactionDetailsDialog').close() + } + + openAddDogeAddressDialog() { + this.dogeBookAddress = this.selectedTransaction.dogeReceiver + this.openAddToDogeAddressbook() + this.shadowRoot.querySelector('#showDogeTransactionDetailsDialog').close() + } + + openAddDgbAddressDialog() { + this.dgbBookAddress = this.selectedTransaction.dgbReceiver + this.openAddToDgbAddressbook() + this.shadowRoot.querySelector('#showDgbTransactionDetailsDialog').close() + } + + openAddRvnAddressDialog() { + this.rvnBookAddress = this.selectedTransaction.rvnReceiver + this.openAddToRvnAddressbook() + this.shadowRoot.querySelector('#showRvnTransactionDetailsDialog').close() + } + + openAddArrrAddressDialog() { + this.arrrBookAddress = this.selectedTransaction.arrrReceiver + this.openAddToArrrAddressbook() + this.shadowRoot.querySelector('#showArrrTransactionDetailsDialog').close() + } + + openAddToQortAddressbook() { + this.shadowRoot.querySelector("#addQortAddressDialog").show() + } + + openAddToBtcAddressbook() { + this.shadowRoot.querySelector("#addBtcAddressDialog").show() + } + + openAddToLtcAddressbook() { + this.shadowRoot.querySelector("#addLtcAddressDialog").show() + } + + openAddToDogeAddressbook() { + this.shadowRoot.querySelector("#addDogeAddressDialog").show() + } + + openAddToDgbAddressbook() { + this.shadowRoot.querySelector("#addDgbAddressDialog").show() + } + + openAddToRvnAddressbook() { + this.shadowRoot.querySelector("#addRvnAddressDialog").show() + } + + openAddToArrrAddressbook() { + this.shadowRoot.querySelector("#addArrrAddressDialog").show() + } + + openImportQortAddressbook() { + this.shadowRoot.querySelector("#importQortAddressbookDialog").show() + } + + openImportBtcAddressbook() { + this.shadowRoot.querySelector("#importBtcAddressbookDialog").show() + } + + openImportLtcAddressbook() { + this.shadowRoot.querySelector("#importLtcAddressbookDialog").show() + } + + openImportDogeAddressbook() { + this.shadowRoot.querySelector("#importDogeAddressbookDialog").show() + } + + openImportDgbAddressbook() { + this.shadowRoot.querySelector("#importDgbAddressbookDialog").show() + } + + openImportRvnAddressbook() { + this.shadowRoot.querySelector("#importRvnAddressbookDialog").show() + } + + openImportArrrAddressbook() { + this.shadowRoot.querySelector("#importArrrAddressbookDialog").show() + } + + closeQortAddressDialog() { + this.shadowRoot.querySelector('#addQortAddressDialog').close() + } + + closeBtcAddressDialog() { + this.shadowRoot.querySelector('#addBtcAddressDialog').close() + } + + closeLtcAddressDialog() { + this.shadowRoot.querySelector('#addLtcAddressDialog').close() + } + + closeDogeAddressDialog() { + this.shadowRoot.querySelector('#addDogeAddressDialog').close() + } + + closeDgbAddressDialog() { + this.shadowRoot.querySelector('#addDgbAddressDialog').close() + } + + closeRvnAddressDialog() { + this.shadowRoot.querySelector('#addRvnAddressDialog').close() + } + + closeArrrAddressDialog() { + this.shadowRoot.querySelector('#addArrrAddressDialog').close() + } + + closeImportQortAddressbookDialog() { + this.shadowRoot.querySelector("#importQortAddressbookDialog").close() + } + + closeImportBtcAddressbookDialog() { + this.shadowRoot.querySelector("#importBtcAddressbookDialog").close() + } + + closeImportLtcAddressbookDialog() { + this.shadowRoot.querySelector("#importLtcAddressbookDialog").close() + } + + closeImportDogeAddressbookDialog() { + this.shadowRoot.querySelector("#importDogeAddressbookDialog").close() + } + + closeImportDgbAddressbookDialog() { + this.shadowRoot.querySelector("#importDgbAddressbookDialog").close() + } + + closeImportRvnAddressbookDialog() { + this.shadowRoot.querySelector("#importRvnAddressbookDialog").close() + } + + closeImportArrrAddressbookDialog() { + this.shadowRoot.querySelector("#importArrrAddressbookDialog").close() + } + + addToQortalAddressbook() { + let name = this.shadowRoot.getElementById('qortNameInput').value + let address = this.shadowRoot.getElementById('qortAddressInput').value + + var oldQortalBook = JSON.parse(localStorage.getItem("addressbookQort") || "[]") + + if (name.length === 0) { + let qortbookstring1 = get("walletpage.wchange50") + parentEpml.request('showSnackBar', `${qortbookstring1}`) + return false + } + + if (address.length === 0) { + let qortbookstring2 = get("walletpage.wchange51") + parentEpml.request('showSnackBar', `${qortbookstring2}`) + return false + } + + const newQortalBookItem = { + name: name, + address: address + } + + oldQortalBook.push(newQortalBookItem) + + localStorage.setItem("addressbookQort", JSON.stringify(oldQortalBook)) + + let qortbookstring2 = get("walletpage.wchange52") + parentEpml.request('showSnackBar', `${qortbookstring2}`) + + this.closeQortAddressDialog() + this.qortBook = JSON.parse(localStorage.getItem("addressbookQort") || "[]") + } + + addToBitcoinAddressbook() { + let name = this.shadowRoot.getElementById('btcNameInput').value + let address = this.shadowRoot.getElementById('btcAddressInput').value + + var oldBitcoinBook = JSON.parse(localStorage.getItem("addressbookBtc") || "[]") + + if (name.length === 0) { + let btcbookstring1 = get("walletpage.wchange50") + parentEpml.request('showSnackBar', `${btcbookstring1}`) + return false + } + + if (address.length === 0) { + let btcbookstring2 = get("walletpage.wchange51") + parentEpml.request('showSnackBar', `${btcbookstring2}`) + return false + } + + const newBitcoinBookItem = { + name: name, + address: address + } + + oldBitcoinBook.push(newBitcoinBookItem) + + localStorage.setItem("addressbookBtc", JSON.stringify(oldBitcoinBook)) + + let btcbookstring3 = get("walletpage.wchange52") + parentEpml.request('showSnackBar', `${btcbookstring3}`) + + this.closeBtcAddressDialog() + this.btcBook = JSON.parse(localStorage.getItem("addressbookBtc") || "[]") + } + + addToLitecoinAddressbook() { + let name = this.shadowRoot.getElementById('ltcNameInput').value + let address = this.shadowRoot.getElementById('ltcAddressInput').value + + var oldLitecoinBook = JSON.parse(localStorage.getItem("addressbookLtc") || "[]") + + if (name.length === 0) { + let ltcbookstring1 = get("walletpage.wchange50") + parentEpml.request('showSnackBar', `${ltcbookstring1}`) + return false + } + + if (address.length === 0) { + let ltcbookstring2 = get("walletpage.wchange51") + parentEpml.request('showSnackBar', `${ltcbookstring2}`) + return false + } + + const newLitecoinBookItem = { + name: name, + address: address + } + + oldLitecoinBook.push(newLitecoinBookItem) + + localStorage.setItem("addressbookLtc", JSON.stringify(oldLitecoinBook)) + + let ltcbookstring3 = get("walletpage.wchange52") + parentEpml.request('showSnackBar', `${ltcbookstring3}`) + + this.closeLtcAddressDialog() + this.ltcBook = JSON.parse(localStorage.getItem("addressbookLtc") || "[]") + } + + addToDogecoinAddressbook() { + let name = this.shadowRoot.getElementById('dogeNameInput').value + let address = this.shadowRoot.getElementById('dogeAddressInput').value + + var oldDogecoinBook = JSON.parse(localStorage.getItem("addressbookDoge") || "[]") + + if (name.length === 0) { + let dogebookstring1 = get("walletpage.wchange50") + parentEpml.request('showSnackBar', `${dogebookstring1}`) + return false + } + + if (address.length === 0) { + let dogebookstring2 = get("walletpage.wchange51") + parentEpml.request('showSnackBar', `${dogebookstring2}`) + return false + } + + const newDogecoinBookItem = { + name: name, + address: address + } + + oldDogecoinBook.push(newDogecoinBookItem) + + localStorage.setItem("addressbookDoge", JSON.stringify(oldDogecoinBook)) + + let dogebookstring3 = get("walletpage.wchange52") + parentEpml.request('showSnackBar', `${dogebookstring3}`) + + this.closeDogeAddressDialog() + this.dogeBook = JSON.parse(localStorage.getItem("addressbookDoge") || "[]") + } + + addToDigibyteAddressbook() { + let name = this.shadowRoot.getElementById('dgbNameInput').value + let address = this.shadowRoot.getElementById('dgbAddressInput').value + + var oldDigibyteBook = JSON.parse(localStorage.getItem("addressbookDgb") || "[]") + + if (name.length === 0) { + let dgbbookstring1 = get("walletpage.wchange50") + parentEpml.request('showSnackBar', `${dgbbookstring1}`) + return false + } + + if (address.length === 0) { + let dgbbookstring2 = get("walletpage.wchange51") + parentEpml.request('showSnackBar', `${dgbbookstring2}`) + return false + } + + const newDigibyteBookItem = { + name: name, + address: address + } + + oldDigibyteBook.push(newDigibyteBookItem) + + localStorage.setItem("addressbookDgb", JSON.stringify(oldDigibyteBook)) + + let dgbbookstring3 = get("walletpage.wchange52") + parentEpml.request('showSnackBar', `${dgbbookstring3}`) + + this.closeDgbAddressDialog() + this.dgbBook = JSON.parse(localStorage.getItem("addressbookDgb") || "[]") + } + + addToRavencoinAddressbook() { + let name = this.shadowRoot.getElementById('rvnNameInput').value + let address = this.shadowRoot.getElementById('rvnAddressInput').value + + var oldRavencoinBook = JSON.parse(localStorage.getItem("addressbookRvn") || "[]") + + if (name.length === 0) { + let rvnbookstring1 = get("walletpage.wchange50") + parentEpml.request('showSnackBar', `${rvnbookstring1}`) + return false + } + + if (address.length === 0) { + let rvnbookstring2 = get("walletpage.wchange51") + parentEpml.request('showSnackBar', `${rvnbookstring2}`) + return false + } + + const newRavencoinBookItem = { + name: name, + address: address + } + + oldRavencoinBook.push(newRavencoinBookItem) + + localStorage.setItem("addressbookRvn", JSON.stringify(oldRavencoinBook)) + + let rvnbookstring3 = get("walletpage.wchange52") + parentEpml.request('showSnackBar', `${rvnbookstring3}`) + + this.closeRvnAddressDialog() + this.rvnBook = JSON.parse(localStorage.getItem("addressbookRvn") || "[]") + } + + addToPiratechainAddressbook() { + let name = this.shadowRoot.getElementById('arrrNameInput').value + let address = this.shadowRoot.getElementById('arrrAddressInput').value + + var oldPiratechainBook = JSON.parse(localStorage.getItem("addressbookArrr") || "[]") + + if (name.length === 0) { + let arrrbookstring1 = get("walletpage.wchange50") + parentEpml.request('showSnackBar', `${arrrbookstring1}`) + return false + } + + if (address.length === 0) { + let arrrbookstring2 = get("walletpage.wchange51") + parentEpml.request('showSnackBar', `${arrrbookstring2}`) + return false + } + + const newPiratechainBookItem = { + name: name, + address: address + } + + oldPiratechainBook.push(newPiratechainBookItem) + + localStorage.setItem("addressbookArrr", JSON.stringify(oldPiratechainBook)) + + let arrrbookstring3 = get("walletpage.wchange52") + parentEpml.request('showSnackBar', `${arrrbookstring3}`) + + this.closeArrrAddressDialog() + this.arrrBook = JSON.parse(localStorage.getItem("addressbookArrr") || "[]") + } + + sendFromQortAddressbook(websiteObj) { + let address = websiteObj.address + this.recipient = address + this.openSendQort() + this.shadowRoot.querySelector('#qortBookDialog').close() + } + + sendFromBtcAddressbook(websiteObj) { + let address = websiteObj.address + this.btcRecipient = address + this.openSendBtc() + this.shadowRoot.querySelector('#btcBookDialog').close() + } + + sendFromLtcAddressbook(websiteObj) { + let address = websiteObj.address + this.ltcRecipient = address + this.openSendLtc() + this.shadowRoot.querySelector('#ltcBookDialog').close() + } + + sendFromDogeAddressbook(websiteObj) { + let address = websiteObj.address + this.dogeRecipient = address + this.openSendDoge() + this.shadowRoot.querySelector('#dogeBookDialog').close() + } + + sendFromDgbAddressbook(websiteObj) { + let address = websiteObj.address + this.dgbRecipient = address + this.openSendDgb() + this.shadowRoot.querySelector('#dgbBookDialog').close() + } + + sendFromRvnAddressbook(websiteObj) { + let address = websiteObj.address + this.rvnRecipient = address + this.openSendRvn() + this.shadowRoot.querySelector('#rvnBookDialog').close() + } + + sendFromArrrAddressbook(websiteObj) { + let address = websiteObj.address + this.arrrRecipient = address + this.openSendArrr() + this.shadowRoot.querySelector('#arrrBookDialog').close() + } + + renderSendFromQortAddressbookButton(websiteObj) { + return html`` + } + + renderSendFromBtcAddressbookButton(websiteObj) { + return html`` + } + + renderSendFromLtcAddressbookButton(websiteObj) { + return html`` + } + + renderSendFromDogeAddressbookButton(websiteObj) { + return html`` + } + + renderSendFromDgbAddressbookButton(websiteObj) { + return html`` + } + + renderSendFromRvnAddressbookButton(websiteObj) { + return html`` + } + + renderSendFromArrrAddressbookButton(websiteObj) { + return html`` + } + + exportQortAddressbook() { + const qortBookData = JSON.stringify(localStorage.getItem("addressbookQort")) + const qortBookSave = JSON.parse((qortBookData) || "[]") + const blob = new Blob([qortBookSave], { type: 'text/plain;charset=utf-8' }) + FileSaver.saveAs(blob, `qortal_addressbook.qort.json`) + } + + exportBtcAddressbook() { + const btcBookData = JSON.stringify(localStorage.getItem("addressbookBtc")) + const btcBookSave = JSON.parse((btcBookData) || "[]") + const blob = new Blob([btcBookSave], { type: 'text/plain;charset=utf-8' }) + FileSaver.saveAs(blob, `bitcoin_addressbook.btc.json`) + } - this.shadowRoot.getElementById('dgbRecipient').addEventListener('contextmenu', (event) => { - const getSelectedText = () => { - var text = '' - if (typeof window.getSelection != 'undefined') { - text = window.getSelection().toString() - } else if (typeof this.shadowRoot.selection != 'undefined' && this.shadowRoot.selection.type == 'Text') { - text = this.shadowRoot.selection.createRange().text - } - return text - } - const checkSelectedTextAndShowMenu = () => { - let selectedText = getSelectedText() - if (selectedText && typeof selectedText === 'string') { - } else { - this.pasteMenu(event, 'dgbRecipient') - this.isPasteMenuOpen = true - event.preventDefault() - event.stopPropagation() - } - } - checkSelectedTextAndShowMenu() - }) + exportLtcAddressbook() { + const ltcBookData = JSON.stringify(localStorage.getItem("addressbookLtc")) + const ltcBookSave = JSON.parse((ltcBookData) || "[]") + const blob = new Blob([ltcBookSave], { type: 'text/plain;charset=utf-8' }) + FileSaver.saveAs(blob, `litecoin_addressbook.ltc.json`) + } - this.shadowRoot.getElementById('rvnAmountInput').addEventListener('contextmenu', (event) => { - const getSelectedText = () => { - var text = '' - if (typeof window.getSelection != 'undefined') { - text = window.getSelection().toString() - } else if (typeof this.shadowRoot.selection != 'undefined' && this.shadowRoot.selection.type == 'Text') { - text = this.shadowRoot.selection.createRange().text - } - return text - } - const checkSelectedTextAndShowMenu = () => { - let selectedText = getSelectedText() - if (selectedText && typeof selectedText === 'string') { - } else { - this.pasteMenu(event, 'dgbRecipient') - this.isPasteMenuOpen = true - event.preventDefault() - event.stopPropagation() - } - } - checkSelectedTextAndShowMenu() - }) + exportDogeAddressbook() { + const dogeBookData = JSON.stringify(localStorage.getItem("addressbookDoge")) + const dogeBookSave = JSON.parse((dogeBookData) || "[]") + const blob = new Blob([dogeBookSave], { type: 'text/plain;charset=utf-8' }) + FileSaver.saveAs(blob, `dogecoin_addressbook.doge.json`) + } - this.shadowRoot.getElementById('rvnAmountInput').addEventListener('contextmenu', (event) => { - const getSelectedText = () => { - var text = '' - if (typeof window.getSelection != 'undefined') { - text = window.getSelection().toString() - } else if (typeof this.shadowRoot.selection != 'undefined' && this.shadowRoot.selection.type == 'Text') { - text = this.shadowRoot.selection.createRange().text - } - return text - } - const checkSelectedTextAndShowMenu = () => { - let selectedText = getSelectedText() - if (selectedText && typeof selectedText === 'string') { - } else { - this.pasteMenu(event, 'rvnAmountInput') - this.isPasteMenuOpen = true - event.preventDefault() - event.stopPropagation() - } - } - checkSelectedTextAndShowMenu() - }) + exportDgbAddressbook() { + const dgbBookData = JSON.stringify(localStorage.getItem("addressbookDgb")) + const dgbBookSave = JSON.parse((dgbBookData) || "[]") + const blob = new Blob([dgbBookSave], { type: 'text/plain;charset=utf-8' }) + FileSaver.saveAs(blob, `digibyte_addressbook.dgb.json`) + } - this.shadowRoot.getElementById('arrrAmountInput').addEventListener('contextmenu', (event) => { - const getSelectedText = () => { - var text = '' - if (typeof window.getSelection != 'undefined') { - text = window.getSelection().toString() - } else if (typeof this.shadowRoot.selection != 'undefined' && this.shadowRoot.selection.type == 'Text') { - text = this.shadowRoot.selection.createRange().text - } - return text - } - const checkSelectedTextAndShowMenu = () => { - let selectedText = getSelectedText() - if (selectedText && typeof selectedText === 'string') { - } else { - this.pasteMenu(event, 'arrrAmountInput') - this.isPasteMenuOpen = true - event.preventDefault() - event.stopPropagation() - } - } - checkSelectedTextAndShowMenu() - }) + exportRvnAddressbook() { + const rvnBookData = JSON.stringify(localStorage.getItem("addressbookRvn")) + const rvnBookSave = JSON.parse((rvnBookData) || "[]") + const blob = new Blob([rvnBookSave], { type: 'text/plain;charset=utf-8' }) + FileSaver.saveAs(blob, `ravencoin_addressbook.rvn.json`) + } - this.shadowRoot.getElementById('arrrRecipient').addEventListener('contextmenu', (event) => { - const getSelectedText = () => { - var text = '' - if (typeof window.getSelection != 'undefined') { - text = window.getSelection().toString() - } else if (typeof this.shadowRoot.selection != 'undefined' && this.shadowRoot.selection.type == 'Text') { - text = this.shadowRoot.selection.createRange().text - } - return text - } - const checkSelectedTextAndShowMenu = () => { - let selectedText = getSelectedText() - if (selectedText && typeof selectedText === 'string') { - } else { - this.pasteMenu(event, 'arrrRecipient') - this.isPasteMenuOpen = true - event.preventDefault() - event.stopPropagation() - } - } - checkSelectedTextAndShowMenu() - }) + exportArrrAddressbook() { + const arrrBookData = JSON.stringify(localStorage.getItem("addressbookArrr")) + const arrrBookSave = JSON.parse((arrrBookData) || "[]") + const blob = new Blob([arrrBookSave], { type: 'text/plain;charset=utf-8' }) + FileSaver.saveAs(blob, `piratechain_addressbook.arrr.json`) + } - this.shadowRoot.getElementById('arrrMemo').addEventListener('contextmenu', (event) => { - const getSelectedText = () => { - var text = '' - if (typeof window.getSelection != 'undefined') { - text = window.getSelection().toString() - } else if (typeof this.shadowRoot.selection != 'undefined' && this.shadowRoot.selection.type == 'Text') { - text = this.shadowRoot.selection.createRange().text - } - return text - } - const checkSelectedTextAndShowMenu = () => { - let selectedText = getSelectedText() - if (selectedText && typeof selectedText === 'string') { - } else { - this.pasteMenu(event, 'arrrMemo') - this.isPasteMenuOpen = true - event.preventDefault() - event.stopPropagation() - } - } - checkSelectedTextAndShowMenu() - }) + importQortAddressbook(file) { + localStorage.removeItem("addressbookQort") + const newItems = JSON.parse((file) || "[]") + localStorage.setItem("addressbookQort", JSON.stringify(newItems)) + this.qortBook = JSON.parse(localStorage.getItem("addressbookQort") || "[]") + this.shadowRoot.querySelector('#importQortAddressbookDialog').close() } - renderClearSuccess() { - let strSuccessValue = this.successMessage - if (strSuccessValue === "") { - return html`` - } else { - return html` -
- ${this.successMessage} - -
-
-

${translate("walletpage.wchange43")}

-
- ` - } + importBtcAddressbook(file) { + localStorage.removeItem("addressbookBtc") + const newItems = JSON.parse((file) || "[]") + localStorage.setItem("addressbookBtc", JSON.stringify(newItems)) + this.btcBook = JSON.parse(localStorage.getItem("addressbookBtc") || "[]") + this.shadowRoot.querySelector('#importBtcAddressbookDialog').close() } - renderClearError() { - let strErrorValue = this.errorMessage - if (strErrorValue === "") { - return html`` - } else { - return html` -
- ${this.errorMessage} - -
-
-

${translate("walletpage.wchange44")}

-
- ` - } + importLtcAddressbook(file) { + localStorage.removeItem("addressbookLtc") + const newItems = JSON.parse((file) || "[]") + localStorage.setItem("addressbookLtc", JSON.stringify(newItems)) + this.ltcBook = JSON.parse(localStorage.getItem("addressbookLtc") || "[]") + this.shadowRoot.querySelector('#importLtcAddressbookDialog').close() + } + + importDogeAddressbook(file) { + localStorage.removeItem("addressbookDoge") + const newItems = JSON.parse((file) || "[]") + localStorage.setItem("addressbookDoge", JSON.stringify(newItems)) + this.dogeBook = JSON.parse(localStorage.getItem("addressbookDoge") || "[]") + this.shadowRoot.querySelector('#importDogeAddressbookDialog').close() + } + + importDgbAddressbook(file) { + localStorage.removeItem("addressbookDgb") + const newItems = JSON.parse((file) || "[]") + localStorage.setItem("addressbookDgb", JSON.stringify(newItems)) + this.dgbBook = JSON.parse(localStorage.getItem("addressbookDgb") || "[]") + this.shadowRoot.querySelector('#importDgbAddressbookDialog').close() + } + + importRvnAddressbook(file) { + localStorage.removeItem("addressbookRvn") + const newItems = JSON.parse((file) || "[]") + localStorage.setItem("addressbookRvn", JSON.stringify(newItems)) + this.rvnBook = JSON.parse(localStorage.getItem("addressbookRvn") || "[]") + this.shadowRoot.querySelector('#importRvnAddressbookDialog').close() + } + + importArrrAddressbook(file) { + localStorage.removeItem("addressbookArrr") + const newItems = JSON.parse((file) || "[]") + localStorage.setItem("addressbookArrr", JSON.stringify(newItems)) + this.arrrBook = JSON.parse(localStorage.getItem("addressbookArrr") || "[]") + this.shadowRoot.querySelector('#importArrrAddressbookDialog').close() } closeQortDialog() { @@ -2110,6 +3595,12 @@ class MultiWallet extends LitElement { this.errorMessage = '' } + closeArrrDialog() { + this.shadowRoot.querySelector('#sendArrrDialog').close() + this.successMessage = '' + this.errorMessage = '' + } + sendToQortAddress() { this.recipient = this.selectedTransaction.recipient this.openSendQort() @@ -2146,6 +3637,12 @@ class MultiWallet extends LitElement { this.shadowRoot.querySelector('#showRvnTransactionDetailsDialog').close() } + sendToArrrAddress() { + this.arrrRecipient = this.selectedTransaction.arrrReceiver + this.openSendArrr() + this.shadowRoot.querySelector('#showArrrTransactionDetailsDialog').close() + } + calculateQortAll() { if (this.balance < 0.00100000) { let not_enough_string = get("walletpage.wchange26") @@ -2205,12 +3702,25 @@ class MultiWallet extends LitElement { } } + calculateArrrAll() { + if (this.balance < 0.00000002) { + let not_enough_string = get("walletpage.wchange26") + parentEpml.request('showSnackBar', `${not_enough_string}`) + } else { + this.arrrAmount = (this.balance - 0.00000001).toFixed(8) + } + } + renderSQB() { let displaybutton = this.selectedTransaction.recipient if (displaybutton == null) { return html`${this.selectedTransaction.recipient}` } else { - return html`${this.selectedTransaction.recipient} this.sendToQortAddress()} title="${translate("walletpage.wchange46")}">` + return html` + ${this.selectedTransaction.recipient} + this.sendToQortAddress()} title="${translate("walletpage.wchange46")}"> + this.openAddQortAddressDialog()} title="${translate("walletpage.wchange49")}"> + ` } } @@ -2635,7 +4145,7 @@ class MultiWallet extends LitElement { this.showWallet() } - async sendRvn() { + async sendRvn() { const rvnAmount = this.shadowRoot.getElementById('rvnAmountInput').value let rvnRecipient = this.shadowRoot.getElementById('rvnRecipient').value const xprv58 = this.wallets.get(this._selectedWallet).wallet.derivedMasterPrivateKey @@ -2696,7 +4206,6 @@ class MultiWallet extends LitElement { receivingAddress: arrrRecipient, arrrAmount: arrrAmount, memo: arrrMemo - //feePerByte: (this.arrrFeePerByte / 1e8).toFixed(8), // Not supported in ARRR } const response = await parentEpml.request('sendArrr', opts) return response @@ -2742,7 +4251,6 @@ class MultiWallet extends LitElement { } } const coin = this._selectedWallet - await this.fetchWalletAddress(this._selectedWallet) await this.fetchWalletDetails(this._selectedWallet) if (this._selectedWallet == coin) { await this.renderTransactions() @@ -2754,9 +4262,9 @@ class MultiWallet extends LitElement { } async fetchWalletDetails(coin) { + this.balanceString = this.renderFetchText() switch (coin) { case 'qort': - this.balanceString = this.renderFetchText() parentEpml.request('apiCall', { url: `/addresses/balance/${this.wallets.get('qort').wallet.address}?apiKey=${this.getApiKey()}`, }) @@ -2787,7 +4295,6 @@ class MultiWallet extends LitElement { case 'doge': case 'dgb': case 'rvn': - this.balanceString = this.renderFetchText() const walletName = `${coin}Wallet` parentEpml.request('apiCall', { url: `/crosschain/${coin}/walletbalance?apiKey=${this.getApiKey()}`, @@ -2910,19 +4417,79 @@ class MultiWallet extends LitElement { renderSendButton() { if ( this._selectedWallet === "qort" ) { - return html` this.openSendQort()}> ${translate("walletpage.wchange17")} QORT` + return html` this.openSendQort()}> ${translate("walletpage.wchange17")} QORT` + } else if ( this._selectedWallet === "btc" ) { + return html` this.openSendBtc()}> ${translate("walletpage.wchange17")} BTC` + } else if ( this._selectedWallet === "ltc" ) { + return html` this.openSendLtc()}> ${translate("walletpage.wchange17")} LTC` + } else if ( this._selectedWallet === "doge" ) { + return html` this.openSendDoge()}> ${translate("walletpage.wchange17")} DOGE` + } else if ( this._selectedWallet === "dgb" ) { + return html` this.openSendDgb()}> ${translate("walletpage.wchange17")} DGB` + } else if ( this._selectedWallet === "rvn" ) { + return html` this.openSendRvn()}> ${translate("walletpage.wchange17")} RVN` + } else if ( this._selectedWallet === "arrr" ) { + return html` this.openSendArrr()}> ${translate("walletpage.wchange17")} ARRR` + } else { + return html`` + } + } + + renderAddressbookButton() { + if ( this._selectedWallet === "qort" ) { + return html` this.openQortAddressbook()}> ${translate("walletpage.wchange47")}` + } else if ( this._selectedWallet === "btc" ) { + return html` this.openBtcAddressbook()}> ${translate("walletpage.wchange47")}` + } else if ( this._selectedWallet === "ltc" ) { + return html` this.openLtcAddressbook()}> ${translate("walletpage.wchange47")}` + } else if ( this._selectedWallet === "doge" ) { + return html` this.openDogeAddressbook()}> ${translate("walletpage.wchange47")}` + } else if ( this._selectedWallet === "dgb" ) { + return html` this.openDgbAddressbook()}> ${translate("walletpage.wchange47")}` + } else if ( this._selectedWallet === "rvn" ) { + return html` this.openRvnAddressbook()}> ${translate("walletpage.wchange47")}` + } else if ( this._selectedWallet === "arrr" ) { + return html` this.openArrrAddressbook()}> ${translate("walletpage.wchange47")}` + } else { + return html`` + } + } + + renderExportAddressbookButton() { + if ( this._selectedWallet === "qort" ) { + return html` this.exportQortAddressbook()}> ${translate("walletpage.wchange54")}` + } else if ( this._selectedWallet === "btc" ) { + return html` this.exportBtcAddressbook()}> ${translate("walletpage.wchange54")}` + } else if ( this._selectedWallet === "ltc" ) { + return html` this.exportKLtcAddressbook()}> ${translate("walletpage.wchange54")}` + } else if ( this._selectedWallet === "doge" ) { + return html` this.exportDogeAddressbook()}> ${translate("walletpage.wchange54")}` + } else if ( this._selectedWallet === "dgb" ) { + return html` this.exportDgbAddressbook()}> ${translate("walletpage.wchange54")}` + } else if ( this._selectedWallet === "rvn" ) { + return html` this.exportRvnAddressbook()}> ${translate("walletpage.wchange54")}` + } else if ( this._selectedWallet === "arrr" ) { + return html` this.exportArrrAddressbook()}> ${translate("walletpage.wchange54")}` + } else { + return html`` + } + } + + renderImportAddressbookButton() { + if ( this._selectedWallet === "qort" ) { + return html` this.openImportQortAddressbook()}> ${translate("walletpage.wchange53")}` } else if ( this._selectedWallet === "btc" ) { - return html` this.openSendBtc()}> ${translate("walletpage.wchange17")} BTC` + return html` this.openImportBtcAddressbook()}> ${translate("walletpage.wchange53")}` } else if ( this._selectedWallet === "ltc" ) { - return html` this.openSendLtc()}> ${translate("walletpage.wchange17")} LTC` + return html` this.openImportLtcAddressbook()}> ${translate("walletpage.wchange53")}` } else if ( this._selectedWallet === "doge" ) { - return html` this.openSendDoge()}> ${translate("walletpage.wchange17")} DOGE` + return html` this.openImportDogeAddressbook()}> ${translate("walletpage.wchange53")}` } else if ( this._selectedWallet === "dgb" ) { - return html` this.openSendDgb()}> ${translate("walletpage.wchange17")} DGB` + return html` this.openImportDgbAddressbook()}> ${translate("walletpage.wchange53")}` } else if ( this._selectedWallet === "rvn" ) { - return html` this.openSendRvn()}> ${translate("walletpage.wchange17")} RVN` + return html` this.openImportRvnAddressbook()}> ${translate("walletpage.wchange53")}` } else if ( this._selectedWallet === "arrr" ) { - return html` this.openSendArrr()}> ${translate("walletpage.wchange17")} ARRR` + return html` this.openImportArrrAddressbook()}> ${translate("walletpage.wchange53")}` } else { return html`` } @@ -2948,7 +4515,7 @@ class MultiWallet extends LitElement { this.shadowRoot.querySelector("#sendDgbDialog").show(); } - openSendRvn() { + openSendRvn() { this.shadowRoot.querySelector("#sendRvnDialog").show(); } @@ -3045,13 +4612,12 @@ class MultiWallet extends LitElement { }, { passive: true } ) - } - else if (coin === 'arrr') { + } else if (coin === 'arrr') { this.transactionsGrid.addEventListener( 'click', (e) => { - let dgbItem = this.transactionsGrid.getEventContext(e).item - this.showArrrTransactionDetails(dgbItem, this.wallets.get(this._selectedWallet).transactions) + let arrrItem = this.transactionsGrid.getEventContext(e).item + this.showArrrTransactionDetails(arrrItem, this.wallets.get(this._selectedWallet).transactions) }, { passive: true } ) @@ -3074,7 +4640,7 @@ class MultiWallet extends LitElement { render(this.renderDgbTransactions(this.wallets.get(this._selectedWallet).transactions, this._selectedWallet), this.transactionsDOM) } else if (this._selectedWallet === 'rvn') { render(this.renderRvnTransactions(this.wallets.get(this._selectedWallet).transactions, this._selectedWallet), this.transactionsDOM) - } else if (this._selectedWallet === 'arrr') { + } else if (this._selectedWallet === 'arrr') { render(this.renderArrrTransactions(this.wallets.get(this._selectedWallet).transactions, this._selectedWallet), this.transactionsDOM) } } @@ -3399,7 +4965,7 @@ class MultiWallet extends LitElement { ` } - renderRvnTransactions(transactions, coin) { + renderRvnTransactions(transactions, coin) { return html`
${translate("walletpage.wchange38")}
@@ -3461,7 +5027,7 @@ class MultiWallet extends LitElement {
- ` + ` } renderArrrTransactions(transactions, coin) { @@ -3535,7 +5101,7 @@ class MultiWallet extends LitElement {
- ` + ` } async updateItemsFromPage(page, changeWallet = false) { @@ -3724,7 +5290,7 @@ class MultiWallet extends LitElement { }) } - showRvnTransactionDetails(myTransaction, allTransactions) { + showRvnTransactionDetails(myTransaction, allTransactions) { allTransactions.forEach((transaction) => { if (myTransaction.txHash === transaction.txHash) { let rvnTxnFlow = myTransaction.inputs[0].address === this.wallets.get(this._selectedWallet).wallet.address ? 'OUT' : 'IN' @@ -3752,6 +5318,7 @@ class MultiWallet extends LitElement { }) } + isEmptyArray(arr) { if (!arr) { return true From f8365365381e3b652b2af26fb4c1ebd96ba97010 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Mon, 22 Aug 2022 18:07:56 +0200 Subject: [PATCH 29/33] Add files via upload --- qortal-ui-core/language/de.json | 11 +++++++++-- qortal-ui-core/language/es.json | 11 +++++++++-- qortal-ui-core/language/fr.json | 11 +++++++++-- qortal-ui-core/language/hindi.json | 11 +++++++++-- qortal-ui-core/language/hr.json | 11 +++++++++-- qortal-ui-core/language/hu.json | 11 +++++++++-- qortal-ui-core/language/it.json | 11 +++++++++-- qortal-ui-core/language/ko.json | 11 +++++++++-- qortal-ui-core/language/no.json | 13 ++++++++++--- qortal-ui-core/language/pl.json | 11 +++++++++-- qortal-ui-core/language/pt.json | 11 +++++++++-- qortal-ui-core/language/ro.json | 19 +++++++++++++------ qortal-ui-core/language/rs.json | 11 +++++++++-- qortal-ui-core/language/ru.json | 13 ++++++++++--- qortal-ui-core/language/us.json | 28 +++++++++++++++++++++++----- qortal-ui-core/language/zhc.json | 11 +++++++++-- qortal-ui-core/language/zht.json | 11 +++++++++-- 17 files changed, 173 insertions(+), 43 deletions(-) diff --git a/qortal-ui-core/language/de.json b/qortal-ui-core/language/de.json index c9fb69ec..cdc7f174 100644 --- a/qortal-ui-core/language/de.json +++ b/qortal-ui-core/language/de.json @@ -245,7 +245,14 @@ "wchange47":"Adressbuch", "wchange48":"Dieses Adressbuch ist leer !", "wchange49":"Zum Adressbuch hinzufügen", - "wchange50":"Memo" + "wchange50":"Der Name darf nicht leer sein!", + "wchange51":"Adresse darf nicht leer sein!", + "wchange52":"Erfolgreich hinzugefügt!", + "wchange53":"Adressbuch importieren", + "wchange54":"Adressbuch exportieren", + "wchange55":"Ihr bestehendes Adressbuch wird gelöscht und aus einem Backup neu erstellt.", + "wchange56":"WARNUNG!", + "wchange57":"Memo" }, "tradepage":{ "tchange1":"Handelsportal", @@ -622,4 +629,4 @@ "rewarddialog5":"Sie entfernen eine Prämienaktientransaktion, die mit dem Konto verknüpft ist:", "rewarddialog6":"Wenn Sie auf „Bestätigen“ klicken, wird die Prämie entfernt und der Prägeschlüssel wird ungültig." } -} +} \ No newline at end of file diff --git a/qortal-ui-core/language/es.json b/qortal-ui-core/language/es.json index 2065edde..9dafa945 100644 --- a/qortal-ui-core/language/es.json +++ b/qortal-ui-core/language/es.json @@ -245,7 +245,14 @@ "wchange47":"Directorio", "wchange48":"Esta libreta de direcciones está vacía !", "wchange49":"Agregar a la libreta de direcciones", - "wchange50":"Memo" + "wchange50":"El nombre no puede estar vacío!", + "wchange51":"La dirección no puede estar vacía!", + "wchange52":"Agregado exitosamente!", + "wchange53":"Importar libreta de direcciones", + "wchange54":"Exportar libreta de direcciones", + "wchange55":"Su libreta de direcciones existente se eliminará y se creará una nueva copia de seguridad.", + "wchange56":"ADVERTENCIA!", + "wchange57":"Memorándum" }, "tradepage":{ "tchange1":"Portal de Comercio", @@ -622,4 +629,4 @@ "rewarddialog5":"Está eliminando una transacción de recompensa compartida asociada con la cuenta:", "rewarddialog6":"Al presionar confirmar, se eliminará la recompensa compartida y la clave de acuñación dejará de ser válida." } -} +} \ No newline at end of file diff --git a/qortal-ui-core/language/fr.json b/qortal-ui-core/language/fr.json index 21fcb192..768b25c5 100644 --- a/qortal-ui-core/language/fr.json +++ b/qortal-ui-core/language/fr.json @@ -245,7 +245,14 @@ "wchange47":"Carnet d'adresses", "wchange48":"Ce carnet d'adresses est vide !", "wchange49":"Ajouter au carnet d'adresses", - "wchange50":"Memo" + "wchange50":"Le nom ne peut pas être vide!", + "wchange51":"L'adresse ne peut pas être vide!", + "wchange52":"Ajouté avec succès!", + "wchange53":"Importer le carnet d'adresses", + "wchange54":"Exporter le carnet d'adresses", + "wchange55":"Votre carnet d'adresses existant sera supprimé et une nouvelle sauvegarde sera créée.", + "wchange56":"ATTENTION!", + "wchange57":"Mémo" }, "tradepage":{ "tchange1":"Portail de commerce", @@ -622,4 +629,4 @@ "rewarddialog5":"Vous supprimez une transaction de partage de récompenses associée au compte :", "rewarddialog6":"En appuyant sur confirmer, le partage de récompense sera supprimé et la clé de frappe deviendra invalide." } -} +} \ No newline at end of file diff --git a/qortal-ui-core/language/hindi.json b/qortal-ui-core/language/hindi.json index 691b9fbc..dc1caea4 100644 --- a/qortal-ui-core/language/hindi.json +++ b/qortal-ui-core/language/hindi.json @@ -246,7 +246,14 @@ "wchange47":"पता पुस्तिका", "wchange48":"यह पता पुस्तिका खाली है !", "wchange49":"पता सूची में जोड़ें", - "wchange50":"Memo" + "wchange50":"नाम खाली नहीं हो सकता!", + "wchange51":"पता खाली नहीं हो सकता!", + "wchange52":"सफलतापूर्वक शामिल!", + "wchange53":"पता पुस्तिका आयात करें", + "wchange54":"निर्यात पता पुस्तिका", + "wchange55":"आपकी मौजूदा पता पुस्तिका हटा दी जाएगी और बैकअप से नया बनाया जाएगा।", + "wchange56":"चेतावनी!", + "wchange57":"ज्ञापन" }, "tradepage":{ "tchange1":"व्यापार पोर्टल", @@ -623,4 +630,4 @@ "rewarddialog5":"आप खाते से जुड़े एक इनाम शेयर लेनदेन को हटा रहे हैं:", "rewarddialog6":"कन्फर्म दबाने पर, रिवॉर्डशेयर हटा दिया जाएगा और मिंटिंग की अमान्य हो जाएगी।" } -} +} \ No newline at end of file diff --git a/qortal-ui-core/language/hr.json b/qortal-ui-core/language/hr.json index 722a58ba..e8624aab 100644 --- a/qortal-ui-core/language/hr.json +++ b/qortal-ui-core/language/hr.json @@ -245,7 +245,14 @@ "wchange47":"Adresar", "wchange48":"Ovaj adresar je prazan !", "wchange49":"Dodaj u adresar", - "wchange50":"Memo" + "wchange50":"Ime ne može biti prazno!", + "wchange51":"Adresa ne može biti prazna!", + "wchange52":"Uspješno dodano!", + "wchange53":"Uvezi adresar", + "wchange54":"Izvezi adresar", + "wchange55":"Vaš postojeći adresar bit će izbrisan i novi će se stvoriti iz sigurnosne kopije.", + "wchange56":"UPOZORENJE!", + "wchange57":"Dopis" }, "tradepage":{ "tchange1":"Portal razmjene", @@ -622,4 +629,4 @@ "rewarddialog5":"Uklanjate transakciju dijeljenja nagrade povezanu s računom:", "rewarddialog6":"Pritiskom na potvrdu, dijeljenje nagrade bit će uklonjeno, a ključ za kovanje postat će nevažeći." } -} +} \ No newline at end of file diff --git a/qortal-ui-core/language/hu.json b/qortal-ui-core/language/hu.json index 5704b6f3..f99ff5f9 100644 --- a/qortal-ui-core/language/hu.json +++ b/qortal-ui-core/language/hu.json @@ -245,7 +245,14 @@ "wchange47":"Címjegyzék", "wchange48":"Ez a címjegyzék üres !", "wchange49":"Hozzáadás a címjegyzékhez", - "wchange50":"Memo" + "wchange50":"A név nem lehet üres!", + "wchange51":"A cím nem lehet üres!", + "wchange52":"Sikeresen hozzáadva!", + "wchange53":"Címjegyzék importálása", + "wchange54":"Címjegyzék exportálása", + "wchange55":"Meglévő címjegyzéke törlésre kerül, és a biztonsági másolatból új jön létre.", + "wchange56":"FIGYELEM!", + "wchange57":"Memo" }, "tradepage":{ "tchange1":"Kereskedelmi Portál", @@ -622,4 +629,4 @@ "rewarddialog5":"Ön a következő fiókhoz társított jutalommegosztási tranzakciót távolít el:", "rewarddialog6":"A megerősítés megnyomására a jutalommegosztás törlődik, és a pénzverési kulcs érvénytelenné válik." } -} +} \ No newline at end of file diff --git a/qortal-ui-core/language/it.json b/qortal-ui-core/language/it.json index fe986d28..d4d8c032 100644 --- a/qortal-ui-core/language/it.json +++ b/qortal-ui-core/language/it.json @@ -245,7 +245,14 @@ "wchange47":"Rubrica", "wchange48":"Questa rubrica è vuota !", "wchange49":"Aggiungi alla rubrica", - "wchange50":"Memo" + "wchange50":"Il nome non può essere vuoto!", + "wchange51":"L'indirizzo non può essere vuoto!", + "wchange52":"Aggiunto con successo!", + "wchange53":"Importa rubrica", + "wchange54":"Esporta rubrica", + "wchange55":"La tua rubrica esistente verrà eliminata e dal backup verrà creata una nuova.", + "wchange56":"AVVERTIMENTO!", + "wchange57":"Memo" }, "tradepage":{ "tchange1":"Portale commerciale", @@ -622,4 +629,4 @@ "rewarddialog5":"Stai rimuovendo una transazione di quota premio associata all'account:", "rewarddialog6":"Premendo conferma, la condivisione del premio verrà rimossa e la chiave di conio non sarà più valida." } -} +} \ No newline at end of file diff --git a/qortal-ui-core/language/ko.json b/qortal-ui-core/language/ko.json index 9c1196d5..0917849e 100644 --- a/qortal-ui-core/language/ko.json +++ b/qortal-ui-core/language/ko.json @@ -245,7 +245,14 @@ "wchange47":"주소록", "wchange48":"이 주소록이 비어 있습니다 !", "wchange49":"주소록에 추가하다", - "wchange50":"Memo" + "wchange50":"이름은 비워둘 수 없습니다!", + "wchange51":"주소는 비워둘 수 없습니다!", + "wchange52":"성공적으로 추가되었습니다!", + "wchange53":"주소록 가져오기", + "wchange54":"주소록 내보내기", + "wchange55":"기존 주소록이 삭제되고 백업에서 새로 생성됩니다.", + "wchange56":"경고!", + "wchange57":"메모" }, "tradepage":{ "tchange1":"무역 포털", @@ -622,4 +629,4 @@ "rewarddialog5":"계정과 연결된 보상 공유 트랜잭션을 제거하는 중입니다.", "rewarddialog6":"확인을 누르면 보상 공유가 제거되고 조폐 키가 유효하지 않게 됩니다." } -} +} \ No newline at end of file diff --git a/qortal-ui-core/language/no.json b/qortal-ui-core/language/no.json index 3e05528f..fda5e7f5 100644 --- a/qortal-ui-core/language/no.json +++ b/qortal-ui-core/language/no.json @@ -181,7 +181,7 @@ "mchange35":"Sponsing", "mchange36":"Sponsoren din vil utstede deg en sponsenøkkel (Sponsorship Key) som du vil bruke for å legge til noden din, så du kan begynne å minte (der er ingen belønninger før du når nivå 1.) Når du har nådd nivå 1, oppretter/tildeler du din egen ‘mintenøkkel’ og begynner å tjene belønninger. Du har XXXX blokker igjen i sponsingsperioden.", "mchange37":"Simpelthen ta kontakt med en minter i Qortal som har et høyt nok nivå til å utstede en sponsenøkkel, skaff den nøkkelen, og kom så tilbake hit og fyll inn nøkkelen for å begynne mintereisen!", - "mchange38":"i" + "mchange38":"om" }, "becomeMinterPage":{ "bchange7":"Skriv inn sponsornøkkel", @@ -245,7 +245,14 @@ "wchange47":"Adressebok", "wchange48":"Denne adresseboken er tom !", "wchange49":"Legg til i Adresseboken", - "wchange50":"Memo" + "wchange50":"Navnet kan ikke stå tomt!", + "wchange51":"Adressen kan ikke være tom!", + "wchange52":"Lagt til!", + "wchange53":"Importer adressebok", + "wchange54":"Eksporter adressebok", + "wchange55":"Din eksisterende adressebok vil bli slettet og ny opprettet fra sikkerhetskopi.", + "wchange56":"ADVARSEL!", + "wchange57":"Memo" }, "tradepage":{ "tchange1":"Handelsportal", @@ -617,4 +624,4 @@ "rewarddialog5":"Du fjerner en transaksjon for belønningsdel knyttet til konto:", "rewarddialog6":"Ved å trykke på Bekreft, vil belønningsdelen bli fjernet og mintnøkkelen blir ugyldig." } -} +} \ No newline at end of file diff --git a/qortal-ui-core/language/pl.json b/qortal-ui-core/language/pl.json index 03c73969..52486b40 100644 --- a/qortal-ui-core/language/pl.json +++ b/qortal-ui-core/language/pl.json @@ -245,7 +245,14 @@ "wchange47":"Książka adresowa", "wchange48":"Ta książka adresowa jest pusta !", "wchange49":"Dodaj do książki adresowej", - "wchange50":"Memo" + "wchange50":"Nazwa nie może być pusta!", + "wchange51":"Adres nie może być pusty!", + "wchange52":"Pomyslnie dodano!", + "wchange53":"Importuj książkę adresową", + "wchange54":"Eksportuj książkę adresową", + "wchange55":"Twoja istniejąca książka adresowa zostanie usunięta, az kopii zapasowej utworzona nowa.", + "wchange56":"OSTRZEŻENIE!", + "wchange57":"Memo" }, "tradepage":{ "tchange1":"Portal Handlowy", @@ -622,4 +629,4 @@ "rewarddialog5":"Usuwasz transakcję dotyczącą udziału w nagrodach powiązaną z kontem:", "rewarddialog6":"Po naciśnięciu przycisku Potwierdź udział w nagrodach zostanie usunięty, a klucz bicia stanie się nieważny." } -} +} \ No newline at end of file diff --git a/qortal-ui-core/language/pt.json b/qortal-ui-core/language/pt.json index b63c6fdd..ca6e1953 100644 --- a/qortal-ui-core/language/pt.json +++ b/qortal-ui-core/language/pt.json @@ -245,7 +245,14 @@ "wchange47":"Livro de endereços", "wchange48":"Este catálogo de endereços está vazio !", "wchange49":"Adicionar ao catálogo de endereços", - "wchange50":"Memo" + "wchange50":"O nome não pode ficar vazio!", + "wchange51":"O endereço não pode estar vazio!", + "wchange52":"Adicionado com sucesso!", + "wchange53":"Importar catálogo de endereços", + "wchange54":"Exportar catálogo de endereços", + "wchange55":"Seu catálogo de endereços existente será excluído e o backup será criado novamente.", + "wchange56":"AVISO!", + "wchange57":"Memorando" }, "tradepage":{ "tchange1":"Portal do Comércio", @@ -622,4 +629,4 @@ "rewarddialog5":"Você está removendo uma transação de compartilhamento de recompensa associada à conta:", "rewarddialog6":"Ao pressionar confirmar, o rewardshare será removido e a chave de cunhagem se tornará inválida." } -} +} \ No newline at end of file diff --git a/qortal-ui-core/language/ro.json b/qortal-ui-core/language/ro.json index 6ba59693..53c92726 100644 --- a/qortal-ui-core/language/ro.json +++ b/qortal-ui-core/language/ro.json @@ -177,9 +177,9 @@ "mchange31":"Apasa pentru Ajutor", "mchange32":"Devino Producator de Moneda", "mchange33":"Introducere", - "mchange34":"In Qortal, pentru a deveni un productor de moneda si a incepe sa castigi recompense QORT odata cu cresterea nivelului de productor de moneda, trebuie mai intai sa devii �sponsorizat�. Un sponsor in Qortal este orice alt productor de moneda de nivel 5 sau mai mare, sau un Fondator Qortal. Veti obtine o cheie de sponsorizare de la sponsor si veti folosi acea cheie pentru a ajunge la nivelul 1. Odata ce ati ajuns la nivelul 1, veti putea sa va creati propria cheie de producere a monedei si sa incepeti sa castigati recompense pentru a ajuta la securizarea Qortal Blockchain.", + "mchange34":"In Qortal, pentru a deveni un productor de moneda si a incepe sa castigi recompense QORT odata cu cresterea nivelului de productor de moneda, trebuie mai intai sa devii sponsorizat. Un sponsor in Qortal este orice alt productor de moneda de nivel 5 sau mai mare, sau un Fondator Qortal. Veti obtine o cheie de sponsorizare de la sponsor si veti folosi acea cheie pentru a ajunge la nivelul 1. Odata ce ati ajuns la nivelul 1, veti putea sa va creati propria cheie de producere a monedei si sa incepeti sa castigati recompense pentru a ajuta la securizarea Qortal Blockchain.", "mchange35":"Sponsorizare", - "mchange36":"Sponsorul dvs. va va emite o �Cheie de sponsorizare� pe care o veti folosi pentru a o adauga la nodul dvs. si pentru a incepe sa produceti moneda (fara recompense pana la atingerea nivelului 1.) Odata ce ati atins nivelul 1, va creati/atribuiti propria �Cheie de producere a monedei� si incepeti sa castigati recompense. Aveti XXXX blocuri ramase in perioada de sponsorizare..", + "mchange36":"Sponsorul dvs. va va emite o Cheie de sponsorizare pe care o veti folosi pentru a o adauga la nodul dvs. si pentru a incepe sa produceti moneda (fara recompense pana la atingerea nivelului 1.) Odata ce ati atins nivelul 1, va creati/atribuiti propria Cheie de producere a monedei si incepeti sa castigati recompense. Aveti XXXX blocuri ramase in perioada de sponsorizare..", "mchange37":"Pur si simplu contactati un productor de moneda din Qortal care are un nivel suficient de ridicat pentru a emite o cheie de sponsorizare, obtineti acea cheie, apoi reveniti aici si introduceti cheia pentru a va incepe calatoria de productor de moneda !", "mchange38":"in" }, @@ -188,7 +188,7 @@ "bchange8":"Cheia de introducere de la sponsorul dvs. aici", "bchange10":"Starea actuala a sponsorizarii", "bchange12":"Minting cu cheia sponsorului", - "bchange13":"Blocuri ramase �n perioada de sponsorizare", + "bchange13":"Blocuri ramase n perioada de sponsorizare", "bchange15":"Relatia de sponsorizare", "bchange16":"Cont de sponsor", "bchange17":"Copiati cheia de sponsorizare", @@ -245,7 +245,14 @@ "wchange47":"Carte de adrese", "wchange48":"Aceasta agenda de adrese este goala !", "wchange49":"Adauga la agenda cu adrese", - "wchange50":"Memo" + "wchange50":"Numele nu poate fi gol!", + "wchange51":"Adresa nu poate fi goala!", + "wchange52":"Adaugat cu succes!", + "wchange53":"Import agenda de adrese", + "wchange54":"Exportati agenda de adrese", + "wchange55":"Agenda dvs. existenta va fi stearsa si din backup va fi creata o noua.", + "wchange56":"AVERTIZARE!", + "wchange57":"Nota" }, "tradepage":{ "tchange1":"Portal de Tranzactionare", @@ -597,7 +604,7 @@ "apipage":{ "achange1":"Adauga cheia API", "achange2":"API key", - "achange3":"Va rugam sa introduceti cheia API pentru acest nod. Aceasta poate fi gasita intr-un fisier numit �apikey.txt� in directorul in care este instalat nucleul. Alternativ, faceti clic pe Anulare (Anulare) pentru a utiliza nucleul cu functionalitate redusa.", + "achange3":"Va rugam sa introduceti cheia API pentru acest nod. Aceasta poate fi gasita intr-un fisier numit apikey.txt in directorul in care este instalat nucleul. Alternativ, faceti clic pe Anulare (Anulare) pentru a utiliza nucleul cu functionalitate redusa.", "achange4":"Anulare", "achange5":"Adauga", "achange6":"S-a adaugat cu succes cheia API", @@ -622,4 +629,4 @@ "rewarddialog5":"Suntei pe cale sa stergeti o tranzactie de cota de recompensare asociata cu contul:", "rewarddialog6":"La apasarea butonului de confirmare, recompensa va fi eliminata, iar cheia de obtinere de recompensa (minting) va deveni invalida." } -} +} \ No newline at end of file diff --git a/qortal-ui-core/language/rs.json b/qortal-ui-core/language/rs.json index b91c7b80..fdf37317 100644 --- a/qortal-ui-core/language/rs.json +++ b/qortal-ui-core/language/rs.json @@ -245,7 +245,14 @@ "wchange47":"Adresar", "wchange48":"Ovaj adresar je prazan !", "wchange49":"Dodaj u Adresar", - "wchange50":"Memo" + "wchange50":"Ime ne može biti prazno!", + "wchange51":"Adresa ne može biti prazna!", + "wchange52":"Uspešno dodato!", + "wchange53":"Uvezite adresar", + "wchange54":"Izvezi adresar", + "wchange55":"Vaš postojeći adresar će biti obrisan, a iz rezervne kopije biće kreiran novi.", + "wchange56":"UPOZORENJE!", + "wchange57":"Beleška" }, "tradepage":{ "tchange1":"Trgovinski prozor", @@ -622,4 +629,4 @@ "rewarddialog5":"Uklanjate transakciju deljenja nagrade povezanu sa nalogom:", "rewarddialog6":"Pritiskom na potvrdu, udeo nagrade će biti uklonjen i ključ za kovanje će postati nevažeći." } -} +} \ No newline at end of file diff --git a/qortal-ui-core/language/ru.json b/qortal-ui-core/language/ru.json index c4b6efec..e35a6d9c 100644 --- a/qortal-ui-core/language/ru.json +++ b/qortal-ui-core/language/ru.json @@ -212,7 +212,7 @@ "wchange14":"Время", "wchange15":"Подпись транзакции", "wchange16":"Хэш транзакции", - "wchange17":"Отправлять", + "wchange17":"Отправь", "wchange18":"От адреса", "wchange19":"Доступные средства", "wchange20":"Кому (адрес или имя)", @@ -245,7 +245,14 @@ "wchange47":"Адресная книга", "wchange48":"Эта адресная книга пуста !", "wchange49":"Добавить в адресную книгу", - "wchange50":"Memo" + "wchange50":"Имя не может быть пустым!", + "wchange51":"Адрес не может быть пустым!", + "wchange52":"Успешно добавлено!", + "wchange53":"Импорт адресной книги", + "wchange54":"Экспорт адресной книги", + "wchange55":"Ваша существующая адресная книга будет удалена, а из резервной копии создана новая.", + "wchange56":"ПРЕДУПРЕЖДЕНИЕ!", + "wchange57":"Памятка" }, "tradepage":{ "tchange1":"Торговый портал", @@ -617,4 +624,4 @@ "rewarddialog5":"Вы удаляете транзакцию распределения вознаграждения, связанную с аккаунтом:", "rewarddialog6":"При нажатии кнопки подтверждения доля вознаграждения будет удалена, а ключ чеканки станет недействительным." } -} +} \ No newline at end of file diff --git a/qortal-ui-core/language/us.json b/qortal-ui-core/language/us.json index 0cf19299..974495eb 100644 --- a/qortal-ui-core/language/us.json +++ b/qortal-ui-core/language/us.json @@ -237,10 +237,17 @@ "wchange44":"Please try again...", "wchange45":"Send all", "wchange46":"Send to this address", - "wchange47":"Addressbook", - "wchange48":"This Addressbook is empty !", - "wchange49":"Add to Addressbook", - "wchange50":"Memo" + "wchange47":"Address Book", + "wchange48":"This Address Book is empty !", + "wchange49":"Add to Address Book", + "wchange50":"Name cannot be empty!", + "wchange51":"Address cannot be empty!", + "wchange52":"Successfully added!", + "wchange53":"Import Address Book", + "wchange54":"Export Address Book", + "wchange55":"Your existing address book will be deleted and from backup new created.", + "wchange56":"WARNING!", + "wchange57":"Memo" }, "tradepage":{ "tchange1":"Trade Portal", @@ -616,5 +623,16 @@ "rewarddialog4":"On pressing confirm, the rewardshare will be created, but you will still need to supply the above key to a node in order to mint with the account.", "rewarddialog5":"You are removing a reward share transaction associated with account:", "rewarddialog6":"On pressing confirm, the rewardshare will be removed and the minting key will become invalid." + }, + "sponsorshipspage": { + "schange1": "Active Sponsorships", + "schange2" : "Account Address", + "schange3" : "Total Sponsorships active", + "schange4" : "Next sponsorship ending in", + "schange5" : "Sponsor New Minter", + "schange6" : "Finished Sponsorships", + "schange7" : "Completed", + "schange8" : "Addresses", + "schange9" : "You currently have no active sponsorships" } -} +} \ No newline at end of file diff --git a/qortal-ui-core/language/zhc.json b/qortal-ui-core/language/zhc.json index 6d70b1a6..9de020d7 100644 --- a/qortal-ui-core/language/zhc.json +++ b/qortal-ui-core/language/zhc.json @@ -245,7 +245,14 @@ "wchange47":"地址簿", "wchange48":"此通讯录为空 !", "wchange49":"加至地址簿", - "wchange50":"Memo" + "wchange50":"名称不能为空!", + "wchange51":"地址不能为空!", + "wchange52":"添加成功!", + "wchange53":"导入通讯录", + "wchange54":"导出通讯录", + "wchange55":"您现有的通讯簿将被删除并从新创建的备份中。", + "wchange56":"警告!", + "wchange57":"备忘录" }, "tradepage":{ "tchange1":"交易门户", @@ -622,4 +629,4 @@ "rewarddialog5":"您正在删除与此账号关联的铸币密钥:", "rewarddialog6":"点击确认后,铸币密钥将被移除並失效。" } -} +} \ No newline at end of file diff --git a/qortal-ui-core/language/zht.json b/qortal-ui-core/language/zht.json index 02a2c37d..05f89352 100644 --- a/qortal-ui-core/language/zht.json +++ b/qortal-ui-core/language/zht.json @@ -245,7 +245,14 @@ "wchange47":"地址簿", "wchange48":"此通訊錄為空 !", "wchange49":"加至地址簿", - "wchange50":"Memo" + "wchange50":"名稱不能為空!", + "wchange51":"地址不能為空!", + "wchange52":"添加成功!", + "wchange53":"導入通訊錄", + "wchange54":"導出通訊錄", + "wchange55":"您現有的通訊簿將被刪除並從新創建的備份中。", + "wchange56":"警告!", + "wchange57":"備忘錄" }, "tradepage":{ "tchange1":"交易門戶", @@ -622,4 +629,4 @@ "rewarddialog5":"您正在刪除與此賬號關聯的鑄幣密鑰:", "rewarddialog6":"點擊確認後,鑄幣密鑰將被移除並失效。" } -} +} \ No newline at end of file From c13088880aa5f7f4938bf47f95cae4b0cd75a36d Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Mon, 22 Aug 2022 18:19:45 +0200 Subject: [PATCH 30/33] Change translation --- qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js index dc3e209d..eab07482 100644 --- a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js +++ b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js @@ -54,7 +54,7 @@ class MultiWallet extends LitElement { dogeAmount: { type: Number }, dgbRecipient: { type: String }, dgbAmount: { type: Number }, - rvnRecipient: { type: String }, + rvnRecipient: { type: String }, rvnAmount: { type: Number }, arrrRecipient: { type: String }, arrrAmount: { type: Number }, @@ -69,7 +69,7 @@ class MultiWallet extends LitElement { ltcFeePerByte: { type: Number }, dogeFeePerByte: { type: Number }, dgbFeePerByte: { type: Number }, - rvnFeePerByte: { type: Number }, + rvnFeePerByte: { type: Number }, balanceString: { type: String }, arrrWalletAddress: { type: String }, exportErrorMessage: { type: String }, @@ -693,7 +693,7 @@ class MultiWallet extends LitElement { this.sendMoneyLoading = false this.isValidAmount = false this.btnDisable = false - this.balance = 0 + this.balance = 0 this.amount = 0 this.btcAmount = 0 this.ltcAmount = 0 @@ -1708,7 +1708,7 @@ class MultiWallet extends LitElement { Date: Mon, 22 Aug 2022 19:42:38 +0200 Subject: [PATCH 31/33] Add missing things --- .../plugins/core/wallet/wallet-app.src.js | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js index eab07482..cd50fc22 100644 --- a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js +++ b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js @@ -54,7 +54,7 @@ class MultiWallet extends LitElement { dogeAmount: { type: Number }, dgbRecipient: { type: String }, dgbAmount: { type: Number }, - rvnRecipient: { type: String }, + rvnRecipient: { type: String }, rvnAmount: { type: Number }, arrrRecipient: { type: String }, arrrAmount: { type: Number }, @@ -69,7 +69,7 @@ class MultiWallet extends LitElement { ltcFeePerByte: { type: Number }, dogeFeePerByte: { type: Number }, dgbFeePerByte: { type: Number }, - rvnFeePerByte: { type: Number }, + rvnFeePerByte: { type: Number }, balanceString: { type: String }, arrrWalletAddress: { type: String }, exportErrorMessage: { type: String }, @@ -547,7 +547,7 @@ class MultiWallet extends LitElement { .qrcode-pos { margin-top: -175px; - margin-left: 450px; + float: right; } .send-pos { @@ -693,7 +693,7 @@ class MultiWallet extends LitElement { this.sendMoneyLoading = false this.isValidAmount = false this.btnDisable = false - this.balance = 0 + this.balance = 0 this.amount = 0 this.btcAmount = 0 this.ltcAmount = 0 @@ -804,7 +804,7 @@ class MultiWallet extends LitElement {

${translate("walletpage.wchange2")} -
+
${this.getSelectedWalletAddress()}

-
+
${this.renderSendButton()}
-
+
${this.renderAddressbookButton()}
-
+
@@ -1940,10 +1940,9 @@ class MultiWallet extends LitElement { -
- +

Pirate Chain ${translate("walletpage.wchange47")}

${this.renderExportAddressbookButton()}
${this.renderImportAddressbookButton()}


@@ -4251,6 +4250,7 @@ class MultiWallet extends LitElement { } } const coin = this._selectedWallet + await this.fetchWalletAddress(this._selectedWallet) await this.fetchWalletDetails(this._selectedWallet) if (this._selectedWallet == coin) { await this.renderTransactions() @@ -4262,9 +4262,9 @@ class MultiWallet extends LitElement { } async fetchWalletDetails(coin) { - this.balanceString = this.renderFetchText() switch (coin) { case 'qort': + this.balanceString = this.renderFetchText() parentEpml.request('apiCall', { url: `/addresses/balance/${this.wallets.get('qort').wallet.address}?apiKey=${this.getApiKey()}`, }) @@ -4294,7 +4294,8 @@ class MultiWallet extends LitElement { case 'ltc': case 'doge': case 'dgb': - case 'rvn': + case 'rvn': + this.balanceString = this.renderFetchText() const walletName = `${coin}Wallet` parentEpml.request('apiCall', { url: `/crosschain/${coin}/walletbalance?apiKey=${this.getApiKey()}`, From 7d7196b5861bd39dcae49dcc19dfb7452b0714b7 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Tue, 23 Aug 2022 08:39:29 +0200 Subject: [PATCH 32/33] Sort Prices --- qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js b/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js index 5dd76cea..cb68bb02 100644 --- a/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js +++ b/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js @@ -644,7 +644,7 @@ class TradePortal extends LitElement {
${translate("tradepage.tchange5")}
${translate("login.loading")}
- + Date: Fri, 26 Aug 2022 15:10:56 +0200 Subject: [PATCH 33/33] New wallet page --- .../plugins/core/wallet/wallet-app.src.js | 333 +++++++++--------- 1 file changed, 158 insertions(+), 175 deletions(-) diff --git a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js index 07de779c..ae817975 100644 --- a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js +++ b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js @@ -18,6 +18,7 @@ import '@material/mwc-dialog' import '@material/mwc-formfield' import '@material/mwc-icon' import '@material/mwc-icon-button' +import '@material/mwc-tab-bar' import '@material/mwc-textfield' import '@polymer/paper-progress/paper-progress.js' import '@polymer/paper-slider/paper-slider.js' @@ -60,19 +61,18 @@ class MultiWallet extends LitElement { arrrAmount: { type: Number }, arrrMemo: { type: String }, errorMessage: { type: String }, + arrrWalletAddress: { type: String }, successMessage: { type: String }, sendMoneyLoading: { type: Boolean }, btnDisable: { type: Boolean }, isValidAmount: { type: Boolean }, balance: { type: Number }, + balanceString: { type: String }, btcFeePerByte: { type: Number }, ltcFeePerByte: { type: Number }, dogeFeePerByte: { type: Number }, dgbFeePerByte: { type: Number }, rvnFeePerByte: { type: Number }, - balanceString: { type: String }, - arrrWalletAddress: { type: String }, - exportErrorMessage: { type: String }, qortBook: { type: Array }, btcBook: { type: Array }, ltcBook: { type: Array }, @@ -159,6 +159,21 @@ class MultiWallet extends LitElement { cursor: default; } + #tabs-height { + --mdc-tab-height: 50px; + } + + #tabs-1-content { + height: 100%; + padding-bottom: 10px; + } + + mwc-tab-bar { + --mdc-text-transform: none; + --mdc-tab-color-default: var(--black); + --mdc-tab-text-label-color-default: var(--black); + } + paper-slider.blue { --paper-slider-knob-color: var(--paper-light-blue-500); --paper-slider-active-color: var(--paper-light-blue-500); @@ -196,6 +211,10 @@ class MultiWallet extends LitElement { font-family: 'Roboto Mono', monospace; } + .sans { + font-family: 'Open Sans', sans-serif; + } + .weight-100 { font-weight: 100; } @@ -273,25 +292,37 @@ class MultiWallet extends LitElement { -moz-osx-font-smoothing: grayscale; } - h2 { margin: 0; + color: var(--black); font-weight: 400; font: 24px/24px 'Open Sans', sans-serif; } h3 { margin: 0 0 5px; + color: var(--black); font-weight: 600; font-size: 18px; line-height: 18px; } - @media (min-width: 765px) { - .wrapper { - display: grid; - grid-template-columns: 0.5fr 3.5fr; - } + .hrstyle { + color: var(--border); + border-radius: 80%; + margin-bottom: 1rem; + } + + .header-title { + font-size: 32px; + color: var(--black); + font-weight: 600; + text-align: center; + margin-top: 1rem; + } + + .fullWidth { + width: 100%; } .wrapper { @@ -405,19 +436,6 @@ class MultiWallet extends LitElement { display: inline-block; } - .currency-box { - display: flex; - background-color: var(--white); - text-align: center; - padding: 12px; - cursor: pointer; - transition: 0.1s ease-in-out; - } - - .currency-box:not(:last-child) { - border-bottom: var(--border); - } - .active { background: var(--menuactive); } @@ -432,27 +450,6 @@ class MultiWallet extends LitElement { filter: grayscale(100%); } - .currency-box.active .currency-image, - .currency-box:hover .currency-image { - filter: none; - } - - .currency-box:hover { - background: var(--menuhover); - } - - .currency-box.active, - .currency-box:hover .currency-text { - font-weight: 500; - } - - .currency-text { - margin: auto 0; - margin-left: 8px; - font-size: 20px; - color: var(--black); - } - .qort .currency-image { background-image: url('/img/qort.png'); } @@ -572,9 +569,6 @@ class MultiWallet extends LitElement { .cards { margin-top: 25px; } - .currency-box:nth-of-type(2) { - margin-right: 0; - } } .checkboxLabel:hover{ @@ -591,16 +585,6 @@ class MultiWallet extends LitElement { .cards { margin-top: 25px; } - .currency-box { - width: calc(50% - 25px); - max-width: 260px; - display: inline-block; - margin-right: 25px; - margin-bottom: 25px; - } - .currency-box:nth-of-type(2) { - margin-right: 0; - } } @media (max-width: 530px) { @@ -610,16 +594,6 @@ class MultiWallet extends LitElement { .cards { text-align: center; } - .currency-box { - width: calc(100% - 25px); - max-width: 260px; - } - .currency-box:nth-of-type(2) { - margin-right: 25px; - } - .currency-box:last-of-type { - margin-bottom: 0; - } .wallet-balance { font-size: 22px; } @@ -652,11 +626,8 @@ class MultiWallet extends LitElement { this.isTextMenuOpen = false this.loading = true - this.selectWallet = this.selectWallet.bind(this) - this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light'; - this.exportErrorMessage = '' this.qortBook = [] this.btcBook = [] this.ltcBook = [] @@ -767,40 +738,38 @@ class MultiWallet extends LitElement { render() { return html`
-
-
${translate("walletpage.wchange22")}
-
-
-
-
Qort
-
-
-
-
Bitcoin
-
-
-
-
Litecoin
-
-
-
-
Dogecoin
-
-
-
-
Digibyte
-
-
-
-
Ravencoin
-
-
-
-
Pirate Chain
-
-
+
+ ${translate("walletpage.wchange22")} +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + +

${translate("walletpage.wchange2")} @@ -1205,7 +1174,7 @@ class MultiWallet extends LitElement { - +
@@ -1271,7 +1240,7 @@ class MultiWallet extends LitElement { - +
@@ -1348,7 +1317,7 @@ class MultiWallet extends LitElement { - +
@@ -1425,7 +1394,7 @@ class MultiWallet extends LitElement { - +
@@ -1504,7 +1473,7 @@ class MultiWallet extends LitElement { - +
@@ -1583,7 +1552,7 @@ class MultiWallet extends LitElement { - +
@@ -1662,7 +1631,7 @@ class MultiWallet extends LitElement { - +
@@ -1974,7 +1943,7 @@ class MultiWallet extends LitElement { - +

Qortal ${translate("walletpage.wchange47")}


@@ -2023,7 +1992,7 @@ class MultiWallet extends LitElement { - +

Bitcoin ${translate("walletpage.wchange47")}


@@ -2072,7 +2041,7 @@ class MultiWallet extends LitElement { - +

Litecoin ${translate("walletpage.wchange47")}


@@ -2121,7 +2090,7 @@ class MultiWallet extends LitElement { - +

Dogecoin ${translate("walletpage.wchange47")}


@@ -2170,7 +2139,7 @@ class MultiWallet extends LitElement { - +

Digibyte ${translate("walletpage.wchange47")}


@@ -2219,7 +2188,7 @@ class MultiWallet extends LitElement { - +

Ravencoin ${translate("walletpage.wchange47")}


@@ -2268,7 +2237,7 @@ class MultiWallet extends LitElement { - +

Pirate Chain ${translate("walletpage.wchange47")}


@@ -2479,13 +2448,8 @@ class MultiWallet extends LitElement { this.rvnAddressbook() this.arrrAddressbook() - this.currencyBoxes = this.shadowRoot.querySelectorAll('.currency-box') this.transactionsDOM = this.shadowRoot.getElementById('transactionsDOM') - this.currencyBoxes.forEach((currencyBox) => { - currencyBox.addEventListener('click', this.selectWallet) - }) - this.showWallet() window.addEventListener('contextmenu', (event) => { @@ -2900,6 +2864,41 @@ class MultiWallet extends LitElement { } } + tabWalletQort() { + this._selectedWallet = 'qort' + this.showWallet() + } + + tabWalletBtc() { + this._selectedWallet = 'btc' + this.showWallet() + } + + tabWalletLtc() { + this._selectedWallet = 'ltc' + this.showWallet() + } + + tabWalletDoge() { + this._selectedWallet = 'doge' + this.showWallet() + } + + tabWalletDgb() { + this._selectedWallet = 'dgb' + this.showWallet() + } + + tabWalletRvn() { + this._selectedWallet = 'rvn' + this.showWallet() + } + + tabWalletArrr() { + this._selectedWallet = 'arrr' + this.showWallet() + } + qortAddressbook() { if (localStorage.getItem("addressbookQort") === null) { localStorage.setItem("addressbookQort", "") @@ -3588,42 +3587,71 @@ class MultiWallet extends LitElement { closeQortDialog() { this.shadowRoot.querySelector('#sendQortDialog').close() + this.shadowRoot.getElementById('amountInput').value = '' + this.shadowRoot.getElementById('recipient').value = '' + this.recipient = '' + this.amount = 0 this.successMessage = '' this.errorMessage = '' } closeBtcDialog() { this.shadowRoot.querySelector('#sendBtcDialog').close() + this.shadowRoot.getElementById('btcAmountInput').value = 0 + this.shadowRoot.getElementById('btcRecipient').value = '' + this.btcRecipient = '' + this.btcAmount = 0 this.successMessage = '' this.errorMessage = '' } closeLtcDialog() { this.shadowRoot.querySelector('#sendLtcDialog').close() + this.shadowRoot.getElementById('ltcAmountInput').value = 0 + this.shadowRoot.getElementById('ltcRecipient').value = '' + this.ltcRecipient = '' + this.ltcAmount = 0 this.successMessage = '' this.errorMessage = '' } closeDogeDialog() { this.shadowRoot.querySelector('#sendDogeDialog').close() + this.shadowRoot.getElementById('dogeAmountInput').value = 0 + this.shadowRoot.getElementById('dogeRecipient').value = '' + this.dogeRecipient = '' + this.dogeAmount = 0 this.successMessage = '' this.errorMessage = '' } closeDgbDialog() { this.shadowRoot.querySelector('#sendDgbDialog').close() + this.shadowRoot.getElementById('dgbAmountInput').value = 0 + this.shadowRoot.getElementById('dgbRecipient').value = '' + this.dgbRecipient = '' + this.dgbAmount = 0 this.successMessage = '' this.errorMessage = '' } closeRvnDialog() { this.shadowRoot.querySelector('#sendRvnDialog').close() + this.shadowRoot.getElementById('rvnAmountInput').value = 0 + this.shadowRoot.getElementById('rvRecipient').value = '' + this.rvnRecipient = '' + this.rvnAmount = 0 this.successMessage = '' this.errorMessage = '' } closeArrrDialog() { this.shadowRoot.querySelector('#sendArrrDialog').close() + this.shadowRoot.getElementById('arrrRecipient').value = '' + this.shadowRoot.getElementById('arrrMemo').value = '' + this.arrrRecipient = '' + this.arrrMemo='' + this.arrrAmount = 0 this.successMessage = '' this.errorMessage = '' } @@ -3779,21 +3807,6 @@ class MultiWallet extends LitElement { return html`${translate("walletpage.wchange8")}` } - selectWallet(event) { - event.preventDefault() - - const target = event.currentTarget - - this.currencyBoxes.forEach((currencyBox) => { - if (currencyBox.classList.contains('active')) { - currencyBox.classList.remove('active') - } - }) - target.classList.add('active') - this._selectedWallet = target.attributes.coin.value - this.showWallet() - } - _checkAmount(e) { const targetAmount = e.target.value const target = e.target @@ -4695,7 +4708,7 @@ class MultiWallet extends LitElement { return render(html``, root) } const confirmed = data.item.confirmations >= requiredConfirmations - const unconfirmed = data.item.confirmations == 0 + const unconfirmed = data.item.confirmations == 0 if (confirmed) { render(html`check`, root) } else if (unconfirmed) { @@ -4708,20 +4721,22 @@ class MultiWallet extends LitElement { { render(html` ${data.item.type} ${data.item.creatorAddress === this.wallets.get('qort').wallet.address ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} `, root) }} > - - - - + + + + + { const time = new Date(data.item.timestamp) @@ -4748,7 +4763,6 @@ class MultiWallet extends LitElement { { render(html` ${translate("walletpage.wchange40")} ${data.item.inputs[0].address === this.wallets.get(this._selectedWallet).wallet.address ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} `, root) @@ -4757,7 +4771,6 @@ class MultiWallet extends LitElement { { render(html`${data.item.inputs[0].address}`, root) @@ -4766,7 +4779,6 @@ class MultiWallet extends LitElement { { render(html`${data.item.outputs[0].address}`, root) @@ -4776,7 +4788,6 @@ class MultiWallet extends LitElement { { const amount = (Number(data.item.totalAmount) / 1e8).toFixed(8) @@ -4786,7 +4797,6 @@ class MultiWallet extends LitElement { { const time = new Date(data.item.timestamp) @@ -4813,7 +4823,6 @@ class MultiWallet extends LitElement { { render(html` ${translate("walletpage.wchange40")} ${data.item.inputs[0].address === this.wallets.get(this._selectedWallet).wallet.address ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} `, root) @@ -4822,7 +4831,6 @@ class MultiWallet extends LitElement { { render(html`${data.item.inputs[0].address}`, root) @@ -4831,7 +4839,6 @@ class MultiWallet extends LitElement { { render(html`${data.item.outputs[0].address}`, root) @@ -4841,7 +4848,6 @@ class MultiWallet extends LitElement { { const amount = (Number(data.item.totalAmount) / 1e8).toFixed(8) @@ -4851,7 +4857,6 @@ class MultiWallet extends LitElement { { const time = new Date(data.item.timestamp) @@ -4878,7 +4883,6 @@ class MultiWallet extends LitElement { { render(html` ${translate("walletpage.wchange40")} ${data.item.inputs[0].address === this.wallets.get(this._selectedWallet).wallet.address ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} `, root) @@ -4887,7 +4891,6 @@ class MultiWallet extends LitElement { { render(html`${data.item.inputs[0].address}`, root) @@ -4896,7 +4899,6 @@ class MultiWallet extends LitElement { { render(html`${data.item.outputs[0].address}`, root) @@ -4906,7 +4908,6 @@ class MultiWallet extends LitElement { { const amount = (Number(data.item.totalAmount) / 1e8).toFixed(8) @@ -4916,7 +4917,6 @@ class MultiWallet extends LitElement { { const time = new Date(data.item.timestamp) @@ -4943,7 +4943,6 @@ class MultiWallet extends LitElement { { render(html` ${translate("walletpage.wchange40")} ${data.item.inputs[0].address === this.wallets.get(this._selectedWallet).wallet.address ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} `, root) @@ -4952,7 +4951,6 @@ class MultiWallet extends LitElement { { render(html`${data.item.inputs[0].address}`, root) @@ -4961,7 +4959,6 @@ class MultiWallet extends LitElement { { render(html`${data.item.outputs[0].address}`, root) @@ -4971,7 +4968,6 @@ class MultiWallet extends LitElement { { const amount = (Number(data.item.totalAmount) / 1e8).toFixed(8) @@ -4981,7 +4977,6 @@ class MultiWallet extends LitElement { { const time = new Date(data.item.timestamp) @@ -5008,7 +5003,6 @@ class MultiWallet extends LitElement { { render(html` ${translate("walletpage.wchange40")} ${data.item.inputs[0].address === this.wallets.get(this._selectedWallet).wallet.address ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} `, root) @@ -5017,7 +5011,6 @@ class MultiWallet extends LitElement { { render(html`${data.item.inputs[0].address}`, root) @@ -5026,7 +5019,6 @@ class MultiWallet extends LitElement { { render(html`${data.item.outputs[0].address}`, root) @@ -5036,7 +5028,6 @@ class MultiWallet extends LitElement { { const amount = (Number(data.item.totalAmount) / 1e8).toFixed(8) @@ -5046,7 +5037,6 @@ class MultiWallet extends LitElement { { const time = new Date(data.item.timestamp) @@ -5073,7 +5063,6 @@ class MultiWallet extends LitElement { { render(html` ${translate("walletpage.wchange40")} ${data.item.totalAmount < 0 ? html`${translate("walletpage.wchange7")}` : html`${translate("walletpage.wchange8")}`} `, root) @@ -5082,7 +5071,6 @@ class MultiWallet extends LitElement {