diff --git a/mix/AssemblyDebuggerCtrl.cpp b/mix/AssemblyDebuggerCtrl.cpp index 678f94d77..e955dfd23 100644 --- a/mix/AssemblyDebuggerCtrl.cpp +++ b/mix/AssemblyDebuggerCtrl.cpp @@ -69,11 +69,10 @@ void AssemblyDebuggerCtrl::keyPressed(int _key) return; } - KeyPair ad = KeyPair::create(); u256 gasPrice = 10000000000000; u256 gas = 1000000; u256 amount = 100; - DebuggingContent debuggingContent = m_modelDebugger->getContractInitiationDebugStates(amount, gasPrice, gas, m_doc->toPlainText(), ad); + DebuggingContent debuggingContent = m_modelDebugger->getContractInitiationDebugStates(amount, gasPrice, gas, m_doc->toPlainText()); //we need to wrap states in a QObject before sending to QML. QList wStates; diff --git a/mix/AssemblyDebuggerModel.cpp b/mix/AssemblyDebuggerModel.cpp index 151c14773..1e07760e1 100644 --- a/mix/AssemblyDebuggerModel.cpp +++ b/mix/AssemblyDebuggerModel.cpp @@ -18,30 +18,36 @@ */ #include -#include "libethereum/Executive.h" -#include "libethereum/Transaction.h" -#include "libethereum/ExtVM.h" -#include "libevm/VM.h" -#include "libdevcore/Common.h" +#include +#include +#include +#include +#include #include "AppContext.h" #include "TransactionBuilder.h" #include "AssemblyDebuggerModel.h" #include "ConstantCompilationModel.h" #include "DebuggingStateWrapper.h" +using namespace std; using namespace dev; using namespace dev::eth; using namespace dev::mix; -AssemblyDebuggerModel::AssemblyDebuggerModel() +AssemblyDebuggerModel::AssemblyDebuggerModel(): + m_userAccount(KeyPair::create()), + m_baseState(Address(), m_overlayDB, BaseState::Empty) { + m_baseState.addBalance(m_userAccount.address(), 10000000 * ether); m_currentExecution = std::unique_ptr(new Executive(m_executiveState, 0)); } DebuggingContent AssemblyDebuggerModel::getContractInitiationDebugStates(dev::bytesConstRef _rawTransaction) { + // Reset the state back to our clean premine. + m_executiveState = m_baseState; + QList states; - Transaction tr(_rawTransaction); - m_currentExecution->create(tr.sender(), tr.value(), tr.gasPrice(), tr.gas(), &tr.data(), tr.sender()); + m_currentExecution->setup(_rawTransaction); std::vector levels; bytes code; bytesConstRef data; @@ -67,7 +73,9 @@ DebuggingContent AssemblyDebuggerModel::getContractInitiationDebugStates(dev::by vm.stack(), vm.memory(), gasCost, ext.state().storage(ext.myAddress), levels})); }; + m_currentExecution->go(onOp); + cdebug << states.size(); m_currentExecution->finalize(onOp); DebuggingContent d; @@ -79,11 +87,12 @@ DebuggingContent AssemblyDebuggerModel::getContractInitiationDebugStates(dev::by return d; } -DebuggingContent AssemblyDebuggerModel::getContractInitiationDebugStates(dev::u256 _value, - dev::u256 _gasPrice, - dev::u256 _gas, - QString _code, - KeyPair _key) +DebuggingContent AssemblyDebuggerModel::getContractInitiationDebugStates( + dev::u256 _value, + dev::u256 _gasPrice, + dev::u256 _gas, + QString _code +) { ConstantCompilationModel compiler; CompilerResult res = compiler.compile(_code); @@ -96,8 +105,8 @@ DebuggingContent AssemblyDebuggerModel::getContractInitiationDebugStates(dev::u2 } TransactionBuilder trBuild; - Transaction tr = trBuild.getCreationTransaction(_value, _gasPrice, _gas, res.bytes, - m_executiveState.transactionsFrom(dev::toAddress(_key.secret())), _key.secret()); + Transaction tr = trBuild.getCreationTransaction(_value, _gasPrice, min(_gas, m_baseState.gasLimitRemaining()), res.bytes, + m_executiveState.transactionsFrom(dev::toAddress(m_userAccount.secret())), m_userAccount.secret()); bytes b = tr.rlp(); dev::bytesConstRef bytesRef = &b; return getContractInitiationDebugStates(bytesRef); diff --git a/mix/AssemblyDebuggerModel.h b/mix/AssemblyDebuggerModel.h index 3ed6818bc..b6e0224e8 100644 --- a/mix/AssemblyDebuggerModel.h +++ b/mix/AssemblyDebuggerModel.h @@ -21,9 +21,10 @@ #include #include -#include "libethereum/State.h" -#include "libethereum/Executive.h" -#include "libdevcore/Common.h" +#include +#include +#include +#include #include "DebuggingStateWrapper.h" namespace dev @@ -31,17 +32,23 @@ namespace dev namespace mix { +/** + * @brief Long-life object for managing all executions. + */ class AssemblyDebuggerModel { public: AssemblyDebuggerModel(); - DebuggingContent getContractInitiationDebugStates(dev::u256, dev::u256, dev::u256, QString, KeyPair); - DebuggingContent getContractInitiationDebugStates(dev::bytesConstRef); + DebuggingContent getContractInitiationDebugStates(u256, u256, u256, QString); + DebuggingContent getContractInitiationDebugStates(bytesConstRef); bool compile(QString); private: - std::unique_ptr m_currentExecution; - dev::eth::State m_executiveState; + KeyPair m_userAccount; + OverlayDB m_overlayDB; + eth::State m_baseState; + eth::State m_executiveState; + std::unique_ptr m_currentExecution; }; } diff --git a/mix/qml/BasicMessage.qml b/mix/qml/BasicMessage.qml index 233717009..7127d29ff 100644 --- a/mix/qml/BasicMessage.qml +++ b/mix/qml/BasicMessage.qml @@ -1,7 +1,7 @@ import QtQuick 2.2 -import QtQuick.Controls.Styles 1.2 -import QtQuick.Controls 1.2 -import QtQuick.Dialogs 1.2 +import QtQuick.Controls.Styles 1.1 +import QtQuick.Controls 1.1 +import QtQuick.Dialogs 1.1 import QtQuick.Layouts 1.1 Rectangle { diff --git a/mix/qml/Debugger.qml b/mix/qml/Debugger.qml index fa3e8aba4..18f706970 100644 --- a/mix/qml/Debugger.qml +++ b/mix/qml/Debugger.qml @@ -1,7 +1,7 @@ import QtQuick 2.2 -import QtQuick.Controls.Styles 1.2 -import QtQuick.Controls 1.2 -import QtQuick.Dialogs 1.2 +import QtQuick.Controls.Styles 1.1 +import QtQuick.Controls 1.1 +import QtQuick.Dialogs 1.1 import QtQuick.Layouts 1.1 import "js/Debugger.js" as Debugger diff --git a/mix/qml/MainContent.qml b/mix/qml/MainContent.qml index 1da48a1c8..6d08f79ec 100644 --- a/mix/qml/MainContent.qml +++ b/mix/qml/MainContent.qml @@ -1,7 +1,7 @@ import QtQuick 2.2 -import QtQuick.Controls 1.2 +import QtQuick.Controls 1.1 import QtQuick.Layouts 1.0 -import QtQuick.Controls.Styles 1.2 +import QtQuick.Controls.Styles 1.1 import CodeEditorExtensionManager 1.0 Rectangle { diff --git a/mix/qml/main.qml b/mix/qml/main.qml index 52c47e063..42ee3ef97 100644 --- a/mix/qml/main.qml +++ b/mix/qml/main.qml @@ -1,7 +1,7 @@ import QtQuick 2.2 import QtQuick.Controls 1.1 import QtQuick.Controls.Styles 1.1 -import QtQuick.Dialogs 1.2 +import QtQuick.Dialogs 1.1 import QtQuick.Layouts 1.1 import QtQuick.Window 2.0 import CodeEditorExtensionManager 1.0