From abe7be473deae6ee9464f46bd8a5520be3dfc5bd Mon Sep 17 00:00:00 2001 From: Phillip Date: Fri, 24 Feb 2023 13:02:05 +0000 Subject: [PATCH] fix issues --- .../api/transactions/DeployAtTransaction.js | 4 +- .../plugins/core/qdn/browser/browser.src.js | 132 ++++++++++++------ 2 files changed, 89 insertions(+), 47 deletions(-) diff --git a/qortal-ui-crypto/api/transactions/DeployAtTransaction.js b/qortal-ui-crypto/api/transactions/DeployAtTransaction.js index c3eb20e4..a9b3ad5f 100644 --- a/qortal-ui-crypto/api/transactions/DeployAtTransaction.js +++ b/qortal-ui-crypto/api/transactions/DeployAtTransaction.js @@ -1,5 +1,6 @@ 'use strict' import TransactionBase from './TransactionBase.js' +import { store } from '../../api.js' export default class DeployAtTransaction extends TransactionBase { constructor() { @@ -33,7 +34,7 @@ export default class DeployAtTransaction extends TransactionBase { this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) } set rAmount(rAmount) { - this._rAmount = rAmount + this._rAmount = Math.round(rAmount * store.getState().config.coin.decimals) this._rAmountBytes = this.constructor.utils.int64ToBytes(this._rAmount) } @@ -60,7 +61,6 @@ export default class DeployAtTransaction extends TransactionBase { } set rCreationBytes(rCreationBytes) { const decode = this.constructor.Base58.decode(rCreationBytes) - console.log({decode}) this._rCreationBytes = this.constructor.utils.stringtoUTF8Array(decode) this._rCreationBytesLength = this.constructor.utils.int32ToBytes(this._rCreationBytes.length) } diff --git a/qortal-ui-plugins/plugins/core/qdn/browser/browser.src.js b/qortal-ui-plugins/plugins/core/qdn/browser/browser.src.js index 443d2d00..2ae43c96 100644 --- a/qortal-ui-plugins/plugins/core/qdn/browser/browser.src.js +++ b/qortal-ui-plugins/plugins/core/qdn/browser/browser.src.js @@ -231,7 +231,6 @@ class WebBrowser extends LitElement { } render() { - console.log(1, "browser page here"); return html`
@@ -295,7 +294,20 @@ class WebBrowser extends LitElement { } const data = await response.json() - const joinFee = data + const joinFee = (Number(data) / 1e8).toFixed(8) + return joinFee + } + async sendQortFee() { + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] + const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port + const url = `${nodeUrl}/transactions/unitfee?txType=PAYMENT` + const response = await fetch(url) + if (!response.ok) { + throw new Error('Error when fetching join fee'); + } + + const data = await response.json() + const joinFee = (Number(data) / 1e8).toFixed(8) return joinFee } @@ -452,10 +464,8 @@ class WebBrowser extends LitElement { let response = '{"error": "Request could not be fulfilled"}'; let data = event.data; - console.log('UI received event: ' + JSON.stringify(data)); switch (data.action) { - case 'GET_USER_ACCOUNT': case actions.GET_USER_ACCOUNT: const res1 = await showModalAndWait( actions.GET_USER_ACCOUNT @@ -469,12 +479,12 @@ class WebBrowser extends LitElement { break; } else { const data = {}; - const errorMsg = get('browserpage.bchange17'); + const errorMsg = "User declined to share account details" data['error'] = errorMsg; response = JSON.stringify(data); break; } - case 'LINK_TO_QDN_RESOURCE': + case actions.LINK_TO_QDN_RESOURCE: case actions.QDN_RESOURCE_DISPLAYED: // Links are handled by the core, but the UI also listens for these actions in order to update the address bar. // Note: don't update this.url here, as we don't want to force reload the iframe each time. @@ -566,11 +576,11 @@ class WebBrowser extends LitElement { } - case 'SEND_CHAT_MESSAGE': { + case actions.SEND_CHAT_MESSAGE: { const message = data.message; const recipient = data.destinationAddress; const sendMessage = async (messageText, chatReference) => { - this.loader.show(); + let _reference = new Uint8Array(64); window.crypto.getRandomValues(_reference); let reference = window.parent.Base58.encode(_reference); @@ -623,13 +633,13 @@ class WebBrowser extends LitElement { const getSendChatResponse = (res) => { if (res === true) { - let successString = get("browserpage.bchange23"); - parentEpml.request('showSnackBar', `${successString}`); + return res } else if (res.error) { - parentEpml.request('showSnackBar', res.message); + throw new Error(res.message); + } else { + throw new Error('ERROR: Could not send message'); } - this.loader.hide(); - return res; + }; const chatResponse = await sendMessageRequest(); @@ -665,7 +675,7 @@ class WebBrowser extends LitElement { return } - this.loader.show(); + const tiptapJson = { type: 'doc', @@ -699,14 +709,15 @@ class WebBrowser extends LitElement { // this.sendMessage(stringifyMessageObject, typeMessage); // } try { + this.loader.show(); const msgResponse = await sendMessage(stringifyMessageObject); response = msgResponse; } catch (error) { console.error(error); - return '{"error": "Request could not be fulfilled"}'; + response = '{"error": "Request could not be fulfilled"}'; } finally { this.loader.hide(); - console.log("Case completed."); + } } else { @@ -820,7 +831,7 @@ class WebBrowser extends LitElement { // } - case 'GET_WALLET_BALANCE': { + case actions.GET_WALLET_BALANCE: { const requiredFields = ['coin']; const missingFields = []; @@ -931,23 +942,43 @@ class WebBrowser extends LitElement { } - case 'SEND_COIN': + case actions.SEND_COIN: { + const requiredFields = ['coin', 'destinationAddress', 'amount']; + const missingFields = []; + + requiredFields.forEach((field) => { + if (!data[field]) { + missingFields.push(field); + } + }); + + if (missingFields.length > 0) { + this.loader.hide(); + const missingFieldsString = missingFields.join(', '); + const errorMsg = `Missing fields: ${missingFieldsString}` + let data = {}; + data['error'] = errorMsg; + response = JSON.stringify(data); + break + } // Params: data.coin, data.destinationAddress, data.amount, data.fee // TODO: prompt user to send. If they confirm, call `POST /crosschain/:coin/send`, or for QORT, broadcast a PAYMENT transaction // then set the response string from the core to the `response` variable (defined above) // If they decline, send back JSON that includes an `error` key, such as `{"error": "User declined request"}` - const amount = data.amount + const amount = Number(data.amount) let recipient = data.destinationAddress; - const fee = data.fee this.loader.show(); const walletBalance = await parentEpml.request('apiCall', { url: `/addresses/balance/${this.myAddress.address}?apiKey=${this.getApiKey()}`, }) if (isNaN(Number(walletBalance))) { - let snack4string = get("chatpage.cchange48") - parentEpml.request('showSnackBar', `${snack4string}`) - return; + this.loader.hide(); + let errorMsg = "Failed to Fetch QORT Balance. Try again!" + let obj = {}; + obj['error'] = errorMsg; + response = JSON.stringify(obj); + break; } const myRef = await parentEpml.request("apiCall", { @@ -955,27 +986,35 @@ class WebBrowser extends LitElement { url: `/addresses/lastreference/${this.myAddress.address}`, }) - const walletBalanceDecimals = parseFloat(walletBalance) * QORT_DECIMALS; - - if (parseFloat(amount) + parseFloat(data.fee) > parseFloat(walletBalanceDecimals)) { + const walletBalanceDecimals = Number(walletBalance) * QORT_DECIMALS; + const amountDecimals = Number(amount) * QORT_DECIMALS + const fee = await this.sendQortFee() + // TODO fee + if (amountDecimals + (fee * QORT_DECIMALS) > walletBalanceDecimals) { this.loader.hide(); - let snack1string = get("chatpage.cchange51"); - parentEpml.request('showSnackBar', `${snack1string}`); - return false; + let errorMsg = "Insufficient Funds!" + let obj = {}; + obj['error'] = errorMsg; + response = JSON.stringify(obj); + break; } - if (parseFloat(amount) <= 0) { + if (amount <= 0) { this.loader.hide(); - let snack2string = get("chatpage.cchange52"); - parentEpml.request('showSnackBar', `${snack2string}`); - return false; + let errorMsg = "Invalid Amount!" + let obj = {}; + obj['error'] = errorMsg; + response = JSON.stringify(obj); + break; } if (recipient.length === 0) { this.loader.hide(); - let snack3string = get("chatpage.cchange53"); - parentEpml.request('showSnackBar', `${snack3string}`); - return false; + let errorMsg = "Receiver cannot be empty!" + let obj = {}; + obj['error'] = errorMsg; + response = JSON.stringify(obj); + break; } const validateName = async (receiverName) => { @@ -1020,9 +1059,10 @@ class WebBrowser extends LitElement { const res = getTxnRequestResponse(myTransaction) return res; } else { - console.error(`${translate("chatpage.cchange54")}`) - parentEpml.request('showSnackBar', `${translate("chatpage.cchange54")}`) - this.loader.hide(); + + let errorMsg = "Invalid Receiver!" + throw new Error(errorMsg) + } } } @@ -1073,14 +1113,15 @@ class WebBrowser extends LitElement { const getTxnRequestResponse = (txnResponse) => { if (txnResponse.success === false && txnResponse.message) { this.loader.hide(); - throw new Error(txnResponse); + throw new Error(txnResponse.message); } else if (txnResponse.success === true && !txnResponse.data.error) { this.loader.hide(); + return txnResponse.data; } else { this.loader.hide(); - throw new Error(txnResponse); + throw new Error('Error: could not send coin'); } - return txnResponse; + } try { @@ -1088,11 +1129,13 @@ class WebBrowser extends LitElement { response = result; } catch (error) { console.error(error); - return '{"error": "Request could not be fulfilled"}'; + response = '{"error": "Request could not be fulfilled"}'; } finally { - console.log("Case completed."); + this.loader.hide(); } break; + } + default: console.log('Unhandled message: ' + JSON.stringify(data)); @@ -1107,7 +1150,6 @@ class WebBrowser extends LitElement { // Not all responses will be JSON responseObj = response; } - // Respond to app if (responseObj.error != null) { event.ports[0].postMessage({