diff --git a/evmjit b/evmjit index 66d5a2b5c..3df5a125f 160000 --- a/evmjit +++ b/evmjit @@ -1 +1 @@ -Subproject commit 66d5a2b5cdf1361dcf0205b191dd12be090ed224 +Subproject commit 3df5a125fa0baa579528abce80402118cad803fd diff --git a/libdevcore/CommonJS.cpp b/libdevcore/CommonJS.cpp index ad3ade71f..ee2074cd1 100644 --- a/libdevcore/CommonJS.cpp +++ b/libdevcore/CommonJS.cpp @@ -42,8 +42,6 @@ bytes padded(bytes _b, unsigned _l) { while (_b.size() < _l) _b.insert(_b.begin(), 0); - while (_b.size() < _l) - _b.push_back(0); return asBytes(asString(_b).substr(_b.size() - std::max(_l, _l))); } @@ -54,15 +52,23 @@ bytes unpadded(bytes _b) return _b; } +std::string unpadLeft(std::string _b) +{ + auto p = _b.find_first_not_of('0'); + if (p == std::string::npos) + return "0"; + return _b.substr(p, _b.length() - 1); +} + std::string prettyU256(u256 _n) { unsigned inc = 0; std::string raw; std::ostringstream s; if (!(_n >> 64)) - s << " " << (uint64_t)_n << " (0x" << (uint64_t)_n << ")"; + s << " " << (uint64_t)_n << " (0x" << std::hex << (uint64_t)_n << ")"; else if (!~(_n >> 64)) - s << " " << (int64_t)_n << " (0x" << (int64_t)_n << ")"; + s << " " << (int64_t)_n << " (0x" << std::hex << (int64_t)_n << ")"; else if ((_n >> 160) == 0) { Address a = right160(_n); @@ -113,5 +119,4 @@ Address fromString(std::string const& _sn) return Address(); } - } diff --git a/libdevcore/CommonJS.h b/libdevcore/CommonJS.h index 8b96b2e68..4fe40ebe2 100644 --- a/libdevcore/CommonJS.h +++ b/libdevcore/CommonJS.h @@ -46,11 +46,19 @@ inline std::string toJS(dev::bytes const& _n) return "0x" + dev::toHex(_n); } +/// Convert string to byte array. Input parameters can be hex or dec. Returns empty array if invalid input e.g neither dec or hex. bytes jsToBytes(std::string const& _s); +/// Add '0' on the head of _b until _l. bytes padded(bytes _b, unsigned _l); +/// Removing all trailing '0'. Returns empty array if input contains only '0' char. bytes unpadded(bytes _s); +/// Remove all '0' on the head of _s. Returns 0 if _s contains only '0'. +std::string unpadLeft(std::string _s); +/// Convert u256 into user-readable string. Returns int/hex value of 64 bits int, hex of 160 bits FixedHash. As a fallback try to handle input as h256. std::string prettyU256(u256 _n); +/// Convert h256 into user-readable string (by directly using std::string constructor). std::string fromRaw(h256 _n, unsigned* _inc = nullptr); +/// Convert string to Address (h160), returns empty address if (_a.size != 40). Address fromString(std::string const& _a); template FixedHash jsToFixed(std::string const& _s) diff --git a/libethcore/CommonEth.cpp b/libethcore/CommonEth.cpp index 9801bc89f..c70bc353b 100644 --- a/libethcore/CommonEth.cpp +++ b/libethcore/CommonEth.cpp @@ -32,7 +32,7 @@ namespace dev namespace eth { -const unsigned c_protocolVersion = 49; +const unsigned c_protocolVersion = 51; const unsigned c_databaseVersion = 5; static const vector> g_units = diff --git a/libethcore/Exceptions.cpp b/libethcore/Exceptions.cpp index c6f35763e..b0aff4551 100644 --- a/libethcore/Exceptions.cpp +++ b/libethcore/Exceptions.cpp @@ -20,13 +20,22 @@ */ #include "Exceptions.h" +#include #include using namespace std; using namespace dev; using namespace dev::eth; -#define ETH_RETURN_STRING(S) static string s_what; s_what = S; return s_what.c_str(); +#if ALL_COMPILERS_ARE_CPP11_COMPLIANT +#define ETH_RETURN_STRING(S) thread_local static string s_what; s_what = S; return s_what.c_str(); +#else +#define ETH_RETURN_STRING(S) \ + static boost::thread_specific_ptr s_what; \ + if (!s_what.get()) \ + s_what.reset(new string); \ + *s_what = S; return s_what->c_str(); +#endif const char* InvalidBlockFormat::what() const noexcept { ETH_RETURN_STRING("Invalid block format: Bad field " + toString(m_f) + " (" + toHex(m_d) + ")"); } const char* UncleInChain::what() const noexcept { ETH_RETURN_STRING("Uncle in block already mentioned: Uncles " + toString(m_uncles) + " (" + m_block.abridged() + ")"); } diff --git a/libethereum/BlockChain.cpp b/libethereum/BlockChain.cpp index 6ed0a2ca6..b1938d54d 100644 --- a/libethereum/BlockChain.cpp +++ b/libethereum/BlockChain.cpp @@ -71,7 +71,7 @@ std::map const& dev::eth::genesisState() return s_ret; } -BlockInfo* BlockChain::s_genesis = nullptr; +std::unique_ptr BlockChain::s_genesis; boost::shared_mutex BlockChain::x_genesis; ldb::Slice dev::eth::toSlice(h256 _h, unsigned _sub) diff --git a/libethereum/BlockChain.h b/libethereum/BlockChain.h index d03818bd3..4e5d66c9a 100644 --- a/libethereum/BlockChain.h +++ b/libethereum/BlockChain.h @@ -132,7 +132,7 @@ public: h256Set allUnclesFrom(h256 _parent) const; /// @returns the genesis block header. - static BlockInfo const& genesis() { UpgradableGuard l(x_genesis); if (!s_genesis) { auto gb = createGenesisBlock(); UpgradeGuard ul(l); (s_genesis = new BlockInfo)->populate(&gb); } return *s_genesis; } + static BlockInfo const& genesis() { UpgradableGuard l(x_genesis); if (!s_genesis) { auto gb = createGenesisBlock(); UpgradeGuard ul(l); s_genesis.reset(new BlockInfo); s_genesis->populate(&gb); } return *s_genesis; } /// @returns the genesis block as its RLP-encoded byte array. /// @note This is slow as it's constructed anew each call. Consider genesis() instead. @@ -211,7 +211,7 @@ private: /// Static genesis info and its lock. static boost::shared_mutex x_genesis; - static BlockInfo* s_genesis; + static std::unique_ptr s_genesis; }; std::ostream& operator<<(std::ostream& _out, BlockChain const& _bc); diff --git a/libethereum/Executive.cpp b/libethereum/Executive.cpp index 3bc6ea93e..965d6f0af 100644 --- a/libethereum/Executive.cpp +++ b/libethereum/Executive.cpp @@ -1,16 +1,13 @@ /* 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 . */ diff --git a/libethereum/Executive.h b/libethereum/Executive.h index 0b154b4b5..5a97e5f87 100644 --- a/libethereum/Executive.h +++ b/libethereum/Executive.h @@ -1,16 +1,13 @@ /* 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 . */ diff --git a/libethereum/Precompiled.cpp b/libethereum/Precompiled.cpp index 1861385da..732782d3f 100644 --- a/libethereum/Precompiled.cpp +++ b/libethereum/Precompiled.cpp @@ -75,11 +75,17 @@ static bytes ripemd160Code(bytesConstRef _in) return ret; } +static bytes identityCode(bytesConstRef _in) +{ + return _in.toBytes(); +} + static const std::map c_precompiled = { { 1, { [](bytesConstRef) -> bigint { return (bigint)500; }, ecrecoverCode }}, { 2, { [](bytesConstRef i) -> bigint { return (bigint)50 + (i.size() + 31) / 32 * 50; }, sha256Code }}, - { 3, { [](bytesConstRef i) -> bigint { return (bigint)50 + (i.size() + 31) / 32 * 50; }, ripemd160Code }} + { 3, { [](bytesConstRef i) -> bigint { return (bigint)50 + (i.size() + 31) / 32 * 50; }, ripemd160Code }}, + { 4, { [](bytesConstRef i) -> bigint { return (bigint)1 + (i.size() + 31) / 32 * 1; }, identityCode }} }; std::map const& dev::eth::precompiled() diff --git a/libethereum/TransactionReceipt.cpp b/libethereum/TransactionReceipt.cpp index 868b00558..eba991839 100644 --- a/libethereum/TransactionReceipt.cpp +++ b/libethereum/TransactionReceipt.cpp @@ -50,7 +50,7 @@ void TransactionReceipt::streamRLP(RLPStream& _s) const l.streamRLP(_s); } -std::ostream& dev::operator<<(std::ostream& _out, TransactionReceipt const& _r) +std::ostream& dev::eth::operator<<(std::ostream& _out, TransactionReceipt const& _r) { _out << "Root: " << _r.stateRoot() << std::endl; _out << "Gas used: " << _r.gasUsed() << std::endl; diff --git a/libethereum/TransactionReceipt.h b/libethereum/TransactionReceipt.h index ebf591995..1e0663054 100644 --- a/libethereum/TransactionReceipt.h +++ b/libethereum/TransactionReceipt.h @@ -57,8 +57,7 @@ private: using TransactionReceipts = std::vector; -} - std::ostream& operator<<(std::ostream& _out, eth::TransactionReceipt const& _r); } +} diff --git a/libevm/VM.h b/libevm/VM.h index 47efbfcba..eab248b44 100644 --- a/libevm/VM.h +++ b/libevm/VM.h @@ -196,8 +196,6 @@ inline bytesConstRef VM::go(ExtVMFace& _ext, OnOpFunc const& _onOp, uint64_t _st require(7); runGas = (bigint)c_callGas + m_stack[m_stack.size() - 1]; newTempSize = std::max(memNeed(m_stack[m_stack.size() - 6], m_stack[m_stack.size() - 7]), memNeed(m_stack[m_stack.size() - 4], m_stack[m_stack.size() - 5])); - if (_ext.depth == 1024) - BOOST_THROW_EXCEPTION(OutOfGas()); break; case Instruction::CREATE: @@ -207,8 +205,6 @@ inline bytesConstRef VM::go(ExtVMFace& _ext, OnOpFunc const& _onOp, uint64_t _st u256 inSize = m_stack[m_stack.size() - 3]; newTempSize = (bigint)inOff + inSize; runGas = c_createGas; - if (_ext.depth == 1024) - BOOST_THROW_EXCEPTION(OutOfGas()); break; } case Instruction::EXP: @@ -219,9 +215,8 @@ inline bytesConstRef VM::go(ExtVMFace& _ext, OnOpFunc const& _onOp, uint64_t _st break; } - case Instruction::PREVHASH: - if (c_protocolVersion > 49) - require(1); + case Instruction::BLOCKHASH: + require(1); break; case Instruction::PC: @@ -563,11 +558,8 @@ inline bytesConstRef VM::go(ExtVMFace& _ext, OnOpFunc const& _onOp, uint64_t _st case Instruction::GASPRICE: m_stack.push_back(_ext.gasPrice); break; - case Instruction::PREVHASH: - if (c_protocolVersion > 49) - m_stack.back() = (u256)_ext.prevhash(m_stack.back()); - else - m_stack.push_back(_ext.previousBlock.hash); + case Instruction::BLOCKHASH: + m_stack.back() = (u256)_ext.prevhash(m_stack.back()); break; case Instruction::COINBASE: m_stack.push_back((u160)_ext.currentBlock.coinbaseAddress); @@ -784,7 +776,7 @@ inline bytesConstRef VM::go(ExtVMFace& _ext, OnOpFunc const& _onOp, uint64_t _st unsigned initSize = (unsigned)m_stack.back(); m_stack.pop_back(); - if (_ext.balance(_ext.myAddress) >= endowment) + if (_ext.balance(_ext.myAddress) >= endowment && _ext.depth < 1024) { _ext.subBalance(endowment); m_stack.push_back((u160)_ext.create(endowment, m_gas, bytesConstRef(m_temp.data() + initOff, initSize), _onOp)); @@ -812,7 +804,7 @@ inline bytesConstRef VM::go(ExtVMFace& _ext, OnOpFunc const& _onOp, uint64_t _st unsigned outSize = (unsigned)m_stack.back(); m_stack.pop_back(); - if (_ext.balance(_ext.myAddress) >= value) + if (_ext.balance(_ext.myAddress) >= value && _ext.depth < 1024) { _ext.subBalance(value); m_stack.push_back(_ext.call(inst == Instruction::CALL ? receiveAddress : _ext.myAddress, value, bytesConstRef(m_temp.data() + inOff, inSize), gas, bytesRef(m_temp.data() + outOff, outSize), _onOp, {}, receiveAddress)); diff --git a/libevmcore/Instruction.cpp b/libevmcore/Instruction.cpp index b4a4d9f3b..bba3d7745 100644 --- a/libevmcore/Instruction.cpp +++ b/libevmcore/Instruction.cpp @@ -67,7 +67,7 @@ const std::map dev::eth::c_instructions = { "GASPRICE", Instruction::GASPRICE }, { "EXTCODESIZE", Instruction::EXTCODESIZE }, { "EXTCODECOPY", Instruction::EXTCODECOPY }, - { "PREVHASH", Instruction::PREVHASH }, + { "BLOCKHASH", Instruction::BLOCKHASH }, { "COINBASE", Instruction::COINBASE }, { "TIMESTAMP", Instruction::TIMESTAMP }, { "NUMBER", Instruction::NUMBER }, @@ -200,7 +200,7 @@ static const std::map c_instructionInfo = { Instruction::GASPRICE, { "GASPRICE", 0, 0, 1, false } }, { Instruction::EXTCODESIZE, { "EXTCODESIZE", 0, 1, 1, false } }, { Instruction::EXTCODECOPY, { "EXTCODECOPY", 0, 4, 0, true } }, - { Instruction::PREVHASH, { "PREVHASH", 0, 0, 1, false } }, + { Instruction::BLOCKHASH, { "BLOCKHASH", 0, 1, 1, false } }, { Instruction::COINBASE, { "COINBASE", 0, 0, 1, false } }, { Instruction::TIMESTAMP, { "TIMESTAMP", 0, 0, 1, false } }, { Instruction::NUMBER, { "NUMBER", 0, 0, 1, false } }, diff --git a/libevmcore/Instruction.h b/libevmcore/Instruction.h index 555dbf0ea..a28e8f8da 100644 --- a/libevmcore/Instruction.h +++ b/libevmcore/Instruction.h @@ -73,7 +73,7 @@ enum class Instruction: uint8_t EXTCODESIZE, ///< get external code size (from another contract) EXTCODECOPY, ///< copy external code (from another contract) - PREVHASH = 0x40, ///< get hash of most recent complete block + BLOCKHASH = 0x40, ///< get hash of most recent complete block COINBASE, ///< get the block's coinbase address TIMESTAMP, ///< get the block's timestamp NUMBER, ///< get the block's number diff --git a/libp2p/Host.cpp b/libp2p/Host.cpp index 73fabe7f2..bdb72985c 100644 --- a/libp2p/Host.cpp +++ b/libp2p/Host.cpp @@ -276,15 +276,15 @@ void Host::determinePublic(string const& _publicAddress, bool _upnp) // if user supplied address is a public address then we use it // if user supplied address is private, and localnetworking is enabled, we use it - bi::address reqpublicaddr(bi::address(_publicAddress.empty() ? bi::address() : bi::address::from_string(_publicAddress))); - bi::tcp::endpoint reqpublic(reqpublicaddr, m_listenPort); - bool isprivate = isPrivateAddress(reqpublicaddr); - bool ispublic = !isprivate && !isLocalHostAddress(reqpublicaddr); - if (!reqpublicaddr.is_unspecified() && (ispublic || (isprivate && m_netPrefs.localNetworking))) + bi::address reqPublicAddr(bi::address(_publicAddress.empty() ? bi::address() : bi::address::from_string(_publicAddress))); + bi::tcp::endpoint reqPublic(reqPublicAddr, m_listenPort); + bool isprivate = isPrivateAddress(reqPublicAddr); + bool ispublic = !isprivate && !isLocalHostAddress(reqPublicAddr); + if (!reqPublicAddr.is_unspecified() && (ispublic || (isprivate && m_netPrefs.localNetworking))) { - if (!m_peerAddresses.count(reqpublicaddr)) - m_peerAddresses.insert(reqpublicaddr); - m_tcpPublic = reqpublic; + if (!m_peerAddresses.count(reqPublicAddr)) + m_peerAddresses.insert(reqPublicAddr); + m_tcpPublic = reqPublic; return; } @@ -311,7 +311,7 @@ void Host::determinePublic(string const& _publicAddress, bool _upnp) } // or if no address provided, use private ipv4 address if local networking is enabled - if (reqpublicaddr.is_unspecified()) + if (reqPublicAddr.is_unspecified()) if (m_netPrefs.localNetworking) for (auto addr: m_peerAddresses) if (addr.is_v4() && isPrivateAddress(addr)) diff --git a/libp2p/NodeTable.cpp b/libp2p/NodeTable.cpp index 54c8c9f35..36dd77cb5 100644 --- a/libp2p/NodeTable.cpp +++ b/libp2p/NodeTable.cpp @@ -58,13 +58,13 @@ void NodeTable::join() doFindNode(m_node.id); } -std::list NodeTable::nodes() const +list NodeTable::nodes() const { - std::list nodes; + list nodes; Guard l(x_nodes); for (auto& i: m_nodes) nodes.push_back(i.second->id); - return std::move(nodes); + return move(nodes); } list NodeTable::state() const @@ -90,7 +90,7 @@ void NodeTable::requestNeighbors(NodeEntry const& _node, NodeId _target) const m_socketPtr->send(p); } -void NodeTable::doFindNode(NodeId _node, unsigned _round, std::shared_ptr>> _tried) +void NodeTable::doFindNode(NodeId _node, unsigned _round, shared_ptr>> _tried) { if (!m_socketPtr->isOpen() || _round == s_maxSteps) return; @@ -102,10 +102,10 @@ void NodeTable::doFindNode(NodeId _node, unsigned _round, std::shared_ptr>()); + _tried.reset(new set>()); auto nearest = findNearest(_node); - std::list> tried; + list> tried; for (unsigned i = 0; i < nearest.size() && tried.size() < s_alpha; i++) if (!_tried->count(nearest[i])) { @@ -138,14 +138,14 @@ void NodeTable::doFindNode(NodeId _node, unsigned _round, std::shared_ptr> NodeTable::findNearest(NodeId _target) +vector> NodeTable::findNearest(NodeId _target) { // send s_alpha FindNode packets to nodes we know, closest to target static unsigned lastBin = s_bins - 1; unsigned head = dist(m_node.id, _target); unsigned tail = head == 0 ? lastBin : (head - 1) % s_bins; - std::map>> found; + map>> found; unsigned count = 0; // if d is 0, then we roll look forward, if last, we reverse, else, spread from d @@ -205,11 +205,11 @@ std::vector> NodeTable::findNearest(NodeId _target) tail--; } - std::vector> ret; + vector> ret; for (auto& nodes: found) for (auto n: nodes.second) ret.push_back(n); - return std::move(ret); + return move(ret); } void NodeTable::ping(bi::udp::endpoint _to) const @@ -225,7 +225,7 @@ void NodeTable::ping(NodeEntry* _n) const ping(_n->endpoint.udp); } -void NodeTable::evict(std::shared_ptr _leastSeen, std::shared_ptr _new) +void NodeTable::evict(shared_ptr _leastSeen, shared_ptr _new) { if (!m_socketPtr->isOpen()) return; @@ -245,7 +245,7 @@ void NodeTable::noteNode(Public const& _pubk, bi::udp::endpoint const& _endpoint if (_pubk == m_node.address()) return; - std::shared_ptr node; + shared_ptr node; { Guard l(x_nodes); auto n = m_nodes.find(_pubk); @@ -267,13 +267,13 @@ void NodeTable::noteNode(Public const& _pubk, bi::udp::endpoint const& _endpoint noteNode(node); } -void NodeTable::noteNode(std::shared_ptr _n) +void NodeTable::noteNode(shared_ptr _n) { - std::shared_ptr contested; + shared_ptr contested; { NodeBucket& s = bucket(_n.get()); Guard l(x_state); - s.nodes.remove_if([&_n](std::weak_ptr n) + s.nodes.remove_if([&_n](weak_ptr n) { if (n.lock() == _n) return true; @@ -297,12 +297,12 @@ void NodeTable::noteNode(std::shared_ptr _n) evict(contested, _n); } -void NodeTable::dropNode(std::shared_ptr _n) +void NodeTable::dropNode(shared_ptr _n) { NodeBucket &s = bucket(_n.get()); { Guard l(x_state); - s.nodes.remove_if([&_n](std::weak_ptr n) { return n.lock() == _n; }); + s.nodes.remove_if([&_n](weak_ptr n) { return n.lock() == _n; }); } Guard l(x_nodes); m_nodes.erase(_n->id); @@ -368,7 +368,7 @@ void NodeTable::onReceived(UDPSocketFace*, bi::udp::endpoint const& _from, bytes // clog(NodeTableMessageSummary) << "Received FindNode from " << _from.address().to_string() << ":" << _from.port(); FindNode in = FindNode::fromBytesConstRef(_from, rlpBytes); - std::vector> nearest = findNearest(in.target); + vector> nearest = findNearest(in.target); static unsigned const nlimit = (m_socketPtr->maxDatagramSize - 11) / 86; for (unsigned offset = 0; offset < nearest.size(); offset += nlimit) { @@ -415,7 +415,7 @@ void NodeTable::doCheckEvictions(boost::system::error_code const& _ec) return; bool evictionsRemain = false; - std::list> drop; + list> drop; { Guard le(x_evictions); Guard ln(x_nodes); diff --git a/libp2p/UDP.h b/libp2p/UDP.h index 8e732d3ff..d9d6acc91 100644 --- a/libp2p/UDP.h +++ b/libp2p/UDP.h @@ -140,13 +140,13 @@ protected: bi::udp::endpoint m_endpoint; ///< Endpoint which we listen to. Mutex x_sendQ; - std::deque sendQ; ///< Queue for egress data. - std::array recvData; ///< Buffer for ingress data. - bi::udp::endpoint recvEndpoint; ///< Endpoint data was received from. + std::deque m_sendQ; ///< Queue for egress data. + std::array m_recvData; ///< Buffer for ingress data. + bi::udp::endpoint m_recvEndpoint; ///< Endpoint data was received from. bi::udp::socket m_socket; ///< Boost asio udp socket. Mutex x_socketError; ///< Mutex for error which can be set from host or IO thread. - boost::system::error_code socketError; ///< Set when shut down due to error. + boost::system::error_code m_socketError; ///< Set when shut down due to error. }; template @@ -161,7 +161,7 @@ void UDPSocket::connect() // clear write queue so reconnect doesn't send stale messages Guard l(x_sendQ); - sendQ.clear(); + m_sendQ.clear(); m_closed = false; doRead(); @@ -174,8 +174,8 @@ bool UDPSocket::send(UDPDatagram const& _datagram) return false; Guard l(x_sendQ); - sendQ.push_back(_datagram); - if (sendQ.size() == 1) + m_sendQ.push_back(_datagram); + if (m_sendQ.size() == 1) doWrite(); return true; @@ -188,13 +188,13 @@ void UDPSocket::doRead() return; auto self(UDPSocket::shared_from_this()); - m_socket.async_receive_from(boost::asio::buffer(recvData), recvEndpoint, [this, self](boost::system::error_code _ec, size_t _len) + m_socket.async_receive_from(boost::asio::buffer(m_recvData), m_recvEndpoint, [this, self](boost::system::error_code _ec, size_t _len) { if (_ec) return disconnectWithError(_ec); assert(_len); - m_host.onReceived(this, recvEndpoint, bytesConstRef(recvData.data(), _len)); + m_host.onReceived(this, m_recvEndpoint, bytesConstRef(m_recvData.data(), _len)); doRead(); }); } @@ -205,7 +205,7 @@ void UDPSocket::doWrite() if (m_closed) return; - const UDPDatagram& datagram = sendQ[0]; + const UDPDatagram& datagram = m_sendQ[0]; auto self(UDPSocket::shared_from_this()); m_socket.async_send_to(boost::asio::buffer(datagram.data), datagram.endpoint(), [this, self](boost::system::error_code _ec, std::size_t) { @@ -214,8 +214,8 @@ void UDPSocket::doWrite() else { Guard l(x_sendQ); - sendQ.pop_front(); - if (sendQ.empty()) + m_sendQ.pop_front(); + if (m_sendQ.empty()) return; } doWrite(); @@ -233,9 +233,9 @@ void UDPSocket::disconnectWithError(boost::system::erro { // disconnect-operation following prior non-zero errors are ignored Guard l(x_socketError); - if (socketError != boost::system::error_code()) + if (m_socketError != boost::system::error_code()) return; - socketError = _ec; + m_socketError = _ec; } // TODO: (if non-zero error) schedule high-priority writes diff --git a/libserpent/opcodes.cpp b/libserpent/opcodes.cpp index b24144e46..2fc7d7530 100644 --- a/libserpent/opcodes.cpp +++ b/libserpent/opcodes.cpp @@ -44,7 +44,7 @@ Mapping mapping[] = { Mapping("GASPRICE", 0x3a, 0, 1), Mapping("EXTCODESIZE", 0x3b, 1, 1), Mapping("EXTCODECOPY", 0x3c, 4, 0), - Mapping("PREVHASH", 0x40, 0, 1), + Mapping("BLOCKHASH", 0x40, 1, 1), Mapping("COINBASE", 0x41, 0, 1), Mapping("TIMESTAMP", 0x42, 0, 1), Mapping("NUMBER", 0x43, 0, 1), diff --git a/libsolidity/ExpressionCompiler.cpp b/libsolidity/ExpressionCompiler.cpp index cf641935a..6bf14f559 100644 --- a/libsolidity/ExpressionCompiler.cpp +++ b/libsolidity/ExpressionCompiler.cpp @@ -344,9 +344,9 @@ void ExpressionCompiler::endVisit(MemberAccess const& _memberAccess) m_context << eth::Instruction::COINBASE; else if (member == "timestamp") m_context << eth::Instruction::TIMESTAMP; - else if (member == "prevhash") - m_context << eth::Instruction::PREVHASH; - else if (member == "difficulty") +/* else if (member == "blockhash") + m_context << eth::Instruction::BLOCKHASH; +*/ else if (member == "difficulty") m_context << eth::Instruction::DIFFICULTY; else if (member == "number") m_context << eth::Instruction::NUMBER; diff --git a/libsolidity/SourceReferenceFormatter.h b/libsolidity/SourceReferenceFormatter.h index 8e3f126f0..98f1c745d 100644 --- a/libsolidity/SourceReferenceFormatter.h +++ b/libsolidity/SourceReferenceFormatter.h @@ -28,7 +28,7 @@ namespace dev { -class Exception; // forward +struct Exception; // forward namespace solidity { diff --git a/mix/AppContext.cpp b/mix/AppContext.cpp index 89f2849cd..6c48e9be1 100644 --- a/mix/AppContext.cpp +++ b/mix/AppContext.cpp @@ -26,12 +26,15 @@ #include #include #include -#include "libdevcrypto/FileSystem.h" +#include +#include +#include #include "KeyEventManager.h" #include "AppContext.h" using namespace dev; -using namespace dev::mix; using namespace dev::eth; +using namespace dev::solidity; +using namespace dev::mix; AppContext* AppContext::Instance = nullptr; @@ -40,6 +43,7 @@ AppContext::AppContext(QQmlApplicationEngine* _engine) m_applicationEngine = std::unique_ptr(_engine); m_keyEventManager = std::unique_ptr(new KeyEventManager()); m_webThree = std::unique_ptr(new WebThreeDirect(std::string("Mix/v") + dev::Version + "/" DEV_QUOTED(ETH_BUILD_TYPE) "/" DEV_QUOTED(ETH_BUILD_PLATFORM), getDataDir() + "/Mix", false, {"eth", "shh"})); + m_compiler = std::unique_ptr(new CompilerStack()); //TODO : to move in a codel model structure. } QQmlApplicationEngine* AppContext::appEngine() @@ -47,11 +51,6 @@ QQmlApplicationEngine* AppContext::appEngine() return m_applicationEngine.get(); } -dev::eth::Client* AppContext::getEthereumClient() -{ - return m_webThree->ethereum(); -} - void AppContext::initKeyEventManager(QObject* _res) { QObject* mainContent = _res->findChild("mainContent", Qt::FindChildrenRecursively); @@ -66,6 +65,11 @@ KeyEventManager* AppContext::getKeyEventManager() return m_keyEventManager.get(); } +CompilerStack* AppContext::compiler() +{ + return m_compiler.get(); +} + void AppContext::setApplicationContext(QQmlApplicationEngine* _engine) { if (Instance == nullptr) @@ -74,9 +78,9 @@ void AppContext::setApplicationContext(QQmlApplicationEngine* _engine) void AppContext::displayMessageDialog(QString _title, QString _message) { - QObject* dialogWin = m_applicationEngine.get()->rootObjects().at(0)->findChild("alertMessageDialog", Qt::FindChildrenRecursively); - QObject* dialogWinComponent = m_applicationEngine.get()->rootObjects().at(0)->findChild("alertMessageDialogContent", Qt::FindChildrenRecursively); - QMetaObject::invokeMethod(dialogWin, "close"); + // TODO : move to a UI dedicated layer. + QObject* dialogWin = m_applicationEngine->rootObjects().at(0)->findChild("alertMessageDialog", Qt::FindChildrenRecursively); + QObject* dialogWinComponent = m_applicationEngine->rootObjects().at(0)->findChild("alertMessageDialogContent", Qt::FindChildrenRecursively); dialogWinComponent->setProperty("source", QString("qrc:/qml/BasicMessage.qml")); dialogWin->setProperty("title", _title); dialogWin->setProperty("width", "250"); diff --git a/mix/AppContext.h b/mix/AppContext.h index baa2905ba..4419633ed 100644 --- a/mix/AppContext.h +++ b/mix/AppContext.h @@ -27,28 +27,48 @@ #pragma once +#include #include -#include "libwebthree/WebThree.h" +#include +#include #include "KeyEventManager.h" +namespace dev +{ + class WebThreeDirect; + namespace solidity + { + class CompilerStack; + } +} + namespace dev { namespace mix { +/** + * @brief Provides access to application scope variable. + */ class AppContext: public QObject { Q_OBJECT public: AppContext(QQmlApplicationEngine* _engine); - ~AppContext() {} + /// Get the current QQmlApplicationEngine instance. static AppContext* getInstance() { return Instance; } + /// Renew QQMLApplicationEngine with a new instance. static void setApplicationContext(QQmlApplicationEngine* _engine); + /// Get the current QQMLApplicationEngine instance. QQmlApplicationEngine* appEngine(); - dev::eth::Client* getEthereumClient(); + /// Initialize KeyEventManager (used to handle key pressed event). void initKeyEventManager(QObject* _obj); + /// Get the current KeyEventManager instance. KeyEventManager* getKeyEventManager(); + /// Get the current Compiler instance (used to parse and compile contract code). + dev::solidity::CompilerStack* compiler(); + /// Display an alert message. void displayMessageDialog(QString _title, QString _message); private: @@ -56,12 +76,14 @@ private: std::unique_ptr m_applicationEngine; std::unique_ptr m_webThree; std::unique_ptr m_keyEventManager; + std::unique_ptr m_compiler; public slots: + /// Delete the current instance when application quit. void quitApplication() { delete Instance; } + /// Initialize components after the loading of the main QML view. void resourceLoaded(QObject* _obj, QUrl _url) { Q_UNUSED(_url); initKeyEventManager(_obj); } }; } - } diff --git a/mix/AssemblyDebuggerControl.cpp b/mix/AssemblyDebuggerControl.cpp new file mode 100644 index 000000000..a3270fed7 --- /dev/null +++ b/mix/AssemblyDebuggerControl.cpp @@ -0,0 +1,171 @@ +/* + 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 AssemblyDebuggerControl.cpp + * @author Yann yann@ethdev.com + * @date 2014 + * display opcode debugging. + */ + +#include +#include +#include +#include +#include +#include +#include +#include "AssemblyDebuggerModel.h" +#include "AssemblyDebuggerControl.h" +#include "KeyEventManager.h" +#include "AppContext.h" +#include "DebuggingStateWrapper.h" +#include "TransactionListModel.h" +#include "QContractDefinition.h" +#include "QVariableDeclaration.h" +#include "ContractCallDataEncoder.h" +using namespace dev::eth; +using namespace dev::mix; + +AssemblyDebuggerControl::AssemblyDebuggerControl(QTextDocument* _doc): Extension(ExtensionDisplayBehavior::ModalDialog) +{ + qRegisterMetaType("QVariableDefinition*"); + qRegisterMetaType("QVariableDefinitionList*"); + qRegisterMetaType>("QList"); + qRegisterMetaType>("QList"); + qRegisterMetaType("QVariableDeclaration*"); + qRegisterMetaType("AssemblyDebuggerData"); + qRegisterMetaType("DebuggingStatusResult"); + + connect(this, SIGNAL(dataAvailable(bool, DebuggingStatusResult, QList, QList, AssemblyDebuggerData)), + this, SLOT(updateGUI(bool, DebuggingStatusResult, QList, QList, AssemblyDebuggerData)), Qt::QueuedConnection); + + m_modelDebugger = std::unique_ptr(new AssemblyDebuggerModel); + m_compilation = std::unique_ptr(new ConstantCompilationModel); + m_doc = _doc; +} + +QString AssemblyDebuggerControl::contentUrl() const +{ + return QStringLiteral("qrc:/qml/Debugger.qml"); +} + +QString AssemblyDebuggerControl::title() const +{ + return QApplication::tr("debugger"); +} + +void AssemblyDebuggerControl::start() const +{ + //start to listen on F5 + m_ctx->getKeyEventManager()->registerEvent(this, SLOT(keyPressed(int))); +} + +void AssemblyDebuggerControl::keyPressed(int _key) +{ + if (_key == Qt::Key_F5) + { + QtConcurrent::run([this]() + { + deployContract(m_doc->toPlainText()); + }); + } + else if (_key == Qt::Key_F6) + { + m_modelDebugger->resetState(); + AppContext::getInstance()->displayMessageDialog(QApplication::tr("State status"), QApplication::tr("State reseted ... need to redeploy contract")); + } +} + +void AssemblyDebuggerControl::callContract(TransactionSettings _tr, dev::Address _contract) +{ + CompilerResult compilerRes = m_compilation->compile(m_doc->toPlainText()); + if (!compilerRes.success) + AppContext::getInstance()->displayMessageDialog("debugger","compilation failed"); + else + { + ContractCallDataEncoder c; + std::shared_ptr contractDef = QContractDefinition::Contract(m_doc->toPlainText()); + QFunctionDefinition* f = nullptr; + for (int k = 0; k < contractDef->functions().size(); k++) + { + if (contractDef->functions().at(k)->name() == _tr.functionId) + { + f = (QFunctionDefinition*)contractDef->functions().at(k); + break; + } + } + if (!f) + AppContext::getInstance()->displayMessageDialog(QApplication::tr("debugger"), QApplication::tr("function not found. Please redeploy this contract.")); + else + { + c.encode(f->index()); + for (int k = 0; k < f->parameters().size(); k++) + { + QVariableDeclaration* var = (QVariableDeclaration*)f->parameters().at(k); + c.encode(var, _tr.parameterValues[var->name()]); + } + DebuggingContent debuggingContent = m_modelDebugger->callContract(_contract, c.encodedData(), _tr); + debuggingContent.returnParameters = c.decode(f->returnParameters(), debuggingContent.returnValue); + finalizeExecution(debuggingContent); + } + } +} + +void AssemblyDebuggerControl::deployContract(QString _source) +{ + CompilerResult compilerRes = m_compilation->compile(_source); + if (!compilerRes.success) + emit dataAvailable(false, DebuggingStatusResult::Compilationfailed); + else + { + m_previousDebugResult = m_modelDebugger->deployContract(compilerRes.bytes); + finalizeExecution(m_previousDebugResult); + } +} + +void AssemblyDebuggerControl::finalizeExecution(DebuggingContent _debuggingContent) +{ + //we need to wrap states in a QObject before sending to QML. + QList wStates; + for(int i = 0; i < _debuggingContent.machineStates.size(); i++) + { + QPointer s(new DebuggingStateWrapper(_debuggingContent.executionCode, _debuggingContent.executionData.toBytes())); + s->setState(_debuggingContent.machineStates.at(i)); + wStates.append(s); + } + AssemblyDebuggerData code = DebuggingStateWrapper::getHumanReadableCode(_debuggingContent.executionCode); + emit dataAvailable(true, DebuggingStatusResult::Ok, _debuggingContent.returnParameters, wStates, code); +} + +void AssemblyDebuggerControl::updateGUI(bool _success, DebuggingStatusResult const& _reason, QList const& _returnParam, QList const& _wStates, AssemblyDebuggerData const& _code) +{ + Q_UNUSED(_reason); + if (_success) + { + m_appEngine->rootContext()->setContextProperty("debugStates", QVariant::fromValue(_wStates)); + m_appEngine->rootContext()->setContextProperty("humanReadableExecutionCode", QVariant::fromValue(std::get<0>(_code))); + m_appEngine->rootContext()->setContextProperty("bytesCodeMapping", QVariant::fromValue(std::get<1>(_code))); + m_appEngine->rootContext()->setContextProperty("contractCallReturnParameters", QVariant::fromValue(new QVariableDefinitionList(_returnParam))); + this->addContentOn(this); + } + else + m_ctx->displayMessageDialog(QApplication::tr("debugger"), QApplication::tr("compilation failed")); +} + +void AssemblyDebuggerControl::runTransaction(TransactionSettings const& _tr) +{ + QtConcurrent::run([this, _tr]() + { + callContract(_tr, m_previousDebugResult.contractAddress); + }); +} diff --git a/mix/AssemblyDebuggerControl.h b/mix/AssemblyDebuggerControl.h new file mode 100644 index 000000000..702839250 --- /dev/null +++ b/mix/AssemblyDebuggerControl.h @@ -0,0 +1,84 @@ +/* + 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 AssemblyDebuggerControl.h + * @author Yann yann@ethdev.com + * @date 2014 + * Extension which display debugging steps in assembly code. + */ + +#pragma once + +#include +#include +#include "Extension.h" +#include "ConstantCompilationModel.h" +#include "TransactionListModel.h" +#include "AssemblyDebuggerModel.h" +#include "AppContext.h" + +using AssemblyDebuggerData = std::tuple, dev::mix::QQMLMap*>; +enum DebuggingStatusResult +{ + Ok, + Compilationfailed +}; + +Q_DECLARE_METATYPE(AssemblyDebuggerData) +Q_DECLARE_METATYPE(DebuggingStatusResult) +Q_DECLARE_METATYPE(dev::mix::DebuggingContent) + +namespace dev +{ +namespace mix +{ + +/** + * @brief Extension which display transaction creation or transaction call debugging. handle: F5 to deploy contract, F6 to reset state. + */ +class AssemblyDebuggerControl: public Extension +{ + Q_OBJECT + +public: + AssemblyDebuggerControl(QTextDocument* _doc); + ~AssemblyDebuggerControl() {} + void start() const override; + QString title() const override; + QString contentUrl() const override; + +private: + void deployContract(QString _source); + void callContract(TransactionSettings _tr, Address _contract); + void finalizeExecution(DebuggingContent _content); + + std::unique_ptr m_modelDebugger; + std::unique_ptr m_compilation; + DebuggingContent m_previousDebugResult; //TODO: to be replaced in a more consistent struct. Used for now to keep the contract address in case of future transaction call. + QTextDocument* m_doc; + +public slots: + /// Handle key pressed. F5 deploy contract - F6 reset state. + void keyPressed(int); + /// Update UI with machine states result. Display a modal dialog. + void updateGUI(bool _success, DebuggingStatusResult const& _reason, QList const& _returnParams = QList(), QList const& _wStates = QList(), AssemblyDebuggerData const& _code = AssemblyDebuggerData()); + /// Run the given transaction. + void runTransaction(TransactionSettings const& _tr); + +signals: + /// Emited when machine states are available. + void dataAvailable(bool _success, DebuggingStatusResult const& _reason, QList const& _returnParams = QList(), QList const& _wStates = QList(), AssemblyDebuggerData const& _code = AssemblyDebuggerData()); +}; + +} +} diff --git a/mix/AssemblyDebuggerCtrl.cpp b/mix/AssemblyDebuggerCtrl.cpp deleted file mode 100644 index e955dfd23..000000000 --- a/mix/AssemblyDebuggerCtrl.cpp +++ /dev/null @@ -1,103 +0,0 @@ -/* - 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 AssemblyDebuggerCtrl.h - * @author Yann yann@ethdev.com - * @date 2014 - * display opcode debugging. - */ - -#include -#include -#include -#include -#include "libethereum/Transaction.h" -#include "AssemblyDebuggerModel.h" -#include "AssemblyDebuggerCtrl.h" -#include "TransactionBuilder.h" -#include "KeyEventManager.h" -#include "AppContext.h" -#include "DebuggingStateWrapper.h" -using namespace dev::mix; - -AssemblyDebuggerCtrl::AssemblyDebuggerCtrl(QTextDocument* _doc): Extension(ExtensionDisplayBehavior::ModalDialog) -{ - qRegisterMetaType(); - qRegisterMetaType(); - connect(this, SIGNAL(dataAvailable(bool, DebuggingStatusResult, QList, AssemblyDebuggerData)), - this, SLOT(updateGUI(bool, DebuggingStatusResult, QList, AssemblyDebuggerData)), Qt::QueuedConnection); - m_modelDebugger = std::unique_ptr(new AssemblyDebuggerModel); - m_doc = _doc; -} - -QString AssemblyDebuggerCtrl::contentUrl() const -{ - return QStringLiteral("qrc:/qml/Debugger.qml"); -} - -QString AssemblyDebuggerCtrl::title() const -{ - return QApplication::tr("debugger"); -} - -void AssemblyDebuggerCtrl::start() const -{ - //start to listen on F5 - m_ctx->getKeyEventManager()->registerEvent(this, SLOT(keyPressed(int))); -} - -void AssemblyDebuggerCtrl::keyPressed(int _key) -{ - if (_key == Qt::Key_F5) - { - QString code = m_doc->toPlainText(); - QtConcurrent::run([this, code]() - { - if (!m_modelDebugger->compile(m_doc->toPlainText())) - { - emit dataAvailable(false, DebuggingStatusResult::Compilationfailed); - return; - } - - u256 gasPrice = 10000000000000; - u256 gas = 1000000; - u256 amount = 100; - 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; - for(int i = 0; i < debuggingContent.states.size(); i++) - { - DebuggingStateWrapper* s = new DebuggingStateWrapper(debuggingContent.executionCode, debuggingContent.executionData.toBytes(), this); - s->setState(debuggingContent.states.at(i)); - wStates.append(s); - } - AssemblyDebuggerData code = DebuggingStateWrapper::getHumanReadableCode(debuggingContent.executionCode, this); - emit dataAvailable(true, DebuggingStatusResult::Ok, wStates, code); - }); - } -} - -void AssemblyDebuggerCtrl::updateGUI(bool success, DebuggingStatusResult reason, QList _wStates, AssemblyDebuggerData _code) -{ - Q_UNUSED(reason); - if (success) - { - m_appEngine->rootContext()->setContextProperty("debugStates", QVariant::fromValue(_wStates)); - m_appEngine->rootContext()->setContextProperty("humanReadableExecutionCode", QVariant::fromValue(std::get<0>(_code))); - m_appEngine->rootContext()->setContextProperty("bytesCodeMapping", QVariant::fromValue(std::get<1>(_code))); - this->addContentOn(this); - } - else - m_ctx->displayMessageDialog(QApplication::tr("debugger"), QApplication::tr("compilation failed")); -} diff --git a/mix/AssemblyDebuggerCtrl.h b/mix/AssemblyDebuggerCtrl.h deleted file mode 100644 index e94cc4ce9..000000000 --- a/mix/AssemblyDebuggerCtrl.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - 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 AssemblyDebuggerCtrl.h - * @author Yann yann@ethdev.com - * @date 2014 - * Ethereum IDE client. - */ - -#pragma once - -#include -#include "QTextDocument" -#include "Extension.h" -#include "ConstantCompilationModel.h" -#include "AssemblyDebuggerModel.h" -#include "AppContext.h" - -using AssemblyDebuggerData = std::tuple, dev::mix::QQMLMap*>; -enum DebuggingStatusResult -{ - Ok, - Compilationfailed -}; - -Q_DECLARE_METATYPE(AssemblyDebuggerData) -Q_DECLARE_METATYPE(DebuggingStatusResult) - -namespace dev -{ -namespace mix -{ - -class AssemblyDebuggerCtrl: public Extension -{ - Q_OBJECT - -public: - AssemblyDebuggerCtrl(QTextDocument*); - ~AssemblyDebuggerCtrl() {} - void start() const override; - QString title() const override; - QString contentUrl() const override; - -private: - std::unique_ptr m_modelDebugger; - QTextDocument* m_doc; - -public slots: - void keyPressed(int); - void updateGUI(bool success, DebuggingStatusResult reason, QList _wStates = QList(), AssemblyDebuggerData _code = AssemblyDebuggerData()); - -signals: - void dataAvailable(bool success, DebuggingStatusResult reason, QList _wStates = QList(), AssemblyDebuggerData _code = AssemblyDebuggerData()); - -}; - -} - -} diff --git a/mix/AssemblyDebuggerModel.cpp b/mix/AssemblyDebuggerModel.cpp index 17abf5700..354d0bd1e 100644 --- a/mix/AssemblyDebuggerModel.cpp +++ b/mix/AssemblyDebuggerModel.cpp @@ -11,7 +11,7 @@ You should have received a copy of the GNU General Public License along with cpp-ethereum. If not, see . */ -/** @file AssemblyDebuggerModel.h +/** @file AssemblyDebuggerModel.cpp * @author Yann yann@ethdev.com * @date 2014 * used as a model to debug contract assembly code. @@ -24,7 +24,7 @@ #include #include #include "AppContext.h" -#include "TransactionBuilder.h" +#include "TransactionListModel.h" #include "AssemblyDebuggerModel.h" #include "ConstantCompilationModel.h" #include "DebuggingStateWrapper.h" @@ -38,15 +38,14 @@ AssemblyDebuggerModel::AssemblyDebuggerModel(): m_baseState(Address(), m_overlayDB, BaseState::Empty) { m_baseState.addBalance(m_userAccount.address(), 10000000 * ether); + m_executiveState = m_baseState; m_currentExecution = std::unique_ptr(new Executive(m_executiveState, LastHashes(), 0)); } -DebuggingContent AssemblyDebuggerModel::getContractInitiationDebugStates(dev::bytesConstRef _rawTransaction) +DebuggingContent AssemblyDebuggerModel::executeTransaction(bytesConstRef const& _rawTransaction) { - // Reset the state back to our clean premine. - m_executiveState = m_baseState; - - QList states; + QList machineStates; + m_currentExecution.reset(new Executive(m_executiveState, LastHashes(), 0)); m_currentExecution->setup(_rawTransaction); std::vector levels; bytes code; @@ -65,21 +64,21 @@ DebuggingContent AssemblyDebuggerModel::getContractInitiationDebugStates(dev::by } if (levels.size() < ext.depth) - levels.push_back(&states.back()); + levels.push_back(&machineStates.back()); else levels.resize(ext.depth); - states.append(DebuggingState({steps, ext.myAddress, vm.curPC(), inst, newMemSize, vm.gas(), + machineStates.append(DebuggingState({steps, ext.myAddress, vm.curPC(), inst, newMemSize, vm.gas(), vm.stack(), vm.memory(), gasCost, ext.state().storage(ext.myAddress), levels})); }; - m_currentExecution->go(onOp); - cdebug << states.size(); m_currentExecution->finalize(onOp); + m_executiveState.completeMine(); DebuggingContent d; - d.states = states; + d.returnValue = m_currentExecution->out().toVector(); + d.machineStates = machineStates; d.executionCode = code; d.executionData = data; d.contentAvailable = true; @@ -87,34 +86,32 @@ DebuggingContent AssemblyDebuggerModel::getContractInitiationDebugStates(dev::by return d; } -DebuggingContent AssemblyDebuggerModel::getContractInitiationDebugStates( - dev::u256 _value, - dev::u256 _gasPrice, - dev::u256 _gas, - QString _code -) +DebuggingContent AssemblyDebuggerModel::deployContract(bytes const& _code) { - ConstantCompilationModel compiler; - CompilerResult res = compiler.compile(_code); - if (!res.success) - { - DebuggingContent r; - r.contentAvailable = false; - r.message = QApplication::tr("compilation failed"); - return r; - } + u256 gasPrice = 10000000000000; + u256 gas = 1000000; + u256 amount = 100; + Transaction _tr(amount, gasPrice, min(gas, m_baseState.gasLimitRemaining()), _code, m_executiveState.transactionsFrom(dev::toAddress(m_userAccount.secret())), m_userAccount.secret()); + bytes b = _tr.rlp(); + dev::bytesConstRef bytesRef = &b; + DebuggingContent d = executeTransaction(bytesRef); + h256 th = sha3(rlpList(_tr.sender(), _tr.nonce())); + d.contractAddress = right160(th); + return d; +} - TransactionBuilder trBuild; - Transaction tr = trBuild.getCreationTransaction(_value, _gasPrice, min(_gas, m_baseState.gasLimitRemaining()), res.bytes, - m_executiveState.transactionsFrom(dev::toAddress(m_userAccount.secret())), m_userAccount.secret()); +DebuggingContent AssemblyDebuggerModel::callContract(Address const& _contract, bytes const& _data, TransactionSettings const& _tr) +{ + Transaction tr = Transaction(_tr.value, _tr.gasPrice, min(_tr.gas, m_baseState.gasLimitRemaining()), _contract, _data, m_executiveState.transactionsFrom(dev::toAddress(m_userAccount.secret())), m_userAccount.secret()); bytes b = tr.rlp(); dev::bytesConstRef bytesRef = &b; - return getContractInitiationDebugStates(bytesRef); + DebuggingContent d = executeTransaction(bytesRef); + d.contractAddress = tr.receiveAddress(); + return d; } -bool AssemblyDebuggerModel::compile(QString _code) +void AssemblyDebuggerModel::resetState() { - ConstantCompilationModel compiler; - CompilerResult res = compiler.compile(_code); - return res.success; + // Reset the state back to our clean premine. + m_executiveState = m_baseState; } diff --git a/mix/AssemblyDebuggerModel.h b/mix/AssemblyDebuggerModel.h index b6e0224e8..1b1254464 100644 --- a/mix/AssemblyDebuggerModel.h +++ b/mix/AssemblyDebuggerModel.h @@ -14,7 +14,7 @@ /** @file AssemblyDebuggerModel.h * @author Yann yann@ethdev.com * @date 2014 - * serves as a model to debug contract assembly code. + * Used as a model to debug contract assembly code. */ #pragma once @@ -26,6 +26,7 @@ #include #include #include "DebuggingStateWrapper.h" +#include "TransactionListModel.h" namespace dev { @@ -39,9 +40,12 @@ class AssemblyDebuggerModel { public: AssemblyDebuggerModel(); - DebuggingContent getContractInitiationDebugStates(u256, u256, u256, QString); - DebuggingContent getContractInitiationDebugStates(bytesConstRef); - bool compile(QString); + /// Call function in a already deployed contract. + DebuggingContent callContract(Address const& _contract, bytes const& _data, TransactionSettings const& _tr); + /// Deploy the contract described by _code. + DebuggingContent deployContract(bytes const& _code); + /// Reset state to the base state. + void resetState(); private: KeyPair m_userAccount; @@ -49,8 +53,8 @@ private: eth::State m_baseState; eth::State m_executiveState; std::unique_ptr m_currentExecution; + DebuggingContent executeTransaction(dev::bytesConstRef const& _rawTransaction); }; } - } diff --git a/mix/CodeEditorExtensionManager.cpp b/mix/CodeEditorExtensionManager.cpp index cfe8d03a9..6c94a805e 100644 --- a/mix/CodeEditorExtensionManager.cpp +++ b/mix/CodeEditorExtensionManager.cpp @@ -26,8 +26,9 @@ #include #include #include -#include "ConstantCompilationCtrl.h" -#include "AssemblyDebuggerCtrl.h" +#include "ConstantCompilationControl.h" +#include "AssemblyDebuggerControl.h" +#include "TransactionListView.h" #include "AppContext.h" #include "CodeEditorExtensionManager.h" using namespace dev::mix; @@ -48,7 +49,17 @@ void CodeEditorExtensionManager::loadEditor(QQuickItem* _editor) { QQuickTextDocument* qqdoc = doc.value(); if (qqdoc) + { m_doc = qqdoc->textDocument(); + auto args = QApplication::arguments(); + if (args.length() > 1) + { + QString path = args[1]; + QFile file(path); + if (file.exists() && file.open(QFile::ReadOnly)) + m_doc->setPlainText(file.readAll()); + } + } } } catch (...) @@ -59,8 +70,12 @@ void CodeEditorExtensionManager::loadEditor(QQuickItem* _editor) void CodeEditorExtensionManager::initExtensions() { - initExtension(std::make_shared(m_doc)); - initExtension(std::make_shared(m_doc)); + initExtension(std::make_shared(m_doc)); + std::shared_ptr debug = std::make_shared(m_doc); + std::shared_ptr tr = std::make_shared(m_doc); + QObject::connect(tr->model(), &TransactionListModel::transactionStarted, debug.get(), &AssemblyDebuggerControl::runTransaction); + initExtension(debug); + initExtension(tr); } void CodeEditorExtensionManager::initExtension(std::shared_ptr _ext) @@ -71,6 +86,8 @@ void CodeEditorExtensionManager::initExtension(std::shared_ptr _ext) { if (_ext->getDisplayBehavior() == ExtensionDisplayBehavior::Tab) _ext->addTabOn(m_tabView); + else if (_ext->getDisplayBehavior() == ExtensionDisplayBehavior::RightTab) + _ext->addTabOn(m_rightTabView); } catch (...) { @@ -88,6 +105,11 @@ void CodeEditorExtensionManager::setEditor(QQuickItem* _editor) this->initExtensions(); } +void CodeEditorExtensionManager::setRightTabView(QQuickItem* _tabView) +{ + m_rightTabView = _tabView; +} + void CodeEditorExtensionManager::setTabView(QQuickItem* _tabView) { m_tabView = _tabView; diff --git a/mix/CodeEditorExtensionManager.h b/mix/CodeEditorExtensionManager.h index 56b727af5..94a5f4b2e 100644 --- a/mix/CodeEditorExtensionManager.h +++ b/mix/CodeEditorExtensionManager.h @@ -22,40 +22,49 @@ #pragma once -#include "memory" #include #include #include -#include "ConstantCompilationCtrl.h" +#include "ConstantCompilationControl.h" namespace dev { namespace mix { +/** + * @brief Init and provides connection between extensions. + */ class CodeEditorExtensionManager: public QObject { Q_OBJECT Q_PROPERTY(QQuickItem* editor MEMBER m_editor WRITE setEditor) Q_PROPERTY(QQuickItem* tabView MEMBER m_tabView WRITE setTabView) + Q_PROPERTY(QQuickItem* rightTabView MEMBER m_rightTabView WRITE setRightTabView) public: CodeEditorExtensionManager() {} ~CodeEditorExtensionManager(); + /// Initialize all extensions. void initExtensions(); + /// Initialize extension. void initExtension(std::shared_ptr); + /// Set current text editor. void setEditor(QQuickItem*); + /// Set current tab view void setTabView(QQuickItem*); + /// Set current right tab view. + void setRightTabView(QQuickItem*); private: QQuickItem* m_editor; QVector> m_features; QQuickItem* m_tabView; + QQuickItem* m_rightTabView; QTextDocument* m_doc; - void loadEditor(QQuickItem*); + void loadEditor(QQuickItem* _editor); }; } - } diff --git a/mix/ConstantCompilationCtrl.cpp b/mix/ConstantCompilationControl.cpp similarity index 73% rename from mix/ConstantCompilationCtrl.cpp rename to mix/ConstantCompilationControl.cpp index cba453313..3082ba677 100644 --- a/mix/ConstantCompilationCtrl.cpp +++ b/mix/ConstantCompilationControl.cpp @@ -14,56 +14,58 @@ You should have received a copy of the GNU General Public License along with cpp-ethereum. If not, see . */ -/** @file ConstantCompilationCtrl.cpp +/** @file ConstantCompilationControl.cpp * @author Yann yann@ethdev.com * @date 2014 * Ethereum IDE client. */ +#include #include #include #include #include #include #include -#include "ConstantCompilationCtrl.h" +#include "ConstantCompilationControl.h" #include "ConstantCompilationModel.h" +#include "QContractDefinition.h" using namespace dev::mix; -ConstantCompilationCtrl::ConstantCompilationCtrl(QTextDocument* _doc): Extension(ExtensionDisplayBehavior::Tab) +ConstantCompilationControl::ConstantCompilationControl(QTextDocument* _doc): Extension(ExtensionDisplayBehavior::Tab) { m_editor = _doc; m_compilationModel = std::unique_ptr(new ConstantCompilationModel()); } -QString ConstantCompilationCtrl::contentUrl() const +QString ConstantCompilationControl::contentUrl() const { return QStringLiteral("qrc:/qml/BasicContent.qml"); } -QString ConstantCompilationCtrl::title() const +QString ConstantCompilationControl::title() const { return QApplication::tr("compiler"); } -void ConstantCompilationCtrl::start() const +void ConstantCompilationControl::start() const { connect(m_editor, SIGNAL(contentsChange(int,int,int)), this, SLOT(compile())); } -void ConstantCompilationCtrl::compile() +void ConstantCompilationControl::compile() { QString codeContent = m_editor->toPlainText().replace("\n", ""); if (codeContent.isEmpty()) - { resetOutPut(); - return; + else + { + CompilerResult res = m_compilationModel->compile(m_editor->toPlainText().replace("\t", " ")); + writeOutPut(res); } - CompilerResult res = m_compilationModel->compile(m_editor->toPlainText().replace("\t", " ")); - writeOutPut(res); } -void ConstantCompilationCtrl::resetOutPut() +void ConstantCompilationControl::resetOutPut() { QObject* status = m_view->findChild("status", Qt::FindChildrenRecursively); QObject* content = m_view->findChild("content", Qt::FindChildrenRecursively); @@ -71,7 +73,7 @@ void ConstantCompilationCtrl::resetOutPut() content->setProperty("text", ""); } -void ConstantCompilationCtrl::writeOutPut(CompilerResult const& _res) +void ConstantCompilationControl::writeOutPut(CompilerResult const& _res) { QObject* status = m_view->findChild("status", Qt::FindChildrenRecursively); QObject* content = m_view->findChild("content", Qt::FindChildrenRecursively); @@ -80,13 +82,11 @@ void ConstantCompilationCtrl::writeOutPut(CompilerResult const& _res) status->setProperty("text", "succeeded"); status->setProperty("color", "green"); content->setProperty("text", _res.hexCode); - qDebug() << QString(QApplication::tr("compile succeeded") + " " + _res.hexCode); } else { status->setProperty("text", "failure"); status->setProperty("color", "red"); content->setProperty("text", _res.comment); - qDebug() << QString(QApplication::tr("compile failed") + " " + _res.comment); } } diff --git a/mix/ConstantCompilationCtrl.h b/mix/ConstantCompilationControl.h similarity index 77% rename from mix/ConstantCompilationCtrl.h rename to mix/ConstantCompilationControl.h index 4e6aa53de..b2ffaadd3 100644 --- a/mix/ConstantCompilationCtrl.h +++ b/mix/ConstantCompilationControl.h @@ -11,7 +11,7 @@ You should have received a copy of the GNU General Public License along with cpp-ethereum. If not, see . */ -/** @file ConstantCompilationCtrl.h +/** @file ConstantCompilationControl.h * @author Yann yann@ethdev.com * @date 2014 * Ethereum IDE client. @@ -28,13 +28,16 @@ namespace dev namespace mix { -class ConstantCompilationCtrl: public Extension +/** + * @brief Extension which display assembly code of the contract being edited. + */ +class ConstantCompilationControl: public Extension { Q_OBJECT public: - ConstantCompilationCtrl(QTextDocument*); - ~ConstantCompilationCtrl() {} + ConstantCompilationControl(QTextDocument* _doc); + ~ConstantCompilationControl() {} void start() const override; QString title() const override; QString contentUrl() const override; @@ -42,13 +45,13 @@ public: private: QTextDocument* m_editor; std::unique_ptr m_compilationModel; - void writeOutPut(CompilerResult const&); + void writeOutPut(CompilerResult const& _res); void resetOutPut(); public slots: + /// Compile text editor content. void compile(); }; } - } diff --git a/mix/ConstantCompilationModel.cpp b/mix/ConstantCompilationModel.cpp index 8f761fa95..06141da26 100644 --- a/mix/ConstantCompilationModel.cpp +++ b/mix/ConstantCompilationModel.cpp @@ -24,13 +24,16 @@ #include #include #include +#include #include #include +#include #include "ConstantCompilationModel.h" using namespace std; using namespace dev; using namespace dev::eth; using namespace dev::mix; +using namespace dev::solidity; CompilerResult ConstantCompilationModel::compile(QString _code) { diff --git a/mix/ConstantCompilationModel.h b/mix/ConstantCompilationModel.h index 4c161ec09..a4c4f3de5 100644 --- a/mix/ConstantCompilationModel.h +++ b/mix/ConstantCompilationModel.h @@ -22,14 +22,18 @@ #pragma once -#include #include +#include +#include namespace dev { namespace mix { +/** + * @brief Provides compiler result information. + */ struct CompilerResult { QString hexCode; @@ -38,12 +42,16 @@ struct CompilerResult bool success; }; +/** + * @brief Compile source code using the solidity library. + */ class ConstantCompilationModel { public: ConstantCompilationModel() {} ~ConstantCompilationModel() {} + /// Compile code. CompilerResult compile(QString _code); }; diff --git a/mix/ContractCallDataEncoder.cpp b/mix/ContractCallDataEncoder.cpp new file mode 100644 index 000000000..b83a0c582 --- /dev/null +++ b/mix/ContractCallDataEncoder.cpp @@ -0,0 +1,131 @@ +/* + 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 ContractCallDataEncoder.cpp + * @author Yann yann@ethdev.com + * @date 2014 + * Ethereum IDE client. + */ + +#include +#include +#include +#include +#include +#include "QVariableDeclaration.h" +#include "QVariableDefinition.h" +#include "ContractCallDataEncoder.h" +using namespace dev; +using namespace dev::solidity; +using namespace dev::mix; + +bytes ContractCallDataEncoder::encodedData() +{ + return m_encodedData; +} + +void ContractCallDataEncoder::encode(int _functionIndex) +{ + bytes i = jsToBytes(std::to_string(_functionIndex)); + m_encodedData.insert(m_encodedData.end(), i.begin(), i.end()); +} + +void ContractCallDataEncoder::encode(QVariableDeclaration* _dec, bool _value) +{ + return encode(_dec, QString(formatBool(_value))); +} + +void ContractCallDataEncoder::encode(QVariableDeclaration* _dec, QString _value) +{ + int padding = this->padding(_dec->type()); + bytes data = padded(jsToBytes(_value.toStdString()), padding); + m_encodedData.insert(m_encodedData.end(), data.begin(), data.end()); +} + +void ContractCallDataEncoder::encode(QVariableDeclaration* _dec, u256 _value) +{ + int padding = this->padding(_dec->type()); + std::ostringstream s; + s << std::hex << "0x" << _value; + bytes data = padded(jsToBytes(s.str()), padding); + m_encodedData.insert(m_encodedData.end(), data.begin(), data.end()); + encodedData(); +} + +QList ContractCallDataEncoder::decode(QList _returnParameters, bytes _value) +{ + QList r; + std::string returnValue = toJS(_value); + returnValue = returnValue.substr(2, returnValue.length() - 1); + for (int k = 0; k <_returnParameters.length(); k++) + { + QVariableDeclaration* dec = (QVariableDeclaration*)_returnParameters.at(k); + int padding = this->padding(dec->type()); + std::string rawParam = returnValue.substr(0, padding * 2); + r.append(new QVariableDefinition(dec, convertToReadable(unpadLeft(rawParam), dec))); + returnValue = returnValue.substr(rawParam.length(), returnValue.length() - 1); + } + return r; +} + +int ContractCallDataEncoder::padding(QString type) +{ + // TODO : to be improved (load types automatically from solidity library). + if (type.indexOf("uint") != -1) + return integerPadding(type.remove("uint").toInt()); + else if (type.indexOf("int") != -1) + return integerPadding(type.remove("int").toInt()); + else if (type.indexOf("bool") != -1) + return 1; + else if ((type.indexOf("address") != -1)) + return 20; + else + return 0; +} + +int ContractCallDataEncoder::integerPadding(int bitValue) +{ + return bitValue / 8; +} + +QString ContractCallDataEncoder::formatBool(bool _value) +{ + return (_value ? "1" : "0"); +} + +QString ContractCallDataEncoder::convertToReadable(std::string _v, QVariableDeclaration* _dec) +{ + if (_dec->type().indexOf("int") != -1) + return convertToInt(_v); + else if (_dec->type().indexOf("bool") != -1) + return convertToBool(_v); + else + return QString::fromStdString(_v); +} + +QString ContractCallDataEncoder::convertToBool(std::string _v) +{ + return _v == "1" ? "true" : "false"; +} + +QString ContractCallDataEncoder::convertToInt(std::string _v) +{ + //TO DO to be improve to manage all int, uint size (128, 256, ...) in ethereum QML types task #612. + int x = std::stol(_v, nullptr, 16); + std::stringstream ss; + ss << std::dec << x; + return QString::fromStdString(ss.str()); +} diff --git a/mix/ContractCallDataEncoder.h b/mix/ContractCallDataEncoder.h new file mode 100644 index 000000000..a66d9b4b6 --- /dev/null +++ b/mix/ContractCallDataEncoder.h @@ -0,0 +1,64 @@ +/* + 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 ContractCallDataEncoder.h + * @author Yann yann@ethdev.com + * @date 2014 + * Ethereum IDE client. + */ + +#pragma once + +#include "QVariableDeclaration.h" +#include "QVariableDefinition.h" + +namespace dev +{ +namespace mix +{ + +/** + * @brief Encode/Decode data to be sent to a transaction or to be displayed in a view. + */ +class ContractCallDataEncoder +{ +public: + ContractCallDataEncoder() {} + /// Encode variable in order to be sent as parameter. + void encode(QVariableDeclaration* _dec, QString _value); + /// Encode variable in order to be sent as parameter. + void encode(QVariableDeclaration* _dec, u256 _value); + /// Encode variable in order to be sent as parameter. + void encode(QVariableDeclaration* _dec, bool _value); + /// Encode index of the function to call. + void encode(int _functionIndex); + /// Decode variable in order to be sent to QML view. + QList decode(QList _dec, bytes _value); + /// Get all encoded data encoded by encode function. + bytes encodedData(); + +private: + int padding(QString _type); + bytes m_encodedData; + static QString convertToReadable(std::string _v, QVariableDeclaration* _dec); + static QString convertToBool(std::string _v); + static QString convertToInt(std::string _v); + static int integerPadding(int _bitValue); + static QString formatBool(bool _value); +}; + +} +} diff --git a/mix/DebuggingStateWrapper.cpp b/mix/DebuggingStateWrapper.cpp index 36b098379..72bb02ecd 100644 --- a/mix/DebuggingStateWrapper.cpp +++ b/mix/DebuggingStateWrapper.cpp @@ -22,17 +22,18 @@ #include #include -#include "libevmcore/Instruction.h" -#include "libdevcore/CommonJS.h" -#include "libdevcrypto/Common.h" -#include "libevmcore/Instruction.h" -#include "libdevcore/Common.h" +#include +#include +#include +#include +#include +#include #include "DebuggingStateWrapper.h" using namespace dev; using namespace dev::eth; using namespace dev::mix; -std::tuple, QQMLMap*> DebuggingStateWrapper::getHumanReadableCode(const bytes& _code, QObject* _objUsedAsParent) +std::tuple, QQMLMap*> DebuggingStateWrapper::getHumanReadableCode(const bytes& _code) { QList codeStr; QMap codeMapping; @@ -52,7 +53,7 @@ std::tuple, QQMLMap*> DebuggingStateWrapper::getHumanReadableCod s = "PUSH 0x" + QString::fromStdString(toHex(bytesConstRef(&_code[i + 1], bc))); i += bc; } - HumanReadableCode* humanCode = new HumanReadableCode(QString::fromStdString(out.str()) + " " + s, line, _objUsedAsParent); + QPointer humanCode(new HumanReadableCode(QString::fromStdString(out.str()) + " " + s, line)); codeStr.append(humanCode); } catch (...) @@ -62,7 +63,7 @@ std::tuple, QQMLMap*> DebuggingStateWrapper::getHumanReadableCod break; // probably hit data segment } } - return std::make_tuple(codeStr, new QQMLMap(codeMapping, _objUsedAsParent)); + return std::make_tuple(codeStr, QPointer(new QQMLMap(codeMapping))); } QString DebuggingStateWrapper::gasLeft() @@ -99,7 +100,7 @@ QString DebuggingStateWrapper::debugStorage() { std::stringstream s; for (auto const& i: m_state.storage) - s << "@" << prettyU256(i.first) << "    " << prettyU256(i.second); + s << "@" << prettyU256(i.first) << " " << prettyU256(i.second); return QString::fromStdString(s.str()); } diff --git a/mix/DebuggingStateWrapper.h b/mix/DebuggingStateWrapper.h index d91d3d69c..bf3efe34d 100644 --- a/mix/DebuggingStateWrapper.h +++ b/mix/DebuggingStateWrapper.h @@ -23,15 +23,20 @@ #pragma once #include -#include "libethereum/State.h" -#include "libethereum/Executive.h" -#include "libdevcore/Common.h" +#include +#include +#include +#include +#include "QVariableDefinition.h" namespace dev { namespace mix { +/** + * @brief Store information about a machine state. + */ struct DebuggingState { uint64_t steps; @@ -47,13 +52,19 @@ struct DebuggingState std::vector levels; }; +/** + * @brief Store information about a machine states. + */ struct DebuggingContent { - QList states; + QList machineStates; bytes executionCode; bytesConstRef executionData; + Address contractAddress; bool contentAvailable; QString message; + bytes returnValue; + QList returnParameters; }; /** @@ -62,12 +73,14 @@ struct DebuggingContent class HumanReadableCode: public QObject { Q_OBJECT - Q_PROPERTY(QString line READ line) - Q_PROPERTY(int processIndex READ processIndex) + Q_PROPERTY(QString line READ line CONSTANT) + Q_PROPERTY(int processIndex READ processIndex CONSTANT) public: - HumanReadableCode(QString _line, int _processIndex, QObject* _parent): QObject(_parent), m_line(_line), m_processIndex(_processIndex) {} + HumanReadableCode(QString _line, int _processIndex): QObject(), m_line(_line), m_processIndex(_processIndex) {} + /// Get the assembly code line. QString line() { return m_line; } + /// Get corresponding index. int processIndex() { return m_processIndex; } private: @@ -84,7 +97,8 @@ class QQMLMap: public QObject Q_OBJECT public: - QQMLMap(QMap _map, QObject* _parent): QObject(_parent), m_map(_map) { } + QQMLMap(QMap _map): QObject(), m_map(_map) { } + /// Get the value associated with _key store in n_map. Q_INVOKABLE int getValue(int _key) { return m_map.value(_key); } private: @@ -97,36 +111,51 @@ private: class DebuggingStateWrapper: public QObject { Q_OBJECT - Q_PROPERTY(int step READ step) - Q_PROPERTY(int curPC READ curPC) - Q_PROPERTY(QString gasCost READ gasCost) - Q_PROPERTY(QString gas READ gas) - Q_PROPERTY(QString gasLeft READ gasLeft) - Q_PROPERTY(QString debugStack READ debugStack) - Q_PROPERTY(QString debugStorage READ debugStorage) - Q_PROPERTY(QString debugMemory READ debugMemory) - Q_PROPERTY(QString debugCallData READ debugCallData) - Q_PROPERTY(QString headerInfo READ headerInfo) - Q_PROPERTY(QString endOfDebug READ endOfDebug) - Q_PROPERTY(QStringList levels READ levels) + Q_PROPERTY(int step READ step CONSTANT) + Q_PROPERTY(int curPC READ curPC CONSTANT) + Q_PROPERTY(QString gasCost READ gasCost CONSTANT) + Q_PROPERTY(QString gas READ gas CONSTANT) + Q_PROPERTY(QString gasLeft READ gasLeft CONSTANT) + Q_PROPERTY(QString debugStack READ debugStack CONSTANT) + Q_PROPERTY(QString debugStorage READ debugStorage CONSTANT) + Q_PROPERTY(QString debugMemory READ debugMemory CONSTANT) + Q_PROPERTY(QString debugCallData READ debugCallData CONSTANT) + Q_PROPERTY(QString headerInfo READ headerInfo CONSTANT) + Q_PROPERTY(QString endOfDebug READ endOfDebug CONSTANT) + Q_PROPERTY(QStringList levels READ levels CONSTANT) public: - DebuggingStateWrapper(bytes _code, bytes _data, QObject* _parent): QObject(_parent), m_code(_code), m_data(_data) {} + DebuggingStateWrapper(bytes _code, bytes _data): QObject(), m_code(_code), m_data(_data) {} + /// Get the step of this machine states. int step() { return (int)m_state.steps; } + /// Get the proccessed code index. int curPC() { return (int)m_state.curPC; } + /// Get gas left. QString gasLeft(); + /// Get gas cost. QString gasCost(); + /// Get gas used. QString gas(); + /// Get stack. QString debugStack(); + /// Get storage. QString debugStorage(); + /// Get memory. QString debugMemory(); + /// Get call data. QString debugCallData(); + /// Get info to be displayed in the header. QString headerInfo(); + /// get end of debug information. QString endOfDebug(); + /// Get all previous steps. QStringList levels(); + /// Get the current processed machine state. DebuggingState state() { return m_state; } + /// Set the current processed machine state. void setState(DebuggingState _state) { m_state = _state; } - static std::tuple, QQMLMap*> getHumanReadableCode(bytes const& _code, QObject* _objUsedAsParent); + /// Convert all machine state in human readable code. + static std::tuple, QQMLMap*> getHumanReadableCode(bytes const& _code); private: DebuggingState m_state; @@ -135,5 +164,4 @@ private: }; } - } diff --git a/mix/Extension.cpp b/mix/Extension.cpp index 8d2f7cd70..53d3f491f 100644 --- a/mix/Extension.cpp +++ b/mix/Extension.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include "Extension.h" #include "AppContext.h" using namespace dev; @@ -65,10 +66,10 @@ void Extension::addContentOn(QObject* _view) Q_UNUSED(_view); if (m_displayBehavior == ExtensionDisplayBehavior::ModalDialog) { + QQmlComponent* component = new QQmlComponent(AppContext::getInstance()->appEngine(), QUrl(contentUrl()), _view); QObject* dialogWin = AppContext::getInstance()->appEngine()->rootObjects().at(0)->findChild("dialog", Qt::FindChildrenRecursively); QObject* dialogWinComponent = AppContext::getInstance()->appEngine()->rootObjects().at(0)->findChild("modalDialogContent", Qt::FindChildrenRecursively); - QMetaObject::invokeMethod(dialogWin, "close"); - dialogWinComponent->setProperty("source", contentUrl()); + dialogWinComponent->setProperty("sourceComponent", QVariant::fromValue(component)); dialogWin->setProperty("title", title()); QMetaObject::invokeMethod(dialogWin, "open"); } diff --git a/mix/Extension.h b/mix/Extension.h index b71bf7bf3..9e3e7f55b 100644 --- a/mix/Extension.h +++ b/mix/Extension.h @@ -31,6 +31,7 @@ namespace mix enum ExtensionDisplayBehavior { Tab, + RightTab, ModalDialog }; @@ -42,12 +43,19 @@ class Extension: public QObject public: Extension(); Extension(ExtensionDisplayBehavior _displayBehavior); + /// Return the QML url of the view to display. virtual QString contentUrl() const { return ""; } + /// Return the title of this extension. virtual QString title() const { return ""; } + /// Initialize extension. virtual void start() const {} - void addContentOn(QObject* _tabView); + /// Add the view define in contentUrl() in the _view QObject. + void addContentOn(QObject* _view); + /// Add the view define in contentUrl() in the _view QObject (_view has to be a tab). void addTabOn(QObject* _view); + /// Modify the display behavior of this extension. void setDisplayBehavior(ExtensionDisplayBehavior _displayBehavior) { m_displayBehavior = _displayBehavior; } + /// Get the display behavior of thi extension. ExtensionDisplayBehavior getDisplayBehavior() { return m_displayBehavior; } protected: @@ -61,5 +69,4 @@ private: }; } - } diff --git a/mix/KeyEventManager.h b/mix/KeyEventManager.h index f3343cc45..2a743fa8f 100644 --- a/mix/KeyEventManager.h +++ b/mix/KeyEventManager.h @@ -17,12 +17,13 @@ /** @file KeyEventManager.h * @author Yann yann@ethdev.com * @date 2014 - * use as an event handler for all classes which need keyboard interactions + * Used as an event handler for all classes which need keyboard interactions */ #pragma once #include +#include class KeyEventManager: public QObject { @@ -30,13 +31,17 @@ class KeyEventManager: public QObject public: KeyEventManager() {} + /// Allows _receiver to handle key pressed event. void registerEvent(const QObject* _receiver, const char* _slot); + /// Unregister _receiver. void unRegisterEvent(QObject* _receiver); signals: - void onKeyPressed(int); + /// Emited when a key is pressed. + void onKeyPressed(int _event); public slots: + /// Called when a key is pressed. void keyPressed(QVariant _event); }; diff --git a/mix/MixApplication.h b/mix/MixApplication.h index 383c5849c..62c37bb5c 100644 --- a/mix/MixApplication.h +++ b/mix/MixApplication.h @@ -41,5 +41,4 @@ public: }; } - } diff --git a/mix/TransactionBuilder.h b/mix/QBasicNodeDefinition.h similarity index 58% rename from mix/TransactionBuilder.h rename to mix/QBasicNodeDefinition.h index 9ad929d38..0d7365b72 100644 --- a/mix/TransactionBuilder.h +++ b/mix/QBasicNodeDefinition.h @@ -1,43 +1,49 @@ /* 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 TransactionBuilder.h +/** @file QBasicNodeDefinition.h * @author Yann yann@ethdev.com * @date 2014 - * Ethereum IDE client. */ #pragma once -#include -#include "libdevcore/Common.h" -#include "libethereum/Transaction.h" +#include +#include namespace dev { namespace mix { -class TransactionBuilder +class QBasicNodeDefinition: public QObject { + Q_OBJECT + Q_PROPERTY(QString name READ name CONSTANT) + public: - TransactionBuilder() {} - dev::eth::Transaction getBasicTransaction(dev::u256 _value, dev::u256 _gasPrice, dev::u256 _gas, - QString address, bytes _data, dev::u256 _nonce, Secret _secret) const; - dev::eth::Transaction getCreationTransaction(dev::u256 _value, dev::u256 _gasPrice, dev::u256 _gas, - dev::bytes _data, dev::u256 _nonce, Secret _secret) const; + QBasicNodeDefinition(): QObject() {} + ~QBasicNodeDefinition() {} + QBasicNodeDefinition(solidity::Declaration const* _d): QObject(), m_name(QString::fromStdString(_d->getName())) {} + /// Get the name of the node. + QString name() const { return m_name; } + +private: + QString m_name; }; } - } diff --git a/mix/QContractDefinition.cpp b/mix/QContractDefinition.cpp new file mode 100644 index 000000000..55454f123 --- /dev/null +++ b/mix/QContractDefinition.cpp @@ -0,0 +1,48 @@ +/* + 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 QContractDefinition.cpp + * @author Yann yann@ethdev.com + * @date 2014 + */ + +#include +#include +#include +#include +#include +#include +#include +#include "AppContext.h" +#include "QContractDefinition.h" +using namespace dev::solidity; +using namespace dev::mix; + +std::shared_ptr QContractDefinition::Contract(QString _source) +{ + CompilerStack* comp = AppContext::getInstance()->compiler(); + comp->addSource("contract", _source.toStdString()); + comp->parse(); + ContractDefinition const* def = &comp->getContractDefinition(comp->getContractNames().front()); + return std::make_shared(def); +} + +void QContractDefinition::initQFunctions() +{ + std::vector functions = m_contract->getInterfaceFunctions(); + for (unsigned i = 0; i < functions.size(); i++) + m_functions.append(new QFunctionDefinition(functions.at(i), i)); +} diff --git a/mix/QContractDefinition.h b/mix/QContractDefinition.h new file mode 100644 index 000000000..e4e767380 --- /dev/null +++ b/mix/QContractDefinition.h @@ -0,0 +1,53 @@ +/* + 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 QContractDefinition.h + * @author Yann yann@ethdev.com + * @date 2014 + */ + +#pragma once + +#include +#include +#include "QFunctionDefinition.h" +#include "QBasicNodeDefinition.h" + +namespace dev +{ +namespace mix +{ + +class QContractDefinition: public QBasicNodeDefinition +{ + Q_OBJECT + Q_PROPERTY(QList functions READ functions) + +public: + QContractDefinition(solidity::ContractDefinition const* _contract): QBasicNodeDefinition(_contract), m_contract(_contract) { initQFunctions(); } + /// Get all the functions of the contract. + QList functions() const { return m_functions; } + /// Get the description (functions, parameters, return parameters, ...) of the contract describes by _code. + static std::shared_ptr Contract(QString _code); + +private: + solidity::ContractDefinition const* m_contract; + QList m_functions; + void initQFunctions(); +}; + +} +} diff --git a/mix/QFunctionDefinition.cpp b/mix/QFunctionDefinition.cpp new file mode 100644 index 000000000..e1884b5aa --- /dev/null +++ b/mix/QFunctionDefinition.cpp @@ -0,0 +1,37 @@ +/* + 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 QFunctionDefinition.cpp + * @author Yann yann@ethdev.com + * @date 2014 + */ + +#include +#include "QVariableDeclaration.h" +#include "QFunctionDefinition.h" +using namespace dev::solidity; +using namespace dev::mix; + +void QFunctionDefinition::initQParameters() +{ + std::vector> parameters = m_functions->getParameterList().getParameters(); + for (unsigned i = 0; i < parameters.size(); i++) + m_parameters.append(new QVariableDeclaration(parameters.at(i).get())); + + std::vector> returnParameters = m_functions->getReturnParameters(); + for (unsigned i = 0; i < returnParameters.size(); i++) + m_returnParameters.append(new QVariableDeclaration(returnParameters.at(i).get())); +} diff --git a/mix/QFunctionDefinition.h b/mix/QFunctionDefinition.h new file mode 100644 index 000000000..368e2e239 --- /dev/null +++ b/mix/QFunctionDefinition.h @@ -0,0 +1,58 @@ +/* + 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 QFunctionDefinition.h + * @author Yann yann@ethdev.com + * @date 2014 + */ + +#pragma once + +#include +#include +#include +#include "QBasicNodeDefinition.h" + +namespace dev +{ +namespace mix +{ + +class QFunctionDefinition: public QBasicNodeDefinition +{ + Q_OBJECT + Q_PROPERTY(QList parameters READ parameters) + Q_PROPERTY(int index READ index) + +public: + QFunctionDefinition(solidity::FunctionDefinition const* _f, int _index): QBasicNodeDefinition(_f), m_index(_index), m_functions(_f) { initQParameters(); } + /// Get all input parameters of this function. + QList parameters() const { return m_parameters; } + /// Get all return parameters of this function. + QList returnParameters() const { return m_returnParameters; } + /// Get the index of this function on the contract ABI. + int index() const { return m_index; } + +private: + int m_index; + solidity::FunctionDefinition const* m_functions; + QList m_parameters; + QList m_returnParameters; + void initQParameters(); +}; + +} +} diff --git a/mix/QVariableDeclaration.h b/mix/QVariableDeclaration.h new file mode 100644 index 000000000..2d2c40970 --- /dev/null +++ b/mix/QVariableDeclaration.h @@ -0,0 +1,49 @@ +/* + 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 QVariableDeclaration.h + * @author Yann yann@ethdev.com + * @date 2014 + */ + +#include +#include "QBasicNodeDefinition.h" + +#pragma once + +namespace dev +{ +namespace mix +{ + +class QVariableDeclaration: public QBasicNodeDefinition +{ + Q_OBJECT + Q_PROPERTY(QString type READ type CONSTANT) + +public: + QVariableDeclaration(solidity::VariableDeclaration const* _v): QBasicNodeDefinition(_v), m_variable(_v) {} + /// Get the type of this variable. + QString type() const { return QString::fromStdString(m_variable->getType()->toString()); } + +private: + solidity::VariableDeclaration const* m_variable; +}; + +} +} + +Q_DECLARE_METATYPE(dev::mix::QVariableDeclaration*) diff --git a/mix/QVariableDefinition.cpp b/mix/QVariableDefinition.cpp new file mode 100644 index 000000000..4f38e84b2 --- /dev/null +++ b/mix/QVariableDefinition.cpp @@ -0,0 +1,55 @@ +/* + 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 QVariableDefinition.h + * @author Yann yann@ethdev.com + * @date 2014 + */ + +#include "QVariableDefinition.h" + +using namespace dev::mix; +int QVariableDefinitionList::rowCount(const QModelIndex& _parent) const +{ + Q_UNUSED(_parent); + return m_def.size(); +} + +QVariant QVariableDefinitionList::data(const QModelIndex& _index, int _role) const +{ + if (_role != Qt::DisplayRole) + return QVariant(); + + int i = _index.row(); + if (i < 0 || i >= m_def.size()) + return QVariant(QVariant::Invalid); + + return QVariant::fromValue(m_def.at(i)); +} + +QHash QVariableDefinitionList::roleNames() const +{ + QHash roles; + roles[Qt::DisplayRole] = "variable"; + return roles; +} + +QVariableDefinition* QVariableDefinitionList::val(int _idx) +{ + if (_idx < 0 || _idx >= m_def.size()) + return nullptr; + return m_def.at(_idx); +} diff --git a/mix/QVariableDefinition.h b/mix/QVariableDefinition.h new file mode 100644 index 000000000..898a02621 --- /dev/null +++ b/mix/QVariableDefinition.h @@ -0,0 +1,72 @@ +/* + 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 QVariableDefinition.h + * @author Yann yann@ethdev.com + * @date 2014 + */ + +#pragma once + +#include +#include "QVariableDeclaration.h" + +namespace dev +{ +namespace mix +{ + +class QVariableDefinition: public QObject +{ + Q_OBJECT + Q_PROPERTY(QString value READ value CONSTANT) + Q_PROPERTY(QVariableDeclaration* declaration READ declaration CONSTANT) + +public: + QVariableDefinition(QVariableDeclaration* _def, QString _value): QObject(), m_value(_value), m_dec(_def) {} + + /// Return the associated declaration of this variable definition. + QVariableDeclaration* declaration() const { return m_dec; } + /// Return the variable value. + QString value() const { return m_value; } + +private: + QString m_value; + QVariableDeclaration* m_dec; +}; + +class QVariableDefinitionList: public QAbstractListModel +{ + Q_OBJECT + +public: + QVariableDefinitionList(QList _def): m_def(_def) {} + int rowCount(const QModelIndex& parent = QModelIndex()) const override; + QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override; + QHash roleNames() const override; + /// Return the variable definition at index _idx. + QVariableDefinition* val(int _idx); + /// Return the list of variables. + QList def() { return m_def; } + +private: + QList m_def; +}; + +} +} + +Q_DECLARE_METATYPE(dev::mix::QVariableDefinition*) diff --git a/mix/TransactionBuilder.cpp b/mix/TransactionBuilder.cpp deleted file mode 100644 index 68eecf10b..000000000 --- a/mix/TransactionBuilder.cpp +++ /dev/null @@ -1,40 +0,0 @@ -/* - 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 TransactionBuilder.cpp - * @author Yann yann@ethdev.com - * @date 2014 - * Ethereum IDE client. - */ - -#include "libethereum/Executive.h" -#include "libdevcore/CommonJS.h" -#include "libdevcore/Common.h" -#include "AppContext.h" -#include "TransactionBuilder.h" -using namespace dev::mix; -using namespace dev::eth; -using namespace dev; - -Transaction TransactionBuilder::getCreationTransaction(u256 _value, u256 _gasPrice, u256 _gas, - bytes _data, u256 _nonce, Secret _secret) const -{ - return Transaction(_value, _gasPrice, _gas, _data, _nonce, _secret); -} - -Transaction TransactionBuilder::getBasicTransaction(u256 _value, u256 _gasPrice, u256 _gas, - QString _address, bytes _data, u256 _nonce, Secret _secret) const -{ - return Transaction(_value, _gasPrice, _gas, dev::fromString(_address.toStdString()), _data, _nonce, _secret); -} - diff --git a/mix/TransactionListModel.cpp b/mix/TransactionListModel.cpp new file mode 100644 index 000000000..64964b898 --- /dev/null +++ b/mix/TransactionListModel.cpp @@ -0,0 +1,221 @@ +/* + 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 TransactionListModel.cpp + * @author Arkadiy Paronyan arkadiy@ethdev.com + * @date 2014 + * Ethereum IDE client. + */ + +#include +#include +#include +#include +#include +#include "TransactionListModel.h" +#include "QContractDefinition.h" +#include "QFunctionDefinition.h" +#include "QVariableDeclaration.h" + + +namespace dev +{ +namespace mix +{ + +/// @todo Move this to QML +u256 fromQString(QString const& _s) +{ + return dev::jsToU256(_s.toStdString()); +} + +/// @todo Move this to QML +QString toQString(u256 _value) +{ + std::ostringstream s; + s << _value; + return QString::fromStdString(s.str()); +} + +TransactionListItem::TransactionListItem(int _index, TransactionSettings const& _t, QObject* _parent): + QObject(_parent), m_index(_index), m_title(_t.title), m_functionId(_t.functionId), m_value(toQString(_t.value)), + m_gas(toQString(_t.gas)), m_gasPrice(toQString(_t.gasPrice)) +{} + +TransactionListModel::TransactionListModel(QObject* _parent, QTextDocument* _document): + QAbstractListModel(_parent), m_document(_document) +{ + qRegisterMetaType("TransactionListItem*"); +} + +QHash TransactionListModel::roleNames() const +{ + QHash roles; + roles[TitleRole] = "title"; + roles[IdRole] = "transactionIndex"; + return roles; +} + +int TransactionListModel::rowCount(QModelIndex const& _parent) const +{ + Q_UNUSED(_parent); + return m_transactions.size(); +} + +QVariant TransactionListModel::data(QModelIndex const& _index, int _role) const +{ + if (_index.row() < 0 || _index.row() >= (int)m_transactions.size()) + return QVariant(); + auto const& transaction = m_transactions.at(_index.row()); + switch (_role) + { + case TitleRole: + return QVariant(transaction.title); + case IdRole: + return QVariant(_index.row()); + default: + return QVariant(); + } +} + +///@todo: get parameters from code model +QList buildParameters(QTextDocument* _document, TransactionSettings const& _transaction, QString const& _functionId) +{ + QList params; + try + { + std::shared_ptr contract = QContractDefinition::Contract(_document->toPlainText()); + auto functions = contract->functions(); + for (auto f : functions) + { + if (f->name() != _functionId) + continue; + + auto parameters = f->parameters(); + //build a list of parameters for a function. If the function is selected as current, add parameter values as well + for (auto p : parameters) + { + QString paramValue; + if (f->name() == _transaction.functionId) + { + auto paramValueIter = _transaction.parameterValues.find(p->name()); + if (paramValueIter != _transaction.parameterValues.cend()) + paramValue = toQString(paramValueIter->second); + } + + TransactionParameterItem* item = new TransactionParameterItem(p->name(), p->type(), paramValue); + QQmlEngine::setObjectOwnership(item, QQmlEngine::JavaScriptOwnership); + params.append(item); + } + } + } + catch (boost::exception const&) + { + //TODO: + } + + return params; +} + +///@todo: get fnctions from code model +QList TransactionListModel::getFunctions() +{ + QList functionNames; + try + { + QString code = m_document->toPlainText(); + std::shared_ptr contract(QContractDefinition::Contract(code)); + auto functions = contract->functions(); + for (auto f : functions) + { + functionNames.append(f->name()); + } + } + catch (boost::exception const&) + { + } + return functionNames; +} + +QVariantList TransactionListModel::getParameters(int _index, QString const& _functionId) +{ + TransactionSettings const& transaction = (_index >= 0 && _index < (int)m_transactions.size()) ? m_transactions[_index] : TransactionSettings(); + auto plist = buildParameters(m_document, transaction, _functionId); + QVariantList vl; + for (QObject* p : plist) + vl.append(QVariant::fromValue(p)); + return vl; +} + +TransactionListItem* TransactionListModel::getItem(int _index) +{ + TransactionSettings const& transaction = (_index >= 0 && _index < (int)m_transactions.size()) ? m_transactions[_index] : TransactionSettings(); + TransactionListItem* item = new TransactionListItem(_index, transaction, nullptr); + QQmlEngine::setObjectOwnership(item, QQmlEngine::JavaScriptOwnership); + return item; +} + +void TransactionListModel::edit(QObject* _data) +{ + //these properties come from TransactionDialog QML object + ///@todo change the model to a qml component + int index = _data->property("transactionIndex").toInt(); + QString title = _data->property("transactionTitle").toString(); + QString gas = _data->property("gas").toString(); + QString gasPrice = _data->property("gasPrice").toString(); + QString value = _data->property("transactionValue").toString(); + QString functionId = _data->property("functionId").toString(); + QAbstractListModel* paramsModel = qvariant_cast(_data->property("transactionParams")); + TransactionSettings transaction(title, functionId, fromQString(value), fromQString(gas), fromQString(gasPrice)); + int paramCount = paramsModel->rowCount(QModelIndex()); + for (int p = 0; p < paramCount; ++p) + { + QString paramName = paramsModel->data(paramsModel->index(p, 0), Qt::DisplayRole).toString(); + QString paramValue = paramsModel->data(paramsModel->index(p, 0), Qt::DisplayRole + 2).toString(); + if (!paramValue.isEmpty() && !paramName.isEmpty()) + transaction.parameterValues[paramName] = fromQString(paramValue); + } + + if (index >= 0 && index < (int)m_transactions.size()) + { + beginRemoveRows(QModelIndex(), index, index); + m_transactions.erase(m_transactions.begin() + index); + endRemoveRows(); + } + else + index = rowCount(QModelIndex()); + + beginInsertRows(QModelIndex(), index, index); + m_transactions.push_back(transaction); + emit countChanged(); + endInsertRows(); +} + +int TransactionListModel::getCount() const +{ + return rowCount(QModelIndex()); +} + +void TransactionListModel::runTransaction(int _index) +{ + TransactionSettings tr = m_transactions.at(_index); + emit transactionStarted(tr); +} + + +} +} + diff --git a/mix/TransactionListModel.h b/mix/TransactionListModel.h new file mode 100644 index 000000000..d321fc91c --- /dev/null +++ b/mix/TransactionListModel.h @@ -0,0 +1,168 @@ +/* + 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 TransactionListView.h + * @author Arkadiy Paronyan arkadiy@ethdev.com + * @date 2014 + * Ethereum IDE client. + */ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +class QTextDocument; + +namespace dev +{ +namespace mix +{ + +/// Backend transaction config class +struct TransactionSettings +{ + TransactionSettings(): + value(0), gas(10000), gasPrice(10 * dev::eth::szabo) {} + + TransactionSettings(QString const& _title, QString const& _functionId, u256 _value, u256 _gas, u256 _gasPrice): + title(_title), functionId(_functionId), value(_value), gas(_gas), gasPrice(_gasPrice) {} + + /// User specified transaction title + QString title; + /// Contract function name + QString functionId; + /// Transaction value + u256 value; + /// Gas + u256 gas; + /// Gas price + u256 gasPrice; + /// Mapping from contract function parameter name to value + std::map parameterValues; +}; + +/// QML transaction parameter class +class TransactionParameterItem: public QObject +{ + Q_OBJECT + Q_PROPERTY(QString name READ name CONSTANT) + Q_PROPERTY(QString type READ type CONSTANT) + Q_PROPERTY(QString value READ value CONSTANT) +public: + TransactionParameterItem(QString const& _name, QString const& _type, QString const& _value): + m_name(_name), m_type(_type), m_value(_value) {} + + /// Parameter name, set by contract definition + QString name() { return m_name; } + /// Parameter type, set by contract definition + QString type() { return m_type; } + /// Parameter value, set by user + QString value() { return m_value; } + +private: + QString m_name; + QString m_type; + QString m_value; +}; + +class TransactionListItem: public QObject +{ + Q_OBJECT + Q_PROPERTY(int index READ index CONSTANT) + Q_PROPERTY(QString title READ title CONSTANT) + Q_PROPERTY(QString functionId READ functionId CONSTANT) + Q_PROPERTY(QString gas READ gas CONSTANT) + Q_PROPERTY(QString gasPrice READ gasPrice CONSTANT) + Q_PROPERTY(QString value READ value CONSTANT) + +public: + TransactionListItem(int _index, TransactionSettings const& _t, QObject* _parent); + + /// User specified transaction title + QString title() { return m_title; } + /// Gas + QString gas() { return m_gas; } + /// Gas cost + QString gasPrice() { return m_gasPrice; } + /// Transaction value + QString value() { return m_value; } + /// Contract function name + QString functionId() { return m_functionId; } + /// Index of this transaction in the transactions list + int index() { return m_index; } + +private: + int m_index; + QString m_title; + QString m_functionId; + QString m_value; + QString m_gas; + QString m_gasPrice; +}; + +/// QML model for a list of transactions +class TransactionListModel: public QAbstractListModel +{ + Q_OBJECT + Q_PROPERTY(int count READ getCount() NOTIFY countChanged()) + + enum Roles + { + TitleRole = Qt::DisplayRole, + IdRole = Qt::UserRole + 1 + }; + +public: + TransactionListModel(QObject* _parent, QTextDocument* _document); + ~TransactionListModel() {} + + QHash roleNames() const override; + int rowCount(QModelIndex const& _parent) const override; + QVariant data(QModelIndex const& _index, int _role) const override; + int getCount() const; + /// Apply changes from transaction dialog. Argument is a dialog model as defined in TransactionDialog.qml + /// @todo Change that to transaction item + Q_INVOKABLE void edit(QObject* _data); + /// @returns transaction item for a give index + Q_INVOKABLE TransactionListItem* getItem(int _index); + /// @returns a list of functions for current contract + Q_INVOKABLE QList getFunctions(); + /// @returns function parameters along with parameter values if set. @see TransactionParameterItem + Q_INVOKABLE QVariantList getParameters(int _id, QString const& _functionId); + /// Launch transaction execution UI handler + Q_INVOKABLE void runTransaction(int _index); + +signals: + /// Transaction count has changed + void countChanged(); + /// Transaction has been launched + void transactionStarted(dev::mix::TransactionSettings); + +private: + std::vector m_transactions; + QTextDocument* m_document; +}; + +} + +} + diff --git a/mix/TransactionListView.cpp b/mix/TransactionListView.cpp new file mode 100644 index 000000000..7e2bfaa25 --- /dev/null +++ b/mix/TransactionListView.cpp @@ -0,0 +1,56 @@ +/* + 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 TransactionListView.cpp + * @author Arkadiy Paronyan arkadiy@ethdev.com + * @date 2014 + * Ethereum IDE client. + */ + +#include +#include +#include +#include +#include +#include "TransactionListView.h" +#include "TransactionListModel.h" +using namespace dev::mix; + +TransactionListView::TransactionListView(QTextDocument* _doc): Extension(ExtensionDisplayBehavior::RightTab) +{ + m_editor = _doc; + m_model.reset(new TransactionListModel(this, _doc)); + m_appEngine->rootContext()->setContextProperty("transactionListModel", m_model.get()); +} + +TransactionListView::~TransactionListView() +{ + //implementation is in cpp file so that all types deleted are complete +} + +QString TransactionListView::contentUrl() const +{ + return QStringLiteral("qrc:/qml/TransactionList.qml"); +} + +QString TransactionListView::title() const +{ + return QApplication::tr("Transactions"); +} + +void TransactionListView::start() const +{ +} diff --git a/mix/TransactionListView.h b/mix/TransactionListView.h new file mode 100644 index 000000000..2ec775261 --- /dev/null +++ b/mix/TransactionListView.h @@ -0,0 +1,54 @@ +/* + 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 TransactionListView.h + * @author Arkadiy Paronyan arkadiy@ethdev.com + * @date 2014 + * Ethereum IDE client. + */ + +#pragma once + +#include +#include "Extension.h" + +namespace dev +{ +namespace mix +{ + +class TransactionListModel; + +/// Transactions list control +/// @todo This should be moved into state as a sequence +class TransactionListView: public Extension +{ + Q_OBJECT + +public: + TransactionListView(QTextDocument*); + ~TransactionListView(); + void start() const override; + QString title() const override; + QString contentUrl() const override; + /// @returns the underlying model + TransactionListModel* model() const { return m_model.get(); } + +private: + QTextDocument* m_editor; + std::unique_ptr m_model; +}; + +} + +} diff --git a/mix/qml.qrc b/mix/qml.qrc index d14aa9974..2384afa69 100644 --- a/mix/qml.qrc +++ b/mix/qml.qrc @@ -7,6 +7,8 @@ qml/Debugger.qml qml/js/Debugger.js qml/BasicMessage.qml + qml/TransactionDialog.qml + qml/TransactionList.qml qml/ModalDialog.qml qml/AlertMessageDialog.qml diff --git a/mix/qml/AlertMessageDialog.qml b/mix/qml/AlertMessageDialog.qml index f89ade45f..1d48f5474 100644 --- a/mix/qml/AlertMessageDialog.qml +++ b/mix/qml/AlertMessageDialog.qml @@ -22,6 +22,9 @@ Window } function close() { - visible = false + visible = false; + alertMessageDialogContent.source = ""; + alertMessageDialogContent.sourceComponent = undefined; + alertMessageDialog.destroy(); } } diff --git a/mix/qml/BasicContent.qml b/mix/qml/BasicContent.qml index ea1017186..ff31dc86f 100644 --- a/mix/qml/BasicContent.qml +++ b/mix/qml/BasicContent.qml @@ -7,13 +7,13 @@ Rectangle { height: parent.height color: "lightgray" Text { - font.pointSize: 7 + font.pointSize: 9 anchors.left: parent.left anchors.top: parent.top anchors.topMargin: 3 anchors.leftMargin: 3 height: 9 - font.family: "Sego UI light" + font.family: "Monospace" objectName: "status" id: status } @@ -23,8 +23,8 @@ Rectangle { anchors.leftMargin: 10 anchors.top: status.bottom anchors.topMargin: 3 - font.pointSize: 7 - font.family: "Sego UI light" + font.pointSize: 9 + font.family: "Monospace" height: parent.height * 0.8 width: parent.width - 20 wrapMode: Text.Wrap diff --git a/mix/qml/BasicMessage.qml b/mix/qml/BasicMessage.qml index 7127d29ff..8ac8bcd45 100644 --- a/mix/qml/BasicMessage.qml +++ b/mix/qml/BasicMessage.qml @@ -16,6 +16,7 @@ Rectangle { objectName: "messageContent" id: messageTxt text: "" + wrapMode: "Wrap" } } diff --git a/mix/qml/Debugger.qml b/mix/qml/Debugger.qml index 18f706970..056126e16 100644 --- a/mix/qml/Debugger.qml +++ b/mix/qml/Debugger.qml @@ -8,18 +8,54 @@ import "js/Debugger.js" as Debugger Rectangle { anchors.fill: parent; color: "lightgrey" + Component.onCompleted: Debugger.init(); Rectangle { color: "transparent" id: headerInfo + anchors.horizontalCenter: parent.horizontalCenter width: parent.width - height: 30 + height: 60 anchors.top: parent.top - Label { - anchors.centerIn: parent - font.family: "Verdana" - font.pointSize: 9 - font.italic: true - id: headerInfoLabel + Column { + width: parent.width + height: parent.height + Rectangle { + color: "transparent" + width: parent.width + height: 30 + Label { + anchors.centerIn: parent + font.family: "Verdana" + font.pointSize: 9 + font.italic: true + id: headerInfoLabel + } + } + Rectangle { + color: "transparent" + width: parent.width + anchors.horizontalCenter: parent.horizontalCenter + height: 30 + ListView { + orientation: ListView.Horizontal + anchors.centerIn: parent; + width: parent.width + id: headerReturnList + delegate: renderDelegateReturnValues + } + Component { + id: renderDelegateReturnValues + Item { + id: wrapperItem + width: 80 + Text { + anchors.centerIn: parent + text: variable.declaration.name + " = " + variable.value + font.pointSize: 9 + } + } + } + } } } @@ -37,7 +73,7 @@ Rectangle { anchors.topMargin: 10 anchors.top: headerInfo.bottom anchors.left: parent.left - height: parent.height - 30 + height: parent.height - 70 width: parent.width * 0.5 ListView { @@ -46,7 +82,6 @@ Rectangle { width: 200 anchors.horizontalCenter: parent.horizontalCenter id: statesList - Component.onCompleted: Debugger.init(); model: humanReadableExecutionCode delegate: renderDelegate highlight: highlightBar @@ -94,7 +129,7 @@ Rectangle { font.letterSpacing: 2 width: parent.width height: 15 - text: "callstack" + text: qsTr("callstack") } ListView { @@ -140,7 +175,7 @@ Rectangle { width: parent.width height: 15 anchors.top : parent.top - text: "debug stack" + text: qsTr("debug stack") } TextArea { anchors.bottom: parent.bottom @@ -148,7 +183,7 @@ Rectangle { font.family: "Verdana" font.pointSize: 8 height: parent.height - 15 - id:debugStackTxt + id: debugStackTxt readOnly: true; } } @@ -166,7 +201,7 @@ Rectangle { width: parent.width height: 15 anchors.top : parent.top - text: "debug memory" + text: qsTr("debug memory") } TextArea { anchors.bottom: parent.bottom @@ -192,7 +227,7 @@ Rectangle { width: parent.width height: 15 anchors.top : parent.top - text: "debug storage" + text: qsTr("debug storage") } TextArea { anchors.bottom: parent.bottom @@ -200,7 +235,7 @@ Rectangle { font.family: "Verdana" font.pointSize: 8 height: parent.height - 15 - id:debugStorageTxt + id: debugStorageTxt readOnly: true; } } @@ -218,12 +253,15 @@ Rectangle { width: parent.width height: 15 anchors.top : parent.top - text: "debug calldata" + text: qsTr("debug calldata") } TextArea { anchors.bottom: parent.bottom width: parent.width height: parent.height - 15 + font.family: "Verdana" + font.pointSize: 8 + font.letterSpacing: 2 id: debugCallDataTxt readOnly: true; } diff --git a/mix/qml/MainContent.qml b/mix/qml/MainContent.qml index 6d08f79ec..794e5746d 100644 --- a/mix/qml/MainContent.qml +++ b/mix/qml/MainContent.qml @@ -16,47 +16,66 @@ Rectangle { anchors.fill: parent height: parent.height width: parent.width; - id:root - SplitView { - anchors.fill: parent - orientation: Qt.Vertical - Rectangle { - anchors.top: parent.top - id: contentView - width: parent.width - height: parent.height * 0.7 - TextArea { - id: codeEditor - height: parent.height - font.family: "Verdana" - font.pointSize: 9 - width: parent.width - anchors.centerIn: parent - tabChangesFocus: false - Keys.onPressed: { - if (event.key === Qt.Key_Tab) { - codeEditor.insert(codeEditor.cursorPosition, "\t"); - event.accepted = true; - } - } - } - } - Rectangle { - anchors.bottom: parent.bottom - id: contextualView - width: parent.width - Layout.minimumHeight: 20 - height: parent.height * 0.3 - TabView { - id: contextualTabs - antialiasing: true - anchors.fill: parent - style: TabStyle {} - } - } - CodeEditorExtensionManager { - tabView: contextualTabs - editor: codeEditor - } - } + id:root + SplitView { + orientation: Qt.Horizontal + anchors.fill: parent + SplitView { + //anchors.fill: parent + width: parent.width * 0.8 + orientation: Qt.Vertical + Rectangle { + anchors.top: parent.top + id: contentView + width: parent.width + height: parent.height * 0.7 + TextArea { + id: codeEditor + height: parent.height + font.family: "Monospace" + font.pointSize: 12 + width: parent.width + anchors.centerIn: parent + tabChangesFocus: false + Keys.onPressed: { + if (event.key === Qt.Key_Tab) { + codeEditor.insert(codeEditor.cursorPosition, "\t"); + event.accepted = true; + } + } + } + } + Rectangle { + anchors.bottom: parent.bottom + id: contextualView + width: parent.width + Layout.minimumHeight: 20 + height: parent.height * 0.3 + TabView { + id: contextualTabs + antialiasing: true + anchors.fill: parent + style: TabStyle {} + } + } + } + Rectangle { + anchors.right: parent.right + id: rightPaneView + width: parent.width * 0.2 + height: parent.height + Layout.minimumWidth: 20 + TabView { + id: rightPaneTabs + antialiasing: true + anchors.fill: parent + //style: TabStyle {} + } + } + CodeEditorExtensionManager { + tabView: contextualTabs + rightTabView: rightPaneTabs + editor: codeEditor + } + } } diff --git a/mix/qml/ModalDialog.qml b/mix/qml/ModalDialog.qml index 983420926..d5b7f3dd3 100644 --- a/mix/qml/ModalDialog.qml +++ b/mix/qml/ModalDialog.qml @@ -18,10 +18,13 @@ Window } function open() { - visible = true + visible = true; } function close() { - visible = false + visible = false; + modalDialogContent.source = ""; + modalDialogContent.sourceComponent = undefined; + modalDialog.destroy(); } } diff --git a/mix/qml/TransactionDialog.qml b/mix/qml/TransactionDialog.qml new file mode 100644 index 000000000..004d9be49 --- /dev/null +++ b/mix/qml/TransactionDialog.qml @@ -0,0 +1,219 @@ +import QtQuick 2.2 +import QtQuick.Controls 1.2 +import QtQuick.Layouts 1.1 +import QtQuick.Window 2.0 + +Window { + modality: Qt.WindowModal + + width:640 + height:480 + + visible: false + + function open() + { + visible = true; + } + function close() + { + visible = false; + } + + property alias focus : titleField.focus + property alias transactionTitle : titleField.text + property int transactionIndex + property alias transactionParams : paramsModel; + property alias gas : gasField.text; + property alias gasPrice : gasPriceField.text; + property alias transactionValue : valueField.text; + property alias functionId : functionComboBox.currentText; + property var model; + + signal accepted; + + function reset(index, m) { + model = m; + var item = model.getItem(index); + transactionIndex = index; + transactionTitle = item.title; + gas = item.gas; + gasPrice = item.gasPrice; + transactionValue = item.value; + var functionId = item.functionId; + functionsModel.clear(); + var functionIndex = -1; + var functions = model.getFunctions(); + for (var f = 0; f < functions.length; f++) { + functionsModel.append({ text: functions[f] }); + if (functions[f] === item.functionId) + functionIndex = f; + } + functionComboBox.currentIndex = functionIndex; + } + + function loadParameters() { + if (!paramsModel) + return; + paramsModel.clear(); + if (functionComboBox.currentIndex >= 0 && functionComboBox.currentIndex < functionsModel.count) { + var parameters = model.getParameters(transactionIndex, functionsModel.get(functionComboBox.currentIndex).text); + for (var p = 0; p < parameters.length; p++) { + paramsModel.append({ name: parameters[p].name, type: parameters[p].type, value: parameters[p].value }); + } + } + } + + GridLayout { + id: dialogContent + columns: 2 + anchors.fill: parent + anchors.margins: 10 + rowSpacing: 10 + columnSpacing: 10 + + Label { + text: qsTr("Title") + } + TextField { + id: titleField + focus: true + Layout.fillWidth: true + } + + Label { + text: qsTr("Function") + } + + ComboBox { + id: functionComboBox + Layout.fillWidth: true + currentIndex: -1 + textRole: "text" + editable: false + model: ListModel { + id: functionsModel + } + onCurrentIndexChanged: { + loadParameters(); + } + } + Label { + text: qsTr("Value") + } + TextField { + id: valueField + Layout.fillWidth: true + } + + Label { + text: qsTr("Gas") + } + TextField { + id: gasField + Layout.fillWidth: true + } + + Label { + text: qsTr("Gas price") + } + TextField { + id: gasPriceField + Layout.fillWidth: true + } + + Label { + text: qsTr("Parameters") + } + TableView { + model: paramsModel + Layout.fillWidth: true + + TableViewColumn { + role: "name" + title: "Name" + width: 120 + } + TableViewColumn { + role: "type" + title: "Type" + width: 120 + } + TableViewColumn { + role: "value" + title: "Value" + width: 120 + } + + itemDelegate: { + return editableDelegate; + } + } + } + + RowLayout + { + anchors.bottom: parent.bottom + anchors.right: parent.right; + + Button { + text: qsTr("Ok"); + onClicked: { + close(); + accepted(); + } + } + Button { + text: qsTr("Cancel"); + onClicked: close(); + } + } + + + ListModel { + id: paramsModel + } + + Component { + id: editableDelegate + Item { + + Text { + width: parent.width + anchors.margins: 4 + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + elide: styleData.elideMode + text: styleData.value !== undefined ? styleData.value : "" + color: styleData.textColor + visible: !styleData.selected + } + Loader { + id: loaderEditor + anchors.fill: parent + anchors.margins: 4 + Connections { + target: loaderEditor.item + onTextChanged: { + paramsModel.setProperty(styleData.row, styleData.role, loaderEditor.item.text); + } + } + sourceComponent: (styleData.selected) ? editor : null + Component { + id: editor + TextInput { + id: textinput + color: styleData.textColor + text: styleData.value + MouseArea { + id: mouseArea + anchors.fill: parent + hoverEnabled: true + onClicked: textinput.forceActiveFocus() + } + } + } + } + } + } +} diff --git a/mix/qml/TransactionList.qml b/mix/qml/TransactionList.qml new file mode 100644 index 000000000..06ed2fa15 --- /dev/null +++ b/mix/qml/TransactionList.qml @@ -0,0 +1,89 @@ +import QtQuick 2.2 +import QtQuick.Controls.Styles 1.2 +import QtQuick.Controls 1.2 +import QtQuick.Dialogs 1.2 +import QtQuick.Layouts 1.1 + + +Rectangle { + color: "transparent" + id: transactionListContainer + focus: true + anchors.topMargin: 10 + anchors.left: parent.left + height: parent.height + width: parent.width + + ListView { + anchors.top: parent.top + height: parent.height + width: parent.width + id: transactionList + model: transactionListModel + delegate: renderDelegate + } + + Button { + anchors.bottom: parent.bottom + text: qsTr("Add") + onClicked: + { + // Set next id here to work around Qt bug + // https://bugreports.qt-project.org/browse/QTBUG-41327 + // Second call to signal handle would just edit the item that was just created, no harm done + transactionDialog.reset(transactionListModel.count, transactionListModel); + transactionDialog.open(); + transactionDialog.focus = true; + } + } + + TransactionDialog { + id: transactionDialog + onAccepted: { + transactionListModel.edit(transactionDialog); + } + } + + Component { + id: renderDelegate + Item { + id: wrapperItem + height: 20 + width: parent.width + RowLayout + { + anchors.fill: parent + Text { + //anchors.fill: parent + Layout.fillWidth: true + Layout.fillHeight: true + text: title + font.pointSize: 12 + verticalAlignment: Text.AlignBottom + } + ToolButton { + text: qsTr("Edit"); + Layout.fillHeight: true + onClicked: { + transactionDialog.reset(index, transactionListModel); + transactionDialog.open(); + transactionDialog.focus = true; + } + } + ToolButton { + text: qsTr("Delete"); + Layout.fillHeight: true + onClicked: { + } + } + ToolButton { + text: qsTr("Run"); + Layout.fillHeight: true + onClicked: { + transactionListModel.runTransaction(index); + } + } + } + } + } +} diff --git a/mix/qml/js/Debugger.js b/mix/qml/js/Debugger.js index 5cd88d726..d516abde6 100644 --- a/mix/qml/js/Debugger.js +++ b/mix/qml/js/Debugger.js @@ -8,6 +8,7 @@ function init() { currentSelectedState = 0; select(currentSelectedState); + displayReturnValue(); } function moveSelection(incr) @@ -30,7 +31,7 @@ function select(stateIndex) var state = debugStates[stateIndex]; var codeStr = bytesCodeMapping.getValue(state.curPC); highlightSelection(codeStr); - currentSelectedState = codeStr; + currentSelectedState = stateIndex; completeCtxInformation(state); levelList.model = state.levels; levelList.update(); @@ -38,7 +39,6 @@ function select(stateIndex) function highlightSelection(index) { - console.log(index); statesList.currentIndex = index; } @@ -60,3 +60,9 @@ function endOfDebug() debugMemoryTxt.text = state.endOfDebug; headerInfoLabel.text = "EXIT | GAS: " + state.gasLeft; } + +function displayReturnValue() +{ + headerReturnList.model = contractCallReturnParameters; + headerReturnList.update(); +} diff --git a/mix/qml/main.qml b/mix/qml/main.qml index 42ee3ef97..1e7542831 100644 --- a/mix/qml/main.qml +++ b/mix/qml/main.qml @@ -9,8 +9,6 @@ import CodeEditorExtensionManager 1.0 ApplicationWindow { id: mainApplication visible: true - x: Screen.width / 2 - width / 2 - y: Screen.height / 2 - height / 2 width: 1200 height: 600 minimumWidth: 400 @@ -26,6 +24,10 @@ ApplicationWindow { } } } + Component.onCompleted: { + setX(Screen.width / 2 - width / 2); + setY(Screen.height / 2 - height / 2); + } MainContent { } diff --git a/test/stSystemOperationsTestFiller.json b/test/stSystemOperationsTestFiller.json index 34ab5078a..b79066368 100644 --- a/test/stSystemOperationsTestFiller.json +++ b/test/stSystemOperationsTestFiller.json @@ -740,7 +740,7 @@ "transaction" : { "nonce" : "0", "gasPrice" : "1", - "gasLimit" : "365223", + "gasLimit" : "365243", "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", "value" : "100000", "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", @@ -774,7 +774,7 @@ "transaction" : { "nonce" : "0", "gasPrice" : "1", - "gasLimit" : "365224", + "gasLimit" : "365244", "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", "value" : "100000", "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", diff --git a/test/trie.cpp b/test/trie.cpp index 0cf87c212..39a3a59a5 100644 --- a/test/trie.cpp +++ b/test/trie.cpp @@ -50,7 +50,7 @@ static unsigned fac(unsigned _i) BOOST_AUTO_TEST_SUITE(TrieTests) -BOOST_AUTO_TEST_CASE(trie_tests) +BOOST_AUTO_TEST_CASE(trie_test_anyorder) { string testPath = test::getTestPath(); @@ -92,6 +92,69 @@ BOOST_AUTO_TEST_CASE(trie_tests) } } +BOOST_AUTO_TEST_CASE(trie_tests_ordered) +{ + string testPath = test::getTestPath(); + + testPath += "/TrieTests"; + + cnote << "Testing Trie..."; + js::mValue v; + string s = asString(contents(testPath + "/trietest.json")); + BOOST_REQUIRE_MESSAGE(s.length() > 0, "Contents of 'trietest.json' is empty. Have you cloned the 'tests' repo branch develop?"); + js::read_string(s, v); + + for (auto& i: v.get_obj()) + { + cnote << i.first; + js::mObject& o = i.second.get_obj(); + vector> ss; + vector keysToBeDeleted; + for (auto& i: o["in"].get_array()) + { + vector values; + for (auto& s: i.get_array()) + { + if (s.type() == json_spirit::str_type) + values.push_back(s.get_str()); + else if (s.type() == json_spirit::null_type) + { + // mark entry for deletion + values.push_back(""); + if (!values[0].find("0x")) + values[0] = asString(fromHex(values[0].substr(2))); + keysToBeDeleted.push_back(values[0]); + } + else + BOOST_FAIL("Bad type (expected string)"); + } + + BOOST_REQUIRE(values.size() == 2); + ss.push_back(make_pair(values[0], values[1])); + if (!ss.back().first.find("0x")) + ss.back().first = asString(fromHex(ss.back().first.substr(2))); + if (!ss.back().second.find("0x")) + ss.back().second = asString(fromHex(ss.back().second.substr(2))); + } + + MemoryDB m; + GenericTrieDB t(&m); + t.init(); + BOOST_REQUIRE(t.check(true)); + for (auto const& k: ss) + { + if (find(keysToBeDeleted.begin(), keysToBeDeleted.end(), k.first) != keysToBeDeleted.end() && k.second.empty()) + t.remove(k.first); + else + t.insert(k.first, k.second); + BOOST_REQUIRE(t.check(true)); + } + + BOOST_REQUIRE(!o["root"].is_null()); + BOOST_CHECK_EQUAL(o["root"].get_str(), "0x" + toHex(t.root().asArray())); + } +} + inline h256 stringMapHash256(StringMap const& _s) { return hash256(_s); diff --git a/test/vmArithmeticTestFiller.json b/test/vmArithmeticTestFiller.json index b93694575..fb1fb8ddd 100644 --- a/test/vmArithmeticTestFiller.json +++ b/test/vmArithmeticTestFiller.json @@ -18,8 +18,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -46,8 +46,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -74,8 +74,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -102,8 +102,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -130,8 +130,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -158,8 +158,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -187,8 +187,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -216,8 +216,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -244,8 +244,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -272,8 +272,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -300,8 +300,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -328,8 +328,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -356,8 +356,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -385,8 +385,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -413,8 +413,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -441,8 +441,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -469,8 +469,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -497,8 +497,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -525,8 +525,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -553,8 +553,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -581,8 +581,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -609,8 +609,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -637,8 +637,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -665,8 +665,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -693,8 +693,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -721,8 +721,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -749,8 +749,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -777,8 +777,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -805,8 +805,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -833,8 +833,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -861,8 +861,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -889,8 +889,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -917,8 +917,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -945,8 +945,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -973,8 +973,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1001,8 +1001,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1029,8 +1029,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1057,8 +1057,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1085,8 +1085,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1113,8 +1113,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1141,8 +1141,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1169,8 +1169,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1197,8 +1197,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1225,8 +1225,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1253,8 +1253,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1281,8 +1281,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1310,8 +1310,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1338,8 +1338,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1366,8 +1366,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1394,8 +1394,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1422,8 +1422,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1450,8 +1450,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1478,8 +1478,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1507,8 +1507,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1535,8 +1535,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1563,8 +1563,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1591,8 +1591,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1619,8 +1619,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1647,8 +1647,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1675,8 +1675,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1703,8 +1703,2108 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf2_2": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 2 2) [[ 1 ]] (EXP 2 1) [[ 2 ]] (EXP 2 3) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf2_4": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 2 4) [[ 1 ]] (EXP 2 3) [[ 2 ]] (EXP 2 5) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf2_8": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 2 8) [[ 1 ]] (EXP 2 7) [[ 2 ]] (EXP 2 9) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf2_16": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 2 16) [[ 1 ]] (EXP 2 15) [[ 2 ]] (EXP 2 17) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf2_32": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 2 32) [[ 1 ]] (EXP 2 31) [[ 2 ]] (EXP 2 33) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf2_64": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 2 64) [[ 1 ]] (EXP 2 63) [[ 2 ]] (EXP 2 65) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf2_128": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 2 128) [[ 1 ]] (EXP 2 127) [[ 2 ]] (EXP 2 129) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf2_256": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 2 256) [[ 1 ]] (EXP 2 255) [[ 2 ]] (EXP 2 257) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256_1": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 1) [[ 1 ]] (EXP 255 1) [[ 2 ]] (EXP 257 1) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256_2": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 2) [[ 1 ]] (EXP 255 2) [[ 2 ]] (EXP 257 2) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256_3": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 3) [[ 1 ]] (EXP 255 3) [[ 2 ]] (EXP 257 3) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256_4": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 4) [[ 1 ]] (EXP 255 4) [[ 2 ]] (EXP 257 4) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256_5": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 5) [[ 1 ]] (EXP 255 5) [[ 2 ]] (EXP 257 5) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256_6": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 6) [[ 1 ]] (EXP 255 6) [[ 2 ]] (EXP 257 6) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256_7": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 7) [[ 1 ]] (EXP 255 7) [[ 2 ]] (EXP 257 7) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256_8": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 8) [[ 1 ]] (EXP 255 8) [[ 2 ]] (EXP 257 8) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256_9": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 9) [[ 1 ]] (EXP 255 9) [[ 2 ]] (EXP 257 9) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256_10": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 10) [[ 1 ]] (EXP 255 10) [[ 2 ]] (EXP 257 10) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256_11": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 11) [[ 1 ]] (EXP 255 11) [[ 2 ]] (EXP 257 11) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256_12": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 12) [[ 1 ]] (EXP 255 12) [[ 2 ]] (EXP 257 12) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256_13": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 13) [[ 1 ]] (EXP 255 13) [[ 2 ]] (EXP 257 13) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256_14": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 14) [[ 1 ]] (EXP 255 14) [[ 2 ]] (EXP 257 14) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256_15": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 15) [[ 1 ]] (EXP 255 15) [[ 2 ]] (EXP 257 15) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256_16": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 16) [[ 1 ]] (EXP 255 16) [[ 2 ]] (EXP 257 16) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256_17": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 17) [[ 1 ]] (EXP 255 17) [[ 2 ]] (EXP 257 17) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256_18": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 18) [[ 1 ]] (EXP 255 18) [[ 2 ]] (EXP 257 18) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256_19": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 19) [[ 1 ]] (EXP 255 19) [[ 2 ]] (EXP 257 19) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256_20": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 20) [[ 1 ]] (EXP 255 20) [[ 2 ]] (EXP 257 20) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256_21": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 21) [[ 1 ]] (EXP 255 21) [[ 2 ]] (EXP 257 21) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256_22": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 22) [[ 1 ]] (EXP 255 22) [[ 2 ]] (EXP 257 22) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256_23": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 23) [[ 1 ]] (EXP 255 23) [[ 2 ]] (EXP 257 23) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256_24": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 24) [[ 1 ]] (EXP 255 24) [[ 2 ]] (EXP 257 24) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256_25": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 25) [[ 1 ]] (EXP 255 25) [[ 2 ]] (EXP 257 25) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256_26": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 26) [[ 1 ]] (EXP 255 26) [[ 2 ]] (EXP 257 26) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256_27": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 27) [[ 1 ]] (EXP 255 27) [[ 2 ]] (EXP 257 27) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256_28": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 28) [[ 1 ]] (EXP 255 28) [[ 2 ]] (EXP 257 28) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256_29": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 29) [[ 1 ]] (EXP 255 29) [[ 2 ]] (EXP 257 29) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256_30": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 30) [[ 1 ]] (EXP 255 30) [[ 2 ]] (EXP 257 30) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256_31": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 31) [[ 1 ]] (EXP 255 31) [[ 2 ]] (EXP 257 31) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256_32": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 32) [[ 1 ]] (EXP 255 32) [[ 2 ]] (EXP 257 32) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256_33": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 33) [[ 1 ]] (EXP 255 33) [[ 2 ]] (EXP 257 33) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256Of256_0": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 (EXP 256 0)) [[ 1 ]] (EXP 256 (EXP 255 0)) [[ 2 ]] (EXP 256 (EXP 257 0)) [[ 3 ]] (EXP 255 (EXP 256 0)) [[ 4 ]] (EXP 255 (EXP 255 0)) [[ 5 ]] (EXP 255 (EXP 257 0)) [[ 6 ]] (EXP 257 (EXP 256 0)) [[ 7 ]] (EXP 257 (EXP 255 0)) [[ 8 ]] (EXP 257 (EXP 257 0)) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256Of256_1": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 (EXP 256 1)) [[ 1 ]] (EXP 256 (EXP 255 1)) [[ 2 ]] (EXP 256 (EXP 257 1)) [[ 3 ]] (EXP 255 (EXP 256 1)) [[ 4 ]] (EXP 255 (EXP 255 1)) [[ 5 ]] (EXP 255 (EXP 257 1)) [[ 6 ]] (EXP 257 (EXP 256 1)) [[ 7 ]] (EXP 257 (EXP 255 1)) [[ 8 ]] (EXP 257 (EXP 257 1)) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256Of256_2": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 (EXP 256 2)) [[ 1 ]] (EXP 256 (EXP 255 2)) [[ 2 ]] (EXP 256 (EXP 257 2)) [[ 3 ]] (EXP 255 (EXP 256 2)) [[ 4 ]] (EXP 255 (EXP 255 2)) [[ 5 ]] (EXP 255 (EXP 257 2)) [[ 6 ]] (EXP 257 (EXP 256 2)) [[ 7 ]] (EXP 257 (EXP 255 2)) [[ 8 ]] (EXP 257 (EXP 257 2)) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256Of256_3": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 (EXP 256 3)) [[ 1 ]] (EXP 256 (EXP 255 3)) [[ 2 ]] (EXP 256 (EXP 257 3)) [[ 3 ]] (EXP 255 (EXP 256 3)) [[ 4 ]] (EXP 255 (EXP 255 3)) [[ 5 ]] (EXP 255 (EXP 257 3)) [[ 6 ]] (EXP 257 (EXP 256 3)) [[ 7 ]] (EXP 257 (EXP 255 3)) [[ 8 ]] (EXP 257 (EXP 257 3)) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256Of256_4": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 (EXP 256 4)) [[ 1 ]] (EXP 256 (EXP 255 4)) [[ 2 ]] (EXP 256 (EXP 257 4)) [[ 3 ]] (EXP 255 (EXP 256 4)) [[ 4 ]] (EXP 255 (EXP 255 4)) [[ 5 ]] (EXP 255 (EXP 257 4)) [[ 6 ]] (EXP 257 (EXP 256 4)) [[ 7 ]] (EXP 257 (EXP 255 4)) [[ 8 ]] (EXP 257 (EXP 257 4)) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256Of256_5": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 (EXP 256 5)) [[ 1 ]] (EXP 256 (EXP 255 5)) [[ 2 ]] (EXP 256 (EXP 257 5)) [[ 3 ]] (EXP 255 (EXP 256 5)) [[ 4 ]] (EXP 255 (EXP 255 5)) [[ 5 ]] (EXP 255 (EXP 257 5)) [[ 6 ]] (EXP 257 (EXP 256 5)) [[ 7 ]] (EXP 257 (EXP 255 5)) [[ 8 ]] (EXP 257 (EXP 257 5)) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256Of256_6": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 (EXP 256 6)) [[ 1 ]] (EXP 256 (EXP 255 6)) [[ 2 ]] (EXP 256 (EXP 257 6)) [[ 3 ]] (EXP 255 (EXP 256 6)) [[ 4 ]] (EXP 255 (EXP 255 6)) [[ 5 ]] (EXP 255 (EXP 257 6)) [[ 6 ]] (EXP 257 (EXP 256 6)) [[ 7 ]] (EXP 257 (EXP 255 6)) [[ 8 ]] (EXP 257 (EXP 257 6)) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256Of256_7": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 (EXP 256 7)) [[ 1 ]] (EXP 256 (EXP 255 7)) [[ 2 ]] (EXP 256 (EXP 257 7)) [[ 3 ]] (EXP 255 (EXP 256 7)) [[ 4 ]] (EXP 255 (EXP 255 7)) [[ 5 ]] (EXP 255 (EXP 257 7)) [[ 6 ]] (EXP 257 (EXP 256 7)) [[ 7 ]] (EXP 257 (EXP 255 7)) [[ 8 ]] (EXP 257 (EXP 257 7)) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256Of256_8": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 (EXP 256 8)) [[ 1 ]] (EXP 256 (EXP 255 8)) [[ 2 ]] (EXP 256 (EXP 257 8)) [[ 3 ]] (EXP 255 (EXP 256 8)) [[ 4 ]] (EXP 255 (EXP 255 8)) [[ 5 ]] (EXP 255 (EXP 257 8)) [[ 6 ]] (EXP 257 (EXP 256 8)) [[ 7 ]] (EXP 257 (EXP 255 8)) [[ 8 ]] (EXP 257 (EXP 257 8)) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256Of256_9": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 (EXP 256 9)) [[ 1 ]] (EXP 256 (EXP 255 9)) [[ 2 ]] (EXP 256 (EXP 257 9)) [[ 3 ]] (EXP 255 (EXP 256 9)) [[ 4 ]] (EXP 255 (EXP 255 9)) [[ 5 ]] (EXP 255 (EXP 257 9)) [[ 6 ]] (EXP 257 (EXP 256 9)) [[ 7 ]] (EXP 257 (EXP 255 9)) [[ 8 ]] (EXP 257 (EXP 257 9)) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256Of256_10": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 (EXP 256 10)) [[ 1 ]] (EXP 256 (EXP 255 10)) [[ 2 ]] (EXP 256 (EXP 257 10)) [[ 3 ]] (EXP 255 (EXP 256 10)) [[ 4 ]] (EXP 255 (EXP 255 10)) [[ 5 ]] (EXP 255 (EXP 257 10)) [[ 6 ]] (EXP 257 (EXP 256 10)) [[ 7 ]] (EXP 257 (EXP 255 10)) [[ 8 ]] (EXP 257 (EXP 257 10)) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256Of256_11": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 (EXP 256 11)) [[ 1 ]] (EXP 256 (EXP 255 11)) [[ 2 ]] (EXP 256 (EXP 257 11)) [[ 3 ]] (EXP 255 (EXP 256 11)) [[ 4 ]] (EXP 255 (EXP 255 11)) [[ 5 ]] (EXP 255 (EXP 257 11)) [[ 6 ]] (EXP 257 (EXP 256 11)) [[ 7 ]] (EXP 257 (EXP 255 11)) [[ 8 ]] (EXP 257 (EXP 257 11)) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256Of256_12": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 (EXP 256 12)) [[ 1 ]] (EXP 256 (EXP 255 12)) [[ 2 ]] (EXP 256 (EXP 257 12)) [[ 3 ]] (EXP 255 (EXP 256 12)) [[ 4 ]] (EXP 255 (EXP 255 12)) [[ 5 ]] (EXP 255 (EXP 257 12)) [[ 6 ]] (EXP 257 (EXP 256 12)) [[ 7 ]] (EXP 257 (EXP 255 12)) [[ 8 ]] (EXP 257 (EXP 257 12)) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256Of256_13": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 (EXP 256 13)) [[ 1 ]] (EXP 256 (EXP 255 13)) [[ 2 ]] (EXP 256 (EXP 257 13)) [[ 3 ]] (EXP 255 (EXP 256 13)) [[ 4 ]] (EXP 255 (EXP 255 13)) [[ 5 ]] (EXP 255 (EXP 257 13)) [[ 6 ]] (EXP 257 (EXP 256 13)) [[ 7 ]] (EXP 257 (EXP 255 13)) [[ 8 ]] (EXP 257 (EXP 257 13)) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256Of256_14": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 (EXP 256 14)) [[ 1 ]] (EXP 256 (EXP 255 14)) [[ 2 ]] (EXP 256 (EXP 257 14)) [[ 3 ]] (EXP 255 (EXP 256 14)) [[ 4 ]] (EXP 255 (EXP 255 14)) [[ 5 ]] (EXP 255 (EXP 257 14)) [[ 6 ]] (EXP 257 (EXP 256 14)) [[ 7 ]] (EXP 257 (EXP 255 14)) [[ 8 ]] (EXP 257 (EXP 257 14)) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256Of256_15": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 (EXP 256 15)) [[ 1 ]] (EXP 256 (EXP 255 15)) [[ 2 ]] (EXP 256 (EXP 257 15)) [[ 3 ]] (EXP 255 (EXP 256 15)) [[ 4 ]] (EXP 255 (EXP 255 15)) [[ 5 ]] (EXP 255 (EXP 257 15)) [[ 6 ]] (EXP 257 (EXP 256 15)) [[ 7 ]] (EXP 257 (EXP 255 15)) [[ 8 ]] (EXP 257 (EXP 257 15)) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256Of256_16": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 (EXP 256 16)) [[ 1 ]] (EXP 256 (EXP 255 16)) [[ 2 ]] (EXP 256 (EXP 257 16)) [[ 3 ]] (EXP 255 (EXP 256 16)) [[ 4 ]] (EXP 255 (EXP 255 16)) [[ 5 ]] (EXP 255 (EXP 257 16)) [[ 6 ]] (EXP 257 (EXP 256 16)) [[ 7 ]] (EXP 257 (EXP 255 16)) [[ 8 ]] (EXP 257 (EXP 257 16)) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256Of256_17": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 (EXP 256 17)) [[ 1 ]] (EXP 256 (EXP 255 17)) [[ 2 ]] (EXP 256 (EXP 257 17)) [[ 3 ]] (EXP 255 (EXP 256 17)) [[ 4 ]] (EXP 255 (EXP 255 17)) [[ 5 ]] (EXP 255 (EXP 257 17)) [[ 6 ]] (EXP 257 (EXP 256 17)) [[ 7 ]] (EXP 257 (EXP 255 17)) [[ 8 ]] (EXP 257 (EXP 257 17)) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256Of256_18": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 (EXP 256 18)) [[ 1 ]] (EXP 256 (EXP 255 18)) [[ 2 ]] (EXP 256 (EXP 257 18)) [[ 3 ]] (EXP 255 (EXP 256 18)) [[ 4 ]] (EXP 255 (EXP 255 18)) [[ 5 ]] (EXP 255 (EXP 257 18)) [[ 6 ]] (EXP 257 (EXP 256 18)) [[ 7 ]] (EXP 257 (EXP 255 18)) [[ 8 ]] (EXP 257 (EXP 257 18)) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256Of256_19": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 (EXP 256 19)) [[ 1 ]] (EXP 256 (EXP 255 19)) [[ 2 ]] (EXP 256 (EXP 257 19)) [[ 3 ]] (EXP 255 (EXP 256 19)) [[ 4 ]] (EXP 255 (EXP 255 19)) [[ 5 ]] (EXP 255 (EXP 257 19)) [[ 6 ]] (EXP 257 (EXP 256 19)) [[ 7 ]] (EXP 257 (EXP 255 19)) [[ 8 ]] (EXP 257 (EXP 257 19)) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256Of256_20": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 (EXP 256 20)) [[ 1 ]] (EXP 256 (EXP 255 20)) [[ 2 ]] (EXP 256 (EXP 257 20)) [[ 3 ]] (EXP 255 (EXP 256 20)) [[ 4 ]] (EXP 255 (EXP 255 20)) [[ 5 ]] (EXP 255 (EXP 257 20)) [[ 6 ]] (EXP 257 (EXP 256 20)) [[ 7 ]] (EXP 257 (EXP 255 20)) [[ 8 ]] (EXP 257 (EXP 257 20)) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256Of256_21": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 (EXP 256 21)) [[ 1 ]] (EXP 256 (EXP 255 21)) [[ 2 ]] (EXP 256 (EXP 257 21)) [[ 3 ]] (EXP 255 (EXP 256 21)) [[ 4 ]] (EXP 255 (EXP 255 21)) [[ 5 ]] (EXP 255 (EXP 257 21)) [[ 6 ]] (EXP 257 (EXP 256 21)) [[ 7 ]] (EXP 257 (EXP 255 21)) [[ 8 ]] (EXP 257 (EXP 257 21)) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256Of256_22": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 (EXP 256 22)) [[ 1 ]] (EXP 256 (EXP 255 22)) [[ 2 ]] (EXP 256 (EXP 257 22)) [[ 3 ]] (EXP 255 (EXP 256 22)) [[ 4 ]] (EXP 255 (EXP 255 22)) [[ 5 ]] (EXP 255 (EXP 257 22)) [[ 6 ]] (EXP 257 (EXP 256 22)) [[ 7 ]] (EXP 257 (EXP 255 22)) [[ 8 ]] (EXP 257 (EXP 257 22)) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256Of256_23": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 (EXP 256 23)) [[ 1 ]] (EXP 256 (EXP 255 23)) [[ 2 ]] (EXP 256 (EXP 257 23)) [[ 3 ]] (EXP 255 (EXP 256 23)) [[ 4 ]] (EXP 255 (EXP 255 23)) [[ 5 ]] (EXP 255 (EXP 257 23)) [[ 6 ]] (EXP 257 (EXP 256 23)) [[ 7 ]] (EXP 257 (EXP 255 23)) [[ 8 ]] (EXP 257 (EXP 257 23)) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256Of256_24": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 (EXP 256 24)) [[ 1 ]] (EXP 256 (EXP 255 24)) [[ 2 ]] (EXP 256 (EXP 257 24)) [[ 3 ]] (EXP 255 (EXP 256 24)) [[ 4 ]] (EXP 255 (EXP 255 24)) [[ 5 ]] (EXP 255 (EXP 257 24)) [[ 6 ]] (EXP 257 (EXP 256 24)) [[ 7 ]] (EXP 257 (EXP 255 24)) [[ 8 ]] (EXP 257 (EXP 257 24)) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256Of256_25": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 (EXP 256 25)) [[ 1 ]] (EXP 256 (EXP 255 25)) [[ 2 ]] (EXP 256 (EXP 257 25)) [[ 3 ]] (EXP 255 (EXP 256 25)) [[ 4 ]] (EXP 255 (EXP 255 25)) [[ 5 ]] (EXP 255 (EXP 257 25)) [[ 6 ]] (EXP 257 (EXP 256 25)) [[ 7 ]] (EXP 257 (EXP 255 25)) [[ 8 ]] (EXP 257 (EXP 257 25)) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256Of256_26": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 (EXP 256 26)) [[ 1 ]] (EXP 256 (EXP 255 26)) [[ 2 ]] (EXP 256 (EXP 257 26)) [[ 3 ]] (EXP 255 (EXP 256 26)) [[ 4 ]] (EXP 255 (EXP 255 26)) [[ 5 ]] (EXP 255 (EXP 257 26)) [[ 6 ]] (EXP 257 (EXP 256 26)) [[ 7 ]] (EXP 257 (EXP 255 26)) [[ 8 ]] (EXP 257 (EXP 257 26)) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256Of256_27": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 (EXP 256 27)) [[ 1 ]] (EXP 256 (EXP 255 27)) [[ 2 ]] (EXP 256 (EXP 257 27)) [[ 3 ]] (EXP 255 (EXP 256 27)) [[ 4 ]] (EXP 255 (EXP 255 27)) [[ 5 ]] (EXP 255 (EXP 257 27)) [[ 6 ]] (EXP 257 (EXP 256 27)) [[ 7 ]] (EXP 257 (EXP 255 27)) [[ 8 ]] (EXP 257 (EXP 257 27)) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256Of256_28": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 (EXP 256 28)) [[ 1 ]] (EXP 256 (EXP 255 28)) [[ 2 ]] (EXP 256 (EXP 257 28)) [[ 3 ]] (EXP 255 (EXP 256 28)) [[ 4 ]] (EXP 255 (EXP 255 28)) [[ 5 ]] (EXP 255 (EXP 257 28)) [[ 6 ]] (EXP 257 (EXP 256 28)) [[ 7 ]] (EXP 257 (EXP 255 28)) [[ 8 ]] (EXP 257 (EXP 257 28)) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256Of256_29": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 (EXP 256 29)) [[ 1 ]] (EXP 256 (EXP 255 29)) [[ 2 ]] (EXP 256 (EXP 257 29)) [[ 3 ]] (EXP 255 (EXP 256 29)) [[ 4 ]] (EXP 255 (EXP 255 29)) [[ 5 ]] (EXP 255 (EXP 257 29)) [[ 6 ]] (EXP 257 (EXP 256 29)) [[ 7 ]] (EXP 257 (EXP 255 29)) [[ 8 ]] (EXP 257 (EXP 257 29)) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256Of256_30": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 (EXP 256 30)) [[ 1 ]] (EXP 256 (EXP 255 30)) [[ 2 ]] (EXP 256 (EXP 257 30)) [[ 3 ]] (EXP 255 (EXP 256 30)) [[ 4 ]] (EXP 255 (EXP 255 30)) [[ 5 ]] (EXP 255 (EXP 257 30)) [[ 6 ]] (EXP 257 (EXP 256 30)) [[ 7 ]] (EXP 257 (EXP 255 30)) [[ 8 ]] (EXP 257 (EXP 257 30)) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256Of256_31": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 (EXP 256 31)) [[ 1 ]] (EXP 256 (EXP 255 31)) [[ 2 ]] (EXP 256 (EXP 257 31)) [[ 3 ]] (EXP 255 (EXP 256 31)) [[ 4 ]] (EXP 255 (EXP 255 31)) [[ 5 ]] (EXP 255 (EXP 257 31)) [[ 6 ]] (EXP 257 (EXP 256 31)) [[ 7 ]] (EXP 257 (EXP 255 31)) [[ 8 ]] (EXP 257 (EXP 257 31)) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256Of256_32": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 (EXP 256 32)) [[ 1 ]] (EXP 256 (EXP 255 32)) [[ 2 ]] (EXP 256 (EXP 257 32)) [[ 3 ]] (EXP 255 (EXP 256 32)) [[ 4 ]] (EXP 255 (EXP 255 32)) [[ 5 ]] (EXP 255 (EXP 257 32)) [[ 6 ]] (EXP 257 (EXP 256 32)) [[ 7 ]] (EXP 257 (EXP 255 32)) [[ 8 ]] (EXP 257 (EXP 257 32)) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000", + "data" : "", + "gasPrice" : "100000000000000", + "gas" : "10000" + } + }, + + "expPowerOf256Of256_33": { + "env" : { + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", + "currentNumber" : "0", + "currentGasLimit" : "1000000", + "currentDifficulty" : "256", + "currentTimestamp" : 1, + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "nonce" : 0, + "code" : "{ [[ 0 ]] (EXP 256 (EXP 256 33)) [[ 1 ]] (EXP 256 (EXP 255 33)) [[ 2 ]] (EXP 256 (EXP 257 33)) [[ 3 ]] (EXP 255 (EXP 256 33)) [[ 4 ]] (EXP 255 (EXP 255 33)) [[ 5 ]] (EXP 255 (EXP 257 33)) [[ 6 ]] (EXP 257 (EXP 256 33)) [[ 7 ]] (EXP 257 (EXP 255 33)) [[ 8 ]] (EXP 257 (EXP 257 33)) }", + "storage": {} + } + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1731,8 +3831,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1759,8 +3859,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1787,8 +3887,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1815,8 +3915,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1843,8 +3943,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1871,8 +3971,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1899,8 +3999,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1927,8 +4027,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1955,8 +4055,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -1983,8 +4083,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -2011,8 +4111,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", @@ -2039,8 +4139,8 @@ }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000",