From e3ef24dc5eb7ba0f361c1f91c9a9c419b3a2b1a8 Mon Sep 17 00:00:00 2001
From: AlphaX-Qortal <67390536+AlphaX-Qortal@users.noreply.github.com>
Date: Wed, 26 Feb 2025 09:37:46 +0100
Subject: [PATCH 1/4] Fix parsing use-embed

---
 plugins/plugins/core/components/qdn-action-constants.js | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/plugins/plugins/core/components/qdn-action-constants.js b/plugins/plugins/core/components/qdn-action-constants.js
index 498388a8..626b333a 100644
--- a/plugins/plugins/core/components/qdn-action-constants.js
+++ b/plugins/plugins/core/components/qdn-action-constants.js
@@ -122,8 +122,9 @@ export const extensionToPointer = (repString) => {
 	const replace36 = replace35.split('.7z').join('.7z</newpointer>')
 	const replace37 = replace36.split('.gz').join('.gz</newpointer>')
 	const replace38 = replace37.split('.bz2').join('.bz2</newpointer>')
+	const replace39 = replace38.split('service=QCHAT_IMAGE</p>').join('service=QCHAT_IMAGE</newpointer></p>')
 
-	return replace38
+	return replace39
 }
 
 export const encodedToChar = (encodedString) => {

From 7ca9acaf3a59dfa234805e75d500a6a5be3f9665 Mon Sep 17 00:00:00 2001
From: AlphaX-Qortal <67390536+AlphaX-Qortal@users.noreply.github.com>
Date: Tue, 18 Mar 2025 17:20:46 +0100
Subject: [PATCH 2/4] Added qortal requests

---
 core/src/components/login-view/login-view.js  |   8 +-
 .../components/settings-view/security-view.js |  18 +-
 core/src/redux/app/actions/app-core.js        |  18 +-
 core/src/redux/app/app-action-types.js        |   2 +
 core/src/redux/app/app-reducer.js             |  21 +-
 .../core/components/qdn-action-types.js       |  12 ++
 .../plugins/core/qdn/browser/browser.src.js   | 179 +++++++++++++++++-
 plugins/plugins/utils/classes.js              |  96 ++++++++++
 8 files changed, 346 insertions(+), 8 deletions(-)

diff --git a/core/src/components/login-view/login-view.js b/core/src/components/login-view/login-view.js
index 74eb66c2..8a50801f 100644
--- a/core/src/components/login-view/login-view.js
+++ b/core/src/components/login-view/login-view.js
@@ -20,7 +20,9 @@ import {
 	setSideEffectAction,
 	setTabNotifications,
 	allowQAPPAutoBalance,
-	removeQAPPAutoBalance
+	removeQAPPAutoBalance,
+	allowQAPPAutoTransactions,
+	removeQAPPAutoTransactions
 } from '../../redux/app/app-actions'
 import settings from '../../functional-components/settings-page'
 import './welcome-page'
@@ -56,7 +58,9 @@ window.reduxAction = {
 	allowShowSyncIndicator: allowShowSyncIndicator,
 	removeShowSyncIndicator: removeShowSyncIndicator,
 	allowQAPPAutoBalance: allowQAPPAutoBalance,
-	removeQAPPAutoBalance: removeQAPPAutoBalance
+	removeQAPPAutoBalance: removeQAPPAutoBalance,
+	allowQAPPAutoTransactions: allowQAPPAutoTransactions,
+	removeQAPPAutoTransactions: removeQAPPAutoTransactions
 }
 
 const animationDuration = 0.7 // Seconds
diff --git a/core/src/components/settings-view/security-view.js b/core/src/components/settings-view/security-view.js
index 4f8fd51a..c0e529fb 100644
--- a/core/src/components/settings-view/security-view.js
+++ b/core/src/components/settings-view/security-view.js
@@ -10,7 +10,9 @@ import {
 	removeQAPPAutoLists,
 	setIsOpenDevDialog,
 	allowQAPPAutoBalance,
-	removeQAPPAutoBalance
+	removeQAPPAutoBalance,
+	allowQAPPAutoTransactions,
+	removeQAPPAutoTransactions
 } from '../../redux/app/app-actions'
 import { securityViewStyles } from '../../styles/core-css'
 import FileSaver from 'file-saver'
@@ -87,6 +89,12 @@ class SecurityView extends connect(store)(LitElement) {
 					</label>
 					<mwc-checkbox style="margin-right: -15px;" id="balanceButton" @click=${(e) => this.checkForBalance(e)} ?checked=${store.getState().app.qAPPAutoBalance}></mwc-checkbox>
 				</div>
+				<div class="checkbox-row">
+					<label for="transactionsButton" id="transactionsButtonLabel" style="color: var(--black);">
+						Always allow wallet txs to be retrieved automatically
+					</label>
+					<mwc-checkbox style="margin-right: -15px;" id="transactionsButton" @click=${(e) => this.checkForTransactions(e)} ?checked=${store.getState().app.qAPPAutoTransactions}></mwc-checkbox>
+				</div>
 				<div class="checkbox-row">
 					<label for="authButton" id="authButtonLabel" style="color: var(--black);">
 						${get('browserpage.bchange39')}
@@ -124,6 +132,14 @@ class SecurityView extends connect(store)(LitElement) {
 		}
 	}
 
+	checkForTransactions(e) {
+		if (e.target.checked) {
+			store.dispatch(removeQAPPAutoTransactions(false))
+		} else {
+			store.dispatch(allowQAPPAutoTransactions(true))
+		}
+	}
+
 	checkForLists(e) {
 		if (e.target.checked) {
 			store.dispatch(removeQAPPAutoLists(false))
diff --git a/core/src/redux/app/actions/app-core.js b/core/src/redux/app/actions/app-core.js
index ffa9aebf..e17ab3eb 100644
--- a/core/src/redux/app/actions/app-core.js
+++ b/core/src/redux/app/actions/app-core.js
@@ -26,7 +26,9 @@ import {
 	ALLOW_SHOW_SYNC_INDICATOR,
 	REMOVE_SHOW_SYNC_INDICATOR,
 	ALLOW_QAPP_AUTO_BALANCE,
-	REMOVE_QAPP_AUTO_BALANCE
+	REMOVE_QAPP_AUTO_BALANCE,
+	ALLOW_QAPP_AUTO_TRANSACTIONS,
+	REMOVE_QAPP_AUTO_TRANSACTIONS
 } from '../app-action-types'
 
 export const doUpdateBlockInfo = (blockObj) => {
@@ -136,6 +138,20 @@ export const removeQAPPAutoBalance = (payload) => {
     }
 }
 
+export const allowQAPPAutoTransactions = (payload) => {
+    return {
+        type: ALLOW_QAPP_AUTO_TRANSACTIONS,
+        payload
+    }
+}
+
+export const removeQAPPAutoTransactions = (payload) => {
+    return {
+        type: REMOVE_QAPP_AUTO_TRANSACTIONS,
+        payload
+    }
+}
+
 export const allowQAPPAutoLists = (payload) => {
 	return {
 		type: ALLOW_QAPP_AUTO_LISTS,
diff --git a/core/src/redux/app/app-action-types.js b/core/src/redux/app/app-action-types.js
index 9d26188d..aa9eea90 100644
--- a/core/src/redux/app/app-action-types.js
+++ b/core/src/redux/app/app-action-types.js
@@ -41,3 +41,5 @@ export const ALLOW_SHOW_SYNC_INDICATOR = 'ALLOW_SHOW_SYNC_INDICATOR'
 export const REMOVE_SHOW_SYNC_INDICATOR = 'REMOVE_SHOW_SYNC_INDICATOR'
 export const ALLOW_QAPP_AUTO_BALANCE = 'ALLOW_QAPP_AUTO_BALANCE'
 export const REMOVE_QAPP_AUTO_BALANCE = 'REMOVE_QAPP_AUTO_BALANCE'
+export const ALLOW_QAPP_AUTO_TRANSACTIONS = 'ALLOW_QAPP_AUTO_TRANSACTIONS'
+export const REMOVE_QAPP_AUTO_TRANSACTIONS = 'REMOVE_QAPP_AUTO_TRANSACTIONS'
diff --git a/core/src/redux/app/app-reducer.js b/core/src/redux/app/app-reducer.js
index 98ed98db..d323438f 100644
--- a/core/src/redux/app/app-reducer.js
+++ b/core/src/redux/app/app-reducer.js
@@ -42,7 +42,9 @@ import {
 	ALLOW_SHOW_SYNC_INDICATOR,
 	REMOVE_SHOW_SYNC_INDICATOR,
 	ALLOW_QAPP_AUTO_BALANCE,
-	REMOVE_QAPP_AUTO_BALANCE
+	REMOVE_QAPP_AUTO_BALANCE,
+	ALLOW_QAPP_AUTO_TRANSACTIONS,
+	REMOVE_QAPP_AUTO_TRANSACTIONS
 } from './app-action-types'
 import { initWorkersReducer } from './reducers/init-workers'
 import { loginReducer } from './reducers/login-reducer'
@@ -92,6 +94,7 @@ const INITIAL_STATE = {
 	qAPPFriendsList: loadStateFromLocalStorage('qAPPFriendsList') || false,
 	showSyncIndicator: loadStateFromLocalStorage('showSyncIndicator') || false,
 	qAPPAutoBalance: loadStateFromLocalStorage('qAPPAutoBalance') || false,
+	qAPPAutoTransactions: loadStateFromLocalStorage('qAPPAutoTransactions') || false,
 	chatLastSeen: [],
 	newTab: null,
 	tabInfo: {},
@@ -270,6 +273,22 @@ export default (state = INITIAL_STATE, action) => {
 			}
 		}
 
+		case ALLOW_QAPP_AUTO_TRANSACTIONS: {
+			saveStateToLocalStorage("qAPPAutoTransactions", true)
+			return {
+				...state,
+				qAPPAutoTransactions: action.payload
+			}
+		}
+
+		case REMOVE_QAPP_AUTO_TRANSACTIONS: {
+			saveStateToLocalStorage("qAPPAutoTransactions", false)
+			return {
+				...state,
+				qAPPAutoTransactions: action.payload
+			}
+		}
+
 		case ALLOW_QAPP_AUTO_LISTS: {
 			saveStateToLocalStorage("qAPPAutoLists", true)
 			return {
diff --git a/plugins/plugins/core/components/qdn-action-types.js b/plugins/plugins/core/components/qdn-action-types.js
index b0aaf8b5..8128f67b 100644
--- a/plugins/plugins/core/components/qdn-action-types.js
+++ b/plugins/plugins/core/components/qdn-action-types.js
@@ -1,6 +1,15 @@
 // IS_USING_PUBLIC_NODE
 export const IS_USING_PUBLIC_NODE = 'IS_USING_PUBLIC_NODE'
 
+// GET_ARRR_SYNC_STATUS
+export const GET_ARRR_SYNC_STATUS = 'GET_ARRR_SYNC_STATUS'
+
+// GET_NODE_INFO
+export const GET_NODE_INFO = 'GET_NODE_INFO'
+
+// GET_NODE_STATUS
+export const GET_NODE_STATUS = 'GET_NODE_STATUS'
+
 // ADMIN_ACTION
 export const ADMIN_ACTION = 'ADMIN_ACTION'
 
@@ -123,6 +132,9 @@ export const OPEN_PROFILE = 'OPEN_PROFILE'
 // GET_USER_WALLET
 export const GET_USER_WALLET = 'GET_USER_WALLET'
 
+// GET_USER_WALLET_TRANSACTIONS
+export const GET_USER_WALLET_TRANSACTIONS = 'GET_USER_WALLET_TRANSACTIONS'
+
 // GET_WALLET_BALANCE
 export const GET_WALLET_BALANCE = 'GET_WALLET_BALANCE'
 
diff --git a/plugins/plugins/core/qdn/browser/browser.src.js b/plugins/plugins/core/qdn/browser/browser.src.js
index 60a01fdc..b44bce1f 100644
--- a/plugins/plugins/core/qdn/browser/browser.src.js
+++ b/plugins/plugins/core/qdn/browser/browser.src.js
@@ -13,7 +13,10 @@ import {
 	processTransactionV2,
 	publishData,
 	requestQueueGetAtAddresses,
-	tradeBotCreateRequest
+	tradeBotCreateRequest,
+	getArrrSyncStatus,
+	getNodeInfo,
+	getNodeStatus
 } from '../../../utils/classes'
 import {appendBuffer} from '../../../utils/utilities'
 import {QORT_DECIMALS} from '../../../../../crypto/api/constants'
@@ -319,6 +322,21 @@ class WebBrowser extends LitElement {
 				}
 					break
 
+				case actions.GET_ARRR_SYNC_STATUS: {
+					response = await getArrrSyncStatus()
+				}
+					break
+
+				case actions.GET_NODE_INFO: {
+					response = await getNodeInfo()
+				}
+					break
+
+				case actions.GET_NODE_STATUS: {
+					response = await getNodeStatus()
+				}
+					break
+
 				case actions.ADMIN_ACTION: {
 					let type = data.type
 					let value = data.value
@@ -2701,6 +2719,132 @@ class WebBrowser extends LitElement {
 				}
 					break
 
+				case actions.GET_USER_WALLET_TRANSACTIONS: {
+					const requiredFields = ['coin']
+					const missingFields = []
+					let dataSentBack = {}
+					let skip = false
+					let res3
+					requiredFields.forEach((field) => {
+						if (!data[field]) {
+							missingFields.push(field)
+						}
+					})
+					if (missingFields.length > 0) {
+						const missingFieldsString = missingFields.join(', ')
+						const tryAgain = get("walletpage.wchange44")
+						await showErrorAndWait(
+							"MISSING_FIELDS",
+							{
+								id1: missingFieldsString,
+								id2: tryAgain
+							}
+						)
+						dataSentBack['error'] = `Missing fields: ${missingFieldsString}`
+						response = JSON.stringify(dataSentBack)
+						break
+					}
+					if (window.parent.reduxStore.getState().app.qAPPAutoTransactions) {
+						skip = true
+					}
+					if (!skip) {
+						res3 = await showModalAndWait(
+							actions.GET_USER_WALLET_TRANSACTIONS
+						)
+					}
+					if ((res3 && res3.action === 'accept') || skip) {
+						let coin = data.coin
+						if (coin === "QORT") {
+							let qortAddress = window.parent.reduxStore.getState().app.selectedAddress.address
+							try {
+								this.loader.show()
+								response = await parentEpml.request('apiCall', {
+									url: `/transactions/address/${qortAddress}?limit=0&reverse=true`
+								})
+								this.loader.hide()
+								break
+							} catch (error) {
+								this.loader.hide()
+								let myMsg1 = get("browserpage.bchange21")
+								let myMsg2 = get("walletpage.wchange44")
+								await showErrorAndWait("ACTION_FAILED", {id1: myMsg1, id2: myMsg2})
+								const data = {}
+								data['error'] = error.message ? error.message : get("browserpage.bchange21")
+								response = JSON.stringify(data)
+							}
+						} else {
+							let _url = ``
+							let _body = null
+							switch (coin) {
+								case 'BTC':
+									_url = `/crosschain/btc/wallettransactions?apiKey=${this.getApiKey()}`
+									_body = window.parent.reduxStore.getState().app.selectedAddress.btcWallet.derivedMasterPublicKey
+									break
+								case 'LTC':
+									_url = `/crosschain/ltc/wallettransactions?apiKey=${this.getApiKey()}`
+									_body = window.parent.reduxStore.getState().app.selectedAddress.ltcWallet.derivedMasterPublicKey
+									break
+								case 'DOGE':
+									_url = `/crosschain/doge/wallettransactions?apiKey=${this.getApiKey()}`
+									_body = window.parent.reduxStore.getState().app.selectedAddress.dogeWallet.derivedMasterPublicKey
+									break
+								case 'DGB':
+									_url = `/crosschain/dgb/wallettransactions?apiKey=${this.getApiKey()}`
+									_body = window.parent.reduxStore.getState().app.selectedAddress.dgbWallet.derivedMasterPublicKey
+									break
+								case 'RVN':
+									_url = `/crosschain/rvn/wallettransactions?apiKey=${this.getApiKey()}`
+									_body = window.parent.reduxStore.getState().app.selectedAddress.rvnWallet.derivedMasterPublicKey
+									break
+								case 'ARRR':
+									_url = `/crosschain/arrr/wallettransactions?apiKey=${this.getApiKey()}`
+									_body = window.parent.reduxStore.getState().app.selectedAddress.arrrWallet.seed58
+									break
+								default:
+									break
+							}
+							try {
+								this.loader.show()
+								const res = await parentEpml.request('apiCall', {
+									url: _url,
+									method: 'POST',
+									body: _body
+								})
+								if (!res.ok) {
+									this.loader.hide()
+									let myMsg1 = get("browserpage.bchange21")
+									let myMsg2 = get("walletpage.wchange44")
+									await showErrorAndWait("ACTION_FAILED", { id1: myMsg1, id2: myMsg2 })
+									const data = {}
+									data['error'] = get("browserpage.bchange21")
+									response = JSON.stringify(data)
+									break
+								} else {
+									this.loader.hide()
+									response = res
+									break
+								}
+							} catch (error) {
+								this.loader.hide()
+								let myMsg1 = get("browserpage.bchange21")
+								let myMsg2 = get("walletpage.wchange44")
+								await showErrorAndWait("ACTION_FAILED", { id1: myMsg1, id2: myMsg2 })
+								const data = {}
+								data['error'] = error.message ? error.message : get("browserpage.bchange21")
+								response = JSON.stringify(data)
+								break
+							}
+						}
+					} else if (res3.action === 'reject') {
+						let myMsg1 = get("transactions.declined")
+						let myMsg2 = get("walletpage.wchange44")
+						await showErrorAndWait("DECLINED_REQUEST", { id1: myMsg1, id2: myMsg2 })
+						response = '{"error": "User declined request"}'
+						break
+					}
+				}
+					break
+
 				case actions.GET_WALLET_BALANCE: {
 					const requiredFields = ['coin']
 					const missingFields = []
@@ -5226,7 +5370,6 @@ async function showModalAndWait(type, data) {
 						${type === actions.GET_PROFILE_DATA ? `
 							<div class="modal-subcontainer">
 								<p class="modal-paragraph">${get("browserpage.bchange49")}: <span style="font-weight: bold"> ${data.property}</span></p>
-
 							</div>
 						` : ''}
 
@@ -5294,6 +5437,18 @@ async function showModalAndWait(type, data) {
 							<p class="modal-paragraph">${data.text3}</p>
 							<p class="modal-paragraph">${get("walletpage.wchange36")}: <span>${data.fee}</span></p>
 						` : ''}
+
+						${type === actions.GET_USER_WALLET_TRANSACTIONS ? `
+							<div class="modal-subcontainer">
+								<p class="modal-paragraph">Do you give this application permission to retrieve your wallet transactions?</p>
+								<div class="checkbox-row">
+									<label for="transactionsButton" id="transactionsButtonLabel" style="color: var(--black);">
+										Always allow wallet txs to be retrieved automatically
+									</label>
+									<mwc-checkbox style="margin-right: -15px;" id="transactionsButton" ?checked=${window.parent.reduxStore.getState().app.qAPPAutoTransactions}></mwc-checkbox>
+								</div>
+							</div>
+						` : ''}
 					</div>
 					<div class="modal-buttons">
 						<button id="cancel-button">${get("browserpage.bchange27")}</button>
@@ -5365,7 +5520,7 @@ async function showModalAndWait(type, data) {
 			})
 		}
 
-		const checkbox1 = modal.querySelector('#abalanceButton')
+		const checkbox1 = modal.querySelector('#balanceButton')
 		if (checkbox1) {
 			checkbox1.addEventListener('click', (e) => {
 				if (e.target.checked) {
@@ -5394,6 +5549,24 @@ async function showModalAndWait(type, data) {
 			})
 		}
 
+		const labelButton3 = modal.querySelector('#transactionsButtonLabel')
+		if (labelButton3) {
+			labelButton1.addEventListener('click', () => {
+				this.shadowRoot.getElementById('transactionsButton').click()
+			})
+		}
+
+		const checkbox3 = modal.querySelector('#transactionsButton')
+		if (checkbox3) {
+			checkbox1.addEventListener('click', (e) => {
+				if (e.target.checked) {
+					window.parent.reduxStore.dispatch(window.parent.reduxAction.removeQAPPAutoTransacions(false))
+					return
+				}
+				window.parent.reduxStore.dispatch(window.parent.reduxAction.allowQAPPAutoTransacions(true))
+			})
+		}
+
 		const labelButtonFriendsList = modal.querySelector('#friendsListLabel')
 		if (labelButtonFriendsList) {
 			labelButtonFriendsList.addEventListener('click', () => {
diff --git a/plugins/plugins/utils/classes.js b/plugins/plugins/utils/classes.js
index 751c7194..4a2dcf1d 100644
--- a/plugins/plugins/utils/classes.js
+++ b/plugins/plugins/utils/classes.js
@@ -1552,3 +1552,99 @@ export const cancelTradeOfferTradeBot = async (body, keyPair) => {
 		throw new Error("Failed to Cancel Sell Order. Try again!")
 	}
 }
+
+export const getArrrSyncStatus = async () => {
+	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 myApiKey = myNode.apiKey
+	const url = `${nodeUrl}/crosschain/arrr/syncstatus?apiKey=${myApiKey}`
+	const arrrSeed = window.parent.reduxStore.getState().app.selectedAddress.arrrWallet.seed58
+
+	try {
+		const response = await fetch(url, {
+			method: "POST",
+			headers: {
+				Accept: "*/*"
+			},
+			body: arrrSeed
+		})
+ 
+		let res
+
+		try {
+			res = await response.clone().json()
+		} catch (e) {
+			res = await response.text()
+		}
+
+		return res
+	} catch (error) {
+		console.error(error.message || "Error in retrieving arrr sync status")
+	}
+}
+
+export const getNodeInfo = async () => {
+	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}/admin/info`
+
+	try {
+		const response = await fetch(url, {
+			method: "GET",
+			headers: {
+				Accept: "*/*"
+			}
+		})
+
+		if (!response.ok) console.error("Failed to retrieve node info")
+
+		let res
+
+		try {
+			res = await response.clone().json()
+		} catch (e) {
+			res = await response.text()
+		}
+
+		if (res.error && res.message) {
+			console.error(res.message)
+		}
+
+		return res
+	} catch (error) {
+		console.error(error.message || "Error in retrieving node info")
+	}
+}
+ 
+ export const getNodeStatus = async () => {
+	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}/admin/status`
+
+	try {
+		const response = await fetch(url, {
+			method: "GET",
+			headers: {
+				Accept: "*/*"
+			}
+		})
+
+		if (!response.ok) console.error("Failed to retrieve node status")
+
+		let res
+
+		try {
+			res = await response.clone().json()
+		} catch (e) {
+			res = await response.text()
+		}
+
+		if (res.error && res.message) {
+			console.error(res.message)
+		}
+
+		return res
+	} catch (error) {
+		console.error(error.message || "Error in retrieving node status")
+	}
+}

From 9dbc4b085be609b487bded1744146a6338d8f4a0 Mon Sep 17 00:00:00 2001
From: AlphaX <olaf.wasilewski@gmx.de>
Date: Tue, 18 Mar 2025 19:19:00 +0100
Subject: [PATCH 3/4] Fix typo

---
 plugins/plugins/core/qdn/browser/browser.src.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/plugins/plugins/core/qdn/browser/browser.src.js b/plugins/plugins/core/qdn/browser/browser.src.js
index b44bce1f..eaaa4741 100644
--- a/plugins/plugins/core/qdn/browser/browser.src.js
+++ b/plugins/plugins/core/qdn/browser/browser.src.js
@@ -5551,14 +5551,14 @@ async function showModalAndWait(type, data) {
 
 		const labelButton3 = modal.querySelector('#transactionsButtonLabel')
 		if (labelButton3) {
-			labelButton1.addEventListener('click', () => {
+			labelButton3.addEventListener('click', () => {
 				this.shadowRoot.getElementById('transactionsButton').click()
 			})
 		}
 
 		const checkbox3 = modal.querySelector('#transactionsButton')
 		if (checkbox3) {
-			checkbox1.addEventListener('click', (e) => {
+			checkbox3.addEventListener('click', (e) => {
 				if (e.target.checked) {
 					window.parent.reduxStore.dispatch(window.parent.reduxAction.removeQAPPAutoTransacions(false))
 					return

From e4eede5087078d6fb80c08bef51ef037149849b5 Mon Sep 17 00:00:00 2001
From: AlphaX-Qortal <67390536+AlphaX-Qortal@users.noreply.github.com>
Date: Wed, 19 Mar 2025 09:19:54 +0100
Subject: [PATCH 4/4] Fix response

---
 .../plugins/core/qdn/browser/browser.src.js   | 85 +++++++------------
 1 file changed, 31 insertions(+), 54 deletions(-)

diff --git a/plugins/plugins/core/qdn/browser/browser.src.js b/plugins/plugins/core/qdn/browser/browser.src.js
index eaaa4741..0cb5309c 100644
--- a/plugins/plugins/core/qdn/browser/browser.src.js
+++ b/plugins/plugins/core/qdn/browser/browser.src.js
@@ -2703,6 +2703,7 @@ class WebBrowser extends LitElement {
 								break
 							case 'ARRR':
 								userWallet['address'] = arrrAddress
+								userWallet['publicKey'] = window.parent.reduxStore.getState().app.selectedAddress.arrrWallet.seed58
 								break
 							default:
 								break
@@ -2723,8 +2724,8 @@ class WebBrowser extends LitElement {
 					const requiredFields = ['coin']
 					const missingFields = []
 					let dataSentBack = {}
-					let skip = false
-					let res3
+					let skipWalletTransactions = false
+					let resSkipWalletTransactions
 					requiredFields.forEach((field) => {
 						if (!data[field]) {
 							missingFields.push(field)
@@ -2745,32 +2746,30 @@ class WebBrowser extends LitElement {
 						break
 					}
 					if (window.parent.reduxStore.getState().app.qAPPAutoTransactions) {
-						skip = true
+						skipWalletTransactions = true
 					}
-					if (!skip) {
-						res3 = await showModalAndWait(
+					if (!skipWalletTransactions) {
+						resSkipWalletTransactions = await showModalAndWait(
 							actions.GET_USER_WALLET_TRANSACTIONS
 						)
 					}
-					if ((res3 && res3.action === 'accept') || skip) {
+					if ((resSkipWalletTransactions && resSkipWalletTransactions.action === 'accept') || skipWalletTransactions) {
 						let coin = data.coin
 						if (coin === "QORT") {
 							let qortAddress = window.parent.reduxStore.getState().app.selectedAddress.address
 							try {
-								this.loader.show()
 								response = await parentEpml.request('apiCall', {
 									url: `/transactions/address/${qortAddress}?limit=0&reverse=true`
 								})
-								this.loader.hide()
 								break
 							} catch (error) {
-								this.loader.hide()
 								let myMsg1 = get("browserpage.bchange21")
 								let myMsg2 = get("walletpage.wchange44")
 								await showErrorAndWait("ACTION_FAILED", {id1: myMsg1, id2: myMsg2})
 								const data = {}
 								data['error'] = error.message ? error.message : get("browserpage.bchange21")
 								response = JSON.stringify(data)
+								break
 							}
 						} else {
 							let _url = ``
@@ -2804,28 +2803,13 @@ class WebBrowser extends LitElement {
 									break
 							}
 							try {
-								this.loader.show()
-								const res = await parentEpml.request('apiCall', {
+								response = await parentEpml.request('apiCall', {
 									url: _url,
 									method: 'POST',
 									body: _body
 								})
-								if (!res.ok) {
-									this.loader.hide()
-									let myMsg1 = get("browserpage.bchange21")
-									let myMsg2 = get("walletpage.wchange44")
-									await showErrorAndWait("ACTION_FAILED", { id1: myMsg1, id2: myMsg2 })
-									const data = {}
-									data['error'] = get("browserpage.bchange21")
-									response = JSON.stringify(data)
-									break
-								} else {
-									this.loader.hide()
-									response = res
-									break
-								}
+								break
 							} catch (error) {
-								this.loader.hide()
 								let myMsg1 = get("browserpage.bchange21")
 								let myMsg2 = get("walletpage.wchange44")
 								await showErrorAndWait("ACTION_FAILED", { id1: myMsg1, id2: myMsg2 })
@@ -2835,7 +2819,7 @@ class WebBrowser extends LitElement {
 								break
 							}
 						}
-					} else if (res3.action === 'reject') {
+					} else if (resSkipWalletTransactions.action === 'reject') {
 						let myMsg1 = get("transactions.declined")
 						let myMsg2 = get("walletpage.wchange44")
 						await showErrorAndWait("DECLINED_REQUEST", { id1: myMsg1, id2: myMsg2 })
@@ -2849,8 +2833,8 @@ class WebBrowser extends LitElement {
 					const requiredFields = ['coin']
 					const missingFields = []
 					let dataSentBack = {}
-					let skip = false
-					let res3
+					let skipWalletBalance = false
+					let resSkipWalletBalance
 					requiredFields.forEach((field) => {
 						if (!data[field]) {
 							missingFields.push(field)
@@ -2875,32 +2859,30 @@ class WebBrowser extends LitElement {
 					// 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"}`
 					if (window.parent.reduxStore.getState().app.qAPPAutoBalance) {
-						skip = true
+						skipWalletBalance = true
 					}
-					if (!skip) {
-						res3 = await showModalAndWait(
+					if (!skipWalletBalance) {
+						resSkipWalletBalance = await showModalAndWait(
 							actions.GET_WALLET_BALANCE
 						)
 					}
-					if ((res3 && res3.action === 'accept') || skip) {
+					if ((resSkipWalletBalance && resSkipWalletBalance.action === 'accept') || skipWalletBalance) {
 						let coin = data.coin
 						if (coin === "QORT") {
 							let qortAddress = window.parent.reduxStore.getState().app.selectedAddress.address
 							try {
-								this.loader.show()
 								response = await parentEpml.request('apiCall', {
 									url: `/addresses/balance/${qortAddress}?apiKey=${this.getApiKey()}`
 								})
-								this.loader.hide()
 								break
 							} catch (error) {
-								this.loader.hide()
 								let myMsg1 = get("browserpage.bchange21")
 								let myMsg2 = get("walletpage.wchange44")
 								await showErrorAndWait("ACTION_FAILED", {id1: myMsg1, id2: myMsg2})
 								const data = {}
 								data['error'] = error.message ? error.message : get("browserpage.bchange21")
 								response = JSON.stringify(data)
+								break
 							}
 						} else {
 							let _url = ``
@@ -2934,14 +2916,12 @@ class WebBrowser extends LitElement {
 									break
 							}
 							try {
-								this.loader.show()
 								const res = await parentEpml.request('apiCall', {
 									url: _url,
 									method: 'POST',
 									body: _body
 								})
 								if (isNaN(Number(res))) {
-									this.loader.hide()
 									let myMsg1 = get("browserpage.bchange21")
 									let myMsg2 = get("walletpage.wchange44")
 									await showErrorAndWait("ACTION_FAILED", { id1: myMsg1, id2: myMsg2 })
@@ -2950,12 +2930,10 @@ class WebBrowser extends LitElement {
 									response = JSON.stringify(data)
 									break
 								} else {
-									this.loader.hide()
 									response = (Number(res) / 1e8).toFixed(8)
 									break
 								}
 							} catch (error) {
-								this.loader.hide()
 								let myMsg1 = get("browserpage.bchange21")
 								let myMsg2 = get("walletpage.wchange44")
 								await showErrorAndWait("ACTION_FAILED", { id1: myMsg1, id2: myMsg2 })
@@ -2965,7 +2943,7 @@ class WebBrowser extends LitElement {
 								break
 							}
 						}
-					} else if (res3.action === 'reject') {
+					} else if (resSkipWalletBalance.action === 'reject') {
 						let myMsg1 = get("transactions.declined")
 						let myMsg2 = get("walletpage.wchange44")
 						await showErrorAndWait("DECLINED_REQUEST", { id1: myMsg1, id2: myMsg2 })
@@ -2978,7 +2956,9 @@ class WebBrowser extends LitElement {
 				case actions.GET_USER_WALLET_INFO: {
 					const requiredFields = ['coin']
 					const missingFields = []
+					let skipUserWalletInfo = false
 					let dataSentBack = {}
+					let resSkipUserWalletInfo
 					requiredFields.forEach((field) => {
 						if (!data[field]) {
 							missingFields.push(field)
@@ -2998,16 +2978,20 @@ class WebBrowser extends LitElement {
 						response = JSON.stringify(dataSentBack)
 						break
 					}
-					const userWallet = await showModalAndWait(
-						actions.GET_USER_WALLET
-					)
-					if (userWallet.action === 'accept') {
+					if (window.parent.reduxStore.getState().app.qAPPAutoAuth) {
+						skipUserWalletInfo = true
+					}
+					if (!skipUserWalletInfo) {
+						resSkipUserWalletInfo = await showModalAndWait(
+							actions.GET_USER_WALLET
+						)
+					}
+					if ((resSkipUserWalletInfo && resSkipUserWalletInfo.action === 'accept') || skipUserWalletInfo) {
 						let coin = data.coin
 						let walletKeys = this.getUserWallet(coin)
 						let _url = `/crosschain/` + data.coin.toLowerCase() + `/addressinfos?apiKey=${this.getApiKey()}`
 						let _body = { xpub58: walletKeys['publicKey'] }
 						try {
-							this.loader.show()
 							const bodyToString = JSON.stringify(_body)
 							const res = await parentEpml.request('apiCall', {
 								url: _url,
@@ -3020,7 +3004,6 @@ class WebBrowser extends LitElement {
 							})
 							response = JSON.stringify(res)
 						} catch (error) {
-							this.loader.hide()
 							let myMsg1 = get("browserpage.bchange21")
 							let myMsg2 = get("walletpage.wchange44")
 							await showErrorAndWait("ACTION_FAILED", { id1: myMsg1, id2: myMsg2 })
@@ -3028,10 +3011,8 @@ class WebBrowser extends LitElement {
 							data['error'] = error.message ? error.message : get("browserpage.bchange21")
 							response = JSON.stringify(data)
 							return
-						} finally {
-							this.loader.hide()
 						}
-					} else if (userWallet.action === 'reject') {
+					} else if (resSkipUserWalletInfo.action === 'reject') {
 						let myMsg1 = get("transactions.declined")
 						let myMsg2 = get("walletpage.wchange44")
 						await showErrorAndWait("DECLINED_REQUEST", { id1: myMsg1, id2: myMsg2 })
@@ -3065,7 +3046,6 @@ class WebBrowser extends LitElement {
 					}
 					let _url = `/crosschain/` + data.coin.toLowerCase() + `/serverinfos`
 					try {
-						this.loader.show()
 						const res = await parentEpml.request('apiCall', {
 							url: _url,
 							method: 'GET',
@@ -3075,7 +3055,6 @@ class WebBrowser extends LitElement {
 						})
 						response = JSON.stringify(res.servers)
 					} catch (error) {
-						this.loader.hide()
 						let myMsg1 = get("modals.mpchange55")
 						let myMsg2 = get("walletpage.wchange44")
 						await showErrorAndWait("ACTION_FAILED", { id1: myMsg1, id2: myMsg2 })
@@ -3083,8 +3062,6 @@ class WebBrowser extends LitElement {
 						data['error'] = error.message ? error.message : get("modals.mpchange55")
 						response = JSON.stringify(data)
 						return
-					} finally {
-						this.loader.hide()
 					}
 				}
 					break