From 017dd8d30a8871dd2550c15949a1ed04e05a308e Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Mon, 22 Aug 2022 18:13:39 +0200 Subject: [PATCH] add arrr --- .../plugins/core/wallet/wallet-app.src.js | 878 ++++++++++++++++-- 1 file changed, 782 insertions(+), 96 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 97d2179a..dc3e209d 100644 --- a/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js +++ b/qortal-ui-plugins/plugins/core/wallet/wallet-app.src.js @@ -31,7 +31,7 @@ import '@vaadin/icons' 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() { @@ -56,6 +56,9 @@ class MultiWallet extends LitElement { dgbAmount: { type: Number }, rvnRecipient: { type: String }, rvnAmount: { type: Number }, + arrrRecipient: { type: String }, + arrrAmount: { type: Number }, + arrrMemo: { type: String }, errorMessage: { type: String }, successMessage: { type: String }, sendMoneyLoading: { type: Boolean }, @@ -68,6 +71,7 @@ class MultiWallet extends LitElement { dgbFeePerByte: { type: Number }, rvnFeePerByte: { type: Number }, balanceString: { type: String }, + arrrWalletAddress: { type: String }, exportErrorMessage: { type: String }, qortBook: { type: Array }, btcBook: { type: Array }, @@ -75,18 +79,21 @@ class MultiWallet extends LitElement { 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 } + rvnBookAddress: { type: String }, + arrrBookAddress: { type: String } } } @@ -296,7 +303,7 @@ class MultiWallet extends LitElement { } .wallet { - width: 170px; + width: 200px; height: 100vh; border-top-left-radius: inherit; border-bottom-left-radius: inherit; @@ -470,6 +477,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; } @@ -652,18 +663,21 @@ class MultiWallet extends LitElement { 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 = '' @@ -671,6 +685,9 @@ class MultiWallet extends LitElement { this.dogeRecipient = '' this.dgbRecipient = '' this.rvnRecipient = '' + this.arrrRecipient = '' + this.arrrMemo = '' + this.arrrWalletAddress = '' this.errorMessage = '' this.successMessage = '' this.sendMoneyLoading = false @@ -683,6 +700,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 @@ -719,6 +737,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' @@ -733,6 +752,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.arrrWallet }) parentEpml.subscribe('copy_menu_switch', async (value) => { @@ -774,6 +794,10 @@ class MultiWallet extends LitElement {
Ravencoin
+
+
+
Pirate Chain
+
@@ -1128,6 +1152,59 @@ 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} + this.sendToArrrAddress()} title="${translate("walletpage.wchange46")}"> + this.openAddArrrAddressDialog()} title="${translate("walletpage.wchange49")}"> +
+
+ ${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")} + +
+
@@ -1585,6 +1662,80 @@ class MultiWallet extends LitElement { + +
+
+ +

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

+
+
+

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

+

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

+

+ + +

+

+ + +

+

+ + +

+

${this.errorMessage}

+

${this.successMessage}

+ ${this.sendMoneyLoading ? html` ` : ''} +
+
+ this.sendArrr()}> + + ${translate("walletpage.wchange17")} ARRR + +
+
+
+ + ${translate("general.close")} + +
+
@@ -1789,6 +1940,41 @@ class MultiWallet extends LitElement { + + +
+ +

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")} + +
+
@@ -2083,6 +2269,55 @@ class MultiWallet extends LitElement { + +
+ +

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


+

${translate("walletpage.wchange49")}

+
+
+
+
+

+ + +

+

+ + +

+
+
+
+ this.addToPiratechainAddressbook()}> + + ${translate("walletpage.wchange49")} + +
+
+ + ${translate("general.close")} + +
+
@@ -2208,6 +2443,27 @@ class MultiWallet extends LitElement { ${translate("general.close")} + + +
+ +

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


+
+
+
+
+ +

${translate("walletpage.wchange56")}

+
${translate("walletpage.wchange55")}
+
+ + ${translate("general.close")} + +
` } @@ -2222,6 +2478,7 @@ class MultiWallet extends LitElement { this.dogeAddressbook() this.dgbAddressbook() this.rvnAddressbook() + this.arrrAddressbook() this.currencyBoxes = this.shadowRoot.querySelectorAll('.currency-box') this.transactionsDOM = this.shadowRoot.getElementById('transactionsDOM') @@ -2539,6 +2796,75 @@ class MultiWallet extends LitElement { } 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() { @@ -2576,50 +2902,58 @@ class MultiWallet extends LitElement { } qortAddressbook() { - if (localStorage.getItem("adressbookQort") === null) { - localStorage.setItem("adressbookQort", "") + if (localStorage.getItem("addressbookQort") === null) { + localStorage.setItem("addressbookQort", "") } else { - this.qortBook = JSON.parse(localStorage.getItem("adressbookQort") || "[]") + this.qortBook = JSON.parse(localStorage.getItem("addressbookQort") || "[]") } } btcAddressbook() { - if (localStorage.getItem("adressbookBtc") === null) { - localStorage.setItem("adressbookBtc", "") + if (localStorage.getItem("addressbookBtc") === null) { + localStorage.setItem("addressbookBtc", "") } else { - this.btcBook = JSON.parse(localStorage.getItem("adressbookBtc") || "[]") + this.btcBook = JSON.parse(localStorage.getItem("addressbookBtc") || "[]") } } ltcAddressbook() { - if (localStorage.getItem("adressbookLtc") === null) { - localStorage.setItem("adressbookLtc", "") + if (localStorage.getItem("addressbookLtc") === null) { + localStorage.setItem("addressbookLtc", "") } else { - this.ltcBook = JSON.parse(localStorage.getItem("adressbookLtc") || "[]") + this.ltcBook = JSON.parse(localStorage.getItem("addressbookLtc") || "[]") } } dogeAddressbook() { - if (localStorage.getItem("adressbookDoge") === null) { - localStorage.setItem("adressbookDoge", "") + if (localStorage.getItem("addressbookDoge") === null) { + localStorage.setItem("addressbookDoge", "") } else { - this.dogeBook = JSON.parse(localStorage.getItem("adressbookDoge") || "[]") + this.dogeBook = JSON.parse(localStorage.getItem("addressbookDoge") || "[]") } } dgbAddressbook() { - if (localStorage.getItem("adressbookDgb") === null) { - localStorage.setItem("adressbookDgb", "") + if (localStorage.getItem("addressbookDgb") === null) { + localStorage.setItem("addressbookDgb", "") } else { - this.dgbBook = JSON.parse(localStorage.getItem("adressbookDgb") || "[]") + this.dgbBook = JSON.parse(localStorage.getItem("addressbookDgb") || "[]") } } rvnAddressbook() { - if (localStorage.getItem("adressbookRvn") === null) { - localStorage.setItem("adressbookRvn", "") + 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.rvnBook = JSON.parse(localStorage.getItem("adressbookRvn") || "[]") + this.arrrBook = JSON.parse(localStorage.getItem("addressbookArrr") || "[]") } } @@ -2647,6 +2981,10 @@ class MultiWallet extends LitElement { this.shadowRoot.querySelector("#rvnBookDialog").show() } + openArrrAddressbook() { + this.shadowRoot.querySelector("#arrrBookDialog").show() + } + openAddQortAddressDialog() { this.qortBookAddress = this.selectedTransaction.recipient this.openAddToQortAddressbook() @@ -2683,6 +3021,12 @@ class MultiWallet extends LitElement { this.shadowRoot.querySelector('#showRvnTransactionDetailsDialog').close() } + openAddArrrAddressDialog() { + this.arrrBookAddress = this.selectedTransaction.arrrReceiver + this.openAddToArrrAddressbook() + this.shadowRoot.querySelector('#showArrrTransactionDetailsDialog').close() + } + openAddToQortAddressbook() { this.shadowRoot.querySelector("#addQortAddressDialog").show() } @@ -2707,30 +3051,38 @@ class MultiWallet extends LitElement { this.shadowRoot.querySelector("#addRvnAddressDialog").show() } - openImportQortAdressbook() { + openAddToArrrAddressbook() { + this.shadowRoot.querySelector("#addArrrAddressDialog").show() + } + + openImportQortAddressbook() { this.shadowRoot.querySelector("#importQortAddressbookDialog").show() } - openImportBtcAdressbook() { + openImportBtcAddressbook() { this.shadowRoot.querySelector("#importBtcAddressbookDialog").show() } - openImportLtcAdressbook() { + openImportLtcAddressbook() { this.shadowRoot.querySelector("#importLtcAddressbookDialog").show() } - openImportDogeAdressbook() { + openImportDogeAddressbook() { this.shadowRoot.querySelector("#importDogeAddressbookDialog").show() } - openImportDgbAdressbook() { + openImportDgbAddressbook() { this.shadowRoot.querySelector("#importDgbAddressbookDialog").show() } - openImportRvnAdressbook() { + openImportRvnAddressbook() { this.shadowRoot.querySelector("#importRvnAddressbookDialog").show() } + openImportArrrAddressbook() { + this.shadowRoot.querySelector("#importArrrAddressbookDialog").show() + } + closeQortAddressDialog() { this.shadowRoot.querySelector('#addQortAddressDialog').close() } @@ -2755,6 +3107,10 @@ class MultiWallet extends LitElement { this.shadowRoot.querySelector('#addRvnAddressDialog').close() } + closeArrrAddressDialog() { + this.shadowRoot.querySelector('#addArrrAddressDialog').close() + } + closeImportQortAddressbookDialog() { this.shadowRoot.querySelector("#importQortAddressbookDialog").close() } @@ -2779,13 +3135,15 @@ class MultiWallet extends LitElement { 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("adressbookQort") || "[]") + var oldQortalBook = JSON.parse(localStorage.getItem("addressbookQort") || "[]") if (name.length === 0) { let qortbookstring1 = get("walletpage.wchange50") @@ -2806,20 +3164,20 @@ class MultiWallet extends LitElement { oldQortalBook.push(newQortalBookItem) - localStorage.setItem("adressbookQort", JSON.stringify(oldQortalBook)) + localStorage.setItem("addressbookQort", JSON.stringify(oldQortalBook)) let qortbookstring2 = get("walletpage.wchange52") parentEpml.request('showSnackBar', `${qortbookstring2}`) this.closeQortAddressDialog() - this.qortBook = JSON.parse(localStorage.getItem("adressbookQort") || "[]") + 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("adressbookBtc") || "[]") + var oldBitcoinBook = JSON.parse(localStorage.getItem("addressbookBtc") || "[]") if (name.length === 0) { let btcbookstring1 = get("walletpage.wchange50") @@ -2840,20 +3198,20 @@ class MultiWallet extends LitElement { oldBitcoinBook.push(newBitcoinBookItem) - localStorage.setItem("adressbookBtc", JSON.stringify(oldBitcoinBook)) + localStorage.setItem("addressbookBtc", JSON.stringify(oldBitcoinBook)) let btcbookstring3 = get("walletpage.wchange52") parentEpml.request('showSnackBar', `${btcbookstring3}`) this.closeBtcAddressDialog() - this.btcBook = JSON.parse(localStorage.getItem("adressbookBtc") || "[]") + 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("adressbookLtc") || "[]") + var oldLitecoinBook = JSON.parse(localStorage.getItem("addressbookLtc") || "[]") if (name.length === 0) { let ltcbookstring1 = get("walletpage.wchange50") @@ -2874,20 +3232,20 @@ class MultiWallet extends LitElement { oldLitecoinBook.push(newLitecoinBookItem) - localStorage.setItem("adressbookLtc", JSON.stringify(oldLitecoinBook)) + localStorage.setItem("addressbookLtc", JSON.stringify(oldLitecoinBook)) let ltcbookstring3 = get("walletpage.wchange52") parentEpml.request('showSnackBar', `${ltcbookstring3}`) this.closeLtcAddressDialog() - this.ltcBook = JSON.parse(localStorage.getItem("adressbookLtc") || "[]") + 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("adressbookDoge") || "[]") + var oldDogecoinBook = JSON.parse(localStorage.getItem("addressbookDoge") || "[]") if (name.length === 0) { let dogebookstring1 = get("walletpage.wchange50") @@ -2908,20 +3266,20 @@ class MultiWallet extends LitElement { oldDogecoinBook.push(newDogecoinBookItem) - localStorage.setItem("adressbookDoge", JSON.stringify(oldDogecoinBook)) + localStorage.setItem("addressbookDoge", JSON.stringify(oldDogecoinBook)) let dogebookstring3 = get("walletpage.wchange52") parentEpml.request('showSnackBar', `${dogebookstring3}`) this.closeDogeAddressDialog() - this.dogeBook = JSON.parse(localStorage.getItem("adressbookDoge") || "[]") + 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("adressbookDgb") || "[]") + var oldDigibyteBook = JSON.parse(localStorage.getItem("addressbookDgb") || "[]") if (name.length === 0) { let dgbbookstring1 = get("walletpage.wchange50") @@ -2942,20 +3300,20 @@ class MultiWallet extends LitElement { oldDigibyteBook.push(newDigibyteBookItem) - localStorage.setItem("adressbookDgb", JSON.stringify(oldDigibyteBook)) + localStorage.setItem("addressbookDgb", JSON.stringify(oldDigibyteBook)) let dgbbookstring3 = get("walletpage.wchange52") parentEpml.request('showSnackBar', `${dgbbookstring3}`) this.closeDgbAddressDialog() - this.dgbBook = JSON.parse(localStorage.getItem("adressbookDgb") || "[]") + 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("adressbookRvn") || "[]") + var oldRavencoinBook = JSON.parse(localStorage.getItem("addressbookRvn") || "[]") if (name.length === 0) { let rvnbookstring1 = get("walletpage.wchange50") @@ -2976,13 +3334,47 @@ class MultiWallet extends LitElement { oldRavencoinBook.push(newRavencoinBookItem) - localStorage.setItem("adressbookRvn", JSON.stringify(oldRavencoinBook)) + localStorage.setItem("addressbookRvn", JSON.stringify(oldRavencoinBook)) let rvnbookstring3 = get("walletpage.wchange52") parentEpml.request('showSnackBar', `${rvnbookstring3}`) this.closeRvnAddressDialog() - this.rvnBook = JSON.parse(localStorage.getItem("adressbookRvn") || "[]") + 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) { @@ -3027,6 +3419,13 @@ class MultiWallet extends LitElement { 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`` } @@ -3051,96 +3450,115 @@ class MultiWallet extends LitElement { return html`` } - exportQortAdressbook() { - const qortBookData = JSON.stringify(localStorage.getItem("adressbookQort")) + 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`) } - exportBtcAdressbook() { - const btcBookData = JSON.stringify(localStorage.getItem("adressbookBtc")) + 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`) } - exportLtcAdressbook() { - const ltcBookData = JSON.stringify(localStorage.getItem("adressbookLtc")) + 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`) } - exportDogeAdressbook() { - const dogeBookData = JSON.stringify(localStorage.getItem("adressbookDoge")) + 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`) } - exportDgbAdressbook() { - const dgbBookData = JSON.stringify(localStorage.getItem("adressbookDgb")) + 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`) } - exportRvnAdressbook() { - const rvnBookData = JSON.stringify(localStorage.getItem("adressbookRvn")) + 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`) } + 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`) + } + importQortAddressbook(file) { - localStorage.removeItem("adressbookQort") + localStorage.removeItem("addressbookQort") const newItems = JSON.parse((file) || "[]") - localStorage.setItem("adressbookQort", JSON.stringify(newItems)) - this.qortBook = JSON.parse(localStorage.getItem("adressbookQort") || "[]") + localStorage.setItem("addressbookQort", JSON.stringify(newItems)) + this.qortBook = JSON.parse(localStorage.getItem("addressbookQort") || "[]") this.shadowRoot.querySelector('#importQortAddressbookDialog').close() } importBtcAddressbook(file) { - localStorage.removeItem("adressbookBtc") + localStorage.removeItem("addressbookBtc") const newItems = JSON.parse((file) || "[]") - localStorage.setItem("adressbookBtc", JSON.stringify(newItems)) - this.btcBook = JSON.parse(localStorage.getItem("adressbookBtc") || "[]") + localStorage.setItem("addressbookBtc", JSON.stringify(newItems)) + this.btcBook = JSON.parse(localStorage.getItem("addressbookBtc") || "[]") this.shadowRoot.querySelector('#importBtcAddressbookDialog').close() } importLtcAddressbook(file) { - localStorage.removeItem("adressbookLtc") + localStorage.removeItem("addressbookLtc") const newItems = JSON.parse((file) || "[]") - localStorage.setItem("adressbookLtc", JSON.stringify(newItems)) - this.ltcBook = JSON.parse(localStorage.getItem("adressbookLtc") || "[]") + localStorage.setItem("addressbookLtc", JSON.stringify(newItems)) + this.ltcBook = JSON.parse(localStorage.getItem("addressbookLtc") || "[]") this.shadowRoot.querySelector('#importLtcAddressbookDialog').close() } importDogeAddressbook(file) { - localStorage.removeItem("adressbookDoge") + localStorage.removeItem("addressbookDoge") const newItems = JSON.parse((file) || "[]") - localStorage.setItem("adressbookDoge", JSON.stringify(newItems)) - this.dogeBook = JSON.parse(localStorage.getItem("adressbookDoge") || "[]") + localStorage.setItem("addressbookDoge", JSON.stringify(newItems)) + this.dogeBook = JSON.parse(localStorage.getItem("addressbookDoge") || "[]") this.shadowRoot.querySelector('#importDogeAddressbookDialog').close() } importDgbAddressbook(file) { - localStorage.removeItem("adressbookDgb") + localStorage.removeItem("addressbookDgb") const newItems = JSON.parse((file) || "[]") - localStorage.setItem("adressbookDgb", JSON.stringify(newItems)) - this.dgbBook = JSON.parse(localStorage.getItem("adressbookDgb") || "[]") + localStorage.setItem("addressbookDgb", JSON.stringify(newItems)) + this.dgbBook = JSON.parse(localStorage.getItem("addressbookDgb") || "[]") this.shadowRoot.querySelector('#importDgbAddressbookDialog').close() } importRvnAddressbook(file) { - localStorage.removeItem("adressbookRvn") + localStorage.removeItem("addressbookRvn") const newItems = JSON.parse((file) || "[]") - localStorage.setItem("adressbookRvn", JSON.stringify(newItems)) - this.rvnBook = JSON.parse(localStorage.getItem("adressbookRvn") || "[]") + 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() { this.shadowRoot.querySelector('#sendQortDialog').close() this.successMessage = '' @@ -3177,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() @@ -3213,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") @@ -3272,6 +3702,15 @@ 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) { @@ -3706,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 @@ -3752,6 +4191,55 @@ class MultiWallet extends LitElement { this.showWallet() } + 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 + this.btnDisable = true + + const makeRequest = async () => { + const opts = { + entropy58: seed58, + receivingAddress: arrrRecipient, + arrrAmount: arrrAmount, + memo: arrrMemo + } + 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.shadowRoot.getElementById('arrrMemo').value = '' + this.errorMessage = '' + this.arrrRecipient = '' + this.arrrMemo='' + 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 @@ -3842,7 +4330,87 @@ class MultiWallet extends LitElement { this.wallets.get(this._selectedWallet).transactions = sortedTransactions } 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 (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.showWallet() + + // 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', + 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 + } + } + + 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 && res.error != 1201 && res.length === 78) { + this.arrrWalletAddress = res + } + break + default: + // Not used for other coins yet break } } @@ -3860,6 +4428,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`` } @@ -3878,6 +4448,8 @@ class MultiWallet extends LitElement { 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`` } @@ -3885,17 +4457,19 @@ class MultiWallet extends LitElement { renderExportAddressbookButton() { if ( this._selectedWallet === "qort" ) { - return html` this.exportQortAdressbook()}> ${translate("walletpage.wchange54")}` + return html` this.exportQortAddressbook()}> ${translate("walletpage.wchange54")}` } else if ( this._selectedWallet === "btc" ) { - return html` this.exportBtcAdressbook()}> ${translate("walletpage.wchange54")}` + return html` this.exportBtcAddressbook()}> ${translate("walletpage.wchange54")}` } else if ( this._selectedWallet === "ltc" ) { - return html` this.exportKLtcAdressbook()}> ${translate("walletpage.wchange54")}` + return html` this.exportKLtcAddressbook()}> ${translate("walletpage.wchange54")}` } else if ( this._selectedWallet === "doge" ) { - return html` this.exportDogeAdressbook()}> ${translate("walletpage.wchange54")}` + return html` this.exportDogeAddressbook()}> ${translate("walletpage.wchange54")}` } else if ( this._selectedWallet === "dgb" ) { - return html` this.exportDgbAdressbook()}> ${translate("walletpage.wchange54")}` + return html` this.exportDgbAddressbook()}> ${translate("walletpage.wchange54")}` } else if ( this._selectedWallet === "rvn" ) { - return html` this.exportRvnAdressbook()}> ${translate("walletpage.wchange54")}` + return html` this.exportRvnAddressbook()}> ${translate("walletpage.wchange54")}` + } else if ( this._selectedWallet === "arrr" ) { + return html` this.exportArrrAddressbook()}> ${translate("walletpage.wchange54")}` } else { return html`` } @@ -3903,17 +4477,19 @@ class MultiWallet extends LitElement { renderImportAddressbookButton() { if ( this._selectedWallet === "qort" ) { - return html` this.openImportQortAdressbook()}> ${translate("walletpage.wchange53")}` + return html` this.openImportQortAddressbook()}> ${translate("walletpage.wchange53")}` } else if ( this._selectedWallet === "btc" ) { - return html` this.openImportBtcAdressbook()}> ${translate("walletpage.wchange53")}` + return html` this.openImportBtcAddressbook()}> ${translate("walletpage.wchange53")}` } else if ( this._selectedWallet === "ltc" ) { - return html` this.openImportLtcAdressbook()}> ${translate("walletpage.wchange53")}` + return html` this.openImportLtcAddressbook()}> ${translate("walletpage.wchange53")}` } else if ( this._selectedWallet === "doge" ) { - return html` this.openImportDogeAdressbook()}> ${translate("walletpage.wchange53")}` + return html` this.openImportDogeAddressbook()}> ${translate("walletpage.wchange53")}` } else if ( this._selectedWallet === "dgb" ) { - return html` this.openImportDgbAdressbook()}> ${translate("walletpage.wchange53")}` + return html` this.openImportDgbAddressbook()}> ${translate("walletpage.wchange53")}` } else if ( this._selectedWallet === "rvn" ) { - return html` this.openImportRvnAdressbook()}> ${translate("walletpage.wchange53")}` + return html` this.openImportRvnAddressbook()}> ${translate("walletpage.wchange53")}` + } else if ( this._selectedWallet === "arrr" ) { + return html` this.openImportArrrAddressbook()}> ${translate("walletpage.wchange53")}` } else { return html`` } @@ -3939,10 +4515,14 @@ class MultiWallet extends LitElement { this.shadowRoot.querySelector("#sendDgbDialog").show(); } - openSendRvn() { + openSendRvn() { this.shadowRoot.querySelector("#sendRvnDialog").show(); } + openSendArrr() { + this.shadowRoot.querySelector("#sendArrrDialog").show(); + } + changeTheme() { const checkTheme = localStorage.getItem('qortalTheme') if (checkTheme === 'dark') { @@ -3965,9 +4545,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) { @@ -4026,6 +4612,15 @@ class MultiWallet extends LitElement { }, { passive: true } ) + } else if (coin === 'arrr') { + this.transactionsGrid.addEventListener( + 'click', + (e) => { + let arrrItem = this.transactionsGrid.getEventContext(e).item + this.showArrrTransactionDetails(arrrItem, this.wallets.get(this._selectedWallet).transactions) + }, + { passive: true } + ) } this.pagesControl = this.shadowRoot.querySelector('#pages') @@ -4045,6 +4640,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) } } @@ -4368,7 +4965,7 @@ class MultiWallet extends LitElement { ` } - renderRvnTransactions(transactions, coin) { + renderRvnTransactions(transactions, coin) { return html`
${translate("walletpage.wchange38")}
@@ -4430,7 +5027,81 @@ class MultiWallet extends LitElement {
- ` + ` + } + + renderArrrTransactions(transactions, coin) { + return html` +
${translate("walletpage.wchange38")}
+ + { + render(html`check`, root) + }} + > + + { + render(html` ${translate("walletpage.wchange40")} ${data.item.totalAmount < 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) + render(html` `, root) + }} + > + + { + render(html`${data.item.memo}`, root) + }} + > + + +
+ ` } async updateItemsFromPage(page, changeWallet = false) { @@ -4619,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' @@ -4633,6 +5304,21 @@ 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