diff --git a/chain/wallet/DapConfigManager/DapNodeInstallManager.cpp b/chain/wallet/DapConfigManager/DapNodeInstallManager.cpp
index 363e91ded9ec55275a42c39db815dab5bc3f3786..99ebfd0fb67d7895a7a03f9c6d98f1de8dd8d5f8 100644
--- a/chain/wallet/DapConfigManager/DapNodeInstallManager.cpp
+++ b/chain/wallet/DapConfigManager/DapNodeInstallManager.cpp
@@ -14,21 +14,21 @@ DapNodeInstallManager::DapNodeInstallManager(bool flag_RK, QObject *parent)
 
 #if defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID)
 
-    m_url = QUrl(QString("https://pub.cellframe.net/linux/cellframe-node/%1/%2/").arg(branch).arg(latest));
+    m_url = QUrl(QString("https://pub.cellframe.net/linux/cellframe-node/%1/%2").arg(branch).arg(latest));
     m_suffix =  QString(".deb");
     m_labelUrlFile = "-amd64";
     m_baseUrl = QString("https://pub.cellframe.net/linux/cellframe-node/%1").arg(branch);
 
 #elif defined (Q_OS_MACOS)
 
-    m_url = QUrl(QString("https://pub.cellframe.net/macos/cellframe-node/%1/%2/").arg(branch).arg(latest));//todo: need branch
+    m_url = QUrl(QString("https://pub.cellframe.net/macos/cellframe-node/%1/%2").arg(branch).arg(latest));//todo: need branch
     m_suffix =  QString(".pkg");
     m_labelUrlFile = "-amd64-signed";
     m_baseUrl = QString("https://pub.cellframe.net/macos/cellframe-node/%1").arg(branch);
 
 #elif defined (Q_OS_WIN)
 
-    m_url = QUrl(QString("https://pub.cellframe.net/windows/cellframe-node/%1/%2/").arg(branch).arg(latest)); //todo: need branch
+    m_url = QUrl(QString("https://pub.cellframe.net/windows/cellframe-node/%1/%2").arg(branch).arg(latest)); //todo: need branch
     m_suffix =  QString(".exe");
     m_labelUrlFile = "-installer";
     m_baseUrl = QString("https://pub.cellframe.net/windows/cellframe-node/%1").arg(branch);
diff --git a/chain/wallet/handlers/DapGetListKeysCommand.cpp b/chain/wallet/handlers/DapGetListKeysCommand.cpp
index 0d6d867f35b0091a237c96cea6e288d05d8d9cf5..b76f9332f90d6e3cff6d0d58a0d35fdfbf245faa 100644
--- a/chain/wallet/handlers/DapGetListKeysCommand.cpp
+++ b/chain/wallet/handlers/DapGetListKeysCommand.cpp
@@ -46,7 +46,21 @@ QVariant DapGetListKeysCommand::respondToClient(const QVariant &args)
         }
         else
         {
-            resultArray = request.value("result").toArray()[0].toArray();
+            auto resultObj = request.value("result").toArray()[0];
+            if (resultObj.isObject())
+            {
+                auto errArr = resultObj.toObject().value("errors").toArray();
+                if (!errArr.isEmpty())
+                {
+                    errorMsg = errArr[0].toObject().value("message").toString();
+                }
+                else
+                {
+                    errorMsg = "not found";
+                }
+            }
+            else
+                resultArray = resultObj.toArray();
         }
         QJsonArray keyArray;
         for(const auto& itemValue: resultArray)
diff --git a/chain/wallet/handlers/DapGetXchangeOrdersList.cpp b/chain/wallet/handlers/DapGetXchangeOrdersList.cpp
index 852315f7e4ad7003b0af809e6c65b420a1e59424..4e77fa8847a1d35fc01002959d89362b198736da 100644
--- a/chain/wallet/handlers/DapGetXchangeOrdersList.cpp
+++ b/chain/wallet/handlers/DapGetXchangeOrdersList.cpp
@@ -70,7 +70,12 @@ QVariant DapGetXchangeOrdersList::respondToClient(const QVariant &args)
         obj.insert(net, arrOrders);
     }
 
