/* This file is part of cpp-ethereum. cpp-ethereum is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. cpp-ethereum is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with cpp-ethereum. If not, see . */ /** @file ClientModel.h * @author Yann yann@ethdev.com * @author Arkadiy Paronyan arkadiy@ethdev.com * @date 2015 * Ethereum IDE client. */ #pragma once #include #include "DebuggingStateWrapper.h" #include "MixClient.h" using AssemblyDebuggerData = std::tuple, dev::mix::QQMLMap*>; Q_DECLARE_METATYPE(AssemblyDebuggerData) Q_DECLARE_METATYPE(dev::mix::ExecutionResult) class QWebThree; class QWebThreeConnector; namespace dev { namespace mix { class AppContext; class Web3Server; /// Backend transaction config class struct TransactionSettings { TransactionSettings(QString const& _functionId, u256 _value, u256 _gas, u256 _gasPrice): functionId(_functionId), value(_value), gas(_gas), gasPrice(_gasPrice) {} /// Contract function name QString functionId; /// Transaction value u256 value; /// Gas u256 gas; /// Gas price u256 gasPrice; /// Mapping from contract function parameter name to value std::map parameterValues; }; /** * @brief Ethereum state control */ class ClientModel: public QObject { Q_OBJECT public: ClientModel(AppContext* _context); ~ClientModel(); /// @returns true if currently executing contract code Q_PROPERTY(bool running MEMBER m_running NOTIFY stateChanged) /// @returns address of the last executed contract Q_PROPERTY(QString contractAddress READ contractAddress NOTIFY contractAddressChanged) public slots: /// ethereum.js RPC request entry point /// @param _message RPC request in Json format void apiRequest(QString const& _message); /// Run the contract constructor and show debugger window. void debugDeployment(); /// Setup state, run transaction sequence, show debugger for the last transaction /// @param _state JS object with state configuration void debugState(QVariantMap _state); private slots: /// Update UI with machine states result. Display a modal dialog. void showDebugger(QList const& _returnParams = QList(), QList const& _wStates = QList(), AssemblyDebuggerData const& _code = AssemblyDebuggerData()); /// Update UI with transaction run error. void showDebugError(QString const& _error); signals: /// Transaction execution started void runStarted(); /// Transaction execution completed successfully void runComplete(); /// Transaction execution completed with error /// @param _message Error message void runFailed(QString const& _message); /// Contract address changed void contractAddressChanged(); /// Execution state changed void stateChanged(); /// Show debugger window request void showDebuggerWindow(); /// ethereum.js RPC response ready /// @param _message RPC response in Json format void apiResponse(QString const& _message); /// Emited when machine states are available. void dataAvailable(QList const& _returnParams = QList(), QList const& _wStates = QList(), AssemblyDebuggerData const& _code = AssemblyDebuggerData()); private: QString contractAddress() const; void executeSequence(std::vector const& _sequence, u256 _balance); ExecutionResult deployContract(bytes const& _code); ExecutionResult callContract(Address const& _contract, bytes const& _data, TransactionSettings const& _tr); AppContext* m_context; std::atomic m_running; std::unique_ptr m_client; QWebThree* m_qWebThree; std::unique_ptr m_qWebThreeConnector; std::unique_ptr m_web3Server; }; } }