diff --git a/alethzero/MainWin.cpp b/alethzero/MainWin.cpp index 6e5661190..f2418dbb0 100644 --- a/alethzero/MainWin.cpp +++ b/alethzero/MainWin.cpp @@ -434,6 +434,12 @@ QVariant Main::evalRaw(QString const& _js) return ui->webView->page()->currentFrame()->evaluateJavaScript(_js); } +void Main::addToWindowObject(QObject* _object, QString const& _name) +{ + QWebFrame* f = ui->webView->page()->mainFrame(); + f->addToJavaScriptWindowObject(_name, _object, QWebFrame::QtOwnership); +} + void Main::eval(QString const& _js) { if (_js.trimmed().isEmpty()) diff --git a/alethzero/MainWin.h b/alethzero/MainWin.h index 6f8ee7e2b..37ec8f7c1 100644 --- a/alethzero/MainWin.h +++ b/alethzero/MainWin.h @@ -91,6 +91,7 @@ public: QList owned() const { return m_myIdentities + m_myKeys; } QVariant evalRaw(QString const& _js); + void addToWindowObject(QObject* _object, QString const& _name); public slots: void load(QString _file); diff --git a/alethzero/OurWebThreeStubServer.cpp b/alethzero/OurWebThreeStubServer.cpp index 843ed2baf..4769ab3ff 100644 --- a/alethzero/OurWebThreeStubServer.cpp +++ b/alethzero/OurWebThreeStubServer.cpp @@ -21,9 +21,13 @@ #include "OurWebThreeStubServer.h" +#include +#include #include #include #include +#include + #include "MainWin.h" using namespace std; @@ -54,7 +58,7 @@ bool OurWebThreeStubServer::showAuthenticationPopup(std::string const& _title, s return userInput.exec() == QMessageBox::Ok; } -bool OurWebThreeStubServer::authenticate(dev::TransactionSkeleton const& _t) const +bool OurWebThreeStubServer::authenticate(dev::TransactionSkeleton const& _t) { h256 contractCodeHash = m_web3->ethereum()->postState().codeHash(_t.to); if (contractCodeHash == EmptySHA3) @@ -69,15 +73,15 @@ bool OurWebThreeStubServer::authenticate(dev::TransactionSkeleton const& _t) con // return showAuthenticationPopup("Unverified Pending Transaction", // "An undocumented transaction is about to be executed."); - QNatspecExpressionEvaluator evaluator(*m_web3, m_main); + QNatspecExpressionEvaluator evaluator(this, m_main); userNotice = evaluator.evalExpression(QString::fromStdString(userNotice)).toStdString(); // otherwise it's a transaction to a contract for which we have the natspec return showAuthenticationPopup("Pending Transaction", userNotice); } -QNatspecExpressionEvaluator::QNatspecExpressionEvaluator(dev::WebThreeDirect& _web3, Main* _main): - m_web3(&_web3), m_main(_main) +QNatspecExpressionEvaluator::QNatspecExpressionEvaluator(OurWebThreeStubServer* _server, Main* _main) +: m_server(_server), m_main(_main) {} QNatspecExpressionEvaluator::~QNatspecExpressionEvaluator() @@ -85,20 +89,35 @@ QNatspecExpressionEvaluator::~QNatspecExpressionEvaluator() QString QNatspecExpressionEvaluator::stateAt(QString _key) { + (void)_key; return "1"; } -QString QNatspecExpressionEvaluator::call(QString _method) +QString QNatspecExpressionEvaluator::call(QString _json) +{ + QJsonObject jsonObject = QJsonDocument::fromJson(_json.toUtf8()).object(); + Json::Value input; + input["to"] = jsonObject["to"].toString().toStdString(); + input["data"] = jsonObject["data"].toString().toStdString(); + return QString::fromStdString(m_server->eth_call(input)); +} + +QString QNatspecExpressionEvaluator::sha3(QString _method) { - return "2"; + return QString::fromStdString(m_server->web3_sha3(_method.toStdString())); } QString QNatspecExpressionEvaluator::evalExpression(QString const& _expression) { + // evaluate the natspec + m_main->addToWindowObject(this, "_natspec"); m_main->evalRaw(contentsOfQResource(":/js/natspec.js")); - auto result = m_main->evalRaw("evaluateExpression(\"2 + 1\")"); + + (void)_expression; + auto result = m_main->evalRaw(QString::fromStdString((string)"evaluateExpression('" + "multiply(4)" + "')")); // auto result = m_main->evalRaw(_expression); + return result.toString(); } diff --git a/alethzero/OurWebThreeStubServer.h b/alethzero/OurWebThreeStubServer.h index fe7d432cf..384b5591b 100644 --- a/alethzero/OurWebThreeStubServer.h +++ b/alethzero/OurWebThreeStubServer.h @@ -35,7 +35,7 @@ public: std::vector const& _accounts, Main* main); virtual std::string shh_newIdentity() override; - virtual bool authenticate(dev::TransactionSkeleton const& _t) const; + virtual bool authenticate(dev::TransactionSkeleton const& _t); signals: void onNewId(QString _s); @@ -53,15 +53,16 @@ class QNatspecExpressionEvaluator: public QObject Q_OBJECT public: - QNatspecExpressionEvaluator(dev::WebThreeDirect& _web3, Main* _main); + QNatspecExpressionEvaluator(OurWebThreeStubServer* _server, Main* _main); virtual ~QNatspecExpressionEvaluator(); QString evalExpression(QString const& _expression); Q_INVOKABLE QString stateAt(QString _key); - Q_INVOKABLE QString call(QString _method); + Q_INVOKABLE QString call(QString _json); + Q_INVOKABLE QString sha3(QString _method); private: - dev::WebThreeDirect* m_web3; + OurWebThreeStubServer* m_server; Main* m_main; }; \ No newline at end of file diff --git a/libjsqrc/ethereumjs/example/natspec_contract.html b/libjsqrc/ethereumjs/example/natspec_contract.html index 2548495b7..2cf641910 100644 --- a/libjsqrc/ethereumjs/example/natspec_contract.html +++ b/libjsqrc/ethereumjs/example/natspec_contract.html @@ -5,6 +5,7 @@ +