-    QJsonDocument resultDoc(QJsonObject({{RESULT_KEY, obj}}));
+    QJsonObject resultObject;
+    resultObject.insert(RESULT_KEY, obj);
+    addWeb3Result(resultObject, args);
+
+    QJsonDocument resultDoc(resultObject);
+
     return resultDoc.toJson();
 }
 
diff --git a/chain/wallet/handlers/DapGetXchangeTokenPair.cpp b/chain/wallet/handlers/DapGetXchangeTokenPair.cpp
index 8f2f9f2cdb9ec99e9d09ab45680c7de1d5e99fd6..a9fc73f69d124a3d6bd21b649084d5e40ffc2f03 100644
--- a/chain/wallet/handlers/DapGetXchangeTokenPair.cpp
+++ b/chain/wallet/handlers/DapGetXchangeTokenPair.cpp
@@ -13,23 +13,12 @@ DapGetXchangeTokenPair::DapGetXchangeTokenPair(const QString &asServicename, QOb
 QVariant DapGetXchangeTokenPair::respondToClient(const QVariant &args)
 {
     DapAbstractCommand::respondToClient(args);
-    qDebug() << "args " << args;
-
-    QStringList params = args.toStringList();
 
     QJsonArray arrPairs;
     // get list of networks
 
     QStringList netlist = getListNetworks();
 
-    QString tempResult;
-
-    QString fullInfo = params[0];
-
-    bool update = false;
-    if (params[0] == "update" || params[1] == "update")
-        update = true;
-
     for (const QString &net : netlist)
     {
         auto resultJson = cmdList->getXchangeTokenPairsList(net);
@@ -84,7 +73,11 @@ QVariant DapGetXchangeTokenPair::respondToClient(const QVariant &args)
         }
     }
 
-    QJsonDocument resultDoc(QJsonObject({{RESULT_KEY, arrPairs}}));
+    QJsonObject resultObject;
+    resultObject.insert(RESULT_KEY, arrPairs);
+    addWeb3Result(resultObject, args);
+
+    QJsonDocument resultDoc(resultObject);
     return resultDoc.toJson();
 }
 
diff --git a/chain/wallet/handlers/DapGetXchangeTokenPriceAverage.cpp b/chain/wallet/handlers/DapGetXchangeTokenPriceAverage.cpp
index 375dbf1ba4636ad22222f0a14eddf053b08f6991..0253c97d4db85ebff0d67d74d3b539a09972c7f7 100644
--- a/chain/wallet/handlers/DapGetXchangeTokenPriceAverage.cpp
+++ b/chain/wallet/handlers/DapGetXchangeTokenPriceAverage.cpp
@@ -84,14 +84,18 @@ QVariant DapGetXchangeTokenPriceAverage::respondToClient(const QVariant &args)
         time = QString::number(secondData.first);
     }
 
+    QJsonObject obj;
+    obj.insert("token1",params[1]);
+    obj.insert("token2",params[2]);
+    obj.insert("network",params[0]);
+    obj.insert("rate", rate);
+    obj.insert("time", time);
+
     QJsonObject resultObj;
-    resultObj.insert("token1",params[1]);
-    resultObj.insert("token2",params[2]);
-    resultObj.insert("network",params[0]);
-    resultObj.insert("rate", rate);
-    resultObj.insert("time", time);
+    resultObj.insert(RESULT_KEY,obj);
+    addWeb3Result(resultObj, args);
 
-    QJsonDocument resultDoc(QJsonObject({{RESULT_KEY, resultObj}}));
+    QJsonDocument resultDoc(resultObj);
     return resultDoc.toJson();
 }
 
