diff --git a/libqethereum/QEthereum.cpp b/libqethereum/QEthereum.cpp index 2d8eef341..8da5ed8cd 100644 --- a/libqethereum/QEthereum.cpp +++ b/libqethereum/QEthereum.cpp @@ -56,10 +56,11 @@ QString unpadded(QString _s) } QEthereum::QEthereum(QObject* _p, eth::Interface* _c, QList _accounts): - QObject(_p), m_client(_c), m_accounts(_accounts) + QObject(_p), m_client(_c) { // required to prevent crash on osx when performing addto/evaluatejavascript calls moveToThread(_p->thread()); + setAccounts(_accounts); } QEthereum::~QEthereum() @@ -81,11 +82,6 @@ void QEthereum::clearWatches() m_watches.clear(); } -QString QEthereum::secretToAddress(QString _s) const -{ - return toQJS(KeyPair(toSecret(_s)).address()); -} - eth::Interface* QEthereum::client() const { return m_client; @@ -126,33 +122,11 @@ QString QEthereum::number() const return m_client ? QString::number(client()->number() + 1) : ""; } -QString QEthereum::account() const -{ - if (m_accounts.empty()) - return toQJS(Address()); - return toQJS(m_accounts[0].address()); -} - QStringList QEthereum::accounts() const { QStringList ret; for (auto i: m_accounts) - ret.push_back(toQJS(i.address())); - return ret; -} - -QString QEthereum::key() const -{ - if (m_accounts.empty()) - return toQJS(KeyPair().sec()); - return toQJS(m_accounts[0].sec()); -} - -QStringList QEthereum::keys() const -{ - QStringList ret; - for (auto i: m_accounts) - ret.push_back(toQJS(i.sec())); + ret.push_back(toQJS(i.first)); return ret; } @@ -264,7 +238,7 @@ static dev::eth::MessageFilter toMessageFilter(QString _json) struct TransactionSkeleton { - Secret from; + Address from; Address to; u256 value; bytes data; @@ -278,7 +252,7 @@ static TransactionSkeleton toTransaction(QString _json) QJsonObject f = QJsonDocument::fromJson(_json.toUtf8()).object(); if (f.contains("from")) - ret.from = toSecret(f["from"].toString()); + ret.from = toAddress(f["from"].toString()); if (f.contains("to")) ret.to = toAddress(f["to"].toString()); if (f.contains("value")) @@ -453,26 +427,17 @@ void QEthereum::setListening(bool) client()->stopNetwork();*/ } -unsigned QEthereum::peerCount() const -{ - return /*m_client ? (unsigned)client()->peerCount() :*/ 0; -} - -QString QEthereum::doCreate(QString _secret, QString _amount, QString _init, QString _gas, QString _gasPrice) +void QEthereum::setAccounts(QList const& _l) { - if (!m_client) - return ""; - auto ret = toQJS(client()->transact(toSecret(_secret), toU256(_amount), toBytes(_init), toU256(_gas), toU256(_gasPrice))); - client()->flushTransactions(); - return ret; + m_accounts.clear(); + for (auto i: _l) + m_accounts[i.address()] = i.secret(); + keysChanged(); } -void QEthereum::doTransact(QString _secret, QString _amount, QString _dest, QString _data, QString _gas, QString _gasPrice) +unsigned QEthereum::peerCount() const { - if (!m_client) - return; - client()->transact(toSecret(_secret), toU256(_amount), toAddress(_dest), toBytes(_data), toU256(_gas), toU256(_gasPrice)); - client()->flushTransactions(); + return /*m_client ? (unsigned)client()->peerCount() :*/ 0; } QString QEthereum::doTransact(QString _json) @@ -483,18 +448,23 @@ QString QEthereum::doTransact(QString _json) TransactionSkeleton t = toTransaction(_json); if (!t.from && m_accounts.size()) { - auto b = m_accounts.first(); + auto b = m_accounts.begin()->first; for (auto a: m_accounts) - if (client()->balanceAt(KeyPair(a).address()) > client()->balanceAt(KeyPair(b).address())) - b = a; - t.from = b.secret(); + if (client()->balanceAt(a.first) > client()->balanceAt(b)) + b = a.first; + t.from = b; } + if (!m_accounts.count(t.from)) + return QString(); if (!t.gasPrice) t.gasPrice = 10 * dev::eth::szabo; if (!t.gas) - t.gas = min(client()->gasLimitRemaining(), client()->balanceAt(KeyPair(t.from).address()) / t.gasPrice); + t.gas = min(client()->gasLimitRemaining(), client()->balanceAt(t.from) / t.gasPrice); + + cwarn << "Silently signing transaction from address" << toAddress(t.from).abridged() << ": User validation hook goes here."; if (t.to) - client()->transact(t.from, t.value, t.to, t.data, t.gas, t.gasPrice); + // TODO: insert validification hook here. + client()->transact(m_accounts[t.from].secret(), t.value, t.to, t.data, t.gas, t.gasPrice); else ret = toQJS(client()->transact(t.from, t.value, t.data, t.gas, t.gasPrice)); client()->flushTransactions(); @@ -506,15 +476,21 @@ QString QEthereum::doCall(QString _json) if (!m_client) return QString(); TransactionSkeleton t = toTransaction(_json); - if (!t.to) - return QString(); if (!t.from && m_accounts.size()) - t.from = m_accounts[0].secret(); + { + auto b = m_accounts.begin()->first; + for (auto a: m_accounts) + if (client()->balanceAt(a.first) > client()->balanceAt(b)) + b = a.first; + t.from = b; + } + if (!m_accounts.count(t.from)) + return QString(); if (!t.gasPrice) t.gasPrice = 10 * dev::eth::szabo; if (!t.gas) - t.gas = client()->balanceAt(KeyPair(t.from).address()) / t.gasPrice; - bytes out = client()->call(t.from, t.value, t.to, t.data, t.gas, t.gasPrice); + t.gas = min(client()->gasLimitRemaining(), client()->balanceAt(t.from) / t.gasPrice); + bytes out = client()->call(m_accounts[t.from].secret(), t.value, t.to, t.data, t.gas, t.gasPrice); return asQString(out); } diff --git a/libqethereum/QEthereum.h b/libqethereum/QEthereum.h index 3ef57d232..f7b978e4b 100644 --- a/libqethereum/QEthereum.h +++ b/libqethereum/QEthereum.h @@ -133,11 +133,10 @@ public: /// Call when the client() is going to be deleted to make this object useless but safe. void clientDieing(); - void setAccounts(QList _l) { m_accounts = _l; keysChanged(); } + void setAccounts(QList const& _l); Q_INVOKABLE QEthereum* self() { return this; } - Q_INVOKABLE QString secretToAddress(QString _s) const; Q_INVOKABLE QString lll(QString _s) const; // [NEW API] - Use this instead. @@ -157,8 +156,6 @@ public: Q_INVOKABLE QString/*json*/ getMessages(QString _attribs/*json*/) const; - Q_INVOKABLE QString doCreate(QString _secret, QString _amount, QString _init, QString _gas, QString _gasPrice); - Q_INVOKABLE void doTransact(QString _secret, QString _amount, QString _dest, QString _data, QString _gas, QString _gasPrice); Q_INVOKABLE QString doTransact(QString _json); Q_INVOKABLE QString doCall(QString _json); @@ -175,9 +172,6 @@ public: QString/*dev::u256*/ number() const; int getDefault() const; - QString/*dev::KeyPair*/ key() const; - QStringList/*list of dev::KeyPair*/ keys() const; - QString/*dev::Address*/ account() const; QStringList/*list of dev::Address*/ accounts() const; unsigned peerCount() const; @@ -203,8 +197,7 @@ private: Q_PROPERTY(QString number READ number NOTIFY watchChanged) Q_PROPERTY(QString coinbase READ coinbase WRITE setCoinbase NOTIFY coinbaseChanged) Q_PROPERTY(QString gasPrice READ gasPrice) - Q_PROPERTY(QString key READ key NOTIFY keysChanged) - Q_PROPERTY(QStringList keys READ keys NOTIFY keysChanged) + Q_PROPERTY(QStringList accounts READ accounts NOTIFY keysChanged) Q_PROPERTY(bool mining READ isMining WRITE setMining NOTIFY netChanged) Q_PROPERTY(bool listening READ isListening WRITE setListening NOTIFY netChanged) Q_PROPERTY(unsigned peerCount READ peerCount NOTIFY miningChanged) @@ -212,7 +205,7 @@ private: dev::eth::Interface* m_client; std::vector m_watches; - QList m_accounts; + std::map m_accounts; }; class QWhisper: public QObject