Marek Kotewicz
10 years ago
21 changed files with 0 additions and 1806 deletions
@ -1,91 +0,0 @@ |
|||
cmake_policy(SET CMP0015 OLD) |
|||
|
|||
set(CMAKE_INCLUDE_CURRENT_DIR ON) |
|||
aux_source_directory(. SRC_LIST) |
|||
|
|||
include_directories(..) |
|||
link_directories(../libethcore) |
|||
link_directories(../libethereum) |
|||
link_directories(../libqethereum) |
|||
|
|||
qt5_wrap_ui(ui_Main.h Main.ui) |
|||
qt5_add_resources(RESOURCE_ADDED Resources.qrc) |
|||
|
|||
# Set name of binary and add_executable() |
|||
if (APPLE) |
|||
set(EXECUTABLE IEthXi) |
|||
set(CMAKE_INSTALL_PREFIX ./) |
|||
set(BIN_INSTALL_DIR ".") |
|||
set(DOC_INSTALL_DIR ".") |
|||
|
|||
set(PROJECT_VERSION "${ETH_VERSION}") |
|||
set(MACOSX_BUNDLE_INFO_STRING "${PROJECT_NAME} ${PROJECT_VERSION}") |
|||
set(MACOSX_BUNDLE_BUNDLE_VERSION "${PROJECT_NAME} ${PROJECT_VERSION}") |
|||
set(MACOSX_BUNDLE_LONG_VERSION_STRING "${PROJECT_NAME} ${PROJECT_VERSION}") |
|||
set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${PROJECT_VERSION}") |
|||
set(MACOSX_BUNDLE_COPYRIGHT "${PROJECT_COPYRIGHT_YEAR} ${PROJECT_VENDOR}") |
|||
set(MACOSX_BUNDLE_GUI_IDENTIFIER "${PROJECT_DOMAIN_SECOND}.${PROJECT_DOMAIN_FIRST}") |
|||
set(MACOSX_BUNDLE_BUNDLE_NAME ${EXECUTABLE}) |
|||
include(BundleUtilities) |
|||
|
|||
add_executable(${EXECUTABLE} MACOSX_BUNDLE Main.ui ${RESOURCE_ADDED} ${SRC_LIST}) |
|||
else () |
|||
set(EXECUTABLE iethxi) |
|||
add_executable(${EXECUTABLE} Main.ui ${RESOURCE_ADDED} ${SRC_LIST}) |
|||
endif () |
|||
|
|||
qt5_use_modules(${EXECUTABLE} Core Gui Widgets Network Quick Qml) |
|||
target_link_libraries(${EXECUTABLE} qethereum) |
|||
target_link_libraries(${EXECUTABLE} ethereum) |
|||
target_link_libraries(${EXECUTABLE} secp256k1) |
|||
|
|||
if (APPLE) |
|||
if (${ADDFRAMEWORKS}) |
|||
set_target_properties(${EXECUTABLE} PROPERTIES MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/EthereumMacOSXBundleInfo.plist.in") |
|||
endif () |
|||
|
|||
SET_SOURCE_FILES_PROPERTIES(${EXECUTABLE} PROPERTIES MACOSX_PACKAGE_LOCATION MacOS) |
|||
|
|||
# This is a workaround for when the build-type defaults to Debug, and when a multi-config generator like xcode is used, where the type |
|||
# will not be set but defaults to release. |
|||
set(generator_lowercase "${CMAKE_GENERATOR}") |
|||
string(TOLOWER "${CMAKE_GENERATOR}" generator_lowercase) |
|||
if ("${generator_lowercase}" STREQUAL "xcode") |
|||
# TODO: Not sure how to resolve this. Possibly \${TARGET_BUILD_DIR} |
|||
set(binary_build_dir "${CMAKE_CURRENT_BINARY_DIR}/Debug") |
|||
else () |
|||
set(binary_build_dir "${CMAKE_CURRENT_BINARY_DIR}") |
|||
endif () |
|||
|
|||
set(APPS ${binary_build_dir}/${EXECUTABLE}.app) |
|||
|
|||
# This tool and the next will automatically looked at the linked libraries in order to determine what dependencies are required. Thus, target_link_libaries only needs to add ethereum and secp256k1 (above) |
|||
install(CODE " |
|||
include(BundleUtilities) |
|||
set(BU_CHMOD_BUNDLE_ITEMS 1) |
|||
fixup_bundle(\"${APPS}\" \"${BUNDLELIBS}\" \"../libqethereum ../libethereum ../secp256k1\") |
|||
" COMPONENT RUNTIME ) |
|||
|
|||
if (${ADDFRAMEWORKS}) |
|||
add_custom_target(addframeworks ALL |
|||
COMMAND /usr/local/opt/qt5/bin/macdeployqt ${binary_build_dir}/${EXECUTABLE}.app |
|||
WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} |
|||
DEPENDS ${PROJECT_NAME} |
|||
) |
|||
endif () |
|||
|
|||
elseif ("${TARGET_PLATFORM}" STREQUAL "w64") |
|||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-keep-inline-dllexport -static-libgcc -static-libstdc++ -static") |
|||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-s -Wl,-subsystem,windows -mthreads -L/usr/x86_64-w64-mingw32/plugins/platforms") |
|||
target_link_libraries(${EXECUTABLE} gcc) |
|||
target_link_libraries(${EXECUTABLE} mingw32 qtmain mswsock iphlpapi qwindows shlwapi Qt5PlatformSupport gdi32 comdlg32 oleaut32 imm32 winmm ole32 uuid ws2_32) |
|||
target_link_libraries(${EXECUTABLE} boost_system-mt-s) |
|||
target_link_libraries(${EXECUTABLE} boost_filesystem-mt-s) |
|||
target_link_libraries(${EXECUTABLE} boost_thread_win32-mt-s) |
|||
target_link_libraries(${EXECUTABLE} Qt5PlatformSupport) |
|||
set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS) |
|||
elseif (UNIX) |
|||
else () |
|||
message(ERROR "platform not supported") |
|||
endif () |
|||
|
@ -1,38 +0,0 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> |
|||
<plist version="1.0"> |
|||
<dict> |
|||
<key>CFBundleDevelopmentRegion</key> |
|||
<string>English</string> |
|||
<key>CFBundleExecutable</key> |
|||
<string>${MACOSX_BUNDLE_EXECUTABLE_NAME}</string> |
|||
<key>CFBundleGetInfoString</key> |
|||
<string>${MACOSX_BUNDLE_INFO_STRING}</string> |
|||
<key>CFBundleIconFile</key> |
|||
<string>${MACOSX_BUNDLE_ICON_FILE}</string> |
|||
<key>CFBundleIdentifier</key> |
|||
<string>${MACOSX_BUNDLE_GUI_IDENTIFIER}</string> |
|||
<key>CFBundleInfoDictionaryVersion</key> |
|||
<string>6.0</string> |
|||
<key>CFBundleLongVersionString</key> |
|||
<string>${MACOSX_BUNDLE_LONG_VERSION_STRING}</string> |
|||
<key>CFBundleName</key> |
|||
<string>${MACOSX_BUNDLE_BUNDLE_NAME}</string> |
|||
<key>CFBundlePackageType</key> |
|||
<string>APPL</string> |
|||
<key>CFBundleShortVersionString</key> |
|||
<string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string> |
|||
<key>CFBundleSignature</key> |
|||
<string>????</string> |
|||
<key>CFBundleVersion</key> |
|||
<string>${MACOSX_BUNDLE_BUNDLE_VERSION}</string> |
|||
<key>CSResourcesFileMapped</key> |
|||
<true/> |
|||
<key>LSRequiresCarbon</key> |
|||
<true/> |
|||
<key>NSHumanReadableCopyright</key> |
|||
<string>${MACOSX_BUNDLE_COPYRIGHT}</string> |
|||
<key>NSHighResolutionCapable</key> |
|||
<true/> |
|||
</dict> |
|||
</plist> |
@ -1,168 +0,0 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<ui version="4.0"> |
|||
<class>Main</class> |
|||
<widget class="QMainWindow" name="Main"> |
|||
<property name="geometry"> |
|||
<rect> |
|||
<x>0</x> |
|||
<y>0</y> |
|||
<width>562</width> |
|||
<height>488</height> |
|||
</rect> |
|||
</property> |
|||
<property name="windowTitle"> |
|||
<string>Walleth</string> |
|||
</property> |
|||
<property name="dockNestingEnabled"> |
|||
<bool>true</bool> |
|||
</property> |
|||
<property name="dockOptions"> |
|||
<set>QMainWindow::AllowNestedDocks|QMainWindow::AllowTabbedDocks|QMainWindow::VerticalTabs</set> |
|||
</property> |
|||
<property name="sizeGripEnabled" stdset="0"> |
|||
<bool>true</bool> |
|||
</property> |
|||
<widget class="QWidget" name="centralwidget"> |
|||
<layout class="QVBoxLayout" name="verticalLayout"> |
|||
<property name="leftMargin"> |
|||
<number>0</number> |
|||
</property> |
|||
<property name="topMargin"> |
|||
<number>0</number> |
|||
</property> |
|||
<property name="rightMargin"> |
|||
<number>0</number> |
|||
</property> |
|||
<property name="bottomMargin"> |
|||
<number>0</number> |
|||
</property> |
|||
<item> |
|||
<layout class="QHBoxLayout" name="fullDisplay"> |
|||
<item> |
|||
<widget class="QLabel" name="balance"> |
|||
<property name="text"> |
|||
<string>0 wei</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<widget class="QLabel" name="peerCount"> |
|||
<property name="text"> |
|||
<string>0 peers</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<widget class="QLabel" name="blockCount"> |
|||
<property name="text"> |
|||
<string>1 block</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</item> |
|||
</layout> |
|||
</widget> |
|||
<widget class="QMenuBar" name="menubar"> |
|||
<property name="geometry"> |
|||
<rect> |
|||
<x>0</x> |
|||
<y>0</y> |
|||
<width>562</width> |
|||
<height>25</height> |
|||
</rect> |
|||
</property> |
|||
<widget class="QMenu" name="menu_File"> |
|||
<property name="title"> |
|||
<string>&File</string> |
|||
</property> |
|||
<addaction name="quit"/> |
|||
</widget> |
|||
<widget class="QMenu" name="menu_Network"> |
|||
<property name="title"> |
|||
<string>&Network</string> |
|||
</property> |
|||
<addaction name="upnp"/> |
|||
<addaction name="net"/> |
|||
<addaction name="connect"/> |
|||
</widget> |
|||
<widget class="QMenu" name="menu_Tools"> |
|||
<property name="title"> |
|||
<string>T&ools</string> |
|||
</property> |
|||
<addaction name="mine"/> |
|||
<addaction name="create"/> |
|||
<addaction name="preview"/> |
|||
</widget> |
|||
<widget class="QMenu" name="menu_Help"> |
|||
<property name="title"> |
|||
<string>&Help</string> |
|||
</property> |
|||
<addaction name="about"/> |
|||
</widget> |
|||
<addaction name="menu_File"/> |
|||
<addaction name="menu_Network"/> |
|||
<addaction name="menu_Tools"/> |
|||
<addaction name="menu_Help"/> |
|||
</widget> |
|||
<widget class="QStatusBar" name="statusbar"/> |
|||
<action name="quit"> |
|||
<property name="text"> |
|||
<string>&Quit</string> |
|||
</property> |
|||
</action> |
|||
<action name="upnp"> |
|||
<property name="checkable"> |
|||
<bool>true</bool> |
|||
</property> |
|||
<property name="checked"> |
|||
<bool>true</bool> |
|||
</property> |
|||
<property name="text"> |
|||
<string>Use &UPnP</string> |
|||
</property> |
|||
</action> |
|||
<action name="connect"> |
|||
<property name="text"> |
|||
<string>&Connect to Peer...</string> |
|||
</property> |
|||
</action> |
|||
<action name="net"> |
|||
<property name="checkable"> |
|||
<bool>true</bool> |
|||
</property> |
|||
<property name="text"> |
|||
<string>Enable &Network</string> |
|||
</property> |
|||
</action> |
|||
<action name="mine"> |
|||
<property name="checkable"> |
|||
<bool>true</bool> |
|||
</property> |
|||
<property name="text"> |
|||
<string>&Mine</string> |
|||
</property> |
|||
</action> |
|||
<action name="create"> |
|||
<property name="text"> |
|||
<string>&New Address</string> |
|||
</property> |
|||
</action> |
|||
<action name="about"> |
|||
<property name="text"> |
|||
<string>&About...</string> |
|||
</property> |
|||
</action> |
|||
<action name="preview"> |
|||
<property name="checkable"> |
|||
<bool>true</bool> |
|||
</property> |
|||
<property name="text"> |
|||
<string>&Preview</string> |
|||
</property> |
|||
</action> |
|||
</widget> |
|||
<layoutdefault spacing="6" margin="11"/> |
|||
<resources/> |
|||
<connections/> |
|||
</ui> |
@ -1,59 +0,0 @@ |
|||
#include <QtNetwork/QNetworkReply> |
|||
#include <QtQuick/QQuickView> |
|||
#include <QtQml/QQmlContext> |
|||
#include <QtQml/QQmlEngine> |
|||
#include <QtQml/QtQml> |
|||
#include <QtWidgets/QMessageBox> |
|||
#include <QtWidgets/QInputDialog> |
|||
#include <QtGui/QClipboard> |
|||
#include <QtCore/QtCore> |
|||
#include <libethcore/FileSystem.h> |
|||
#include <libethcore/Dagger.h> |
|||
#include <libevmcore/Instruction.h> |
|||
#include <libethereum/Client.h> |
|||
#include <libethereum/EthereumHost.h> |
|||
#include "BuildInfo.h" |
|||
#include "MainWin.h" |
|||
#include "ui_Main.h" |
|||
using namespace std; |
|||
using namespace eth; |
|||
|
|||
Main::Main(QWidget *parent) : |
|||
QObject(parent) |
|||
{ |
|||
/* qRegisterMetaType<eth::u256>("eth::u256");
|
|||
qRegisterMetaType<eth::KeyPair>("eth::KeyPair"); |
|||
qRegisterMetaType<eth::Secret>("eth::Secret"); |
|||
qRegisterMetaType<eth::Address>("eth::Address"); |
|||
qRegisterMetaType<QmlAccount*>("QmlAccount*"); |
|||
qRegisterMetaType<QmlEthereum*>("QmlEthereum*"); |
|||
|
|||
qmlRegisterType<QmlEthereum>("org.ethereum", 1, 0, "Ethereum"); |
|||
qmlRegisterType<QmlAccount>("org.ethereum", 1, 0, "Account"); |
|||
qmlRegisterSingletonType<QmlU256Helper>("org.ethereum", 1, 0, "Balance", QmlEthereum::constructU256Helper); |
|||
qmlRegisterSingletonType<QmlKeyHelper>("org.ethereum", 1, 0, "Key", QmlEthereum::constructKeyHelper); |
|||
*/ |
|||
/*
|
|||
ui->librariesView->setModel(m_libraryMan); |
|||
ui->graphsView->setModel(m_graphMan); |
|||
*/ |
|||
|
|||
|
|||
|
|||
|
|||
// QQmlContext* context = m_view->rootContext();
|
|||
// context->setContextProperty("u256", new U256Helper(this));
|
|||
} |
|||
|
|||
Main::~Main() |
|||
{ |
|||
} |
|||
|
|||
// extra bits needed to link on VS
|
|||
#ifdef _MSC_VER |
|||
|
|||
// include moc file, ofuscated to hide from automoc
|
|||
#include\ |
|||
"moc_MainWin.cpp" |
|||
|
|||
#endif |
@ -1,18 +0,0 @@ |
|||
#ifndef MAIN_H |
|||
#define MAIN_H |
|||
|
|||
#include <QtQml/QQmlApplicationEngine> |
|||
|
|||
class Main: public QObject |
|||
{ |
|||
Q_OBJECT |
|||
|
|||
public: |
|||
explicit Main(QWidget *parent = 0); |
|||
~Main(); |
|||
|
|||
private: |
|||
QQmlApplicationEngine* m_view; |
|||
}; |
|||
|
|||
#endif // MAIN_H
|
@ -1,5 +0,0 @@ |
|||
<RCC> |
|||
<qresource prefix="/"> |
|||
<file>Simple.qml</file> |
|||
</qresource> |
|||
</RCC> |
@ -1,9 +0,0 @@ |
|||
import QtQuick.Controls 1.1 |
|||
|
|||
ApplicationWindow { |
|||
title: "My App" |
|||
Button { |
|||
text: "Push Me" |
|||
anchors.centerIn: parent |
|||
} |
|||
} |
@ -1,9 +0,0 @@ |
|||
#include <QtQml/QQmlApplicationEngine> |
|||
#include <QtWidgets/QApplication> |
|||
|
|||
int main(int argc, char *argv[]) |
|||
{ |
|||
QApplication a(argc, argv); |
|||
QQmlApplicationEngine app(QUrl("qrc:/Simple.qml")); |
|||
return a.exec(); |
|||
} |
@ -1,22 +0,0 @@ |
|||
cmake_policy(SET CMP0015 NEW) |
|||
|
|||
aux_source_directory(. SRC_LIST) |
|||
|
|||
set(EXECUTABLE pyserpent) |
|||
|
|||
file(GLOB HEADERS "*.h") |
|||
|
|||
# set(CMAKE_INSTALL_PREFIX ../lib) |
|||
add_library(${EXECUTABLE} SHARED ${SRC_LIST} ${HEADERS}) |
|||
|
|||
include_directories(..) |
|||
|
|||
target_link_libraries(${EXECUTABLE} serpent) |
|||
target_link_libraries(${EXECUTABLE} lll) |
|||
target_link_libraries(${EXECUTABLE} evmcore) |
|||
target_link_libraries(${EXECUTABLE} devcore) |
|||
target_link_libraries(${EXECUTABLE} ${PYTHON_LS}) |
|||
|
|||
install( TARGETS ${EXECUTABLE} ARCHIVE DESTINATION lib LIBRARY DESTINATION lib ) |
|||
install( FILES ${HEADERS} DESTINATION include/${EXECUTABLE} ) |
|||
|
@ -1,173 +0,0 @@ |
|||
#include <Python.h> |
|||
#include "structmember.h" |
|||
|
|||
#include <stdlib.h> |
|||
#include <stdio.h> |
|||
#include <iostream> |
|||
#include <libserpent/funcs.h> |
|||
|
|||
#define PYMETHOD(name, FROM, method, TO) \ |
|||
static PyObject * name(PyObject *, PyObject *args) { \ |
|||
try { \ |
|||
FROM(med) \ |
|||
return TO(method(med)); \ |
|||
} \ |
|||
catch (std::string e) { \ |
|||
PyErr_SetString(PyExc_Exception, e.c_str()); \ |
|||
return NULL; \ |
|||
} \ |
|||
} |
|||
|
|||
#define FROMSTR(v) \ |
|||
const char *command; \ |
|||
int len; \ |
|||
if (!PyArg_ParseTuple(args, "s#", &command, &len)) \ |
|||
return NULL; \ |
|||
std::string v = std::string(command, len); \ |
|||
|
|||
#define FROMNODE(v) \ |
|||
PyObject *node; \ |
|||
if (!PyArg_ParseTuple(args, "O", &node)) \ |
|||
return NULL; \ |
|||
Node v = cppifyNode(node); |
|||
|
|||
#define FROMLIST(v) \ |
|||
PyObject *node; \ |
|||
if (!PyArg_ParseTuple(args, "O", &node)) \ |
|||
return NULL; \ |
|||
std::vector<Node> v = cppifyNodeList(node); |
|||
|
|||
// Convert metadata into python wrapper form [file, ln, ch]
|
|||
PyObject* pyifyMetadata(Metadata m) { |
|||
PyObject* a = PyList_New(0); |
|||
PyList_Append(a, Py_BuildValue("s#", m.file.c_str(), m.file.length())); |
|||
PyList_Append(a, Py_BuildValue("i", m.ln)); |
|||
PyList_Append(a, Py_BuildValue("i", m.ch)); |
|||
return a; |
|||
} |
|||
|
|||
// Convert node into python wrapper form
|
|||
// [token=0/astnode=1, val, metadata, args]
|
|||
PyObject* pyifyNode(Node n) { |
|||
PyObject* a = PyList_New(0); |
|||
PyList_Append(a, Py_BuildValue("i", n.type == ASTNODE)); |
|||
PyList_Append(a, Py_BuildValue("s#", n.val.c_str(), n.val.length())); |
|||
PyList_Append(a, pyifyMetadata(n.metadata)); |
|||
for (unsigned i = 0; i < n.args.size(); i++) |
|||
PyList_Append(a, pyifyNode(n.args[i])); |
|||
return a; |
|||
} |
|||
|
|||
// Convert string into python wrapper form
|
|||
PyObject* pyifyString(std::string s) { |
|||
return Py_BuildValue("s#", s.c_str(), s.length()); |
|||
} |
|||
|
|||
// Convert list of nodes into python wrapper form
|
|||
PyObject* pyifyNodeList(std::vector<Node> n) { |
|||
PyObject* a = PyList_New(0); |
|||
for (unsigned i = 0; i < n.size(); i++) |
|||
PyList_Append(a, pyifyNode(n[i])); |
|||
return a; |
|||
} |
|||
|
|||
// Convert pyobject int into normal form
|
|||
int cppifyInt(PyObject* o) { |
|||
int out; |
|||
if (!PyArg_Parse(o, "i", &out)) |
|||
err("Argument should be integer", Metadata()); |
|||
return out; |
|||
} |
|||
|
|||
// Convert pyobject string into normal form
|
|||
std::string cppifyString(PyObject* o) { |
|||
const char *command; |
|||
if (!PyArg_Parse(o, "s", &command)) |
|||
err("Argument should be string", Metadata()); |
|||
return std::string(command); |
|||
} |
|||
|
|||
// Convert metadata from python wrapper form
|
|||
Metadata cppifyMetadata(PyObject* o) { |
|||
std::string file = cppifyString(PyList_GetItem(o, 0)); |
|||
int ln = cppifyInt(PyList_GetItem(o, 1)); |
|||
int ch = cppifyInt(PyList_GetItem(o, 2)); |
|||
return Metadata(file, ln, ch); |
|||
} |
|||
|
|||
// Convert node from python wrapper form
|
|||
Node cppifyNode(PyObject* o) { |
|||
Node n; |
|||
int isAstNode = cppifyInt(PyList_GetItem(o, 0)); |
|||
n.type = isAstNode ? ASTNODE : TOKEN; |
|||
n.val = cppifyString(PyList_GetItem(o, 1)); |
|||
n.metadata = cppifyMetadata(PyList_GetItem(o, 2)); |
|||
std::vector<Node> args; |
|||
for (int i = 3; i < PyList_Size(o); i++) { |
|||
args.push_back(cppifyNode(PyList_GetItem(o, i))); |
|||
} |
|||
n.args = args; |
|||
return n; |
|||
} |
|||
|
|||
//Convert list of nodes into normal form
|
|||
std::vector<Node> cppifyNodeList(PyObject* o) { |
|||
std::vector<Node> out; |
|||
for (int i = 0; i < PyList_Size(o); i++) { |
|||
out.push_back(cppifyNode(PyList_GetItem(o,i))); |
|||
} |
|||
return out; |
|||
} |
|||
|
|||
PYMETHOD(ps_compile, FROMSTR, compile, pyifyString) |
|||
PYMETHOD(ps_compile_chunk, FROMSTR, compileChunk, pyifyString) |
|||
PYMETHOD(ps_compile_to_lll, FROMSTR, compileToLLL, pyifyNode) |
|||
PYMETHOD(ps_compile_chunk_to_lll, FROMSTR, compileChunkToLLL, pyifyNode) |
|||
PYMETHOD(ps_compile_lll, FROMNODE, compileLLL, pyifyString) |
|||
PYMETHOD(ps_parse, FROMSTR, parseSerpent, pyifyNode) |
|||
PYMETHOD(ps_rewrite, FROMNODE, rewrite, pyifyNode) |
|||
PYMETHOD(ps_rewrite_chunk, FROMNODE, rewriteChunk, pyifyNode) |
|||
PYMETHOD(ps_pretty_compile, FROMSTR, prettyCompile, pyifyNodeList) |
|||
PYMETHOD(ps_pretty_compile_chunk, FROMSTR, prettyCompileChunk, pyifyNodeList) |
|||
PYMETHOD(ps_pretty_compile_lll, FROMNODE, prettyCompileLLL, pyifyNodeList) |
|||
PYMETHOD(ps_serialize, FROMLIST, serialize, pyifyString) |
|||
PYMETHOD(ps_deserialize, FROMSTR, deserialize, pyifyNodeList) |
|||
PYMETHOD(ps_parse_lll, FROMSTR, parseLLL, pyifyNode) |
|||
|
|||
|
|||
static PyMethodDef PyextMethods[] = { |
|||
{"compile", ps_compile, METH_VARARGS, |
|||
"Compile code."}, |
|||
{"compile_chunk", ps_compile_chunk, METH_VARARGS, |
|||
"Compile code chunk (no wrappers)."}, |
|||
{"compile_to_lll", ps_compile_to_lll, METH_VARARGS, |
|||
"Compile code to LLL."}, |
|||
{"compile_chunk_to_lll", ps_compile_chunk_to_lll, METH_VARARGS, |
|||
"Compile code chunk to LLL (no wrappers)."}, |
|||
{"compile_lll", ps_compile_lll, METH_VARARGS, |
|||
"Compile LLL to EVM."}, |
|||
{"parse", ps_parse, METH_VARARGS, |
|||
"Parse serpent"}, |
|||
{"rewrite", ps_rewrite, METH_VARARGS, |
|||
"Rewrite parsed serpent to LLL"}, |
|||
{"rewrite_chunk", ps_rewrite_chunk, METH_VARARGS, |
|||
"Rewrite parsed serpent to LLL (no wrappers)"}, |
|||
{"pretty_compile", ps_pretty_compile, METH_VARARGS, |
|||
"Compile to EVM opcodes"}, |
|||
{"pretty_compile_chunk", ps_pretty_compile_chunk, METH_VARARGS, |
|||
"Compile chunk to EVM opcodes (no wrappers)"}, |
|||
{"pretty_compile_lll", ps_pretty_compile_lll, METH_VARARGS, |
|||
"Compile LLL to EVM opcodes"}, |
|||
{"serialize", ps_serialize, METH_VARARGS, |
|||
"Convert EVM opcodes to bin"}, |
|||
{"deserialize", ps_deserialize, METH_VARARGS, |
|||
"Convert EVM bin to opcodes"}, |
|||
{"parse_lll", ps_parse_lll, METH_VARARGS, |
|||
"Parse LLL"}, |
|||
{NULL, NULL, 0, NULL} /* Sentinel */ |
|||
}; |
|||
|
|||
PyMODINIT_FUNC initserpent_pyext(void) |
|||
{ |
|||
Py_InitModule( "serpent_pyext", PyextMethods ); |
|||
} |
@ -1,180 +0,0 @@ |
|||
#if ETH_QTQML |
|||
#include <QtQml/QtQml> |
|||
#endif |
|||
#include <QtCore/QtCore> |
|||
#include <QtWebKitWidgets/QWebFrame> |
|||
#include <libdevcrypto/FileSystem.h> |
|||
#include <libevmcore/Instruction.h> |
|||
#include <liblll/Compiler.h> |
|||
#include <libethereum/Client.h> |
|||
#include <libethereum/EthereumHost.h> |
|||
#include "QmlEthereum.h" |
|||
using namespace std; |
|||
|
|||
// types
|
|||
using dev::bytes; |
|||
using dev::bytesConstRef; |
|||
using dev::h160; |
|||
using dev::h256; |
|||
using dev::u160; |
|||
using dev::u256; |
|||
using dev::u256s; |
|||
using dev::RLP; |
|||
using dev::Address; |
|||
using dev::eth::BlockInfo; |
|||
using dev::eth::Client; |
|||
using dev::eth::Instruction; |
|||
using dev::KeyPair; |
|||
using dev::eth::NodeMode; |
|||
using dev::Secret; |
|||
using dev::eth::Transaction; |
|||
using dev::p2p::PeerInfo; |
|||
|
|||
// functions
|
|||
using dev::toHex; |
|||
using dev::fromHex; |
|||
using dev::right160; |
|||
using dev::simpleDebugOut; |
|||
using dev::toLog2; |
|||
using dev::toString; |
|||
using dev::eth::disassemble; |
|||
using dev::eth::formatBalance; |
|||
using dev::eth::units; |
|||
|
|||
// vars
|
|||
using dev::g_logPost; |
|||
using dev::g_logVerbosity; |
|||
|
|||
// Horrible global for the mainwindow. Needed for the QmlEthereums to find the Main window which acts as multiplexer for now.
|
|||
// Can get rid of this once we've sorted out ITC for signalling & multiplexed querying.
|
|||
dev::eth::Client* g_qmlClient; |
|||
QObject* g_qmlMain; |
|||
#if 0 |
|||
QmlAccount::QmlAccount(QObject*) |
|||
{ |
|||
} |
|||
|
|||
QmlAccount::~QmlAccount() |
|||
{ |
|||
} |
|||
|
|||
void QmlAccount::setEthereum(QmlEthereum* _eth) |
|||
{ |
|||
if (m_eth == _eth) |
|||
return; |
|||
// if (m_eth)
|
|||
// disconnect(m_eth, SIGNAL(changed()), this, SIGNAL(changed()));
|
|||
m_eth = _eth; |
|||
// if (m_eth)
|
|||
// connect(m_eth, SIGNAL(changed()), this, SIGNAL(changed()));
|
|||
ethChanged(); |
|||
// changed();
|
|||
} |
|||
|
|||
dev::u256 QmlAccount::balance() const |
|||
{ |
|||
if (m_eth) |
|||
return m_eth->balanceAt(m_address); |
|||
return u256(0); |
|||
} |
|||
|
|||
double QmlAccount::txCount() const |
|||
{ |
|||
if (m_eth) |
|||
return m_eth->txCountAt(m_address); |
|||
return 0; |
|||
} |
|||
|
|||
bool QmlAccount::isContract() const |
|||
{ |
|||
if (m_eth) |
|||
return m_eth->isContractAt(m_address); |
|||
return 0; |
|||
} |
|||
|
|||
QmlEthereum::QmlEthereum(QObject* _p): QObject(_p) |
|||
{ |
|||
// connect(g_qmlMain, SIGNAL(changed()), SIGNAL(changed()));
|
|||
} |
|||
|
|||
QmlEthereum::~QmlEthereum() |
|||
{ |
|||
} |
|||
|
|||
Client* QmlEthereum::client() const |
|||
{ |
|||
return g_qmlClient; |
|||
} |
|||
|
|||
Address QmlEthereum::coinbase() const |
|||
{ |
|||
return client()->address(); |
|||
} |
|||
|
|||
void QmlEthereum::setCoinbase(Address _a) |
|||
{ |
|||
if (client()->address() != _a) |
|||
{ |
|||
client()->setAddress(_a); |
|||
// changed();
|
|||
} |
|||
} |
|||
|
|||
u256 QmlEthereum::balanceAt(Address _a) const |
|||
{ |
|||
return client()->postState().balance(_a); |
|||
} |
|||
|
|||
bool QmlEthereum::isContractAt(Address _a) const |
|||
{ |
|||
return client()->postState().addressHasCode(_a); |
|||
} |
|||
|
|||
bool QmlEthereum::isMining() const |
|||
{ |
|||
return client()->isMining(); |
|||
} |
|||
|
|||
bool QmlEthereum::isListening() const |
|||
{ |
|||
return client()->haveNetwork(); |
|||
} |
|||
|
|||
void QmlEthereum::setMining(bool _l) |
|||
{ |
|||
if (_l) |
|||
client()->startMining(); |
|||
else |
|||
client()->stopMining(); |
|||
} |
|||
|
|||
void QmlEthereum::setListening(bool _l) |
|||
{ |
|||
if (_l) |
|||
client()->startNetwork(); |
|||
else |
|||
client()->stopNetwork(); |
|||
} |
|||
|
|||
double QmlEthereum::txCountAt(Address _a) const |
|||
{ |
|||
return (double)client()->postState().transactionsFrom(_a); |
|||
} |
|||
|
|||
unsigned QmlEthereum::peerCount() const |
|||
{ |
|||
return (unsigned)client()->peerCount(); |
|||
} |
|||
|
|||
void QmlEthereum::transact(Secret _secret, u256 _amount, u256 _gasPrice, u256 _gas, QByteArray _init) |
|||
{ |
|||
client()->transact(_secret, _amount, bytes(_init.data(), _init.data() + _init.size()), _gas, _gasPrice); |
|||
} |
|||
|
|||
void QmlEthereum::transact(Secret _secret, Address _dest, u256 _amount, u256 _gasPrice, u256 _gas, QByteArray _data) |
|||
{ |
|||
client()->transact(_secret, _amount, _dest, bytes(_data.data(), _data.data() + _data.size()), _gas, _gasPrice); |
|||
} |
|||
|
|||
#endif |
|||
|
@ -1,283 +0,0 @@ |
|||
#pragma once |
|||
|
|||
#include <QtCore/QAbstractListModel> |
|||
#if ETH_QTQML |
|||
#include <QtQml/QtQml> |
|||
#endif |
|||
#include <libdevcore/CommonIO.h> |
|||
#include <libethcore/CommonEth.h> |
|||
|
|||
namespace dev { namespace eth { |
|||
class Client; |
|||
class State; |
|||
}} |
|||
|
|||
class QQmlEngine; |
|||
class QmlAccount; |
|||
class QmlEthereum; |
|||
|
|||
extern dev::eth::Client* g_qmlClient; |
|||
extern QObject* g_qmlMain; |
|||
|
|||
Q_DECLARE_METATYPE(dev::u256) |
|||
Q_DECLARE_METATYPE(dev::Address) |
|||
Q_DECLARE_METATYPE(dev::Secret) |
|||
Q_DECLARE_METATYPE(dev::KeyPair) |
|||
//Q_DECLARE_METATYPE(QmlAccount*)
|
|||
//Q_DECLARE_METATYPE(QmlEthereum*)
|
|||
|
|||
class QmlU256Helper: public QObject |
|||
{ |
|||
Q_OBJECT |
|||
|
|||
public: |
|||
QmlU256Helper(QObject* _p = nullptr): QObject(_p) {} |
|||
|
|||
Q_INVOKABLE dev::u256 add(dev::u256 _a, dev::u256 _b) const { return _a + _b; } |
|||
Q_INVOKABLE dev::u256 sub(dev::u256 _a, dev::u256 _b) const { return _a - _b; } |
|||
Q_INVOKABLE dev::u256 mul(dev::u256 _a, int _b) const { return _a * _b; } |
|||
Q_INVOKABLE dev::u256 mul(int _a, dev::u256 _b) const { return _a * _b; } |
|||
Q_INVOKABLE dev::u256 div(dev::u256 _a, int _b) const { return _a / _b; } |
|||
|
|||
Q_INVOKABLE dev::u256 wei(double _s) const { return (dev::u256)_s; } |
|||
Q_INVOKABLE dev::u256 szabo(double _s) const { return (dev::u256)(_s * (double)dev::eth::szabo); } |
|||
Q_INVOKABLE dev::u256 finney(double _s) const { return (dev::u256)(_s * (double)dev::eth::finney); } |
|||
Q_INVOKABLE dev::u256 ether(double _s) const { return (dev::u256)(_s * (double)dev::eth::ether); } |
|||
Q_INVOKABLE dev::u256 wei(unsigned _s) const { return (dev::u256)_s; } |
|||
Q_INVOKABLE dev::u256 szabo(unsigned _s) const { return (dev::u256)(_s * dev::eth::szabo); } |
|||
Q_INVOKABLE dev::u256 finney(unsigned _s) const { return (dev::u256)(_s * dev::eth::finney); } |
|||
Q_INVOKABLE dev::u256 ether(unsigned _s) const { return (dev::u256)(_s * dev::eth::ether); } |
|||
Q_INVOKABLE double toWei(dev::u256 _t) const { return (double)_t; } |
|||
Q_INVOKABLE double toSzabo(dev::u256 _t) const { return toWei(_t) / (double)dev::eth::szabo; } |
|||
Q_INVOKABLE double toFinney(dev::u256 _t) const { return toWei(_t) / (double)dev::eth::finney; } |
|||
Q_INVOKABLE double toEther(dev::u256 _t) const { return toWei(_t) / (double)dev::eth::ether; } |
|||
|
|||
Q_INVOKABLE double value(dev::u256 _t) const { return (double)_t; } |
|||
|
|||
Q_INVOKABLE QString stringOf(dev::u256 _t) const { return QString::fromStdString(dev::eth::formatBalance(_t)); } |
|||
}; |
|||
|
|||
class QmlKeyHelper: public QObject |
|||
{ |
|||
Q_OBJECT |
|||
|
|||
public: |
|||
QmlKeyHelper(QObject* _p = nullptr): QObject(_p) {} |
|||
|
|||
Q_INVOKABLE dev::KeyPair create() const { return dev::KeyPair::create(); } |
|||
Q_INVOKABLE dev::Address address(dev::KeyPair _p) const { return _p.address(); } |
|||
Q_INVOKABLE dev::Secret secret(dev::KeyPair _p) const { return _p.secret(); } |
|||
Q_INVOKABLE dev::KeyPair keypair(dev::Secret _k) const { return dev::KeyPair(_k); } |
|||
|
|||
Q_INVOKABLE bool isNull(dev::Address _a) const { return !_a; } |
|||
|
|||
Q_INVOKABLE dev::Address addressOf(QString _s) const { return dev::Address(_s.toStdString()); } |
|||
Q_INVOKABLE QString stringOf(dev::Address _a) const { return QString::fromStdString(dev::toHex(_a.asArray())); } |
|||
Q_INVOKABLE QString toAbridged(dev::Address _a) const { return QString::fromStdString(_a.abridged()); } |
|||
}; |
|||
#if 0 |
|||
class QmlAccount: public QObject |
|||
{ |
|||
Q_OBJECT |
|||
|
|||
public: |
|||
QmlAccount(QObject* _p = nullptr); |
|||
virtual ~QmlAccount(); |
|||
|
|||
Q_INVOKABLE QmlEthereum* ethereum() const { return m_eth; } |
|||
Q_INVOKABLE dev::u256 balance() const; |
|||
Q_INVOKABLE double txCount() const; |
|||
Q_INVOKABLE bool isContract() const; |
|||
Q_INVOKABLE dev::Address address() const { return m_address; } |
|||
|
|||
// TODO: past transactions models.
|
|||
|
|||
public slots: |
|||
void setEthereum(QmlEthereum* _eth); |
|||
void setAddress(dev::Address _a) { m_address = _a; } |
|||
|
|||
signals: |
|||
void changed(); |
|||
void ethChanged(); |
|||
|
|||
private: |
|||
QmlEthereum* m_eth = nullptr; |
|||
dev::Address m_address; |
|||
|
|||
Q_PROPERTY(dev::u256 balance READ balance NOTIFY changed STORED false) |
|||
Q_PROPERTY(double txCount READ txCount NOTIFY changed STORED false) |
|||
Q_PROPERTY(bool isContract READ isContract NOTIFY changed STORED false) |
|||
Q_PROPERTY(dev::Address address READ address WRITE setAddress NOTIFY changed) |
|||
Q_PROPERTY(QmlEthereum* ethereum READ ethereum WRITE setEthereum NOTIFY ethChanged) |
|||
}; |
|||
|
|||
class QmlEthereum: public QObject |
|||
{ |
|||
Q_OBJECT |
|||
|
|||
public: |
|||
QmlEthereum(QObject* _p = nullptr); |
|||
virtual ~QmlEthereum(); |
|||
|
|||
dev::eth::Client* client() const; |
|||
|
|||
static QObject* constructU256Helper(QQmlEngine*, QJSEngine*) { return new QmlU256Helper; } |
|||
static QObject* constructKeyHelper(QQmlEngine*, QJSEngine*) { return new QmlKeyHelper; } |
|||
|
|||
Q_INVOKABLE dev::Address coinbase() const; |
|||
|
|||
Q_INVOKABLE bool isListening() const; |
|||
Q_INVOKABLE bool isMining() const; |
|||
|
|||
Q_INVOKABLE dev::u256 balanceAt(dev::Address _a) const; |
|||
Q_INVOKABLE double txCountAt(dev::Address _a) const; |
|||
Q_INVOKABLE bool isContractAt(dev::Address _a) const; |
|||
|
|||
Q_INVOKABLE unsigned peerCount() const; |
|||
|
|||
Q_INVOKABLE QmlEthereum* self() { return this; } |
|||
|
|||
public slots: |
|||
void transact(dev::Secret _secret, dev::Address _dest, dev::u256 _amount, dev::u256 _gasPrice, dev::u256 _gas, QByteArray _data); |
|||
void transact(dev::Secret _secret, dev::u256 _amount, dev::u256 _gasPrice, dev::u256 _gas, QByteArray _init); |
|||
void setCoinbase(dev::Address); |
|||
void setMining(bool _l); |
|||
|
|||
void setListening(bool _l); |
|||
|
|||
signals: |
|||
void coinbaseChanged(); |
|||
// void netChanged();
|
|||
// void miningChanged();
|
|||
|
|||
private: |
|||
Q_PROPERTY(dev::Address coinbase READ coinbase WRITE setCoinbase NOTIFY coinbaseChanged) |
|||
Q_PROPERTY(bool listening READ isListening WRITE setListening) |
|||
Q_PROPERTY(bool mining READ isMining WRITE setMining) |
|||
}; |
|||
#endif |
|||
#if 0 |
|||
template <class T> T to(QVariant const& _s) { if (_s.type() != QVariant::String) return T(); auto s = _s.toString().toLatin1(); assert(s.size() == sizeof(T)); return *(T*)s.data(); } |
|||
template <class T> QVariant toQJS(T const& _s) { QLatin1String ret((char*)&_s, sizeof(T)); assert(QVariant(QString(ret)).toString().toLatin1().size() == sizeof(T)); assert(*(T*)(QVariant(QString(ret)).toString().toLatin1().data()) == _s); return QVariant(QString(ret)); } |
|||
|
|||
class U256Helper: public QObject |
|||
{ |
|||
Q_OBJECT |
|||
|
|||
public: |
|||
U256Helper(QObject* _p = nullptr): QObject(_p) {} |
|||
|
|||
static dev::u256 in(QVariant const& _s) { return to<dev::u256>(_s); } |
|||
static QVariant out(dev::u256 const& _s) { return toQJS(_s); } |
|||
|
|||
Q_INVOKABLE QVariant add(QVariant _a, QVariant _b) const { return out(in(_a) + in(_b)); } |
|||
Q_INVOKABLE QVariant sub(QVariant _a, QVariant _b) const { return out(in(_a) - in(_b)); } |
|||
Q_INVOKABLE QVariant mul(QVariant _a, int _b) const { return out(in(_a) * in(_b)); } |
|||
Q_INVOKABLE QVariant mul(int _a, QVariant _b) const { return out(in(_a) * in(_b)); } |
|||
Q_INVOKABLE QVariant div(QVariant _a, int _b) const { return out(in(_a) / in(_b)); } |
|||
|
|||
Q_INVOKABLE QVariant wei(double _s) const { return out(dev::u256(_s)); } |
|||
Q_INVOKABLE QVariant szabo(double _s) const { return out(dev::u256(_s * (double)dev::eth::szabo)); } |
|||
Q_INVOKABLE QVariant finney(double _s) const { return out(dev::u256(_s * (double)dev::eth::finney)); } |
|||
Q_INVOKABLE QVariant ether(double _s) const { return out(dev::u256(_s * (double)dev::eth::ether)); } |
|||
Q_INVOKABLE QVariant wei(unsigned _s) const { return value(_s); } |
|||
Q_INVOKABLE QVariant szabo(unsigned _s) const { return out(dev::u256(_s) * dev::eth::szabo); } |
|||
Q_INVOKABLE QVariant finney(unsigned _s) const { return out(dev::u256(_s) * dev::eth::finney); } |
|||
Q_INVOKABLE QVariant ether(unsigned _s) const { return out(dev::u256(_s) * dev::eth::ether); } |
|||
Q_INVOKABLE double toWei(QVariant _t) const { return toValue(_t); } |
|||
Q_INVOKABLE double toSzabo(QVariant _t) const { return toWei(_t) / (double)dev::eth::szabo; } |
|||
Q_INVOKABLE double toFinney(QVariant _t) const { return toWei(_t) / (double)dev::eth::finney; } |
|||
Q_INVOKABLE double toEther(QVariant _t) const { return toWei(_t) / (double)dev::eth::ether; } |
|||
|
|||
Q_INVOKABLE QVariant value(unsigned _s) const { return out(dev::u256(_s)); } |
|||
Q_INVOKABLE double toValue(QVariant _t) const { return (double)in(_t); } |
|||
|
|||
Q_INVOKABLE QString ethOf(QVariant _t) const { return QString::fromStdString(dev::eth::formatBalance(in(_t))); } |
|||
Q_INVOKABLE QString stringOf(QVariant _t) const { return QString::fromStdString(dev::eth::toString(in(_t))); } |
|||
|
|||
Q_INVOKABLE QByteArray bytesOf(QVariant _t) const { dev::h256 b = in(_t); return QByteArray((char const*)&b, sizeof(dev::h256)); } |
|||
Q_INVOKABLE QVariant fromHex(QString _s) const { return out((dev::u256)dev::h256(_s.toStdString())); } |
|||
|
|||
Q_INVOKABLE QVariant fromAddress(QVariant/*dev::Address*/ _a) const { return out((dev::eth::u160)to<dev::Address>(_a)); } |
|||
Q_INVOKABLE QVariant toAddress(QVariant/*dev::Address*/ _a) const { return toQJS<dev::Address>((dev::eth::u160)in(_a)); } |
|||
|
|||
Q_INVOKABLE bool isNull(QVariant/*dev::Address*/ _a) const { return !in(_a); } |
|||
}; |
|||
|
|||
class KeyHelper: public QObject |
|||
{ |
|||
Q_OBJECT |
|||
|
|||
public: |
|||
KeyHelper(QObject* _p = nullptr): QObject(_p) {} |
|||
|
|||
static dev::Address in(QVariant const& _s) { return to<dev::Address>(_s); } |
|||
static QVariant out(dev::Address const& _s) { return toQJS(_s); } |
|||
|
|||
Q_INVOKABLE QVariant/*dev::KeyPair*/ create() const { return toQJS(dev::KeyPair::create()); } |
|||
Q_INVOKABLE QVariant/*dev::Address*/ address(QVariant/*dev::KeyPair*/ _p) const { return out(to<dev::KeyPair>(_p).address()); } |
|||
Q_INVOKABLE QVariant/*dev::Secret*/ secret(QVariant/*dev::KeyPair*/ _p) const { return toQJS(to<dev::KeyPair>(_p).secret()); } |
|||
Q_INVOKABLE QVariant/*dev::KeyPair*/ keypair(QVariant/*dev::Secret*/ _k) const { return toQJS(dev::KeyPair(to<dev::Secret>(_k))); } |
|||
|
|||
Q_INVOKABLE bool isNull(QVariant/*dev::Address*/ _a) const { return !in(_a); } |
|||
|
|||
Q_INVOKABLE QVariant/*dev::Address*/ addressOf(QString _s) const { return out(dev::Address(_s.toStdString())); } |
|||
Q_INVOKABLE QString stringOf(QVariant/*dev::Address*/ _a) const { return QString::fromStdString(dev::eth::toHex(in(_a).asArray())); } |
|||
Q_INVOKABLE QString toAbridged(QVariant/*dev::Address*/ _a) const { return QString::fromStdString(in(_a).abridged()); } |
|||
|
|||
}; |
|||
|
|||
class BytesHelper: public QObject |
|||
{ |
|||
Q_OBJECT |
|||
|
|||
public: |
|||
BytesHelper(QObject* _p = nullptr): QObject(_p) {} |
|||
|
|||
Q_INVOKABLE QByteArray concat(QVariant _v, QVariant _w) const |
|||
{ |
|||
QByteArray ba; |
|||
if (_v.type() == QVariant::ByteArray) |
|||
ba = _v.toByteArray(); |
|||
else |
|||
ba = _v.toString().toLatin1(); |
|||
QByteArray ba2; |
|||
if (_w.type() == QVariant::ByteArray) |
|||
ba2 = _w.toByteArray(); |
|||
else |
|||
ba2 = _w.toString().toLatin1(); |
|||
ba.append(ba2); |
|||
return QByteArray(ba); |
|||
} |
|||
Q_INVOKABLE QByteArray concat(QByteArray _v, QByteArray _w) const |
|||
{ |
|||
_v.append(_w); |
|||
return _v; |
|||
} |
|||
Q_INVOKABLE QByteArray fromString(QString _s) const |
|||
{ |
|||
return _s.toLatin1(); |
|||
} |
|||
Q_INVOKABLE QByteArray fromString(QString _s, unsigned _padding) const |
|||
{ |
|||
QByteArray b = _s.toLatin1(); |
|||
for (unsigned i = b.size(); i < _padding; ++i) |
|||
b.append((char)0); |
|||
b.resize(_padding); |
|||
return b; |
|||
} |
|||
Q_INVOKABLE QString toString(QByteArray _b) const |
|||
{ |
|||
while (_b.size() && !_b[_b.size() - 1]) |
|||
_b.resize(_b.size() - 1); |
|||
return QString::fromLatin1(_b); |
|||
} |
|||
Q_INVOKABLE QVariant u256of(QByteArray _s) const |
|||
{ |
|||
while (_s.size() < 32) |
|||
_s.append((char)0); |
|||
dev::h256 ret((uint8_t const*)_s.data(), dev::h256::ConstructFromPointer); |
|||
return toQJS<dev::u256>(ret); |
|||
} |
|||
}; |
|||
#endif |
@ -1,102 +0,0 @@ |
|||
cmake_policy(SET CMP0015 NEW) |
|||
|
|||
if ("${TARGET_PLATFORM}" STREQUAL "w64") |
|||
cmake_policy(SET CMP0020 NEW) |
|||
endif () |
|||
|
|||
|
|||
set(CMAKE_INCLUDE_CURRENT_DIR ON) |
|||
aux_source_directory(. SRC_LIST) |
|||
|
|||
include_directories(..) |
|||
link_directories(../libethcore) |
|||
link_directories(../libethereum) |
|||
link_directories(../libqethereum) |
|||
|
|||
# Find Qt5 for Apple and update src_list for windows |
|||
if (APPLE) |
|||
# homebrew defaults to qt4 and installs qt5 as 'keg-only' |
|||
# which places it into /usr/local/opt insteadof /usr/local. |
|||
|
|||
set(CMAKE_PREFIX_PATH /usr/local/opt/qt5) |
|||
include_directories(/usr/local/opt/qt5/include /usr/local/include) |
|||
elseif ("${TARGET_PLATFORM}" STREQUAL "w64") |
|||
set(SRC_LIST ${SRC_LIST} ../windows/qt_plugin_import.cpp) |
|||
elseif (UNIX) |
|||
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ";$ENV{QTDIR}/lib/cmake") |
|||
endif () |
|||
|
|||
|
|||
find_package(Qt5Widgets REQUIRED) |
|||
find_package(Qt5Gui REQUIRED) |
|||
find_package(Qt5Quick REQUIRED) |
|||
find_package(Qt5Qml REQUIRED) |
|||
find_package(Qt5Network REQUIRED) |
|||
qt5_wrap_ui(ui_Main.h Main.ui) |
|||
qt5_add_resources(RESOURCE_ADDED Resources.qrc) |
|||
|
|||
# Set name of binary and add_executable() |
|||
if (APPLE) |
|||
set(EXECUTEABLE Walleth) |
|||
set(CMAKE_INSTALL_PREFIX ./) |
|||
set(BIN_INSTALL_DIR ".") |
|||
set(DOC_INSTALL_DIR ".") |
|||
|
|||
set(PROJECT_VERSION "${ETH_VERSION}") |
|||
set(MACOSX_BUNDLE_INFO_STRING "${PROJECT_NAME} ${PROJECT_VERSION}") |
|||
set(MACOSX_BUNDLE_BUNDLE_VERSION "${PROJECT_NAME} ${PROJECT_VERSION}") |
|||
set(MACOSX_BUNDLE_LONG_VERSION_STRING "${PROJECT_NAME} ${PROJECT_VERSION}") |
|||
set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${PROJECT_VERSION}") |
|||
set(MACOSX_BUNDLE_COPYRIGHT "${PROJECT_COPYRIGHT_YEAR} ${PROJECT_VENDOR}") |
|||
set(MACOSX_BUNDLE_GUI_IDENTIFIER "${PROJECT_DOMAIN_SECOND}.${PROJECT_DOMAIN_FIRST}") |
|||
set(MACOSX_BUNDLE_BUNDLE_NAME ${EXECUTEABLE}) |
|||
include(BundleUtilities) |
|||
|
|||
add_executable(${EXECUTEABLE} MACOSX_BUNDLE Main.ui ${RESOURCE_ADDED} ${SRC_LIST}) |
|||
else () |
|||
set(EXECUTEABLE walleth) |
|||
add_executable(${EXECUTEABLE} Main.ui ${RESOURCE_ADDED} ${SRC_LIST}) |
|||
endif () |
|||
|
|||
qt5_use_modules(${EXECUTEABLE} Core Gui Widgets Network Quick Qml) |
|||
target_link_libraries(${EXECUTEABLE} qethereum ethereum secp256k1) |
|||
|
|||
if (APPLE) |
|||
if (${ADDFRAMEWORKS}) |
|||
set_target_properties(${EXECUTEABLE} PROPERTIES MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/EthereumMacOSXBundleInfo.plist.in") |
|||
endif () |
|||
|
|||
SET_SOURCE_FILES_PROPERTIES(${EXECUTEABLE} PROPERTIES MACOSX_PACKAGE_LOCATION MacOS) |
|||
|
|||
# This is a workaround for when the build-type defaults to Debug, and when a multi-config generator like xcode is used, where the type |
|||
# will not be set but defaults to release. |
|||
set(generator_lowercase "${CMAKE_GENERATOR}") |
|||
string(TOLOWER "${CMAKE_GENERATOR}" generator_lowercase) |
|||
if ("${generator_lowercase}" STREQUAL "xcode") |
|||
# TODO: Not sure how to resolve this. Possibly \${TARGET_BUILD_DIR} |
|||
set(binary_build_dir "${CMAKE_CURRENT_BINARY_DIR}/Debug") |
|||
else () |
|||
set(binary_build_dir "${CMAKE_CURRENT_BINARY_DIR}") |
|||
endif () |
|||
|
|||
set(APPS ${binary_build_dir}/${EXECUTEABLE}.app) |
|||
|
|||
# This tool and the next will automatically looked at the linked libraries in order to determine what dependencies are required. Thus, target_link_libaries only needs to add ethereum and secp256k1 (above) |
|||
install(CODE " |
|||
include(BundleUtilities) |
|||
set(BU_CHMOD_BUNDLE_ITEMS 1) |
|||
fixup_bundle(\"${APPS}\" \"${BUNDLELIBS}\" \"../libqethereum ../libethereum ../secp256k1\") |
|||
" COMPONENT RUNTIME ) |
|||
|
|||
if (${ADDFRAMEWORKS}) |
|||
add_custom_target(addframeworks ALL |
|||
COMMAND /usr/local/opt/qt5/bin/macdeployqt ${binary_build_dir}/${EXECUTEABLE}.app |
|||
WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} |
|||
DEPENDS ${PROJECT_NAME} |
|||
) |
|||
endif () |
|||
|
|||
else () |
|||
install( TARGETS ${EXECUTEABLE} RUNTIME DESTINATION bin ) |
|||
endif () |
|||
|
@ -1,38 +0,0 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> |
|||
<plist version="1.0"> |
|||
<dict> |
|||
<key>CFBundleDevelopmentRegion</key> |
|||
<string>English</string> |
|||
<key>CFBundleExecutable</key> |
|||
<string>${MACOSX_BUNDLE_EXECUTABLE_NAME}</string> |
|||
<key>CFBundleGetInfoString</key> |
|||
<string>${MACOSX_BUNDLE_INFO_STRING}</string> |
|||
<key>CFBundleIconFile</key> |
|||
<string>${MACOSX_BUNDLE_ICON_FILE}</string> |
|||
<key>CFBundleIdentifier</key> |
|||
<string>${MACOSX_BUNDLE_GUI_IDENTIFIER}</string> |
|||
<key>CFBundleInfoDictionaryVersion</key> |
|||
<string>6.0</string> |
|||
<key>CFBundleLongVersionString</key> |
|||
<string>${MACOSX_BUNDLE_LONG_VERSION_STRING}</string> |
|||
<key>CFBundleName</key> |
|||
<string>${MACOSX_BUNDLE_BUNDLE_NAME}</string> |
|||
<key>CFBundlePackageType</key> |
|||
<string>APPL</string> |
|||
<key>CFBundleShortVersionString</key> |
|||
<string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string> |
|||
<key>CFBundleSignature</key> |
|||
<string>????</string> |
|||
<key>CFBundleVersion</key> |
|||
<string>${MACOSX_BUNDLE_BUNDLE_VERSION}</string> |
|||
<key>CSResourcesFileMapped</key> |
|||
<true/> |
|||
<key>LSRequiresCarbon</key> |
|||
<true/> |
|||
<key>NSHumanReadableCopyright</key> |
|||
<string>${MACOSX_BUNDLE_COPYRIGHT}</string> |
|||
<key>NSHighResolutionCapable</key> |
|||
<true/> |
|||
</dict> |
|||
</plist> |
@ -1,168 +0,0 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<ui version="4.0"> |
|||
<class>Main</class> |
|||
<widget class="QMainWindow" name="Main"> |
|||
<property name="geometry"> |
|||
<rect> |
|||
<x>0</x> |
|||
<y>0</y> |
|||
<width>562</width> |
|||
<height>488</height> |
|||
</rect> |
|||
</property> |
|||
<property name="windowTitle"> |
|||
<string>Walleth</string> |
|||
</property> |
|||
<property name="dockNestingEnabled"> |
|||
<bool>true</bool> |
|||
</property> |
|||
<property name="dockOptions"> |
|||
<set>QMainWindow::AllowNestedDocks|QMainWindow::AllowTabbedDocks|QMainWindow::VerticalTabs</set> |
|||
</property> |
|||
<property name="sizeGripEnabled" stdset="0"> |
|||
<bool>true</bool> |
|||
</property> |
|||
<widget class="QWidget" name="centralwidget"> |
|||
<layout class="QVBoxLayout" name="verticalLayout"> |
|||
<property name="leftMargin"> |
|||
<number>0</number> |
|||
</property> |
|||
<property name="topMargin"> |
|||
<number>0</number> |
|||
</property> |
|||
<property name="rightMargin"> |
|||
<number>0</number> |
|||
</property> |
|||
<property name="bottomMargin"> |
|||
<number>0</number> |
|||
</property> |
|||
<item> |
|||
<layout class="QHBoxLayout" name="fullDisplay"> |
|||
<item> |
|||
<widget class="QLabel" name="balance"> |
|||
<property name="text"> |
|||
<string>0 wei</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<widget class="QLabel" name="peerCount"> |
|||
<property name="text"> |
|||
<string>0 peers</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<widget class="QLabel" name="blockCount"> |
|||
<property name="text"> |
|||
<string>1 block</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</item> |
|||
</layout> |
|||
</widget> |
|||
<widget class="QMenuBar" name="menubar"> |
|||
<property name="geometry"> |
|||
<rect> |
|||
<x>0</x> |
|||
<y>0</y> |
|||
<width>562</width> |
|||
<height>20</height> |
|||
</rect> |
|||
</property> |
|||
<widget class="QMenu" name="menu_File"> |
|||
<property name="title"> |
|||
<string>&File</string> |
|||
</property> |
|||
<addaction name="quit"/> |
|||
</widget> |
|||
<widget class="QMenu" name="menu_Network"> |
|||
<property name="title"> |
|||
<string>&Network</string> |
|||
</property> |
|||
<addaction name="upnp"/> |
|||
<addaction name="net"/> |
|||
<addaction name="connect"/> |
|||
</widget> |
|||
<widget class="QMenu" name="menu_Tools"> |
|||
<property name="title"> |
|||
<string>T&ools</string> |
|||
</property> |
|||
<addaction name="mine"/> |
|||
<addaction name="create"/> |
|||
<addaction name="preview"/> |
|||
</widget> |
|||
<widget class="QMenu" name="menu_Help"> |
|||
<property name="title"> |
|||
<string>&Help</string> |
|||
</property> |
|||
<addaction name="about"/> |
|||
</widget> |
|||
<addaction name="menu_File"/> |
|||
<addaction name="menu_Network"/> |
|||
<addaction name="menu_Tools"/> |
|||
<addaction name="menu_Help"/> |
|||
</widget> |
|||
<widget class="QStatusBar" name="statusbar"/> |
|||
<action name="quit"> |
|||
<property name="text"> |
|||
<string>&Quit</string> |
|||
</property> |
|||
</action> |
|||
<action name="upnp"> |
|||
<property name="checkable"> |
|||
<bool>true</bool> |
|||
</property> |
|||
<property name="checked"> |
|||
<bool>true</bool> |
|||
</property> |
|||
<property name="text"> |
|||
<string>Use &UPnP</string> |
|||
</property> |
|||
</action> |
|||
<action name="connect"> |
|||
<property name="text"> |
|||
<string>&Connect to Peer...</string> |
|||
</property> |
|||
</action> |
|||
<action name="net"> |
|||
<property name="checkable"> |
|||
<bool>true</bool> |
|||
</property> |
|||
<property name="text"> |
|||
<string>Enable &Network</string> |
|||
</property> |
|||
</action> |
|||
<action name="mine"> |
|||
<property name="checkable"> |
|||
<bool>true</bool> |
|||
</property> |
|||
<property name="text"> |
|||
<string>&Mine</string> |
|||
</property> |
|||
</action> |
|||
<action name="create"> |
|||
<property name="text"> |
|||
<string>&New Address</string> |
|||
</property> |
|||
</action> |
|||
<action name="about"> |
|||
<property name="text"> |
|||
<string>&About...</string> |
|||
</property> |
|||
</action> |
|||
<action name="preview"> |
|||
<property name="checkable"> |
|||
<bool>true</bool> |
|||
</property> |
|||
<property name="text"> |
|||
<string>&Preview</string> |
|||
</property> |
|||
</action> |
|||
</widget> |
|||
<layoutdefault spacing="6" margin="11"/> |
|||
<resources/> |
|||
<connections/> |
|||
</ui> |
@ -1,286 +0,0 @@ |
|||
#include <QtNetwork/QNetworkReply> |
|||
#include <QtQuick/QQuickView> |
|||
//#include <QtQml/QQmlContext>
|
|||
//#include <QtQml/QQmlEngine>
|
|||
#include <QtQml/QtQml> |
|||
#include <QtWidgets/QMessageBox> |
|||
#include <QtWidgets/QInputDialog> |
|||
#include <QtGui/QClipboard> |
|||
#include <QtCore/QtCore> |
|||
#include <libdevcrypto/FileSystem.h> |
|||
#include <libethcore/Dagger.h> |
|||
#include <libevmcore/Instruction.h> |
|||
#include <libethereum/Client.h> |
|||
#include <libethereum/EthereumHost.h> |
|||
#include "BuildInfo.h" |
|||
#include "MainWin.h" |
|||
#include "ui_Main.h" |
|||
using namespace std; |
|||
|
|||
// types
|
|||
using dev::bytes; |
|||
using dev::bytesConstRef; |
|||
using dev::h160; |
|||
using dev::h256; |
|||
using dev::u160; |
|||
using dev::u256; |
|||
using dev::u256s; |
|||
using dev::Address; |
|||
using dev::eth::BlockInfo; |
|||
using dev::eth::Client; |
|||
using dev::eth::Instruction; |
|||
using dev::KeyPair; |
|||
using dev::eth::NodeMode; |
|||
using dev::p2p::PeerInfo; |
|||
using dev::RLP; |
|||
using dev::Secret; |
|||
using dev::eth::Transaction; |
|||
|
|||
// functions
|
|||
using dev::toHex; |
|||
using dev::fromHex; |
|||
using dev::right160; |
|||
using dev::simpleDebugOut; |
|||
using dev::toLog2; |
|||
using dev::toString; |
|||
using dev::eth::units; |
|||
using dev::eth::disassemble; |
|||
using dev::eth::formatBalance; |
|||
|
|||
// vars
|
|||
using dev::g_logPost; |
|||
using dev::g_logVerbosity; |
|||
|
|||
Main::Main(QWidget *parent) : |
|||
QMainWindow(parent), |
|||
ui(new Ui::Main) |
|||
{ |
|||
setWindowFlags(Qt::Window); |
|||
ui->setupUi(this); |
|||
setWindowIcon(QIcon(":/Ethereum.png")); |
|||
|
|||
g_qmlMain = this; |
|||
|
|||
m_client.reset(new Client("Walleth", Address(), dev::getDataDir() + "/Walleth")); |
|||
|
|||
g_qmlClient = m_client.get(); |
|||
|
|||
qRegisterMetaType<dev::u256>("dev::u256"); |
|||
qRegisterMetaType<dev::KeyPair>("dev::KeyPair"); |
|||
qRegisterMetaType<dev::Secret>("dev::Secret"); |
|||
qRegisterMetaType<dev::Address>("dev::Address"); |
|||
qRegisterMetaType<QmlAccount*>("QmlAccount*"); |
|||
qRegisterMetaType<QmlEthereum*>("QmlEthereum*"); |
|||
|
|||
qmlRegisterType<QmlEthereum>("org.ethereum", 1, 0, "Ethereum"); |
|||
qmlRegisterType<QmlAccount>("org.ethereum", 1, 0, "Account"); |
|||
qmlRegisterSingletonType<QmlU256Helper>("org.ethereum", 1, 0, "Balance", QmlEthereum::constructU256Helper); |
|||
qmlRegisterSingletonType<QmlKeyHelper>("org.ethereum", 1, 0, "Key", QmlEthereum::constructKeyHelper); |
|||
|
|||
/*
|
|||
ui->librariesView->setModel(m_libraryMan); |
|||
ui->graphsView->setModel(m_graphMan); |
|||
*/ |
|||
|
|||
m_view = new QQuickView(); |
|||
|
|||
// QQmlContext* context = m_view->rootContext();
|
|||
// context->setContextProperty("u256", new U256Helper(this));
|
|||
|
|||
m_view->setSource(QUrl("qrc:/Simple.qml")); |
|||
|
|||
QWidget* w = QWidget::createWindowContainer(m_view); |
|||
m_view->setResizeMode(QQuickView::SizeRootObjectToView); |
|||
ui->fullDisplay->insertWidget(0, w); |
|||
m_view->create(); |
|||
|
|||
// m_timelinesItem = m_view->rootObject()->findChild<TimelinesItem*>("timelines");
|
|||
|
|||
readSettings(); |
|||
refresh(); |
|||
|
|||
m_refreshNetwork = new QTimer(this); |
|||
connect(m_refreshNetwork, SIGNAL(timeout()), SLOT(refreshNetwork())); |
|||
m_refreshNetwork->start(1000); |
|||
|
|||
connect(&m_webCtrl, &QNetworkAccessManager::finished, [&](QNetworkReply* _r) |
|||
{ |
|||
m_servers = QString::fromUtf8(_r->readAll()).split("\n", QString::SkipEmptyParts); |
|||
if (m_servers.size()) |
|||
{ |
|||
ui->net->setChecked(true); |
|||
on_net_triggered(true); |
|||
} |
|||
}); |
|||
QNetworkRequest r(QUrl("http://www.ethereum.org/servers.poc" + QString(dev::Version).section('.', 1, 1) + ".txt")); |
|||
r.setHeader(QNetworkRequest::UserAgentHeader, "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1712.0 Safari/537.36"); |
|||
m_webCtrl.get(r); |
|||
srand(time(0)); |
|||
|
|||
startTimer(200); |
|||
|
|||
statusBar()->addPermanentWidget(ui->balance); |
|||
statusBar()->addPermanentWidget(ui->peerCount); |
|||
statusBar()->addPermanentWidget(ui->blockCount); |
|||
} |
|||
|
|||
Main::~Main() |
|||
{ |
|||
writeSettings(); |
|||
} |
|||
|
|||
void Main::timerEvent(QTimerEvent *) |
|||
{ |
|||
|
|||
} |
|||
|
|||
void Main::on_about_triggered() |
|||
{ |
|||
QMessageBox::about(this, "About Walleth PoC-" + QString(dev::Version).section('.', 1, 1), QString("Walleth/v") + dev::Version + "/" DEV_QUOTED(ETH_BUILD_TYPE) "/" DEV_QUOTED(ETH_BUILD_PLATFORM) "\n" DEV_QUOTED(ETH_COMMIT_HASH) + (ETH_CLEAN_REPO ? "\nCLEAN" : "\n+ LOCAL CHANGES") + "\n\nBy Gav Wood, 2014.\nBased on a design by Vitalik Buterin.\n\nThanks to the various contributors including: Alex Leverington, Tim Hughes, caktux, Eric Lombrozo, Marko Simovic."); |
|||
} |
|||
|
|||
void Main::writeSettings() |
|||
{ |
|||
QSettings s("ethereum", "walleth"); |
|||
QByteArray b; |
|||
b.resize(sizeof(Secret) * m_myKeys.size()); |
|||
auto p = b.data(); |
|||
for (auto i: m_myKeys) |
|||
{ |
|||
memcpy(p, &(i.secret()), sizeof(Secret)); |
|||
p += sizeof(Secret); |
|||
} |
|||
s.setValue("address", b); |
|||
|
|||
s.setValue("upnp", ui->upnp->isChecked()); |
|||
s.setValue("clientName", m_clientName); |
|||
s.setValue("idealPeers", m_idealPeers); |
|||
s.setValue("port", m_port); |
|||
|
|||
bytes d = client()->savePeers(); |
|||
if (d.size()) |
|||
m_peers = QByteArray((char*)d.data(), (int)d.size()); |
|||
s.setValue("peers", m_peers); |
|||
|
|||
s.setValue("geometry", saveGeometry()); |
|||
s.setValue("windowState", saveState()); |
|||
} |
|||
|
|||
void Main::readSettings() |
|||
{ |
|||
QSettings s("ethereum", "walleth"); |
|||
|
|||
restoreGeometry(s.value("geometry").toByteArray()); |
|||
restoreState(s.value("windowState").toByteArray()); |
|||
|
|||
QByteArray b = s.value("address").toByteArray(); |
|||
if (b.isEmpty()) |
|||
m_myKeys.append(KeyPair::create()); |
|||
else |
|||
{ |
|||
h256 k; |
|||
for (unsigned i = 0; i < b.size() / sizeof(Secret); ++i) |
|||
{ |
|||
memcpy(&k, b.data() + i * sizeof(Secret), sizeof(Secret)); |
|||
m_myKeys.append(KeyPair(k)); |
|||
} |
|||
} |
|||
//m_eth->setAddress(m_myKeys.last().address());
|
|||
m_peers = s.value("peers").toByteArray(); |
|||
ui->upnp->setChecked(s.value("upnp", true).toBool()); |
|||
m_clientName = s.value("clientName", "").toString(); |
|||
m_idealPeers = s.value("idealPeers", 5).toInt(); |
|||
m_port = s.value("port", 30303).toInt(); |
|||
} |
|||
|
|||
void Main::refreshNetwork() |
|||
{ |
|||
auto ps = client()->peers(); |
|||
ui->peerCount->setText(QString::fromStdString(toString(ps.size())) + " peer(s)"); |
|||
} |
|||
|
|||
void Main::refresh() |
|||
{ |
|||
auto d = client()->blockChain().details(); |
|||
auto diff = BlockInfo(client()->blockChain().block()).difficulty; |
|||
ui->blockCount->setText(QString("#%1 @%3 T%2").arg(d.number).arg(toLog2(d.totalDifficulty)).arg(toLog2(diff))); |
|||
|
|||
m_keysChanged = false; |
|||
u256 totalBalance = 0; |
|||
for (auto i: m_myKeys) |
|||
{ |
|||
u256 b = m_client->balanceAt(i.address()); |
|||
totalBalance += b; |
|||
} |
|||
ui->balance->setText(QString::fromStdString(formatBalance(totalBalance))); |
|||
} |
|||
|
|||
void Main::on_net_triggered(bool _auto) |
|||
{ |
|||
string n = string("Walleth/v") + dev::Version; |
|||
if (m_clientName.size()) |
|||
n += "/" + m_clientName.toStdString(); |
|||
n += "/" DEV_QUOTED(ETH_BUILD_TYPE) "/" DEV_QUOTED(ETH_BUILD_PLATFORM); |
|||
client()->setClientVersion(n); |
|||
if (ui->net->isChecked()) |
|||
{ |
|||
if (_auto) |
|||
{ |
|||
QString s = m_servers[rand() % m_servers.size()]; |
|||
client()->startNetwork(m_port, s.section(':', 0, 0).toStdString(), s.section(':', 1).toInt(), NodeMode::Full, m_idealPeers, "", ui->upnp->isChecked()); |
|||
} |
|||
else |
|||
client()->startNetwork(m_port, string(), 0, NodeMode::Full, m_idealPeers, "", ui->upnp->isChecked()); |
|||
if (m_peers.size()) |
|||
client()->restorePeers(bytesConstRef((byte*)m_peers.data(), m_peers.size())); |
|||
} |
|||
else |
|||
client()->stopNetwork(); |
|||
} |
|||
|
|||
void Main::on_connect_triggered() |
|||
{ |
|||
if (!ui->net->isChecked()) |
|||
{ |
|||
ui->net->setChecked(true); |
|||
on_net_triggered(); |
|||
} |
|||
bool ok = false; |
|||
QString s = QInputDialog::getItem(this, "Connect to a Network Peer", "Enter a peer to which a connection may be made:", m_servers, m_servers.count() ? rand() % m_servers.count() : 0, true, &ok); |
|||
if (ok && s.contains(":")) |
|||
{ |
|||
string host = s.section(":", 0, 0).toStdString(); |
|||
unsigned short port = s.section(":", 1).toInt(); |
|||
client()->connect(host, port); |
|||
} |
|||
} |
|||
|
|||
void Main::on_mine_triggered() |
|||
{ |
|||
if (ui->mine->isChecked()) |
|||
{ |
|||
client()->setAddress(m_myKeys.last().address()); |
|||
client()->startMining(); |
|||
} |
|||
else |
|||
client()->stopMining(); |
|||
} |
|||
|
|||
void Main::on_create_triggered() |
|||
{ |
|||
m_myKeys.append(KeyPair::create()); |
|||
m_keysChanged = true; |
|||
} |
|||
|
|||
// extra bits needed to link on VS
|
|||
#ifdef _MSC_VER |
|||
|
|||
// include moc file, ofuscated to hide from automoc
|
|||
#include\ |
|||
"moc_MainWin.cpp" |
|||
|
|||
// include qrc content
|
|||
#include\ |
|||
"qrc_Resources.cpp" |
|||
|
|||
#endif |
@ -1,84 +0,0 @@ |
|||
#ifndef MAIN_H |
|||
#define MAIN_H |
|||
|
|||
#include <QtNetwork/QNetworkAccessManager> |
|||
#include <QtCore/QAbstractListModel> |
|||
#include <QtCore/QMutex> |
|||
#include <QtWidgets/QMainWindow> |
|||
#include <libethcore/CommonEth.h> |
|||
#include <libqethereum/QmlEthereum.h> |
|||
|
|||
namespace Ui { |
|||
class Main; |
|||
} |
|||
|
|||
namespace dev { namespace eth { |
|||
class Client; |
|||
class State; |
|||
}} |
|||
|
|||
class QQuickView; |
|||
class QQmlEngine; |
|||
class QJSEngine; |
|||
|
|||
class Main : public QMainWindow |
|||
{ |
|||
Q_OBJECT |
|||
|
|||
public: |
|||
explicit Main(QWidget *parent = 0); |
|||
~Main(); |
|||
|
|||
dev::eth::Client* client() const { return m_client.get(); } |
|||
|
|||
private slots: |
|||
void on_connect_triggered(); |
|||
void on_mine_triggered(); |
|||
void on_create_triggered(); |
|||
void on_net_triggered(bool _auto = false); |
|||
void on_about_triggered(); |
|||
void on_preview_triggered() { refresh(); } |
|||
void on_quit_triggered() { close(); } |
|||
|
|||
void refresh(); |
|||
void refreshNetwork(); |
|||
|
|||
protected: |
|||
virtual void timerEvent(QTimerEvent *); |
|||
|
|||
private: |
|||
/* QString pretty(dev::Address _a) const;
|
|||
QString render(dev::Address _a) const; |
|||
dev::Address fromString(QString const& _a) const; |
|||
*/ |
|||
dev::eth::State const& state() const; |
|||
|
|||
void updateFee(); |
|||
void readSettings(); |
|||
void writeSettings(); |
|||
|
|||
dev::u256 fee() const; |
|||
dev::u256 total() const; |
|||
dev::u256 value() const; |
|||
|
|||
std::unique_ptr<Ui::Main> ui; |
|||
|
|||
QByteArray m_peers; |
|||
QMutex m_guiLock; |
|||
QTimer* m_refresh; |
|||
QTimer* m_refreshNetwork; |
|||
QVector<dev::KeyPair> m_myKeys; |
|||
bool m_keysChanged = false; |
|||
int m_port; |
|||
int m_idealPeers; |
|||
QString m_clientName; |
|||
QStringList m_servers; |
|||
|
|||
QQuickView* m_view; |
|||
|
|||
QNetworkAccessManager m_webCtrl; |
|||
|
|||
std::unique_ptr<dev::eth::Client> m_client; |
|||
}; |
|||
|
|||
#endif // MAIN_H
|
@ -1,5 +0,0 @@ |
|||
<RCC> |
|||
<qresource prefix="/"> |
|||
<file>Simple.qml</file> |
|||
</qresource> |
|||
</RCC> |
@ -1,38 +0,0 @@ |
|||
import QtQml 2.2 |
|||
import QtQuick 2.1 |
|||
import QtQuick.Controls 1.0 |
|||
import QtQuick.Layouts 1.0 |
|||
import Qt.labs.settings 1.0 |
|||
import org.ethereum 1.0 |
|||
|
|||
Item { |
|||
id: main |
|||
anchors.fill: parent |
|||
anchors.margins: 9 |
|||
|
|||
// Qt.application.name: "Walleth" |
|||
// Qt.application.organization: "Ethereum" |
|||
// Qt.application.domain: "org.ethereum" |
|||
|
|||
Ethereum { |
|||
id: eth |
|||
} |
|||
|
|||
Account { |
|||
id: myAccount |
|||
address: Key.addressOf("84fc4ba9373c30bfe32d8c5a502854e7f1175878") |
|||
ethereum: eth |
|||
// TODO: state: eth.latest // could be eth.pending |
|||
// will provide balance, txCount, isContract, incomingTransactions (list model), outgoingTransactions (list model). |
|||
// transaction lists' items will provide value, from, to, final balance. |
|||
} |
|||
|
|||
// KeyPair provides makeTransaction(recvAddress, value, data (array)) |
|||
|
|||
Text { |
|||
text: "Balance: " + Balance.stringOf(myAccount.balance) + " [" + myAccount.txCount + "]" + "\nAccount: " + Key.stringOf(myAccount.address) |
|||
Layout.minimumHeight: 30 |
|||
Layout.fillHeight: true |
|||
Layout.fillWidth: true |
|||
} |
|||
} |
@ -1,11 +0,0 @@ |
|||
#include "MainWin.h" |
|||
#include <QtWidgets/QApplication> |
|||
|
|||
int main(int argc, char *argv[]) |
|||
{ |
|||
QApplication a(argc, argv); |
|||
Main w; |
|||
w.show(); |
|||
|
|||
return a.exec(); |
|||
} |
Loading…
Reference in new issue