diff --git a/eth/EthStubServer.cpp b/eth/EthStubServer.cpp
index a2aadec8a..1731de195 100644
--- a/eth/EthStubServer.cpp
+++ b/eth/EthStubServer.cpp
@@ -8,15 +8,15 @@
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
+ 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 .
+ along with cpp-ethereum. If not, see .
*/
/** @file EthStubServer.cpp
* @authors:
- * Gav Wood
+ * Gav Wood
* @date 2014
*/
@@ -27,12 +27,40 @@
using namespace std;
using namespace eth;
+
+
EthStubServer::EthStubServer(jsonrpc::AbstractServerConnector* _conn, Client& _client):
AbstractEthStubServer(_conn),
m_client(_client)
{
}
+
+//only works with a json spec that doesn't have notifications for now
+Json::Value EthStubServer::procedures()
+{
+ Json::Value ret;
+
+ for(auto proc : this->GetProtocolHanlder()->GetProcedures())
+ {
+ Json::Value proc_j;
+
+ proc_j[proc.second->GetProcedureType() == 0 ? "method" : "notification"] = proc.first;
+
+ Json::Value params_j;
+ for(auto params : proc.second->GetParameters())
+ {
+ params_j[params.first] = jsontypeToValue(params.second);
+ }
+ proc_j["params"] = params_j;
+
+ proc_j["returns"] = jsontypeToValue(proc.second->GetReturnType());
+
+ ret.append(proc_j);
+ }
+ return ret;
+}
+
std::string EthStubServer::coinbase()
{
ClientGuard g(&m_client);
@@ -129,4 +157,55 @@ std::string EthStubServer::secretToAddress(const std::string& _a)
{
return toJS(KeyPair(jsToSecret(_a)).address());
}
+
+Json::Value EthStubServer::lastBlock()
+{
+ return blockJson("");
+}
+
+Json::Value EthStubServer::block(const std::string& hash)
+{
+ return blockJson(hash);
+}
+
+Json::Value EthStubServer::blockJson(const std::string& hash)
+{
+ Json::Value res;
+ auto const& bc = m_client.blockChain();
+
+ auto b = hash.length() ? bc.block(h256(hash)) : bc.block();
+
+ auto bi = BlockInfo(b);
+ res["number"] = to_string(bc.details(bc.currentHash()).number);
+ res["hash"] = boost::lexical_cast(bi.hash);
+ res["parentHash"] = boost::lexical_cast(bi.parentHash);
+ res["sha3Uncles"] = boost::lexical_cast(bi.sha3Uncles);
+ res["coinbaseAddress"] = boost::lexical_cast(bi.coinbaseAddress);
+ res["stateRoot"] = boost::lexical_cast(bi.stateRoot);
+ res["transactionsRoot"] = boost::lexical_cast(bi.transactionsRoot);
+ res["minGasPrice"] = boost::lexical_cast(bi.minGasPrice);
+ res["gasLimit"] = boost::lexical_cast(bi.gasLimit);
+ res["gasUsed"] = boost::lexical_cast(bi.gasUsed);
+ res["difficulty"] = boost::lexical_cast(bi.difficulty);
+ res["timestamp"] = boost::lexical_cast(bi.timestamp);
+ res["nonce"] = boost::lexical_cast(bi.nonce);
+
+ return res;
+}
+
+Json::Value EthStubServer::jsontypeToValue(int jsontype)
+{
+ cout<< jsontype << endl;
+ switch(jsontype)
+ {
+ case jsonrpc::JSON_STRING: return ""; //Json::stringValue segfault, fuck knows why
+ case jsonrpc::JSON_BOOLEAN: return Json::booleanValue;
+ case jsonrpc::JSON_INTEGER: return Json::intValue;
+ case jsonrpc::JSON_REAL: return Json::realValue;
+ case jsonrpc::JSON_OBJECT: return Json::objectValue;
+ case jsonrpc::JSON_ARRAY: return Json::arrayValue;
+ default: return Json::nullValue;
+ }
+}
+
#endif
diff --git a/eth/EthStubServer.h b/eth/EthStubServer.h
index fc0752910..049efa67b 100644
--- a/eth/EthStubServer.h
+++ b/eth/EthStubServer.h
@@ -31,11 +31,13 @@
namespace eth { class Client; }
namespace eth { class KeyPair; }
+
class EthStubServer: public AbstractEthStubServer
{
public:
EthStubServer(jsonrpc::AbstractServerConnector* _conn, eth::Client& _client);
+ virtual Json::Value procedures();
virtual std::string balanceAt(std::string const& _a);
virtual Json::Value check(Json::Value const& _as);
virtual std::string coinbase();
@@ -51,10 +53,13 @@ public:
virtual Json::Value transact(const std::string& aDest, const std::string& bData, const std::string& sec, const std::string& xGas, const std::string& xGasPrice, const std::string& xValue);
virtual std::string txCountAt(const std::string& a);
virtual std::string secretToAddress(const std::string& a);
-
+ virtual Json::Value lastBlock();
+ virtual Json::Value block(const std::string&);
void setKeys(std::vector _keys) { m_keys = _keys; }
private:
eth::Client& m_client;
std::vector m_keys;
+ Json::Value jsontypeToValue(int);
+ Json::Value blockJson(const std::string&);
};
diff --git a/eth/abstractethstubserver.h b/eth/abstractethstubserver.h
index 74a50c514..3355b5557 100644
--- a/eth/abstractethstubserver.h
+++ b/eth/abstractethstubserver.h
@@ -14,6 +14,7 @@ class AbstractEthStubServer : public jsonrpc::AbstractServer(conn)
{
this->bindAndAddMethod(new jsonrpc::Procedure("balanceAt", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_STRING, "a",jsonrpc::JSON_STRING, NULL), &AbstractEthStubServer::balanceAtI);
+ this->bindAndAddMethod(new jsonrpc::Procedure("block", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_OBJECT, "a",jsonrpc::JSON_STRING, NULL), &AbstractEthStubServer::blockI);
this->bindAndAddMethod(new jsonrpc::Procedure("check", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_ARRAY, "a",jsonrpc::JSON_ARRAY, NULL), &AbstractEthStubServer::checkI);
this->bindAndAddMethod(new jsonrpc::Procedure("coinbase", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_STRING, NULL), &AbstractEthStubServer::coinbaseI);
this->bindAndAddMethod(new jsonrpc::Procedure("create", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_OBJECT, "bCode",jsonrpc::JSON_STRING,"sec",jsonrpc::JSON_STRING,"xEndowment",jsonrpc::JSON_STRING,"xGas",jsonrpc::JSON_STRING,"xGasPrice",jsonrpc::JSON_STRING, NULL), &AbstractEthStubServer::createI);
@@ -23,7 +24,9 @@ class AbstractEthStubServer : public jsonrpc::AbstractServerbindAndAddMethod(new jsonrpc::Procedure("isMining", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_BOOLEAN, NULL), &AbstractEthStubServer::isMiningI);
this->bindAndAddMethod(new jsonrpc::Procedure("key", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_STRING, NULL), &AbstractEthStubServer::keyI);
this->bindAndAddMethod(new jsonrpc::Procedure("keys", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_ARRAY, NULL), &AbstractEthStubServer::keysI);
+ this->bindAndAddMethod(new jsonrpc::Procedure("lastBlock", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_OBJECT, NULL), &AbstractEthStubServer::lastBlockI);
this->bindAndAddMethod(new jsonrpc::Procedure("peerCount", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_INTEGER, NULL), &AbstractEthStubServer::peerCountI);
+ this->bindAndAddMethod(new jsonrpc::Procedure("procedures", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_ARRAY, NULL), &AbstractEthStubServer::proceduresI);
this->bindAndAddMethod(new jsonrpc::Procedure("secretToAddress", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_STRING, "a",jsonrpc::JSON_STRING, NULL), &AbstractEthStubServer::secretToAddressI);
this->bindAndAddMethod(new jsonrpc::Procedure("storageAt", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_STRING, "a",jsonrpc::JSON_STRING,"x",jsonrpc::JSON_STRING, NULL), &AbstractEthStubServer::storageAtI);
this->bindAndAddMethod(new jsonrpc::Procedure("transact", jsonrpc::PARAMS_BY_NAME, jsonrpc::JSON_OBJECT, "aDest",jsonrpc::JSON_STRING,"bData",jsonrpc::JSON_STRING,"sec",jsonrpc::JSON_STRING,"xGas",jsonrpc::JSON_STRING,"xGasPrice",jsonrpc::JSON_STRING,"xValue",jsonrpc::JSON_STRING, NULL), &AbstractEthStubServer::transactI);
@@ -36,6 +39,11 @@ class AbstractEthStubServer : public jsonrpc::AbstractServerbalanceAt(request["a"].asString());
}
+ inline virtual void blockI(const Json::Value& request, Json::Value& response)
+ {
+ response = this->block(request["a"].asString());
+ }
+
inline virtual void checkI(const Json::Value& request, Json::Value& response)
{
response = this->check(request["a"]);
@@ -81,11 +89,21 @@ class AbstractEthStubServer : public jsonrpc::AbstractServerkeys();
}
+ inline virtual void lastBlockI(const Json::Value& request, Json::Value& response)
+ {
+ response = this->lastBlock();
+ }
+
inline virtual void peerCountI(const Json::Value& request, Json::Value& response)
{
response = this->peerCount();
}
+ inline virtual void proceduresI(const Json::Value& request, Json::Value& response)
+ {
+ response = this->procedures();
+ }
+
inline virtual void secretToAddressI(const Json::Value& request, Json::Value& response)
{
response = this->secretToAddress(request["a"].asString());
@@ -108,6 +126,7 @@ class AbstractEthStubServer : public jsonrpc::AbstractServer