/* 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 Test.cpp * @authors: * Dimitry Khokhlov * @date 2016 */ #include "Test.h" #include #include #include #include #include using namespace std; using namespace dev; using namespace dev::eth; using namespace dev::rpc; using namespace jsonrpc; Test::Test(eth::Client& _eth): m_eth(_eth) {} namespace { string logEntriesToLogHash(eth::LogEntries const& _logs) { RLPStream s; s.appendList(_logs.size()); for (eth::LogEntry const& l : _logs) l.streamRLP(s); return toJS(sha3(s.out())); } } string Test::test_getLogHash(string const& _txHash) { try { h256 txHash; try { txHash = h256(_txHash); } catch (BadHexCharacter const&) { throw JsonRpcException(Errors::ERROR_RPC_INVALID_PARAMS); } if (m_eth.blockChain().isKnownTransaction(txHash)) { LocalisedTransaction t = m_eth.localisedTransaction(txHash); BlockReceipts const& blockReceipts = m_eth.blockChain().receipts(t.blockHash()); if (blockReceipts.receipts.size() != 0) return logEntriesToLogHash(blockReceipts.receipts[t.transactionIndex()].log()); } return toJS(dev::EmptyListSHA3); } catch (std::exception const& ex) { cwarn << ex.what(); throw JsonRpcException(Errors::ERROR_RPC_INTERNAL_ERROR); } } bool Test::test_setChainParams(Json::Value const& param1) { try { Json::FastWriter fastWriter; std::string output = fastWriter.write(param1); asClientTest(m_eth).setChainParams(output); asClientTest(m_eth).completeSync(); // set sync state to idle for mining } catch (std::exception const&) { BOOST_THROW_EXCEPTION(JsonRpcException(Errors::ERROR_RPC_INTERNAL_ERROR)); } return true; } bool Test::test_mineBlocks(int _number) { try { asClientTest(m_eth).mineBlocks(_number); } catch (std::exception const&) { BOOST_THROW_EXCEPTION(JsonRpcException(Errors::ERROR_RPC_INTERNAL_ERROR)); } return true; } bool Test::test_modifyTimestamp(int _timestamp) { // FIXME: Fix year 2038 issue. try { asClientTest(m_eth).modifyTimestamp(_timestamp); } catch (std::exception const&) { BOOST_THROW_EXCEPTION(JsonRpcException(Errors::ERROR_RPC_INTERNAL_ERROR)); } return true; } bool Test::test_addBlock(std::string const& _rlp) { try { asClientTest(m_eth).addBlock(_rlp); } catch (std::exception const&) { BOOST_THROW_EXCEPTION(JsonRpcException(Errors::ERROR_RPC_INTERNAL_ERROR)); } return true; } bool Test::test_rewindToBlock(int _number) { try { m_eth.rewind(_number); asClientTest(m_eth).completeSync(); } catch (std::exception const&) { BOOST_THROW_EXCEPTION(JsonRpcException(Errors::ERROR_RPC_INTERNAL_ERROR)); } return true; }