diff --git a/chain/wallet/handlers/DapLedgerTxHashCommand.cpp b/chain/wallet/handlers/DapLedgerTxHashCommand.cpp
index 0691440804fa3addadbcb1ccb134d87699003524..77bc2417dfe42b60680cfd8ae8968310bbdce747 100644
--- a/chain/wallet/handlers/DapLedgerTxHashCommand.cpp
+++ b/chain/wallet/handlers/DapLedgerTxHashCommand.cpp
@@ -26,9 +26,35 @@ QVariant DapLedgerTxHashCommand::respondToClient(const QVariant &args)
     QJsonObject resultObj;
     QJsonDocument resultDoc;
 
+    auto getErrorMessageFromData = [](const QJsonObject& resultToCheck){
+        const QString errsCode = "errors";
+        const QString msgsCode = "message";
+        if (resultToCheck.contains(errsCode) && resultToCheck[errsCode].isArray())
+        {
+            auto arr = resultToCheck[errsCode].toArray();
+            if (!arr.isEmpty() && arr[0].isObject())
+            {
+                auto msgsObj = arr[0].toObject();
+                if (msgsObj.contains(msgsCode) && msgsObj[msgsCode].isString())
+                {
+                    return msgsObj[msgsCode].toString();
+                }
+            }
+        }
+        return QString();
+    };
+
     if(errorMsg.isEmpty())
     {
-        resultObj.insert(RESULT_KEY, result);
+        QString dataErrMsg = getErrorMessageFromData(result);
+        if (!dataErrMsg.isEmpty())
+        {
+            resultObj.insert(ERROR_KEY, dataErrMsg);
+        }
+        else
+        {
+            resultObj.insert(RESULT_KEY, result);
+        }
     }
     else
     {
diff --git a/chain/wallet/handlers/DapVoitingListCommand.cpp b/chain/wallet/handlers/DapVoitingListCommand.cpp
index 1e90d92125ef90de7e6e935cc3f51f93f915bf8f..47b4aaba1274a2f9e75d4f4dfd1c97694b3eafbf 100644
--- a/chain/wallet/handlers/DapVoitingListCommand.cpp
+++ b/chain/wallet/handlers/DapVoitingListCommand.cpp
@@ -17,7 +17,7 @@ QVariant DapVoitingListCommand::respondToClient(const QVariant &args)
     }
 
     QRegularExpression regular(
-        R"(Voting hash: (.+)\n\s+Voting question: (.+)\n)", QRegularExpression::MultilineOption);
+        R"(\n*voting_tx: (.+)\n+\s+question: \"(.+)\"\n+\s*\n*)", QRegularExpression::MultilineOption);
     QRegularExpressionMatchIterator matchItr = regular.globalMatch(result);
 
     if(matchItr.hasNext())
diff --git a/chain/wallet/handlers/MempoolCheckCommand.cpp b/chain/wallet/handlers/MempoolCheckCommand.cpp
index 5e47b53f906cdaa12db8fe40405921ff8e4825e1..7d26b75d16d97dd7d8c2fd81e8c280d90bcc0ba0 100644
--- a/chain/wallet/handlers/MempoolCheckCommand.cpp
+++ b/chain/wallet/handlers/MempoolCheckCommand.cpp
@@ -33,6 +33,15 @@ QVariant MempoolCheckCommand::respondToClient(const QVariant &args)
     {
         auto resultValue = cmdList->getJsonResult(requestDoc, "mempool check").result.toArray();
         mempoolAnswer = resultValue[0].toObject();
+
+        if(!mempoolAnswer["errors"].isNull())
+        {
+            QJsonArray errArr = mempoolAnswer["errors"].toArray();
+            if (!errArr.isEmpty())
+            {
+                errorMsg = errArr[0].toObject()["message"].toString();
+            }
+        }
     }
 
     if(args.toStringList().contains(WEB3_KEY))