From b90c60092d5bfa974189fb26770045dd6d763d55 Mon Sep 17 00:00:00 2001 From: Dmytro Nazarenko Date: Tue, 23 Jan 2024 15:56:02 +0000 Subject: [PATCH 001/154] Update VERSION --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index c5b45eb7b..419f30096 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.18.0 +3.19.0 From 254c97951cafaee74621a7e822e02f5f27d34bf2 Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Thu, 1 Feb 2024 17:45:55 +0000 Subject: [PATCH 002/154] SKALED-1583 Experiments with Patch Architecture --- libethcore/ChainOperationParams.cpp | 24 +-------- libethcore/EVMSchedule.h | 62 +--------------------- libethereum/BlockChain.cpp | 15 ++++++ libethereum/BlockChain.h | 4 ++ libethereum/ChainParams.cpp | 6 +++ libethereum/ChainParams.h | 4 ++ libethereum/Client.cpp | 10 +++- libethereum/SchainPatch.cpp | 2 + libethereum/SchainPatch.h | 33 ++++++++++++ libevm/LegacyVM.cpp | 2 +- libskale/PushZeroPatch.cpp | 11 +++- libskale/PushZeroPatch.h | 7 ++- test/unittests/libethereum/Transaction.cpp | 2 +- 13 files changed, 92 insertions(+), 90 deletions(-) diff --git a/libethcore/ChainOperationParams.cpp b/libethcore/ChainOperationParams.cpp index a42ff19cf..d93edb6c7 100644 --- a/libethcore/ChainOperationParams.cpp +++ b/libethcore/ChainOperationParams.cpp @@ -53,23 +53,7 @@ ChainOperationParams::ChainOperationParams() durationLimit( 0x0d ) {} EVMSchedule const& ChainOperationParams::scheduleForBlockNumber( u256 const& _blockNumber ) const { - if ( _blockNumber >= skaleUnlimitedForkBlock ) - return SkaleSchedule_Unlimited; - else if ( _blockNumber >= skale1024ForkBlock ) - return SkaleSchedule_1024k; - else if ( _blockNumber >= skale512ForkBlock ) - return SkaleSchedule_512k; - else if ( _blockNumber >= skale256ForkBlock ) - return SkaleSchedule_256k; - else if ( _blockNumber >= skale128ForkBlock ) - return SkaleSchedule_128k; - else if ( _blockNumber >= skale64ForkBlock ) - return SkaleSchedule_64k; - else if ( _blockNumber >= skale32ForkBlock ) - return SkaleSchedule_32k; - else if ( _blockNumber >= skale16ForkBlock ) - return SkaleSchedule_16k; - else if ( _blockNumber >= experimentalForkBlock ) + if ( _blockNumber >= experimentalForkBlock ) return ExperimentalSchedule; else if ( _blockNumber >= istanbulForkBlock ) return IstanbulSchedule; @@ -77,18 +61,14 @@ EVMSchedule const& ChainOperationParams::scheduleForBlockNumber( u256 const& _bl return ConstantinopleFixSchedule; else if ( _blockNumber >= constantinopleForkBlock ) return ConstantinopleSchedule; - else if ( _blockNumber >= eWASMForkBlock ) - return EWASMSchedule; else if ( _blockNumber >= byzantiumForkBlock ) return ByzantiumSchedule; else if ( _blockNumber >= EIP158ForkBlock ) return EIP158Schedule; else if ( _blockNumber >= EIP150ForkBlock ) return EIP150Schedule; - else if ( _blockNumber >= homesteadForkBlock ) - return HomesteadSchedule; else - return FrontierSchedule; + return HomesteadSchedule; } u256 ChainOperationParams::blockReward( EVMSchedule const& _schedule ) const { diff --git a/libethcore/EVMSchedule.h b/libethcore/EVMSchedule.h index fe744dd16..b9aec53b5 100644 --- a/libethcore/EVMSchedule.h +++ b/libethcore/EVMSchedule.h @@ -46,6 +46,7 @@ struct EVMSchedule { bool haveExtcodehash = false; bool haveChainID = false; bool haveSelfbalance = false; + bool havePush0 = false; std::array< unsigned, 8 > tierStepGas; unsigned expGas = 10; unsigned expByteGas = 10; @@ -93,7 +94,6 @@ struct EVMSchedule { }; static const EVMSchedule DefaultSchedule = EVMSchedule(); -static const EVMSchedule FrontierSchedule = EVMSchedule( false, false, 21000 ); static const EVMSchedule HomesteadSchedule = EVMSchedule( true, true, 53000 ); static const EVMSchedule EIP150Schedule = [] { @@ -125,12 +125,6 @@ static const EVMSchedule ByzantiumSchedule = [] { return schedule; }(); -static const EVMSchedule EWASMSchedule = [] { - EVMSchedule schedule = ByzantiumSchedule; - schedule.maxCodeSize = std::numeric_limits< unsigned >::max(); - return schedule; -}(); - static const EVMSchedule ConstantinopleSchedule = [] { EVMSchedule schedule = ByzantiumSchedule; schedule.haveCreate2 = true; @@ -174,60 +168,6 @@ static const EVMSchedule ExperimentalSchedule = [] { return schedule; }(); -static const EVMSchedule SkaleSchedule_base = [] { - EVMSchedule schedule = ConstantinopleSchedule; - return schedule; -}(); - -static const EVMSchedule SkaleSchedule_16k = [] { - EVMSchedule schedule = SkaleSchedule_base; - schedule.maxCodeSize = 1024 * 16; - return schedule; -}(); - -static const EVMSchedule SkaleSchedule_32k = [] { - EVMSchedule schedule = SkaleSchedule_base; - schedule.maxCodeSize = 1024 * 32; - return schedule; -}(); - -static const EVMSchedule SkaleSchedule_64k = [] { - EVMSchedule schedule = SkaleSchedule_base; - schedule.maxCodeSize = 1024 * 64; - return schedule; -}(); - -static const EVMSchedule SkaleSchedule_128k = [] { - EVMSchedule schedule = SkaleSchedule_base; - schedule.maxCodeSize = 1024 * 128; - return schedule; -}(); - -static const EVMSchedule SkaleSchedule_256k = [] { - EVMSchedule schedule = SkaleSchedule_base; - schedule.maxCodeSize = 1024 * 256; - return schedule; -}(); - -static const EVMSchedule SkaleSchedule_512k = [] { - EVMSchedule schedule = SkaleSchedule_base; - schedule.maxCodeSize = 1024 * 512; - return schedule; -}(); - -static const EVMSchedule SkaleSchedule_1024k = [] { - EVMSchedule schedule = SkaleSchedule_base; - schedule.maxCodeSize = 1024 * 1024; - return schedule; -}(); - -static const EVMSchedule SkaleSchedule_Unlimited = [] { - EVMSchedule schedule = SkaleSchedule_base; - schedule.maxCodeSize = std::numeric_limits< unsigned >::max(); - return schedule; -}(); - - inline EVMSchedule const& latestScheduleForAccountVersion( u256 const& _version ) { if ( _version == 0 ) return IstanbulSchedule; diff --git a/libethereum/BlockChain.cpp b/libethereum/BlockChain.cpp index 677d19b48..a5abf9b04 100644 --- a/libethereum/BlockChain.cpp +++ b/libethereum/BlockChain.cpp @@ -1776,3 +1776,18 @@ unsigned BlockChain::chainStartBlockNumber() const { auto const value = m_extrasDB->lookup( c_sliceChainStart ); return value.empty() ? 0 : number( h256( value, h256::FromBinary ) ); } + +bool BlockChain::isPatchTimestampActiveInBlockNumber( time_t _ts, BlockNumber _bn ) const { + if ( _bn == 0 || _ts == 0 ) + return false; + + if ( _bn == LatestBlock ) + _bn = number(); + + if ( _bn == PendingBlock ) + _bn = number() + 1; + + time_t prev_ts = this->info( this->numberHash( _bn ) ).timestamp(); + + return prev_ts >= _ts; +} diff --git a/libethereum/BlockChain.h b/libethereum/BlockChain.h index 593475fb1..4bc3f99ef 100644 --- a/libethereum/BlockChain.h +++ b/libethereum/BlockChain.h @@ -453,6 +453,10 @@ class BlockChain { return 0; } + // simple thing to compare _bn-1's timestamp with ts + // maybe need cahing for faster operation + bool isPatchTimestampActiveInBlockNumber( time_t _ts, BlockNumber _bn ) const; + private: static h256 chunkId( unsigned _level, unsigned _index ) { return h256( _index * 0xff + _level ); diff --git a/libethereum/ChainParams.cpp b/libethereum/ChainParams.cpp index 52d3fade1..25022d6d2 100644 --- a/libethereum/ChainParams.cpp +++ b/libethereum/ChainParams.cpp @@ -653,6 +653,12 @@ const std::string& ChainParams::getOriginalJson() const { return originalJSON; } +time_t ChainParams::getPatchTimestamp( const std::string& _name ) const { + if ( _name == "pushZeroPatchTimestamp" ) + return sChain.pushZeroPatchTimestamp; + assert( false ); +} + bool ChainParams::checkAdminOriginAllowed( const std::string& origin ) const { if ( vecAdminOrigins.empty() ) return true; diff --git a/libethereum/ChainParams.h b/libethereum/ChainParams.h index c0cb92ee5..193ee24d5 100644 --- a/libethereum/ChainParams.h +++ b/libethereum/ChainParams.h @@ -74,6 +74,10 @@ struct ChainParams : public ChainOperationParams { const std::string& getOriginalJson() const; void resetJson() { originalJSON = ""; } + // all fields named "*PatchTimestamp" should be read into array, that would be available to this + // function + time_t getPatchTimestamp( const std::string& _name ) const; + private: void populateFromGenesis( bytes const& _genesisRLP, AccountMap const& _state ); diff --git a/libethereum/Client.cpp b/libethereum/Client.cpp index f2c34239f..fb66a1045 100644 --- a/libethereum/Client.cpp +++ b/libethereum/Client.cpp @@ -126,6 +126,8 @@ std::ostream& dev::eth::operator<<( std::ostream& _out, ActivityReport const& _r return _out; } +DEFINE_BASIC_PATCH( MainPatch ) + Client::Client( ChainParams const& _params, int _networkID, std::shared_ptr< GasPricer > _gpForAdoption, std::shared_ptr< SnapshotManager > _snapshotManager, @@ -157,6 +159,10 @@ Client::Client( ChainParams const& _params, int _networkID, init( _forceAction, _networkID ); + ////////////////////////////////////// + MainPatch::isEnabled( bc() ); + ////////////////////////////////////// + // Set timestamps for patches TotalStorageUsedPatch::g_client = this; ContractStorageLimitPatch::setTimestamp( chainParams().sChain.contractStoragePatchTimestamp ); @@ -166,7 +172,7 @@ Client::Client( ChainParams const& _params, int _networkID, RevertableFSPatch::setTimestamp( chainParams().sChain.revertableFSPatchTimestamp ); StorageDestructionPatch::setTimestamp( chainParams().sChain.storageDestructionPatchTimestamp ); POWCheckPatch::setTimestamp( chainParams().sChain.powCheckPatchTimestamp ); - PushZeroPatch::setTimestamp( chainParams().sChain.pushZeroPatchTimestamp ); + // PushZeroPatch::setTimestamp( chainParams().sChain.pushZeroPatchTimestamp ); SkipInvalidTransactionsPatch::setTimestamp( this->chainParams().sChain.skipInvalidTransactionsPatchTimestamp ); PrecompiledConfigPatch::setTimestamp( chainParams().sChain.precompiledConfigPatchTimestamp ); @@ -675,7 +681,7 @@ size_t Client::syncTransactions( RevertableFSPatch::lastBlockTimestamp = blockChain().info().timestamp(); StorageDestructionPatch::lastBlockTimestamp = blockChain().info().timestamp(); POWCheckPatch::lastBlockTimestamp = blockChain().info().timestamp(); - PushZeroPatch::lastBlockTimestamp = blockChain().info().timestamp(); + // PushZeroPatch::lastBlockTimestamp = blockChain().info().timestamp(); SkipInvalidTransactionsPatch::lastBlockTimestamp = blockChain().info().timestamp(); PrecompiledConfigPatch::lastBlockTimestamp = blockChain().info().timestamp(); CorrectForkInPowPatch::lastBlockTimestamp = blockChain().info().timestamp(); diff --git a/libethereum/SchainPatch.cpp b/libethereum/SchainPatch.cpp index 393baf086..1aa2df85d 100644 --- a/libethereum/SchainPatch.cpp +++ b/libethereum/SchainPatch.cpp @@ -1 +1,3 @@ #include "SchainPatch.h" + +DEFINE_BASIC_PATCH( D4Patch ) diff --git a/libethereum/SchainPatch.h b/libethereum/SchainPatch.h index 5bafcdcd0..a44d7deb5 100644 --- a/libethereum/SchainPatch.h +++ b/libethereum/SchainPatch.h @@ -1,8 +1,18 @@ #ifndef SCHAINPATCH_H #define SCHAINPATCH_H +namespace dev { +namespace eth { +class EVMSchedule; +} +} // namespace dev + +#include + #include +#include + class SchainPatch { public: static void printInfo( const std::string& _patchName, time_t _timeStamp ) { @@ -14,4 +24,27 @@ class SchainPatch { } }; +#define DEFINE_BASIC_PATCH( BlaBlaPatch ) \ + class BlaBlaPatch : public SchainPatch { \ + public: \ + static std::string getName() { return #BlaBlaPatch; } \ + static bool isEnabled( \ + const dev::eth::BlockChain& _bc, dev::eth::BlockNumber _bn = dev::eth::LatestBlock ) { \ + time_t timestamp = _bc.chainParams().getPatchTimestamp( getName() ); \ + return _bc.isPatchTimestampActiveInBlockNumber( timestamp, _bn ); \ + } \ + }; + +#define DEFINE_EVM_PATCH( BlaBlaPatch ) \ + class BlaBlaPatch : public SchainPatch { \ + public: \ + static std::string getName() { return #BlaBlaPatch; } \ + static bool isEnabled( \ + const dev::eth::BlockChain& _bc, dev::eth::BlockNumber _bn = dev::eth::LatestBlock ) { \ + time_t timestamp = _bc.chainParams().getPatchTimestamp( getName() ); \ + return _bc.isPatchTimestampActiveInBlockNumber( timestamp, _bn ); \ + } \ + static dev::eth::EVMSchedule makeSchedule( const dev::eth::EVMSchedule& base ); \ + }; + #endif // SCHAINPATCH_H diff --git a/libevm/LegacyVM.cpp b/libevm/LegacyVM.cpp index a987a3b0c..fef0bad62 100644 --- a/libevm/LegacyVM.cpp +++ b/libevm/LegacyVM.cpp @@ -1360,7 +1360,7 @@ void LegacyVM::interpretCases() { // we need to increment program counter only by one since // the value is not read from program code as in PUSH1 CASE( PUSH0 ) { - if ( !PushZeroPatch::isEnabled() ) { + if ( !m_schedule->havePush0 ) { throwBadInstruction(); } ON_OP(); diff --git a/libskale/PushZeroPatch.cpp b/libskale/PushZeroPatch.cpp index e7ef4f6c1..d3eb99302 100644 --- a/libskale/PushZeroPatch.cpp +++ b/libskale/PushZeroPatch.cpp @@ -1,5 +1,5 @@ #include "PushZeroPatch.h" - +/* time_t PushZeroPatch::pushZeroPatchTimestamp; time_t PushZeroPatch::lastBlockTimestamp; @@ -9,3 +9,12 @@ bool PushZeroPatch::isEnabled() { } return pushZeroPatchTimestamp <= lastBlockTimestamp; } +*/ + +using namespace dev::eth; + +EVMSchedule PushZeroPatch::makeSchedule( const EVMSchedule& _base ) { + EVMSchedule ret = _base; + ret.havePush0 = true; + return ret; +} diff --git a/libskale/PushZeroPatch.h b/libskale/PushZeroPatch.h index 6ebab4e9f..d80b22044 100644 --- a/libskale/PushZeroPatch.h +++ b/libskale/PushZeroPatch.h @@ -9,7 +9,7 @@ class Client; /* * Context: enable effective storage destruction - */ + * class PushZeroPatch : public SchainPatch { public: static bool isEnabled(); @@ -24,4 +24,7 @@ class PushZeroPatch : public SchainPatch { friend class dev::eth::Client; static time_t pushZeroPatchTimestamp; static time_t lastBlockTimestamp; -}; \ No newline at end of file +}; +*/ + +DEFINE_EVM_PATCH( PushZeroPatch ) diff --git a/test/unittests/libethereum/Transaction.cpp b/test/unittests/libethereum/Transaction.cpp index 14e53d159..46403923d 100644 --- a/test/unittests/libethereum/Transaction.cpp +++ b/test/unittests/libethereum/Transaction.cpp @@ -41,7 +41,7 @@ BOOST_AUTO_TEST_CASE( TransactionGasRequired, "79f984b031ba048b55bfa915ac795c431978d8a6a992b628d557da5ff759b307d495a36649353a0ef" "ffd310ac743f371de3b9f7f9cb56c0b28ad43601b4ab949f53faa07bd2c804" ), CheckTransaction::None ); - BOOST_CHECK_EQUAL( tr.baseGasRequired( FrontierSchedule ), 14 * 68 + 21000 ); + BOOST_CHECK_EQUAL( tr.baseGasRequired( HomesteadSchedule ), 14 * 68 + 21000 ); BOOST_CHECK_EQUAL( tr.baseGasRequired( IstanbulSchedule ), 14 * 16 + 21000 ); } From b58b6b117a843ec09af7fe7df76f9c6e3910719d Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Fri, 2 Feb 2024 16:45:08 +0000 Subject: [PATCH 003/154] SKALED-1583 Get rid of SealEngine --- libethashseal/Ethash.cpp | 13 ++++++----- libethashseal/Ethash.h | 5 ++-- libethcore/ChainOperationParams.h | 16 +++++++++++++ libethcore/SealEngine.cpp | 15 ++++++------ libethcore/SealEngine.h | 5 ++-- libethereum/Block.cpp | 3 ++- libethereum/BlockChain.cpp | 3 ++- libethereum/Client.cpp | 2 +- libethereum/ClientBase.cpp | 2 +- libethereum/Executive.cpp | 38 ++++++++++++++++--------------- libethereum/Executive.h | 8 +++---- libethereum/ExtVM.cpp | 9 ++++---- libethereum/ExtVM.h | 13 +++++------ libethereum/SkaleHost.cpp | 2 +- libhistoric/AlethExecutive.cpp | 5 ++-- libskale/State.cpp | 10 ++++---- libskale/State.h | 3 +-- libweb3jsonrpc/Debug.cpp | 2 +- 18 files changed, 89 insertions(+), 65 deletions(-) diff --git a/libethashseal/Ethash.cpp b/libethashseal/Ethash.cpp index b8109c7e9..b6921d669 100644 --- a/libethashseal/Ethash.cpp +++ b/libethashseal/Ethash.cpp @@ -130,14 +130,15 @@ void Ethash::verify( Strictness _s, BlockHeader const& _bi, BlockHeader const& _ } } -void Ethash::verifyTransaction( ImportRequirements::value _ir, TransactionBase const& _t, - BlockHeader const& _header, u256 const& _startGasUsed ) const { - SealEngineFace::verifyTransaction( _ir, _t, _header, _startGasUsed ); +void Ethash::verifyTransaction( ChainOperationParams const& _chainParams, + ImportRequirements::value _ir, TransactionBase const& _t, BlockHeader const& _header, + u256 const& _startGasUsed ) { + SealEngineFace::verifyTransaction( _chainParams, _ir, _t, _header, _startGasUsed ); if ( _ir & ImportRequirements::TransactionSignatures ) { - if ( _header.number() >= chainParams().EIP158ForkBlock ) { - uint64_t chainID = chainParams().chainID; - _t.checkChainId( chainID, chainParams().skaleDisableChainIdCheck ); + if ( _header.number() >= _chainParams.EIP158ForkBlock ) { + uint64_t chainID = _chainParams.chainID; + _t.checkChainId( chainID, _chainParams.skaleDisableChainIdCheck ); } // if } } diff --git a/libethashseal/Ethash.h b/libethashseal/Ethash.h index 0fdc6e3dc..f9d5e30d5 100644 --- a/libethashseal/Ethash.h +++ b/libethashseal/Ethash.h @@ -52,8 +52,9 @@ class Ethash : public SealEngineBase { StringHashMap jsInfo( BlockHeader const& _bi ) const override; void verify( Strictness _s, BlockHeader const& _bi, BlockHeader const& _parent, bytesConstRef _block ) const override; - void verifyTransaction( ImportRequirements::value _ir, TransactionBase const& _t, - BlockHeader const& _header, u256 const& _startGasUsed ) const override; + static void verifyTransaction( ChainOperationParams const& _chainParams, + ImportRequirements::value _ir, TransactionBase const& _t, BlockHeader const& _header, + u256 const& _startGasUsed ); void populateFromParent( BlockHeader& _bi, BlockHeader const& _parent ) const override; strings sealers() const override; diff --git a/libethcore/ChainOperationParams.h b/libethcore/ChainOperationParams.h index 678619900..9c848c2a8 100644 --- a/libethcore/ChainOperationParams.h +++ b/libethcore/ChainOperationParams.h @@ -253,6 +253,22 @@ struct ChainOperationParams { u256 externalGasDifficulty = ~u256( 0 ); typedef std::vector< std::string > vecAdminOrigins_t; vecAdminOrigins_t vecAdminOrigins; // wildcard based folters for IP addresses + + bool isPrecompiled( Address const& _a, u256 const& _blockNumber ) const { + return precompiled.count( _a ) != 0 && _blockNumber >= precompiled.at( _a ).startingBlock(); + } + bigint costOfPrecompiled( + Address const& _a, bytesConstRef _in, u256 const& _blockNumber ) const { + return precompiled.at( _a ).cost( _in, *this, _blockNumber ); + } + std::pair< bool, bytes > executePrecompiled( + Address const& _a, bytesConstRef _in, u256 const& ) const { + return precompiled.at( _a ).execute( _in ); + } + bool precompiledExecutionAllowedFrom( + Address const& _a, Address const& _from, bool _readOnly ) const { + return precompiled.at( _a ).executionAllowedFrom( _from, _readOnly ); + } }; } // namespace eth diff --git a/libethcore/SealEngine.cpp b/libethcore/SealEngine.cpp index c72280397..60dc9a6a4 100644 --- a/libethcore/SealEngine.cpp +++ b/libethcore/SealEngine.cpp @@ -94,8 +94,9 @@ void SealEngineFace::populateFromParent( BlockHeader& _bi, BlockHeader const& _p _bi.populateFromParent( _parent ); } -void SealEngineFace::verifyTransaction( ImportRequirements::value _ir, TransactionBase const& _t, - BlockHeader const& _header, u256 const& _gasUsed ) const { +void SealEngineFace::verifyTransaction( ChainOperationParams const& _chainParams, + ImportRequirements::value _ir, TransactionBase const& _t, BlockHeader const& _header, + u256 const& _gasUsed ) { // verifyTransaction is the only place where TransactionBase is used instead of Transaction. u256 gas; if ( POWCheckPatch::isEnabled() ) { @@ -108,26 +109,26 @@ void SealEngineFace::verifyTransaction( ImportRequirements::value _ir, Transacti MICROPROFILE_SCOPEI( "SealEngineFace", "verifyTransaction", MP_ORCHID ); if ( ( _ir & ImportRequirements::TransactionSignatures ) && - _header.number() < chainParams().EIP158ForkBlock && _t.isReplayProtected() ) + _header.number() < _chainParams.EIP158ForkBlock && _t.isReplayProtected() ) BOOST_THROW_EXCEPTION( InvalidSignature() ); if ( ( _ir & ImportRequirements::TransactionSignatures ) && - _header.number() < chainParams().experimentalForkBlock && _t.hasZeroSignature() ) + _header.number() < _chainParams.experimentalForkBlock && _t.hasZeroSignature() ) BOOST_THROW_EXCEPTION( InvalidSignature() ); if ( ( _ir & ImportRequirements::TransactionBasic ) && - _header.number() >= chainParams().experimentalForkBlock && _t.hasZeroSignature() && + _header.number() >= _chainParams.experimentalForkBlock && _t.hasZeroSignature() && ( _t.value() != 0 || _t.gasPrice() != 0 || _t.nonce() != 0 ) ) BOOST_THROW_EXCEPTION( InvalidZeroSignatureTransaction() << errinfo_got( static_cast< bigint >( _t.gasPrice() ) ) << errinfo_got( static_cast< bigint >( _t.value() ) ) << errinfo_got( static_cast< bigint >( _t.nonce() ) ) ); - if ( _header.number() >= chainParams().homesteadForkBlock && + if ( _header.number() >= _chainParams.homesteadForkBlock && ( _ir & ImportRequirements::TransactionSignatures ) && _t.hasSignature() ) _t.checkLowS(); - eth::EVMSchedule const& schedule = evmSchedule( _header.number() ); + eth::EVMSchedule const& schedule = _chainParams.scheduleForBlockNumber( _header.number() ); // Pre calculate the gas needed for execution if ( ( _ir & ImportRequirements::TransactionBasic ) && _t.baseGasRequired( schedule ) > gas ) diff --git a/libethcore/SealEngine.h b/libethcore/SealEngine.h index b51a87bbf..86c3d432d 100644 --- a/libethcore/SealEngine.h +++ b/libethcore/SealEngine.h @@ -57,8 +57,9 @@ class SealEngineFace { virtual void verify( Strictness _s, BlockHeader const& _bi, BlockHeader const& _parent = BlockHeader(), bytesConstRef _block = bytesConstRef() ) const; /// Additional verification for transactions in blocks. - virtual void verifyTransaction( ImportRequirements::value _ir, TransactionBase const& _t, - BlockHeader const& _header, u256 const& _gasUsed ) const; + static void verifyTransaction( ChainOperationParams const& _chainParams, + ImportRequirements::value _ir, TransactionBase const& _t, BlockHeader const& _header, + u256 const& _gasUsed ); /// Don't forget to call Super::populateFromParent when subclassing & overriding. virtual void populateFromParent( BlockHeader& _bi, BlockHeader const& _parent ) const; diff --git a/libethereum/Block.cpp b/libethereum/Block.cpp index d98705d88..ca2f722cf 100644 --- a/libethereum/Block.cpp +++ b/libethereum/Block.cpp @@ -845,7 +845,8 @@ ExecutionResult Block::execute( if ( _t.isInvalid() ) throw -1; // will catch below - resultReceipt = stateSnapshot.execute( envInfo, *m_sealEngine, _t, _p, _onOp ); + resultReceipt = + stateSnapshot.execute( envInfo, m_sealEngine->chainParams(), _t, _p, _onOp ); // use fake receipt created above if execution throws!! } catch ( const TransactionException& ex ) { diff --git a/libethereum/BlockChain.cpp b/libethereum/BlockChain.cpp index a5abf9b04..d1e74c8ed 100644 --- a/libethereum/BlockChain.cpp +++ b/libethereum/BlockChain.cpp @@ -40,6 +40,7 @@ #include #include #include +#include #include #include @@ -1752,7 +1753,7 @@ VerifiedBlockRef BlockChain::verifyBlock( bytesConstRef _block, Transaction t( d, ( _ir & ImportRequirements::TransactionSignatures ) ? CheckTransaction::Everything : CheckTransaction::None ); - m_sealEngine->verifyTransaction( _ir, t, h, 0 ); // the gasUsed vs + Ethash::verifyTransaction( chainParams(), _ir, t, h, 0 ); // the gasUsed vs // blockGasLimit is checked // later in enact function res.transactions.push_back( t ); diff --git a/libethereum/Client.cpp b/libethereum/Client.cpp index fb66a1045..b341ccfc2 100644 --- a/libethereum/Client.cpp +++ b/libethereum/Client.cpp @@ -1224,7 +1224,7 @@ h256 Client::importTransaction( Transaction const& _t ) { Executive::verifyTransaction( _t, bc().number() ? this->blockInfo( bc().currentHash() ) : bc().genesis(), state, - *bc().sealEngine(), 0, gasBidPrice, chainParams().sChain.multiTransactionMode ); + chainParams(), 0, gasBidPrice, chainParams().sChain.multiTransactionMode ); ImportResult res; if ( chainParams().sChain.multiTransactionMode && state.getNonce( _t.sender() ) < _t.nonce() && diff --git a/libethereum/ClientBase.cpp b/libethereum/ClientBase.cpp index 6b6d530b4..0cf4494ba 100644 --- a/libethereum/ClientBase.cpp +++ b/libethereum/ClientBase.cpp @@ -96,7 +96,7 @@ std::pair< bool, ExecutionResult > ClientBase::estimateGasStep( int64_t _gas, Bl State tempState = _latestBlock.mutableState(); tempState.addBalance( _from, ( u256 )( t.gas() * t.gasPrice() + t.value() ) ); ExecutionResult executionResult = - tempState.execute( env, *bc().sealEngine(), t, Permanence::Reverted ).first; + tempState.execute( env, bc().chainParams(), t, Permanence::Reverted ).first; if ( executionResult.excepted == TransactionException::OutOfGas || executionResult.excepted == TransactionException::OutOfGasBase || executionResult.excepted == TransactionException::OutOfGasIntrinsic || diff --git a/libethereum/Executive.cpp b/libethereum/Executive.cpp index d3e93b6b8..9b1e2d53a 100644 --- a/libethereum/Executive.cpp +++ b/libethereum/Executive.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -167,7 +168,7 @@ Executive::Executive( m_envInfo( _s.info(), _bc.lastBlockHashes(), 0, _bc.chainID() ), m_depth( _level ), m_readOnly( _readOnly ), - m_sealEngine( *_bc.sealEngine() ), + m_chainParams( _bc.chainParams() ), m_systemGasPrice( _gasPrice ) {} Executive::Executive( Block& _s, LastBlockHashesFace const& _lh, const u256& _gasPrice, @@ -176,7 +177,7 @@ Executive::Executive( Block& _s, LastBlockHashesFace const& _lh, const u256& _ga m_envInfo( _s.info(), _lh, 0, _s.sealEngine()->chainParams().chainID ), m_depth( _level ), m_readOnly( _readOnly ), - m_sealEngine( *_s.sealEngine() ), + m_chainParams( _s.sealEngine()->chainParams() ), m_systemGasPrice( _gasPrice ) {} u256 Executive::gasUsed() const { @@ -189,7 +190,7 @@ void Executive::accrueSubState( SubState& _parentContext ) { } void Executive::verifyTransaction( Transaction const& _transaction, BlockHeader const& _blockHeader, - const State& _state, const SealEngineFace& _sealEngine, u256 const& _gasUsed, + const State& _state, const eth::ChainOperationParams& _chainParams, u256 const& _gasUsed, const u256& _gasPrice, const bool _allowFuture ) { MICROPROFILE_SCOPEI( "Executive", "verifyTransaction", MP_GAINSBORO ); @@ -199,8 +200,8 @@ void Executive::verifyTransaction( Transaction const& _transaction, BlockHeader static_cast< bigint >( _transaction.gasPrice() ) ) ); } - _sealEngine.verifyTransaction( - ImportRequirements::Everything, _transaction, _blockHeader, _gasUsed ); + Ethash::verifyTransaction( + _chainParams, ImportRequirements::Everything, _transaction, _blockHeader, _gasUsed ); if ( !_transaction.hasZeroSignature() ) { // skip nonce check for calls @@ -244,11 +245,12 @@ void Executive::verifyTransaction( Transaction const& _transaction, BlockHeader void Executive::initialize( Transaction const& _transaction ) { MICROPROFILE_SCOPEI( "Executive", "initialize", MP_GAINSBORO ); m_t = _transaction; - m_baseGasRequired = m_t.baseGasRequired( m_sealEngine.evmSchedule( m_envInfo.number() ) ); + m_baseGasRequired = + m_t.baseGasRequired( m_chainParams.scheduleForBlockNumber( m_envInfo.number() ) ); try { - verifyTransaction( _transaction, m_envInfo.header(), m_s, m_sealEngine, m_envInfo.gasUsed(), - m_systemGasPrice ); + verifyTransaction( _transaction, m_envInfo.header(), m_s, m_chainParams, + m_envInfo.gasUsed(), m_systemGasPrice ); } catch ( Exception const& ex ) { m_excepted = toTransactionException( ex ); throw; @@ -293,7 +295,7 @@ bool Executive::call( CallParameters const& _p, u256 const& _gasPrice, Address c // for the transaction. // Increment associated nonce for sender. if ( _p.senderAddress != MaxAddress || - m_envInfo.number() < m_sealEngine.chainParams().constantinopleForkBlock ) { // EIP86 + m_envInfo.number() < m_chainParams.constantinopleForkBlock ) { // EIP86 MICROPROFILE_SCOPEI( "Executive", "call-incNonce", MP_SEAGREEN ); m_s.incNonce( _p.senderAddress ); } @@ -301,11 +303,11 @@ bool Executive::call( CallParameters const& _p, u256 const& _gasPrice, Address c m_savepoint = m_s.savepoint(); - if ( m_sealEngine.isPrecompiled( _p.codeAddress, m_envInfo.number() ) && - m_sealEngine.precompiledExecutionAllowedFrom( + if ( m_chainParams.isPrecompiled( _p.codeAddress, m_envInfo.number() ) && + m_chainParams.precompiledExecutionAllowedFrom( _p.codeAddress, _p.senderAddress, m_readOnly ) ) { MICROPROFILE_SCOPEI( "Executive", "call-precompiled", MP_CYAN ); - bigint g = m_sealEngine.costOfPrecompiled( _p.codeAddress, _p.data, m_envInfo.number() ); + bigint g = m_chainParams.costOfPrecompiled( _p.codeAddress, _p.data, m_envInfo.number() ); if ( _p.gas < g ) { m_excepted = TransactionException::OutOfGasBase; // Bail from exception. @@ -316,7 +318,7 @@ bool Executive::call( CallParameters const& _p, u256 const& _gasPrice, Address c // https://github.com/ethereum/go-ethereum/pull/3341/files#diff-2433aa143ee4772026454b8abd76b9dd // We mark the account as touched here, so that is can be removed among other touched // empty accounts (after tx finalization) - if ( m_envInfo.number() >= m_sealEngine.chainParams().EIP158ForkBlock ) + if ( m_envInfo.number() >= m_chainParams.EIP158ForkBlock ) m_s.addBalance( _p.codeAddress, 0 ); return true; // true actually means "all finished - nothing more to be done regarding @@ -328,7 +330,7 @@ bool Executive::call( CallParameters const& _p, u256 const& _gasPrice, Address c // dev::eth::g_state = m_s.delegateWrite(); dev::eth::g_overlayFS = m_s.fs(); tie( success, output ) = - m_sealEngine.executePrecompiled( _p.codeAddress, _p.data, m_envInfo.number() ); + m_chainParams.executePrecompiled( _p.codeAddress, _p.data, m_envInfo.number() ); // m_s = dev::eth::g_state.delegateWrite(); size_t outputSize = output.size(); m_output = owning_bytes_ref{ std::move( output ), 0, outputSize }; @@ -346,7 +348,7 @@ bool Executive::call( CallParameters const& _p, u256 const& _gasPrice, Address c h256 codeHash = m_s.codeHash( _p.codeAddress ); // Contract will be executed with the version stored in account auto const version = m_s.version( _p.codeAddress ); - m_ext = make_shared< ExtVM >( m_s, m_envInfo, m_sealEngine, _p.receiveAddress, + m_ext = make_shared< ExtVM >( m_s, m_envInfo, m_chainParams, _p.receiveAddress, _p.senderAddress, _origin, _p.apparentValue, _gasPrice, _p.data, &c, codeHash, version, m_depth, false, _p.staticCall, m_readOnly ); } @@ -388,7 +390,7 @@ bool Executive::executeCreate( Address const& _sender, u256 const& _endowment, u256 const& _gasPrice, u256 const& _gas, bytesConstRef _init, Address const& _origin, u256 const& _version ) { if ( _sender != MaxAddress || - m_envInfo.number() < m_sealEngine.chainParams().experimentalForkBlock ) // EIP86 + m_envInfo.number() < m_chainParams.experimentalForkBlock ) // EIP86 m_s.incNonce( _sender ); m_savepoint = m_s.savepoint(); @@ -415,7 +417,7 @@ bool Executive::executeCreate( Address const& _sender, u256 const& _endowment, m_s.transferBalance( _sender, m_newAddress, _endowment ); u256 newNonce = m_s.requireAccountStartNonce(); - if ( m_envInfo.number() >= m_sealEngine.chainParams().EIP158ForkBlock ) + if ( m_envInfo.number() >= m_chainParams.EIP158ForkBlock ) newNonce += 1; m_s.setNonce( m_newAddress, newNonce ); @@ -423,7 +425,7 @@ bool Executive::executeCreate( Address const& _sender, u256 const& _endowment, // Schedule _init execution if not empty. if ( !_init.empty() ) - m_ext = make_shared< ExtVM >( m_s, m_envInfo, m_sealEngine, m_newAddress, _sender, _origin, + m_ext = make_shared< ExtVM >( m_s, m_envInfo, m_chainParams, m_newAddress, _sender, _origin, _endowment, _gasPrice, bytesConstRef(), _init, sha3( _init ), _version, m_depth, true, false ); else diff --git a/libethereum/Executive.h b/libethereum/Executive.h index 9bc8c0ec5..45a000d39 100644 --- a/libethereum/Executive.h +++ b/libethereum/Executive.h @@ -102,13 +102,13 @@ class StandardTrace { class Executive { public: /// Simple constructor; executive will operate on given state, with the given environment info. - Executive( skale::State& _s, EnvInfo const& _envInfo, SealEngineFace const& _sealEngine, + Executive( skale::State& _s, EnvInfo const& _envInfo, ChainOperationParams const& _chainParams, const u256& _gasPrice, unsigned _level = 0, bool _readOnly = true ) : m_s( _s ), m_envInfo( _envInfo ), m_depth( _level ), m_readOnly( _readOnly ), - m_sealEngine( _sealEngine ), + m_chainParams( _chainParams ), m_systemGasPrice( _gasPrice ) {} /** Easiest constructor. @@ -203,7 +203,7 @@ class Executive { void revert(); static void verifyTransaction( Transaction const& _transaction, BlockHeader const& _blockHeader, - const skale::State& _state, const SealEngineFace& _sealEngine, u256 const& _gasUsed, + const skale::State& _state, const ChainOperationParams& _chainParams, u256 const& _gasUsed, const u256& _gasPrice, const bool _allowFuture = false ); private: @@ -235,7 +235,7 @@ class Executive { LogEntries m_logs; ///< The log entries created by this transaction. Set by finalize(). u256 m_gasCost; - SealEngineFace const& m_sealEngine; + ChainOperationParams const& m_chainParams; u256 m_systemGasPrice; bool m_isCreation = false; diff --git a/libethereum/ExtVM.cpp b/libethereum/ExtVM.cpp index a20931378..453cb0ec0 100644 --- a/libethereum/ExtVM.cpp +++ b/libethereum/ExtVM.cpp @@ -127,7 +127,7 @@ evmc_status_code transactionExceptionToEvmcStatusCode( TransactionException ex ) CallResult ExtVM::call( CallParameters& _p ) { - Executive e{ m_s, envInfo(), m_sealEngine, 0, depth + 1, m_readOnly }; + Executive e{ m_s, envInfo(), m_chainParams, 0, depth + 1, m_readOnly }; if ( !e.call( _p, gasPrice, origin ) ) { go( depth, e, _p.onOp ); e.accrueSubState( sub ); @@ -151,7 +151,7 @@ void ExtVM::setStore( u256 _n, u256 _v ) { CreateResult ExtVM::create( u256 _endowment, u256& io_gas, bytesConstRef _code, Instruction _op, u256 _salt, OnOpFunc const& _onOp ) { - Executive e{ m_s, envInfo(), m_sealEngine, 0, depth + 1 }; + Executive e{ m_s, envInfo(), m_chainParams, 0, depth + 1 }; bool result = false; if ( _op == Instruction::CREATE ) result = e.createOpcode( myAddress, _endowment, gasPrice, io_gas, _code, origin ); @@ -185,7 +185,7 @@ h256 ExtVM::blockHash( u256 _number ) { if ( _number >= currentNumber || _number < ( std::max< u256 >( 256, currentNumber ) - 256 ) ) return h256(); - if ( currentNumber < m_sealEngine.chainParams().experimentalForkBlock + 256 ) { + if ( currentNumber < m_chainParams.experimentalForkBlock + 256 ) { h256 const parentHash = envInfo().header().parentHash(); h256s const lastHashes = envInfo().lastHashes().precedingHashes( parentHash ); @@ -199,6 +199,7 @@ h256 ExtVM::blockHash( u256 _number ) { tx.forceSender( caller ); ExecutionResult res; - std::tie( res, std::ignore ) = m_s.execute( envInfo(), m_sealEngine, tx, Permanence::Reverted ); + std::tie( res, std::ignore ) = + m_s.execute( envInfo(), m_chainParams, tx, Permanence::Reverted ); return h256( res.output ); } diff --git a/libethereum/ExtVM.h b/libethereum/ExtVM.h index 8f166359d..38756b1ee 100644 --- a/libethereum/ExtVM.h +++ b/libethereum/ExtVM.h @@ -37,14 +37,14 @@ class SealEngineFace; class ExtVM : public ExtVMFace { public: /// Full constructor. - ExtVM( skale::State& _s, EnvInfo const& _envInfo, SealEngineFace const& _sealEngine, + ExtVM( skale::State& _s, EnvInfo const& _envInfo, ChainOperationParams const& _chainParams, Address _myAddress, Address _caller, Address _origin, u256 _value, u256 _gasPrice, bytesConstRef _data, bytesConstRef _code, h256 const& _codeHash, u256 const& _version, unsigned _depth, bool _isCreate, bool _staticCall, bool _readOnly = true ) : ExtVMFace( _envInfo, _myAddress, _caller, _origin, _value, _gasPrice, _data, _code.toBytes(), _codeHash, _version, _depth, _isCreate, _staticCall ), m_s( _s ), - m_sealEngine( _sealEngine ), + m_chainParams( _chainParams ), m_evmSchedule( initEvmSchedule( envInfo().number(), _version ) ), m_readOnly( _readOnly ) { // Contract: processing account must exist. In case of CALL, the ExtVM @@ -95,9 +95,7 @@ class ExtVM : public ExtVMFace { virtual void suicide( Address _a ) override final; /// Return the EVM gas-price schedule for this execution context. - virtual EVMSchedule const& evmSchedule() const override final { - return m_sealEngine.evmSchedule( envInfo().number() ); - } + virtual EVMSchedule const& evmSchedule() const override final { return m_evmSchedule; } skale::State const& state() const { return m_s; } @@ -108,7 +106,8 @@ class ExtVM : public ExtVMFace { EVMSchedule const& initEvmSchedule( int64_t _blockNumber, u256 const& _version ) const { // If _version is latest for the block, select corresponding latest schedule. // Otherwise run with the latest schedule known to correspond to the _version. - EVMSchedule const& currentBlockSchedule = m_sealEngine.evmSchedule( _blockNumber ); + EVMSchedule const& currentBlockSchedule = + m_chainParams.scheduleForBlockNumber( _blockNumber ); if ( currentBlockSchedule.accountVersion == _version ) return currentBlockSchedule; else @@ -116,7 +115,7 @@ class ExtVM : public ExtVMFace { } skale::State& m_s; ///< A reference to the base state. - SealEngineFace const& m_sealEngine; + ChainOperationParams const& m_chainParams; EVMSchedule const& m_evmSchedule; bool m_readOnly; }; diff --git a/libethereum/SkaleHost.cpp b/libethereum/SkaleHost.cpp index 01434a060..0b7511b59 100644 --- a/libethereum/SkaleHost.cpp +++ b/libethereum/SkaleHost.cpp @@ -448,7 +448,7 @@ ConsensusExtFace::transactions_vector SkaleHost::pendingTransactions( bool isMtmEnabled = m_client.chainParams().sChain.multiTransactionMode; Executive::verifyTransaction( tx, static_cast< const Interface& >( m_client ).blockInfo( LatestBlock ), - m_client.state().createStateReadOnlyCopy(), *m_client.sealEngine(), 0, + m_client.state().createStateReadOnlyCopy(), m_client.chainParams(), 0, getGasPrice(), isMtmEnabled ); } catch ( const exception& ex ) { if ( to_delete.count( tx.sha3() ) == 0 ) diff --git a/libhistoric/AlethExecutive.cpp b/libhistoric/AlethExecutive.cpp index ebc687dd0..7f63ece22 100644 --- a/libhistoric/AlethExecutive.cpp +++ b/libhistoric/AlethExecutive.cpp @@ -12,6 +12,7 @@ #include "libethereum/Interface.h" #include "libevm/LegacyVM.h" #include "libevm/VMFactory.h" +#include #include using namespace std; @@ -77,8 +78,8 @@ void AlethExecutive::initialize( Transaction const& _transaction ) { m_t = _transaction; m_baseGasRequired = m_t.baseGasRequired( m_sealEngine.evmSchedule( m_envInfo.number() ) ); try { - m_sealEngine.verifyTransaction( - ImportRequirements::Everything, m_t, m_envInfo.header(), m_envInfo.gasUsed() ); + Ethash::verifyTransaction( m_sealEngine.chainParams(), ImportRequirements::Everything, m_t, + m_envInfo.header(), m_envInfo.gasUsed() ); } catch ( Exception const& ex ) { m_excepted = toTransactionException( ex ); throw; diff --git a/libskale/State.cpp b/libskale/State.cpp index 5bf4433d5..d976a4a84 100644 --- a/libskale/State.cpp +++ b/libskale/State.cpp @@ -1008,12 +1008,12 @@ bool State::empty() const { } std::pair< ExecutionResult, TransactionReceipt > State::execute( EnvInfo const& _envInfo, - SealEngineFace const& _sealEngine, Transaction const& _t, Permanence _p, + eth::ChainOperationParams const& _chainParams, Transaction const& _t, Permanence _p, OnOpFunc const& _onOp ) { // Create and initialize the executive. This will throw fairly cheaply and quickly if the // transaction is bad in any way. // HACK 0 here is for gasPrice - Executive e( *this, _envInfo, _sealEngine, 0, 0, _p != Permanence::Committed ); + Executive e( *this, _envInfo, _chainParams, 0, 0, _p != Permanence::Committed ); ExecutionResult res; e.setResultRecipient( res ); @@ -1059,14 +1059,14 @@ std::pair< ExecutionResult, TransactionReceipt > State::execute( EnvInfo const& // shaLastTx.hex() << "\n"; TransactionReceipt receipt = - _envInfo.number() >= _sealEngine.chainParams().byzantiumForkBlock ? + _envInfo.number() >= _chainParams.byzantiumForkBlock ? TransactionReceipt( statusCode, startGasUsed + e.gasUsed(), e.logs() ) : TransactionReceipt( EmptyTrie, startGasUsed + e.gasUsed(), e.logs() ); receipt.setRevertReason( strRevertReason ); m_db_ptr->addReceiptToPartials( receipt ); m_fs_ptr->commit(); - removeEmptyAccounts = _envInfo.number() >= _sealEngine.chainParams().EIP158ForkBlock; + removeEmptyAccounts = _envInfo.number() >= _chainParams.EIP158ForkBlock; commit( removeEmptyAccounts ? dev::eth::CommitBehaviour::RemoveEmptyAccounts : dev::eth::CommitBehaviour::KeepEmptyAccounts ); @@ -1078,7 +1078,7 @@ std::pair< ExecutionResult, TransactionReceipt > State::execute( EnvInfo const& } TransactionReceipt receipt = - _envInfo.number() >= _sealEngine.chainParams().byzantiumForkBlock ? + _envInfo.number() >= _chainParams.byzantiumForkBlock ? TransactionReceipt( statusCode, startGasUsed + e.gasUsed(), e.logs() ) : TransactionReceipt( EmptyTrie, startGasUsed + e.gasUsed(), e.logs() ); receipt.setRevertReason( strRevertReason ); diff --git a/libskale/State.h b/libskale/State.h index 0fe41329e..94c7118ea 100644 --- a/libskale/State.h +++ b/libskale/State.h @@ -55,7 +55,6 @@ struct hash< boost::filesystem::path > { namespace dev { namespace eth { -class SealEngineFace; class Executive; } // namespace eth } // namespace dev @@ -339,7 +338,7 @@ class State { /// Execute a given transaction. /// This will change the state accordingly. std::pair< dev::eth::ExecutionResult, dev::eth::TransactionReceipt > execute( - dev::eth::EnvInfo const& _envInfo, dev::eth::SealEngineFace const& _sealEngine, + dev::eth::EnvInfo const& _envInfo, dev::eth::ChainOperationParams const& _chainParams, dev::eth::Transaction const& _t, Permanence _p = Permanence::Committed, dev::eth::OnOpFunc const& _onOp = dev::eth::OnOpFunc() ); diff --git a/libweb3jsonrpc/Debug.cpp b/libweb3jsonrpc/Debug.cpp index 91cc76bca..780475405 100644 --- a/libweb3jsonrpc/Debug.cpp +++ b/libweb3jsonrpc/Debug.cpp @@ -94,7 +94,7 @@ Json::Value Debug::traceBlock( Block const& _block, Json::Value const& _json ) { EnvInfo envInfo( _block.info(), m_eth.blockChain().lastBlockHashes(), gasUsed, bc.chainID() ); // HACK 0 here is for gasPrice - Executive e( s, envInfo, *m_eth.blockChain().sealEngine(), 0 ); + Executive e( s, envInfo, m_eth.blockChain().chainParams(), 0 ); eth::ExecutionResult er; e.setResultRecipient( er ); From d5ac1eb56b274311982315915315f59a3213a0ac Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Mon, 5 Feb 2024 18:48:17 +0000 Subject: [PATCH 004/154] SKALED-1583 Introduce previous block timestamp parameter in various places --- libethashseal/Ethash.cpp | 7 +++-- libethashseal/Ethash.h | 4 +-- libethcore/ChainOperationParams.cpp | 37 +++++++++++++++++------ libethcore/ChainOperationParams.h | 6 +++- libethcore/SealEngine.cpp | 16 +++++----- libethcore/SealEngine.h | 14 +++++---- libethereum/Block.cpp | 25 ++++++++++----- libethereum/Block.h | 2 +- libethereum/BlockChain.cpp | 4 ++- libethereum/ChainParams.cpp | 6 ---- libethereum/ChainParams.h | 4 --- libethereum/Client.cpp | 5 +-- libethereum/ClientBase.cpp | 14 ++++++--- libethereum/ClientBase.h | 4 +-- libethereum/Executive.cpp | 31 ++++++++++--------- libethereum/Executive.h | 12 +++++--- libethereum/ExtVM.h | 18 ++++++----- libethereum/SchainPatch.h | 12 ++++++++ libethereum/SkaleHost.cpp | 6 +++- libethereum/Transaction.cpp | 5 +-- libethereum/Transaction.h | 3 +- libhistoric/AlethExecutive.cpp | 35 +++++++++++---------- libhistoric/AlethExecutive.h | 12 ++++++-- libhistoric/AlethExtVM.cpp | 8 ++--- libhistoric/AlethExtVM.h | 23 ++++++++------ libhistoric/HistoricState.cpp | 6 ++-- libhistoric/HistoricState.h | 2 +- libskale/State.cpp | 1 + libweb3jsonrpc/Debug.cpp | 2 +- test/tools/libtesteth/ImportTest.cpp | 2 +- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 2 +- 31 files changed, 199 insertions(+), 129 deletions(-) diff --git a/libethashseal/Ethash.cpp b/libethashseal/Ethash.cpp index b6921d669..c54c67239 100644 --- a/libethashseal/Ethash.cpp +++ b/libethashseal/Ethash.cpp @@ -131,9 +131,10 @@ void Ethash::verify( Strictness _s, BlockHeader const& _bi, BlockHeader const& _ } void Ethash::verifyTransaction( ChainOperationParams const& _chainParams, - ImportRequirements::value _ir, TransactionBase const& _t, BlockHeader const& _header, - u256 const& _startGasUsed ) { - SealEngineFace::verifyTransaction( _chainParams, _ir, _t, _header, _startGasUsed ); + ImportRequirements::value _ir, TransactionBase const& _t, time_t _latestBlockTimestamp, + BlockHeader const& _header, u256 const& _startGasUsed ) { + SealEngineFace::verifyTransaction( + _chainParams, _ir, _t, _latestBlockTimestamp, _header, _startGasUsed ); if ( _ir & ImportRequirements::TransactionSignatures ) { if ( _header.number() >= _chainParams.EIP158ForkBlock ) { diff --git a/libethashseal/Ethash.h b/libethashseal/Ethash.h index f9d5e30d5..41d5a8798 100644 --- a/libethashseal/Ethash.h +++ b/libethashseal/Ethash.h @@ -53,8 +53,8 @@ class Ethash : public SealEngineBase { void verify( Strictness _s, BlockHeader const& _bi, BlockHeader const& _parent, bytesConstRef _block ) const override; static void verifyTransaction( ChainOperationParams const& _chainParams, - ImportRequirements::value _ir, TransactionBase const& _t, BlockHeader const& _header, - u256 const& _startGasUsed ); + ImportRequirements::value _ir, TransactionBase const& _t, time_t _latestBlockTimestamp, + BlockHeader const& _header, u256 const& _startGasUsed ); void populateFromParent( BlockHeader& _bi, BlockHeader const& _parent ) const override; strings sealers() const override; diff --git a/libethcore/ChainOperationParams.cpp b/libethcore/ChainOperationParams.cpp index d93edb6c7..83f749b50 100644 --- a/libethcore/ChainOperationParams.cpp +++ b/libethcore/ChainOperationParams.cpp @@ -22,6 +22,9 @@ */ #include "ChainOperationParams.h" + +#include + #include #include @@ -52,23 +55,33 @@ ChainOperationParams::ChainOperationParams() difficultyBoundDivisor( 0x0800 ), durationLimit( 0x0d ) {} -EVMSchedule const& ChainOperationParams::scheduleForBlockNumber( u256 const& _blockNumber ) const { +EVMSchedule const ChainOperationParams::evmSchedule( + time_t _lastBlockTimestamp, u256 const& _blockNumber ) const { + EVMSchedule result; + + // 1 decide by block number if ( _blockNumber >= experimentalForkBlock ) - return ExperimentalSchedule; + result = ExperimentalSchedule; else if ( _blockNumber >= istanbulForkBlock ) - return IstanbulSchedule; + result = IstanbulSchedule; else if ( _blockNumber >= constantinopleFixForkBlock ) - return ConstantinopleFixSchedule; + result = ConstantinopleFixSchedule; else if ( _blockNumber >= constantinopleForkBlock ) - return ConstantinopleSchedule; + result = ConstantinopleSchedule; else if ( _blockNumber >= byzantiumForkBlock ) - return ByzantiumSchedule; + result = ByzantiumSchedule; else if ( _blockNumber >= EIP158ForkBlock ) - return EIP158Schedule; + result = EIP158Schedule; else if ( _blockNumber >= EIP150ForkBlock ) - return EIP150Schedule; + result = EIP150Schedule; else - return HomesteadSchedule; + result = HomesteadSchedule; + + // 2 based on previous - decide by timestamp + if ( PushZeroPatch::isEnabledWhen( *this, _lastBlockTimestamp ) ) + result = PushZeroPatch::makeSchedule( result ); + + return result; } u256 ChainOperationParams::blockReward( EVMSchedule const& _schedule ) const { @@ -81,3 +94,9 @@ u256 ChainOperationParams::blockReward( EVMSchedule const& _schedule ) const { void ChainOperationParams::setBlockReward( u256 const& _newBlockReward ) { m_blockReward = _newBlockReward; } + +time_t ChainOperationParams::getPatchTimestamp( const std::string& _name ) const { + if ( _name == "pushZeroPatchTimestamp" ) + return sChain.pushZeroPatchTimestamp; + assert( false ); +} diff --git a/libethcore/ChainOperationParams.h b/libethcore/ChainOperationParams.h index 9c848c2a8..eb319778b 100644 --- a/libethcore/ChainOperationParams.h +++ b/libethcore/ChainOperationParams.h @@ -206,7 +206,7 @@ struct ChainOperationParams { u256 m_blockReward; public: - EVMSchedule const& scheduleForBlockNumber( u256 const& _blockNumber ) const; + EVMSchedule const evmSchedule( time_t _lastBlockTimestamp, u256 const& _blockNumber ) const; u256 blockReward( EVMSchedule const& _schedule ) const; void setBlockReward( u256 const& _newBlockReward ); u256 maximumExtraDataSize = 1024; @@ -254,6 +254,10 @@ struct ChainOperationParams { typedef std::vector< std::string > vecAdminOrigins_t; vecAdminOrigins_t vecAdminOrigins; // wildcard based folters for IP addresses + // all fields named "*PatchTimestamp" should be read into array, that would be available to this + // function + time_t getPatchTimestamp( const std::string& _name ) const; + bool isPrecompiled( Address const& _a, u256 const& _blockNumber ) const { return precompiled.count( _a ) != 0 && _blockNumber >= precompiled.at( _a ).startingBlock(); } diff --git a/libethcore/SealEngine.cpp b/libethcore/SealEngine.cpp index 60dc9a6a4..5aa5765e1 100644 --- a/libethcore/SealEngine.cpp +++ b/libethcore/SealEngine.cpp @@ -95,8 +95,8 @@ void SealEngineFace::populateFromParent( BlockHeader& _bi, BlockHeader const& _p } void SealEngineFace::verifyTransaction( ChainOperationParams const& _chainParams, - ImportRequirements::value _ir, TransactionBase const& _t, BlockHeader const& _header, - u256 const& _gasUsed ) { + ImportRequirements::value _ir, TransactionBase const& _t, time_t _latestBlockTimestamp, + BlockHeader const& _header, u256 const& _gasUsed ) { // verifyTransaction is the only place where TransactionBase is used instead of Transaction. u256 gas; if ( POWCheckPatch::isEnabled() ) { @@ -128,7 +128,8 @@ void SealEngineFace::verifyTransaction( ChainOperationParams const& _chainParams ( _ir & ImportRequirements::TransactionSignatures ) && _t.hasSignature() ) _t.checkLowS(); - eth::EVMSchedule const& schedule = _chainParams.scheduleForBlockNumber( _header.number() ); + eth::EVMSchedule const& schedule = + _chainParams.evmSchedule( _latestBlockTimestamp, _header.number() ); // Pre calculate the gas needed for execution if ( ( _ir & ImportRequirements::TransactionBasic ) && _t.baseGasRequired( schedule ) > gas ) @@ -152,11 +153,12 @@ SealEngineFace* SealEngineRegistrar::create( ChainOperationParams const& _params return ret; } -EVMSchedule const& SealEngineBase::evmSchedule( u256 const& _blockNumber ) const { - return chainParams().scheduleForBlockNumber( _blockNumber ); +EVMSchedule SealEngineBase::evmSchedule( + time_t _latestBlockTimestamp, u256 const& _blockNumber ) const { + return chainParams().evmSchedule( _latestBlockTimestamp, _blockNumber ); } -u256 SealEngineBase::blockReward( u256 const& _blockNumber ) const { - EVMSchedule const& schedule{ evmSchedule( _blockNumber ) }; +u256 SealEngineBase::blockReward( time_t _latestBlockTimestamp, u256 const& _blockNumber ) const { + EVMSchedule const& schedule{ evmSchedule( _latestBlockTimestamp, _blockNumber ) }; return chainParams().blockReward( schedule ); } diff --git a/libethcore/SealEngine.h b/libethcore/SealEngine.h index 86c3d432d..6eb883ce8 100644 --- a/libethcore/SealEngine.h +++ b/libethcore/SealEngine.h @@ -58,8 +58,8 @@ class SealEngineFace { BlockHeader const& _parent = BlockHeader(), bytesConstRef _block = bytesConstRef() ) const; /// Additional verification for transactions in blocks. static void verifyTransaction( ChainOperationParams const& _chainParams, - ImportRequirements::value _ir, TransactionBase const& _t, BlockHeader const& _header, - u256 const& _gasUsed ); + ImportRequirements::value _ir, TransactionBase const& _t, time_t _latestBlockTimestamp, + BlockHeader const& _header, u256 const& _gasUsed ); /// Don't forget to call Super::populateFromParent when subclassing & overriding. virtual void populateFromParent( BlockHeader& _bi, BlockHeader const& _parent ) const; @@ -94,8 +94,9 @@ class SealEngineFace { setChainParams( _params ); return this; } - virtual EVMSchedule const& evmSchedule( u256 const& _blockNumber ) const = 0; - virtual u256 blockReward( u256 const& _blockNumber ) const = 0; + virtual EVMSchedule evmSchedule( + time_t _latestBlockTimestamp, u256 const& _blockNumber ) const = 0; + virtual u256 blockReward( time_t _latestBlockTimestamp, u256 const& _blockNumber ) const = 0; virtual bool isPrecompiled( Address const& _a, u256 const& _blockNumber ) const { return m_params.precompiled.count( _a ) != 0 && @@ -136,8 +137,9 @@ class SealEngineBase : public SealEngineFace { void onSealGenerated( std::function< void( bytes const& ) > const& _f ) override { m_onSealGenerated = _f; } - EVMSchedule const& evmSchedule( u256 const& _blockNumber ) const override; - u256 blockReward( u256 const& _blockNumber ) const override; + EVMSchedule evmSchedule( + time_t _latestBlockTimestamp, u256 const& _blockNumber ) const override; + u256 blockReward( time_t _latestBlockTimestamp, u256 const& _blockNumber ) const override; protected: std::function< void( bytes const& s ) > m_onSealGenerated; diff --git a/libethereum/Block.cpp b/libethereum/Block.cpp index ca2f722cf..cd23ff18e 100644 --- a/libethereum/Block.cpp +++ b/libethereum/Block.cpp @@ -161,7 +161,8 @@ void Block::resetCurrent( int64_t _timestamp ) { m_committedToSeal = false; performIrregularModifications(); - updateBlockhashContract(); + // TEMPRORARY!!! - put here actian number + updateBlockhashContract( -1 ); // if ( !m_state.checkVersion() ) m_state = m_state.createNewCopyWithLocks(); @@ -351,7 +352,7 @@ pair< TransactionReceipts, bool > Block::sync( // caller if we hit the limit for ( Transaction& transaction : transactions ) { - transaction.checkOutExternalGas( _bc.chainParams(), _bc.number() ); + transaction.checkOutExternalGas( _bc.chainParams(), _bc.info().timestamp(), _bc.number() ); } assert( _bc.currentHash() == m_currentBlock.parentHash() ); @@ -631,7 +632,8 @@ u256 Block::enact( VerifiedBlockRef const& _block, BlockChain const& _bc ) { // << " (state #" // << state().getNonce( tr.from() ) << ") value = " << tr.value() << // endl; - const_cast< Transaction& >( tr ).checkOutExternalGas( _bc.chainParams(), _bc.number() ); + const_cast< Transaction& >( tr ).checkOutExternalGas( + _bc.chainParams(), _bc.info().timestamp(), _bc.number() ); execute( _bc.lastBlockHashes(), tr ); // cerr << "Now: " // << "State #" << state().getNonce( tr.from() ) << endl; @@ -762,7 +764,10 @@ u256 Block::enact( VerifiedBlockRef const& _block, BlockChain const& _bc ) { assert( _bc.sealEngine() ); DEV_TIMED_ABOVE( "applyRewards", 500 ) - applyRewards( rewarded, _bc.sealEngine()->blockReward( m_currentBlock.number() ) ); + applyRewards( + rewarded, _bc.sealEngine()->blockReward( + _bc.info( _bc.numberHash( m_currentBlock.number() - 1 ) ).timestamp(), + m_currentBlock.number() ) ); if ( m_currentBlock.gasUsed() != gasUsed() ) { // Do not commit changes of state @@ -906,7 +911,7 @@ void Block::performIrregularModifications() { } } -void Block::updateBlockhashContract() { +void Block::updateBlockhashContract( time_t _latestBlockTimestamp ) { u256 const& blockNumber = info().number(); u256 const& forkBlock = m_sealEngine->chainParams().experimentalForkBlock; @@ -915,13 +920,14 @@ void Block::updateBlockhashContract() { if ( m_state.code( c_blockhashContractAddress ) != c_blockhashContractCode ) { State state = m_state.createStateModifyCopy(); state.setCode( c_blockhashContractAddress, bytes( c_blockhashContractCode ), - m_sealEngine->evmSchedule( blockNumber ).accountVersion ); + m_sealEngine->evmSchedule( _latestBlockTimestamp, blockNumber ) + .accountVersion ); state.commit( dev::eth::CommitBehaviour::KeepEmptyAccounts ); } } else { m_state.createContract( c_blockhashContractAddress ); m_state.setCode( c_blockhashContractAddress, bytes( c_blockhashContractCode ), - m_sealEngine->evmSchedule( blockNumber ).accountVersion ); + m_sealEngine->evmSchedule( _latestBlockTimestamp, blockNumber ).accountVersion ); m_state.commit( dev::eth::CommitBehaviour::KeepEmptyAccounts ); } } @@ -987,7 +993,10 @@ void Block::commitToSeal( // Apply rewards last of all. assert( _bc.sealEngine() ); - applyRewards( uncleBlockHeaders, _bc.sealEngine()->blockReward( m_currentBlock.number() ) ); + applyRewards( uncleBlockHeaders, + _bc.sealEngine()->blockReward( + _bc.info( _bc.numberHash( m_currentBlock.number() - 1 ) ).timestamp(), + m_currentBlock.number() ) ); // Commit any and all changes to the trie that are in the cache, then update the state root // accordingly. diff --git a/libethereum/Block.h b/libethereum/Block.h index 3dff5b034..0b5eb461b 100644 --- a/libethereum/Block.h +++ b/libethereum/Block.h @@ -318,7 +318,7 @@ class Block { void performIrregularModifications(); /// Creates and updates the special contract for storing block hashes according to EIP96 - void updateBlockhashContract(); + void updateBlockhashContract( time_t _latestBlockTimestamp ); State m_state; ///< Our state. Transactions m_transactions; ///< The current list of transactions that we've included in the diff --git a/libethereum/BlockChain.cpp b/libethereum/BlockChain.cpp index d1e74c8ed..067738362 100644 --- a/libethereum/BlockChain.cpp +++ b/libethereum/BlockChain.cpp @@ -1753,7 +1753,9 @@ VerifiedBlockRef BlockChain::verifyBlock( bytesConstRef _block, Transaction t( d, ( _ir & ImportRequirements::TransactionSignatures ) ? CheckTransaction::Everything : CheckTransaction::None ); - Ethash::verifyTransaction( chainParams(), _ir, t, h, 0 ); // the gasUsed vs + Ethash::verifyTransaction( chainParams(), _ir, t, + this->info( numberHash( h.number() - 1 ) ).timestamp(), h, + 0 ); // the gasUsed vs // blockGasLimit is checked // later in enact function res.transactions.push_back( t ); diff --git a/libethereum/ChainParams.cpp b/libethereum/ChainParams.cpp index 25022d6d2..52d3fade1 100644 --- a/libethereum/ChainParams.cpp +++ b/libethereum/ChainParams.cpp @@ -653,12 +653,6 @@ const std::string& ChainParams::getOriginalJson() const { return originalJSON; } -time_t ChainParams::getPatchTimestamp( const std::string& _name ) const { - if ( _name == "pushZeroPatchTimestamp" ) - return sChain.pushZeroPatchTimestamp; - assert( false ); -} - bool ChainParams::checkAdminOriginAllowed( const std::string& origin ) const { if ( vecAdminOrigins.empty() ) return true; diff --git a/libethereum/ChainParams.h b/libethereum/ChainParams.h index 193ee24d5..c0cb92ee5 100644 --- a/libethereum/ChainParams.h +++ b/libethereum/ChainParams.h @@ -74,10 +74,6 @@ struct ChainParams : public ChainOperationParams { const std::string& getOriginalJson() const; void resetJson() { originalJSON = ""; } - // all fields named "*PatchTimestamp" should be read into array, that would be available to this - // function - time_t getPatchTimestamp( const std::string& _name ) const; - private: void populateFromGenesis( bytes const& _genesisRLP, AccountMap const& _state ); diff --git a/libethereum/Client.cpp b/libethereum/Client.cpp index b341ccfc2..db178461a 100644 --- a/libethereum/Client.cpp +++ b/libethereum/Client.cpp @@ -1219,10 +1219,11 @@ h256 Client::importTransaction( Transaction const& _t ) { // We need to check external gas under mutex to be sure about current block bumber // correctness - const_cast< Transaction& >( _t ).checkOutExternalGas( chainParams(), number() ); + const_cast< Transaction& >( _t ).checkOutExternalGas( + chainParams(), bc().info().timestamp(), number() ); } - Executive::verifyTransaction( _t, + Executive::verifyTransaction( _t, bc().info().timestamp(), bc().number() ? this->blockInfo( bc().currentHash() ) : bc().genesis(), state, chainParams(), 0, gasBidPrice, chainParams().sChain.multiTransactionMode ); diff --git a/libethereum/ClientBase.cpp b/libethereum/ClientBase.cpp index 0cf4494ba..66ae35b1b 100644 --- a/libethereum/ClientBase.cpp +++ b/libethereum/ClientBase.cpp @@ -116,11 +116,11 @@ std::pair< u256, ExecutionResult > ClientBase::estimateGas( Address const& _from int64_t upperBound = _maxGas; if ( upperBound == Invalid256 || upperBound > c_maxGasEstimate ) upperBound = c_maxGasEstimate; - int64_t lowerBound = - CorrectForkInPowPatch::isEnabled() ? - Transaction::baseGasRequired( !_dest, &_data, - bc().sealEngine()->chainParams().scheduleForBlockNumber( bc().number() ) ) : - Transaction::baseGasRequired( !_dest, &_data, EVMSchedule() ); + int64_t lowerBound = CorrectForkInPowPatch::isEnabled() ? + Transaction::baseGasRequired( !_dest, &_data, + bc().sealEngine()->chainParams().evmSchedule( + bc().info().timestamp(), bc().number() ) ) : + Transaction::baseGasRequired( !_dest, &_data, EVMSchedule() ); Block bk = latestBlock(); if ( upperBound > bk.info().gasLimit() ) { @@ -499,6 +499,10 @@ BlockDetails ClientBase::pendingDetails() const { pm.parentHash(), h256s{}, postSeal().blockData().size() ); } +EVMSchedule ClientBase::evmSchedule() const { + return sealEngine()->evmSchedule( bc().info().timestamp(), pendingInfo().number() ); +} + u256 ClientBase::gasLimitRemaining() const { return postSeal().gasLimitRemaining(); } diff --git a/libethereum/ClientBase.h b/libethereum/ClientBase.h index ab4b7a812..ba453ecb0 100644 --- a/libethereum/ClientBase.h +++ b/libethereum/ClientBase.h @@ -153,9 +153,7 @@ class ClientBase : public Interface { BlockHeader pendingInfo() const override; BlockDetails pendingDetails() const override; - EVMSchedule evmSchedule() const override { - return sealEngine()->evmSchedule( pendingInfo().number() ); - } + EVMSchedule evmSchedule() const override; ImportResult injectBlock( bytes const& _block ) override; diff --git a/libethereum/Executive.cpp b/libethereum/Executive.cpp index 9b1e2d53a..27370be4d 100644 --- a/libethereum/Executive.cpp +++ b/libethereum/Executive.cpp @@ -189,9 +189,10 @@ void Executive::accrueSubState( SubState& _parentContext ) { _parentContext += m_ext->sub; } -void Executive::verifyTransaction( Transaction const& _transaction, BlockHeader const& _blockHeader, - const State& _state, const eth::ChainOperationParams& _chainParams, u256 const& _gasUsed, - const u256& _gasPrice, const bool _allowFuture ) { +void Executive::verifyTransaction( Transaction const& _transaction, time_t _latestBlockTimestamp, + BlockHeader const& _blockHeader, const State& _state, + const eth::ChainOperationParams& _chainParams, u256 const& _gasUsed, const u256& _gasPrice, + const bool _allowFuture ) { MICROPROFILE_SCOPEI( "Executive", "verifyTransaction", MP_GAINSBORO ); if ( !_transaction.hasExternalGas() && _transaction.gasPrice() < _gasPrice ) { @@ -200,8 +201,8 @@ void Executive::verifyTransaction( Transaction const& _transaction, BlockHeader static_cast< bigint >( _transaction.gasPrice() ) ) ); } - Ethash::verifyTransaction( - _chainParams, ImportRequirements::Everything, _transaction, _blockHeader, _gasUsed ); + Ethash::verifyTransaction( _chainParams, ImportRequirements::Everything, _transaction, + _latestBlockTimestamp, _blockHeader, _gasUsed ); if ( !_transaction.hasZeroSignature() ) { // skip nonce check for calls @@ -245,12 +246,12 @@ void Executive::verifyTransaction( Transaction const& _transaction, BlockHeader void Executive::initialize( Transaction const& _transaction ) { MICROPROFILE_SCOPEI( "Executive", "initialize", MP_GAINSBORO ); m_t = _transaction; - m_baseGasRequired = - m_t.baseGasRequired( m_chainParams.scheduleForBlockNumber( m_envInfo.number() ) ); + m_baseGasRequired = m_t.baseGasRequired( + m_chainParams.evmSchedule( m_latestBlockTimestamp, m_envInfo.number() ) ); try { - verifyTransaction( _transaction, m_envInfo.header(), m_s, m_chainParams, - m_envInfo.gasUsed(), m_systemGasPrice ); + verifyTransaction( _transaction, m_latestBlockTimestamp, m_envInfo.header(), m_s, + m_chainParams, m_envInfo.gasUsed(), m_systemGasPrice ); } catch ( Exception const& ex ) { m_excepted = toTransactionException( ex ); throw; @@ -348,9 +349,9 @@ bool Executive::call( CallParameters const& _p, u256 const& _gasPrice, Address c h256 codeHash = m_s.codeHash( _p.codeAddress ); // Contract will be executed with the version stored in account auto const version = m_s.version( _p.codeAddress ); - m_ext = make_shared< ExtVM >( m_s, m_envInfo, m_chainParams, _p.receiveAddress, - _p.senderAddress, _origin, _p.apparentValue, _gasPrice, _p.data, &c, codeHash, - version, m_depth, false, _p.staticCall, m_readOnly ); + m_ext = make_shared< ExtVM >( m_s, m_envInfo, m_chainParams, m_latestBlockTimestamp, + _p.receiveAddress, _p.senderAddress, _origin, _p.apparentValue, _gasPrice, _p.data, + &c, codeHash, version, m_depth, false, _p.staticCall, m_readOnly ); } } @@ -425,9 +426,9 @@ bool Executive::executeCreate( Address const& _sender, u256 const& _endowment, // Schedule _init execution if not empty. if ( !_init.empty() ) - m_ext = make_shared< ExtVM >( m_s, m_envInfo, m_chainParams, m_newAddress, _sender, _origin, - _endowment, _gasPrice, bytesConstRef(), _init, sha3( _init ), _version, m_depth, true, - false ); + m_ext = make_shared< ExtVM >( m_s, m_envInfo, m_chainParams, m_latestBlockTimestamp, + m_newAddress, _sender, _origin, _endowment, _gasPrice, bytesConstRef(), _init, + sha3( _init ), _version, m_depth, true, false ); else // code stays empty, but we set the version m_s.setCode( m_newAddress, {}, _version ); diff --git a/libethereum/Executive.h b/libethereum/Executive.h index 45a000d39..c465a9dfa 100644 --- a/libethereum/Executive.h +++ b/libethereum/Executive.h @@ -103,12 +103,14 @@ class Executive { public: /// Simple constructor; executive will operate on given state, with the given environment info. Executive( skale::State& _s, EnvInfo const& _envInfo, ChainOperationParams const& _chainParams, - const u256& _gasPrice, unsigned _level = 0, bool _readOnly = true ) + time_t _latestBlockTimestamp, const u256& _gasPrice, unsigned _level = 0, + bool _readOnly = true ) : m_s( _s ), m_envInfo( _envInfo ), m_depth( _level ), m_readOnly( _readOnly ), m_chainParams( _chainParams ), + m_latestBlockTimestamp( _latestBlockTimestamp ), m_systemGasPrice( _gasPrice ) {} /** Easiest constructor. @@ -202,9 +204,10 @@ class Executive { /// Revert all changes made to the state by this execution. void revert(); - static void verifyTransaction( Transaction const& _transaction, BlockHeader const& _blockHeader, - const skale::State& _state, const ChainOperationParams& _chainParams, u256 const& _gasUsed, - const u256& _gasPrice, const bool _allowFuture = false ); + static void verifyTransaction( Transaction const& _transaction, time_t _latestBlockTimestamp, + BlockHeader const& _blockHeader, const skale::State& _state, + const ChainOperationParams& _chainParams, u256 const& _gasUsed, const u256& _gasPrice, + const bool _allowFuture = false ); private: /// @returns false iff go() must be called (and thus a VM execution in required). @@ -236,6 +239,7 @@ class Executive { u256 m_gasCost; ChainOperationParams const& m_chainParams; + time_t m_latestBlockTimestamp; u256 m_systemGasPrice; bool m_isCreation = false; diff --git a/libethereum/ExtVM.h b/libethereum/ExtVM.h index 38756b1ee..79e62ad7c 100644 --- a/libethereum/ExtVM.h +++ b/libethereum/ExtVM.h @@ -38,14 +38,15 @@ class ExtVM : public ExtVMFace { public: /// Full constructor. ExtVM( skale::State& _s, EnvInfo const& _envInfo, ChainOperationParams const& _chainParams, - Address _myAddress, Address _caller, Address _origin, u256 _value, u256 _gasPrice, - bytesConstRef _data, bytesConstRef _code, h256 const& _codeHash, u256 const& _version, - unsigned _depth, bool _isCreate, bool _staticCall, bool _readOnly = true ) + time_t _latestBlockTimestamp, Address _myAddress, Address _caller, Address _origin, + u256 _value, u256 _gasPrice, bytesConstRef _data, bytesConstRef _code, + h256 const& _codeHash, u256 const& _version, unsigned _depth, bool _isCreate, + bool _staticCall, bool _readOnly = true ) : ExtVMFace( _envInfo, _myAddress, _caller, _origin, _value, _gasPrice, _data, _code.toBytes(), _codeHash, _version, _depth, _isCreate, _staticCall ), m_s( _s ), m_chainParams( _chainParams ), - m_evmSchedule( initEvmSchedule( envInfo().number(), _version ) ), + m_evmSchedule( initEvmSchedule( _latestBlockTimestamp, envInfo().number(), _version ) ), m_readOnly( _readOnly ) { // Contract: processing account must exist. In case of CALL, the ExtVM // is created only if an account has code (so exist). In case of CREATE @@ -103,11 +104,12 @@ class ExtVM : public ExtVMFace { h256 blockHash( u256 _number ) override; private: - EVMSchedule const& initEvmSchedule( int64_t _blockNumber, u256 const& _version ) const { + EVMSchedule initEvmSchedule( + time_t _latestBlockTimestamp, int64_t _blockNumber, u256 const& _version ) const { // If _version is latest for the block, select corresponding latest schedule. // Otherwise run with the latest schedule known to correspond to the _version. - EVMSchedule const& currentBlockSchedule = - m_chainParams.scheduleForBlockNumber( _blockNumber ); + EVMSchedule currentBlockSchedule = + m_chainParams.evmSchedule( _latestBlockTimestamp, _blockNumber ); if ( currentBlockSchedule.accountVersion == _version ) return currentBlockSchedule; else @@ -116,7 +118,7 @@ class ExtVM : public ExtVMFace { skale::State& m_s; ///< A reference to the base state. ChainOperationParams const& m_chainParams; - EVMSchedule const& m_evmSchedule; + EVMSchedule const m_evmSchedule; bool m_readOnly; }; diff --git a/libethereum/SchainPatch.h b/libethereum/SchainPatch.h index a44d7deb5..9c862e72f 100644 --- a/libethereum/SchainPatch.h +++ b/libethereum/SchainPatch.h @@ -9,6 +9,8 @@ class EVMSchedule; #include +#include + #include #include @@ -33,6 +35,11 @@ class SchainPatch { time_t timestamp = _bc.chainParams().getPatchTimestamp( getName() ); \ return _bc.isPatchTimestampActiveInBlockNumber( timestamp, _bn ); \ } \ + static bool isEnabledWhen( \ + const dev::eth::ChainOperationParams& _cp, time_t _lastBlockTimestamp ) { \ + time_t my_timestamp = _cp.getPatchTimestamp( getName() ); \ + return _lastBlockTimestamp >= my_timestamp; \ + } \ }; #define DEFINE_EVM_PATCH( BlaBlaPatch ) \ @@ -44,6 +51,11 @@ class SchainPatch { time_t timestamp = _bc.chainParams().getPatchTimestamp( getName() ); \ return _bc.isPatchTimestampActiveInBlockNumber( timestamp, _bn ); \ } \ + static bool isEnabledWhen( \ + const dev::eth::ChainOperationParams& _cp, time_t _lastBlockTimestamp ) { \ + time_t my_timestamp = _cp.getPatchTimestamp( getName() ); \ + return _lastBlockTimestamp >= my_timestamp; \ + } \ static dev::eth::EVMSchedule makeSchedule( const dev::eth::EVMSchedule& base ); \ }; diff --git a/libethereum/SkaleHost.cpp b/libethereum/SkaleHost.cpp index 0b7511b59..d29974572 100644 --- a/libethereum/SkaleHost.cpp +++ b/libethereum/SkaleHost.cpp @@ -447,6 +447,9 @@ ConsensusExtFace::transactions_vector SkaleHost::pendingTransactions( try { bool isMtmEnabled = m_client.chainParams().sChain.multiTransactionMode; Executive::verifyTransaction( tx, + static_cast< const Interface& >( m_client ) + .blockInfo( LatestBlock ) + .timestamp(), static_cast< const Interface& >( m_client ).blockInfo( LatestBlock ), m_client.state().createStateReadOnlyCopy(), m_client.chainParams(), 0, getGasPrice(), isMtmEnabled ); @@ -667,7 +670,8 @@ void SkaleHost::createBlock( const ConsensusExtFace::transactions_vector& _appro // ).detach(); } else { Transaction t( data, CheckTransaction::Everything, true ); - t.checkOutExternalGas( m_client.chainParams(), m_client.number() ); + t.checkOutExternalGas( + m_client.chainParams(), m_client.bc().info().timestamp(), m_client.number() ); out_txns.push_back( t ); LOG( m_debugLogger ) << "Will import consensus-born txn"; m_debugTracer.tracepoint( "import_consensus_born" ); diff --git a/libethereum/Transaction.cpp b/libethereum/Transaction.cpp index de556a0f9..d5870b51c 100644 --- a/libethereum/Transaction.cpp +++ b/libethereum/Transaction.cpp @@ -181,7 +181,8 @@ u256 Transaction::gasPrice() const { } } -void Transaction::checkOutExternalGas( const ChainParams& _cp, uint64_t _bn, bool _force ) { +void Transaction::checkOutExternalGas( + const ChainParams& _cp, time_t _latestBlockTimestamp, uint64_t _bn, bool _force ) { u256 const& difficulty = _cp.externalGasDifficulty; assert( difficulty > 0 ); if ( ( _force || !m_externalGasIsChecked ) && !isInvalid() ) { @@ -195,7 +196,7 @@ void Transaction::checkOutExternalGas( const ChainParams& _cp, uint64_t _bn, boo EVMSchedule scheduleForUse = ConstantinopleSchedule; if ( CorrectForkInPowPatch::isEnabled() ) - scheduleForUse = _cp.scheduleForBlockNumber( _bn ); + scheduleForUse = _cp.evmSchedule( _latestBlockTimestamp, _bn ); // never call checkOutExternalGas with non-last block if ( _bn != CorrectForkInPowPatch::getLastBlockNumber() ) { diff --git a/libethereum/Transaction.h b/libethereum/Transaction.h index dffadb347..572024aa2 100644 --- a/libethereum/Transaction.h +++ b/libethereum/Transaction.h @@ -122,7 +122,8 @@ class Transaction : public TransactionBase { u256 gasPrice() const; - void checkOutExternalGas( const ChainParams& _cp, uint64_t _bn, bool _force = false ); + void checkOutExternalGas( + const ChainParams& _cp, time_t _latestBlockTimestamp, uint64_t _bn, bool _force = false ); void ignoreExternalGas() { m_externalGasIsChecked = true; diff --git a/libhistoric/AlethExecutive.cpp b/libhistoric/AlethExecutive.cpp index 7f63ece22..76803ca61 100644 --- a/libhistoric/AlethExecutive.cpp +++ b/libhistoric/AlethExecutive.cpp @@ -76,10 +76,11 @@ void AlethExecutive::accrueSubState( SubState& _parentContext ) { void AlethExecutive::initialize( Transaction const& _transaction ) { m_t = _transaction; - m_baseGasRequired = m_t.baseGasRequired( m_sealEngine.evmSchedule( m_envInfo.number() ) ); + m_baseGasRequired = m_t.baseGasRequired( + m_chainParams.evmSchedule( m_latestBlockTimestamp, m_envInfo.number() ) ); try { - Ethash::verifyTransaction( m_sealEngine.chainParams(), ImportRequirements::Everything, m_t, - m_envInfo.header(), m_envInfo.gasUsed() ); + Ethash::verifyTransaction( m_chainParams, ImportRequirements::Everything, m_t, + m_latestBlockTimestamp, m_envInfo.header(), m_envInfo.gasUsed() ); } catch ( Exception const& ex ) { m_excepted = toTransactionException( ex ); throw; @@ -151,14 +152,14 @@ bool AlethExecutive::call( // for the transaction. // Increment associated nonce for sender. if ( _p.senderAddress != MaxAddress || - m_envInfo.number() < m_sealEngine.chainParams().experimentalForkBlock ) // EIP86 + m_envInfo.number() < m_chainParams.experimentalForkBlock ) // EIP86 m_s.incNonce( _p.senderAddress ); } m_savepoint = m_s.savepoint(); - if ( m_sealEngine.isPrecompiled( _p.codeAddress, m_envInfo.number() ) ) { + if ( m_chainParams.isPrecompiled( _p.codeAddress, m_envInfo.number() ) ) { // Empty RIPEMD contract needs to be deleted even in case of OOG // because of the anomaly on the main net caused by buggy behavior by both Geth and Parity // https://github.com/ethereum/go-ethereum/pull/3341/files#diff-2433aa143ee4772026454b8abd76b9dd @@ -169,7 +170,7 @@ bool AlethExecutive::call( if ( _p.receiveAddress == c_RipemdPrecompiledAddress ) m_s.unrevertableTouch( _p.codeAddress ); - bigint g = m_sealEngine.costOfPrecompiled( _p.codeAddress, _p.data, m_envInfo.number() ); + bigint g = m_chainParams.costOfPrecompiled( _p.codeAddress, _p.data, m_envInfo.number() ); if ( _p.gas < g ) { m_excepted = TransactionException::OutOfGasBase; // Bail from exception. @@ -180,7 +181,7 @@ bool AlethExecutive::call( bytes output; bool success; tie( success, output ) = - m_sealEngine.executePrecompiled( _p.codeAddress, _p.data, m_envInfo.number() ); + m_chainParams.executePrecompiled( _p.codeAddress, _p.data, m_envInfo.number() ); size_t outputSize = output.size(); m_output = owning_bytes_ref{ std::move( output ), 0, outputSize }; if ( !success ) { @@ -197,9 +198,10 @@ bool AlethExecutive::call( // Contract will be executed with the version stored in account auto const version = m_s.version( _p.codeAddress ); - m_ext = make_shared< AlethExtVM >( m_s, m_envInfo, m_sealEngine, _p.receiveAddress, - _p.senderAddress, _origin, _p.apparentValue, _gasPrice, _p.data, &c, codeHash, - version, m_depth, false, _p.staticCall ); + m_ext = + make_shared< AlethExtVM >( m_s, m_envInfo, m_chainParams, m_latestBlockTimestamp, + _p.receiveAddress, _p.senderAddress, _origin, _p.apparentValue, _gasPrice, + _p.data, &c, codeHash, version, m_depth, false, _p.staticCall ); } } @@ -211,7 +213,8 @@ bool AlethExecutive::call( bool AlethExecutive::create( Address const& _txSender, u256 const& _endowment, u256 const& _gasPrice, u256 const& _gas, bytesConstRef _init, Address const& _origin ) { // Contract will be created with the version corresponding to latest hard fork - auto const latestVersion = m_sealEngine.evmSchedule( m_envInfo.number() ).accountVersion; + auto const latestVersion = + m_chainParams.evmSchedule( m_latestBlockTimestamp, m_envInfo.number() ).accountVersion; return createWithAddressFromNonceAndSender( _txSender, _endowment, _gasPrice, _gas, _init, _origin, latestVersion ); } @@ -245,7 +248,7 @@ bool AlethExecutive::executeCreate( Address const& _sender, u256 const& _endowme u256 const& _gasPrice, u256 const& _gas, bytesConstRef _init, Address const& _origin, u256 const& _version ) { if ( _sender != MaxAddress || - m_envInfo.number() < m_sealEngine.chainParams().experimentalForkBlock ) // EIP86 + m_envInfo.number() < m_chainParams.experimentalForkBlock ) // EIP86 m_s.incNonce( _sender ); m_savepoint = m_s.savepoint(); @@ -272,7 +275,7 @@ bool AlethExecutive::executeCreate( Address const& _sender, u256 const& _endowme m_s.transferBalance( _sender, m_newAddress, _endowment ); u256 newNonce = m_s.requireAccountStartNonce(); - if ( m_envInfo.number() >= m_sealEngine.chainParams().EIP158ForkBlock ) + if ( m_envInfo.number() >= m_chainParams.EIP158ForkBlock ) newNonce += 1; m_s.setNonce( m_newAddress, newNonce ); @@ -280,9 +283,9 @@ bool AlethExecutive::executeCreate( Address const& _sender, u256 const& _endowme // Schedule _init execution if not empty. if ( !_init.empty() ) - m_ext = make_shared< AlethExtVM >( m_s, m_envInfo, m_sealEngine, m_newAddress, _sender, - _origin, _endowment, _gasPrice, bytesConstRef(), _init, sha3( _init ), _version, - m_depth, true, false ); + m_ext = make_shared< AlethExtVM >( m_s, m_envInfo, m_chainParams, m_latestBlockTimestamp, + m_newAddress, _sender, _origin, _endowment, _gasPrice, bytesConstRef(), _init, + sha3( _init ), _version, m_depth, true, false ); else // code stays empty, but we set the version m_s.setCode( m_newAddress, {}, _version ); diff --git a/libhistoric/AlethExecutive.h b/libhistoric/AlethExecutive.h index 62f18c8b1..5005146f2 100644 --- a/libhistoric/AlethExecutive.h +++ b/libhistoric/AlethExecutive.h @@ -47,8 +47,13 @@ class AlethExecutive { public: /// Simple constructor; executive will operate on given state, with the given environment info. AlethExecutive( dev::eth::HistoricState& _s, EnvInfo const& _envInfo, - SealEngineFace const& _sealEngine, unsigned _level = 0 ) - : m_s( _s ), m_envInfo( _envInfo ), m_depth( _level ), m_sealEngine( _sealEngine ){}; + ChainOperationParams const& _chainParams, time_t _latestBlockTimestamp, + unsigned _level = 0 ) + : m_s( _s ), + m_envInfo( _envInfo ), + m_depth( _level ), + m_chainParams( _chainParams ), + m_latestBlockTimestamp( _latestBlockTimestamp ){}; /** Easiest constructor. * Creates executive to operate on the state of end of the given block, populating environment @@ -167,7 +172,8 @@ class AlethExecutive { LogEntries m_logs; ///< The log entries created by this transaction. Set by finalize(). u256 m_gasCost; - SealEngineFace const& m_sealEngine; + ChainOperationParams const& m_chainParams; + time_t m_latestBlockTimestamp; bool m_isCreation = false; Address m_newAddress; diff --git a/libhistoric/AlethExtVM.cpp b/libhistoric/AlethExtVM.cpp index 4e4c2eb5a..2f8905443 100644 --- a/libhistoric/AlethExtVM.cpp +++ b/libhistoric/AlethExtVM.cpp @@ -109,7 +109,7 @@ evmc_status_code transactionExceptionToEvmcStatusCode( TransactionException ex ) CallResult AlethExtVM::call( CallParameters& _p ) { - dev::eth::AlethExecutive e{ m_s, envInfo(), m_sealEngine, depth + 1 }; + dev::eth::AlethExecutive e{ m_s, envInfo(), m_chainParams, depth + 1 }; if ( !e.call( _p, gasPrice, origin ) ) { go( depth, e, _p.onOp ); e.accrueSubState( sub ); @@ -133,7 +133,7 @@ void AlethExtVM::setStore( u256 _n, u256 _v ) { CreateResult AlethExtVM::create( u256 _endowment, u256& io_gas, bytesConstRef _code, Instruction _op, u256 _salt, OnOpFunc const& _onOp ) { - AlethExecutive e{ m_s, envInfo(), m_sealEngine, depth + 1 }; + AlethExecutive e{ m_s, envInfo(), m_chainParams, depth + 1 }; bool result = false; if ( _op == Instruction::CREATE ) result = e.createOpcode( myAddress, _endowment, gasPrice, io_gas, _code, origin ); @@ -167,7 +167,7 @@ h256 AlethExtVM::blockHash( u256 _number ) { if ( _number >= currentNumber || _number < ( std::max< u256 >( 256, currentNumber ) - 256 ) ) return h256(); - if ( currentNumber < m_sealEngine.chainParams().experimentalForkBlock + 256 ) { + if ( currentNumber < m_chainParams.experimentalForkBlock + 256 ) { h256 const parentHash = envInfo().header().parentHash(); h256s const lastHashes = envInfo().lastHashes().precedingHashes( parentHash ); @@ -182,6 +182,6 @@ h256 AlethExtVM::blockHash( u256 _number ) { ExecutionResult res; std::tie( res, std::ignore ) = - m_s.execute( envInfo(), m_sealEngine, tx, skale::Permanence::Reverted ); + m_s.execute( envInfo(), m_chainParams, tx, skale::Permanence::Reverted ); return h256( res.output ); } diff --git a/libhistoric/AlethExtVM.h b/libhistoric/AlethExtVM.h index 4e63e0674..c529da768 100644 --- a/libhistoric/AlethExtVM.h +++ b/libhistoric/AlethExtVM.h @@ -30,15 +30,16 @@ class SealEngineFace; class AlethExtVM : public ExtVMFace { public: /// Full constructor. - AlethExtVM( HistoricState& _s, EnvInfo const& _envInfo, SealEngineFace const& _sealEngine, - Address _myAddress, Address _caller, Address _origin, u256 _value, u256 _gasPrice, - bytesConstRef _data, bytesConstRef _code, h256 const& _codeHash, u256 const& _version, - unsigned _depth, bool _isCreate, bool _staticCall ) + AlethExtVM( HistoricState& _s, EnvInfo const& _envInfo, + ChainOperationParams const& _chainParams, time_t _latestBlockTimestamp, Address _myAddress, + Address _caller, Address _origin, u256 _value, u256 _gasPrice, bytesConstRef _data, + bytesConstRef _code, h256 const& _codeHash, u256 const& _version, unsigned _depth, + bool _isCreate, bool _staticCall ) : ExtVMFace( _envInfo, _myAddress, _caller, _origin, _value, _gasPrice, _data, _code.toBytes(), _codeHash, _version, _depth, _isCreate, _staticCall ), m_s( _s ), - m_sealEngine( _sealEngine ), - m_evmSchedule( initEvmSchedule( envInfo().number(), _version ) ) { + m_chainParams( _chainParams ), + m_evmSchedule( initEvmSchedule( _latestBlockTimestamp, envInfo().number(), _version ) ) { // Contract: processing account must exist. In case of CALL, the ExtVM // is created only if an account has code (so exist). In case of CREATE // the account must be created first. @@ -95,10 +96,12 @@ class AlethExtVM : public ExtVMFace { h256 blockHash( u256 _number ) final; private: - EVMSchedule const& initEvmSchedule( int64_t _blockNumber, u256 const& _version ) const { + EVMSchedule initEvmSchedule( + time_t _latestBlockTimestamp, int64_t _blockNumber, u256 const& _version ) const { // If _version is latest for the block, select corresponding latest schedule. // Otherwise run with the latest schedule known to correspond to the _version. - EVMSchedule const& currentBlockSchedule = m_sealEngine.evmSchedule( _blockNumber ); + EVMSchedule currentBlockSchedule = + m_chainParams.evmSchedule( _latestBlockTimestamp, _blockNumber ); if ( currentBlockSchedule.accountVersion == _version ) return currentBlockSchedule; else @@ -107,8 +110,8 @@ class AlethExtVM : public ExtVMFace { dev::eth::HistoricState& m_s; ///< A reference to the base state. - SealEngineFace const& m_sealEngine; - EVMSchedule const& m_evmSchedule; + ChainOperationParams const& m_chainParams; + EVMSchedule const m_evmSchedule; }; } // namespace eth diff --git a/libhistoric/HistoricState.cpp b/libhistoric/HistoricState.cpp index ecb4a49f7..f0f13d931 100644 --- a/libhistoric/HistoricState.cpp +++ b/libhistoric/HistoricState.cpp @@ -584,11 +584,11 @@ void HistoricState::rollback( size_t _savepoint ) { } std::pair< ExecutionResult, TransactionReceipt > HistoricState::execute( EnvInfo const& _envInfo, - SealEngineFace const& _sealEngine, Transaction const& _t, skale::Permanence _p, + eth::ChainOperationParams const& _chainParams, Transaction const& _t, skale::Permanence _p, OnOpFunc const& _onOp ) { // Create and initialize the executive. This will throw fairly cheaply and quickly if the // transaction is bad in any way. - AlethExecutive e( *this, _envInfo, _sealEngine ); + AlethExecutive e( *this, _envInfo, _chainParams, 0 ); ExecutionResult res; e.setResultRecipient( res ); @@ -617,7 +617,7 @@ std::pair< ExecutionResult, TransactionReceipt > HistoricState::execute( EnvInfo } TransactionReceipt const receipt = - _envInfo.number() >= _sealEngine.chainParams().byzantiumForkBlock ? + _envInfo.number() >= _chainParams.byzantiumForkBlock ? TransactionReceipt( statusCode, startGasUsed + e.gasUsed(), e.logs() ) : TransactionReceipt( globalRoot(), startGasUsed + e.gasUsed(), e.logs() ); return make_pair( res, receipt ); diff --git a/libhistoric/HistoricState.h b/libhistoric/HistoricState.h index ab07529b7..201e214d3 100644 --- a/libhistoric/HistoricState.h +++ b/libhistoric/HistoricState.h @@ -157,7 +157,7 @@ class HistoricState { /// Execute a given transaction. /// This will change the state accordingly. std::pair< ExecutionResult, TransactionReceipt > execute( EnvInfo const& _envInfo, - SealEngineFace const& _sealEngine, Transaction const& _t, + eth::ChainOperationParams const& _chainParams, Transaction const& _t, skale::Permanence _p = skale::Permanence::Committed, OnOpFunc const& _onOp = OnOpFunc() ); diff --git a/libskale/State.cpp b/libskale/State.cpp index d976a4a84..ded0c76ff 100644 --- a/libskale/State.cpp +++ b/libskale/State.cpp @@ -1013,6 +1013,7 @@ std::pair< ExecutionResult, TransactionReceipt > State::execute( EnvInfo const& // Create and initialize the executive. This will throw fairly cheaply and quickly if the // transaction is bad in any way. // HACK 0 here is for gasPrice + // TODO Not sure that 1st 0 as timestamp is acceptable here Executive e( *this, _envInfo, _chainParams, 0, 0, _p != Permanence::Committed ); ExecutionResult res; e.setResultRecipient( res ); diff --git a/libweb3jsonrpc/Debug.cpp b/libweb3jsonrpc/Debug.cpp index 780475405..883a4f65e 100644 --- a/libweb3jsonrpc/Debug.cpp +++ b/libweb3jsonrpc/Debug.cpp @@ -94,7 +94,7 @@ Json::Value Debug::traceBlock( Block const& _block, Json::Value const& _json ) { EnvInfo envInfo( _block.info(), m_eth.blockChain().lastBlockHashes(), gasUsed, bc.chainID() ); // HACK 0 here is for gasPrice - Executive e( s, envInfo, m_eth.blockChain().chainParams(), 0 ); + Executive e( s, envInfo, m_eth.blockChain().chainParams(), _block.info().timestamp(), 0 ); eth::ExecutionResult er; e.setResultRecipient( er ); diff --git a/test/tools/libtesteth/ImportTest.cpp b/test/tools/libtesteth/ImportTest.cpp index 7ecf2283d..45bd07598 100644 --- a/test/tools/libtesteth/ImportTest.cpp +++ b/test/tools/libtesteth/ImportTest.cpp @@ -103,7 +103,7 @@ void ImportTest::makeBlockchainTestFromStateTest( set< eth::Network > const& _ne // Calculate the block reward ChainParams const chainParams{genesisInfo( net )}; - EVMSchedule const schedule = chainParams.scheduleForBlockNumber( 1 ); + EVMSchedule const schedule = chainParams.evmSchedule( 1 ); // u256 const blockReward = chainParams.blockReward(schedule); TrExpectSection search{trDup, smap}; diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index 041b8d6b0..9fd8bd109 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -2002,7 +2002,7 @@ contract TestEstimateGas { dev::bytes data = dev::jsToBytes( estimateGasCall["data"].asString() ); BOOST_REQUIRE( dev::jsToU256( estimatedGas ) > dev::eth::TransactionBase::baseGasRequired( - false, &data, fixture.client->chainParams().scheduleForBlockNumber( + false, &data, fixture.client->chainParams().evmSchedule( fixture.client->number() ) ) ); // try to send with this gas From 31b663e2dad3a5c11c88531a22e970b639296efd Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Tue, 6 Feb 2024 16:10:07 +0000 Subject: [PATCH 005/154] SKALED-1583 Draft usage of block timestamp for fork estimation --- libethcore/ChainOperationParams.cpp | 2 +- libethereum/Block.cpp | 22 ++++++++++++++-------- libethereum/Block.h | 3 ++- libethereum/Client.cpp | 9 ++------- libethereum/ClientBase.cpp | 5 ++++- libethereum/ClientTest.cpp | 2 +- libethereum/ExtVM.cpp | 2 +- libethereum/ExtVM.h | 4 +++- libskale/State.cpp | 7 ++++--- libskale/State.h | 3 ++- 10 files changed, 34 insertions(+), 25 deletions(-) diff --git a/libethcore/ChainOperationParams.cpp b/libethcore/ChainOperationParams.cpp index 83f749b50..ba00a7f91 100644 --- a/libethcore/ChainOperationParams.cpp +++ b/libethcore/ChainOperationParams.cpp @@ -96,7 +96,7 @@ void ChainOperationParams::setBlockReward( u256 const& _newBlockReward ) { } time_t ChainOperationParams::getPatchTimestamp( const std::string& _name ) const { - if ( _name == "pushZeroPatchTimestamp" ) + if ( _name == "PushZeroPatch" ) return sChain.pushZeroPatchTimestamp; assert( false ); } diff --git a/libethereum/Block.cpp b/libethereum/Block.cpp index cd23ff18e..6a3e22450 100644 --- a/libethereum/Block.cpp +++ b/libethereum/Block.cpp @@ -358,6 +358,8 @@ pair< TransactionReceipts, bool > Block::sync( assert( _bc.currentHash() == m_currentBlock.parentHash() ); auto deadline = chrono::steady_clock::now() + chrono::milliseconds( msTimeout ); + time_t latestBlockTimestamp = _bc.info().timestamp(); + for ( int goodTxs = max( 0, ( int ) transactions.size() - 1 ); goodTxs < ( int ) transactions.size(); ) { goodTxs = 0; @@ -366,7 +368,8 @@ pair< TransactionReceipts, bool > Block::sync( try { if ( t.gasPrice() >= _gp.ask( *this ) ) { // Timer t; - execute( _bc.lastBlockHashes(), t, Permanence::Uncommitted ); + execute( _bc.lastBlockHashes(), t, latestBlockTimestamp, + Permanence::Uncommitted ); ret.first.push_back( m_receipts.back() ); ++goodTxs; // cnote << "TX took:" << t.elapsed() * 1000; @@ -456,6 +459,7 @@ tuple< TransactionReceipts, unsigned > Block::syncEveryone( // NB! Not commit! Commit will be after 1st transaction! m_state.clearPartialTransactionReceipts(); + time_t latestBlockTimestamp = _bc.info().timestamp(); unsigned count_bad = 0; for ( unsigned i = 0; i < _transactions.size(); ++i ) { @@ -506,8 +510,8 @@ tuple< TransactionReceipts, unsigned > Block::syncEveryone( continue; } - ExecutionResult res = - execute( _bc.lastBlockHashes(), tr, Permanence::Committed, OnOpFunc() ); + ExecutionResult res = execute( _bc.lastBlockHashes(), tr, latestBlockTimestamp, + Permanence::Committed, OnOpFunc() ); if ( !SkipInvalidTransactionsPatch::isEnabled() || res.excepted != TransactionException::WouldNotBeInBlock ) { @@ -623,6 +627,8 @@ u256 Block::enact( VerifiedBlockRef const& _block, BlockChain const& _bc ) { vector< bytes > receipts; + time_t latestBlockTimestamp = _bc.info().timestamp(); + // All ok with the block generally. Play back the transactions now... unsigned i = 0; DEV_TIMED_ABOVE( "txExec", 500 ) @@ -634,7 +640,7 @@ u256 Block::enact( VerifiedBlockRef const& _block, BlockChain const& _bc ) { // endl; const_cast< Transaction& >( tr ).checkOutExternalGas( _bc.chainParams(), _bc.info().timestamp(), _bc.number() ); - execute( _bc.lastBlockHashes(), tr ); + execute( _bc.lastBlockHashes(), tr, latestBlockTimestamp ); // cerr << "Now: " // << "State #" << state().getNonce( tr.from() ) << endl; // cnote << m_state; @@ -819,8 +825,8 @@ ExecutionResult Block::executeHistoricCall( #endif -ExecutionResult Block::execute( - LastBlockHashesFace const& _lh, Transaction const& _t, Permanence _p, OnOpFunc const& _onOp ) { +ExecutionResult Block::execute( LastBlockHashesFace const& _lh, Transaction const& _t, + time_t _latestBlockTimestamp, Permanence _p, OnOpFunc const& _onOp ) { MICROPROFILE_SCOPEI( "Block", "execute transaction", MP_CORNFLOWERBLUE ); if ( isSealed() ) BOOST_THROW_EXCEPTION( InvalidOperationOnSealedBlock() ); @@ -850,8 +856,8 @@ ExecutionResult Block::execute( if ( _t.isInvalid() ) throw -1; // will catch below - resultReceipt = - stateSnapshot.execute( envInfo, m_sealEngine->chainParams(), _t, _p, _onOp ); + resultReceipt = stateSnapshot.execute( + envInfo, m_sealEngine->chainParams(), _latestBlockTimestamp, _t, _p, _onOp ); // use fake receipt created above if execution throws!! } catch ( const TransactionException& ex ) { diff --git a/libethereum/Block.h b/libethereum/Block.h index 0b5eb461b..94bb160ae 100644 --- a/libethereum/Block.h +++ b/libethereum/Block.h @@ -212,7 +212,8 @@ class Block { /// Execute a given transaction. /// This will append @a _t to the transaction list and change the state accordingly. ExecutionResult execute( LastBlockHashesFace const& _lh, Transaction const& _t, - skale::Permanence _p = skale::Permanence::Committed, OnOpFunc const& _onOp = OnOpFunc() ); + time_t _latestBlockTimestamp, skale::Permanence _p = skale::Permanence::Committed, + OnOpFunc const& _onOp = OnOpFunc() ); #ifdef HISTORIC_STATE diff --git a/libethereum/Client.cpp b/libethereum/Client.cpp index db178461a..9008d95fb 100644 --- a/libethereum/Client.cpp +++ b/libethereum/Client.cpp @@ -126,8 +126,6 @@ std::ostream& dev::eth::operator<<( std::ostream& _out, ActivityReport const& _r return _out; } -DEFINE_BASIC_PATCH( MainPatch ) - Client::Client( ChainParams const& _params, int _networkID, std::shared_ptr< GasPricer > _gpForAdoption, std::shared_ptr< SnapshotManager > _snapshotManager, @@ -159,10 +157,6 @@ Client::Client( ChainParams const& _params, int _networkID, init( _forceAction, _networkID ); - ////////////////////////////////////// - MainPatch::isEnabled( bc() ); - ////////////////////////////////////// - // Set timestamps for patches TotalStorageUsedPatch::g_client = this; ContractStorageLimitPatch::setTimestamp( chainParams().sChain.contractStoragePatchTimestamp ); @@ -1305,7 +1299,8 @@ ExecutionResult Client::call( Address const& _from, u256 _value, Address _dest, t.ignoreExternalGas(); if ( _ff == FudgeFactor::Lenient ) temp.mutableState().addBalance( _from, ( u256 )( t.gas() * t.gasPrice() + t.value() ) ); - ret = temp.execute( bc().lastBlockHashes(), t, skale::Permanence::Reverted ); + ret = temp.execute( + bc().lastBlockHashes(), t, bc().info().timestamp(), skale::Permanence::Reverted ); } catch ( InvalidNonce const& in ) { LOG( m_logger ) << "exception in client call(1):" << boost::current_exception_diagnostic_information() << std::endl; diff --git a/libethereum/ClientBase.cpp b/libethereum/ClientBase.cpp index 66ae35b1b..7364fb785 100644 --- a/libethereum/ClientBase.cpp +++ b/libethereum/ClientBase.cpp @@ -96,7 +96,10 @@ std::pair< bool, ExecutionResult > ClientBase::estimateGasStep( int64_t _gas, Bl State tempState = _latestBlock.mutableState(); tempState.addBalance( _from, ( u256 )( t.gas() * t.gasPrice() + t.value() ) ); ExecutionResult executionResult = - tempState.execute( env, bc().chainParams(), t, Permanence::Reverted ).first; + tempState + .execute( + env, bc().chainParams(), _latestBlock.info().timestamp(), t, Permanence::Reverted ) + .first; if ( executionResult.excepted == TransactionException::OutOfGas || executionResult.excepted == TransactionException::OutOfGasBase || executionResult.excepted == TransactionException::OutOfGasIntrinsic || diff --git a/libethereum/ClientTest.cpp b/libethereum/ClientTest.cpp index 85e9ebe58..6c7d30ef3 100644 --- a/libethereum/ClientTest.cpp +++ b/libethereum/ClientTest.cpp @@ -70,7 +70,7 @@ void ClientTest::modifyTimestamp( int64_t _timestamp ) { auto& lastHashes = bc().lastBlockHashes(); assert( bc().currentHash() == block.info().parentHash() ); for ( auto const& t : transactions ) - block.execute( lastHashes, t ); + block.execute( lastHashes, t, bc().info().timestamp() ); DEV_WRITE_GUARDED( x_working ) m_working = block; diff --git a/libethereum/ExtVM.cpp b/libethereum/ExtVM.cpp index 453cb0ec0..8ac5d709d 100644 --- a/libethereum/ExtVM.cpp +++ b/libethereum/ExtVM.cpp @@ -200,6 +200,6 @@ h256 ExtVM::blockHash( u256 _number ) { ExecutionResult res; std::tie( res, std::ignore ) = - m_s.execute( envInfo(), m_chainParams, tx, Permanence::Reverted ); + m_s.execute( envInfo(), m_chainParams, m_latestBlockTimestamp, tx, Permanence::Reverted ); return h256( res.output ); } diff --git a/libethereum/ExtVM.h b/libethereum/ExtVM.h index 79e62ad7c..f0692b2bd 100644 --- a/libethereum/ExtVM.h +++ b/libethereum/ExtVM.h @@ -45,8 +45,9 @@ class ExtVM : public ExtVMFace { : ExtVMFace( _envInfo, _myAddress, _caller, _origin, _value, _gasPrice, _data, _code.toBytes(), _codeHash, _version, _depth, _isCreate, _staticCall ), m_s( _s ), + m_latestBlockTimestamp( _latestBlockTimestamp ), m_chainParams( _chainParams ), - m_evmSchedule( initEvmSchedule( _latestBlockTimestamp, envInfo().number(), _version ) ), + m_evmSchedule( initEvmSchedule( m_latestBlockTimestamp, envInfo().number(), _version ) ), m_readOnly( _readOnly ) { // Contract: processing account must exist. In case of CALL, the ExtVM // is created only if an account has code (so exist). In case of CREATE @@ -117,6 +118,7 @@ class ExtVM : public ExtVMFace { } skale::State& m_s; ///< A reference to the base state. + time_t m_latestBlockTimestamp; ChainOperationParams const& m_chainParams; EVMSchedule const m_evmSchedule; bool m_readOnly; diff --git a/libskale/State.cpp b/libskale/State.cpp index ded0c76ff..6f3bc7447 100644 --- a/libskale/State.cpp +++ b/libskale/State.cpp @@ -1008,13 +1008,14 @@ bool State::empty() const { } std::pair< ExecutionResult, TransactionReceipt > State::execute( EnvInfo const& _envInfo, - eth::ChainOperationParams const& _chainParams, Transaction const& _t, Permanence _p, - OnOpFunc const& _onOp ) { + eth::ChainOperationParams const& _chainParams, time_t _latestBlockTimestamp, + Transaction const& _t, Permanence _p, OnOpFunc const& _onOp ) { // Create and initialize the executive. This will throw fairly cheaply and quickly if the // transaction is bad in any way. // HACK 0 here is for gasPrice // TODO Not sure that 1st 0 as timestamp is acceptable here - Executive e( *this, _envInfo, _chainParams, 0, 0, _p != Permanence::Committed ); + Executive e( + *this, _envInfo, _chainParams, _latestBlockTimestamp, 0, _p != Permanence::Committed ); ExecutionResult res; e.setResultRecipient( res ); diff --git a/libskale/State.h b/libskale/State.h index 94c7118ea..889b63613 100644 --- a/libskale/State.h +++ b/libskale/State.h @@ -339,7 +339,8 @@ class State { /// This will change the state accordingly. std::pair< dev::eth::ExecutionResult, dev::eth::TransactionReceipt > execute( dev::eth::EnvInfo const& _envInfo, dev::eth::ChainOperationParams const& _chainParams, - dev::eth::Transaction const& _t, Permanence _p = Permanence::Committed, + time_t _latestBlockTimestamp, dev::eth::Transaction const& _t, + Permanence _p = Permanence::Committed, dev::eth::OnOpFunc const& _onOp = dev::eth::OnOpFunc() ); /// Get the account start nonce. May be required. From 6c1a6193525e40a408b10b48027fdefbaaeb11d7 Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Wed, 7 Feb 2024 16:14:25 +0000 Subject: [PATCH 006/154] SKALED-1583 Added _lastBlockTimetamp everywhere, builds --- libethereum/Executive.cpp | 4 ++-- libethereum/Executive.h | 10 ++++------ libhistoric/AlethExecutive.h | 9 ++------- libhistoric/AlethExtVM.cpp | 4 ++-- libhistoric/AlethExtVM.h | 2 ++ libhistoric/HistoricState.cpp | 7 +++---- libhistoric/HistoricState.h | 5 +++-- libskale/State.cpp | 8 ++++---- libskale/State.h | 4 ++-- libweb3jsonrpc/Debug.cpp | 5 +++-- 10 files changed, 27 insertions(+), 31 deletions(-) diff --git a/libethereum/Executive.cpp b/libethereum/Executive.cpp index 27370be4d..d72537493 100644 --- a/libethereum/Executive.cpp +++ b/libethereum/Executive.cpp @@ -243,11 +243,11 @@ void Executive::verifyTransaction( Transaction const& _transaction, time_t _late _transaction.verifiedOn = _blockHeader.number(); } -void Executive::initialize( Transaction const& _transaction ) { +void Executive::initialize( Transaction const& _transaction, time_t _latestBlockTimestamp ) { MICROPROFILE_SCOPEI( "Executive", "initialize", MP_GAINSBORO ); m_t = _transaction; m_baseGasRequired = m_t.baseGasRequired( - m_chainParams.evmSchedule( m_latestBlockTimestamp, m_envInfo.number() ) ); + m_chainParams.evmSchedule( _latestBlockTimestamp, m_envInfo.number() ) ); try { verifyTransaction( _transaction, m_latestBlockTimestamp, m_envInfo.header(), m_s, diff --git a/libethereum/Executive.h b/libethereum/Executive.h index c465a9dfa..a8358d09c 100644 --- a/libethereum/Executive.h +++ b/libethereum/Executive.h @@ -103,14 +103,12 @@ class Executive { public: /// Simple constructor; executive will operate on given state, with the given environment info. Executive( skale::State& _s, EnvInfo const& _envInfo, ChainOperationParams const& _chainParams, - time_t _latestBlockTimestamp, const u256& _gasPrice, unsigned _level = 0, - bool _readOnly = true ) + const u256& _gasPrice, unsigned _level, bool _readOnly = true ) : m_s( _s ), m_envInfo( _envInfo ), m_depth( _level ), m_readOnly( _readOnly ), m_chainParams( _chainParams ), - m_latestBlockTimestamp( _latestBlockTimestamp ), m_systemGasPrice( _gasPrice ) {} /** Easiest constructor. @@ -140,10 +138,10 @@ class Executive { /// Initializes the executive for evaluating a transaction. You must call finalize() at some /// point following this. - void initialize( bytesConstRef _transaction ) { - initialize( Transaction( _transaction, CheckTransaction::None ) ); + void initialize( bytesConstRef _transaction, time_t _latestBlockTimestamp ) { + initialize( Transaction( _transaction, CheckTransaction::None ), _latestBlockTimestamp ); } - void initialize( Transaction const& _transaction ); + void initialize( Transaction const& _transaction, time_t _latestBlockTimestamp ); /// Finalise a transaction previously set up with initialize(). /// @warning Only valid after initialize() and execute(), and possibly go(). /// @returns true if the outermost execution halted normally, false if exceptionally halted. diff --git a/libhistoric/AlethExecutive.h b/libhistoric/AlethExecutive.h index 5005146f2..892585975 100644 --- a/libhistoric/AlethExecutive.h +++ b/libhistoric/AlethExecutive.h @@ -47,13 +47,8 @@ class AlethExecutive { public: /// Simple constructor; executive will operate on given state, with the given environment info. AlethExecutive( dev::eth::HistoricState& _s, EnvInfo const& _envInfo, - ChainOperationParams const& _chainParams, time_t _latestBlockTimestamp, - unsigned _level = 0 ) - : m_s( _s ), - m_envInfo( _envInfo ), - m_depth( _level ), - m_chainParams( _chainParams ), - m_latestBlockTimestamp( _latestBlockTimestamp ){}; + ChainOperationParams const& _chainParams, unsigned _level = 0 ) + : m_s( _s ), m_envInfo( _envInfo ), m_depth( _level ), m_chainParams( _chainParams ){}; /** Easiest constructor. * Creates executive to operate on the state of end of the given block, populating environment diff --git a/libhistoric/AlethExtVM.cpp b/libhistoric/AlethExtVM.cpp index 2f8905443..8c58f70ff 100644 --- a/libhistoric/AlethExtVM.cpp +++ b/libhistoric/AlethExtVM.cpp @@ -181,7 +181,7 @@ h256 AlethExtVM::blockHash( u256 _number ) { tx.forceSender( caller ); ExecutionResult res; - std::tie( res, std::ignore ) = - m_s.execute( envInfo(), m_chainParams, tx, skale::Permanence::Reverted ); + std::tie( res, std::ignore ) = m_s.execute( + envInfo(), m_chainParams, m_latestBlockTimestamp, tx, skale::Permanence::Reverted ); return h256( res.output ); } diff --git a/libhistoric/AlethExtVM.h b/libhistoric/AlethExtVM.h index c529da768..009d9bb88 100644 --- a/libhistoric/AlethExtVM.h +++ b/libhistoric/AlethExtVM.h @@ -38,6 +38,7 @@ class AlethExtVM : public ExtVMFace { : ExtVMFace( _envInfo, _myAddress, _caller, _origin, _value, _gasPrice, _data, _code.toBytes(), _codeHash, _version, _depth, _isCreate, _staticCall ), m_s( _s ), + m_latestBlockTimestamp( _latestBlockTimestamp ), m_chainParams( _chainParams ), m_evmSchedule( initEvmSchedule( _latestBlockTimestamp, envInfo().number(), _version ) ) { // Contract: processing account must exist. In case of CALL, the ExtVM @@ -110,6 +111,7 @@ class AlethExtVM : public ExtVMFace { dev::eth::HistoricState& m_s; ///< A reference to the base state. + time_t m_latestBlockTimestamp; ChainOperationParams const& m_chainParams; EVMSchedule const m_evmSchedule; }; diff --git a/libhistoric/HistoricState.cpp b/libhistoric/HistoricState.cpp index f0f13d931..f4aa607a2 100644 --- a/libhistoric/HistoricState.cpp +++ b/libhistoric/HistoricState.cpp @@ -584,8 +584,8 @@ void HistoricState::rollback( size_t _savepoint ) { } std::pair< ExecutionResult, TransactionReceipt > HistoricState::execute( EnvInfo const& _envInfo, - eth::ChainOperationParams const& _chainParams, Transaction const& _t, skale::Permanence _p, - OnOpFunc const& _onOp ) { + eth::ChainOperationParams const& _chainParams, time_t _latestBlockTimestamp, + Transaction const& _t, skale::Permanence _p, OnOpFunc const& _onOp ) { // Create and initialize the executive. This will throw fairly cheaply and quickly if the // transaction is bad in any way. AlethExecutive e( *this, _envInfo, _chainParams, 0 ); @@ -626,8 +626,7 @@ std::pair< ExecutionResult, TransactionReceipt > HistoricState::execute( EnvInfo /// @returns true when normally halted; false when exceptionally halted; throws when internal VM /// exception occurred. -bool HistoricState::executeTransaction( - AlethExecutive& _e, Transaction const& _t, OnOpFunc const& _onOp ) { +bool HistoricState::executeTransaction( AlethExecutive& _e, Transaction const& _t, OnOpFunc const& _onOp ) { size_t const savept = savepoint(); try { _e.initialize( _t ); diff --git a/libhistoric/HistoricState.h b/libhistoric/HistoricState.h index 201e214d3..c64fcf058 100644 --- a/libhistoric/HistoricState.h +++ b/libhistoric/HistoricState.h @@ -157,8 +157,9 @@ class HistoricState { /// Execute a given transaction. /// This will change the state accordingly. std::pair< ExecutionResult, TransactionReceipt > execute( EnvInfo const& _envInfo, - eth::ChainOperationParams const& _chainParams, Transaction const& _t, - skale::Permanence _p = skale::Permanence::Committed, OnOpFunc const& _onOp = OnOpFunc() ); + eth::ChainOperationParams const& _chainParams, time_t _latestBlockTimestamp, + Transaction const& _t, skale::Permanence _p = skale::Permanence::Committed, + OnOpFunc const& _onOp = OnOpFunc() ); /// Check if the address is in use. diff --git a/libskale/State.cpp b/libskale/State.cpp index 6f3bc7447..e128dbb76 100644 --- a/libskale/State.cpp +++ b/libskale/State.cpp @@ -1028,7 +1028,7 @@ std::pair< ExecutionResult, TransactionReceipt > State::execute( EnvInfo const& onOp = e.simpleTrace(); #endif u256 const startGasUsed = _envInfo.gasUsed(); - bool const statusCode = executeTransaction( e, _t, onOp ); + bool const statusCode = executeTransaction( e, _t, onOp, _latestBlockTimestamp ); std::string strRevertReason; if ( res.excepted == dev::eth::TransactionException::RevertInstruction ) { @@ -1090,11 +1090,11 @@ std::pair< ExecutionResult, TransactionReceipt > State::execute( EnvInfo const& /// @returns true when normally halted; false when exceptionally halted; throws when internal VM /// exception occurred. -bool State::executeTransaction( - eth::Executive& _e, eth::Transaction const& _t, eth::OnOpFunc const& _onOp ) { +bool State::executeTransaction( eth::Executive& _e, eth::Transaction const& _t, + eth::OnOpFunc const& _onOp, time_t _latestBlockTimestamp ) { size_t const savept = savepoint(); try { - _e.initialize( _t ); + _e.initialize( _t, _latestBlockTimestamp ); if ( !_e.execute() ) _e.go( _onOp ); diff --git a/libskale/State.h b/libskale/State.h index 889b63613..a80967379 100644 --- a/libskale/State.h +++ b/libskale/State.h @@ -434,8 +434,8 @@ class State { /// @returns true when normally halted; false when exceptionally halted; throws when internal VM /// exception occurred. - bool executeTransaction( - dev::eth::Executive& _e, dev::eth::Transaction const& _t, dev::eth::OnOpFunc const& _onOp ); + bool executeTransaction( dev::eth::Executive& _e, dev::eth::Transaction const& _t, + dev::eth::OnOpFunc const& _onOp, time_t _latestBlockTimestamp ); void rollbackStorageChange( const Change& _change, dev::eth::Account& _acc ); diff --git a/libweb3jsonrpc/Debug.cpp b/libweb3jsonrpc/Debug.cpp index 883a4f65e..d58c84c93 100644 --- a/libweb3jsonrpc/Debug.cpp +++ b/libweb3jsonrpc/Debug.cpp @@ -73,7 +73,7 @@ Json::Value Debug::traceTransaction( StandardTrace st; st.setShowMnemonics(); st.setOptions( debugOptions( _json ) ); - _e.initialize( _t ); + _e.initialize( _t, m_eth.blockInfo( m_eth.hashFromNumber( m_eth.number() - 1 ) ).timestamp() ); if ( !_e.execute() ) _e.go( st.onOp() ); _e.finalize(); @@ -94,7 +94,8 @@ Json::Value Debug::traceBlock( Block const& _block, Json::Value const& _json ) { EnvInfo envInfo( _block.info(), m_eth.blockChain().lastBlockHashes(), gasUsed, bc.chainID() ); // HACK 0 here is for gasPrice - Executive e( s, envInfo, m_eth.blockChain().chainParams(), _block.info().timestamp(), 0 ); + // TODO timestamp of wrong block! + Executive e( s, envInfo, m_eth.blockChain().chainParams(), 0, 0 ); eth::ExecutionResult er; e.setResultRecipient( er ); From eb693f7b5fdcf08498dfbe816ec119ca5ed1fb62 Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Wed, 7 Feb 2024 16:44:57 +0000 Subject: [PATCH 007/154] SKALED-1583 Use Block's m_previousBlock --- libethereum/Block.cpp | 26 +++++++++----------------- libethereum/Block.h | 5 ++--- libethereum/Client.cpp | 2 +- libethereum/ClientTest.cpp | 2 +- libhistoric/AlethExtVM.cpp | 2 +- libhistoric/HistoricState.cpp | 2 +- libhistoric/HistoricState.h | 2 +- 7 files changed, 16 insertions(+), 25 deletions(-) diff --git a/libethereum/Block.cpp b/libethereum/Block.cpp index 6a3e22450..7f96df7c3 100644 --- a/libethereum/Block.cpp +++ b/libethereum/Block.cpp @@ -161,8 +161,7 @@ void Block::resetCurrent( int64_t _timestamp ) { m_committedToSeal = false; performIrregularModifications(); - // TEMPRORARY!!! - put here actian number - updateBlockhashContract( -1 ); + updateBlockhashContract(); // if ( !m_state.checkVersion() ) m_state = m_state.createNewCopyWithLocks(); @@ -358,8 +357,6 @@ pair< TransactionReceipts, bool > Block::sync( assert( _bc.currentHash() == m_currentBlock.parentHash() ); auto deadline = chrono::steady_clock::now() + chrono::milliseconds( msTimeout ); - time_t latestBlockTimestamp = _bc.info().timestamp(); - for ( int goodTxs = max( 0, ( int ) transactions.size() - 1 ); goodTxs < ( int ) transactions.size(); ) { goodTxs = 0; @@ -368,7 +365,7 @@ pair< TransactionReceipts, bool > Block::sync( try { if ( t.gasPrice() >= _gp.ask( *this ) ) { // Timer t; - execute( _bc.lastBlockHashes(), t, latestBlockTimestamp, + execute( _bc.lastBlockHashes(), t, Permanence::Uncommitted ); ret.first.push_back( m_receipts.back() ); ++goodTxs; @@ -459,8 +456,6 @@ tuple< TransactionReceipts, unsigned > Block::syncEveryone( // NB! Not commit! Commit will be after 1st transaction! m_state.clearPartialTransactionReceipts(); - time_t latestBlockTimestamp = _bc.info().timestamp(); - unsigned count_bad = 0; for ( unsigned i = 0; i < _transactions.size(); ++i ) { Transaction const& tr = _transactions[i]; @@ -510,7 +505,7 @@ tuple< TransactionReceipts, unsigned > Block::syncEveryone( continue; } - ExecutionResult res = execute( _bc.lastBlockHashes(), tr, latestBlockTimestamp, + ExecutionResult res = execute( _bc.lastBlockHashes(), tr, Permanence::Committed, OnOpFunc() ); if ( !SkipInvalidTransactionsPatch::isEnabled() || @@ -627,8 +622,6 @@ u256 Block::enact( VerifiedBlockRef const& _block, BlockChain const& _bc ) { vector< bytes > receipts; - time_t latestBlockTimestamp = _bc.info().timestamp(); - // All ok with the block generally. Play back the transactions now... unsigned i = 0; DEV_TIMED_ABOVE( "txExec", 500 ) @@ -640,7 +633,7 @@ u256 Block::enact( VerifiedBlockRef const& _block, BlockChain const& _bc ) { // endl; const_cast< Transaction& >( tr ).checkOutExternalGas( _bc.chainParams(), _bc.info().timestamp(), _bc.number() ); - execute( _bc.lastBlockHashes(), tr, latestBlockTimestamp ); + execute( _bc.lastBlockHashes(), tr ); // cerr << "Now: " // << "State #" << state().getNonce( tr.from() ) << endl; // cnote << m_state; @@ -825,8 +818,7 @@ ExecutionResult Block::executeHistoricCall( #endif -ExecutionResult Block::execute( LastBlockHashesFace const& _lh, Transaction const& _t, - time_t _latestBlockTimestamp, Permanence _p, OnOpFunc const& _onOp ) { +ExecutionResult Block::execute( LastBlockHashesFace const& _lh, Transaction const& _t, Permanence _p, OnOpFunc const& _onOp ) { MICROPROFILE_SCOPEI( "Block", "execute transaction", MP_CORNFLOWERBLUE ); if ( isSealed() ) BOOST_THROW_EXCEPTION( InvalidOperationOnSealedBlock() ); @@ -857,7 +849,7 @@ ExecutionResult Block::execute( LastBlockHashesFace const& _lh, Transaction cons throw -1; // will catch below resultReceipt = stateSnapshot.execute( - envInfo, m_sealEngine->chainParams(), _latestBlockTimestamp, _t, _p, _onOp ); + envInfo, m_sealEngine->chainParams(), this->m_previousBlock.timestamp(), _t, _p, _onOp ); // use fake receipt created above if execution throws!! } catch ( const TransactionException& ex ) { @@ -917,7 +909,7 @@ void Block::performIrregularModifications() { } } -void Block::updateBlockhashContract( time_t _latestBlockTimestamp ) { +void Block::updateBlockhashContract() { u256 const& blockNumber = info().number(); u256 const& forkBlock = m_sealEngine->chainParams().experimentalForkBlock; @@ -926,14 +918,14 @@ void Block::updateBlockhashContract( time_t _latestBlockTimestamp ) { if ( m_state.code( c_blockhashContractAddress ) != c_blockhashContractCode ) { State state = m_state.createStateModifyCopy(); state.setCode( c_blockhashContractAddress, bytes( c_blockhashContractCode ), - m_sealEngine->evmSchedule( _latestBlockTimestamp, blockNumber ) + m_sealEngine->evmSchedule( this->m_previousBlock.timestamp(), blockNumber ) .accountVersion ); state.commit( dev::eth::CommitBehaviour::KeepEmptyAccounts ); } } else { m_state.createContract( c_blockhashContractAddress ); m_state.setCode( c_blockhashContractAddress, bytes( c_blockhashContractCode ), - m_sealEngine->evmSchedule( _latestBlockTimestamp, blockNumber ).accountVersion ); + m_sealEngine->evmSchedule( this->m_previousBlock.timestamp(), blockNumber ).accountVersion ); m_state.commit( dev::eth::CommitBehaviour::KeepEmptyAccounts ); } } diff --git a/libethereum/Block.h b/libethereum/Block.h index 94bb160ae..9d8d25f7a 100644 --- a/libethereum/Block.h +++ b/libethereum/Block.h @@ -211,8 +211,7 @@ class Block { /// Execute a given transaction. /// This will append @a _t to the transaction list and change the state accordingly. - ExecutionResult execute( LastBlockHashesFace const& _lh, Transaction const& _t, - time_t _latestBlockTimestamp, skale::Permanence _p = skale::Permanence::Committed, + ExecutionResult execute( LastBlockHashesFace const& _lh, Transaction const& _t, skale::Permanence _p = skale::Permanence::Committed, OnOpFunc const& _onOp = OnOpFunc() ); @@ -319,7 +318,7 @@ class Block { void performIrregularModifications(); /// Creates and updates the special contract for storing block hashes according to EIP96 - void updateBlockhashContract( time_t _latestBlockTimestamp ); + void updateBlockhashContract(); State m_state; ///< Our state. Transactions m_transactions; ///< The current list of transactions that we've included in the diff --git a/libethereum/Client.cpp b/libethereum/Client.cpp index 9008d95fb..6f4629d58 100644 --- a/libethereum/Client.cpp +++ b/libethereum/Client.cpp @@ -1300,7 +1300,7 @@ ExecutionResult Client::call( Address const& _from, u256 _value, Address _dest, if ( _ff == FudgeFactor::Lenient ) temp.mutableState().addBalance( _from, ( u256 )( t.gas() * t.gasPrice() + t.value() ) ); ret = temp.execute( - bc().lastBlockHashes(), t, bc().info().timestamp(), skale::Permanence::Reverted ); + bc().lastBlockHashes(), t, skale::Permanence::Reverted ); } catch ( InvalidNonce const& in ) { LOG( m_logger ) << "exception in client call(1):" << boost::current_exception_diagnostic_information() << std::endl; diff --git a/libethereum/ClientTest.cpp b/libethereum/ClientTest.cpp index 6c7d30ef3..85e9ebe58 100644 --- a/libethereum/ClientTest.cpp +++ b/libethereum/ClientTest.cpp @@ -70,7 +70,7 @@ void ClientTest::modifyTimestamp( int64_t _timestamp ) { auto& lastHashes = bc().lastBlockHashes(); assert( bc().currentHash() == block.info().parentHash() ); for ( auto const& t : transactions ) - block.execute( lastHashes, t, bc().info().timestamp() ); + block.execute( lastHashes, t ); DEV_WRITE_GUARDED( x_working ) m_working = block; diff --git a/libhistoric/AlethExtVM.cpp b/libhistoric/AlethExtVM.cpp index 8c58f70ff..a34fabd46 100644 --- a/libhistoric/AlethExtVM.cpp +++ b/libhistoric/AlethExtVM.cpp @@ -182,6 +182,6 @@ h256 AlethExtVM::blockHash( u256 _number ) { ExecutionResult res; std::tie( res, std::ignore ) = m_s.execute( - envInfo(), m_chainParams, m_latestBlockTimestamp, tx, skale::Permanence::Reverted ); + envInfo(), m_chainParams, tx, skale::Permanence::Reverted ); return h256( res.output ); } diff --git a/libhistoric/HistoricState.cpp b/libhistoric/HistoricState.cpp index f4aa607a2..41a05c537 100644 --- a/libhistoric/HistoricState.cpp +++ b/libhistoric/HistoricState.cpp @@ -584,7 +584,7 @@ void HistoricState::rollback( size_t _savepoint ) { } std::pair< ExecutionResult, TransactionReceipt > HistoricState::execute( EnvInfo const& _envInfo, - eth::ChainOperationParams const& _chainParams, time_t _latestBlockTimestamp, + eth::ChainOperationParams const& _chainParams, Transaction const& _t, skale::Permanence _p, OnOpFunc const& _onOp ) { // Create and initialize the executive. This will throw fairly cheaply and quickly if the // transaction is bad in any way. diff --git a/libhistoric/HistoricState.h b/libhistoric/HistoricState.h index c64fcf058..c2097175c 100644 --- a/libhistoric/HistoricState.h +++ b/libhistoric/HistoricState.h @@ -157,7 +157,7 @@ class HistoricState { /// Execute a given transaction. /// This will change the state accordingly. std::pair< ExecutionResult, TransactionReceipt > execute( EnvInfo const& _envInfo, - eth::ChainOperationParams const& _chainParams, time_t _latestBlockTimestamp, + eth::ChainOperationParams const& _chainParams, Transaction const& _t, skale::Permanence _p = skale::Permanence::Committed, OnOpFunc const& _onOp = OnOpFunc() ); From 590809c1e46cd482260773245f276f780b36cb72 Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Wed, 7 Feb 2024 17:50:47 +0000 Subject: [PATCH 008/154] SKALED-1583 Add latestBlockTimestamp to EnvInfo -> Executive, Block, ExtVM --- libethereum/Block.cpp | 20 +++++++++++--------- libethereum/Block.h | 5 +++-- libethereum/Client.cpp | 3 +-- libethereum/ClientBase.cpp | 8 +++----- libethereum/Executive.cpp | 24 +++++++++++++----------- libethereum/Executive.h | 6 +++--- libethereum/ExtVM.cpp | 2 +- libethereum/ExtVM.h | 16 ++++++---------- libevm/ExtVMFace.h | 14 +++++++++----- libhistoric/AlethExtVM.cpp | 4 ++-- libhistoric/HistoricState.cpp | 7 ++++--- libhistoric/HistoricState.h | 5 ++--- libskale/State.cpp | 15 +++++++-------- libskale/State.h | 7 +++---- libweb3jsonrpc/Debug.cpp | 6 +++--- 15 files changed, 71 insertions(+), 71 deletions(-) diff --git a/libethereum/Block.cpp b/libethereum/Block.cpp index 7f96df7c3..0c11c0f63 100644 --- a/libethereum/Block.cpp +++ b/libethereum/Block.cpp @@ -365,8 +365,7 @@ pair< TransactionReceipts, bool > Block::sync( try { if ( t.gasPrice() >= _gp.ask( *this ) ) { // Timer t; - execute( _bc.lastBlockHashes(), t, - Permanence::Uncommitted ); + execute( _bc.lastBlockHashes(), t, Permanence::Uncommitted ); ret.first.push_back( m_receipts.back() ); ++goodTxs; // cnote << "TX took:" << t.elapsed() * 1000; @@ -505,8 +504,8 @@ tuple< TransactionReceipts, unsigned > Block::syncEveryone( continue; } - ExecutionResult res = execute( _bc.lastBlockHashes(), tr, - Permanence::Committed, OnOpFunc() ); + ExecutionResult res = + execute( _bc.lastBlockHashes(), tr, Permanence::Committed, OnOpFunc() ); if ( !SkipInvalidTransactionsPatch::isEnabled() || res.excepted != TransactionException::WouldNotBeInBlock ) { @@ -818,7 +817,8 @@ ExecutionResult Block::executeHistoricCall( #endif -ExecutionResult Block::execute( LastBlockHashesFace const& _lh, Transaction const& _t, Permanence _p, OnOpFunc const& _onOp ) { +ExecutionResult Block::execute( + LastBlockHashesFace const& _lh, Transaction const& _t, Permanence _p, OnOpFunc const& _onOp ) { MICROPROFILE_SCOPEI( "Block", "execute transaction", MP_CORNFLOWERBLUE ); if ( isSealed() ) BOOST_THROW_EXCEPTION( InvalidOperationOnSealedBlock() ); @@ -833,7 +833,8 @@ ExecutionResult Block::execute( LastBlockHashesFace const& _lh, Transaction cons State stateSnapshot = _p != Permanence::Reverted ? m_state.createStateModifyCopyAndPassLock() : m_state; - EnvInfo envInfo = EnvInfo( info(), _lh, gasUsed(), m_sealEngine->chainParams().chainID ); + EnvInfo envInfo = EnvInfo( + info(), _lh, previousInfo().timestamp(), gasUsed(), m_sealEngine->chainParams().chainID ); // "bad" transaction receipt for failed transactions TransactionReceipt const null_receipt = @@ -848,8 +849,8 @@ ExecutionResult Block::execute( LastBlockHashesFace const& _lh, Transaction cons if ( _t.isInvalid() ) throw -1; // will catch below - resultReceipt = stateSnapshot.execute( - envInfo, m_sealEngine->chainParams(), this->m_previousBlock.timestamp(), _t, _p, _onOp ); + resultReceipt = + stateSnapshot.execute( envInfo, m_sealEngine->chainParams(), _t, _p, _onOp ); // use fake receipt created above if execution throws!! } catch ( const TransactionException& ex ) { @@ -925,7 +926,8 @@ void Block::updateBlockhashContract() { } else { m_state.createContract( c_blockhashContractAddress ); m_state.setCode( c_blockhashContractAddress, bytes( c_blockhashContractCode ), - m_sealEngine->evmSchedule( this->m_previousBlock.timestamp(), blockNumber ).accountVersion ); + m_sealEngine->evmSchedule( this->m_previousBlock.timestamp(), blockNumber ) + .accountVersion ); m_state.commit( dev::eth::CommitBehaviour::KeepEmptyAccounts ); } } diff --git a/libethereum/Block.h b/libethereum/Block.h index 9d8d25f7a..1d1bf8c8b 100644 --- a/libethereum/Block.h +++ b/libethereum/Block.h @@ -211,8 +211,8 @@ class Block { /// Execute a given transaction. /// This will append @a _t to the transaction list and change the state accordingly. - ExecutionResult execute( LastBlockHashesFace const& _lh, Transaction const& _t, skale::Permanence _p = skale::Permanence::Committed, - OnOpFunc const& _onOp = OnOpFunc() ); + ExecutionResult execute( LastBlockHashesFace const& _lh, Transaction const& _t, + skale::Permanence _p = skale::Permanence::Committed, OnOpFunc const& _onOp = OnOpFunc() ); #ifdef HISTORIC_STATE @@ -294,6 +294,7 @@ class Block { /// Get the header information on the present block. BlockHeader const& info() const { return m_currentBlock; } + BlockHeader const& previousInfo() const { return m_previousBlock; } void startReadState(); diff --git a/libethereum/Client.cpp b/libethereum/Client.cpp index 6f4629d58..d6a3daa9b 100644 --- a/libethereum/Client.cpp +++ b/libethereum/Client.cpp @@ -1299,8 +1299,7 @@ ExecutionResult Client::call( Address const& _from, u256 _value, Address _dest, t.ignoreExternalGas(); if ( _ff == FudgeFactor::Lenient ) temp.mutableState().addBalance( _from, ( u256 )( t.gas() * t.gasPrice() + t.value() ) ); - ret = temp.execute( - bc().lastBlockHashes(), t, skale::Permanence::Reverted ); + ret = temp.execute( bc().lastBlockHashes(), t, skale::Permanence::Reverted ); } catch ( InvalidNonce const& in ) { LOG( m_logger ) << "exception in client call(1):" << boost::current_exception_diagnostic_information() << std::endl; diff --git a/libethereum/ClientBase.cpp b/libethereum/ClientBase.cpp index 7364fb785..66bbe16f2 100644 --- a/libethereum/ClientBase.cpp +++ b/libethereum/ClientBase.cpp @@ -91,15 +91,13 @@ std::pair< bool, ExecutionResult > ClientBase::estimateGasStep( int64_t _gas, Bl t.forceSender( _from ); t.forceChainId( chainId() ); t.ignoreExternalGas(); - EnvInfo const env( _latestBlock.info(), bc().lastBlockHashes(), 0, _gas ); + EnvInfo const env( _latestBlock.info(), bc().lastBlockHashes(), + _latestBlock.previousInfo().timestamp(), 0, _gas ); // Make a copy of state!! It will be deleted after step! State tempState = _latestBlock.mutableState(); tempState.addBalance( _from, ( u256 )( t.gas() * t.gasPrice() + t.value() ) ); ExecutionResult executionResult = - tempState - .execute( - env, bc().chainParams(), _latestBlock.info().timestamp(), t, Permanence::Reverted ) - .first; + tempState.execute( env, bc().chainParams(), t, Permanence::Reverted ).first; if ( executionResult.excepted == TransactionException::OutOfGas || executionResult.excepted == TransactionException::OutOfGasBase || executionResult.excepted == TransactionException::OutOfGasIntrinsic || diff --git a/libethereum/Executive.cpp b/libethereum/Executive.cpp index d72537493..44a60be2b 100644 --- a/libethereum/Executive.cpp +++ b/libethereum/Executive.cpp @@ -165,7 +165,8 @@ string StandardTrace::json( bool _styled ) const { Executive::Executive( Block& _s, BlockChain const& _bc, const u256& _gasPrice, unsigned _level, bool _readOnly ) : m_s( _s.mutableState() ), - m_envInfo( _s.info(), _bc.lastBlockHashes(), 0, _bc.chainID() ), + m_envInfo( + _s.info(), _bc.lastBlockHashes(), _s.previousInfo().timestamp(), 0, _bc.chainID() ), m_depth( _level ), m_readOnly( _readOnly ), m_chainParams( _bc.chainParams() ), @@ -174,7 +175,8 @@ Executive::Executive( Executive::Executive( Block& _s, LastBlockHashesFace const& _lh, const u256& _gasPrice, unsigned _level, bool _readOnly ) : m_s( _s.mutableState() ), - m_envInfo( _s.info(), _lh, 0, _s.sealEngine()->chainParams().chainID ), + m_envInfo( _s.info(), _lh, _s.previousInfo().timestamp(), 0, + _s.sealEngine()->chainParams().chainID ), m_depth( _level ), m_readOnly( _readOnly ), m_chainParams( _s.sealEngine()->chainParams() ), @@ -243,14 +245,14 @@ void Executive::verifyTransaction( Transaction const& _transaction, time_t _late _transaction.verifiedOn = _blockHeader.number(); } -void Executive::initialize( Transaction const& _transaction, time_t _latestBlockTimestamp ) { +void Executive::initialize( Transaction const& _transaction ) { MICROPROFILE_SCOPEI( "Executive", "initialize", MP_GAINSBORO ); m_t = _transaction; m_baseGasRequired = m_t.baseGasRequired( - m_chainParams.evmSchedule( _latestBlockTimestamp, m_envInfo.number() ) ); + m_chainParams.evmSchedule( m_envInfo.latestBlockTimestamp(), m_envInfo.number() ) ); try { - verifyTransaction( _transaction, m_latestBlockTimestamp, m_envInfo.header(), m_s, + verifyTransaction( _transaction, m_envInfo.latestBlockTimestamp(), m_envInfo.header(), m_s, m_chainParams, m_envInfo.gasUsed(), m_systemGasPrice ); } catch ( Exception const& ex ) { m_excepted = toTransactionException( ex ); @@ -349,9 +351,9 @@ bool Executive::call( CallParameters const& _p, u256 const& _gasPrice, Address c h256 codeHash = m_s.codeHash( _p.codeAddress ); // Contract will be executed with the version stored in account auto const version = m_s.version( _p.codeAddress ); - m_ext = make_shared< ExtVM >( m_s, m_envInfo, m_chainParams, m_latestBlockTimestamp, - _p.receiveAddress, _p.senderAddress, _origin, _p.apparentValue, _gasPrice, _p.data, - &c, codeHash, version, m_depth, false, _p.staticCall, m_readOnly ); + m_ext = make_shared< ExtVM >( m_s, m_envInfo, m_chainParams, _p.receiveAddress, + _p.senderAddress, _origin, _p.apparentValue, _gasPrice, _p.data, &c, codeHash, + version, m_depth, false, _p.staticCall, m_readOnly ); } } @@ -426,9 +428,9 @@ bool Executive::executeCreate( Address const& _sender, u256 const& _endowment, // Schedule _init execution if not empty. if ( !_init.empty() ) - m_ext = make_shared< ExtVM >( m_s, m_envInfo, m_chainParams, m_latestBlockTimestamp, - m_newAddress, _sender, _origin, _endowment, _gasPrice, bytesConstRef(), _init, - sha3( _init ), _version, m_depth, true, false ); + m_ext = make_shared< ExtVM >( m_s, m_envInfo, m_chainParams, m_newAddress, _sender, _origin, + _endowment, _gasPrice, bytesConstRef(), _init, sha3( _init ), _version, m_depth, true, + false ); else // code stays empty, but we set the version m_s.setCode( m_newAddress, {}, _version ); diff --git a/libethereum/Executive.h b/libethereum/Executive.h index a8358d09c..751051357 100644 --- a/libethereum/Executive.h +++ b/libethereum/Executive.h @@ -138,10 +138,10 @@ class Executive { /// Initializes the executive for evaluating a transaction. You must call finalize() at some /// point following this. - void initialize( bytesConstRef _transaction, time_t _latestBlockTimestamp ) { - initialize( Transaction( _transaction, CheckTransaction::None ), _latestBlockTimestamp ); + void initialize( bytesConstRef _transaction ) { + initialize( Transaction( _transaction, CheckTransaction::None ) ); } - void initialize( Transaction const& _transaction, time_t _latestBlockTimestamp ); + void initialize( Transaction const& _transaction ); /// Finalise a transaction previously set up with initialize(). /// @warning Only valid after initialize() and execute(), and possibly go(). /// @returns true if the outermost execution halted normally, false if exceptionally halted. diff --git a/libethereum/ExtVM.cpp b/libethereum/ExtVM.cpp index 8ac5d709d..453cb0ec0 100644 --- a/libethereum/ExtVM.cpp +++ b/libethereum/ExtVM.cpp @@ -200,6 +200,6 @@ h256 ExtVM::blockHash( u256 _number ) { ExecutionResult res; std::tie( res, std::ignore ) = - m_s.execute( envInfo(), m_chainParams, m_latestBlockTimestamp, tx, Permanence::Reverted ); + m_s.execute( envInfo(), m_chainParams, tx, Permanence::Reverted ); return h256( res.output ); } diff --git a/libethereum/ExtVM.h b/libethereum/ExtVM.h index f0692b2bd..f911fdf42 100644 --- a/libethereum/ExtVM.h +++ b/libethereum/ExtVM.h @@ -38,16 +38,14 @@ class ExtVM : public ExtVMFace { public: /// Full constructor. ExtVM( skale::State& _s, EnvInfo const& _envInfo, ChainOperationParams const& _chainParams, - time_t _latestBlockTimestamp, Address _myAddress, Address _caller, Address _origin, - u256 _value, u256 _gasPrice, bytesConstRef _data, bytesConstRef _code, - h256 const& _codeHash, u256 const& _version, unsigned _depth, bool _isCreate, - bool _staticCall, bool _readOnly = true ) + Address _myAddress, Address _caller, Address _origin, u256 _value, u256 _gasPrice, + bytesConstRef _data, bytesConstRef _code, h256 const& _codeHash, u256 const& _version, + unsigned _depth, bool _isCreate, bool _staticCall, bool _readOnly = true ) : ExtVMFace( _envInfo, _myAddress, _caller, _origin, _value, _gasPrice, _data, _code.toBytes(), _codeHash, _version, _depth, _isCreate, _staticCall ), m_s( _s ), - m_latestBlockTimestamp( _latestBlockTimestamp ), m_chainParams( _chainParams ), - m_evmSchedule( initEvmSchedule( m_latestBlockTimestamp, envInfo().number(), _version ) ), + m_evmSchedule( initEvmSchedule( _version ) ), m_readOnly( _readOnly ) { // Contract: processing account must exist. In case of CALL, the ExtVM // is created only if an account has code (so exist). In case of CREATE @@ -105,12 +103,11 @@ class ExtVM : public ExtVMFace { h256 blockHash( u256 _number ) override; private: - EVMSchedule initEvmSchedule( - time_t _latestBlockTimestamp, int64_t _blockNumber, u256 const& _version ) const { + EVMSchedule initEvmSchedule( u256 const& _version ) const { // If _version is latest for the block, select corresponding latest schedule. // Otherwise run with the latest schedule known to correspond to the _version. EVMSchedule currentBlockSchedule = - m_chainParams.evmSchedule( _latestBlockTimestamp, _blockNumber ); + m_chainParams.evmSchedule( envInfo().latestBlockTimestamp(), envInfo().number() ); if ( currentBlockSchedule.accountVersion == _version ) return currentBlockSchedule; else @@ -118,7 +115,6 @@ class ExtVM : public ExtVMFace { } skale::State& m_s; ///< A reference to the base state. - time_t m_latestBlockTimestamp; ChainOperationParams const& m_chainParams; EVMSchedule const m_evmSchedule; bool m_readOnly; diff --git a/libevm/ExtVMFace.h b/libevm/ExtVMFace.h index 8d3f22bd9..23b321556 100644 --- a/libevm/ExtVMFace.h +++ b/libevm/ExtVMFace.h @@ -131,17 +131,19 @@ struct CallParameters { class EnvInfo { public: - EnvInfo( BlockHeader const& _current, LastBlockHashesFace const& _lh, u256 const& _gasUsed, - u256 const& _chainID ) + EnvInfo( BlockHeader const& _current, LastBlockHashesFace const& _lh, + time_t _latestBlockTimestamp, u256 const& _gasUsed, u256 const& _chainID ) : m_headerInfo( _current ), m_lastHashes( _lh ), + m_latestBlockTimestamp( _latestBlockTimestamp ), m_gasUsed( _gasUsed ), m_chainID( _chainID ) {} // Constructor with custom gasLimit - used in some synthetic scenarios like eth_estimateGas RPC // method - EnvInfo( BlockHeader const& _current, LastBlockHashesFace const& _lh, u256 const& _gasUsed, - u256 const& _gasLimit, u256 const& _chainID ) - : EnvInfo( _current, _lh, _gasUsed, _chainID ) { + EnvInfo( BlockHeader const& _current, LastBlockHashesFace const& _lh, + time_t _latestBlockTimestamp, u256 const& _gasUsed, u256 const& _gasLimit, + u256 const& _chainID ) + : EnvInfo( _current, _lh, _latestBlockTimestamp, _gasUsed, _chainID ) { m_headerInfo.setGasLimit( _gasLimit ); } @@ -153,12 +155,14 @@ class EnvInfo { u256 const& difficulty() const { return m_headerInfo.difficulty(); } u256 const& gasLimit() const { return m_headerInfo.gasLimit(); } LastBlockHashesFace const& lastHashes() const { return m_lastHashes; } + time_t latestBlockTimestamp() const { return m_latestBlockTimestamp; } u256 const& gasUsed() const { return m_gasUsed; } u256 const& chainID() const { return m_chainID; } private: BlockHeader m_headerInfo; LastBlockHashesFace const& m_lastHashes; + time_t m_latestBlockTimestamp; u256 m_gasUsed; u256 m_chainID; }; diff --git a/libhistoric/AlethExtVM.cpp b/libhistoric/AlethExtVM.cpp index a34fabd46..2f8905443 100644 --- a/libhistoric/AlethExtVM.cpp +++ b/libhistoric/AlethExtVM.cpp @@ -181,7 +181,7 @@ h256 AlethExtVM::blockHash( u256 _number ) { tx.forceSender( caller ); ExecutionResult res; - std::tie( res, std::ignore ) = m_s.execute( - envInfo(), m_chainParams, tx, skale::Permanence::Reverted ); + std::tie( res, std::ignore ) = + m_s.execute( envInfo(), m_chainParams, tx, skale::Permanence::Reverted ); return h256( res.output ); } diff --git a/libhistoric/HistoricState.cpp b/libhistoric/HistoricState.cpp index 41a05c537..f0f13d931 100644 --- a/libhistoric/HistoricState.cpp +++ b/libhistoric/HistoricState.cpp @@ -584,8 +584,8 @@ void HistoricState::rollback( size_t _savepoint ) { } std::pair< ExecutionResult, TransactionReceipt > HistoricState::execute( EnvInfo const& _envInfo, - eth::ChainOperationParams const& _chainParams, - Transaction const& _t, skale::Permanence _p, OnOpFunc const& _onOp ) { + eth::ChainOperationParams const& _chainParams, Transaction const& _t, skale::Permanence _p, + OnOpFunc const& _onOp ) { // Create and initialize the executive. This will throw fairly cheaply and quickly if the // transaction is bad in any way. AlethExecutive e( *this, _envInfo, _chainParams, 0 ); @@ -626,7 +626,8 @@ std::pair< ExecutionResult, TransactionReceipt > HistoricState::execute( EnvInfo /// @returns true when normally halted; false when exceptionally halted; throws when internal VM /// exception occurred. -bool HistoricState::executeTransaction( AlethExecutive& _e, Transaction const& _t, OnOpFunc const& _onOp ) { +bool HistoricState::executeTransaction( + AlethExecutive& _e, Transaction const& _t, OnOpFunc const& _onOp ) { size_t const savept = savepoint(); try { _e.initialize( _t ); diff --git a/libhistoric/HistoricState.h b/libhistoric/HistoricState.h index c2097175c..201e214d3 100644 --- a/libhistoric/HistoricState.h +++ b/libhistoric/HistoricState.h @@ -157,9 +157,8 @@ class HistoricState { /// Execute a given transaction. /// This will change the state accordingly. std::pair< ExecutionResult, TransactionReceipt > execute( EnvInfo const& _envInfo, - eth::ChainOperationParams const& _chainParams, - Transaction const& _t, skale::Permanence _p = skale::Permanence::Committed, - OnOpFunc const& _onOp = OnOpFunc() ); + eth::ChainOperationParams const& _chainParams, Transaction const& _t, + skale::Permanence _p = skale::Permanence::Committed, OnOpFunc const& _onOp = OnOpFunc() ); /// Check if the address is in use. diff --git a/libskale/State.cpp b/libskale/State.cpp index e128dbb76..20a4de151 100644 --- a/libskale/State.cpp +++ b/libskale/State.cpp @@ -1008,14 +1008,13 @@ bool State::empty() const { } std::pair< ExecutionResult, TransactionReceipt > State::execute( EnvInfo const& _envInfo, - eth::ChainOperationParams const& _chainParams, time_t _latestBlockTimestamp, - Transaction const& _t, Permanence _p, OnOpFunc const& _onOp ) { + eth::ChainOperationParams const& _chainParams, Transaction const& _t, Permanence _p, + OnOpFunc const& _onOp ) { // Create and initialize the executive. This will throw fairly cheaply and quickly if the // transaction is bad in any way. // HACK 0 here is for gasPrice // TODO Not sure that 1st 0 as timestamp is acceptable here - Executive e( - *this, _envInfo, _chainParams, _latestBlockTimestamp, 0, _p != Permanence::Committed ); + Executive e( *this, _envInfo, _chainParams, 0, _p != Permanence::Committed ); ExecutionResult res; e.setResultRecipient( res ); @@ -1028,7 +1027,7 @@ std::pair< ExecutionResult, TransactionReceipt > State::execute( EnvInfo const& onOp = e.simpleTrace(); #endif u256 const startGasUsed = _envInfo.gasUsed(); - bool const statusCode = executeTransaction( e, _t, onOp, _latestBlockTimestamp ); + bool const statusCode = executeTransaction( e, _t, onOp ); std::string strRevertReason; if ( res.excepted == dev::eth::TransactionException::RevertInstruction ) { @@ -1090,11 +1089,11 @@ std::pair< ExecutionResult, TransactionReceipt > State::execute( EnvInfo const& /// @returns true when normally halted; false when exceptionally halted; throws when internal VM /// exception occurred. -bool State::executeTransaction( eth::Executive& _e, eth::Transaction const& _t, - eth::OnOpFunc const& _onOp, time_t _latestBlockTimestamp ) { +bool State::executeTransaction( + eth::Executive& _e, eth::Transaction const& _t, eth::OnOpFunc const& _onOp ) { size_t const savept = savepoint(); try { - _e.initialize( _t, _latestBlockTimestamp ); + _e.initialize( _t ); if ( !_e.execute() ) _e.go( _onOp ); diff --git a/libskale/State.h b/libskale/State.h index a80967379..94c7118ea 100644 --- a/libskale/State.h +++ b/libskale/State.h @@ -339,8 +339,7 @@ class State { /// This will change the state accordingly. std::pair< dev::eth::ExecutionResult, dev::eth::TransactionReceipt > execute( dev::eth::EnvInfo const& _envInfo, dev::eth::ChainOperationParams const& _chainParams, - time_t _latestBlockTimestamp, dev::eth::Transaction const& _t, - Permanence _p = Permanence::Committed, + dev::eth::Transaction const& _t, Permanence _p = Permanence::Committed, dev::eth::OnOpFunc const& _onOp = dev::eth::OnOpFunc() ); /// Get the account start nonce. May be required. @@ -434,8 +433,8 @@ class State { /// @returns true when normally halted; false when exceptionally halted; throws when internal VM /// exception occurred. - bool executeTransaction( dev::eth::Executive& _e, dev::eth::Transaction const& _t, - dev::eth::OnOpFunc const& _onOp, time_t _latestBlockTimestamp ); + bool executeTransaction( + dev::eth::Executive& _e, dev::eth::Transaction const& _t, dev::eth::OnOpFunc const& _onOp ); void rollbackStorageChange( const Change& _change, dev::eth::Account& _acc ); diff --git a/libweb3jsonrpc/Debug.cpp b/libweb3jsonrpc/Debug.cpp index d58c84c93..3e908b717 100644 --- a/libweb3jsonrpc/Debug.cpp +++ b/libweb3jsonrpc/Debug.cpp @@ -73,7 +73,7 @@ Json::Value Debug::traceTransaction( StandardTrace st; st.setShowMnemonics(); st.setOptions( debugOptions( _json ) ); - _e.initialize( _t, m_eth.blockInfo( m_eth.hashFromNumber( m_eth.number() - 1 ) ).timestamp() ); + _e.initialize( _t ); if ( !_e.execute() ) _e.go( st.onOp() ); _e.finalize(); @@ -91,8 +91,8 @@ Json::Value Debug::traceBlock( Block const& _block, Json::Value const& _json ) { u256 const gasUsed = k ? _block.receipt( k - 1 ).cumulativeGasUsed() : 0; auto const& bc = m_eth.blockChain(); - EnvInfo envInfo( - _block.info(), m_eth.blockChain().lastBlockHashes(), gasUsed, bc.chainID() ); + EnvInfo envInfo( _block.info(), m_eth.blockChain().lastBlockHashes(), + _block.previousInfo().timestamp(), gasUsed, bc.chainID() ); // HACK 0 here is for gasPrice // TODO timestamp of wrong block! Executive e( s, envInfo, m_eth.blockChain().chainParams(), 0, 0 ); From 4e52e044d5b56a0c1f2e1ef06b657c6edd31ccc1 Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Wed, 7 Feb 2024 18:14:00 +0000 Subject: [PATCH 009/154] SKALED-1583 Remove latestBlockTimestamp from AlethExtVM too --- libhistoric/AlethExecutive.cpp | 13 ++++++------- libhistoric/AlethExtVM.h | 12 ++++++------ 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/libhistoric/AlethExecutive.cpp b/libhistoric/AlethExecutive.cpp index 76803ca61..219f52cbb 100644 --- a/libhistoric/AlethExecutive.cpp +++ b/libhistoric/AlethExecutive.cpp @@ -198,10 +198,9 @@ bool AlethExecutive::call( // Contract will be executed with the version stored in account auto const version = m_s.version( _p.codeAddress ); - m_ext = - make_shared< AlethExtVM >( m_s, m_envInfo, m_chainParams, m_latestBlockTimestamp, - _p.receiveAddress, _p.senderAddress, _origin, _p.apparentValue, _gasPrice, - _p.data, &c, codeHash, version, m_depth, false, _p.staticCall ); + m_ext = make_shared< AlethExtVM >( m_s, m_envInfo, m_chainParams, _p.receiveAddress, + _p.senderAddress, _origin, _p.apparentValue, _gasPrice, _p.data, &c, codeHash, + version, m_depth, false, _p.staticCall ); } } @@ -283,9 +282,9 @@ bool AlethExecutive::executeCreate( Address const& _sender, u256 const& _endowme // Schedule _init execution if not empty. if ( !_init.empty() ) - m_ext = make_shared< AlethExtVM >( m_s, m_envInfo, m_chainParams, m_latestBlockTimestamp, - m_newAddress, _sender, _origin, _endowment, _gasPrice, bytesConstRef(), _init, - sha3( _init ), _version, m_depth, true, false ); + m_ext = make_shared< AlethExtVM >( m_s, m_envInfo, m_chainParams, m_newAddress, _sender, + _origin, _endowment, _gasPrice, bytesConstRef(), _init, sha3( _init ), _version, + m_depth, true, false ); else // code stays empty, but we set the version m_s.setCode( m_newAddress, {}, _version ); diff --git a/libhistoric/AlethExtVM.h b/libhistoric/AlethExtVM.h index 009d9bb88..f717ef2d8 100644 --- a/libhistoric/AlethExtVM.h +++ b/libhistoric/AlethExtVM.h @@ -31,16 +31,16 @@ class AlethExtVM : public ExtVMFace { public: /// Full constructor. AlethExtVM( HistoricState& _s, EnvInfo const& _envInfo, - ChainOperationParams const& _chainParams, time_t _latestBlockTimestamp, Address _myAddress, - Address _caller, Address _origin, u256 _value, u256 _gasPrice, bytesConstRef _data, - bytesConstRef _code, h256 const& _codeHash, u256 const& _version, unsigned _depth, - bool _isCreate, bool _staticCall ) + ChainOperationParams const& _chainParams, Address _myAddress, Address _caller, + Address _origin, u256 _value, u256 _gasPrice, bytesConstRef _data, bytesConstRef _code, + h256 const& _codeHash, u256 const& _version, unsigned _depth, bool _isCreate, + bool _staticCall ) : ExtVMFace( _envInfo, _myAddress, _caller, _origin, _value, _gasPrice, _data, _code.toBytes(), _codeHash, _version, _depth, _isCreate, _staticCall ), m_s( _s ), - m_latestBlockTimestamp( _latestBlockTimestamp ), m_chainParams( _chainParams ), - m_evmSchedule( initEvmSchedule( _latestBlockTimestamp, envInfo().number(), _version ) ) { + m_evmSchedule( + initEvmSchedule( _envInfo.latestBlockTimestamp(), envInfo().number(), _version ) ) { // Contract: processing account must exist. In case of CALL, the ExtVM // is created only if an account has code (so exist). In case of CREATE // the account must be created first. From 8fe5cc973e79ee9b8f03bff163f5d6ff7b1b0ac2 Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Thu, 8 Feb 2024 20:08:23 +0000 Subject: [PATCH 010/154] SKALED-1583 Add and try DEFINE_AMNESIC_PATCH --- libethcore/ChainOperationParams.cpp | 6 ++++++ libethereum/Client.cpp | 10 +++++----- libethereum/Precompiled.cpp | 2 ++ libethereum/SchainPatch.cpp | 3 ++- libethereum/SchainPatch.h | 23 +++++++++++++++++++--- libskale/ContractStorageZeroValuePatch.cpp | 16 +++++++-------- libskale/ContractStorageZeroValuePatch.h | 5 ++++- libskale/OverlayDB.cpp | 2 +- libskale/RevertableFSPatch.cpp | 17 ++++++++-------- libskale/RevertableFSPatch.h | 8 +++++--- libskale/State.cpp | 3 ++- 11 files changed, 64 insertions(+), 31 deletions(-) diff --git a/libethcore/ChainOperationParams.cpp b/libethcore/ChainOperationParams.cpp index ba00a7f91..58d46b70c 100644 --- a/libethcore/ChainOperationParams.cpp +++ b/libethcore/ChainOperationParams.cpp @@ -95,8 +95,14 @@ void ChainOperationParams::setBlockReward( u256 const& _newBlockReward ) { m_blockReward = _newBlockReward; } +// this will be changed to just extract all **PatchTimestamp params by wildcard, +// thus eliminating if..if time_t ChainOperationParams::getPatchTimestamp( const std::string& _name ) const { if ( _name == "PushZeroPatch" ) return sChain.pushZeroPatchTimestamp; + if ( _name == "RevertableFSPatch" ) + return sChain.revertableFSPatchTimestamp; + if ( _name == "ContractStorageZeroValuePatch" ) + return sChain.contractStorageZeroValuePatchTimestamp; assert( false ); } diff --git a/libethereum/Client.cpp b/libethereum/Client.cpp index d6a3daa9b..34e88e3b3 100644 --- a/libethereum/Client.cpp +++ b/libethereum/Client.cpp @@ -160,10 +160,10 @@ Client::Client( ChainParams const& _params, int _networkID, // Set timestamps for patches TotalStorageUsedPatch::g_client = this; ContractStorageLimitPatch::setTimestamp( chainParams().sChain.contractStoragePatchTimestamp ); - ContractStorageZeroValuePatch::setTimestamp( - chainParams().sChain.contractStorageZeroValuePatchTimestamp ); + // ContractStorageZeroValuePatch::setTimestamp( + // chainParams().sChain.contractStorageZeroValuePatchTimestamp ); VerifyDaSigsPatch::setTimestamp( chainParams().sChain.verifyDaSigsPatchTimestamp ); - RevertableFSPatch::setTimestamp( chainParams().sChain.revertableFSPatchTimestamp ); + // RevertableFSPatch::setTimestamp( chainParams().sChain.revertableFSPatchTimestamp ); StorageDestructionPatch::setTimestamp( chainParams().sChain.storageDestructionPatchTimestamp ); POWCheckPatch::setTimestamp( chainParams().sChain.powCheckPatchTimestamp ); // PushZeroPatch::setTimestamp( chainParams().sChain.pushZeroPatchTimestamp ); @@ -671,8 +671,8 @@ size_t Client::syncTransactions( unsigned goodReceipts; ContractStorageLimitPatch::lastBlockTimestamp = blockChain().info().timestamp(); - ContractStorageZeroValuePatch::lastBlockTimestamp = blockChain().info().timestamp(); - RevertableFSPatch::lastBlockTimestamp = blockChain().info().timestamp(); + // ContractStorageZeroValuePatch::lastBlockTimestamp = blockChain().info().timestamp(); + // RevertableFSPatch::lastBlockTimestamp = blockChain().info().timestamp(); StorageDestructionPatch::lastBlockTimestamp = blockChain().info().timestamp(); POWCheckPatch::lastBlockTimestamp = blockChain().info().timestamp(); // PushZeroPatch::lastBlockTimestamp = blockChain().info().timestamp(); diff --git a/libethereum/Precompiled.cpp b/libethereum/Precompiled.cpp index aecc33209..0790ccbd2 100644 --- a/libethereum/Precompiled.cpp +++ b/libethereum/Precompiled.cpp @@ -809,6 +809,7 @@ ETH_REGISTER_PRECOMPILED( getConfigVariableUint256 )( bytesConstRef _in ) { std::string strValue; // call to skaleConfig.sChain.nodes means call to the historic data // need to proccess it in a different way + // TODO Check if this precompiled can be called on historic block if ( isCallToHistoricData( rawName ) && PrecompiledConfigPatch::isEnabled() ) { if ( !g_skaleHost ) throw std::runtime_error( "SkaleHost accessor was not initialized" ); @@ -917,6 +918,7 @@ ETH_REGISTER_PRECOMPILED( getConfigVariableString )( bytesConstRef _in ) { std::string strValue; // call to skaleConfig.sChain.nodes means call to the historic data // need to proccess it in a different way + // TODO Check if this precompiled can be called on historic block if ( isCallToHistoricData( rawName ) && PrecompiledConfigPatch::isEnabled() ) { if ( !g_skaleHost ) throw std::runtime_error( "SkaleHost accessor was not initialized" ); diff --git a/libethereum/SchainPatch.cpp b/libethereum/SchainPatch.cpp index 1aa2df85d..47d5f31e5 100644 --- a/libethereum/SchainPatch.cpp +++ b/libethereum/SchainPatch.cpp @@ -1,3 +1,4 @@ #include "SchainPatch.h" -DEFINE_BASIC_PATCH( D4Patch ) +dev::eth::ChainOperationParams SchainPatch::chainParams; +time_t SchainPatch::latestBlockTimestamp; diff --git a/libethereum/SchainPatch.h b/libethereum/SchainPatch.h index 9c862e72f..2bf530094 100644 --- a/libethereum/SchainPatch.h +++ b/libethereum/SchainPatch.h @@ -12,6 +12,7 @@ class EVMSchedule; #include #include +#include #include @@ -24,9 +25,25 @@ class SchainPatch { cnote << "Patch " << _patchName << " is set at timestamp " << _timeStamp; } } + static void init( const dev::eth::ChainOperationParams& _cp ); + static void useLatestBlockTimestamp( time_t _timestamp ); + +protected: + static dev::eth::ChainOperationParams chainParams; + static time_t latestBlockTimestamp; }; -#define DEFINE_BASIC_PATCH( BlaBlaPatch ) \ +#define DEFINE_AMNESIC_PATCH( BlaBlaPatch ) \ + class BlaBlaPatch : public SchainPatch { \ + public: \ + static std::string getName() { return #BlaBlaPatch; } \ + static bool isEnabledAtLatestBlock() { \ + time_t activationTimestamp = chainParams.getPatchTimestamp( getName() ); \ + return activationTimestamp != 0 && latestBlockTimestamp >= activationTimestamp; \ + } \ + }; + +#define DEFINE_SIMPLE_PATCH( BlaBlaPatch ) \ class BlaBlaPatch : public SchainPatch { \ public: \ static std::string getName() { return #BlaBlaPatch; } \ @@ -37,8 +54,8 @@ class SchainPatch { } \ static bool isEnabledWhen( \ const dev::eth::ChainOperationParams& _cp, time_t _lastBlockTimestamp ) { \ - time_t my_timestamp = _cp.getPatchTimestamp( getName() ); \ - return _lastBlockTimestamp >= my_timestamp; \ + time_t activationTimestamp = _cp.getPatchTimestamp( getName() ); \ + return activationTimestamp != 0 && _lastBlockTimestamp >= activationTimestamp; \ } \ }; diff --git a/libskale/ContractStorageZeroValuePatch.cpp b/libskale/ContractStorageZeroValuePatch.cpp index b77887f74..43f768b88 100644 --- a/libskale/ContractStorageZeroValuePatch.cpp +++ b/libskale/ContractStorageZeroValuePatch.cpp @@ -1,11 +1,11 @@ #include "ContractStorageZeroValuePatch.h" -time_t ContractStorageZeroValuePatch::contractStorageZeroValuePatchTimestamp = 0; -time_t ContractStorageZeroValuePatch::lastBlockTimestamp = 0; +// time_t ContractStorageZeroValuePatch::contractStorageZeroValuePatchTimestamp = 0; +// time_t ContractStorageZeroValuePatch::lastBlockTimestamp = 0; -bool ContractStorageZeroValuePatch::isEnabled() { - if ( contractStorageZeroValuePatchTimestamp == 0 ) { - return false; - } - return contractStorageZeroValuePatchTimestamp <= lastBlockTimestamp; -} +// bool ContractStorageZeroValuePatch::isEnabled() { +// if ( contractStorageZeroValuePatchTimestamp == 0 ) { +// return false; +// } +// return contractStorageZeroValuePatchTimestamp <= lastBlockTimestamp; +//} diff --git a/libskale/ContractStorageZeroValuePatch.h b/libskale/ContractStorageZeroValuePatch.h index f64d3059a..9300100f4 100644 --- a/libskale/ContractStorageZeroValuePatch.h +++ b/libskale/ContractStorageZeroValuePatch.h @@ -16,7 +16,7 @@ class Client; * Solution: we fixed the bug and added new config field introudceChangesTimestamp * Purpose: avoid incorrect txn behaviour * Version introduced: - */ + * class ContractStorageZeroValuePatch : public SchainPatch { public: static bool isEnabled(); @@ -32,5 +32,8 @@ class ContractStorageZeroValuePatch : public SchainPatch { static time_t contractStorageZeroValuePatchTimestamp; static time_t lastBlockTimestamp; }; +*/ + +DEFINE_AMNESIC_PATCH( ContractStorageZeroValuePatch ) #endif // CONTRACTSTORAGEZEROVALUYEPATCH_H diff --git a/libskale/OverlayDB.cpp b/libskale/OverlayDB.cpp index 2c6b5eebb..4cf63eb34 100644 --- a/libskale/OverlayDB.cpp +++ b/libskale/OverlayDB.cpp @@ -151,7 +151,7 @@ void OverlayDB::commitStorageValues() { static const h256 ZERO_VALUE( 0 ); - if ( ContractStorageZeroValuePatch::isEnabled() && value == ZERO_VALUE ) { + if ( ContractStorageZeroValuePatch::isEnabledAtLatestBlock() && value == ZERO_VALUE ) { // if the value is zero, the pair will be deleted in LevelDB // if it exists m_db_face->kill( diff --git a/libskale/RevertableFSPatch.cpp b/libskale/RevertableFSPatch.cpp index 3f638befd..88f9e2723 100644 --- a/libskale/RevertableFSPatch.cpp +++ b/libskale/RevertableFSPatch.cpp @@ -1,11 +1,12 @@ #include "RevertableFSPatch.h" -time_t RevertableFSPatch::revertableFSPatchTimestamp; -time_t RevertableFSPatch::lastBlockTimestamp; -bool RevertableFSPatch::isEnabled() { - if ( revertableFSPatchTimestamp == 0 ) { - return false; - } - return revertableFSPatchTimestamp <= lastBlockTimestamp; -} \ No newline at end of file +// time_t RevertableFSPatch::revertableFSPatchTimestamp; +// time_t RevertableFSPatch::lastBlockTimestamp; + +// bool RevertableFSPatch::isEnabled() { +// if ( revertableFSPatchTimestamp == 0 ) { +// return false; +// } +// return revertableFSPatchTimestamp <= lastBlockTimestamp; +//} diff --git a/libskale/RevertableFSPatch.h b/libskale/RevertableFSPatch.h index 83321bfec..f479a87f6 100644 --- a/libskale/RevertableFSPatch.h +++ b/libskale/RevertableFSPatch.h @@ -1,5 +1,4 @@ #include -#include namespace dev { namespace eth { @@ -9,7 +8,7 @@ class Client; /* * Context: enable revertable filestorage precompileds - */ + * class RevertableFSPatch : public SchainPatch { public: static bool isEnabled(); @@ -23,4 +22,7 @@ class RevertableFSPatch : public SchainPatch { friend class dev::eth::Client; static time_t revertableFSPatchTimestamp; static time_t lastBlockTimestamp; -}; \ No newline at end of file +}; +*/ + +DEFINE_SIMPLE_PATCH( RevertableFSPatch ) diff --git a/libskale/State.cpp b/libskale/State.cpp index 20a4de151..c4a15ab63 100644 --- a/libskale/State.cpp +++ b/libskale/State.cpp @@ -1018,7 +1018,8 @@ std::pair< ExecutionResult, TransactionReceipt > State::execute( EnvInfo const& ExecutionResult res; e.setResultRecipient( res ); - bool isCacheEnabled = RevertableFSPatch::isEnabled(); + bool isCacheEnabled = + RevertableFSPatch::isEnabledWhen( _chainParams, _envInfo.latestBlockTimestamp() ); resetOverlayFS( isCacheEnabled ); auto onOp = _onOp; From eb0361c96e0ee60cd1493b723cdc58e9989d2e3a Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Fri, 9 Feb 2024 18:34:43 +0000 Subject: [PATCH 011/154] SKALED-1583 Try SkipInvalidTransactionsPatch --- libethereum/Block.cpp | 7 +-- libethereum/BlockChain.cpp | 21 +-------- libethereum/Client.cpp | 6 +-- libethereum/SchainPatch.h | 1 + libskale/SkipInvalidTransactionsPatch.cpp | 14 +++--- libskale/SkipInvalidTransactionsPatch.h | 53 ++++++++++++++++++----- 6 files changed, 60 insertions(+), 42 deletions(-) diff --git a/libethereum/Block.cpp b/libethereum/Block.cpp index 0c11c0f63..18ad9dd6f 100644 --- a/libethereum/Block.cpp +++ b/libethereum/Block.cpp @@ -483,7 +483,7 @@ tuple< TransactionReceipts, unsigned > Block::syncEveryone( LOG( m_logger ) << "Transaction " << tr.sha3() << " WouldNotBeInBlock: gasPrice " << tr.gasPrice() << " < " << _gasPrice; - if ( SkipInvalidTransactionsPatch::isEnabled() ) { + if ( SkipInvalidTransactionsPatch::isEnabled( _bc ) ) { // Add to the user-originated transactions that we've executed. m_transactions.push_back( tr ); m_transactionSet.insert( tr.sha3() ); @@ -507,7 +507,7 @@ tuple< TransactionReceipts, unsigned > Block::syncEveryone( ExecutionResult res = execute( _bc.lastBlockHashes(), tr, Permanence::Committed, OnOpFunc() ); - if ( !SkipInvalidTransactionsPatch::isEnabled() || + if ( !SkipInvalidTransactionsPatch::isEnabled( _bc ) || res.excepted != TransactionException::WouldNotBeInBlock ) { receipts.push_back( m_receipts.back() ); @@ -874,7 +874,8 @@ ExecutionResult Block::execute( if ( _p == Permanence::Committed || _p == Permanence::CommittedWithoutState || _p == Permanence::Uncommitted ) { // Add to the user-originated transactions that we've executed. - if ( !SkipInvalidTransactionsPatch::isEnabled() || + if ( !SkipInvalidTransactionsPatch::isEnabledWhen( + m_sealEngine->chainParams(), previousInfo().timestamp() ) || resultReceipt.first.excepted != TransactionException::WouldNotBeInBlock ) { m_transactions.push_back( _t ); m_receipts.push_back( resultReceipt.second ); diff --git a/libethereum/BlockChain.cpp b/libethereum/BlockChain.cpp index 067738362..d4759d174 100644 --- a/libethereum/BlockChain.cpp +++ b/libethereum/BlockChain.cpp @@ -174,24 +174,6 @@ unsigned c_maxCacheSize = 1024 * 1024 * 64; /// Min size, below which we don't bother flushing it. unsigned c_minCacheSize = 1024 * 1024 * 32; -bool hasPotentialInvalidTransactionsInBlock( BlockNumber _bn, const BlockChain& _bc ) { - if ( _bn == 0 ) - return false; - - if ( SkipInvalidTransactionsPatch::getActivationTimestamp() == 0 ) - return true; - - if ( _bn == PendingBlock ) - return !SkipInvalidTransactionsPatch::isEnabled(); - - if ( _bn == LatestBlock ) - _bn = _bc.number(); - - time_t prev_ts = _bc.info( _bc.numberHash( _bn - 1 ) ).timestamp(); - - return prev_ts < SkipInvalidTransactionsPatch::getActivationTimestamp(); -} - string BlockChain::getChainDirName( const ChainParams& _cp ) { return toHex( BlockHeader( _cp.genesisBlock() ).hash().ref().cropped( 0, 4 ) ); } @@ -371,7 +353,8 @@ std::pair< h256, unsigned > BlockChain::transactionLocation( h256 const& _transa auto blockNumber = this->number( ta.blockHash ); - if ( !hasPotentialInvalidTransactionsInBlock( blockNumber, *this ) ) + if ( !SkipInvalidTransactionsPatch::hasPotentialInvalidTransactionsInBlock( + blockNumber, *this ) ) return std::make_pair( ta.blockHash, ta.index ); // rest is for blocks with possibility of invalid transactions diff --git a/libethereum/Client.cpp b/libethereum/Client.cpp index 34e88e3b3..e36950c63 100644 --- a/libethereum/Client.cpp +++ b/libethereum/Client.cpp @@ -167,8 +167,8 @@ Client::Client( ChainParams const& _params, int _networkID, StorageDestructionPatch::setTimestamp( chainParams().sChain.storageDestructionPatchTimestamp ); POWCheckPatch::setTimestamp( chainParams().sChain.powCheckPatchTimestamp ); // PushZeroPatch::setTimestamp( chainParams().sChain.pushZeroPatchTimestamp ); - SkipInvalidTransactionsPatch::setTimestamp( - this->chainParams().sChain.skipInvalidTransactionsPatchTimestamp ); + // SkipInvalidTransactionsPatch::setTimestamp( + // this->chainParams().sChain.skipInvalidTransactionsPatchTimestamp ); PrecompiledConfigPatch::setTimestamp( chainParams().sChain.precompiledConfigPatchTimestamp ); CorrectForkInPowPatch::setTimestamp( chainParams().sChain.correctForkInPowPatchTimestamp ); } @@ -676,7 +676,7 @@ size_t Client::syncTransactions( StorageDestructionPatch::lastBlockTimestamp = blockChain().info().timestamp(); POWCheckPatch::lastBlockTimestamp = blockChain().info().timestamp(); // PushZeroPatch::lastBlockTimestamp = blockChain().info().timestamp(); - SkipInvalidTransactionsPatch::lastBlockTimestamp = blockChain().info().timestamp(); + // SkipInvalidTransactionsPatch::lastBlockTimestamp = blockChain().info().timestamp(); PrecompiledConfigPatch::lastBlockTimestamp = blockChain().info().timestamp(); CorrectForkInPowPatch::lastBlockTimestamp = blockChain().info().timestamp(); CorrectForkInPowPatch::lastBlockNumber = blockChain().number(); diff --git a/libethereum/SchainPatch.h b/libethereum/SchainPatch.h index 2bf530094..f1f9eb72a 100644 --- a/libethereum/SchainPatch.h +++ b/libethereum/SchainPatch.h @@ -43,6 +43,7 @@ class SchainPatch { } \ }; +// TODO One more overload - with EnvInfo? #define DEFINE_SIMPLE_PATCH( BlaBlaPatch ) \ class BlaBlaPatch : public SchainPatch { \ public: \ diff --git a/libskale/SkipInvalidTransactionsPatch.cpp b/libskale/SkipInvalidTransactionsPatch.cpp index 5ab660337..a07e816bb 100644 --- a/libskale/SkipInvalidTransactionsPatch.cpp +++ b/libskale/SkipInvalidTransactionsPatch.cpp @@ -2,11 +2,11 @@ using namespace dev::eth; -time_t SkipInvalidTransactionsPatch::activationTimestamp; -time_t SkipInvalidTransactionsPatch::lastBlockTimestamp; +// time_t SkipInvalidTransactionsPatch::activationTimestamp; +// time_t SkipInvalidTransactionsPatch::lastBlockTimestamp; -bool SkipInvalidTransactionsPatch::isEnabled() { - if ( activationTimestamp == 0 ) - return false; - return lastBlockTimestamp >= activationTimestamp; -} +// bool SkipInvalidTransactionsPatch::isEnabled() { +// if ( activationTimestamp == 0 ) +// return false; +// return lastBlockTimestamp >= activationTimestamp; +//} diff --git a/libskale/SkipInvalidTransactionsPatch.h b/libskale/SkipInvalidTransactionsPatch.h index 7c171b09e..8a9c0936b 100644 --- a/libskale/SkipInvalidTransactionsPatch.h +++ b/libskale/SkipInvalidTransactionsPatch.h @@ -32,21 +32,54 @@ class Client; // Transactions are removed from Transaction Queue as usually. // TODO better start to apply patches from 1st block after timestamp, not second +// class SkipInvalidTransactionsPatch : public SchainPatch { +// public: +// static bool isEnabled(); + +// static void setTimestamp( time_t _activationTimestamp ) { +// activationTimestamp = _activationTimestamp; +// printInfo( __FILE__, _activationTimestamp ); +// } + +// static time_t getActivationTimestamp() { return activationTimestamp; } + +// private: +// friend class dev::eth::Client; +// static time_t activationTimestamp; +// static time_t lastBlockTimestamp; +//}; + class SkipInvalidTransactionsPatch : public SchainPatch { public: - static bool isEnabled(); - - static void setTimestamp( time_t _activationTimestamp ) { - activationTimestamp = _activationTimestamp; - printInfo( __FILE__, _activationTimestamp ); + static std::string getName() { return "SkipInvalidTransactionsPatch"; } + static bool isEnabled( + const dev::eth::BlockChain& _bc, dev::eth::BlockNumber _bn = dev::eth::LatestBlock ) { + time_t timestamp = _bc.chainParams().getPatchTimestamp( getName() ); + return _bc.isPatchTimestampActiveInBlockNumber( timestamp, _bn ); } + static bool isEnabledWhen( + const dev::eth::ChainOperationParams& _cp, time_t _lastBlockTimestamp ) { + time_t activationTimestamp = _cp.getPatchTimestamp( getName() ); + return activationTimestamp != 0 && _lastBlockTimestamp >= activationTimestamp; + } + static bool hasPotentialInvalidTransactionsInBlock( + dev::eth::BlockNumber _bn, const dev::eth::BlockChain& _bc ) { + if ( _bn == 0 ) + return false; + + time_t activationTimestamp = _bc.chainParams().getPatchTimestamp( getName() ); + + if ( activationTimestamp == 0 ) + return true; - static time_t getActivationTimestamp() { return activationTimestamp; } + if ( _bn == dev::eth::PendingBlock ) + return !isEnabled( _bc ); -private: - friend class dev::eth::Client; - static time_t activationTimestamp; - static time_t lastBlockTimestamp; + if ( _bn == dev::eth::LatestBlock ) + _bn = _bc.number(); + + return !isEnabled( _bc, _bn ); + } }; #endif // SKIPINVALIDTRANSACTIONSPATCH_H From babeb7a7b22e8007299d8f1fa24b016d9357d93b Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Wed, 14 Feb 2024 16:04:15 +0000 Subject: [PATCH 012/154] SKALED-1583 Tests compile --- libethcore/ChainOperationParams.cpp | 6 ++ libethcore/ChainOperationParams.h | 1 + libethereum/Block.cpp | 5 +- libethereum/ClientBase.h | 5 +- libskale/SkipInvalidTransactionsPatch.h | 3 + libweb3jsonrpc/Eth.cpp | 43 +++++--------- libweb3jsonrpc/Eth.h | 12 ++-- test/tools/jsontests/BlockChainTests.cpp | 10 ++-- test/tools/jsontests/BlockChainTests.h | 4 +- test/tools/jsontests/TransactionTests.cpp | 6 +- test/tools/jsontests/vm.cpp | 9 +-- test/tools/jsontests/vm.h | 2 +- test/tools/libtesteth/ImportTest.cpp | 9 +-- test/tools/libtesteth/TestHelper.cpp | 2 +- test/unittests/libethcore/SealEngineTest.cpp | 8 +-- test/unittests/libethereum/ExtVMTest.cpp | 8 +-- test/unittests/libethereum/SkaleHost.cpp | 18 ++---- test/unittests/libevm/VMTest.cpp | 60 ++++++++++---------- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 2 +- 19 files changed, 104 insertions(+), 109 deletions(-) diff --git a/libethcore/ChainOperationParams.cpp b/libethcore/ChainOperationParams.cpp index 58d46b70c..377debc70 100644 --- a/libethcore/ChainOperationParams.cpp +++ b/libethcore/ChainOperationParams.cpp @@ -91,6 +91,12 @@ u256 ChainOperationParams::blockReward( EVMSchedule const& _schedule ) const { return m_blockReward; } +u256 ChainOperationParams::blockReward( + time_t _latestBlockTimestamp, u256 const& _blockNumber ) const { + EVMSchedule const& schedule{ evmSchedule( _latestBlockTimestamp, _blockNumber ) }; + return blockReward( schedule ); +} + void ChainOperationParams::setBlockReward( u256 const& _newBlockReward ) { m_blockReward = _newBlockReward; } diff --git a/libethcore/ChainOperationParams.h b/libethcore/ChainOperationParams.h index eb319778b..e048d3a72 100644 --- a/libethcore/ChainOperationParams.h +++ b/libethcore/ChainOperationParams.h @@ -208,6 +208,7 @@ struct ChainOperationParams { public: EVMSchedule const evmSchedule( time_t _lastBlockTimestamp, u256 const& _blockNumber ) const; u256 blockReward( EVMSchedule const& _schedule ) const; + u256 blockReward( time_t _latestBlockTimestamp, u256 const& _blockNumber ) const; void setBlockReward( u256 const& _newBlockReward ); u256 maximumExtraDataSize = 1024; u256 accountStartNonce = 0; diff --git a/libethereum/Block.cpp b/libethereum/Block.cpp index 18ad9dd6f..9ec555334 100644 --- a/libethereum/Block.cpp +++ b/libethereum/Block.cpp @@ -808,9 +808,10 @@ ExecutionResult Block::executeHistoricCall( // transaction as possible. uncommitToSeal(); - EnvInfo const envInfo{ info(), _lh, gasUsed(), m_sealEngine->chainParams().chainID }; + EnvInfo const envInfo{ info(), _lh, this->previousInfo().timestamp(), gasUsed(), + m_sealEngine->chainParams().chainID }; std::pair< ExecutionResult, TransactionReceipt > resultReceipt = - m_state.mutableHistoricState().execute( envInfo, *m_sealEngine, _t, p, onOp ); + m_state.mutableHistoricState().execute( envInfo, m_sealEngine->chainParams(), _t, p, onOp ); return resultReceipt.first; } diff --git a/libethereum/ClientBase.h b/libethereum/ClientBase.h index ba453ecb0..bd3ca21dd 100644 --- a/libethereum/ClientBase.h +++ b/libethereum/ClientBase.h @@ -92,7 +92,7 @@ class ClientBase : public Interface { /// @param _callback Optional callback function for progress reporting std::pair< u256, ExecutionResult > estimateGas( Address const& _from, u256 _value, Address _dest, bytes const& _data, int64_t _maxGas, u256 _gasPrice, - GasEstimationCallback const& _callback ) override; + GasEstimationCallback const& _callback = GasEstimationCallback() ) override; u256 balanceAt( Address _a ) const override; u256 countAt( Address _a ) const override; @@ -136,7 +136,9 @@ class ClientBase : public Interface { return postSeal().pending(); return transactions( hashFromNumber( _block ) ); } + using Interface::transactionHashes; TransactionHashes transactionHashes( h256 _blockHash ) const override; + using Interface::uncle; BlockHeader uncle( h256 _blockHash, unsigned _i ) const override; UncleHashes uncleHashes( h256 _blockHash ) const override; unsigned transactionCount( h256 _blockHash ) const override; @@ -147,6 +149,7 @@ class ClientBase : public Interface { } return transactionCount( hashFromNumber( _block ) ); } + using Interface::uncleCount; unsigned uncleCount( h256 _blockHash ) const override; unsigned number() const override; h256s pendingHashes() const override; diff --git a/libskale/SkipInvalidTransactionsPatch.h b/libskale/SkipInvalidTransactionsPatch.h index 8a9c0936b..b450e95b4 100644 --- a/libskale/SkipInvalidTransactionsPatch.h +++ b/libskale/SkipInvalidTransactionsPatch.h @@ -62,6 +62,9 @@ class SkipInvalidTransactionsPatch : public SchainPatch { time_t activationTimestamp = _cp.getPatchTimestamp( getName() ); return activationTimestamp != 0 && _lastBlockTimestamp >= activationTimestamp; } + // returns true if block N can contain invalid transactions + // returns false if this block was created with SkipInvalidTransactionsPatch and they were + // skipped static bool hasPotentialInvalidTransactionsInBlock( dev::eth::BlockNumber _bn, const dev::eth::BlockChain& _bc ) { if ( _bn == 0 ) diff --git a/libweb3jsonrpc/Eth.cpp b/libweb3jsonrpc/Eth.cpp index 63d4a8ff3..934ca2241 100644 --- a/libweb3jsonrpc/Eth.cpp +++ b/libweb3jsonrpc/Eth.cpp @@ -106,29 +106,9 @@ void GappedTransactionIndexCache::ensureCached( BlockNumber _bn, } // for } -// returns true if block N can contain invalid transactions -// returns false if this block was created with SkipInvalidTransactionsPatch and they were skipped -bool hasPotentialInvalidTransactionsInBlock( BlockNumber _bn, const Interface& _client ) { - if ( _bn == 0 ) - return false; - - if ( SkipInvalidTransactionsPatch::getActivationTimestamp() == 0 ) - return true; - - if ( _bn == PendingBlock ) - return !SkipInvalidTransactionsPatch::isEnabled(); - - if ( _bn == LatestBlock ) - _bn = _client.number(); - - time_t prev_ts = _client.blockInfo( _bn - 1 ).timestamp(); - - return prev_ts < SkipInvalidTransactionsPatch::getActivationTimestamp(); -} - #endif -Eth::Eth( const std::string& configPath, eth::Interface& _eth, eth::AccountHolder& _ethAccounts ) +Eth::Eth( const std::string& configPath, eth::Client& _eth, eth::AccountHolder& _ethAccounts ) : skutils::json_config_file_accessor( configPath ), m_eth( _eth ), m_ethAccounts( _ethAccounts ), @@ -289,7 +269,8 @@ Json::Value Eth::eth_getBlockTransactionCountByHash( string const& _blockHash ) #ifdef HISTORIC_STATE BlockNumber bn = client()->numberFromHash( blockHash ); - if ( !hasPotentialInvalidTransactionsInBlock( bn, *client() ) ) + if ( !SkipInvalidTransactionsPatch::hasPotentialInvalidTransactionsInBlock( + bn, client()->blockChain() ) ) #endif return toJS( client()->transactionCount( blockHash ) ); #ifdef HISTORIC_STATE @@ -308,7 +289,8 @@ Json::Value Eth::eth_getBlockTransactionCountByNumber( string const& _blockNumbe #ifdef HISTORIC_STATE BlockNumber bn = jsToBlockNumber( _blockNumber ); - if ( !hasPotentialInvalidTransactionsInBlock( bn, *client() ) ) + if ( !SkipInvalidTransactionsPatch::hasPotentialInvalidTransactionsInBlock( + bn, client()->blockChain() ) ) #endif return toJS( client()->transactionCount( jsToBlockNumber( _blockNumber ) ) ); #ifdef HISTORIC_STATE @@ -556,7 +538,8 @@ Json::Value Eth::eth_getBlockByHash( string const& _blockHash, bool _includeTran #ifdef HISTORIC_STATE BlockNumber bn = client()->numberFromHash( h ); - if ( hasPotentialInvalidTransactionsInBlock( bn, *client() ) ) { + if ( SkipInvalidTransactionsPatch::hasPotentialInvalidTransactionsInBlock( + bn, client()->blockChain() ) ) { // remove invalid transactions size_t index = 0; Transactions::iterator newEnd = std::remove_if( transactions.begin(), @@ -573,7 +556,8 @@ Json::Value Eth::eth_getBlockByHash( string const& _blockHash, bool _includeTran #ifdef HISTORIC_STATE BlockNumber bn = client()->numberFromHash( h ); - if ( hasPotentialInvalidTransactionsInBlock( bn, *client() ) ) { + if ( SkipInvalidTransactionsPatch::hasPotentialInvalidTransactionsInBlock( + bn, client()->blockChain() ) ) { // remove invalid transactions size_t index = 0; h256s::iterator newEnd = std::remove_if( transactions.begin(), transactions.end(), @@ -644,7 +628,8 @@ Json::Value Eth::eth_getTransactionByBlockHashAndIndex( #ifdef HISTORIC_STATE BlockNumber bn = client()->numberFromHash( bh ); - if ( hasPotentialInvalidTransactionsInBlock( bn, *client() ) ) + if ( SkipInvalidTransactionsPatch::hasPotentialInvalidTransactionsInBlock( + bn, client()->blockChain() ) ) try { ti = m_gapCache->realIndexFromGapped( bn, ti ); } catch ( const out_of_range& ) { @@ -668,7 +653,8 @@ Json::Value Eth::eth_getTransactionByBlockNumberAndIndex( unsigned int ti = static_cast< unsigned int >( jsToInt( _transactionIndex ) ); #ifdef HISTORIC_STATE - if ( hasPotentialInvalidTransactionsInBlock( bn, *client() ) ) + if ( SkipInvalidTransactionsPatch::hasPotentialInvalidTransactionsInBlock( + bn, client()->blockChain() ) ) try { ti = m_gapCache->realIndexFromGapped( bn, ti ); } catch ( const out_of_range& ) { @@ -723,7 +709,8 @@ LocalisedTransactionReceipt Eth::eth_getTransactionReceipt( string const& _trans auto rcp = cli->localisedTransactionReceipt( h ); #ifdef HISTORIC_STATE - if ( hasPotentialInvalidTransactionsInBlock( rcp.blockNumber(), *client() ) ) { + if ( SkipInvalidTransactionsPatch::hasPotentialInvalidTransactionsInBlock( + rcp.blockNumber(), client()->blockChain() ) ) { // skip invalid if ( rcp.gasUsed() == 0 ) { m_receiptsCache.put( cacheKey, nullptr ); diff --git a/libweb3jsonrpc/Eth.h b/libweb3jsonrpc/Eth.h index 8059860d7..38b4ce866 100644 --- a/libweb3jsonrpc/Eth.h +++ b/libweb3jsonrpc/Eth.h @@ -43,7 +43,7 @@ class KeyPair; namespace eth { class AccountHolder; struct TransactionSkeleton; -class Interface; +class Client; class LocalisedTransactionReceipt; } // namespace eth } // namespace dev @@ -57,7 +57,7 @@ namespace _detail { // cache for transaction index mapping class GappedTransactionIndexCache { public: - GappedTransactionIndexCache( size_t _cacheSize, const dev::eth::Interface& _client ) + GappedTransactionIndexCache( size_t _cacheSize, const dev::eth::Client& _client ) : client( _client ), cacheSize( _cacheSize ) { assert( _cacheSize > 0 ); } @@ -116,7 +116,7 @@ class GappedTransactionIndexCache { private: mutable std::shared_mutex mtx; - const dev::eth::Interface& client; + const dev::eth::Client& client; const size_t cacheSize; enum { UNDEFINED = ( size_t ) -1 }; @@ -135,7 +135,7 @@ std::string exceptionToErrorMessage(); */ class Eth : public dev::rpc::EthFace, public skutils::json_config_file_accessor { public: - Eth( const std::string& configPath, eth::Interface& _eth, eth::AccountHolder& _ethAccounts ); + Eth( const std::string& configPath, eth::Client& _eth, eth::AccountHolder& _ethAccounts ); virtual RPCModules implementedModules() const override { return RPCModules{ RPCModule{ "eth", "1.0" } }; @@ -220,9 +220,9 @@ class Eth : public dev::rpc::EthFace, public skutils::json_config_file_accessor void setTransactionDefaults( eth::TransactionSkeleton& _t ); protected: - eth::Interface* client() { return &m_eth; } + eth::Client* client() { return &m_eth; } - eth::Interface& m_eth; + eth::Client& m_eth; eth::AccountHolder& m_ethAccounts; // a cache that maps the call request to the pair of response string and block number diff --git a/test/tools/jsontests/BlockChainTests.cpp b/test/tools/jsontests/BlockChainTests.cpp index ac9dc294f..3db8159b8 100644 --- a/test/tools/jsontests/BlockChainTests.cpp +++ b/test/tools/jsontests/BlockChainTests.cpp @@ -507,10 +507,10 @@ void testBCTest( json_spirit::mObject const& _o ) { if ( blockFromFields.blockHeader().parentHash() == preHash ) { State const postState = testChain.topBlock().state(); assert( testChain.getInterface().sealEngine() ); - bigint reward = calculateMiningReward( testChain.topBlock().blockHeader().number(), + bigint reward = calculateMiningReward( testChain.topBlock().blockHeader().timestamp(), testChain.topBlock().blockHeader().number(), uncleNumbers.size() >= 1 ? uncleNumbers[0] : 0, uncleNumbers.size() >= 2 ? uncleNumbers[1] : 0, - *testChain.getInterface().sealEngine() ); + testChain.getInterface().sealEngine()->chainParams() ); ImportTest::checkBalance( preState, postState, reward ); } else { cnote << "Block Number " << testChain.topBlock().blockHeader().number(); @@ -544,9 +544,9 @@ void testBCTest( json_spirit::mObject const& _o ) { ImportTest::compareStates( postState, blockchain.topBlock().state() ); } -bigint calculateMiningReward( u256 const& _blNumber, u256 const& _unNumber1, u256 const& _unNumber2, - SealEngineFace const& _sealEngine ) { - bigint const baseReward = _sealEngine.blockReward( _blNumber ); +bigint calculateMiningReward( time_t _latestBlockTimestamp, u256 const& _blNumber, u256 const& _unNumber1, u256 const& _unNumber2, + ChainOperationParams const& _cp ) { + bigint const baseReward = _cp.blockReward( _latestBlockTimestamp, _blNumber ); bigint reward = baseReward; // INCLUDE_UNCLE = BASE_REWARD / 32 // UNCLE_REWARD = BASE_REWARD * (8 - Bn + Un) / 8 diff --git a/test/tools/jsontests/BlockChainTests.h b/test/tools/jsontests/BlockChainTests.h index bfa1f7962..e4369817c 100644 --- a/test/tools/jsontests/BlockChainTests.h +++ b/test/tools/jsontests/BlockChainTests.h @@ -77,8 +77,8 @@ void checkJsonSectionForInvalidBlock( mObject& _blObj ); void checkExpectedException( mObject& _blObj, Exception const& _e ); void checkBlocks( TestBlock const& _blockFromFields, TestBlock const& _blockFromRlp, string const& _testname ); -bigint calculateMiningReward( u256 const& _blNumber, u256 const& _unNumber1, u256 const& _unNumber2, - SealEngineFace const& _sealEngine ); +bigint calculateMiningReward( time_t _latestBlockTimestamp, u256 const& _blNumber, u256 const& _unNumber1, u256 const& _unNumber2, + ChainOperationParams const& _cp ); json_spirit::mObject fillBCTest( json_spirit::mObject const& _input ); void testBCTest( json_spirit::mObject const& _o ); diff --git a/test/tools/jsontests/TransactionTests.cpp b/test/tools/jsontests/TransactionTests.cpp index cd870ca99..96b19dd67 100644 --- a/test/tools/jsontests/TransactionTests.cpp +++ b/test/tools/jsontests/TransactionTests.cpp @@ -102,7 +102,8 @@ json_spirit::mObject FillTransactionTest( json_spirit::mObject const& _o ) { Exception() << errinfo_comment( TestOutputHelper::get().testName() + "transaction from RLP signature is invalid" ) ); - se->verifyTransaction( ImportRequirements::Everything, txFromFields, bh, 0 ); + // TODO Remove SealEngine from tests too! + se->verifyTransaction( se->chainParams(), ImportRequirements::Everything, txFromFields, 0, bh, 0 ); if ( expectSection.count( "sender" ) > 0 ) { string expectSender = toString( expectSection["sender"].get_str() ); BOOST_CHECK_MESSAGE( toString( txFromFields.sender() ) == expectSender, @@ -160,7 +161,8 @@ void TestTransactionTest( json_spirit::mObject const& _o ) { RLP rlp( stream ); txFromRlp = Transaction( rlp.data(), CheckTransaction::Everything ); bool onExperimentalAndZeroSig = onExperimental && txFromRlp.hasZeroSignature(); - se->verifyTransaction( ImportRequirements::Everything, txFromRlp, bh, 0 ); + // TODO Remove SealEngine from tests too! + se->verifyTransaction( se->chainParams(), ImportRequirements::Everything, txFromRlp, 0, bh, 0 ); if ( !( txFromRlp.signature().isValid() || onExperimentalAndZeroSig ) ) BOOST_THROW_EXCEPTION( Exception() << errinfo_comment( testname + diff --git a/test/tools/jsontests/vm.cpp b/test/tools/jsontests/vm.cpp index 4151cc773..0cc8ea25b 100644 --- a/test/tools/jsontests/vm.cpp +++ b/test/tools/jsontests/vm.cpp @@ -92,7 +92,7 @@ mObject FakeExtVM::exportEnv() { return ret; } -EnvInfo FakeExtVM::importEnv( mObject const& _o, LastBlockHashesFace const& _lastBlockHashes ) { +EnvInfo FakeExtVM::importEnv( mObject const& _o, LastBlockHashesFace const& _lastBlockHashes, time_t _latestBlockTimestamp ) { // cant use BOOST_REQUIRE, because this function is used outside boost test (createRandomTest) assert( _o.count( "currentGasLimit" ) > 0 ); assert( _o.count( "currentDifficulty" ) > 0 ); @@ -109,7 +109,7 @@ EnvInfo FakeExtVM::importEnv( mObject const& _o, LastBlockHashesFace const& _las blockHeader.setTimestamp( toPositiveInt64( _o.at( "currentTimestamp" ) ) ); blockHeader.setAuthor( Address( _o.at( "currentCoinbase" ).get_str() ) ); blockHeader.setNumber( toPositiveInt64( _o.at( "currentNumber" ) ) ); - return EnvInfo( blockHeader, _lastBlockHashes, 0, 0 ); + return EnvInfo( blockHeader, _lastBlockHashes, _latestBlockTimestamp, 0, 0 ); } mObject FakeExtVM::exportState() { @@ -313,7 +313,7 @@ json_spirit::mValue VmTestSuite::doTests( json_spirit::mValue const& _input, boo BOOST_REQUIRE_MESSAGE( testInput.count( "expect" ) == 0, testname + " expect set!" ); TestLastBlockHashes lastBlockHashes( h256s( 256, h256() ) ); - eth::EnvInfo env = FakeExtVM::importEnv( testInput.at( "env" ).get_obj(), lastBlockHashes ); + eth::EnvInfo env = FakeExtVM::importEnv( testInput.at( "env" ).get_obj(), lastBlockHashes, 0 ); FakeExtVM fev( env ); fev.importState( testInput.at( "pre" ).get_obj() ); @@ -446,7 +446,8 @@ json_spirit::mValue VmTestSuite::doTests( json_spirit::mValue const& _input, boo BOOST_REQUIRE_MESSAGE( testInput.at( "logs" ).type() == str_type, testname + " logs field is not a string." ); - dev::test::FakeExtVM test( eth::EnvInfo{BlockHeader{}, lastBlockHashes, 0, 0} ); + // use all patches here ("1") + dev::test::FakeExtVM test( eth::EnvInfo{BlockHeader{}, lastBlockHashes, 1, 0, 0} ); test.importState( testInput.at( "post" ).get_obj() ); test.importCallCreates( testInput.at( "callcreates" ).get_array() ); diff --git a/test/tools/jsontests/vm.h b/test/tools/jsontests/vm.h index 80176151a..1fc038599 100644 --- a/test/tools/jsontests/vm.h +++ b/test/tools/jsontests/vm.h @@ -77,7 +77,7 @@ class FakeExtVM : public eth::ExtVMFace { u256 doPosts(); json_spirit::mObject exportEnv(); static dev::eth::EnvInfo importEnv( - json_spirit::mObject const& _o, eth::LastBlockHashesFace const& _lastBlockHashes ); + json_spirit::mObject const& _o, eth::LastBlockHashesFace const& _lastBlockHashes, time_t _latestBlockTimestamp ); json_spirit::mObject exportState(); void importState( json_spirit::mObject const& _object ); json_spirit::mObject exportExec(); diff --git a/test/tools/libtesteth/ImportTest.cpp b/test/tools/libtesteth/ImportTest.cpp index 45bd07598..b15f06e3c 100644 --- a/test/tools/libtesteth/ImportTest.cpp +++ b/test/tools/libtesteth/ImportTest.cpp @@ -103,7 +103,7 @@ void ImportTest::makeBlockchainTestFromStateTest( set< eth::Network > const& _ne // Calculate the block reward ChainParams const chainParams{genesisInfo( net )}; - EVMSchedule const schedule = chainParams.evmSchedule( 1 ); + EVMSchedule const schedule = chainParams.evmSchedule( 0, 1 ); // u256 const blockReward = chainParams.blockReward(schedule); TrExpectSection search{trDup, smap}; @@ -262,11 +262,11 @@ std::tuple< State, ImportTest::ExecOutput, skale::ChangeLog > ImportTest::execut StandardTrace st; st.setShowMnemonics(); st.setOptions( Options::get().jsontraceOptions ); - out = initialState.execute( _env, *se.get(), _tr, Permanence::Committed, st.onOp() ); + out = initialState.execute( _env, se->chainParams(), _tr, Permanence::Committed, st.onOp() ); cout << st.json(); cout << "{\"stateRoot\": \"Is not supported\"}"; } else - out = initialState.execute( _env, *se.get(), _tr, Permanence::Uncommitted ); + out = initialState.execute( _env, se->chainParams(), _tr, Permanence::Uncommitted ); // the changeLog might be broken under --jsontrace, because it uses intialState.execute with // Permanence::Committed rather than Permanence::Uncommitted @@ -357,7 +357,8 @@ void ImportTest::importEnv( json_spirit::mObject const& _o ) { header.setAuthor( Address( _o.at( "currentCoinbase" ).get_str() ) ); m_lastBlockHashes.reset( new TestLastBlockHashes( lastHashes( header.number() ) ) ); - m_envInfo.reset( new EnvInfo( header, *m_lastBlockHashes, 0, mainnetChainID() ) ); + // enable all patches ("1") + m_envInfo.reset( new EnvInfo( header, *m_lastBlockHashes, 1, 0, mainnetChainID() ) ); } // import state from not fully declared json_spirit::mObject, writing to _stateOptionsMap which diff --git a/test/tools/libtesteth/TestHelper.cpp b/test/tools/libtesteth/TestHelper.cpp index 7384cff09..9e8918e51 100644 --- a/test/tools/libtesteth/TestHelper.cpp +++ b/test/tools/libtesteth/TestHelper.cpp @@ -117,7 +117,7 @@ void simulateMining( Client& client, size_t numBlocks, const dev::Address &addre State state = client.state().createStateModifyCopy(); u256 reward = 0; for ( size_t blockNumber = 0; blockNumber < numBlocks; ++blockNumber ) { - reward += client.sealEngine()->blockReward( blockNumber ); + reward += client.sealEngine()->blockReward( 1, blockNumber ); } state.addBalance( address, reward ); state.commit(); diff --git a/test/unittests/libethcore/SealEngineTest.cpp b/test/unittests/libethcore/SealEngineTest.cpp index 003795371..4ee30ce56 100644 --- a/test/unittests/libethcore/SealEngineTest.cpp +++ b/test/unittests/libethcore/SealEngineTest.cpp @@ -61,15 +61,15 @@ BOOST_AUTO_TEST_CASE( UnsignedTransactionIsValidBeforeExperimental, header.setNumber( 1 ); - ethash.SealEngineFace::verifyTransaction( - ImportRequirements::TransactionSignatures, tx, header, 0 ); // check that it doesn't throw + SealEngineFace::verifyTransaction( params, ImportRequirements::TransactionSignatures, + tx, 1, header, 0 ); // check that it doesn't throw } BOOST_AUTO_TEST_CASE( UnsignedTransactionIsValidInExperimental ) { header.setNumber( 0x1010 ); - ethash.SealEngineFace::verifyTransaction( - ImportRequirements::TransactionSignatures, tx, header, 0 ); // check that it doesn't throw + SealEngineFace::verifyTransaction( params, ImportRequirements::TransactionSignatures, + tx, 1, header, 0 ); // check that it doesn't throw } BOOST_AUTO_TEST_SUITE_END() diff --git a/test/unittests/libethereum/ExtVMTest.cpp b/test/unittests/libethereum/ExtVMTest.cpp index d8e140099..548d30033 100644 --- a/test/unittests/libethereum/ExtVMTest.cpp +++ b/test/unittests/libethereum/ExtVMTest.cpp @@ -49,7 +49,7 @@ class ExtVMConstantinopleFixTestFixture : public TestOutputHelperFixture { } EnvInfo createEnvInfo( BlockHeader const& _header ) const { - return {_header, lastBlockHashes, 0, blockchain.chainID()}; + return {_header, lastBlockHashes, 1, 0, blockchain.chainID()}; } NetworkSelector networkSelector; @@ -72,7 +72,7 @@ BOOST_AUTO_TEST_CASE( BlockhashOutOfBoundsRetunsZero, TestLastBlockHashes lastBlockHashes( {} ); EnvInfo envInfo( createEnvInfo( block.info() ) ); Address addr( "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b" ); - ExtVM extVM( block.mutableState(), envInfo, *blockchain.sealEngine(), addr, addr, addr, 0, 0, + ExtVM extVM( block.mutableState(), envInfo, blockchain.sealEngine()->chainParams(), addr, addr, addr, 0, 0, {}, {}, {}, 0, 0, false, false ); BOOST_CHECK_EQUAL( extVM.blockHash( 100 ), h256() ); @@ -85,9 +85,9 @@ BOOST_AUTO_TEST_CASE( BlockhashBeforeConstantinopleReliesOnLastHashes, h256s lastHashes{h256( "0xaaabbbccc" ), h256( "0xdddeeefff" )}; TestLastBlockHashes lastBlockHashes( lastHashes ); - EnvInfo envInfo( block.info(), lastBlockHashes, 0, blockchain.chainID() ); + EnvInfo envInfo( block.info(), lastBlockHashes, block.info().timestamp(), 0, blockchain.chainID() ); Address addr( "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b" ); - ExtVM extVM( block.mutableState(), envInfo, *blockchain.sealEngine(), addr, addr, addr, 0, 0, + ExtVM extVM( block.mutableState(), envInfo, blockchain.sealEngine()->chainParams(), addr, addr, addr, 0, 0, {}, {}, {}, 0, 0, false, false ); h256 hash = extVM.blockHash( 1 ); BOOST_REQUIRE_EQUAL( hash, lastHashes[0] ); diff --git a/test/unittests/libethereum/SkaleHost.cpp b/test/unittests/libethereum/SkaleHost.cpp index 930339da0..1b8195504 100644 --- a/test/unittests/libethereum/SkaleHost.cpp +++ b/test/unittests/libethereum/SkaleHost.cpp @@ -241,7 +241,6 @@ BOOST_DATA_TEST_CASE( validTransaction, skipInvalidTransactionsVariants, skipInv if(skipInvalidTransactionsFlag){ const_cast(client->chainParams()).sChain.skipInvalidTransactionsPatchTimestamp = 1; } - SkipInvalidTransactionsPatch::setTimestamp(client->chainParams().sChain.skipInvalidTransactionsPatchTimestamp); auto senderAddress = coinbase.address(); auto receiver = KeyPair::create(); @@ -291,7 +290,6 @@ BOOST_DATA_TEST_CASE( transactionRlpBad, skipInvalidTransactionsVariants, skipIn if(skipInvalidTransactionsFlag){ const_cast(client->chainParams()).sChain.skipInvalidTransactionsPatchTimestamp = 1; } - SkipInvalidTransactionsPatch::setTimestamp(client->chainParams().sChain.skipInvalidTransactionsPatchTimestamp); auto senderAddress = coinbase.address(); @@ -377,7 +375,6 @@ BOOST_DATA_TEST_CASE( transactionSigZero, skipInvalidTransactionsVariants, skipI if(skipInvalidTransactionsFlag){ const_cast(client->chainParams()).sChain.skipInvalidTransactionsPatchTimestamp = 1; } - SkipInvalidTransactionsPatch::setTimestamp(client->chainParams().sChain.skipInvalidTransactionsPatchTimestamp); auto senderAddress = coinbase.address(); auto receiver = KeyPair::create(); @@ -432,7 +429,6 @@ BOOST_DATA_TEST_CASE( transactionSigBad, skipInvalidTransactionsVariants, skipIn if(skipInvalidTransactionsFlag){ const_cast(client->chainParams()).sChain.skipInvalidTransactionsPatchTimestamp = 1; } - SkipInvalidTransactionsPatch::setTimestamp(client->chainParams().sChain.skipInvalidTransactionsPatchTimestamp); auto senderAddress = coinbase.address(); auto receiver = KeyPair::create(); @@ -487,7 +483,6 @@ BOOST_DATA_TEST_CASE( transactionGasIncorrect, skipInvalidTransactionsVariants, if(skipInvalidTransactionsFlag){ const_cast(client->chainParams()).sChain.skipInvalidTransactionsPatchTimestamp = 1; } - SkipInvalidTransactionsPatch::setTimestamp(client->chainParams().sChain.skipInvalidTransactionsPatchTimestamp); auto senderAddress = coinbase.address(); auto receiver = KeyPair::create(); @@ -540,7 +535,6 @@ BOOST_DATA_TEST_CASE( transactionGasNotEnough, skipInvalidTransactionsVariants, if(skipInvalidTransactionsFlag){ const_cast(client->chainParams()).sChain.skipInvalidTransactionsPatchTimestamp = 1; } - SkipInvalidTransactionsPatch::setTimestamp(client->chainParams().sChain.skipInvalidTransactionsPatchTimestamp); auto senderAddress = coinbase.address(); auto receiver = KeyPair::create(); @@ -601,7 +595,6 @@ BOOST_DATA_TEST_CASE( transactionNonceBig, skipInvalidTransactionsVariants, skip if(skipInvalidTransactionsFlag){ const_cast(client->chainParams()).sChain.skipInvalidTransactionsPatchTimestamp = 1; } - SkipInvalidTransactionsPatch::setTimestamp(client->chainParams().sChain.skipInvalidTransactionsPatchTimestamp); auto senderAddress = coinbase.address(); auto receiver = KeyPair::create(); @@ -653,7 +646,6 @@ BOOST_DATA_TEST_CASE( transactionNonceSmall, skipInvalidTransactionsVariants, sk if(skipInvalidTransactionsFlag){ const_cast(client->chainParams()).sChain.skipInvalidTransactionsPatchTimestamp = 1; } - SkipInvalidTransactionsPatch::setTimestamp(client->chainParams().sChain.skipInvalidTransactionsPatchTimestamp); auto senderAddress = coinbase.address(); auto receiver = KeyPair::create(); @@ -717,7 +709,6 @@ BOOST_DATA_TEST_CASE( transactionBalanceBad, skipInvalidTransactionsVariants, sk if(skipInvalidTransactionsFlag){ const_cast(client->chainParams()).sChain.skipInvalidTransactionsPatchTimestamp = 1; } - SkipInvalidTransactionsPatch::setTimestamp(client->chainParams().sChain.skipInvalidTransactionsPatchTimestamp); auto senderAddress = coinbase.address(); auto receiver = KeyPair::create(); @@ -795,7 +786,6 @@ BOOST_DATA_TEST_CASE( transactionGasBlockLimitExceeded, skipInvalidTransactionsV if(skipInvalidTransactionsFlag){ const_cast(client->chainParams()).sChain.skipInvalidTransactionsPatchTimestamp = 1; } - SkipInvalidTransactionsPatch::setTimestamp(client->chainParams().sChain.skipInvalidTransactionsPatchTimestamp); auto senderAddress = coinbase.address(); auto receiver = KeyPair::create(); @@ -913,7 +903,7 @@ BOOST_AUTO_TEST_CASE( transactionDropReceive // 1st tx Transaction tx1 = tx_from_json( json ); - tx1.checkOutExternalGas( client->chainParams(), client->number() ); + tx1.checkOutExternalGas( client->chainParams(), client->latestBlock().info().timestamp(), client->number() ); // submit it! tq->import( tx1 ); @@ -970,7 +960,7 @@ BOOST_AUTO_TEST_CASE( transactionDropQueue, // 1st tx Transaction tx1 = tx_from_json( json ); - tx1.checkOutExternalGas( client->chainParams(), client->number() ); + tx1.checkOutExternalGas( client->chainParams(), client->latestBlock().info().timestamp(), client->number() ); // submit it! tq->import( tx1 ); @@ -1027,7 +1017,7 @@ BOOST_AUTO_TEST_CASE( transactionDropByGasPrice // 1st tx Transaction tx1 = tx_from_json( json ); - tx1.checkOutExternalGas( client->chainParams(), client->number() ); + tx1.checkOutExternalGas( client->chainParams(), client->latestBlock().info().timestamp(), client->number() ); // submit it! tq->import( tx1 ); @@ -1090,7 +1080,7 @@ BOOST_AUTO_TEST_CASE( transactionDropByGasPriceReceive // 1st tx Transaction tx1 = tx_from_json( json ); - tx1.checkOutExternalGas( client->chainParams(), client->number() ); + tx1.checkOutExternalGas( client->chainParams(), client->latestBlock().info().timestamp(), client->number() ); RLPStream stream1; tx1.streamRLP( stream1 ); diff --git a/test/unittests/libevm/VMTest.cpp b/test/unittests/libevm/VMTest.cpp index fedb0e35c..86239f08c 100644 --- a/test/unittests/libevm/VMTest.cpp +++ b/test/unittests/libevm/VMTest.cpp @@ -55,7 +55,7 @@ class Create2TestFixture : public TestOutputHelperFixture { virtual ~Create2TestFixture() { state.releaseWriteLock(); } void testCreate2worksInConstantinople() { - ExtVM extVm( state, envInfo, *se, address, address, address, value, gasPrice, + ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, ref( inputData ), ref( code ), sha3( code ), version, depth, isCreate, staticCall ); vm->exec( gas, extVm, OnOpFunc{} ); @@ -66,7 +66,7 @@ class Create2TestFixture : public TestOutputHelperFixture { void testCreate2isInvalidBeforeConstantinople() { se.reset( ChainParams( genesisInfo( Network::ByzantiumTest ) ).createSealEngine() ); - ExtVM extVm( state, envInfo, *se, address, address, address, value, gasPrice, + ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, ref( inputData ), ref( code ), sha3( code ), version, depth, isCreate, staticCall ); BOOST_REQUIRE_THROW( vm->exec( gas, extVm, OnOpFunc{} ), BadInstruction ); @@ -75,7 +75,7 @@ class Create2TestFixture : public TestOutputHelperFixture { void testCreate2succeedsIfAddressHasEther() { state.addBalance( expectedAddress, 1 * ether ); - ExtVM extVm( state, envInfo, *se, address, address, address, value, gasPrice, + ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, ref( inputData ), ref( code ), sha3( code ), version, depth, isCreate, staticCall ); vm->exec( gas, extVm, OnOpFunc{} ); @@ -86,7 +86,7 @@ class Create2TestFixture : public TestOutputHelperFixture { void testCreate2doesntChangeContractIfAddressExists() { state.setCode( expectedAddress, bytes{inputData}, 0 ); - ExtVM extVm( state, envInfo, *se, address, address, address, value, gasPrice, + ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, ref( inputData ), ref( code ), sha3( code ), version, depth, isCreate, staticCall ); vm->exec( gas, extVm, OnOpFunc{} ); @@ -96,7 +96,7 @@ class Create2TestFixture : public TestOutputHelperFixture { void testCreate2isForbiddenInStaticCall() { staticCall = true; - ExtVM extVm( state, envInfo, *se, address, address, address, value, gasPrice, + ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, ref( inputData ), ref( code ), sha3( code ), version, depth, isCreate, staticCall ); BOOST_REQUIRE_THROW( vm->exec( gas, extVm, OnOpFunc{} ), DisallowedStateChange ); @@ -109,7 +109,7 @@ class Create2TestFixture : public TestOutputHelperFixture { state.createContract( expectedAddress ); state.setStorage( expectedAddress, 1, 1 ); - ExtVM extVm( state, envInfo, *se, address, address, address, value, gasPrice, + ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, ref( inputData ), ref( code ), sha3( code ), version, depth, isCreate, staticCall ); vm->exec( gas, extVm, OnOpFunc{} ); @@ -127,7 +127,7 @@ class Create2TestFixture : public TestOutputHelperFixture { state.createContract( expectedAddress ); state.setStorage( expectedAddress, 1, 1 ); - ExtVM extVm( state, envInfo, *se, address, address, address, value, gasPrice, + ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, ref( inputData ), ref( code ), sha3( code ), version, depth, isCreate, staticCall ); vm->exec( gas, extVm, OnOpFunc{} ); @@ -136,7 +136,7 @@ class Create2TestFixture : public TestOutputHelperFixture { } void testCreate2costIncludesInitCodeHashing() { - ExtVM extVm( state, envInfo, *se, address, address, address, value, gasPrice, + ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, ref( inputData ), ref( code ), sha3( code ), version, depth, isCreate, staticCall ); uint64_t gasBefore = 0; @@ -174,7 +174,7 @@ class Create2TestFixture : public TestOutputHelperFixture { State state = State( 0 ).createStateModifyCopy(); std::unique_ptr< SealEngineFace > se{ ChainParams( genesisInfo( Network::ConstantinopleTest ) ).createSealEngine()}; - EnvInfo envInfo{blockHeader, lastBlockHashes, 0, se->chainParams().chainID}; + EnvInfo envInfo{blockHeader, lastBlockHashes, 1, 0, se->chainParams().chainID}; u256 value = 0; u256 gasPrice = 1; @@ -219,7 +219,7 @@ class ExtcodehashTestFixture : public TestOutputHelperFixture { } void testExtcodehashWorksInConstantinople() { - ExtVM extVm( state, envInfo, *se, address, address, address, value, gasPrice, + ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, extAddress.ref(), ref( code ), sha3( code ), version, depth, isCreate, staticCall ); owning_bytes_ref ret = vm->exec( gas, extVm, OnOpFunc{} ); @@ -228,7 +228,7 @@ class ExtcodehashTestFixture : public TestOutputHelperFixture { } void testExtcodehashHasCorrectCost() { - ExtVM extVm( state, envInfo, *se, address, address, address, value, gasPrice, + ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, extAddress.ref(), ref( code ), sha3( code ), version, depth, isCreate, staticCall ); bigint gasBefore; @@ -250,7 +250,7 @@ class ExtcodehashTestFixture : public TestOutputHelperFixture { void testExtCodeHashisInvalidBeforeConstantinople() { se.reset( ChainParams( genesisInfo( Network::ByzantiumTest ) ).createSealEngine() ); - ExtVM extVm( state, envInfo, *se, address, address, address, value, gasPrice, + ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, extAddress.ref(), ref( code ), sha3( code ), version, depth, isCreate, staticCall ); BOOST_REQUIRE_THROW( vm->exec( gas, extVm, OnOpFunc{} ), BadInstruction ); @@ -260,7 +260,7 @@ class ExtcodehashTestFixture : public TestOutputHelperFixture { Address addressWithEmptyCode{KeyPair::create().address()}; state.addBalance( addressWithEmptyCode, 1 * ether ); - ExtVM extVm( state, envInfo, *se, address, address, address, value, gasPrice, + ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, addressWithEmptyCode.ref(), ref( code ), sha3( code ), version, depth, isCreate, staticCall ); @@ -273,7 +273,7 @@ class ExtcodehashTestFixture : public TestOutputHelperFixture { void testExtCodeHashOfNonExistentAccount() { Address addressNonExisting{0x1234}; - ExtVM extVm( state, envInfo, *se, address, address, address, value, gasPrice, + ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, addressNonExisting.ref(), ref( code ), sha3( code ), version, depth, isCreate, staticCall ); @@ -285,7 +285,7 @@ class ExtcodehashTestFixture : public TestOutputHelperFixture { void testExtCodeHashOfPrecomileZeroBalance() { Address addressPrecompile{0x1}; - ExtVM extVm( state, envInfo, *se, address, address, address, value, gasPrice, + ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, addressPrecompile.ref(), ref( code ), sha3( code ), version, depth, isCreate, staticCall ); @@ -298,7 +298,7 @@ class ExtcodehashTestFixture : public TestOutputHelperFixture { Address addressPrecompile{0x1}; state.addBalance( addressPrecompile, 1 * ether ); - ExtVM extVm( state, envInfo, *se, address, address, address, value, gasPrice, + ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, addressPrecompile.ref(), ref( code ), sha3( code ), version, depth, isCreate, staticCall ); @@ -319,7 +319,7 @@ class ExtcodehashTestFixture : public TestOutputHelperFixture { bytes extAddressPrefixed = bytes{1, 2, 3, 4, 5, 6, 7, 8, 9, 0xa, 0xb, 0xc} + extAddress.ref(); - ExtVM extVm( state, envInfo, *se, address, address, address, value, gasPrice, + ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, ref( extAddressPrefixed ), ref( code ), sha3( code ), version, depth, isCreate, staticCall ); @@ -335,7 +335,7 @@ class ExtcodehashTestFixture : public TestOutputHelperFixture { State state{0}; std::unique_ptr< SealEngineFace > se{ ChainParams( genesisInfo( Network::ConstantinopleTest ) ).createSealEngine()}; - EnvInfo envInfo{blockHeader, lastBlockHashes, 0, se->chainParams().chainID}; + EnvInfo envInfo{blockHeader, lastBlockHashes, 1, 0, se->chainParams().chainID}; u256 value = 0; u256 gasPrice = 1; @@ -425,7 +425,7 @@ class SstoreTestFixture : public TestOutputHelperFixture { state.commit( dev::eth::CommitBehaviour::RemoveEmptyAccounts ); bytes const code = fromHex( _codeStr ); - ExtVM extVm( state, envInfo, *se, to, from, from, value, gasPrice, inputData, ref( code ), + ExtVM extVm( state, envInfo, se->chainParams(), to, from, from, value, gasPrice, inputData, ref( code ), sha3( code ), version, depth, isCreate, staticCall ); u256 gasBefore = gas; @@ -443,7 +443,7 @@ class SstoreTestFixture : public TestOutputHelperFixture { State state = State( 0 ).createStateModifyCopy(); std::unique_ptr< SealEngineFace > se{ ChainParams( genesisInfo( Network::ConstantinopleTest ) ).createSealEngine()}; - EnvInfo envInfo{blockHeader, lastBlockHashes, 0, se->chainParams().chainID}; + EnvInfo envInfo{blockHeader, lastBlockHashes, 1, 0, se->chainParams().chainID}; u256 value = 0; u256 gasPrice = 1; @@ -472,7 +472,7 @@ class ChainIDTestFixture : public TestOutputHelperFixture { explicit ChainIDTestFixture( VMFace* _vm ) : vm{_vm} { state.addBalance( address, 1 * ether ); } void testChainIDWorksInIstanbul() { - ExtVM extVm( state, envInfo, *se, address, address, address, value, gasPrice, {}, + ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, {}, ref( code ), sha3( code ), version, depth, isCreate, staticCall ); owning_bytes_ref ret = vm->exec( gas, extVm, OnOpFunc{} ); @@ -481,7 +481,7 @@ class ChainIDTestFixture : public TestOutputHelperFixture { } void testChainIDHasCorrectCost() { - ExtVM extVm( state, envInfo, *se, address, address, address, value, gasPrice, {}, + ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, {}, ref( code ), sha3( code ), version, depth, isCreate, staticCall ); bigint gasBefore; @@ -504,7 +504,7 @@ class ChainIDTestFixture : public TestOutputHelperFixture { se.reset( ChainParams( genesisInfo( Network::ConstantinopleFixTest ) ).createSealEngine() ); version = ConstantinopleFixSchedule.accountVersion; - ExtVM extVm( state, envInfo, *se, address, address, address, value, gasPrice, {}, + ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, {}, ref( code ), sha3( code ), version, depth, isCreate, staticCall ); BOOST_REQUIRE_THROW( vm->exec( gas, extVm, OnOpFunc{} ), BadInstruction ); @@ -517,7 +517,7 @@ class ChainIDTestFixture : public TestOutputHelperFixture { State state{0}; std::unique_ptr< SealEngineFace > se{ ChainParams( genesisInfo( Network::IstanbulTest ) ).createSealEngine()}; - EnvInfo envInfo{blockHeader, lastBlockHashes, 0, se->chainParams().chainID}; + EnvInfo envInfo{blockHeader, lastBlockHashes, 1, 0, se->chainParams().chainID}; u256 value = 0; u256 gasPrice = 1; @@ -551,14 +551,14 @@ class BalanceFixture : public TestOutputHelperFixture { explicit BalanceFixture( VMFace* _vm ) : vm{_vm} { state.addBalance( address, 1 * ether ); } void testSelfBalanceWorksInIstanbul() { - ExtVM extVmSelfBalance( state, envInfo, *se, address, address, address, value, gasPrice, {}, + ExtVM extVmSelfBalance( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, {}, ref( codeSelfBalance ), sha3( codeSelfBalance ), version, depth, isCreate, staticCall ); owning_bytes_ref retSelfBalance = vm->exec( gas, extVmSelfBalance, OnOpFunc{} ); BOOST_REQUIRE_EQUAL( fromBigEndian< u256 >( retSelfBalance ), 1 * ether ); - ExtVM extVmBalance( state, envInfo, *se, address, address, address, value, gasPrice, {}, + ExtVM extVmBalance( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, {}, ref( codeBalance ), sha3( codeBalance ), version, depth, isCreate, staticCall ); owning_bytes_ref retBalance = vm->exec( gas, extVmBalance, OnOpFunc{} ); @@ -568,7 +568,7 @@ class BalanceFixture : public TestOutputHelperFixture { } void testSelfBalanceHasCorrectCost() { - ExtVM extVm( state, envInfo, *se, address, address, address, value, gasPrice, {}, + ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, {}, ref( codeSelfBalance ), sha3( codeSelfBalance ), version, depth, isCreate, staticCall ); bigint gasBefore; @@ -588,7 +588,7 @@ class BalanceFixture : public TestOutputHelperFixture { } void testBalanceHasCorrectCost() { - ExtVM extVm( state, envInfo, *se, address, address, address, value, gasPrice, {}, + ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, {}, ref( codeBalance ), sha3( codeBalance ), version, depth, isCreate, staticCall ); bigint gasBefore; @@ -611,7 +611,7 @@ class BalanceFixture : public TestOutputHelperFixture { se.reset( ChainParams( genesisInfo( Network::ConstantinopleFixTest ) ).createSealEngine() ); version = ConstantinopleFixSchedule.accountVersion; - ExtVM extVm( state, envInfo, *se, address, address, address, value, gasPrice, {}, + ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, {}, ref( codeSelfBalance ), sha3( codeSelfBalance ), version, depth, isCreate, staticCall ); BOOST_REQUIRE_THROW( vm->exec( gas, extVm, OnOpFunc{} ), BadInstruction ); @@ -624,7 +624,7 @@ class BalanceFixture : public TestOutputHelperFixture { State state{0}; std::unique_ptr< SealEngineFace > se{ ChainParams( genesisInfo( Network::IstanbulTest ) ).createSealEngine()}; - EnvInfo envInfo{blockHeader, lastBlockHashes, 0, se->chainParams().chainID}; + EnvInfo envInfo{blockHeader, lastBlockHashes, 1, 0, se->chainParams().chainID}; u256 value = 0; u256 gasPrice = 1; diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index 9fd8bd109..66bac61b1 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -2003,7 +2003,7 @@ contract TestEstimateGas { dev::bytes data = dev::jsToBytes( estimateGasCall["data"].asString() ); BOOST_REQUIRE( dev::jsToU256( estimatedGas ) > dev::eth::TransactionBase::baseGasRequired( false, &data, fixture.client->chainParams().evmSchedule( - fixture.client->number() ) ) ); + fixture.client->latestBlock().info().timestamp(), fixture.client->number() ) ) ); // try to send with this gas estimateGasCall["gas"] = toJS( jsToInt( estimatedGas ) ); From 40624e4ef9d58aedd7158e41746682c213ed6a5d Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Fri, 16 Feb 2024 00:30:34 +0000 Subject: [PATCH 013/154] SKALED-1583 Adapting tests --- libethashseal/Ethash.cpp | 7 ------- libethcore/ChainOperationParams.cpp | 2 ++ libskale/State.cpp | 2 +- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 1 + 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/libethashseal/Ethash.cpp b/libethashseal/Ethash.cpp index c54c67239..4d283c093 100644 --- a/libethashseal/Ethash.cpp +++ b/libethashseal/Ethash.cpp @@ -135,13 +135,6 @@ void Ethash::verifyTransaction( ChainOperationParams const& _chainParams, BlockHeader const& _header, u256 const& _startGasUsed ) { SealEngineFace::verifyTransaction( _chainParams, _ir, _t, _latestBlockTimestamp, _header, _startGasUsed ); - - if ( _ir & ImportRequirements::TransactionSignatures ) { - if ( _header.number() >= _chainParams.EIP158ForkBlock ) { - uint64_t chainID = _chainParams.chainID; - _t.checkChainId( chainID, _chainParams.skaleDisableChainIdCheck ); - } // if - } } u256 Ethash::childGasLimit( BlockHeader const& _bi, u256 const& _gasFloorTarget ) const { diff --git a/libethcore/ChainOperationParams.cpp b/libethcore/ChainOperationParams.cpp index 377debc70..7c1f3f449 100644 --- a/libethcore/ChainOperationParams.cpp +++ b/libethcore/ChainOperationParams.cpp @@ -110,5 +110,7 @@ time_t ChainOperationParams::getPatchTimestamp( const std::string& _name ) const return sChain.revertableFSPatchTimestamp; if ( _name == "ContractStorageZeroValuePatch" ) return sChain.contractStorageZeroValuePatchTimestamp; + if ( _name == "SkipInvalidTransactionsPatch" ) + return sChain.skipInvalidTransactionsPatchTimestamp; assert( false ); } diff --git a/libskale/State.cpp b/libskale/State.cpp index c4a15ab63..2501d9c74 100644 --- a/libskale/State.cpp +++ b/libskale/State.cpp @@ -1014,7 +1014,7 @@ std::pair< ExecutionResult, TransactionReceipt > State::execute( EnvInfo const& // transaction is bad in any way. // HACK 0 here is for gasPrice // TODO Not sure that 1st 0 as timestamp is acceptable here - Executive e( *this, _envInfo, _chainParams, 0, _p != Permanence::Committed ); + Executive e( *this, _envInfo, _chainParams, 0, 0, _p != Permanence::Committed ); ExecutionResult res; e.setResultRecipient( res ); diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index 66bac61b1..b74b03eaf 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -298,6 +298,7 @@ struct JsonRpcFixture : public TestOutputHelperFixture { chainParams.extraData = h256::random().asBytes(); chainParams.nodeInfo.port = chainParams.nodeInfo.port6 = rand_port; chainParams.sChain.nodes[0].port = chainParams.sChain.nodes[0].port6 = rand_port; + chainParams.skaleDisableChainIdCheck = true; } chainParams.sChain.multiTransactionMode = _mtmEnabled; chainParams.nodeInfo.syncNode = _isSyncNode; From b5df8f531aa8fd7cd09cd153d0cb8087481c2278 Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Fri, 16 Feb 2024 13:11:11 +0000 Subject: [PATCH 014/154] SKALED-1583 Do all transaction checks in SealEngine, not in Ethash --- libethcore/SealEngine.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/libethcore/SealEngine.cpp b/libethcore/SealEngine.cpp index 5aa5765e1..425b807fe 100644 --- a/libethcore/SealEngine.cpp +++ b/libethcore/SealEngine.cpp @@ -143,6 +143,13 @@ void SealEngineFace::verifyTransaction( ChainOperationParams const& _chainParams static_cast< bigint >( _header.gasLimit() - _gasUsed ), static_cast< bigint >( gas ), string( "_gasUsed + (bigint)_t.gas() > _header.gasLimit()" ) ) ); + + if ( _ir & ImportRequirements::TransactionSignatures ) { + if ( _header.number() >= _chainParams.EIP158ForkBlock ) { + uint64_t chainID = _chainParams.chainID; + _t.checkChainId( chainID, _chainParams.skaleDisableChainIdCheck ); + } // if + } } SealEngineFace* SealEngineRegistrar::create( ChainOperationParams const& _params ) { From 60328c59e4141f2922933eb600fe5c134d57fa8b Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Wed, 21 Feb 2024 12:43:09 +0000 Subject: [PATCH 015/154] SKALED-1583 Fix library dependencies in testeth --- test/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 4a7b264cc..a0a15a45e 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -86,8 +86,8 @@ target_link_libraries(testeth PRIVATE ${DEPS_INSTALL_ROOT}/lib/libcrypto.a ${DEPS_INSTALL_ROOT}/lib/libz.a idn2 - ${DEPS_INSTALL_ROOT}/lib/liblzma.a ${DEPS_INSTALL_ROOT}/lib/libunwind.a + ${DEPS_INSTALL_ROOT}/lib/liblzma.a batched-io ) if (CONSENSUS) From 52b0449ce5ee60d84d4eb1c6564954f58b16eeb8 Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Wed, 21 Feb 2024 15:55:38 +0000 Subject: [PATCH 016/154] SKALED-1583 Fix SkaleHost tests --- test/unittests/libethereum/SkaleHost.cpp | 206 +++++++++++++++++------ 1 file changed, 158 insertions(+), 48 deletions(-) diff --git a/test/unittests/libethereum/SkaleHost.cpp b/test/unittests/libethereum/SkaleHost.cpp index 1b8195504..2550042dd 100644 --- a/test/unittests/libethereum/SkaleHost.cpp +++ b/test/unittests/libethereum/SkaleHost.cpp @@ -137,6 +137,8 @@ struct SkaleHostFixture : public TestOutputHelperFixture { if( params.count("multiTransactionMode") && stoi( params.at( "multiTransactionMode" ) ) ) chainParams.sChain.multiTransactionMode = true; + if( params.count("skipInvalidTransactionsPatchTimestamp") && stoi( params.at( "skipInvalidTransactionsPatchTimestamp" ) ) ) + chainParams.sChain.skipInvalidTransactionsPatchTimestamp = 1; accountHolder.reset( new FixedAccountHolder( [&]() { return client.get(); }, {} ) ); accountHolder->setAccounts( {coinbase, account2} ); @@ -232,15 +234,18 @@ struct SkaleHostFixture : public TestOutputHelperFixture { { u256 balanceAfter = client->balanceAt( senderAddress ); \ BOOST_REQUIRE_GE( balanceBefore - balanceAfter, decrease ); } -BOOST_FIXTURE_TEST_SUITE( SkaleHostSuite, SkaleHostFixture ) //, *boost::unit_test::disabled() ) +BOOST_AUTO_TEST_SUITE( SkaleHostSuite ) //, *boost::unit_test::disabled() ) auto skipInvalidTransactionsVariants = boost::unit_test::data::make({false, true}); BOOST_DATA_TEST_CASE( validTransaction, skipInvalidTransactionsVariants, skipInvalidTransactionsFlag ) { - if(skipInvalidTransactionsFlag){ - const_cast(client->chainParams()).sChain.skipInvalidTransactionsPatchTimestamp = 1; - } + SkaleHostFixture fixture( std::map( {{"skipInvalidTransactionsPatchTimestamp", to_string(int(skipInvalidTransactionsFlag))}} ) ); + auto& client = fixture.client; + auto& coinbase = fixture.coinbase; + auto& accountHolder = fixture.accountHolder; + auto& skaleHost = fixture.skaleHost; + auto& stub = fixture.stub; auto senderAddress = coinbase.address(); auto receiver = KeyPair::create(); @@ -287,9 +292,12 @@ BOOST_DATA_TEST_CASE( transactionRlpBad, skipInvalidTransactionsVariants, skipIn // , *boost::unit_test::precondition( dev::test::run_not_express ) ) { - if(skipInvalidTransactionsFlag){ - const_cast(client->chainParams()).sChain.skipInvalidTransactionsPatchTimestamp = 1; - } + SkaleHostFixture fixture( std::map( {{"skipInvalidTransactionsPatchTimestamp", to_string(int(skipInvalidTransactionsFlag))}} ) ); + auto& client = fixture.client; + auto& coinbase = fixture.coinbase; + auto& accountHolder = fixture.accountHolder; + auto& skaleHost = fixture.skaleHost; + auto& stub = fixture.stub; auto senderAddress = coinbase.address(); @@ -372,9 +380,12 @@ BOOST_DATA_TEST_CASE( transactionSigZero, skipInvalidTransactionsVariants, skipI // , *boost::unit_test::precondition( dev::test::run_not_express ) ) { - if(skipInvalidTransactionsFlag){ - const_cast(client->chainParams()).sChain.skipInvalidTransactionsPatchTimestamp = 1; - } + SkaleHostFixture fixture( std::map( {{"skipInvalidTransactionsPatchTimestamp", to_string(int(skipInvalidTransactionsFlag))}} ) ); + auto& client = fixture.client; + auto& coinbase = fixture.coinbase; + auto& accountHolder = fixture.accountHolder; + auto& skaleHost = fixture.skaleHost; + auto& stub = fixture.stub; auto senderAddress = coinbase.address(); auto receiver = KeyPair::create(); @@ -426,9 +437,12 @@ BOOST_DATA_TEST_CASE( transactionSigBad, skipInvalidTransactionsVariants, skipIn // , *boost::unit_test::precondition( dev::test::run_not_express ) ) { - if(skipInvalidTransactionsFlag){ - const_cast(client->chainParams()).sChain.skipInvalidTransactionsPatchTimestamp = 1; - } + SkaleHostFixture fixture( std::map( {{"skipInvalidTransactionsPatchTimestamp", to_string(int(skipInvalidTransactionsFlag))}} ) ); + auto& client = fixture.client; + auto& coinbase = fixture.coinbase; + auto& accountHolder = fixture.accountHolder; + auto& skaleHost = fixture.skaleHost; + auto& stub = fixture.stub; auto senderAddress = coinbase.address(); auto receiver = KeyPair::create(); @@ -480,9 +494,12 @@ BOOST_DATA_TEST_CASE( transactionGasIncorrect, skipInvalidTransactionsVariants, // , *boost::unit_test::precondition( dev::test::run_not_express ) ) { - if(skipInvalidTransactionsFlag){ - const_cast(client->chainParams()).sChain.skipInvalidTransactionsPatchTimestamp = 1; - } + SkaleHostFixture fixture( std::map( {{"skipInvalidTransactionsPatchTimestamp", to_string(int(skipInvalidTransactionsFlag))}} ) ); + auto& client = fixture.client; + auto& coinbase = fixture.coinbase; + auto& accountHolder = fixture.accountHolder; + auto& skaleHost = fixture.skaleHost; + auto& stub = fixture.stub; auto senderAddress = coinbase.address(); auto receiver = KeyPair::create(); @@ -532,9 +549,12 @@ BOOST_DATA_TEST_CASE( transactionGasNotEnough, skipInvalidTransactionsVariants, // , *boost::unit_test::precondition( dev::test::run_not_express ) ) { - if(skipInvalidTransactionsFlag){ - const_cast(client->chainParams()).sChain.skipInvalidTransactionsPatchTimestamp = 1; - } + SkaleHostFixture fixture( std::map( {{"skipInvalidTransactionsPatchTimestamp", to_string(int(skipInvalidTransactionsFlag))}} ) ); + auto& client = fixture.client; + auto& coinbase = fixture.coinbase; + auto& accountHolder = fixture.accountHolder; + auto& skaleHost = fixture.skaleHost; + auto& stub = fixture.stub; auto senderAddress = coinbase.address(); auto receiver = KeyPair::create(); @@ -592,9 +612,12 @@ BOOST_DATA_TEST_CASE( transactionGasNotEnough, skipInvalidTransactionsVariants, // nonce too big BOOST_DATA_TEST_CASE( transactionNonceBig, skipInvalidTransactionsVariants, skipInvalidTransactionsFlag ) { - if(skipInvalidTransactionsFlag){ - const_cast(client->chainParams()).sChain.skipInvalidTransactionsPatchTimestamp = 1; - } + SkaleHostFixture fixture( std::map( {{"skipInvalidTransactionsPatchTimestamp", to_string(int(skipInvalidTransactionsFlag))}} ) ); + auto& client = fixture.client; + auto& coinbase = fixture.coinbase; + auto& accountHolder = fixture.accountHolder; + auto& skaleHost = fixture.skaleHost; + auto& stub = fixture.stub; auto senderAddress = coinbase.address(); auto receiver = KeyPair::create(); @@ -643,9 +666,12 @@ BOOST_DATA_TEST_CASE( transactionNonceSmall, skipInvalidTransactionsVariants, sk //, *boost::unit_test::precondition( dev::test::run_not_express ) ) { - if(skipInvalidTransactionsFlag){ - const_cast(client->chainParams()).sChain.skipInvalidTransactionsPatchTimestamp = 1; - } + SkaleHostFixture fixture( std::map( {{"skipInvalidTransactionsPatchTimestamp", to_string(int(skipInvalidTransactionsFlag))}} ) ); + auto& client = fixture.client; + auto& coinbase = fixture.coinbase; + auto& accountHolder = fixture.accountHolder; + auto& skaleHost = fixture.skaleHost; + auto& stub = fixture.stub; auto senderAddress = coinbase.address(); auto receiver = KeyPair::create(); @@ -706,9 +732,12 @@ BOOST_DATA_TEST_CASE( transactionNonceSmall, skipInvalidTransactionsVariants, sk // not enough cash BOOST_DATA_TEST_CASE( transactionBalanceBad, skipInvalidTransactionsVariants, skipInvalidTransactionsFlag ) { - if(skipInvalidTransactionsFlag){ - const_cast(client->chainParams()).sChain.skipInvalidTransactionsPatchTimestamp = 1; - } + SkaleHostFixture fixture( std::map( {{"skipInvalidTransactionsPatchTimestamp", to_string(int(skipInvalidTransactionsFlag))}} ) ); + auto& client = fixture.client; + auto& coinbase = fixture.coinbase; + auto& accountHolder = fixture.accountHolder; + auto& skaleHost = fixture.skaleHost; + auto& stub = fixture.stub; auto senderAddress = coinbase.address(); auto receiver = KeyPair::create(); @@ -783,9 +812,12 @@ BOOST_DATA_TEST_CASE( transactionGasBlockLimitExceeded, skipInvalidTransactionsV // , *boost::unit_test::precondition( dev::test::run_not_express ) ) { - if(skipInvalidTransactionsFlag){ - const_cast(client->chainParams()).sChain.skipInvalidTransactionsPatchTimestamp = 1; - } + SkaleHostFixture fixture( std::map( {{"skipInvalidTransactionsPatchTimestamp", to_string(int(skipInvalidTransactionsFlag))}} ) ); + auto& client = fixture.client; + auto& coinbase = fixture.coinbase; + auto& accountHolder = fixture.accountHolder; + auto& skaleHost = fixture.skaleHost; + auto& stub = fixture.stub; auto senderAddress = coinbase.address(); auto receiver = KeyPair::create(); @@ -798,7 +830,7 @@ BOOST_DATA_TEST_CASE( transactionGasBlockLimitExceeded, skipInvalidTransactionsV json["nonce"] = 0; json["gasPrice"] = 0; - Transaction tx1 = tx_from_json( json ); + Transaction tx1 = fixture.tx_from_json( json ); RLPStream stream1; tx1.streamRLP( stream1 ); @@ -810,7 +842,7 @@ BOOST_DATA_TEST_CASE( transactionGasBlockLimitExceeded, skipInvalidTransactionsV json["nonce"] = 1; json["gas"] = jsToDecimal( toJS( client->chainParams().gasLimit - 21000 + 1 ) ); - Transaction tx2 = tx_from_json( json ); + Transaction tx2 = fixture.tx_from_json( json ); RLPStream stream2; tx2.streamRLP( stream2 ); @@ -845,11 +877,20 @@ BOOST_DATA_TEST_CASE( transactionGasBlockLimitExceeded, skipInvalidTransactionsV // Last transaction should be dropped from block proposal BOOST_AUTO_TEST_CASE( gasLimitInBlockProposal ) { + + SkaleHostFixture fixture; + auto& client = fixture.client; + auto& coinbase = fixture.coinbase; + auto& accountHolder = fixture.accountHolder; + auto& skaleHost = fixture.skaleHost; + auto& stub = fixture.stub; + auto& account2 = fixture.account2; + auto receiver = KeyPair::create(); { auto wr_state = client->state().createStateModifyCopy(); - wr_state.addBalance( account2.address(), client->chainParams().gasLimit * 1000 + dev::eth::ether ); + wr_state.addBalance( fixture.account2.address(), client->chainParams().gasLimit * 1000 + dev::eth::ether ); wr_state.commit(); } @@ -861,7 +902,7 @@ BOOST_AUTO_TEST_CASE( gasLimitInBlockProposal ) { json["nonce"] = 0; json["gasPrice"] = 1000; - Transaction tx1 = tx_from_json( json ); + Transaction tx1 = fixture.tx_from_json( json ); RLPStream stream1; tx1.streamRLP( stream1 ); @@ -870,7 +911,7 @@ BOOST_AUTO_TEST_CASE( gasLimitInBlockProposal ) { json["from"] = toJS( account2.address() ); json["gas"] = jsToDecimal( toJS( client->chainParams().gasLimit - 21000 + 1 ) ); - Transaction tx2 = tx_from_json( json ); + Transaction tx2 = fixture.tx_from_json( json ); RLPStream stream2; tx2.streamRLP( stream2 ); @@ -891,6 +932,15 @@ BOOST_AUTO_TEST_CASE( gasLimitInBlockProposal ) { BOOST_AUTO_TEST_CASE( transactionDropReceive //, *boost::unit_test::precondition( dev::test::run_not_express ) ) { + + SkaleHostFixture fixture; + auto& client = fixture.client; + auto& coinbase = fixture.coinbase; + auto& accountHolder = fixture.accountHolder; + auto& skaleHost = fixture.skaleHost; + auto& stub = fixture.stub; + auto& tq = fixture.tq; + auto senderAddress = coinbase.address(); auto receiver = KeyPair::create(); @@ -902,7 +952,7 @@ BOOST_AUTO_TEST_CASE( transactionDropReceive json["nonce"] = 1; // 1st tx - Transaction tx1 = tx_from_json( json ); + Transaction tx1 = fixture.tx_from_json( json ); tx1.checkOutExternalGas( client->chainParams(), client->latestBlock().info().timestamp(), client->number() ); // submit it! @@ -912,7 +962,7 @@ BOOST_AUTO_TEST_CASE( transactionDropReceive u256 value2 = 20000 * dev::eth::szabo; json["value"] = jsToDecimal( toJS( value2 ) ); json["nonce"] = 0; - bytes tx2 = bytes_from_json( json ); + bytes tx2 = fixture.bytes_from_json( json ); // receive it! skaleHost->receiveTransaction( toJS( tx2 ) ); @@ -925,7 +975,7 @@ BOOST_AUTO_TEST_CASE( transactionDropReceive json["value"] = jsToDecimal( toJS( value3 ) ); json["nonce"] = 0; - bytes tx3 = bytes_from_json( json ); + bytes tx3 = fixture.bytes_from_json( json ); // return it from consensus! CHECK_BLOCK_BEGIN; @@ -947,6 +997,15 @@ BOOST_AUTO_TEST_CASE( transactionDropReceive BOOST_AUTO_TEST_CASE( transactionDropQueue, *boost::unit_test::precondition( dev::test::run_not_express ) ) { + + SkaleHostFixture fixture; + auto& client = fixture.client; + auto& coinbase = fixture.coinbase; + auto& accountHolder = fixture.accountHolder; + auto& skaleHost = fixture.skaleHost; + auto& stub = fixture.stub; + auto& tq = fixture.tq; + auto senderAddress = coinbase.address(); auto receiver = KeyPair::create(); @@ -959,7 +1018,7 @@ BOOST_AUTO_TEST_CASE( transactionDropQueue, json["nonce"] = 1; // 1st tx - Transaction tx1 = tx_from_json( json ); + Transaction tx1 = fixture.tx_from_json( json ); tx1.checkOutExternalGas( client->chainParams(), client->latestBlock().info().timestamp(), client->number() ); // submit it! @@ -973,7 +1032,7 @@ BOOST_AUTO_TEST_CASE( transactionDropQueue, json["value"] = jsToDecimal( toJS( value2 ) ); json["nonce"] = 0; - Transaction tx2 = tx_from_json( json ); + Transaction tx2 = fixture.tx_from_json( json ); RLPStream stream2; tx2.streamRLP( stream2 ); @@ -1004,6 +1063,15 @@ BOOST_AUTO_TEST_CASE( transactionDropQueue, BOOST_AUTO_TEST_CASE( transactionDropByGasPrice // , *boost::unit_test::precondition( dev::test::run_not_express ) ) { + + SkaleHostFixture fixture; + auto& client = fixture.client; + auto& coinbase = fixture.coinbase; + auto& accountHolder = fixture.accountHolder; + auto& skaleHost = fixture.skaleHost; + auto& stub = fixture.stub; + auto& tq = fixture.tq; + auto senderAddress = coinbase.address(); auto receiver = KeyPair::create(); @@ -1016,7 +1084,7 @@ BOOST_AUTO_TEST_CASE( transactionDropByGasPrice json["nonce"] = 1; // 1st tx - Transaction tx1 = tx_from_json( json ); + Transaction tx1 = fixture.tx_from_json( json ); tx1.checkOutExternalGas( client->chainParams(), client->latestBlock().info().timestamp(), client->number() ); // submit it! @@ -1030,7 +1098,7 @@ BOOST_AUTO_TEST_CASE( transactionDropByGasPrice json["value"] = jsToDecimal( toJS( value2 ) ); json["nonce"] = 0; - Transaction tx2 = tx_from_json( json ); + Transaction tx2 = fixture.tx_from_json( json ); RLPStream stream2; tx2.streamRLP( stream2 ); @@ -1061,12 +1129,22 @@ BOOST_AUTO_TEST_CASE( transactionDropByGasPrice BOOST_AUTO_TEST_CASE( transactionDropByGasPriceReceive // , *boost::unit_test::precondition( dev::test::run_not_express ) ) { + + SkaleHostFixture fixture; + auto& client = fixture.client; + auto& coinbase = fixture.coinbase; + auto& accountHolder = fixture.accountHolder; + auto& skaleHost = fixture.skaleHost; + auto& stub = fixture.stub; + auto& tq = fixture.tq; + auto& account2 = fixture.account2; + auto senderAddress = coinbase.address(); auto receiver = KeyPair::create(); { auto wr_state = client->state().createStateModifyCopy(); - wr_state.addBalance( account2.address(), 1 * ether ); + wr_state.addBalance( fixture.account2.address(), 1 * ether ); wr_state.commit(); } @@ -1079,7 +1157,7 @@ BOOST_AUTO_TEST_CASE( transactionDropByGasPriceReceive json["gasPrice"] = "1000"; // 1st tx - Transaction tx1 = tx_from_json( json ); + Transaction tx1 = fixture.tx_from_json( json ); tx1.checkOutExternalGas( client->chainParams(), client->latestBlock().info().timestamp(), client->number() ); RLPStream stream1; @@ -1097,7 +1175,7 @@ BOOST_AUTO_TEST_CASE( transactionDropByGasPriceReceive json["value"] = jsToDecimal( toJS( value2 ) ); json["nonce"] = 0; - Transaction tx2 = tx_from_json( json ); + Transaction tx2 = fixture.tx_from_json( json ); RLPStream stream2; tx2.streamRLP( stream2 ); @@ -1127,6 +1205,14 @@ BOOST_AUTO_TEST_CASE( transactionDropByGasPriceReceive BOOST_AUTO_TEST_CASE( transactionRace // , *boost::unit_test::precondition( dev::test::run_not_express ) ) { + + SkaleHostFixture fixture; + auto& client = fixture.client; + auto& coinbase = fixture.coinbase; + auto& accountHolder = fixture.accountHolder; + auto& skaleHost = fixture.skaleHost; + auto& stub = fixture.stub; + auto senderAddress = coinbase.address(); auto receiver = KeyPair::create(); @@ -1139,7 +1225,7 @@ BOOST_AUTO_TEST_CASE( transactionRace json["gasPrice"] = jsToDecimal( toJS( gasPrice ) ); json["nonce"] = 0; - Transaction tx = tx_from_json( json ); + Transaction tx = fixture.tx_from_json( json ); RLPStream stream; tx.streamRLP( stream ); @@ -1171,7 +1257,7 @@ BOOST_AUTO_TEST_CASE( transactionRace // 3 send new tx and see nonce json["nonce"] = 1; - Transaction tx2 = tx_from_json( json ); + Transaction tx2 = fixture.tx_from_json( json ); client->importTransaction( tx2 ); } @@ -1180,6 +1266,14 @@ BOOST_AUTO_TEST_CASE( transactionRace BOOST_AUTO_TEST_CASE( partialCatchUp // , *boost::unit_test::precondition( dev::test::run_not_express ) ) { + + SkaleHostFixture fixture; + auto& client = fixture.client; + auto& coinbase = fixture.coinbase; + auto& accountHolder = fixture.accountHolder; + auto& skaleHost = fixture.skaleHost; + auto& stub = fixture.stub; + auto senderAddress = coinbase.address(); auto receiver = KeyPair::create(); @@ -1229,6 +1323,14 @@ BOOST_AUTO_TEST_CASE( partialCatchUp } BOOST_AUTO_TEST_CASE( getBlockRandom ) { + + SkaleHostFixture fixture; + auto& client = fixture.client; + auto& coinbase = fixture.coinbase; + auto& accountHolder = fixture.accountHolder; + auto& skaleHost = fixture.skaleHost; + auto& stub = fixture.stub; + PrecompiledExecutor exec = PrecompiledRegistrar::executor( "getBlockRandom" ); auto res = exec( bytesConstRef() ); u256 blockRandom = skaleHost->getBlockRandom(); @@ -1237,6 +1339,14 @@ BOOST_AUTO_TEST_CASE( getBlockRandom ) { } BOOST_AUTO_TEST_CASE( getIMABLSPUblicKey ) { + + SkaleHostFixture fixture; + auto& client = fixture.client; + auto& coinbase = fixture.coinbase; + auto& accountHolder = fixture.accountHolder; + auto& skaleHost = fixture.skaleHost; + auto& stub = fixture.stub; + PrecompiledExecutor exec = PrecompiledRegistrar::executor( "getIMABLSPublicKey" ); auto res = exec( bytesConstRef() ); std::array< std::string, 4 > imaBLSPublicKey = skaleHost->getIMABLSPublicKey(); From 451fc2e98f788e909683205a1194b88ecfbef71c Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Wed, 21 Feb 2024 19:34:06 +0000 Subject: [PATCH 017/154] SKALED-1583 Fix tests --- test/unittests/libethereum/ClientTest.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/unittests/libethereum/ClientTest.cpp b/test/unittests/libethereum/ClientTest.cpp index 81781fa7c..a3f8850e0 100644 --- a/test/unittests/libethereum/ClientTest.cpp +++ b/test/unittests/libethereum/ClientTest.cpp @@ -390,7 +390,8 @@ static std::string const c_genesisInfoSkaleTest = std::string() + "minimumDifficulty": "0x020000", "difficultyBoundDivisor": "0x0800", "durationLimit": "0x0d", - "blockReward": "0x4563918244F40000" + "blockReward": "0x4563918244F40000", + "skaleDisableChainIdCheck": true }, "genesis": { "nonce": "0x0000000000000042", From 2166effd9c90da248afefee7d67e0979d0197bf8 Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Thu, 22 Feb 2024 18:51:11 +0000 Subject: [PATCH 018/154] SKALED-1583 Remove unneeded parameter --- libethcore/ChainOperationParams.cpp | 2 +- libethereum/SchainPatch.h | 12 +++++------- libskale/State.cpp | 3 +-- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/libethcore/ChainOperationParams.cpp b/libethcore/ChainOperationParams.cpp index 7c1f3f449..e1deacd22 100644 --- a/libethcore/ChainOperationParams.cpp +++ b/libethcore/ChainOperationParams.cpp @@ -78,7 +78,7 @@ EVMSchedule const ChainOperationParams::evmSchedule( result = HomesteadSchedule; // 2 based on previous - decide by timestamp - if ( PushZeroPatch::isEnabledWhen( *this, _lastBlockTimestamp ) ) + if ( PushZeroPatch::isEnabledWhen( _lastBlockTimestamp ) ) result = PushZeroPatch::makeSchedule( result ); return result; diff --git a/libethereum/SchainPatch.h b/libethereum/SchainPatch.h index f1f9eb72a..1481825fc 100644 --- a/libethereum/SchainPatch.h +++ b/libethereum/SchainPatch.h @@ -50,12 +50,11 @@ class SchainPatch { static std::string getName() { return #BlaBlaPatch; } \ static bool isEnabled( \ const dev::eth::BlockChain& _bc, dev::eth::BlockNumber _bn = dev::eth::LatestBlock ) { \ - time_t timestamp = _bc.chainParams().getPatchTimestamp( getName() ); \ + time_t timestamp = chainParams.getPatchTimestamp( getName() ); \ return _bc.isPatchTimestampActiveInBlockNumber( timestamp, _bn ); \ } \ - static bool isEnabledWhen( \ - const dev::eth::ChainOperationParams& _cp, time_t _lastBlockTimestamp ) { \ - time_t activationTimestamp = _cp.getPatchTimestamp( getName() ); \ + static bool isEnabledWhen( time_t _lastBlockTimestamp ) { \ + time_t activationTimestamp = chainParams.getPatchTimestamp( getName() ); \ return activationTimestamp != 0 && _lastBlockTimestamp >= activationTimestamp; \ } \ }; @@ -69,9 +68,8 @@ class SchainPatch { time_t timestamp = _bc.chainParams().getPatchTimestamp( getName() ); \ return _bc.isPatchTimestampActiveInBlockNumber( timestamp, _bn ); \ } \ - static bool isEnabledWhen( \ - const dev::eth::ChainOperationParams& _cp, time_t _lastBlockTimestamp ) { \ - time_t my_timestamp = _cp.getPatchTimestamp( getName() ); \ + static bool isEnabledWhen( time_t _lastBlockTimestamp ) { \ + time_t my_timestamp = chainParams.getPatchTimestamp( getName() ); \ return _lastBlockTimestamp >= my_timestamp; \ } \ static dev::eth::EVMSchedule makeSchedule( const dev::eth::EVMSchedule& base ); \ diff --git a/libskale/State.cpp b/libskale/State.cpp index 2501d9c74..2723ff46b 100644 --- a/libskale/State.cpp +++ b/libskale/State.cpp @@ -1018,8 +1018,7 @@ std::pair< ExecutionResult, TransactionReceipt > State::execute( EnvInfo const& ExecutionResult res; e.setResultRecipient( res ); - bool isCacheEnabled = - RevertableFSPatch::isEnabledWhen( _chainParams, _envInfo.latestBlockTimestamp() ); + bool isCacheEnabled = RevertableFSPatch::isEnabledWhen( _envInfo.latestBlockTimestamp() ); resetOverlayFS( isCacheEnabled ); auto onOp = _onOp; From 0f48b2b8c9c3b1f90e0616bf7d859f18cbaf1c1a Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Thu, 22 Feb 2024 20:03:22 +0000 Subject: [PATCH 019/154] SKALED-1583 Remove unused class member --- libethereum/Executive.h | 1 - libhistoric/AlethExecutive.cpp | 6 +++--- libhistoric/AlethExecutive.h | 1 - 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/libethereum/Executive.h b/libethereum/Executive.h index 751051357..2beda1722 100644 --- a/libethereum/Executive.h +++ b/libethereum/Executive.h @@ -237,7 +237,6 @@ class Executive { u256 m_gasCost; ChainOperationParams const& m_chainParams; - time_t m_latestBlockTimestamp; u256 m_systemGasPrice; bool m_isCreation = false; diff --git a/libhistoric/AlethExecutive.cpp b/libhistoric/AlethExecutive.cpp index 219f52cbb..b13f63bab 100644 --- a/libhistoric/AlethExecutive.cpp +++ b/libhistoric/AlethExecutive.cpp @@ -77,10 +77,10 @@ void AlethExecutive::accrueSubState( SubState& _parentContext ) { void AlethExecutive::initialize( Transaction const& _transaction ) { m_t = _transaction; m_baseGasRequired = m_t.baseGasRequired( - m_chainParams.evmSchedule( m_latestBlockTimestamp, m_envInfo.number() ) ); + m_chainParams.evmSchedule( m_envInfo.latestBlockTimestamp(), m_envInfo.number() ) ); try { Ethash::verifyTransaction( m_chainParams, ImportRequirements::Everything, m_t, - m_latestBlockTimestamp, m_envInfo.header(), m_envInfo.gasUsed() ); + m_envInfo.latestBlockTimestamp(), m_envInfo.header(), m_envInfo.gasUsed() ); } catch ( Exception const& ex ) { m_excepted = toTransactionException( ex ); throw; @@ -213,7 +213,7 @@ bool AlethExecutive::create( Address const& _txSender, u256 const& _endowment, u256 const& _gasPrice, u256 const& _gas, bytesConstRef _init, Address const& _origin ) { // Contract will be created with the version corresponding to latest hard fork auto const latestVersion = - m_chainParams.evmSchedule( m_latestBlockTimestamp, m_envInfo.number() ).accountVersion; + m_chainParams.evmSchedule( m_envInfo.latestBlockTimestamp(), m_envInfo.number() ).accountVersion; return createWithAddressFromNonceAndSender( _txSender, _endowment, _gasPrice, _gas, _init, _origin, latestVersion ); } diff --git a/libhistoric/AlethExecutive.h b/libhistoric/AlethExecutive.h index 892585975..eb61ea2d1 100644 --- a/libhistoric/AlethExecutive.h +++ b/libhistoric/AlethExecutive.h @@ -168,7 +168,6 @@ class AlethExecutive { u256 m_gasCost; ChainOperationParams const& m_chainParams; - time_t m_latestBlockTimestamp; bool m_isCreation = false; Address m_newAddress; From ad8350bcd26e0889121c16cb0e988ccd1d2e20fc Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Sat, 24 Feb 2024 00:22:33 +0000 Subject: [PATCH 020/154] SKALED-1583 Universal config of schain patches --- libethcore/ChainOperationParams.cpp | 12 +---- libethcore/ChainOperationParams.h | 32 +++++++++---- libethereum/ChainParams.cpp | 56 +++++------------------ libethereum/Client.cpp | 28 +++++++----- libethereum/SchainPatch.cpp | 8 ++++ libhistoric/AlethExecutive.cpp | 3 +- test/unittests/libethereum/SkaleHost.cpp | 2 +- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 4 +- 8 files changed, 63 insertions(+), 82 deletions(-) diff --git a/libethcore/ChainOperationParams.cpp b/libethcore/ChainOperationParams.cpp index e1deacd22..456f1743b 100644 --- a/libethcore/ChainOperationParams.cpp +++ b/libethcore/ChainOperationParams.cpp @@ -101,16 +101,6 @@ void ChainOperationParams::setBlockReward( u256 const& _newBlockReward ) { m_blockReward = _newBlockReward; } -// this will be changed to just extract all **PatchTimestamp params by wildcard, -// thus eliminating if..if time_t ChainOperationParams::getPatchTimestamp( const std::string& _name ) const { - if ( _name == "PushZeroPatch" ) - return sChain.pushZeroPatchTimestamp; - if ( _name == "RevertableFSPatch" ) - return sChain.revertableFSPatchTimestamp; - if ( _name == "ContractStorageZeroValuePatch" ) - return sChain.contractStorageZeroValuePatchTimestamp; - if ( _name == "SkipInvalidTransactionsPatch" ) - return sChain.skipInvalidTransactionsPatchTimestamp; - assert( false ); + return sChain.getPatchTimestamp( _name ); } diff --git a/libethcore/ChainOperationParams.h b/libethcore/ChainOperationParams.h index e048d3a72..e5ba975ea 100644 --- a/libethcore/ChainOperationParams.h +++ b/libethcore/ChainOperationParams.h @@ -169,16 +169,28 @@ struct SChain { bool multiTransactionMode = false; int emptyBlockIntervalMs = -1; size_t t = 1; - time_t revertableFSPatchTimestamp = 0; - time_t contractStoragePatchTimestamp = 0; - time_t contractStorageZeroValuePatchTimestamp = 0; - time_t verifyDaSigsPatchTimestamp = 0; - time_t storageDestructionPatchTimestamp = 0; - time_t powCheckPatchTimestamp = 0; - time_t precompiledConfigPatchTimestamp = 0; - time_t pushZeroPatchTimestamp = 0; - time_t skipInvalidTransactionsPatchTimestamp = 0; - time_t correctForkInPowPatchTimestamp = 0; + + // key is patch name + // public - for tests, don't access it directly + std::map< std::string, time_t > _patchTimestamps; + time_t getPatchTimestamp( const std::string& name ) const { + try { + return _patchTimestamps.at( name ); + } catch ( const std::out_of_range& ) { + return 0; + } // catch + } + + // time_t revertableFSPatchTimestamp = 0; + // time_t contractStoragePatchTimestamp = 0; + // time_t contractStorageZeroValuePatchTimestamp = 0; + // time_t verifyDaSigsPatchTimestamp = 0; + // time_t storageDestructionPatchTimestamp = 0; + // time_t powCheckPatchTimestamp = 0; + // time_t precompiledConfigPatchTimestamp = 0; + // time_t pushZeroPatchTimestamp = 0; + // time_t skipInvalidTransactionsPatchTimestamp = 0; + // time_t correctForkInPowPatchTimestamp = 0; SChain() { name = "TestChain"; diff --git a/libethereum/ChainParams.cpp b/libethereum/ChainParams.cpp index 52d3fade1..18ac227d6 100644 --- a/libethereum/ChainParams.cpp +++ b/libethereum/ChainParams.cpp @@ -27,6 +27,7 @@ #include #include +#include #include #include @@ -239,51 +240,16 @@ ChainParams ChainParams::loadConfig( if ( sChainObj.count( "multiTransactionMode" ) ) s.multiTransactionMode = sChainObj.at( "multiTransactionMode" ).get_bool(); - if ( sChainObj.count( "revertableFSPatchTimestamp" ) ) - s.revertableFSPatchTimestamp = sChainObj.at( "revertableFSPatchTimestamp" ).get_int64(); - - s.contractStoragePatchTimestamp = - sChainObj.count( "contractStoragePatchTimestamp" ) ? - sChainObj.at( "contractStoragePatchTimestamp" ).get_int64() : - 0; - - s.contractStorageZeroValuePatchTimestamp = - sChainObj.count( "contractStorageZeroValuePatchTimestamp" ) ? - sChainObj.at( "contractStorageZeroValuePatchTimestamp" ).get_int64() : - 0; - - s.verifyDaSigsPatchTimestamp = - sChainObj.count( "verifyDaSigsPatchTimestamp" ) ? - sChainObj.at( "verifyDaSigsPatchTimestamp" ).get_int64() : - 0; - - s.storageDestructionPatchTimestamp = - sChainObj.count( "storageDestructionPatchTimestamp" ) ? - sChainObj.at( "storageDestructionPatchTimestamp" ).get_int64() : - 0; - - s.powCheckPatchTimestamp = sChainObj.count( "powCheckPatchTimestamp" ) ? - sChainObj.at( "powCheckPatchTimestamp" ).get_int64() : - 0; - - s.precompiledConfigPatchTimestamp = - sChainObj.count( "precompiledConfigPatchTimestamp" ) ? - sChainObj.at( "precompiledConfigPatchTimestamp" ).get_int64() : - 0; - - s.pushZeroPatchTimestamp = sChainObj.count( "pushZeroPatchTimestamp" ) ? - sChainObj.at( "pushZeroPatchTimestamp" ).get_int64() : - 0; - - s.skipInvalidTransactionsPatchTimestamp = - sChainObj.count( "skipInvalidTransactionsPatchTimestamp" ) ? - sChainObj.at( "skipInvalidTransactionsPatchTimestamp" ).get_int64() : - 0; - - s.correctForkInPowPatchTimestamp = - sChainObj.count( "correctForkInPowPatchTimestamp" ) ? - sChainObj.at( "correctForkInPowPatchTimestamp" ).get_int64() : - 0; + // extract all "*PatchTimestamp" records + for ( const auto& it : sChainObj ) { + const string suffix = "PatchTimestamp"; + const string& key = it.first; + if ( key.find( suffix ) == key.size() - suffix.size() ) { + string patchName = key.substr( 0, key.size() - string( "Timestamp" ).size() ); + patchName[0] = toupper( patchName[0] ); + s._patchTimestamps[patchName] = it.second.get_int64(); + } // if + } // for if ( sChainObj.count( "nodeGroups" ) ) { std::vector< NodeGroup > nodeGroups; diff --git a/libethereum/Client.cpp b/libethereum/Client.cpp index e36950c63..1f308b5f6 100644 --- a/libethereum/Client.cpp +++ b/libethereum/Client.cpp @@ -159,18 +159,17 @@ Client::Client( ChainParams const& _params, int _networkID, // Set timestamps for patches TotalStorageUsedPatch::g_client = this; - ContractStorageLimitPatch::setTimestamp( chainParams().sChain.contractStoragePatchTimestamp ); - // ContractStorageZeroValuePatch::setTimestamp( - // chainParams().sChain.contractStorageZeroValuePatchTimestamp ); - VerifyDaSigsPatch::setTimestamp( chainParams().sChain.verifyDaSigsPatchTimestamp ); - // RevertableFSPatch::setTimestamp( chainParams().sChain.revertableFSPatchTimestamp ); - StorageDestructionPatch::setTimestamp( chainParams().sChain.storageDestructionPatchTimestamp ); - POWCheckPatch::setTimestamp( chainParams().sChain.powCheckPatchTimestamp ); - // PushZeroPatch::setTimestamp( chainParams().sChain.pushZeroPatchTimestamp ); - // SkipInvalidTransactionsPatch::setTimestamp( - // this->chainParams().sChain.skipInvalidTransactionsPatchTimestamp ); - PrecompiledConfigPatch::setTimestamp( chainParams().sChain.precompiledConfigPatchTimestamp ); - CorrectForkInPowPatch::setTimestamp( chainParams().sChain.correctForkInPowPatchTimestamp ); + ContractStorageLimitPatch::setTimestamp( + chainParams().sChain.getPatchTimestamp( "ContractStoragePatch" ) ); + VerifyDaSigsPatch::setTimestamp( + chainParams().sChain.getPatchTimestamp( "VerifyDaSigsPatch" ) ); + StorageDestructionPatch::setTimestamp( + chainParams().sChain.getPatchTimestamp( "StorageDestructionPatch" ) ); + POWCheckPatch::setTimestamp( chainParams().sChain.getPatchTimestamp( "PowCheckPatch" ) ); + PrecompiledConfigPatch::setTimestamp( + chainParams().sChain.getPatchTimestamp( "PrecompiledConfigPatch" ) ); + CorrectForkInPowPatch::setTimestamp( + chainParams().sChain.getPatchTimestamp( "CorrectForkInPowPatch" ) ); } @@ -330,6 +329,9 @@ void Client::init( WithExisting _forceAction, u256 _networkId ) { m_snapshotAgentInited = true; } + SchainPatch::init( chainParams() ); + SchainPatch::useLatestBlockTimestamp( blockChain().info().timestamp() ); + // HACK Needed to set env var for consensus AmsterdamFixPatch::isEnabled( *this ); @@ -606,6 +608,8 @@ size_t Client::importTransactionsAsBlock( sealUnconditionally( false ); importWorkingBlock(); + SchainPatch::useLatestBlockTimestamp( blockChain().info().timestamp() ); + // this needs to be updated as soon as possible, as it's used in new transactions validation CorrectForkInPowPatch::lastBlockTimestamp = blockChain().info().timestamp(); CorrectForkInPowPatch::lastBlockNumber = blockChain().number(); diff --git a/libethereum/SchainPatch.cpp b/libethereum/SchainPatch.cpp index 47d5f31e5..79e14e52a 100644 --- a/libethereum/SchainPatch.cpp +++ b/libethereum/SchainPatch.cpp @@ -2,3 +2,11 @@ dev::eth::ChainOperationParams SchainPatch::chainParams; time_t SchainPatch::latestBlockTimestamp; + +void SchainPatch::init( const dev::eth::ChainOperationParams& _cp ) { + chainParams = _cp; +} + +void SchainPatch::useLatestBlockTimestamp( time_t _timestamp ) { + latestBlockTimestamp = _timestamp; +} diff --git a/libhistoric/AlethExecutive.cpp b/libhistoric/AlethExecutive.cpp index b13f63bab..dfecad107 100644 --- a/libhistoric/AlethExecutive.cpp +++ b/libhistoric/AlethExecutive.cpp @@ -213,7 +213,8 @@ bool AlethExecutive::create( Address const& _txSender, u256 const& _endowment, u256 const& _gasPrice, u256 const& _gas, bytesConstRef _init, Address const& _origin ) { // Contract will be created with the version corresponding to latest hard fork auto const latestVersion = - m_chainParams.evmSchedule( m_envInfo.latestBlockTimestamp(), m_envInfo.number() ).accountVersion; + m_chainParams.evmSchedule( m_envInfo.latestBlockTimestamp(), m_envInfo.number() ) + .accountVersion; return createWithAddressFromNonceAndSender( _txSender, _endowment, _gasPrice, _gas, _init, _origin, latestVersion ); } diff --git a/test/unittests/libethereum/SkaleHost.cpp b/test/unittests/libethereum/SkaleHost.cpp index 2550042dd..b32bf8afb 100644 --- a/test/unittests/libethereum/SkaleHost.cpp +++ b/test/unittests/libethereum/SkaleHost.cpp @@ -138,7 +138,7 @@ struct SkaleHostFixture : public TestOutputHelperFixture { if( params.count("multiTransactionMode") && stoi( params.at( "multiTransactionMode" ) ) ) chainParams.sChain.multiTransactionMode = true; if( params.count("skipInvalidTransactionsPatchTimestamp") && stoi( params.at( "skipInvalidTransactionsPatchTimestamp" ) ) ) - chainParams.sChain.skipInvalidTransactionsPatchTimestamp = 1; + chainParams.sChain._patchTimestamps["SkipInvalidTransactionsPatch"] = 1; accountHolder.reset( new FixedAccountHolder( [&]() { return client.get(); }, {} ) ); accountHolder->setAccounts( {coinbase, account2} ); diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index b74b03eaf..0c0ec7e34 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -288,9 +288,9 @@ struct JsonRpcFixture : public TestOutputHelperFixture { chainParams.sChain.contractStorageLimit = 128; // 615 + 1430 is experimentally-derived block size + average extras size chainParams.sChain.dbStorageLimit = 320.5*( 615 + 1430 ); - chainParams.sChain.contractStoragePatchTimestamp = 1; + chainParams.sChain._patchTimestamps["ContractStoragePatch"] = 1; powPatchActivationTimestamp = time(nullptr) + 60; - chainParams.sChain.correctForkInPowPatchTimestamp = powPatchActivationTimestamp; // 10 guessed seconds + chainParams.sChain._patchTimestamps["correctForkInPowPatch"] = powPatchActivationTimestamp; // 10 guessed seconds chainParams.sChain.emptyBlockIntervalMs = _emptyBlockIntervalMs; // add random extra data to randomize genesis hash and get random DB path, // so that tests can be run in parallel From ff0e82af5146ebb4da3970c6c1f14386c3894d1e Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Mon, 26 Feb 2024 13:16:01 +0000 Subject: [PATCH 021/154] SKALED-1583 Fix build --- libethereum/Client.h | 4 ++++ libethereum/ClientBase.h | 8 ++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/libethereum/Client.h b/libethereum/Client.h index d62af01b1..c446b245f 100644 --- a/libethereum/Client.h +++ b/libethereum/Client.h @@ -124,6 +124,10 @@ class Client : public ClientBase, protected Worker { /// Blocks until all pending transactions have been processed. void flushTransactions() override; + using ClientBase::blockDetails; + using ClientBase::blockInfo; // for another overload + using ClientBase::uncleHashes; + /// Retrieve pending transactions Transactions pending() const override; diff --git a/libethereum/ClientBase.h b/libethereum/ClientBase.h index bd3ca21dd..855fcf087 100644 --- a/libethereum/ClientBase.h +++ b/libethereum/ClientBase.h @@ -117,6 +117,12 @@ class ClientBase : public Interface { LocalisedLogEntries peekWatch( unsigned _watchId ) const override; LocalisedLogEntries checkWatch( unsigned _watchId ) override; + using Interface::blockDetails; + using Interface::blockInfo; // for another overload + using Interface::transactionHashes; + using Interface::uncle; + using Interface::uncleHashes; + h256 hashFromNumber( BlockNumber _number ) const override; BlockNumber numberFromHash( h256 _blockHash ) const override; int compareBlockHashes( h256 _h1, h256 _h2 ) const override; @@ -136,9 +142,7 @@ class ClientBase : public Interface { return postSeal().pending(); return transactions( hashFromNumber( _block ) ); } - using Interface::transactionHashes; TransactionHashes transactionHashes( h256 _blockHash ) const override; - using Interface::uncle; BlockHeader uncle( h256 _blockHash, unsigned _i ) const override; UncleHashes uncleHashes( h256 _blockHash ) const override; unsigned transactionCount( h256 _blockHash ) const override; From 413850c4f087c2539af2b17a8eed5b73b1d0d6bd Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Mon, 26 Feb 2024 15:32:54 +0000 Subject: [PATCH 022/154] SKALED-1583 Rename latestBlockTimestamp to committedBlockTimestamp --- libethashseal/Ethash.cpp | 4 ++-- libethashseal/Ethash.h | 2 +- libethcore/ChainOperationParams.cpp | 8 ++++---- libethcore/ChainOperationParams.h | 5 +++-- libethcore/SealEngine.cpp | 13 ++++++------ libethcore/SealEngine.h | 10 ++++----- libethereum/Client.cpp | 5 ++--- libethereum/Executive.cpp | 10 ++++----- libethereum/Executive.h | 2 +- libethereum/ExtVM.h | 2 +- libethereum/SchainPatch.cpp | 4 ++-- libethereum/SchainPatch.h | 26 ++++++++++++------------ libethereum/Transaction.cpp | 4 ++-- libethereum/Transaction.h | 4 ++-- libevm/ExtVMFace.h | 12 +++++------ libhistoric/AlethExecutive.cpp | 6 +++--- libhistoric/AlethExtVM.h | 10 ++++----- libskale/State.cpp | 2 +- test/tools/jsontests/BlockChainTests.cpp | 4 ++-- test/tools/jsontests/BlockChainTests.h | 2 +- test/tools/jsontests/vm.cpp | 4 ++-- test/tools/jsontests/vm.h | 2 +- 22 files changed, 71 insertions(+), 70 deletions(-) diff --git a/libethashseal/Ethash.cpp b/libethashseal/Ethash.cpp index 4d283c093..cea57256f 100644 --- a/libethashseal/Ethash.cpp +++ b/libethashseal/Ethash.cpp @@ -131,10 +131,10 @@ void Ethash::verify( Strictness _s, BlockHeader const& _bi, BlockHeader const& _ } void Ethash::verifyTransaction( ChainOperationParams const& _chainParams, - ImportRequirements::value _ir, TransactionBase const& _t, time_t _latestBlockTimestamp, + ImportRequirements::value _ir, TransactionBase const& _t, time_t _committedBlockTimestamp, BlockHeader const& _header, u256 const& _startGasUsed ) { SealEngineFace::verifyTransaction( - _chainParams, _ir, _t, _latestBlockTimestamp, _header, _startGasUsed ); + _chainParams, _ir, _t, _committedBlockTimestamp, _header, _startGasUsed ); } u256 Ethash::childGasLimit( BlockHeader const& _bi, u256 const& _gasFloorTarget ) const { diff --git a/libethashseal/Ethash.h b/libethashseal/Ethash.h index 41d5a8798..63e39fed1 100644 --- a/libethashseal/Ethash.h +++ b/libethashseal/Ethash.h @@ -53,7 +53,7 @@ class Ethash : public SealEngineBase { void verify( Strictness _s, BlockHeader const& _bi, BlockHeader const& _parent, bytesConstRef _block ) const override; static void verifyTransaction( ChainOperationParams const& _chainParams, - ImportRequirements::value _ir, TransactionBase const& _t, time_t _latestBlockTimestamp, + ImportRequirements::value _ir, TransactionBase const& _t, time_t _committedBlockTimestamp, BlockHeader const& _header, u256 const& _startGasUsed ); void populateFromParent( BlockHeader& _bi, BlockHeader const& _parent ) const override; diff --git a/libethcore/ChainOperationParams.cpp b/libethcore/ChainOperationParams.cpp index 456f1743b..cc4f630b3 100644 --- a/libethcore/ChainOperationParams.cpp +++ b/libethcore/ChainOperationParams.cpp @@ -56,7 +56,7 @@ ChainOperationParams::ChainOperationParams() durationLimit( 0x0d ) {} EVMSchedule const ChainOperationParams::evmSchedule( - time_t _lastBlockTimestamp, u256 const& _blockNumber ) const { + time_t _committedBlockTimestamp, u256 const& _blockNumber ) const { EVMSchedule result; // 1 decide by block number @@ -78,7 +78,7 @@ EVMSchedule const ChainOperationParams::evmSchedule( result = HomesteadSchedule; // 2 based on previous - decide by timestamp - if ( PushZeroPatch::isEnabledWhen( _lastBlockTimestamp ) ) + if ( PushZeroPatch::isEnabledWhen( _committedBlockTimestamp ) ) result = PushZeroPatch::makeSchedule( result ); return result; @@ -92,8 +92,8 @@ u256 ChainOperationParams::blockReward( EVMSchedule const& _schedule ) const { } u256 ChainOperationParams::blockReward( - time_t _latestBlockTimestamp, u256 const& _blockNumber ) const { - EVMSchedule const& schedule{ evmSchedule( _latestBlockTimestamp, _blockNumber ) }; + time_t _committedBlockTimestamp, u256 const& _blockNumber ) const { + EVMSchedule const& schedule{ evmSchedule( _committedBlockTimestamp, _blockNumber ) }; return blockReward( schedule ); } diff --git a/libethcore/ChainOperationParams.h b/libethcore/ChainOperationParams.h index e5ba975ea..930acb8de 100644 --- a/libethcore/ChainOperationParams.h +++ b/libethcore/ChainOperationParams.h @@ -218,9 +218,10 @@ struct ChainOperationParams { u256 m_blockReward; public: - EVMSchedule const evmSchedule( time_t _lastBlockTimestamp, u256 const& _blockNumber ) const; + EVMSchedule const evmSchedule( + time_t _committedBlockTimestamp, u256 const& _blockNumber ) const; u256 blockReward( EVMSchedule const& _schedule ) const; - u256 blockReward( time_t _latestBlockTimestamp, u256 const& _blockNumber ) const; + u256 blockReward( time_t _committedBlockTimestamp, u256 const& _blockNumber ) const; void setBlockReward( u256 const& _newBlockReward ); u256 maximumExtraDataSize = 1024; u256 accountStartNonce = 0; diff --git a/libethcore/SealEngine.cpp b/libethcore/SealEngine.cpp index 425b807fe..17b76c94d 100644 --- a/libethcore/SealEngine.cpp +++ b/libethcore/SealEngine.cpp @@ -95,7 +95,7 @@ void SealEngineFace::populateFromParent( BlockHeader& _bi, BlockHeader const& _p } void SealEngineFace::verifyTransaction( ChainOperationParams const& _chainParams, - ImportRequirements::value _ir, TransactionBase const& _t, time_t _latestBlockTimestamp, + ImportRequirements::value _ir, TransactionBase const& _t, time_t _committedBlockTimestamp, BlockHeader const& _header, u256 const& _gasUsed ) { // verifyTransaction is the only place where TransactionBase is used instead of Transaction. u256 gas; @@ -129,7 +129,7 @@ void SealEngineFace::verifyTransaction( ChainOperationParams const& _chainParams _t.checkLowS(); eth::EVMSchedule const& schedule = - _chainParams.evmSchedule( _latestBlockTimestamp, _header.number() ); + _chainParams.evmSchedule( _committedBlockTimestamp, _header.number() ); // Pre calculate the gas needed for execution if ( ( _ir & ImportRequirements::TransactionBasic ) && _t.baseGasRequired( schedule ) > gas ) @@ -161,11 +161,12 @@ SealEngineFace* SealEngineRegistrar::create( ChainOperationParams const& _params } EVMSchedule SealEngineBase::evmSchedule( - time_t _latestBlockTimestamp, u256 const& _blockNumber ) const { - return chainParams().evmSchedule( _latestBlockTimestamp, _blockNumber ); + time_t _committedBlockTimestamp, u256 const& _blockNumber ) const { + return chainParams().evmSchedule( _committedBlockTimestamp, _blockNumber ); } -u256 SealEngineBase::blockReward( time_t _latestBlockTimestamp, u256 const& _blockNumber ) const { - EVMSchedule const& schedule{ evmSchedule( _latestBlockTimestamp, _blockNumber ) }; +u256 SealEngineBase::blockReward( + time_t _committedBlockTimestamp, u256 const& _blockNumber ) const { + EVMSchedule const& schedule{ evmSchedule( _committedBlockTimestamp, _blockNumber ) }; return chainParams().blockReward( schedule ); } diff --git a/libethcore/SealEngine.h b/libethcore/SealEngine.h index 6eb883ce8..63dddf393 100644 --- a/libethcore/SealEngine.h +++ b/libethcore/SealEngine.h @@ -58,7 +58,7 @@ class SealEngineFace { BlockHeader const& _parent = BlockHeader(), bytesConstRef _block = bytesConstRef() ) const; /// Additional verification for transactions in blocks. static void verifyTransaction( ChainOperationParams const& _chainParams, - ImportRequirements::value _ir, TransactionBase const& _t, time_t _latestBlockTimestamp, + ImportRequirements::value _ir, TransactionBase const& _t, time_t _committedBlockTimestamp, BlockHeader const& _header, u256 const& _gasUsed ); /// Don't forget to call Super::populateFromParent when subclassing & overriding. virtual void populateFromParent( BlockHeader& _bi, BlockHeader const& _parent ) const; @@ -95,8 +95,8 @@ class SealEngineFace { return this; } virtual EVMSchedule evmSchedule( - time_t _latestBlockTimestamp, u256 const& _blockNumber ) const = 0; - virtual u256 blockReward( time_t _latestBlockTimestamp, u256 const& _blockNumber ) const = 0; + time_t _committedBlockTimestamp, u256 const& _blockNumber ) const = 0; + virtual u256 blockReward( time_t _committedBlockTimestamp, u256 const& _blockNumber ) const = 0; virtual bool isPrecompiled( Address const& _a, u256 const& _blockNumber ) const { return m_params.precompiled.count( _a ) != 0 && @@ -138,8 +138,8 @@ class SealEngineBase : public SealEngineFace { m_onSealGenerated = _f; } EVMSchedule evmSchedule( - time_t _latestBlockTimestamp, u256 const& _blockNumber ) const override; - u256 blockReward( time_t _latestBlockTimestamp, u256 const& _blockNumber ) const override; + time_t _committedBlockTimestamp, u256 const& _blockNumber ) const override; + u256 blockReward( time_t _committedBlockTimestamp, u256 const& _blockNumber ) const override; protected: std::function< void( bytes const& s ) > m_onSealGenerated; diff --git a/libethereum/Client.cpp b/libethereum/Client.cpp index 1f308b5f6..582dd39d2 100644 --- a/libethereum/Client.cpp +++ b/libethereum/Client.cpp @@ -336,7 +336,7 @@ void Client::init( WithExisting _forceAction, u256 _networkId ) { AmsterdamFixPatch::isEnabled( *this ); // needed for checkOutExternalGas - CorrectForkInPowPatch::lastBlockTimestamp = blockChain().info().timestamp(); + CorrectForkInPowPatch::committedBlockTimestamp = blockChain().info().timestamp(); CorrectForkInPowPatch::lastBlockNumber = blockChain().number(); initCPUUSage(); @@ -611,7 +611,7 @@ size_t Client::importTransactionsAsBlock( SchainPatch::useLatestBlockTimestamp( blockChain().info().timestamp() ); // this needs to be updated as soon as possible, as it's used in new transactions validation - CorrectForkInPowPatch::lastBlockTimestamp = blockChain().info().timestamp(); + CorrectForkInPowPatch::committedBlockTimestamp = blockChain().info().timestamp(); CorrectForkInPowPatch::lastBlockNumber = blockChain().number(); if ( !UnsafeRegion::isActive() ) { @@ -683,7 +683,6 @@ size_t Client::syncTransactions( // SkipInvalidTransactionsPatch::lastBlockTimestamp = blockChain().info().timestamp(); PrecompiledConfigPatch::lastBlockTimestamp = blockChain().info().timestamp(); CorrectForkInPowPatch::lastBlockTimestamp = blockChain().info().timestamp(); - CorrectForkInPowPatch::lastBlockNumber = blockChain().number(); DEV_WRITE_GUARDED( x_working ) { diff --git a/libethereum/Executive.cpp b/libethereum/Executive.cpp index 44a60be2b..22804c65c 100644 --- a/libethereum/Executive.cpp +++ b/libethereum/Executive.cpp @@ -191,7 +191,7 @@ void Executive::accrueSubState( SubState& _parentContext ) { _parentContext += m_ext->sub; } -void Executive::verifyTransaction( Transaction const& _transaction, time_t _latestBlockTimestamp, +void Executive::verifyTransaction( Transaction const& _transaction, time_t _committedBlockTimestamp, BlockHeader const& _blockHeader, const State& _state, const eth::ChainOperationParams& _chainParams, u256 const& _gasUsed, const u256& _gasPrice, const bool _allowFuture ) { @@ -204,7 +204,7 @@ void Executive::verifyTransaction( Transaction const& _transaction, time_t _late } Ethash::verifyTransaction( _chainParams, ImportRequirements::Everything, _transaction, - _latestBlockTimestamp, _blockHeader, _gasUsed ); + _committedBlockTimestamp, _blockHeader, _gasUsed ); if ( !_transaction.hasZeroSignature() ) { // skip nonce check for calls @@ -249,11 +249,11 @@ void Executive::initialize( Transaction const& _transaction ) { MICROPROFILE_SCOPEI( "Executive", "initialize", MP_GAINSBORO ); m_t = _transaction; m_baseGasRequired = m_t.baseGasRequired( - m_chainParams.evmSchedule( m_envInfo.latestBlockTimestamp(), m_envInfo.number() ) ); + m_chainParams.evmSchedule( m_envInfo.committedBlockTimestamp(), m_envInfo.number() ) ); try { - verifyTransaction( _transaction, m_envInfo.latestBlockTimestamp(), m_envInfo.header(), m_s, - m_chainParams, m_envInfo.gasUsed(), m_systemGasPrice ); + verifyTransaction( _transaction, m_envInfo.committedBlockTimestamp(), m_envInfo.header(), + m_s, m_chainParams, m_envInfo.gasUsed(), m_systemGasPrice ); } catch ( Exception const& ex ) { m_excepted = toTransactionException( ex ); throw; diff --git a/libethereum/Executive.h b/libethereum/Executive.h index 2beda1722..cf1b2715c 100644 --- a/libethereum/Executive.h +++ b/libethereum/Executive.h @@ -202,7 +202,7 @@ class Executive { /// Revert all changes made to the state by this execution. void revert(); - static void verifyTransaction( Transaction const& _transaction, time_t _latestBlockTimestamp, + static void verifyTransaction( Transaction const& _transaction, time_t _committedBlockTimestamp, BlockHeader const& _blockHeader, const skale::State& _state, const ChainOperationParams& _chainParams, u256 const& _gasUsed, const u256& _gasPrice, const bool _allowFuture = false ); diff --git a/libethereum/ExtVM.h b/libethereum/ExtVM.h index f911fdf42..845fa1809 100644 --- a/libethereum/ExtVM.h +++ b/libethereum/ExtVM.h @@ -107,7 +107,7 @@ class ExtVM : public ExtVMFace { // If _version is latest for the block, select corresponding latest schedule. // Otherwise run with the latest schedule known to correspond to the _version. EVMSchedule currentBlockSchedule = - m_chainParams.evmSchedule( envInfo().latestBlockTimestamp(), envInfo().number() ); + m_chainParams.evmSchedule( envInfo().committedBlockTimestamp(), envInfo().number() ); if ( currentBlockSchedule.accountVersion == _version ) return currentBlockSchedule; else diff --git a/libethereum/SchainPatch.cpp b/libethereum/SchainPatch.cpp index 79e14e52a..0b7a1e9c0 100644 --- a/libethereum/SchainPatch.cpp +++ b/libethereum/SchainPatch.cpp @@ -1,12 +1,12 @@ #include "SchainPatch.h" dev::eth::ChainOperationParams SchainPatch::chainParams; -time_t SchainPatch::latestBlockTimestamp; +time_t SchainPatch::committedBlockTimestamp; void SchainPatch::init( const dev::eth::ChainOperationParams& _cp ) { chainParams = _cp; } void SchainPatch::useLatestBlockTimestamp( time_t _timestamp ) { - latestBlockTimestamp = _timestamp; + committedBlockTimestamp = _timestamp; } diff --git a/libethereum/SchainPatch.h b/libethereum/SchainPatch.h index 1481825fc..89fd58111 100644 --- a/libethereum/SchainPatch.h +++ b/libethereum/SchainPatch.h @@ -30,17 +30,17 @@ class SchainPatch { protected: static dev::eth::ChainOperationParams chainParams; - static time_t latestBlockTimestamp; + static time_t committedBlockTimestamp; }; -#define DEFINE_AMNESIC_PATCH( BlaBlaPatch ) \ - class BlaBlaPatch : public SchainPatch { \ - public: \ - static std::string getName() { return #BlaBlaPatch; } \ - static bool isEnabledAtLatestBlock() { \ - time_t activationTimestamp = chainParams.getPatchTimestamp( getName() ); \ - return activationTimestamp != 0 && latestBlockTimestamp >= activationTimestamp; \ - } \ +#define DEFINE_AMNESIC_PATCH( BlaBlaPatch ) \ + class BlaBlaPatch : public SchainPatch { \ + public: \ + static std::string getName() { return #BlaBlaPatch; } \ + static bool isEnabledAtLatestBlock() { \ + time_t activationTimestamp = chainParams.getPatchTimestamp( getName() ); \ + return activationTimestamp != 0 && committedBlockTimestamp >= activationTimestamp; \ + } \ }; // TODO One more overload - with EnvInfo? @@ -53,9 +53,9 @@ class SchainPatch { time_t timestamp = chainParams.getPatchTimestamp( getName() ); \ return _bc.isPatchTimestampActiveInBlockNumber( timestamp, _bn ); \ } \ - static bool isEnabledWhen( time_t _lastBlockTimestamp ) { \ + static bool isEnabledWhen( time_t _committedBlockTimestamp ) { \ time_t activationTimestamp = chainParams.getPatchTimestamp( getName() ); \ - return activationTimestamp != 0 && _lastBlockTimestamp >= activationTimestamp; \ + return activationTimestamp != 0 && _committedBlockTimestamp >= activationTimestamp; \ } \ }; @@ -68,9 +68,9 @@ class SchainPatch { time_t timestamp = _bc.chainParams().getPatchTimestamp( getName() ); \ return _bc.isPatchTimestampActiveInBlockNumber( timestamp, _bn ); \ } \ - static bool isEnabledWhen( time_t _lastBlockTimestamp ) { \ + static bool isEnabledWhen( time_t _committedBlockTimestamp ) { \ time_t my_timestamp = chainParams.getPatchTimestamp( getName() ); \ - return _lastBlockTimestamp >= my_timestamp; \ + return _committedBlockTimestamp >= my_timestamp; \ } \ static dev::eth::EVMSchedule makeSchedule( const dev::eth::EVMSchedule& base ); \ }; diff --git a/libethereum/Transaction.cpp b/libethereum/Transaction.cpp index d5870b51c..7f529ae26 100644 --- a/libethereum/Transaction.cpp +++ b/libethereum/Transaction.cpp @@ -182,7 +182,7 @@ u256 Transaction::gasPrice() const { } void Transaction::checkOutExternalGas( - const ChainParams& _cp, time_t _latestBlockTimestamp, uint64_t _bn, bool _force ) { + const ChainParams& _cp, time_t _committedBlockTimestamp, uint64_t _bn, bool _force ) { u256 const& difficulty = _cp.externalGasDifficulty; assert( difficulty > 0 ); if ( ( _force || !m_externalGasIsChecked ) && !isInvalid() ) { @@ -196,7 +196,7 @@ void Transaction::checkOutExternalGas( EVMSchedule scheduleForUse = ConstantinopleSchedule; if ( CorrectForkInPowPatch::isEnabled() ) - scheduleForUse = _cp.evmSchedule( _latestBlockTimestamp, _bn ); + scheduleForUse = _cp.evmSchedule( _committedBlockTimestamp, _bn ); // never call checkOutExternalGas with non-last block if ( _bn != CorrectForkInPowPatch::getLastBlockNumber() ) { diff --git a/libethereum/Transaction.h b/libethereum/Transaction.h index 572024aa2..dd36e054b 100644 --- a/libethereum/Transaction.h +++ b/libethereum/Transaction.h @@ -122,8 +122,8 @@ class Transaction : public TransactionBase { u256 gasPrice() const; - void checkOutExternalGas( - const ChainParams& _cp, time_t _latestBlockTimestamp, uint64_t _bn, bool _force = false ); + void checkOutExternalGas( const ChainParams& _cp, time_t _committedBlockTimestamp, uint64_t _bn, + bool _force = false ); void ignoreExternalGas() { m_externalGasIsChecked = true; diff --git a/libevm/ExtVMFace.h b/libevm/ExtVMFace.h index 23b321556..0813f733d 100644 --- a/libevm/ExtVMFace.h +++ b/libevm/ExtVMFace.h @@ -132,18 +132,18 @@ struct CallParameters { class EnvInfo { public: EnvInfo( BlockHeader const& _current, LastBlockHashesFace const& _lh, - time_t _latestBlockTimestamp, u256 const& _gasUsed, u256 const& _chainID ) + time_t _committedBlockTimestamp, u256 const& _gasUsed, u256 const& _chainID ) : m_headerInfo( _current ), m_lastHashes( _lh ), - m_latestBlockTimestamp( _latestBlockTimestamp ), + m_committedBlockTimestamp( _committedBlockTimestamp ), m_gasUsed( _gasUsed ), m_chainID( _chainID ) {} // Constructor with custom gasLimit - used in some synthetic scenarios like eth_estimateGas RPC // method EnvInfo( BlockHeader const& _current, LastBlockHashesFace const& _lh, - time_t _latestBlockTimestamp, u256 const& _gasUsed, u256 const& _gasLimit, + time_t _committedBlockTimestamp, u256 const& _gasUsed, u256 const& _gasLimit, u256 const& _chainID ) - : EnvInfo( _current, _lh, _latestBlockTimestamp, _gasUsed, _chainID ) { + : EnvInfo( _current, _lh, _committedBlockTimestamp, _gasUsed, _chainID ) { m_headerInfo.setGasLimit( _gasLimit ); } @@ -155,14 +155,14 @@ class EnvInfo { u256 const& difficulty() const { return m_headerInfo.difficulty(); } u256 const& gasLimit() const { return m_headerInfo.gasLimit(); } LastBlockHashesFace const& lastHashes() const { return m_lastHashes; } - time_t latestBlockTimestamp() const { return m_latestBlockTimestamp; } + time_t committedBlockTimestamp() const { return m_committedBlockTimestamp; } u256 const& gasUsed() const { return m_gasUsed; } u256 const& chainID() const { return m_chainID; } private: BlockHeader m_headerInfo; LastBlockHashesFace const& m_lastHashes; - time_t m_latestBlockTimestamp; + time_t m_committedBlockTimestamp; u256 m_gasUsed; u256 m_chainID; }; diff --git a/libhistoric/AlethExecutive.cpp b/libhistoric/AlethExecutive.cpp index dfecad107..4f217dfe9 100644 --- a/libhistoric/AlethExecutive.cpp +++ b/libhistoric/AlethExecutive.cpp @@ -77,10 +77,10 @@ void AlethExecutive::accrueSubState( SubState& _parentContext ) { void AlethExecutive::initialize( Transaction const& _transaction ) { m_t = _transaction; m_baseGasRequired = m_t.baseGasRequired( - m_chainParams.evmSchedule( m_envInfo.latestBlockTimestamp(), m_envInfo.number() ) ); + m_chainParams.evmSchedule( m_envInfo.committedBlockTimestamp(), m_envInfo.number() ) ); try { Ethash::verifyTransaction( m_chainParams, ImportRequirements::Everything, m_t, - m_envInfo.latestBlockTimestamp(), m_envInfo.header(), m_envInfo.gasUsed() ); + m_envInfo.committedBlockTimestamp(), m_envInfo.header(), m_envInfo.gasUsed() ); } catch ( Exception const& ex ) { m_excepted = toTransactionException( ex ); throw; @@ -213,7 +213,7 @@ bool AlethExecutive::create( Address const& _txSender, u256 const& _endowment, u256 const& _gasPrice, u256 const& _gas, bytesConstRef _init, Address const& _origin ) { // Contract will be created with the version corresponding to latest hard fork auto const latestVersion = - m_chainParams.evmSchedule( m_envInfo.latestBlockTimestamp(), m_envInfo.number() ) + m_chainParams.evmSchedule( m_envInfo.committedBlockTimestamp(), m_envInfo.number() ) .accountVersion; return createWithAddressFromNonceAndSender( _txSender, _endowment, _gasPrice, _gas, _init, _origin, latestVersion ); diff --git a/libhistoric/AlethExtVM.h b/libhistoric/AlethExtVM.h index f717ef2d8..c830e9fc6 100644 --- a/libhistoric/AlethExtVM.h +++ b/libhistoric/AlethExtVM.h @@ -39,8 +39,8 @@ class AlethExtVM : public ExtVMFace { _code.toBytes(), _codeHash, _version, _depth, _isCreate, _staticCall ), m_s( _s ), m_chainParams( _chainParams ), - m_evmSchedule( - initEvmSchedule( _envInfo.latestBlockTimestamp(), envInfo().number(), _version ) ) { + m_evmSchedule( initEvmSchedule( + _envInfo.committedBlockTimestamp(), envInfo().number(), _version ) ) { // Contract: processing account must exist. In case of CALL, the ExtVM // is created only if an account has code (so exist). In case of CREATE // the account must be created first. @@ -98,11 +98,11 @@ class AlethExtVM : public ExtVMFace { private: EVMSchedule initEvmSchedule( - time_t _latestBlockTimestamp, int64_t _blockNumber, u256 const& _version ) const { + time_t _committedBlockTimestamp, int64_t _blockNumber, u256 const& _version ) const { // If _version is latest for the block, select corresponding latest schedule. // Otherwise run with the latest schedule known to correspond to the _version. EVMSchedule currentBlockSchedule = - m_chainParams.evmSchedule( _latestBlockTimestamp, _blockNumber ); + m_chainParams.evmSchedule( _committedBlockTimestamp, _blockNumber ); if ( currentBlockSchedule.accountVersion == _version ) return currentBlockSchedule; else @@ -111,7 +111,7 @@ class AlethExtVM : public ExtVMFace { dev::eth::HistoricState& m_s; ///< A reference to the base state. - time_t m_latestBlockTimestamp; + time_t m_committedBlockTimestamp; ChainOperationParams const& m_chainParams; EVMSchedule const m_evmSchedule; }; diff --git a/libskale/State.cpp b/libskale/State.cpp index 2723ff46b..8a1ddcfab 100644 --- a/libskale/State.cpp +++ b/libskale/State.cpp @@ -1018,7 +1018,7 @@ std::pair< ExecutionResult, TransactionReceipt > State::execute( EnvInfo const& ExecutionResult res; e.setResultRecipient( res ); - bool isCacheEnabled = RevertableFSPatch::isEnabledWhen( _envInfo.latestBlockTimestamp() ); + bool isCacheEnabled = RevertableFSPatch::isEnabledWhen( _envInfo.committedBlockTimestamp() ); resetOverlayFS( isCacheEnabled ); auto onOp = _onOp; diff --git a/test/tools/jsontests/BlockChainTests.cpp b/test/tools/jsontests/BlockChainTests.cpp index 3db8159b8..9ce5789f8 100644 --- a/test/tools/jsontests/BlockChainTests.cpp +++ b/test/tools/jsontests/BlockChainTests.cpp @@ -544,9 +544,9 @@ void testBCTest( json_spirit::mObject const& _o ) { ImportTest::compareStates( postState, blockchain.topBlock().state() ); } -bigint calculateMiningReward( time_t _latestBlockTimestamp, u256 const& _blNumber, u256 const& _unNumber1, u256 const& _unNumber2, +bigint calculateMiningReward( time_t _committedBlockTimestamp, u256 const& _blNumber, u256 const& _unNumber1, u256 const& _unNumber2, ChainOperationParams const& _cp ) { - bigint const baseReward = _cp.blockReward( _latestBlockTimestamp, _blNumber ); + bigint const baseReward = _cp.blockReward( _committedBlockTimestamp, _blNumber ); bigint reward = baseReward; // INCLUDE_UNCLE = BASE_REWARD / 32 // UNCLE_REWARD = BASE_REWARD * (8 - Bn + Un) / 8 diff --git a/test/tools/jsontests/BlockChainTests.h b/test/tools/jsontests/BlockChainTests.h index e4369817c..0312859b9 100644 --- a/test/tools/jsontests/BlockChainTests.h +++ b/test/tools/jsontests/BlockChainTests.h @@ -77,7 +77,7 @@ void checkJsonSectionForInvalidBlock( mObject& _blObj ); void checkExpectedException( mObject& _blObj, Exception const& _e ); void checkBlocks( TestBlock const& _blockFromFields, TestBlock const& _blockFromRlp, string const& _testname ); -bigint calculateMiningReward( time_t _latestBlockTimestamp, u256 const& _blNumber, u256 const& _unNumber1, u256 const& _unNumber2, +bigint calculateMiningReward( time_t _committedBlockTimestamp, u256 const& _blNumber, u256 const& _unNumber1, u256 const& _unNumber2, ChainOperationParams const& _cp ); json_spirit::mObject fillBCTest( json_spirit::mObject const& _input ); void testBCTest( json_spirit::mObject const& _o ); diff --git a/test/tools/jsontests/vm.cpp b/test/tools/jsontests/vm.cpp index 0cc8ea25b..939dd07da 100644 --- a/test/tools/jsontests/vm.cpp +++ b/test/tools/jsontests/vm.cpp @@ -92,7 +92,7 @@ mObject FakeExtVM::exportEnv() { return ret; } -EnvInfo FakeExtVM::importEnv( mObject const& _o, LastBlockHashesFace const& _lastBlockHashes, time_t _latestBlockTimestamp ) { +EnvInfo FakeExtVM::importEnv( mObject const& _o, LastBlockHashesFace const& _lastBlockHashes, time_t _committedBlockTimestamp ) { // cant use BOOST_REQUIRE, because this function is used outside boost test (createRandomTest) assert( _o.count( "currentGasLimit" ) > 0 ); assert( _o.count( "currentDifficulty" ) > 0 ); @@ -109,7 +109,7 @@ EnvInfo FakeExtVM::importEnv( mObject const& _o, LastBlockHashesFace const& _las blockHeader.setTimestamp( toPositiveInt64( _o.at( "currentTimestamp" ) ) ); blockHeader.setAuthor( Address( _o.at( "currentCoinbase" ).get_str() ) ); blockHeader.setNumber( toPositiveInt64( _o.at( "currentNumber" ) ) ); - return EnvInfo( blockHeader, _lastBlockHashes, _latestBlockTimestamp, 0, 0 ); + return EnvInfo( blockHeader, _lastBlockHashes, _committedBlockTimestamp, 0, 0 ); } mObject FakeExtVM::exportState() { diff --git a/test/tools/jsontests/vm.h b/test/tools/jsontests/vm.h index 1fc038599..4c0c510cd 100644 --- a/test/tools/jsontests/vm.h +++ b/test/tools/jsontests/vm.h @@ -77,7 +77,7 @@ class FakeExtVM : public eth::ExtVMFace { u256 doPosts(); json_spirit::mObject exportEnv(); static dev::eth::EnvInfo importEnv( - json_spirit::mObject const& _o, eth::LastBlockHashesFace const& _lastBlockHashes, time_t _latestBlockTimestamp ); + json_spirit::mObject const& _o, eth::LastBlockHashesFace const& _lastBlockHashes, time_t _committedBlockTimestamp ); json_spirit::mObject exportState(); void importState( json_spirit::mObject const& _object ); json_spirit::mObject exportExec(); From c0339d2010d347911fee233b310357df2c7f0c2c Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Mon, 26 Feb 2024 18:44:59 +0000 Subject: [PATCH 023/154] SKALED-1583 Use proper patch timestamp names --- libethereum/ChainParams.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libethereum/ChainParams.cpp b/libethereum/ChainParams.cpp index 18ac227d6..ba1bd575e 100644 --- a/libethereum/ChainParams.cpp +++ b/libethereum/ChainParams.cpp @@ -251,6 +251,11 @@ ChainParams ChainParams::loadConfig( } // if } // for + // HACK Some names are non-standard + s._patchTimestamps["ContractStorageLimitPatch"] = + s.getPatchTimestamp( "ContractStoragePatch" ); + s._patchTimestamps["POWCheckPatch"] = s.getPatchTimestamp( "PowCheckPatch" ); + if ( sChainObj.count( "nodeGroups" ) ) { std::vector< NodeGroup > nodeGroups; for ( const auto& nodeGroupConf : sChainObj["nodeGroups"].get_obj() ) { From 00a09f6999a9c77ccdc3d98c3be23b3a1559d365 Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Wed, 28 Feb 2024 19:27:38 +0000 Subject: [PATCH 024/154] SKALED-1583 Convert some patches to new arch --- libethcore/SealEngine.cpp | 2 +- libethereum/Client.cpp | 20 +++----------- libethereum/ClientBase.cpp | 2 +- libethereum/Precompiled.cpp | 6 +++-- libethereum/SchainPatch.h | 2 +- libethereum/Transaction.cpp | 9 +------ libskale/CorrectForkInPowPatch.cpp | 11 -------- libskale/CorrectForkInPowPatch.h | 31 +--------------------- libskale/OverlayDB.cpp | 2 +- libskale/POWCheckPatch.cpp | 10 ------- libskale/POWCheckPatch.h | 25 +---------------- libskale/PrecompiledConfigPatch.cpp | 10 ------- libskale/PrecompiledConfigPatch.h | 26 +----------------- test/tools/libtesteth/BlockChainHelper.cpp | 6 ++--- test/tools/libtesteth/TestOutputHelper.cpp | 2 -- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 2 +- 16 files changed, 18 insertions(+), 148 deletions(-) diff --git a/libethcore/SealEngine.cpp b/libethcore/SealEngine.cpp index 17b76c94d..acda752d9 100644 --- a/libethcore/SealEngine.cpp +++ b/libethcore/SealEngine.cpp @@ -99,7 +99,7 @@ void SealEngineFace::verifyTransaction( ChainOperationParams const& _chainParams BlockHeader const& _header, u256 const& _gasUsed ) { // verifyTransaction is the only place where TransactionBase is used instead of Transaction. u256 gas; - if ( POWCheckPatch::isEnabled() ) { + if ( POWCheckPatch::isEnabledWhen( _committedBlockTimestamp ) ) { // new behavior is to use pow-enabled gas gas = _t.gas(); } else { diff --git a/libethereum/Client.cpp b/libethereum/Client.cpp index 582dd39d2..9512e7d7e 100644 --- a/libethereum/Client.cpp +++ b/libethereum/Client.cpp @@ -27,7 +27,6 @@ #include "Executive.h" #include "SkaleHost.h" #include "SnapshotAgent.h" -#include "SnapshotStorage.h" #include "TransactionQueue.h" #include #include @@ -165,11 +164,6 @@ Client::Client( ChainParams const& _params, int _networkID, chainParams().sChain.getPatchTimestamp( "VerifyDaSigsPatch" ) ); StorageDestructionPatch::setTimestamp( chainParams().sChain.getPatchTimestamp( "StorageDestructionPatch" ) ); - POWCheckPatch::setTimestamp( chainParams().sChain.getPatchTimestamp( "PowCheckPatch" ) ); - PrecompiledConfigPatch::setTimestamp( - chainParams().sChain.getPatchTimestamp( "PrecompiledConfigPatch" ) ); - CorrectForkInPowPatch::setTimestamp( - chainParams().sChain.getPatchTimestamp( "CorrectForkInPowPatch" ) ); } @@ -335,10 +329,6 @@ void Client::init( WithExisting _forceAction, u256 _networkId ) { // HACK Needed to set env var for consensus AmsterdamFixPatch::isEnabled( *this ); - // needed for checkOutExternalGas - CorrectForkInPowPatch::committedBlockTimestamp = blockChain().info().timestamp(); - CorrectForkInPowPatch::lastBlockNumber = blockChain().number(); - initCPUUSage(); doWork( false ); @@ -610,10 +600,6 @@ size_t Client::importTransactionsAsBlock( SchainPatch::useLatestBlockTimestamp( blockChain().info().timestamp() ); - // this needs to be updated as soon as possible, as it's used in new transactions validation - CorrectForkInPowPatch::committedBlockTimestamp = blockChain().info().timestamp(); - CorrectForkInPowPatch::lastBlockNumber = blockChain().number(); - if ( !UnsafeRegion::isActive() ) { LOG( m_loggerDetail ) << "Total unsafe time so far = " << std::chrono::duration_cast< std::chrono::seconds >( @@ -678,11 +664,11 @@ size_t Client::syncTransactions( // ContractStorageZeroValuePatch::lastBlockTimestamp = blockChain().info().timestamp(); // RevertableFSPatch::lastBlockTimestamp = blockChain().info().timestamp(); StorageDestructionPatch::lastBlockTimestamp = blockChain().info().timestamp(); - POWCheckPatch::lastBlockTimestamp = blockChain().info().timestamp(); + // POWCheckPatch::lastBlockTimestamp = blockChain().info().timestamp(); // PushZeroPatch::lastBlockTimestamp = blockChain().info().timestamp(); // SkipInvalidTransactionsPatch::lastBlockTimestamp = blockChain().info().timestamp(); - PrecompiledConfigPatch::lastBlockTimestamp = blockChain().info().timestamp(); - CorrectForkInPowPatch::lastBlockTimestamp = blockChain().info().timestamp(); + // PrecompiledConfigPatch::lastBlockTimestamp = blockChain().info().timestamp(); + // CorrectForkInPowPatch::lastBlockTimestamp = blockChain().info().timestamp(); DEV_WRITE_GUARDED( x_working ) { diff --git a/libethereum/ClientBase.cpp b/libethereum/ClientBase.cpp index 66bbe16f2..d8efe459b 100644 --- a/libethereum/ClientBase.cpp +++ b/libethereum/ClientBase.cpp @@ -117,7 +117,7 @@ std::pair< u256, ExecutionResult > ClientBase::estimateGas( Address const& _from int64_t upperBound = _maxGas; if ( upperBound == Invalid256 || upperBound > c_maxGasEstimate ) upperBound = c_maxGasEstimate; - int64_t lowerBound = CorrectForkInPowPatch::isEnabled() ? + int64_t lowerBound = CorrectForkInPowPatch::isEnabled( bc() ) ? Transaction::baseGasRequired( !_dest, &_data, bc().sealEngine()->chainParams().evmSchedule( bc().info().timestamp(), bc().number() ) ) : diff --git a/libethereum/Precompiled.cpp b/libethereum/Precompiled.cpp index 0790ccbd2..b12daab87 100644 --- a/libethereum/Precompiled.cpp +++ b/libethereum/Precompiled.cpp @@ -810,7 +810,8 @@ ETH_REGISTER_PRECOMPILED( getConfigVariableUint256 )( bytesConstRef _in ) { // call to skaleConfig.sChain.nodes means call to the historic data // need to proccess it in a different way // TODO Check if this precompiled can be called on historic block - if ( isCallToHistoricData( rawName ) && PrecompiledConfigPatch::isEnabled() ) { + if ( isCallToHistoricData( rawName ) && + PrecompiledConfigPatch::isEnabledInPendingBlock() ) { if ( !g_skaleHost ) throw std::runtime_error( "SkaleHost accessor was not initialized" ); @@ -919,7 +920,8 @@ ETH_REGISTER_PRECOMPILED( getConfigVariableString )( bytesConstRef _in ) { // call to skaleConfig.sChain.nodes means call to the historic data // need to proccess it in a different way // TODO Check if this precompiled can be called on historic block - if ( isCallToHistoricData( rawName ) && PrecompiledConfigPatch::isEnabled() ) { + if ( isCallToHistoricData( rawName ) && + PrecompiledConfigPatch::isEnabledInPendingBlock() ) { if ( !g_skaleHost ) throw std::runtime_error( "SkaleHost accessor was not initialized" ); diff --git a/libethereum/SchainPatch.h b/libethereum/SchainPatch.h index 89fd58111..1efebb3e4 100644 --- a/libethereum/SchainPatch.h +++ b/libethereum/SchainPatch.h @@ -37,7 +37,7 @@ class SchainPatch { class BlaBlaPatch : public SchainPatch { \ public: \ static std::string getName() { return #BlaBlaPatch; } \ - static bool isEnabledAtLatestBlock() { \ + static bool isEnabledInPendingBlock() { \ time_t activationTimestamp = chainParams.getPatchTimestamp( getName() ); \ return activationTimestamp != 0 && committedBlockTimestamp >= activationTimestamp; \ } \ diff --git a/libethereum/Transaction.cpp b/libethereum/Transaction.cpp index 7f529ae26..92054dfae 100644 --- a/libethereum/Transaction.cpp +++ b/libethereum/Transaction.cpp @@ -195,16 +195,9 @@ void Transaction::checkOutExternalGas( ctrace << "Mined gas: " << externalGas << endl; EVMSchedule scheduleForUse = ConstantinopleSchedule; - if ( CorrectForkInPowPatch::isEnabled() ) + if ( CorrectForkInPowPatch::isEnabledWhen( _committedBlockTimestamp ) ) scheduleForUse = _cp.evmSchedule( _committedBlockTimestamp, _bn ); - // never call checkOutExternalGas with non-last block - if ( _bn != CorrectForkInPowPatch::getLastBlockNumber() ) { - ctrace << _bn << " != " << CorrectForkInPowPatch::getLastBlockNumber(); - BOOST_THROW_EXCEPTION( std::runtime_error( - "Internal error: checkOutExternalGas() has invalid block number" ) ); - } - if ( externalGas >= baseGasRequired( scheduleForUse ) ) m_externalGas = externalGas; diff --git a/libskale/CorrectForkInPowPatch.cpp b/libskale/CorrectForkInPowPatch.cpp index aec18bc29..8bc1e41fb 100644 --- a/libskale/CorrectForkInPowPatch.cpp +++ b/libskale/CorrectForkInPowPatch.cpp @@ -1,12 +1 @@ #include "CorrectForkInPowPatch.h" - -time_t CorrectForkInPowPatch::activationTimestamp; -time_t CorrectForkInPowPatch::lastBlockTimestamp; -unsigned CorrectForkInPowPatch::lastBlockNumber; - -bool CorrectForkInPowPatch::isEnabled() { - if ( activationTimestamp == 0 ) { - return false; - } - return activationTimestamp <= lastBlockTimestamp; -} diff --git a/libskale/CorrectForkInPowPatch.h b/libskale/CorrectForkInPowPatch.h index 94c0f766e..88b40394d 100644 --- a/libskale/CorrectForkInPowPatch.h +++ b/libskale/CorrectForkInPowPatch.h @@ -3,39 +3,10 @@ #include -#include - -namespace dev { -namespace eth { -class Client; -} -namespace test { -class TestBlockChain; -class TestOutputHelperFixture; -} // namespace test -} // namespace dev - /* * Context: use current, and not Constantinople, fork in Transaction::checkOutExternalGas() */ -class CorrectForkInPowPatch : public SchainPatch { -public: - static bool isEnabled(); - - static void setTimestamp( time_t _timeStamp ) { - printInfo( __FILE__, _timeStamp ); - activationTimestamp = _timeStamp; - } - - static unsigned getLastBlockNumber() { return lastBlockNumber; } -private: - friend class dev::eth::Client; - friend class dev::test::TestBlockChain; - friend class dev::test::TestOutputHelperFixture; - static time_t activationTimestamp; - static time_t lastBlockTimestamp; - static unsigned lastBlockNumber; -}; +DEFINE_SIMPLE_PATCH( CorrectForkInPowPatch ) #endif // CORRECTFORKINPOWPATCH_H diff --git a/libskale/OverlayDB.cpp b/libskale/OverlayDB.cpp index 4cf63eb34..efd12b0e2 100644 --- a/libskale/OverlayDB.cpp +++ b/libskale/OverlayDB.cpp @@ -151,7 +151,7 @@ void OverlayDB::commitStorageValues() { static const h256 ZERO_VALUE( 0 ); - if ( ContractStorageZeroValuePatch::isEnabledAtLatestBlock() && value == ZERO_VALUE ) { + if ( ContractStorageZeroValuePatch::isEnabledInPendingBlock() && value == ZERO_VALUE ) { // if the value is zero, the pair will be deleted in LevelDB // if it exists m_db_face->kill( diff --git a/libskale/POWCheckPatch.cpp b/libskale/POWCheckPatch.cpp index 79a43dddd..3971f9572 100644 --- a/libskale/POWCheckPatch.cpp +++ b/libskale/POWCheckPatch.cpp @@ -1,11 +1 @@ #include "POWCheckPatch.h" - -time_t POWCheckPatch::powCheckPatchTimestamp; -time_t POWCheckPatch::lastBlockTimestamp; - -bool POWCheckPatch::isEnabled() { - if ( powCheckPatchTimestamp == 0 ) { - return false; - } - return powCheckPatchTimestamp <= lastBlockTimestamp; -} diff --git a/libskale/POWCheckPatch.h b/libskale/POWCheckPatch.h index 65a4f5905..c8dcd8e7e 100644 --- a/libskale/POWCheckPatch.h +++ b/libskale/POWCheckPatch.h @@ -1,31 +1,8 @@ #include -#include #ifndef POWCHECKPATCH_H #define POWCHECKPATCH_H -namespace dev { -namespace eth { -class Client; -} -} // namespace dev - -/* - * Context: enable fix for POW txns gas limit check - */ -class POWCheckPatch : public SchainPatch { -public: - static bool isEnabled(); - - static void setTimestamp( time_t _timeStamp ) { - printInfo( __FILE__, _timeStamp ); - powCheckPatchTimestamp = _timeStamp; - } - -private: - friend class dev::eth::Client; - static time_t powCheckPatchTimestamp; - static time_t lastBlockTimestamp; -}; +DEFINE_SIMPLE_PATCH( POWCheckPatch ) #endif // POWCHECKPATCH_H diff --git a/libskale/PrecompiledConfigPatch.cpp b/libskale/PrecompiledConfigPatch.cpp index f36557d61..da77f8d62 100644 --- a/libskale/PrecompiledConfigPatch.cpp +++ b/libskale/PrecompiledConfigPatch.cpp @@ -1,11 +1 @@ #include "PrecompiledConfigPatch.h" - -time_t PrecompiledConfigPatch::precompiledConfigPatchTimestamp; -time_t PrecompiledConfigPatch::lastBlockTimestamp; - -bool PrecompiledConfigPatch::isEnabled() { - if ( precompiledConfigPatchTimestamp == 0 ) { - return false; - } - return precompiledConfigPatchTimestamp <= lastBlockTimestamp; -} diff --git a/libskale/PrecompiledConfigPatch.h b/libskale/PrecompiledConfigPatch.h index 776dd47cc..02aa765f4 100644 --- a/libskale/PrecompiledConfigPatch.h +++ b/libskale/PrecompiledConfigPatch.h @@ -2,31 +2,7 @@ #define PRECOMPILEDCONFIGPATCH_H #include -#include - -namespace dev { -namespace eth { -class Client; -} -} // namespace dev - -/* - * Context: enable precompiled contracts to read historical config data - */ -class PrecompiledConfigPatch : public SchainPatch { -public: - static bool isEnabled(); - - static void setTimestamp( time_t _timeStamp ) { - printInfo( __FILE__, _timeStamp ); - precompiledConfigPatchTimestamp = _timeStamp; - } - -private: - friend class dev::eth::Client; - static time_t precompiledConfigPatchTimestamp; - static time_t lastBlockTimestamp; -}; +DEFINE_AMNESIC_PATCH( PrecompiledConfigPatch ) #endif // PRECOMPILEDCONFIGPATCH_H diff --git a/test/tools/libtesteth/BlockChainHelper.cpp b/test/tools/libtesteth/BlockChainHelper.cpp index 757ac6169..3eaa5eedd 100644 --- a/test/tools/libtesteth/BlockChainHelper.cpp +++ b/test/tools/libtesteth/BlockChainHelper.cpp @@ -476,8 +476,7 @@ void TestBlockChain::reset( TestBlock const& _genesisBlock ) { bool TestBlockChain::addBlock( TestBlock const& _block ) { - CorrectForkInPowPatch::lastBlockTimestamp = m_blockChain->info().timestamp(); - CorrectForkInPowPatch::lastBlockNumber = m_blockChain->number(); + SchainPatch::useLatestBlockTimestamp(m_blockChain->info().timestamp()); while ( true ) { try { @@ -501,8 +500,7 @@ bool TestBlockChain::addBlock( TestBlock const& _block ) { State st( block.state() ); m_lastBlock.setState( st ); - CorrectForkInPowPatch::lastBlockTimestamp = m_blockChain->info().timestamp(); - CorrectForkInPowPatch::lastBlockNumber = m_blockChain->number(); + SchainPatch::useLatestBlockTimestamp(m_blockChain->info().timestamp()); return true; } diff --git a/test/tools/libtesteth/TestOutputHelper.cpp b/test/tools/libtesteth/TestOutputHelper.cpp index f5ec7cdf2..54444cfd0 100644 --- a/test/tools/libtesteth/TestOutputHelper.cpp +++ b/test/tools/libtesteth/TestOutputHelper.cpp @@ -103,8 +103,6 @@ void TestOutputHelper::printTestExecStats() { } TestOutputHelperFixture::TestOutputHelperFixture() { TestOutputHelper::get().initTest(); - CorrectForkInPowPatch::lastBlockTimestamp = 1; - CorrectForkInPowPatch::lastBlockNumber = 0; } TestOutputHelperFixture::~TestOutputHelperFixture() { diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index 0c0ec7e34..e10299d1e 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -290,7 +290,7 @@ struct JsonRpcFixture : public TestOutputHelperFixture { chainParams.sChain.dbStorageLimit = 320.5*( 615 + 1430 ); chainParams.sChain._patchTimestamps["ContractStoragePatch"] = 1; powPatchActivationTimestamp = time(nullptr) + 60; - chainParams.sChain._patchTimestamps["correctForkInPowPatch"] = powPatchActivationTimestamp; // 10 guessed seconds + chainParams.sChain._patchTimestamps["CorrectForkInPowPatch"] = powPatchActivationTimestamp; // 10 guessed seconds chainParams.sChain.emptyBlockIntervalMs = _emptyBlockIntervalMs; // add random extra data to randomize genesis hash and get random DB path, // so that tests can be run in parallel From c8e02cf5664d1915db42bdfded19d66da26381ce Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Thu, 29 Feb 2024 21:56:20 +0000 Subject: [PATCH 025/154] SKALED-1583 Remove frontier test --- test/jsontests | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/jsontests b/test/jsontests index b1cbbff98..98ba9f3fb 160000 --- a/test/jsontests +++ b/test/jsontests @@ -1 +1 @@ -Subproject commit b1cbbff9888a6854f04f58917ab3400395933f5a +Subproject commit 98ba9f3fb0ffdc8bec89b4f623f684eca86e733f From 5361b9a2da7bd3ffb60fae22fa593be42ba15983 Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Thu, 29 Feb 2024 21:57:43 +0000 Subject: [PATCH 026/154] SKALED-1583 Add Push0 test --- test/unittests/libevm/VMTest.cpp | 45 ++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/test/unittests/libevm/VMTest.cpp b/test/unittests/libevm/VMTest.cpp index 86239f08c..d713dc25a 100644 --- a/test/unittests/libevm/VMTest.cpp +++ b/test/unittests/libevm/VMTest.cpp @@ -648,6 +648,39 @@ class BalanceFixture : public TestOutputHelperFixture { std::unique_ptr< VMFace > vm; }; +class InstructionTestFixture : public TestOutputHelperFixture { +public: + InstructionTestFixture() : vm{new LegacyVM()} { state.addBalance( address, 1 * ether ); } + + void testCode( std::string const& _codeStr ) { + + bytes const code = fromHex( _codeStr ); + + ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, {}, + ref( code ), sha3( code ), version, depth, isCreate, staticCall ); + + owning_bytes_ref ret = vm->exec( gas, extVm, OnOpFunc{} ); + } + + BlockHeader blockHeader{initBlockHeader()}; + LastBlockHashes lastBlockHashes; + Address address{KeyPair::create().address()}; + State state{0}; + std::unique_ptr< SealEngineFace > se{ + ChainParams( genesisInfo( Network::IstanbulTest ) ).createSealEngine()}; + EnvInfo envInfo{blockHeader, lastBlockHashes, 1, 0, se->chainParams().chainID}; + + u256 value = 0; + u256 gasPrice = 1; + u256 version = IstanbulSchedule.accountVersion; + int depth = 0; + bool isCreate = false; + bool staticCall = false; + u256 gas = 1000000; + + std::unique_ptr< LegacyVM > vm; +}; + class LegacyVMBalanceFixture : public BalanceFixture { public: LegacyVMBalanceFixture() : BalanceFixture{new LegacyVM} {} @@ -857,6 +890,18 @@ BOOST_AUTO_TEST_CASE( LegacyVMSelfBalanceisInvalidBeforeIstanbul, } BOOST_AUTO_TEST_SUITE_END() +BOOST_FIXTURE_TEST_SUITE( InstructionSuite, InstructionTestFixture ) + +BOOST_AUTO_TEST_CASE( Push0 ) { + string code = "5f"; + BOOST_REQUIRE_NO_THROW( this->testCode(code) ); + u256s stack = vm->stack(); + BOOST_REQUIRE_EQUAL(stack.size(), 1); + BOOST_REQUIRE_EQUAL(stack[0], u256()); +} + +BOOST_AUTO_TEST_SUITE_END() + BOOST_AUTO_TEST_SUITE_END() BOOST_FIXTURE_TEST_SUITE( SkaleInterpreterSuite, TestOutputHelperFixture ) From 0c30eac412502a350be8dcbb7c808bf0811fad4f Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Fri, 1 Mar 2024 18:15:57 +0000 Subject: [PATCH 027/154] SKALED-1583 Test for StorageDestructionPatch and combine most patches in one file --- libethcore/SealEngine.cpp | 2 +- libethereum/Client.cpp | 17 +++-------- libethereum/ClientBase.cpp | 2 +- libethereum/Precompiled.cpp | 2 +- libethereum/SchainPatch.h | 5 ++++ libethereum/Transaction.cpp | 2 +- libskale/CMakeLists.txt | 8 ------ libskale/CorrectForkInPowPatch.cpp | 1 - libskale/CorrectForkInPowPatch.h | 12 -------- libskale/OverlayFS.cpp | 2 +- libskale/POWCheckPatch.cpp | 1 - libskale/POWCheckPatch.h | 8 ------ libskale/PrecompiledConfigPatch.cpp | 1 - libskale/PrecompiledConfigPatch.h | 8 ------ libskale/RevertableFSPatch.cpp | 12 -------- libskale/RevertableFSPatch.h | 28 ------------------- libskale/State.cpp | 3 +- libskale/StorageDestructionPatch.cpp | 10 ------- libskale/StorageDestructionPatch.h | 17 +---------- test/tools/libtesteth/BlockChainHelper.cpp | 2 +- test/tools/libtesteth/TestOutputHelper.cpp | 2 +- .../unittests/libethereum/PrecompiledTest.cpp | 3 +- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 1 + 23 files changed, 20 insertions(+), 129 deletions(-) delete mode 100644 libskale/CorrectForkInPowPatch.cpp delete mode 100644 libskale/CorrectForkInPowPatch.h delete mode 100644 libskale/POWCheckPatch.cpp delete mode 100644 libskale/POWCheckPatch.h delete mode 100644 libskale/PrecompiledConfigPatch.cpp delete mode 100644 libskale/PrecompiledConfigPatch.h delete mode 100644 libskale/RevertableFSPatch.cpp delete mode 100644 libskale/RevertableFSPatch.h diff --git a/libethcore/SealEngine.cpp b/libethcore/SealEngine.cpp index acda752d9..cf5d8fcc9 100644 --- a/libethcore/SealEngine.cpp +++ b/libethcore/SealEngine.cpp @@ -20,7 +20,7 @@ #include "SealEngine.h" #include "TransactionBase.h" -#include +#include #include "../libdevcore/microprofile.h" diff --git a/libethereum/Client.cpp b/libethereum/Client.cpp index 9512e7d7e..58bfd5a7d 100644 --- a/libethereum/Client.cpp +++ b/libethereum/Client.cpp @@ -49,18 +49,11 @@ #include #endif - +#include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include + +#include #include #include #include @@ -162,8 +155,6 @@ Client::Client( ChainParams const& _params, int _networkID, chainParams().sChain.getPatchTimestamp( "ContractStoragePatch" ) ); VerifyDaSigsPatch::setTimestamp( chainParams().sChain.getPatchTimestamp( "VerifyDaSigsPatch" ) ); - StorageDestructionPatch::setTimestamp( - chainParams().sChain.getPatchTimestamp( "StorageDestructionPatch" ) ); } @@ -663,7 +654,7 @@ size_t Client::syncTransactions( ContractStorageLimitPatch::lastBlockTimestamp = blockChain().info().timestamp(); // ContractStorageZeroValuePatch::lastBlockTimestamp = blockChain().info().timestamp(); // RevertableFSPatch::lastBlockTimestamp = blockChain().info().timestamp(); - StorageDestructionPatch::lastBlockTimestamp = blockChain().info().timestamp(); + // StorageDestructionPatch::lastBlockTimestamp = blockChain().info().timestamp(); // POWCheckPatch::lastBlockTimestamp = blockChain().info().timestamp(); // PushZeroPatch::lastBlockTimestamp = blockChain().info().timestamp(); // SkipInvalidTransactionsPatch::lastBlockTimestamp = blockChain().info().timestamp(); diff --git a/libethereum/ClientBase.cpp b/libethereum/ClientBase.cpp index d8efe459b..f82486b40 100644 --- a/libethereum/ClientBase.cpp +++ b/libethereum/ClientBase.cpp @@ -23,7 +23,7 @@ */ #include "ClientBase.h" -#include +#include #include #include diff --git a/libethereum/Precompiled.cpp b/libethereum/Precompiled.cpp index b12daab87..2d0b13ca5 100644 --- a/libethereum/Precompiled.cpp +++ b/libethereum/Precompiled.cpp @@ -36,8 +36,8 @@ #include #include #include +#include #include -#include #include #include #include diff --git a/libethereum/SchainPatch.h b/libethereum/SchainPatch.h index 1efebb3e4..60939fed4 100644 --- a/libethereum/SchainPatch.h +++ b/libethereum/SchainPatch.h @@ -75,4 +75,9 @@ class SchainPatch { static dev::eth::EVMSchedule makeSchedule( const dev::eth::EVMSchedule& base ); \ }; +DEFINE_SIMPLE_PATCH( RevertableFSPatch ) +DEFINE_AMNESIC_PATCH( PrecompiledConfigPatch ) +DEFINE_SIMPLE_PATCH( POWCheckPatch ) +DEFINE_SIMPLE_PATCH( CorrectForkInPowPatch ) + #endif // SCHAINPATCH_H diff --git a/libethereum/Transaction.cpp b/libethereum/Transaction.cpp index 92054dfae..745aa7896 100644 --- a/libethereum/Transaction.cpp +++ b/libethereum/Transaction.cpp @@ -28,8 +28,8 @@ #include #include #include +#include #include -#include using namespace std; using namespace dev; diff --git a/libskale/CMakeLists.txt b/libskale/CMakeLists.txt index 1a0fb8ff1..c0bd17791 100644 --- a/libskale/CMakeLists.txt +++ b/libskale/CMakeLists.txt @@ -16,14 +16,10 @@ set(sources ContractStorageZeroValuePatch.cpp VerifyDaSigsPatch.cpp AmsterdamFixPatch.cpp - RevertableFSPatch.cpp OverlayFS.cpp StorageDestructionPatch.cpp - POWCheckPatch.cpp - PrecompiledConfigPatch.cpp PushZeroPatch.cpp SkipInvalidTransactionsPatch.cpp - CorrectForkInPowPatch.cpp ) set(headers @@ -40,12 +36,8 @@ set(headers TotalStorageUsedPatch.h ContractStorageLimitPatch.h AmsterdamFixPatch.h - RevertableFSPatch.h - POWCheckPatch.h - PrecompiledConfigPatch.h OverlayFS.h SkipInvalidTransactionsPatch.h - CorrectForkInPowPatch.h ) add_library(skale ${sources} ${headers}) diff --git a/libskale/CorrectForkInPowPatch.cpp b/libskale/CorrectForkInPowPatch.cpp deleted file mode 100644 index 8bc1e41fb..000000000 --- a/libskale/CorrectForkInPowPatch.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "CorrectForkInPowPatch.h" diff --git a/libskale/CorrectForkInPowPatch.h b/libskale/CorrectForkInPowPatch.h deleted file mode 100644 index 88b40394d..000000000 --- a/libskale/CorrectForkInPowPatch.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef CORRECTFORKINPOWPATCH_H -#define CORRECTFORKINPOWPATCH_H - -#include - -/* - * Context: use current, and not Constantinople, fork in Transaction::checkOutExternalGas() - */ - -DEFINE_SIMPLE_PATCH( CorrectForkInPowPatch ) - -#endif // CORRECTFORKINPOWPATCH_H diff --git a/libskale/OverlayFS.cpp b/libskale/OverlayFS.cpp index 8796dff4d..d9867249e 100644 --- a/libskale/OverlayFS.cpp +++ b/libskale/OverlayFS.cpp @@ -23,8 +23,8 @@ */ #include "OverlayFS.h" -#include "RevertableFSPatch.h" #include +#include #include #include diff --git a/libskale/POWCheckPatch.cpp b/libskale/POWCheckPatch.cpp deleted file mode 100644 index 3971f9572..000000000 --- a/libskale/POWCheckPatch.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "POWCheckPatch.h" diff --git a/libskale/POWCheckPatch.h b/libskale/POWCheckPatch.h deleted file mode 100644 index c8dcd8e7e..000000000 --- a/libskale/POWCheckPatch.h +++ /dev/null @@ -1,8 +0,0 @@ -#include - -#ifndef POWCHECKPATCH_H -#define POWCHECKPATCH_H - -DEFINE_SIMPLE_PATCH( POWCheckPatch ) - -#endif // POWCHECKPATCH_H diff --git a/libskale/PrecompiledConfigPatch.cpp b/libskale/PrecompiledConfigPatch.cpp deleted file mode 100644 index da77f8d62..000000000 --- a/libskale/PrecompiledConfigPatch.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "PrecompiledConfigPatch.h" diff --git a/libskale/PrecompiledConfigPatch.h b/libskale/PrecompiledConfigPatch.h deleted file mode 100644 index 02aa765f4..000000000 --- a/libskale/PrecompiledConfigPatch.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef PRECOMPILEDCONFIGPATCH_H -#define PRECOMPILEDCONFIGPATCH_H - -#include - -DEFINE_AMNESIC_PATCH( PrecompiledConfigPatch ) - -#endif // PRECOMPILEDCONFIGPATCH_H diff --git a/libskale/RevertableFSPatch.cpp b/libskale/RevertableFSPatch.cpp deleted file mode 100644 index 88f9e2723..000000000 --- a/libskale/RevertableFSPatch.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include "RevertableFSPatch.h" - - -// time_t RevertableFSPatch::revertableFSPatchTimestamp; -// time_t RevertableFSPatch::lastBlockTimestamp; - -// bool RevertableFSPatch::isEnabled() { -// if ( revertableFSPatchTimestamp == 0 ) { -// return false; -// } -// return revertableFSPatchTimestamp <= lastBlockTimestamp; -//} diff --git a/libskale/RevertableFSPatch.h b/libskale/RevertableFSPatch.h deleted file mode 100644 index f479a87f6..000000000 --- a/libskale/RevertableFSPatch.h +++ /dev/null @@ -1,28 +0,0 @@ -#include - -namespace dev { -namespace eth { -class Client; -} -} // namespace dev - -/* - * Context: enable revertable filestorage precompileds - * -class RevertableFSPatch : public SchainPatch { -public: - static bool isEnabled(); - - static void setTimestamp( time_t _timeStamp ) { - printInfo( __FILE__, _timeStamp ); - revertableFSPatchTimestamp = _timeStamp; - } - -private: - friend class dev::eth::Client; - static time_t revertableFSPatchTimestamp; - static time_t lastBlockTimestamp; -}; -*/ - -DEFINE_SIMPLE_PATCH( RevertableFSPatch ) diff --git a/libskale/State.cpp b/libskale/State.cpp index 8a1ddcfab..a05d5b082 100644 --- a/libskale/State.cpp +++ b/libskale/State.cpp @@ -45,7 +45,6 @@ #include #include -#include #include namespace fs = boost::filesystem; @@ -510,7 +509,7 @@ void State::commit( dev::eth::CommitBehaviour _commitBehaviour ) { m_db_ptr->kill( address ); m_db_ptr->killAuxiliary( address, Auxiliary::CODE ); - if ( StorageDestructionPatch::isEnabled() ) { + if ( StorageDestructionPatch::isEnabledInPendingBlock() ) { clearStorage( address ); } diff --git a/libskale/StorageDestructionPatch.cpp b/libskale/StorageDestructionPatch.cpp index 5ae6b03c7..01036ec39 100644 --- a/libskale/StorageDestructionPatch.cpp +++ b/libskale/StorageDestructionPatch.cpp @@ -1,11 +1 @@ #include "StorageDestructionPatch.h" - -time_t StorageDestructionPatch::storageDestructionPatchTimestamp; -time_t StorageDestructionPatch::lastBlockTimestamp; - -bool StorageDestructionPatch::isEnabled() { - if ( storageDestructionPatchTimestamp == 0 ) { - return false; - } - return storageDestructionPatchTimestamp <= lastBlockTimestamp; -} diff --git a/libskale/StorageDestructionPatch.h b/libskale/StorageDestructionPatch.h index fb16bbb4d..39b4ed3b9 100644 --- a/libskale/StorageDestructionPatch.h +++ b/libskale/StorageDestructionPatch.h @@ -1,5 +1,4 @@ #include -#include namespace dev { namespace eth { @@ -10,18 +9,4 @@ class Client; /* * Context: enable effective storage destruction */ -class StorageDestructionPatch : public SchainPatch { -public: - static bool isEnabled(); - - static void setTimestamp( time_t _timeStamp ) { - printInfo( __FILE__, _timeStamp ); - storageDestructionPatchTimestamp = _timeStamp; - } - - -private: - friend class dev::eth::Client; - static time_t storageDestructionPatchTimestamp; - static time_t lastBlockTimestamp; -}; \ No newline at end of file +DEFINE_AMNESIC_PATCH( StorageDestructionPatch ); diff --git a/test/tools/libtesteth/BlockChainHelper.cpp b/test/tools/libtesteth/BlockChainHelper.cpp index 3eaa5eedd..6b0eaea87 100644 --- a/test/tools/libtesteth/BlockChainHelper.cpp +++ b/test/tools/libtesteth/BlockChainHelper.cpp @@ -21,7 +21,7 @@ * that manage block/transaction import and test mining */ -#include +#include #include #include diff --git a/test/tools/libtesteth/TestOutputHelper.cpp b/test/tools/libtesteth/TestOutputHelper.cpp index 54444cfd0..745896c64 100644 --- a/test/tools/libtesteth/TestOutputHelper.cpp +++ b/test/tools/libtesteth/TestOutputHelper.cpp @@ -20,7 +20,7 @@ * Fixture class for boost output when running testeth */ -#include +#include #include #include #include diff --git a/test/unittests/libethereum/PrecompiledTest.cpp b/test/unittests/libethereum/PrecompiledTest.cpp index 20498f3d9..bec328e70 100644 --- a/test/unittests/libethereum/PrecompiledTest.cpp +++ b/test/unittests/libethereum/PrecompiledTest.cpp @@ -32,8 +32,7 @@ #include #include #include -#include -#include +#include #include diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index e10299d1e..2642fd6ce 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -289,6 +289,7 @@ struct JsonRpcFixture : public TestOutputHelperFixture { // 615 + 1430 is experimentally-derived block size + average extras size chainParams.sChain.dbStorageLimit = 320.5*( 615 + 1430 ); chainParams.sChain._patchTimestamps["ContractStoragePatch"] = 1; + chainParams.sChain._patchTimestamps["StorageDestructionPatch"] = 1; powPatchActivationTimestamp = time(nullptr) + 60; chainParams.sChain._patchTimestamps["CorrectForkInPowPatch"] = powPatchActivationTimestamp; // 10 guessed seconds chainParams.sChain.emptyBlockIntervalMs = _emptyBlockIntervalMs; From e8f7cdd05a3ecf64605f799413f0fdd5bbd1fa57 Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Mon, 4 Mar 2024 12:24:36 +0000 Subject: [PATCH 028/154] SKALED-1583 Remove some patch files --- libethcore/ChainOperationParams.cpp | 2 +- libethereum/Client.cpp | 3 -- libethereum/SchainPatch.cpp | 10 +++++- libethereum/SchainPatch.h | 3 ++ libethereum/SkaleHost.cpp | 4 +-- libevm/LegacyVM.cpp | 2 +- libskale/CMakeLists.txt | 3 -- libskale/ContractStorageZeroValuePatch.cpp | 11 ------ libskale/ContractStorageZeroValuePatch.h | 39 ---------------------- libskale/OverlayDB.cpp | 2 +- libskale/PushZeroPatch.cpp | 20 ----------- libskale/PushZeroPatch.h | 30 ----------------- libskale/SkipInvalidTransactionsPatch.cpp | 26 ++++++++++----- libskale/SkipInvalidTransactionsPatch.h | 34 +------------------ libskale/VerifyDaSigsPatch.cpp | 14 -------- libskale/VerifyDaSigsPatch.h | 38 --------------------- 16 files changed, 35 insertions(+), 206 deletions(-) delete mode 100644 libskale/ContractStorageZeroValuePatch.cpp delete mode 100644 libskale/ContractStorageZeroValuePatch.h delete mode 100644 libskale/PushZeroPatch.cpp delete mode 100644 libskale/PushZeroPatch.h delete mode 100644 libskale/VerifyDaSigsPatch.cpp delete mode 100644 libskale/VerifyDaSigsPatch.h diff --git a/libethcore/ChainOperationParams.cpp b/libethcore/ChainOperationParams.cpp index cc4f630b3..6a7f55a36 100644 --- a/libethcore/ChainOperationParams.cpp +++ b/libethcore/ChainOperationParams.cpp @@ -23,7 +23,7 @@ #include "ChainOperationParams.h" -#include +#include #include #include diff --git a/libethereum/Client.cpp b/libethereum/Client.cpp index 58bfd5a7d..8fc6c0b4f 100644 --- a/libethereum/Client.cpp +++ b/libethereum/Client.cpp @@ -55,7 +55,6 @@ #include #include -#include #include #include @@ -153,8 +152,6 @@ Client::Client( ChainParams const& _params, int _networkID, TotalStorageUsedPatch::g_client = this; ContractStorageLimitPatch::setTimestamp( chainParams().sChain.getPatchTimestamp( "ContractStoragePatch" ) ); - VerifyDaSigsPatch::setTimestamp( - chainParams().sChain.getPatchTimestamp( "VerifyDaSigsPatch" ) ); } diff --git a/libethereum/SchainPatch.cpp b/libethereum/SchainPatch.cpp index 0b7a1e9c0..7b2dbe493 100644 --- a/libethereum/SchainPatch.cpp +++ b/libethereum/SchainPatch.cpp @@ -1,6 +1,8 @@ #include "SchainPatch.h" -dev::eth::ChainOperationParams SchainPatch::chainParams; +using namespace dev::eth; + +ChainOperationParams SchainPatch::chainParams; time_t SchainPatch::committedBlockTimestamp; void SchainPatch::init( const dev::eth::ChainOperationParams& _cp ) { @@ -10,3 +12,9 @@ void SchainPatch::init( const dev::eth::ChainOperationParams& _cp ) { void SchainPatch::useLatestBlockTimestamp( time_t _timestamp ) { committedBlockTimestamp = _timestamp; } + +EVMSchedule PushZeroPatch::makeSchedule( const EVMSchedule& _base ) { + EVMSchedule ret = _base; + ret.havePush0 = true; + return ret; +} diff --git a/libethereum/SchainPatch.h b/libethereum/SchainPatch.h index 60939fed4..fd4a29370 100644 --- a/libethereum/SchainPatch.h +++ b/libethereum/SchainPatch.h @@ -79,5 +79,8 @@ DEFINE_SIMPLE_PATCH( RevertableFSPatch ) DEFINE_AMNESIC_PATCH( PrecompiledConfigPatch ) DEFINE_SIMPLE_PATCH( POWCheckPatch ) DEFINE_SIMPLE_PATCH( CorrectForkInPowPatch ) +DEFINE_AMNESIC_PATCH( ContractStorageZeroValuePatch ) +DEFINE_EVM_PATCH( PushZeroPatch ) +DEFINE_SIMPLE_PATCH( VerifyDaSigsPatch ) #endif // SCHAINPATCH_H diff --git a/libethereum/SkaleHost.cpp b/libethereum/SkaleHost.cpp index d29974572..3fa131ffe 100644 --- a/libethereum/SkaleHost.cpp +++ b/libethereum/SkaleHost.cpp @@ -47,7 +47,6 @@ using namespace std; #include #include #include -#include #include @@ -81,8 +80,7 @@ std::unique_ptr< ConsensusInterface > DefaultConsensusFactory::create( std::map< std::string, std::uint64_t > patchTimeStamps; patchTimeStamps["verifyDaSigsPatchTimestamp"] = - VerifyDaSigsPatch::getVerifyDaSigsPatchTimestamp(); - + m_client.chainParams().getPatchTimestamp( "VerifyDaSigsPatch" ); auto consensus_engine_ptr = make_unique< ConsensusEngine >( _extFace, m_client.number(), ts, 0, patchTimeStamps, m_client.chainParams().sChain.consensusStorageLimit ); diff --git a/libevm/LegacyVM.cpp b/libevm/LegacyVM.cpp index fef0bad62..bb13db400 100644 --- a/libevm/LegacyVM.cpp +++ b/libevm/LegacyVM.cpp @@ -16,7 +16,7 @@ */ #include "LegacyVM.h" -#include "libskale/PushZeroPatch.h" +#include using namespace std; using namespace dev; diff --git a/libskale/CMakeLists.txt b/libskale/CMakeLists.txt index c0bd17791..835cf5f84 100644 --- a/libskale/CMakeLists.txt +++ b/libskale/CMakeLists.txt @@ -13,12 +13,9 @@ set(sources UnsafeRegion.cpp TotalStorageUsedPatch.cpp ContractStorageLimitPatch.cpp - ContractStorageZeroValuePatch.cpp - VerifyDaSigsPatch.cpp AmsterdamFixPatch.cpp OverlayFS.cpp StorageDestructionPatch.cpp - PushZeroPatch.cpp SkipInvalidTransactionsPatch.cpp ) diff --git a/libskale/ContractStorageZeroValuePatch.cpp b/libskale/ContractStorageZeroValuePatch.cpp deleted file mode 100644 index 43f768b88..000000000 --- a/libskale/ContractStorageZeroValuePatch.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include "ContractStorageZeroValuePatch.h" - -// time_t ContractStorageZeroValuePatch::contractStorageZeroValuePatchTimestamp = 0; -// time_t ContractStorageZeroValuePatch::lastBlockTimestamp = 0; - -// bool ContractStorageZeroValuePatch::isEnabled() { -// if ( contractStorageZeroValuePatchTimestamp == 0 ) { -// return false; -// } -// return contractStorageZeroValuePatchTimestamp <= lastBlockTimestamp; -//} diff --git a/libskale/ContractStorageZeroValuePatch.h b/libskale/ContractStorageZeroValuePatch.h deleted file mode 100644 index 9300100f4..000000000 --- a/libskale/ContractStorageZeroValuePatch.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef CONTRACTSTORAGEZEROVALUEPATCH_H -#define CONTRACTSTORAGEZEROVALUEPATCH_H - -#include - -#include - -namespace dev { -namespace eth { -class Client; -} -} // namespace dev - -/* - * Context: contractStorageUsed counter didn't work well in one case - * Solution: we fixed the bug and added new config field introudceChangesTimestamp - * Purpose: avoid incorrect txn behaviour - * Version introduced: - * -class ContractStorageZeroValuePatch : public SchainPatch { -public: - static bool isEnabled(); - - static void setTimestamp( time_t _timeStamp ) { - printInfo( __FILE__, _timeStamp ); - contractStorageZeroValuePatchTimestamp = _timeStamp; - } - - -private: - friend class dev::eth::Client; - static time_t contractStorageZeroValuePatchTimestamp; - static time_t lastBlockTimestamp; -}; -*/ - -DEFINE_AMNESIC_PATCH( ContractStorageZeroValuePatch ) - -#endif // CONTRACTSTORAGEZEROVALUYEPATCH_H diff --git a/libskale/OverlayDB.cpp b/libskale/OverlayDB.cpp index efd12b0e2..40456b9bd 100644 --- a/libskale/OverlayDB.cpp +++ b/libskale/OverlayDB.cpp @@ -23,8 +23,8 @@ */ #include "OverlayDB.h" -#include "ContractStorageZeroValuePatch.h" #include "libhistoric/HistoricState.h" +#include #include diff --git a/libskale/PushZeroPatch.cpp b/libskale/PushZeroPatch.cpp deleted file mode 100644 index d3eb99302..000000000 --- a/libskale/PushZeroPatch.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include "PushZeroPatch.h" -/* -time_t PushZeroPatch::pushZeroPatchTimestamp; -time_t PushZeroPatch::lastBlockTimestamp; - -bool PushZeroPatch::isEnabled() { - if ( pushZeroPatchTimestamp == 0 ) { - return false; - } - return pushZeroPatchTimestamp <= lastBlockTimestamp; -} -*/ - -using namespace dev::eth; - -EVMSchedule PushZeroPatch::makeSchedule( const EVMSchedule& _base ) { - EVMSchedule ret = _base; - ret.havePush0 = true; - return ret; -} diff --git a/libskale/PushZeroPatch.h b/libskale/PushZeroPatch.h deleted file mode 100644 index d80b22044..000000000 --- a/libskale/PushZeroPatch.h +++ /dev/null @@ -1,30 +0,0 @@ -#include -#include - -namespace dev { -namespace eth { -class Client; -} -} // namespace dev - -/* - * Context: enable effective storage destruction - * -class PushZeroPatch : public SchainPatch { -public: - static bool isEnabled(); - - static void setTimestamp( time_t _timeStamp ) { - printInfo( __FILE__, _timeStamp ); - pushZeroPatchTimestamp = _timeStamp; - } - - -private: - friend class dev::eth::Client; - static time_t pushZeroPatchTimestamp; - static time_t lastBlockTimestamp; -}; -*/ - -DEFINE_EVM_PATCH( PushZeroPatch ) diff --git a/libskale/SkipInvalidTransactionsPatch.cpp b/libskale/SkipInvalidTransactionsPatch.cpp index a07e816bb..b34efeeb0 100644 --- a/libskale/SkipInvalidTransactionsPatch.cpp +++ b/libskale/SkipInvalidTransactionsPatch.cpp @@ -2,11 +2,21 @@ using namespace dev::eth; -// time_t SkipInvalidTransactionsPatch::activationTimestamp; -// time_t SkipInvalidTransactionsPatch::lastBlockTimestamp; - -// bool SkipInvalidTransactionsPatch::isEnabled() { -// if ( activationTimestamp == 0 ) -// return false; -// return lastBlockTimestamp >= activationTimestamp; -//} +bool SkipInvalidTransactionsPatch::hasPotentialInvalidTransactionsInBlock( + dev::eth::BlockNumber _bn, const dev::eth::BlockChain& _bc ) { + if ( _bn == 0 ) + return false; + + time_t activationTimestamp = _bc.chainParams().getPatchTimestamp( getName() ); + + if ( activationTimestamp == 0 ) + return true; + + if ( _bn == dev::eth::PendingBlock ) + return !isEnabled( _bc ); + + if ( _bn == dev::eth::LatestBlock ) + _bn = _bc.number(); + + return !isEnabled( _bc, _bn ); +} diff --git a/libskale/SkipInvalidTransactionsPatch.h b/libskale/SkipInvalidTransactionsPatch.h index b450e95b4..c38f8f215 100644 --- a/libskale/SkipInvalidTransactionsPatch.h +++ b/libskale/SkipInvalidTransactionsPatch.h @@ -32,22 +32,6 @@ class Client; // Transactions are removed from Transaction Queue as usually. // TODO better start to apply patches from 1st block after timestamp, not second -// class SkipInvalidTransactionsPatch : public SchainPatch { -// public: -// static bool isEnabled(); - -// static void setTimestamp( time_t _activationTimestamp ) { -// activationTimestamp = _activationTimestamp; -// printInfo( __FILE__, _activationTimestamp ); -// } - -// static time_t getActivationTimestamp() { return activationTimestamp; } - -// private: -// friend class dev::eth::Client; -// static time_t activationTimestamp; -// static time_t lastBlockTimestamp; -//}; class SkipInvalidTransactionsPatch : public SchainPatch { public: @@ -66,23 +50,7 @@ class SkipInvalidTransactionsPatch : public SchainPatch { // returns false if this block was created with SkipInvalidTransactionsPatch and they were // skipped static bool hasPotentialInvalidTransactionsInBlock( - dev::eth::BlockNumber _bn, const dev::eth::BlockChain& _bc ) { - if ( _bn == 0 ) - return false; - - time_t activationTimestamp = _bc.chainParams().getPatchTimestamp( getName() ); - - if ( activationTimestamp == 0 ) - return true; - - if ( _bn == dev::eth::PendingBlock ) - return !isEnabled( _bc ); - - if ( _bn == dev::eth::LatestBlock ) - _bn = _bc.number(); - - return !isEnabled( _bc, _bn ); - } + dev::eth::BlockNumber _bn, const dev::eth::BlockChain& _bc ); }; #endif // SKIPINVALIDTRANSACTIONSPATCH_H diff --git a/libskale/VerifyDaSigsPatch.cpp b/libskale/VerifyDaSigsPatch.cpp deleted file mode 100644 index c8cf7a905..000000000 --- a/libskale/VerifyDaSigsPatch.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "VerifyDaSigsPatch.h" - -time_t VerifyDaSigsPatch::verifyDaSigsPatchTimestamp = 0; -time_t VerifyDaSigsPatch::lastBlockTimestamp = 0; - -bool VerifyDaSigsPatch::isEnabled() { - if ( verifyDaSigsPatchTimestamp == 0 ) { - return false; - } - return verifyDaSigsPatchTimestamp <= lastBlockTimestamp; -} -time_t VerifyDaSigsPatch::getVerifyDaSigsPatchTimestamp() { - return verifyDaSigsPatchTimestamp; -} diff --git a/libskale/VerifyDaSigsPatch.h b/libskale/VerifyDaSigsPatch.h deleted file mode 100644 index 426412507..000000000 --- a/libskale/VerifyDaSigsPatch.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef VERIFYDASIGSPATCH_H -#define VERIFYDASIDSPATCH_H - -#include - -#include - -namespace dev { -namespace eth { -class Client; -} -} // namespace dev - -/* - * Context: contractStorageUsed counter didn't work well in one case - * Solution: we fixed the bug and added new config field introudceChangesTimestamp - * Purpose: avoid incorrect txn behaviour - * Version introduced: - */ -class VerifyDaSigsPatch : public SchainPatch { -public: - static bool isEnabled(); - -private: - friend class dev::eth::Client; - static time_t verifyDaSigsPatchTimestamp; - static time_t lastBlockTimestamp; - - static void setTimestamp( time_t _timeStamp ) { - printInfo( __FILE__, _timeStamp ); - verifyDaSigsPatchTimestamp = _timeStamp; - } - -public: - static time_t getVerifyDaSigsPatchTimestamp(); -}; - -#endif \ No newline at end of file From 668be4236264580dc79b137053bd738eb302960f Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Mon, 4 Mar 2024 13:52:51 +0000 Subject: [PATCH 029/154] SKALED-1583 One more patch --- libethereum/Client.cpp | 14 --------- libethereum/SchainPatch.h | 1 + libskale/CMakeLists.txt | 2 -- libskale/ContractStorageLimitPatch.cpp | 11 ------- libskale/ContractStorageLimitPatch.h | 35 ----------------------- libskale/State.cpp | 6 ++-- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 2 +- 7 files changed, 4 insertions(+), 67 deletions(-) delete mode 100644 libskale/ContractStorageLimitPatch.cpp delete mode 100644 libskale/ContractStorageLimitPatch.h diff --git a/libethereum/Client.cpp b/libethereum/Client.cpp index 8fc6c0b4f..46da9357c 100644 --- a/libethereum/Client.cpp +++ b/libethereum/Client.cpp @@ -50,7 +50,6 @@ #endif #include -#include #include #include @@ -150,8 +149,6 @@ Client::Client( ChainParams const& _params, int _networkID, // Set timestamps for patches TotalStorageUsedPatch::g_client = this; - ContractStorageLimitPatch::setTimestamp( - chainParams().sChain.getPatchTimestamp( "ContractStoragePatch" ) ); } @@ -648,17 +645,6 @@ size_t Client::syncTransactions( TransactionReceipts newPendingReceipts; unsigned goodReceipts; - ContractStorageLimitPatch::lastBlockTimestamp = blockChain().info().timestamp(); - // ContractStorageZeroValuePatch::lastBlockTimestamp = blockChain().info().timestamp(); - // RevertableFSPatch::lastBlockTimestamp = blockChain().info().timestamp(); - // StorageDestructionPatch::lastBlockTimestamp = blockChain().info().timestamp(); - // POWCheckPatch::lastBlockTimestamp = blockChain().info().timestamp(); - // PushZeroPatch::lastBlockTimestamp = blockChain().info().timestamp(); - // SkipInvalidTransactionsPatch::lastBlockTimestamp = blockChain().info().timestamp(); - // PrecompiledConfigPatch::lastBlockTimestamp = blockChain().info().timestamp(); - // CorrectForkInPowPatch::lastBlockTimestamp = blockChain().info().timestamp(); - - DEV_WRITE_GUARDED( x_working ) { assert( !m_working.isSealed() ); diff --git a/libethereum/SchainPatch.h b/libethereum/SchainPatch.h index fd4a29370..3bd43289e 100644 --- a/libethereum/SchainPatch.h +++ b/libethereum/SchainPatch.h @@ -82,5 +82,6 @@ DEFINE_SIMPLE_PATCH( CorrectForkInPowPatch ) DEFINE_AMNESIC_PATCH( ContractStorageZeroValuePatch ) DEFINE_EVM_PATCH( PushZeroPatch ) DEFINE_SIMPLE_PATCH( VerifyDaSigsPatch ) +DEFINE_AMNESIC_PATCH( ContractStorageLimitPatch ) #endif // SCHAINPATCH_H diff --git a/libskale/CMakeLists.txt b/libskale/CMakeLists.txt index 835cf5f84..f3321833b 100644 --- a/libskale/CMakeLists.txt +++ b/libskale/CMakeLists.txt @@ -12,7 +12,6 @@ set(sources SnapshotHashAgent.cpp UnsafeRegion.cpp TotalStorageUsedPatch.cpp - ContractStorageLimitPatch.cpp AmsterdamFixPatch.cpp OverlayFS.cpp StorageDestructionPatch.cpp @@ -31,7 +30,6 @@ set(headers SnapshotHashAgent.h UnsafeRegion.h TotalStorageUsedPatch.h - ContractStorageLimitPatch.h AmsterdamFixPatch.h OverlayFS.h SkipInvalidTransactionsPatch.h diff --git a/libskale/ContractStorageLimitPatch.cpp b/libskale/ContractStorageLimitPatch.cpp deleted file mode 100644 index 3e15ef1cc..000000000 --- a/libskale/ContractStorageLimitPatch.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include "ContractStorageLimitPatch.h" - -time_t ContractStorageLimitPatch::contractStoragePatchTimestamp; -time_t ContractStorageLimitPatch::lastBlockTimestamp; - -bool ContractStorageLimitPatch::isEnabled() { - if ( contractStoragePatchTimestamp == 0 ) { - return false; - } - return contractStoragePatchTimestamp <= lastBlockTimestamp; -} diff --git a/libskale/ContractStorageLimitPatch.h b/libskale/ContractStorageLimitPatch.h deleted file mode 100644 index f7442b572..000000000 --- a/libskale/ContractStorageLimitPatch.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef CONTRACTSTORAGELIMITPATCH_H -#define CONTRACTSTORAGELIMITPATCH_H - -#include - -#include - -namespace dev { -namespace eth { -class Client; -} -} // namespace dev - -/* - * Context: contractStorageUsed counter didn't work well in one case - * Solution: we fixed the bug and added new config field introudceChangesTimestamp - * Purpose: avoid incorrect txn behaviour - * Version introduced: - */ -class ContractStorageLimitPatch : public SchainPatch { -public: - static bool isEnabled(); - - static void setTimestamp( time_t _timeStamp ) { - printInfo( __FILE__, _timeStamp ); - contractStoragePatchTimestamp = _timeStamp; - } - -private: - friend class dev::eth::Client; - static time_t contractStoragePatchTimestamp; - static time_t lastBlockTimestamp; -}; - -#endif // CONTRACTSTORAGELIMITPATCH_H diff --git a/libskale/State.cpp b/libskale/State.cpp index a05d5b082..e18cc9b96 100644 --- a/libskale/State.cpp +++ b/libskale/State.cpp @@ -36,8 +36,6 @@ #include #include -#include "ContractStorageLimitPatch.h" - #include "libweb3jsonrpc/Eth.h" #include "libweb3jsonrpc/JsonHelper.h" @@ -895,7 +893,7 @@ void State::rollback( size_t _savepoint ) { // change log entry. switch ( change.kind ) { case Change::Storage: - if ( ContractStorageLimitPatch::isEnabled() ) { + if ( ContractStorageLimitPatch::isEnabledInPendingBlock() ) { rollbackStorageChange( change, account ); } else { account.setStorage( change.key, change.value ); @@ -924,7 +922,7 @@ void State::rollback( size_t _savepoint ) { m_changeLog.pop_back(); } clearFileStorageCache(); - if ( !ContractStorageLimitPatch::isEnabled() ) { + if ( !ContractStorageLimitPatch::isEnabledInPendingBlock() ) { resetStorageChanges(); } } diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index 2642fd6ce..ef0e2bb61 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -288,7 +288,7 @@ struct JsonRpcFixture : public TestOutputHelperFixture { chainParams.sChain.contractStorageLimit = 128; // 615 + 1430 is experimentally-derived block size + average extras size chainParams.sChain.dbStorageLimit = 320.5*( 615 + 1430 ); - chainParams.sChain._patchTimestamps["ContractStoragePatch"] = 1; + chainParams.sChain._patchTimestamps["ContractStorageLimitPatch"] = 1; chainParams.sChain._patchTimestamps["StorageDestructionPatch"] = 1; powPatchActivationTimestamp = time(nullptr) + 60; chainParams.sChain._patchTimestamps["CorrectForkInPowPatch"] = powPatchActivationTimestamp; // 10 guessed seconds From 3260e7027ea2c7a44e796049fe557e77361891b4 Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Mon, 4 Mar 2024 19:36:27 +0000 Subject: [PATCH 030/154] SKALED-1583 Fix tests, but not all --- libethcore/ChainOperationParams.h | 11 ----------- libethereum/SchainPatch.h | 2 +- test/unittests/libethereum/SkaleHost.cpp | 2 +- test/unittests/libevm/VMTest.cpp | 19 ++++++++++++++----- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 2 +- 5 files changed, 17 insertions(+), 19 deletions(-) diff --git a/libethcore/ChainOperationParams.h b/libethcore/ChainOperationParams.h index 930acb8de..a12bdd672 100644 --- a/libethcore/ChainOperationParams.h +++ b/libethcore/ChainOperationParams.h @@ -181,17 +181,6 @@ struct SChain { } // catch } - // time_t revertableFSPatchTimestamp = 0; - // time_t contractStoragePatchTimestamp = 0; - // time_t contractStorageZeroValuePatchTimestamp = 0; - // time_t verifyDaSigsPatchTimestamp = 0; - // time_t storageDestructionPatchTimestamp = 0; - // time_t powCheckPatchTimestamp = 0; - // time_t precompiledConfigPatchTimestamp = 0; - // time_t pushZeroPatchTimestamp = 0; - // time_t skipInvalidTransactionsPatchTimestamp = 0; - // time_t correctForkInPowPatchTimestamp = 0; - SChain() { name = "TestChain"; id = 1; diff --git a/libethereum/SchainPatch.h b/libethereum/SchainPatch.h index 3bd43289e..93d227b64 100644 --- a/libethereum/SchainPatch.h +++ b/libethereum/SchainPatch.h @@ -70,7 +70,7 @@ class SchainPatch { } \ static bool isEnabledWhen( time_t _committedBlockTimestamp ) { \ time_t my_timestamp = chainParams.getPatchTimestamp( getName() ); \ - return _committedBlockTimestamp >= my_timestamp; \ + return my_timestamp != 0 && _committedBlockTimestamp >= my_timestamp; \ } \ static dev::eth::EVMSchedule makeSchedule( const dev::eth::EVMSchedule& base ); \ }; diff --git a/test/unittests/libethereum/SkaleHost.cpp b/test/unittests/libethereum/SkaleHost.cpp index b32bf8afb..131e7daf1 100644 --- a/test/unittests/libethereum/SkaleHost.cpp +++ b/test/unittests/libethereum/SkaleHost.cpp @@ -138,7 +138,7 @@ struct SkaleHostFixture : public TestOutputHelperFixture { if( params.count("multiTransactionMode") && stoi( params.at( "multiTransactionMode" ) ) ) chainParams.sChain.multiTransactionMode = true; if( params.count("skipInvalidTransactionsPatchTimestamp") && stoi( params.at( "skipInvalidTransactionsPatchTimestamp" ) ) ) - chainParams.sChain._patchTimestamps["SkipInvalidTransactionsPatch"] = 1; + chainParams.sChain._patchTimestamps["SkipInvalidTransactionsPatch"] = stoi( params.at( "skipInvalidTransactionsPatchTimestamp" ) ); accountHolder.reset( new FixedAccountHolder( [&]() { return client.get(); }, {} ) ); accountHolder->setAccounts( {coinbase, account2} ); diff --git a/test/unittests/libevm/VMTest.cpp b/test/unittests/libevm/VMTest.cpp index d713dc25a..91c9e3482 100644 --- a/test/unittests/libevm/VMTest.cpp +++ b/test/unittests/libevm/VMTest.cpp @@ -17,6 +17,7 @@ along with cpp-ethereum. If not, see . */ +#include #include #include #include @@ -650,13 +651,22 @@ class BalanceFixture : public TestOutputHelperFixture { class InstructionTestFixture : public TestOutputHelperFixture { public: - InstructionTestFixture() : vm{new LegacyVM()} { state.addBalance( address, 1 * ether ); } + InstructionTestFixture() : vm{new LegacyVM()} { + ChainParams cp( genesisInfo( Network::IstanbulTest ) ); + cp.sChain._patchTimestamps["PushZeroPatch"] = 1; + SchainPatch::init(cp); + + se.reset(cp.createSealEngine()); + envInfo = std::make_unique ( blockHeader, lastBlockHashes, 1, 0, cp.chainID ); + + state.addBalance( address, 1 * ether ); + } void testCode( std::string const& _codeStr ) { bytes const code = fromHex( _codeStr ); - ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, {}, + ExtVM extVm( state, *envInfo, se->chainParams(), address, address, address, value, gasPrice, {}, ref( code ), sha3( code ), version, depth, isCreate, staticCall ); owning_bytes_ref ret = vm->exec( gas, extVm, OnOpFunc{} ); @@ -666,9 +676,8 @@ class InstructionTestFixture : public TestOutputHelperFixture { LastBlockHashes lastBlockHashes; Address address{KeyPair::create().address()}; State state{0}; - std::unique_ptr< SealEngineFace > se{ - ChainParams( genesisInfo( Network::IstanbulTest ) ).createSealEngine()}; - EnvInfo envInfo{blockHeader, lastBlockHashes, 1, 0, se->chainParams().chainID}; + std::unique_ptr< SealEngineFace > se; + std::unique_ptr envInfo; u256 value = 0; u256 gasPrice = 1; diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index ef0e2bb61..e869740c0 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -3346,7 +3346,7 @@ BOOST_AUTO_TEST_CASE( cached_filestorage ) { auto _config = c_genesisConfigString; Json::Value ret; Json::Reader().parse( _config, ret ); - ret["skaleConfig"]["sChain"]["revertableFSPatchTimestamp"] = 1; + ret["skaleConfig"]["sChain"]["revertableFSPatchTimestamp"] = 1; Json::FastWriter fastWriter; std::string config = fastWriter.write( ret ); RestrictedAddressFixture fixture( config ); From 82ccc7d477fbec4f86b192b26bbf9547e9d1bff0 Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Tue, 5 Mar 2024 17:46:26 +0000 Subject: [PATCH 031/154] SKALED-1583 Add log and modularize code a little --- libethereum/SchainPatch.cpp | 3 +++ libethereum/SchainPatch.h | 28 ++++++++++++++++++---------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/libethereum/SchainPatch.cpp b/libethereum/SchainPatch.cpp index 7b2dbe493..ed593c3c7 100644 --- a/libethereum/SchainPatch.cpp +++ b/libethereum/SchainPatch.cpp @@ -7,6 +7,9 @@ time_t SchainPatch::committedBlockTimestamp; void SchainPatch::init( const dev::eth::ChainOperationParams& _cp ) { chainParams = _cp; + for ( const auto& it : _cp.sChain._patchTimestamps ) { + printInfo( it.first, it.second ); + } } void SchainPatch::useLatestBlockTimestamp( time_t _timestamp ) { diff --git a/libethereum/SchainPatch.h b/libethereum/SchainPatch.h index 93d227b64..9abd2e4d5 100644 --- a/libethereum/SchainPatch.h +++ b/libethereum/SchainPatch.h @@ -18,6 +18,10 @@ class EVMSchedule; class SchainPatch { public: + static void init( const dev::eth::ChainOperationParams& _cp ); + static void useLatestBlockTimestamp( time_t _timestamp ); + +protected: static void printInfo( const std::string& _patchName, time_t _timeStamp ) { if ( _timeStamp == 0 ) { cnote << "Patch " << _patchName << " is disabled"; @@ -25,8 +29,16 @@ class SchainPatch { cnote << "Patch " << _patchName << " is set at timestamp " << _timeStamp; } } - static void init( const dev::eth::ChainOperationParams& _cp ); - static void useLatestBlockTimestamp( time_t _timestamp ); + static bool isPatchEnabled( const std::string& _patchName, const dev::eth::BlockChain& _bc, + dev::eth::BlockNumber _bn = dev::eth::LatestBlock ) { + time_t timestamp = chainParams.getPatchTimestamp( _patchName ); + return _bc.isPatchTimestampActiveInBlockNumber( timestamp, _bn ); + } + static bool isPatchEnabledWhen( + const std::string& _patchName, time_t _committedBlockTimestamp ) { + time_t activationTimestamp = chainParams.getPatchTimestamp( _patchName ); + return activationTimestamp != 0 && _committedBlockTimestamp >= activationTimestamp; + } protected: static dev::eth::ChainOperationParams chainParams; @@ -50,12 +62,10 @@ class SchainPatch { static std::string getName() { return #BlaBlaPatch; } \ static bool isEnabled( \ const dev::eth::BlockChain& _bc, dev::eth::BlockNumber _bn = dev::eth::LatestBlock ) { \ - time_t timestamp = chainParams.getPatchTimestamp( getName() ); \ - return _bc.isPatchTimestampActiveInBlockNumber( timestamp, _bn ); \ + return isPatchEnabled( getName(), _bc, _bn ); \ } \ static bool isEnabledWhen( time_t _committedBlockTimestamp ) { \ - time_t activationTimestamp = chainParams.getPatchTimestamp( getName() ); \ - return activationTimestamp != 0 && _committedBlockTimestamp >= activationTimestamp; \ + return isPatchEnabledWhen( getName(), _committedBlockTimestamp ); \ } \ }; @@ -65,12 +75,10 @@ class SchainPatch { static std::string getName() { return #BlaBlaPatch; } \ static bool isEnabled( \ const dev::eth::BlockChain& _bc, dev::eth::BlockNumber _bn = dev::eth::LatestBlock ) { \ - time_t timestamp = _bc.chainParams().getPatchTimestamp( getName() ); \ - return _bc.isPatchTimestampActiveInBlockNumber( timestamp, _bn ); \ + return isPatchEnabled( getName(), _bc, _bn ); \ } \ static bool isEnabledWhen( time_t _committedBlockTimestamp ) { \ - time_t my_timestamp = chainParams.getPatchTimestamp( getName() ); \ - return my_timestamp != 0 && _committedBlockTimestamp >= my_timestamp; \ + return isPatchEnabledWhen( getName(), _committedBlockTimestamp ); \ } \ static dev::eth::EVMSchedule makeSchedule( const dev::eth::EVMSchedule& base ); \ }; From 5adcf01c07a14903532d867b7cb75cf6f4560656 Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Tue, 5 Mar 2024 20:13:21 +0000 Subject: [PATCH 032/154] SKALED-1583 Add back patches descriptions --- libethereum/SchainPatch.h | 40 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/libethereum/SchainPatch.h b/libethereum/SchainPatch.h index 9abd2e4d5..f72fb7b53 100644 --- a/libethereum/SchainPatch.h +++ b/libethereum/SchainPatch.h @@ -83,13 +83,53 @@ class SchainPatch { static dev::eth::EVMSchedule makeSchedule( const dev::eth::EVMSchedule& base ); \ }; +/* + * Context: enable revertable filestorage precompileds + */ DEFINE_SIMPLE_PATCH( RevertableFSPatch ) + +/* + * Context: enable precompiled contracts to read historical config data + */ DEFINE_AMNESIC_PATCH( PrecompiledConfigPatch ) + +/* + * Context: enable fix for POW txns gas limit check + */ DEFINE_SIMPLE_PATCH( POWCheckPatch ) + +/* + * Context: use current, and not Constantinople, fork in Transaction::checkOutExternalGas() + */ DEFINE_SIMPLE_PATCH( CorrectForkInPowPatch ) + +/* + * Context: contractStorageUsed counter didn't work well in one case + * Solution: we fixed the bug and added new config field introudceChangesTimestamp + * Purpose: avoid incorrect txn behaviour + * Version introduced: + */ DEFINE_AMNESIC_PATCH( ContractStorageZeroValuePatch ) + +/* + * Context: enable effective storage destruction + */ DEFINE_EVM_PATCH( PushZeroPatch ) + +/* + * Context: contractStorageUsed counter didn't work well in one case + * Solution: we fixed the bug and added new config field introudceChangesTimestamp + * Purpose: avoid incorrect txn behaviour + * Version introduced: + */ DEFINE_SIMPLE_PATCH( VerifyDaSigsPatch ) + +/* + * Context: contractStorageUsed counter didn't work well in one case + * Solution: we fixed the bug and added new config field introudceChangesTimestamp + * Purpose: avoid incorrect txn behaviour + * Version introduced: + */ DEFINE_AMNESIC_PATCH( ContractStorageLimitPatch ) #endif // SCHAINPATCH_H From 59156559ef0afb30a12951371a13455a29c7ddae Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Thu, 7 Mar 2024 21:40:22 +0000 Subject: [PATCH 033/154] SKALED-1583 Small beautifying and introduction of enum --- libdevcore/JsonUtils.cpp | 5 +- libdevcore/JsonUtils.h | 8 ++- libethcore/ChainOperationParams.cpp | 16 ++++-- libethcore/ChainOperationParams.h | 18 +++---- libethcore/SealEngine.cpp | 6 +-- libethereum/CMakeLists.txt | 3 +- libethereum/ChainParams.cpp | 21 ++++---- libethereum/ClientBase.cpp | 2 +- libethereum/Executive.cpp | 2 +- libethereum/ExtVM.h | 4 +- libethereum/SchainPatch.cpp | 63 +++++++++++++++++++++-- libethereum/SchainPatch.h | 63 +++++++++++------------ libethereum/SchainPatchEnum.h | 25 +++++++++ libethereum/SkaleHost.cpp | 2 +- libethereum/Transaction.cpp | 2 +- libethereum/ValidationSchemes.cpp | 35 +++++++------ libhistoric/AlethExecutive.cpp | 4 +- libhistoric/AlethExtVM.h | 2 +- libskale/CMakeLists.txt | 1 - libskale/SkipInvalidTransactionsPatch.cpp | 2 +- libskale/SkipInvalidTransactionsPatch.h | 5 +- libskale/State.cpp | 6 +-- libskale/StorageDestructionPatch.cpp | 1 - libskale/StorageDestructionPatch.h | 12 ----- test/tools/libtesteth/ImportTest.cpp | 2 +- test/unittests/libethereum/SkaleHost.cpp | 2 +- test/unittests/libevm/VMTest.cpp | 2 +- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 8 +-- 28 files changed, 198 insertions(+), 124 deletions(-) create mode 100644 libethereum/SchainPatchEnum.h delete mode 100644 libskale/StorageDestructionPatch.cpp delete mode 100644 libskale/StorageDestructionPatch.h diff --git a/libdevcore/JsonUtils.cpp b/libdevcore/JsonUtils.cpp index 1a6f96c43..c9e5aecb3 100644 --- a/libdevcore/JsonUtils.cpp +++ b/libdevcore/JsonUtils.cpp @@ -57,10 +57,11 @@ std::string dev::jsonTypeAsString( json_spirit::Value_type _type ) { } void dev::requireJsonFields( json_spirit::mObject const& _o, std::string const& _config, - std::map< std::string, JsonFieldOptions > const& _validationMap ) { + std::map< std::string, JsonFieldOptions > const& _validationMap, + std::function< bool( const std::string& ) > _callbackForUnexpected ) { // check for unexpected fiedls for ( auto const& field : _o ) { - if ( !_validationMap.count( field.first ) ) { + if ( !_validationMap.count( field.first ) && !_callbackForUnexpected( field.first ) ) { std::string const comment = "Unexpected field '" + field.first + "' in config: " + _config; cerror << comment << "\n" diff --git a/libdevcore/JsonUtils.h b/libdevcore/JsonUtils.h index f9bc8dd25..d59365aef 100644 --- a/libdevcore/JsonUtils.h +++ b/libdevcore/JsonUtils.h @@ -41,6 +41,10 @@ using JsonFieldOptions = std::pair< JsonTypeSet, JsonFieldPresence >; @param _validationMap a map with json objects that would be checked. "objName" -> {js::str_type, jsonField::Required} */ -void requireJsonFields( json_spirit::mObject const& _o, std::string const& _configName, - std::map< std::string, JsonFieldOptions > const& _validationMap ); +void requireJsonFields( + json_spirit::mObject const& _o, std::string const& _configName, + std::map< std::string, JsonFieldOptions > const& _validationMap, + std::function< bool( const std::string& ) > _callbackForUnexpected = []( const std::string& ) { + return true; + } ); } // namespace dev diff --git a/libethcore/ChainOperationParams.cpp b/libethcore/ChainOperationParams.cpp index 6a7f55a36..5b8e08a2c 100644 --- a/libethcore/ChainOperationParams.cpp +++ b/libethcore/ChainOperationParams.cpp @@ -45,6 +45,14 @@ PrecompiledContract::PrecompiledContract( unsigned _base, unsigned _word, }, _exec, _startingBlock, _allowedAddresses ) {} +time_t SChain::getPatchTimestamp( SchainPatchEnum _patchEnum ) const { + assert( _patchEnum < SchainPatchEnum::PatchesCount ); + if ( _patchEnum < SchainPatchEnum::PatchesCount ) + return _patchTimestamps[static_cast< size_t >( _patchEnum )]; + else + return 0; +} + ChainOperationParams::ChainOperationParams() : m_blockReward( "0x4563918244F40000" ), minGasLimit( 0x1388 ), @@ -55,7 +63,7 @@ ChainOperationParams::ChainOperationParams() difficultyBoundDivisor( 0x0800 ), durationLimit( 0x0d ) {} -EVMSchedule const ChainOperationParams::evmSchedule( +EVMSchedule const ChainOperationParams::makeEvmSchedule( time_t _committedBlockTimestamp, u256 const& _blockNumber ) const { EVMSchedule result; @@ -93,7 +101,7 @@ u256 ChainOperationParams::blockReward( EVMSchedule const& _schedule ) const { u256 ChainOperationParams::blockReward( time_t _committedBlockTimestamp, u256 const& _blockNumber ) const { - EVMSchedule const& schedule{ evmSchedule( _committedBlockTimestamp, _blockNumber ) }; + EVMSchedule const& schedule{ makeEvmSchedule( _committedBlockTimestamp, _blockNumber ) }; return blockReward( schedule ); } @@ -101,6 +109,6 @@ void ChainOperationParams::setBlockReward( u256 const& _newBlockReward ) { m_blockReward = _newBlockReward; } -time_t ChainOperationParams::getPatchTimestamp( const std::string& _name ) const { - return sChain.getPatchTimestamp( _name ); +time_t ChainOperationParams::getPatchTimestamp( SchainPatchEnum _patchEnum ) const { + return sChain.getPatchTimestamp( _patchEnum ); } diff --git a/libethcore/ChainOperationParams.h b/libethcore/ChainOperationParams.h index a12bdd672..18abcca66 100644 --- a/libethcore/ChainOperationParams.h +++ b/libethcore/ChainOperationParams.h @@ -28,6 +28,7 @@ #include #include +#include #include "libethcore/Common.h" #include "libethcore/EVMSchedule.h" @@ -172,14 +173,9 @@ struct SChain { // key is patch name // public - for tests, don't access it directly - std::map< std::string, time_t > _patchTimestamps; - time_t getPatchTimestamp( const std::string& name ) const { - try { - return _patchTimestamps.at( name ); - } catch ( const std::out_of_range& ) { - return 0; - } // catch - } + std::vector< time_t > _patchTimestamps = + std::vector< time_t >( static_cast< int >( SchainPatchEnum::PatchesCount ) ); + time_t getPatchTimestamp( SchainPatchEnum _patchEnum ) const; SChain() { name = "TestChain"; @@ -207,7 +203,7 @@ struct ChainOperationParams { u256 m_blockReward; public: - EVMSchedule const evmSchedule( + EVMSchedule const makeEvmSchedule( time_t _committedBlockTimestamp, u256 const& _blockNumber ) const; u256 blockReward( EVMSchedule const& _schedule ) const; u256 blockReward( time_t _committedBlockTimestamp, u256 const& _blockNumber ) const; @@ -257,9 +253,7 @@ struct ChainOperationParams { typedef std::vector< std::string > vecAdminOrigins_t; vecAdminOrigins_t vecAdminOrigins; // wildcard based folters for IP addresses - // all fields named "*PatchTimestamp" should be read into array, that would be available to this - // function - time_t getPatchTimestamp( const std::string& _name ) const; + time_t getPatchTimestamp( SchainPatchEnum _patchEnum ) const; bool isPrecompiled( Address const& _a, u256 const& _blockNumber ) const { return precompiled.count( _a ) != 0 && _blockNumber >= precompiled.at( _a ).startingBlock(); diff --git a/libethcore/SealEngine.cpp b/libethcore/SealEngine.cpp index cf5d8fcc9..96b621f0f 100644 --- a/libethcore/SealEngine.cpp +++ b/libethcore/SealEngine.cpp @@ -99,7 +99,7 @@ void SealEngineFace::verifyTransaction( ChainOperationParams const& _chainParams BlockHeader const& _header, u256 const& _gasUsed ) { // verifyTransaction is the only place where TransactionBase is used instead of Transaction. u256 gas; - if ( POWCheckPatch::isEnabledWhen( _committedBlockTimestamp ) ) { + if ( PowCheckPatch::isEnabledWhen( _committedBlockTimestamp ) ) { // new behavior is to use pow-enabled gas gas = _t.gas(); } else { @@ -129,7 +129,7 @@ void SealEngineFace::verifyTransaction( ChainOperationParams const& _chainParams _t.checkLowS(); eth::EVMSchedule const& schedule = - _chainParams.evmSchedule( _committedBlockTimestamp, _header.number() ); + _chainParams.makeEvmSchedule( _committedBlockTimestamp, _header.number() ); // Pre calculate the gas needed for execution if ( ( _ir & ImportRequirements::TransactionBasic ) && _t.baseGasRequired( schedule ) > gas ) @@ -162,7 +162,7 @@ SealEngineFace* SealEngineRegistrar::create( ChainOperationParams const& _params EVMSchedule SealEngineBase::evmSchedule( time_t _committedBlockTimestamp, u256 const& _blockNumber ) const { - return chainParams().evmSchedule( _committedBlockTimestamp, _blockNumber ); + return chainParams().makeEvmSchedule( _committedBlockTimestamp, _blockNumber ); } u256 SealEngineBase::blockReward( diff --git a/libethereum/CMakeLists.txt b/libethereum/CMakeLists.txt index 1f5ae78e1..0f849fd87 100644 --- a/libethereum/CMakeLists.txt +++ b/libethereum/CMakeLists.txt @@ -1,6 +1,7 @@ file( GLOB sources "*.cpp" "*.h" ) -add_library( ethereum ${sources} InstanceMonitor.cpp InstanceMonitor.h) +add_library( ethereum ${sources} InstanceMonitor.cpp InstanceMonitor.h + SchainPatchEnum.h) target_compile_options( ethereum PRIVATE -Wno-error=deprecated-copy -Wno-error=unused-result -Wno-error=unused-parameter -Wno-error=unused-variable -Wno-error=maybe-uninitialized diff --git a/libethereum/ChainParams.cpp b/libethereum/ChainParams.cpp index ba1bd575e..868566573 100644 --- a/libethereum/ChainParams.cpp +++ b/libethereum/ChainParams.cpp @@ -39,11 +39,12 @@ #include #include "Account.h" -#include "GenesisInfo.h" #include "ValidationSchemes.h" #include +#include + using namespace std; using namespace dev; using namespace eth; @@ -242,19 +243,15 @@ ChainParams ChainParams::loadConfig( // extract all "*PatchTimestamp" records for ( const auto& it : sChainObj ) { - const string suffix = "PatchTimestamp"; const string& key = it.first; - if ( key.find( suffix ) == key.size() - suffix.size() ) { - string patchName = key.substr( 0, key.size() - string( "Timestamp" ).size() ); + if ( boost::algorithm::ends_with( key, "PatchTimestamp" ) ) { + string patchName = boost::algorithm::erase_last_copy( key, "Timestamp" ); patchName[0] = toupper( patchName[0] ); - s._patchTimestamps[patchName] = it.second.get_int64(); - } // if - } // for - - // HACK Some names are non-standard - s._patchTimestamps["ContractStorageLimitPatch"] = - s.getPatchTimestamp( "ContractStoragePatch" ); - s._patchTimestamps["POWCheckPatch"] = s.getPatchTimestamp( "PowCheckPatch" ); + SchainPatchEnum patchEnum = getEnumForPatchName( patchName ); + s._patchTimestamps[static_cast< size_t >( patchEnum )] = + it.second.get_int64(); // time_t is signed + } // if + } // for if ( sChainObj.count( "nodeGroups" ) ) { std::vector< NodeGroup > nodeGroups; diff --git a/libethereum/ClientBase.cpp b/libethereum/ClientBase.cpp index f82486b40..905504225 100644 --- a/libethereum/ClientBase.cpp +++ b/libethereum/ClientBase.cpp @@ -119,7 +119,7 @@ std::pair< u256, ExecutionResult > ClientBase::estimateGas( Address const& _from upperBound = c_maxGasEstimate; int64_t lowerBound = CorrectForkInPowPatch::isEnabled( bc() ) ? Transaction::baseGasRequired( !_dest, &_data, - bc().sealEngine()->chainParams().evmSchedule( + bc().sealEngine()->chainParams().makeEvmSchedule( bc().info().timestamp(), bc().number() ) ) : Transaction::baseGasRequired( !_dest, &_data, EVMSchedule() ); diff --git a/libethereum/Executive.cpp b/libethereum/Executive.cpp index 22804c65c..70a945efc 100644 --- a/libethereum/Executive.cpp +++ b/libethereum/Executive.cpp @@ -249,7 +249,7 @@ void Executive::initialize( Transaction const& _transaction ) { MICROPROFILE_SCOPEI( "Executive", "initialize", MP_GAINSBORO ); m_t = _transaction; m_baseGasRequired = m_t.baseGasRequired( - m_chainParams.evmSchedule( m_envInfo.committedBlockTimestamp(), m_envInfo.number() ) ); + m_chainParams.makeEvmSchedule( m_envInfo.committedBlockTimestamp(), m_envInfo.number() ) ); try { verifyTransaction( _transaction, m_envInfo.committedBlockTimestamp(), m_envInfo.header(), diff --git a/libethereum/ExtVM.h b/libethereum/ExtVM.h index 845fa1809..4076b0c10 100644 --- a/libethereum/ExtVM.h +++ b/libethereum/ExtVM.h @@ -106,8 +106,8 @@ class ExtVM : public ExtVMFace { EVMSchedule initEvmSchedule( u256 const& _version ) const { // If _version is latest for the block, select corresponding latest schedule. // Otherwise run with the latest schedule known to correspond to the _version. - EVMSchedule currentBlockSchedule = - m_chainParams.evmSchedule( envInfo().committedBlockTimestamp(), envInfo().number() ); + EVMSchedule currentBlockSchedule = m_chainParams.makeEvmSchedule( + envInfo().committedBlockTimestamp(), envInfo().number() ); if ( currentBlockSchedule.accountVersion == _version ) return currentBlockSchedule; else diff --git a/libethereum/SchainPatch.cpp b/libethereum/SchainPatch.cpp index ed593c3c7..9124a46a5 100644 --- a/libethereum/SchainPatch.cpp +++ b/libethereum/SchainPatch.cpp @@ -1,14 +1,53 @@ #include "SchainPatch.h" +#include + using namespace dev::eth; ChainOperationParams SchainPatch::chainParams; -time_t SchainPatch::committedBlockTimestamp; +std::atomic< time_t > SchainPatch::committedBlockTimestamp; + +SchainPatchEnum getEnumForPatchName( const std::string& _patchName ) { + if ( _patchName == "RevertableFSPatch" ) + return SchainPatchEnum::RevertableFSPatch; + else if ( _patchName == "PrecompiledConfigPatch" ) + return SchainPatchEnum::PrecompiledConfigPatch; + else if ( _patchName == "PowCheckPatch" ) + return SchainPatchEnum::PowCheckPatch; + else if ( _patchName == "ContractStorageZeroValuePatch" ) + return SchainPatchEnum::ContractStorageZeroValuePatch; + else if ( _patchName == "PushZeroPatch" ) + return SchainPatchEnum::PushZeroPatch; + else if ( _patchName == "SkipInvalidTransactionsPatch" ) + return SchainPatchEnum::SkipInvalidTransactionsPatch; + else + throw std::out_of_range( _patchName ); +} + +std::string getPatchNameForEnum( SchainPatchEnum enumValue ) { + switch ( enumValue ) { + case SchainPatchEnum::RevertableFSPatch: + return "RevertableFSPatch"; + case SchainPatchEnum::PrecompiledConfigPatch: + return "PrecompiledConfigPatch"; + case SchainPatchEnum::PowCheckPatch: + return "PowCheckPatch"; + case SchainPatchEnum::ContractStorageZeroValuePatch: + return "ContractStorageZeroValuePatch"; + case SchainPatchEnum::PushZeroPatch: + return "PushZeroPatch"; + case SchainPatchEnum::SkipInvalidTransactionsPatch: + return "SkipInvalidTransactionsPatch"; + default: + throw std::out_of_range( "UnknownPatch" ); + } +} void SchainPatch::init( const dev::eth::ChainOperationParams& _cp ) { chainParams = _cp; - for ( const auto& it : _cp.sChain._patchTimestamps ) { - printInfo( it.first, it.second ); + for ( size_t i = 0; i < _cp.sChain._patchTimestamps.size(); ++i ) { + printInfo( getPatchNameForEnum( static_cast< SchainPatchEnum >( i ) ), + _cp.sChain._patchTimestamps[i] ); } } @@ -16,6 +55,24 @@ void SchainPatch::useLatestBlockTimestamp( time_t _timestamp ) { committedBlockTimestamp = _timestamp; } +void SchainPatch::printInfo( const std::string& _patchName, time_t _timeStamp ) { + if ( _timeStamp == 0 ) { + cnote << "Patch " << _patchName << " is disabled"; + } else { + cnote << "Patch " << _patchName << " is set at timestamp " << _timeStamp; + } +} +bool SchainPatch::isPatchEnabled( + SchainPatchEnum _patchEnum, const dev::eth::BlockChain& _bc, dev::eth::BlockNumber _bn ) { + time_t timestamp = chainParams.getPatchTimestamp( _patchEnum ); + return _bc.isPatchTimestampActiveInBlockNumber( timestamp, _bn ); +} +bool SchainPatch::isPatchEnabledWhen( + SchainPatchEnum _patchEnum, time_t _committedBlockTimestamp ) { + time_t activationTimestamp = chainParams.getPatchTimestamp( _patchEnum ); + return activationTimestamp != 0 && _committedBlockTimestamp >= activationTimestamp; +} + EVMSchedule PushZeroPatch::makeSchedule( const EVMSchedule& _base ) { EVMSchedule ret = _base; ret.havePush0 = true; diff --git a/libethereum/SchainPatch.h b/libethereum/SchainPatch.h index f72fb7b53..9d6ce25e7 100644 --- a/libethereum/SchainPatch.h +++ b/libethereum/SchainPatch.h @@ -1,56 +1,46 @@ #ifndef SCHAINPATCH_H #define SCHAINPATCH_H -namespace dev { -namespace eth { -class EVMSchedule; -} -} // namespace dev +#include "SchainPatchEnum.h" #include -#include - #include -#include #include +namespace dev { +namespace eth { +class EVMSchedule; +} +} // namespace dev + + class SchainPatch { public: static void init( const dev::eth::ChainOperationParams& _cp ); static void useLatestBlockTimestamp( time_t _timestamp ); + static SchainPatchEnum getEnumForPatchName( const std::string& _patchName ); + protected: - static void printInfo( const std::string& _patchName, time_t _timeStamp ) { - if ( _timeStamp == 0 ) { - cnote << "Patch " << _patchName << " is disabled"; - } else { - cnote << "Patch " << _patchName << " is set at timestamp " << _timeStamp; - } - } - static bool isPatchEnabled( const std::string& _patchName, const dev::eth::BlockChain& _bc, - dev::eth::BlockNumber _bn = dev::eth::LatestBlock ) { - time_t timestamp = chainParams.getPatchTimestamp( _patchName ); - return _bc.isPatchTimestampActiveInBlockNumber( timestamp, _bn ); - } - static bool isPatchEnabledWhen( - const std::string& _patchName, time_t _committedBlockTimestamp ) { - time_t activationTimestamp = chainParams.getPatchTimestamp( _patchName ); - return activationTimestamp != 0 && _committedBlockTimestamp >= activationTimestamp; - } + static void printInfo( const std::string& _patchName, time_t _timeStamp ); + static bool isPatchEnabled( SchainPatchEnum _patchEnum, const dev::eth::BlockChain& _bc, + dev::eth::BlockNumber _bn = dev::eth::LatestBlock ); + static bool isPatchEnabledWhen( SchainPatchEnum _patchEnum, time_t _committedBlockTimestamp ); protected: static dev::eth::ChainOperationParams chainParams; - static time_t committedBlockTimestamp; + static std::atomic< time_t > committedBlockTimestamp; }; #define DEFINE_AMNESIC_PATCH( BlaBlaPatch ) \ class BlaBlaPatch : public SchainPatch { \ public: \ static std::string getName() { return #BlaBlaPatch; } \ + static SchainPatchEnum getEnum() { return SchainPatchEnum::BlaBlaPatch; } \ static bool isEnabledInPendingBlock() { \ - time_t activationTimestamp = chainParams.getPatchTimestamp( getName() ); \ + time_t activationTimestamp = chainParams.getPatchTimestamp( getEnum() ); \ return activationTimestamp != 0 && committedBlockTimestamp >= activationTimestamp; \ } \ }; @@ -60,12 +50,13 @@ class SchainPatch { class BlaBlaPatch : public SchainPatch { \ public: \ static std::string getName() { return #BlaBlaPatch; } \ + static SchainPatchEnum getEnum() { return SchainPatchEnum::BlaBlaPatch; } \ static bool isEnabled( \ const dev::eth::BlockChain& _bc, dev::eth::BlockNumber _bn = dev::eth::LatestBlock ) { \ - return isPatchEnabled( getName(), _bc, _bn ); \ + return isPatchEnabled( getEnum(), _bc, _bn ); \ } \ static bool isEnabledWhen( time_t _committedBlockTimestamp ) { \ - return isPatchEnabledWhen( getName(), _committedBlockTimestamp ); \ + return isPatchEnabledWhen( getEnum(), _committedBlockTimestamp ); \ } \ }; @@ -73,12 +64,13 @@ class SchainPatch { class BlaBlaPatch : public SchainPatch { \ public: \ static std::string getName() { return #BlaBlaPatch; } \ + static SchainPatchEnum getEnum() { return SchainPatchEnum::BlaBlaPatch; } \ static bool isEnabled( \ const dev::eth::BlockChain& _bc, dev::eth::BlockNumber _bn = dev::eth::LatestBlock ) { \ - return isPatchEnabled( getName(), _bc, _bn ); \ + return isPatchEnabled( getEnum(), _bc, _bn ); \ } \ static bool isEnabledWhen( time_t _committedBlockTimestamp ) { \ - return isPatchEnabledWhen( getName(), _committedBlockTimestamp ); \ + return isPatchEnabledWhen( getEnum(), _committedBlockTimestamp ); \ } \ static dev::eth::EVMSchedule makeSchedule( const dev::eth::EVMSchedule& base ); \ }; @@ -96,7 +88,7 @@ DEFINE_AMNESIC_PATCH( PrecompiledConfigPatch ) /* * Context: enable fix for POW txns gas limit check */ -DEFINE_SIMPLE_PATCH( POWCheckPatch ) +DEFINE_SIMPLE_PATCH( PowCheckPatch ) /* * Context: use current, and not Constantinople, fork in Transaction::checkOutExternalGas() @@ -130,6 +122,11 @@ DEFINE_SIMPLE_PATCH( VerifyDaSigsPatch ) * Purpose: avoid incorrect txn behaviour * Version introduced: */ -DEFINE_AMNESIC_PATCH( ContractStorageLimitPatch ) +DEFINE_AMNESIC_PATCH( ContractStoragePatch ) + +/* + * Context: enable effective storage destruction + */ +DEFINE_AMNESIC_PATCH( StorageDestructionPatch ); #endif // SCHAINPATCH_H diff --git a/libethereum/SchainPatchEnum.h b/libethereum/SchainPatchEnum.h new file mode 100644 index 000000000..251ffe2bf --- /dev/null +++ b/libethereum/SchainPatchEnum.h @@ -0,0 +1,25 @@ +#ifndef SCHAINPATCHENUM_H +#define SCHAINPATCHENUM_H + +#include +#include + +enum class SchainPatchEnum { + RevertableFSPatch, + PrecompiledConfigPatch, + PowCheckPatch, + CorrectForkInPowPatch, + ContractStorageZeroValuePatch, + PushZeroPatch, + VerifyDaSigsPatch, + ContractStoragePatch, + StorageDestructionPatch, + SkipInvalidTransactionsPatch, + PatchesCount +}; + +extern SchainPatchEnum getEnumForPatchName( const std::string& _patchName ); +extern std::string getPatchNameForEnum( SchainPatchEnum enumValue ); + + +#endif // SCHAINPATCHENUM_H diff --git a/libethereum/SkaleHost.cpp b/libethereum/SkaleHost.cpp index 3fa131ffe..f61dfb00e 100644 --- a/libethereum/SkaleHost.cpp +++ b/libethereum/SkaleHost.cpp @@ -80,7 +80,7 @@ std::unique_ptr< ConsensusInterface > DefaultConsensusFactory::create( std::map< std::string, std::uint64_t > patchTimeStamps; patchTimeStamps["verifyDaSigsPatchTimestamp"] = - m_client.chainParams().getPatchTimestamp( "VerifyDaSigsPatch" ); + m_client.chainParams().getPatchTimestamp( SchainPatchEnum::VerifyDaSigsPatch ); auto consensus_engine_ptr = make_unique< ConsensusEngine >( _extFace, m_client.number(), ts, 0, patchTimeStamps, m_client.chainParams().sChain.consensusStorageLimit ); diff --git a/libethereum/Transaction.cpp b/libethereum/Transaction.cpp index 745aa7896..e7dffc32a 100644 --- a/libethereum/Transaction.cpp +++ b/libethereum/Transaction.cpp @@ -196,7 +196,7 @@ void Transaction::checkOutExternalGas( EVMSchedule scheduleForUse = ConstantinopleSchedule; if ( CorrectForkInPowPatch::isEnabledWhen( _committedBlockTimestamp ) ) - scheduleForUse = _cp.evmSchedule( _committedBlockTimestamp, _bn ); + scheduleForUse = _cp.makeEvmSchedule( _committedBlockTimestamp, _bn ); if ( externalGas >= baseGasRequired( scheduleForUse ) ) m_externalGas = externalGas; diff --git a/libethereum/ValidationSchemes.cpp b/libethereum/ValidationSchemes.cpp index 1f7243e31..5ca27f90d 100644 --- a/libethereum/ValidationSchemes.cpp +++ b/libethereum/ValidationSchemes.cpp @@ -17,7 +17,13 @@ along with cpp-ethereum. If not, see . */ #include "ValidationSchemes.h" + +#include + #include + +#include + #include using namespace std; @@ -252,7 +258,6 @@ void validateConfigJson( js::mObject const& _obj ) { { { js::int_type }, JsonFieldPresence::Optional } }, { "rotateAfterBlock", { { js::int_type }, JsonFieldPresence::Optional } }, { "contractStorageLimit", { { js::int_type }, JsonFieldPresence::Optional } }, - { "contractStoragePatchTimestamp", { { js::int_type }, JsonFieldPresence::Optional } }, { "dbStorageLimit", { { js::int_type }, JsonFieldPresence::Optional } }, { "nodes", { { js::array_type }, JsonFieldPresence::Required } }, { "maxConsensusStorageBytes", { { js::int_type }, JsonFieldPresence::Optional } }, @@ -261,22 +266,20 @@ void validateConfigJson( js::mObject const& _obj ) { { "maxSkaledLeveldbStorageBytes", { { js::int_type }, JsonFieldPresence::Optional } }, { "freeContractDeployment", { { js::bool_type }, JsonFieldPresence::Optional } }, { "multiTransactionMode", { { js::bool_type }, JsonFieldPresence::Optional } }, - { "revertableFSPatchTimestamp", { { js::int_type }, JsonFieldPresence::Optional } }, - { "contractStorageZeroValuePatchTimestamp", - { { js::int_type }, JsonFieldPresence::Optional } }, - { "verifyDaSigsPatchTimestamp", { { js::int_type }, JsonFieldPresence::Optional } }, - { "storageDestructionPatchTimestamp", - { { js::int_type }, JsonFieldPresence::Optional } }, - { "powCheckPatchTimestamp", { { js::int_type }, JsonFieldPresence::Optional } }, - { "pushZeroPatchTimestamp", { { js::int_type }, JsonFieldPresence::Optional } }, - { "nodeGroups", { { js::obj_type }, JsonFieldPresence::Optional } }, { "nodeGroups", { { js::obj_type }, JsonFieldPresence::Optional } }, - { "skipInvalidTransactionsPatchTimestamp", - { { js::int_type }, JsonFieldPresence::Optional } }, - { "precompiledConfigPatchTimestamp", - { { js::int_type }, JsonFieldPresence::Optional } }, - { "correctForkInPowPatchTimestamp", - { { js::int_type }, JsonFieldPresence::Optional } } } ); + { "nodeGroups", { { js::obj_type }, JsonFieldPresence::Optional } } }, + []( const string& _key ) { + // function fow allowing fields + // exception means bad name + try { + string patchName = boost::algorithm::erase_last_copy( _key, "Timestamp" ); + patchName[0] = toupper( patchName[0] ); + getEnumForPatchName( patchName ); + return true; + } catch ( const std::out_of_range& ) { + return false; + } + } ); js::mArray const& nodes = sChain.at( "nodes" ).get_array(); for ( auto const& obj : nodes ) { diff --git a/libhistoric/AlethExecutive.cpp b/libhistoric/AlethExecutive.cpp index 4f217dfe9..b0df97294 100644 --- a/libhistoric/AlethExecutive.cpp +++ b/libhistoric/AlethExecutive.cpp @@ -77,7 +77,7 @@ void AlethExecutive::accrueSubState( SubState& _parentContext ) { void AlethExecutive::initialize( Transaction const& _transaction ) { m_t = _transaction; m_baseGasRequired = m_t.baseGasRequired( - m_chainParams.evmSchedule( m_envInfo.committedBlockTimestamp(), m_envInfo.number() ) ); + m_chainParams.makeEvmSchedule( m_envInfo.committedBlockTimestamp(), m_envInfo.number() ) ); try { Ethash::verifyTransaction( m_chainParams, ImportRequirements::Everything, m_t, m_envInfo.committedBlockTimestamp(), m_envInfo.header(), m_envInfo.gasUsed() ); @@ -213,7 +213,7 @@ bool AlethExecutive::create( Address const& _txSender, u256 const& _endowment, u256 const& _gasPrice, u256 const& _gas, bytesConstRef _init, Address const& _origin ) { // Contract will be created with the version corresponding to latest hard fork auto const latestVersion = - m_chainParams.evmSchedule( m_envInfo.committedBlockTimestamp(), m_envInfo.number() ) + m_chainParams.makeEvmSchedule( m_envInfo.committedBlockTimestamp(), m_envInfo.number() ) .accountVersion; return createWithAddressFromNonceAndSender( _txSender, _endowment, _gasPrice, _gas, _init, _origin, latestVersion ); diff --git a/libhistoric/AlethExtVM.h b/libhistoric/AlethExtVM.h index c830e9fc6..793928482 100644 --- a/libhistoric/AlethExtVM.h +++ b/libhistoric/AlethExtVM.h @@ -102,7 +102,7 @@ class AlethExtVM : public ExtVMFace { // If _version is latest for the block, select corresponding latest schedule. // Otherwise run with the latest schedule known to correspond to the _version. EVMSchedule currentBlockSchedule = - m_chainParams.evmSchedule( _committedBlockTimestamp, _blockNumber ); + m_chainParams.makeEvmSchedule( _committedBlockTimestamp, _blockNumber ); if ( currentBlockSchedule.accountVersion == _version ) return currentBlockSchedule; else diff --git a/libskale/CMakeLists.txt b/libskale/CMakeLists.txt index f3321833b..59f08faa3 100644 --- a/libskale/CMakeLists.txt +++ b/libskale/CMakeLists.txt @@ -14,7 +14,6 @@ set(sources TotalStorageUsedPatch.cpp AmsterdamFixPatch.cpp OverlayFS.cpp - StorageDestructionPatch.cpp SkipInvalidTransactionsPatch.cpp ) diff --git a/libskale/SkipInvalidTransactionsPatch.cpp b/libskale/SkipInvalidTransactionsPatch.cpp index b34efeeb0..dd9c6f7dd 100644 --- a/libskale/SkipInvalidTransactionsPatch.cpp +++ b/libskale/SkipInvalidTransactionsPatch.cpp @@ -7,7 +7,7 @@ bool SkipInvalidTransactionsPatch::hasPotentialInvalidTransactionsInBlock( if ( _bn == 0 ) return false; - time_t activationTimestamp = _bc.chainParams().getPatchTimestamp( getName() ); + time_t activationTimestamp = _bc.chainParams().getPatchTimestamp( getEnum() ); if ( activationTimestamp == 0 ) return true; diff --git a/libskale/SkipInvalidTransactionsPatch.h b/libskale/SkipInvalidTransactionsPatch.h index c38f8f215..5ea060f35 100644 --- a/libskale/SkipInvalidTransactionsPatch.h +++ b/libskale/SkipInvalidTransactionsPatch.h @@ -36,14 +36,15 @@ class Client; class SkipInvalidTransactionsPatch : public SchainPatch { public: static std::string getName() { return "SkipInvalidTransactionsPatch"; } + static SchainPatchEnum getEnum() { return SchainPatchEnum::SkipInvalidTransactionsPatch; } static bool isEnabled( const dev::eth::BlockChain& _bc, dev::eth::BlockNumber _bn = dev::eth::LatestBlock ) { - time_t timestamp = _bc.chainParams().getPatchTimestamp( getName() ); + time_t timestamp = _bc.chainParams().getPatchTimestamp( getEnum() ); return _bc.isPatchTimestampActiveInBlockNumber( timestamp, _bn ); } static bool isEnabledWhen( const dev::eth::ChainOperationParams& _cp, time_t _lastBlockTimestamp ) { - time_t activationTimestamp = _cp.getPatchTimestamp( getName() ); + time_t activationTimestamp = _cp.getPatchTimestamp( getEnum() ); return activationTimestamp != 0 && _lastBlockTimestamp >= activationTimestamp; } // returns true if block N can contain invalid transactions diff --git a/libskale/State.cpp b/libskale/State.cpp index e18cc9b96..f173f8d9c 100644 --- a/libskale/State.cpp +++ b/libskale/State.cpp @@ -43,7 +43,7 @@ #include #include -#include +#include namespace fs = boost::filesystem; @@ -893,7 +893,7 @@ void State::rollback( size_t _savepoint ) { // change log entry. switch ( change.kind ) { case Change::Storage: - if ( ContractStorageLimitPatch::isEnabledInPendingBlock() ) { + if ( ContractStoragePatch::isEnabledInPendingBlock() ) { rollbackStorageChange( change, account ); } else { account.setStorage( change.key, change.value ); @@ -922,7 +922,7 @@ void State::rollback( size_t _savepoint ) { m_changeLog.pop_back(); } clearFileStorageCache(); - if ( !ContractStorageLimitPatch::isEnabledInPendingBlock() ) { + if ( !ContractStoragePatch::isEnabledInPendingBlock() ) { resetStorageChanges(); } } diff --git a/libskale/StorageDestructionPatch.cpp b/libskale/StorageDestructionPatch.cpp deleted file mode 100644 index 01036ec39..000000000 --- a/libskale/StorageDestructionPatch.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "StorageDestructionPatch.h" diff --git a/libskale/StorageDestructionPatch.h b/libskale/StorageDestructionPatch.h deleted file mode 100644 index 39b4ed3b9..000000000 --- a/libskale/StorageDestructionPatch.h +++ /dev/null @@ -1,12 +0,0 @@ -#include - -namespace dev { -namespace eth { -class Client; -} -} // namespace dev - -/* - * Context: enable effective storage destruction - */ -DEFINE_AMNESIC_PATCH( StorageDestructionPatch ); diff --git a/test/tools/libtesteth/ImportTest.cpp b/test/tools/libtesteth/ImportTest.cpp index b15f06e3c..a805514e8 100644 --- a/test/tools/libtesteth/ImportTest.cpp +++ b/test/tools/libtesteth/ImportTest.cpp @@ -103,7 +103,7 @@ void ImportTest::makeBlockchainTestFromStateTest( set< eth::Network > const& _ne // Calculate the block reward ChainParams const chainParams{genesisInfo( net )}; - EVMSchedule const schedule = chainParams.evmSchedule( 0, 1 ); + EVMSchedule const schedule = chainParams.makeEvmSchedule( 0, 1 ); // u256 const blockReward = chainParams.blockReward(schedule); TrExpectSection search{trDup, smap}; diff --git a/test/unittests/libethereum/SkaleHost.cpp b/test/unittests/libethereum/SkaleHost.cpp index 131e7daf1..330b3e993 100644 --- a/test/unittests/libethereum/SkaleHost.cpp +++ b/test/unittests/libethereum/SkaleHost.cpp @@ -138,7 +138,7 @@ struct SkaleHostFixture : public TestOutputHelperFixture { if( params.count("multiTransactionMode") && stoi( params.at( "multiTransactionMode" ) ) ) chainParams.sChain.multiTransactionMode = true; if( params.count("skipInvalidTransactionsPatchTimestamp") && stoi( params.at( "skipInvalidTransactionsPatchTimestamp" ) ) ) - chainParams.sChain._patchTimestamps["SkipInvalidTransactionsPatch"] = stoi( params.at( "skipInvalidTransactionsPatchTimestamp" ) ); + chainParams.sChain._patchTimestamps[static_cast(SchainPatchEnum::SkipInvalidTransactionsPatch)] = stoi( params.at( "skipInvalidTransactionsPatchTimestamp" ) ); accountHolder.reset( new FixedAccountHolder( [&]() { return client.get(); }, {} ) ); accountHolder->setAccounts( {coinbase, account2} ); diff --git a/test/unittests/libevm/VMTest.cpp b/test/unittests/libevm/VMTest.cpp index 91c9e3482..9edcf9aeb 100644 --- a/test/unittests/libevm/VMTest.cpp +++ b/test/unittests/libevm/VMTest.cpp @@ -653,7 +653,7 @@ class InstructionTestFixture : public TestOutputHelperFixture { public: InstructionTestFixture() : vm{new LegacyVM()} { ChainParams cp( genesisInfo( Network::IstanbulTest ) ); - cp.sChain._patchTimestamps["PushZeroPatch"] = 1; + cp.sChain._patchTimestamps[static_cast(SchainPatchEnum::PushZeroPatch)] = 1; SchainPatch::init(cp); se.reset(cp.createSealEngine()); diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index e869740c0..aa9afd19d 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -288,10 +288,10 @@ struct JsonRpcFixture : public TestOutputHelperFixture { chainParams.sChain.contractStorageLimit = 128; // 615 + 1430 is experimentally-derived block size + average extras size chainParams.sChain.dbStorageLimit = 320.5*( 615 + 1430 ); - chainParams.sChain._patchTimestamps["ContractStorageLimitPatch"] = 1; - chainParams.sChain._patchTimestamps["StorageDestructionPatch"] = 1; + chainParams.sChain._patchTimestamps[static_cast(SchainPatchEnum::ContractStoragePatch)] = 1; + chainParams.sChain._patchTimestamps[static_cast(SchainPatchEnum::StorageDestructionPatch)] = 1; powPatchActivationTimestamp = time(nullptr) + 60; - chainParams.sChain._patchTimestamps["CorrectForkInPowPatch"] = powPatchActivationTimestamp; // 10 guessed seconds + chainParams.sChain._patchTimestamps[static_cast(SchainPatchEnum::CorrectForkInPowPatch)] = powPatchActivationTimestamp; // 10 guessed seconds chainParams.sChain.emptyBlockIntervalMs = _emptyBlockIntervalMs; // add random extra data to randomize genesis hash and get random DB path, // so that tests can be run in parallel @@ -2004,7 +2004,7 @@ contract TestEstimateGas { dev::bytes data = dev::jsToBytes( estimateGasCall["data"].asString() ); BOOST_REQUIRE( dev::jsToU256( estimatedGas ) > dev::eth::TransactionBase::baseGasRequired( - false, &data, fixture.client->chainParams().evmSchedule( + false, &data, fixture.client->chainParams().makeEvmSchedule( fixture.client->latestBlock().info().timestamp(), fixture.client->number() ) ) ); // try to send with this gas From c664283b1fdeb7189adb8e24383953e3963f61ee Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Mon, 11 Mar 2024 13:08:05 +0000 Subject: [PATCH 034/154] SKALED-1583 Fix some tests --- libdevcore/JsonUtils.h | 2 +- libethereum/SchainPatch.cpp | 23 ++++++++++++++++++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/libdevcore/JsonUtils.h b/libdevcore/JsonUtils.h index d59365aef..2948e971b 100644 --- a/libdevcore/JsonUtils.h +++ b/libdevcore/JsonUtils.h @@ -45,6 +45,6 @@ void requireJsonFields( json_spirit::mObject const& _o, std::string const& _configName, std::map< std::string, JsonFieldOptions > const& _validationMap, std::function< bool( const std::string& ) > _callbackForUnexpected = []( const std::string& ) { - return true; + return false; } ); } // namespace dev diff --git a/libethereum/SchainPatch.cpp b/libethereum/SchainPatch.cpp index 9124a46a5..516250bc1 100644 --- a/libethereum/SchainPatch.cpp +++ b/libethereum/SchainPatch.cpp @@ -14,32 +14,49 @@ SchainPatchEnum getEnumForPatchName( const std::string& _patchName ) { return SchainPatchEnum::PrecompiledConfigPatch; else if ( _patchName == "PowCheckPatch" ) return SchainPatchEnum::PowCheckPatch; + else if ( _patchName == "CorrectForkInPowPatch" ) + return SchainPatchEnum::CorrectForkInPowPatch; else if ( _patchName == "ContractStorageZeroValuePatch" ) return SchainPatchEnum::ContractStorageZeroValuePatch; else if ( _patchName == "PushZeroPatch" ) return SchainPatchEnum::PushZeroPatch; + else if ( _patchName == "VerifyDaSigsPatch" ) + return SchainPatchEnum::VerifyDaSigsPatch; + else if ( _patchName == "ContractStoragePatch" ) + return SchainPatchEnum::ContractStoragePatch; + else if ( _patchName == "StorageDestructionPatch" ) + return SchainPatchEnum::StorageDestructionPatch; else if ( _patchName == "SkipInvalidTransactionsPatch" ) return SchainPatchEnum::SkipInvalidTransactionsPatch; else throw std::out_of_range( _patchName ); } -std::string getPatchNameForEnum( SchainPatchEnum enumValue ) { - switch ( enumValue ) { +std::string getPatchNameForEnum( SchainPatchEnum _enumValue ) { + switch ( _enumValue ) { case SchainPatchEnum::RevertableFSPatch: return "RevertableFSPatch"; case SchainPatchEnum::PrecompiledConfigPatch: return "PrecompiledConfigPatch"; case SchainPatchEnum::PowCheckPatch: return "PowCheckPatch"; + case SchainPatchEnum::CorrectForkInPowPatch: + return "CorrectForkInPowPatch"; case SchainPatchEnum::ContractStorageZeroValuePatch: return "ContractStorageZeroValuePatch"; case SchainPatchEnum::PushZeroPatch: return "PushZeroPatch"; + case SchainPatchEnum::VerifyDaSigsPatch: + return "VerifyDaSigsPatch"; + case SchainPatchEnum::ContractStoragePatch: + return "ContractStoragePatch"; + case SchainPatchEnum::StorageDestructionPatch: + return "StorageDestructionPatch"; case SchainPatchEnum::SkipInvalidTransactionsPatch: return "SkipInvalidTransactionsPatch"; default: - throw std::out_of_range( "UnknownPatch" ); + throw std::out_of_range( + "UnknownPatch #" + std::to_string( static_cast< size_t >( _enumValue ) ) ); } } From 537141dc2db9da41dc23fe46dd6715faa1279428 Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Mon, 11 Mar 2024 16:11:30 +0000 Subject: [PATCH 035/154] SKALED-1583 Some prettifying --- libdevcore/JsonUtils.cpp | 1 + libethereum/SchainPatch.h | 3 --- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/libdevcore/JsonUtils.cpp b/libdevcore/JsonUtils.cpp index c9e5aecb3..660e92170 100644 --- a/libdevcore/JsonUtils.cpp +++ b/libdevcore/JsonUtils.cpp @@ -61,6 +61,7 @@ void dev::requireJsonFields( json_spirit::mObject const& _o, std::string const& std::function< bool( const std::string& ) > _callbackForUnexpected ) { // check for unexpected fiedls for ( auto const& field : _o ) { + // _callbackForUnexpected allows to accept ertain unexpected fields if ( !_validationMap.count( field.first ) && !_callbackForUnexpected( field.first ) ) { std::string const comment = "Unexpected field '" + field.first + "' in config: " + _config; diff --git a/libethereum/SchainPatch.h b/libethereum/SchainPatch.h index 9d6ce25e7..8ef06e737 100644 --- a/libethereum/SchainPatch.h +++ b/libethereum/SchainPatch.h @@ -37,7 +37,6 @@ class SchainPatch { #define DEFINE_AMNESIC_PATCH( BlaBlaPatch ) \ class BlaBlaPatch : public SchainPatch { \ public: \ - static std::string getName() { return #BlaBlaPatch; } \ static SchainPatchEnum getEnum() { return SchainPatchEnum::BlaBlaPatch; } \ static bool isEnabledInPendingBlock() { \ time_t activationTimestamp = chainParams.getPatchTimestamp( getEnum() ); \ @@ -49,7 +48,6 @@ class SchainPatch { #define DEFINE_SIMPLE_PATCH( BlaBlaPatch ) \ class BlaBlaPatch : public SchainPatch { \ public: \ - static std::string getName() { return #BlaBlaPatch; } \ static SchainPatchEnum getEnum() { return SchainPatchEnum::BlaBlaPatch; } \ static bool isEnabled( \ const dev::eth::BlockChain& _bc, dev::eth::BlockNumber _bn = dev::eth::LatestBlock ) { \ @@ -63,7 +61,6 @@ class SchainPatch { #define DEFINE_EVM_PATCH( BlaBlaPatch ) \ class BlaBlaPatch : public SchainPatch { \ public: \ - static std::string getName() { return #BlaBlaPatch; } \ static SchainPatchEnum getEnum() { return SchainPatchEnum::BlaBlaPatch; } \ static bool isEnabled( \ const dev::eth::BlockChain& _bc, dev::eth::BlockNumber _bn = dev::eth::LatestBlock ) { \ From 9d928730b2922846436ea09cde5e8b0af34bfbb5 Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Mon, 11 Mar 2024 17:11:37 +0000 Subject: [PATCH 036/154] SKALED-1583 Remove endl in some palces --- libethereum/BlockChain.cpp | 9 ++++----- libethereum/Client.cpp | 2 +- libethereum/SkaleHost.cpp | 4 ++-- libethereum/Transaction.cpp | 2 +- libskale/State.cpp | 8 ++++---- 5 files changed, 12 insertions(+), 13 deletions(-) diff --git a/libethereum/BlockChain.cpp b/libethereum/BlockChain.cpp index d4759d174..9c71f5a29 100644 --- a/libethereum/BlockChain.cpp +++ b/libethereum/BlockChain.cpp @@ -1085,7 +1085,7 @@ void BlockChain::clearBlockBlooms( unsigned _begin, unsigned _end ) { } void BlockChain::rescue( State const& /*_state*/ ) { - clog( VerbosityInfo, "BlockChain" ) << "Rescuing database..." << endl; + clog( VerbosityInfo, "BlockChain" ) << "Rescuing database..."; throw std::logic_error( "Rescueing is not implemented" ); unsigned u = 1; @@ -1100,8 +1100,7 @@ void BlockChain::rescue( State const& /*_state*/ ) { } } unsigned l = u / 2; - clog( VerbosityInfo, "BlockChain" ) - << cc::debug( "Finding last likely block number..." ) << endl; + clog( VerbosityInfo, "BlockChain" ) << cc::debug( "Finding last likely block number..." ); while ( u - l > 1 ) { unsigned m = ( u + l ) / 2; clog( VerbosityInfo, "BlockChain" ) << " " << m << flush; @@ -1110,7 +1109,7 @@ void BlockChain::rescue( State const& /*_state*/ ) { else u = m; } - clog( VerbosityInfo, "BlockChain" ) << " lowest is " << l << endl; + clog( VerbosityInfo, "BlockChain" ) << " lowest is " << l; for ( ; l > 0; --l ) { h256 h = numberHash( l ); clog( VerbosityInfo, "BlockChain" ) @@ -1129,7 +1128,7 @@ void BlockChain::rescue( State const& /*_state*/ ) { } catch ( ... ) { } } - clog( VerbosityInfo, "BlockChain" ) << "OK." << endl; + clog( VerbosityInfo, "BlockChain" ) << "OK."; rewind( l ); } diff --git a/libethereum/Client.cpp b/libethereum/Client.cpp index 46da9357c..517a8ade4 100644 --- a/libethereum/Client.cpp +++ b/libethereum/Client.cpp @@ -634,7 +634,7 @@ size_t Client::syncTransactions( // HACK remove block verification and put it directly in blockchain!! // TODO remove block verification and put it directly in blockchain!! while ( m_working.isSealed() ) { - cnote << "m_working.isSealed. sleeping" << endl; + cnote << "m_working.isSealed. sleeping"; usleep( 1000 ); } diff --git a/libethereum/SkaleHost.cpp b/libethereum/SkaleHost.cpp index f61dfb00e..1b3e011f8 100644 --- a/libethereum/SkaleHost.cpp +++ b/libethereum/SkaleHost.cpp @@ -910,8 +910,8 @@ void SkaleHost::broadcastFunc() { m_broadcaster->broadcast( rlp ); } } catch ( const std::exception& ex ) { - cwarn << "BROADCAST EXCEPTION CAUGHT" << endl; - cwarn << ex.what() << endl; + cwarn << "BROADCAST EXCEPTION CAUGHT"; + cwarn << ex.what(); } // catch } // if diff --git a/libethereum/Transaction.cpp b/libethereum/Transaction.cpp index e7dffc32a..7338bf060 100644 --- a/libethereum/Transaction.cpp +++ b/libethereum/Transaction.cpp @@ -192,7 +192,7 @@ void Transaction::checkOutExternalGas( } u256 externalGas = ~u256( 0 ) / u256( hash ) / difficulty; if ( externalGas > 0 ) - ctrace << "Mined gas: " << externalGas << endl; + ctrace << "Mined gas: " << externalGas; EVMSchedule scheduleForUse = ConstantinopleSchedule; if ( CorrectForkInPowPatch::isEnabledWhen( _committedBlockTimestamp ) ) diff --git a/libskale/State.cpp b/libskale/State.cpp index f173f8d9c..18c72e272 100644 --- a/libskale/State.cpp +++ b/libskale/State.cpp @@ -356,7 +356,7 @@ std::unordered_map< Address, u256 > State::addresses() const { boost::shared_lock< boost::shared_mutex > lock( *x_db_ptr ); if ( !checkVersion() ) { cerror << "Current state version is " << m_currentVersion << " but stored version is " - << *m_storedVersion << endl; + << *m_storedVersion; BOOST_THROW_EXCEPTION( AttemptToReadFromStateInThePast() ); } @@ -438,7 +438,7 @@ eth::Account* State::account( Address const& _address ) { if ( !checkVersion() ) { cerror << "Current state version is " << m_currentVersion << " but stored version is " - << *m_storedVersion << endl; + << *m_storedVersion; BOOST_THROW_EXCEPTION( AttemptToReadFromStateInThePast() ); } @@ -666,7 +666,7 @@ std::map< h256, std::pair< u256, u256 > > State::storage_WITHOUT_LOCK( const Address& _contract ) const { if ( !checkVersion() ) { cerror << "Current state version is " << m_currentVersion << " but stored version is " - << *m_storedVersion << endl; + << *m_storedVersion; BOOST_THROW_EXCEPTION( AttemptToReadFromStateInThePast() ); } @@ -686,7 +686,7 @@ std::map< h256, std::pair< u256, u256 > > State::storage_WITHOUT_LOCK( } } - cdebug << "Self-destruct cleared values:" << storage.size() << endl; + cdebug << "Self-destruct cleared values:" << storage.size(); return storage; } From 9bd25428e355f7d376f3b968ecf621e544b3faff Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Tue, 12 Mar 2024 19:32:00 +0000 Subject: [PATCH 037/154] SKALED-1583 Make some parameters' names more clear --- libethashseal/Ethash.cpp | 7 --- libethashseal/Ethash.h | 3 - libethcore/ChainOperationParams.cpp | 20 +++---- libethcore/ChainOperationParams.h | 4 +- libethcore/SealEngine.cpp | 8 +-- libethcore/SealEngine.h | 8 ++- libethereum/Block.cpp | 22 +++----- libethereum/BlockChain.cpp | 2 +- libethereum/Client.cpp | 4 +- libethereum/ClientBase.cpp | 2 +- libethereum/Precompiled.cpp | 4 +- libethereum/SchainPatch.cpp | 6 +- libethereum/SchainPatch.h | 67 +++++++++++------------ libethereum/SkaleHost.cpp | 7 ++- libethereum/Transaction.cpp | 7 ++- libethereum/Transaction.h | 4 +- libevm/ExtVMFace.h | 8 +-- libhistoric/AlethExtVM.h | 4 +- libskale/OverlayDB.cpp | 2 +- libskale/SkipInvalidTransactionsPatch.cpp | 4 +- libskale/SkipInvalidTransactionsPatch.h | 14 ++--- libskale/State.cpp | 6 +- 22 files changed, 98 insertions(+), 115 deletions(-) diff --git a/libethashseal/Ethash.cpp b/libethashseal/Ethash.cpp index cea57256f..3f893f308 100644 --- a/libethashseal/Ethash.cpp +++ b/libethashseal/Ethash.cpp @@ -130,13 +130,6 @@ void Ethash::verify( Strictness _s, BlockHeader const& _bi, BlockHeader const& _ } } -void Ethash::verifyTransaction( ChainOperationParams const& _chainParams, - ImportRequirements::value _ir, TransactionBase const& _t, time_t _committedBlockTimestamp, - BlockHeader const& _header, u256 const& _startGasUsed ) { - SealEngineFace::verifyTransaction( - _chainParams, _ir, _t, _committedBlockTimestamp, _header, _startGasUsed ); -} - u256 Ethash::childGasLimit( BlockHeader const& _bi, u256 const& _gasFloorTarget ) const { u256 gasFloorTarget = _gasFloorTarget == Invalid256 ? 3141562 : _gasFloorTarget; u256 gasLimit = _bi.gasLimit(); diff --git a/libethashseal/Ethash.h b/libethashseal/Ethash.h index 63e39fed1..92dd767cb 100644 --- a/libethashseal/Ethash.h +++ b/libethashseal/Ethash.h @@ -52,9 +52,6 @@ class Ethash : public SealEngineBase { StringHashMap jsInfo( BlockHeader const& _bi ) const override; void verify( Strictness _s, BlockHeader const& _bi, BlockHeader const& _parent, bytesConstRef _block ) const override; - static void verifyTransaction( ChainOperationParams const& _chainParams, - ImportRequirements::value _ir, TransactionBase const& _t, time_t _committedBlockTimestamp, - BlockHeader const& _header, u256 const& _startGasUsed ); void populateFromParent( BlockHeader& _bi, BlockHeader const& _parent ) const override; strings sealers() const override; diff --git a/libethcore/ChainOperationParams.cpp b/libethcore/ChainOperationParams.cpp index 5b8e08a2c..4f11713a9 100644 --- a/libethcore/ChainOperationParams.cpp +++ b/libethcore/ChainOperationParams.cpp @@ -64,23 +64,23 @@ ChainOperationParams::ChainOperationParams() durationLimit( 0x0d ) {} EVMSchedule const ChainOperationParams::makeEvmSchedule( - time_t _committedBlockTimestamp, u256 const& _blockNumber ) const { + time_t _committedBlockTimestamp, u256 const& _workingBlockNumber ) const { EVMSchedule result; // 1 decide by block number - if ( _blockNumber >= experimentalForkBlock ) + if ( _workingBlockNumber >= experimentalForkBlock ) result = ExperimentalSchedule; - else if ( _blockNumber >= istanbulForkBlock ) + else if ( _workingBlockNumber >= istanbulForkBlock ) result = IstanbulSchedule; - else if ( _blockNumber >= constantinopleFixForkBlock ) + else if ( _workingBlockNumber >= constantinopleFixForkBlock ) result = ConstantinopleFixSchedule; - else if ( _blockNumber >= constantinopleForkBlock ) + else if ( _workingBlockNumber >= constantinopleForkBlock ) result = ConstantinopleSchedule; - else if ( _blockNumber >= byzantiumForkBlock ) + else if ( _workingBlockNumber >= byzantiumForkBlock ) result = ByzantiumSchedule; - else if ( _blockNumber >= EIP158ForkBlock ) + else if ( _workingBlockNumber >= EIP158ForkBlock ) result = EIP158Schedule; - else if ( _blockNumber >= EIP150ForkBlock ) + else if ( _workingBlockNumber >= EIP150ForkBlock ) result = EIP150Schedule; else result = HomesteadSchedule; @@ -100,8 +100,8 @@ u256 ChainOperationParams::blockReward( EVMSchedule const& _schedule ) const { } u256 ChainOperationParams::blockReward( - time_t _committedBlockTimestamp, u256 const& _blockNumber ) const { - EVMSchedule const& schedule{ makeEvmSchedule( _committedBlockTimestamp, _blockNumber ) }; + time_t _committedBlockTimestamp, u256 const& _workingBlockNumber ) const { + EVMSchedule const& schedule{ makeEvmSchedule( _committedBlockTimestamp, _workingBlockNumber ) }; return blockReward( schedule ); } diff --git a/libethcore/ChainOperationParams.h b/libethcore/ChainOperationParams.h index 18abcca66..18fda7877 100644 --- a/libethcore/ChainOperationParams.h +++ b/libethcore/ChainOperationParams.h @@ -204,9 +204,9 @@ struct ChainOperationParams { public: EVMSchedule const makeEvmSchedule( - time_t _committedBlockTimestamp, u256 const& _blockNumber ) const; + time_t _committedBlockTimestamp, u256 const& _workingBlockNumber ) const; u256 blockReward( EVMSchedule const& _schedule ) const; - u256 blockReward( time_t _committedBlockTimestamp, u256 const& _blockNumber ) const; + u256 blockReward( time_t _committedBlockTimestamp, u256 const& _workingBlockNumber ) const; void setBlockReward( u256 const& _newBlockReward ); u256 maximumExtraDataSize = 1024; u256 accountStartNonce = 0; diff --git a/libethcore/SealEngine.cpp b/libethcore/SealEngine.cpp index 96b621f0f..b9cd03c6f 100644 --- a/libethcore/SealEngine.cpp +++ b/libethcore/SealEngine.cpp @@ -161,12 +161,12 @@ SealEngineFace* SealEngineRegistrar::create( ChainOperationParams const& _params } EVMSchedule SealEngineBase::evmSchedule( - time_t _committedBlockTimestamp, u256 const& _blockNumber ) const { - return chainParams().makeEvmSchedule( _committedBlockTimestamp, _blockNumber ); + time_t _committedBlockTimestamp, u256 const& _workingBlockNumber ) const { + return chainParams().makeEvmSchedule( _committedBlockTimestamp, _workingBlockNumber ); } u256 SealEngineBase::blockReward( - time_t _committedBlockTimestamp, u256 const& _blockNumber ) const { - EVMSchedule const& schedule{ evmSchedule( _committedBlockTimestamp, _blockNumber ) }; + time_t _committedBlockTimestamp, u256 const& _workingBlockNumber ) const { + EVMSchedule const& schedule{ evmSchedule( _committedBlockTimestamp, _workingBlockNumber ) }; return chainParams().blockReward( schedule ); } diff --git a/libethcore/SealEngine.h b/libethcore/SealEngine.h index 63dddf393..463ddd9b0 100644 --- a/libethcore/SealEngine.h +++ b/libethcore/SealEngine.h @@ -95,8 +95,9 @@ class SealEngineFace { return this; } virtual EVMSchedule evmSchedule( - time_t _committedBlockTimestamp, u256 const& _blockNumber ) const = 0; - virtual u256 blockReward( time_t _committedBlockTimestamp, u256 const& _blockNumber ) const = 0; + time_t _committedBlockTimestamp, u256 const& _workingBlockNumber ) const = 0; + virtual u256 blockReward( + time_t _committedBlockTimestamp, u256 const& _workingBlockNumber ) const = 0; virtual bool isPrecompiled( Address const& _a, u256 const& _blockNumber ) const { return m_params.precompiled.count( _a ) != 0 && @@ -139,7 +140,8 @@ class SealEngineBase : public SealEngineFace { } EVMSchedule evmSchedule( time_t _committedBlockTimestamp, u256 const& _blockNumber ) const override; - u256 blockReward( time_t _committedBlockTimestamp, u256 const& _blockNumber ) const override; + u256 blockReward( + time_t _committedBlockTimestamp, u256 const& _workingBlockNumber ) const override; protected: std::function< void( bytes const& s ) > m_onSealGenerated; diff --git a/libethereum/Block.cpp b/libethereum/Block.cpp index 9ec555334..7e8037175 100644 --- a/libethereum/Block.cpp +++ b/libethereum/Block.cpp @@ -351,7 +351,8 @@ pair< TransactionReceipts, bool > Block::sync( // caller if we hit the limit for ( Transaction& transaction : transactions ) { - transaction.checkOutExternalGas( _bc.chainParams(), _bc.info().timestamp(), _bc.number() ); + transaction.checkOutExternalGas( + _bc.chainParams(), _bc.info().timestamp(), _bc.number(), false ); } assert( _bc.currentHash() == m_currentBlock.parentHash() ); @@ -483,7 +484,7 @@ tuple< TransactionReceipts, unsigned > Block::syncEveryone( LOG( m_logger ) << "Transaction " << tr.sha3() << " WouldNotBeInBlock: gasPrice " << tr.gasPrice() << " < " << _gasPrice; - if ( SkipInvalidTransactionsPatch::isEnabled( _bc ) ) { + if ( SkipInvalidTransactionsPatch::isEnabledInWorkingBlock() ) { // Add to the user-originated transactions that we've executed. m_transactions.push_back( tr ); m_transactionSet.insert( tr.sha3() ); @@ -507,7 +508,7 @@ tuple< TransactionReceipts, unsigned > Block::syncEveryone( ExecutionResult res = execute( _bc.lastBlockHashes(), tr, Permanence::Committed, OnOpFunc() ); - if ( !SkipInvalidTransactionsPatch::isEnabled( _bc ) || + if ( !SkipInvalidTransactionsPatch::isEnabledInWorkingBlock() || res.excepted != TransactionException::WouldNotBeInBlock ) { receipts.push_back( m_receipts.back() ); @@ -631,7 +632,7 @@ u256 Block::enact( VerifiedBlockRef const& _block, BlockChain const& _bc ) { // << state().getNonce( tr.from() ) << ") value = " << tr.value() << // endl; const_cast< Transaction& >( tr ).checkOutExternalGas( - _bc.chainParams(), _bc.info().timestamp(), _bc.number() ); + _bc.chainParams(), _bc.info().timestamp(), _bc.number(), false ); execute( _bc.lastBlockHashes(), tr ); // cerr << "Now: " // << "State #" << state().getNonce( tr.from() ) << endl; @@ -762,10 +763,8 @@ u256 Block::enact( VerifiedBlockRef const& _block, BlockChain const& _bc ) { assert( _bc.sealEngine() ); DEV_TIMED_ABOVE( "applyRewards", 500 ) - applyRewards( - rewarded, _bc.sealEngine()->blockReward( - _bc.info( _bc.numberHash( m_currentBlock.number() - 1 ) ).timestamp(), - m_currentBlock.number() ) ); + applyRewards( rewarded, + _bc.sealEngine()->blockReward( previousInfo().timestamp(), m_currentBlock.number() ) ); if ( m_currentBlock.gasUsed() != gasUsed() ) { // Do not commit changes of state @@ -875,8 +874,7 @@ ExecutionResult Block::execute( if ( _p == Permanence::Committed || _p == Permanence::CommittedWithoutState || _p == Permanence::Uncommitted ) { // Add to the user-originated transactions that we've executed. - if ( !SkipInvalidTransactionsPatch::isEnabledWhen( - m_sealEngine->chainParams(), previousInfo().timestamp() ) || + if ( !SkipInvalidTransactionsPatch::isEnabledWhen( previousInfo().timestamp() ) || resultReceipt.first.excepted != TransactionException::WouldNotBeInBlock ) { m_transactions.push_back( _t ); m_receipts.push_back( resultReceipt.second ); @@ -996,9 +994,7 @@ void Block::commitToSeal( // Apply rewards last of all. assert( _bc.sealEngine() ); applyRewards( uncleBlockHeaders, - _bc.sealEngine()->blockReward( - _bc.info( _bc.numberHash( m_currentBlock.number() - 1 ) ).timestamp(), - m_currentBlock.number() ) ); + _bc.sealEngine()->blockReward( previousInfo().timestamp(), m_currentBlock.number() ) ); // Commit any and all changes to the trie that are in the cache, then update the state root // accordingly. diff --git a/libethereum/BlockChain.cpp b/libethereum/BlockChain.cpp index 9c71f5a29..b4eb2cec0 100644 --- a/libethereum/BlockChain.cpp +++ b/libethereum/BlockChain.cpp @@ -1772,7 +1772,7 @@ bool BlockChain::isPatchTimestampActiveInBlockNumber( time_t _ts, BlockNumber _b if ( _bn == PendingBlock ) _bn = number() + 1; - time_t prev_ts = this->info( this->numberHash( _bn ) ).timestamp(); + time_t prev_ts = this->info( this->numberHash( _bn - 1 ) ).timestamp(); return prev_ts >= _ts; } diff --git a/libethereum/Client.cpp b/libethereum/Client.cpp index 517a8ade4..2665af77d 100644 --- a/libethereum/Client.cpp +++ b/libethereum/Client.cpp @@ -1174,10 +1174,10 @@ h256 Client::importTransaction( Transaction const& _t ) { state = this->state().createStateReadOnlyCopy(); gasBidPrice = this->gasBidPrice(); - // We need to check external gas under mutex to be sure about current block bumber + // We need to check external gas under mutex to be sure about current block number // correctness const_cast< Transaction& >( _t ).checkOutExternalGas( - chainParams(), bc().info().timestamp(), number() ); + chainParams(), bc().info().timestamp(), number(), false ); } Executive::verifyTransaction( _t, bc().info().timestamp(), diff --git a/libethereum/ClientBase.cpp b/libethereum/ClientBase.cpp index 905504225..1ec18561c 100644 --- a/libethereum/ClientBase.cpp +++ b/libethereum/ClientBase.cpp @@ -117,7 +117,7 @@ std::pair< u256, ExecutionResult > ClientBase::estimateGas( Address const& _from int64_t upperBound = _maxGas; if ( upperBound == Invalid256 || upperBound > c_maxGasEstimate ) upperBound = c_maxGasEstimate; - int64_t lowerBound = CorrectForkInPowPatch::isEnabled( bc() ) ? + int64_t lowerBound = CorrectForkInPowPatch::isEnabledInWorkingBlock() ? Transaction::baseGasRequired( !_dest, &_data, bc().sealEngine()->chainParams().makeEvmSchedule( bc().info().timestamp(), bc().number() ) ) : diff --git a/libethereum/Precompiled.cpp b/libethereum/Precompiled.cpp index 2d0b13ca5..ecbf7f770 100644 --- a/libethereum/Precompiled.cpp +++ b/libethereum/Precompiled.cpp @@ -811,7 +811,7 @@ ETH_REGISTER_PRECOMPILED( getConfigVariableUint256 )( bytesConstRef _in ) { // need to proccess it in a different way // TODO Check if this precompiled can be called on historic block if ( isCallToHistoricData( rawName ) && - PrecompiledConfigPatch::isEnabledInPendingBlock() ) { + PrecompiledConfigPatch::isEnabledInWorkingBlock() ) { if ( !g_skaleHost ) throw std::runtime_error( "SkaleHost accessor was not initialized" ); @@ -921,7 +921,7 @@ ETH_REGISTER_PRECOMPILED( getConfigVariableString )( bytesConstRef _in ) { // need to proccess it in a different way // TODO Check if this precompiled can be called on historic block if ( isCallToHistoricData( rawName ) && - PrecompiledConfigPatch::isEnabledInPendingBlock() ) { + PrecompiledConfigPatch::isEnabledInWorkingBlock() ) { if ( !g_skaleHost ) throw std::runtime_error( "SkaleHost accessor was not initialized" ); diff --git a/libethereum/SchainPatch.cpp b/libethereum/SchainPatch.cpp index 516250bc1..06d1cc465 100644 --- a/libethereum/SchainPatch.cpp +++ b/libethereum/SchainPatch.cpp @@ -79,11 +79,7 @@ void SchainPatch::printInfo( const std::string& _patchName, time_t _timeStamp ) cnote << "Patch " << _patchName << " is set at timestamp " << _timeStamp; } } -bool SchainPatch::isPatchEnabled( - SchainPatchEnum _patchEnum, const dev::eth::BlockChain& _bc, dev::eth::BlockNumber _bn ) { - time_t timestamp = chainParams.getPatchTimestamp( _patchEnum ); - return _bc.isPatchTimestampActiveInBlockNumber( timestamp, _bn ); -} + bool SchainPatch::isPatchEnabledWhen( SchainPatchEnum _patchEnum, time_t _committedBlockTimestamp ) { time_t activationTimestamp = chainParams.getPatchTimestamp( _patchEnum ); diff --git a/libethereum/SchainPatch.h b/libethereum/SchainPatch.h index 8ef06e737..46ee4f270 100644 --- a/libethereum/SchainPatch.h +++ b/libethereum/SchainPatch.h @@ -11,7 +11,7 @@ namespace dev { namespace eth { -class EVMSchedule; +struct EVMSchedule; } } // namespace dev @@ -25,8 +25,10 @@ class SchainPatch { protected: static void printInfo( const std::string& _patchName, time_t _timeStamp ); - static bool isPatchEnabled( SchainPatchEnum _patchEnum, const dev::eth::BlockChain& _bc, - dev::eth::BlockNumber _bn = dev::eth::LatestBlock ); + static bool isPatchEnabledInWorkingBlock( SchainPatchEnum _patchEnum ) { + time_t activationTimestamp = chainParams.getPatchTimestamp( _patchEnum ); + return activationTimestamp != 0 && committedBlockTimestamp >= activationTimestamp; + } static bool isPatchEnabledWhen( SchainPatchEnum _patchEnum, time_t _committedBlockTimestamp ); protected: @@ -34,42 +36,39 @@ class SchainPatch { static std::atomic< time_t > committedBlockTimestamp; }; -#define DEFINE_AMNESIC_PATCH( BlaBlaPatch ) \ - class BlaBlaPatch : public SchainPatch { \ - public: \ - static SchainPatchEnum getEnum() { return SchainPatchEnum::BlaBlaPatch; } \ - static bool isEnabledInPendingBlock() { \ - time_t activationTimestamp = chainParams.getPatchTimestamp( getEnum() ); \ - return activationTimestamp != 0 && committedBlockTimestamp >= activationTimestamp; \ - } \ +#define DEFINE_AMNESIC_PATCH( BlaBlaPatch ) \ + class BlaBlaPatch : public SchainPatch { \ + public: \ + static SchainPatchEnum getEnum() { return SchainPatchEnum::BlaBlaPatch; } \ + static bool isEnabledInWorkingBlock() { \ + return isPatchEnabledInWorkingBlock( getEnum() ); \ + } \ }; // TODO One more overload - with EnvInfo? -#define DEFINE_SIMPLE_PATCH( BlaBlaPatch ) \ - class BlaBlaPatch : public SchainPatch { \ - public: \ - static SchainPatchEnum getEnum() { return SchainPatchEnum::BlaBlaPatch; } \ - static bool isEnabled( \ - const dev::eth::BlockChain& _bc, dev::eth::BlockNumber _bn = dev::eth::LatestBlock ) { \ - return isPatchEnabled( getEnum(), _bc, _bn ); \ - } \ - static bool isEnabledWhen( time_t _committedBlockTimestamp ) { \ - return isPatchEnabledWhen( getEnum(), _committedBlockTimestamp ); \ - } \ +#define DEFINE_SIMPLE_PATCH( BlaBlaPatch ) \ + class BlaBlaPatch : public SchainPatch { \ + public: \ + static SchainPatchEnum getEnum() { return SchainPatchEnum::BlaBlaPatch; } \ + static bool isEnabledInWorkingBlock() { \ + return isPatchEnabledInWorkingBlock( getEnum() ); \ + } \ + static bool isEnabledWhen( time_t _committedBlockTimestamp ) { \ + return isPatchEnabledWhen( getEnum(), _committedBlockTimestamp ); \ + } \ }; -#define DEFINE_EVM_PATCH( BlaBlaPatch ) \ - class BlaBlaPatch : public SchainPatch { \ - public: \ - static SchainPatchEnum getEnum() { return SchainPatchEnum::BlaBlaPatch; } \ - static bool isEnabled( \ - const dev::eth::BlockChain& _bc, dev::eth::BlockNumber _bn = dev::eth::LatestBlock ) { \ - return isPatchEnabled( getEnum(), _bc, _bn ); \ - } \ - static bool isEnabledWhen( time_t _committedBlockTimestamp ) { \ - return isPatchEnabledWhen( getEnum(), _committedBlockTimestamp ); \ - } \ - static dev::eth::EVMSchedule makeSchedule( const dev::eth::EVMSchedule& base ); \ +#define DEFINE_EVM_PATCH( BlaBlaPatch ) \ + class BlaBlaPatch : public SchainPatch { \ + public: \ + static SchainPatchEnum getEnum() { return SchainPatchEnum::BlaBlaPatch; } \ + static bool isEnabledInWorkingBlock() { \ + return isPatchEnabledInWorkingBlock( getEnum() ); \ + } \ + static bool isEnabledWhen( time_t _committedBlockTimestamp ) { \ + return isPatchEnabledWhen( getEnum(), _committedBlockTimestamp ); \ + } \ + static dev::eth::EVMSchedule makeSchedule( const dev::eth::EVMSchedule& base ); \ }; /* diff --git a/libethereum/SkaleHost.cpp b/libethereum/SkaleHost.cpp index 1b3e011f8..1e0c0bf27 100644 --- a/libethereum/SkaleHost.cpp +++ b/libethereum/SkaleHost.cpp @@ -654,7 +654,8 @@ void SkaleHost::createBlock( const ConsensusExtFace::transactions_vector& _appro // TODO clear occasionally this cache?! if ( m_m_transaction_cache.find( sha.asArray() ) != m_m_transaction_cache.cend() ) { Transaction t = m_m_transaction_cache.at( sha.asArray() ); - t.checkOutExternalGas( m_client.chainParams(), m_client.number(), true ); + t.checkOutExternalGas( m_client.chainParams(), + m_client.blockInfo( LatestBlock ).timestamp(), m_client.number(), true ); out_txns.push_back( t ); LOG( m_debugLogger ) << "Dropping good txn " << sha << std::endl; m_debugTracer.tracepoint( "drop_good" ); @@ -668,8 +669,8 @@ void SkaleHost::createBlock( const ConsensusExtFace::transactions_vector& _appro // ).detach(); } else { Transaction t( data, CheckTransaction::Everything, true ); - t.checkOutExternalGas( - m_client.chainParams(), m_client.bc().info().timestamp(), m_client.number() ); + t.checkOutExternalGas( m_client.chainParams(), + m_client.blockInfo( LatestBlock ).timestamp(), m_client.number(), false ); out_txns.push_back( t ); LOG( m_debugLogger ) << "Will import consensus-born txn"; m_debugTracer.tracepoint( "import_consensus_born" ); diff --git a/libethereum/Transaction.cpp b/libethereum/Transaction.cpp index 7338bf060..2f5605351 100644 --- a/libethereum/Transaction.cpp +++ b/libethereum/Transaction.cpp @@ -181,8 +181,8 @@ u256 Transaction::gasPrice() const { } } -void Transaction::checkOutExternalGas( - const ChainParams& _cp, time_t _committedBlockTimestamp, uint64_t _bn, bool _force ) { +void Transaction::checkOutExternalGas( const ChainParams& _cp, time_t _committedBlockTimestamp, + uint64_t _committedBlockNumber, bool _force ) { u256 const& difficulty = _cp.externalGasDifficulty; assert( difficulty > 0 ); if ( ( _force || !m_externalGasIsChecked ) && !isInvalid() ) { @@ -196,7 +196,8 @@ void Transaction::checkOutExternalGas( EVMSchedule scheduleForUse = ConstantinopleSchedule; if ( CorrectForkInPowPatch::isEnabledWhen( _committedBlockTimestamp ) ) - scheduleForUse = _cp.makeEvmSchedule( _committedBlockTimestamp, _bn ); + scheduleForUse = _cp.makeEvmSchedule( + _committedBlockTimestamp, _committedBlockNumber ); // BUG should be +1 if ( externalGas >= baseGasRequired( scheduleForUse ) ) m_externalGas = externalGas; diff --git a/libethereum/Transaction.h b/libethereum/Transaction.h index dd36e054b..e35edf50b 100644 --- a/libethereum/Transaction.h +++ b/libethereum/Transaction.h @@ -122,8 +122,8 @@ class Transaction : public TransactionBase { u256 gasPrice() const; - void checkOutExternalGas( const ChainParams& _cp, time_t _committedBlockTimestamp, uint64_t _bn, - bool _force = false ); + void checkOutExternalGas( const ChainParams& _cp, time_t _committedBlockTimestamp, + uint64_t _committedBlockNumber, bool _force ); void ignoreExternalGas() { m_externalGasIsChecked = true; diff --git a/libevm/ExtVMFace.h b/libevm/ExtVMFace.h index 0813f733d..4771e9004 100644 --- a/libevm/ExtVMFace.h +++ b/libevm/ExtVMFace.h @@ -131,19 +131,19 @@ struct CallParameters { class EnvInfo { public: - EnvInfo( BlockHeader const& _current, LastBlockHashesFace const& _lh, + EnvInfo( BlockHeader const& _working, LastBlockHashesFace const& _lh, time_t _committedBlockTimestamp, u256 const& _gasUsed, u256 const& _chainID ) - : m_headerInfo( _current ), + : m_headerInfo( _working ), m_lastHashes( _lh ), m_committedBlockTimestamp( _committedBlockTimestamp ), m_gasUsed( _gasUsed ), m_chainID( _chainID ) {} // Constructor with custom gasLimit - used in some synthetic scenarios like eth_estimateGas RPC // method - EnvInfo( BlockHeader const& _current, LastBlockHashesFace const& _lh, + EnvInfo( BlockHeader const& _working, LastBlockHashesFace const& _lh, time_t _committedBlockTimestamp, u256 const& _gasUsed, u256 const& _gasLimit, u256 const& _chainID ) - : EnvInfo( _current, _lh, _committedBlockTimestamp, _gasUsed, _chainID ) { + : EnvInfo( _working, _lh, _committedBlockTimestamp, _gasUsed, _chainID ) { m_headerInfo.setGasLimit( _gasLimit ); } diff --git a/libhistoric/AlethExtVM.h b/libhistoric/AlethExtVM.h index 793928482..edc4313ad 100644 --- a/libhistoric/AlethExtVM.h +++ b/libhistoric/AlethExtVM.h @@ -98,11 +98,11 @@ class AlethExtVM : public ExtVMFace { private: EVMSchedule initEvmSchedule( - time_t _committedBlockTimestamp, int64_t _blockNumber, u256 const& _version ) const { + time_t _committedBlockTimestamp, int64_t _workingBlockNumber, u256 const& _version ) const { // If _version is latest for the block, select corresponding latest schedule. // Otherwise run with the latest schedule known to correspond to the _version. EVMSchedule currentBlockSchedule = - m_chainParams.makeEvmSchedule( _committedBlockTimestamp, _blockNumber ); + m_chainParams.makeEvmSchedule( _committedBlockTimestamp, _workingBlockNumber ); if ( currentBlockSchedule.accountVersion == _version ) return currentBlockSchedule; else diff --git a/libskale/OverlayDB.cpp b/libskale/OverlayDB.cpp index 40456b9bd..113cb9987 100644 --- a/libskale/OverlayDB.cpp +++ b/libskale/OverlayDB.cpp @@ -151,7 +151,7 @@ void OverlayDB::commitStorageValues() { static const h256 ZERO_VALUE( 0 ); - if ( ContractStorageZeroValuePatch::isEnabledInPendingBlock() && value == ZERO_VALUE ) { + if ( ContractStorageZeroValuePatch::isEnabledInWorkingBlock() && value == ZERO_VALUE ) { // if the value is zero, the pair will be deleted in LevelDB // if it exists m_db_face->kill( diff --git a/libskale/SkipInvalidTransactionsPatch.cpp b/libskale/SkipInvalidTransactionsPatch.cpp index dd9c6f7dd..571f1bc96 100644 --- a/libskale/SkipInvalidTransactionsPatch.cpp +++ b/libskale/SkipInvalidTransactionsPatch.cpp @@ -13,10 +13,10 @@ bool SkipInvalidTransactionsPatch::hasPotentialInvalidTransactionsInBlock( return true; if ( _bn == dev::eth::PendingBlock ) - return !isEnabled( _bc ); + return !isEnabledInWorkingBlock(); if ( _bn == dev::eth::LatestBlock ) _bn = _bc.number(); - return !isEnabled( _bc, _bn ); + return !isEnabledInBlock( _bc, _bn ); } diff --git a/libskale/SkipInvalidTransactionsPatch.h b/libskale/SkipInvalidTransactionsPatch.h index 5ea060f35..5f450fd20 100644 --- a/libskale/SkipInvalidTransactionsPatch.h +++ b/libskale/SkipInvalidTransactionsPatch.h @@ -35,18 +35,16 @@ class Client; class SkipInvalidTransactionsPatch : public SchainPatch { public: - static std::string getName() { return "SkipInvalidTransactionsPatch"; } static SchainPatchEnum getEnum() { return SchainPatchEnum::SkipInvalidTransactionsPatch; } - static bool isEnabled( - const dev::eth::BlockChain& _bc, dev::eth::BlockNumber _bn = dev::eth::LatestBlock ) { + static bool isEnabledInWorkingBlock() { return isPatchEnabledInWorkingBlock( getEnum() ); } + static bool isEnabledWhen( time_t _committedBlockTimestamp ) { + return isPatchEnabledWhen( getEnum(), _committedBlockTimestamp ); + } + static bool isEnabledInBlock( + const dev::eth::BlockChain& _bc, dev::eth::BlockNumber _bn = dev::eth::PendingBlock ) { time_t timestamp = _bc.chainParams().getPatchTimestamp( getEnum() ); return _bc.isPatchTimestampActiveInBlockNumber( timestamp, _bn ); } - static bool isEnabledWhen( - const dev::eth::ChainOperationParams& _cp, time_t _lastBlockTimestamp ) { - time_t activationTimestamp = _cp.getPatchTimestamp( getEnum() ); - return activationTimestamp != 0 && _lastBlockTimestamp >= activationTimestamp; - } // returns true if block N can contain invalid transactions // returns false if this block was created with SkipInvalidTransactionsPatch and they were // skipped diff --git a/libskale/State.cpp b/libskale/State.cpp index 18c72e272..7d5e996c4 100644 --- a/libskale/State.cpp +++ b/libskale/State.cpp @@ -507,7 +507,7 @@ void State::commit( dev::eth::CommitBehaviour _commitBehaviour ) { m_db_ptr->kill( address ); m_db_ptr->killAuxiliary( address, Auxiliary::CODE ); - if ( StorageDestructionPatch::isEnabledInPendingBlock() ) { + if ( StorageDestructionPatch::isEnabledInWorkingBlock() ) { clearStorage( address ); } @@ -893,7 +893,7 @@ void State::rollback( size_t _savepoint ) { // change log entry. switch ( change.kind ) { case Change::Storage: - if ( ContractStoragePatch::isEnabledInPendingBlock() ) { + if ( ContractStoragePatch::isEnabledInWorkingBlock() ) { rollbackStorageChange( change, account ); } else { account.setStorage( change.key, change.value ); @@ -922,7 +922,7 @@ void State::rollback( size_t _savepoint ) { m_changeLog.pop_back(); } clearFileStorageCache(); - if ( !ContractStoragePatch::isEnabledInPendingBlock() ) { + if ( !ContractStoragePatch::isEnabledInWorkingBlock() ) { resetStorageChanges(); } } From 3936651302bf2f460b145098ea80fc2d71973ce0 Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Wed, 13 Mar 2024 12:05:42 +0000 Subject: [PATCH 038/154] SKALED-1583 Fix buid --- test/unittests/libethereum/SkaleHost.cpp | 38 +++--------------------- 1 file changed, 4 insertions(+), 34 deletions(-) diff --git a/test/unittests/libethereum/SkaleHost.cpp b/test/unittests/libethereum/SkaleHost.cpp index 330b3e993..3d743ce5f 100644 --- a/test/unittests/libethereum/SkaleHost.cpp +++ b/test/unittests/libethereum/SkaleHost.cpp @@ -244,7 +244,6 @@ BOOST_DATA_TEST_CASE( validTransaction, skipInvalidTransactionsVariants, skipInv auto& client = fixture.client; auto& coinbase = fixture.coinbase; auto& accountHolder = fixture.accountHolder; - auto& skaleHost = fixture.skaleHost; auto& stub = fixture.stub; auto senderAddress = coinbase.address(); @@ -295,8 +294,6 @@ BOOST_DATA_TEST_CASE( transactionRlpBad, skipInvalidTransactionsVariants, skipIn SkaleHostFixture fixture( std::map( {{"skipInvalidTransactionsPatchTimestamp", to_string(int(skipInvalidTransactionsFlag))}} ) ); auto& client = fixture.client; auto& coinbase = fixture.coinbase; - auto& accountHolder = fixture.accountHolder; - auto& skaleHost = fixture.skaleHost; auto& stub = fixture.stub; auto senderAddress = coinbase.address(); @@ -384,7 +381,6 @@ BOOST_DATA_TEST_CASE( transactionSigZero, skipInvalidTransactionsVariants, skipI auto& client = fixture.client; auto& coinbase = fixture.coinbase; auto& accountHolder = fixture.accountHolder; - auto& skaleHost = fixture.skaleHost; auto& stub = fixture.stub; auto senderAddress = coinbase.address(); @@ -441,7 +437,6 @@ BOOST_DATA_TEST_CASE( transactionSigBad, skipInvalidTransactionsVariants, skipIn auto& client = fixture.client; auto& coinbase = fixture.coinbase; auto& accountHolder = fixture.accountHolder; - auto& skaleHost = fixture.skaleHost; auto& stub = fixture.stub; auto senderAddress = coinbase.address(); @@ -498,7 +493,6 @@ BOOST_DATA_TEST_CASE( transactionGasIncorrect, skipInvalidTransactionsVariants, auto& client = fixture.client; auto& coinbase = fixture.coinbase; auto& accountHolder = fixture.accountHolder; - auto& skaleHost = fixture.skaleHost; auto& stub = fixture.stub; auto senderAddress = coinbase.address(); @@ -553,7 +547,6 @@ BOOST_DATA_TEST_CASE( transactionGasNotEnough, skipInvalidTransactionsVariants, auto& client = fixture.client; auto& coinbase = fixture.coinbase; auto& accountHolder = fixture.accountHolder; - auto& skaleHost = fixture.skaleHost; auto& stub = fixture.stub; auto senderAddress = coinbase.address(); @@ -616,7 +609,6 @@ BOOST_DATA_TEST_CASE( transactionNonceBig, skipInvalidTransactionsVariants, skip auto& client = fixture.client; auto& coinbase = fixture.coinbase; auto& accountHolder = fixture.accountHolder; - auto& skaleHost = fixture.skaleHost; auto& stub = fixture.stub; auto senderAddress = coinbase.address(); @@ -670,7 +662,6 @@ BOOST_DATA_TEST_CASE( transactionNonceSmall, skipInvalidTransactionsVariants, sk auto& client = fixture.client; auto& coinbase = fixture.coinbase; auto& accountHolder = fixture.accountHolder; - auto& skaleHost = fixture.skaleHost; auto& stub = fixture.stub; auto senderAddress = coinbase.address(); @@ -736,7 +727,6 @@ BOOST_DATA_TEST_CASE( transactionBalanceBad, skipInvalidTransactionsVariants, sk auto& client = fixture.client; auto& coinbase = fixture.coinbase; auto& accountHolder = fixture.accountHolder; - auto& skaleHost = fixture.skaleHost; auto& stub = fixture.stub; auto senderAddress = coinbase.address(); @@ -815,8 +805,6 @@ BOOST_DATA_TEST_CASE( transactionGasBlockLimitExceeded, skipInvalidTransactionsV SkaleHostFixture fixture( std::map( {{"skipInvalidTransactionsPatchTimestamp", to_string(int(skipInvalidTransactionsFlag))}} ) ); auto& client = fixture.client; auto& coinbase = fixture.coinbase; - auto& accountHolder = fixture.accountHolder; - auto& skaleHost = fixture.skaleHost; auto& stub = fixture.stub; auto senderAddress = coinbase.address(); @@ -881,7 +869,6 @@ BOOST_AUTO_TEST_CASE( gasLimitInBlockProposal ) { SkaleHostFixture fixture; auto& client = fixture.client; auto& coinbase = fixture.coinbase; - auto& accountHolder = fixture.accountHolder; auto& skaleHost = fixture.skaleHost; auto& stub = fixture.stub; auto& account2 = fixture.account2; @@ -936,7 +923,6 @@ BOOST_AUTO_TEST_CASE( transactionDropReceive SkaleHostFixture fixture; auto& client = fixture.client; auto& coinbase = fixture.coinbase; - auto& accountHolder = fixture.accountHolder; auto& skaleHost = fixture.skaleHost; auto& stub = fixture.stub; auto& tq = fixture.tq; @@ -953,7 +939,7 @@ BOOST_AUTO_TEST_CASE( transactionDropReceive // 1st tx Transaction tx1 = fixture.tx_from_json( json ); - tx1.checkOutExternalGas( client->chainParams(), client->latestBlock().info().timestamp(), client->number() ); + tx1.checkOutExternalGas( client->chainParams(), client->latestBlock().info().timestamp(), client->number(), false ); // submit it! tq->import( tx1 ); @@ -1001,8 +987,6 @@ BOOST_AUTO_TEST_CASE( transactionDropQueue, SkaleHostFixture fixture; auto& client = fixture.client; auto& coinbase = fixture.coinbase; - auto& accountHolder = fixture.accountHolder; - auto& skaleHost = fixture.skaleHost; auto& stub = fixture.stub; auto& tq = fixture.tq; @@ -1019,7 +1003,7 @@ BOOST_AUTO_TEST_CASE( transactionDropQueue, // 1st tx Transaction tx1 = fixture.tx_from_json( json ); - tx1.checkOutExternalGas( client->chainParams(), client->latestBlock().info().timestamp(), client->number() ); + tx1.checkOutExternalGas( client->chainParams(), client->latestBlock().info().timestamp(), client->number(), false ); // submit it! tq->import( tx1 ); @@ -1067,8 +1051,6 @@ BOOST_AUTO_TEST_CASE( transactionDropByGasPrice SkaleHostFixture fixture; auto& client = fixture.client; auto& coinbase = fixture.coinbase; - auto& accountHolder = fixture.accountHolder; - auto& skaleHost = fixture.skaleHost; auto& stub = fixture.stub; auto& tq = fixture.tq; @@ -1085,7 +1067,7 @@ BOOST_AUTO_TEST_CASE( transactionDropByGasPrice // 1st tx Transaction tx1 = fixture.tx_from_json( json ); - tx1.checkOutExternalGas( client->chainParams(), client->latestBlock().info().timestamp(), client->number() ); + tx1.checkOutExternalGas( client->chainParams(), client->latestBlock().info().timestamp(), client->number(), false ); // submit it! tq->import( tx1 ); @@ -1133,7 +1115,6 @@ BOOST_AUTO_TEST_CASE( transactionDropByGasPriceReceive SkaleHostFixture fixture; auto& client = fixture.client; auto& coinbase = fixture.coinbase; - auto& accountHolder = fixture.accountHolder; auto& skaleHost = fixture.skaleHost; auto& stub = fixture.stub; auto& tq = fixture.tq; @@ -1158,7 +1139,7 @@ BOOST_AUTO_TEST_CASE( transactionDropByGasPriceReceive // 1st tx Transaction tx1 = fixture.tx_from_json( json ); - tx1.checkOutExternalGas( client->chainParams(), client->latestBlock().info().timestamp(), client->number() ); + tx1.checkOutExternalGas( client->chainParams(), client->latestBlock().info().timestamp(), client->number(), false ); RLPStream stream1; tx1.streamRLP( stream1 ); @@ -1209,8 +1190,6 @@ BOOST_AUTO_TEST_CASE( transactionRace SkaleHostFixture fixture; auto& client = fixture.client; auto& coinbase = fixture.coinbase; - auto& accountHolder = fixture.accountHolder; - auto& skaleHost = fixture.skaleHost; auto& stub = fixture.stub; auto senderAddress = coinbase.address(); @@ -1271,7 +1250,6 @@ BOOST_AUTO_TEST_CASE( partialCatchUp auto& client = fixture.client; auto& coinbase = fixture.coinbase; auto& accountHolder = fixture.accountHolder; - auto& skaleHost = fixture.skaleHost; auto& stub = fixture.stub; auto senderAddress = coinbase.address(); @@ -1325,11 +1303,7 @@ BOOST_AUTO_TEST_CASE( partialCatchUp BOOST_AUTO_TEST_CASE( getBlockRandom ) { SkaleHostFixture fixture; - auto& client = fixture.client; - auto& coinbase = fixture.coinbase; - auto& accountHolder = fixture.accountHolder; auto& skaleHost = fixture.skaleHost; - auto& stub = fixture.stub; PrecompiledExecutor exec = PrecompiledRegistrar::executor( "getBlockRandom" ); auto res = exec( bytesConstRef() ); @@ -1341,11 +1315,7 @@ BOOST_AUTO_TEST_CASE( getBlockRandom ) { BOOST_AUTO_TEST_CASE( getIMABLSPUblicKey ) { SkaleHostFixture fixture; - auto& client = fixture.client; - auto& coinbase = fixture.coinbase; - auto& accountHolder = fixture.accountHolder; auto& skaleHost = fixture.skaleHost; - auto& stub = fixture.stub; PrecompiledExecutor exec = PrecompiledRegistrar::executor( "getIMABLSPublicKey" ); auto res = exec( bytesConstRef() ); From 3d5cefc05b47a226cf159de1fac8882e58f92071 Mon Sep 17 00:00:00 2001 From: Oleh Date: Wed, 13 Mar 2024 18:56:50 +0000 Subject: [PATCH 039/154] #1774 change hwm limits for zmq broadcast --- libskale/broadcaster.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/libskale/broadcaster.cpp b/libskale/broadcaster.cpp index 3b971c2aa..746e8c9cb 100644 --- a/libskale/broadcaster.cpp +++ b/libskale/broadcaster.cpp @@ -97,10 +97,8 @@ void* ZmqBroadcaster::server_socket() const { val = 60000; zmq_setsockopt( m_zmq_server_socket, ZMQ_HEARTBEAT_TTL, &val, sizeof( val ) ); - - val = 16; - zmq_setsockopt( m_zmq_server_socket, ZMQ_RCVHWM, &val, sizeof( val ) ); - val = 16; + // remove limits to prevent txns from being dropped out + val = 0; zmq_setsockopt( m_zmq_server_socket, ZMQ_SNDHWM, &val, sizeof( val ) ); @@ -136,9 +134,6 @@ void* ZmqBroadcaster::client_socket() const { value = 16; zmq_setsockopt( m_zmq_client_socket, ZMQ_RCVHWM, &value, sizeof( value ) ); - value = 16; - zmq_setsockopt( m_zmq_client_socket, ZMQ_SNDHWM, &value, sizeof( value ) ); - const dev::eth::ChainParams& ch = m_client.chainParams(); @@ -254,6 +249,8 @@ void ZmqBroadcaster::broadcast( const std::string& _rlp ) { int res = zmq_send( server_socket(), const_cast< char* >( _rlp.c_str() ), _rlp.size(), 0 ); if ( res <= 0 ) { + clog( dev::VerbosityWarning, "zmq-broadcaster" ) + << "Got error " << res << " in zmq_send: " << zmq_strerror( res ); throw std::runtime_error( "Zmq can't send data" ); } } From bf14d012927b5edd0b809d2b8af58848e49be9bd Mon Sep 17 00:00:00 2001 From: Oleh Date: Wed, 13 Mar 2024 19:34:53 +0000 Subject: [PATCH 040/154] #1774 fix typo --- libskale/broadcaster.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libskale/broadcaster.cpp b/libskale/broadcaster.cpp index 746e8c9cb..195b055f9 100644 --- a/libskale/broadcaster.cpp +++ b/libskale/broadcaster.cpp @@ -132,7 +132,7 @@ void* ZmqBroadcaster::client_socket() const { value = 300; zmq_setsockopt( m_zmq_client_socket, ZMQ_TCP_KEEPALIVE_INTVL, &value, sizeof( value ) ); - value = 16; + value = 0; zmq_setsockopt( m_zmq_client_socket, ZMQ_RCVHWM, &value, sizeof( value ) ); const dev::eth::ChainParams& ch = m_client.chainParams(); From 888c64d2b84369da653a0e01b2dd6c61cb821aac Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Mon, 18 Mar 2024 17:22:16 +0000 Subject: [PATCH 041/154] SKALED-1583 Use correct block in eth_call() and eth_estimateGas(). Also SKALED-1851, SKALED-1846 --- libethereum/Client.cpp | 15 +--- libethereum/Client.h | 2 - libethereum/ClientBase.cpp | 3 +- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 95 ++++++++++++++++++++++- 4 files changed, 97 insertions(+), 18 deletions(-) diff --git a/libethereum/Client.cpp b/libethereum/Client.cpp index 2665af77d..ee49498de 100644 --- a/libethereum/Client.cpp +++ b/libethereum/Client.cpp @@ -1084,19 +1084,6 @@ Block Client::blockByNumber( BlockNumber _h ) const { } #endif -Block Client::latestBlock() const { - // TODO Why it returns not-filled block??! (see Block ctor) - try { - DEV_GUARDED( m_blockImportMutex ) { return Block( bc(), bc().currentHash(), m_state ); } - assert( false ); - return Block( bc() ); - } catch ( Exception& ex ) { - ex << errinfo_block( bc().block( bc().currentHash() ) ); - onBadBlock( ex ); - return Block( bc() ); - } -} - void Client::flushTransactions() { doWork(); } @@ -1249,7 +1236,7 @@ ExecutionResult Client::call( Address const& _from, u256 _value, Address _dest, } #endif - Block temp = latestBlock(); + Block temp = preSeal(); // TODO there can be race conditions between prev and next line! State readStateForLock = temp.mutableState().createStateReadOnlyCopy(); diff --git a/libethereum/Client.h b/libethereum/Client.h index c446b245f..91290449d 100644 --- a/libethereum/Client.h +++ b/libethereum/Client.h @@ -250,8 +250,6 @@ class Client : public ClientBase, protected Worker { /// Queues a function to be executed in the main thread (that owns the blockchain, etc). void executeInMainThread( std::function< void() > const& _function ); - Block latestBlock() const; - /// should be called after the constructor of the most derived class finishes. void startWorking() { assert( m_skaleHost ); diff --git a/libethereum/ClientBase.cpp b/libethereum/ClientBase.cpp index 1ec18561c..7d6acf3de 100644 --- a/libethereum/ClientBase.cpp +++ b/libethereum/ClientBase.cpp @@ -123,7 +123,8 @@ std::pair< u256, ExecutionResult > ClientBase::estimateGas( Address const& _from bc().info().timestamp(), bc().number() ) ) : Transaction::baseGasRequired( !_dest, &_data, EVMSchedule() ); - Block bk = latestBlock(); + Block bk = preSeal(); + if ( upperBound > bk.info().gasLimit() ) { upperBound = bk.info().gasLimit().convert_to< int64_t >(); } diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index aa9afd19d..6dd4f9c89 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -291,7 +291,9 @@ struct JsonRpcFixture : public TestOutputHelperFixture { chainParams.sChain._patchTimestamps[static_cast(SchainPatchEnum::ContractStoragePatch)] = 1; chainParams.sChain._patchTimestamps[static_cast(SchainPatchEnum::StorageDestructionPatch)] = 1; powPatchActivationTimestamp = time(nullptr) + 60; - chainParams.sChain._patchTimestamps[static_cast(SchainPatchEnum::CorrectForkInPowPatch)] = powPatchActivationTimestamp; // 10 guessed seconds + chainParams.sChain._patchTimestamps[static_cast(SchainPatchEnum::CorrectForkInPowPatch)] = powPatchActivationTimestamp; + push0PatchActivationTimestamp = time(nullptr) + 5; + chainParams.sChain._patchTimestamps[static_cast(SchainPatchEnum::PushZeroPatch)] = push0PatchActivationTimestamp; chainParams.sChain.emptyBlockIntervalMs = _emptyBlockIntervalMs; // add random extra data to randomize genesis hash and get random DB path, // so that tests can be run in parallel @@ -422,6 +424,7 @@ struct JsonRpcFixture : public TestOutputHelperFixture { std::string adminSession; SkaleServerOverride* skale_server_connector; time_t powPatchActivationTimestamp; + time_t push0PatchActivationTimestamp; }; struct RestrictedAddressFixture : public JsonRpcFixture { @@ -1264,6 +1267,96 @@ BOOST_AUTO_TEST_CASE( create_opcode ) { BOOST_CHECK( response2 != response1 ); } +BOOST_AUTO_TEST_CASE( push0_patch_activation ) { + JsonRpcFixture fixture; + auto senderAddress = fixture.coinbase.address(); + + fixture.client->setAuthor( senderAddress ); + dev::eth::simulateMining( *( fixture.client ), 1 ); + + fixture.client->setAuthor( fixture.account2.address() ); + dev::eth::simulateMining( *( fixture.client ), 1 ); + +/* +// SPDX-License-Identifier: GPL-3.0 + +pragma solidity >=0.8.2; + +contract Push0Test { + fallback() external payable { + assembly { + let t := add(9, 10) + } + } +} + +then convert to yul: solc --ir p0test.sol >p0test.yul + +then change code: + { + let r := add(88,99) + let tmp := verbatim_0i_1o(hex"5f") + } + +then compile! + +*/ + string compiled = + "608060405234156100135761001261003b565b5b61001b610040565b610023610031565b6101b761004382396101b781f35b6000604051905090565b600080fd5b56fe608060405261000f36600061015b565b805160208201f35b60006060905090565b6000604051905090565b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6100738261002a565b810181811067ffffffffffffffff821117156100925761009161003b565b5b80604052505050565b60006100a5610020565b90506100b1828261006a565b919050565b600067ffffffffffffffff8211156100d1576100d061003b565b5b6100da8261002a565b9050602081019050919050565b60006100f2826100b6565b6100fb8161009b565b915082825250919050565b7f7375636365737300000000000000000000000000000000000000000000000000600082015250565b600061013b60076100e7565b905061014960208201610106565b90565b600061015661012f565b905090565b6000610165610017565b809150600a6009015f505061017861014c565b9150509291505056fea2646970667358221220b3871ed09fbcbb1dac74c3cd48dafa5d097bea7c808b5ff2c16a996cf108d3c664736f6c63430008190033"; +// "60806040523415601057600f6031565b5b60166036565b601c6027565b604c60398239604c81f35b6000604051905090565b600080fd5b56fe6080604052600a600c565b005b60636058015f505056fea2646970667358221220ee9861b869ceda6de64f2ec7ccbebf2babce54b35502a866a4193e05ae595e1f64736f6c63430008130033"; + + Json::Value create; + + create["from"] = toJS( senderAddress ); + create["code"] = compiled; + create["gas"] = "1000000"; + + string txHash = fixture.rpcClient->eth_sendTransaction( create ); + dev::eth::mineTransaction( *( fixture.client ), 1 ); + + Json::Value receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); + BOOST_REQUIRE_EQUAL( receipt["status"], string( "0x1" ) ); // deploy should succeed + string contractAddress = receipt["contractAddress"].asString(); + + Json::Value callObject; + + callObject["from"] = toJS( fixture.account2.address() ); + callObject["to"] = contractAddress; + + // first try without PushZeroPatch + + txHash = fixture.rpcClient->eth_sendTransaction( callObject ); + dev::eth::mineTransaction( *( fixture.client ), 1 ); + receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); + BOOST_REQUIRE_EQUAL( receipt["status"], string( "0x0" ) ); // exec should fail + + string callResult = fixture.rpcClient->eth_call(callObject, "latest"); + BOOST_REQUIRE_EQUAL( callResult, string( "0x" ) ); // call too + + // wait for block after timestamp + BOOST_REQUIRE_LT( fixture.client->blockInfo(LatestBlock).timestamp(), fixture.push0PatchActivationTimestamp ); + while( time(nullptr) < fixture.push0PatchActivationTimestamp ) + sleep(1); + + // exec and call should fail in 1st block after timestamp too + callResult = fixture.rpcClient->eth_call(callObject, "latest"); + BOOST_REQUIRE_EQUAL( callResult, string( "0x" ) ); + + txHash = fixture.rpcClient->eth_sendTransaction( callObject ); + dev::eth::mineTransaction( *( fixture.client ), 1 ); + receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); + BOOST_REQUIRE_EQUAL( receipt["status"], string( "0x0" ) ); + + // in 1st block with patch they should succeed + callResult = fixture.rpcClient->eth_call(callObject, "latest"); + BOOST_REQUIRE_NE( callResult, string( "0x" ) ); + + txHash = fixture.rpcClient->eth_sendTransaction( callObject ); + dev::eth::mineTransaction( *( fixture.client ), 1 ); + receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); + BOOST_REQUIRE_EQUAL( receipt["status"], string( "0x1" ) ); +} + BOOST_AUTO_TEST_CASE( eth_estimateGas ) { JsonRpcFixture fixture( c_genesisConfigString ); From 263d4b72b20d3273d294fa689d332271861dfac8 Mon Sep 17 00:00:00 2001 From: DmytroNazarenko Date: Mon, 18 Mar 2024 19:26:10 +0000 Subject: [PATCH 042/154] #1825 Update eth_call unit test --- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index 041b8d6b0..545959ef8 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -855,6 +855,16 @@ BOOST_AUTO_TEST_CASE( simple_contract ) { string result = fixture.rpcClient->eth_call( call, "latest" ); BOOST_CHECK_EQUAL( result, "0x0000000000000000000000000000000000000000000000000000000000000007" ); + + Json::Value inputCall; + inputCall["to"] = contractAddress; + inputCall["input"] = "0xb3de648b0000000000000000000000000000000000000000000000000000000000000001"; + inputCall["gas"] = "1000000"; + inputCall["gasPrice"] = "0"; + result = fixture.rpcClient->eth_call( inputCall, "latest" ); + BOOST_CHECK_EQUAL( + result, "0x0000000000000000000000000000000000000000000000000000000000000007" ); + } /* From 450c3e683f293b4cacc342f6c80de2adf41d56fe Mon Sep 17 00:00:00 2001 From: DmytroNazarenko Date: Mon, 18 Mar 2024 21:21:32 +0000 Subject: [PATCH 043/154] #1825 Update eth_call unit test --- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 35 ++++++++++++++++------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index 545959ef8..1d77b7f12 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -815,20 +815,18 @@ BOOST_AUTO_TEST_CASE( simple_contract ) { JsonRpcFixture fixture; dev::eth::simulateMining( *( fixture.client ), 1 ); - + // pragma solidity 0.8.4; // contract test { - // function f(uint a) returns(uint d) { return a * 7; } + // uint value; + // function f(uint a) public pure returns(uint d) { + // return a * 7; + // } + // function setValue(uint _value) external { + // value = _value; + // } // } - string compiled = - "6080604052341561000f57600080fd5b60b98061001d6000396000f300" - "608060405260043610603f576000357c01000000000000000000000000" - "00000000000000000000000000000000900463ffffffff168063b3de64" - "8b146044575b600080fd5b3415604e57600080fd5b606a600480360381" - "019080803590602001909291905050506080565b604051808281526020" - "0191505060405180910390f35b60006007820290509190505600a16562" - "7a7a72305820f294e834212334e2978c6dd090355312a3f0f9476b8eb9" - "8fb480406fc2728a960029"; + string compiled = "608060405234801561001057600080fd5b506101ef806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063552410771461003b578063b3de648b14610057575b600080fd5b610055600480360381019061005091906100bc565b610087565b005b610071600480360381019061006c91906100bc565b610091565b60405161007e91906100f4565b60405180910390f35b8060008190555050565b60006007826100a0919061010f565b9050919050565b6000813590506100b6816101a2565b92915050565b6000602082840312156100ce57600080fd5b60006100dc848285016100a7565b91505092915050565b6100ee81610169565b82525050565b600060208201905061010960008301846100e5565b92915050565b600061011a82610169565b915061012583610169565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561015e5761015d610173565b5b828202905092915050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6101ab81610169565b81146101b657600080fd5b5056fea26469706673582212200be8156151b5ef7c250fa7b8c8ed4e2a1c32cd526f9c868223f6838fa1193c9e64736f6c63430008040033"; Json::Value create; create["code"] = compiled; @@ -865,6 +863,21 @@ BOOST_AUTO_TEST_CASE( simple_contract ) { BOOST_CHECK_EQUAL( result, "0x0000000000000000000000000000000000000000000000000000000000000007" ); + Json::Value transact; + transact["to"] = contractAddress; + transact["data"] = "0x552410770000000000000000000000000000000000000000000000000000000000000001"; + txHash = fixture.rpcClient->eth_sendTransaction( transact ); + dev::eth::mineTransaction( *( fixture.client ), 1 ); + auto res = fixture.rpcClient->eth_getTransactionReceipt( txHash ); + BOOST_REQUIRE_EQUAL( res["status"], string( "0x1" ) ); + + Json::Value inputTx; + inputTx["to"] = contractAddress; + inputTx["input"] = "0x552410770000000000000000000000000000000000000000000000000000000000000002"; + txHash = fixture.rpcClient->eth_sendTransaction( inputTx ); + dev::eth::mineTransaction( *( fixture.client ), 1 ); + res = fixture.rpcClient->eth_getTransactionReceipt( txHash ); + BOOST_REQUIRE_EQUAL( res["status"], string( "0x1" ) ); } /* From b1ccbf1497efc7e215ecf6586ee8915710eb7650 Mon Sep 17 00:00:00 2001 From: DmytroNazarenko Date: Mon, 18 Mar 2024 21:23:50 +0000 Subject: [PATCH 044/154] #1825 Add support of input field in tx dict --- libweb3jsonrpc/JsonHelper.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/libweb3jsonrpc/JsonHelper.cpp b/libweb3jsonrpc/JsonHelper.cpp index 883374885..271bddbe2 100644 --- a/libweb3jsonrpc/JsonHelper.cpp +++ b/libweb3jsonrpc/JsonHelper.cpp @@ -478,9 +478,12 @@ TransactionSkeleton toTransactionSkeleton( Json::Value const& _json ) { if ( !_json["gasPrice"].empty() ) ret.gasPrice = jsToU256( _json["gasPrice"].asString() ); - if ( !_json["data"].empty() ) // ethereum.js has preconstructed the data array + if ( !_json["data"].empty() ) ret.data = jsToBytes( _json["data"].asString(), OnFailed::Throw ); + if ( !_json["input"].empty() ) + ret.data = jsToBytes( _json["input"].asString(), OnFailed::Throw ); + if ( !_json["code"].empty() ) ret.data = jsToBytes( _json["code"].asString(), OnFailed::Throw ); @@ -531,13 +534,18 @@ TransactionSkeleton rapidJsonToTransactionSkeleton( rapidjson::Value const& _jso ret.gasPrice = jsToU256( _json["gasPrice"].GetString() ); } - if ( _json.HasMember( "data" ) ) { // ethereum.js has preconstructed - // the data array + if ( _json.HasMember( "data" ) ) { if ( !_json["data"].IsString() ) throw jsonrpc::JsonRpcException( jsonrpc::Errors::ERROR_RPC_INVALID_PARAMS ); ret.data = jsToBytes( _json["data"].GetString(), OnFailed::Throw ); } + if ( _json.HasMember( "input" ) ) { + if ( !_json["input"].IsString() ) + throw jsonrpc::JsonRpcException( jsonrpc::Errors::ERROR_RPC_INVALID_PARAMS ); + ret.data = jsToBytes( _json["input"].GetString(), OnFailed::Throw ); + } + if ( _json.HasMember( "code" ) ) { if ( !_json["code"].IsString() ) throw jsonrpc::JsonRpcException( jsonrpc::Errors::ERROR_RPC_INVALID_PARAMS ); From 18c5f04a739085f9640675cf124244eca6ac5c72 Mon Sep 17 00:00:00 2001 From: DmytroNazarenko Date: Mon, 18 Mar 2024 21:32:58 +0000 Subject: [PATCH 045/154] #1825 Fix linter --- libweb3jsonrpc/JsonHelper.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libweb3jsonrpc/JsonHelper.cpp b/libweb3jsonrpc/JsonHelper.cpp index 271bddbe2..180ed51d0 100644 --- a/libweb3jsonrpc/JsonHelper.cpp +++ b/libweb3jsonrpc/JsonHelper.cpp @@ -478,10 +478,10 @@ TransactionSkeleton toTransactionSkeleton( Json::Value const& _json ) { if ( !_json["gasPrice"].empty() ) ret.gasPrice = jsToU256( _json["gasPrice"].asString() ); - if ( !_json["data"].empty() ) + if ( !_json["data"].empty() ) ret.data = jsToBytes( _json["data"].asString(), OnFailed::Throw ); - if ( !_json["input"].empty() ) + if ( !_json["input"].empty() ) ret.data = jsToBytes( _json["input"].asString(), OnFailed::Throw ); if ( !_json["code"].empty() ) @@ -534,13 +534,13 @@ TransactionSkeleton rapidJsonToTransactionSkeleton( rapidjson::Value const& _jso ret.gasPrice = jsToU256( _json["gasPrice"].GetString() ); } - if ( _json.HasMember( "data" ) ) { + if ( _json.HasMember( "data" ) ) { if ( !_json["data"].IsString() ) throw jsonrpc::JsonRpcException( jsonrpc::Errors::ERROR_RPC_INVALID_PARAMS ); ret.data = jsToBytes( _json["data"].GetString(), OnFailed::Throw ); } - if ( _json.HasMember( "input" ) ) { + if ( _json.HasMember( "input" ) ) { if ( !_json["input"].IsString() ) throw jsonrpc::JsonRpcException( jsonrpc::Errors::ERROR_RPC_INVALID_PARAMS ); ret.data = jsToBytes( _json["input"].GetString(), OnFailed::Throw ); From 3d6422c7e42a7f744dc51ff2c8f0f23cdab4e4da Mon Sep 17 00:00:00 2001 From: DmytroNazarenko Date: Tue, 19 Mar 2024 13:02:18 +0000 Subject: [PATCH 046/154] #1825 Fix linter --- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index 1d77b7f12..626877b3a 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -826,7 +826,27 @@ BOOST_AUTO_TEST_CASE( simple_contract ) { // } // } - string compiled = "608060405234801561001057600080fd5b506101ef806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063552410771461003b578063b3de648b14610057575b600080fd5b610055600480360381019061005091906100bc565b610087565b005b610071600480360381019061006c91906100bc565b610091565b60405161007e91906100f4565b60405180910390f35b8060008190555050565b60006007826100a0919061010f565b9050919050565b6000813590506100b6816101a2565b92915050565b6000602082840312156100ce57600080fd5b60006100dc848285016100a7565b91505092915050565b6100ee81610169565b82525050565b600060208201905061010960008301846100e5565b92915050565b600061011a82610169565b915061012583610169565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561015e5761015d610173565b5b828202905092915050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6101ab81610169565b81146101b657600080fd5b5056fea26469706673582212200be8156151b5ef7c250fa7b8c8ed4e2a1c32cd526f9c868223f6838fa1193c9e64736f6c63430008040033"; + string compiled = + "608060405234801561001057600080fd5b506101ef8061002060003" + "96000f3fe608060405234801561001057600080fd5b506004361061" + "00365760003560e01c8063552410771461003b578063b3de648b146" + "10057575b600080fd5b610055600480360381019061005091906100" + "bc565b610087565b005b610071600480360381019061006c9190610" + "0bc565b610091565b60405161007e91906100f4565b604051809103" + "90f35b8060008190555050565b60006007826100a0919061010f565" + "b9050919050565b6000813590506100b6816101a2565b9291505056" + "5b6000602082840312156100ce57600080fd5b60006100dc8482850" + "16100a7565b91505092915050565b6100ee81610169565b82525050" + "565b600060208201905061010960008301846100e5565b929150505" + "65b600061011a82610169565b915061012583610169565b9250817f" + "fffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "fffffffff048311821515161561015e5761015d610173565b5b8282" + "02905092915050565b6000819050919050565b7f4e487b710000000" + "0000000000000000000000000000000000000000000000000600052" + "601160045260246000fd5b6101ab81610169565b81146101b657600" + "080fd5b5056fea26469706673582212200be8156151b5ef7c250fa7" + "b8c8ed4e2a1c32cd526f9c868223f6838fa1193c9e64736f6c63430" + "008040033"; Json::Value create; create["code"] = compiled; From b9d676cc558171324dc1e317527f9c54397a5e8f Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Tue, 19 Mar 2024 13:53:17 +0000 Subject: [PATCH 047/154] SKALED-1853 Add test for historic and fix estimateGas --- libethereum/ClientBase.cpp | 27 +++++++++++++---------- libethereum/ClientBase.h | 2 +- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 24 +++++++++++++++----- 3 files changed, 35 insertions(+), 18 deletions(-) diff --git a/libethereum/ClientBase.cpp b/libethereum/ClientBase.cpp index 7d6acf3de..193ae71d6 100644 --- a/libethereum/ClientBase.cpp +++ b/libethereum/ClientBase.cpp @@ -80,8 +80,8 @@ void ClientWatch::append_changes( const LocalisedLogEntry& entry ) { } std::pair< bool, ExecutionResult > ClientBase::estimateGasStep( int64_t _gas, Block& _latestBlock, - Address const& _from, Address const& _destination, u256 const& _value, u256 const& _gasPrice, - bytes const& _data ) { + Block& _pendingBlock, Address const& _from, Address const& _destination, u256 const& _value, + u256 const& _gasPrice, bytes const& _data ) { u256 nonce = _latestBlock.transactionsFrom( _from ); Transaction t; if ( _destination ) @@ -91,8 +91,8 @@ std::pair< bool, ExecutionResult > ClientBase::estimateGasStep( int64_t _gas, Bl t.forceSender( _from ); t.forceChainId( chainId() ); t.ignoreExternalGas(); - EnvInfo const env( _latestBlock.info(), bc().lastBlockHashes(), - _latestBlock.previousInfo().timestamp(), 0, _gas ); + EnvInfo const env( _pendingBlock.info(), bc().lastBlockHashes(), + _pendingBlock.previousInfo().timestamp(), 0, _gas ); // Make a copy of state!! It will be deleted after step! State tempState = _latestBlock.mutableState(); tempState.addBalance( _from, ( u256 )( t.gas() * t.gasPrice() + t.value() ) ); @@ -123,10 +123,11 @@ std::pair< u256, ExecutionResult > ClientBase::estimateGas( Address const& _from bc().info().timestamp(), bc().number() ) ) : Transaction::baseGasRequired( !_dest, &_data, EVMSchedule() ); - Block bk = preSeal(); + Block latest = latestBlock(); + Block pending = preSeal(); - if ( upperBound > bk.info().gasLimit() ) { - upperBound = bk.info().gasLimit().convert_to< int64_t >(); + if ( upperBound > pending.info().gasLimit() ) { + upperBound = pending.info().gasLimit().convert_to< int64_t >(); } u256 gasPrice = _gasPrice == Invalid256 ? gasBidPrice() : _gasPrice; @@ -137,19 +138,20 @@ std::pair< u256, ExecutionResult > ClientBase::estimateGas( Address const& _from // If not run binary search to find optimal gas limit. auto estimatedStep = - estimateGasStep( upperBound, bk, _from, _dest, _value, gasPrice, _data ); + estimateGasStep( upperBound, latest, pending, _from, _dest, _value, gasPrice, _data ); if ( estimatedStep.first ) { auto executionResult = estimatedStep.second; auto gasUsed = std::max( executionResult.gasUsed.convert_to< int64_t >(), lowerBound ); - estimatedStep = estimateGasStep( gasUsed, bk, _from, _dest, _value, gasPrice, _data ); + estimatedStep = + estimateGasStep( gasUsed, latest, pending, _from, _dest, _value, gasPrice, _data ); if ( estimatedStep.first ) { return make_pair( gasUsed, executionResult ); } while ( lowerBound + 1 < upperBound ) { int64_t middle = ( lowerBound + upperBound ) / 2; - estimatedStep = - estimateGasStep( middle, bk, _from, _dest, _value, gasPrice, _data ); + estimatedStep = estimateGasStep( + middle, latest, pending, _from, _dest, _value, gasPrice, _data ); if ( estimatedStep.first ) { upperBound = middle; } else { @@ -162,7 +164,8 @@ std::pair< u256, ExecutionResult > ClientBase::estimateGas( Address const& _from } return make_pair( upperBound, - estimateGasStep( upperBound, bk, _from, _dest, _value, gasPrice, _data ).second ); + estimateGasStep( upperBound, latest, pending, _from, _dest, _value, gasPrice, _data ) + .second ); } catch ( ... ) { // TODO: Some sort of notification of failure. return make_pair( u256(), ExecutionResult() ); diff --git a/libethereum/ClientBase.h b/libethereum/ClientBase.h index 855fcf087..1dd089b72 100644 --- a/libethereum/ClientBase.h +++ b/libethereum/ClientBase.h @@ -222,7 +222,7 @@ class ClientBase : public Interface { private: std::pair< bool, ExecutionResult > estimateGasStep( int64_t _gas, Block& _latestBlock, - Address const& _from, Address const& _destination, u256 const& _value, + Block& _pendingBlock, Address const& _from, Address const& _destination, u256 const& _value, u256 const& _gasPrice, bytes const& _data ); }; diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index 6dd4f9c89..ec83837c0 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -1338,23 +1338,37 @@ then compile! while( time(nullptr) < fixture.push0PatchActivationTimestamp ) sleep(1); - // exec and call should fail in 1st block after timestamp too - callResult = fixture.rpcClient->eth_call(callObject, "latest"); - BOOST_REQUIRE_EQUAL( callResult, string( "0x" ) ); - + // 1st timestamp-crossing block txHash = fixture.rpcClient->eth_sendTransaction( callObject ); dev::eth::mineTransaction( *( fixture.client ), 1 ); + BOOST_REQUIRE_GE( fixture.client->blockInfo(LatestBlock).timestamp(), fixture.push0PatchActivationTimestamp ); + + uint64_t crossingBlockNumber = fixture.client->number(); + (void) crossingBlockNumber; + + // in the "corssing" block tx still should fail receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); BOOST_REQUIRE_EQUAL( receipt["status"], string( "0x0" ) ); - // in 1st block with patch they should succeed + // in 1st block with patch call should succeed callResult = fixture.rpcClient->eth_call(callObject, "latest"); BOOST_REQUIRE_NE( callResult, string( "0x" ) ); + // tx should succeed too txHash = fixture.rpcClient->eth_sendTransaction( callObject ); dev::eth::mineTransaction( *( fixture.client ), 1 ); receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); BOOST_REQUIRE_EQUAL( receipt["status"], string( "0x1" ) ); + +#ifdef HISTORIC_STATE + // histoic call should fail before activation and succees after it + + callResult = fixture.rpcClient->eth_call(callObject, toJS(crossingBlockNumber-1)); + BOOST_REQUIRE_EQUAL( callResult, string( "0x" ) ); + + callResult = fixture.rpcClient->eth_call(callObject, toJS(crossingBlockNumber)); + BOOST_REQUIRE_NE( callResult, string( "0x" ) ); +#endif } BOOST_AUTO_TEST_CASE( eth_estimateGas ) { From 0a9837d0fd13cb8b9b0f2c7fd1eaadaf0203e0c7 Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Tue, 19 Mar 2024 16:41:46 +0000 Subject: [PATCH 048/154] SKALED-1583 Fix test --- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index ec83837c0..dfb172a0f 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -292,7 +292,7 @@ struct JsonRpcFixture : public TestOutputHelperFixture { chainParams.sChain._patchTimestamps[static_cast(SchainPatchEnum::StorageDestructionPatch)] = 1; powPatchActivationTimestamp = time(nullptr) + 60; chainParams.sChain._patchTimestamps[static_cast(SchainPatchEnum::CorrectForkInPowPatch)] = powPatchActivationTimestamp; - push0PatchActivationTimestamp = time(nullptr) + 5; + push0PatchActivationTimestamp = time(nullptr) + 10; chainParams.sChain._patchTimestamps[static_cast(SchainPatchEnum::PushZeroPatch)] = push0PatchActivationTimestamp; chainParams.sChain.emptyBlockIntervalMs = _emptyBlockIntervalMs; // add random extra data to randomize genesis hash and get random DB path, @@ -1335,8 +1335,10 @@ then compile! // wait for block after timestamp BOOST_REQUIRE_LT( fixture.client->blockInfo(LatestBlock).timestamp(), fixture.push0PatchActivationTimestamp ); - while( time(nullptr) < fixture.push0PatchActivationTimestamp ) + while( time(nullptr) < fixture.push0PatchActivationTimestamp ) { sleep(1); + cout << "SLEEP" << endl; + } // 1st timestamp-crossing block txHash = fixture.rpcClient->eth_sendTransaction( callObject ); From 45d8a5018d654ab8e45122c6c699711c1406abf9 Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Tue, 19 Mar 2024 19:15:32 +0000 Subject: [PATCH 049/154] SKALED-1583 Fix rand in tests --- libethereum/Client.cpp | 5 +---- libskale/TotalStorageUsedPatch.cpp | 4 ++-- libskale/TotalStorageUsedPatch.h | 7 +++++-- libskale/httpserveroverride.cpp | 6 ++++-- test/tools/libtesteth/boostTest.cpp | 1 - test/unittests/libweb3jsonrpc/jsonrpc.cpp | 2 +- 6 files changed, 13 insertions(+), 12 deletions(-) diff --git a/libethereum/Client.cpp b/libethereum/Client.cpp index ee49498de..a1e2f74fe 100644 --- a/libethereum/Client.cpp +++ b/libethereum/Client.cpp @@ -146,9 +146,6 @@ Client::Client( ChainParams const& _params, int _networkID, }; init( _forceAction, _networkID ); - - // Set timestamps for patches - TotalStorageUsedPatch::g_client = this; } @@ -310,7 +307,7 @@ void Client::init( WithExisting _forceAction, u256 _networkId ) { SchainPatch::init( chainParams() ); SchainPatch::useLatestBlockTimestamp( blockChain().info().timestamp() ); - + TotalStorageUsedPatch::init( this ); // HACK Needed to set env var for consensus AmsterdamFixPatch::isEnabled( *this ); diff --git a/libskale/TotalStorageUsedPatch.cpp b/libskale/TotalStorageUsedPatch.cpp index f9438d09d..81a100655 100644 --- a/libskale/TotalStorageUsedPatch.cpp +++ b/libskale/TotalStorageUsedPatch.cpp @@ -8,12 +8,12 @@ using namespace dev; using namespace dev::eth; const Address magicAddress( toAddress( "0xE8E4Ea98530Bfe86f841E258fd6F3FD5c210c68f" ) ); -dev::eth::Client* TotalStorageUsedPatch::g_client; +dev::eth::Client* TotalStorageUsedPatch::client; void TotalStorageUsedPatch::onProgress( batched_io::db_operations_face& _db, size_t _blockNumber ) { if ( !_db.exists( dev::db::Slice( "\x0totalStorageUsed", 17 ) ) ) return; - if ( g_client->countAt( magicAddress ) == 0 ) + if ( client->countAt( magicAddress ) == 0 ) _db.insert( dev::db::Slice( "\x0totalStorageUsed", 17 ), dev::db::Slice( std::to_string( _blockNumber * 32 ) ) ); else diff --git a/libskale/TotalStorageUsedPatch.h b/libskale/TotalStorageUsedPatch.h index a15b5576b..40344833e 100644 --- a/libskale/TotalStorageUsedPatch.h +++ b/libskale/TotalStorageUsedPatch.h @@ -22,6 +22,10 @@ class Client; */ class TotalStorageUsedPatch : public SchainPatch { public: + static void init( dev::eth::Client* _client ) { + assert( _client ); + client = _client; + } static bool isInitOnChainNeeded( batched_io::db_operations_face& _db ) { return !_db.exists( ( dev::db::Slice ) "pieceUsageBytes" ); } @@ -32,8 +36,7 @@ class TotalStorageUsedPatch : public SchainPatch { static void onProgress( batched_io::db_operations_face& _db, size_t _blockNumber ); private: - friend class dev::eth::Client; - static dev::eth::Client* g_client; + static dev::eth::Client* client; }; #endif // TOTALSTORAGEUSEDPATCH_H diff --git a/libskale/httpserveroverride.cpp b/libskale/httpserveroverride.cpp index 70175a404..80de3753c 100644 --- a/libskale/httpserveroverride.cpp +++ b/libskale/httpserveroverride.cpp @@ -2804,12 +2804,14 @@ bool SkaleServerOverride::implStartListening( // proxygen HTTP cc::success( "/" ) + cc::notice( esm2str( esm ) ) + " " ); return true; } catch ( const std::exception& ex ) { - logTraceServerEvent( false, ipVer, bIsSSL ? "HTTPS" : "HTTP", pSrv->serverIndex(), esm, + logTraceServerEvent( false, ipVer, bIsSSL ? "HTTPS" : "HTTP", + pSrv ? pSrv->serverIndex() : -1, esm, cc::fatal( "FAILED" ) + cc::error( " to start " ) + cc::attention( "proxygen" ) + cc::debug( "/" ) + cc::warn( bIsSSL ? "HTTPS" : "HTTP" ) + cc::error( " server: " ) + cc::warn( ex.what() ) ); } catch ( ... ) { - logTraceServerEvent( false, ipVer, bIsSSL ? "HTTPS" : "HTTP", pSrv->serverIndex(), esm, + logTraceServerEvent( false, ipVer, bIsSSL ? "HTTPS" : "HTTP", + pSrv ? pSrv->serverIndex() : -1, esm, cc::fatal( "FAILED" ) + cc::error( " to start " ) + cc::attention( "proxygen" ) + cc::debug( "/" ) + cc::warn( bIsSSL ? "HTTPS" : "HTTP" ) + cc::error( " server: " ) + cc::warn( "unknown exception" ) ); diff --git a/test/tools/libtesteth/boostTest.cpp b/test/tools/libtesteth/boostTest.cpp index 6fd218178..45fb63b2b 100644 --- a/test/tools/libtesteth/boostTest.cpp +++ b/test/tools/libtesteth/boostTest.cpp @@ -137,7 +137,6 @@ void setCLocale() { int main( int argc, const char* argv[] ) { MicroProfileSetEnableAllGroups( true ); UnsafeRegion::init("."); - std::srand( time( nullptr ) ); std::string const dynamicTestSuiteName = "customTestSuite"; setCLocale(); diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index dfb172a0f..b2002b336 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -62,7 +62,7 @@ using namespace dev; using namespace dev::eth; using namespace dev::test; -static size_t rand_port = 1024 + rand() % 64000; +static size_t rand_port = ( srand(time(nullptr)), 1024 + rand() % 64000 ); static std::string const c_genesisConfigString = R"( From 5a6f7d0077ad803543342cfbdbbc62d81a1e5381 Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Tue, 19 Mar 2024 19:23:46 +0000 Subject: [PATCH 050/154] #1719 add support for type1 and type2 txns --- libethcore/TransactionBase.cpp | 380 +++++++++++++++++----- libethcore/TransactionBase.h | 32 +- libethereum/Block.cpp | 11 +- libethereum/BlockChain.cpp | 11 +- libethereum/BlockChain.h | 20 +- libethereum/ClientBase.cpp | 12 +- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 53 +++ 7 files changed, 431 insertions(+), 88 deletions(-) diff --git a/libethcore/TransactionBase.cpp b/libethcore/TransactionBase.cpp index 198fabab3..f0eaff71b 100644 --- a/libethcore/TransactionBase.cpp +++ b/libethcore/TransactionBase.cpp @@ -49,79 +49,254 @@ TransactionBase::TransactionBase( TransactionSkeleton const& _ts, Secret const& sign( _s ); } -TransactionBase::TransactionBase( +TransactionBase TransactionBase::makeLegacyTransaction( bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid ) { - MICROPROFILE_SCOPEI( "TransactionBase", "ctor", MP_GOLD2 ); + RLP const rlp( _rlpData ); try { - RLP const rlp( _rlpData ); - try { - if ( !rlp.isList() ) - BOOST_THROW_EXCEPTION( InvalidTransactionFormat() - << errinfo_comment( "transaction RLP must be a list" ) ); - - m_nonce = rlp[0].toInt< u256 >(); - m_gasPrice = rlp[1].toInt< u256 >(); - m_gas = rlp[2].toInt< u256 >(); - if ( !rlp[3].isData() ) - BOOST_THROW_EXCEPTION( InvalidTransactionFormat() - << errinfo_comment( "recepient RLP must be a byte array" ) ); - m_type = rlp[3].isEmpty() ? ContractCreation : MessageCall; - m_receiveAddress = - rlp[3].isEmpty() ? Address() : rlp[3].toHash< Address >( RLP::VeryStrict ); - m_value = rlp[4].toInt< u256 >(); - - if ( !rlp[5].isData() ) - BOOST_THROW_EXCEPTION( InvalidTransactionFormat() << errinfo_comment( - "transaction data RLP must be an array" ) ); - - m_data = rlp[5].toBytes(); - - u256 const v = rlp[6].toInt< u256 >(); - h256 const r = rlp[7].toInt< u256 >(); - h256 const s = rlp[8].toInt< u256 >(); - - if ( isZeroSignature( r, s ) ) { - m_chainId = static_cast< uint64_t >( v ); - m_vrs = SignatureStruct{ r, s, 0 }; - } else { - if ( v > 36 ) { - auto const chainId = ( v - 35 ) / 2; - if ( chainId > std::numeric_limits< uint64_t >::max() ) - BOOST_THROW_EXCEPTION( InvalidSignature() ); - m_chainId = static_cast< uint64_t >( chainId ); - } else if ( v != 27 && v != 28 ) + if ( !rlp.isList() ) + BOOST_THROW_EXCEPTION( + InvalidTransactionFormat() << errinfo_comment( "transaction RLP must be a list" ) ); + + m_nonce = rlp[0].toInt< u256 >(); + m_gasPrice = rlp[1].toInt< u256 >(); + m_gas = rlp[2].toInt< u256 >(); + if ( !rlp[3].isData() ) + BOOST_THROW_EXCEPTION( InvalidTransactionFormat() + << errinfo_comment( "recipient RLP must be a byte array" ) ); + m_type = rlp[3].isEmpty() ? ContractCreation : MessageCall; + m_receiveAddress = + rlp[3].isEmpty() ? Address() : rlp[3].toHash< Address >( RLP::VeryStrict ); + m_value = rlp[4].toInt< u256 >(); + + if ( !rlp[5].isData() ) + BOOST_THROW_EXCEPTION( InvalidTransactionFormat() + << errinfo_comment( "transaction data RLP must be an array" ) ); + + m_data = rlp[5].toBytes(); + + u256 const v = rlp[6].toInt< u256 >(); + h256 const r = rlp[7].toInt< u256 >(); + h256 const s = rlp[8].toInt< u256 >(); + + if ( isZeroSignature( r, s ) ) { + m_chainId = static_cast< uint64_t >( v ); + m_vrs = SignatureStruct{ r, s, 0 }; + } else { + if ( v > 36 ) { + auto const chainId = ( v - 35 ) / 2; + if ( chainId > std::numeric_limits< uint64_t >::max() ) BOOST_THROW_EXCEPTION( InvalidSignature() ); - // else leave m_chainId as is (unitialized) + m_chainId = static_cast< uint64_t >( chainId ); + } else if ( v != 27 && v != 28 ) + BOOST_THROW_EXCEPTION( InvalidSignature() ); + // else leave m_chainId as is (unitialized) - auto const recoveryID = m_chainId.has_value() ? - _byte_{ v - ( u256{ *m_chainId } * 2 + 35 ) } : - _byte_{ v - 27 }; - m_vrs = SignatureStruct{ r, s, recoveryID }; + auto const recoveryID = m_chainId.has_value() ? + _byte_{ v - ( u256{ *m_chainId } * 2 + 35 ) } : + _byte_{ v - 27 }; + m_vrs = SignatureStruct{ r, s, recoveryID }; - if ( _checkSig >= CheckTransaction::Cheap && !m_vrs->isValid() ) - BOOST_THROW_EXCEPTION( InvalidSignature() ); - } - - if ( _checkSig == CheckTransaction::Everything ) - m_sender = sender(); - - if ( rlp.itemCount() > 9 ) - BOOST_THROW_EXCEPTION( InvalidTransactionFormat() << errinfo_comment( - "too many fields in the transaction RLP" ) ); - // XXX Strange "catch"-s %) - - } catch ( Exception& _e ) { - _e << errinfo_name( - "invalid transaction format: " + toString( rlp ) + " RLP: " + toHex( rlp.data() ) ); - m_type = Type::Invalid; - m_rawData = _rlpData.toBytes(); - - if ( !_allowInvalid ) - throw; - else { - cwarn << _e.what(); - } + if ( _checkSig >= CheckTransaction::Cheap && !m_vrs->isValid() ) + BOOST_THROW_EXCEPTION( InvalidSignature() ); + } + + if ( _checkSig == CheckTransaction::Everything ) + m_sender = sender(); + + m_txType = TransactionType::Legacy; + + if ( rlp.itemCount() > 9 ) + BOOST_THROW_EXCEPTION( InvalidTransactionFormat() + << errinfo_comment( "too many fields in the transaction RLP" ) ); + // XXX Strange "catch"-s %) + + TransactionBase t( *this ); + return t; + } catch ( Exception& _e ) { + _e << errinfo_name( + "invalid transaction format: " + toString( rlp ) + " RLP: " + toHex( rlp.data() ) ); + m_type = Type::Invalid; + m_rawData = _rlpData.toBytes(); + + if ( !_allowInvalid ) + throw; + else { + cwarn << _e.what(); + TransactionBase t( *this ); + return t; + } + } +} + +TransactionBase TransactionBase::makeType1Transaction( + bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid ) { + bytes croppedRlp( _rlpData.begin() + 1, _rlpData.end() ); + RLP const rlp( croppedRlp ); + try { + if ( !rlp.isList() ) + BOOST_THROW_EXCEPTION( + InvalidTransactionFormat() << errinfo_comment( "transaction RLP must be a list" ) ); + + m_chainId = rlp[0].toInt< u256 >(); + m_nonce = rlp[1].toInt< u256 >(); + m_gasPrice = rlp[2].toInt< u256 >(); + m_gas = rlp[3].toInt< u256 >(); + + if ( !rlp[4].isData() ) + BOOST_THROW_EXCEPTION( InvalidTransactionFormat() + << errinfo_comment( "recipient RLP must be a byte array" ) ); + m_type = rlp[4].isEmpty() ? ContractCreation : MessageCall; + m_receiveAddress = + rlp[4].isEmpty() ? Address() : rlp[4].toHash< Address >( RLP::VeryStrict ); + m_value = rlp[5].toInt< u256 >(); + + if ( !rlp[6].isData() ) + BOOST_THROW_EXCEPTION( InvalidTransactionFormat() + << errinfo_comment( "transaction data RLP must be an array" ) ); + + m_data = rlp[6].toBytes(); + + m_accessList = rlp[7].toList(); + + bool const yParity = rlp[8].toInt< uint8_t >(); + h256 const r = rlp[9].toInt< u256 >(); + h256 const s = rlp[10].toInt< u256 >(); + + m_vrs = SignatureStruct{ r, s, yParity }; + + if ( _checkSig >= CheckTransaction::Cheap && !m_vrs->isValid() ) + BOOST_THROW_EXCEPTION( InvalidSignature() ); + + if ( _checkSig == CheckTransaction::Everything ) + m_sender = sender(); + + m_txType = TransactionType::Type1; + + if ( rlp.itemCount() > 11 ) + BOOST_THROW_EXCEPTION( InvalidTransactionFormat() + << errinfo_comment( "too many fields in the transaction RLP" ) ); + + TransactionBase t( *this ); + return t; + } catch ( Exception& _e ) { + _e << errinfo_name( + "invalid transaction format: " + toString( rlp ) + " RLP: " + toHex( rlp.data() ) ); + m_type = Type::Invalid; + m_rawData = _rlpData.toBytes(); + + if ( !_allowInvalid ) + throw; + else { + cwarn << _e.what(); + TransactionBase t( *this ); + return t; + } + } +} + +TransactionBase TransactionBase::makeType2Transaction( + bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid ) { + bytes croppedRlp( _rlpData.begin() + 1, _rlpData.end() ); + RLP const rlp( croppedRlp ); + try { + if ( !rlp.isList() ) + BOOST_THROW_EXCEPTION( + InvalidTransactionFormat() << errinfo_comment( "transaction RLP must be a list" ) ); + + m_chainId = rlp[0].toInt< u256 >(); + m_nonce = rlp[1].toInt< u256 >(); + m_maxPriorityFeePerGas = rlp[2].toInt< u256 >(); + m_maxFeePerGas = rlp[3].toInt< u256 >(); + m_gas = rlp[4].toInt< u256 >(); + + if ( !rlp[5].isData() ) + BOOST_THROW_EXCEPTION( InvalidTransactionFormat() + << errinfo_comment( "recipient RLP must be a byte array" ) ); + m_type = rlp[5].isEmpty() ? ContractCreation : MessageCall; + m_receiveAddress = + rlp[5].isEmpty() ? Address() : rlp[5].toHash< Address >( RLP::VeryStrict ); + m_value = rlp[6].toInt< u256 >(); + + if ( !rlp[7].isData() ) + BOOST_THROW_EXCEPTION( InvalidTransactionFormat() + << errinfo_comment( "transaction data RLP must be an array" ) ); + + m_data = rlp[7].toBytes(); + + m_accessList = rlp[8].toList(); + + bool const yParity = rlp[9].toInt< uint8_t >(); + h256 const r = rlp[10].toInt< u256 >(); + h256 const s = rlp[11].toInt< u256 >(); + + m_vrs = SignatureStruct{ r, s, yParity }; + + if ( _checkSig >= CheckTransaction::Cheap && !m_vrs->isValid() ) + BOOST_THROW_EXCEPTION( InvalidSignature() ); + + if ( _checkSig == CheckTransaction::Everything ) + m_sender = sender(); + + m_txType = TransactionType::Type2; + + if ( rlp.itemCount() > 12 ) + BOOST_THROW_EXCEPTION( InvalidTransactionFormat() + << errinfo_comment( "too many fields in the transaction RLP" ) ); + + TransactionBase t( *this ); + return t; + } catch ( Exception& _e ) { + _e << errinfo_name( + "invalid transaction format: " + toString( rlp ) + " RLP: " + toHex( rlp.data() ) ); + m_type = Type::Invalid; + m_rawData = _rlpData.toBytes(); + + if ( !_allowInvalid ) + throw; + else { + cwarn << _e.what(); + TransactionBase t( *this ); + return t; } + } +} + +TransactionBase::TransactionBase( + bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid, TransactionType type ) { + switch ( type ) { + case TransactionType::Legacy: + *this = makeLegacyTransaction( _rlpData, _checkSig, _allowInvalid ); + break; + case TransactionType::Type1: + *this = makeType1Transaction( _rlpData, _checkSig, _allowInvalid ); + break; + case TransactionType::Type2: + *this = makeType2Transaction( _rlpData, _checkSig, _allowInvalid ); + break; + default: + BOOST_THROW_EXCEPTION( + InvalidTransactionFormat() << errinfo_comment( + "transaction format doesn't correspond to any of the supported formats" ) ); + } +} + +TransactionType TransactionBase::getTransactionType( bytesConstRef _rlp ) { + if ( _rlp.size() < 1 ) { + BOOST_THROW_EXCEPTION( + InvalidTransactionFormat() << errinfo_comment( + "transaction format doesn't correspond to any of the supported formats" ) ); + } + if ( _rlp[0] > 2 ) + return TransactionType::Legacy; + return TransactionType( _rlp[0] ); +} + +TransactionBase::TransactionBase( + bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid ) { + MICROPROFILE_SCOPEI( "TransactionBase", "ctor", MP_GOLD2 ); + try { + TransactionType txnType = getTransactionType( _rlpData ); + *this = TransactionBase( _rlpData, _checkSig, _allowInvalid, txnType ); } catch ( ... ) { m_type = Type::Invalid; RLPStream s; @@ -176,15 +351,8 @@ void TransactionBase::sign( Secret const& _priv ) { m_vrs = sigStruct; } -void TransactionBase::streamRLP( RLPStream& _s, IncludeSignature _sig, bool _forEip155hash ) const { - if ( isInvalid() ) { - _s.appendRaw( m_rawData ); - return; - } - - if ( m_type == NullTransaction ) - return; - +void TransactionBase::streamLegacyTransaction( + RLPStream& _s, IncludeSignature _sig, bool _forEip155hash ) const { _s.appendList( ( _sig || _forEip155hash ? 3 : 0 ) + 6 ); _s << m_nonce << m_gasPrice << m_gas; if ( m_type == MessageCall ) @@ -208,6 +376,60 @@ void TransactionBase::streamRLP( RLPStream& _s, IncludeSignature _sig, bool _for _s << *m_chainId << 0 << 0; } +void TransactionBase::streamType1Transaction( RLPStream& _s, IncludeSignature _sig ) const { + _s.appendList( ( _sig ? 3 : 0 ) + 8 ); + _s << *m_chainId << m_nonce << m_gasPrice << m_gas; + if ( m_type == MessageCall ) + _s << m_receiveAddress; + else + _s << ""; + _s << m_value << m_data; + + _s << m_accessList; + + if ( _sig ) + _s << ( u256 ) m_vrs->v << ( u256 ) m_vrs->r << ( u256 ) m_vrs->s; +} + +void TransactionBase::streamType2Transaction( RLPStream& _s, IncludeSignature _sig ) const { + _s.appendList( ( _sig ? 3 : 0 ) + 9 ); + _s << *m_chainId << m_nonce << m_maxPriorityFeePerGas << m_maxFeePerGas << m_gas; + if ( m_type == MessageCall ) + _s << m_receiveAddress; + else + _s << ""; + _s << m_value << m_data; + + _s << m_accessList; + + if ( _sig ) + _s << ( u256 ) m_vrs->v << ( u256 ) m_vrs->r << ( u256 ) m_vrs->s; +} + +void TransactionBase::streamRLP( RLPStream& _s, IncludeSignature _sig, bool _forEip155hash ) const { + if ( isInvalid() ) { + _s.appendRaw( m_rawData ); + return; + } + + if ( m_type == NullTransaction ) + return; + + switch ( m_txType ) { + case TransactionType::Legacy: + streamLegacyTransaction( _s, _sig, _forEip155hash ); + break; + case TransactionType::Type1: + streamType1Transaction( _s, _sig ); + break; + case TransactionType::Type2: + streamType2Transaction( _s, _sig ); + break; + default: + break; + } +} + static const u256 c_secp256k1n( "115792089237316195423570985008687907852837564279074904382605163141518161494337" ); @@ -250,7 +472,11 @@ h256 TransactionBase::sha3( IncludeSignature _sig ) const { RLPStream s; streamRLP( s, _sig, !isInvalid() && isReplayProtected() && _sig == WithoutSignature ); - auto ret = dev::sha3( s.out() ); + dev::bytes input = s.out(); + if ( m_txType != TransactionType::Legacy ) + input.insert( input.begin(), m_txType ); + + auto ret = dev::sha3( input ); if ( _sig == WithSignature ) m_hashWith = ret; return ret; diff --git a/libethcore/TransactionBase.h b/libethcore/TransactionBase.h index 2b93c6bd2..d3773166d 100644 --- a/libethcore/TransactionBase.h +++ b/libethcore/TransactionBase.h @@ -40,6 +40,8 @@ enum IncludeSignature { enum class CheckTransaction { None, Cheap, Everything }; +enum TransactionType { Legacy, Type1, Type2 }; + /// Encodes a transaction, ready to be exported to or freshly imported from RLP. class TransactionBase { public: @@ -104,6 +106,10 @@ class TransactionBase { bytes const& _rlp, CheckTransaction _checkSig, bool _allowInvalid = false ) : TransactionBase( &_rlp, _checkSig, _allowInvalid ) {} + /// Constructs a transaction from the given RLP and transaction type. + TransactionBase( bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid, + TransactionType type ); + TransactionBase( TransactionBase const& ) = default; /// Checks equality of transactions. @@ -155,7 +161,10 @@ class TransactionBase { bytes rlp( IncludeSignature _sig = WithSignature ) const { RLPStream s; streamRLP( s, _sig ); - return s.out(); + bytes output = s.out(); + if ( m_txType != TransactionType::Legacy ) + output.insert( output.begin(), m_txType ); + return output; } /// @returns the SHA3 hash of the RLP serialisation of this transaction. @@ -249,6 +258,8 @@ class TransactionBase { bool isInvalid() const { return m_type == Type::Invalid; } + TransactionType txType() const { return m_txType; } + /// Get the fee associated for a transaction with the given data. static int64_t baseGasRequired( bool _contractCreation, bytesConstRef _data, EVMSchedule const& _es ); @@ -285,9 +296,28 @@ class TransactionBase { bytes m_data; ///< The data associated with the transaction, or the initialiser if it's a ///< creation transaction. bytes m_rawData; + RLPs m_accessList; ///< The access list. see more https://eips.ethereum.org/EIPS/eip-2930. Not + ///< valid for legacy txns + u256 m_maxPriorityFeePerGas; ///< The maximum priority fee per gas. Only valid for type2 txns + u256 m_maxFeePerGas; ///< The maximum fee per gas. Only valid for type2 txns + + TransactionType m_txType = TransactionType::Legacy; Counter< TransactionBase > c; +private: + static TransactionType getTransactionType( bytesConstRef _rlp ); + TransactionBase makeLegacyTransaction( + bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid ); + TransactionBase makeType1Transaction( + bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid ); + TransactionBase makeType2Transaction( + bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid ); + + void streamLegacyTransaction( RLPStream& _s, IncludeSignature _sig, bool _forEip155hash ) const; + void streamType1Transaction( RLPStream& _s, IncludeSignature _sig ) const; + void streamType2Transaction( RLPStream& _s, IncludeSignature _sig ) const; + public: mutable int64_t verifiedOn = -1; // on which block it was imported diff --git a/libethereum/Block.cpp b/libethereum/Block.cpp index d98705d88..05f0e77b3 100644 --- a/libethereum/Block.cpp +++ b/libethereum/Block.cpp @@ -975,9 +975,16 @@ void Block::commitToSeal( RLPStream txrlp; m_transactions[i].streamRLP( txrlp ); - transactionsMap.insert( std::make_pair( k.out(), txrlp.out() ) ); + dev::bytes txOutput = txrlp.out(); + if ( m_transactions[i].txType() != dev::eth::TransactionType::Legacy ) { + txOutput.insert( txOutput.begin(), m_transactions[i].txType() ); + RLPStream s; + s.append( txOutput ); + txOutput = s.out(); + } + transactionsMap.insert( std::make_pair( k.out(), txOutput ) ); - txs.appendRaw( txrlp.out() ); + txs.appendRaw( txOutput ); } txs.swapOut( m_currentTxs ); diff --git a/libethereum/BlockChain.cpp b/libethereum/BlockChain.cpp index 677d19b48..f67c3be6e 100644 --- a/libethereum/BlockChain.cpp +++ b/libethereum/BlockChain.cpp @@ -777,8 +777,15 @@ size_t BlockChain::prepareDbDataAndReturnSize( VerifiedBlockRef const& _block, for ( RLP::iterator it = txns_rlp.begin(); it != txns_rlp.end(); ++it ) { MICROPROFILE_SCOPEI( "insertBlockAndExtras", "for2", MP_HONEYDEW ); - extrasWriteBatch.insert( toSlice( sha3( ( *it ).data() ), ExtraTransactionAddress ), - ( db::Slice ) dev::ref( ta.rlp() ) ); + if ( RLP( *it ).isList() ) + // means Legacy transaction + extrasWriteBatch.insert( toSlice( sha3( ( *it ).data() ), ExtraTransactionAddress ), + ( db::Slice ) dev::ref( ta.rlp() ) ); + else { + auto payload = ( *it ).payload(); + extrasWriteBatch.insert( toSlice( sha3( payload ), ExtraTransactionAddress ), + ( db::Slice ) dev::ref( ta.rlp() ) ); + } ++ta.index; } } diff --git a/libethereum/BlockChain.h b/libethereum/BlockChain.h index 593475fb1..2cfe2658f 100644 --- a/libethereum/BlockChain.h +++ b/libethereum/BlockChain.h @@ -231,8 +231,13 @@ class BlockChain { auto b = block( _hash ); RLP rlp( b ); h256s ret; - for ( auto t : rlp[1] ) - ret.push_back( sha3( t.data() ) ); + for ( auto d : rlp[1] ) { + if ( d.isList() ) + // means Legacy transaction + ret.push_back( sha3( d.data() ) ); + else + ret.push_back( sha3( d.payload() ) ); + } return ret; } TransactionHashes transactionHashes() const { return transactionHashes( currentHash() ); } @@ -319,7 +324,10 @@ class BlockChain { /// none given) & index. Thread-safe. bytes transaction( h256 const& _blockHash, unsigned _i ) const { bytes b = block( _blockHash ); - return RLP( b )[1][_i].data().toBytes(); + if ( RLP( b )[1][_i].isList() ) + // means Legacy transaction + return RLP( b )[1][_i].data().toBytes(); + return RLP( b )[1][_i].payload().toBytes(); } bytes transaction( unsigned _i ) const { return transaction( currentHash(), _i ); } @@ -328,7 +336,11 @@ class BlockChain { bytes b = block( _blockHash ); std::vector< bytes > ret; for ( auto const& i : RLP( b )[1] ) - ret.push_back( i.data().toBytes() ); + if ( i.isList() ) + // means Legacy transaction + ret.push_back( i.data().toBytes() ); + else + ret.push_back( i.payload().toBytes() ); return ret; } std::vector< bytes > transactions() const { return transactions( currentHash() ); } diff --git a/libethereum/ClientBase.cpp b/libethereum/ClientBase.cpp index 6b6d530b4..b4a4a6592 100644 --- a/libethereum/ClientBase.cpp +++ b/libethereum/ClientBase.cpp @@ -446,8 +446,16 @@ Transactions ClientBase::transactions( h256 _blockHash ) const { auto bl = bc().block( _blockHash ); RLP b( bl ); Transactions res; - for ( unsigned i = 0; i < b[1].itemCount(); i++ ) - res.emplace_back( b[1][i].data(), CheckTransaction::Cheap, true ); + for ( unsigned i = 0; i < b[1].itemCount(); i++ ) { + auto tx = b[1][i].data().toBytes(); + if ( RLP( tx ).isList() ) + // means Legacy transaction + res.emplace_back( tx, CheckTransaction::Cheap, true ); + else { + tx = RLP( tx ).payload().toBytes(); + res.emplace_back( tx, CheckTransaction::Cheap, true ); + } + } return res; } diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index 041b8d6b0..fb9dfcb32 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -2604,6 +2604,59 @@ BOOST_AUTO_TEST_CASE( EIP1898Calls ) { } } +BOOST_AUTO_TEST_CASE( eip2930Transactions ) { + std::string _config = c_genesisConfigString; + Json::Value ret; + Json::Reader().parse( _config, ret ); + + // Set chainID = 65535 + ret["params"]["chainID"] = "0xffff"; + + Json::FastWriter fastWriter; + std::string config = fastWriter.write( ret ); + JsonRpcFixture fixture( config ); + + dev::eth::simulateMining( *( fixture.client ), 20 ); + string senderAddress = toJS(fixture.coinbase.address()); + + Json::Value txRefill; + txRefill["to"] = "0xc868AF52a6549c773082A334E5AE232e0Ea3B513"; + txRefill["from"] = senderAddress; + txRefill["gas"] = "100000"; + txRefill["gasPrice"] = fixture.rpcClient->eth_gasPrice(); + txRefill["value"] = 100000000000000000; + string txHash = fixture.rpcClient->eth_sendTransaction( txRefill ); + dev::eth::mineTransaction( *( fixture.client ), 1 ); + + Json::Value receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); + BOOST_REQUIRE( receipt["status"] == string( "0x1" ) ); + + BOOST_REQUIRE( fixture.rpcClient->eth_getBalance( "0xc868AF52a6549c773082A334E5AE232e0Ea3B513", "latest" ) == "0x16345785d8a0000" ); + + // send 1 WEI from 0xc868AF52a6549c773082A334E5AE232e0Ea3B513 to 0x7D36aF85A184E220A656525fcBb9A63B9ab3C12b + // encoded type 1 txn + txHash = fixture.rpcClient->eth_sendRawTransaction( "0x01f86882ffff808504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180c001a0c171a6fd330b71e278b9030986e0aa9aeba4cad9594bcbe8a608d12f3751f53fa03a24cbd1ab14a62d9f30cf9ace7b5aef04c2289160993ce7df5059d8708762dc" ); + dev::eth::mineTransaction( *( fixture.client ), 1 ); + + BOOST_REQUIRE( fixture.rpcClient->eth_getBalance( "0x7D36aF85A184E220A656525fcBb9A63B9ab3C12b", "latest" ) == "0x1" ); + + auto block = fixture.rpcClient->eth_getBlockByNumber( "3", false ); + BOOST_REQUIRE( block["transactions"].size() == 1 ); + BOOST_REQUIRE( block["transactions"][0].asString() == txHash ); + + + block = fixture.rpcClient->eth_getBlockByNumber( "3", true ); + BOOST_REQUIRE( block["transactions"].size() == 1 ); + BOOST_REQUIRE( block["transactions"][0]["hash"].asString() == txHash ); + + receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); + BOOST_REQUIRE( receipt["status"] == string( "0x1" ) ); +} + +BOOST_AUTO_TEST_CASE( eip1559Transactions ) { + JsonRpcFixture fixture; +} + BOOST_AUTO_TEST_CASE( etherbase_generation2 ) { JsonRpcFixture fixture(c_genesisGeneration2ConfigString, false, false, true); string etherbase = fixture.rpcClient->eth_coinbase(); From 1288218714729b7cccf4e27404e5ad89ed8f9723 Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Wed, 20 Mar 2024 11:12:37 +0000 Subject: [PATCH 051/154] #1719 fix txn handling in verifyBlock --- libethereum/BlockChain.cpp | 7 ++++++- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 11 +++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/libethereum/BlockChain.cpp b/libethereum/BlockChain.cpp index f67c3be6e..a6452f497 100644 --- a/libethereum/BlockChain.cpp +++ b/libethereum/BlockChain.cpp @@ -1754,7 +1754,12 @@ VerifiedBlockRef BlockChain::verifyBlock( bytesConstRef _block, ( ImportRequirements::TransactionBasic | ImportRequirements::TransactionSignatures ) ) { MICROPROFILE_SCOPEI( "BlockChain", "check txns", MP_ROSYBROWN ); for ( RLP const& tr : r[1] ) { - bytesConstRef d = tr.data(); + bytesConstRef d; + if ( tr.isList() ) + // means Legacy transaction + d = tr.data(); + else + d = tr.payload(); try { Transaction t( d, ( _ir & ImportRequirements::TransactionSignatures ) ? CheckTransaction::Everything : diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index fb9dfcb32..2f70d4366 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -2649,8 +2649,19 @@ BOOST_AUTO_TEST_CASE( eip2930Transactions ) { BOOST_REQUIRE( block["transactions"].size() == 1 ); BOOST_REQUIRE( block["transactions"][0]["hash"].asString() == txHash ); + std::string blockHash = block["hash"].asString(); + receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); BOOST_REQUIRE( receipt["status"] == string( "0x1" ) ); + + auto result = fixture.rpcClient->eth_getTransactionByHash( txHash ); + BOOST_REQUIRE( result["hash"].asString() == txHash ); + + result = fixture.rpcClient->eth_getTransactionByBlockHashAndIndex( blockHash, "0x0" ); + BOOST_REQUIRE( result["hash"].asString() == txHash ); + + result = fixture.rpcClient->eth_getTransactionByBlockNumberAndIndex( "0x3", "0x0" ); + BOOST_REQUIRE( result["hash"].asString() == txHash ); } BOOST_AUTO_TEST_CASE( eip1559Transactions ) { From 7410de4eebc9decf8294d6d84ce02f6c924e273b Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Wed, 20 Mar 2024 16:21:37 +0000 Subject: [PATCH 052/154] SKALED-1583 Minor polishing --- libweb3jsonrpc/Debug.cpp | 1 - test/unittests/libethereum/ClientTest.cpp | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/libweb3jsonrpc/Debug.cpp b/libweb3jsonrpc/Debug.cpp index 3e908b717..338d6ee62 100644 --- a/libweb3jsonrpc/Debug.cpp +++ b/libweb3jsonrpc/Debug.cpp @@ -94,7 +94,6 @@ Json::Value Debug::traceBlock( Block const& _block, Json::Value const& _json ) { EnvInfo envInfo( _block.info(), m_eth.blockChain().lastBlockHashes(), _block.previousInfo().timestamp(), gasUsed, bc.chainID() ); // HACK 0 here is for gasPrice - // TODO timestamp of wrong block! Executive e( s, envInfo, m_eth.blockChain().chainParams(), 0, 0 ); eth::ExecutionResult er; diff --git a/test/unittests/libethereum/ClientTest.cpp b/test/unittests/libethereum/ClientTest.cpp index a3f8850e0..81781fa7c 100644 --- a/test/unittests/libethereum/ClientTest.cpp +++ b/test/unittests/libethereum/ClientTest.cpp @@ -390,8 +390,7 @@ static std::string const c_genesisInfoSkaleTest = std::string() + "minimumDifficulty": "0x020000", "difficultyBoundDivisor": "0x0800", "durationLimit": "0x0d", - "blockReward": "0x4563918244F40000", - "skaleDisableChainIdCheck": true + "blockReward": "0x4563918244F40000" }, "genesis": { "nonce": "0x0000000000000042", From 4c8794d5ebf6671c33d43785e2128acfb5020496 Mon Sep 17 00:00:00 2001 From: DmytroNazarenko Date: Wed, 20 Mar 2024 16:32:57 +0000 Subject: [PATCH 053/154] #1825 Remove dead code --- libweb3jsonrpc/JsonHelper.cpp | 49 +++++++---------------------------- 1 file changed, 9 insertions(+), 40 deletions(-) diff --git a/libweb3jsonrpc/JsonHelper.cpp b/libweb3jsonrpc/JsonHelper.cpp index 180ed51d0..7853bb1fd 100644 --- a/libweb3jsonrpc/JsonHelper.cpp +++ b/libweb3jsonrpc/JsonHelper.cpp @@ -478,15 +478,15 @@ TransactionSkeleton toTransactionSkeleton( Json::Value const& _json ) { if ( !_json["gasPrice"].empty() ) ret.gasPrice = jsToU256( _json["gasPrice"].asString() ); + if ( !_json["code"].empty() ) + ret.data = jsToBytes( _json["code"].asString(), OnFailed::Throw ); + if ( !_json["data"].empty() ) ret.data = jsToBytes( _json["data"].asString(), OnFailed::Throw ); if ( !_json["input"].empty() ) ret.data = jsToBytes( _json["input"].asString(), OnFailed::Throw ); - if ( !_json["code"].empty() ) - ret.data = jsToBytes( _json["code"].asString(), OnFailed::Throw ); - if ( !_json["nonce"].empty() ) ret.nonce = jsToU256( _json["nonce"].asString() ); return ret; @@ -534,6 +534,12 @@ TransactionSkeleton rapidJsonToTransactionSkeleton( rapidjson::Value const& _jso ret.gasPrice = jsToU256( _json["gasPrice"].GetString() ); } + if ( _json.HasMember( "code" ) ) { + if ( !_json["code"].IsString() ) + throw jsonrpc::JsonRpcException( jsonrpc::Errors::ERROR_RPC_INVALID_PARAMS ); + ret.data = jsToBytes( _json["code"].GetString(), OnFailed::Throw ); + } + if ( _json.HasMember( "data" ) ) { if ( !_json["data"].IsString() ) throw jsonrpc::JsonRpcException( jsonrpc::Errors::ERROR_RPC_INVALID_PARAMS ); @@ -546,12 +552,6 @@ TransactionSkeleton rapidJsonToTransactionSkeleton( rapidjson::Value const& _jso ret.data = jsToBytes( _json["input"].GetString(), OnFailed::Throw ); } - if ( _json.HasMember( "code" ) ) { - if ( !_json["code"].IsString() ) - throw jsonrpc::JsonRpcException( jsonrpc::Errors::ERROR_RPC_INVALID_PARAMS ); - ret.data = jsToBytes( _json["code"].GetString(), OnFailed::Throw ); - } - if ( _json.HasMember( "nonce" ) ) { if ( !_json["nonce"].IsString() ) throw jsonrpc::JsonRpcException( jsonrpc::Errors::ERROR_RPC_INVALID_PARAMS ); @@ -560,37 +560,6 @@ TransactionSkeleton rapidJsonToTransactionSkeleton( rapidjson::Value const& _jso return ret; } -/* -dev::eth::LogFilter toLogFilter( Json::Value const& _json ) { - dev::eth::LogFilter filter; - if ( !_json.isObject() || _json.empty() ) - return filter; - - // check only !empty. it should throw exceptions if input params are incorrect - if ( !_json["fromBlock"].empty() ) - filter.withEarliest( jsToFixed< 32 >( _json["fromBlock"].asString() ) ); - if ( !_json["toBlock"].empty() ) - filter.withLatest( jsToFixed< 32 >( _json["toBlock"].asString() ) ); - if ( !_json["address"].empty() ) { - if ( _json["address"].isArray() ) - for ( auto i : _json["address"] ) - filter.address( jsToAddress( i.asString() ) ); - else - filter.address( jsToAddress( _json["address"].asString() ) ); - } - if ( !_json["topics"].empty() ) - for ( unsigned i = 0; i < _json["topics"].size(); i++ ) { - if ( _json["topics"][i].isArray() ) { - for ( auto t : _json["topics"][i] ) - if ( !t.isNull() ) - filter.topic( i, jsToFixed< 32 >( t.asString() ) ); - } else if ( !_json["topics"][i].isNull() ) // if it is anything else then string, it - // should and will fail - filter.topic( i, jsToFixed< 32 >( _json["topics"][i].asString() ) ); - } - return filter; -} -*/ // TODO: this should be removed once we decide to remove backward compatibility with old log filters dev::eth::LogFilter toLogFilter( Json::Value const& _json ) // commented to avoid warning. From aadb0e2398cc9ae0b6cb8285e0be8088995b87a2 Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Thu, 21 Mar 2024 11:04:10 +0000 Subject: [PATCH 054/154] #1719 add more tests --- libethcore/TransactionBase.cpp | 7 ++----- libethereum/ClientBase.cpp | 4 ++-- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 12 +++++++----- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/libethcore/TransactionBase.cpp b/libethcore/TransactionBase.cpp index f0eaff71b..c14fca0e3 100644 --- a/libethcore/TransactionBase.cpp +++ b/libethcore/TransactionBase.cpp @@ -281,11 +281,8 @@ TransactionBase::TransactionBase( } TransactionType TransactionBase::getTransactionType( bytesConstRef _rlp ) { - if ( _rlp.size() < 1 ) { - BOOST_THROW_EXCEPTION( - InvalidTransactionFormat() << errinfo_comment( - "transaction format doesn't correspond to any of the supported formats" ) ); - } + if ( _rlp.empty() ) + return TransactionType::Legacy; if ( _rlp[0] > 2 ) return TransactionType::Legacy; return TransactionType( _rlp[0] ); diff --git a/libethereum/ClientBase.cpp b/libethereum/ClientBase.cpp index b4a4a6592..d120b58bd 100644 --- a/libethereum/ClientBase.cpp +++ b/libethereum/ClientBase.cpp @@ -447,12 +447,12 @@ Transactions ClientBase::transactions( h256 _blockHash ) const { RLP b( bl ); Transactions res; for ( unsigned i = 0; i < b[1].itemCount(); i++ ) { - auto tx = b[1][i].data().toBytes(); + auto tx = b[1][i].data(); if ( RLP( tx ).isList() ) // means Legacy transaction res.emplace_back( tx, CheckTransaction::Cheap, true ); else { - tx = RLP( tx ).payload().toBytes(); + tx = RLP( tx ).payload(); res.emplace_back( tx, CheckTransaction::Cheap, true ); } } diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index 2f70d4366..c1dafd758 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -2609,8 +2609,8 @@ BOOST_AUTO_TEST_CASE( eip2930Transactions ) { Json::Value ret; Json::Reader().parse( _config, ret ); - // Set chainID = 65535 - ret["params"]["chainID"] = "0xffff"; + // Set chainID = 151 + ret["params"]["chainID"] = "0x97"; Json::FastWriter fastWriter; std::string config = fastWriter.write( ret ); @@ -2635,16 +2635,18 @@ BOOST_AUTO_TEST_CASE( eip2930Transactions ) { // send 1 WEI from 0xc868AF52a6549c773082A334E5AE232e0Ea3B513 to 0x7D36aF85A184E220A656525fcBb9A63B9ab3C12b // encoded type 1 txn - txHash = fixture.rpcClient->eth_sendRawTransaction( "0x01f86882ffff808504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180c001a0c171a6fd330b71e278b9030986e0aa9aeba4cad9594bcbe8a608d12f3751f53fa03a24cbd1ab14a62d9f30cf9ace7b5aef04c2289160993ce7df5059d8708762dc" ); + txHash = fixture.rpcClient->eth_sendRawTransaction( "0x01f8678197808504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180c001a01ebdc546c8b85511b7ba831f47c4981069d7af972d10b7dce2c57225cb5df6a7a055ae1e84fea41d37589eb740a0a93017a5cd0e9f10ee50f165bf4b1b4c78ddae" ); dev::eth::mineTransaction( *( fixture.client ), 1 ); + // compare with txn hash from geth + BOOST_REQUIRE( txHash == "0xc843560015a655b8f81f65a458be9019bdb5cd8e416b6329ca18f36de0b8244d" ); + BOOST_REQUIRE( fixture.rpcClient->eth_getBalance( "0x7D36aF85A184E220A656525fcBb9A63B9ab3C12b", "latest" ) == "0x1" ); auto block = fixture.rpcClient->eth_getBlockByNumber( "3", false ); BOOST_REQUIRE( block["transactions"].size() == 1 ); BOOST_REQUIRE( block["transactions"][0].asString() == txHash ); - block = fixture.rpcClient->eth_getBlockByNumber( "3", true ); BOOST_REQUIRE( block["transactions"].size() == 1 ); BOOST_REQUIRE( block["transactions"][0]["hash"].asString() == txHash ); @@ -2665,7 +2667,7 @@ BOOST_AUTO_TEST_CASE( eip2930Transactions ) { } BOOST_AUTO_TEST_CASE( eip1559Transactions ) { - JsonRpcFixture fixture; + BOOST_REQUIRE( true ); } BOOST_AUTO_TEST_CASE( etherbase_generation2 ) { From 3d9968f21dc0af18e5e57e0ccf3cdbc28d105e36 Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Thu, 21 Mar 2024 14:06:56 +0000 Subject: [PATCH 055/154] SKALED-1583 Minor changes --- test/unittests/libethereum/ClientTest.cpp | 3 ++- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 4 +--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/test/unittests/libethereum/ClientTest.cpp b/test/unittests/libethereum/ClientTest.cpp index 81781fa7c..a3f8850e0 100644 --- a/test/unittests/libethereum/ClientTest.cpp +++ b/test/unittests/libethereum/ClientTest.cpp @@ -390,7 +390,8 @@ static std::string const c_genesisInfoSkaleTest = std::string() + "minimumDifficulty": "0x020000", "difficultyBoundDivisor": "0x0800", "durationLimit": "0x0d", - "blockReward": "0x4563918244F40000" + "blockReward": "0x4563918244F40000", + "skaleDisableChainIdCheck": true }, "genesis": { "nonce": "0x0000000000000042", diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index b2002b336..f2c16eafb 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -1335,10 +1335,8 @@ then compile! // wait for block after timestamp BOOST_REQUIRE_LT( fixture.client->blockInfo(LatestBlock).timestamp(), fixture.push0PatchActivationTimestamp ); - while( time(nullptr) < fixture.push0PatchActivationTimestamp ) { + while( time(nullptr) < fixture.push0PatchActivationTimestamp ) sleep(1); - cout << "SLEEP" << endl; - } // 1st timestamp-crossing block txHash = fixture.rpcClient->eth_sendTransaction( callObject ); From 2fe5699d26a8ae200d74a51bfc0441998aace0a4 Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Fri, 22 Mar 2024 12:59:05 +0000 Subject: [PATCH 056/154] #1719 add new required fields to json api responses --- libethcore/TransactionBase.h | 2 ++ libethereum/ClientBase.cpp | 2 +- libethereum/TransactionReceipt.h | 8 ++++++-- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 21 ++++++++++++++++++++- 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/libethcore/TransactionBase.h b/libethcore/TransactionBase.h index d3773166d..a931d7852 100644 --- a/libethcore/TransactionBase.h +++ b/libethcore/TransactionBase.h @@ -260,6 +260,8 @@ class TransactionBase { TransactionType txType() const { return m_txType; } + RLPs accessList() const { return m_accessList; } + /// Get the fee associated for a transaction with the given data. static int64_t baseGasRequired( bool _contractCreation, bytesConstRef _data, EVMSchedule const& _es ); diff --git a/libethereum/ClientBase.cpp b/libethereum/ClientBase.cpp index d120b58bd..0a27211e0 100644 --- a/libethereum/ClientBase.cpp +++ b/libethereum/ClientBase.cpp @@ -435,7 +435,7 @@ LocalisedTransactionReceipt ClientBase::localisedTransactionReceipt( // return LocalisedTransactionReceipt( tr, t.sha3(), tl.first, numberFromHash( tl.first ), tl.second, t.isInvalid() ? dev::Address( 0 ) : t.from(), - t.isInvalid() ? dev::Address( 0 ) : t.to(), gasUsed, contractAddress ); + t.isInvalid() ? dev::Address( 0 ) : t.to(), gasUsed, contractAddress, int( t.txType() ) ); } pair< h256, unsigned > ClientBase::transactionLocation( h256 const& _transactionHash ) const { diff --git a/libethereum/TransactionReceipt.h b/libethereum/TransactionReceipt.h index dcbeff84c..66170ea4c 100644 --- a/libethereum/TransactionReceipt.h +++ b/libethereum/TransactionReceipt.h @@ -97,7 +97,8 @@ class LocalisedTransactionReceipt : public TransactionReceipt { public: LocalisedTransactionReceipt( TransactionReceipt const& _t, h256 const& _hash, h256 const& _blockHash, BlockNumber _blockNumber, unsigned _transactionIndex, Address _from, - Address _to, u256 const& _gasUsed, Address const& _contractAddress = Address() ) + Address _to, u256 const& _gasUsed, Address const& _contractAddress = Address(), + int _txType = 0 ) : TransactionReceipt( _t ), m_hash( _hash ), m_blockHash( _blockHash ), @@ -106,7 +107,8 @@ class LocalisedTransactionReceipt : public TransactionReceipt { m_from( _from ), m_to( _to ), m_gasUsed( _gasUsed ), - m_contractAddress( _contractAddress ) { + m_contractAddress( _contractAddress ), + m_txType( _txType ) { LogEntries entries = log(); for ( unsigned i = 0; i < entries.size(); i++ ) m_localisedLogs.push_back( LocalisedLogEntry( @@ -124,6 +126,7 @@ class LocalisedTransactionReceipt : public TransactionReceipt { u256 const& gasUsed() const { return m_gasUsed; } Address const& contractAddress() const { return m_contractAddress; } LocalisedLogEntries const& localisedLogs() const { return m_localisedLogs; }; + int txType() const { return m_txType; } private: h256 m_hash; @@ -134,6 +137,7 @@ class LocalisedTransactionReceipt : public TransactionReceipt { u256 m_gasUsed; Address m_contractAddress; LocalisedLogEntries m_localisedLogs; + int m_txType; Counter< TransactionReceipt > c; diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index c1dafd758..91684cb05 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -2630,6 +2630,12 @@ BOOST_AUTO_TEST_CASE( eip2930Transactions ) { Json::Value receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); BOOST_REQUIRE( receipt["status"] == string( "0x1" ) ); + BOOST_REQUIRE( receipt["type"] == "0x0" ); + + auto result = fixture.rpcClient->eth_getTransactionByHash( txHash ); + BOOST_REQUIRE( result["type"] == "0x0" ); + BOOST_REQUIRE( !result.isMember( "yParity" ) ); + BOOST_REQUIRE( !result.isMember( "accessList" ) ); BOOST_REQUIRE( fixture.rpcClient->eth_getBalance( "0xc868AF52a6549c773082A334E5AE232e0Ea3B513", "latest" ) == "0x16345785d8a0000" ); @@ -2650,20 +2656,33 @@ BOOST_AUTO_TEST_CASE( eip2930Transactions ) { block = fixture.rpcClient->eth_getBlockByNumber( "3", true ); BOOST_REQUIRE( block["transactions"].size() == 1 ); BOOST_REQUIRE( block["transactions"][0]["hash"].asString() == txHash ); + BOOST_REQUIRE( block["transactions"][0]["type"] == "0x1" ); + BOOST_REQUIRE( block["transactions"][0]["yParity"] == block["transactions"][0]["v"] ); + BOOST_REQUIRE( block["transactions"][0]["accessList"].isArray() ); std::string blockHash = block["hash"].asString(); receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); BOOST_REQUIRE( receipt["status"] == string( "0x1" ) ); + BOOST_REQUIRE( receipt["type"] == "0x1" ); - auto result = fixture.rpcClient->eth_getTransactionByHash( txHash ); + result = fixture.rpcClient->eth_getTransactionByHash( txHash ); BOOST_REQUIRE( result["hash"].asString() == txHash ); + BOOST_REQUIRE( result["type"] == "0x1" ); + BOOST_REQUIRE( result["yParity"] == result["v"] ); + BOOST_REQUIRE( result["accessList"].isArray() ); result = fixture.rpcClient->eth_getTransactionByBlockHashAndIndex( blockHash, "0x0" ); BOOST_REQUIRE( result["hash"].asString() == txHash ); + BOOST_REQUIRE( result["type"] == "0x1" ); + BOOST_REQUIRE( result["yParity"] == result["v"] ); + BOOST_REQUIRE( result["accessList"].isArray() ); result = fixture.rpcClient->eth_getTransactionByBlockNumberAndIndex( "0x3", "0x0" ); BOOST_REQUIRE( result["hash"].asString() == txHash ); + BOOST_REQUIRE( result["type"] == "0x1" ); + BOOST_REQUIRE( result["yParity"] == result["v"] ); + BOOST_REQUIRE( result["accessList"].isArray() ); } BOOST_AUTO_TEST_CASE( eip1559Transactions ) { From aa00f502f8d16279f8cc96d00cb693e75839b116 Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Fri, 22 Mar 2024 12:59:19 +0000 Subject: [PATCH 057/154] #1719 add new required fields to json api responses --- libweb3jsonrpc/JsonHelper.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/libweb3jsonrpc/JsonHelper.cpp b/libweb3jsonrpc/JsonHelper.cpp index 883374885..ed26a1efe 100644 --- a/libweb3jsonrpc/JsonHelper.cpp +++ b/libweb3jsonrpc/JsonHelper.cpp @@ -105,6 +105,14 @@ Json::Value toJson( dev::eth::Transaction const& _t, std::pair< h256, unsigned > toJS( 27 + _t.signature().v ); res["r"] = toJS( _t.signature().r ); res["s"] = toJS( _t.signature().s ); + res["type"] = toJS( int( _t.txType() ) ); + if ( _t.txType() != dev::eth::TransactionType::Legacy ) { + res["yParity"] = res["v"].asString(); + res["accessList"] = Json::Value( Json::arrayValue ); + for ( const auto& d : _t.accessList() ) { + res["accessList"].append( dev::toHexPrefixed( d.toBytes() ) ); + } + } } return res; } @@ -203,6 +211,8 @@ Json::Value toJson( dev::eth::LocalisedTransactionReceipt const& _t ) { std::string strRevertReason = _t.getRevertReason(); if ( !strRevertReason.empty() ) res["revertReason"] = strRevertReason; + // + res["type"] = toJS( _t.txType() ); return res; } @@ -310,6 +320,8 @@ rapidjson::Document toRapidJson( dev::eth::LocalisedTransactionReceipt const& _t ADD_FIELD_TO_RAPIDJSON( res, "revertReason", strRevertReason, allocator ); } + ADD_FIELD_TO_RAPIDJSON( res, "type", toJS( _t.txType() ), allocator ); + return res; } @@ -359,6 +371,14 @@ Json::Value toJson( dev::eth::LocalisedTransaction const& _t ) { toJS( 27 + _t.signature().v ); res["r"] = toJS( _t.signature().r.hex() ); res["s"] = toJS( _t.signature().s.hex() ); + res["type"] = toJS( int( _t.txType() ) ); + if ( _t.txType() != dev::eth::TransactionType::Legacy ) { + res["yParity"] = res["v"].asString(); + res["accessList"] = Json::Value( Json::arrayValue ); + for ( const auto& d : _t.accessList() ) { + res["accessList"].append( dev::toHexPrefixed( d.toBytes() ) ); + } + } } return res; } From 41b71124e7472452a29ad7b2291cea5b02e1f7d5 Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Mon, 25 Mar 2024 13:44:09 +0000 Subject: [PATCH 058/154] #1719 handle accessList in transactions --- libethcore/TransactionBase.cpp | 35 +++++++++++++++++++++-- libweb3jsonrpc/JsonHelper.cpp | 18 ++++++++++-- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 31 ++++++++++++++++++++ 3 files changed, 80 insertions(+), 4 deletions(-) diff --git a/libethcore/TransactionBase.cpp b/libethcore/TransactionBase.cpp index c14fca0e3..0f85ab00c 100644 --- a/libethcore/TransactionBase.cpp +++ b/libethcore/TransactionBase.cpp @@ -36,6 +36,37 @@ using namespace std; using namespace dev; using namespace dev::eth; +RLPs validateAccessListRLP( const RLP& data ) { + if ( !data.isList() ) + BOOST_THROW_EXCEPTION( InvalidTransactionFormat() + << errinfo_comment( "transaction accessList RLP must be a list" ) ); + auto rlpList = data.toList(); + if ( rlpList.empty() ) + // empty accessList, ignore it + return rlpList; + + for ( const auto& d : rlpList ) { + if ( !d.isList() ) + BOOST_THROW_EXCEPTION( InvalidTransactionFormat() << errinfo_comment( + "transaction accessList RLP must be a list" ) ); + auto accessList = d.toList(); + if ( accessList.size() != 2 ) + BOOST_THROW_EXCEPTION( InvalidTransactionFormat() << errinfo_comment( + "transaction accessList RLP must be a list of size 2" ) ); + if ( !accessList[0].isData() || !accessList[1].isList() ) + BOOST_THROW_EXCEPTION( + InvalidTransactionFormat() << errinfo_comment( + "transaction accessList RLP must be a list of byte array and a list" ) ); + for ( const auto& k : accessList[1].toList() ) + if ( !k.isData() ) + BOOST_THROW_EXCEPTION( + InvalidTransactionFormat() << errinfo_comment( + "transaction storageKeys RLP must be a list of byte array" ) ); + } + + return rlpList; +} + TransactionBase::TransactionBase( TransactionSkeleton const& _ts, Secret const& _s ) : m_nonce( _ts.nonce ), m_value( _ts.value ), @@ -156,7 +187,7 @@ TransactionBase TransactionBase::makeType1Transaction( m_data = rlp[6].toBytes(); - m_accessList = rlp[7].toList(); + m_accessList = validateAccessListRLP( rlp[7] ); bool const yParity = rlp[8].toInt< uint8_t >(); h256 const r = rlp[9].toInt< u256 >(); @@ -223,7 +254,7 @@ TransactionBase TransactionBase::makeType2Transaction( m_data = rlp[7].toBytes(); - m_accessList = rlp[8].toList(); + m_accessList = validateAccessListRLP( rlp[8] ); bool const yParity = rlp[9].toInt< uint8_t >(); h256 const r = rlp[10].toInt< u256 >(); diff --git a/libweb3jsonrpc/JsonHelper.cpp b/libweb3jsonrpc/JsonHelper.cpp index ed26a1efe..7f6a55021 100644 --- a/libweb3jsonrpc/JsonHelper.cpp +++ b/libweb3jsonrpc/JsonHelper.cpp @@ -110,7 +110,14 @@ Json::Value toJson( dev::eth::Transaction const& _t, std::pair< h256, unsigned > res["yParity"] = res["v"].asString(); res["accessList"] = Json::Value( Json::arrayValue ); for ( const auto& d : _t.accessList() ) { - res["accessList"].append( dev::toHexPrefixed( d.toBytes() ) ); + auto list = d.toList(); + Json::Value accessList; + accessList["address"] = dev::toHexPrefixed( list[0].toBytes() ); + accessList["storageKeys"] = Json::Value( Json::arrayValue ); + for ( const auto& k : list[1].toList() ) { + accessList["storageKeys"].append( dev::toHexPrefixed( k.toBytes() ) ); + } + res["accessList"].append( accessList ); } } } @@ -376,7 +383,14 @@ Json::Value toJson( dev::eth::LocalisedTransaction const& _t ) { res["yParity"] = res["v"].asString(); res["accessList"] = Json::Value( Json::arrayValue ); for ( const auto& d : _t.accessList() ) { - res["accessList"].append( dev::toHexPrefixed( d.toBytes() ) ); + auto list = d.toList(); + Json::Value accessList; + accessList["address"] = dev::toHexPrefixed( list[0].toBytes() ); + accessList["storageKeys"] = Json::Value( Json::arrayValue ); + for ( const auto& k : list[1].toList() ) { + accessList["storageKeys"].append( dev::toHexPrefixed( k.toBytes() ) ); + } + res["accessList"].append( accessList ); } } } diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index 91684cb05..97d5c4846 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -2683,6 +2683,37 @@ BOOST_AUTO_TEST_CASE( eip2930Transactions ) { BOOST_REQUIRE( result["type"] == "0x1" ); BOOST_REQUIRE( result["yParity"] == result["v"] ); BOOST_REQUIRE( result["accessList"].isArray() ); + + // now the same txn with accessList and increased nonce + // [ { 'address': HexBytes( "0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae" ), 'storageKeys': ( "0x0000000000000000000000000000000000000000000000000000000000000003", "0x0000000000000000000000000000000000000000000000000000000000000007" ) } ] + txHash = fixture.rpcClient->eth_sendRawTransaction( "0x01f8c38197018504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000000780a0b03eaf481958e22fc39bd1d526eb9255be1e6625614f02ca939e51c3d7e64bcaa05f675640c04bb050d27bd1f39c07b6ff742311b04dab760bb3bc206054332879" ); + dev::eth::mineTransaction( *( fixture.client ), 1 ); + + // compare with txn hash from geth + BOOST_REQUIRE( txHash == "0xa6d3541e06dff71fb8344a4db2a4ad4e0b45024eb23a8f568982b70a5f50f94d" ); + + result = fixture.rpcClient->eth_getTransactionByHash( txHash ); + BOOST_REQUIRE( result["type"] == "0x1" ); + BOOST_REQUIRE( result["accessList"].isArray() ); + BOOST_REQUIRE( result["accessList"].size() == 1 ); + BOOST_REQUIRE( result["accessList"][0].isObject() && result["accessList"][0].getMemberNames().size() == 2 ); + BOOST_REQUIRE( result["accessList"][0].isMember( "address" ) && result["accessList"][0].isMember( "storageKeys" ) ); + BOOST_REQUIRE( result["accessList"][0]["address"].asString() == "0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae" ); + BOOST_REQUIRE( result["accessList"][0]["storageKeys"].isArray() && result["accessList"][0]["storageKeys"].size() == 2 ); + BOOST_REQUIRE( result["accessList"][0]["storageKeys"][0].asString() == "0x0000000000000000000000000000000000000000000000000000000000000003" ); + BOOST_REQUIRE( result["accessList"][0]["storageKeys"][1].asString() == "0x0000000000000000000000000000000000000000000000000000000000000007" ); + + block = fixture.rpcClient->eth_getBlockByNumber( "4", true ); + result = block["transactions"][0]; + BOOST_REQUIRE( result["type"] == "0x1" ); + BOOST_REQUIRE( result["accessList"].isArray() ); + BOOST_REQUIRE( result["accessList"].size() == 1 ); + BOOST_REQUIRE( result["accessList"][0].isObject() && result["accessList"][0].getMemberNames().size() == 2 ); + BOOST_REQUIRE( result["accessList"][0].isMember( "address" ) && result["accessList"][0].isMember( "storageKeys" ) ); + BOOST_REQUIRE( result["accessList"][0]["address"].asString() == "0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae" ); + BOOST_REQUIRE( result["accessList"][0]["storageKeys"].isArray() && result["accessList"][0]["storageKeys"].size() == 2 ); + BOOST_REQUIRE( result["accessList"][0]["storageKeys"][0].asString() == "0x0000000000000000000000000000000000000000000000000000000000000003" ); + BOOST_REQUIRE( result["accessList"][0]["storageKeys"][1].asString() == "0x0000000000000000000000000000000000000000000000000000000000000007" ); } BOOST_AUTO_TEST_CASE( eip1559Transactions ) { From 4d6da0844c72d248c47749f1e133ebdcd7d770c1 Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Mon, 25 Mar 2024 19:09:22 +0000 Subject: [PATCH 059/154] #1719 add eth_createAccessList method --- libweb3jsonrpc/Eth.cpp | 15 +++++++++++++++ libweb3jsonrpc/Eth.h | 2 ++ libweb3jsonrpc/EthFace.h | 12 ++++++++++++ 3 files changed, 29 insertions(+) diff --git a/libweb3jsonrpc/Eth.cpp b/libweb3jsonrpc/Eth.cpp index 63d4a8ff3..e20781ed7 100644 --- a/libweb3jsonrpc/Eth.cpp +++ b/libweb3jsonrpc/Eth.cpp @@ -896,6 +896,21 @@ string Eth::eth_chainId() { return toJS( client()->chainId() ); } +Json::Value Eth::eth_createAccessList( + const Json::Value& _param1, const std::string& /*_param2*/ ) { + TransactionSkeleton t = toTransactionSkeleton( _param1 ); + setTransactionDefaults( t ); + + int64_t gas = static_cast< int64_t >( t.gas ); + auto executionResult = client()->estimateGas( t.from, t.value, t.to, t.data, gas, t.gasPrice ); + + auto result = Json::Value( Json::objectValue ); + result["accessList"] = Json::Value( Json::arrayValue ); + result["gasUsed"] = toJS( executionResult.first ); + + return result; +} + bool Eth::eth_submitWork( string const& _nonce, string const&, string const& _mixHash ) { try { return asEthashClient( client() ) diff --git a/libweb3jsonrpc/Eth.h b/libweb3jsonrpc/Eth.h index 8059860d7..729409144 100644 --- a/libweb3jsonrpc/Eth.h +++ b/libweb3jsonrpc/Eth.h @@ -216,6 +216,8 @@ class Eth : public dev::rpc::EthFace, public skutils::json_config_file_accessor virtual Json::Value eth_subscribe( Json::Value const& _transaction ) override; virtual Json::Value eth_unsubscribe( Json::Value const& _transaction ) override; virtual Json::Value setSchainExitTime( Json::Value const& _transaction ) override; + virtual Json::Value eth_createAccessList( + const Json::Value& param1, const std::string& param2 ) override; void setTransactionDefaults( eth::TransactionSkeleton& _t ); diff --git a/libweb3jsonrpc/EthFace.h b/libweb3jsonrpc/EthFace.h index b7bafedd3..9e7680cf9 100644 --- a/libweb3jsonrpc/EthFace.h +++ b/libweb3jsonrpc/EthFace.h @@ -217,6 +217,10 @@ class EthFace : public ServerInterface< EthFace > { this->bindAndAddMethod( jsonrpc::Procedure( "eth_chainId", jsonrpc::PARAMS_BY_POSITION, jsonrpc::JSON_STRING, NULL ), &dev::rpc::EthFace::eth_chainIdI ); + this->bindAndAddMethod( + jsonrpc::Procedure( "eth_createAccessList", jsonrpc::PARAMS_BY_POSITION, + jsonrpc::JSON_STRING, jsonrpc::JSON_STRING, NULL ), + &dev::rpc::EthFace::eth_createAccessListI ); } inline virtual void eth_protocolVersionI( const Json::Value& request, Json::Value& response ) { @@ -428,6 +432,12 @@ class EthFace : public ServerInterface< EthFace > { ( void ) request; response = this->eth_chainId(); } + inline virtual void eth_createAccessListI( const Json::Value& request, Json::Value& response ) { + if ( !request.isArray() || request.empty() ) + BOOST_THROW_EXCEPTION( + jsonrpc::JsonRpcException( jsonrpc::Errors::ERROR_RPC_INVALID_PARAMS ) ); + response = this->eth_createAccessList( request[0u], request[1u].asString() ); + } virtual std::string eth_protocolVersion() = 0; virtual std::string eth_hashrate() = 0; virtual std::string eth_coinbase() = 0; @@ -493,6 +503,8 @@ class EthFace : public ServerInterface< EthFace > { virtual Json::Value eth_syncing() = 0; virtual std::string eth_estimateGas( const Json::Value& param1 ) = 0; virtual std::string eth_chainId() = 0; + virtual Json::Value eth_createAccessList( + const Json::Value& param1, const std::string& param2 ) = 0; }; } // namespace rpc From b43a6241f4a0eddb907f118098fc15ab0c24bcfa Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Wed, 27 Mar 2024 12:44:43 +0000 Subject: [PATCH 060/154] #1719 add unittests for type2 txns --- libethcore/TransactionBase.cpp | 2 + libethcore/TransactionBase.h | 4 ++ libweb3jsonrpc/JsonHelper.cpp | 8 +++ test/unittests/libweb3jsonrpc/jsonrpc.cpp | 86 ++++++++++++++++++++++- 4 files changed, 99 insertions(+), 1 deletion(-) diff --git a/libethcore/TransactionBase.cpp b/libethcore/TransactionBase.cpp index 0f85ab00c..66308d5ca 100644 --- a/libethcore/TransactionBase.cpp +++ b/libethcore/TransactionBase.cpp @@ -238,6 +238,8 @@ TransactionBase TransactionBase::makeType2Transaction( m_nonce = rlp[1].toInt< u256 >(); m_maxPriorityFeePerGas = rlp[2].toInt< u256 >(); m_maxFeePerGas = rlp[3].toInt< u256 >(); + // set m_gasPrice as SKALE ignores priority fees + m_gasPrice = m_maxFeePerGas; m_gas = rlp[4].toInt< u256 >(); if ( !rlp[5].isData() ) diff --git a/libethcore/TransactionBase.h b/libethcore/TransactionBase.h index a931d7852..0f262fac6 100644 --- a/libethcore/TransactionBase.h +++ b/libethcore/TransactionBase.h @@ -262,6 +262,10 @@ class TransactionBase { RLPs accessList() const { return m_accessList; } + u256 maxPriorityFeePerGas() const { return m_maxPriorityFeePerGas; } + + u256 maxFeePerGas() const { return m_maxFeePerGas; } + /// Get the fee associated for a transaction with the given data. static int64_t baseGasRequired( bool _contractCreation, bytesConstRef _data, EVMSchedule const& _es ); diff --git a/libweb3jsonrpc/JsonHelper.cpp b/libweb3jsonrpc/JsonHelper.cpp index 7f6a55021..3d928b3a9 100644 --- a/libweb3jsonrpc/JsonHelper.cpp +++ b/libweb3jsonrpc/JsonHelper.cpp @@ -119,6 +119,10 @@ Json::Value toJson( dev::eth::Transaction const& _t, std::pair< h256, unsigned > } res["accessList"].append( accessList ); } + if ( _t.txType() != dev::eth::TransactionType::Type1 ) { + res["maxPriorityFeePerGas"] = toJS( _t.maxPriorityFeePerGas() ); + res["maxFeePerGas"] = toJS( _t.maxPriorityFeePerGas() ); + } } } return res; @@ -392,6 +396,10 @@ Json::Value toJson( dev::eth::LocalisedTransaction const& _t ) { } res["accessList"].append( accessList ); } + if ( _t.txType() != dev::eth::TransactionType::Type1 ) { + res["maxPriorityFeePerGas"] = toJS( _t.maxPriorityFeePerGas() ); + res["maxFeePerGas"] = toJS( _t.maxPriorityFeePerGas() ); + } } } return res; diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index 97d5c4846..f5c85157c 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -2717,7 +2717,91 @@ BOOST_AUTO_TEST_CASE( eip2930Transactions ) { } BOOST_AUTO_TEST_CASE( eip1559Transactions ) { - BOOST_REQUIRE( true ); + std::string _config = c_genesisConfigString; + Json::Value ret; + Json::Reader().parse( _config, ret ); + + // Set chainID = 151 + ret["params"]["chainID"] = "0x97"; + + Json::FastWriter fastWriter; + std::string config = fastWriter.write( ret ); + JsonRpcFixture fixture( config ); + + dev::eth::simulateMining( *( fixture.client ), 20 ); + string senderAddress = toJS(fixture.coinbase.address()); + + Json::Value txRefill; + txRefill["to"] = "0x5EdF1e852fdD1B0Bc47C0307EF755C76f4B9c251"; + txRefill["from"] = senderAddress; + txRefill["gas"] = "100000"; + txRefill["gasPrice"] = fixture.rpcClient->eth_gasPrice(); + txRefill["value"] = 100000000000000000; + string txHash = fixture.rpcClient->eth_sendTransaction( txRefill ); + dev::eth::mineTransaction( *( fixture.client ), 1 ); + + Json::Value receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); + BOOST_REQUIRE( receipt["status"] == string( "0x1" ) ); + BOOST_REQUIRE( receipt["type"] == "0x0" ); + + auto result = fixture.rpcClient->eth_getTransactionByHash( txHash ); + BOOST_REQUIRE( result["type"] == "0x0" ); + BOOST_REQUIRE( !result.isMember( "yParity" ) ); + BOOST_REQUIRE( !result.isMember( "accessList" ) ); + + BOOST_REQUIRE( fixture.rpcClient->eth_getBalance( "0x5EdF1e852fdD1B0Bc47C0307EF755C76f4B9c251", "latest" ) == "0x16345785d8a0000" ); + + // send 1 WEI from 0x5EdF1e852fdD1B0Bc47C0307EF755C76f4B9c251 to 0x7D36aF85A184E220A656525fcBb9A63B9ab3C12b + // encoded type 1 txn + txHash = fixture.rpcClient->eth_sendRawTransaction( "0x02f8c98197808504a817c8008504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000000780a0f1a407dfc1a9f782001d89f617e9b3a2f295378533784fb39960dea60beea2d0a05ac3da2946554ba3d5721850f4f89ee7a0c38e4acab7130908e7904d13174388" ); + dev::eth::mineTransaction( *( fixture.client ), 1 ); + + // compare with txn hash from geth + BOOST_REQUIRE( txHash == "0x7bd586e93e3012577de4ba33e3b887baf520cbb92c5dd10996b262f9c5c8f747" ); + + BOOST_REQUIRE( fixture.rpcClient->eth_getBalance( "0x7D36aF85A184E220A656525fcBb9A63B9ab3C12b", "latest" ) == "0x1" ); + + auto block = fixture.rpcClient->eth_getBlockByNumber( "3", false ); + BOOST_REQUIRE( block["transactions"].size() == 1 ); + BOOST_REQUIRE( block["transactions"][0].asString() == txHash ); + + block = fixture.rpcClient->eth_getBlockByNumber( "3", true ); +// BOOST_REQUIRE( !block["baseGasFee"].asString().empty() ); + BOOST_REQUIRE( block["transactions"].size() == 1 ); + BOOST_REQUIRE( block["transactions"][0]["hash"].asString() == txHash ); + BOOST_REQUIRE( block["transactions"][0]["type"] == "0x2" ); + BOOST_REQUIRE( block["transactions"][0]["yParity"] == block["transactions"][0]["v"] ); + BOOST_REQUIRE( block["transactions"][0]["accessList"].isArray() ); + + std::string blockHash = block["hash"].asString(); + + receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); + BOOST_REQUIRE( receipt["status"] == string( "0x1" ) ); + BOOST_REQUIRE( receipt["type"] == "0x2" ); + + result = fixture.rpcClient->eth_getTransactionByHash( txHash ); + BOOST_REQUIRE( result["hash"].asString() == txHash ); + BOOST_REQUIRE( result["type"] == "0x2" ); + BOOST_REQUIRE( result["yParity"] == result["v"] ); + BOOST_REQUIRE( result["accessList"].isArray() ); + BOOST_REQUIRE( result.isMember( "maxPriorityFeePerGas" ) && result["maxPriorityFeePerGas"].isString() ); + BOOST_REQUIRE( result.isMember( "maxFeePerGas" ) && result["maxFeePerGas"].isString() ); + + result = fixture.rpcClient->eth_getTransactionByBlockHashAndIndex( blockHash, "0x0" ); + BOOST_REQUIRE( result["hash"].asString() == txHash ); + BOOST_REQUIRE( result["type"] == "0x2" ); + BOOST_REQUIRE( result["yParity"] == result["v"] ); + BOOST_REQUIRE( result["accessList"].isArray() ); + BOOST_REQUIRE( result["maxPriorityFeePerGas"] == "0x4a817c800" ); + BOOST_REQUIRE( result["maxFeePerGas"] == "0x4a817c800" ); + + result = fixture.rpcClient->eth_getTransactionByBlockNumberAndIndex( "0x3", "0x0" ); + BOOST_REQUIRE( result["hash"].asString() == txHash ); + BOOST_REQUIRE( result["type"] == "0x2" ); + BOOST_REQUIRE( result["yParity"] == result["v"] ); + BOOST_REQUIRE( result["accessList"].isArray() ); + BOOST_REQUIRE( result["maxPriorityFeePerGas"] == "0x4a817c800" ); + BOOST_REQUIRE( result["maxFeePerGas"] == "0x4a817c800" ); } BOOST_AUTO_TEST_CASE( etherbase_generation2 ) { From 48c71800804396df72c624fa1a8b96dfda1a6cc5 Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Wed, 27 Mar 2024 12:53:31 +0000 Subject: [PATCH 061/154] #1719 add new json rpc api methods --- libweb3jsonrpc/Eth.cpp | 11 +++++++++++ libweb3jsonrpc/Eth.h | 3 +++ libweb3jsonrpc/EthFace.h | 23 ++++++++++++++++++++++- 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/libweb3jsonrpc/Eth.cpp b/libweb3jsonrpc/Eth.cpp index e20781ed7..11b1e9ea2 100644 --- a/libweb3jsonrpc/Eth.cpp +++ b/libweb3jsonrpc/Eth.cpp @@ -896,6 +896,8 @@ string Eth::eth_chainId() { return toJS( client()->chainId() ); } +// SKALE ignores gas costs +// make response default, only fill in gasUsed field Json::Value Eth::eth_createAccessList( const Json::Value& _param1, const std::string& /*_param2*/ ) { TransactionSkeleton t = toTransactionSkeleton( _param1 ); @@ -911,6 +913,15 @@ Json::Value Eth::eth_createAccessList( return result; } +Json::Value Eth::eth_feeHistory( + int64_t /*param1*/, const std::string& /*param2*/, const Json::Value& /*param3*/ ) { + return Json::Value( Json::objectValue ); +} + +std::string Eth::eth_maxPriorityFeePerGas() { + return "0x1"; +} + bool Eth::eth_submitWork( string const& _nonce, string const&, string const& _mixHash ) { try { return asEthashClient( client() ) diff --git a/libweb3jsonrpc/Eth.h b/libweb3jsonrpc/Eth.h index 729409144..3e9e0d3d3 100644 --- a/libweb3jsonrpc/Eth.h +++ b/libweb3jsonrpc/Eth.h @@ -218,6 +218,9 @@ class Eth : public dev::rpc::EthFace, public skutils::json_config_file_accessor virtual Json::Value setSchainExitTime( Json::Value const& _transaction ) override; virtual Json::Value eth_createAccessList( const Json::Value& param1, const std::string& param2 ) override; + virtual Json::Value eth_feeHistory( + int64_t param1, const std::string& param2, const Json::Value& param3 ) override; + virtual std::string eth_maxPriorityFeePerGas() override; void setTransactionDefaults( eth::TransactionSkeleton& _t ); diff --git a/libweb3jsonrpc/EthFace.h b/libweb3jsonrpc/EthFace.h index 9e7680cf9..7d213e966 100644 --- a/libweb3jsonrpc/EthFace.h +++ b/libweb3jsonrpc/EthFace.h @@ -219,8 +219,14 @@ class EthFace : public ServerInterface< EthFace > { &dev::rpc::EthFace::eth_chainIdI ); this->bindAndAddMethod( jsonrpc::Procedure( "eth_createAccessList", jsonrpc::PARAMS_BY_POSITION, - jsonrpc::JSON_STRING, jsonrpc::JSON_STRING, NULL ), + jsonrpc::JSON_OBJECT, "param1", jsonrpc::JSON_STRING, NULL ), &dev::rpc::EthFace::eth_createAccessListI ); + this->bindAndAddMethod( jsonrpc::Procedure( "eth_feeHistory", jsonrpc::PARAMS_BY_POSITION, + jsonrpc::JSON_ARRAY, "param1", jsonrpc::JSON_OBJECT, NULL ), + &dev::rpc::EthFace::eth_feeHistoryI ); + this->bindAndAddMethod( jsonrpc::Procedure( "eth_maxPriorityFeePerGas", + jsonrpc::PARAMS_BY_POSITION, jsonrpc::JSON_STRING, NULL ), + &dev::rpc::EthFace::eth_maxPriorityFeePerGasI ); } inline virtual void eth_protocolVersionI( const Json::Value& request, Json::Value& response ) { @@ -438,6 +444,18 @@ class EthFace : public ServerInterface< EthFace > { jsonrpc::JsonRpcException( jsonrpc::Errors::ERROR_RPC_INVALID_PARAMS ) ); response = this->eth_createAccessList( request[0u], request[1u].asString() ); } + inline virtual void eth_feeHistoryI( const Json::Value& request, Json::Value& response ) { + if ( !request.isArray() || request.size() != 3 ) + BOOST_THROW_EXCEPTION( + jsonrpc::JsonRpcException( jsonrpc::Errors::ERROR_RPC_INVALID_PARAMS ) ); + response = + this->eth_feeHistory( request[0u].asInt64(), request[1u].asString(), request[2u] ); + } + inline virtual void eth_maxPriorityFeePerGasI( + const Json::Value& request, Json::Value& response ) { + ( void ) request; + response = this->eth_maxPriorityFeePerGas(); + } virtual std::string eth_protocolVersion() = 0; virtual std::string eth_hashrate() = 0; virtual std::string eth_coinbase() = 0; @@ -505,6 +523,9 @@ class EthFace : public ServerInterface< EthFace > { virtual std::string eth_chainId() = 0; virtual Json::Value eth_createAccessList( const Json::Value& param1, const std::string& param2 ) = 0; + virtual Json::Value eth_feeHistory( + int64_t param1, const std::string& param2, const Json::Value& param3 ) = 0; + virtual std::string eth_maxPriorityFeePerGas() = 0; }; } // namespace rpc From 09ecc84b25583552b88a5275b55840bcc223478a Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Wed, 27 Mar 2024 20:39:09 +0000 Subject: [PATCH 062/154] #1719 add unittests for txn serialization --- libethcore/TransactionBase.cpp | 4 +- test/unittests/libethereum/Transaction.cpp | 180 ++++++++++++++++++++- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 3 + 3 files changed, 185 insertions(+), 2 deletions(-) diff --git a/libethcore/TransactionBase.cpp b/libethcore/TransactionBase.cpp index 66308d5ca..b9f2e9b20 100644 --- a/libethcore/TransactionBase.cpp +++ b/libethcore/TransactionBase.cpp @@ -41,9 +41,11 @@ RLPs validateAccessListRLP( const RLP& data ) { BOOST_THROW_EXCEPTION( InvalidTransactionFormat() << errinfo_comment( "transaction accessList RLP must be a list" ) ); auto rlpList = data.toList(); - if ( rlpList.empty() ) + if ( rlpList.empty() ) { // empty accessList, ignore it + std::cout << "HERE\n"; return rlpList; + } for ( const auto& d : rlpList ) { if ( !d.isList() ) diff --git a/test/unittests/libethereum/Transaction.cpp b/test/unittests/libethereum/Transaction.cpp index 14e53d159..e21ecb1d9 100644 --- a/test/unittests/libethereum/Transaction.cpp +++ b/test/unittests/libethereum/Transaction.cpp @@ -43,6 +43,28 @@ BOOST_AUTO_TEST_CASE( TransactionGasRequired, CheckTransaction::None ); BOOST_CHECK_EQUAL( tr.baseGasRequired( FrontierSchedule ), 14 * 68 + 21000 ); BOOST_CHECK_EQUAL( tr.baseGasRequired( IstanbulSchedule ), 14 * 16 + 21000 ); + + tr = Transaction ( + fromHex( "0x01f8d18197808504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b018" + "e0358ac39584bc98a7c979f984b03f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697b" + "aef842a00000000000000000000000000000000000000000000000000000000000000003a0000" + "000000000000000000000000000000000000000000000000000000000000780a08ae3a721ee02" + "cf52d85ecec934c6f46ea3e96d6355eb8ccde261e1e419885761a0234565f6d227d8eba0937b0" + "f03cb25f83aeb24c13b7a39a9ef6e80c1ea272a3c" ), + CheckTransaction::None ); + BOOST_CHECK_EQUAL( tr.baseGasRequired( FrontierSchedule ), 14 * 68 + 21000 ); + BOOST_CHECK_EQUAL( tr.baseGasRequired( IstanbulSchedule ), 14 * 16 + 21000 ); + + tr = Transaction ( + fromHex( "0x02f8d78197808504a817c8008504a817c800827530947d36af85a184e220a656525fcbb9a63" + "b9ab3c12b018e0358ac39584bc98a7c979f984b03f85bf85994de0b295669a9fd93d5f28d9ec8" + "5e40f4cb697baef842a0000000000000000000000000000000000000000000000000000000000" + "0000003a0000000000000000000000000000000000000000000000000000000000000000780a0" + "23927f0e208494bd1fd8876597899d72025167fed902e9c1c417ddd8639bb7b4a02a63ea48f7e" + "94df3a40c4a840ba98da02f13817acb5fe137d40f632e6c8ed367" ), + CheckTransaction::None ); + BOOST_CHECK_EQUAL( tr.baseGasRequired( FrontierSchedule ), 14 * 68 + 21000 ); + BOOST_CHECK_EQUAL( tr.baseGasRequired( IstanbulSchedule ), 14 * 16 + 21000 ); } BOOST_AUTO_TEST_CASE( TransactionWithEmptyRecepient ) { @@ -57,6 +79,40 @@ BOOST_AUTO_TEST_CASE( TransactionWithEmptyRecepient ) { "0xf84c8014830493e0c0808026a02f23977c68f851bbec8619510a4acdd34805270d97f5714b003efe7274914c" "a2a05874022b26e0d88807bdcc59438f86f5a82e24afefad5b6a67ae853896fe2b37" ); BOOST_REQUIRE_THROW( Transaction( txRlp, CheckTransaction::None ), InvalidTransactionFormat ); + + txRlp = fromHex( + "0x01f8bd8197808504a817c80082753080018e0358ac39584bc98a7c979f984b03f85bf85994de0b295669a9fd" + "93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000000000000000" + "000003a0000000000000000000000000000000000000000000000000000000000000000780a08d795591e0eb53" + "fb374a804ba3f73cf291069549d62316219811c3f7fb8cfad0a07e9d0bd7fabc8f74475624c912b5334dc49224" + "b1dede6c802d52a35254bfc457" ); + tx = Transaction( txRlp, CheckTransaction::None ); // shouldn't throw + + // recipient RLP is 0xc0 (empty list) + txRlp = fromHex( + "0x01f8bd8197808504a817c800827530c0018e0358ac39584bc98a7c979f984b03f85bf85994de0b295669a9fd" + "93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000000000000000" + "000003a0000000000000000000000000000000000000000000000000000000000000000780a08d795591e0eb53" + "fb374a804ba3f73cf291069549d62316219811c3f7fb8cfad0a07e9d0bd7fabc8f74475624c912b5334dc49224" + "b1dede6c802d52a35254bfc457" ); + BOOST_REQUIRE_THROW( Transaction( txRlp, CheckTransaction::None ), InvalidTransactionFormat ); + + txRlp = fromHex( + "0x02f8c38197808504a817c8008504a817c80082753080018e0358ac39584bc98a7c979f984b03f85bf85994de" + "0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000" + "000000000000000003a0000000000000000000000000000000000000000000000000000000000000000780a0c8" + "029a8b702d54c79ef18b557e755a1bfd8a4afcfcf31813790df34a6f740a95a00ceb8fdf611b4c9ff8d007d2a5" + "44bc4bfae0e97a03e32b1c8b8208c82cebcafb" ); + tx = Transaction( txRlp, CheckTransaction::None ); // shouldn't throw + + // recipient RLP is 0xc0 (empty list) + txRlp = fromHex( + "0x02f8c38197808504a817c8008504a817c800827530c0018e0358ac39584bc98a7c979f984b03f85bf85994de" + "0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000" + "000000000000000003a0000000000000000000000000000000000000000000000000000000000000000780a0c8" + "029a8b702d54c79ef18b557e755a1bfd8a4afcfcf31813790df34a6f740a95a00ceb8fdf611b4c9ff8d007d2a5" + "44bc4bfae0e97a03e32b1c8b8208c82cebcafb" ); + BOOST_REQUIRE_THROW( Transaction( txRlp, CheckTransaction::None ), InvalidTransactionFormat ); } BOOST_AUTO_TEST_CASE( TransactionNotReplayProtected, @@ -66,11 +122,28 @@ BOOST_AUTO_TEST_CASE( TransactionNotReplayProtected, "1ba048b55bfa915ac795c431978d8a6a992b628d557da5ff759b307d495a36649353a0efffd310ac743f371de3" "b9f7f9cb56c0b28ad43601b4ab949f53faa07bd2c804" ); Transaction tx( txRlp, CheckTransaction::None ); - tx.checkChainId( 1234, false ); // any chain ID is accepted for not replay protected tx + tx.checkChainId( 1234, true ); // any chain ID is accepted for not replay protected tx RLPStream txRlpStream; tx.streamRLP( txRlpStream ); BOOST_REQUIRE( txRlpStream.out() == txRlp ); + + txRlp = fromHex( + "0x01f8ce8504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b018e0358ac3958" + "4bc98a7c979f984b03f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a0000000000000" + "0000000000000000000000000000000000000000000000000003a000000000000000000000000000000000" + "0000000000000000000000000000000701a0a3b1de6f2958e1e34db86438bba310637f2e799fe9768a143a" + "d87e47c33d1e6ca00e04ef9fe6bb01176c5a4c5bf4a070662478a320eaaff2895d17451c8d61d472" ); + BOOST_REQUIRE_THROW( Transaction( txRlp, CheckTransaction::None, false ), dev::BadCast ); + + txRlp = fromHex( + "0x02f8d5808504a817c8008504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b" + "018e0358ac39584bc98a7c979f984b03f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842" + "a00000000000000000000000000000000000000000000000000000000000000003a0000000000000000000" + "000000000000000000000000000000000000000000000780a023927f0e208494bd1fd8876597899d720251" + "67fed902e9c1c417ddd8639bb7b4a02a63ea48f7e94df3a40c4a840ba98da02f13817acb5fe137d40f632e" + "6c8ed367" ); + BOOST_REQUIRE_THROW( Transaction( txRlp, CheckTransaction::None, false ), dev::BadCast ); } BOOST_AUTO_TEST_CASE( TransactionChainIDMax64Bit, @@ -90,6 +163,25 @@ BOOST_AUTO_TEST_CASE( TransactionChainIDMax64Bit, "789dd4c743dfe42c1820f9231f98a962b210e3ac2452a3" ); Transaction tx2{txRlp2, CheckTransaction::None}; tx2.checkChainId( std::numeric_limits< uint64_t >::max(), false ); + + txRlp1 = fromHex( + "0x01f8d888ffffffffffffffff808504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b01" + "8e0358ac39584bc98a7c979f984b03f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000" + "000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000" + "00000000000000000000000000000000000701a0e236de02b843139aebfce593d680c06ce79cfd2f2e7f9dcac9" + "fe23b38060591aa0734952245446ad42e47ec996c9a7b02973cbc8dd944c9622714416b2bef122f4" ); + tx1 = Transaction{txRlp1, CheckTransaction::None}; + tx1.checkChainId( std::numeric_limits< uint64_t >::max(), false ); + + txRlp1 = fromHex( + "0x02f8de88ffffffffffffffff808504a817c8008504a817c800827530947d36af85a184e220a656525fcbb9a6" + "3b9ab3c12b018e0358ac39584bc98a7c979f984b03f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697b" + "aef842a00000000000000000000000000000000000000000000000000000000000000003a00000000000000000" + "00000000000000000000000000000000000000000000000780a0b62465e633b565f2f3632125b452d8df66d4f6" + "b48b58f59da6201234e3f9ce75a0467f18ca2b64f3642cb37e7d5470bbac5fbc62c66b23a0ff955b994803fcf3" + "74" ); + tx1 = Transaction{txRlp1, CheckTransaction::None}; + tx1.checkChainId( std::numeric_limits< uint64_t >::max(), false ); } BOOST_AUTO_TEST_CASE( TransactionChainIDBiggerThan64Bit ) { @@ -106,6 +198,31 @@ BOOST_AUTO_TEST_CASE( TransactionChainIDBiggerThan64Bit ) { "ff921201554726367d2be8c804a7ff89ccf285ebc57dff8ae4c44b9c19ac4aa08887321be575c8095f789dd4c7" "43dfe42c1820f9231f98a962b210e3ac2452a3" ); BOOST_REQUIRE_THROW( Transaction( txRlp2, CheckTransaction::None ), InvalidSignature ); + + txRlp1 = fromHex( + "0x01f8d9890a0000000000000117808504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b" + "018e0358ac39584bc98a7c979f984b03f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a000" + "00000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000" + "0000000000000000000000000000000000000780a0e108b83ed5e1b701b249970e61d9ae409eb6870af96f1a9d" + "8827f497375ae5c8a0795eb0b4f36fe712af5e6a8447802c9eb0913a2add86174552bf2e4b0e183feb" ); + RLPStream rlpStream; + auto tx = Transaction( txRlp1, CheckTransaction::None ); + tx.streamRLP( rlpStream, IncludeSignature::WithSignature ); + auto txRlp = rlpStream.out(); + BOOST_REQUIRE( txRlp != txRlp1 ); + + txRlp1 = fromHex( + "0x02f8df890a0000000000000117808504a817c8008504a817c800827530947d36af85a184e220a656525fcbb9" + "a63b9ab3c12b018e0358ac39584bc98a7c979f984b03f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb69" + "7baef842a00000000000000000000000000000000000000000000000000000000000000003a000000000000000" + "0000000000000000000000000000000000000000000000000780a0912e3aad5af05008d3a282d2a76dc975d234" + "4eb34e2500c924a58ccfdc9dbeb4a04afcffcb5d1897df030d45a7eeb3ceb7c7e6fe368fc47865156b4899de32" + "01c7" ); + RLPStream rlpStream1; + tx = Transaction( txRlp1, CheckTransaction::None ); + tx.streamRLP( rlpStream1, IncludeSignature::WithSignature ); + txRlp = rlpStream.out(); + BOOST_REQUIRE( txRlp != txRlp1 ); } BOOST_AUTO_TEST_CASE( TransactionReplayProtected ) { @@ -120,6 +237,67 @@ BOOST_AUTO_TEST_CASE( TransactionReplayProtected ) { RLPStream txRlpStream; tx.streamRLP( txRlpStream ); BOOST_REQUIRE( txRlpStream.out() == txRlp ); + + txRlp = fromHex( + "0x01f8c38197018504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180f85bf85994de" + "0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000" + "000000000000000003a0000000000000000000000000000000000000000000000000000000000000000780a0b0" + "3eaf481958e22fc39bd1d526eb9255be1e6625614f02ca939e51c3d7e64bcaa05f675640c04bb050d27bd1f39c" + "07b6ff742311b04dab760bb3bc206054332879" ); + tx = Transaction( txRlp, CheckTransaction::None ); + tx.checkChainId( 151, false ); + BOOST_REQUIRE_THROW( tx.checkChainId( 123, false ), InvalidSignature ); + + BOOST_REQUIRE( tx.rlp() == txRlp ); + + txRlp = fromHex( + "0x02f8c98197808504a817c8008504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180" + "f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000" + "000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000" + "00000780a0f1a407dfc1a9f782001d89f617e9b3a2f295378533784fb39960dea60beea2d0a05ac3da2946554b" + "a3d5721850f4f89ee7a0c38e4acab7130908e7904d13174388" ); + tx = Transaction( txRlp, CheckTransaction::None ); + tx.checkChainId( 151, false ); + BOOST_REQUIRE_THROW( tx.checkChainId( 123, false ), InvalidSignature ); + + BOOST_REQUIRE( tx.rlp() == txRlp ); +} + +BOOST_AUTO_TEST_CASE( accessList ) { + // [ { 'address': HexBytes( "0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae" ), + // 'storageKeys': ( "0x0000000000000000000000000000000000000000000000000000000000000003", "0x0000000000000000000000000000000000000000000000000000000000000007" ) } ] + auto txRlp = fromHex( + "0x01f8c38197018504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180f85bf85994de" + "0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000" + "000000000000000003a0000000000000000000000000000000000000000000000000000000000000000780a0b0" + "3eaf481958e22fc39bd1d526eb9255be1e6625614f02ca939e51c3d7e64bcaa05f675640c04bb050d27bd1f39c" + "07b6ff742311b04dab760bb3bc206054332879" ); + Transaction tx; + BOOST_REQUIRE_NO_THROW( tx = Transaction( txRlp, CheckTransaction::None ) ); + BOOST_REQUIRE( tx.accessList().size() == 1 ); + + // empty accessList + txRlp = fromHex( + "0x01f8678197808504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180c001a01ebdc5" + "46c8b85511b7ba831f47c4981069d7af972d10b7dce2c57225cb5df6a7a055ae1e84fea41d37589eb740a0a930" + "17a5cd0e9f10ee50f165bf4b1b4c78ddae" ); + BOOST_REQUIRE_NO_THROW( tx = Transaction( txRlp, CheckTransaction::None ) ); + BOOST_REQUIRE( tx.accessList().size() == 0 ); + + // no accessList + txRlp = fromHex( + "0x01f8678197808504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180c080a025fffe" + "aafed61a15aefd1be5ccbd19e3fe07d0088b06ab6ad960d0f6c382d8cea02e255bf1a7de0a75ccec6d00bcc367" + "1af06ca9641fc02024a9d6b28f9b01307b" ); + BOOST_REQUIRE_NO_THROW( tx = Transaction( txRlp, CheckTransaction::None ) ); + BOOST_REQUIRE( tx.accessList().size() == 0 ); + + // change empty accessList 0xc0 to empty array 0x80 + txRlp = fromHex( + "0x01f8678197808504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b01808001a01ebdc5" + "46c8b85511b7ba831f47c4981069d7af972d10b7dce2c57225cb5df6a7a055ae1e84fea41d37589eb740a0a930" + "17a5cd0e9f10ee50f165bf4b1b4c78ddae" ); + BOOST_REQUIRE_THROW( Transaction( txRlp, CheckTransaction::None ), InvalidTransactionFormat ); } BOOST_AUTO_TEST_CASE( ExecutionResultOutput, diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index f5c85157c..654339c05 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -2659,6 +2659,7 @@ BOOST_AUTO_TEST_CASE( eip2930Transactions ) { BOOST_REQUIRE( block["transactions"][0]["type"] == "0x1" ); BOOST_REQUIRE( block["transactions"][0]["yParity"] == block["transactions"][0]["v"] ); BOOST_REQUIRE( block["transactions"][0]["accessList"].isArray() ); + BOOST_REQUIRE( block["transactions"][0]["accessList"].size() == 0 ); std::string blockHash = block["hash"].asString(); @@ -2671,6 +2672,7 @@ BOOST_AUTO_TEST_CASE( eip2930Transactions ) { BOOST_REQUIRE( result["type"] == "0x1" ); BOOST_REQUIRE( result["yParity"] == result["v"] ); BOOST_REQUIRE( result["accessList"].isArray() ); + BOOST_REQUIRE( result["accessList"].size() == 0 ); result = fixture.rpcClient->eth_getTransactionByBlockHashAndIndex( blockHash, "0x0" ); BOOST_REQUIRE( result["hash"].asString() == txHash ); @@ -2683,6 +2685,7 @@ BOOST_AUTO_TEST_CASE( eip2930Transactions ) { BOOST_REQUIRE( result["type"] == "0x1" ); BOOST_REQUIRE( result["yParity"] == result["v"] ); BOOST_REQUIRE( result["accessList"].isArray() ); + BOOST_REQUIRE( result["accessList"].size() == 0 ); // now the same txn with accessList and increased nonce // [ { 'address': HexBytes( "0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae" ), 'storageKeys': ( "0x0000000000000000000000000000000000000000000000000000000000000003", "0x0000000000000000000000000000000000000000000000000000000000000007" ) } ] From 6a84e6f7cf23e02f3dc0a71af9172f72a5eda86b Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Mon, 1 Apr 2024 12:32:41 +0100 Subject: [PATCH 063/154] #1719 cleanup --- libethcore/TransactionBase.cpp | 1 - libweb3jsonrpc/JsonHelper.cpp | 19 +++++++------------ 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/libethcore/TransactionBase.cpp b/libethcore/TransactionBase.cpp index b9f2e9b20..ccd009462 100644 --- a/libethcore/TransactionBase.cpp +++ b/libethcore/TransactionBase.cpp @@ -43,7 +43,6 @@ RLPs validateAccessListRLP( const RLP& data ) { auto rlpList = data.toList(); if ( rlpList.empty() ) { // empty accessList, ignore it - std::cout << "HERE\n"; return rlpList; } diff --git a/libweb3jsonrpc/JsonHelper.cpp b/libweb3jsonrpc/JsonHelper.cpp index 3d928b3a9..fbe35bfdc 100644 --- a/libweb3jsonrpc/JsonHelper.cpp +++ b/libweb3jsonrpc/JsonHelper.cpp @@ -181,7 +181,7 @@ Json::Value toJson( dev::eth::TransactionReceipt const& _t ) { res["gasUsed"] = toJS( _t.cumulativeGasUsed() ); res["bloom"] = toJS( _t.bloom() ); res["log"] = dev::toJson( _t.log() ); - // + std::string strRevertReason = _t.getRevertReason(); if ( !strRevertReason.empty() ) res["revertReason"] = strRevertReason; @@ -200,29 +200,27 @@ Json::Value toJson( dev::eth::LocalisedTransactionReceipt const& _t ) { res["blockNumber"] = toJS( _t.blockNumber() ); res["cumulativeGasUsed"] = toJS( _t.cumulativeGasUsed() ); res["gasUsed"] = toJS( _t.gasUsed() ); - // + // The "contractAddress" field must be null for all types of trasactions but contract deployment // ones. The contract deployment transaction is special because it's the only type of // transaction with "to" filed set to null. - // dev::Address contractAddress = _t.contractAddress(); if ( contractAddress == dev::Address( 0 ) ) res["contractAddress"] = Json::Value::nullRef; else res["contractAddress"] = toJS( contractAddress ); - // - // + res["logs"] = dev::toJson( _t.localisedLogs() ); res["logsBloom"] = toJS( _t.bloom() ); if ( _t.hasStatusCode() ) res["status"] = toString0x< uint8_t >( _t.statusCode() ); // toString( _t.statusCode() ); else res["stateRoot"] = toJS( _t.stateRoot() ); - // + std::string strRevertReason = _t.getRevertReason(); if ( !strRevertReason.empty() ) res["revertReason"] = strRevertReason; - // + res["type"] = toJS( _t.txType() ); return res; } @@ -304,18 +302,16 @@ rapidjson::Document toRapidJson( dev::eth::LocalisedTransactionReceipt const& _t ADD_FIELD_TO_RAPIDJSON( res, "blockNumber", toJS( _t.blockNumber() ), allocator ); ADD_FIELD_TO_RAPIDJSON( res, "cumulativeGasUsed", toJS( _t.cumulativeGasUsed() ), allocator ); ADD_FIELD_TO_RAPIDJSON( res, "gasUsed", toJS( _t.gasUsed() ), allocator ); - // + // The "contractAddress" field must be null for all types of trasactions but contract deployment // ones. The contract deployment transaction is special because it's the only type of // transaction with "to" filed set to null. - // dev::Address contractAddress = _t.contractAddress(); if ( contractAddress == dev::Address( 0 ) ) res.AddMember( "contractAddress", rapidjson::Value(), allocator ); else ADD_FIELD_TO_RAPIDJSON( res, "contractAddress", toJS( contractAddress ), allocator ); - // - // + res.AddMember( "logs", dev::toRapidJson( _t.localisedLogs(), allocator ), allocator ); ADD_FIELD_TO_RAPIDJSON( res, "logsBloom", toJS( _t.bloom() ), allocator ); if ( _t.hasStatusCode() ) { @@ -324,7 +320,6 @@ rapidjson::Document toRapidJson( dev::eth::LocalisedTransactionReceipt const& _t } else { ADD_FIELD_TO_RAPIDJSON( res, "stateRoot", toJS( _t.stateRoot() ), allocator ); } - // std::string strRevertReason = _t.getRevertReason(); if ( !strRevertReason.empty() ) { From 93c214693cc9f05ecd920ffd1e16d265ba2e40b6 Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Mon, 1 Apr 2024 13:36:39 +0100 Subject: [PATCH 064/154] #1719 add baseFeePerGas in eth_getBlock calls --- libethereum/BasicGasPricer.h | 3 ++- libethereum/Client.h | 4 +++- libethereum/ClientBase.h | 2 +- libethereum/GasPricer.h | 8 ++++++-- libethereum/Interface.h | 2 +- libethereum/SkaleHost.cpp | 6 ++++-- libethereum/SkaleHost.h | 2 +- libskale/ConsensusGasPricer.cpp | 5 +++-- libskale/ConsensusGasPricer.h | 2 +- libweb3jsonrpc/Eth.cpp | 11 +++++++---- libweb3jsonrpc/JsonHelper.cpp | 8 ++++++-- libweb3jsonrpc/JsonHelper.h | 4 ++-- test/tools/libtesteth/TestHelper.h | 2 +- test/unittests/libethereum/GasPricer.cpp | 4 ++-- 14 files changed, 40 insertions(+), 23 deletions(-) diff --git a/libethereum/BasicGasPricer.h b/libethereum/BasicGasPricer.h index 49555aac9..9585c85c7 100644 --- a/libethereum/BasicGasPricer.h +++ b/libethereum/BasicGasPricer.h @@ -52,7 +52,8 @@ class BasicGasPricer : public GasPricer { } u256 ask( Block const& ) const override { return m_weiPerRef * m_refsPerBlock / m_gasPerBlock; } - u256 bid( TransactionPriority _p = TransactionPriority::Medium ) const override { + u256 bid( unsigned = dev::eth::LatestBlock, + TransactionPriority _p = TransactionPriority::Medium ) const override { return m_octiles[( int ) _p] > 0 ? m_octiles[( int ) _p] : ( m_weiPerRef * m_refsPerBlock / m_gasPerBlock ); } diff --git a/libethereum/Client.h b/libethereum/Client.h index d62af01b1..d54c9d537 100644 --- a/libethereum/Client.h +++ b/libethereum/Client.h @@ -135,7 +135,9 @@ class Client : public ClientBase, protected Worker { /// Get the remaining gas limit in this block. u256 gasLimitRemaining() const override { return m_postSeal.gasLimitRemaining(); } /// Get the gas bid price - u256 gasBidPrice() const override { return m_gp->bid(); } + u256 gasBidPrice( unsigned _blockNumber = dev::eth::LatestBlock ) const override { + return m_gp->bid( _blockNumber ); + } // [PRIVATE API - only relevant for base clients, not available in general] /// Get the block. diff --git a/libethereum/ClientBase.h b/libethereum/ClientBase.h index ab4b7a812..4537aaef3 100644 --- a/libethereum/ClientBase.h +++ b/libethereum/ClientBase.h @@ -160,7 +160,7 @@ class ClientBase : public Interface { ImportResult injectBlock( bytes const& _block ) override; u256 gasLimitRemaining() const override; - u256 gasBidPrice() const override { return DefaultGasPrice; } + u256 gasBidPrice( unsigned = dev::eth::LatestBlock ) const override { return DefaultGasPrice; } /// Get the block author Address author() const override; diff --git a/libethereum/GasPricer.h b/libethereum/GasPricer.h index 4542861d0..237ddba80 100644 --- a/libethereum/GasPricer.h +++ b/libethereum/GasPricer.h @@ -41,7 +41,8 @@ class GasPricer { virtual ~GasPricer() = default; virtual u256 ask( Block const& ) const = 0; - virtual u256 bid( TransactionPriority _p = TransactionPriority::Medium ) const = 0; + virtual u256 bid( unsigned _blockNumber = dev::eth::LatestBlock, + TransactionPriority _p = TransactionPriority::Medium ) const = 0; virtual void update( BlockChain const& ) {} }; @@ -56,7 +57,10 @@ class TrivialGasPricer : public GasPricer { u256 ask() const { return m_ask; } u256 ask( Block const& ) const override { return m_ask; } - u256 bid( TransactionPriority = TransactionPriority::Medium ) const override { return m_bid; } + u256 bid( unsigned = dev::eth::LatestBlock, + TransactionPriority = TransactionPriority::Medium ) const override { + return m_bid; + } private: u256 m_ask = DefaultGasPrice; diff --git a/libethereum/Interface.h b/libethereum/Interface.h index a6c1c874f..57931ed3b 100644 --- a/libethereum/Interface.h +++ b/libethereum/Interface.h @@ -242,7 +242,7 @@ class Interface { /// Get the remaining gas limit in this block. virtual u256 gasLimitRemaining() const = 0; // Get the gas bidding price - virtual u256 gasBidPrice() const = 0; + virtual u256 gasBidPrice( unsigned _blockNumber = dev::eth::LatestBlock ) const = 0; /// Get some information on the block queue. virtual SyncStatus syncStatus() const = 0; diff --git a/libethereum/SkaleHost.cpp b/libethereum/SkaleHost.cpp index 01434a060..4645cfee5 100644 --- a/libethereum/SkaleHost.cpp +++ b/libethereum/SkaleHost.cpp @@ -933,8 +933,10 @@ void SkaleHost::broadcastFunc() { m_broadcaster->stopService(); } -u256 SkaleHost::getGasPrice() const { - return m_consensus->getPriceForBlockId( m_client.number() ); +u256 SkaleHost::getGasPrice( unsigned _blockNumber ) const { + if ( _blockNumber == dev::eth::LatestBlock ) + _blockNumber = m_client.number(); + return m_consensus->getPriceForBlockId( _blockNumber ); } u256 SkaleHost::getBlockRandom() const { diff --git a/libethereum/SkaleHost.h b/libethereum/SkaleHost.h index 8ffce7aca..598bf47ad 100644 --- a/libethereum/SkaleHost.h +++ b/libethereum/SkaleHost.h @@ -122,7 +122,7 @@ class SkaleHost { dev::h256 receiveTransaction( std::string ); - dev::u256 getGasPrice() const; + dev::u256 getGasPrice( unsigned _blockNumber = dev::eth::LatestBlock ) const; dev::u256 getBlockRandom() const; dev::eth::SyncStatus syncStatus() const; std::map< std::string, uint64_t > getConsensusDbUsage() const; diff --git a/libskale/ConsensusGasPricer.cpp b/libskale/ConsensusGasPricer.cpp index 5412cb4c3..930c1d2b4 100644 --- a/libskale/ConsensusGasPricer.cpp +++ b/libskale/ConsensusGasPricer.cpp @@ -9,6 +9,7 @@ dev::u256 ConsensusGasPricer::ask( dev::eth::Block const& ) const { return bid(); } -dev::u256 ConsensusGasPricer::bid( dev::eth::TransactionPriority /*_p*/ ) const { - return m_skaleHost.getGasPrice(); +dev::u256 ConsensusGasPricer::bid( + unsigned _blockNumber, dev::eth::TransactionPriority /*_p*/ ) const { + return m_skaleHost.getGasPrice( _blockNumber ); } diff --git a/libskale/ConsensusGasPricer.h b/libskale/ConsensusGasPricer.h index 93f351b31..181667b54 100644 --- a/libskale/ConsensusGasPricer.h +++ b/libskale/ConsensusGasPricer.h @@ -10,7 +10,7 @@ class ConsensusGasPricer : public dev::eth::GasPricer { ConsensusGasPricer( const SkaleHost& _host ); virtual dev::u256 ask( dev::eth::Block const& ) const override; - virtual dev::u256 bid( + virtual dev::u256 bid( unsigned _blockNumber = dev::eth::LatestBlock, dev::eth::TransactionPriority _p = dev::eth::TransactionPriority::Medium ) const override; private: diff --git a/libweb3jsonrpc/Eth.cpp b/libweb3jsonrpc/Eth.cpp index 11b1e9ea2..58229596a 100644 --- a/libweb3jsonrpc/Eth.cpp +++ b/libweb3jsonrpc/Eth.cpp @@ -567,7 +567,8 @@ Json::Value Eth::eth_getBlockByHash( string const& _blockHash, bool _includeTran } #endif return toJson( client()->blockInfo( h ), client()->blockDetails( h ), - client()->uncleHashes( h ), transactions, client()->sealEngine() ); + client()->uncleHashes( h ), transactions, client()->sealEngine(), + client()->gasBidPrice( client()->numberFromHash( h ) ) ); } else { h256s transactions = client()->transactionHashes( h ); @@ -584,7 +585,8 @@ Json::Value Eth::eth_getBlockByHash( string const& _blockHash, bool _includeTran } #endif return toJson( client()->blockInfo( h ), client()->blockDetails( h ), - client()->uncleHashes( h ), transactions, client()->sealEngine() ); + client()->uncleHashes( h ), transactions, client()->sealEngine(), + client()->gasBidPrice( client()->numberFromHash( h ) ) ); } } catch ( ... ) { BOOST_THROW_EXCEPTION( JsonRpcException( Errors::ERROR_RPC_INVALID_PARAMS ) ); @@ -606,11 +608,12 @@ Json::Value Eth::eth_getBlockByNumber( string const& _blockNumber, bool _include if ( _includeTransactions ) return toJson( client()->blockInfo( h ), client()->blockDetails( h ), - client()->uncleHashes( h ), client()->transactions( h ), client()->sealEngine() ); + client()->uncleHashes( h ), client()->transactions( h ), client()->sealEngine(), + client()->gasBidPrice( h ) ); else return toJson( client()->blockInfo( h ), client()->blockDetails( h ), client()->uncleHashes( h ), client()->transactionHashes( h ), - client()->sealEngine() ); + client()->sealEngine(), client()->gasBidPrice( h ) ); #endif } catch ( ... ) { BOOST_THROW_EXCEPTION( JsonRpcException( Errors::ERROR_RPC_INVALID_PARAMS ) ); diff --git a/libweb3jsonrpc/JsonHelper.cpp b/libweb3jsonrpc/JsonHelper.cpp index fbe35bfdc..012352a8e 100644 --- a/libweb3jsonrpc/JsonHelper.cpp +++ b/libweb3jsonrpc/JsonHelper.cpp @@ -129,12 +129,14 @@ Json::Value toJson( dev::eth::Transaction const& _t, std::pair< h256, unsigned > } Json::Value toJson( dev::eth::BlockHeader const& _bi, BlockDetails const& _bd, - UncleHashes const& _us, Transactions const& _ts, SealEngineFace* _face ) { + UncleHashes const& _us, Transactions const& _ts, SealEngineFace* _face, u256 _gasPrice ) { Json::Value res = toJson( _bi, _face ); if ( _bi ) { res["totalDifficulty"] = toJS( _bd.totalDifficulty ); res["size"] = toJS( _bd.blockSizeBytes ); res["uncles"] = Json::Value( Json::arrayValue ); + if ( _gasPrice > 0 ) + res["baseFeePerGas"] = toJS( _gasPrice ); for ( h256 h : _us ) res["uncles"].append( toJS( h ) ); res["transactions"] = Json::Value( Json::arrayValue ); @@ -146,12 +148,14 @@ Json::Value toJson( dev::eth::BlockHeader const& _bi, BlockDetails const& _bd, } Json::Value toJson( dev::eth::BlockHeader const& _bi, BlockDetails const& _bd, - UncleHashes const& _us, TransactionHashes const& _ts, SealEngineFace* _face ) { + UncleHashes const& _us, TransactionHashes const& _ts, SealEngineFace* _face, u256 _gasPrice ) { Json::Value res = toJson( _bi, _face ); if ( _bi ) { res["totalDifficulty"] = toJS( _bd.totalDifficulty ); res["size"] = toJS( _bd.blockSizeBytes ); res["uncles"] = Json::Value( Json::arrayValue ); + if ( _gasPrice > 0 ) + res["baseFeePerGas"] = toJS( _gasPrice ); for ( h256 h : _us ) res["uncles"].append( toJS( h ) ); res["transactions"] = Json::Value( Json::arrayValue ); diff --git a/libweb3jsonrpc/JsonHelper.h b/libweb3jsonrpc/JsonHelper.h index 9f66e5c00..f5cb095fa 100644 --- a/libweb3jsonrpc/JsonHelper.h +++ b/libweb3jsonrpc/JsonHelper.h @@ -60,9 +60,9 @@ Json::Value toJson( BlockHeader const& _bi, SealEngineFace* _face = nullptr ); Json::Value toJson( Transaction const& _t, std::pair< h256, unsigned > _location, BlockNumber _blockNumber ); Json::Value toJson( BlockHeader const& _bi, BlockDetails const& _bd, UncleHashes const& _us, - Transactions const& _ts, SealEngineFace* _face = nullptr ); + Transactions const& _ts, SealEngineFace* _face = nullptr, u256 _gasPrice = 0 ); Json::Value toJson( BlockHeader const& _bi, BlockDetails const& _bd, UncleHashes const& _us, - TransactionHashes const& _ts, SealEngineFace* _face = nullptr ); + TransactionHashes const& _ts, SealEngineFace* _face = nullptr, u256 _gasPrice = 0 ); Json::Value toJson( TransactionSkeleton const& _t ); Json::Value toJson( Transaction const& _t ); Json::Value toJson( Transaction const& _t, bytes const& _rlp ); diff --git a/test/tools/libtesteth/TestHelper.h b/test/tools/libtesteth/TestHelper.h index 4976ae4c5..aa9a730d1 100644 --- a/test/tools/libtesteth/TestHelper.h +++ b/test/tools/libtesteth/TestHelper.h @@ -84,7 +84,7 @@ typedef json_spirit::Value_type jsonVType; class ZeroGasPricer : public eth::GasPricer { protected: u256 ask( eth::Block const& ) const override { return 0; } - u256 bid( eth::TransactionPriority = eth::TransactionPriority::Medium ) const override { + u256 bid( unsigned = dev::eth::LatestBlock, eth::TransactionPriority = eth::TransactionPriority::Medium ) const override { return 0; } }; diff --git a/test/unittests/libethereum/GasPricer.cpp b/test/unittests/libethereum/GasPricer.cpp index 929b64bc5..70bae8380 100644 --- a/test/unittests/libethereum/GasPricer.cpp +++ b/test/unittests/libethereum/GasPricer.cpp @@ -53,8 +53,8 @@ void executeGasPricerTest( string const& name, double _etherPrice, double _block BOOST_CHECK_MESSAGE( abs( gp.ask( Block( Block::Null ) ) - _expectedAsk ) < 100000000, "ASK Got: " + toString( gp.ask( Block( Block::Null ) ) ) + " Expected: " + toString( _expectedAsk ) ); - BOOST_CHECK_MESSAGE( abs( gp.bid( _txPrio ) - _expectedBid ) < 100000000, - "BID Got: " + toString( gp.bid( _txPrio ) ) + " Expected: " + toString( _expectedBid ) ); + BOOST_CHECK_MESSAGE( abs( gp.bid( dev::eth::LatestBlock, _txPrio ) - _expectedBid ) < 100000000, + "BID Got: " + toString( gp.bid( dev::eth::LatestBlock, _txPrio ) ) + " Expected: " + toString( _expectedBid ) ); } } // namespace test } // namespace dev From 92bd60f0a37fe555cf68fbb9576b4db2f653e913 Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Mon, 1 Apr 2024 19:30:22 +0100 Subject: [PATCH 065/154] #1719 add extra checks --- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index 654339c05..912eca96d 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -2647,6 +2647,8 @@ BOOST_AUTO_TEST_CASE( eip2930Transactions ) { // compare with txn hash from geth BOOST_REQUIRE( txHash == "0xc843560015a655b8f81f65a458be9019bdb5cd8e416b6329ca18f36de0b8244d" ); + BOOST_REQUIRE( dev::toHexPrefixed( fixture.client->transactions( 3 )[0].rlp() ) == "0x01f8678197808504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180c001a01ebdc546c8b85511b7ba831f47c4981069d7af972d10b7dce2c57225cb5df6a7a055ae1e84fea41d37589eb740a0a93017a5cd0e9f10ee50f165bf4b1b4c78ddae" ); + BOOST_REQUIRE( fixture.rpcClient->eth_getBalance( "0x7D36aF85A184E220A656525fcBb9A63B9ab3C12b", "latest" ) == "0x1" ); auto block = fixture.rpcClient->eth_getBlockByNumber( "3", false ); @@ -2694,6 +2696,7 @@ BOOST_AUTO_TEST_CASE( eip2930Transactions ) { // compare with txn hash from geth BOOST_REQUIRE( txHash == "0xa6d3541e06dff71fb8344a4db2a4ad4e0b45024eb23a8f568982b70a5f50f94d" ); + BOOST_REQUIRE( dev::toHexPrefixed( fixture.client->transactions( 4 )[0].rlp() ) == "0x01f8c38197018504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000000780a0b03eaf481958e22fc39bd1d526eb9255be1e6625614f02ca939e51c3d7e64bcaa05f675640c04bb050d27bd1f39c07b6ff742311b04dab760bb3bc206054332879" ); result = fixture.rpcClient->eth_getTransactionByHash( txHash ); BOOST_REQUIRE( result["type"] == "0x1" ); @@ -2761,6 +2764,7 @@ BOOST_AUTO_TEST_CASE( eip1559Transactions ) { // compare with txn hash from geth BOOST_REQUIRE( txHash == "0x7bd586e93e3012577de4ba33e3b887baf520cbb92c5dd10996b262f9c5c8f747" ); + BOOST_REQUIRE( dev::toHexPrefixed( fixture.client->transactions( 3 )[0].rlp() ) == "0x02f8c98197808504a817c8008504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000000780a0f1a407dfc1a9f782001d89f617e9b3a2f295378533784fb39960dea60beea2d0a05ac3da2946554ba3d5721850f4f89ee7a0c38e4acab7130908e7904d13174388" ); BOOST_REQUIRE( fixture.rpcClient->eth_getBalance( "0x7D36aF85A184E220A656525fcBb9A63B9ab3C12b", "latest" ) == "0x1" ); From 8243d5cb07132434e7a803e3f37ef3df0a045471 Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Tue, 2 Apr 2024 12:35:59 +0100 Subject: [PATCH 066/154] #1719 add extra checks in test --- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index 912eca96d..51ee10603 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -2664,6 +2664,7 @@ BOOST_AUTO_TEST_CASE( eip2930Transactions ) { BOOST_REQUIRE( block["transactions"][0]["accessList"].size() == 0 ); std::string blockHash = block["hash"].asString(); + BOOST_REQUIRE( fixture.client->transactionHashes( dev::h256( blockHash ) )[0] == dev::h256( "0xc843560015a655b8f81f65a458be9019bdb5cd8e416b6329ca18f36de0b8244d") ); receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); BOOST_REQUIRE( receipt["status"] == string( "0x1" ) ); @@ -2773,7 +2774,7 @@ BOOST_AUTO_TEST_CASE( eip1559Transactions ) { BOOST_REQUIRE( block["transactions"][0].asString() == txHash ); block = fixture.rpcClient->eth_getBlockByNumber( "3", true ); -// BOOST_REQUIRE( !block["baseGasFee"].asString().empty() ); + BOOST_REQUIRE( !block["baseGasFee"].asString().empty() ); BOOST_REQUIRE( block["transactions"].size() == 1 ); BOOST_REQUIRE( block["transactions"][0]["hash"].asString() == txHash ); BOOST_REQUIRE( block["transactions"][0]["type"] == "0x2" ); From 1d2b710cb0ae77cda9c0048bd2453911ec7a10fc Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Tue, 2 Apr 2024 17:42:54 +0100 Subject: [PATCH 067/154] #1719 cleanup --- libethereum/ClientBase.cpp | 12 +++++------- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 2 +- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/libethereum/ClientBase.cpp b/libethereum/ClientBase.cpp index 0a27211e0..de711e0d3 100644 --- a/libethereum/ClientBase.cpp +++ b/libethereum/ClientBase.cpp @@ -447,14 +447,12 @@ Transactions ClientBase::transactions( h256 _blockHash ) const { RLP b( bl ); Transactions res; for ( unsigned i = 0; i < b[1].itemCount(); i++ ) { - auto tx = b[1][i].data(); - if ( RLP( tx ).isList() ) + auto txRlp = b[1][i]; + if ( txRlp.isList() ) // means Legacy transaction - res.emplace_back( tx, CheckTransaction::Cheap, true ); - else { - tx = RLP( tx ).payload(); - res.emplace_back( tx, CheckTransaction::Cheap, true ); - } + res.emplace_back( txRlp.data(), CheckTransaction::Cheap, true ); + else + res.emplace_back( txRlp.payload(), CheckTransaction::Cheap, true ); } return res; } diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index 51ee10603..5568849e5 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -2774,7 +2774,7 @@ BOOST_AUTO_TEST_CASE( eip1559Transactions ) { BOOST_REQUIRE( block["transactions"][0].asString() == txHash ); block = fixture.rpcClient->eth_getBlockByNumber( "3", true ); - BOOST_REQUIRE( !block["baseGasFee"].asString().empty() ); + BOOST_REQUIRE( !block["baseFeePerGas"].asString().empty() ); BOOST_REQUIRE( block["transactions"].size() == 1 ); BOOST_REQUIRE( block["transactions"][0]["hash"].asString() == txHash ); BOOST_REQUIRE( block["transactions"][0]["type"] == "0x2" ); From 08f66ef89a4b40f80f9861d21de2cc2911f9160f Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Thu, 4 Apr 2024 17:04:24 +0100 Subject: [PATCH 068/154] IS-833 Add patch for maxStorageForSelfdestruct --- libethereum/SchainPatch.h | 5 +++++ libethereum/SchainPatchEnum.h | 1 + 2 files changed, 6 insertions(+) diff --git a/libethereum/SchainPatch.h b/libethereum/SchainPatch.h index 46ee4f270..56de6179d 100644 --- a/libethereum/SchainPatch.h +++ b/libethereum/SchainPatch.h @@ -125,4 +125,9 @@ DEFINE_AMNESIC_PATCH( ContractStoragePatch ) */ DEFINE_AMNESIC_PATCH( StorageDestructionPatch ); +/* + * Enable restriction on contract storage size, when it's doing selfdestruct + */ +DEFINE_SIMPLE_PATCH( SelfdestructStorageLimitPatch ); + #endif // SCHAINPATCH_H diff --git a/libethereum/SchainPatchEnum.h b/libethereum/SchainPatchEnum.h index 251ffe2bf..b1f439211 100644 --- a/libethereum/SchainPatchEnum.h +++ b/libethereum/SchainPatchEnum.h @@ -15,6 +15,7 @@ enum class SchainPatchEnum { ContractStoragePatch, StorageDestructionPatch, SkipInvalidTransactionsPatch, + SelfdestructStorageLimitPatch, PatchesCount }; From 74f58a4917f85ec61e391aa915e46e8df912a227 Mon Sep 17 00:00:00 2001 From: Stan Kladko <13399135+kladkogex@users.noreply.github.com> Date: Thu, 4 Apr 2024 16:48:06 +0000 Subject: [PATCH 069/154] 1583 Fix solidity version in test --- test/historicstate/hardhat/hardhat.config.js | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/test/historicstate/hardhat/hardhat.config.js b/test/historicstate/hardhat/hardhat.config.js index 3ff48bfba..04bc9708c 100644 --- a/test/historicstate/hardhat/hardhat.config.js +++ b/test/historicstate/hardhat/hardhat.config.js @@ -3,14 +3,27 @@ require('@openzeppelin/hardhat-upgrades'); /** @type import('hardhat/config').HardhatUserConfig */ module.exports = { - solidity: "0.8.17", + solidity: "0.8.25", }; /* Address 0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6 */ const INSECURE_PRIVATE_KEY = "bd200f4e7f597f3c2c77fb405ee7fabeb249f63f03f43d5927b4fa0c43cfe85e"; module.exports = { - solidity: "0.8.20", + solidity: { + compilers: [ + { + version: `0.8.25`, + settings: { + optimizer: { + enabled: true, + runs: 15000 + }, + evmVersion: `shanghai` + } + }, + ], + }, networks: { skaled: { url: `http://localhost:1234`, From a1daeb278f2d38c308366ebfdd39963b939cef90 Mon Sep 17 00:00:00 2001 From: Stan Kladko <13399135+kladkogex@users.noreply.github.com> Date: Thu, 4 Apr 2024 17:00:35 +0000 Subject: [PATCH 070/154] 1583 Fix crash because of unknown name --- libethereum/SchainPatch.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libethereum/SchainPatch.cpp b/libethereum/SchainPatch.cpp index 06d1cc465..1ae076376 100644 --- a/libethereum/SchainPatch.cpp +++ b/libethereum/SchainPatch.cpp @@ -54,6 +54,8 @@ std::string getPatchNameForEnum( SchainPatchEnum _enumValue ) { return "StorageDestructionPatch"; case SchainPatchEnum::SkipInvalidTransactionsPatch: return "SkipInvalidTransactionsPatch"; + case SchainPatchEnum::SelfdestructStorageLimitPatch: + return "SelfdestructStorageLimitPatch"; default: throw std::out_of_range( "UnknownPatch #" + std::to_string( static_cast< size_t >( _enumValue ) ) ); From c148a9442802eb379fd053cf10eefba7c3ad2355 Mon Sep 17 00:00:00 2001 From: Stan Kladko <13399135+kladkogex@users.noreply.github.com> Date: Thu, 4 Apr 2024 17:05:27 +0000 Subject: [PATCH 071/154] 1583 Fix crash because of unknown name --- ...cpp.test_timestamp_in_historic_state.patch | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 test/historicstate/patches/LegacyVM.cpp.test_timestamp_in_historic_state.patch diff --git a/test/historicstate/patches/LegacyVM.cpp.test_timestamp_in_historic_state.patch b/test/historicstate/patches/LegacyVM.cpp.test_timestamp_in_historic_state.patch new file mode 100644 index 000000000..3fd85960d --- /dev/null +++ b/test/historicstate/patches/LegacyVM.cpp.test_timestamp_in_historic_state.patch @@ -0,0 +1,28 @@ +Subject: [PATCH] 1583 Fix crash because of unknown name +--- +Index: libevm/LegacyVM.cpp +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/libevm/LegacyVM.cpp b/libevm/LegacyVM.cpp +--- a/libevm/LegacyVM.cpp (revision a1daeb278f2d38c308366ebfdd39963b939cef90) ++++ b/libevm/LegacyVM.cpp (date 1712249617890) +@@ -1360,9 +1360,14 @@ + // we need to increment program counter only by one since + // the value is not read from program code as in PUSH1 + CASE( PUSH0 ) { +- if ( !m_schedule->havePush0 ) { +- throwBadInstruction(); +- } ++ ++ cerr << ":::::" << m_schedule->havePush0 << endl; ++ cerr << ":::::" << m_schedule->havePush0 << endl; ++ cerr << "Have push0:::::" << m_schedule->havePush0 << endl; ++ cerr << "Have push0:::::" << m_schedule->havePush0 << endl; ++ cerr << ":::::" << m_schedule->havePush0 << endl; ++ cerr << ":::::" << m_schedule->havePush0 << endl; ++ + ON_OP(); + updateIOGas(); + m_SPP[0] = 0; From 051f188d52d2733650043d15037600425446fa9f Mon Sep 17 00:00:00 2001 From: Stan Kladko <13399135+kladkogex@users.noreply.github.com> Date: Thu, 4 Apr 2024 17:39:11 +0000 Subject: [PATCH 072/154] 1583 add test --- .../push0_historic_state_patch_test.ts | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 test/historicstate/hardhat/scripts/push0_historic_state_patch_test.ts diff --git a/test/historicstate/hardhat/scripts/push0_historic_state_patch_test.ts b/test/historicstate/hardhat/scripts/push0_historic_state_patch_test.ts new file mode 100644 index 000000000..c4721201d --- /dev/null +++ b/test/historicstate/hardhat/scripts/push0_historic_state_patch_test.ts @@ -0,0 +1,91 @@ +const OWNER_ADDRESS: string = "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6"; +const ZERO_ADDRESS: string = "0xO000000000000000000000000000000000000000"; +const INITIAL_MINT: bigint = 10000000000000000000000000000000000000000; + +import {ethers} from "hardhat"; + +async function waitUntilNextBlock() { + + const current = await hre.ethers.provider.getBlockNumber(); + let newBlock = current; + console.log(`BLOCK_NUMBER ${current}`); + + while (newBlock == current) { + newBlock = await hre.ethers.provider.getBlockNumber(); + } + + console.log(`BLOCK_NUMBER ${newBlock}`); + + return current; + +} + +function CHECK(result: any): void { + if (!result) { + const message: string = `Check failed ${result}` + console.log(message); + throw message; + } +} + +async function getAndPrintTrace(hash: string): Promise { + + const trace = await ethers.provider.send('debug_traceTransaction', [hash, {}]); + + console.log(JSON.stringify(trace, null, 4)); + return trace; +} + +async function deployWriteAndDestroy(): Promise { + + console.log(`Deploying ...`); + + const Push0Test = await ethers.getContractFactory("Push0"); + const test = await Push0Test.deploy(); + const testContract = await test.deployed(); + + + const deployBn = await ethers.provider.getBlockNumber(); + + const hash = testContract.deployTransaction.hash; + console.log(`Gas limit ${testContract.deployTransaction.gasLimit}`); + console.log(`Contract deployed to ${testContract.address} at block ${deployBn} tx hash ${hash}`); + + console.log(`Now testing`); + + + for (let i = 0; i < 10; i++) { + + console.log("Current Linux Time in Seconds: ", Math.floor(new Date().getTime() / 1000)); + + const historicBlockNumber = '0x' + parseInt(deployBn).toString(16); + + // Encode the call to the `getZero` method + const data2 = testContract.interface.encodeFunctionData("getZero", []); + + await waitUntilNextBlock(); + + // Create the call transaction object + const callTransaction = { + to: testContract.address, // The address of the contract + data: data2, // The encoded function call + }; + + // Use provider.call to execute the call at the specific historic block number + await ethers.provider.call(callTransaction, historicBlockNumber); + + } +} + + + +async function main(): Promise { + await deployWriteAndDestroy(); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main().catch((error: any) => { + console.error(error); + process.exitCode = 1; +}); \ No newline at end of file From 7626eb10026ec5cdffc90423e10a8efe6d0d629a Mon Sep 17 00:00:00 2001 From: Stan Kladko <13399135+kladkogex@users.noreply.github.com> Date: Thu, 4 Apr 2024 18:27:37 +0000 Subject: [PATCH 073/154] 1583 add test --- .../hardhat/scripts/push0_historic_state_patch_test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/historicstate/hardhat/scripts/push0_historic_state_patch_test.ts b/test/historicstate/hardhat/scripts/push0_historic_state_patch_test.ts index c4721201d..3eeede9ba 100644 --- a/test/historicstate/hardhat/scripts/push0_historic_state_patch_test.ts +++ b/test/historicstate/hardhat/scripts/push0_historic_state_patch_test.ts @@ -54,7 +54,7 @@ async function deployWriteAndDestroy(): Promise { console.log(`Now testing`); - for (let i = 0; i < 10; i++) { + for (let i = 0; i < 1000; i++) { console.log("Current Linux Time in Seconds: ", Math.floor(new Date().getTime() / 1000)); @@ -72,6 +72,7 @@ async function deployWriteAndDestroy(): Promise { }; // Use provider.call to execute the call at the specific historic block number + await ethers.provider.call(callTransaction); await ethers.provider.call(callTransaction, historicBlockNumber); } From 7e36fca1f19aa6c5a7467e804bde381ff7e45d75 Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Fri, 5 Apr 2024 16:12:45 +0100 Subject: [PATCH 074/154] SKALED-1583 Merge v3.17.2 --- .github/workflows/clang-format-check.yml | 2 +- .gitmodules | 3 + README.md | 2 +- docs/tracing.md | 61 + libconsensus | 2 +- libdevcore/CommonData.h | 10 + libethereum/Block.cpp | 67 +- libethereum/Block.h | 11 +- libethereum/CMakeLists.txt | 2 +- libethereum/Client.cpp | 132 +- libethereum/Client.h | 21 + libethereum/SchainPatch.h | 2 +- libethereum/Transaction.cpp | 12 + libevm/LegacyVM.cpp | 134 +- libevm/LegacyVM.h | 29 +- libevm/LegacyVMCalls.cpp | 23 + libevm/LegacyVMConfig.h | 5 + libevm/VMFace.h | 8 + libhistoric/AlethExecutive.cpp | 7 + libhistoric/AlethExtVM.cpp | 22 +- libhistoric/AlethExtVM.h | 2 + libhistoric/AlethStandardTrace.cpp | 659 +- libhistoric/AlethStandardTrace.h | 240 +- libhistoric/CMakeLists.txt | 2 +- libhistoric/CallTracePrinter.cpp | 87 + libhistoric/CallTracePrinter.h | 45 + libhistoric/DefaultTracePrinter.cpp | 133 + libhistoric/DefaultTracePrinter.h | 46 + libhistoric/FourByteTracePrinter.cpp | 74 + libhistoric/FourByteTracePrinter.h | 42 + libhistoric/FunctionCallRecord.cpp | 331 + libhistoric/FunctionCallRecord.h | 115 + libhistoric/HistoricState.cpp | 3 + libhistoric/NoopTracePrinter.cpp | 41 + libhistoric/NoopTracePrinter.h | 40 + libhistoric/PrestateTracePrinter.cpp | 450 + libhistoric/PrestateTracePrinter.h | 85 + libhistoric/ReplayTracePrinter.cpp | 64 + libhistoric/ReplayTracePrinter.h | 41 + libhistoric/TraceOptions.cpp | 88 + libhistoric/TraceOptions.h | 70 + libhistoric/TracePrinter.cpp | 98 + libhistoric/TracePrinter.h | 58 + libhistoric/TraceStructuresAndDefs.h | 80 + libskale-interpreter/VMConfig.h | 5 + libskale/CMakeLists.txt | 2 +- libskale/SkipInvalidTransactionsPatch.h | 2 +- libskale/State.cpp | 3 +- libskale/httpserveroverride.cpp | 423 +- libskale/httpserveroverride.h | 59 - libweb3jsonrpc/AdminEth.cpp | 2 +- libweb3jsonrpc/Debug.cpp | 425 +- libweb3jsonrpc/Debug.h | 35 +- libweb3jsonrpc/DebugFace.h | 52 +- libweb3jsonrpc/Eth.cpp | 15 +- skaled/main.cpp | 10 + storage_benchmark/CMakeLists.txt | 1 + test/historicstate/configs/basic_config.json | 1 + test/historicstate/hardhat/README.md | 44 +- test/historicstate/hardhat/contracts/Lock.sol | 36 +- .../hardhat/contracts/Tracer.sol | 152 + test/historicstate/hardhat/hardhat.config.js | 7 + test/historicstate/hardhat/package.json | 13 +- test/historicstate/hardhat/run_geth.py | 75 + .../Tracer.deploy.4byteTracer.json | 3 + .../geth_traces/Tracer.deploy.callTracer.json | 10 + .../Tracer.deploy.defaultTracer.json | 908 + .../Tracer.deploy.prestateDiffTracer.json | 30 + .../Tracer.deploy.prestateTracer.json | 16 + .../Tracer.getBalance.4byteTracer.json | 3 + .../Tracer.getBalance.callTracer.json | 10 + .../Tracer.getBalance.defaultTracer.json | 1325 + .../Tracer.getBalance.prestateDiffTracer.json | 12 + .../Tracer.getBalance.prestateTracer.json | 16 + .../Tracer.getBalance.replayTracer.json | 25 + .../geth_traces/Tracer.mint.4byteTracer.json | 3 + .../geth_traces/Tracer.mint.callTracer.json | 10 + .../Tracer.mint.defaultTracer.json | 14639 +++++ .../Tracer.mint.prestateDiffTracer.json | 20 + .../Tracer.mint.prestateTracer.json | 19 + .../geth_traces/Tracer.mint2.4byteTracer.json | 4 + .../geth_traces/Tracer.mint2.callTracer.json | 32 + .../Tracer.mint2.defaultTracer.json | 43952 ++++++++++++++++ .../Tracer.mint2.prestateDiffTracer.json | 42 + .../Tracer.mint2.prestateTracer.json | 27 + .../Tracer.readableRevert.4byteTracer.json | 5 + .../Tracer.readableRevert.callTracer.json | 35 + .../Tracer.readableRevert.defaultTracer.json | 22633 ++++++++ ...cer.readableRevert.prestateDiffTracer.json | 20 + .../Tracer.readableRevert.prestateTracer.json | 14 + .../Tracer.transfer.4byteTracer.json | 1 + .../Tracer.transfer.callTracer.json | 9 + .../Tracer.transfer.defaultTracer.json | 6 + .../Tracer.transfer.prestateDiffTracer.json | 26 + .../Tracer.transfer.prestateTracer.json | 12 + test/historicstate/hardhat/scripts/trace.ts | 950 + ...ploy.js => write_and_selfdestruct_test.js} | 0 test/historicstate/hardhat/tracely | 1 + test/historicstate/hardhat/tsconfig.json | 110 + test/package.json | 6 +- test/tools/libtesteth/Options.cpp | 3 +- .../libweb3jsonrpc/WebThreeStubClient.cpp | 2 +- .../libweb3jsonrpc/WebThreeStubClient.h | 2 +- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 23 +- 104 files changed, 88820 insertions(+), 955 deletions(-) create mode 100644 docs/tracing.md create mode 100644 libhistoric/CallTracePrinter.cpp create mode 100644 libhistoric/CallTracePrinter.h create mode 100644 libhistoric/DefaultTracePrinter.cpp create mode 100644 libhistoric/DefaultTracePrinter.h create mode 100644 libhistoric/FourByteTracePrinter.cpp create mode 100644 libhistoric/FourByteTracePrinter.h create mode 100644 libhistoric/FunctionCallRecord.cpp create mode 100644 libhistoric/FunctionCallRecord.h create mode 100644 libhistoric/NoopTracePrinter.cpp create mode 100644 libhistoric/NoopTracePrinter.h create mode 100644 libhistoric/PrestateTracePrinter.cpp create mode 100644 libhistoric/PrestateTracePrinter.h create mode 100644 libhistoric/ReplayTracePrinter.cpp create mode 100644 libhistoric/ReplayTracePrinter.h create mode 100644 libhistoric/TraceOptions.cpp create mode 100644 libhistoric/TraceOptions.h create mode 100644 libhistoric/TracePrinter.cpp create mode 100644 libhistoric/TracePrinter.h create mode 100644 libhistoric/TraceStructuresAndDefs.h create mode 100644 test/historicstate/hardhat/contracts/Tracer.sol create mode 100755 test/historicstate/hardhat/run_geth.py create mode 100644 test/historicstate/hardhat/scripts/geth_traces/Tracer.deploy.4byteTracer.json create mode 100644 test/historicstate/hardhat/scripts/geth_traces/Tracer.deploy.callTracer.json create mode 100644 test/historicstate/hardhat/scripts/geth_traces/Tracer.deploy.defaultTracer.json create mode 100644 test/historicstate/hardhat/scripts/geth_traces/Tracer.deploy.prestateDiffTracer.json create mode 100644 test/historicstate/hardhat/scripts/geth_traces/Tracer.deploy.prestateTracer.json create mode 100644 test/historicstate/hardhat/scripts/geth_traces/Tracer.getBalance.4byteTracer.json create mode 100644 test/historicstate/hardhat/scripts/geth_traces/Tracer.getBalance.callTracer.json create mode 100644 test/historicstate/hardhat/scripts/geth_traces/Tracer.getBalance.defaultTracer.json create mode 100644 test/historicstate/hardhat/scripts/geth_traces/Tracer.getBalance.prestateDiffTracer.json create mode 100644 test/historicstate/hardhat/scripts/geth_traces/Tracer.getBalance.prestateTracer.json create mode 100644 test/historicstate/hardhat/scripts/geth_traces/Tracer.getBalance.replayTracer.json create mode 100644 test/historicstate/hardhat/scripts/geth_traces/Tracer.mint.4byteTracer.json create mode 100644 test/historicstate/hardhat/scripts/geth_traces/Tracer.mint.callTracer.json create mode 100644 test/historicstate/hardhat/scripts/geth_traces/Tracer.mint.defaultTracer.json create mode 100644 test/historicstate/hardhat/scripts/geth_traces/Tracer.mint.prestateDiffTracer.json create mode 100644 test/historicstate/hardhat/scripts/geth_traces/Tracer.mint.prestateTracer.json create mode 100644 test/historicstate/hardhat/scripts/geth_traces/Tracer.mint2.4byteTracer.json create mode 100644 test/historicstate/hardhat/scripts/geth_traces/Tracer.mint2.callTracer.json create mode 100644 test/historicstate/hardhat/scripts/geth_traces/Tracer.mint2.defaultTracer.json create mode 100644 test/historicstate/hardhat/scripts/geth_traces/Tracer.mint2.prestateDiffTracer.json create mode 100644 test/historicstate/hardhat/scripts/geth_traces/Tracer.mint2.prestateTracer.json create mode 100644 test/historicstate/hardhat/scripts/geth_traces/Tracer.readableRevert.4byteTracer.json create mode 100644 test/historicstate/hardhat/scripts/geth_traces/Tracer.readableRevert.callTracer.json create mode 100644 test/historicstate/hardhat/scripts/geth_traces/Tracer.readableRevert.defaultTracer.json create mode 100644 test/historicstate/hardhat/scripts/geth_traces/Tracer.readableRevert.prestateDiffTracer.json create mode 100644 test/historicstate/hardhat/scripts/geth_traces/Tracer.readableRevert.prestateTracer.json create mode 100644 test/historicstate/hardhat/scripts/geth_traces/Tracer.transfer.4byteTracer.json create mode 100644 test/historicstate/hardhat/scripts/geth_traces/Tracer.transfer.callTracer.json create mode 100644 test/historicstate/hardhat/scripts/geth_traces/Tracer.transfer.defaultTracer.json create mode 100644 test/historicstate/hardhat/scripts/geth_traces/Tracer.transfer.prestateDiffTracer.json create mode 100644 test/historicstate/hardhat/scripts/geth_traces/Tracer.transfer.prestateTracer.json create mode 100644 test/historicstate/hardhat/scripts/trace.ts rename test/historicstate/hardhat/scripts/{deploy.js => write_and_selfdestruct_test.js} (100%) create mode 160000 test/historicstate/hardhat/tracely create mode 100644 test/historicstate/hardhat/tsconfig.json diff --git a/.github/workflows/clang-format-check.yml b/.github/workflows/clang-format-check.yml index e0f1ec5b4..9a8d58b2d 100644 --- a/.github/workflows/clang-format-check.yml +++ b/.github/workflows/clang-format-check.yml @@ -6,7 +6,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - uses: DoozyX/clang-format-lint-action@v0.14 + - uses: DoozyX/clang-format-lint-action@v0.16.2 with: source: '.' exclude: './CMakeFiles ./cmake ./deps ./build ./skaled_ssl_test ./newer_lcov' diff --git a/.gitmodules b/.gitmodules index 20542db06..3bbcc02a0 100644 --- a/.gitmodules +++ b/.gitmodules @@ -15,3 +15,6 @@ [submodule "cmake/cable"] path = cmake/cable url = https://github.com/ethereum/cable.git +[submodule "test/historicstate/hardhat/tracely"] + path = test/historicstate/hardhat/tracely + url = https://github.com/DenrianWeiss/tracely diff --git a/README.md b/README.md index 7c22817cb..c5d0defbd 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ If you have already cloned the repo and forgot to pass `--recurse-submodules`, e sudo apt update sudo apt install autoconf build-essential cmake libprocps-dev libtool texinfo wget yasm flex bison btrfs-progs python3 python3-pip gawk git vim doxygen sudo apt install make build-essential cmake pkg-config libgnutls28-dev libssl-dev unzip zlib1g-dev libgcrypt20-dev docker.io gcc-9 g++-9 gperf clang-format-11 gnutls-dev -sudo apt install nettle-dev libhiredis-dev redis-server google-perftools libgoogle-perftools-dev lcov +sudo apt install nettle-dev libhiredis-dev redis-server google-perftools libgoogle-perftools-dev lcov sudo apt-get install libv8-dev ``` diff --git a/docs/tracing.md b/docs/tracing.md new file mode 100644 index 000000000..f7117b6c8 --- /dev/null +++ b/docs/tracing.md @@ -0,0 +1,61 @@ +# Tracing API + +## API calls + +SKALE tracing API implements the following Geth tracing API calls + +```angular2html + + debug_traceTransaction + debug_traceCall + debug_traceBlockByNumber + debug_traceBlockByHash +``` + +The calls a fully compatible with Geth API. If there is +an incompatibility, its a bug. + +Geth API is documented here + +https://geth.ethereum.org/docs/interacting-with-geth/rpc/ns-debug + +Also see here for live examples + +https://www.quicknode.com/docs/ethereum/debug_traceTransaction +https://www.quicknode.com/docs/ethereum/debug_traceBlockByNumber +https://www.quicknode.com/docs/ethereum/debug_traceBlockByHash +https://www.quicknode.com/docs/ethereum/debug_traceCall + + +## Tracer config and types implemented + +All tracer config options documented here are implemented + +https://geth.ethereum.org/docs/interacting-with-geth/rpc/ns-debug#traceconfig + +The following Geth Tracer types are implemented: + +* "4byteTracer" +* "callTracer" +* "prestateTracer" +* "noopTracer" + +In addition the following Parity tracer is implemented + +* replayTracer + +See here for documentation of replayTracer + +https://openethereum.github.io/JSONRPC-trace-module +https://www.quicknode.com/docs/ethereum/trace_replayTransaction +https://docs.alchemy.com/reference/trace-replaytransaction + +Note, that we do not implement Parity "trace_replayTransaction" +API call. Instead, "replayTracer" parameter needs to be +passed to Geth API calls. + + +## All Tracer + +* allTracer has beeen added to help QA, it prints results of all supported traces at once + diff --git a/libconsensus b/libconsensus index ddde155ee..2f7c74374 160000 --- a/libconsensus +++ b/libconsensus @@ -1 +1 @@ -Subproject commit ddde155ee8ca1e9dbc8adcccab62d9f85a48f1c0 +Subproject commit 2f7c7437465ed3cbbfc914ce9fb0fefe3d096ecb diff --git a/libdevcore/CommonData.h b/libdevcore/CommonData.h index fa896be69..a6e62c73e 100644 --- a/libdevcore/CommonData.h +++ b/libdevcore/CommonData.h @@ -203,6 +203,16 @@ inline std::string toCompactHexPrefixed( u256 _val, unsigned _min = 0 ) { return toHexPrefixed( toCompactBigEndian( _val, _min ) ); } + +inline std::string toHex( u256 _val ) { + return toHex( toBigEndian( _val ) ); +} + +inline std::string toHexPrefixed( u256 _val ) { + return toHexPrefixed( toBigEndian( _val ) ); +} + + // Algorithms for string and string-like collections. /// Escapes a string into the C-string representation. diff --git a/libethereum/Block.cpp b/libethereum/Block.cpp index 7e8037175..5fff5e3ae 100644 --- a/libethereum/Block.cpp +++ b/libethereum/Block.cpp @@ -456,6 +456,7 @@ tuple< TransactionReceipts, unsigned > Block::syncEveryone( // NB! Not commit! Commit will be after 1st transaction! m_state.clearPartialTransactionReceipts(); + unsigned count_bad = 0; for ( unsigned i = 0; i < _transactions.size(); ++i ) { Transaction const& tr = _transactions[i]; @@ -794,25 +795,63 @@ u256 Block::enact( VerifiedBlockRef const& _block, BlockChain const& _bc ) { #ifdef HISTORIC_STATE -ExecutionResult Block::executeHistoricCall( - LastBlockHashesFace const& _lh, Transaction const& _t ) { - auto p = Permanence::Reverted; +ExecutionResult Block::executeHistoricCall( LastBlockHashesFace const& _lh, Transaction const& _t, + std::shared_ptr< AlethStandardTrace > _tracer, uint64_t _transactionIndex ) { + try { + auto onOp = OnOpFunc(); - auto onOp = OnOpFunc(); + if ( _tracer ) { + onOp = _tracer->functionToExecuteOnEachOperation(); + } - if ( isSealed() ) - BOOST_THROW_EXCEPTION( InvalidOperationOnSealedBlock() ); - // Uncommitting is a non-trivial operation - only do it once we've verified as much of the - // transaction as possible. - uncommitToSeal(); + if ( isSealed() ) + BOOST_THROW_EXCEPTION( InvalidOperationOnSealedBlock() ); - EnvInfo const envInfo{ info(), _lh, this->previousInfo().timestamp(), gasUsed(), - m_sealEngine->chainParams().chainID }; - std::pair< ExecutionResult, TransactionReceipt > resultReceipt = - m_state.mutableHistoricState().execute( envInfo, m_sealEngine->chainParams(), _t, p, onOp ); + // Uncommitting is a non-trivial operation - only do it once we've verified as much of the + // transaction as possible. + uncommitToSeal(); - return resultReceipt.first; + STATE_CHECK( _transactionIndex <= m_receipts.size() ) + + u256 const gasUsed = + _transactionIndex ? receipt( _transactionIndex - 1 ).cumulativeGasUsed() : 0; + + EnvInfo const envInfo( info(), _lh, this->previousInfo().timestamp(), gasUsed, + m_sealEngine->chainParams().chainID ); + + if ( _tracer ) { + try { + HistoricState stateBefore( m_state.mutableHistoricState() ); + + auto resultReceipt = m_state.mutableHistoricState().execute( envInfo, + m_sealEngine->chainParams(), _t, skale::Permanence::Uncommitted, onOp ); + + _tracer->finalizeAndPrintTrace( + resultReceipt.first, stateBefore, m_state.mutableHistoricState() ); + // for tracing the entire block is traced therefore, we save transaction receipt + // as it is used for execution of the next transaction + m_receipts.push_back( resultReceipt.second ); + return resultReceipt.first; + } catch ( std::exception& e ) { + throw dev::eth::VMTracingError( "Exception doing trace for transaction index:" + + std::to_string( _transactionIndex ) + ":" + + e.what() ); + } + } else { + auto resultReceipt = m_state.mutableHistoricState().execute( + envInfo, m_sealEngine->chainParams(), _t, skale::Permanence::Reverted, onOp ); + return resultReceipt.first; + } + } catch ( std::exception& e ) { + BOOST_THROW_EXCEPTION( + std::runtime_error( "Could not execute historic call for transactionIndex:" + + to_string( _transactionIndex ) + ":" + e.what() ) ); + } catch ( ... ) { + BOOST_THROW_EXCEPTION( + std::runtime_error( "Could not execute historic call for transactionIndex:" + + to_string( _transactionIndex ) + ": unknown error" ) ); + } } #endif diff --git a/libethereum/Block.h b/libethereum/Block.h index 1d1bf8c8b..4164b73e9 100644 --- a/libethereum/Block.h +++ b/libethereum/Block.h @@ -35,7 +35,9 @@ #include #include #include - +#ifdef HISTORIC_STATE +#include +#endif #include "Account.h" #include "GasPricer.h" #include "Transaction.h" @@ -176,6 +178,9 @@ class Block { // Information concerning ongoing transactions + /// Get the gas limit in this block. + u256 gasLimit() const { return m_currentBlock.gasLimit(); } + /// Get the remaining gas limit in this block. u256 gasLimitRemaining() const { return m_currentBlock.gasLimit() - gasUsed(); } @@ -214,9 +219,9 @@ class Block { ExecutionResult execute( LastBlockHashesFace const& _lh, Transaction const& _t, skale::Permanence _p = skale::Permanence::Committed, OnOpFunc const& _onOp = OnOpFunc() ); - #ifdef HISTORIC_STATE - ExecutionResult executeHistoricCall( LastBlockHashesFace const& _lh, Transaction const& _t ); + ExecutionResult executeHistoricCall( LastBlockHashesFace const& _lh, Transaction const& _t, + std::shared_ptr< AlethStandardTrace > _tracer, uint64_t _transactionIndex ); #endif diff --git a/libethereum/CMakeLists.txt b/libethereum/CMakeLists.txt index 0f849fd87..6b92ea48a 100644 --- a/libethereum/CMakeLists.txt +++ b/libethereum/CMakeLists.txt @@ -11,7 +11,7 @@ target_include_directories( ethereum PRIVATE "${UTILS_INCLUDE_DIR}" ${SKUTILS_IN ${CMAKE_SOURCE_DIR}/libconsensus/jsoncpp/include ${CMAKE_SOURCE_DIR}/libconsensus/spdlog/include ${CMAKE_SOURCE_DIR}/libconsensus/libjson/include) -target_link_libraries( ethereum PUBLIC evm ethcore p2p devcrypto devcore skale PRIVATE skutils Snappy::snappy +target_link_libraries( ethereum PUBLIC evm ethcore p2p devcrypto devcore skale PRIVATE historic skutils Snappy::snappy jsoncpp # ${CMAKE_SOURCE_DIR}/libconsensus/jsoncpp/build/src/lib_json/libjsoncpp.a Boost::fiber Boost::context Boost::chrono batched-io diff --git a/libethereum/Client.cpp b/libethereum/Client.cpp index a1e2f74fe..65520c81b 100644 --- a/libethereum/Client.cpp +++ b/libethereum/Client.cpp @@ -46,7 +46,9 @@ #include #ifdef HISTORIC_STATE +#include #include +#include #endif #include @@ -131,7 +133,12 @@ Client::Client( ChainParams const& _params, int _networkID, m_snapshotAgent( make_shared< SnapshotAgent >( _params.sChain.snapshotIntervalSec, _snapshotManager, m_debugTracer ) ), m_instanceMonitor( _instanceMonitor ), - m_dbPath( _dbPath ) { + m_dbPath( _dbPath ) +#ifdef HISTORIC_STATE + , + m_blockTraceCache( MAX_BLOCK_TRACES_CACHE_ITEMS, MAX_BLOCK_TRACES_CACHE_SIZE ) +#endif +{ #if ( defined __HAVE_SKALED_LOCK_FILE_INDICATING_CRITICAL_STOP__ ) create_lock_file_or_fail( m_dbPath ); #endif /// (defined __HAVE_SKALED_LOCK_FILE_INDICATING_CRITICAL_STOP__) @@ -1200,7 +1207,7 @@ h256 Client::importTransaction( Transaction const& _t ) { ExecutionResult Client::call( Address const& _from, u256 _value, Address _dest, bytes const& _data, - u256 _gas, u256 _gasPrice, + u256 _gasLimit, u256 _gasPrice, #ifdef HISTORIC_STATE BlockNumber _blockNumber, #endif @@ -1213,18 +1220,21 @@ ExecutionResult Client::call( Address const& _from, u256 _value, Address _dest, // historic state try { u256 nonce = historicBlock.mutableState().mutableHistoricState().getNonce( _from ); - u256 gas = _gas == Invalid256 ? gasLimitRemaining() : _gas; + // if the user did not specify transaction gas limit, we give transaction block gas + // limit of gas + u256 gasLimit = _gasLimit == Invalid256 ? historicBlock.gasLimit() : _gasLimit; u256 gasPrice = _gasPrice == Invalid256 ? gasBidPrice() : _gasPrice; - Transaction t( _value, gasPrice, gas, _dest, _data, nonce ); + Transaction t( _value, gasPrice, gasLimit, _dest, _data, nonce ); t.forceSender( _from ); t.forceChainId( chainParams().chainID ); t.ignoreExternalGas(); - if ( _ff == FudgeFactor::Lenient ) { - historicBlock.mutableState().mutableHistoricState().addBalance( - _from, ( u256 )( t.gas() * t.gasPrice() + t.value() ) ); - } - - ret = historicBlock.executeHistoricCall( bc().lastBlockHashes(), t ); + // if we are in a call, we add to the balance of the account + // value needed for the call to guaranteed pass + // geth does a similar thing, we need to check whether it is fully compatible with + // geth + historicBlock.mutableState().mutableHistoricState().addBalance( + _from, ( u256 )( t.gas() * t.gasPrice() + t.value() ) ); + ret = historicBlock.executeHistoricCall( bc().lastBlockHashes(), t, nullptr, 0 ); } catch ( ... ) { cwarn << boost::current_exception_diagnostic_information(); throw; @@ -1238,9 +1248,11 @@ ExecutionResult Client::call( Address const& _from, u256 _value, Address _dest, // TODO there can be race conditions between prev and next line! State readStateForLock = temp.mutableState().createStateReadOnlyCopy(); u256 nonce = max< u256 >( temp.transactionsFrom( _from ), m_tq.maxNonce( _from ) ); - u256 gas = _gas == Invalid256 ? gasLimitRemaining() : _gas; + // if the user did not specify transaction gas limit, we give transaction block gas + // limit of gas + u256 gasLimit = _gasLimit == Invalid256 ? temp.gasLimit() : _gasLimit; u256 gasPrice = _gasPrice == Invalid256 ? gasBidPrice() : _gasPrice; - Transaction t( _value, gasPrice, gas, _dest, _data, nonce ); + Transaction t( _value, gasPrice, gasLimit, _dest, _data, nonce ); t.forceSender( _from ); t.forceChainId( chainParams().chainID ); t.ignoreExternalGas(); @@ -1259,6 +1271,102 @@ ExecutionResult Client::call( Address const& _from, u256 _value, Address _dest, return ret; } + +#ifdef HISTORIC_STATE + +Json::Value Client::traceCall( Address const& _from, u256 _value, Address _to, bytes const& _data, + u256 _gasLimit, u256 _gasPrice, BlockNumber _blockNumber, + Json::Value const& _jsonTraceConfig ) { + try { + Block historicBlock = blockByNumber( _blockNumber ); + auto nonce = historicBlock.mutableState().mutableHistoricState().getNonce( _from ); + // if the user did not specify transaction gas limit, we give transaction block gas + // limit of gas + auto gasLimit = _gasLimit == Invalid256 ? historicBlock.gasLimit() : _gasLimit; + + Transaction t = createTransactionForCallOrTraceCall( + _from, _value, _to, _data, gasLimit, _gasPrice, nonce ); + // record original t.from balance for trace and then give + // lots of gas to it + auto originalFromBalance = historicBlock.mutableState().balance( _from ); + historicBlock.mutableState().mutableHistoricState().addBalance( + _from, ( u256 )( t.gas() * t.gasPrice() + t.value() ) ); + auto traceOptions = TraceOptions::make( _jsonTraceConfig ); + auto tracer = + make_shared< AlethStandardTrace >( t, historicBlock.author(), traceOptions, true ); + tracer->setOriginalFromBalance( originalFromBalance ); + auto er = historicBlock.executeHistoricCall( bc().lastBlockHashes(), t, tracer, 0 ); + return tracer->getJSONResult(); + } catch ( ... ) { + cwarn << boost::current_exception_diagnostic_information(); + throw; + } +} + + +Transaction Client::createTransactionForCallOrTraceCall( const Address& _from, const u256& _value, + const Address& _to, const bytes& _data, const u256& _gasLimit, const u256& _gasPrice, + const u256& _nonce ) const { + auto gasPrice = _gasPrice == Invalid256 ? gasBidPrice() : _gasPrice; + Transaction t( _value, gasPrice, _gasLimit, _to, _data, _nonce ); + // if call or trace call request did not specify from address, zero address is used + auto from = _from ? _from : ZeroAddress; + t.forceSender( from ); + t.forceChainId( chainParams().chainID ); + // call and traceCall do not use PoW + t.ignoreExternalGas(); + return t; +} + + +Json::Value Client::traceBlock( BlockNumber _blockNumber, Json::Value const& _jsonTraceConfig ) { + try { + Block previousBlock = blockByNumber( _blockNumber - 1 ); + Block historicBlock = blockByNumber( _blockNumber ); + + Json::Value traces( Json::arrayValue ); + + auto hash = ClientBase::hashFromNumber( _blockNumber ); + Transactions transactions = this->transactions( hash ); + + auto traceOptions = TraceOptions::make( _jsonTraceConfig ); + + // cache results for better peformance + string key = to_string( _blockNumber ) + traceOptions.toString(); + + auto cachedResult = m_blockTraceCache.getIfExists( key ); + if ( cachedResult.has_value() ) { + return std::any_cast< Json::Value >( cachedResult ); + } + + for ( unsigned k = 0; k < transactions.size(); k++ ) { + Json::Value transactionLog( Json::objectValue ); + Transaction tx = transactions.at( k ); + auto hashString = toHexPrefixed( tx.sha3() ); + transactionLog["txHash"] = hashString; + tx.checkOutExternalGas( chainParams(), bc().info().timestamp(), number(), false ); + auto tracer = + std::make_shared< AlethStandardTrace >( tx, historicBlock.author(), traceOptions ); + auto executionResult = + previousBlock.executeHistoricCall( bc().lastBlockHashes(), tx, tracer, k ); + auto result = tracer->getJSONResult(); + transactionLog["result"] = result; + traces.append( transactionLog ); + } + + auto tracesSize = traces.toStyledString().size(); + m_blockTraceCache.put( key, traces, tracesSize ); + + return traces; + } catch ( std::exception& e ) { + BOOST_THROW_EXCEPTION( std::runtime_error( + "Could not trace block:" + to_string( _blockNumber ) + ":" + e.what() ) ); + } +} + +#endif + + void Client::initHistoricGroupIndex() { if ( number() == 0 ) { historicGroupIndex = 0; diff --git a/libethereum/Client.h b/libethereum/Client.h index 91290449d..da19e9b93 100644 --- a/libethereum/Client.h +++ b/libethereum/Client.h @@ -37,6 +37,7 @@ #include #include +#include #include #include @@ -55,6 +56,7 @@ #include "StateImporter.h" #include "ThreadSafeQueue.h" +#include #include #include @@ -75,6 +77,12 @@ struct ActivityReport { std::ostream& operator<<( std::ostream& _out, ActivityReport const& _r ); + +#ifdef HISTORIC_STATE +constexpr size_t MAX_BLOCK_TRACES_CACHE_SIZE = 64 * 1024 * 1024; +constexpr size_t MAX_BLOCK_TRACES_CACHE_ITEMS = 1024 * 1024; +#endif + /** * @brief Main API hub for interfacing with Ethereum. */ @@ -121,6 +129,16 @@ class Client : public ClientBase, protected Worker { #endif FudgeFactor _ff = FudgeFactor::Strict ) override; +#ifdef HISTORIC_STATE + Json::Value traceCall( Address const& _from, u256 _value, Address _to, bytes const& _data, + u256 _gas, u256 _gasPrice, BlockNumber _blockNumber, Json::Value const& _jsonTraceConfig ); + Json::Value traceBlock( BlockNumber _blockNumber, Json::Value const& _jsonTraceConfig ); + Transaction createTransactionForCallOrTraceCall( const Address& _from, const u256& _value, + const Address& _to, const bytes& _data, const u256& _gasLimit, const u256& _gasPrice, + const u256& nonce ) const; +#endif + + /// Blocks until all pending transactions have been processed. void flushTransactions() override; @@ -552,6 +570,9 @@ class Client : public ClientBase, protected Worker { const static dev::h256 empty_str_hash; std::shared_ptr< InstanceMonitor > m_instanceMonitor; fs::path m_dbPath; +#ifdef HISTORIC_STATE + cache::lru_ordered_memory_constrained_cache< std::string, Json::Value > m_blockTraceCache; +#endif private: void initHistoricGroupIndex(); diff --git a/libethereum/SchainPatch.h b/libethereum/SchainPatch.h index 56de6179d..2a79863a2 100644 --- a/libethereum/SchainPatch.h +++ b/libethereum/SchainPatch.h @@ -3,7 +3,7 @@ #include "SchainPatchEnum.h" -#include +#include #include diff --git a/libethereum/Transaction.cpp b/libethereum/Transaction.cpp index 2f5605351..2d8f80f6e 100644 --- a/libethereum/Transaction.cpp +++ b/libethereum/Transaction.cpp @@ -124,6 +124,18 @@ std::ostream& dev::eth::operator<<( std::ostream& _out, TransactionException con case TransactionException::InvalidContractDeployer: _out << "InvalidContractDeployer"; break; + case TransactionException::RevertInstruction: + _out << "RevertInstruction"; + break; + case TransactionException::InvalidZeroSignatureFormat: + _out << "InvalidZeroSignatureFormat"; + break; + case TransactionException::AddressAlreadyUsed: + _out << "AddressAlreadyUsed"; + break; + case TransactionException::WouldNotBeInBlock: + _out << "WouldNotBeInBlock"; + break; default: _out << "Unknown"; break; diff --git a/libevm/LegacyVM.cpp b/libevm/LegacyVM.cpp index bb13db400..f0128a9f2 100644 --- a/libevm/LegacyVM.cpp +++ b/libevm/LegacyVM.cpp @@ -231,7 +231,9 @@ void LegacyVM::interpretCases() { // CASE( CREATE2 ) { - ON_OP(); + // for CREATE and CREATE2 we call ON_OP in caseCreate, since it calculates + // correct gas cost + // ON_OP(); if ( !m_schedule->haveCreate2 ) throwBadInstruction(); if ( m_ext->staticCall ) @@ -242,7 +244,9 @@ void LegacyVM::interpretCases() { BREAK CASE( CREATE ) { - ON_OP(); + // for CREATE and CREATE2 we call ON_OP in caseCreate, since it calculates + // correct gas cost + // ON_OP(); if ( m_ext->staticCall ) throwDisallowedStateChange(); @@ -266,9 +270,9 @@ void LegacyVM::interpretCases() { BREAK CASE( RETURN ) { - ON_OP(); m_copyMemSize = 0; updateMem( memNeed( m_SP[0], m_SP[1] ) ); + ON_OP(); updateIOGas(); uint64_t b = ( uint64_t ) m_SP[0]; @@ -280,25 +284,29 @@ void LegacyVM::interpretCases() { CASE( REVERT ) { // Pre-byzantium - if ( !m_schedule->haveRevert ) + if ( !m_schedule->haveRevert ) { + ON_OP(); throwBadInstruction(); + } + - ON_OP(); m_copyMemSize = 0; updateMem( memNeed( m_SP[0], m_SP[1] ) ); + ON_OP(); updateIOGas(); uint64_t b = ( uint64_t ) m_SP[0]; uint64_t s = ( uint64_t ) m_SP[1]; - owning_bytes_ref output{ move( m_mem ), b, s }; - throwRevertInstruction( move( output ) ); + owning_bytes_ref output{ std::move( m_mem ), b, s }; + throwRevertInstruction( std::move( output ) ); } BREAK; CASE( SUICIDE ) { - ON_OP(); - if ( m_ext->staticCall ) + if ( m_ext->staticCall ) { + ON_OP(); throwDisallowedStateChange(); + } // Self-destructs only have gas cost starting with EIP 150 m_runGas = toInt63( m_schedule->suicideGas ); @@ -312,7 +320,7 @@ void LegacyVM::interpretCases() { if ( !m_ext->exists( dest ) ) m_runGas += m_schedule->callNewAccountGas; } - + ON_OP(); updateIOGas(); m_ext->suicide( dest ); m_bounce = 0; @@ -332,8 +340,8 @@ void LegacyVM::interpretCases() { // CASE( MLOAD ) { - ON_OP(); updateMem( toInt63( m_SP[0] ) + 32 ); + ON_OP(); updateIOGas(); m_SPP[0] = ( u256 ) * ( h256 const* ) ( m_mem.data() + ( unsigned ) m_SP[0] ); @@ -341,8 +349,8 @@ void LegacyVM::interpretCases() { NEXT CASE( MSTORE ) { - ON_OP(); updateMem( toInt63( m_SP[0] ) + 32 ); + ON_OP(); updateIOGas(); *( h256* ) &m_mem[( unsigned ) m_SP[0]] = ( h256 ) m_SP[1]; @@ -350,8 +358,8 @@ void LegacyVM::interpretCases() { NEXT CASE( MSTORE8 ) { - ON_OP(); updateMem( toInt63( m_SP[0] ) + 1 ); + ON_OP(); updateIOGas(); m_mem[( unsigned ) m_SP[0]] = ( _byte_ )( m_SP[1] & 0xff ); @@ -359,10 +367,10 @@ void LegacyVM::interpretCases() { NEXT CASE( SHA3 ) { - ON_OP(); m_runGas = toInt63( m_schedule->sha3Gas + ( u512( m_SP[1] ) + 31 ) / 32 * m_schedule->sha3WordGas ); updateMem( memNeed( m_SP[0], m_SP[1] ) ); + ON_OP(); updateIOGas(); uint64_t inOff = ( uint64_t ) m_SP[0]; @@ -372,11 +380,13 @@ void LegacyVM::interpretCases() { NEXT CASE( LOG0 ) { - ON_OP(); - if ( m_ext->staticCall ) + if ( m_ext->staticCall ) { + ON_OP(); throwDisallowedStateChange(); + } logGasMem(); + ON_OP(); updateIOGas(); m_ext->log( @@ -385,11 +395,13 @@ void LegacyVM::interpretCases() { NEXT CASE( LOG1 ) { - ON_OP(); - if ( m_ext->staticCall ) + if ( m_ext->staticCall ) { + ON_OP(); throwDisallowedStateChange(); + } logGasMem(); + ON_OP(); updateIOGas(); m_ext->log( { m_SP[2] }, @@ -398,11 +410,13 @@ void LegacyVM::interpretCases() { NEXT CASE( LOG2 ) { - ON_OP(); - if ( m_ext->staticCall ) + if ( m_ext->staticCall ) { + ON_OP(); throwDisallowedStateChange(); + } logGasMem(); + ON_OP(); updateIOGas(); m_ext->log( { m_SP[2], m_SP[3] }, @@ -411,11 +425,13 @@ void LegacyVM::interpretCases() { NEXT CASE( LOG3 ) { - ON_OP(); - if ( m_ext->staticCall ) + if ( m_ext->staticCall ) { + ON_OP(); throwDisallowedStateChange(); + } logGasMem(); + ON_OP(); updateIOGas(); m_ext->log( { m_SP[2], m_SP[3], m_SP[4] }, @@ -424,11 +440,13 @@ void LegacyVM::interpretCases() { NEXT CASE( LOG4 ) { - ON_OP(); - if ( m_ext->staticCall ) + if ( m_ext->staticCall ) { + ON_OP(); throwDisallowedStateChange(); + } logGasMem(); + ON_OP(); updateIOGas(); m_ext->log( { m_SP[2], m_SP[3], m_SP[4], m_SP[5] }, @@ -603,8 +621,10 @@ void LegacyVM::interpretCases() { CASE( SHL ) { // Pre-constantinople - if ( !m_schedule->haveBitwiseShifting ) + if ( !m_schedule->haveBitwiseShifting ) { + ON_OP(); throwBadInstruction(); + } ON_OP(); updateIOGas(); @@ -618,8 +638,10 @@ void LegacyVM::interpretCases() { CASE( SHR ) { // Pre-constantinople - if ( !m_schedule->haveBitwiseShifting ) + if ( !m_schedule->haveBitwiseShifting ) { + ON_OP(); throwBadInstruction(); + } ON_OP(); updateIOGas(); @@ -633,16 +655,15 @@ void LegacyVM::interpretCases() { CASE( SAR ) { // Pre-constantinople - if ( !m_schedule->haveBitwiseShifting ) + if ( !m_schedule->haveBitwiseShifting ) { + ON_OP(); throwBadInstruction(); - + } ON_OP(); updateIOGas(); - static u256 const hibit = u256( 1 ) << 255; static u256 const allbits = u256( "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" ); - u256 shiftee = m_SP[1]; if ( m_SP[0] >= 256 ) { if ( shiftee & hibit ) @@ -661,7 +682,6 @@ void LegacyVM::interpretCases() { CASE( ADDMOD ) { ON_OP(); updateIOGas(); - m_SPP[0] = m_SP[2] ? u256( ( u512( m_SP[0] ) + u512( m_SP[1] ) ) % m_SP[2] ) : 0; } NEXT @@ -669,7 +689,6 @@ void LegacyVM::interpretCases() { CASE( MULMOD ) { ON_OP(); updateIOGas(); - m_SPP[0] = m_SP[2] ? u256( ( u512( m_SP[0] ) * u512( m_SP[1] ) ) % m_SP[2] ) : 0; } NEXT @@ -677,7 +696,6 @@ void LegacyVM::interpretCases() { CASE( SIGNEXTEND ) { ON_OP(); updateIOGas(); - if ( m_SP[0] < 31 ) { unsigned testBit = static_cast< unsigned >( m_SP[0] ) * 8 + 7; u256& number = m_SP[1]; @@ -767,6 +785,7 @@ void LegacyVM::interpretCases() { #else CASE( JUMPTO ) CASE( JUMPIF ) CASE( JUMPV ) CASE( JUMPSUB ) CASE( JUMPSUBV ) CASE( RETURNSUB ) CASE( BEGINSUB ) CASE( BEGINDATA ) CASE( GETLOCAL ) CASE( PUTLOCAL ) { + ON_OP(); throwBadInstruction(); } CONTINUE @@ -1090,7 +1109,6 @@ void LegacyVM::interpretCases() { CASE( ADDRESS ) { ON_OP(); updateIOGas(); - m_SPP[0] = fromAddress( m_ext->myAddress ); } NEXT @@ -1098,7 +1116,6 @@ void LegacyVM::interpretCases() { CASE( ORIGIN ) { ON_OP(); updateIOGas(); - m_SPP[0] = fromAddress( m_ext->origin ); } NEXT @@ -1107,7 +1124,6 @@ void LegacyVM::interpretCases() { m_runGas = toInt63( m_schedule->balanceGas ); ON_OP(); updateIOGas(); - m_SPP[0] = m_ext->balance( asAddress( m_SP[0] ) ); } NEXT @@ -1116,7 +1132,6 @@ void LegacyVM::interpretCases() { CASE( CALLER ) { ON_OP(); updateIOGas(); - m_SPP[0] = fromAddress( m_ext->caller ); } NEXT @@ -1124,7 +1139,6 @@ void LegacyVM::interpretCases() { CASE( CALLVALUE ) { ON_OP(); updateIOGas(); - m_SPP[0] = m_ext->value; } NEXT @@ -1133,7 +1147,6 @@ void LegacyVM::interpretCases() { CASE( CALLDATALOAD ) { ON_OP(); updateIOGas(); - if ( u512( m_SP[0] ) + 31 < m_ext->data.size() ) m_SP[0] = ( u256 ) * ( h256 const* ) ( m_ext->data.data() + ( size_t ) m_SP[0] ); else if ( m_SP[0] >= m_ext->data.size() ) @@ -1153,18 +1166,17 @@ void LegacyVM::interpretCases() { CASE( CALLDATASIZE ) { ON_OP(); updateIOGas(); - m_SPP[0] = m_ext->data.size(); } NEXT CASE( RETURNDATASIZE ) { - if ( !m_schedule->haveReturnData ) + if ( !m_schedule->haveReturnData ) { + ON_OP(); throwBadInstruction(); - + } ON_OP(); updateIOGas(); - m_SPP[0] = m_returnData.size(); } NEXT @@ -1172,7 +1184,6 @@ void LegacyVM::interpretCases() { CASE( CODESIZE ) { ON_OP(); updateIOGas(); - m_SPP[0] = m_ext->code.size(); } NEXT @@ -1181,31 +1192,31 @@ void LegacyVM::interpretCases() { m_runGas = toInt63( m_schedule->extcodesizeGas ); ON_OP(); updateIOGas(); - m_SPP[0] = m_ext->codeSizeAt( asAddress( m_SP[0] ) ); } NEXT CASE( CALLDATACOPY ) { - ON_OP(); m_copyMemSize = toInt63( m_SP[2] ); updateMem( memNeed( m_SP[0], m_SP[2] ) ); + ON_OP(); updateIOGas(); - copyDataToMemory( m_ext->data, m_SP ); } NEXT CASE( RETURNDATACOPY ) { - ON_OP(); - if ( !m_schedule->haveReturnData ) + if ( !m_schedule->haveReturnData ) { + ON_OP(); throwBadInstruction(); + } bigint const endOfAccess = bigint( m_SP[1] ) + bigint( m_SP[2] ); if ( m_returnData.size() < endOfAccess ) throwBufferOverrun( endOfAccess ); m_copyMemSize = toInt63( m_SP[2] ); updateMem( memNeed( m_SP[0], m_SP[2] ) ); + ON_OP(); updateIOGas(); copyDataToMemory( &m_returnData, m_SP ); @@ -1213,32 +1224,31 @@ void LegacyVM::interpretCases() { NEXT CASE( EXTCODEHASH ) { - ON_OP(); - if ( !m_schedule->haveExtcodehash ) + if ( !m_schedule->haveExtcodehash ) { + ON_OP(); throwBadInstruction(); - + } m_runGas = toInt63( m_schedule->extcodehashGas ); + ON_OP(); updateIOGas(); - m_SPP[0] = u256{ m_ext->codeHashAt( asAddress( m_SP[0] ) ) }; } NEXT CASE( CODECOPY ) { - ON_OP(); m_copyMemSize = toInt63( m_SP[2] ); updateMem( memNeed( m_SP[0], m_SP[2] ) ); + ON_OP(); updateIOGas(); - copyDataToMemory( &m_ext->code, m_SP ); } NEXT CASE( EXTCODECOPY ) { - ON_OP(); m_runGas = toInt63( m_schedule->extcodecopyGas ); m_copyMemSize = toInt63( m_SP[3] ); updateMem( memNeed( m_SP[1], m_SP[3] ) ); + ON_OP(); updateIOGas(); Address a = asAddress( m_SP[0] ); @@ -1256,8 +1266,8 @@ void LegacyVM::interpretCases() { NEXT CASE( BLOCKHASH ) { - ON_OP(); m_runGas = toInt63( m_schedule->blockhashGas ); + ON_OP(); updateIOGas(); m_SPP[0] = ( u256 ) m_ext->blockHash( m_SP[0] ); @@ -1511,6 +1521,7 @@ void LegacyVM::interpretCases() { CASE( SLOAD ) { m_runGas = toInt63( m_schedule->sloadGas ); + ON_OP(); updateIOGas(); @@ -1519,11 +1530,15 @@ void LegacyVM::interpretCases() { NEXT CASE( SSTORE ) { - ON_OP(); - if ( m_ext->staticCall ) + if ( m_ext->staticCall ) { + ON_OP(); throwDisallowedStateChange(); + } updateSSGas(); + // ON_OP must be called when m_runGas is already set + ON_OP(); + updateIOGas(); try { @@ -1566,6 +1581,7 @@ void LegacyVM::interpretCases() { NEXT CASE( INVALID ) DEFAULT { + ON_OP(); throwBadInstruction(); } } diff --git a/libevm/LegacyVM.h b/libevm/LegacyVM.h index 8a5e20704..c805f7f11 100644 --- a/libevm/LegacyVM.h +++ b/libevm/LegacyVM.h @@ -36,12 +36,32 @@ class LegacyVM : public VMFace { #endif bytes const& memory() const { return m_mem; } + u256s stack() const { u256s stack( m_SP, m_stackEnd ); reverse( stack.begin(), stack.end() ); return stack; }; + size_t stackSize() const { return m_stackEnd - m_SP; } + +#ifdef HISTORIC_STATE + // these calls are used by tracing + + u256& getStackElement( uint64_t _index ) const { + if ( _index >= stackSize() ) { + BOOST_THROW_EXCEPTION( + std::runtime_error( std::string( "Out of bound stack access" ) ) ); + } + return m_SP[_index]; + } + + evmc_status_code getAndClearLastCallStatus() const; + const bytes& getReturnData() const; + +#endif + + private: u256* m_io_gas_p = 0; uint64_t m_io_gas = 0; @@ -69,11 +89,10 @@ class LegacyVM : public VMFace { /// RETURNDATA buffer for memory returned from direct subcalls. bytes m_returnData; - // space for data stack, grows towards smaller addresses from the end u256 m_stack[1024]; u256* m_stackEnd = &m_stack[1024]; - size_t stackSize() { return m_stackEnd - m_SP; } + #if EIP_615 // space for return stack @@ -91,7 +110,13 @@ class LegacyVM : public VMFace { uint64_t m_PC = 0; // program counter u256* m_SP = m_stackEnd; // stack pointer u256* m_SPP = m_SP; // stack pointer prime (next SP) +#ifdef HISTORIC_STATE + // this is used by tracing + mutable evmc_status_code m_lastCallStatus = EVMC_SUCCESS; +#endif #if EIP_615 + +private: uint64_t* m_RP = m_return - 1; // return pointer #endif diff --git a/libevm/LegacyVMCalls.cpp b/libevm/LegacyVMCalls.cpp index ff6beb71d..e8efa7201 100644 --- a/libevm/LegacyVMCalls.cpp +++ b/libevm/LegacyVMCalls.cpp @@ -128,6 +128,10 @@ void LegacyVM::caseCreate() { } updateMem( memNeed( initOff, initSize ) ); + + // we have calculated gas required. Now we can call ON_OP + ON_OP(); + updateIOGas(); // Clear the return data buffer. This will not free the memory. @@ -148,6 +152,7 @@ void LegacyVM::caseCreate() { CreateResult result = m_ext->create( endowment, gas, initCode, m_OP, salt, m_onOp ); m_SPP[0] = ( u160 ) result.address; // Convert address to integer. + m_returnData = result.output.toBytes(); *m_io_gas_p -= ( createGas - gas ); @@ -181,6 +186,10 @@ void LegacyVM::caseCall() { m_returnData = result.output.toBytes(); m_SPP[0] = result.status == EVMC_SUCCESS ? 1 : 0; +#ifdef HISTORIC_STATE + // this is used by tracing + m_lastCallStatus = result.status; +#endif } else m_SPP[0] = 0; m_io_gas += uint64_t( callParams->gas ); @@ -263,3 +272,17 @@ bool LegacyVM::caseCallSetup( CallParameters* callParams, bytesRef& o_output ) { } return false; } + +#ifdef HISTORIC_STATE +evmc_status_code LegacyVM::getAndClearLastCallStatus() const { + auto ret = m_lastCallStatus; + m_lastCallStatus = evmc_status_code::EVMC_SUCCESS; + return ret; +} + + +const bytes& LegacyVM::getReturnData() const { + return m_returnData; +} + +#endif diff --git a/libevm/LegacyVMConfig.h b/libevm/LegacyVMConfig.h index 9908d712c..596433270 100644 --- a/libevm/LegacyVMConfig.h +++ b/libevm/LegacyVMConfig.h @@ -64,7 +64,12 @@ namespace eth { #endif #if EVM_OPTIMIZE #define EVM_REPLACE_CONST_JUMP true +// We do not optimize constant pool on +// historic node because it introduces a non-standard instruction PUSHC +// which leads to non-geth-compatibe traces +#ifndef HISTORIC_STATE #define EVM_USE_CONSTANT_POOL true +#endif #define EVM_DO_FIRST_PASS_OPTIMIZATION ( EVM_REPLACE_CONST_JUMP || EVM_USE_CONSTANT_POOL ) #endif diff --git a/libevm/VMFace.h b/libevm/VMFace.h index bef7c17e5..d463a2883 100644 --- a/libevm/VMFace.h +++ b/libevm/VMFace.h @@ -43,6 +43,14 @@ ETH_SIMPLE_EXCEPTION_VM( InvalidContractDeployer ); /// differently than defined consensus exceptions. struct InternalVMError : Exception {}; +#ifdef HISTORIC_STATE +struct VMTracingError : Exception { + std::string message; + explicit VMTracingError( const std::string& message ) : message( message ) {} + const char* what() const noexcept override { return message.c_str(); } +}; +#endif + /// Error info for EVMC status code. using errinfo_evmcStatusCode = boost::error_info< struct tag_evmcStatusCode, evmc_status_code >; diff --git a/libhistoric/AlethExecutive.cpp b/libhistoric/AlethExecutive.cpp index b0df97294..fbe3de73e 100644 --- a/libhistoric/AlethExecutive.cpp +++ b/libhistoric/AlethExecutive.cpp @@ -360,6 +360,13 @@ bool AlethExecutive::go( OnOpFunc const& _onOp ) { << *boost::get_error_info< errinfo_evmcStatusCode >( _e ) << ")"; revert(); throw; +#ifdef HISTORIC_STATE + } catch ( VMTracingError const& _e ) { + cwarn << "Tracing error: " << *boost::get_error_info< errinfo_evmcStatusCode >( _e ) + << ")"; + revert(); + throw; +#endif } catch ( Exception const& _e ) { // TODO: AUDIT: check that this can never reasonably happen. Consider what to do if it // does. diff --git a/libhistoric/AlethExtVM.cpp b/libhistoric/AlethExtVM.cpp index 2f8905443..0ffa58a8b 100644 --- a/libhistoric/AlethExtVM.cpp +++ b/libhistoric/AlethExtVM.cpp @@ -56,7 +56,7 @@ void goOnOffloadedStack( AlethExecutive& _e, OnOpFunc const& _onOp ) { _e.go( _onOp ); } catch ( ... ) { exception = boost::current_exception(); // Catch all exceptions to be rethrown in - // parent thread. + // parent thread. } } }.join(); @@ -77,17 +77,26 @@ void go( unsigned _depth, AlethExecutive& _e, OnOpFunc const& _onOp ) { _e.go( _onOp ); } -evmc_status_code transactionExceptionToEvmcStatusCode( TransactionException ex ) noexcept { - switch ( ex ) { +} // anonymous namespace + + +evmc_status_code AlethExtVM::transactionExceptionToEvmcStatusCode( TransactionException _ex ) { + switch ( _ex ) { case TransactionException::None: return EVMC_SUCCESS; case TransactionException::RevertInstruction: return EVMC_REVERT; + case TransactionException::OutOfGasIntrinsic: + return EVMC_OUT_OF_GAS; + case TransactionException::OutOfGas: return EVMC_OUT_OF_GAS; + case TransactionException::OutOfGasBase: + return EVMC_OUT_OF_GAS; + case TransactionException::BadInstruction: return EVMC_UNDEFINED_INSTRUCTION; @@ -97,16 +106,17 @@ evmc_status_code transactionExceptionToEvmcStatusCode( TransactionException ex ) case TransactionException::StackUnderflow: return EVMC_STACK_UNDERFLOW; - case TransactionException ::BadJumpDestination: + case TransactionException::BadJumpDestination: return EVMC_BAD_JUMP_DESTINATION; + case TransactionException::InvalidContractDeployer: + return EVMC_CONTRACT_VALIDATION_FAILURE; + default: return EVMC_FAILURE; } } -} // anonymous namespace - CallResult AlethExtVM::call( CallParameters& _p ) { dev::eth::AlethExecutive e{ m_s, envInfo(), m_chainParams, depth + 1 }; diff --git a/libhistoric/AlethExtVM.h b/libhistoric/AlethExtVM.h index edc4313ad..c7a3785d1 100644 --- a/libhistoric/AlethExtVM.h +++ b/libhistoric/AlethExtVM.h @@ -96,6 +96,8 @@ class AlethExtVM : public ExtVMFace { /// Hash of a block if within the last 256 blocks, or h256() otherwise. h256 blockHash( u256 _number ) final; + static evmc_status_code transactionExceptionToEvmcStatusCode( TransactionException ex ); + private: EVMSchedule initEvmSchedule( time_t _committedBlockTimestamp, int64_t _workingBlockNumber, u256 const& _version ) const { diff --git a/libhistoric/AlethStandardTrace.cpp b/libhistoric/AlethStandardTrace.cpp index 2c93ece95..affcdf988 100644 --- a/libhistoric/AlethStandardTrace.cpp +++ b/libhistoric/AlethStandardTrace.cpp @@ -1,95 +1,592 @@ -// Aleth: Ethereum C++ client, tools and libraries. -// Copyright 2014-2019 Aleth Authors. -// Licensed under the GNU General Public License, Version 3. +/* +Copyright (C) 2023-present, SKALE Labs + +This file is part of skaled. + +skaled 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. + +skaled 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 skaled. If not, see . +*/ + +#ifdef HISTORIC_STATE #include "AlethStandardTrace.h" -#include "libethereum/ExtVM.h" -#include "libevm/LegacyVM.h" +#include "FunctionCallRecord.h" +#include "TraceOptions.h" +#include + +namespace dev::eth { -namespace dev { -namespace eth { -namespace { -bool changesStorage( Instruction _inst ) { - return _inst == Instruction::SSTORE; +TraceOptions eth::AlethStandardTrace::getOptions() const { + STATE_CHECK( m_isFinalized ) + return m_options; } -} // namespace +void AlethStandardTrace::analyzeInstructionAndRecordNeededInformation( uint64_t, Instruction& _inst, + uint64_t _gasRemaining, const ExtVMFace* _face, AlethExtVM& _ext, const LegacyVM* _vm ) { + STATE_CHECK( _face ) + STATE_CHECK( _vm ) + STATE_CHECK( !m_isFinalized ) -void AlethStandardTrace::operator()( uint64_t _steps, uint64_t PC, Instruction inst, - bigint newMemSize, bigint gasCost, bigint gas, VMFace const* _vm, ExtVMFace const* voidExt ) { - ( void ) _steps; + // check if instruction depth changed. This means a function has been called or has returned + processFunctionCallOrReturnIfHappened( _ext, _vm, ( uint64_t ) _gasRemaining ); - ExtVM const& ext = dynamic_cast< ExtVM const& >( *voidExt ); - auto vm = dynamic_cast< LegacyVM const* >( _vm ); - Json::Value r( Json::objectValue ); - - Json::Value stack( Json::arrayValue ); - if ( vm && !m_options.disableStack ) { - // Try extracting information about the stack from the VM is supported. - for ( auto const& i : vm->stack() ) - stack.append( toCompactHexPrefixed( i, 1 ) ); - r["stack"] = stack; - } - - bool newContext = false; - Instruction lastInst = Instruction::STOP; - - if ( m_lastInst.size() == ext.depth ) { - // starting a new context - assert( m_lastInst.size() == ext.depth ); - m_lastInst.push_back( inst ); - newContext = true; - } else if ( m_lastInst.size() == ext.depth + 2 ) { - m_lastInst.pop_back(); - lastInst = m_lastInst.back(); - } else if ( m_lastInst.size() == ext.depth + 1 ) { - // continuing in previous context - lastInst = m_lastInst.back(); - m_lastInst.back() = inst; + m_accessedAccounts.insert( _ext.myAddress ); + + + // main analysis switch + // analyze and record acceses to storage and accounts. as well as return data and logs + vector< uint8_t > returnData; + uint64_t logTopicsCount = 0; + switch ( _inst ) { + // record storage accesses + case Instruction::SLOAD: + // SLOAD - record storage access + // the stackSize() check prevents malicios code crashing the tracer + // by issuing SLOAD with nothing on the stack + if ( _vm->stackSize() > 0 ) { + m_accessedStorageValues[_ext.myAddress][_vm->getStackElement( 0 )] = + _ext.store( _vm->getStackElement( 0 ) ); + } + break; + case Instruction::SSTORE: + // STORAGE - record storage access + if ( _vm->stackSize() > 1 ) { + m_accessedStorageValues[_ext.myAddress][_vm->getStackElement( 0 )] = + _vm->getStackElement( 1 ); + } + break; + // NOW HANDLE CONTRACT FUNCTION CALL INSTRUCTIONS + case Instruction::CALL: + case Instruction::CALLCODE: + case Instruction::DELEGATECALL: + case Instruction::STATICCALL: + // record the contract that is called + if ( _vm->stackSize() > 1 ) { + auto address = asAddress( _vm->getStackElement( 1 ) ); + m_accessedAccounts.insert( address ); + } + break; + // NOW HANDLE SUICIDE + case Instruction::SUICIDE: + if ( _vm->stackSize() > 0 ) { + m_accessedAccounts.insert( asAddress( _vm->getStackElement( 0 ) ) ); + } + break; + // NOW HANDLE LOGS + case Instruction::LOG0: + case Instruction::LOG1: + case Instruction::LOG2: + case Instruction::LOG3: + case Instruction::LOG4: { + logTopicsCount = ( uint64_t ) _inst - ( uint64_t ) Instruction::LOG0; + STATE_CHECK( logTopicsCount <= 4 ) + if ( _vm->stackSize() < 2 + logTopicsCount ) // incorrectly issued log instruction + break; + auto logData = extractSmartContractMemoryByteArrayFromStackPointer( _vm ); + vector< u256 > topics; + for ( uint64_t i = 0; i < logTopicsCount; i++ ) { + topics.push_back( _vm->getStackElement( 2 + i ) ); + }; + getCurrentlyExecutingFunctionCall()->addLogEntry( logData, topics ); + } + default: + break; + } +} + +void AlethStandardTrace::processFunctionCallOrReturnIfHappened( + const AlethExtVM& _ext, const LegacyVM* _vm, uint64_t _gasRemaining ) { + STATE_CHECK( !m_isFinalized ) + STATE_CHECK( _vm ) + + auto currentDepth = _ext.depth; + + // check if instruction depth changed. This means a function has been called or has returned + + if ( currentDepth == getLastOpRecord()->m_depth + 1 ) { + recordFunctionIsCalled( + _ext.caller, _ext.myAddress, _gasRemaining, getInputData( _ext ), _ext.value ); + } else if ( currentDepth == getLastOpRecord()->m_depth - 1 ) { + auto status = _vm->getAndClearLastCallStatus(); + + recordFunctionReturned( status, _vm->getReturnData(), + getCurrentlyExecutingFunctionCall()->getGasRemainingBeforeCall() - _gasRemaining ); + } else { + // depth did not increase or decrease by one, therefore it should be the same + STATE_CHECK( currentDepth == getLastOpRecord()->m_depth ) + } +} + +vector< uint8_t > AlethStandardTrace::getInputData( const AlethExtVM& _ext ) const { + if ( getLastOpRecord()->m_op == Instruction::CREATE || + getLastOpRecord()->m_op == Instruction::CREATE2 ) { + // we are in a constructor code, so input to the function is current + // code + return _ext.code; + } else { + // we are in a regular function so input is inputData field of _ext + return _ext.data.toVector(); + } +} + +const Address& AlethStandardTrace::getFrom() const { + STATE_CHECK( m_isFinalized ) + return m_from; +} + +vector< uint8_t > AlethStandardTrace::extractSmartContractMemoryByteArrayFromStackPointer( + const LegacyVM* _vm ) { + STATE_CHECK( _vm ) + + vector< uint8_t > result{}; + + if ( _vm->stackSize() > 2 ) { + auto b = ( uint32_t ) _vm->getStackElement( 0 ); + auto s = ( uint32_t ) _vm->getStackElement( 1 ); + if ( _vm->memory().size() > b + s ) { + result = { _vm->memory().begin() + b, _vm->memory().begin() + b + s }; + } + } + return result; +} + +void AlethStandardTrace::recordFunctionIsCalled( const Address& _from, const Address& _to, + uint64_t _gasLimit, const vector< uint8_t >& _inputData, const u256& _value ) { + STATE_CHECK( !m_isFinalized ) + + auto functionCall = make_shared< FunctionCallRecord >( getLastOpRecord()->m_op, _from, _to, + _gasLimit, m_currentlyExecutingFunctionCall, _inputData, _value, + getLastOpRecord()->m_depth + 1, getLastOpRecord()->m_gasRemaining ); + + if ( getLastOpRecord()->m_depth >= 0 ) { + // we are not in the top smartcontract call + // add this call to the as a nested call to the currently + // executing function call + STATE_CHECK( getCurrentlyExecutingFunctionCall()->getDepth() == getLastOpRecord()->m_depth ) + getCurrentlyExecutingFunctionCall()->addNestedCall( functionCall ); + + auto lastOpRecordIndex = m_executionRecordSequence->size() - 1; + auto lastOp = getLastOpRecord()->m_op; + + if ( lastOp == Instruction::CALL || lastOp == Instruction::DELEGATECALL || + lastOp == Instruction::CALLCODE || lastOp == Instruction::STATICCALL ) { + STATE_CHECK( m_callInstructionCounterToFunctionRecord.count( lastOpRecordIndex ) == 0 ); + m_callInstructionCounterToFunctionRecord.emplace( lastOpRecordIndex, functionCall ); + } + } else { - cwarn << "GAA!!! Tracing VM and more than one new/deleted stack frame between steps!"; - cwarn << "Attmepting naive recovery..."; - m_lastInst.resize( ext.depth + 1 ); + // the top function is called + // this happens at the beginning of the execution. When this happens, we init + // m_executionRecordSequence.m_depth to -1 + STATE_CHECK( getLastOpRecord()->m_depth == -1 ) + STATE_CHECK( !m_currentlyExecutingFunctionCall ) + // at init, m_topFuntionCall is null, set it now. + setTopFunctionCall( functionCall ); + } + // set the currently executing call to the funtionCall we just created + setCurrentlyExecutingFunctionCall( functionCall ); +} + +void AlethStandardTrace::setTopFunctionCall( + const shared_ptr< FunctionCallRecord >& _topFunctionCall ) { + STATE_CHECK( _topFunctionCall ) + STATE_CHECK( !m_isFinalized ) + m_topFunctionCall = _topFunctionCall; +} + +void AlethStandardTrace::recordFunctionReturned( + evmc_status_code _status, const vector< uint8_t >& _returnData, uint64_t _gasUsed ) { + STATE_CHECK( getLastOpRecord()->m_gasRemaining >= getLastOpRecord()->m_opGas ) + STATE_CHECK( m_currentlyExecutingFunctionCall ) + STATE_CHECK( !m_isFinalized ) + + // record return values + getCurrentlyExecutingFunctionCall()->setReturnValues( _status, _returnData, _gasUsed ); + + if ( m_currentlyExecutingFunctionCall == m_topFunctionCall ) { + // the top function returned. This is the end of the execution. + return; + } else { + // move m_currentlyExecutingFunctionCall to the parent function + // we are using a weak pointer here to avoid circular references in shared pointers + auto parentCall = getCurrentlyExecutingFunctionCall()->getParentCall().lock(); + setCurrentlyExecutingFunctionCall( parentCall ); + } +} + +// the getter functions are called by printer classes after the trace has been generated +const shared_ptr< FunctionCallRecord >& AlethStandardTrace::getTopFunctionCall() const { + STATE_CHECK( m_isFinalized ) + return m_topFunctionCall; +} + +// get the printed result. This happens at the end of the execution +Json::Value AlethStandardTrace::getJSONResult() const { + STATE_CHECK( m_isFinalized ) + STATE_CHECK( !m_jsonTrace.isNull() ) + return m_jsonTrace; +} + +uint64_t AlethStandardTrace::getTotalGasUsed() const { + STATE_CHECK( m_isFinalized ) + return m_totalGasUsed; +} + +AlethStandardTrace::AlethStandardTrace( + Transaction& _t, const Address& _blockAuthor, const TraceOptions& _options, bool _isCall ) + : m_from{ _t.from() }, + m_to( _t.to() ), + m_options( _options ), + // if it is a call trace, the transaction does not have signature + // therefore, its hash should not include signature + m_txHash( _t.sha3( _isCall ? dev::eth::WithoutSignature : dev::eth::WithSignature ) ), + m_noopTracePrinter( *this ), + m_fourByteTracePrinter( *this ), + m_callTracePrinter( *this ), + m_replayTracePrinter( *this ), + m_prestateTracePrinter( *this ), + m_defaultTracePrinter( *this ), + m_tracePrinters{ { TraceType::DEFAULT_TRACER, m_defaultTracePrinter }, + { TraceType::PRESTATE_TRACER, m_prestateTracePrinter }, + { TraceType::CALL_TRACER, m_callTracePrinter }, + { TraceType::REPLAY_TRACER, m_replayTracePrinter }, + { TraceType::FOUR_BYTE_TRACER, m_fourByteTracePrinter }, + { TraceType::NOOP_TRACER, m_noopTracePrinter } }, + m_blockAuthor( _blockAuthor ), + m_isCall( _isCall ), + m_value( _t.value() ), + m_gasLimit( _t.gas() ), + m_inputData( _t.data() ), + m_gasPrice( _t.gasPrice() ) { + // set the initial lastOpRecord + m_executionRecordSequence = make_shared< vector< shared_ptr< OpExecutionRecord > > >(); + m_executionRecordSequence->push_back( make_shared< OpExecutionRecord >( + // the top function is executed at depth 0 + // therefore it is called from depth -1 + -1, + // when we start execution a user transaction the top level function can be a call + // or a contract create + _t.isCreation() ? Instruction::CREATE : Instruction::CALL, 0, 0, 0, 0, "" ) ); + + + // mark from and to accounts as accessed + m_accessedAccounts.insert( m_from ); + m_accessedAccounts.insert( m_to ); +} + +const u256& AlethStandardTrace::getGasLimit() const { + STATE_CHECK( m_isFinalized ) + return m_gasLimit; +} + +void AlethStandardTrace::setOriginalFromBalance( const u256& _originalFromBalance ) { + STATE_CHECK( !m_isFinalized ) + m_originalFromBalance = _originalFromBalance; +} + +/* + * This function is called by EVM on each instruction + */ +void AlethStandardTrace::operator()( uint64_t _counter, uint64_t _pc, Instruction _inst, bigint, + bigint _gasOpGas, bigint _gasRemaining, VMFace const* _vm, ExtVMFace const* _ext ) { + STATE_CHECK( !m_isFinalized ) + if ( _counter ) { + recordMinerPayment( u256( _gasOpGas ) ); + } + + recordInstructionIsExecuted( _pc, _inst, _gasOpGas, _gasRemaining, _vm, _ext ); +} + +// this will be called each time before an instruction is executed by evm +void AlethStandardTrace::recordInstructionIsExecuted( uint64_t _pc, Instruction _inst, + bigint _gasOpGas, bigint _gasRemaining, VMFace const* _vm, ExtVMFace const* _voidExt ) { + STATE_CHECK( _vm ) + STATE_CHECK( _voidExt ) + STATE_CHECK( !m_isFinalized ) + + // remove const qualifier since we need to set tracing values in AlethExtVM + AlethExtVM& ext = ( AlethExtVM& ) ( *_voidExt ); + auto vm = dynamic_cast< LegacyVM const* >( _vm ); + if ( !vm ) { + BOOST_THROW_EXCEPTION( std::runtime_error( std::string( "Null _vm in" ) + __FUNCTION__ ) ); + } + + analyzeInstructionAndRecordNeededInformation( + _pc, _inst, ( uint64_t ) _gasRemaining, _voidExt, ext, vm ); + + auto executionRecord = createOpExecutionRecord( _pc, _inst, _gasOpGas, _gasRemaining, ext, vm ); + STATE_CHECK( executionRecord ) + STATE_CHECK( m_executionRecordSequence ) + + m_executionRecordSequence->push_back( executionRecord ); +} + +shared_ptr< OpExecutionRecord > AlethStandardTrace::createOpExecutionRecord( uint64_t _pc, + Instruction& _inst, const bigint& _gasOpGas, const bigint& _gasRemaining, const AlethExtVM& ext, + const LegacyVM* _vm ) { + STATE_CHECK( _vm ) + + string opName( instructionInfo( _inst ).name ); + + // make strings compatible to geth trace + if ( opName == "JUMPCI" ) { + opName = "JUMPI"; + } else if ( opName == "JUMPC" ) { + opName = "JUMP"; + } else if ( opName == "SHA3" ) { + opName = "KECCAK256"; } - if ( vm ) { - bytes const& memory = vm->memory(); - Json::Value memJson( Json::arrayValue ); - if ( !m_options.disableMemory ) { - for ( unsigned i = 0; i < memory.size(); i += 32 ) { - bytesConstRef memRef( memory.data() + i, 32 ); - memJson.append( toHex( memRef ) ); + auto executionRecord = std::make_shared< OpExecutionRecord >( ext.depth, _inst, + ( uint64_t ) _gasRemaining, ( uint64_t ) _gasOpGas, _pc, ext.sub.refunds, opName ); + + // this info is only required by DEFAULT_TRACER + if ( m_options.tracerType == TraceType::DEFAULT_TRACER || + m_options.tracerType == TraceType::ALL_TRACER ) { + if ( !m_options.disableStorage ) { + if ( _inst == Instruction::SSTORE || _inst == Instruction::SLOAD ) { + executionRecord->m_accessedStorageValues = + std::make_shared< std::map< u256, u256 > >( + m_accessedStorageValues[ext.myAddress] ); } - r["memory"] = memJson; } - r["memSize"] = static_cast< uint64_t >( memory.size() ); - } - - if ( !m_options.disableStorage && - ( m_options.fullStorage || changesStorage( lastInst ) || newContext ) ) { - Json::Value storage( Json::objectValue ); - for ( auto const& i : ext.state().storage( ext.myAddress ) ) - storage[toCompactHexPrefixed( i.second.first, 1 )] = - toCompactHexPrefixed( i.second.second, 1 ); - r["storage"] = storage; - } - - r["op"] = static_cast< uint8_t >( inst ); - if ( m_showMnemonics ) - r["opName"] = instructionInfo( inst ).name; - r["pc"] = PC; - r["gas"] = toString( gas ); - r["gasCost"] = toString( gasCost ); - r["depth"] = ext.depth + 1; // depth in standard trace is 1-based - if ( !!newMemSize ) - r["memexpand"] = toString( newMemSize ); - - if ( m_outValue ) - m_outValue->append( r ); - else - *m_outStream << m_fastWriter.write( r ) << std::flush; -} -} // namespace eth -} // namespace dev + + if ( !m_options.disableStack ) { + executionRecord->m_stack = std::make_shared< u256s >( _vm->stack() ); + } + + if ( m_options.enableMemory ) { + executionRecord->m_memory = make_shared< bytes >( _vm->memory() ); + } + } + + return executionRecord; +} + + +string AlethStandardTrace::toGethCompatibleCompactHexPrefixed( const u256& _value ) { + auto hexStr = toCompactHex( _value ); + // now make it compatible with the way geth prints string + if ( hexStr.empty() ) { + hexStr = "0"; + } else if ( hexStr.front() == '0' ) { + hexStr = hexStr.substr( 1 ); + } + return "0x" + hexStr; +} + +// execution completed. Now finalize the trace and use the tracer that the user requested +// to print the resulting trace to json +void eth::AlethStandardTrace::finalizeAndPrintTrace( + ExecutionResult& _er, HistoricState& _statePre, HistoricState& _statePost ) { + m_totalGasUsed = ( uint64_t ) _er.gasUsed; + + m_output = _er.output; + m_deployedContractAddress = _er.newAddress; + m_evmcStatusCode = AlethExtVM::transactionExceptionToEvmcStatusCode( _er.excepted ); + + STATE_CHECK( m_topFunctionCall == m_currentlyExecutingFunctionCall ) + + // if transaction is not just ETH transfer + // record return of the top function. + if ( m_topFunctionCall ) { + recordFunctionReturned( m_evmcStatusCode, m_output, m_totalGasUsed ); + } + + recordMinerFeePayment( _statePost ); + + // we are done. Set the trace to finalized + STATE_CHECK( !m_isFinalized.exchange( true ) ) + // now print trace + printTrace( _er, _statePre, _statePost ); +} + +void eth::AlethStandardTrace::recordMinerFeePayment( HistoricState& _statePost ) { + if ( !m_isCall ) { // geth does not record miner fee payments in call traces + auto fee = m_gasPrice * m_totalGasUsed; + auto fromPostBalance = _statePost.balance( m_from ); + STATE_CHECK( fromPostBalance >= fee ) + _statePost.setBalance( m_from, fromPostBalance - fee ); + auto minerBalance = _statePost.balance( m_blockAuthor ); + _statePost.setBalance( m_blockAuthor, minerBalance + fee ); + } +} + +const bytes& AlethStandardTrace::getOutput() const { + STATE_CHECK( m_isFinalized ) + return m_output; +} + +bool AlethStandardTrace::isFailed() const { + STATE_CHECK( m_isFinalized ) + return m_evmcStatusCode != EVMC_SUCCESS; +} + +void eth::AlethStandardTrace::printTrace( ExecutionResult& _er, const HistoricState& _statePre, + const HistoricState& _statePost ) { // now print the trace + m_jsonTrace = Json::Value( Json::objectValue ); + // now run the trace that the user wants based on options provided + if ( m_tracePrinters.count( m_options.tracerType ) > 0 ) { + m_tracePrinters.at( m_options.tracerType ).print( m_jsonTrace, _er, _statePre, _statePost ); + } else if ( m_options.tracerType == TraceType::ALL_TRACER ) { + printAllTraces( m_jsonTrace, _er, _statePre, _statePost ); + } else { + // this should never happen + STATE_CHECK( false ); + } +} + +// print all supported traces. This is useful for testing. +void eth::AlethStandardTrace::printAllTraces( Json::Value& _jsonTrace, ExecutionResult& _er, + const HistoricState& _statePre, const HistoricState& _statePost ) { + STATE_CHECK( _jsonTrace.isObject() ) + STATE_CHECK( m_isFinalized ) + Json::Value result = Json::Value( Json::ValueType::objectValue ); + + for ( auto&& entry : m_tracePrinters ) { + TracePrinter& printer = entry.second; + printer.print( result, _er, _statePre, _statePost ); + m_jsonTrace[printer.getJsonName()] = result; + result.clear(); + } +} + +const h256& AlethStandardTrace::getTxHash() const { + STATE_CHECK( m_isFinalized ) + return m_txHash; +} + +const set< Address >& AlethStandardTrace::getAccessedAccounts() const { + STATE_CHECK( m_isFinalized ) + return m_accessedAccounts; +} + +const map< Address, map< u256, u256 > >& AlethStandardTrace::getAccessedStorageValues() const { + STATE_CHECK( m_isFinalized ) + return m_accessedStorageValues; +} + +const shared_ptr< vector< shared_ptr< OpExecutionRecord > > >& +AlethStandardTrace::getOpRecordsSequence() const { + STATE_CHECK( m_isFinalized ) + STATE_CHECK( m_executionRecordSequence ); + return m_executionRecordSequence; +} + +const shared_ptr< FunctionCallRecord >& AlethStandardTrace::getCurrentlyExecutingFunctionCall() + const { + STATE_CHECK( !m_isFinalized ) + STATE_CHECK( m_currentlyExecutingFunctionCall ) + return m_currentlyExecutingFunctionCall; +} + +void AlethStandardTrace::setCurrentlyExecutingFunctionCall( + const shared_ptr< FunctionCallRecord >& _currentlyExecutingFunctionCall ) { + STATE_CHECK( !m_isFinalized ) + STATE_CHECK( _currentlyExecutingFunctionCall ) + m_currentlyExecutingFunctionCall = _currentlyExecutingFunctionCall; +} + +const Address& AlethStandardTrace::getBlockAuthor() const { + STATE_CHECK( m_isFinalized ) + return m_blockAuthor; +} + +const u256& AlethStandardTrace::getMinerPayment() const { + STATE_CHECK( m_isFinalized ) + return m_minerPayment; +} + +void AlethStandardTrace::recordMinerPayment( u256 _minerGasPayment ) { + STATE_CHECK( !m_isFinalized ) + m_minerPayment = _minerGasPayment; + // add miner to the list of accessed accounts, since the miner is paid + // transaction fee + m_accessedAccounts.insert( m_blockAuthor ); +} + +bool AlethStandardTrace::isCall() const { + STATE_CHECK( m_isFinalized ) + return m_isCall; +} + +const u256& AlethStandardTrace::getOriginalFromBalance() const { + STATE_CHECK( m_isFinalized ) + return m_originalFromBalance; +} + +const bytes& AlethStandardTrace::getInputData() const { + STATE_CHECK( m_isFinalized ) + return m_inputData; +} + +const u256& AlethStandardTrace::getValue() const { + STATE_CHECK( m_isFinalized ) + return m_value; +} + +const Address& AlethStandardTrace::getTo() const { + STATE_CHECK( m_isFinalized ) + return m_to; +} + +const u256& AlethStandardTrace::getGasPrice() const { + STATE_CHECK( m_isFinalized ) + return m_gasPrice; +} + +evmc_status_code AlethStandardTrace::getEVMCStatusCode() const { + STATE_CHECK( m_isFinalized ) + return m_evmcStatusCode; +} + +const Address& AlethStandardTrace::getDeployedContractAddress() const { + return m_deployedContractAddress; +} + +// return true if transaction is a simple Eth transfer +[[nodiscard]] bool AlethStandardTrace::isSimpleTransfer() { + return !m_topFunctionCall; +} + +// return true if transaction is contract creation +bool AlethStandardTrace::isContractCreation() { + return m_topFunctionCall && m_topFunctionCall->getType() == Instruction::CREATE; +} + +std::shared_ptr< OpExecutionRecord > AlethStandardTrace::getLastOpRecord() const { + STATE_CHECK( !m_isFinalized ); + STATE_CHECK( m_executionRecordSequence ); + STATE_CHECK( !m_executionRecordSequence->empty() ) + auto lastOpRecord = m_executionRecordSequence->back(); + STATE_CHECK( lastOpRecord ) + return lastOpRecord; +} + +// this will return function call record if the instruction at a given execution +// counter created a new function +// will return nullptr otherwise +shared_ptr< FunctionCallRecord > AlethStandardTrace::getNewFunction( uint64_t _executionCounter ) { + if ( m_callInstructionCounterToFunctionRecord.count( _executionCounter ) == 0 ) { + return nullptr; + } + + return m_callInstructionCounterToFunctionRecord.at( _executionCounter ); +} + +} // namespace dev::eth + + +#endif diff --git a/libhistoric/AlethStandardTrace.h b/libhistoric/AlethStandardTrace.h index b251f6ca8..a07133697 100644 --- a/libhistoric/AlethStandardTrace.h +++ b/libhistoric/AlethStandardTrace.h @@ -1,57 +1,237 @@ -// Aleth: Ethereum C++ client, tools and libraries. -// Copyright 2014-2019 Aleth Authors. -// Licensed under the GNU General Public License, Version 3. +/* +Copyright (C) 2023-present, SKALE Labs + +This file is part of skaled. + +skaled 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. + +skaled 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 skaled. If not, see . +*/ #pragma once +#include "AlethExtVM.h" +#include "CallTracePrinter.h" +#include "DefaultTracePrinter.h" +#include "FourByteTracePrinter.h" +#include "NoopTracePrinter.h" +#include "PrestateTracePrinter.h" +#include "ReplayTracePrinter.h" +#include "TraceOptions.h" +#include "TraceStructuresAndDefs.h" #include "json/json.h" #include "libdevcore/Common.h" #include "libevm/Instruction.h" +#include "libevm/LegacyVM.h" #include "libevm/VMFace.h" #include +#include namespace Json { class Value; } -namespace dev { -namespace eth { +namespace dev::eth { +// It is important that trace functions do not throw exceptions and do not modify state +// so that they do not interfere with EVM execution + +class FunctionCallRecord; + +// This class collects information during EVM execution. The oollected information +// is then used by trace printers to print the trace requested by the user class AlethStandardTrace { public: - struct DebugOptions { - bool disableStorage = false; - bool disableMemory = false; - bool disableStack = false; - bool fullStorage = false; - }; - - // Output json trace to stream, one line per op - explicit AlethStandardTrace( std::ostream& _outStream ) noexcept : m_outStream{ &_outStream } {} // Append json trace to given (array) value - explicit AlethStandardTrace( Json::Value& _outValue ) noexcept : m_outValue{ &_outValue } {} - - void operator()( uint64_t _steps, uint64_t _PC, Instruction _inst, bigint _newMemSize, - bigint _gasCost, bigint _gas, VMFace const* _vm, ExtVMFace const* _extVM ); - - void setShowMnemonics() { m_showMnemonics = true; } - void setOptions( DebugOptions _options ) { m_options = _options; } + explicit AlethStandardTrace( Transaction& _t, const Address& _blockAuthor, + const TraceOptions& _options, bool _isCall = false ); - OnOpFunc onOp() { - return [=]( uint64_t _steps, uint64_t _PC, Instruction _inst, bigint _newMemSize, + // this function is executed on each operation + [[nodiscard]] OnOpFunc functionToExecuteOnEachOperation() { + return [=]( uint64_t _steps, uint64_t _pc, Instruction _inst, bigint _newMemSize, bigint _gasCost, bigint _gas, VMFace const* _vm, ExtVMFace const* _extVM ) { - ( *this )( _steps, _PC, _inst, _newMemSize, _gasCost, _gas, _vm, _extVM ); + ( *this )( _steps, _pc, _inst, _newMemSize, _gasCost, _gas, _vm, _extVM ); }; } + // this function will be called at the end of executions + void finalizeAndPrintTrace( + ExecutionResult& _er, HistoricState& _statePre, HistoricState& _statePost ); + + + // this is to set original from balance for calls + // in a geth call, the from account balance is always incremented to + // make sure account has enough funds for block gas limit of gas + // we need to save original from account balance since it is printed in trace + void setOriginalFromBalance( const u256& _originalFromBalance ); + + [[nodiscard]] Json::Value getJSONResult() const; + + [[nodiscard]] const std::shared_ptr< FunctionCallRecord >& getTopFunctionCall() const; + + [[nodiscard]] TraceOptions getOptions() const; + + [[nodiscard]] const std::map< Address, std::map< u256, u256 > >& getAccessedStorageValues() + const; + + [[nodiscard]] const std::set< Address >& getAccessedAccounts() const; + + [[nodiscard]] const h256& getTxHash() const; + + [[nodiscard]] const shared_ptr< vector< shared_ptr< OpExecutionRecord > > >& + getOpRecordsSequence() const; + + [[nodiscard]] const Address& getDeployedContractAddress() const; + + [[nodiscard]] const std::shared_ptr< FunctionCallRecord >& getCurrentlyExecutingFunctionCall() + const; + + [[nodiscard]] const Address& getBlockAuthor() const; + + [[nodiscard]] const u256& getMinerPayment() const; + + [[nodiscard]] const u256& getOriginalFromBalance() const; + + [[nodiscard]] bool isCall() const; + + [[nodiscard]] const Address& getFrom() const; + + [[nodiscard]] uint64_t getTotalGasUsed() const; + + [[nodiscard]] const u256& getGasLimit() const; + + [[nodiscard]] const u256& getValue() const; + + [[nodiscard]] const bytes& getInputData() const; + + [[nodiscard]] const Address& getTo() const; + + [[nodiscard]] const u256& getGasPrice() const; + + [[nodiscard]] const bytes& getOutput() const; + + [[nodiscard]] bool isFailed() const; + + [[nodiscard]] evmc_status_code getEVMCStatusCode() const; + + [[nodiscard]] bool isSimpleTransfer(); + + [[nodiscard]] bool isContractCreation(); + + [[nodiscard]] shared_ptr< FunctionCallRecord > getNewFunction( uint64_t _executionCounter ); + + [[nodiscard]] static string toGethCompatibleCompactHexPrefixed( const u256& _value ); + + private: - bool m_showMnemonics = false; + void setCurrentlyExecutingFunctionCall( + const std::shared_ptr< FunctionCallRecord >& _currentlyExecutingFunctionCall ); + + void setTopFunctionCall( const std::shared_ptr< FunctionCallRecord >& _topFunctionCall ); + + // this operator will be executed by skaled on each EVM instruction + void operator()( uint64_t _steps, uint64_t _pc, Instruction _inst, bigint _newMemSize, + bigint _gasOpGas, bigint _gasRemaining, VMFace const* _vm, ExtVMFace const* _voidExt ); + + // called to record execution of each instruction + void recordInstructionIsExecuted( uint64_t _pc, Instruction _inst, bigint _gasOpGas, + bigint _gasRemaining, VMFace const* _vm, ExtVMFace const* _voidExt ); + + // called to record function execution when a function of this or other contract is called + void recordFunctionIsCalled( const Address& _from, const Address& _to, uint64_t _gasLimit, + const std::vector< std::uint8_t >& _inputData, const u256& _value ); + + // called when a function returns + void recordFunctionReturned( evmc_status_code _status, + const std::vector< std::uint8_t >& _returnData, uint64_t _gasUsed ); + + // analyze instruction and record function calls, returns and storage value + // accesses + void analyzeInstructionAndRecordNeededInformation( uint64_t, Instruction& _inst, + uint64_t _gasRemaining, const ExtVMFace* _face, AlethExtVM& _ext, const LegacyVM* _vm ); + + // get the currently executing smartcontract memory from EVM + [[nodiscard]] static std::vector< std::uint8_t > + extractSmartContractMemoryByteArrayFromStackPointer( const LegacyVM* _vm ); + + // this is called when the function call depth of the current instruction is different from the + // previous instruction. This happens when a function is called or returned. + void processFunctionCallOrReturnIfHappened( + const AlethExtVM& _ext, const LegacyVM* _vm, std::uint64_t _gasRemaining ); + + + // print all supported traces. This can be used for QA + void printAllTraces( Json::Value& _jsonTrace, ExecutionResult& _er, + const HistoricState& _statePre, const HistoricState& _statePost ); + + void recordMinerPayment( u256 _minerGasPayment ); + + void printTrace( + ExecutionResult& _er, const HistoricState& _statePre, const HistoricState& _statePost ); + + [[nodiscard]] vector< uint8_t > getInputData( const AlethExtVM& _ext ) const; + + void recordMinerFeePayment( HistoricState& _statePost ); + + [[nodiscard]] std::shared_ptr< OpExecutionRecord > getLastOpRecord() const; + + std::shared_ptr< FunctionCallRecord > m_topFunctionCall; + std::shared_ptr< FunctionCallRecord > m_currentlyExecutingFunctionCall; std::vector< Instruction > m_lastInst; - std::ostream* m_outStream = nullptr; - Json::Value* m_outValue = nullptr; Json::FastWriter m_fastWriter; - DebugOptions m_options; + Address m_from; + Address m_to; + TraceOptions m_options; + h256 m_txHash; + Json::Value m_jsonTrace; + // set of all storage values accessed during execution + std::set< Address > m_accessedAccounts; + // std::map of all storage addresses accessed (read or write) during execution + // for each storage address the current value if recorded + std::map< Address, std::map< dev::u256, dev::u256 > > m_accessedStorageValues; + + std::shared_ptr< std::vector< std::shared_ptr< OpExecutionRecord > > > + m_executionRecordSequence = nullptr; + std::atomic< bool > m_isFinalized = false; + NoopTracePrinter m_noopTracePrinter; + FourByteTracePrinter m_fourByteTracePrinter; + CallTracePrinter m_callTracePrinter; + ReplayTracePrinter m_replayTracePrinter; + PrestateTracePrinter m_prestateTracePrinter; + DefaultTracePrinter m_defaultTracePrinter; + + const std::map< TraceType, TracePrinter& > m_tracePrinters; + + const Address m_blockAuthor; + u256 m_minerPayment; + u256 m_originalFromBalance; + bool m_isCall; + uint64_t m_totalGasUsed; + u256 m_value; + u256 m_gasLimit; + bytes m_inputData; + u256 m_gasPrice; + bytes m_output; + evmc_status_code m_evmcStatusCode; + // this will include deployed contract address if the transaction was CREATE + Address m_deployedContractAddress; + + // this map maps CALL or DELEGATECALL instruction counter to the corresponding + // function record + std::map< uint64_t, shared_ptr< FunctionCallRecord > > m_callInstructionCounterToFunctionRecord; + + shared_ptr< OpExecutionRecord > createOpExecutionRecord( uint64_t _pc, Instruction& _inst, + const bigint& _gasOpGas, const bigint& _gasRemaining, const AlethExtVM& ext, + const LegacyVM* _vm ); }; -} // namespace eth -} // namespace dev +} // namespace dev::eth diff --git a/libhistoric/CMakeLists.txt b/libhistoric/CMakeLists.txt index 5a74de499..96476ed15 100644 --- a/libhistoric/CMakeLists.txt +++ b/libhistoric/CMakeLists.txt @@ -10,7 +10,7 @@ target_include_directories( historic PRIVATE "${UTILS_INCLUDE_DIR}" ${SKUTILS_IN ${CMAKE_SOURCE_DIR}/libconsensus/jsoncpp/include ${CMAKE_SOURCE_DIR}/libconsensus/spdlog/include ${CMAKE_SOURCE_DIR}/libconsensus/libjson/include) -target_link_libraries( historic PUBLIC evm ethcore p2p devcrypto devcore skale PRIVATE skutils Snappy::snappy +target_link_libraries( historic PRIVATE evm ethcore p2p devcrypto devcore skale skutils Snappy::snappy jsoncpp # ${CMAKE_SOURCE_DIR}/libconsensus/jsoncpp/build/src/lib_json/libjsoncpp.a Boost::fiber Boost::context Boost::chrono batched-io diff --git a/libhistoric/CallTracePrinter.cpp b/libhistoric/CallTracePrinter.cpp new file mode 100644 index 000000000..ea7a46ab9 --- /dev/null +++ b/libhistoric/CallTracePrinter.cpp @@ -0,0 +1,87 @@ +/* +Copyright (C) 2023-present, SKALE Labs + +This file is part of skaled. + +skaled 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. + +skaled 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 skaled. If not, see . +*/ + +#ifdef HISTORIC_STATE + + +#include "CallTracePrinter.h" +#include "AlethStandardTrace.h" +#include "FunctionCallRecord.h" +#include "TraceStructuresAndDefs.h" + +namespace dev::eth { + +// call tracer as implemented by geth +void CallTracePrinter::print( Json::Value& _jsonTrace, const ExecutionResult&, const HistoricState&, + const HistoricState& _statePost ) { + STATE_CHECK( _jsonTrace.isObject() ) + + // first print error description if the transaction failed + if ( m_trace.isFailed() ) { + _jsonTrace["error"] = getEvmErrorDescription( m_trace.getEVMCStatusCode() ); + } + + // now deal with the cases of simple ETH transfer vs contract interaction + if ( m_trace.isSimpleTransfer() ) { + // no bytecode was executed + printTransferTrace( _jsonTrace ); + } else { + printContractTransactionTrace( _jsonTrace, _statePost ); + } +} +void CallTracePrinter::printContractTransactionTrace( + Json::Value& _jsonTrace, const HistoricState& _statePost ) { + auto topFunctionCall = m_trace.getTopFunctionCall(); + STATE_CHECK( topFunctionCall ); + // call trace on the top Solidity function call in the stack + // this will also recursively call printTrace on nested calls if exist + topFunctionCall->printTrace( _jsonTrace, _statePost, 0, m_trace.getOptions() ); + // handle the case of a transaction that deploys a contract + // in this case geth prints transaction input data as input + // end prints to as newly created contract address + if ( m_trace.isContractCreation() ) { + _jsonTrace["input"] = toHexPrefixed( m_trace.getInputData() ); + _jsonTrace["to"] = toHexPrefixed( m_trace.getDeployedContractAddress() ); + } +} + +CallTracePrinter::CallTracePrinter( AlethStandardTrace& _standardTrace ) + : TracePrinter( _standardTrace, "callTrace" ) {} + + +void CallTracePrinter::printTransferTrace( Json::Value& _jsonTrace ) { + STATE_CHECK( _jsonTrace.isObject() ) + + _jsonTrace["type"] = "CALL"; + _jsonTrace["from"] = toHexPrefixed( m_trace.getFrom() ); + _jsonTrace["to"] = toHexPrefixed( m_trace.getTo() ); + _jsonTrace["gas"] = + AlethStandardTrace::toGethCompatibleCompactHexPrefixed( m_trace.getGasLimit() ); + _jsonTrace["gasUsed"] = + AlethStandardTrace::toGethCompatibleCompactHexPrefixed( m_trace.getTotalGasUsed() ); + _jsonTrace["value"] = + AlethStandardTrace::toGethCompatibleCompactHexPrefixed( m_trace.getValue() ); + _jsonTrace["input"] = toHexPrefixed( m_trace.getInputData() ); +} + + +} // namespace dev::eth + + +#endif \ No newline at end of file diff --git a/libhistoric/CallTracePrinter.h b/libhistoric/CallTracePrinter.h new file mode 100644 index 000000000..78d60316c --- /dev/null +++ b/libhistoric/CallTracePrinter.h @@ -0,0 +1,45 @@ +/* +Copyright (C) 2023-present, SKALE Labs + +This file is part of skaled. + +skaled 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. + +skaled 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 skaled. If not, see . +*/ + +#pragma once + +#include "TracePrinter.h" + +namespace Json { +class Value; +} + +namespace dev::eth { + +struct ExecutionResult; +class HistoricState; + +class CallTracePrinter : public TracePrinter { +public: + explicit CallTracePrinter( AlethStandardTrace& standardTrace ); + + void print( Json::Value& _jsonTrace, const ExecutionResult&, const HistoricState&, + const HistoricState& ) override; + +private: + void printTransferTrace( Json::Value& _jsonTrace ); + + void printContractTransactionTrace( Json::Value& _jsonTrace, const HistoricState& _statePost ); +}; +} // namespace dev::eth diff --git a/libhistoric/DefaultTracePrinter.cpp b/libhistoric/DefaultTracePrinter.cpp new file mode 100644 index 000000000..bef36663e --- /dev/null +++ b/libhistoric/DefaultTracePrinter.cpp @@ -0,0 +1,133 @@ +/* +Copyright (C) 2023-present, SKALE Labs + +This file is part of skaled. + +skaled 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. + +skaled 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 skaled. If not, see . +*/ + +#ifdef HISTORIC_STATE + +#include "AlethStandardTrace.h" + +#include "DefaultTracePrinter.h" +#include "FunctionCallRecord.h" +#include "TraceStructuresAndDefs.h" + + +namespace dev::eth { + +// default tracer as implemented by geth. Runs when no specific tracer is specified +void DefaultTracePrinter::print( + Json::Value& _jsonTrace, const ExecutionResult&, const HistoricState&, const HistoricState& ) { + STATE_CHECK( _jsonTrace.isObject() ) + auto opRecordsSequence = m_trace.getOpRecordsSequence(); + STATE_CHECK( opRecordsSequence ); + auto opTrace = std::make_shared< Json::Value >(); + auto options = m_trace.getOptions(); + + for ( uint64_t i = 1; i < opRecordsSequence->size(); i++ ) { // skip first dummy entry + auto executionRecord = opRecordsSequence->at( i ); + + // geth reports function gas cost as op cost for CALL and DELEGATE CALL + auto newFunction = m_trace.getNewFunction( i ); + if ( newFunction ) { + executionRecord->m_opGas = newFunction->getGasUsed(); + } + + appendOpToDefaultTrace( executionRecord, opTrace, options ); + } + + if ( opTrace->empty() ) { + // make it compatible with geth in cases where + // no contract was called so there is no opTrace + _jsonTrace["structLogs"] = Json::Value( Json::arrayValue ); + } else { + _jsonTrace["structLogs"] = *opTrace; + } + + _jsonTrace["failed"] = m_trace.isFailed(); + _jsonTrace["gas"] = m_trace.getTotalGasUsed(); + + if ( m_trace.getOptions().enableReturnData ) { + _jsonTrace["returnValue"] = toHex( m_trace.getOutput() ); + } +} + +DefaultTracePrinter::DefaultTracePrinter( AlethStandardTrace& standardTrace ) + : TracePrinter( standardTrace, "defaultTrace" ) {} + + +void DefaultTracePrinter::appendOpToDefaultTrace( + std::shared_ptr< OpExecutionRecord > _opExecutionRecord, + std::shared_ptr< Json::Value >& _defaultTrace, TraceOptions& _traceOptions ) { + Json::Value result( Json::objectValue ); + + STATE_CHECK( _defaultTrace ); + STATE_CHECK( _opExecutionRecord ) + + result["op"] = _opExecutionRecord->m_opName; + result["pc"] = _opExecutionRecord->m_pc; + result["gas"] = _opExecutionRecord->m_gasRemaining; + + + result["gasCost"] = static_cast< uint64_t >( _opExecutionRecord->m_opGas ); + + + result["depth"] = _opExecutionRecord->m_depth + 1; // depth in standard trace is 1-based + + if ( _opExecutionRecord->m_refund > 0 ) { + result["refund"] = _opExecutionRecord->m_refund; + } + + if ( !_traceOptions.disableStack ) { + Json::Value stack( Json::arrayValue ); + // Try extracting information about the stack from the VM is supported. + STATE_CHECK( _opExecutionRecord->m_stack ) + for ( auto const& i : *_opExecutionRecord->m_stack ) { + string stackStr = AlethStandardTrace::toGethCompatibleCompactHexPrefixed( i ); + stack.append( stackStr ); + } + result["stack"] = stack; + } + + Json::Value memJson( Json::arrayValue ); + if ( _traceOptions.enableMemory ) { + STATE_CHECK( _opExecutionRecord->m_memory ) + for ( unsigned i = 0; + ( i < _opExecutionRecord->m_memory->size() && i < MAX_MEMORY_VALUES_RETURNED ); + i += 32 ) { + bytesConstRef memRef( _opExecutionRecord->m_memory->data() + i, 32 ); + memJson.append( toHex( memRef ) ); + } + result["memory"] = memJson; + } + + if ( !_traceOptions.disableStorage ) { + if ( _opExecutionRecord->m_op == Instruction::SSTORE || + _opExecutionRecord->m_op == Instruction::SLOAD ) { + Json::Value storage( Json::objectValue ); + STATE_CHECK( _opExecutionRecord->m_accessedStorageValues ) + for ( auto const& i : *_opExecutionRecord->m_accessedStorageValues ) + storage[toHex( i.first )] = toHex( i.second ); + result["storage"] = storage; + } + } + + _defaultTrace->append( result ); +} + +} // namespace dev::eth + +#endif \ No newline at end of file diff --git a/libhistoric/DefaultTracePrinter.h b/libhistoric/DefaultTracePrinter.h new file mode 100644 index 000000000..9c62ceffb --- /dev/null +++ b/libhistoric/DefaultTracePrinter.h @@ -0,0 +1,46 @@ +/* +Copyright (C) 2023-present, SKALE Labs + +This file is part of skaled. + +skaled 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. + +skaled 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 skaled. If not, see . +*/ + +#pragma once + + +#include "TraceOptions.h" +#include "TracePrinter.h" + +namespace Json { +class Value; +} + +namespace dev::eth { + +struct ExecutionResult; +class HistoricState; + +class DefaultTracePrinter : public TracePrinter { +public: + explicit DefaultTracePrinter( AlethStandardTrace& standardTrace ); + + virtual void print( Json::Value& _jsonTrace, const ExecutionResult&, const HistoricState&, + const HistoricState& ) override; + +private: + static void appendOpToDefaultTrace( std::shared_ptr< OpExecutionRecord > _opExecutionRecord, + std::shared_ptr< Json::Value >& _defaultTrace, TraceOptions& _traceOptions ); +}; +} // namespace dev::eth diff --git a/libhistoric/FourByteTracePrinter.cpp b/libhistoric/FourByteTracePrinter.cpp new file mode 100644 index 000000000..eaa089da6 --- /dev/null +++ b/libhistoric/FourByteTracePrinter.cpp @@ -0,0 +1,74 @@ +/* +Copyright (C) 2023-present, SKALE Labs + +This file is part of skaled. + +skaled 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. + +skaled 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 skaled. If not, see . +*/ + +#ifdef HISTORIC_STATE + + +#include "FourByteTracePrinter.h" +#include "AlethStandardTrace.h" +#include "FunctionCallRecord.h" +#include "TraceStructuresAndDefs.h" + +namespace dev::eth { + +// fourbyte trace printer as implemented by geth +void FourByteTracePrinter::print( + Json::Value& _jsonTrace, const ExecutionResult&, const HistoricState&, const HistoricState& ) { + STATE_CHECK( _jsonTrace.isObject() ) + std::map< string, uint64_t > callMap; + + auto topFunctionCallRecord = m_trace.getTopFunctionCall(); + if ( !topFunctionCallRecord ) { + // no bytecodes were executed, this was purely ETH transfer + // print nothing + return; + } + + topFunctionCallRecord->collectFourByteTrace( callMap ); + for ( auto&& key : callMap ) { + _jsonTrace[key.first] = key.second; + } + + // there is a special case of contract creation. In this case, geth adds + // a special entry to the fourbyte trace as specified below + + if ( m_trace.isContractCreation() ) { + addContractCreationEntry( _jsonTrace ); + } +} +void FourByteTracePrinter::addContractCreationEntry( Json::Value& _jsonTrace ) const { + auto inputBytes = m_trace.getInputData(); + // input data needs to be at least four bytes, otherwise it is an incorrect + // Solidity constructor call + if ( inputBytes.size() < 4 ) { + return; + } + // the format geth uses in this case. Take first 8 symbols of hex and add hex size + auto key = + toHexPrefixed( inputBytes ).substr( 0, 10 ) + "-" + to_string( inputBytes.size() - 4 ); + _jsonTrace[key] = 1; +} + +FourByteTracePrinter::FourByteTracePrinter( AlethStandardTrace& standardTrace ) + : TracePrinter( standardTrace, "4byteTrace" ) {} + + +} // namespace dev::eth + +#endif \ No newline at end of file diff --git a/libhistoric/FourByteTracePrinter.h b/libhistoric/FourByteTracePrinter.h new file mode 100644 index 000000000..68ca0d73c --- /dev/null +++ b/libhistoric/FourByteTracePrinter.h @@ -0,0 +1,42 @@ +/* +Copyright (C) 2023-present, SKALE Labs + +This file is part of skaled. + +skaled 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. + +skaled 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 skaled. If not, see . +*/ + +#pragma once + +#include "TracePrinter.h" + +namespace Json { +class Value; +} + +namespace dev::eth { + +struct ExecutionResult; +class HistoricState; + +class FourByteTracePrinter : public TracePrinter { +public: + explicit FourByteTracePrinter( AlethStandardTrace& standardTrace ); + +public: + void print( Json::Value& _jsonTrace, const ExecutionResult&, const HistoricState&, + const HistoricState& ) override; + void addContractCreationEntry( Json::Value& _jsonTrace ) const; +}; +} // namespace dev::eth diff --git a/libhistoric/FunctionCallRecord.cpp b/libhistoric/FunctionCallRecord.cpp new file mode 100644 index 000000000..571add5b9 --- /dev/null +++ b/libhistoric/FunctionCallRecord.cpp @@ -0,0 +1,331 @@ +/* +Copyright (C) 2023-present, SKALE Labs + +This file is part of skaled. + +skaled 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. + +skaled 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 skaled. If not, see . +*/ + +#ifdef HISTORIC_STATE + +#include "FunctionCallRecord.h" +#include "AlethStandardTrace.h" +#include + +// disable recursive warning since we are using recursion +#pragma clang diagnostic ignored "-Wrecursive-macro" + + +// this class collect information about functions called during execution + +namespace dev::eth { + +void FunctionCallRecord::setGasUsed( uint64_t _gasUsed ) { + STATE_CHECK( _gasUsed < std::numeric_limits< uint32_t >::max() ); + m_gasUsed = _gasUsed; +} + +uint64_t FunctionCallRecord::getFunctionGasLimit() const { + return m_functionGasLimit; +} + +void FunctionCallRecord::setOutputData( const vector< uint8_t >& _outputData ) { + m_outputData = _outputData; +} + +void FunctionCallRecord::addNestedCall( shared_ptr< FunctionCallRecord >& _nestedCall ) { + STATE_CHECK( _nestedCall ); + m_nestedCalls.push_back( _nestedCall ); +} + +void FunctionCallRecord::setError( const string& _error ) { + m_error = _error; +} + +// decode 4 consequitive byes in a byte array to uint32_t +uint32_t FunctionCallRecord::bytesToUint32( + const std::vector< uint8_t >& _bytes, size_t _startIndex ) { + STATE_CHECK( ( _startIndex + 4 ) < _bytes.size() ) + + return ( uint32_t( _bytes[_startIndex] ) << 24 ) | + ( uint32_t( _bytes[_startIndex + 1] ) << 16 ) | + ( uint32_t( _bytes[_startIndex + 2] ) << 8 ) | uint32_t( _bytes[_startIndex + 3] ); +} + +constexpr uint64_t FUNCTION_SELECTOR_SIZE = 4; +constexpr uint64_t OFFSET_SIZE = 32; +constexpr uint64_t STRING_LENGTH_SIZE = 32; + +void FunctionCallRecord::setRevertReason( const bytes& _encodedRevertReason ) { + static unsigned char functionSelector[] = { 0x08, 0xC3, 0x79, 0xA0 }; + + m_reverted = true; + + // Check if the encoded data is at least long enough for a function selector, offset, and + // length. + if ( _encodedRevertReason.size() < FUNCTION_SELECTOR_SIZE + OFFSET_SIZE + STRING_LENGTH_SIZE ) { + // incorrect encoding - setting revert reason to empty + m_revertReason = ""; + return; + } + + + if ( !std::equal( functionSelector, functionSelector + 4, _encodedRevertReason.begin() ) ) { + m_revertReason = ""; + } + + u256 offset; + + boost::multiprecision::import_bits( offset, + _encodedRevertReason.begin() + FUNCTION_SELECTOR_SIZE, + _encodedRevertReason.begin() + FUNCTION_SELECTOR_SIZE + OFFSET_SIZE ); + + // offset is always 0x20 + if ( offset != u256( 0x20 ) ) { + // incorrect offset - setting revert reason to empty + m_revertReason = ""; + return; + } + + + u256 stringLength; + + boost::multiprecision::import_bits( stringLength, + _encodedRevertReason.begin() + FUNCTION_SELECTOR_SIZE + OFFSET_SIZE, + _encodedRevertReason.begin() + FUNCTION_SELECTOR_SIZE + OFFSET_SIZE + STRING_LENGTH_SIZE ); + + // Ensure the encoded data is long enough to contain the described string. + if ( _encodedRevertReason.size() < + FUNCTION_SELECTOR_SIZE + OFFSET_SIZE + STRING_LENGTH_SIZE + stringLength ) { + m_revertReason = ""; + } + + // Extract the string itself. + std::string result; + for ( size_t i = 0; i < stringLength; ++i ) { + result += char( + _encodedRevertReason[FUNCTION_SELECTOR_SIZE + OFFSET_SIZE + STRING_LENGTH_SIZE + i] ); + } + + m_revertReason = result; +} + +const weak_ptr< FunctionCallRecord >& FunctionCallRecord::getParentCall() const { + return m_parentCall; +} + +int64_t FunctionCallRecord::getDepth() const { + return m_depth; +} + +void FunctionCallRecord::printFunctionExecutionDetail( + Json::Value& _jsonTrace, const HistoricState& _statePost, const TraceOptions& _debugOptions ) { + STATE_CHECK( _jsonTrace.isObject() ) + + _jsonTrace["type"] = instructionInfo( m_type ).name; + _jsonTrace["from"] = toHexPrefixed( m_from ); + _jsonTrace["to"] = toHexPrefixed( m_to ); + _jsonTrace["gas"] = + AlethStandardTrace::toGethCompatibleCompactHexPrefixed( m_functionGasLimit ); + _jsonTrace["gasUsed"] = AlethStandardTrace::toGethCompatibleCompactHexPrefixed( m_gasUsed ); + if ( !m_error.empty() ) { + _jsonTrace["error"] = m_error; + } + if ( !m_revertReason.empty() ) { + _jsonTrace["revertReason"] = m_revertReason; + } + + // geth always prints value when there is not revert + // in case of revert value is printed only in top lavel functions + if ( m_error.empty() || m_depth == 0 ) { + _jsonTrace["value"] = AlethStandardTrace::toGethCompatibleCompactHexPrefixed( m_value ); + } + + + // treat the special case when the function is a constructor. Then output data is the code of + // the constructed contract + if ( m_type == Instruction::CREATE || m_type == Instruction::CREATE2 ) { + m_outputData = _statePost.code( m_to ); + } + + + if ( !m_outputData.empty() ) { + _jsonTrace["output"] = toHexPrefixed( m_outputData ); + } + + if ( !m_inputData.empty() ) { + _jsonTrace["input"] = toHexPrefixed( m_inputData ); + } else { + } + + if ( !_debugOptions.withLog ) + return; + + if ( !m_logRecords.empty() && m_type != Instruction::CREATE && + m_type != Instruction::CREATE2 ) { + _jsonTrace["logs"] = Json::arrayValue; + for ( auto&& log : m_logRecords ) { + // no logs in contract creation + _jsonTrace["logs"] = Json::arrayValue; + if ( m_type != Instruction::CREATE && m_type != Instruction::CREATE2 ) { + Json::Value currentLogRecord = Json::objectValue; + currentLogRecord["address"] = toHexPrefixed( m_to ); + currentLogRecord["data"] = toHexPrefixed( log.m_data ); + currentLogRecord["topics"] = Json::arrayValue; + for ( auto&& topic : log.m_topics ) { + currentLogRecord["topics"].append( toHexPrefixed( topic ) ); + } + _jsonTrace["logs"].append( currentLogRecord ); + } + } + } +} + +void FunctionCallRecord::printTrace( Json::Value& _jsonTrace, const HistoricState& _statePost, + int64_t _depth, const TraceOptions& _debugOptions ) { + STATE_CHECK( _jsonTrace.isObject() ) + // prevent Denial of service + STATE_CHECK( _depth < MAX_TRACE_DEPTH ) + STATE_CHECK( _depth == m_depth ) + + printFunctionExecutionDetail( _jsonTrace, _statePost, _debugOptions ); + + if ( !m_nestedCalls.empty() ) { + if ( _debugOptions.onlyTopCall ) + return; + _jsonTrace["calls"] = Json::arrayValue; + for ( uint32_t i = 0; i < m_nestedCalls.size(); i++ ) { + _jsonTrace["calls"].append( Json::objectValue ); + m_nestedCalls.at( i )->printTrace( + _jsonTrace["calls"][i], _statePost, _depth + 1, _debugOptions ); + } + } +} + +FunctionCallRecord::FunctionCallRecord( Instruction _type, const Address& _from, const Address& _to, + uint64_t _functionGasLimit, const weak_ptr< FunctionCallRecord >& _parentCall, + const vector< uint8_t >& _inputData, const u256& _value, int64_t _depth, + uint64_t _gasRemainingBeforeCall ) + : m_type( _type ), + m_from( _from ), + m_to( _to ), + m_functionGasLimit( _functionGasLimit ), + m_parentCall( _parentCall ), + m_inputData( _inputData ), + m_value( _value ), + m_depth( _depth ), + m_gasRemainingBeforeCall( _gasRemainingBeforeCall ){ STATE_CHECK( m_depth >= 0 ) } + + uint64_t FunctionCallRecord::getGasRemainingBeforeCall() const { + return m_gasRemainingBeforeCall; +} + + +void FunctionCallRecord::addLogEntry( + const vector< uint8_t >& _data, const vector< u256 >& _topics ) { + m_logRecords.emplace_back( _data, _topics ); +} + +string FunctionCallRecord::getParityTraceType() { + return boost::algorithm::to_lower_copy( string( instructionInfo( m_type ).name ) ); +} + +void FunctionCallRecord::printParityFunctionTrace( + Json::Value& _outputArray, Json::Value _address ) { + Json::Value functionTrace( Json::objectValue ); + + Json::Value action( Json::objectValue ); + action["from"] = toHexPrefixed( m_from ); + action["to"] = toHexPrefixed( m_to ); + action["gas"] = toHexPrefixed( u256( m_functionGasLimit ) ); + action["input"] = toHexPrefixed( m_inputData ); + action["value"] = toHexPrefixed( m_value ); + action["callType"] = getParityTraceType(); + functionTrace["action"] = action; + + + Json::Value result( Json::objectValue ); + result["gasUsed"] = toHexPrefixed( u256( m_gasUsed ) ); + result["output"] = toHexPrefixed( m_outputData ); + functionTrace["result"] = result; + + functionTrace["subtraces"] = m_nestedCalls.size(); + functionTrace["traceAddress"] = _address; + functionTrace["type"] = getParityTraceType(); + _outputArray.append( functionTrace ); + + for ( uint64_t i = 0; i < m_nestedCalls.size(); i++ ) { + auto nestedFunctionAddress = _address; + nestedFunctionAddress.append( i ); + auto nestedCall = m_nestedCalls.at( i ); + STATE_CHECK( nestedCall ); + nestedCall->printParityFunctionTrace( _outputArray, nestedFunctionAddress ); + } +} + +void FunctionCallRecord::collectFourByteTrace( std::map< string, uint64_t >& _callMap ) { + Json::Value functionTrace( Json::objectValue ); + + constexpr int FOUR_BYTES = 4; + + if ( m_depth > 0 && ( m_type == Instruction::CREATE || m_type == Instruction::CREATE2 ) ) { + // geth does not print 4byte traces for constructors called by contracts + return; + } + + // a call with less than four bytes of data is not a valid solidity call + if ( m_inputData.size() >= FOUR_BYTES ) { + vector< uint8_t > fourBytes( m_inputData.begin(), m_inputData.begin() + FOUR_BYTES ); + auto key = toHexPrefixed( fourBytes ) + .append( "-" ) + .append( to_string( m_inputData.size() - FOUR_BYTES ) ); + auto count = _callMap[key] + 1; + _callMap[key] = count; + } + + for ( uint64_t i = 0; i < m_nestedCalls.size(); i++ ) { + auto nestedCall = m_nestedCalls.at( i ); + STATE_CHECK( nestedCall ); + nestedCall->collectFourByteTrace( _callMap ); + } +} + + +void FunctionCallRecord::setReturnValues( + evmc_status_code _status, const vector< uint8_t >& _returnData, uint64_t _gasUsed ) { + setGasUsed( _gasUsed ); + + if ( _status != evmc_status_code::EVMC_SUCCESS ) { + setError( TracePrinter::getEvmErrorDescription( _status ) ); + } + + if ( _status == evmc_status_code::EVMC_REVERT ) { + setRevertReason( _returnData ); + } + + setOutputData( _returnData ); +} + +Instruction FunctionCallRecord::getType() const { + return m_type; +} + +uint64_t FunctionCallRecord::getGasUsed() const { + return m_gasUsed; +} + +} // namespace dev::eth +// namespace dev + +#endif \ No newline at end of file diff --git a/libhistoric/FunctionCallRecord.h b/libhistoric/FunctionCallRecord.h new file mode 100644 index 000000000..fc55e3fd0 --- /dev/null +++ b/libhistoric/FunctionCallRecord.h @@ -0,0 +1,115 @@ +/* +Copyright (C) 2023-present, SKALE Labs + +This file is part of skaled. + +skaled 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. + +skaled 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 skaled. If not, see . +*/ + + +#pragma once + + +#include "AlethExtVM.h" +#include "libevm/LegacyVM.h" +#include +#include + + +namespace dev::eth { + +using std::string, std::shared_ptr, std::make_shared, std::to_string, std::set, std::map, + std::vector, std::weak_ptr; + + +struct TraceOptions; + +// It is important that trace functions do not throw exceptions and do not modify state +// so that they do not interfere with EVM execution + +struct LogRecord; + +struct OpExecutionRecord; + +class FunctionCallRecord { +public: + FunctionCallRecord( Instruction _type, const Address& _from, const Address& _to, + uint64_t _functionGasLimit, const weak_ptr< FunctionCallRecord >& _parentCall, + const vector< uint8_t >& _inputData, const u256& _value, int64_t _depth, + uint64_t _gasRemainingBeforeCall ); + + [[nodiscard]] int64_t getDepth() const; + + [[nodiscard]] const weak_ptr< FunctionCallRecord >& getParentCall() const; + + [[nodiscard]] uint64_t getFunctionGasLimit() const; + + [[nodiscard]] string getParityTraceType(); + + void setGasUsed( uint64_t _gasUsed ); + + void setOutputData( const vector< uint8_t >& _outputData ); + + void addNestedCall( shared_ptr< FunctionCallRecord >& _nestedCall ); + + void setError( const string& _error ); + + void setRevertReason( const bytes& _encodedRevertReason ); + + void printTrace( Json::Value& _jsonTrace, const HistoricState& _statePost, int64_t _depth, + const TraceOptions& _debugOptions ); + + void printFunctionExecutionDetail( Json::Value& _jsonTrace, const HistoricState& _statePost, + const TraceOptions& _debugOptions ); + + void addLogEntry( const vector< uint8_t >& _data, const vector< u256 >& _topics ); + + void printParityFunctionTrace( Json::Value& _outputArray, Json::Value _address ); + + void collectFourByteTrace( std::map< string, uint64_t >& _callMap ); + + void setReturnValues( + evmc_status_code _status, const vector< uint8_t >& _returnData, uint64_t _gasUsed ); + + Instruction getType() const; + + uint64_t getGasUsed() const; + uint64_t getGasRemainingBeforeCall() const; + + static uint32_t bytesToUint32( const std::vector< uint8_t >& _bytes, size_t _startIndex ); + +private: + Instruction m_type; + Address m_from; + Address m_to; + uint64_t m_functionGasLimit = 0; + uint64_t m_gasUsed = 0; + vector< shared_ptr< FunctionCallRecord > > m_nestedCalls; + weak_ptr< FunctionCallRecord > m_parentCall; + + +private: + vector< uint8_t > m_inputData; + vector< uint8_t > m_outputData; + bool m_reverted = false; + string m_error; + string m_revertReason; + u256 m_value; + int64_t m_depth = 0; + vector< LogRecord > m_logRecords; + uint64_t m_gasRemainingBeforeCall; +}; + + +} // namespace dev::eth diff --git a/libhistoric/HistoricState.cpp b/libhistoric/HistoricState.cpp index f0f13d931..33f64847c 100644 --- a/libhistoric/HistoricState.cpp +++ b/libhistoric/HistoricState.cpp @@ -599,6 +599,8 @@ std::pair< ExecutionResult, TransactionReceipt > HistoricState::execute( EnvInfo #endif u256 const startGasUsed = _envInfo.gasUsed(); + + bool const statusCode = executeTransaction( e, _t, onOp ); @@ -620,6 +622,7 @@ std::pair< ExecutionResult, TransactionReceipt > HistoricState::execute( EnvInfo _envInfo.number() >= _chainParams.byzantiumForkBlock ? TransactionReceipt( statusCode, startGasUsed + e.gasUsed(), e.logs() ) : TransactionReceipt( globalRoot(), startGasUsed + e.gasUsed(), e.logs() ); + return make_pair( res, receipt ); } diff --git a/libhistoric/NoopTracePrinter.cpp b/libhistoric/NoopTracePrinter.cpp new file mode 100644 index 000000000..fce741f84 --- /dev/null +++ b/libhistoric/NoopTracePrinter.cpp @@ -0,0 +1,41 @@ +/* +Copyright (C) 2023-present, SKALE Labs + +This file is part of skaled. + +skaled 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. + +skaled 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 skaled. If not, see . +*/ + +#ifdef HISTORIC_STATE + +#include "AlethStandardTrace.h" +#include "FourByteTracePrinter.h" +#include "FunctionCallRecord.h" +#include "TraceStructuresAndDefs.h" + +namespace dev::eth { + +void NoopTracePrinter::print( + Json::Value& _jsonTrace, const ExecutionResult&, const HistoricState&, const HistoricState& ) { + STATE_CHECK( _jsonTrace.isObject() ); + _jsonTrace.clear(); + // do nothing +} + +NoopTracePrinter::NoopTracePrinter( AlethStandardTrace& standardTrace ) + : TracePrinter( standardTrace, "noopTrace" ) {} + +} // namespace dev::eth + +#endif \ No newline at end of file diff --git a/libhistoric/NoopTracePrinter.h b/libhistoric/NoopTracePrinter.h new file mode 100644 index 000000000..fbc4d188d --- /dev/null +++ b/libhistoric/NoopTracePrinter.h @@ -0,0 +1,40 @@ +/* +Copyright (C) 2023-present, SKALE Labs + +This file is part of skaled. + +skaled 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. + +skaled 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 skaled. If not, see . +*/ + +#pragma once + +#include "TracePrinter.h" + +namespace Json { +class Value; +} + +namespace dev::eth { + +struct ExecutionResult; +class HistoricState; + +class NoopTracePrinter : public TracePrinter { +public: + explicit NoopTracePrinter( AlethStandardTrace& standardTrace ); + + void print( Json::Value& _jsonTrace, const ExecutionResult&, const HistoricState&, + const HistoricState& ) override; +}; +} // namespace dev::eth diff --git a/libhistoric/PrestateTracePrinter.cpp b/libhistoric/PrestateTracePrinter.cpp new file mode 100644 index 000000000..be65e97dc --- /dev/null +++ b/libhistoric/PrestateTracePrinter.cpp @@ -0,0 +1,450 @@ +/* +Copyright (C) 2023-present, SKALE Labs + +This file is part of skaled. + + skaled 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. + + skaled 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 skaled. If not, see . +*/ + + +#ifdef HISTORIC_STATE + +#include "PrestateTracePrinter.h" +#include "AlethStandardTrace.h" +#include "FunctionCallRecord.h" +#include "TraceStructuresAndDefs.h" + +namespace dev::eth { + +void PrestateTracePrinter::print( Json::Value& _jsonTrace, const ExecutionResult& _er, + const HistoricState& _statePre, const HistoricState& _statePost ) { + STATE_CHECK( _jsonTrace.isObject() ); + if ( m_trace.getOptions().prestateDiffMode ) { + printDiffTrace( _jsonTrace, _er, _statePre, _statePost ); + } else { + printPreStateTrace( _jsonTrace, _statePre, _statePost ); + } +} + +void PrestateTracePrinter::printPreStateTrace( + Json::Value& _jsonTrace, const HistoricState& _statePre, const HistoricState& _statePost ) { + for ( auto&& item : m_trace.getAccessedAccounts() ) { + printAllAccessedAccountPreValues( _jsonTrace, _statePre, _statePost, item ); + }; + + // geth always prints the balance of block miner balance + + Address minerAddress = m_trace.getBlockAuthor(); + u256 minerBalance = getBalancePre( _statePre, minerAddress ); + _jsonTrace[toHexPrefixed( minerAddress )]["balance"] = + AlethStandardTrace::toGethCompatibleCompactHexPrefixed( minerBalance ); +} + + +void PrestateTracePrinter::printDiffTrace( Json::Value& _jsonTrace, const ExecutionResult&, + const HistoricState& _statePre, const HistoricState& _statePost ) { + STATE_CHECK( _jsonTrace.isObject() ) + + Json::Value preDiff( Json::objectValue ); + Json::Value postDiff( Json::objectValue ); + + for ( auto&& item : m_trace.getAccessedAccounts() ) { + printAccountPreDiff( preDiff, _statePre, _statePost, item ); + printAccountPostDiff( postDiff, _statePre, _statePost, item ); + }; + + + // now deal with miner balance change as a result of transaction + // geth always prints miner balance change when NOT in call + if ( !m_trace.isCall() ) { + printMinerBalanceChange( _statePre, _statePost, preDiff, postDiff ); + } + + // we are done, complete the trace JSON + + _jsonTrace["pre"] = preDiff; + _jsonTrace["post"] = postDiff; +} + +void PrestateTracePrinter::printMinerBalanceChange( const HistoricState& _statePre, + const HistoricState& _statePost, Json::Value& preDiff, Json::Value& postDiff ) const { + Address minerAddress = m_trace.getBlockAuthor(); + u256 minerBalancePre = getBalancePre( _statePre, minerAddress ); + u256 minerBalancePost = getBalancePost( _statePost, minerAddress ); + + preDiff[toHexPrefixed( minerAddress )]["balance"] = + AlethStandardTrace::toGethCompatibleCompactHexPrefixed( minerBalancePre ); + postDiff[toHexPrefixed( minerAddress )]["balance"] = + AlethStandardTrace::toGethCompatibleCompactHexPrefixed( minerBalancePost ); +} + + +// this function returns original values (pre) to result +void PrestateTracePrinter::printAllAccessedAccountPreValues( Json::Value& _jsonTrace, + const HistoricState& _statePre, const HistoricState& _statePost, const Address& _address ) { + STATE_CHECK( _jsonTrace.isObject() ) + + Json::Value accountPreValues; + // if this _address did not exist, we do not include it in the diff + // unless it is contract deploy + if ( !_statePre.addressInUse( _address ) && !m_trace.isContractCreation() ) + return; + + auto balance = _statePre.balance( _address ); + + // take into account that for calls balance is modified in the state before execution + if ( m_trace.isCall() && _address == m_trace.getFrom() ) { + balance = m_trace.getOriginalFromBalance(); + } + printNonce( _statePre, _statePost, _address, accountPreValues ); + + + accountPreValues["balance"] = AlethStandardTrace::toGethCompatibleCompactHexPrefixed( balance ); + + bytes const& code = _statePre.code( _address ); + if ( code != NullBytes ) { + accountPreValues["code"] = toHexPrefixed( code ); + } + + Json::Value storagePairs; + + auto& accessedStoragedValues = m_trace.getAccessedStorageValues(); + + // now print all storage values that were accessed (written or read) during the transaction + if ( accessedStoragedValues.count( _address ) ) { + for ( auto&& storageAddressValuePair : accessedStoragedValues.at( _address ) ) { + auto& storageAddress = storageAddressValuePair.first; + auto originalValue = _statePre.originalStorageValue( _address, storageAddress ); + storagePairs[toHexPrefixed( storageAddress )] = toHexPrefixed( originalValue ); + // return limited number of values to prevent DOS attacks + m_storageValuesReturnedAll++; + if ( m_storageValuesReturnedAll >= MAX_STORAGE_VALUES_RETURNED ) + break; + } + } + + if ( storagePairs ) { + accountPreValues["storage"] = storagePairs; + } + + // if nothing changed we do not add it to the diff + if ( accountPreValues ) + _jsonTrace[toHexPrefixed( _address )] = accountPreValues; +} + +void PrestateTracePrinter::printNonce( const HistoricState& _statePre, + const HistoricState& _statePost, const Address& _address, + Json::Value& accountPreValues ) const { + // geth does not print nonce for from address in debug_traceCall; + + + if ( m_trace.isCall() && _address == m_trace.getFrom() ) { + return; + } + + // handle special case of contract creation transaction + // in this case geth prints nonce = 1 for the contract + // that has been created + if ( isNewContract( _statePre, _statePost, _address ) ) { + accountPreValues["nonce"] = 1; + return; + } + + // now handle the generic case + + auto preNonce = ( uint64_t ) _statePre.getNonce( _address ); + auto postNonce = ( uint64_t ) _statePost.getNonce( _address ); + // in calls nonce is always printed by geth + // find out if the address is a contract. Geth always prints nonce for contracts + + if ( postNonce != preNonce || m_trace.isCall() || + isPreExistingContract( _statePre, _address ) ) { + accountPreValues["nonce"] = preNonce; + } +} + +void PrestateTracePrinter::printAccountPreDiff( Json::Value& _preDiffTrace, + const HistoricState& _statePre, const HistoricState& _statePost, const Address& _address ) { + Json::Value diffPre( Json::objectValue ); + + // If the account did not exist before the transaction, geth does not print it in pre trace + // exception is a top level contract created during the CREATE transaction. Geth always prints + // it in pre diff + if ( !_statePre.addressInUse( _address ) && + !( m_trace.isContractCreation() && isNewContract( _statePre, _statePost, _address ) ) ) { + return; + } + + printPreDiffBalance( _statePre, _statePost, _address, diffPre ); + + printPreDiffNonce( _statePre, _statePost, _address, diffPre ); + + printPreDiffCode( _statePre, _statePost, _address, diffPre ); + + printPreDiffStorage( _statePre, _statePost, _address, diffPre ); + + if ( !diffPre.empty() ) + _preDiffTrace[toHexPrefixed( _address )] = diffPre; +} + +void PrestateTracePrinter::printPreDiffCode( const HistoricState& _statePre, + const HistoricState& _statePost, const Address& _address, Json::Value& diffPre ) const { + auto& code = _statePre.code( _address ); + + if ( !_statePost.addressInUse( _address ) || _statePost.code( _address ) != code || + _statePre.getNonce( _address ) != + _statePost.getNonce( _address ) // geth always prints code here if nonce changed + ) { + if ( code != NullBytes ) { + diffPre["code"] = toHexPrefixed( code ); + } + } +} + +void PrestateTracePrinter::printPreDiffBalance( const HistoricState& _statePre, + const HistoricState& _statePost, const Address& _address, Json::Value& _diffPre ) const { + auto balancePre = getBalancePre( _statePre, _address ); + auto balancePost = getBalancePost( _statePost, _address ); + + + // always print balance of from address in calls + if ( m_trace.isCall() && _address == m_trace.getFrom() ) { + _diffPre["balance"] = AlethStandardTrace::toGethCompatibleCompactHexPrefixed( balancePre ); + return; + } + + // handle the case of a contract creation. Geth always prints balance 0 as pre for new contract + // geth does always print pre nonce equal 1 for newly created contract + if ( isNewContract( _statePre, _statePost, _address ) ) { + _diffPre["balance"] = "0x0"; + return; + } + + // now handle generic case + + if ( !_statePost.addressInUse( _address ) || balancePost != balancePre || + _statePre.getNonce( _address ) != + _statePost.getNonce( _address ) ) { // geth alw prints balance if nonce changed + _diffPre["balance"] = AlethStandardTrace::toGethCompatibleCompactHexPrefixed( balancePre ); + } +} + +u256 PrestateTracePrinter::getBalancePre( + const HistoricState& _statePre, const Address& _address ) const { + auto balancePre = _statePre.balance( _address ); + + if ( m_trace.isCall() && _address == m_trace.getFrom() ) { + // take into account that for calls balance is modified in the state before execution + balancePre = m_trace.getOriginalFromBalance(); + } + + return balancePre; +} + +u256 PrestateTracePrinter::getBalancePost( + const HistoricState& _statePost, const Address& _address ) const { + auto balancePost = _statePost.balance( _address ); + return balancePost; +} + +void PrestateTracePrinter::printPreDiffStorage( const HistoricState& _statePre, + const HistoricState& _statePost, const Address& _address, Json::Value& _diffPre ) { + // if its a new contract that did not exist before the transaction, + // then geth does not print its storage in pre + if ( isNewContract( _statePre, _statePost, _address ) ) { + return; + } + + // now handle generic case + + if ( m_trace.getAccessedStorageValues().find( _address ) != + m_trace.getAccessedStorageValues().end() ) { + Json::Value storagePairs; + + for ( auto&& it : m_trace.getAccessedStorageValues().at( _address ) ) { + auto& storageAddress = it.first; + auto storageValuePost = _statePost.storage( _address, storageAddress ); + bool includePair; + if ( !_statePost.addressInUse( _address ) ) { + // contract has been deleted. Include in diff + includePair = true; + } else if ( storageValuePost == 0 ) { + // storage has been deleted. Do not include + includePair = false; + } else { + auto storageValuePre = _statePre.originalStorageValue( _address, storageAddress ); + includePair = + storageValuePre != storageValuePost && + storageValuePre != 0; // geth does not print storage in pre if it is zero + } + + if ( includePair ) { + storagePairs[toHexPrefixed( it.first )] = + toHexPrefixed( _statePre.originalStorageValue( _address, it.first ) ); + // return limited number of storage pairs to prevent DOS attacks + m_storageValuesReturnedPre++; + if ( m_storageValuesReturnedPre >= MAX_STORAGE_VALUES_RETURNED ) + break; + } + } + + if ( !storagePairs.empty() ) + _diffPre["storage"] = storagePairs; + } +} + +void PrestateTracePrinter::printPreDiffNonce( const HistoricState& _statePre, + const HistoricState& _statePost, const Address& _address, Json::Value& _diff ) const { + // geth does not print pre from nonce in calls + if ( m_trace.isCall() && _address == m_trace.getFrom() ) { + return; + }; + + + // geth does always print pre nonce equal 1 for newly created contract + + + if ( isNewContract( _statePre, _statePost, _address ) ) { + _diff["nonce"] = 1; + return; + } + + // now handle generic case + auto noncePre = _statePre.getNonce( _address ); + if ( !_statePost.addressInUse( _address ) || _statePost.getNonce( _address ) != noncePre ) { + _diff["nonce"] = ( uint64_t ) noncePre; + } +} + +void PrestateTracePrinter::printPostDiffNonce( const HistoricState& _statePre, + const HistoricState& _statePost, const Address& _address, Json::Value& _diff ) const { + // geth does noty print post diff nonce for newly created contract + if ( isNewContract( _statePre, _statePost, _address ) ) { + return; + } + + // now handle generic case + + auto noncePost = _statePost.getNonce( _address ); + + if ( _statePre.getNonce( _address ) != noncePost ) { + _diff["nonce"] = ( uint64_t ) noncePost; + } +} + +void PrestateTracePrinter::printAccountPostDiff( Json::Value& _postDiffTrace, + const HistoricState& _statePre, const HistoricState& _statePost, const Address& _address ) { + Json::Value diffPost( Json::objectValue ); + + + // if this address does not exist post-transaction we dot include it in the trace + if ( !_statePost.addressInUse( _address ) ) + return; + + printPostDiffBalance( _statePre, _statePost, _address, diffPost ); + + printPostDiffNonce( _statePre, _statePost, _address, diffPost ); + + diffPost = printPostDiffCode( _statePre, _statePost, _address, diffPost ); + + printPostDiffStorage( _statePre, _statePost, _address, diffPost ); + + if ( !diffPost.empty() ) + _postDiffTrace[toHexPrefixed( _address )] = diffPost; +} + +Json::Value& PrestateTracePrinter::printPostDiffCode( const HistoricState& _statePre, + const HistoricState& _statePost, const Address& _address, Json::Value& diffPost ) const { + auto& codePost = _statePost.code( _address ); + + if ( !_statePre.addressInUse( _address ) || _statePre.code( _address ) != codePost ) { + if ( codePost != NullBytes ) { + diffPost["code"] = toHexPrefixed( codePost ); + } + } + return diffPost; +} + +void PrestateTracePrinter::printPostDiffBalance( const HistoricState& _statePre, + const HistoricState& _statePost, const Address& _address, Json::Value& diffPost ) const { + auto balancePre = getBalancePre( _statePre, _address ); + auto balancePost = getBalancePost( _statePost, _address ); + + // geth does not postbalance of from address in calls + if ( m_trace.isCall() && _address == m_trace.getFrom() ) { + return; + } + + // geth does not print postbalance for a newly created contract + if ( isNewContract( _statePre, _statePost, _address ) ) { + return; + } + + + // now handle generic case + if ( !_statePre.addressInUse( _address ) || balancePre != balancePost ) { + // if the new address, ot if the value changed, include in post trace + diffPost["balance"] = AlethStandardTrace::toGethCompatibleCompactHexPrefixed( balancePost ); + } +} + +void PrestateTracePrinter::printPostDiffStorage( const HistoricState& _statePre, + const HistoricState& _statePost, const Address& _address, + Json::Value& diffPost ) { // post diffs for storage values + if ( m_trace.getAccessedStorageValues().find( _address ) != + m_trace.getAccessedStorageValues().end() ) { + Json::Value storagePairs( Json::objectValue ); + + // iterate over all accessed storage values + for ( auto&& it : m_trace.getAccessedStorageValues().at( _address ) ) { + auto& storageAddress = it.first; + // take into account the fact that the change could have been reverted + // so we cannot use the value set by the last SSTORE + auto storageValue = _statePost.storage( _address, it.first ); + + bool includePair; + if ( !_statePre.addressInUse( _address ) ) { + // a new storage pair created. Include it in post diff + includePair = true; + } else if ( storageValue == 0 ) { + // the value has been deleted. We do not include it in post diff + includePair = false; + } else { + // see if the storage value has been changed + includePair = + _statePre.originalStorageValue( _address, storageAddress ) != storageValue; + } + + if ( includePair ) { + storagePairs[toHexPrefixed( storageAddress )] = toHexPrefixed( storageValue ); + // return limited number of storage pairs to prevent DOS attacks + m_storageValuesReturnedPost++; + if ( m_storageValuesReturnedPost >= MAX_STORAGE_VALUES_RETURNED ) + break; + } + } + + if ( !storagePairs.empty() ) + diffPost["storage"] = storagePairs; + } +} + + +PrestateTracePrinter::PrestateTracePrinter( AlethStandardTrace& standardTrace ) + : TracePrinter( standardTrace, "prestateTrace" ) {} + + +} // namespace dev::eth + +#endif \ No newline at end of file diff --git a/libhistoric/PrestateTracePrinter.h b/libhistoric/PrestateTracePrinter.h new file mode 100644 index 000000000..2b6ec4f52 --- /dev/null +++ b/libhistoric/PrestateTracePrinter.h @@ -0,0 +1,85 @@ +/* +Copyright (C) 2023-present, SKALE Labs + +This file is part of skaled. + +skaled 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. + +skaled 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 skaled. If not, see . +*/ + +#pragma once + +#include "TracePrinter.h" + + +namespace Json { +class Value; +} + +namespace dev::eth { + +struct ExecutionResult; +class HistoricState; + +class PrestateTracePrinter : public TracePrinter { +public: + void print( Json::Value& _jsonTrace, const ExecutionResult&, const HistoricState&, + const HistoricState& ) override; + + explicit PrestateTracePrinter( AlethStandardTrace& standardTrace ); + +private: + void printDiffTrace( Json::Value& _jsonTrace, const ExecutionResult&, + const HistoricState& _statePre, const HistoricState& _statePost ); + + void printAllAccessedAccountPreValues( Json::Value& _jsonTrace, const HistoricState& _statePre, + const HistoricState& _statePost, const Address& _address ); + + void printAccountPreDiff( Json::Value& _preDiffTrace, const HistoricState& _statePre, + const HistoricState& _statePost, const Address& _address ); + + void printAccountPostDiff( Json::Value& _postDiffTrace, const HistoricState& _statePre, + const HistoricState& _statePost, const Address& _address ); + + void printPreStateTrace( + Json::Value& _jsonTrace, const HistoricState& _statePre, const HistoricState& _statePost ); + + void printMinerBalanceChange( const HistoricState& _statePre, const HistoricState& _statePost, + Json::Value& preDiff, Json::Value& postDiff ) const; + void printNonce( const HistoricState& _statePre, const HistoricState& _statePost, + const Address& _address, Json::Value& accountPreValues ) const; + void printPreDiffNonce( const HistoricState& _statePre, const HistoricState& _statePost, + const Address& _address, Json::Value& _diff ) const; + void printPostDiffNonce( const HistoricState& _statePre, const HistoricState& _statePost, + const Address& _address, Json::Value& _diff ) const; + void printPreDiffStorage( const HistoricState& _statePre, const HistoricState& _statePost, + const Address& _address, Json::Value& _diffPre ); + void printPostDiffStorage( const HistoricState& _statePre, const HistoricState& _statePost, + const Address& _address, Json::Value& diffPost ); + void printPreDiffBalance( const HistoricState& _statePre, const HistoricState& _statePost, + const Address& _address, Json::Value& _diffPre ) const; + void printPreDiffCode( const HistoricState& _statePre, const HistoricState& _statePost, + const Address& _address, Json::Value& diffPre ) const; + void printPostDiffBalance( const HistoricState& _statePre, const HistoricState& _statePost, + const Address& _address, Json::Value& diffPost ) const; + [[nodiscard]] Json::Value& printPostDiffCode( const HistoricState& _statePre, + const HistoricState& _statePost, const Address& _address, Json::Value& diffPost ) const; + + + uint64_t m_storageValuesReturnedPre = 0; + uint64_t m_storageValuesReturnedPost = 0; + uint64_t m_storageValuesReturnedAll = 0; + u256 getBalancePost( const HistoricState& _statePost, const Address& _address ) const; + u256 getBalancePre( const HistoricState& _statePre, const Address& _address ) const; +}; +} // namespace dev::eth diff --git a/libhistoric/ReplayTracePrinter.cpp b/libhistoric/ReplayTracePrinter.cpp new file mode 100644 index 000000000..86d2ab5a3 --- /dev/null +++ b/libhistoric/ReplayTracePrinter.cpp @@ -0,0 +1,64 @@ +/* +Copyright (C) 2023-present, SKALE Labs + +This file is part of skaled. + +skaled 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. + +skaled 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 skaled. If not, see . +*/ + +#ifdef HISTORIC_STATE + + +#include "ReplayTracePrinter.h" +#include "AlethStandardTrace.h" +#include "FunctionCallRecord.h" +#include "TraceStructuresAndDefs.h" + +namespace dev::eth { + +// print replay trace as implemented by parity +void ReplayTracePrinter::print( Json::Value& _jsonTrace, const ExecutionResult& _er, + const HistoricState&, const HistoricState& ) { + STATE_CHECK( _jsonTrace.isObject() ) + _jsonTrace["vmTrace"] = Json::Value::null; + _jsonTrace["stateDiff"] = Json::Value::null; + _jsonTrace["transactionHash"] = toHexPrefixed( m_trace.getTxHash() ); + _jsonTrace["output"] = toHexPrefixed( _er.output ); + auto failed = _er.excepted != TransactionException::None; + + if ( failed ) { + _jsonTrace["error"] = getEvmErrorDescription( m_trace.getEVMCStatusCode() ); + } + + Json::Value functionTraceArray( Json::arrayValue ); + Json::Value emptyAddress( Json::arrayValue ); + + auto topFunctionCallRecord = m_trace.getTopFunctionCall(); + + + // if topFunctionCallRecord is null + // it means that no bytecodes were executed, this was purely ETH transfer + // print nothing + if ( topFunctionCallRecord ) { + topFunctionCallRecord->printParityFunctionTrace( functionTraceArray, emptyAddress ); + } + _jsonTrace["trace"] = functionTraceArray; +} + +ReplayTracePrinter::ReplayTracePrinter( AlethStandardTrace& _standardTrace ) + : TracePrinter( _standardTrace, "replayTrace" ) {} + +} // namespace dev::eth + +#endif diff --git a/libhistoric/ReplayTracePrinter.h b/libhistoric/ReplayTracePrinter.h new file mode 100644 index 000000000..22c53d8a7 --- /dev/null +++ b/libhistoric/ReplayTracePrinter.h @@ -0,0 +1,41 @@ +/* +Copyright (C) 2023-present, SKALE Labs + +This file is part of skaled. + +skaled 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. + +skaled 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 skaled. If not, see . +*/ + +#pragma once + +#include "TracePrinter.h" + +namespace Json { +class Value; +} + +namespace dev::eth { + +struct ExecutionResult; +class HistoricState; + +class ReplayTracePrinter : public TracePrinter { +public: + explicit ReplayTracePrinter( AlethStandardTrace& standardTrace ); + +public: + void print( Json::Value& _jsonTrace, const ExecutionResult&, const HistoricState&, + const HistoricState& ) override; +}; +} // namespace dev::eth diff --git a/libhistoric/TraceOptions.cpp b/libhistoric/TraceOptions.cpp new file mode 100644 index 000000000..6e97e48e1 --- /dev/null +++ b/libhistoric/TraceOptions.cpp @@ -0,0 +1,88 @@ +/* +Copyright (C) 2023-present, SKALE Labs + +This file is part of skaled. + +skaled 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. + +skaled 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 skaled. If not, see . +*/ + + +#ifdef HISTORIC_STATE + + +#include "TraceOptions.h" +#include "boost/throw_exception.hpp" + + +using namespace std; + +namespace dev::eth { + +const map< string, TraceType > TraceOptions::s_stringToTracerMap = { + { "", TraceType::DEFAULT_TRACER }, { "callTracer", TraceType::CALL_TRACER }, + { "prestateTracer", TraceType::PRESTATE_TRACER }, { "replayTracer", TraceType::REPLAY_TRACER }, + { "4byteTracer", TraceType::FOUR_BYTE_TRACER }, { "noopTracer", TraceType::NOOP_TRACER }, + { "allTracer", TraceType::ALL_TRACER } +}; + +TraceOptions TraceOptions::make( Json::Value const& _json ) { + TraceOptions op; + + if ( !_json.isObject() ) + BOOST_THROW_EXCEPTION( jsonrpc::JsonRpcException( + jsonrpc::Errors::ERROR_RPC_INVALID_PARAMS, "Invalid options" ) ); + + if ( !_json["disableStorage"].empty() ) + op.disableStorage = _json["disableStorage"].asBool(); + + if ( !_json["enableMemory"].empty() ) + op.enableMemory = _json["enableMemory"].asBool(); + if ( !_json["disableStack"].empty() ) + op.disableStack = _json["disableStack"].asBool(); + if ( !_json["enableReturnData"].empty() ) + op.enableReturnData = _json["enableReturnData"].asBool(); + + if ( !_json["tracer"].empty() ) { + auto tracerStr = _json["tracer"].asString(); + + if ( s_stringToTracerMap.count( tracerStr ) ) { + op.tracerType = s_stringToTracerMap.at( tracerStr ); + } else { + BOOST_THROW_EXCEPTION( jsonrpc::JsonRpcException( + jsonrpc::Errors::ERROR_RPC_INVALID_PARAMS, "Invalid tracer type:" + tracerStr ) ); + } + } + + if ( !_json["tracerConfig"].empty() && _json["tracerConfig"].isObject() ) { + if ( !_json["tracerConfig"]["diffMode"].empty() && + _json["tracerConfig"]["diffMode"].isBool() ) { + op.prestateDiffMode = _json["tracerConfig"]["diffMode"].asBool(); + } + + if ( !_json["tracerConfig"]["onlyTopCall"].empty() && + _json["tracerConfig"]["onlyTopCall"].isBool() ) { + op.onlyTopCall = _json["tracerConfig"]["onlyTopCall"].asBool(); + } + + if ( !_json["tracerConfig"]["withLog"].empty() && + _json["tracerConfig"]["withLog"].isBool() ) { + op.withLog = _json["tracerConfig"]["withLog"].asBool(); + } + } + + return op; +} +} // namespace dev::eth + +#endif \ No newline at end of file diff --git a/libhistoric/TraceOptions.h b/libhistoric/TraceOptions.h new file mode 100644 index 000000000..92e8c4d66 --- /dev/null +++ b/libhistoric/TraceOptions.h @@ -0,0 +1,70 @@ +/* +Copyright (C) 2023-present, SKALE Labs + +This file is part of skaled. + +skaled 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. + +skaled 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 skaled. If not, see . +*/ + +#pragma once + +#include +#include +#include +#include + +namespace dev::eth { + +enum class TraceType { + DEFAULT_TRACER, + PRESTATE_TRACER, + CALL_TRACER, + REPLAY_TRACER, + FOUR_BYTE_TRACER, + NOOP_TRACER, + ALL_TRACER +}; + +class TraceOptions { +public: + bool disableStorage = false; + bool enableMemory = false; + bool disableStack = false; + // geth enables return data by default + bool enableReturnData = true; + bool prestateDiffMode = false; + bool onlyTopCall = false; + bool withLog = false; + + [[nodiscard]] std::string toString() { + std::stringstream s; + s << ( uint64_t ) tracerType; + s << disableStorage; + s << enableMemory; + s << disableStack; + s << enableReturnData; + s << prestateDiffMode; + s << onlyTopCall; + s << withLog; + return s.str(); + } + + + TraceType tracerType = TraceType::DEFAULT_TRACER; + + static const std::map< std::string, TraceType > s_stringToTracerMap; + [[nodiscard]] static TraceOptions make( Json::Value const& _json ); +}; + +} // namespace dev::eth diff --git a/libhistoric/TracePrinter.cpp b/libhistoric/TracePrinter.cpp new file mode 100644 index 000000000..08471f1df --- /dev/null +++ b/libhistoric/TracePrinter.cpp @@ -0,0 +1,98 @@ +/* +Copyright (C) 2023-present, SKALE Labs + +This file is part of skaled. + +skaled 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. + +skaled 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 skaled. If not, see . +*/ + +#ifdef HISTORIC_STATE + +#include "FunctionCallRecord.h" +#include "NoopTracePrinter.h" +#include "TraceStructuresAndDefs.h" + +namespace dev::eth { + +// we try to be compatible with geth messages as much as we can +string TracePrinter::getEvmErrorDescription( evmc_status_code _error ) { + // this function should not be called if the status code is success + STATE_CHECK( _error != EVMC_SUCCESS ); + switch ( _error ) { + case EVMC_FAILURE: + return "evm failure"; + case EVMC_REVERT: + return "execution reverted"; + case EVMC_OUT_OF_GAS: + return "out of gas"; + case EVMC_INVALID_INSTRUCTION: + return "invalid instruction"; + case EVMC_UNDEFINED_INSTRUCTION: + return "undefined instruction"; + case EVMC_STACK_OVERFLOW: + return "stack overflow"; + case EVMC_STACK_UNDERFLOW: + return "stack underflow"; + case EVMC_BAD_JUMP_DESTINATION: + return "invalid jump"; + case EVMC_INVALID_MEMORY_ACCESS: + return "invalid memory access"; + case EVMC_CALL_DEPTH_EXCEEDED: + return "call depth exceeded"; + case EVMC_STATIC_MODE_VIOLATION: + return "static mode violation"; + case EVMC_PRECOMPILE_FAILURE: + return "precompile failure"; + case EVMC_CONTRACT_VALIDATION_FAILURE: + return "contract validation failure"; + case EVMC_ARGUMENT_OUT_OF_RANGE: + return "argument out of range"; + case EVMC_INTERNAL_ERROR: + return "internal error"; + case EVMC_REJECTED: + return "evm rejected"; + case EVMC_OUT_OF_MEMORY: + return "out of memory"; + default: + return "unexpected EVM error status code"; + }; +} + +TracePrinter::TracePrinter( AlethStandardTrace& _standardTrace, const string _jsonName ) + : m_trace( _standardTrace ), m_jsonName( _jsonName ) {} + +const string& TracePrinter::getJsonName() const { + return m_jsonName; +} + + +// this will return true if the contract existed before the transaction happened +bool TracePrinter::isPreExistingContract( + const HistoricState& _statePre, const Address& _address ) { + return _statePre.addressHasCode( _address ); +} + + +// this will return true if the address is a contract that has been created +// during the current transaction and has not been deleted +bool TracePrinter::isNewContract( + const HistoricState& _statePre, const HistoricState& _statePost, const Address& _address ) { + auto isNewContract = + !_statePre.addressHasCode( _address ) && _statePost.addressHasCode( _address ); + return isNewContract; +} + +} // namespace dev::eth + +#endif \ No newline at end of file diff --git a/libhistoric/TracePrinter.h b/libhistoric/TracePrinter.h new file mode 100644 index 000000000..e9c6d1018 --- /dev/null +++ b/libhistoric/TracePrinter.h @@ -0,0 +1,58 @@ +/* +Copyright (C) 2023-present, SKALE Labs + +This file is part of skaled. + +skaled 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. + +skaled 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 skaled. If not, see . +*/ + +#pragma once + +#include "TraceStructuresAndDefs.h" +#include "evmc/evmc.h" +#include "libdevcore/Address.h" +#include + +namespace Json { +class Value; +} + +namespace dev::eth { + +struct ExecutionResult; +class HistoricState; +class AlethStandardTrace; + +class TracePrinter { +public: + TracePrinter( AlethStandardTrace& _standardTrace, const std::string jsonName ); + + virtual void print( Json::Value& _jsonTrace, const ExecutionResult&, const HistoricState&, + const HistoricState& ) = 0; + + [[nodiscard]] const std::string& getJsonName() const; + + static std::string getEvmErrorDescription( evmc_status_code _error ); + +protected: + [[nodiscard]] static bool isNewContract( + const HistoricState& _statePre, const HistoricState& _statePost, const Address& _address ); + + [[nodiscard]] static bool isPreExistingContract( + const HistoricState& _statePre, const Address& _address ); + + AlethStandardTrace& m_trace; + const std::string m_jsonName; +}; +} // namespace dev::eth diff --git a/libhistoric/TraceStructuresAndDefs.h b/libhistoric/TraceStructuresAndDefs.h new file mode 100644 index 000000000..4ab241c43 --- /dev/null +++ b/libhistoric/TraceStructuresAndDefs.h @@ -0,0 +1,80 @@ +/* +Copyright (C) 2023-present, SKALE Labs + +This file is part of skaled. + +skaled 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. + +skaled 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 skaled. If not, see . +*/ + + +#pragma once + +#include "libdevcore/Common.h" +#include "libevm/Instruction.h" + + +// we limit the memory and storage entries returned to avoid +// denial of service attack. +// see here https://banteg.mirror.xyz/3dbuIlaHh30IPITWzfT1MFfSg6fxSssMqJ7TcjaWecM + +constexpr std::uint64_t MAX_MEMORY_VALUES_RETURNED = 1024; +constexpr std::uint64_t MAX_STORAGE_VALUES_RETURNED = 1024; +constexpr std::int64_t MAX_TRACE_DEPTH = 256; + + +#define STATE_CHECK( _EXPRESSION_ ) \ + if ( !( _EXPRESSION_ ) ) { \ + auto __msg__ = std::string( "State check failed::" ) + #_EXPRESSION_ + " " + \ + std::string( __FILE__ ) + ":" + to_string( __LINE__ ); \ + throw dev::eth::VMTracingError( __msg__ ); \ + } + + +namespace dev::eth { + +using std::string, std::shared_ptr, std::make_shared, std::to_string, std::set, std::map, + std::vector; + +struct LogRecord { + LogRecord( const std::vector< std::uint8_t >& _data, const std::vector< dev::u256 >& _topics ) + : m_data( _data ), m_topics( _topics ) {} + + const std::vector< std::uint8_t > m_data; + const std::vector< dev::u256 > m_topics; +}; + +struct OpExecutionRecord { + OpExecutionRecord( int64_t _depth, Instruction _op, uint64_t _gasRemaining, uint64_t _opGas, + uint64_t _pc, int64_t _refund, string _opName ) + : m_depth( _depth ), + m_op( _op ), + m_gasRemaining( _gasRemaining ), + m_opGas( _opGas ), + m_pc( _pc ), + m_refund( _refund ), + m_opName( _opName ) {} + + std::int64_t m_depth; + Instruction m_op; + std::uint64_t m_gasRemaining; + std::uint64_t m_opGas; + std::uint64_t m_pc; + std::int64_t m_refund; + std::string m_opName; + std::shared_ptr< std::map< dev::u256, dev::u256 > > m_accessedStorageValues = nullptr; + std::shared_ptr< u256s > m_stack = nullptr; + std::shared_ptr< bytes > m_memory = nullptr; +}; + +} // namespace dev::eth diff --git a/libskale-interpreter/VMConfig.h b/libskale-interpreter/VMConfig.h index 98431a0e2..48bf5a85d 100644 --- a/libskale-interpreter/VMConfig.h +++ b/libskale-interpreter/VMConfig.h @@ -53,7 +53,12 @@ namespace eth { #endif #if EVM_OPTIMIZE #define EVM_REPLACE_CONST_JUMP true +// We do not optimize constant pool on +// historic nodes because it introduces a non-standard instruction PUSHC +// which leads to non-geth-compatibe traces +#ifndef HISTORIC_STATE #define EVM_USE_CONSTANT_POOL true +#endif #define EVM_DO_FIRST_PASS_OPTIMIZATION ( EVM_REPLACE_CONST_JUMP || EVM_USE_CONSTANT_POOL ) #endif diff --git a/libskale/CMakeLists.txt b/libskale/CMakeLists.txt index 59f08faa3..f05274265 100644 --- a/libskale/CMakeLists.txt +++ b/libskale/CMakeLists.txt @@ -51,7 +51,7 @@ target_include_directories( skale PUBLIC ${CMAKE_SOURCE_DIR}/libconsensus/jsoncpp/include ) #target_link_libraries(skale PUBLIC evm ethcore p2p devcrypto devcore ethereum PRIVATE jsoncpp Snappy::snappy Boost::fiber Boost::context) -target_link_libraries(skale PUBLIC ethereum web3jsonrpc skutils +target_link_libraries(skale PRIVATE ethereum web3jsonrpc historic skutils "${DEPS_INSTALL_ROOT}/lib/libzmq.a" "${DEPS_INSTALL_ROOT}/lib/libsodium.a" bls diff --git a/libskale/SkipInvalidTransactionsPatch.h b/libskale/SkipInvalidTransactionsPatch.h index 5f450fd20..558c9261b 100644 --- a/libskale/SkipInvalidTransactionsPatch.h +++ b/libskale/SkipInvalidTransactionsPatch.h @@ -2,7 +2,7 @@ #define SKIPINVALIDTRANSACTIONSPATCH_H #include -#include +#include #include #include #include diff --git a/libskale/State.cpp b/libskale/State.cpp index 7d5e996c4..405eb2c69 100644 --- a/libskale/State.cpp +++ b/libskale/State.cpp @@ -1031,8 +1031,7 @@ std::pair< ExecutionResult, TransactionReceipt > State::execute( EnvInfo const& strRevertReason = skutils::eth::call_error_message_2_str( res.output ); if ( strRevertReason.empty() ) strRevertReason = "EVM revert instruction without description message"; - std::string strOut = cc::fatal( "Error message from eth_call():" ) + cc::error( " " ) + - cc::warn( strRevertReason ); + std::string strOut = "Error message from State::execute(): " + strRevertReason; cerror << strOut; } diff --git a/libskale/httpserveroverride.cpp b/libskale/httpserveroverride.cpp index 80de3753c..be29eecef 100644 --- a/libskale/httpserveroverride.cpp +++ b/libskale/httpserveroverride.cpp @@ -60,7 +60,6 @@ #include #include #include -#include #include #include @@ -71,8 +70,6 @@ #include -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #if INT_MAX == 32767 // 16 bits @@ -271,9 +268,6 @@ bool checkParamsIsObject( const char* strMethodName, const rapidjson::Document& }; // namespace skale -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - namespace stats { typedef skutils::multithreading::recursive_mutex_type mutex_type_stats; @@ -512,8 +506,6 @@ static nlohmann::json generate_subsystem_stats( const char* strSubSystem ) { }; // namespace stats -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// const char* esm2str( e_server_mode_t esm ) { switch ( esm ) { @@ -525,8 +517,6 @@ const char* esm2str( e_server_mode_t esm ) { } } -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// SkaleStatsSubscriptionManager::SkaleStatsSubscriptionManager() : next_subscription_( 1 ) {} SkaleStatsSubscriptionManager::~SkaleStatsSubscriptionManager() { @@ -673,8 +663,6 @@ void SkaleStatsSubscriptionManager::unsubscribeAll() { } } -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// SkaleServerConnectionsTrackHelper::SkaleServerConnectionsTrackHelper( SkaleServerOverride& sso ) : m_sso( sso ) { @@ -685,8 +673,6 @@ SkaleServerConnectionsTrackHelper::~SkaleServerConnectionsTrackHelper() { m_sso.connection_counter_dec(); } -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// SkaleWsPeer::SkaleWsPeer( skutils::ws::server& srv, const skutils::ws::hdl_t& hdl ) : skutils::ws::peer( srv, hdl ), @@ -845,7 +831,6 @@ void SkaleWsPeer::onMessage( const std::string& msg, skutils::ws::opcv eOpCode ) stats::register_stats_exception( ( std::string( "RPC/" ) + pThis->getRelay().nfoGetSchemeUC() ).c_str(), "messages" ); stats::register_stats_exception( pThis->getRelay().nfoGetSchemeUC().c_str(), "messages" ); - // stats::register_stats_exception( "RPC", strMethod.c_str() ); pThis.get_unconst()->sendMessage( skutils::tools::trim_copy( strResponse ) ); stats::register_stats_answer( pThis->getRelay().nfoGetSchemeUC().c_str(), "messages", strResponse.size() ); @@ -1041,7 +1026,6 @@ void SkaleWsPeer::onMessage( const std::string& msg, skutils::ws::opcv eOpCode ) } }; // WS-processing-lambda skutils::dispatch::async( pThis->m_strPeerQueueID, fnAsyncMessageHandler ); - // skutils::ws::peer::onMessage( msg, eOpCode ); } void SkaleWsPeer::onClose( @@ -1314,8 +1298,6 @@ void SkaleWsPeer::eth_subscribe_logs( << ( pThis->desc() + cc::ws_tx( " <<< " ) + pThis->implPreformatTrafficJsonMessage( strNotification, false ) ); - // skutils::dispatch::async( pThis->m_strPeerQueueID, - // [pThis, strNotification]() -> void { bool bMessageSentOK = false; try { bMessageSentOK = const_cast< SkaleWsPeer* >( pThis.get() ) @@ -1433,8 +1415,6 @@ void SkaleWsPeer::eth_subscribe_newPendingTransactions( " <<< " + pThis->getRelay().nfoGetSchemeUC() + "/TX <<< " ) + pThis->desc() + cc::ws_tx( " <<< " ) + pThis->implPreformatTrafficJsonMessage( strNotification, false ) ); - // skutils::dispatch::async( pThis->m_strPeerQueueID, [pThis, strNotification]() -> - // void { bool bMessageSentOK = false; try { bMessageSentOK = @@ -1846,8 +1826,6 @@ std::string SkaleWsPeer::implPreformatTrafficJsonMessage( return cc::j( jo2 ); } -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// SkaleRelayWS::SkaleRelayWS( int ipVer, const char* strBindAddr, const char* strScheme, // "ws" or "wss" @@ -2001,37 +1979,6 @@ dev::eth::Interface* SkaleRelayWS::ethereum() const { return pSO->ethereum(); } -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* -SkaleRelayMiniHTTP::SkaleRelayMiniHTTP( SkaleServerOverride* pSO, int ipVer, - const char* strBindAddr, int nPort, const char* cert_path, const char* private_key_path, - const char*, // ca_path - int nServerIndex, size_t a_max_http_handler_queues, - bool is_async_http_transfer_mode ) - : SkaleServerHelper( nServerIndex ), - m_pSO( pSO ), - ipVer_( ipVer ), - strBindAddr_( strBindAddr ), - nPort_( nPort ), - m_bHelperIsSSL( ( cert_path && cert_path[0] && private_key_path && private_key_path[0] ) ? - true : - false ) { - if ( m_bHelperIsSSL ) - m_pServer.reset( new skutils::http::SSL_server( - cert_path, private_key_path, a_max_http_handler_queues, is_async_http_transfer_mode ) ); - else - m_pServer.reset( - new skutils::http::server( a_max_http_handler_queues, is_async_http_transfer_mode ) ); - m_pServer->ipVer_ = ipVer_; // not known before listen -} - -SkaleRelayMiniHTTP::~SkaleRelayMiniHTTP() { - m_pServer.reset(); -} -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// SkaleRelayProxygenHTTP::SkaleRelayProxygenHTTP( SkaleServerOverride* pSO, int ipVer, const char* strBindAddr, int nPort, const char* cert_path, const char* private_key_path, @@ -2066,8 +2013,6 @@ bool SkaleRelayProxygenHTTP::is_running() const { void SkaleRelayProxygenHTTP::stop() {} -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// const double SkaleServerOverride::g_lfDefaultExecutionDurationMaxForPerformanceWarning = 1.0; // in seconds, default 1 second @@ -2379,28 +2324,23 @@ skutils::result_of_http_request SkaleServerOverride::implHandleHttpRequest( jarrRequest = nlohmann::json::array(); jarrRequest.push_back( joIn ); } - for ( const nlohmann::json& joRequest : jarrRequest ) { - std::string strMethodWalk = - skutils::tools::getFieldSafe< std::string >( joRequest, "method" ); - if ( strMethodWalk.empty() ) + for ( const nlohmann::json& jsonRpcRequest : jarrRequest ) { + std::string methodName = + skutils::tools::getFieldSafe< std::string >( jsonRpcRequest, "method" ); + if ( methodName.empty() ) throw std::runtime_error( "Bad JSON RPC request, \"method\" name is missing" ); - strMethod = strMethodWalk; - if ( joRequest.count( "id" ) == 0 ) + + strMethod = methodName; + if ( jsonRpcRequest.count( "id" ) == 0 ) throw std::runtime_error( "Bad JSON RPC request, \"id\" name is missing" ); - joID = joRequest["id"]; - } // for( const nlohmann::json & joRequest : jarrRequest ) + joID = jsonRpcRequest["id"]; + } if ( isBatch ) { size_t cntInBatch = jarrRequest.size(); if ( cntInBatch > maxCountInBatchJsonRpcRequest_ ) throw std::runtime_error( "Bad JSON RPC request, too much requests in batch" ); } } catch ( ... ) { - // if ( strMethod.empty() ) { - // if ( isBatch ) - // strMethod = "batch_json_rpc_request"; - // else - // strMethod = "unknown_json_rpc_method"; - // } std::string e = "Bad JSON RPC request: " + joIn.dump(); throw std::runtime_error( e ); } @@ -2575,143 +2515,6 @@ skutils::result_of_http_request SkaleServerOverride::implHandleHttpRequest( return rslt; } -/* -bool SkaleServerOverride::implStartListening( // mini HTTP - std::shared_ptr< SkaleRelayMiniHTTP >& pSrv, int ipVer, const std::string& strAddr, int nPort, - const std::string& strPathSslKey, const std::string& strPathSslCert, - const std::string& strPathSslCA, int nServerIndex, e_server_mode_t esm, - size_t a_max_http_handler_queues, bool is_async_http_transfer_mode ) { - bool bIsSSL = false; - SkaleServerOverride* pSO = this; - if ( ( !strPathSslKey.empty() ) && ( !strPathSslCert.empty() ) ) - bIsSSL = true; - try { - implStopListening( pSrv, ipVer, bIsSSL, esm ); - if ( strAddr.empty() || nPort <= 0 ) - return true; - logTraceServerEvent( false, ipVer, bIsSSL ? "HTTPS" : "HTTP", -1, esm, - cc::debug( "starting " ) + cc::attention( "mini" ) + cc::debug( "/" ) + - cc::info( bIsSSL ? "HTTPS" : "HTTP" ) + cc::debug( "/" ) + - cc::num10( nServerIndex ) + cc::debug( "/" ) + cc::notice( esm2str( esm ) ) + - cc::debug( " server on address " ) + cc::info( strAddr ) + - cc::debug( " and port " ) + cc::c( nPort ) + cc::debug( "..." ) ); - if ( bIsSSL ) - pSrv.reset( new SkaleRelayMiniHTTP( pSO, ipVer, strAddr.c_str(), nPort, - strPathSslCert.c_str(), strPathSslKey.c_str(), strPathSslCA.c_str(), nServerIndex, - a_max_http_handler_queues, is_async_http_transfer_mode ) ); - else - pSrv.reset( new SkaleRelayMiniHTTP( pSO, ipVer, strAddr.c_str(), nPort, nullptr, - nullptr, nullptr, nServerIndex, a_max_http_handler_queues, - is_async_http_transfer_mode ) ); - pSrv->m_pServer->Options( - "/", [=]( const skutils::http::request& req, skutils::http::response& res ) { - stats::register_stats_message( - bIsSSL ? "HTTPS" : "HTTP", "query options", req.body_.size() ); - if ( opts_.isTraceCalls_ ) - logTraceServerTraffic( true, dev::VerbosityTrace, ipVer, - bIsSSL ? "HTTPS" : "HTTP", nServerIndex, esm, req.origin_.c_str(), - cc::info( "OPTTIONS" ) + cc::debug( " request handler" ) ); - res.set_header( "access-control-allow-headers", "Content-Type" ); - res.set_header( "access-control-allow-methods", "POST" ); - res.set_header( "access-control-allow-origin", "*" ); - res.set_header( "content-length", "0" ); - res.set_header( "vary", - "Origin, Access-Control-request-Method, Access-Control-request-Headers" ); - stats::register_stats_answer( - bIsSSL ? "HTTPS" : "HTTP", "query options", res.body_.size() ); - } ); - pSrv->m_pServer->Post( "/", [=, &pSrv]( const skutils::http::request& req, - skutils::http::response& res ) { - nlohmann::json joID = "-1"; - try { - if ( isShutdownMode() ) - throw std::runtime_error( "query was cancelled due to server shutdown mode" ); - nlohmann::json joIn = nlohmann::json::parse( req.body_ ); - if ( joIn.count( "id" ) > 0 ) - joID = joIn["id"]; - skutils::result_of_http_request rslt = implHandleHttpRequest( - joIn, bIsSSL ? "HTTPS" : "HTTP", nServerIndex, req.origin_, ipVer, nPort, esm ); - res.set_header( "access-control-allow-origin", "*" ); - res.set_header( "vary", "Origin" ); - if ( rslt.isBinary_ ) { - res.set_content( ( char* ) rslt.vecBytes_.data(), rslt.vecBytes_.size(), - "application/octet-stream" ); - } else { - std::string strOut = rslt.joOut_.dump(); - res.set_content( - ( char* ) strOut.c_str(), strOut.size(), "application/octet-stream" ); - } - return true; - } catch ( const std::exception& ex ) { - logTraceServerTraffic( false, dev::VerbosityError, ipVer, bIsSSL ? "HTTPS" : "HTTP", - nServerIndex, esm, req.origin_.c_str(), cc::warn( ex.what() ) ); - nlohmann::json joErrorResponce; - joErrorResponce["id"] = joID; - joErrorResponce["result"] = "error"; - joErrorResponce["error"] = std::string( ex.what() ); - std::string strOut = joErrorResponce.dump(); - stats::register_stats_exception( bIsSSL ? "HTTPS" : "HTTP", "POST" ); - res.set_header( "access-control-allow-origin", "*" ); - res.set_header( "vary", "Origin" ); - res.set_content( - ( char* ) strOut.c_str(), strOut.size(), "application/octet-stream" ); - return true; - } catch ( ... ) { - const char* e = "unknown exception in SkaleServerOverride"; - logTraceServerTraffic( false, dev::VerbosityError, ipVer, bIsSSL ? "HTTPS" : "HTTP", - nServerIndex, esm, req.origin_.c_str(), cc::warn( e ) ); - nlohmann::json joErrorResponce; - joErrorResponce["id"] = joID; - joErrorResponce["result"] = "error"; - joErrorResponce["error"] = std::string( e ); - std::string strOut = joErrorResponce.dump(); - stats::register_stats_exception( bIsSSL ? "HTTPS" : "HTTP", "POST" ); - res.set_header( "access-control-allow-origin", "*" ); - res.set_header( "vary", "Origin" ); - res.set_content( - ( char* ) strOut.c_str(), strOut.size(), "application/octet-stream" ); - return true; - } - } ); - // check if somebody is already listening - stat_check_port_availability_for_server_to_start_listen( - ipVer, strAddr.c_str(), nPort, esm, bIsSSL ? "HTTPS" : "HTTP", nServerIndex, this ); - // make server listen in its dedicated thread - std::thread( [=]() { - skutils::multithreading::threadNameAppender tn( - "/" + std::string( bIsSSL ? "HTTPS" : "HTTP" ) + "-listener" ); - if ( !pSrv->m_pServer->listen( ipVer, strAddr.c_str(), nPort ) ) { - stats::register_stats_error( bIsSSL ? "HTTPS" : "HTTP", "LISTEN" ); - return; - } - stats::register_stats_message( bIsSSL ? "HTTPS" : "HTTP", "LISTEN" ); - } ) - .detach(); - logTraceServerEvent( false, ipVer, bIsSSL ? "HTTPS" : "HTTP", nServerIndex, esm, - cc::success( "OK, started " ) + cc::attention( "mini" ) + cc::debug( "/" ) + - cc::info( bIsSSL ? "HTTPS" : "HTTP" ) + cc::debug( "/" ) + - cc::num10( nServerIndex ) + cc::success( " server on address " ) + - cc::info( strAddr ) + cc::success( " and port " ) + cc::c( nPort ) + - cc::success( "/" ) + cc::notice( esm2str( esm ) ) + " " ); - return true; - } catch ( const std::exception& ex ) { - logTraceServerEvent( false, ipVer, bIsSSL ? "HTTPS" : "HTTP", nServerIndex, esm, - cc::fatal( "FAILED" ) + cc::error( " to start " ) + cc::attention( "mini" ) + - cc::debug( "/" ) + cc::warn( bIsSSL ? "HTTPS" : "HTTP" ) + - cc::error( " server: " ) + cc::warn( ex.what() ) ); - } catch ( ... ) { - logTraceServerEvent( false, ipVer, bIsSSL ? "HTTPS" : "HTTP", nServerIndex, esm, - cc::fatal( "FAILED" ) + cc::error( " to start " ) + cc::attention( "mini" ) + - cc::debug( "/" ) + cc::warn( bIsSSL ? "HTTPS" : "HTTP" ) + - cc::error( " server: " ) + cc::warn( "unknown exception" ) ); - } - try { - implStopListening( pSrv, ipVer, bIsSSL, esm ); - } catch ( ... ) { - } - return false; -} -*/ bool SkaleServerOverride::implStartListening( // web socket std::shared_ptr< SkaleRelayWS >& pSrv, int ipVer, const std::string& strAddr, int nPort, @@ -2823,43 +2626,6 @@ bool SkaleServerOverride::implStartListening( // proxygen HTTP return false; } -/* -bool SkaleServerOverride::implStopListening( // mini HTTP - std::shared_ptr< SkaleRelayMiniHTTP >& pSrv, int ipVer, bool bIsSSL, e_server_mode_t esm ) { - try { - if ( !pSrv ) - return true; - const net_bind_opts_t& bo = ( esm == e_server_mode_t::esm_standard ) ? - opts_.netOpts_.bindOptsStandard_ : - opts_.netOpts_.bindOptsInformational_; - int nServerIndex = pSrv->serverIndex(); - std::string strAddr = ( ipVer == 4 ) ? - ( bIsSSL ? bo.strAddrMiniHTTPS4_ : bo.strAddrMiniHTTP4_ ) : - ( bIsSSL ? bo.strAddrMiniHTTPS6_ : bo.strAddrMiniHTTP6_ ); - int nPort = - ( ( ipVer == 4 ) ? ( bIsSSL ? bo.nBasePortMiniHTTPS4_ : bo.nBasePortMiniHTTP4_ ) : - ( bIsSSL ? bo.nBasePortMiniHTTPS6_ : bo.nBasePortMiniHTTP6_ ) ) + - nServerIndex; - logTraceServerEvent( false, ipVer, bIsSSL ? "HTTPS" : "HTTP", nServerIndex, esm, - cc::notice( "Will stop " ) + cc::attention( "mini" ) + cc::debug( "/" ) + - cc::info( bIsSSL ? "HTTPS" : "HTTP" ) + cc::notice( " server on address " ) + - cc::info( strAddr ) + cc::success( " and port " ) + cc::c( nPort ) + - cc::debug( "/" ) + cc::notice( esm2str( esm ) ) + cc::notice( "..." ) ); - if ( pSrv->m_pServer && pSrv->m_pServer->is_running() ) { - pSrv->m_pServer->stop(); - stats::register_stats_message( bIsSSL ? "HTTPS" : "HTTP", "STOP" ); - } - pSrv.reset(); - logTraceServerEvent( false, ipVer, bIsSSL ? "HTTPS" : "HTTP", nServerIndex, esm, - cc::success( "OK, stopped " ) + cc::attention( "mini" ) + cc::debug( "/" ) + - cc::info( bIsSSL ? "HTTPS" : "HTTP" ) + cc::success( " server on address " ) + - cc::info( strAddr ) + cc::success( " and port " ) + cc::c( nPort ) + - cc::debug( "/" ) + cc::notice( esm2str( esm ) ) ); - } catch ( ... ) { - } - return true; -} -*/ bool SkaleServerOverride::implStopListening( // web socket std::shared_ptr< SkaleRelayWS >& pSrv, int ipVer, bool bIsSSL, e_server_mode_t esm ) { @@ -2933,78 +2699,7 @@ bool SkaleServerOverride::StartListening( e_server_mode_t esm ) { opts_.netOpts_.bindOptsStandard_ : opts_.netOpts_.bindOptsInformational_; size_t nServerIndex; - // - // - // std::list< std::shared_ptr< SkaleRelayMiniHTTP > >& serversMiniHTTP4 = - // ( esm == e_server_mode_t::esm_standard ) ? serversMiniHTTP4std_ : - // serversMiniHTTP4nfo_; - // if ( 0 <= bo.nBasePortMiniHTTP4_ && bo.nBasePortMiniHTTP4_ <= 65535 ) { - // for ( nServerIndex = 0; nServerIndex < bo.cntServers_; ++nServerIndex ) { - // std::shared_ptr< SkaleRelayMiniHTTP > pServer; - // if ( !implStartListening( // mini HTTP - // pServer, 4, bo.strAddrMiniHTTP4_, bo.nBasePortMiniHTTP4_ + nServerIndex, - // "", - // "", "", nServerIndex, esm, max_http_handler_queues_, - // is_async_http_transfer_mode_ ) ) - // return false; - // serversMiniHTTP4.push_back( pServer ); - // } - // } - // std::list< std::shared_ptr< SkaleRelayMiniHTTP > >& serversMiniHTTP6 = - // ( esm == e_server_mode_t::esm_standard ) ? serversMiniHTTP6std_ : - // serversMiniHTTP6nfo_; - // if ( 0 <= bo.nBasePortMiniHTTP6_ && bo.nBasePortMiniHTTP6_ <= 65535 ) { - // for ( nServerIndex = 0; nServerIndex < bo.cntServers_; ++nServerIndex ) { - // std::shared_ptr< SkaleRelayMiniHTTP > pServer; - // if ( !implStartListening( // mini HTTP - // pServer, 6, bo.strAddrMiniHTTP6_, bo.nBasePortMiniHTTP6_ + nServerIndex, - // "", - // "", "", nServerIndex, esm, max_http_handler_queues_, - // is_async_http_transfer_mode_ ) ) - // return false; - // serversMiniHTTP6.push_back( pServer ); - // } - // } - // std::list< std::shared_ptr< SkaleRelayMiniHTTP > >& serversMiniHTTPS4 = - // ( esm == e_server_mode_t::esm_standard ) ? serversMiniHTTPS4std_ : - // serversMiniHTTPS4nfo_; - // if ( 0 <= bo.nBasePortMiniHTTPS4_ && bo.nBasePortMiniHTTPS4_ <= 65535 && - // ( !opts_.netOpts_.strPathSslKey_.empty() ) && - // ( !opts_.netOpts_.strPathSslCert_.empty() ) && - // bo.nBasePortMiniHTTPS4_ != bo.nBasePortMiniHTTP4_ ) { - // for ( nServerIndex = 0; nServerIndex < bo.cntServers_; ++nServerIndex ) { - // std::shared_ptr< SkaleRelayMiniHTTP > pServer; - // if ( !implStartListening( // mini HTTP - // pServer, 4, bo.strAddrMiniHTTPS4_, bo.nBasePortMiniHTTPS4_ + - // nServerIndex, opts_.netOpts_.strPathSslKey_, - // opts_.netOpts_.strPathSslCert_, opts_.netOpts_.strPathSslCA_, - // nServerIndex, esm, max_http_handler_queues_, is_async_http_transfer_mode_ - // ) ) - // return false; - // serversMiniHTTPS4.push_back( pServer ); - // } - // } - // std::list< std::shared_ptr< SkaleRelayMiniHTTP > >& serversMiniHTTPS6 = - // ( esm == e_server_mode_t::esm_standard ) ? serversMiniHTTPS6std_ : - // serversMiniHTTPS6nfo_; - // if ( 0 <= bo.nBasePortMiniHTTPS6_ && bo.nBasePortMiniHTTPS6_ <= 65535 && - // ( !opts_.netOpts_.strPathSslKey_.empty() ) && - // ( !opts_.netOpts_.strPathSslCert_.empty() ) && - // bo.nBasePortMiniHTTPS6_ != bo.nBasePortMiniHTTP6_ ) { - // for ( nServerIndex = 0; nServerIndex < bo.cntServers_; ++nServerIndex ) { - // std::shared_ptr< SkaleRelayMiniHTTP > pServer; - // if ( !implStartListening( // mini HTTP - // pServer, 6, bo.strAddrMiniHTTPS6_, bo.nBasePortMiniHTTPS6_ + - // nServerIndex, opts_.netOpts_.strPathSslKey_, - // opts_.netOpts_.strPathSslCert_, opts_.netOpts_.strPathSslCA_, - // nServerIndex, esm, max_http_handler_queues_, is_async_http_transfer_mode_ - // ) ) - // return false; - // serversMiniHTTPS6.push_back( pServer ); - // } - // } - // - // + std::list< std::shared_ptr< SkaleRelayWS > >& serversWS4 = ( esm == e_server_mode_t::esm_standard ) ? serversWS4std_ : serversWS4nfo_; if ( 0 <= bo.nBasePortWS4_ && bo.nBasePortWS4_ <= 65535 && @@ -3185,9 +2880,6 @@ bool SkaleServerOverride::StartListening() { skutils::url u( strOrigin ); std::string strSchemeUC = skutils::tools::to_upper( skutils::tools::trim_copy( u.scheme() ) ); - // std::string strAddress = skutils::tools::to_upper( skutils::tools::trim_copy( - // u.host() ) ); int ipVer = ( skutils::is_ipv6( strClientAddress ) && - // skutils::is_valid_ipv6( strClientAddress ) ) ? 6 : 4; std::string strPort = skutils::tools::trim_copy( u.port() ); int nPort = 0; if ( strPort.empty() ) { @@ -3223,44 +2915,7 @@ bool SkaleServerOverride::StopListening( e_server_mode_t esm ) { skutils::http_pg::pg_stop( hProxygenServer_ ); hProxygenServer_ = nullptr; } - // - // - // - // - // std::list< std::shared_ptr< SkaleRelayMiniHTTP > >& serversMiniHTTP4 = - // ( esm == e_server_mode_t::esm_standard ) ? serversMiniHTTP4std_ : - // serversMiniHTTP4nfo_; - // for ( auto pServer : serversMiniHTTP4 ) { - // if ( !implStopListening( pServer, 4, false, esm ) ) - // bRetVal = false; - // } - // serversMiniHTTP4.clear(); - // std::list< std::shared_ptr< SkaleRelayMiniHTTP > >& serversMiniHTTP6 = - // ( esm == e_server_mode_t::esm_standard ) ? serversMiniHTTP6std_ : - // serversMiniHTTP6nfo_; - // for ( auto pServer : serversMiniHTTP6 ) { - // if ( !implStopListening( pServer, 6, false, esm ) ) - // bRetVal = false; - // } - // serversMiniHTTP6.clear(); - // std::list< std::shared_ptr< SkaleRelayMiniHTTP > >& serversMiniHTTPS4 = - // ( esm == e_server_mode_t::esm_standard ) ? serversMiniHTTPS4std_ : - // serversMiniHTTPS4nfo_; - // for ( auto pServer : serversMiniHTTPS4 ) { - // if ( !implStopListening( pServer, 4, true, esm ) ) - // bRetVal = false; - // } - // serversMiniHTTPS4.clear(); - // std::list< std::shared_ptr< SkaleRelayMiniHTTP > >& serversMiniHTTPS6 = - // ( esm == e_server_mode_t::esm_standard ) ? serversMiniHTTPS6std_ : - // serversMiniHTTPS6nfo_; - // for ( auto pServer : serversMiniHTTPS6 ) { - // if ( !implStopListening( pServer, 6, true, esm ) ) - // bRetVal = false; - // } - // serversMiniHTTPS6.clear(); - // - // + std::list< std::shared_ptr< SkaleRelayWS > >& serversWS4 = ( esm == e_server_mode_t::esm_standard ) ? serversWS4std_ : serversWS4nfo_; for ( auto pServer : serversWS4 ) { @@ -3323,8 +2978,6 @@ bool SkaleServerOverride::StopListening( e_server_mode_t esm ) { bRetVal = false; } serversProxygenHTTPS6.clear(); - // - // return bRetVal; } bool SkaleServerOverride::StopListening() { @@ -3335,38 +2988,6 @@ bool SkaleServerOverride::StopListening() { return b; } -/* -int SkaleServerOverride::getServerPortStatusMiniHTTP( int ipVer, e_server_mode_t esm ) const { - const net_bind_opts_t& bo = ( esm == e_server_mode_t::esm_standard ) ? - opts_.netOpts_.bindOptsStandard_ : - opts_.netOpts_.bindOptsInformational_; - const std::list< std::shared_ptr< SkaleRelayMiniHTTP > >& serversMiniHTTP4 = - ( esm == e_server_mode_t::esm_standard ) ? serversMiniHTTP4std_ : serversMiniHTTP4nfo_; - const std::list< std::shared_ptr< SkaleRelayMiniHTTP > >& serversMiniHTTP6 = - ( esm == e_server_mode_t::esm_standard ) ? serversMiniHTTP6std_ : serversMiniHTTP6nfo_; - for ( auto pServer : ( ( ipVer == 4 ) ? serversMiniHTTP4 : serversMiniHTTP6 ) ) { - if ( pServer && pServer->m_pServer && pServer->m_pServer->is_running() ) - return ( ( ipVer == 4 ) ? bo.nBasePortMiniHTTP4_ : bo.nBasePortMiniHTTP6_ ) + - pServer->serverIndex(); - } - return -1; -} -int SkaleServerOverride::getServerPortStatusMiniHTTPS( int ipVer, e_server_mode_t esm ) const { - const net_bind_opts_t& bo = ( esm == e_server_mode_t::esm_standard ) ? - opts_.netOpts_.bindOptsStandard_ : - opts_.netOpts_.bindOptsInformational_; - const std::list< std::shared_ptr< SkaleRelayMiniHTTP > >& serversMiniHTTPS4 = - ( esm == e_server_mode_t::esm_standard ) ? serversMiniHTTPS4std_ : serversMiniHTTPS4nfo_; - const std::list< std::shared_ptr< SkaleRelayMiniHTTP > >& serversMiniHTTPS6 = - ( esm == e_server_mode_t::esm_standard ) ? serversMiniHTTPS6std_ : serversMiniHTTPS6nfo_; - for ( auto pServer : ( ( ipVer == 4 ) ? serversMiniHTTPS4 : serversMiniHTTPS6 ) ) { - if ( pServer && pServer->m_pServer && pServer->m_pServer->is_running() ) - return ( ( ipVer == 4 ) ? bo.nBasePortMiniHTTPS4_ : bo.nBasePortMiniHTTPS6_ ) + - pServer->serverIndex(); - } - return -1; -} -*/ int SkaleServerOverride::getServerPortStatusWS( int ipVer, e_server_mode_t esm ) const { const net_bind_opts_t& bo = ( esm == e_server_mode_t::esm_standard ) ? @@ -3486,13 +3107,9 @@ nlohmann::json SkaleServerOverride::provideSkaleStats() { // abstract from skutils::stats::time_tracker::queue::getQueueForSubsystem( "RPC" ).getAllStats(); joStats["executionPerformance"] = joExecutionPerformance; joStats["protocols"]["http"]["listenerCount"] = - // serversMiniHTTP4std_.size() + serversMiniHTTP4nfo_.size() + - // serversMiniHTTP6std_.size() + serversMiniHTTP6nfo_.size() + serversProxygenHTTP4std_.size() + serversProxygenHTTP4nfo_.size() + serversProxygenHTTP6std_.size() + serversProxygenHTTP6nfo_.size(); joStats["protocols"]["https"]["listenerCount"] = - // serversMiniHTTPS4std_.size() + serversMiniHTTPS4nfo_.size() + - // serversMiniHTTPS6std_.size() + serversMiniHTTPS6nfo_.size() + serversProxygenHTTPS4std_.size() + serversProxygenHTTPS4nfo_.size() + serversProxygenHTTPS6std_.size() + serversProxygenHTTPS6nfo_.size(); joStats["protocols"]["wss"]["listenerCount"] = serversWSS4std_.size() + serversWSS4nfo_.size() + @@ -3658,10 +3275,6 @@ bool SkaleServerOverride::handleRequestWithBinaryAnswer( buffer.clear(); std::string strMethodName = skutils::tools::getFieldSafe< std::string >( joRequest, "method" ); if ( strMethodName == "skale_downloadSnapshotFragment" && opts_.fn_binary_snapshot_download_ ) { - // std::cout << cc::attention( "------------ " ) - // << cc::info( "skale_downloadSnapshotFragment" ) << cc::normal( " call - // with " ) - // << cc::j( joRequest ) << "\n"; const nlohmann::json& joParams = joRequest["params"]; if ( joParams.count( "isBinary" ) > 0 ) { bool isBinary = joParams["isBinary"].get< bool >(); @@ -3676,9 +3289,6 @@ bool SkaleServerOverride::handleRequestWithBinaryAnswer( bool SkaleServerOverride::handleAdminOriginFilter( const std::string& strMethod, const std::string& strOriginURL ) { - // std::cout << cc::attention( "------------ " ) << cc::info( strOriginURL ) << - // cc::attention( " - // ------------> " ) << cc::info( strMethod ) << "\n"; static const std::set< std::string > g_setAdminMethods = { "skale_getSnapshot", "skale_downloadSnapshotFragment" }; if ( g_setAdminMethods.find( strMethod ) == g_setAdminMethods.end() ) @@ -3694,8 +3304,6 @@ bool SkaleServerOverride::handleAdminOriginFilter( return true; } -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// bool SkaleServerOverride::handleProtocolSpecificRequest( const std::string& strOrigin, const rapidjson::Document& joRequest, rapidjson::Document& joResponse ) { @@ -3718,8 +3326,6 @@ const SkaleServerOverride::protocol_rpc_map_t SkaleServerOverride::g_protocol_rp { "eth_getCode", &SkaleServerOverride::eth_getCode } }; -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void SkaleServerOverride::setSchainExitTime( const std::string& strOrigin, const rapidjson::Document& joRequest, rapidjson::Document& joResponse ) { @@ -3898,10 +3504,6 @@ bool SkaleServerOverride::handleHttpSpecificRequest( const std::string& strOrigi d.SetObject(); joResponse.AddMember( "result", d, joResponse.GetAllocator() ); - // rapidjson::StringBuffer buffer; - // rapidjson::Writer< rapidjson::StringBuffer > writer( buffer ); - // joRequest.Accept( writer ); - // std::string strRequest = buffer.GetString(); rapidjson::StringBuffer bufferResponse; rapidjson::Writer< rapidjson::StringBuffer > writerResponse( bufferResponse ); @@ -4022,6 +3624,3 @@ void SkaleServerOverride::stat_transformJsonForLogOutput( nlohmann::json& jo, bo } } } - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/libskale/httpserveroverride.h b/libskale/httpserveroverride.h index 670a61027..0cce6a132 100644 --- a/libskale/httpserveroverride.h +++ b/libskale/httpserveroverride.h @@ -82,15 +82,11 @@ class SkaleWsPeer; class SkaleRelayWS; class SkaleServerOverride; -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// enum class e_server_mode_t { esm_standard, esm_informational }; extern const char* esm2str( e_server_mode_t esm ); -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class SkaleStatsSubscriptionManager { public: @@ -123,8 +119,6 @@ class SkaleStatsSubscriptionManager { virtual SkaleServerOverride& getSSO() = 0; }; // class SkaleStatsSubscriptionManager -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// struct SkaleServerConnectionsTrackHelper { SkaleServerOverride& m_sso; @@ -132,8 +126,6 @@ struct SkaleServerConnectionsTrackHelper { ~SkaleServerConnectionsTrackHelper(); }; /// struct SkaleServerConnectionsTrackHelper -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class SkaleWsPeer : public skutils::ws::peer { public: @@ -206,8 +198,6 @@ class SkaleWsPeer : public skutils::ws::peer { std::string implPreformatTrafficJsonMessage( const nlohmann::json& jo, bool isRequest ) const; }; /// class SkaleWsPeer -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class SkaleServerHelper { protected: @@ -219,8 +209,6 @@ class SkaleServerHelper { int serverIndex() const { return m_nServerIndex; } }; /// class SkaleServerHelper -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class SkaleRelayWS : public skutils::ws::server, public SkaleServerHelper { protected: @@ -267,36 +255,10 @@ class SkaleRelayWS : public skutils::ws::server, public SkaleServerHelper { friend class SkaleWsPeer; }; /// class SkaleRelayWS -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/* -class SkaleRelayMiniHTTP : public SkaleServerHelper { -protected: - SkaleServerOverride* m_pSO = nullptr; - -public: - int ipVer_; - std::string strBindAddr_; - int nPort_; - const bool m_bHelperIsSSL : 1; - std::shared_ptr< skutils::http::server > m_pServer; - SkaleRelayMiniHTTP( SkaleServerOverride* pSO, int ipVer, const char* strBindAddr, int nPort, - const char* cert_path = nullptr, const char* private_key_path = nullptr, - const char* ca_path = nullptr, int nServerIndex = -1, - size_t a_max_http_handler_queues = __SKUTILS_HTTP_DEFAULT_MAX_PARALLEL_QUEUES_COUNT__, - bool is_async_http_transfer_mode = true ); - ~SkaleRelayMiniHTTP() override; - SkaleServerOverride* pso() { return m_pSO; } - const SkaleServerOverride* pso() const { return m_pSO; } -}; /// class SkaleRelayMiniHTTP -*/ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class SkaleRelayProxygenHTTP : public SkaleServerHelper { protected: SkaleServerOverride* m_pSO = nullptr; - // skutils::http_pg::wrapped_proxygen_server_handle hProxygenServer_ = nullptr; public: int ipVer_; @@ -317,8 +279,6 @@ class SkaleRelayProxygenHTTP : public SkaleServerHelper { void stop(); }; /// class SkaleRelayProxygenHTTP -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class SkaleServerOverride : public jsonrpc::AbstractServerConnector, public SkaleStatsSubscriptionManager, @@ -465,12 +425,6 @@ class SkaleServerOverride : public jsonrpc::AbstractServerConnector, int nPort, e_server_mode_t esm ); private: - // bool implStartListening( // mini HTTP - // std::shared_ptr< SkaleRelayMiniHTTP >& pSrv, int ipVer, const std::string& strAddr, - // int nPort, const std::string& strPathSslKey, const std::string& strPathSslCert, - // const std::string& strPathSslCA, int nServerIndex, e_server_mode_t esm, - // size_t a_max_http_handler_queues = __SKUTILS_HTTP_DEFAULT_MAX_PARALLEL_QUEUES_COUNT__, - // bool is_async_http_transfer_mode = true ); bool implStartListening( // web socket std::shared_ptr< SkaleRelayWS >& pSrv, int ipVer, const std::string& strAddr, int nPort, const std::string& strPathSslKey, const std::string& strPathSslCert, @@ -481,9 +435,6 @@ class SkaleServerOverride : public jsonrpc::AbstractServerConnector, const std::string& strPathSslCA, int nServerIndex, e_server_mode_t esm, int32_t threads = 0, int32_t threads_limit = 0 ); - // bool implStopListening( // mini HTTP - // std::shared_ptr< SkaleRelayMiniHTTP >& pSrv, int ipVer, bool bIsSSL, e_server_mode_t - // esm ); bool implStopListening( // web socket std::shared_ptr< SkaleRelayWS >& pSrv, int ipVer, bool bIsSSL, e_server_mode_t esm ); bool implStopListening( // proxygen HTTP @@ -519,10 +470,6 @@ class SkaleServerOverride : public jsonrpc::AbstractServerConnector, std::atomic_bool m_bShutdownMode = false; private: - // std::list< std::shared_ptr< SkaleRelayMiniHTTP > > serversMiniHTTP4std_, - // serversMiniHTTP6std_, - // serversMiniHTTPS4std_, serversMiniHTTPS6std_, serversMiniHTTP4nfo_, - // serversMiniHTTP6nfo_, serversMiniHTTPS4nfo_, serversMiniHTTPS6nfo_; std::list< std::shared_ptr< SkaleRelayWS > > serversWS4std_, serversWS6std_, serversWSS4std_, serversWSS6std_, serversWS4nfo_, serversWS6nfo_, serversWSS4nfo_, serversWSS6nfo_; std::list< std::shared_ptr< SkaleRelayProxygenHTTP > > serversProxygenHTTP4std_, @@ -535,9 +482,6 @@ class SkaleServerOverride : public jsonrpc::AbstractServerConnector, const std::string& strDstAddress, int nDstPort, e_server_mode_t& esm ); public: - // status API, returns running server port or -1 if server is not started - // int getServerPortStatusMiniHTTP( int ipVer, e_server_mode_t esm ) const; - // int getServerPortStatusMiniHTTPS( int ipVer, e_server_mode_t esm ) const; int getServerPortStatusWS( int ipVer, e_server_mode_t esm ) const; int getServerPortStatusWSS( int ipVer, e_server_mode_t esm ) const; int getServerPortStatusProxygenHTTP( int ipVer, e_server_mode_t esm ) const; @@ -631,13 +575,10 @@ class SkaleServerOverride : public jsonrpc::AbstractServerConnector, size_t nMaxStringValueLengthForJsonLogs, size_t nMaxStringValueLengthForTransactionParams, size_t nCallIndent = 0 ); - // friend class SkaleRelayMiniHTTP; friend class SkaleRelayProxygenHTTP; friend class SkaleRelayWS; friend class SkaleWsPeer; }; /// class SkaleServerOverride -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #endif ///(!defined __HTTP_SERVER_OVERRIDE_H) diff --git a/libweb3jsonrpc/AdminEth.cpp b/libweb3jsonrpc/AdminEth.cpp index 5a228bba5..983dcdb7c 100644 --- a/libweb3jsonrpc/AdminEth.cpp +++ b/libweb3jsonrpc/AdminEth.cpp @@ -163,7 +163,7 @@ Json::Value AdminEth::admin_eth_vmTrace( // st.setShowMnemonics(); // e.initialize(t); // if (!e.execute()) - // e.go(st.onOp()); + // e.go(st.functionToExecuteOnEachOperation()); // e.finalize(); // Json::Reader().parse(st.json(), ret); } catch ( Exception const& _e ) { diff --git a/libweb3jsonrpc/Debug.cpp b/libweb3jsonrpc/Debug.cpp index 338d6ee62..dc7de9e52 100644 --- a/libweb3jsonrpc/Debug.cpp +++ b/libweb3jsonrpc/Debug.cpp @@ -1,7 +1,8 @@ + #include "Debug.h" #include "JsonHelper.h" -#include + #include #include @@ -9,7 +10,14 @@ #include #include #include -#include +#include + + +#ifdef HISTORIC_STATE + +#include +#include +#endif using namespace std; using namespace dev; @@ -17,246 +25,277 @@ using namespace dev::rpc; using namespace dev::eth; using namespace skale; -Debug::Debug( eth::Client const& _eth, SkaleDebugInterface* _debugInterface, const string& argv ) - : m_eth( _eth ), m_debugInterface( _debugInterface ), argv_options( argv ) {} - -StandardTrace::DebugOptions dev::eth::debugOptions( Json::Value const& _json ) { - StandardTrace::DebugOptions op; - if ( !_json.isObject() || _json.empty() ) - return op; - if ( !_json["disableStorage"].empty() ) - op.disableStorage = _json["disableStorage"].asBool(); - if ( !_json["disableMemory"].empty() ) - op.disableMemory = _json["disableMemory"].asBool(); - if ( !_json["disableStack"].empty() ) - op.disableStack = _json["disableStack"].asBool(); - if ( !_json["fullStorage"].empty() ) - op.fullStorage = _json["fullStorage"].asBool(); - return op; + +#define THROW_TRACE_JSON_EXCEPTION( __MSG__ ) \ + throw jsonrpc::JsonRpcException( std::string( __FUNCTION__ ) + ":" + \ + std::to_string( __LINE__ ) + ":" + std::string( __MSG__ ) ) + + +void Debug::checkPrivilegedAccess() const { + if ( !m_enablePrivilegedApis ) { + BOOST_THROW_EXCEPTION( jsonrpc::JsonRpcException( "This API call is not enabled" ) ); + } } +void Debug::checkHistoricStateEnabled() const { +#ifndef HISTORIC_STATE + BOOST_THROW_EXCEPTION( + jsonrpc::JsonRpcException( "This API call is available on archive nodes only" ) ); +#endif +} + +Debug::Debug( eth::Client& _eth, SkaleDebugInterface* _debugInterface, const string& argv, + bool _enablePrivilegedApis ) + : m_eth( _eth ), + m_debugInterface( _debugInterface ), + m_argvOptions( argv ), + m_blockTraceCache( MAX_BLOCK_TRACES_CACHE_ITEMS, MAX_BLOCK_TRACES_CACHE_SIZE ), + m_enablePrivilegedApis( _enablePrivilegedApis ) {} + + h256 Debug::blockHash( string const& _blockNumberOrHash ) const { + checkPrivilegedAccess(); if ( isHash< h256 >( _blockNumberOrHash ) ) return h256( _blockNumberOrHash.substr( _blockNumberOrHash.size() - 64, 64 ) ); try { return m_eth.blockChain().numberHash( stoul( _blockNumberOrHash ) ); } catch ( ... ) { - throw jsonrpc::JsonRpcException( "Invalid argument" ); + THROW_TRACE_JSON_EXCEPTION( "Invalid argument" ); } } -State Debug::stateAt( std::string const& /*_blockHashOrNumber*/, int _txIndex ) const { - if ( _txIndex < 0 ) - throw jsonrpc::JsonRpcException( "Negative index" ); - - throw logic_error( "State at is not supported in Skale state" ); +Json::Value Debug::debug_traceBlockByNumber( const string& +#ifdef HISTORIC_STATE + _blockNumber +#endif + , + Json::Value const& +#ifdef HISTORIC_STATE + _jsonTraceConfig +#endif +) { + Json::Value ret; + checkHistoricStateEnabled(); +#ifdef HISTORIC_STATE + auto bN = jsToBlockNumber( _blockNumber ); - // Block block = m_eth.block(blockHash(_blockHashOrNumber)); - // auto const txCount = block.pending().size(); + if ( bN == LatestBlock || bN == PendingBlock ) { + bN = m_eth.number(); + } - // State state(State::Null); - // if (static_cast(_txIndex) < txCount) - // createIntermediateState(state, block, _txIndex, m_eth.blockChain()); - // else if (static_cast(_txIndex) == txCount) - // // the final state of block (after applying rewards) - // state = block.state(); - // else - // throw jsonrpc::JsonRpcException("Transaction index " + toString(_txIndex) + - // " out of range for block " + _blockHashOrNumber); + if ( !m_eth.isKnown( bN ) ) { + THROW_TRACE_JSON_EXCEPTION( "Unknown block number:" + _blockNumber ); + } - // return state; -} + if ( bN == 0 ) { + THROW_TRACE_JSON_EXCEPTION( "Block number must be more than zero" ); + } -Json::Value Debug::traceTransaction( - Executive& _e, Transaction const& _t, Json::Value const& _json ) { - Json::Value trace; - StandardTrace st; - st.setShowMnemonics(); - st.setOptions( debugOptions( _json ) ); - _e.initialize( _t ); - if ( !_e.execute() ) - _e.go( st.onOp() ); - _e.finalize(); - Json::Reader().parse( st.json(), trace ); - return trace; + try { + return m_eth.traceBlock( bN, _jsonTraceConfig ); + } catch ( std::exception const& _e ) { + THROW_TRACE_JSON_EXCEPTION( _e.what() ); + } catch ( ... ) { + THROW_TRACE_JSON_EXCEPTION( "Unknown server error" ); + } +#else + THROW_TRACE_JSON_EXCEPTION( "This API call is only supported on archive nodes" ); +#endif } -Json::Value Debug::traceBlock( Block const& _block, Json::Value const& _json ) { - State s( _block.state() ); - // s.setRoot(_block.stateRootBeforeTx(0)); - - Json::Value traces( Json::arrayValue ); - for ( unsigned k = 0; k < _block.pending().size(); k++ ) { - Transaction t = _block.pending()[k]; +Json::Value Debug::debug_traceBlockByHash( string const& +#ifdef HISTORIC_STATE + _blockHash +#endif + , + Json::Value const& +#ifdef HISTORIC_STATE + _jsonTraceConfig +#endif +) { + checkHistoricStateEnabled(); + +#ifdef HISTORIC_STATE + h256 h = jsToFixed< 32 >( _blockHash ); + + if ( !m_eth.isKnown( h ) ) { + THROW_TRACE_JSON_EXCEPTION( "Unknown block hash" + _blockHash ); + } - u256 const gasUsed = k ? _block.receipt( k - 1 ).cumulativeGasUsed() : 0; - auto const& bc = m_eth.blockChain(); - EnvInfo envInfo( _block.info(), m_eth.blockChain().lastBlockHashes(), - _block.previousInfo().timestamp(), gasUsed, bc.chainID() ); - // HACK 0 here is for gasPrice - Executive e( s, envInfo, m_eth.blockChain().chainParams(), 0, 0 ); + BlockNumber bN = m_eth.numberFromHash( h ); - eth::ExecutionResult er; - e.setResultRecipient( er ); - traces.append( traceTransaction( e, t, _json ) ); + if ( bN == 0 ) { + THROW_TRACE_JSON_EXCEPTION( "Block number must be more than zero" ); } - return traces; -} -Json::Value Debug::debug_traceTransaction( - string const& /*_txHash*/, Json::Value const& /*_json*/ ) { - Json::Value ret; try { - throw std::logic_error( "Historical state is not supported in Skale" ); - // Executive e(s, block, t.transactionIndex(), m_eth.blockChain()); - // e.setResultRecipient(er); - // Json::Value trace = traceTransaction(e, t, _json); - // ret["gas"] = toJS(t.gas()); - // ret["return"] = toHexPrefixed(er.output); - // ret["structLogs"] = trace; - } catch ( Exception const& _e ) { - cwarn << diagnostic_information( _e ); + return m_eth.traceBlock( bN, _jsonTraceConfig ); + } catch ( std::exception const& _e ) { + THROW_TRACE_JSON_EXCEPTION( _e.what() ); + } catch ( ... ) { + THROW_TRACE_JSON_EXCEPTION( "Unknown server error" ); } - return ret; +#else + THROW_TRACE_JSON_EXCEPTION( "This API call is only supported on archive nodes" ); +#endif } -Json::Value Debug::debug_traceBlock( string const& _blockRLP, Json::Value const& _json ) { - bytes bytes = fromHex( _blockRLP ); - BlockHeader blockHeader( bytes ); - return debug_traceBlockByHash( blockHeader.hash().hex(), _json ); -} -// TODO Make function without "block" parameter -Json::Value Debug::debug_traceBlockByHash( - string const& /*_blockHash*/, Json::Value const& _json ) { - Json::Value ret; - Block block = m_eth.latestBlock(); - ret["structLogs"] = traceBlock( block, _json ); - return ret; -} +Json::Value Debug::debug_traceTransaction( string const& +#ifdef HISTORIC_STATE + _txHashStr +#endif + , + Json::Value const& +#ifdef HISTORIC_STATE + _jsonTraceConfig +#endif +) { -// TODO Make function without "block" parameter -Json::Value Debug::debug_traceBlockByNumber( int /*_blockNumber*/, Json::Value const& _json ) { - Json::Value ret; - Block block = m_eth.latestBlock(); - ret["structLogs"] = traceBlock( block, _json ); - return ret; -} + checkHistoricStateEnabled(); +#ifdef HISTORIC_STATE + auto txHash = h256( _txHashStr ); -Json::Value Debug::debug_accountRangeAt( string const& _blockHashOrNumber, int _txIndex, - string const& /*_addressHash*/, int _maxResults ) { - Json::Value ret( Json::objectValue ); + LocalisedTransaction localisedTransaction = m_eth.localisedTransaction( txHash ); - if ( _maxResults <= 0 ) - throw jsonrpc::JsonRpcException( "Nonpositive maxResults" ); + if ( localisedTransaction.blockHash() == h256( 0 ) ) { + THROW_TRACE_JSON_EXCEPTION( + "Can't find committed transaction with this hash:" + _txHashStr ); + } - try { - State const state = stateAt( _blockHashOrNumber, _txIndex ); + auto blockNumber = localisedTransaction.blockNumber(); - throw std::logic_error( "Addresses list is not suppoted in Skale state" ); - // auto const addressMap = state.addresses(h256(_addressHash), _maxResults); - // Json::Value addressList(Json::objectValue); - // for (auto const& record : addressMap.first) - // addressList[toString(record.first)] = toString(record.second); + if ( !m_eth.isKnown( blockNumber ) ) { + THROW_TRACE_JSON_EXCEPTION( "Unknown block number:" + to_string( blockNumber ) ); + } - // ret["addressMap"] = addressList; - // ret["nextKey"] = toString(addressMap.second); - } catch ( Exception const& _e ) { - cwarn << diagnostic_information( _e ); - throw jsonrpc::JsonRpcException( jsonrpc::Errors::ERROR_RPC_INVALID_PARAMS ); + if ( blockNumber == 0 ) { + THROW_TRACE_JSON_EXCEPTION( "Block number must be more than zero" ); } - return ret; -} + try { + Json::Value tracedBlock; -Json::Value Debug::debug_storageRangeAt( string const& _blockHashOrNumber, int _txIndex, - string const& /*_address*/, string const& /*_begin*/, int _maxResults ) { - Json::Value ret( Json::objectValue ); - ret["complete"] = true; - ret["storage"] = Json::Value( Json::objectValue ); + tracedBlock = m_eth.traceBlock( blockNumber, _jsonTraceConfig ); + STATE_CHECK( tracedBlock.isArray() ) + STATE_CHECK( !tracedBlock.empty() ) - if ( _maxResults <= 0 ) - throw jsonrpc::JsonRpcException( "Nonpositive maxResults" ); - try { - State const state = stateAt( _blockHashOrNumber, _txIndex ); - - throw std::logic_error( "Obtaining of full storage is not suppoted in Skale state" ); - // map> const storage(state.storage(Address(_address))); - - // // begin is inclusive - // auto itBegin = storage.lower_bound(h256fromHex(_begin)); - // for (auto it = itBegin; it != storage.end(); ++it) - // { - // if (ret["storage"].size() == static_cast(_maxResults)) - // { - // ret["nextKey"] = toCompactHexPrefixed(it->first, 1); - // break; - // } - - // Json::Value keyValue(Json::objectValue); - // std::string hashedKey = toCompactHexPrefixed(it->first, 1); - // keyValue["key"] = toCompactHexPrefixed(it->second.first, 1); - // keyValue["value"] = toCompactHexPrefixed(it->second.second, 1); - - // ret["storage"][hashedKey] = keyValue; - // } - } catch ( Exception const& _e ) { - cwarn << diagnostic_information( _e ); - throw jsonrpc::JsonRpcException( jsonrpc::Errors::ERROR_RPC_INVALID_PARAMS ); - } + string lowerCaseTxStr = _txHashStr; + for ( auto& c : lowerCaseTxStr ) { + c = std::tolower( static_cast< unsigned char >( c ) ); + } - return ret; -} -std::string Debug::debug_preimage( std::string const& /*_hashedKey*/ ) { - throw std::logic_error( "Preimages do not exist in Skale state" ); - // h256 const hashedKey(h256fromHex(_hashedKey)); - // bytes const key = m_eth.state().lookupAux(hashedKey); + for ( Json::Value::ArrayIndex i = 0; i < tracedBlock.size(); i++ ) { + Json::Value& transactionTrace = tracedBlock[i]; + STATE_CHECK( transactionTrace.isObject() ); + STATE_CHECK( transactionTrace.isMember( "txHash" ) ); + if ( transactionTrace["txHash"] == lowerCaseTxStr ) { + STATE_CHECK( transactionTrace.isMember( "result" ) ); + return transactionTrace["result"]; + } + } + + THROW_TRACE_JSON_EXCEPTION( "Transaction not found in block" ); - // return key.empty() ? std::string() : toHexPrefixed(key); + } catch ( jsonrpc::JsonRpcException& ) { + throw; + } catch ( std::exception const& _e ) { + THROW_TRACE_JSON_EXCEPTION( _e.what() ); + } catch ( ... ) { + THROW_TRACE_JSON_EXCEPTION( "Unknown server error" ); + } +#else + BOOST_THROW_EXCEPTION( + jsonrpc::JsonRpcException( "This API call is only supported on archive nodes" ) ); +#endif } -Json::Value Debug::debug_traceCall( Json::Value const& _call, Json::Value const& _options ) { +Json::Value Debug::debug_traceCall( Json::Value const& +#ifdef HISTORIC_STATE + _call +#endif + , + std::string const& +#ifdef HISTORIC_STATE + _blockNumber +#endif + , + Json::Value const& +#ifdef HISTORIC_STATE + _jsonTraceConfig +#endif +) { + Json::Value ret; + checkHistoricStateEnabled(); + +#ifdef HISTORIC_STATE + try { - Block temp = m_eth.latestBlock(); - TransactionSkeleton ts = toTransactionSkeleton( _call ); - if ( !ts.from ) { - ts.from = Address(); + auto bN = jsToBlockNumber( _blockNumber ); + + if ( bN == LatestBlock || bN == PendingBlock ) { + bN = m_eth.number(); } - u256 nonce = temp.transactionsFrom( ts.from ); - u256 gas = ts.gas == Invalid256 ? m_eth.gasLimitRemaining() : ts.gas; - u256 gasPrice = ts.gasPrice == Invalid256 ? m_eth.gasBidPrice() : ts.gasPrice; - temp.mutableState().addBalance( ts.from, gas * gasPrice + ts.value ); - Transaction transaction( ts.value, gasPrice, gas, ts.to, ts.data, nonce ); - transaction.forceSender( ts.from ); - eth::ExecutionResult er; - // HACK 0 here is for gasPrice - Executive e( temp, m_eth.blockChain().lastBlockHashes(), 0 ); - e.setResultRecipient( er ); - Json::Value trace = traceTransaction( e, transaction, _options ); - ret["gas"] = toJS( transaction.gas() ); - ret["return"] = toHexPrefixed( er.output ); - ret["structLogs"] = trace; - } catch ( Exception const& _e ) { - cwarn << diagnostic_information( _e ); + + if ( !m_eth.isKnown( bN ) ) { + THROW_TRACE_JSON_EXCEPTION( "Unknown block number:" + _blockNumber ); + } + + if ( bN == 0 ) { + THROW_TRACE_JSON_EXCEPTION( "Block number must be more than zero" ); + } + + TransactionSkeleton ts = toTransactionSkeleton( _call ); + + return m_eth.traceCall( + ts.from, ts.value, ts.to, ts.data, ts.gas, ts.gasPrice, bN, _jsonTraceConfig ); + } catch ( jsonrpc::JsonRpcException& ) { + throw; + } catch ( std::exception const& _e ) { + THROW_TRACE_JSON_EXCEPTION( _e.what() ); + } catch ( ... ) { + THROW_TRACE_JSON_EXCEPTION( "Unknown server error" ); } - return ret; + +#else + BOOST_THROW_EXCEPTION( + jsonrpc::JsonRpcException( "This API call is only supported on archive nodes" ) ); +#endif } + +Json::Value Debug::debug_accountRangeAt( string const&, int, string const&, int ) { + BOOST_THROW_EXCEPTION( jsonrpc::JsonRpcException( "This API call is not supported" ) ); +} + +Json::Value Debug::debug_storageRangeAt( string const&, int, string const&, string const&, int ) { + BOOST_THROW_EXCEPTION( jsonrpc::JsonRpcException( "This API call is not supported" ) ); +} + +string Debug::debug_preimage( string const& ) { + BOOST_THROW_EXCEPTION( jsonrpc::JsonRpcException( "This API call is not supported" ) ); +} + + void Debug::debug_pauseBroadcast( bool _pause ) { + checkPrivilegedAccess(); m_eth.skaleHost()->pauseBroadcast( _pause ); } void Debug::debug_pauseConsensus( bool _pause ) { + checkPrivilegedAccess(); m_eth.skaleHost()->pauseConsensus( _pause ); } void Debug::debug_forceBlock() { + checkPrivilegedAccess(); m_eth.skaleHost()->forceEmptyBlock(); } -void Debug::debug_forceBroadcast( const std::string& _transactionHash ) { +void Debug::debug_forceBroadcast( const string& _transactionHash ) { + checkPrivilegedAccess(); try { h256 h = jsToFixed< 32 >( _transactionHash ); if ( !m_eth.isKnownTransaction( h ) ) @@ -271,27 +310,33 @@ void Debug::debug_forceBroadcast( const std::string& _transactionHash ) { } } -std::string Debug::debug_interfaceCall( const std::string& _arg ) { +string Debug::debug_interfaceCall( const string& _arg ) { + checkPrivilegedAccess(); return m_debugInterface->call( _arg ); } -std::string Debug::debug_getVersion() { +string Debug::debug_getVersion() { + checkPrivilegedAccess(); return Version; } -std::string Debug::debug_getArguments() { - return argv_options; +string Debug::debug_getArguments() { + checkPrivilegedAccess(); + return m_argvOptions; } -std::string Debug::debug_getConfig() { +string Debug::debug_getConfig() { + checkPrivilegedAccess(); return m_eth.chainParams().getOriginalJson(); } -std::string Debug::debug_getSchainName() { +string Debug::debug_getSchainName() { + checkPrivilegedAccess(); return m_eth.chainParams().sChain.name; } uint64_t Debug::debug_getSnapshotCalculationTime() { + checkPrivilegedAccess(); return m_eth.getSnapshotCalculationTime(); } @@ -300,6 +345,7 @@ uint64_t Debug::debug_getSnapshotHashCalculationTime() { } uint64_t Debug::debug_doStateDbCompaction() { + checkPrivilegedAccess(); auto t1 = boost::chrono::high_resolution_clock::now(); m_eth.doStateDbCompaction(); auto t2 = boost::chrono::high_resolution_clock::now(); @@ -308,6 +354,7 @@ uint64_t Debug::debug_doStateDbCompaction() { } uint64_t Debug::debug_doBlocksDbCompaction() { + checkPrivilegedAccess(); auto t1 = boost::chrono::high_resolution_clock::now(); m_eth.doBlocksDbCompaction(); auto t2 = boost::chrono::high_resolution_clock::now(); diff --git a/libweb3jsonrpc/Debug.h b/libweb3jsonrpc/Debug.h index 6d85b9d7d..63c88405a 100644 --- a/libweb3jsonrpc/Debug.h +++ b/libweb3jsonrpc/Debug.h @@ -1,10 +1,12 @@ #pragma once #include "DebugFace.h" +#include "test/tools/libtestutils/FixedClient.h" #include - +#include #include +#include class SkaleHost; class SkaleDebugInterface; @@ -13,16 +15,17 @@ namespace dev { namespace eth { class Client; -StandardTrace::DebugOptions debugOptions( Json::Value const& _json ); } // namespace eth - namespace rpc { class SessionManager; +constexpr size_t MAX_BLOCK_TRACES_CACHE_SIZE = 64 * 1024 * 1024; +constexpr size_t MAX_BLOCK_TRACES_CACHE_ITEMS = 1024 * 1024; + class Debug : public DebugFace { public: - explicit Debug( eth::Client const& _eth, SkaleDebugInterface* _debugInterface = nullptr, - const std::string& argv = std::string() ); + explicit Debug( eth::Client& _eth, SkaleDebugInterface* _debugInterface = nullptr, + const std::string& argv = std::string(), bool _enablePrivilegedApis = false ); virtual RPCModules implementedModules() const override { return RPCModules{ RPCModule{ "debug", "1.0" } }; @@ -32,16 +35,15 @@ class Debug : public DebugFace { std::string const& _addressHash, int _maxResults ) override; virtual Json::Value debug_traceTransaction( std::string const& _txHash, Json::Value const& _json ) override; - virtual Json::Value debug_traceCall( - Json::Value const& _call, Json::Value const& _options ) override; + virtual Json::Value debug_traceCall( Json::Value const& _call, std::string const& _blockNumber, + Json::Value const& _options ) override; virtual Json::Value debug_traceBlockByNumber( - int _blockNumber, Json::Value const& _json ) override; + std::string const& _blockNumber, Json::Value const& _json ) override; virtual Json::Value debug_traceBlockByHash( std::string const& _blockHash, Json::Value const& _json ) override; virtual Json::Value debug_storageRangeAt( std::string const& _blockHashOrNumber, int _txIndex, std::string const& _address, std::string const& _begin, int _maxResults ) override; virtual std::string debug_preimage( std::string const& _hashedKey ) override; - virtual Json::Value debug_traceBlock( std::string const& _blockRlp, Json::Value const& _json ); void debug_pauseBroadcast( bool pause ) override; void debug_pauseConsensus( bool pause ) override; @@ -63,15 +65,18 @@ class Debug : public DebugFace { virtual Json::Value debug_getFutureTransactions() override; private: - eth::Client const& m_eth; + eth::Client& m_eth; SkaleDebugInterface* m_debugInterface = nullptr; - std::string argv_options; + std::string m_argvOptions; + cache::lru_ordered_memory_constrained_cache< std::string, Json::Value > m_blockTraceCache; + bool m_enablePrivilegedApis; + h256 blockHash( std::string const& _blockHashOrNumber ) const; - skale::State stateAt( std::string const& _blockHashOrNumber, int _txIndex ) const; - Json::Value traceTransaction( - dev::eth::Executive& _e, dev::eth::Transaction const& _t, Json::Value const& _json ); - Json::Value traceBlock( dev::eth::Block const& _block, Json::Value const& _json ); + + void checkPrivilegedAccess() const; + + void checkHistoricStateEnabled() const; }; } // namespace rpc diff --git a/libweb3jsonrpc/DebugFace.h b/libweb3jsonrpc/DebugFace.h index ade7094b0..cfee3b7cb 100644 --- a/libweb3jsonrpc/DebugFace.h +++ b/libweb3jsonrpc/DebugFace.h @@ -6,6 +6,7 @@ #define JSONRPC_CPP_STUB_DEV_RPC_DEBUGFACE_H_ #include "ModularServer.h" +#include "boost/throw_exception.hpp" namespace dev { namespace rpc { @@ -17,9 +18,10 @@ class DebugFace : public ServerInterface< DebugFace > { jsonrpc::JSON_STRING, "param2", jsonrpc::JSON_INTEGER, "param3", jsonrpc::JSON_STRING, "param4", jsonrpc::JSON_INTEGER, NULL ), &dev::rpc::DebugFace::debug_accountRangeAtI ); + + this->bindAndAddMethod( jsonrpc::Procedure( "debug_traceTransaction", - jsonrpc::PARAMS_BY_POSITION, jsonrpc::JSON_OBJECT, "param1", - jsonrpc::JSON_STRING, "param2", jsonrpc::JSON_OBJECT, NULL ), + jsonrpc::PARAMS_BY_POSITION, jsonrpc::JSON_OBJECT, NULL ), &dev::rpc::DebugFace::debug_traceTransactionI ); this->bindAndAddMethod( jsonrpc::Procedure( "debug_storageRangeAt", jsonrpc::PARAMS_BY_POSITION, @@ -31,12 +33,10 @@ class DebugFace : public ServerInterface< DebugFace > { jsonrpc::JSON_OBJECT, "param1", jsonrpc::JSON_STRING, NULL ), &dev::rpc::DebugFace::debug_preimageI ); this->bindAndAddMethod( jsonrpc::Procedure( "debug_traceBlockByNumber", - jsonrpc::PARAMS_BY_POSITION, jsonrpc::JSON_OBJECT, "param1", - jsonrpc::JSON_INTEGER, "param2", jsonrpc::JSON_OBJECT, NULL ), + jsonrpc::PARAMS_BY_POSITION, jsonrpc::JSON_OBJECT, NULL ), &dev::rpc::DebugFace::debug_traceBlockByNumberI ); this->bindAndAddMethod( jsonrpc::Procedure( "debug_traceBlockByHash", - jsonrpc::PARAMS_BY_POSITION, jsonrpc::JSON_OBJECT, "param1", - jsonrpc::JSON_STRING, "param2", jsonrpc::JSON_OBJECT, NULL ), + jsonrpc::PARAMS_BY_POSITION, jsonrpc::JSON_OBJECT, NULL ), &dev::rpc::DebugFace::debug_traceBlockByHashI ); this->bindAndAddMethod( jsonrpc::Procedure( "debug_traceCall", jsonrpc::PARAMS_BY_POSITION, jsonrpc::JSON_OBJECT, "param1", jsonrpc::JSON_OBJECT, "param2", @@ -107,10 +107,25 @@ class DebugFace : public ServerInterface< DebugFace > { response = this->debug_accountRangeAt( request[0u].asString(), request[1u].asInt(), request[2u].asString(), request[3u].asInt() ); } - inline virtual void debug_traceTransactionI( - const Json::Value& request, Json::Value& response ) { - response = this->debug_traceTransaction( request[0u].asString(), request[1u] ); + + inline virtual Json::Value getTracer( const Json::Value& request ) { + if ( !request.isArray() || request.empty() || request.size() > 2 ) { + BOOST_THROW_EXCEPTION( + jsonrpc::JsonRpcException( jsonrpc::Errors::ERROR_RPC_INVALID_PARAMS ) ); + } + if ( request.size() == 2 ) { + if ( !request[1u].isObject() ) { + BOOST_THROW_EXCEPTION( + jsonrpc::JsonRpcException( jsonrpc::Errors::ERROR_RPC_INVALID_PARAMS ) ); + } + return request[1u]; + + } else { + return { Json::objectValue }; + } } + + inline virtual void debug_storageRangeAtI( const Json::Value& request, Json::Value& response ) { response = this->debug_storageRangeAt( request[0u].asString(), request[1u].asInt(), request[2u].asString(), request[3u].asString(), request[4u].asInt() ); @@ -118,16 +133,22 @@ class DebugFace : public ServerInterface< DebugFace > { inline virtual void debug_preimageI( const Json::Value& request, Json::Value& response ) { response = this->debug_preimage( request[0u].asString() ); } + + inline virtual void debug_traceTransactionI( + const Json::Value& request, Json::Value& response ) { + response = this->debug_traceTransaction( request[0u].asString(), getTracer( request ) ); + } + inline virtual void debug_traceBlockByNumberI( const Json::Value& request, Json::Value& response ) { - response = this->debug_traceBlockByNumber( request[0u].asInt(), request[1u] ); + response = this->debug_traceBlockByNumber( request[0u].asString(), getTracer( request ) ); } inline virtual void debug_traceBlockByHashI( const Json::Value& request, Json::Value& response ) { - response = this->debug_traceBlockByHash( request[0u].asString(), request[1u] ); + response = this->debug_traceBlockByHash( request[0u].asString(), getTracer( request ) ); } inline virtual void debug_traceCallI( const Json::Value& request, Json::Value& response ) { - response = this->debug_traceCall( request[0u], request[1u] ); + response = this->debug_traceCall( request[0u], request[1u].asString(), request[2u] ); } virtual void debug_pauseBroadcastI( const Json::Value& request, Json::Value& response ) { @@ -194,11 +215,12 @@ class DebugFace : public ServerInterface< DebugFace > { virtual Json::Value debug_storageRangeAt( const std::string& param1, int param2, const std::string& param3, const std::string& param4, int param5 ) = 0; virtual std::string debug_preimage( const std::string& param1 ) = 0; - virtual Json::Value debug_traceBlockByNumber( int param1, const Json::Value& param2 ) = 0; + virtual Json::Value debug_traceBlockByNumber( + const std::string& param1, const Json::Value& param2 ) = 0; virtual Json::Value debug_traceBlockByHash( const std::string& param1, const Json::Value& param2 ) = 0; - virtual Json::Value debug_traceCall( const Json::Value& param1, const Json::Value& param2 ) = 0; - + virtual Json::Value debug_traceCall( Json::Value const& _call, std::string const& _blockNumber, + Json::Value const& _options ) = 0; virtual void debug_pauseBroadcast( bool pause ) = 0; virtual void debug_pauseConsensus( bool pause ) = 0; virtual void debug_forceBlock() = 0; diff --git a/libweb3jsonrpc/Eth.cpp b/libweb3jsonrpc/Eth.cpp index 934ca2241..b50874935 100644 --- a/libweb3jsonrpc/Eth.cpp +++ b/libweb3jsonrpc/Eth.cpp @@ -53,7 +53,7 @@ const uint64_t MAX_RECEIPT_CACHE_ENTRIES = 1024; using namespace dev::rpc::_detail; -// TODO Check LatestBlock number - update! +// TODO Check LatestBlock number - update // Needs external locks to exchange read one to write one void GappedTransactionIndexCache::ensureCached( BlockNumber _bn, std::shared_lock< std::shared_mutex >& _readLock, @@ -66,13 +66,17 @@ void GappedTransactionIndexCache::ensureCached( BlockNumber _bn, _readLock.unlock(); _writeLock.lock(); + unsigned realBn = _bn; if ( _bn == LatestBlock ) realBn = client.number(); else if ( _bn == PendingBlock ) - realBn = client.number() + 1; // TODO test this case and decide + realBn = client.number() + 1; + + if ( real2gappedCache.size() > cacheSize ) { + throw std::runtime_error( "real2gappedCache.size() > cacheSize" ); + } - assert( real2gappedCache.size() <= cacheSize ); if ( real2gappedCache.size() >= cacheSize ) { real2gappedCache.erase( real2gappedCache.begin() ); gapped2realCache.erase( gapped2realCache.begin() ); @@ -94,7 +98,7 @@ void GappedTransactionIndexCache::ensureCached( BlockNumber _bn, pair< h256, unsigned > loc = client.transactionLocation( th ); - // ignore transactions with 0 gas usage OR different location! + // ignore transactions with 0 gas usage OR different location if ( diff == 0 || client.numberFromHash( loc.first ) != realBn || loc.second != realIndex ) continue; @@ -157,6 +161,7 @@ string Eth::eth_blockNumber( const Json::Value& request ) { if ( !request.empty() ) { BOOST_THROW_EXCEPTION( JsonRpcException( Errors::ERROR_RPC_INVALID_PARAMS ) ); } + return toJS( client()->number() ); } @@ -414,7 +419,7 @@ Json::Value Eth::eth_inspectTransaction( std::string const& _rlp ) { } } -// TODO Catch exceptions for all calls other eth_-calls in outer scope! +// TODO Catch exceptions for all calls other eth_-calls in outer scope /// skale string Eth::eth_sendRawTransaction( std::string const& _rlp ) { // Don't need to check the transaction signature (CheckTransaction::None) since it diff --git a/skaled/main.cpp b/skaled/main.cpp index b0ad1aca8..e9ca5cb19 100644 --- a/skaled/main.cpp +++ b/skaled/main.cpp @@ -1979,9 +1979,19 @@ int main( int argc, char** argv ) try { auto pAdminEthFace = bEnabledAPIs_admin ? new rpc::AdminEth( *g_client, *gasPricer.get(), keyManager, *sessionManager.get() ) : nullptr; +#ifdef HISTORIC_STATE + // debug interface is always enabled in historic state, but + // non-tracing calls are only available if bEnabledAPIs_debug is true + auto pDebugFace = + new rpc::Debug( *g_client, &debugInterface, argv_string, bEnabledAPIs_debug ); +#else + // debug interface is enabled on core node if bEnabledAPIs_debug is true auto pDebugFace = bEnabledAPIs_debug ? new rpc::Debug( *g_client, &debugInterface, argv_string ) : nullptr; +#endif + + auto pPerformanceTrackerFace = bEnabledAPIs_performanceTracker ? new rpc::SkalePerformanceTracker( configPath.string() ) : nullptr; diff --git a/storage_benchmark/CMakeLists.txt b/storage_benchmark/CMakeLists.txt index 67b410f4b..058c64605 100644 --- a/storage_benchmark/CMakeLists.txt +++ b/storage_benchmark/CMakeLists.txt @@ -17,6 +17,7 @@ target_link_libraries( ${executable_name} PRIVATE ethereum + skale historic skutils devcore diff --git a/test/historicstate/configs/basic_config.json b/test/historicstate/configs/basic_config.json index ea3bbf1d6..9afa36c31 100644 --- a/test/historicstate/configs/basic_config.json +++ b/test/historicstate/configs/basic_config.json @@ -327,6 +327,7 @@ "contractStorageLimit": 10000000000, "emptyBlockIntervalMs": 10000, "pushZeroPatchTimestamp": 1, + "multiTransactionMode": true, "nodes": [ { "nodeID": 1112, "ip": "127.0.0.1", "basePort": 1231, "schainIndex" : 1, "publicKey":""} ] diff --git a/test/historicstate/hardhat/README.md b/test/historicstate/hardhat/README.md index e9dd5f348..74fca7e30 100644 --- a/test/historicstate/hardhat/README.md +++ b/test/historicstate/hardhat/README.md @@ -1,13 +1,41 @@ -# Sample Hardhat Project +# Run skaled for tests -This project demonstrates a basic Hardhat use case. It comes with a sample contract, a test for that contract, and a script that deploys that contract. +``` +build/skaled/skaled --config test/historicstate/configs/basic_config.json +``` + +# Run local geth for tests + +First install web3 + +``` +pip3 install web3 +``` + +Then run geth container + +``` +cd test/historicstate/hardhat +python3 run_geth.py +``` -Try running some of the following tasks: + +# Install hardhat and run tests + +```shell +sudo apt install nodejs +npm install +``` + +Now run test against skaled ```shell -npx hardhat help -npx hardhat test -REPORT_GAS=true npx hardhat test -npx hardhat node -npx hardhat run scripts/deploy.js +npx hardhat run scripts/trace.js --network skaled ``` + +To run the same test against geth + +```shell +npx hardhat run scripts/trace.js --network geth +``` + diff --git a/test/historicstate/hardhat/contracts/Lock.sol b/test/historicstate/hardhat/contracts/Lock.sol index 14762d32e..c32a86022 100644 --- a/test/historicstate/hardhat/contracts/Lock.sol +++ b/test/historicstate/hardhat/contracts/Lock.sol @@ -2,7 +2,10 @@ pragma solidity ^0.8.9; -contract Lock { +contract Lock { + + event LogMint(address indexed minter, uint256 amount, string topic); + uint public totalSupply; mapping(address => uint) public balanceOf; mapping(address => mapping(address => uint)) public allowance; @@ -30,7 +33,7 @@ contract Lock { } - function die(address payable recipient) external { + function die(address payable recipient) external { selfdestruct(recipient); } @@ -46,17 +49,21 @@ contract Lock { address recipient, uint amount ) external returns (bool) { - // allowance[sender][msg.sender] -= amount; - // balanceOf[sender] -= amount; - // balanceOf[recipient] += amount; - // emit Transfer(sender, recipient, amount); + allowance[sender][msg.sender] -= amount; + balanceOf[sender] -= amount; + balanceOf[recipient] += amount; + emit Transfer(sender, recipient, amount); return true; } - function mint(uint amount) public { + + + function mint(uint amount) public returns (uint256) { + emit LogMint(msg.sender, amount, "amount"); balanceOf[msg.sender] += amount; totalSupply += amount; emit Transfer(address(0), msg.sender, amount); + return 1; } function burn(uint amount) external { @@ -66,29 +73,20 @@ contract Lock { } - - - - function initialize() public { - require(!initialized, "Contract instance has already been initialized"); - initialized = true; + constructor() { + require(!initialized, "Contract instance has already been initialized"); + initialized = true; name = "Lock"; symbol = "LOCK"; decimals = 18; owner = msg.sender; counter = 1; - - mint(10000000000000000000000000000000000000000); - - } - - function store() public { // Uncomment this line, and the import of "hardhat/console.sol", to print a log in your terminal // console.log("Unlock time is %o and block timestamp is %o", unlockTime, block.timestamp); diff --git a/test/historicstate/hardhat/contracts/Tracer.sol b/test/historicstate/hardhat/contracts/Tracer.sol new file mode 100644 index 000000000..e7b68778c --- /dev/null +++ b/test/historicstate/hardhat/contracts/Tracer.sol @@ -0,0 +1,152 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.9; + +contract SecondContract { + + + event InternalCallEvent(address indexed minter, uint256 amount, string topic); + + uint256 public balance; + bool constructorVar = false; + uint256 internalVar; + + + function die(address payable recipient) external { + selfdestruct(recipient); + } + + function mint(uint amount) public returns (uint256) { + emit InternalCallEvent(msg.sender, amount, "topic"); + balance += amount; + internalCall(amount + 1); + precompileCall(); + return 1; + } + + function internalCall(uint amount) public returns (uint256) { + emit InternalCallEvent(msg.sender, amount, "internal topic"); + internalVar += amount; + return 2; + } + + + constructor() { + require(!constructorVar, "Contract instance has already been initialized"); + constructorVar = true; + mint(10000000000000000000000000000000000000000); + } + + function precompileCall() public pure returns (bytes32) { + string memory input = "Hello, world!"; + bytes32 expectedHash = keccak256(bytes(input)); + return expectedHash; + } + + function riskyFunction() public pure{ + revert("This function reverted!"); + } +} + +contract Tracer { + + SecondContract secondContract; + + event InternalCallEvent(address indexed minter, uint256 amount, string topic); + + uint256 public balance; + bool constructorVar = false; + uint256 internalVar; + + + function die(address payable recipient) external { + selfdestruct(recipient); + } + + + error InsufficientBalance(uint256 requested, uint256 available); + + function riskyFunction() public pure { + revert("This function reverted!"); + } + + + function riskyFunction2() public pure { + revert InsufficientBalance(1, 1); + } + + + function mint(uint amount) public returns (uint256) { + emit InternalCallEvent(msg.sender, amount, "topic"); + balance += amount; + internalCall(amount + 1); + precompileCall(); + secondContract.mint(amount); + return 1; + } + + function mint2(uint amount) public returns (uint256) { + emit InternalCallEvent(msg.sender, amount, "topic"); + secondContract = new SecondContract(); + balance += amount; + internalCall(amount + 1); + precompileCall(); + secondContract.mint(amount); + return 1; + } + + + event ErrorHandled(string message); + + // test revert + function readableRevert(uint) public returns (uint256) { + + try this.riskyFunction() { + // If the call succeeds, this block is executed + } catch Error(string memory reason) { + // If the call reverts with an error message, this block is executed + emit ErrorHandled(reason); + } catch (bytes memory) { + // If the call reverts without an error message, this block is executed + emit ErrorHandled("External call failed without an error message"); + } + + try this.riskyFunction2() { + // If the call succeeds, this block is executed + } catch Error(string memory reason) { + // If the call reverts with an error message, this block is executed + emit ErrorHandled(reason); + } catch (bytes memory ) { + // If the call reverts without an error message, this block is executed + emit ErrorHandled("External call failed without an error message"); + } + + + require(false, "INSUFFICIENT BALANCE"); + return 1; + } + + + + function internalCall(uint amount) public returns (uint256) { + emit InternalCallEvent(msg.sender, amount, "internal topic"); + internalVar += amount; + return 2; + } + + + constructor() { + require(!constructorVar, "Contract instance has already been initialized"); + constructorVar = true; + //mint(10000000000000000000000000000000000000000); + } + + function precompileCall() public pure returns (bytes32) { + string memory input = "Hello, world!"; + bytes32 expectedHash = keccak256(bytes(input)); + return expectedHash; + } + + function getBalance() external view returns (uint256) { + return balance; + } +} \ No newline at end of file diff --git a/test/historicstate/hardhat/hardhat.config.js b/test/historicstate/hardhat/hardhat.config.js index 04bc9708c..c423ba22d 100644 --- a/test/historicstate/hardhat/hardhat.config.js +++ b/test/historicstate/hardhat/hardhat.config.js @@ -30,6 +30,13 @@ module.exports = { accounts: [INSECURE_PRIVATE_KEY], chainId: 74565, gas: 0x10000000 + }, + geth: { + url: `http://localhost:8545`, + accounts: [INSECURE_PRIVATE_KEY], + chainId: 1337, + gas: 0x10000000 } + } }; diff --git a/test/historicstate/hardhat/package.json b/test/historicstate/hardhat/package.json index 60594b93e..93dfb86ff 100644 --- a/test/historicstate/hardhat/package.json +++ b/test/historicstate/hardhat/package.json @@ -3,11 +3,20 @@ "devDependencies": { "@nomicfoundation/hardhat-toolbox": "^2.0.0", "@openzeppelin/hardhat-upgrades": "^1.22.0", - "hardhat": "^2.12.2", + "@types/chai": "^4.3.11", + "@types/deep-diff": "^1.0.2", + "@types/mocha": "^10.0.6", + "@types/node": "^20.10.4", + "chai": "^4.3.10", + "ethereum-waffle": "^4.0.10", + "hardhat": "^2.17.4", + "ts-node": "^10.9.2", + "typescript": "^5.3.3", "wait-for-user-input": "^1.0.0" }, "dependencies": { "@openzeppelin/contracts": "^4.8.0", - "@openzeppelin/contracts-upgradeable": "^4.8.0" + "@openzeppelin/contracts-upgradeable": "^4.8.0", + "deep-diff": "^1.0.2" } } diff --git a/test/historicstate/hardhat/run_geth.py b/test/historicstate/hardhat/run_geth.py new file mode 100755 index 000000000..22d576487 --- /dev/null +++ b/test/historicstate/hardhat/run_geth.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python3 +import subprocess +import time +from web3 import Web3, HTTPProvider + + +def is_container_running(container_name): + try: + result = subprocess.run(["docker", "inspect", "-f", "{{.State.Running}}", container_name], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True) + + if result.returncode != 0: + print(f"Error: {result.stderr.strip()}") + return False + + return result.stdout.strip() == 'true' + + except Exception as e: + print(f"Exception occurred: {e}") + return False + +def run_geth_container(): + # Pull the Docker image + subprocess.run(["docker", "pull", "ethereum/client-go"]) + + is_running : bool = is_container_running("geth") + + if (is_running): + return + + + # Run the Geth container in detached mode + subprocess.run([ + "docker", "run", "-d", "--name", "geth", + "-p", "8545:8545", "-p", "30303:30303", + "ethereum/client-go", "--dev", "--http", + "--http.addr", "0.0.0.0", "--http.corsdomain", "*", "--allow-insecure-unlock", + "--http.api", "personal,eth,net,web3,debug" + ]) + +def add_ether_to_account(address, amount): + # Connect to the Geth node + w3 = Web3(HTTPProvider("http://localhost:8545")) + + # Check if the connection is successful + if not w3.is_connected(): + print("Failed to connect to the Ethereum node.") + return + + # Unlock the default account (coinbase) + coinbase = w3.eth.coinbase + w3.geth.personal.unlock_account(coinbase, '', 0) + + # Convert Ether to Wei + value = w3.to_wei(amount, 'ether') + + # Create and send the transaction + tx_hash = w3.eth.send_transaction({'from': coinbase, 'to': address, 'value': value}) + + # Wait for the transaction to be mined + w3.eth.wait_for_transaction_receipt(tx_hash) + + print(f"Successfully sent {amount} ETH to {address}") + +# Main execution +if __name__ == "__main__": + try: + run_geth_container() + # Wait a bit for the node to be fully up and running + time.sleep(10) + add_ether_to_account("0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6", 1000) + except Exception as e: + print(f"An error occurred: {e}") diff --git a/test/historicstate/hardhat/scripts/geth_traces/Tracer.deploy.4byteTracer.json b/test/historicstate/hardhat/scripts/geth_traces/Tracer.deploy.4byteTracer.json new file mode 100644 index 000000000..77ad47965 --- /dev/null +++ b/test/historicstate/hardhat/scripts/geth_traces/Tracer.deploy.4byteTracer.json @@ -0,0 +1,3 @@ +{ + "0x60806040-7464": 1 +} \ No newline at end of file diff --git a/test/historicstate/hardhat/scripts/geth_traces/Tracer.deploy.callTracer.json b/test/historicstate/hardhat/scripts/geth_traces/Tracer.deploy.callTracer.json new file mode 100644 index 000000000..69c028a91 --- /dev/null +++ b/test/historicstate/hardhat/scripts/geth_traces/Tracer.deploy.callTracer.json @@ -0,0 +1,10 @@ +{ + "from": "OWNER.address", + "gas": "0x200b20", + "gasUsed": "0x18928c", + "to": "Tracer.address", + "input": "0x60806040526000600260006101000a81548160ff02191690831515021790555034801561002b57600080fd5b50600260009054906101000a900460ff161561007c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100739061011f565b60405180910390fd5b6001600260006101000a81548160ff02191690831515021790555061013f565b600082825260208201905092915050565b7f436f6e747261637420696e7374616e63652068617320616c726561647920626560008201527f656e20696e697469616c697a6564000000000000000000000000000000000000602082015250565b6000610109602e8361009c565b9150610114826100ad565b604082019050919050565b60006020820190508181036000830152610138816100fc565b9050919050565b611bde8061014e6000396000f3fe60806040523480156200001157600080fd5b5060043610620000ac5760003560e01c80638bfe44ff116200006f5780638bfe44ff14620001975780639295436214620001a3578063a0712d6814620001af578063b69ef8a814620001e5578063c9353cb5146200020757620000ac565b806312065fe014620000b15780631c71706914620000d35780631c93908c14620000f55780633aa18088146200012b5780637f29c3941462000161575b600080fd5b620000bb62000227565b604051620000ca919062000997565b60405180910390f35b620000dd62000231565b604051620000ec9190620009cf565b60405180910390f35b6200011360048036038101906200010d919062000a2c565b62000280565b60405162000122919062000997565b60405180910390f35b62000149600480360381019062000143919062000a2c565b620002f6565b60405162000158919062000997565b60405180910390f35b6200017f600480360381019062000179919062000a2c565b620004ae565b6040516200018e919062000997565b60405180910390f35b620001a162000783565b005b620001ad620007c5565b005b620001cd6004803603810190620001c7919062000a2c565b62000802565b604051620001dc919062000997565b60405180910390f35b620001ef6200094f565b604051620001fe919062000997565b60405180910390f35b6200022560048036038101906200021f919062000ac3565b62000955565b005b6000600154905090565b6000806040518060400160405280600d81526020017f48656c6c6f2c20776f726c6421000000000000000000000000000000000000008152509050600081805190602001209050809250505090565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac083604051620002ca919062000b56565b60405180910390a28160036000828254620002e6919062000bb7565b9250508190555060029050919050565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac08360405162000340919062000c64565b60405180910390a260405162000356906200096e565b604051809103906000f08015801562000373573d6000803e3d6000fd5b506000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160016000828254620003c7919062000bb7565b92505081905550620003e7600183620003e1919062000bb7565b62000280565b50620003f262000231565b5060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b81526004016200044e919062000997565b602060405180830381600087803b1580156200046957600080fd5b505af11580156200047e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004a4919062000cad565b5060019050919050565b60003073ffffffffffffffffffffffffffffffffffffffff1663929543626040518163ffffffff1660e01b815260040160006040518083038186803b158015620004f757600080fd5b505afa92505050801562000509575060015b620005f2576200051862000cec565b806308c379a014156200057d57506200053062000d87565b806200053d57506200057f565b7f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a816040516200056e919062000eab565b60405180910390a150620005ec565b505b3d8060008114620005ad576040519150601f19603f3d011682016040523d82523d6000602084013e620005b2565b606091505b507f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a604051620005e29062000f45565b60405180910390a1505b620005f3565b5b3073ffffffffffffffffffffffffffffffffffffffff16638bfe44ff6040518163ffffffff1660e01b815260040160006040518083038186803b1580156200063a57600080fd5b505afa9250505080156200064c575060015b62000735576200065b62000cec565b806308c379a01415620006c057506200067362000d87565b80620006805750620006c2565b7f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a81604051620006b1919062000eab565b60405180910390a1506200072f565b505b3d8060008114620006f0576040519150601f19603f3d011682016040523d82523d6000602084013e620006f5565b606091505b507f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a604051620007259062000f45565b60405180910390a1505b62000736565b5b60006200077a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007719062000fb7565b60405180910390fd5b60019050919050565b6001806040517fcf479181000000000000000000000000000000000000000000000000000000008152600401620007bc92919062001026565b60405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007f990620010a3565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0836040516200084c919062000c64565b60405180910390a2816001600082825462000868919062000bb7565b925050819055506200088860018362000882919062000bb7565b62000280565b506200089362000231565b5060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b8152600401620008ef919062000997565b602060405180830381600087803b1580156200090a57600080fd5b505af11580156200091f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000945919062000cad565b5060019050919050565b60015481565b8073ffffffffffffffffffffffffffffffffffffffff16ff5b610ae380620010c683390190565b6000819050919050565b62000991816200097c565b82525050565b6000602082019050620009ae600083018462000986565b92915050565b6000819050919050565b620009c981620009b4565b82525050565b6000602082019050620009e66000830184620009be565b92915050565b6000604051905090565b600080fd5b62000a06816200097c565b811462000a1257600080fd5b50565b60008135905062000a2681620009fb565b92915050565b60006020828403121562000a455762000a44620009f6565b5b600062000a558482850162000a15565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000a8b8262000a5e565b9050919050565b62000a9d8162000a7e565b811462000aa957600080fd5b50565b60008135905062000abd8162000a92565b92915050565b60006020828403121562000adc5762000adb620009f6565b5b600062000aec8482850162000aac565b91505092915050565b600082825260208201905092915050565b7f696e7465726e616c20746f706963000000000000000000000000000000000000600082015250565b600062000b3e600e8362000af5565b915062000b4b8262000b06565b602082019050919050565b600060408201905062000b6d600083018462000986565b818103602083015262000b808162000b2f565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000bc4826200097c565b915062000bd1836200097c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000c095762000c0862000b88565b5b828201905092915050565b7f746f706963000000000000000000000000000000000000000000000000000000600082015250565b600062000c4c60058362000af5565b915062000c598262000c14565b602082019050919050565b600060408201905062000c7b600083018462000986565b818103602083015262000c8e8162000c3d565b905092915050565b60008151905062000ca781620009fb565b92915050565b60006020828403121562000cc65762000cc5620009f6565b5b600062000cd68482850162000c96565b91505092915050565b60008160e01c9050919050565b600060033d111562000d0e5760046000803e62000d0b60005162000cdf565b90505b90565b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000d5c8262000d11565b810181811067ffffffffffffffff8211171562000d7e5762000d7d62000d22565b5b80604052505050565b600060443d101562000d995762000e26565b62000da3620009ec565b60043d036004823e80513d602482011167ffffffffffffffff8211171562000dcd57505062000e26565b808201805167ffffffffffffffff81111562000ded575050505062000e26565b80602083010160043d03850181111562000e0c57505050505062000e26565b62000e1d8260200185018662000d51565b82955050505050505b90565b600081519050919050565b60005b8381101562000e5457808201518184015260208101905062000e37565b8381111562000e64576000848401525b50505050565b600062000e778262000e29565b62000e83818562000af5565b935062000e9581856020860162000e34565b62000ea08162000d11565b840191505092915050565b6000602082019050818103600083015262000ec7818462000e6a565b905092915050565b7f45787465726e616c2063616c6c206661696c656420776974686f757420616e2060008201527f6572726f72206d65737361676500000000000000000000000000000000000000602082015250565b600062000f2d602d8362000af5565b915062000f3a8262000ecf565b604082019050919050565b6000602082019050818103600083015262000f608162000f1e565b9050919050565b7f494e53554646494349454e542042414c414e4345000000000000000000000000600082015250565b600062000f9f60148362000af5565b915062000fac8262000f67565b602082019050919050565b6000602082019050818103600083015262000fd28162000f90565b9050919050565b6000819050919050565b6000819050919050565b60006200100e62001008620010028462000fd9565b62000fe3565b6200097c565b9050919050565b620010208162000fed565b82525050565b60006040820190506200103d600083018562001015565b6200104c602083018462001015565b9392505050565b7f546869732066756e6374696f6e20726576657274656421000000000000000000600082015250565b60006200108b60178362000af5565b9150620010988262001053565b602082019050919050565b60006020820190508181036000830152620010be816200107c565b905091905056fe60806040526000600160006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b50600160009054906101000a900460ff161562000080576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200007790620002b5565b60405180910390fd5b60018060006101000a81548160ff021916908315150217905550620000bc701d6329f1c35ca4bfabb9f5610000000000620000c360201b60201c565b5062000482565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0836040516200010d919062000342565b60405180910390a281600080828254620001289190620003a3565b925050819055506200014e600183620001429190620003a3565b6200016960201b60201c565b506200015f620001df60201b60201c565b5060019050919050565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac083604051620001b3919062000450565b60405180910390a28160026000828254620001cf9190620003a3565b9250508190555060029050919050565b6000806040518060400160405280600d81526020017f48656c6c6f2c20776f726c6421000000000000000000000000000000000000008152509050600081805190602001209050809250505090565b600082825260208201905092915050565b7f436f6e747261637420696e7374616e63652068617320616c726561647920626560008201527f656e20696e697469616c697a6564000000000000000000000000000000000000602082015250565b60006200029d602e836200022e565b9150620002aa826200023f565b604082019050919050565b60006020820190508181036000830152620002d0816200028e565b9050919050565b6000819050919050565b620002ec81620002d7565b82525050565b7f746f706963000000000000000000000000000000000000000000000000000000600082015250565b60006200032a6005836200022e565b91506200033782620002f2565b602082019050919050565b6000604082019050620003596000830184620002e1565b81810360208301526200036c816200031b565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620003b082620002d7565b9150620003bd83620002d7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620003f557620003f462000374565b5b828201905092915050565b7f696e7465726e616c20746f706963000000000000000000000000000000000000600082015250565b600062000438600e836200022e565b9150620004458262000400565b602082019050919050565b6000604082019050620004676000830184620002e1565b81810360208301526200047a8162000429565b905092915050565b61065180620004926000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c80631c717069146100675780631c93908c1461008557806392954362146100b5578063a0712d68146100bf578063b69ef8a8146100ef578063c9353cb51461010d575b600080fd5b61006f610129565b60405161007c91906102ed565b60405180910390f35b61009f600480360381019061009a9190610343565b610178565b6040516100ac919061037f565b60405180910390f35b6100bd6101ea565b005b6100d960048036038101906100d49190610343565b610225565b6040516100e6919061037f565b60405180910390f35b6100f76102b5565b604051610104919061037f565b60405180910390f35b610127600480360381019061012291906103f8565b6102bb565b005b6000806040518060400160405280600d81526020017f48656c6c6f2c20776f726c6421000000000000000000000000000000000000008152509050600081805190602001209050809250505090565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0836040516101c09190610482565b60405180910390a281600260008282546101da91906104df565b9250508190555060029050919050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161021c90610581565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac08360405161026d91906105ed565b60405180910390a28160008082825461028691906104df565b925050819055506102a260018361029d91906104df565b610178565b506102ab610129565b5060019050919050565b60005481565b8073ffffffffffffffffffffffffffffffffffffffff16ff5b6000819050919050565b6102e7816102d4565b82525050565b600060208201905061030260008301846102de565b92915050565b600080fd5b6000819050919050565b6103208161030d565b811461032b57600080fd5b50565b60008135905061033d81610317565b92915050565b60006020828403121561035957610358610308565b5b60006103678482850161032e565b91505092915050565b6103798161030d565b82525050565b60006020820190506103946000830184610370565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103c58261039a565b9050919050565b6103d5816103ba565b81146103e057600080fd5b50565b6000813590506103f2816103cc565b92915050565b60006020828403121561040e5761040d610308565b5b600061041c848285016103e3565b91505092915050565b600082825260208201905092915050565b7f696e7465726e616c20746f706963000000000000000000000000000000000000600082015250565b600061046c600e83610425565b915061047782610436565b602082019050919050565b60006040820190506104976000830184610370565b81810360208301526104a88161045f565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006104ea8261030d565b91506104f58361030d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561052a576105296104b0565b5b828201905092915050565b7f546869732066756e6374696f6e20726576657274656421000000000000000000600082015250565b600061056b601783610425565b915061057682610535565b602082019050919050565b6000602082019050818103600083015261059a8161055e565b9050919050565b7f746f706963000000000000000000000000000000000000000000000000000000600082015250565b60006105d7600583610425565b91506105e2826105a1565b602082019050919050565b60006040820190506106026000830184610370565b8181036020830152610613816105ca565b90509291505056fea26469706673582212208743accab6cfcd1c8ccb3f51b787d679e803a77ce24ec642bd068883132fd5fa64736f6c63430008090033a264697066735822122066241fedca9ebd69f0cd9e4879f75428f5d4bf734eb072e52934a8b3161581f064736f6c63430008090033", + "output": "0x60806040523480156200001157600080fd5b5060043610620000ac5760003560e01c80638bfe44ff116200006f5780638bfe44ff14620001975780639295436214620001a3578063a0712d6814620001af578063b69ef8a814620001e5578063c9353cb5146200020757620000ac565b806312065fe014620000b15780631c71706914620000d35780631c93908c14620000f55780633aa18088146200012b5780637f29c3941462000161575b600080fd5b620000bb62000227565b604051620000ca919062000997565b60405180910390f35b620000dd62000231565b604051620000ec9190620009cf565b60405180910390f35b6200011360048036038101906200010d919062000a2c565b62000280565b60405162000122919062000997565b60405180910390f35b62000149600480360381019062000143919062000a2c565b620002f6565b60405162000158919062000997565b60405180910390f35b6200017f600480360381019062000179919062000a2c565b620004ae565b6040516200018e919062000997565b60405180910390f35b620001a162000783565b005b620001ad620007c5565b005b620001cd6004803603810190620001c7919062000a2c565b62000802565b604051620001dc919062000997565b60405180910390f35b620001ef6200094f565b604051620001fe919062000997565b60405180910390f35b6200022560048036038101906200021f919062000ac3565b62000955565b005b6000600154905090565b6000806040518060400160405280600d81526020017f48656c6c6f2c20776f726c6421000000000000000000000000000000000000008152509050600081805190602001209050809250505090565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac083604051620002ca919062000b56565b60405180910390a28160036000828254620002e6919062000bb7565b9250508190555060029050919050565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac08360405162000340919062000c64565b60405180910390a260405162000356906200096e565b604051809103906000f08015801562000373573d6000803e3d6000fd5b506000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160016000828254620003c7919062000bb7565b92505081905550620003e7600183620003e1919062000bb7565b62000280565b50620003f262000231565b5060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b81526004016200044e919062000997565b602060405180830381600087803b1580156200046957600080fd5b505af11580156200047e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004a4919062000cad565b5060019050919050565b60003073ffffffffffffffffffffffffffffffffffffffff1663929543626040518163ffffffff1660e01b815260040160006040518083038186803b158015620004f757600080fd5b505afa92505050801562000509575060015b620005f2576200051862000cec565b806308c379a014156200057d57506200053062000d87565b806200053d57506200057f565b7f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a816040516200056e919062000eab565b60405180910390a150620005ec565b505b3d8060008114620005ad576040519150601f19603f3d011682016040523d82523d6000602084013e620005b2565b606091505b507f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a604051620005e29062000f45565b60405180910390a1505b620005f3565b5b3073ffffffffffffffffffffffffffffffffffffffff16638bfe44ff6040518163ffffffff1660e01b815260040160006040518083038186803b1580156200063a57600080fd5b505afa9250505080156200064c575060015b62000735576200065b62000cec565b806308c379a01415620006c057506200067362000d87565b80620006805750620006c2565b7f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a81604051620006b1919062000eab565b60405180910390a1506200072f565b505b3d8060008114620006f0576040519150601f19603f3d011682016040523d82523d6000602084013e620006f5565b606091505b507f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a604051620007259062000f45565b60405180910390a1505b62000736565b5b60006200077a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007719062000fb7565b60405180910390fd5b60019050919050565b6001806040517fcf479181000000000000000000000000000000000000000000000000000000008152600401620007bc92919062001026565b60405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007f990620010a3565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0836040516200084c919062000c64565b60405180910390a2816001600082825462000868919062000bb7565b925050819055506200088860018362000882919062000bb7565b62000280565b506200089362000231565b5060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b8152600401620008ef919062000997565b602060405180830381600087803b1580156200090a57600080fd5b505af11580156200091f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000945919062000cad565b5060019050919050565b60015481565b8073ffffffffffffffffffffffffffffffffffffffff16ff5b610ae380620010c683390190565b6000819050919050565b62000991816200097c565b82525050565b6000602082019050620009ae600083018462000986565b92915050565b6000819050919050565b620009c981620009b4565b82525050565b6000602082019050620009e66000830184620009be565b92915050565b6000604051905090565b600080fd5b62000a06816200097c565b811462000a1257600080fd5b50565b60008135905062000a2681620009fb565b92915050565b60006020828403121562000a455762000a44620009f6565b5b600062000a558482850162000a15565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000a8b8262000a5e565b9050919050565b62000a9d8162000a7e565b811462000aa957600080fd5b50565b60008135905062000abd8162000a92565b92915050565b60006020828403121562000adc5762000adb620009f6565b5b600062000aec8482850162000aac565b91505092915050565b600082825260208201905092915050565b7f696e7465726e616c20746f706963000000000000000000000000000000000000600082015250565b600062000b3e600e8362000af5565b915062000b4b8262000b06565b602082019050919050565b600060408201905062000b6d600083018462000986565b818103602083015262000b808162000b2f565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000bc4826200097c565b915062000bd1836200097c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000c095762000c0862000b88565b5b828201905092915050565b7f746f706963000000000000000000000000000000000000000000000000000000600082015250565b600062000c4c60058362000af5565b915062000c598262000c14565b602082019050919050565b600060408201905062000c7b600083018462000986565b818103602083015262000c8e8162000c3d565b905092915050565b60008151905062000ca781620009fb565b92915050565b60006020828403121562000cc65762000cc5620009f6565b5b600062000cd68482850162000c96565b91505092915050565b60008160e01c9050919050565b600060033d111562000d0e5760046000803e62000d0b60005162000cdf565b90505b90565b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000d5c8262000d11565b810181811067ffffffffffffffff8211171562000d7e5762000d7d62000d22565b5b80604052505050565b600060443d101562000d995762000e26565b62000da3620009ec565b60043d036004823e80513d602482011167ffffffffffffffff8211171562000dcd57505062000e26565b808201805167ffffffffffffffff81111562000ded575050505062000e26565b80602083010160043d03850181111562000e0c57505050505062000e26565b62000e1d8260200185018662000d51565b82955050505050505b90565b600081519050919050565b60005b8381101562000e5457808201518184015260208101905062000e37565b8381111562000e64576000848401525b50505050565b600062000e778262000e29565b62000e83818562000af5565b935062000e9581856020860162000e34565b62000ea08162000d11565b840191505092915050565b6000602082019050818103600083015262000ec7818462000e6a565b905092915050565b7f45787465726e616c2063616c6c206661696c656420776974686f757420616e2060008201527f6572726f72206d65737361676500000000000000000000000000000000000000602082015250565b600062000f2d602d8362000af5565b915062000f3a8262000ecf565b604082019050919050565b6000602082019050818103600083015262000f608162000f1e565b9050919050565b7f494e53554646494349454e542042414c414e4345000000000000000000000000600082015250565b600062000f9f60148362000af5565b915062000fac8262000f67565b602082019050919050565b6000602082019050818103600083015262000fd28162000f90565b9050919050565b6000819050919050565b6000819050919050565b60006200100e62001008620010028462000fd9565b62000fe3565b6200097c565b9050919050565b620010208162000fed565b82525050565b60006040820190506200103d600083018562001015565b6200104c602083018462001015565b9392505050565b7f546869732066756e6374696f6e20726576657274656421000000000000000000600082015250565b60006200108b60178362000af5565b9150620010988262001053565b602082019050919050565b60006020820190508181036000830152620010be816200107c565b905091905056fe60806040526000600160006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b50600160009054906101000a900460ff161562000080576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200007790620002b5565b60405180910390fd5b60018060006101000a81548160ff021916908315150217905550620000bc701d6329f1c35ca4bfabb9f5610000000000620000c360201b60201c565b5062000482565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0836040516200010d919062000342565b60405180910390a281600080828254620001289190620003a3565b925050819055506200014e600183620001429190620003a3565b6200016960201b60201c565b506200015f620001df60201b60201c565b5060019050919050565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac083604051620001b3919062000450565b60405180910390a28160026000828254620001cf9190620003a3565b9250508190555060029050919050565b6000806040518060400160405280600d81526020017f48656c6c6f2c20776f726c6421000000000000000000000000000000000000008152509050600081805190602001209050809250505090565b600082825260208201905092915050565b7f436f6e747261637420696e7374616e63652068617320616c726561647920626560008201527f656e20696e697469616c697a6564000000000000000000000000000000000000602082015250565b60006200029d602e836200022e565b9150620002aa826200023f565b604082019050919050565b60006020820190508181036000830152620002d0816200028e565b9050919050565b6000819050919050565b620002ec81620002d7565b82525050565b7f746f706963000000000000000000000000000000000000000000000000000000600082015250565b60006200032a6005836200022e565b91506200033782620002f2565b602082019050919050565b6000604082019050620003596000830184620002e1565b81810360208301526200036c816200031b565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620003b082620002d7565b9150620003bd83620002d7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620003f557620003f462000374565b5b828201905092915050565b7f696e7465726e616c20746f706963000000000000000000000000000000000000600082015250565b600062000438600e836200022e565b9150620004458262000400565b602082019050919050565b6000604082019050620004676000830184620002e1565b81810360208301526200047a8162000429565b905092915050565b61065180620004926000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c80631c717069146100675780631c93908c1461008557806392954362146100b5578063a0712d68146100bf578063b69ef8a8146100ef578063c9353cb51461010d575b600080fd5b61006f610129565b60405161007c91906102ed565b60405180910390f35b61009f600480360381019061009a9190610343565b610178565b6040516100ac919061037f565b60405180910390f35b6100bd6101ea565b005b6100d960048036038101906100d49190610343565b610225565b6040516100e6919061037f565b60405180910390f35b6100f76102b5565b604051610104919061037f565b60405180910390f35b610127600480360381019061012291906103f8565b6102bb565b005b6000806040518060400160405280600d81526020017f48656c6c6f2c20776f726c6421000000000000000000000000000000000000008152509050600081805190602001209050809250505090565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0836040516101c09190610482565b60405180910390a281600260008282546101da91906104df565b9250508190555060029050919050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161021c90610581565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac08360405161026d91906105ed565b60405180910390a28160008082825461028691906104df565b925050819055506102a260018361029d91906104df565b610178565b506102ab610129565b5060019050919050565b60005481565b8073ffffffffffffffffffffffffffffffffffffffff16ff5b6000819050919050565b6102e7816102d4565b82525050565b600060208201905061030260008301846102de565b92915050565b600080fd5b6000819050919050565b6103208161030d565b811461032b57600080fd5b50565b60008135905061033d81610317565b92915050565b60006020828403121561035957610358610308565b5b60006103678482850161032e565b91505092915050565b6103798161030d565b82525050565b60006020820190506103946000830184610370565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103c58261039a565b9050919050565b6103d5816103ba565b81146103e057600080fd5b50565b6000813590506103f2816103cc565b92915050565b60006020828403121561040e5761040d610308565b5b600061041c848285016103e3565b91505092915050565b600082825260208201905092915050565b7f696e7465726e616c20746f706963000000000000000000000000000000000000600082015250565b600061046c600e83610425565b915061047782610436565b602082019050919050565b60006040820190506104976000830184610370565b81810360208301526104a88161045f565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006104ea8261030d565b91506104f58361030d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561052a576105296104b0565b5b828201905092915050565b7f546869732066756e6374696f6e20726576657274656421000000000000000000600082015250565b600061056b601783610425565b915061057682610535565b602082019050919050565b6000602082019050818103600083015261059a8161055e565b9050919050565b7f746f706963000000000000000000000000000000000000000000000000000000600082015250565b60006105d7600583610425565b91506105e2826105a1565b602082019050919050565b60006040820190506106026000830184610370565b8181036020830152610613816105ca565b90509291505056fea26469706673582212208743accab6cfcd1c8ccb3f51b787d679e803a77ce24ec642bd068883132fd5fa64736f6c63430008090033a264697066735822122066241fedca9ebd69f0cd9e4879f75428f5d4bf734eb072e52934a8b3161581f064736f6c63430008090033", + "value": "0x0", + "type": "CREATE" +} \ No newline at end of file diff --git a/test/historicstate/hardhat/scripts/geth_traces/Tracer.deploy.defaultTracer.json b/test/historicstate/hardhat/scripts/geth_traces/Tracer.deploy.defaultTracer.json new file mode 100644 index 000000000..3f83b34c4 --- /dev/null +++ b/test/historicstate/hardhat/scripts/geth_traces/Tracer.deploy.defaultTracer.json @@ -0,0 +1,908 @@ +{ + "gas": 1610380, + "failed": false, + "returnValue": "60806040523480156200001157600080fd5b5060043610620000ac5760003560e01c80638bfe44ff116200006f5780638bfe44ff14620001975780639295436214620001a3578063a0712d6814620001af578063b69ef8a814620001e5578063c9353cb5146200020757620000ac565b806312065fe014620000b15780631c71706914620000d35780631c93908c14620000f55780633aa18088146200012b5780637f29c3941462000161575b600080fd5b620000bb62000227565b604051620000ca919062000997565b60405180910390f35b620000dd62000231565b604051620000ec9190620009cf565b60405180910390f35b6200011360048036038101906200010d919062000a2c565b62000280565b60405162000122919062000997565b60405180910390f35b62000149600480360381019062000143919062000a2c565b620002f6565b60405162000158919062000997565b60405180910390f35b6200017f600480360381019062000179919062000a2c565b620004ae565b6040516200018e919062000997565b60405180910390f35b620001a162000783565b005b620001ad620007c5565b005b620001cd6004803603810190620001c7919062000a2c565b62000802565b604051620001dc919062000997565b60405180910390f35b620001ef6200094f565b604051620001fe919062000997565b60405180910390f35b6200022560048036038101906200021f919062000ac3565b62000955565b005b6000600154905090565b6000806040518060400160405280600d81526020017f48656c6c6f2c20776f726c6421000000000000000000000000000000000000008152509050600081805190602001209050809250505090565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac083604051620002ca919062000b56565b60405180910390a28160036000828254620002e6919062000bb7565b9250508190555060029050919050565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac08360405162000340919062000c64565b60405180910390a260405162000356906200096e565b604051809103906000f08015801562000373573d6000803e3d6000fd5b506000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160016000828254620003c7919062000bb7565b92505081905550620003e7600183620003e1919062000bb7565b62000280565b50620003f262000231565b5060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b81526004016200044e919062000997565b602060405180830381600087803b1580156200046957600080fd5b505af11580156200047e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004a4919062000cad565b5060019050919050565b60003073ffffffffffffffffffffffffffffffffffffffff1663929543626040518163ffffffff1660e01b815260040160006040518083038186803b158015620004f757600080fd5b505afa92505050801562000509575060015b620005f2576200051862000cec565b806308c379a014156200057d57506200053062000d87565b806200053d57506200057f565b7f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a816040516200056e919062000eab565b60405180910390a150620005ec565b505b3d8060008114620005ad576040519150601f19603f3d011682016040523d82523d6000602084013e620005b2565b606091505b507f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a604051620005e29062000f45565b60405180910390a1505b620005f3565b5b3073ffffffffffffffffffffffffffffffffffffffff16638bfe44ff6040518163ffffffff1660e01b815260040160006040518083038186803b1580156200063a57600080fd5b505afa9250505080156200064c575060015b62000735576200065b62000cec565b806308c379a01415620006c057506200067362000d87565b80620006805750620006c2565b7f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a81604051620006b1919062000eab565b60405180910390a1506200072f565b505b3d8060008114620006f0576040519150601f19603f3d011682016040523d82523d6000602084013e620006f5565b606091505b507f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a604051620007259062000f45565b60405180910390a1505b62000736565b5b60006200077a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007719062000fb7565b60405180910390fd5b60019050919050565b6001806040517fcf479181000000000000000000000000000000000000000000000000000000008152600401620007bc92919062001026565b60405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007f990620010a3565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0836040516200084c919062000c64565b60405180910390a2816001600082825462000868919062000bb7565b925050819055506200088860018362000882919062000bb7565b62000280565b506200089362000231565b5060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b8152600401620008ef919062000997565b602060405180830381600087803b1580156200090a57600080fd5b505af11580156200091f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000945919062000cad565b5060019050919050565b60015481565b8073ffffffffffffffffffffffffffffffffffffffff16ff5b610ae380620010c683390190565b6000819050919050565b62000991816200097c565b82525050565b6000602082019050620009ae600083018462000986565b92915050565b6000819050919050565b620009c981620009b4565b82525050565b6000602082019050620009e66000830184620009be565b92915050565b6000604051905090565b600080fd5b62000a06816200097c565b811462000a1257600080fd5b50565b60008135905062000a2681620009fb565b92915050565b60006020828403121562000a455762000a44620009f6565b5b600062000a558482850162000a15565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000a8b8262000a5e565b9050919050565b62000a9d8162000a7e565b811462000aa957600080fd5b50565b60008135905062000abd8162000a92565b92915050565b60006020828403121562000adc5762000adb620009f6565b5b600062000aec8482850162000aac565b91505092915050565b600082825260208201905092915050565b7f696e7465726e616c20746f706963000000000000000000000000000000000000600082015250565b600062000b3e600e8362000af5565b915062000b4b8262000b06565b602082019050919050565b600060408201905062000b6d600083018462000986565b818103602083015262000b808162000b2f565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000bc4826200097c565b915062000bd1836200097c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000c095762000c0862000b88565b5b828201905092915050565b7f746f706963000000000000000000000000000000000000000000000000000000600082015250565b600062000c4c60058362000af5565b915062000c598262000c14565b602082019050919050565b600060408201905062000c7b600083018462000986565b818103602083015262000c8e8162000c3d565b905092915050565b60008151905062000ca781620009fb565b92915050565b60006020828403121562000cc65762000cc5620009f6565b5b600062000cd68482850162000c96565b91505092915050565b60008160e01c9050919050565b600060033d111562000d0e5760046000803e62000d0b60005162000cdf565b90505b90565b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000d5c8262000d11565b810181811067ffffffffffffffff8211171562000d7e5762000d7d62000d22565b5b80604052505050565b600060443d101562000d995762000e26565b62000da3620009ec565b60043d036004823e80513d602482011167ffffffffffffffff8211171562000dcd57505062000e26565b808201805167ffffffffffffffff81111562000ded575050505062000e26565b80602083010160043d03850181111562000e0c57505050505062000e26565b62000e1d8260200185018662000d51565b82955050505050505b90565b600081519050919050565b60005b8381101562000e5457808201518184015260208101905062000e37565b8381111562000e64576000848401525b50505050565b600062000e778262000e29565b62000e83818562000af5565b935062000e9581856020860162000e34565b62000ea08162000d11565b840191505092915050565b6000602082019050818103600083015262000ec7818462000e6a565b905092915050565b7f45787465726e616c2063616c6c206661696c656420776974686f757420616e2060008201527f6572726f72206d65737361676500000000000000000000000000000000000000602082015250565b600062000f2d602d8362000af5565b915062000f3a8262000ecf565b604082019050919050565b6000602082019050818103600083015262000f608162000f1e565b9050919050565b7f494e53554646494349454e542042414c414e4345000000000000000000000000600082015250565b600062000f9f60148362000af5565b915062000fac8262000f67565b602082019050919050565b6000602082019050818103600083015262000fd28162000f90565b9050919050565b6000819050919050565b6000819050919050565b60006200100e62001008620010028462000fd9565b62000fe3565b6200097c565b9050919050565b620010208162000fed565b82525050565b60006040820190506200103d600083018562001015565b6200104c602083018462001015565b9392505050565b7f546869732066756e6374696f6e20726576657274656421000000000000000000600082015250565b60006200108b60178362000af5565b9150620010988262001053565b602082019050919050565b60006020820190508181036000830152620010be816200107c565b905091905056fe60806040526000600160006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b50600160009054906101000a900460ff161562000080576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200007790620002b5565b60405180910390fd5b60018060006101000a81548160ff021916908315150217905550620000bc701d6329f1c35ca4bfabb9f5610000000000620000c360201b60201c565b5062000482565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0836040516200010d919062000342565b60405180910390a281600080828254620001289190620003a3565b925050819055506200014e600183620001429190620003a3565b6200016960201b60201c565b506200015f620001df60201b60201c565b5060019050919050565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac083604051620001b3919062000450565b60405180910390a28160026000828254620001cf9190620003a3565b9250508190555060029050919050565b6000806040518060400160405280600d81526020017f48656c6c6f2c20776f726c6421000000000000000000000000000000000000008152509050600081805190602001209050809250505090565b600082825260208201905092915050565b7f436f6e747261637420696e7374616e63652068617320616c726561647920626560008201527f656e20696e697469616c697a6564000000000000000000000000000000000000602082015250565b60006200029d602e836200022e565b9150620002aa826200023f565b604082019050919050565b60006020820190508181036000830152620002d0816200028e565b9050919050565b6000819050919050565b620002ec81620002d7565b82525050565b7f746f706963000000000000000000000000000000000000000000000000000000600082015250565b60006200032a6005836200022e565b91506200033782620002f2565b602082019050919050565b6000604082019050620003596000830184620002e1565b81810360208301526200036c816200031b565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620003b082620002d7565b9150620003bd83620002d7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620003f557620003f462000374565b5b828201905092915050565b7f696e7465726e616c20746f706963000000000000000000000000000000000000600082015250565b600062000438600e836200022e565b9150620004458262000400565b602082019050919050565b6000604082019050620004676000830184620002e1565b81810360208301526200047a8162000429565b905092915050565b61065180620004926000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c80631c717069146100675780631c93908c1461008557806392954362146100b5578063a0712d68146100bf578063b69ef8a8146100ef578063c9353cb51461010d575b600080fd5b61006f610129565b60405161007c91906102ed565b60405180910390f35b61009f600480360381019061009a9190610343565b610178565b6040516100ac919061037f565b60405180910390f35b6100bd6101ea565b005b6100d960048036038101906100d49190610343565b610225565b6040516100e6919061037f565b60405180910390f35b6100f76102b5565b604051610104919061037f565b60405180910390f35b610127600480360381019061012291906103f8565b6102bb565b005b6000806040518060400160405280600d81526020017f48656c6c6f2c20776f726c6421000000000000000000000000000000000000008152509050600081805190602001209050809250505090565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0836040516101c09190610482565b60405180910390a281600260008282546101da91906104df565b9250508190555060029050919050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161021c90610581565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac08360405161026d91906105ed565b60405180910390a28160008082825461028691906104df565b925050819055506102a260018361029d91906104df565b610178565b506102ab610129565b5060019050919050565b60005481565b8073ffffffffffffffffffffffffffffffffffffffff16ff5b6000819050919050565b6102e7816102d4565b82525050565b600060208201905061030260008301846102de565b92915050565b600080fd5b6000819050919050565b6103208161030d565b811461032b57600080fd5b50565b60008135905061033d81610317565b92915050565b60006020828403121561035957610358610308565b5b60006103678482850161032e565b91505092915050565b6103798161030d565b82525050565b60006020820190506103946000830184610370565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103c58261039a565b9050919050565b6103d5816103ba565b81146103e057600080fd5b50565b6000813590506103f2816103cc565b92915050565b60006020828403121561040e5761040d610308565b5b600061041c848285016103e3565b91505092915050565b600082825260208201905092915050565b7f696e7465726e616c20746f706963000000000000000000000000000000000000600082015250565b600061046c600e83610425565b915061047782610436565b602082019050919050565b60006040820190506104976000830184610370565b81810360208301526104a88161045f565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006104ea8261030d565b91506104f58361030d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561052a576105296104b0565b5b828201905092915050565b7f546869732066756e6374696f6e20726576657274656421000000000000000000600082015250565b600061056b601783610425565b915061057682610535565b602082019050919050565b6000602082019050818103600083015261059a8161055e565b9050919050565b7f746f706963000000000000000000000000000000000000000000000000000000600082015250565b60006105d7600583610425565b91506105e2826105a1565b602082019050919050565b60006040820190506106026000830184610370565b8181036020830152610613816105ca565b90509291505056fea26469706673582212208743accab6cfcd1c8ccb3f51b787d679e803a77ce24ec642bd068883132fd5fa64736f6c63430008090033a264697066735822122066241fedca9ebd69f0cd9e4879f75428f5d4bf734eb072e52934a8b3161581f064736f6c63430008090033", + "structLogs": [ + { + "pc": 0, + "op": "PUSH1", + "gas": 1940508, + "gasCost": 3, + "depth": 1, + "stack": [] + }, + { + "pc": 2, + "op": "PUSH1", + "gas": 1940505, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x80" + ] + }, + { + "pc": 4, + "op": "MSTORE", + "gas": 1940502, + "gasCost": 12, + "depth": 1, + "stack": [ + "0x80", + "0x40" + ] + }, + { + "pc": 5, + "op": "PUSH1", + "gas": 1940490, + "gasCost": 3, + "depth": 1, + "stack": [] + }, + { + "pc": 7, + "op": "PUSH1", + "gas": 1940487, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0" + ] + }, + { + "pc": 9, + "op": "PUSH1", + "gas": 1940484, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0", + "0x2" + ] + }, + { + "pc": 11, + "op": "PUSH2", + "gas": 1940481, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0", + "0x2", + "0x0" + ] + }, + { + "pc": 14, + "op": "EXP", + "gas": 1940478, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x0", + "0x2", + "0x0", + "0x100" + ] + }, + { + "pc": 15, + "op": "DUP2", + "gas": 1940468, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0", + "0x2", + "0x1" + ] + }, + { + "pc": 16, + "op": "SLOAD", + "gas": 1940465, + "gasCost": 2100, + "depth": 1, + "stack": [ + "0x0", + "0x2", + "0x1", + "0x2" + ], + "storage": { + "0000000000000000000000000000000000000000000000000000000000000002": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "pc": 17, + "op": "DUP2", + "gas": 1938365, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0", + "0x2", + "0x1", + "0x0" + ] + }, + { + "pc": 18, + "op": "PUSH1", + "gas": 1938362, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0", + "0x2", + "0x1", + "0x0", + "0x1" + ] + }, + { + "pc": 20, + "op": "MUL", + "gas": 1938359, + "gasCost": 5, + "depth": 1, + "stack": [ + "0x0", + "0x2", + "0x1", + "0x0", + "0x1", + "0xff" + ] + }, + { + "pc": 21, + "op": "NOT", + "gas": 1938354, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0", + "0x2", + "0x1", + "0x0", + "0xff" + ] + }, + { + "pc": 22, + "op": "AND", + "gas": 1938351, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0", + "0x2", + "0x1", + "0x0", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00" + ] + }, + { + "pc": 23, + "op": "SWAP1", + "gas": 1938348, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0", + "0x2", + "0x1", + "0x0" + ] + }, + { + "pc": 24, + "op": "DUP4", + "gas": 1938345, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0", + "0x2", + "0x0", + "0x1" + ] + }, + { + "pc": 25, + "op": "ISZERO", + "gas": 1938342, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0", + "0x2", + "0x0", + "0x1", + "0x0" + ] + }, + { + "pc": 26, + "op": "ISZERO", + "gas": 1938339, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0", + "0x2", + "0x0", + "0x1", + "0x1" + ] + }, + { + "pc": 27, + "op": "MUL", + "gas": 1938336, + "gasCost": 5, + "depth": 1, + "stack": [ + "0x0", + "0x2", + "0x0", + "0x1", + "0x0" + ] + }, + { + "pc": 28, + "op": "OR", + "gas": 1938331, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0", + "0x2", + "0x0", + "0x0" + ] + }, + { + "pc": 29, + "op": "SWAP1", + "gas": 1938328, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0", + "0x2", + "0x0" + ] + }, + { + "pc": 30, + "op": "SSTORE", + "gas": 1938325, + "gasCost": 100, + "depth": 1, + "stack": [ + "0x0", + "0x0", + "0x2" + ], + "storage": { + "0000000000000000000000000000000000000000000000000000000000000002": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "pc": 31, + "op": "POP", + "gas": 1938225, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x0" + ] + }, + { + "pc": 32, + "op": "CALLVALUE", + "gas": 1938223, + "gasCost": 2, + "depth": 1, + "stack": [] + }, + { + "pc": 33, + "op": "DUP1", + "gas": 1938221, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0" + ] + }, + { + "pc": 34, + "op": "ISZERO", + "gas": 1938218, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0", + "0x0" + ] + }, + { + "pc": 35, + "op": "PUSH2", + "gas": 1938215, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0", + "0x1" + ] + }, + { + "pc": 38, + "op": "JUMPI", + "gas": 1938212, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x0", + "0x1", + "0x2b" + ] + }, + { + "pc": 43, + "op": "JUMPDEST", + "gas": 1938202, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x0" + ] + }, + { + "pc": 44, + "op": "POP", + "gas": 1938201, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x0" + ] + }, + { + "pc": 45, + "op": "PUSH1", + "gas": 1938199, + "gasCost": 3, + "depth": 1, + "stack": [] + }, + { + "pc": 47, + "op": "PUSH1", + "gas": 1938196, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x2" + ] + }, + { + "pc": 49, + "op": "SWAP1", + "gas": 1938193, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x2", + "0x0" + ] + }, + { + "pc": 50, + "op": "SLOAD", + "gas": 1938190, + "gasCost": 100, + "depth": 1, + "stack": [ + "0x0", + "0x2" + ], + "storage": { + "0000000000000000000000000000000000000000000000000000000000000002": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "pc": 51, + "op": "SWAP1", + "gas": 1938090, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0", + "0x0" + ] + }, + { + "pc": 52, + "op": "PUSH2", + "gas": 1938087, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0", + "0x0" + ] + }, + { + "pc": 55, + "op": "EXP", + "gas": 1938084, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x0", + "0x0", + "0x100" + ] + }, + { + "pc": 56, + "op": "SWAP1", + "gas": 1938074, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0", + "0x1" + ] + }, + { + "pc": 57, + "op": "DIV", + "gas": 1938071, + "gasCost": 5, + "depth": 1, + "stack": [ + "0x1", + "0x0" + ] + }, + { + "pc": 58, + "op": "PUSH1", + "gas": 1938066, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0" + ] + }, + { + "pc": 60, + "op": "AND", + "gas": 1938063, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0", + "0xff" + ] + }, + { + "pc": 61, + "op": "ISZERO", + "gas": 1938060, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0" + ] + }, + { + "pc": 62, + "op": "PUSH2", + "gas": 1938057, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x1" + ] + }, + { + "pc": 65, + "op": "JUMPI", + "gas": 1938054, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x1", + "0x7c" + ] + }, + { + "pc": 124, + "op": "JUMPDEST", + "gas": 1938044, + "gasCost": 1, + "depth": 1, + "stack": [] + }, + { + "pc": 125, + "op": "PUSH1", + "gas": 1938043, + "gasCost": 3, + "depth": 1, + "stack": [] + }, + { + "pc": 127, + "op": "PUSH1", + "gas": 1938040, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x1" + ] + }, + { + "pc": 129, + "op": "PUSH1", + "gas": 1938037, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x1", + "0x2" + ] + }, + { + "pc": 131, + "op": "PUSH2", + "gas": 1938034, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x1", + "0x2", + "0x0" + ] + }, + { + "pc": 134, + "op": "EXP", + "gas": 1938031, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x1", + "0x2", + "0x0", + "0x100" + ] + }, + { + "pc": 135, + "op": "DUP2", + "gas": 1938021, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x1", + "0x2", + "0x1" + ] + }, + { + "pc": 136, + "op": "SLOAD", + "gas": 1938018, + "gasCost": 100, + "depth": 1, + "stack": [ + "0x1", + "0x2", + "0x1", + "0x2" + ], + "storage": { + "0000000000000000000000000000000000000000000000000000000000000002": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "pc": 137, + "op": "DUP2", + "gas": 1937918, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x1", + "0x2", + "0x1", + "0x0" + ] + }, + { + "pc": 138, + "op": "PUSH1", + "gas": 1937915, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x1", + "0x2", + "0x1", + "0x0", + "0x1" + ] + }, + { + "pc": 140, + "op": "MUL", + "gas": 1937912, + "gasCost": 5, + "depth": 1, + "stack": [ + "0x1", + "0x2", + "0x1", + "0x0", + "0x1", + "0xff" + ] + }, + { + "pc": 141, + "op": "NOT", + "gas": 1937907, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x1", + "0x2", + "0x1", + "0x0", + "0xff" + ] + }, + { + "pc": 142, + "op": "AND", + "gas": 1937904, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x1", + "0x2", + "0x1", + "0x0", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00" + ] + }, + { + "pc": 143, + "op": "SWAP1", + "gas": 1937901, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x1", + "0x2", + "0x1", + "0x0" + ] + }, + { + "pc": 144, + "op": "DUP4", + "gas": 1937898, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x1", + "0x2", + "0x0", + "0x1" + ] + }, + { + "pc": 145, + "op": "ISZERO", + "gas": 1937895, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x1", + "0x2", + "0x0", + "0x1", + "0x1" + ] + }, + { + "pc": 146, + "op": "ISZERO", + "gas": 1937892, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x1", + "0x2", + "0x0", + "0x1", + "0x0" + ] + }, + { + "pc": 147, + "op": "MUL", + "gas": 1937889, + "gasCost": 5, + "depth": 1, + "stack": [ + "0x1", + "0x2", + "0x0", + "0x1", + "0x1" + ] + }, + { + "pc": 148, + "op": "OR", + "gas": 1937884, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x1", + "0x2", + "0x0", + "0x1" + ] + }, + { + "pc": 149, + "op": "SWAP1", + "gas": 1937881, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x1", + "0x2", + "0x1" + ] + }, + { + "pc": 150, + "op": "SSTORE", + "gas": 1937878, + "gasCost": 20000, + "depth": 1, + "stack": [ + "0x1", + "0x1", + "0x2" + ], + "storage": { + "0000000000000000000000000000000000000000000000000000000000000002": "0000000000000000000000000000000000000000000000000000000000000001" + } + }, + { + "pc": 151, + "op": "POP", + "gas": 1917878, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x1" + ] + }, + { + "pc": 152, + "op": "PUSH2", + "gas": 1917876, + "gasCost": 3, + "depth": 1, + "stack": [] + }, + { + "pc": 155, + "op": "JUMP", + "gas": 1917873, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x13f" + ] + }, + { + "pc": 319, + "op": "JUMPDEST", + "gas": 1917865, + "gasCost": 1, + "depth": 1, + "stack": [] + }, + { + "pc": 320, + "op": "PUSH2", + "gas": 1917864, + "gasCost": 3, + "depth": 1, + "stack": [] + }, + { + "pc": 323, + "op": "DUP1", + "gas": 1917861, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x1bde" + ] + }, + { + "pc": 324, + "op": "PUSH2", + "gas": 1917858, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x1bde", + "0x1bde" + ] + }, + { + "pc": 327, + "op": "PUSH1", + "gas": 1917855, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x1bde", + "0x1bde", + "0x14e" + ] + }, + { + "pc": 329, + "op": "CODECOPY", + "gas": 1917852, + "gasCost": 1429, + "depth": 1, + "stack": [ + "0x1bde", + "0x1bde", + "0x14e", + "0x0" + ] + }, + { + "pc": 330, + "op": "PUSH1", + "gas": 1916423, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x1bde" + ] + }, + { + "pc": 332, + "op": "RETURN", + "gas": 1916420, + "gasCost": 0, + "depth": 1, + "stack": [ + "0x1bde", + "0x0" + ] + } + ] +} \ No newline at end of file diff --git a/test/historicstate/hardhat/scripts/geth_traces/Tracer.deploy.prestateDiffTracer.json b/test/historicstate/hardhat/scripts/geth_traces/Tracer.deploy.prestateDiffTracer.json new file mode 100644 index 000000000..fc07703fa --- /dev/null +++ b/test/historicstate/hardhat/scripts/geth_traces/Tracer.deploy.prestateDiffTracer.json @@ -0,0 +1,30 @@ +{ + "post": { + "0x0000000000000000000000000000000000000000": { + "balance": "0x1b4d4a6" + }, + "OWNER.address": { + "balance": "0x3611ac5ad359e668e5", + "nonce": 79 + }, + "Tracer.address": { + "code": "0x60806040523480156200001157600080fd5b5060043610620000ac5760003560e01c80638bfe44ff116200006f5780638bfe44ff14620001975780639295436214620001a3578063a0712d6814620001af578063b69ef8a814620001e5578063c9353cb5146200020757620000ac565b806312065fe014620000b15780631c71706914620000d35780631c93908c14620000f55780633aa18088146200012b5780637f29c3941462000161575b600080fd5b620000bb62000227565b604051620000ca919062000997565b60405180910390f35b620000dd62000231565b604051620000ec9190620009cf565b60405180910390f35b6200011360048036038101906200010d919062000a2c565b62000280565b60405162000122919062000997565b60405180910390f35b62000149600480360381019062000143919062000a2c565b620002f6565b60405162000158919062000997565b60405180910390f35b6200017f600480360381019062000179919062000a2c565b620004ae565b6040516200018e919062000997565b60405180910390f35b620001a162000783565b005b620001ad620007c5565b005b620001cd6004803603810190620001c7919062000a2c565b62000802565b604051620001dc919062000997565b60405180910390f35b620001ef6200094f565b604051620001fe919062000997565b60405180910390f35b6200022560048036038101906200021f919062000ac3565b62000955565b005b6000600154905090565b6000806040518060400160405280600d81526020017f48656c6c6f2c20776f726c6421000000000000000000000000000000000000008152509050600081805190602001209050809250505090565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac083604051620002ca919062000b56565b60405180910390a28160036000828254620002e6919062000bb7565b9250508190555060029050919050565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac08360405162000340919062000c64565b60405180910390a260405162000356906200096e565b604051809103906000f08015801562000373573d6000803e3d6000fd5b506000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160016000828254620003c7919062000bb7565b92505081905550620003e7600183620003e1919062000bb7565b62000280565b50620003f262000231565b5060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b81526004016200044e919062000997565b602060405180830381600087803b1580156200046957600080fd5b505af11580156200047e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004a4919062000cad565b5060019050919050565b60003073ffffffffffffffffffffffffffffffffffffffff1663929543626040518163ffffffff1660e01b815260040160006040518083038186803b158015620004f757600080fd5b505afa92505050801562000509575060015b620005f2576200051862000cec565b806308c379a014156200057d57506200053062000d87565b806200053d57506200057f565b7f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a816040516200056e919062000eab565b60405180910390a150620005ec565b505b3d8060008114620005ad576040519150601f19603f3d011682016040523d82523d6000602084013e620005b2565b606091505b507f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a604051620005e29062000f45565b60405180910390a1505b620005f3565b5b3073ffffffffffffffffffffffffffffffffffffffff16638bfe44ff6040518163ffffffff1660e01b815260040160006040518083038186803b1580156200063a57600080fd5b505afa9250505080156200064c575060015b62000735576200065b62000cec565b806308c379a01415620006c057506200067362000d87565b80620006805750620006c2565b7f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a81604051620006b1919062000eab565b60405180910390a1506200072f565b505b3d8060008114620006f0576040519150601f19603f3d011682016040523d82523d6000602084013e620006f5565b606091505b507f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a604051620007259062000f45565b60405180910390a1505b62000736565b5b60006200077a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007719062000fb7565b60405180910390fd5b60019050919050565b6001806040517fcf479181000000000000000000000000000000000000000000000000000000008152600401620007bc92919062001026565b60405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007f990620010a3565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0836040516200084c919062000c64565b60405180910390a2816001600082825462000868919062000bb7565b925050819055506200088860018362000882919062000bb7565b62000280565b506200089362000231565b5060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b8152600401620008ef919062000997565b602060405180830381600087803b1580156200090a57600080fd5b505af11580156200091f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000945919062000cad565b5060019050919050565b60015481565b8073ffffffffffffffffffffffffffffffffffffffff16ff5b610ae380620010c683390190565b6000819050919050565b62000991816200097c565b82525050565b6000602082019050620009ae600083018462000986565b92915050565b6000819050919050565b620009c981620009b4565b82525050565b6000602082019050620009e66000830184620009be565b92915050565b6000604051905090565b600080fd5b62000a06816200097c565b811462000a1257600080fd5b50565b60008135905062000a2681620009fb565b92915050565b60006020828403121562000a455762000a44620009f6565b5b600062000a558482850162000a15565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000a8b8262000a5e565b9050919050565b62000a9d8162000a7e565b811462000aa957600080fd5b50565b60008135905062000abd8162000a92565b92915050565b60006020828403121562000adc5762000adb620009f6565b5b600062000aec8482850162000aac565b91505092915050565b600082825260208201905092915050565b7f696e7465726e616c20746f706963000000000000000000000000000000000000600082015250565b600062000b3e600e8362000af5565b915062000b4b8262000b06565b602082019050919050565b600060408201905062000b6d600083018462000986565b818103602083015262000b808162000b2f565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000bc4826200097c565b915062000bd1836200097c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000c095762000c0862000b88565b5b828201905092915050565b7f746f706963000000000000000000000000000000000000000000000000000000600082015250565b600062000c4c60058362000af5565b915062000c598262000c14565b602082019050919050565b600060408201905062000c7b600083018462000986565b818103602083015262000c8e8162000c3d565b905092915050565b60008151905062000ca781620009fb565b92915050565b60006020828403121562000cc65762000cc5620009f6565b5b600062000cd68482850162000c96565b91505092915050565b60008160e01c9050919050565b600060033d111562000d0e5760046000803e62000d0b60005162000cdf565b90505b90565b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000d5c8262000d11565b810181811067ffffffffffffffff8211171562000d7e5762000d7d62000d22565b5b80604052505050565b600060443d101562000d995762000e26565b62000da3620009ec565b60043d036004823e80513d602482011167ffffffffffffffff8211171562000dcd57505062000e26565b808201805167ffffffffffffffff81111562000ded575050505062000e26565b80602083010160043d03850181111562000e0c57505050505062000e26565b62000e1d8260200185018662000d51565b82955050505050505b90565b600081519050919050565b60005b8381101562000e5457808201518184015260208101905062000e37565b8381111562000e64576000848401525b50505050565b600062000e778262000e29565b62000e83818562000af5565b935062000e9581856020860162000e34565b62000ea08162000d11565b840191505092915050565b6000602082019050818103600083015262000ec7818462000e6a565b905092915050565b7f45787465726e616c2063616c6c206661696c656420776974686f757420616e2060008201527f6572726f72206d65737361676500000000000000000000000000000000000000602082015250565b600062000f2d602d8362000af5565b915062000f3a8262000ecf565b604082019050919050565b6000602082019050818103600083015262000f608162000f1e565b9050919050565b7f494e53554646494349454e542042414c414e4345000000000000000000000000600082015250565b600062000f9f60148362000af5565b915062000fac8262000f67565b602082019050919050565b6000602082019050818103600083015262000fd28162000f90565b9050919050565b6000819050919050565b6000819050919050565b60006200100e62001008620010028462000fd9565b62000fe3565b6200097c565b9050919050565b620010208162000fed565b82525050565b60006040820190506200103d600083018562001015565b6200104c602083018462001015565b9392505050565b7f546869732066756e6374696f6e20726576657274656421000000000000000000600082015250565b60006200108b60178362000af5565b9150620010988262001053565b602082019050919050565b60006020820190508181036000830152620010be816200107c565b905091905056fe60806040526000600160006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b50600160009054906101000a900460ff161562000080576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200007790620002b5565b60405180910390fd5b60018060006101000a81548160ff021916908315150217905550620000bc701d6329f1c35ca4bfabb9f5610000000000620000c360201b60201c565b5062000482565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0836040516200010d919062000342565b60405180910390a281600080828254620001289190620003a3565b925050819055506200014e600183620001429190620003a3565b6200016960201b60201c565b506200015f620001df60201b60201c565b5060019050919050565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac083604051620001b3919062000450565b60405180910390a28160026000828254620001cf9190620003a3565b9250508190555060029050919050565b6000806040518060400160405280600d81526020017f48656c6c6f2c20776f726c6421000000000000000000000000000000000000008152509050600081805190602001209050809250505090565b600082825260208201905092915050565b7f436f6e747261637420696e7374616e63652068617320616c726561647920626560008201527f656e20696e697469616c697a6564000000000000000000000000000000000000602082015250565b60006200029d602e836200022e565b9150620002aa826200023f565b604082019050919050565b60006020820190508181036000830152620002d0816200028e565b9050919050565b6000819050919050565b620002ec81620002d7565b82525050565b7f746f706963000000000000000000000000000000000000000000000000000000600082015250565b60006200032a6005836200022e565b91506200033782620002f2565b602082019050919050565b6000604082019050620003596000830184620002e1565b81810360208301526200036c816200031b565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620003b082620002d7565b9150620003bd83620002d7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620003f557620003f462000374565b5b828201905092915050565b7f696e7465726e616c20746f706963000000000000000000000000000000000000600082015250565b600062000438600e836200022e565b9150620004458262000400565b602082019050919050565b6000604082019050620004676000830184620002e1565b81810360208301526200047a8162000429565b905092915050565b61065180620004926000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c80631c717069146100675780631c93908c1461008557806392954362146100b5578063a0712d68146100bf578063b69ef8a8146100ef578063c9353cb51461010d575b600080fd5b61006f610129565b60405161007c91906102ed565b60405180910390f35b61009f600480360381019061009a9190610343565b610178565b6040516100ac919061037f565b60405180910390f35b6100bd6101ea565b005b6100d960048036038101906100d49190610343565b610225565b6040516100e6919061037f565b60405180910390f35b6100f76102b5565b604051610104919061037f565b60405180910390f35b610127600480360381019061012291906103f8565b6102bb565b005b6000806040518060400160405280600d81526020017f48656c6c6f2c20776f726c6421000000000000000000000000000000000000008152509050600081805190602001209050809250505090565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0836040516101c09190610482565b60405180910390a281600260008282546101da91906104df565b9250508190555060029050919050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161021c90610581565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac08360405161026d91906105ed565b60405180910390a28160008082825461028691906104df565b925050819055506102a260018361029d91906104df565b610178565b506102ab610129565b5060019050919050565b60005481565b8073ffffffffffffffffffffffffffffffffffffffff16ff5b6000819050919050565b6102e7816102d4565b82525050565b600060208201905061030260008301846102de565b92915050565b600080fd5b6000819050919050565b6103208161030d565b811461032b57600080fd5b50565b60008135905061033d81610317565b92915050565b60006020828403121561035957610358610308565b5b60006103678482850161032e565b91505092915050565b6103798161030d565b82525050565b60006020820190506103946000830184610370565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103c58261039a565b9050919050565b6103d5816103ba565b81146103e057600080fd5b50565b6000813590506103f2816103cc565b92915050565b60006020828403121561040e5761040d610308565b5b600061041c848285016103e3565b91505092915050565b600082825260208201905092915050565b7f696e7465726e616c20746f706963000000000000000000000000000000000000600082015250565b600061046c600e83610425565b915061047782610436565b602082019050919050565b60006040820190506104976000830184610370565b81810360208301526104a88161045f565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006104ea8261030d565b91506104f58361030d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561052a576105296104b0565b5b828201905092915050565b7f546869732066756e6374696f6e20726576657274656421000000000000000000600082015250565b600061056b601783610425565b915061057682610535565b602082019050919050565b6000602082019050818103600083015261059a8161055e565b9050919050565b7f746f706963000000000000000000000000000000000000000000000000000000600082015250565b60006105d7600583610425565b91506105e2826105a1565b602082019050919050565b60006040820190506106026000830184610370565b8181036020830152610613816105ca565b90509291505056fea26469706673582212208743accab6cfcd1c8ccb3f51b787d679e803a77ce24ec642bd068883132fd5fa64736f6c63430008090033a264697066735822122066241fedca9ebd69f0cd9e4879f75428f5d4bf734eb072e52934a8b3161581f064736f6c63430008090033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000001" + } + } + }, + "pre": { + "0x0000000000000000000000000000000000000000": { + "balance": "0x19c421a" + }, + "OWNER.address": { + "balance": "0x3611ac5ae39cd182dd", + "nonce": 78 + }, + "Tracer.address": { + "balance": "0x0", + "nonce": 1 + } + } +} \ No newline at end of file diff --git a/test/historicstate/hardhat/scripts/geth_traces/Tracer.deploy.prestateTracer.json b/test/historicstate/hardhat/scripts/geth_traces/Tracer.deploy.prestateTracer.json new file mode 100644 index 000000000..321757829 --- /dev/null +++ b/test/historicstate/hardhat/scripts/geth_traces/Tracer.deploy.prestateTracer.json @@ -0,0 +1,16 @@ +{ + "0x0000000000000000000000000000000000000000": { + "balance": "0x19c421a" + }, + "OWNER.address": { + "balance": "0x3611ac5ae39cd182dd", + "nonce": 78 + }, + "Tracer.address": { + "balance": "0x0", + "nonce": 1, + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + } +} \ No newline at end of file diff --git a/test/historicstate/hardhat/scripts/geth_traces/Tracer.getBalance.4byteTracer.json b/test/historicstate/hardhat/scripts/geth_traces/Tracer.getBalance.4byteTracer.json new file mode 100644 index 000000000..125e46e85 --- /dev/null +++ b/test/historicstate/hardhat/scripts/geth_traces/Tracer.getBalance.4byteTracer.json @@ -0,0 +1,3 @@ +{ + "0x12065fe0-0": 1 +} \ No newline at end of file diff --git a/test/historicstate/hardhat/scripts/geth_traces/Tracer.getBalance.callTracer.json b/test/historicstate/hardhat/scripts/geth_traces/Tracer.getBalance.callTracer.json new file mode 100644 index 000000000..eb1061ac5 --- /dev/null +++ b/test/historicstate/hardhat/scripts/geth_traces/Tracer.getBalance.callTracer.json @@ -0,0 +1,10 @@ +{ + "from": "CALL.address", + "gas": "0x2faf080", + "gasUsed": "0x5bce", + "to": "Tracer.address", + "input": "0x12065fe0", + "output": "0x00000000000000000000000000000000000000000000000000000000000003e8", + "value": "0x0", + "type": "CALL" +} \ No newline at end of file diff --git a/test/historicstate/hardhat/scripts/geth_traces/Tracer.getBalance.defaultTracer.json b/test/historicstate/hardhat/scripts/geth_traces/Tracer.getBalance.defaultTracer.json new file mode 100644 index 000000000..820376d8d --- /dev/null +++ b/test/historicstate/hardhat/scripts/geth_traces/Tracer.getBalance.defaultTracer.json @@ -0,0 +1,1325 @@ +{ + "gas": 23502, + "failed": false, + "returnValue": "00000000000000000000000000000000000000000000000000000000000003e8", + "structLogs": [ + { + "pc": 0, + "op": "PUSH1", + "gas": 49978936, + "gasCost": 3, + "depth": 1, + "stack": [] + }, + { + "pc": 2, + "op": "PUSH1", + "gas": 49978933, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x80" + ] + }, + { + "pc": 4, + "op": "MSTORE", + "gas": 49978930, + "gasCost": 12, + "depth": 1, + "stack": [ + "0x80", + "0x40" + ] + }, + { + "pc": 5, + "op": "CALLVALUE", + "gas": 49978918, + "gasCost": 2, + "depth": 1, + "stack": [] + }, + { + "pc": 6, + "op": "DUP1", + "gas": 49978916, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0" + ] + }, + { + "pc": 7, + "op": "ISZERO", + "gas": 49978913, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0", + "0x0" + ] + }, + { + "pc": 8, + "op": "PUSH3", + "gas": 49978910, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0", + "0x1" + ] + }, + { + "pc": 12, + "op": "JUMPI", + "gas": 49978907, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x0", + "0x1", + "0x11" + ] + }, + { + "pc": 17, + "op": "JUMPDEST", + "gas": 49978897, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x0" + ] + }, + { + "pc": 18, + "op": "POP", + "gas": 49978896, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x0" + ] + }, + { + "pc": 19, + "op": "PUSH1", + "gas": 49978894, + "gasCost": 3, + "depth": 1, + "stack": [] + }, + { + "pc": 21, + "op": "CALLDATASIZE", + "gas": 49978891, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x4" + ] + }, + { + "pc": 22, + "op": "LT", + "gas": 49978889, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x4", + "0x4" + ] + }, + { + "pc": 23, + "op": "PUSH3", + "gas": 49978886, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0" + ] + }, + { + "pc": 27, + "op": "JUMPI", + "gas": 49978883, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x0", + "0xac" + ] + }, + { + "pc": 28, + "op": "PUSH1", + "gas": 49978873, + "gasCost": 3, + "depth": 1, + "stack": [] + }, + { + "pc": 30, + "op": "CALLDATALOAD", + "gas": 49978870, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0" + ] + }, + { + "pc": 31, + "op": "PUSH1", + "gas": 49978867, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe000000000000000000000000000000000000000000000000000000000" + ] + }, + { + "pc": 33, + "op": "SHR", + "gas": 49978864, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe000000000000000000000000000000000000000000000000000000000", + "0xe0" + ] + }, + { + "pc": 34, + "op": "DUP1", + "gas": 49978861, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0" + ] + }, + { + "pc": 35, + "op": "PUSH4", + "gas": 49978858, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0x12065fe0" + ] + }, + { + "pc": 40, + "op": "GT", + "gas": 49978855, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0x12065fe0", + "0x8bfe44ff" + ] + }, + { + "pc": 41, + "op": "PUSH3", + "gas": 49978852, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0x1" + ] + }, + { + "pc": 45, + "op": "JUMPI", + "gas": 49978849, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x12065fe0", + "0x1", + "0x6f" + ] + }, + { + "pc": 111, + "op": "JUMPDEST", + "gas": 49978839, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x12065fe0" + ] + }, + { + "pc": 112, + "op": "DUP1", + "gas": 49978838, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0" + ] + }, + { + "pc": 113, + "op": "PUSH4", + "gas": 49978835, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0x12065fe0" + ] + }, + { + "pc": 118, + "op": "EQ", + "gas": 49978832, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0x12065fe0", + "0x12065fe0" + ] + }, + { + "pc": 119, + "op": "PUSH3", + "gas": 49978829, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0x1" + ] + }, + { + "pc": 123, + "op": "JUMPI", + "gas": 49978826, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x12065fe0", + "0x1", + "0xb1" + ] + }, + { + "pc": 177, + "op": "JUMPDEST", + "gas": 49978816, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x12065fe0" + ] + }, + { + "pc": 178, + "op": "PUSH3", + "gas": 49978815, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0" + ] + }, + { + "pc": 182, + "op": "PUSH3", + "gas": 49978812, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xbb" + ] + }, + { + "pc": 186, + "op": "JUMP", + "gas": 49978809, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xbb", + "0x227" + ] + }, + { + "pc": 551, + "op": "JUMPDEST", + "gas": 49978801, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xbb" + ] + }, + { + "pc": 552, + "op": "PUSH1", + "gas": 49978800, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xbb" + ] + }, + { + "pc": 554, + "op": "PUSH1", + "gas": 49978797, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xbb", + "0x0" + ] + }, + { + "pc": 556, + "op": "SLOAD", + "gas": 49978794, + "gasCost": 2100, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xbb", + "0x0", + "0x1" + ], + "storage": { + "0000000000000000000000000000000000000000000000000000000000000001": "00000000000000000000000000000000000000000000000000000000000003e8" + } + }, + { + "pc": 557, + "op": "SWAP1", + "gas": 49976694, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xbb", + "0x0", + "0x3e8" + ] + }, + { + "pc": 558, + "op": "POP", + "gas": 49976691, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xbb", + "0x3e8", + "0x0" + ] + }, + { + "pc": 559, + "op": "SWAP1", + "gas": 49976689, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xbb", + "0x3e8" + ] + }, + { + "pc": 560, + "op": "JUMP", + "gas": 49976686, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x12065fe0", + "0x3e8", + "0xbb" + ] + }, + { + "pc": 187, + "op": "JUMPDEST", + "gas": 49976678, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x12065fe0", + "0x3e8" + ] + }, + { + "pc": 188, + "op": "PUSH1", + "gas": 49976677, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0x3e8" + ] + }, + { + "pc": 190, + "op": "MLOAD", + "gas": 49976674, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0x3e8", + "0x40" + ] + }, + { + "pc": 191, + "op": "PUSH3", + "gas": 49976671, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0x3e8", + "0x80" + ] + }, + { + "pc": 195, + "op": "SWAP2", + "gas": 49976668, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0x3e8", + "0x80", + "0xca" + ] + }, + { + "pc": 196, + "op": "SWAP1", + "gas": 49976665, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x80", + "0x3e8" + ] + }, + { + "pc": 197, + "op": "PUSH3", + "gas": 49976662, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80" + ] + }, + { + "pc": 201, + "op": "JUMP", + "gas": 49976659, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0x997" + ] + }, + { + "pc": 2455, + "op": "JUMPDEST", + "gas": 49976651, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80" + ] + }, + { + "pc": 2456, + "op": "PUSH1", + "gas": 49976650, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80" + ] + }, + { + "pc": 2458, + "op": "PUSH1", + "gas": 49976647, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0x0" + ] + }, + { + "pc": 2460, + "op": "DUP3", + "gas": 49976644, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0x0", + "0x20" + ] + }, + { + "pc": 2461, + "op": "ADD", + "gas": 49976641, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0x0", + "0x20", + "0x80" + ] + }, + { + "pc": 2462, + "op": "SWAP1", + "gas": 49976638, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0x0", + "0xa0" + ] + }, + { + "pc": 2463, + "op": "POP", + "gas": 49976635, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0xa0", + "0x0" + ] + }, + { + "pc": 2464, + "op": "PUSH3", + "gas": 49976633, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0xa0" + ] + }, + { + "pc": 2468, + "op": "PUSH1", + "gas": 49976630, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0xa0", + "0x9ae" + ] + }, + { + "pc": 2470, + "op": "DUP4", + "gas": 49976627, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0xa0", + "0x9ae", + "0x0" + ] + }, + { + "pc": 2471, + "op": "ADD", + "gas": 49976624, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0xa0", + "0x9ae", + "0x0", + "0x80" + ] + }, + { + "pc": 2472, + "op": "DUP5", + "gas": 49976621, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0xa0", + "0x9ae", + "0x80" + ] + }, + { + "pc": 2473, + "op": "PUSH3", + "gas": 49976618, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0xa0", + "0x9ae", + "0x80", + "0x3e8" + ] + }, + { + "pc": 2477, + "op": "JUMP", + "gas": 49976615, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0xa0", + "0x9ae", + "0x80", + "0x3e8", + "0x986" + ] + }, + { + "pc": 2438, + "op": "JUMPDEST", + "gas": 49976607, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0xa0", + "0x9ae", + "0x80", + "0x3e8" + ] + }, + { + "pc": 2439, + "op": "PUSH3", + "gas": 49976606, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0xa0", + "0x9ae", + "0x80", + "0x3e8" + ] + }, + { + "pc": 2443, + "op": "DUP2", + "gas": 49976603, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0xa0", + "0x9ae", + "0x80", + "0x3e8", + "0x991" + ] + }, + { + "pc": 2444, + "op": "PUSH3", + "gas": 49976600, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0xa0", + "0x9ae", + "0x80", + "0x3e8", + "0x991", + "0x3e8" + ] + }, + { + "pc": 2448, + "op": "JUMP", + "gas": 49976597, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0xa0", + "0x9ae", + "0x80", + "0x3e8", + "0x991", + "0x3e8", + "0x97c" + ] + }, + { + "pc": 2428, + "op": "JUMPDEST", + "gas": 49976589, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0xa0", + "0x9ae", + "0x80", + "0x3e8", + "0x991", + "0x3e8" + ] + }, + { + "pc": 2429, + "op": "PUSH1", + "gas": 49976588, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0xa0", + "0x9ae", + "0x80", + "0x3e8", + "0x991", + "0x3e8" + ] + }, + { + "pc": 2431, + "op": "DUP2", + "gas": 49976585, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0xa0", + "0x9ae", + "0x80", + "0x3e8", + "0x991", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2432, + "op": "SWAP1", + "gas": 49976582, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0xa0", + "0x9ae", + "0x80", + "0x3e8", + "0x991", + "0x3e8", + "0x0", + "0x3e8" + ] + }, + { + "pc": 2433, + "op": "POP", + "gas": 49976579, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0xa0", + "0x9ae", + "0x80", + "0x3e8", + "0x991", + "0x3e8", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2434, + "op": "SWAP2", + "gas": 49976577, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0xa0", + "0x9ae", + "0x80", + "0x3e8", + "0x991", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 2435, + "op": "SWAP1", + "gas": 49976574, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0xa0", + "0x9ae", + "0x80", + "0x3e8", + "0x3e8", + "0x3e8", + "0x991" + ] + }, + { + "pc": 2436, + "op": "POP", + "gas": 49976571, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0xa0", + "0x9ae", + "0x80", + "0x3e8", + "0x3e8", + "0x991", + "0x3e8" + ] + }, + { + "pc": 2437, + "op": "JUMP", + "gas": 49976569, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0xa0", + "0x9ae", + "0x80", + "0x3e8", + "0x3e8", + "0x991" + ] + }, + { + "pc": 2449, + "op": "JUMPDEST", + "gas": 49976561, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0xa0", + "0x9ae", + "0x80", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 2450, + "op": "DUP3", + "gas": 49976560, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0xa0", + "0x9ae", + "0x80", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 2451, + "op": "MSTORE", + "gas": 49976557, + "gasCost": 9, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0xa0", + "0x9ae", + "0x80", + "0x3e8", + "0x3e8", + "0x80" + ] + }, + { + "pc": 2452, + "op": "POP", + "gas": 49976548, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0xa0", + "0x9ae", + "0x80", + "0x3e8" + ] + }, + { + "pc": 2453, + "op": "POP", + "gas": 49976546, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0xa0", + "0x9ae", + "0x80" + ] + }, + { + "pc": 2454, + "op": "JUMP", + "gas": 49976544, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0xa0", + "0x9ae" + ] + }, + { + "pc": 2478, + "op": "JUMPDEST", + "gas": 49976536, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0xa0" + ] + }, + { + "pc": 2479, + "op": "SWAP3", + "gas": 49976535, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xca", + "0x3e8", + "0x80", + "0xa0" + ] + }, + { + "pc": 2480, + "op": "SWAP2", + "gas": 49976532, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xa0", + "0x3e8", + "0x80", + "0xca" + ] + }, + { + "pc": 2481, + "op": "POP", + "gas": 49976529, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xa0", + "0xca", + "0x80", + "0x3e8" + ] + }, + { + "pc": 2482, + "op": "POP", + "gas": 49976527, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xa0", + "0xca", + "0x80" + ] + }, + { + "pc": 2483, + "op": "JUMP", + "gas": 49976525, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xa0", + "0xca" + ] + }, + { + "pc": 202, + "op": "JUMPDEST", + "gas": 49976517, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xa0" + ] + }, + { + "pc": 203, + "op": "PUSH1", + "gas": 49976516, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xa0" + ] + }, + { + "pc": 205, + "op": "MLOAD", + "gas": 49976513, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xa0", + "0x40" + ] + }, + { + "pc": 206, + "op": "DUP1", + "gas": 49976510, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xa0", + "0x80" + ] + }, + { + "pc": 207, + "op": "SWAP2", + "gas": 49976507, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0xa0", + "0x80", + "0x80" + ] + }, + { + "pc": 208, + "op": "SUB", + "gas": 49976504, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0x80", + "0x80", + "0xa0" + ] + }, + { + "pc": 209, + "op": "SWAP1", + "gas": 49976501, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x12065fe0", + "0x80", + "0x20" + ] + }, + { + "pc": 210, + "op": "RETURN", + "gas": 49976498, + "gasCost": 0, + "depth": 1, + "stack": [ + "0x12065fe0", + "0x20", + "0x80" + ] + } + ] +} \ No newline at end of file diff --git a/test/historicstate/hardhat/scripts/geth_traces/Tracer.getBalance.prestateDiffTracer.json b/test/historicstate/hardhat/scripts/geth_traces/Tracer.getBalance.prestateDiffTracer.json new file mode 100644 index 000000000..204b247ee --- /dev/null +++ b/test/historicstate/hardhat/scripts/geth_traces/Tracer.getBalance.prestateDiffTracer.json @@ -0,0 +1,12 @@ +{ + "post": { + "CALL.address": { + "nonce": 1 + } + }, + "pre": { + "CALL.address": { + "balance": "0x0" + } + } +} \ No newline at end of file diff --git a/test/historicstate/hardhat/scripts/geth_traces/Tracer.getBalance.prestateTracer.json b/test/historicstate/hardhat/scripts/geth_traces/Tracer.getBalance.prestateTracer.json new file mode 100644 index 000000000..5b933285f --- /dev/null +++ b/test/historicstate/hardhat/scripts/geth_traces/Tracer.getBalance.prestateTracer.json @@ -0,0 +1,16 @@ +{ + "0x0000000000000000000000000000000000000000": { + "balance": "0x1bf279a" + }, + "Tracer.address": { + "balance": "0x0", + "code": "0x60806040523480156200001157600080fd5b5060043610620000ac5760003560e01c80638bfe44ff116200006f5780638bfe44ff14620001975780639295436214620001a3578063a0712d6814620001af578063b69ef8a814620001e5578063c9353cb5146200020757620000ac565b806312065fe014620000b15780631c71706914620000d35780631c93908c14620000f55780633aa18088146200012b5780637f29c3941462000161575b600080fd5b620000bb62000227565b604051620000ca919062000997565b60405180910390f35b620000dd62000231565b604051620000ec9190620009cf565b60405180910390f35b6200011360048036038101906200010d919062000a2c565b62000280565b60405162000122919062000997565b60405180910390f35b62000149600480360381019062000143919062000a2c565b620002f6565b60405162000158919062000997565b60405180910390f35b6200017f600480360381019062000179919062000a2c565b620004ae565b6040516200018e919062000997565b60405180910390f35b620001a162000783565b005b620001ad620007c5565b005b620001cd6004803603810190620001c7919062000a2c565b62000802565b604051620001dc919062000997565b60405180910390f35b620001ef6200094f565b604051620001fe919062000997565b60405180910390f35b6200022560048036038101906200021f919062000ac3565b62000955565b005b6000600154905090565b6000806040518060400160405280600d81526020017f48656c6c6f2c20776f726c6421000000000000000000000000000000000000008152509050600081805190602001209050809250505090565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac083604051620002ca919062000b56565b60405180910390a28160036000828254620002e6919062000bb7565b9250508190555060029050919050565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac08360405162000340919062000c64565b60405180910390a260405162000356906200096e565b604051809103906000f08015801562000373573d6000803e3d6000fd5b506000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160016000828254620003c7919062000bb7565b92505081905550620003e7600183620003e1919062000bb7565b62000280565b50620003f262000231565b5060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b81526004016200044e919062000997565b602060405180830381600087803b1580156200046957600080fd5b505af11580156200047e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004a4919062000cad565b5060019050919050565b60003073ffffffffffffffffffffffffffffffffffffffff1663929543626040518163ffffffff1660e01b815260040160006040518083038186803b158015620004f757600080fd5b505afa92505050801562000509575060015b620005f2576200051862000cec565b806308c379a014156200057d57506200053062000d87565b806200053d57506200057f565b7f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a816040516200056e919062000eab565b60405180910390a150620005ec565b505b3d8060008114620005ad576040519150601f19603f3d011682016040523d82523d6000602084013e620005b2565b606091505b507f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a604051620005e29062000f45565b60405180910390a1505b620005f3565b5b3073ffffffffffffffffffffffffffffffffffffffff16638bfe44ff6040518163ffffffff1660e01b815260040160006040518083038186803b1580156200063a57600080fd5b505afa9250505080156200064c575060015b62000735576200065b62000cec565b806308c379a01415620006c057506200067362000d87565b80620006805750620006c2565b7f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a81604051620006b1919062000eab565b60405180910390a1506200072f565b505b3d8060008114620006f0576040519150601f19603f3d011682016040523d82523d6000602084013e620006f5565b606091505b507f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a604051620007259062000f45565b60405180910390a1505b62000736565b5b60006200077a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007719062000fb7565b60405180910390fd5b60019050919050565b6001806040517fcf479181000000000000000000000000000000000000000000000000000000008152600401620007bc92919062001026565b60405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007f990620010a3565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0836040516200084c919062000c64565b60405180910390a2816001600082825462000868919062000bb7565b925050819055506200088860018362000882919062000bb7565b62000280565b506200089362000231565b5060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b8152600401620008ef919062000997565b602060405180830381600087803b1580156200090a57600080fd5b505af11580156200091f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000945919062000cad565b5060019050919050565b60015481565b8073ffffffffffffffffffffffffffffffffffffffff16ff5b610ae380620010c683390190565b6000819050919050565b62000991816200097c565b82525050565b6000602082019050620009ae600083018462000986565b92915050565b6000819050919050565b620009c981620009b4565b82525050565b6000602082019050620009e66000830184620009be565b92915050565b6000604051905090565b600080fd5b62000a06816200097c565b811462000a1257600080fd5b50565b60008135905062000a2681620009fb565b92915050565b60006020828403121562000a455762000a44620009f6565b5b600062000a558482850162000a15565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000a8b8262000a5e565b9050919050565b62000a9d8162000a7e565b811462000aa957600080fd5b50565b60008135905062000abd8162000a92565b92915050565b60006020828403121562000adc5762000adb620009f6565b5b600062000aec8482850162000aac565b91505092915050565b600082825260208201905092915050565b7f696e7465726e616c20746f706963000000000000000000000000000000000000600082015250565b600062000b3e600e8362000af5565b915062000b4b8262000b06565b602082019050919050565b600060408201905062000b6d600083018462000986565b818103602083015262000b808162000b2f565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000bc4826200097c565b915062000bd1836200097c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000c095762000c0862000b88565b5b828201905092915050565b7f746f706963000000000000000000000000000000000000000000000000000000600082015250565b600062000c4c60058362000af5565b915062000c598262000c14565b602082019050919050565b600060408201905062000c7b600083018462000986565b818103602083015262000c8e8162000c3d565b905092915050565b60008151905062000ca781620009fb565b92915050565b60006020828403121562000cc65762000cc5620009f6565b5b600062000cd68482850162000c96565b91505092915050565b60008160e01c9050919050565b600060033d111562000d0e5760046000803e62000d0b60005162000cdf565b90505b90565b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000d5c8262000d11565b810181811067ffffffffffffffff8211171562000d7e5762000d7d62000d22565b5b80604052505050565b600060443d101562000d995762000e26565b62000da3620009ec565b60043d036004823e80513d602482011167ffffffffffffffff8211171562000dcd57505062000e26565b808201805167ffffffffffffffff81111562000ded575050505062000e26565b80602083010160043d03850181111562000e0c57505050505062000e26565b62000e1d8260200185018662000d51565b82955050505050505b90565b600081519050919050565b60005b8381101562000e5457808201518184015260208101905062000e37565b8381111562000e64576000848401525b50505050565b600062000e778262000e29565b62000e83818562000af5565b935062000e9581856020860162000e34565b62000ea08162000d11565b840191505092915050565b6000602082019050818103600083015262000ec7818462000e6a565b905092915050565b7f45787465726e616c2063616c6c206661696c656420776974686f757420616e2060008201527f6572726f72206d65737361676500000000000000000000000000000000000000602082015250565b600062000f2d602d8362000af5565b915062000f3a8262000ecf565b604082019050919050565b6000602082019050818103600083015262000f608162000f1e565b9050919050565b7f494e53554646494349454e542042414c414e4345000000000000000000000000600082015250565b600062000f9f60148362000af5565b915062000fac8262000f67565b602082019050919050565b6000602082019050818103600083015262000fd28162000f90565b9050919050565b6000819050919050565b6000819050919050565b60006200100e62001008620010028462000fd9565b62000fe3565b6200097c565b9050919050565b620010208162000fed565b82525050565b60006040820190506200103d600083018562001015565b6200104c602083018462001015565b9392505050565b7f546869732066756e6374696f6e20726576657274656421000000000000000000600082015250565b60006200108b60178362000af5565b9150620010988262001053565b602082019050919050565b60006020820190508181036000830152620010be816200107c565b905091905056fe60806040526000600160006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b50600160009054906101000a900460ff161562000080576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200007790620002b5565b60405180910390fd5b60018060006101000a81548160ff021916908315150217905550620000bc701d6329f1c35ca4bfabb9f5610000000000620000c360201b60201c565b5062000482565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0836040516200010d919062000342565b60405180910390a281600080828254620001289190620003a3565b925050819055506200014e600183620001429190620003a3565b6200016960201b60201c565b506200015f620001df60201b60201c565b5060019050919050565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac083604051620001b3919062000450565b60405180910390a28160026000828254620001cf9190620003a3565b9250508190555060029050919050565b6000806040518060400160405280600d81526020017f48656c6c6f2c20776f726c6421000000000000000000000000000000000000008152509050600081805190602001209050809250505090565b600082825260208201905092915050565b7f436f6e747261637420696e7374616e63652068617320616c726561647920626560008201527f656e20696e697469616c697a6564000000000000000000000000000000000000602082015250565b60006200029d602e836200022e565b9150620002aa826200023f565b604082019050919050565b60006020820190508181036000830152620002d0816200028e565b9050919050565b6000819050919050565b620002ec81620002d7565b82525050565b7f746f706963000000000000000000000000000000000000000000000000000000600082015250565b60006200032a6005836200022e565b91506200033782620002f2565b602082019050919050565b6000604082019050620003596000830184620002e1565b81810360208301526200036c816200031b565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620003b082620002d7565b9150620003bd83620002d7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620003f557620003f462000374565b5b828201905092915050565b7f696e7465726e616c20746f706963000000000000000000000000000000000000600082015250565b600062000438600e836200022e565b9150620004458262000400565b602082019050919050565b6000604082019050620004676000830184620002e1565b81810360208301526200047a8162000429565b905092915050565b61065180620004926000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c80631c717069146100675780631c93908c1461008557806392954362146100b5578063a0712d68146100bf578063b69ef8a8146100ef578063c9353cb51461010d575b600080fd5b61006f610129565b60405161007c91906102ed565b60405180910390f35b61009f600480360381019061009a9190610343565b610178565b6040516100ac919061037f565b60405180910390f35b6100bd6101ea565b005b6100d960048036038101906100d49190610343565b610225565b6040516100e6919061037f565b60405180910390f35b6100f76102b5565b604051610104919061037f565b60405180910390f35b610127600480360381019061012291906103f8565b6102bb565b005b6000806040518060400160405280600d81526020017f48656c6c6f2c20776f726c6421000000000000000000000000000000000000008152509050600081805190602001209050809250505090565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0836040516101c09190610482565b60405180910390a281600260008282546101da91906104df565b9250508190555060029050919050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161021c90610581565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac08360405161026d91906105ed565b60405180910390a28160008082825461028691906104df565b925050819055506102a260018361029d91906104df565b610178565b506102ab610129565b5060019050919050565b60005481565b8073ffffffffffffffffffffffffffffffffffffffff16ff5b6000819050919050565b6102e7816102d4565b82525050565b600060208201905061030260008301846102de565b92915050565b600080fd5b6000819050919050565b6103208161030d565b811461032b57600080fd5b50565b60008135905061033d81610317565b92915050565b60006020828403121561035957610358610308565b5b60006103678482850161032e565b91505092915050565b6103798161030d565b82525050565b60006020820190506103946000830184610370565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103c58261039a565b9050919050565b6103d5816103ba565b81146103e057600080fd5b50565b6000813590506103f2816103cc565b92915050565b60006020828403121561040e5761040d610308565b5b600061041c848285016103e3565b91505092915050565b600082825260208201905092915050565b7f696e7465726e616c20746f706963000000000000000000000000000000000000600082015250565b600061046c600e83610425565b915061047782610436565b602082019050919050565b60006040820190506104976000830184610370565b81810360208301526104a88161045f565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006104ea8261030d565b91506104f58361030d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561052a576105296104b0565b5b828201905092915050565b7f546869732066756e6374696f6e20726576657274656421000000000000000000600082015250565b600061056b601783610425565b915061057682610535565b602082019050919050565b6000602082019050818103600083015261059a8161055e565b9050919050565b7f746f706963000000000000000000000000000000000000000000000000000000600082015250565b60006105d7600583610425565b91506105e2826105a1565b602082019050919050565b60006040820190506106026000830184610370565b8181036020830152610613816105ca565b90509291505056fea26469706673582212208743accab6cfcd1c8ccb3f51b787d679e803a77ce24ec642bd068883132fd5fa64736f6c63430008090033a264697066735822122066241fedca9ebd69f0cd9e4879f75428f5d4bf734eb072e52934a8b3161581f064736f6c63430008090033", + "nonce": 2, + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000000000000000000000000000000000000000003e8" + } + }, + "CALL.address": { + "balance": "0x0" + } +} \ No newline at end of file diff --git a/test/historicstate/hardhat/scripts/geth_traces/Tracer.getBalance.replayTracer.json b/test/historicstate/hardhat/scripts/geth_traces/Tracer.getBalance.replayTracer.json new file mode 100644 index 000000000..9bf648a70 --- /dev/null +++ b/test/historicstate/hardhat/scripts/geth_traces/Tracer.getBalance.replayTracer.json @@ -0,0 +1,25 @@ +{ + "output": "0x00000000000000000000000000000000000000000000000000000000000003e8", + "stateDiff": null, + "trace": [ + { + "action": { + "callType": "call", + "from": "CALL.address", + "gas": "0x0000000000000000000000000000000000000000000000000000000ffffface7", + "input": "0x12065fe0", + "to": "Tracer.address", + "value": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + "result": { + "gasUsed": "0x0000000000000000000000000000000000000000000000000000000000005532", + "output": "0x00000000000000000000000000000000000000000000000000000000000003e8" + }, + "subtraces": 0, + "traceAddress": [], + "type": "call" + } + ], + "transactionHash": "0x9ad9cd25ca343d5251c2c2e73ae88d0079496279e5ee21ed294795ed27b5ea62", + "vmTrace": null +} \ No newline at end of file diff --git a/test/historicstate/hardhat/scripts/geth_traces/Tracer.mint.4byteTracer.json b/test/historicstate/hardhat/scripts/geth_traces/Tracer.mint.4byteTracer.json new file mode 100644 index 000000000..00cc957e2 --- /dev/null +++ b/test/historicstate/hardhat/scripts/geth_traces/Tracer.mint.4byteTracer.json @@ -0,0 +1,3 @@ +{ + "0xa0712d68-32": 1 +} \ No newline at end of file diff --git a/test/historicstate/hardhat/scripts/geth_traces/Tracer.mint.callTracer.json b/test/historicstate/hardhat/scripts/geth_traces/Tracer.mint.callTracer.json new file mode 100644 index 000000000..8988acd9d --- /dev/null +++ b/test/historicstate/hardhat/scripts/geth_traces/Tracer.mint.callTracer.json @@ -0,0 +1,10 @@ +{ + "from": "OWNER.address", + "gas": "0x200b20", + "gasUsed": "0x1221b", + "to": "Tracer.address", + "input": "0xa0712d6800000000000000000000000000000000000000000000000000000000000003e8", + "error": "execution reverted", + "value": "0x0", + "type": "CALL" +} \ No newline at end of file diff --git a/test/historicstate/hardhat/scripts/geth_traces/Tracer.mint.defaultTracer.json b/test/historicstate/hardhat/scripts/geth_traces/Tracer.mint.defaultTracer.json new file mode 100644 index 000000000..50d146e7f --- /dev/null +++ b/test/historicstate/hardhat/scripts/geth_traces/Tracer.mint.defaultTracer.json @@ -0,0 +1,14639 @@ +{ + "gas": 74267, + "failed": true, + "returnValue": "", + "structLogs": [ + { + "pc": 0, + "op": "PUSH1", + "gas": 2078784, + "gasCost": 3, + "depth": 1, + "stack": [] + }, + { + "pc": 2, + "op": "PUSH1", + "gas": 2078781, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x80" + ] + }, + { + "pc": 4, + "op": "MSTORE", + "gas": 2078778, + "gasCost": 12, + "depth": 1, + "stack": [ + "0x80", + "0x40" + ] + }, + { + "pc": 5, + "op": "CALLVALUE", + "gas": 2078766, + "gasCost": 2, + "depth": 1, + "stack": [] + }, + { + "pc": 6, + "op": "DUP1", + "gas": 2078764, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0" + ] + }, + { + "pc": 7, + "op": "ISZERO", + "gas": 2078761, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0", + "0x0" + ] + }, + { + "pc": 8, + "op": "PUSH3", + "gas": 2078758, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0", + "0x1" + ] + }, + { + "pc": 12, + "op": "JUMPI", + "gas": 2078755, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x0", + "0x1", + "0x11" + ] + }, + { + "pc": 17, + "op": "JUMPDEST", + "gas": 2078745, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x0" + ] + }, + { + "pc": 18, + "op": "POP", + "gas": 2078744, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x0" + ] + }, + { + "pc": 19, + "op": "PUSH1", + "gas": 2078742, + "gasCost": 3, + "depth": 1, + "stack": [] + }, + { + "pc": 21, + "op": "CALLDATASIZE", + "gas": 2078739, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x4" + ] + }, + { + "pc": 22, + "op": "LT", + "gas": 2078737, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x4", + "0x24" + ] + }, + { + "pc": 23, + "op": "PUSH3", + "gas": 2078734, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0" + ] + }, + { + "pc": 27, + "op": "JUMPI", + "gas": 2078731, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x0", + "0xac" + ] + }, + { + "pc": 28, + "op": "PUSH1", + "gas": 2078721, + "gasCost": 3, + "depth": 1, + "stack": [] + }, + { + "pc": 30, + "op": "CALLDATALOAD", + "gas": 2078718, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0" + ] + }, + { + "pc": 31, + "op": "PUSH1", + "gas": 2078715, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d6800000000000000000000000000000000000000000000000000000000" + ] + }, + { + "pc": 33, + "op": "SHR", + "gas": 2078712, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d6800000000000000000000000000000000000000000000000000000000", + "0xe0" + ] + }, + { + "pc": 34, + "op": "DUP1", + "gas": 2078709, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68" + ] + }, + { + "pc": 35, + "op": "PUSH4", + "gas": 2078706, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0xa0712d68" + ] + }, + { + "pc": 40, + "op": "GT", + "gas": 2078703, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0xa0712d68", + "0x8bfe44ff" + ] + }, + { + "pc": 41, + "op": "PUSH3", + "gas": 2078700, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x0" + ] + }, + { + "pc": 45, + "op": "JUMPI", + "gas": 2078697, + "gasCost": 10, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x0", + "0x6f" + ] + }, + { + "pc": 46, + "op": "DUP1", + "gas": 2078687, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68" + ] + }, + { + "pc": 47, + "op": "PUSH4", + "gas": 2078684, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0xa0712d68" + ] + }, + { + "pc": 52, + "op": "EQ", + "gas": 2078681, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0xa0712d68", + "0x8bfe44ff" + ] + }, + { + "pc": 53, + "op": "PUSH3", + "gas": 2078678, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x0" + ] + }, + { + "pc": 57, + "op": "JUMPI", + "gas": 2078675, + "gasCost": 10, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x0", + "0x197" + ] + }, + { + "pc": 58, + "op": "DUP1", + "gas": 2078665, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68" + ] + }, + { + "pc": 59, + "op": "PUSH4", + "gas": 2078662, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0xa0712d68" + ] + }, + { + "pc": 64, + "op": "EQ", + "gas": 2078659, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0xa0712d68", + "0x92954362" + ] + }, + { + "pc": 65, + "op": "PUSH3", + "gas": 2078656, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x0" + ] + }, + { + "pc": 69, + "op": "JUMPI", + "gas": 2078653, + "gasCost": 10, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x0", + "0x1a3" + ] + }, + { + "pc": 70, + "op": "DUP1", + "gas": 2078643, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68" + ] + }, + { + "pc": 71, + "op": "PUSH4", + "gas": 2078640, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0xa0712d68" + ] + }, + { + "pc": 76, + "op": "EQ", + "gas": 2078637, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0xa0712d68", + "0xa0712d68" + ] + }, + { + "pc": 77, + "op": "PUSH3", + "gas": 2078634, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1" + ] + }, + { + "pc": 81, + "op": "JUMPI", + "gas": 2078631, + "gasCost": 10, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1", + "0x1af" + ] + }, + { + "pc": 431, + "op": "JUMPDEST", + "gas": 2078621, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68" + ] + }, + { + "pc": 432, + "op": "PUSH3", + "gas": 2078620, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68" + ] + }, + { + "pc": 436, + "op": "PUSH1", + "gas": 2078617, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd" + ] + }, + { + "pc": 438, + "op": "DUP1", + "gas": 2078614, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x4" + ] + }, + { + "pc": 439, + "op": "CALLDATASIZE", + "gas": 2078611, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x4", + "0x4" + ] + }, + { + "pc": 440, + "op": "SUB", + "gas": 2078609, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x4", + "0x4", + "0x24" + ] + }, + { + "pc": 441, + "op": "DUP2", + "gas": 2078606, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x4", + "0x20" + ] + }, + { + "pc": 442, + "op": "ADD", + "gas": 2078603, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x4", + "0x20", + "0x4" + ] + }, + { + "pc": 443, + "op": "SWAP1", + "gas": 2078600, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x4", + "0x24" + ] + }, + { + "pc": 444, + "op": "PUSH3", + "gas": 2078597, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x24", + "0x4" + ] + }, + { + "pc": 448, + "op": "SWAP2", + "gas": 2078594, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x24", + "0x4", + "0x1c7" + ] + }, + { + "pc": 449, + "op": "SWAP1", + "gas": 2078591, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x4", + "0x24" + ] + }, + { + "pc": 450, + "op": "PUSH3", + "gas": 2078588, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4" + ] + }, + { + "pc": 454, + "op": "JUMP", + "gas": 2078585, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0xa2c" + ] + }, + { + "pc": 2604, + "op": "JUMPDEST", + "gas": 2078577, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4" + ] + }, + { + "pc": 2605, + "op": "PUSH1", + "gas": 2078576, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4" + ] + }, + { + "pc": 2607, + "op": "PUSH1", + "gas": 2078573, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0" + ] + }, + { + "pc": 2609, + "op": "DUP3", + "gas": 2078570, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x20" + ] + }, + { + "pc": 2610, + "op": "DUP5", + "gas": 2078567, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x20", + "0x4" + ] + }, + { + "pc": 2611, + "op": "SUB", + "gas": 2078564, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x20", + "0x4", + "0x24" + ] + }, + { + "pc": 2612, + "op": "SLT", + "gas": 2078561, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x20", + "0x20" + ] + }, + { + "pc": 2613, + "op": "ISZERO", + "gas": 2078558, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0" + ] + }, + { + "pc": 2614, + "op": "PUSH3", + "gas": 2078555, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x1" + ] + }, + { + "pc": 2618, + "op": "JUMPI", + "gas": 2078552, + "gasCost": 10, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x1", + "0xa45" + ] + }, + { + "pc": 2629, + "op": "JUMPDEST", + "gas": 2078542, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0" + ] + }, + { + "pc": 2630, + "op": "PUSH1", + "gas": 2078541, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0" + ] + }, + { + "pc": 2632, + "op": "PUSH3", + "gas": 2078538, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0" + ] + }, + { + "pc": 2636, + "op": "DUP5", + "gas": 2078535, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55" + ] + }, + { + "pc": 2637, + "op": "DUP3", + "gas": 2078532, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24" + ] + }, + { + "pc": 2638, + "op": "DUP6", + "gas": 2078529, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x0" + ] + }, + { + "pc": 2639, + "op": "ADD", + "gas": 2078526, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x0", + "0x4" + ] + }, + { + "pc": 2640, + "op": "PUSH3", + "gas": 2078523, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4" + ] + }, + { + "pc": 2644, + "op": "JUMP", + "gas": 2078520, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0xa15" + ] + }, + { + "pc": 2581, + "op": "JUMPDEST", + "gas": 2078512, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4" + ] + }, + { + "pc": 2582, + "op": "PUSH1", + "gas": 2078511, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4" + ] + }, + { + "pc": 2584, + "op": "DUP2", + "gas": 2078508, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x0" + ] + }, + { + "pc": 2585, + "op": "CALLDATALOAD", + "gas": 2078505, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x0", + "0x4" + ] + }, + { + "pc": 2586, + "op": "SWAP1", + "gas": 2078502, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x0", + "0x3e8" + ] + }, + { + "pc": 2587, + "op": "POP", + "gas": 2078499, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2588, + "op": "PUSH3", + "gas": 2078497, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8" + ] + }, + { + "pc": 2592, + "op": "DUP2", + "gas": 2078494, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26" + ] + }, + { + "pc": 2593, + "op": "PUSH3", + "gas": 2078491, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8" + ] + }, + { + "pc": 2597, + "op": "JUMP", + "gas": 2078488, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0x9fb" + ] + }, + { + "pc": 2555, + "op": "JUMPDEST", + "gas": 2078480, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8" + ] + }, + { + "pc": 2556, + "op": "PUSH3", + "gas": 2078479, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8" + ] + }, + { + "pc": 2560, + "op": "DUP2", + "gas": 2078476, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0xa06" + ] + }, + { + "pc": 2561, + "op": "PUSH3", + "gas": 2078473, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0xa06", + "0x3e8" + ] + }, + { + "pc": 2565, + "op": "JUMP", + "gas": 2078470, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0xa06", + "0x3e8", + "0x97c" + ] + }, + { + "pc": 2428, + "op": "JUMPDEST", + "gas": 2078462, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0xa06", + "0x3e8" + ] + }, + { + "pc": 2429, + "op": "PUSH1", + "gas": 2078461, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0xa06", + "0x3e8" + ] + }, + { + "pc": 2431, + "op": "DUP2", + "gas": 2078458, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0xa06", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2432, + "op": "SWAP1", + "gas": 2078455, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0xa06", + "0x3e8", + "0x0", + "0x3e8" + ] + }, + { + "pc": 2433, + "op": "POP", + "gas": 2078452, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0xa06", + "0x3e8", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2434, + "op": "SWAP2", + "gas": 2078450, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0xa06", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 2435, + "op": "SWAP1", + "gas": 2078447, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0x3e8", + "0x3e8", + "0xa06" + ] + }, + { + "pc": 2436, + "op": "POP", + "gas": 2078444, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0x3e8", + "0xa06", + "0x3e8" + ] + }, + { + "pc": 2437, + "op": "JUMP", + "gas": 2078442, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0x3e8", + "0xa06" + ] + }, + { + "pc": 2566, + "op": "JUMPDEST", + "gas": 2078434, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 2567, + "op": "DUP2", + "gas": 2078433, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 2568, + "op": "EQ", + "gas": 2078430, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 2569, + "op": "PUSH3", + "gas": 2078427, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0x1" + ] + }, + { + "pc": 2573, + "op": "JUMPI", + "gas": 2078424, + "gasCost": 10, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0x1", + "0xa12" + ] + }, + { + "pc": 2578, + "op": "JUMPDEST", + "gas": 2078414, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8" + ] + }, + { + "pc": 2579, + "op": "POP", + "gas": 2078413, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8" + ] + }, + { + "pc": 2580, + "op": "JUMP", + "gas": 2078411, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26" + ] + }, + { + "pc": 2598, + "op": "JUMPDEST", + "gas": 2078403, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8" + ] + }, + { + "pc": 2599, + "op": "SWAP3", + "gas": 2078402, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8" + ] + }, + { + "pc": 2600, + "op": "SWAP2", + "gas": 2078399, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0x3e8", + "0x24", + "0x4", + "0xa55" + ] + }, + { + "pc": 2601, + "op": "POP", + "gas": 2078396, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0x3e8", + "0xa55", + "0x4", + "0x24" + ] + }, + { + "pc": 2602, + "op": "POP", + "gas": 2078394, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0x3e8", + "0xa55", + "0x4" + ] + }, + { + "pc": 2603, + "op": "JUMP", + "gas": 2078392, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0x3e8", + "0xa55" + ] + }, + { + "pc": 2645, + "op": "JUMPDEST", + "gas": 2078384, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0x3e8" + ] + }, + { + "pc": 2646, + "op": "SWAP2", + "gas": 2078383, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x0", + "0x0", + "0x3e8" + ] + }, + { + "pc": 2647, + "op": "POP", + "gas": 2078380, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x3e8", + "0x0", + "0x0" + ] + }, + { + "pc": 2648, + "op": "POP", + "gas": 2078378, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2649, + "op": "SWAP3", + "gas": 2078376, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x1c7", + "0x24", + "0x4", + "0x3e8" + ] + }, + { + "pc": 2650, + "op": "SWAP2", + "gas": 2078373, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x24", + "0x4", + "0x1c7" + ] + }, + { + "pc": 2651, + "op": "POP", + "gas": 2078370, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x1c7", + "0x4", + "0x24" + ] + }, + { + "pc": 2652, + "op": "POP", + "gas": 2078368, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x1c7", + "0x4" + ] + }, + { + "pc": 2653, + "op": "JUMP", + "gas": 2078366, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x1c7" + ] + }, + { + "pc": 455, + "op": "JUMPDEST", + "gas": 2078358, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8" + ] + }, + { + "pc": 456, + "op": "PUSH3", + "gas": 2078357, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8" + ] + }, + { + "pc": 460, + "op": "JUMP", + "gas": 2078354, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x802" + ] + }, + { + "pc": 2050, + "op": "JUMPDEST", + "gas": 2078346, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8" + ] + }, + { + "pc": 2051, + "op": "PUSH1", + "gas": 2078345, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8" + ] + }, + { + "pc": 2053, + "op": "CALLER", + "gas": 2078342, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2054, + "op": "PUSH20", + "gas": 2078340, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address" + ] + }, + { + "pc": 2075, + "op": "AND", + "gas": 2078337, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xffffffffffffffffffffffffffffffffffffffff" + ] + }, + { + "pc": 2076, + "op": "PUSH32", + "gas": 2078334, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address" + ] + }, + { + "pc": 2109, + "op": "DUP4", + "gas": 2078331, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0" + ] + }, + { + "pc": 2110, + "op": "PUSH1", + "gas": 2078328, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x3e8" + ] + }, + { + "pc": 2112, + "op": "MLOAD", + "gas": 2078325, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x3e8", + "0x40" + ] + }, + { + "pc": 2113, + "op": "PUSH3", + "gas": 2078322, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x3e8", + "0x80" + ] + }, + { + "pc": 2117, + "op": "SWAP2", + "gas": 2078319, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x3e8", + "0x80", + "0x84c" + ] + }, + { + "pc": 2118, + "op": "SWAP1", + "gas": 2078316, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x80", + "0x3e8" + ] + }, + { + "pc": 2119, + "op": "PUSH3", + "gas": 2078313, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80" + ] + }, + { + "pc": 2123, + "op": "JUMP", + "gas": 2078310, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc64" + ] + }, + { + "pc": 3172, + "op": "JUMPDEST", + "gas": 2078302, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80" + ] + }, + { + "pc": 3173, + "op": "PUSH1", + "gas": 2078301, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80" + ] + }, + { + "pc": 3175, + "op": "PUSH1", + "gas": 2078298, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0x0" + ] + }, + { + "pc": 3177, + "op": "DUP3", + "gas": 2078295, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0x0", + "0x40" + ] + }, + { + "pc": 3178, + "op": "ADD", + "gas": 2078292, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0x0", + "0x40", + "0x80" + ] + }, + { + "pc": 3179, + "op": "SWAP1", + "gas": 2078289, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0x0", + "0xc0" + ] + }, + { + "pc": 3180, + "op": "POP", + "gas": 2078286, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0x0" + ] + }, + { + "pc": 3181, + "op": "PUSH3", + "gas": 2078284, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0" + ] + }, + { + "pc": 3185, + "op": "PUSH1", + "gas": 2078281, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc7b" + ] + }, + { + "pc": 3187, + "op": "DUP4", + "gas": 2078278, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x0" + ] + }, + { + "pc": 3188, + "op": "ADD", + "gas": 2078275, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x0", + "0x80" + ] + }, + { + "pc": 3189, + "op": "DUP5", + "gas": 2078272, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80" + ] + }, + { + "pc": 3190, + "op": "PUSH3", + "gas": 2078269, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8" + ] + }, + { + "pc": 3194, + "op": "JUMP", + "gas": 2078266, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8", + "0x986" + ] + }, + { + "pc": 2438, + "op": "JUMPDEST", + "gas": 2078258, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8" + ] + }, + { + "pc": 2439, + "op": "PUSH3", + "gas": 2078257, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8" + ] + }, + { + "pc": 2443, + "op": "DUP2", + "gas": 2078254, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8", + "0x991" + ] + }, + { + "pc": 2444, + "op": "PUSH3", + "gas": 2078251, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8", + "0x991", + "0x3e8" + ] + }, + { + "pc": 2448, + "op": "JUMP", + "gas": 2078248, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8", + "0x991", + "0x3e8", + "0x97c" + ] + }, + { + "pc": 2428, + "op": "JUMPDEST", + "gas": 2078240, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8", + "0x991", + "0x3e8" + ] + }, + { + "pc": 2429, + "op": "PUSH1", + "gas": 2078239, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8", + "0x991", + "0x3e8" + ] + }, + { + "pc": 2431, + "op": "DUP2", + "gas": 2078236, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8", + "0x991", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2432, + "op": "SWAP1", + "gas": 2078233, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8", + "0x991", + "0x3e8", + "0x0", + "0x3e8" + ] + }, + { + "pc": 2433, + "op": "POP", + "gas": 2078230, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8", + "0x991", + "0x3e8", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2434, + "op": "SWAP2", + "gas": 2078228, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8", + "0x991", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 2435, + "op": "SWAP1", + "gas": 2078225, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8", + "0x3e8", + "0x3e8", + "0x991" + ] + }, + { + "pc": 2436, + "op": "POP", + "gas": 2078222, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8", + "0x3e8", + "0x991", + "0x3e8" + ] + }, + { + "pc": 2437, + "op": "JUMP", + "gas": 2078220, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8", + "0x3e8", + "0x991" + ] + }, + { + "pc": 2449, + "op": "JUMPDEST", + "gas": 2078212, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 2450, + "op": "DUP3", + "gas": 2078211, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 2451, + "op": "MSTORE", + "gas": 2078208, + "gasCost": 9, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8", + "0x3e8", + "0x80" + ] + }, + { + "pc": 2452, + "op": "POP", + "gas": 2078199, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8" + ] + }, + { + "pc": 2453, + "op": "POP", + "gas": 2078197, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80" + ] + }, + { + "pc": 2454, + "op": "JUMP", + "gas": 2078195, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc7b" + ] + }, + { + "pc": 3195, + "op": "JUMPDEST", + "gas": 2078187, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0" + ] + }, + { + "pc": 3196, + "op": "DUP2", + "gas": 2078186, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0" + ] + }, + { + "pc": 3197, + "op": "DUP2", + "gas": 2078183, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0x80" + ] + }, + { + "pc": 3198, + "op": "SUB", + "gas": 2078180, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0x80", + "0xc0" + ] + }, + { + "pc": 3199, + "op": "PUSH1", + "gas": 2078177, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0x40" + ] + }, + { + "pc": 3201, + "op": "DUP4", + "gas": 2078174, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0x40", + "0x20" + ] + }, + { + "pc": 3202, + "op": "ADD", + "gas": 2078171, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0x40", + "0x20", + "0x80" + ] + }, + { + "pc": 3203, + "op": "MSTORE", + "gas": 2078168, + "gasCost": 6, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0x40", + "0xa0" + ] + }, + { + "pc": 3204, + "op": "PUSH3", + "gas": 2078162, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0" + ] + }, + { + "pc": 3208, + "op": "DUP2", + "gas": 2078159, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e" + ] + }, + { + "pc": 3209, + "op": "PUSH3", + "gas": 2078156, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0" + ] + }, + { + "pc": 3213, + "op": "JUMP", + "gas": 2078153, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0xc3d" + ] + }, + { + "pc": 3133, + "op": "JUMPDEST", + "gas": 2078145, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0" + ] + }, + { + "pc": 3134, + "op": "PUSH1", + "gas": 2078144, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0" + ] + }, + { + "pc": 3136, + "op": "PUSH3", + "gas": 2078141, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0" + ] + }, + { + "pc": 3140, + "op": "PUSH1", + "gas": 2078138, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xc4c" + ] + }, + { + "pc": 3142, + "op": "DUP4", + "gas": 2078135, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xc4c", + "0x5" + ] + }, + { + "pc": 3143, + "op": "PUSH3", + "gas": 2078132, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xc4c", + "0x5", + "0xc0" + ] + }, + { + "pc": 3147, + "op": "JUMP", + "gas": 2078129, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xc4c", + "0x5", + "0xc0", + "0xaf5" + ] + }, + { + "pc": 2805, + "op": "JUMPDEST", + "gas": 2078121, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xc4c", + "0x5", + "0xc0" + ] + }, + { + "pc": 2806, + "op": "PUSH1", + "gas": 2078120, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xc4c", + "0x5", + "0xc0" + ] + }, + { + "pc": 2808, + "op": "DUP3", + "gas": 2078117, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xc4c", + "0x5", + "0xc0", + "0x0" + ] + }, + { + "pc": 2809, + "op": "DUP3", + "gas": 2078114, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xc4c", + "0x5", + "0xc0", + "0x0", + "0x5" + ] + }, + { + "pc": 2810, + "op": "MSTORE", + "gas": 2078111, + "gasCost": 6, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xc4c", + "0x5", + "0xc0", + "0x0", + "0x5", + "0xc0" + ] + }, + { + "pc": 2811, + "op": "PUSH1", + "gas": 2078105, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xc4c", + "0x5", + "0xc0", + "0x0" + ] + }, + { + "pc": 2813, + "op": "DUP3", + "gas": 2078102, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xc4c", + "0x5", + "0xc0", + "0x0", + "0x20" + ] + }, + { + "pc": 2814, + "op": "ADD", + "gas": 2078099, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xc4c", + "0x5", + "0xc0", + "0x0", + "0x20", + "0xc0" + ] + }, + { + "pc": 2815, + "op": "SWAP1", + "gas": 2078096, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xc4c", + "0x5", + "0xc0", + "0x0", + "0xe0" + ] + }, + { + "pc": 2816, + "op": "POP", + "gas": 2078093, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xc4c", + "0x5", + "0xc0", + "0xe0", + "0x0" + ] + }, + { + "pc": 2817, + "op": "SWAP3", + "gas": 2078091, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xc4c", + "0x5", + "0xc0", + "0xe0" + ] + }, + { + "pc": 2818, + "op": "SWAP2", + "gas": 2078088, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xe0", + "0x5", + "0xc0", + "0xc4c" + ] + }, + { + "pc": 2819, + "op": "POP", + "gas": 2078085, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xe0", + "0xc4c", + "0xc0", + "0x5" + ] + }, + { + "pc": 2820, + "op": "POP", + "gas": 2078083, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xe0", + "0xc4c", + "0xc0" + ] + }, + { + "pc": 2821, + "op": "JUMP", + "gas": 2078081, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xe0", + "0xc4c" + ] + }, + { + "pc": 3148, + "op": "JUMPDEST", + "gas": 2078073, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xe0" + ] + }, + { + "pc": 3149, + "op": "SWAP2", + "gas": 2078072, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xe0" + ] + }, + { + "pc": 3150, + "op": "POP", + "gas": 2078069, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0", + "0xc0" + ] + }, + { + "pc": 3151, + "op": "PUSH3", + "gas": 2078067, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0" + ] + }, + { + "pc": 3155, + "op": "DUP3", + "gas": 2078064, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0", + "0xc59" + ] + }, + { + "pc": 3156, + "op": "PUSH3", + "gas": 2078061, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0", + "0xc59", + "0xe0" + ] + }, + { + "pc": 3160, + "op": "JUMP", + "gas": 2078058, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0", + "0xc59", + "0xe0", + "0xc14" + ] + }, + { + "pc": 3092, + "op": "JUMPDEST", + "gas": 2078050, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0", + "0xc59", + "0xe0" + ] + }, + { + "pc": 3093, + "op": "PUSH32", + "gas": 2078049, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0", + "0xc59", + "0xe0" + ] + }, + { + "pc": 3126, + "op": "PUSH1", + "gas": 2078046, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0", + "0xc59", + "0xe0", + "0x746f706963000000000000000000000000000000000000000000000000000000" + ] + }, + { + "pc": 3128, + "op": "DUP3", + "gas": 2078043, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0", + "0xc59", + "0xe0", + "0x746f706963000000000000000000000000000000000000000000000000000000", + "0x0" + ] + }, + { + "pc": 3129, + "op": "ADD", + "gas": 2078040, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0", + "0xc59", + "0xe0", + "0x746f706963000000000000000000000000000000000000000000000000000000", + "0x0", + "0xe0" + ] + }, + { + "pc": 3130, + "op": "MSTORE", + "gas": 2078037, + "gasCost": 6, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0", + "0xc59", + "0xe0", + "0x746f706963000000000000000000000000000000000000000000000000000000", + "0xe0" + ] + }, + { + "pc": 3131, + "op": "POP", + "gas": 2078031, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0", + "0xc59", + "0xe0" + ] + }, + { + "pc": 3132, + "op": "JUMP", + "gas": 2078029, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0", + "0xc59" + ] + }, + { + "pc": 3161, + "op": "JUMPDEST", + "gas": 2078021, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0" + ] + }, + { + "pc": 3162, + "op": "PUSH1", + "gas": 2078020, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0" + ] + }, + { + "pc": 3164, + "op": "DUP3", + "gas": 2078017, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0", + "0x20" + ] + }, + { + "pc": 3165, + "op": "ADD", + "gas": 2078014, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0", + "0x20", + "0xe0" + ] + }, + { + "pc": 3166, + "op": "SWAP1", + "gas": 2078011, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0", + "0x100" + ] + }, + { + "pc": 3167, + "op": "POP", + "gas": 2078008, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x100", + "0x0" + ] + }, + { + "pc": 3168, + "op": "SWAP2", + "gas": 2078006, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x100" + ] + }, + { + "pc": 3169, + "op": "SWAP1", + "gas": 2078003, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0x100", + "0xe0", + "0xc8e" + ] + }, + { + "pc": 3170, + "op": "POP", + "gas": 2078000, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0x100", + "0xc8e", + "0xe0" + ] + }, + { + "pc": 3171, + "op": "JUMP", + "gas": 2077998, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0x100", + "0xc8e" + ] + }, + { + "pc": 3214, + "op": "JUMPDEST", + "gas": 2077990, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0x100" + ] + }, + { + "pc": 3215, + "op": "SWAP1", + "gas": 2077989, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0xc0", + "0x100" + ] + }, + { + "pc": 3216, + "op": "POP", + "gas": 2077986, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0x100", + "0xc0" + ] + }, + { + "pc": 3217, + "op": "SWAP3", + "gas": 2077984, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x84c", + "0x3e8", + "0x80", + "0x100" + ] + }, + { + "pc": 3218, + "op": "SWAP2", + "gas": 2077981, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x3e8", + "0x80", + "0x84c" + ] + }, + { + "pc": 3219, + "op": "POP", + "gas": 2077978, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x84c", + "0x80", + "0x3e8" + ] + }, + { + "pc": 3220, + "op": "POP", + "gas": 2077976, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x84c", + "0x80" + ] + }, + { + "pc": 3221, + "op": "JUMP", + "gas": 2077974, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x84c" + ] + }, + { + "pc": 2124, + "op": "JUMPDEST", + "gas": 2077966, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100" + ] + }, + { + "pc": 2125, + "op": "PUSH1", + "gas": 2077965, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100" + ] + }, + { + "pc": 2127, + "op": "MLOAD", + "gas": 2077962, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x40" + ] + }, + { + "pc": 2128, + "op": "DUP1", + "gas": 2077959, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x80" + ] + }, + { + "pc": 2129, + "op": "SWAP2", + "gas": 2077956, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x80", + "0x80" + ] + }, + { + "pc": 2130, + "op": "SUB", + "gas": 2077953, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x80", + "0x80", + "0x100" + ] + }, + { + "pc": 2131, + "op": "SWAP1", + "gas": 2077950, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x80", + "0x80" + ] + }, + { + "pc": 2132, + "op": "LOG2", + "gas": 2077947, + "gasCost": 2149, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x80", + "0x80" + ] + }, + { + "pc": 2133, + "op": "DUP2", + "gas": 2075798, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2134, + "op": "PUSH1", + "gas": 2075795, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8" + ] + }, + { + "pc": 2136, + "op": "PUSH1", + "gas": 2075792, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1" + ] + }, + { + "pc": 2138, + "op": "DUP3", + "gas": 2075789, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0" + ] + }, + { + "pc": 2139, + "op": "DUP3", + "gas": 2075786, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3e8" + ] + }, + { + "pc": 2140, + "op": "SLOAD", + "gas": 2075783, + "gasCost": 2100, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3e8", + "0x1" + ], + "storage": { + "0000000000000000000000000000000000000000000000000000000000000001": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "pc": 2141, + "op": "PUSH3", + "gas": 2073683, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2145, + "op": "SWAP2", + "gas": 2073680, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3e8", + "0x0", + "0x868" + ] + }, + { + "pc": 2146, + "op": "SWAP1", + "gas": 2073677, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x0", + "0x3e8" + ] + }, + { + "pc": 2147, + "op": "PUSH3", + "gas": 2073674, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2151, + "op": "JUMP", + "gas": 2073671, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0xbb7" + ] + }, + { + "pc": 2999, + "op": "JUMPDEST", + "gas": 2073663, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0" + ] + }, + { + "pc": 3000, + "op": "PUSH1", + "gas": 2073662, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0" + ] + }, + { + "pc": 3002, + "op": "PUSH3", + "gas": 2073659, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0" + ] + }, + { + "pc": 3006, + "op": "DUP3", + "gas": 2073656, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0xbc4" + ] + }, + { + "pc": 3007, + "op": "PUSH3", + "gas": 2073653, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0xbc4", + "0x0" + ] + }, + { + "pc": 3011, + "op": "JUMP", + "gas": 2073650, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0xbc4", + "0x0", + "0x97c" + ] + }, + { + "pc": 2428, + "op": "JUMPDEST", + "gas": 2073642, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0xbc4", + "0x0" + ] + }, + { + "pc": 2429, + "op": "PUSH1", + "gas": 2073641, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0xbc4", + "0x0" + ] + }, + { + "pc": 2431, + "op": "DUP2", + "gas": 2073638, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0xbc4", + "0x0", + "0x0" + ] + }, + { + "pc": 2432, + "op": "SWAP1", + "gas": 2073635, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0xbc4", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 2433, + "op": "POP", + "gas": 2073632, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0xbc4", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 2434, + "op": "SWAP2", + "gas": 2073630, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0xbc4", + "0x0", + "0x0" + ] + }, + { + "pc": 2435, + "op": "SWAP1", + "gas": 2073627, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0x0", + "0x0", + "0xbc4" + ] + }, + { + "pc": 2436, + "op": "POP", + "gas": 2073624, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0x0", + "0xbc4", + "0x0" + ] + }, + { + "pc": 2437, + "op": "JUMP", + "gas": 2073622, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0x0", + "0xbc4" + ] + }, + { + "pc": 3012, + "op": "JUMPDEST", + "gas": 2073614, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 3013, + "op": "SWAP2", + "gas": 2073613, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 3014, + "op": "POP", + "gas": 2073610, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 3015, + "op": "PUSH3", + "gas": 2073608, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0" + ] + }, + { + "pc": 3019, + "op": "DUP4", + "gas": 2073605, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0xbd1" + ] + }, + { + "pc": 3020, + "op": "PUSH3", + "gas": 2073602, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0xbd1", + "0x3e8" + ] + }, + { + "pc": 3024, + "op": "JUMP", + "gas": 2073599, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0xbd1", + "0x3e8", + "0x97c" + ] + }, + { + "pc": 2428, + "op": "JUMPDEST", + "gas": 2073591, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0xbd1", + "0x3e8" + ] + }, + { + "pc": 2429, + "op": "PUSH1", + "gas": 2073590, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0xbd1", + "0x3e8" + ] + }, + { + "pc": 2431, + "op": "DUP2", + "gas": 2073587, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0xbd1", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2432, + "op": "SWAP1", + "gas": 2073584, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0xbd1", + "0x3e8", + "0x0", + "0x3e8" + ] + }, + { + "pc": 2433, + "op": "POP", + "gas": 2073581, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0xbd1", + "0x3e8", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2434, + "op": "SWAP2", + "gas": 2073579, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0xbd1", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 2435, + "op": "SWAP1", + "gas": 2073576, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0x3e8", + "0x3e8", + "0xbd1" + ] + }, + { + "pc": 2436, + "op": "POP", + "gas": 2073573, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0x3e8", + "0xbd1", + "0x3e8" + ] + }, + { + "pc": 2437, + "op": "JUMP", + "gas": 2073571, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0x3e8", + "0xbd1" + ] + }, + { + "pc": 3025, + "op": "JUMPDEST", + "gas": 2073563, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0x3e8" + ] + }, + { + "pc": 3026, + "op": "SWAP3", + "gas": 2073562, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0x3e8" + ] + }, + { + "pc": 3027, + "op": "POP", + "gas": 2073559, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0x3e8" + ] + }, + { + "pc": 3028, + "op": "DUP3", + "gas": 2073557, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0" + ] + }, + { + "pc": 3029, + "op": "PUSH32", + "gas": 2073554, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0x3e8" + ] + }, + { + "pc": 3062, + "op": "SUB", + "gas": 2073551, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0x3e8", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + ] + }, + { + "pc": 3063, + "op": "DUP3", + "gas": 2073548, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc17" + ] + }, + { + "pc": 3064, + "op": "GT", + "gas": 2073545, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc17", + "0x0" + ] + }, + { + "pc": 3065, + "op": "ISZERO", + "gas": 2073542, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 3066, + "op": "PUSH3", + "gas": 2073539, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0x1" + ] + }, + { + "pc": 3070, + "op": "JUMPI", + "gas": 2073536, + "gasCost": 10, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0x1", + "0xc09" + ] + }, + { + "pc": 3081, + "op": "JUMPDEST", + "gas": 2073526, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0" + ] + }, + { + "pc": 3082, + "op": "DUP3", + "gas": 2073525, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0" + ] + }, + { + "pc": 3083, + "op": "DUP3", + "gas": 2073522, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0x3e8" + ] + }, + { + "pc": 3084, + "op": "ADD", + "gas": 2073519, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0x3e8", + "0x0" + ] + }, + { + "pc": 3085, + "op": "SWAP1", + "gas": 2073516, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x0", + "0x3e8" + ] + }, + { + "pc": 3086, + "op": "POP", + "gas": 2073513, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x3e8", + "0x0" + ] + }, + { + "pc": 3087, + "op": "SWAP3", + "gas": 2073511, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x868", + "0x3e8", + "0x0", + "0x3e8" + ] + }, + { + "pc": 3088, + "op": "SWAP2", + "gas": 2073508, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3e8", + "0x3e8", + "0x0", + "0x868" + ] + }, + { + "pc": 3089, + "op": "POP", + "gas": 2073505, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3e8", + "0x868", + "0x0", + "0x3e8" + ] + }, + { + "pc": 3090, + "op": "POP", + "gas": 2073503, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3e8", + "0x868", + "0x0" + ] + }, + { + "pc": 3091, + "op": "JUMP", + "gas": 2073501, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3e8", + "0x868" + ] + }, + { + "pc": 2152, + "op": "JUMPDEST", + "gas": 2073493, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3e8" + ] + }, + { + "pc": 2153, + "op": "SWAP3", + "gas": 2073492, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3e8" + ] + }, + { + "pc": 2154, + "op": "POP", + "gas": 2073489, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3e8" + ] + }, + { + "pc": 2155, + "op": "POP", + "gas": 2073487, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0" + ] + }, + { + "pc": 2156, + "op": "DUP2", + "gas": 2073485, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1" + ] + }, + { + "pc": 2157, + "op": "SWAP1", + "gas": 2073482, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x3e8" + ] + }, + { + "pc": 2158, + "op": "SSTORE", + "gas": 2073479, + "gasCost": 20000, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8", + "0x3e8", + "0x1" + ], + "storage": { + "0000000000000000000000000000000000000000000000000000000000000001": "00000000000000000000000000000000000000000000000000000000000003e8" + } + }, + { + "pc": 2159, + "op": "POP", + "gas": 2053479, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x3e8" + ] + }, + { + "pc": 2160, + "op": "PUSH3", + "gas": 2053477, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2164, + "op": "PUSH1", + "gas": 2053474, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888" + ] + }, + { + "pc": 2166, + "op": "DUP4", + "gas": 2053471, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x1" + ] + }, + { + "pc": 2167, + "op": "PUSH3", + "gas": 2053468, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x1", + "0x3e8" + ] + }, + { + "pc": 2171, + "op": "SWAP2", + "gas": 2053465, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x1", + "0x3e8", + "0x882" + ] + }, + { + "pc": 2172, + "op": "SWAP1", + "gas": 2053462, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x3e8", + "0x1" + ] + }, + { + "pc": 2173, + "op": "PUSH3", + "gas": 2053459, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8" + ] + }, + { + "pc": 2177, + "op": "JUMP", + "gas": 2053456, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0xbb7" + ] + }, + { + "pc": 2999, + "op": "JUMPDEST", + "gas": 2053448, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8" + ] + }, + { + "pc": 3000, + "op": "PUSH1", + "gas": 2053447, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8" + ] + }, + { + "pc": 3002, + "op": "PUSH3", + "gas": 2053444, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0" + ] + }, + { + "pc": 3006, + "op": "DUP3", + "gas": 2053441, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0xbc4" + ] + }, + { + "pc": 3007, + "op": "PUSH3", + "gas": 2053438, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0xbc4", + "0x3e8" + ] + }, + { + "pc": 3011, + "op": "JUMP", + "gas": 2053435, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0xbc4", + "0x3e8", + "0x97c" + ] + }, + { + "pc": 2428, + "op": "JUMPDEST", + "gas": 2053427, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0xbc4", + "0x3e8" + ] + }, + { + "pc": 2429, + "op": "PUSH1", + "gas": 2053426, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0xbc4", + "0x3e8" + ] + }, + { + "pc": 2431, + "op": "DUP2", + "gas": 2053423, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0xbc4", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2432, + "op": "SWAP1", + "gas": 2053420, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0xbc4", + "0x3e8", + "0x0", + "0x3e8" + ] + }, + { + "pc": 2433, + "op": "POP", + "gas": 2053417, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0xbc4", + "0x3e8", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2434, + "op": "SWAP2", + "gas": 2053415, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0xbc4", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 2435, + "op": "SWAP1", + "gas": 2053412, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0x3e8", + "0x3e8", + "0xbc4" + ] + }, + { + "pc": 2436, + "op": "POP", + "gas": 2053409, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0x3e8", + "0xbc4", + "0x3e8" + ] + }, + { + "pc": 2437, + "op": "JUMP", + "gas": 2053407, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0x3e8", + "0xbc4" + ] + }, + { + "pc": 3012, + "op": "JUMPDEST", + "gas": 2053399, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0x3e8" + ] + }, + { + "pc": 3013, + "op": "SWAP2", + "gas": 2053398, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0x3e8" + ] + }, + { + "pc": 3014, + "op": "POP", + "gas": 2053395, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0x3e8" + ] + }, + { + "pc": 3015, + "op": "PUSH3", + "gas": 2053393, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0" + ] + }, + { + "pc": 3019, + "op": "DUP4", + "gas": 2053390, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0xbd1" + ] + }, + { + "pc": 3020, + "op": "PUSH3", + "gas": 2053387, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0xbd1", + "0x1" + ] + }, + { + "pc": 3024, + "op": "JUMP", + "gas": 2053384, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0xbd1", + "0x1", + "0x97c" + ] + }, + { + "pc": 2428, + "op": "JUMPDEST", + "gas": 2053376, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0xbd1", + "0x1" + ] + }, + { + "pc": 2429, + "op": "PUSH1", + "gas": 2053375, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0xbd1", + "0x1" + ] + }, + { + "pc": 2431, + "op": "DUP2", + "gas": 2053372, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0xbd1", + "0x1", + "0x0" + ] + }, + { + "pc": 2432, + "op": "SWAP1", + "gas": 2053369, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0xbd1", + "0x1", + "0x0", + "0x1" + ] + }, + { + "pc": 2433, + "op": "POP", + "gas": 2053366, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0xbd1", + "0x1", + "0x1", + "0x0" + ] + }, + { + "pc": 2434, + "op": "SWAP2", + "gas": 2053364, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0xbd1", + "0x1", + "0x1" + ] + }, + { + "pc": 2435, + "op": "SWAP1", + "gas": 2053361, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0x1", + "0x1", + "0xbd1" + ] + }, + { + "pc": 2436, + "op": "POP", + "gas": 2053358, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0x1", + "0xbd1", + "0x1" + ] + }, + { + "pc": 2437, + "op": "JUMP", + "gas": 2053356, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0x1", + "0xbd1" + ] + }, + { + "pc": 3025, + "op": "JUMPDEST", + "gas": 2053348, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0x1" + ] + }, + { + "pc": 3026, + "op": "SWAP3", + "gas": 2053347, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0x1" + ] + }, + { + "pc": 3027, + "op": "POP", + "gas": 2053344, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0x1" + ] + }, + { + "pc": 3028, + "op": "DUP3", + "gas": 2053342, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0" + ] + }, + { + "pc": 3029, + "op": "PUSH32", + "gas": 2053339, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0x1" + ] + }, + { + "pc": 3062, + "op": "SUB", + "gas": 2053336, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0x1", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + ] + }, + { + "pc": 3063, + "op": "DUP3", + "gas": 2053333, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe" + ] + }, + { + "pc": 3064, + "op": "GT", + "gas": 2053330, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe", + "0x3e8" + ] + }, + { + "pc": 3065, + "op": "ISZERO", + "gas": 2053327, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0x0" + ] + }, + { + "pc": 3066, + "op": "PUSH3", + "gas": 2053324, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0x1" + ] + }, + { + "pc": 3070, + "op": "JUMPI", + "gas": 2053321, + "gasCost": 10, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0x1", + "0xc09" + ] + }, + { + "pc": 3081, + "op": "JUMPDEST", + "gas": 2053311, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0" + ] + }, + { + "pc": 3082, + "op": "DUP3", + "gas": 2053310, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0" + ] + }, + { + "pc": 3083, + "op": "DUP3", + "gas": 2053307, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0x1" + ] + }, + { + "pc": 3084, + "op": "ADD", + "gas": 2053304, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0x1", + "0x3e8" + ] + }, + { + "pc": 3085, + "op": "SWAP1", + "gas": 2053301, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x0", + "0x3e9" + ] + }, + { + "pc": 3086, + "op": "POP", + "gas": 2053298, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x3e9", + "0x0" + ] + }, + { + "pc": 3087, + "op": "SWAP3", + "gas": 2053296, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x882", + "0x1", + "0x3e8", + "0x3e9" + ] + }, + { + "pc": 3088, + "op": "SWAP2", + "gas": 2053293, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x1", + "0x3e8", + "0x882" + ] + }, + { + "pc": 3089, + "op": "POP", + "gas": 2053290, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x882", + "0x3e8", + "0x1" + ] + }, + { + "pc": 3090, + "op": "POP", + "gas": 2053288, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x882", + "0x3e8" + ] + }, + { + "pc": 3091, + "op": "JUMP", + "gas": 2053286, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x882" + ] + }, + { + "pc": 2178, + "op": "JUMPDEST", + "gas": 2053278, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9" + ] + }, + { + "pc": 2179, + "op": "PUSH3", + "gas": 2053277, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9" + ] + }, + { + "pc": 2183, + "op": "JUMP", + "gas": 2053274, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x280" + ] + }, + { + "pc": 640, + "op": "JUMPDEST", + "gas": 2053266, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9" + ] + }, + { + "pc": 641, + "op": "PUSH1", + "gas": 2053265, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9" + ] + }, + { + "pc": 643, + "op": "CALLER", + "gas": 2053262, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0" + ] + }, + { + "pc": 644, + "op": "PUSH20", + "gas": 2053260, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address" + ] + }, + { + "pc": 665, + "op": "AND", + "gas": 2053257, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xffffffffffffffffffffffffffffffffffffffff" + ] + }, + { + "pc": 666, + "op": "PUSH32", + "gas": 2053254, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address" + ] + }, + { + "pc": 699, + "op": "DUP4", + "gas": 2053251, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0" + ] + }, + { + "pc": 700, + "op": "PUSH1", + "gas": 2053248, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x3e9" + ] + }, + { + "pc": 702, + "op": "MLOAD", + "gas": 2053245, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x3e9", + "0x40" + ] + }, + { + "pc": 703, + "op": "PUSH3", + "gas": 2053242, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x3e9", + "0x80" + ] + }, + { + "pc": 707, + "op": "SWAP2", + "gas": 2053239, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x3e9", + "0x80", + "0x2ca" + ] + }, + { + "pc": 708, + "op": "SWAP1", + "gas": 2053236, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x80", + "0x3e9" + ] + }, + { + "pc": 709, + "op": "PUSH3", + "gas": 2053233, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80" + ] + }, + { + "pc": 713, + "op": "JUMP", + "gas": 2053230, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xb56" + ] + }, + { + "pc": 2902, + "op": "JUMPDEST", + "gas": 2053222, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80" + ] + }, + { + "pc": 2903, + "op": "PUSH1", + "gas": 2053221, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80" + ] + }, + { + "pc": 2905, + "op": "PUSH1", + "gas": 2053218, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0x0" + ] + }, + { + "pc": 2907, + "op": "DUP3", + "gas": 2053215, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0x0", + "0x40" + ] + }, + { + "pc": 2908, + "op": "ADD", + "gas": 2053212, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0x0", + "0x40", + "0x80" + ] + }, + { + "pc": 2909, + "op": "SWAP1", + "gas": 2053209, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0x0", + "0xc0" + ] + }, + { + "pc": 2910, + "op": "POP", + "gas": 2053206, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0x0" + ] + }, + { + "pc": 2911, + "op": "PUSH3", + "gas": 2053204, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0" + ] + }, + { + "pc": 2915, + "op": "PUSH1", + "gas": 2053201, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d" + ] + }, + { + "pc": 2917, + "op": "DUP4", + "gas": 2053198, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x0" + ] + }, + { + "pc": 2918, + "op": "ADD", + "gas": 2053195, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x0", + "0x80" + ] + }, + { + "pc": 2919, + "op": "DUP5", + "gas": 2053192, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80" + ] + }, + { + "pc": 2920, + "op": "PUSH3", + "gas": 2053189, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9" + ] + }, + { + "pc": 2924, + "op": "JUMP", + "gas": 2053186, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9", + "0x986" + ] + }, + { + "pc": 2438, + "op": "JUMPDEST", + "gas": 2053178, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9" + ] + }, + { + "pc": 2439, + "op": "PUSH3", + "gas": 2053177, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9" + ] + }, + { + "pc": 2443, + "op": "DUP2", + "gas": 2053174, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9", + "0x991" + ] + }, + { + "pc": 2444, + "op": "PUSH3", + "gas": 2053171, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9", + "0x991", + "0x3e9" + ] + }, + { + "pc": 2448, + "op": "JUMP", + "gas": 2053168, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9", + "0x991", + "0x3e9", + "0x97c" + ] + }, + { + "pc": 2428, + "op": "JUMPDEST", + "gas": 2053160, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9", + "0x991", + "0x3e9" + ] + }, + { + "pc": 2429, + "op": "PUSH1", + "gas": 2053159, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9", + "0x991", + "0x3e9" + ] + }, + { + "pc": 2431, + "op": "DUP2", + "gas": 2053156, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9", + "0x991", + "0x3e9", + "0x0" + ] + }, + { + "pc": 2432, + "op": "SWAP1", + "gas": 2053153, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9", + "0x991", + "0x3e9", + "0x0", + "0x3e9" + ] + }, + { + "pc": 2433, + "op": "POP", + "gas": 2053150, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9", + "0x991", + "0x3e9", + "0x3e9", + "0x0" + ] + }, + { + "pc": 2434, + "op": "SWAP2", + "gas": 2053148, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9", + "0x991", + "0x3e9", + "0x3e9" + ] + }, + { + "pc": 2435, + "op": "SWAP1", + "gas": 2053145, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9", + "0x3e9", + "0x3e9", + "0x991" + ] + }, + { + "pc": 2436, + "op": "POP", + "gas": 2053142, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9", + "0x3e9", + "0x991", + "0x3e9" + ] + }, + { + "pc": 2437, + "op": "JUMP", + "gas": 2053140, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9", + "0x3e9", + "0x991" + ] + }, + { + "pc": 2449, + "op": "JUMPDEST", + "gas": 2053132, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9", + "0x3e9" + ] + }, + { + "pc": 2450, + "op": "DUP3", + "gas": 2053131, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9", + "0x3e9" + ] + }, + { + "pc": 2451, + "op": "MSTORE", + "gas": 2053128, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9", + "0x3e9", + "0x80" + ] + }, + { + "pc": 2452, + "op": "POP", + "gas": 2053125, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9" + ] + }, + { + "pc": 2453, + "op": "POP", + "gas": 2053123, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80" + ] + }, + { + "pc": 2454, + "op": "JUMP", + "gas": 2053121, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d" + ] + }, + { + "pc": 2925, + "op": "JUMPDEST", + "gas": 2053113, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0" + ] + }, + { + "pc": 2926, + "op": "DUP2", + "gas": 2053112, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0" + ] + }, + { + "pc": 2927, + "op": "DUP2", + "gas": 2053109, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0x80" + ] + }, + { + "pc": 2928, + "op": "SUB", + "gas": 2053106, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0x80", + "0xc0" + ] + }, + { + "pc": 2929, + "op": "PUSH1", + "gas": 2053103, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0x40" + ] + }, + { + "pc": 2931, + "op": "DUP4", + "gas": 2053100, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0x40", + "0x20" + ] + }, + { + "pc": 2932, + "op": "ADD", + "gas": 2053097, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0x40", + "0x20", + "0x80" + ] + }, + { + "pc": 2933, + "op": "MSTORE", + "gas": 2053094, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0x40", + "0xa0" + ] + }, + { + "pc": 2934, + "op": "PUSH3", + "gas": 2053091, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0" + ] + }, + { + "pc": 2938, + "op": "DUP2", + "gas": 2053088, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80" + ] + }, + { + "pc": 2939, + "op": "PUSH3", + "gas": 2053085, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0" + ] + }, + { + "pc": 2943, + "op": "JUMP", + "gas": 2053082, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0xb2f" + ] + }, + { + "pc": 2863, + "op": "JUMPDEST", + "gas": 2053074, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0" + ] + }, + { + "pc": 2864, + "op": "PUSH1", + "gas": 2053073, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0" + ] + }, + { + "pc": 2866, + "op": "PUSH3", + "gas": 2053070, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0" + ] + }, + { + "pc": 2870, + "op": "PUSH1", + "gas": 2053067, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xb3e" + ] + }, + { + "pc": 2872, + "op": "DUP4", + "gas": 2053064, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xb3e", + "0xe" + ] + }, + { + "pc": 2873, + "op": "PUSH3", + "gas": 2053061, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xb3e", + "0xe", + "0xc0" + ] + }, + { + "pc": 2877, + "op": "JUMP", + "gas": 2053058, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xb3e", + "0xe", + "0xc0", + "0xaf5" + ] + }, + { + "pc": 2805, + "op": "JUMPDEST", + "gas": 2053050, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xb3e", + "0xe", + "0xc0" + ] + }, + { + "pc": 2806, + "op": "PUSH1", + "gas": 2053049, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xb3e", + "0xe", + "0xc0" + ] + }, + { + "pc": 2808, + "op": "DUP3", + "gas": 2053046, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xb3e", + "0xe", + "0xc0", + "0x0" + ] + }, + { + "pc": 2809, + "op": "DUP3", + "gas": 2053043, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xb3e", + "0xe", + "0xc0", + "0x0", + "0xe" + ] + }, + { + "pc": 2810, + "op": "MSTORE", + "gas": 2053040, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xb3e", + "0xe", + "0xc0", + "0x0", + "0xe", + "0xc0" + ] + }, + { + "pc": 2811, + "op": "PUSH1", + "gas": 2053037, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xb3e", + "0xe", + "0xc0", + "0x0" + ] + }, + { + "pc": 2813, + "op": "DUP3", + "gas": 2053034, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xb3e", + "0xe", + "0xc0", + "0x0", + "0x20" + ] + }, + { + "pc": 2814, + "op": "ADD", + "gas": 2053031, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xb3e", + "0xe", + "0xc0", + "0x0", + "0x20", + "0xc0" + ] + }, + { + "pc": 2815, + "op": "SWAP1", + "gas": 2053028, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xb3e", + "0xe", + "0xc0", + "0x0", + "0xe0" + ] + }, + { + "pc": 2816, + "op": "POP", + "gas": 2053025, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xb3e", + "0xe", + "0xc0", + "0xe0", + "0x0" + ] + }, + { + "pc": 2817, + "op": "SWAP3", + "gas": 2053023, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xb3e", + "0xe", + "0xc0", + "0xe0" + ] + }, + { + "pc": 2818, + "op": "SWAP2", + "gas": 2053020, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xe0", + "0xe", + "0xc0", + "0xb3e" + ] + }, + { + "pc": 2819, + "op": "POP", + "gas": 2053017, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xe0", + "0xb3e", + "0xc0", + "0xe" + ] + }, + { + "pc": 2820, + "op": "POP", + "gas": 2053015, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xe0", + "0xb3e", + "0xc0" + ] + }, + { + "pc": 2821, + "op": "JUMP", + "gas": 2053013, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xe0", + "0xb3e" + ] + }, + { + "pc": 2878, + "op": "JUMPDEST", + "gas": 2053005, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xe0" + ] + }, + { + "pc": 2879, + "op": "SWAP2", + "gas": 2053004, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xe0" + ] + }, + { + "pc": 2880, + "op": "POP", + "gas": 2053001, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0", + "0xc0" + ] + }, + { + "pc": 2881, + "op": "PUSH3", + "gas": 2052999, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0" + ] + }, + { + "pc": 2885, + "op": "DUP3", + "gas": 2052996, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0", + "0xb4b" + ] + }, + { + "pc": 2886, + "op": "PUSH3", + "gas": 2052993, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0", + "0xb4b", + "0xe0" + ] + }, + { + "pc": 2890, + "op": "JUMP", + "gas": 2052990, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0", + "0xb4b", + "0xe0", + "0xb06" + ] + }, + { + "pc": 2822, + "op": "JUMPDEST", + "gas": 2052982, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0", + "0xb4b", + "0xe0" + ] + }, + { + "pc": 2823, + "op": "PUSH32", + "gas": 2052981, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0", + "0xb4b", + "0xe0" + ] + }, + { + "pc": 2856, + "op": "PUSH1", + "gas": 2052978, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0", + "0xb4b", + "0xe0", + "0x696e7465726e616c20746f706963000000000000000000000000000000000000" + ] + }, + { + "pc": 2858, + "op": "DUP3", + "gas": 2052975, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0", + "0xb4b", + "0xe0", + "0x696e7465726e616c20746f706963000000000000000000000000000000000000", + "0x0" + ] + }, + { + "pc": 2859, + "op": "ADD", + "gas": 2052972, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0", + "0xb4b", + "0xe0", + "0x696e7465726e616c20746f706963000000000000000000000000000000000000", + "0x0", + "0xe0" + ] + }, + { + "pc": 2860, + "op": "MSTORE", + "gas": 2052969, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0", + "0xb4b", + "0xe0", + "0x696e7465726e616c20746f706963000000000000000000000000000000000000", + "0xe0" + ] + }, + { + "pc": 2861, + "op": "POP", + "gas": 2052966, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0", + "0xb4b", + "0xe0" + ] + }, + { + "pc": 2862, + "op": "JUMP", + "gas": 2052964, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0", + "0xb4b" + ] + }, + { + "pc": 2891, + "op": "JUMPDEST", + "gas": 2052956, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0" + ] + }, + { + "pc": 2892, + "op": "PUSH1", + "gas": 2052955, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0" + ] + }, + { + "pc": 2894, + "op": "DUP3", + "gas": 2052952, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0", + "0x20" + ] + }, + { + "pc": 2895, + "op": "ADD", + "gas": 2052949, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0", + "0x20", + "0xe0" + ] + }, + { + "pc": 2896, + "op": "SWAP1", + "gas": 2052946, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0", + "0x100" + ] + }, + { + "pc": 2897, + "op": "POP", + "gas": 2052943, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x100", + "0x0" + ] + }, + { + "pc": 2898, + "op": "SWAP2", + "gas": 2052941, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x100" + ] + }, + { + "pc": 2899, + "op": "SWAP1", + "gas": 2052938, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0x100", + "0xe0", + "0xb80" + ] + }, + { + "pc": 2900, + "op": "POP", + "gas": 2052935, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0x100", + "0xb80", + "0xe0" + ] + }, + { + "pc": 2901, + "op": "JUMP", + "gas": 2052933, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0x100", + "0xb80" + ] + }, + { + "pc": 2944, + "op": "JUMPDEST", + "gas": 2052925, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0x100" + ] + }, + { + "pc": 2945, + "op": "SWAP1", + "gas": 2052924, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0x100" + ] + }, + { + "pc": 2946, + "op": "POP", + "gas": 2052921, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0x100", + "0xc0" + ] + }, + { + "pc": 2947, + "op": "SWAP3", + "gas": 2052919, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0x100" + ] + }, + { + "pc": 2948, + "op": "SWAP2", + "gas": 2052916, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x3e9", + "0x80", + "0x2ca" + ] + }, + { + "pc": 2949, + "op": "POP", + "gas": 2052913, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x2ca", + "0x80", + "0x3e9" + ] + }, + { + "pc": 2950, + "op": "POP", + "gas": 2052911, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x2ca", + "0x80" + ] + }, + { + "pc": 2951, + "op": "JUMP", + "gas": 2052909, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x2ca" + ] + }, + { + "pc": 714, + "op": "JUMPDEST", + "gas": 2052901, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100" + ] + }, + { + "pc": 715, + "op": "PUSH1", + "gas": 2052900, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100" + ] + }, + { + "pc": 717, + "op": "MLOAD", + "gas": 2052897, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x40" + ] + }, + { + "pc": 718, + "op": "DUP1", + "gas": 2052894, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x80" + ] + }, + { + "pc": 719, + "op": "SWAP2", + "gas": 2052891, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x80", + "0x80" + ] + }, + { + "pc": 720, + "op": "SUB", + "gas": 2052888, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x80", + "0x80", + "0x100" + ] + }, + { + "pc": 721, + "op": "SWAP1", + "gas": 2052885, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x80", + "0x80" + ] + }, + { + "pc": 722, + "op": "LOG2", + "gas": 2052882, + "gasCost": 2149, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x80", + "0x80" + ] + }, + { + "pc": 723, + "op": "DUP2", + "gas": 2050733, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0" + ] + }, + { + "pc": 724, + "op": "PUSH1", + "gas": 2050730, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9" + ] + }, + { + "pc": 726, + "op": "PUSH1", + "gas": 2050727, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3" + ] + }, + { + "pc": 728, + "op": "DUP3", + "gas": 2050724, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0" + ] + }, + { + "pc": 729, + "op": "DUP3", + "gas": 2050721, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x3e9" + ] + }, + { + "pc": 730, + "op": "SLOAD", + "gas": 2050718, + "gasCost": 2100, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x3e9", + "0x3" + ], + "storage": { + "0000000000000000000000000000000000000000000000000000000000000001": "00000000000000000000000000000000000000000000000000000000000003e8", + "0000000000000000000000000000000000000000000000000000000000000003": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "pc": 731, + "op": "PUSH3", + "gas": 2048618, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x3e9", + "0x0" + ] + }, + { + "pc": 735, + "op": "SWAP2", + "gas": 2048615, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x3e9", + "0x0", + "0x2e6" + ] + }, + { + "pc": 736, + "op": "SWAP1", + "gas": 2048612, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x0", + "0x3e9" + ] + }, + { + "pc": 737, + "op": "PUSH3", + "gas": 2048609, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0" + ] + }, + { + "pc": 741, + "op": "JUMP", + "gas": 2048606, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0xbb7" + ] + }, + { + "pc": 2999, + "op": "JUMPDEST", + "gas": 2048598, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0" + ] + }, + { + "pc": 3000, + "op": "PUSH1", + "gas": 2048597, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0" + ] + }, + { + "pc": 3002, + "op": "PUSH3", + "gas": 2048594, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0" + ] + }, + { + "pc": 3006, + "op": "DUP3", + "gas": 2048591, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbc4" + ] + }, + { + "pc": 3007, + "op": "PUSH3", + "gas": 2048588, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbc4", + "0x0" + ] + }, + { + "pc": 3011, + "op": "JUMP", + "gas": 2048585, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbc4", + "0x0", + "0x97c" + ] + }, + { + "pc": 2428, + "op": "JUMPDEST", + "gas": 2048577, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbc4", + "0x0" + ] + }, + { + "pc": 2429, + "op": "PUSH1", + "gas": 2048576, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbc4", + "0x0" + ] + }, + { + "pc": 2431, + "op": "DUP2", + "gas": 2048573, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbc4", + "0x0", + "0x0" + ] + }, + { + "pc": 2432, + "op": "SWAP1", + "gas": 2048570, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbc4", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 2433, + "op": "POP", + "gas": 2048567, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbc4", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 2434, + "op": "SWAP2", + "gas": 2048565, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbc4", + "0x0", + "0x0" + ] + }, + { + "pc": 2435, + "op": "SWAP1", + "gas": 2048562, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x0", + "0x0", + "0xbc4" + ] + }, + { + "pc": 2436, + "op": "POP", + "gas": 2048559, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x0", + "0xbc4", + "0x0" + ] + }, + { + "pc": 2437, + "op": "JUMP", + "gas": 2048557, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x0", + "0xbc4" + ] + }, + { + "pc": 3012, + "op": "JUMPDEST", + "gas": 2048549, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 3013, + "op": "SWAP2", + "gas": 2048548, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 3014, + "op": "POP", + "gas": 2048545, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 3015, + "op": "PUSH3", + "gas": 2048543, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0" + ] + }, + { + "pc": 3019, + "op": "DUP4", + "gas": 2048540, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbd1" + ] + }, + { + "pc": 3020, + "op": "PUSH3", + "gas": 2048537, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbd1", + "0x3e9" + ] + }, + { + "pc": 3024, + "op": "JUMP", + "gas": 2048534, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbd1", + "0x3e9", + "0x97c" + ] + }, + { + "pc": 2428, + "op": "JUMPDEST", + "gas": 2048526, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbd1", + "0x3e9" + ] + }, + { + "pc": 2429, + "op": "PUSH1", + "gas": 2048525, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbd1", + "0x3e9" + ] + }, + { + "pc": 2431, + "op": "DUP2", + "gas": 2048522, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbd1", + "0x3e9", + "0x0" + ] + }, + { + "pc": 2432, + "op": "SWAP1", + "gas": 2048519, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbd1", + "0x3e9", + "0x0", + "0x3e9" + ] + }, + { + "pc": 2433, + "op": "POP", + "gas": 2048516, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbd1", + "0x3e9", + "0x3e9", + "0x0" + ] + }, + { + "pc": 2434, + "op": "SWAP2", + "gas": 2048514, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbd1", + "0x3e9", + "0x3e9" + ] + }, + { + "pc": 2435, + "op": "SWAP1", + "gas": 2048511, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x3e9", + "0x3e9", + "0xbd1" + ] + }, + { + "pc": 2436, + "op": "POP", + "gas": 2048508, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x3e9", + "0xbd1", + "0x3e9" + ] + }, + { + "pc": 2437, + "op": "JUMP", + "gas": 2048506, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x3e9", + "0xbd1" + ] + }, + { + "pc": 3025, + "op": "JUMPDEST", + "gas": 2048498, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x3e9" + ] + }, + { + "pc": 3026, + "op": "SWAP3", + "gas": 2048497, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x3e9" + ] + }, + { + "pc": 3027, + "op": "POP", + "gas": 2048494, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x3e9" + ] + }, + { + "pc": 3028, + "op": "DUP3", + "gas": 2048492, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0" + ] + }, + { + "pc": 3029, + "op": "PUSH32", + "gas": 2048489, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x3e9" + ] + }, + { + "pc": 3062, + "op": "SUB", + "gas": 2048486, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x3e9", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + ] + }, + { + "pc": 3063, + "op": "DUP3", + "gas": 2048483, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc16" + ] + }, + { + "pc": 3064, + "op": "GT", + "gas": 2048480, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc16", + "0x0" + ] + }, + { + "pc": 3065, + "op": "ISZERO", + "gas": 2048477, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 3066, + "op": "PUSH3", + "gas": 2048474, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x1" + ] + }, + { + "pc": 3070, + "op": "JUMPI", + "gas": 2048471, + "gasCost": 10, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x1", + "0xc09" + ] + }, + { + "pc": 3081, + "op": "JUMPDEST", + "gas": 2048461, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0" + ] + }, + { + "pc": 3082, + "op": "DUP3", + "gas": 2048460, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0" + ] + }, + { + "pc": 3083, + "op": "DUP3", + "gas": 2048457, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x3e9" + ] + }, + { + "pc": 3084, + "op": "ADD", + "gas": 2048454, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x3e9", + "0x0" + ] + }, + { + "pc": 3085, + "op": "SWAP1", + "gas": 2048451, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x3e9" + ] + }, + { + "pc": 3086, + "op": "POP", + "gas": 2048448, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x3e9", + "0x0" + ] + }, + { + "pc": 3087, + "op": "SWAP3", + "gas": 2048446, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x3e9" + ] + }, + { + "pc": 3088, + "op": "SWAP2", + "gas": 2048443, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x3e9", + "0x3e9", + "0x0", + "0x2e6" + ] + }, + { + "pc": 3089, + "op": "POP", + "gas": 2048440, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x3e9", + "0x2e6", + "0x0", + "0x3e9" + ] + }, + { + "pc": 3090, + "op": "POP", + "gas": 2048438, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x3e9", + "0x2e6", + "0x0" + ] + }, + { + "pc": 3091, + "op": "JUMP", + "gas": 2048436, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x3e9", + "0x2e6" + ] + }, + { + "pc": 742, + "op": "JUMPDEST", + "gas": 2048428, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x3e9" + ] + }, + { + "pc": 743, + "op": "SWAP3", + "gas": 2048427, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x3e9" + ] + }, + { + "pc": 744, + "op": "POP", + "gas": 2048424, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x3e9" + ] + }, + { + "pc": 745, + "op": "POP", + "gas": 2048422, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0" + ] + }, + { + "pc": 746, + "op": "DUP2", + "gas": 2048420, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3" + ] + }, + { + "pc": 747, + "op": "SWAP1", + "gas": 2048417, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x3e9" + ] + }, + { + "pc": 748, + "op": "SSTORE", + "gas": 2048414, + "gasCost": 20000, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9", + "0x3e9", + "0x3" + ], + "storage": { + "0000000000000000000000000000000000000000000000000000000000000001": "00000000000000000000000000000000000000000000000000000000000003e8", + "0000000000000000000000000000000000000000000000000000000000000003": "00000000000000000000000000000000000000000000000000000000000003e9" + } + }, + { + "pc": 749, + "op": "POP", + "gas": 2028414, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x3e9" + ] + }, + { + "pc": 750, + "op": "PUSH1", + "gas": 2028412, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0" + ] + }, + { + "pc": 752, + "op": "SWAP1", + "gas": 2028409, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x0", + "0x2" + ] + }, + { + "pc": 753, + "op": "POP", + "gas": 2028406, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x2", + "0x0" + ] + }, + { + "pc": 754, + "op": "SWAP2", + "gas": 2028404, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x888", + "0x3e9", + "0x2" + ] + }, + { + "pc": 755, + "op": "SWAP1", + "gas": 2028401, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x2", + "0x3e9", + "0x888" + ] + }, + { + "pc": 756, + "op": "POP", + "gas": 2028398, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x2", + "0x888", + "0x3e9" + ] + }, + { + "pc": 757, + "op": "JUMP", + "gas": 2028396, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x2", + "0x888" + ] + }, + { + "pc": 2184, + "op": "JUMPDEST", + "gas": 2028388, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x2" + ] + }, + { + "pc": 2185, + "op": "POP", + "gas": 2028387, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x2" + ] + }, + { + "pc": 2186, + "op": "PUSH3", + "gas": 2028385, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2190, + "op": "PUSH3", + "gas": 2028382, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893" + ] + }, + { + "pc": 2194, + "op": "JUMP", + "gas": 2028379, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0x231" + ] + }, + { + "pc": 561, + "op": "JUMPDEST", + "gas": 2028371, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893" + ] + }, + { + "pc": 562, + "op": "PUSH1", + "gas": 2028370, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893" + ] + }, + { + "pc": 564, + "op": "DUP1", + "gas": 2028367, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0x0" + ] + }, + { + "pc": 565, + "op": "PUSH1", + "gas": 2028364, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0x0", + "0x0" + ] + }, + { + "pc": 567, + "op": "MLOAD", + "gas": 2028361, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0x0", + "0x0", + "0x40" + ] + }, + { + "pc": 568, + "op": "DUP1", + "gas": 2028358, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0x0", + "0x0", + "0x80" + ] + }, + { + "pc": 569, + "op": "PUSH1", + "gas": 2028355, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0x0", + "0x0", + "0x80", + "0x80" + ] + }, + { + "pc": 571, + "op": "ADD", + "gas": 2028352, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0x0", + "0x0", + "0x80", + "0x80", + "0x40" + ] + }, + { + "pc": 572, + "op": "PUSH1", + "gas": 2028349, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0x0", + "0x0", + "0x80", + "0xc0" + ] + }, + { + "pc": 574, + "op": "MSTORE", + "gas": 2028346, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0x0", + "0x0", + "0x80", + "0xc0", + "0x40" + ] + }, + { + "pc": 575, + "op": "DUP1", + "gas": 2028343, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0x0", + "0x0", + "0x80" + ] + }, + { + "pc": 576, + "op": "PUSH1", + "gas": 2028340, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0x0", + "0x0", + "0x80", + "0x80" + ] + }, + { + "pc": 578, + "op": "DUP2", + "gas": 2028337, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0x0", + "0x0", + "0x80", + "0x80", + "0xd" + ] + }, + { + "pc": 579, + "op": "MSTORE", + "gas": 2028334, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0x0", + "0x0", + "0x80", + "0x80", + "0xd", + "0x80" + ] + }, + { + "pc": 580, + "op": "PUSH1", + "gas": 2028331, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0x0", + "0x0", + "0x80", + "0x80" + ] + }, + { + "pc": 582, + "op": "ADD", + "gas": 2028328, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0x0", + "0x0", + "0x80", + "0x80", + "0x20" + ] + }, + { + "pc": 583, + "op": "PUSH32", + "gas": 2028325, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0x0", + "0x0", + "0x80", + "0xa0" + ] + }, + { + "pc": 616, + "op": "DUP2", + "gas": 2028322, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0x0", + "0x0", + "0x80", + "0xa0", + "0x48656c6c6f2c20776f726c642100000000000000000000000000000000000000" + ] + }, + { + "pc": 617, + "op": "MSTORE", + "gas": 2028319, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0x0", + "0x0", + "0x80", + "0xa0", + "0x48656c6c6f2c20776f726c642100000000000000000000000000000000000000", + "0xa0" + ] + }, + { + "pc": 618, + "op": "POP", + "gas": 2028316, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0x0", + "0x0", + "0x80", + "0xa0" + ] + }, + { + "pc": 619, + "op": "SWAP1", + "gas": 2028314, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0x0", + "0x0", + "0x80" + ] + }, + { + "pc": 620, + "op": "POP", + "gas": 2028311, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0x0", + "0x80", + "0x0" + ] + }, + { + "pc": 621, + "op": "PUSH1", + "gas": 2028309, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0x0", + "0x80" + ] + }, + { + "pc": 623, + "op": "DUP2", + "gas": 2028306, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0x0", + "0x80", + "0x0" + ] + }, + { + "pc": 624, + "op": "DUP1", + "gas": 2028303, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0x0", + "0x80", + "0x0", + "0x80" + ] + }, + { + "pc": 625, + "op": "MLOAD", + "gas": 2028300, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0x0", + "0x80", + "0x0", + "0x80", + "0x80" + ] + }, + { + "pc": 626, + "op": "SWAP1", + "gas": 2028297, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0x0", + "0x80", + "0x0", + "0x80", + "0xd" + ] + }, + { + "pc": 627, + "op": "PUSH1", + "gas": 2028294, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0x0", + "0x80", + "0x0", + "0xd", + "0x80" + ] + }, + { + "pc": 629, + "op": "ADD", + "gas": 2028291, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0x0", + "0x80", + "0x0", + "0xd", + "0x80", + "0x20" + ] + }, + { + "pc": 630, + "op": "KECCAK256", + "gas": 2028288, + "gasCost": 36, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0x0", + "0x80", + "0x0", + "0xd", + "0xa0" + ] + }, + { + "pc": 631, + "op": "SWAP1", + "gas": 2028252, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0x0", + "0x80", + "0x0", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4" + ] + }, + { + "pc": 632, + "op": "POP", + "gas": 2028249, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0x0", + "0x80", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4", + "0x0" + ] + }, + { + "pc": 633, + "op": "DUP1", + "gas": 2028247, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0x0", + "0x80", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4" + ] + }, + { + "pc": 634, + "op": "SWAP3", + "gas": 2028244, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0x0", + "0x80", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4" + ] + }, + { + "pc": 635, + "op": "POP", + "gas": 2028241, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4", + "0x80", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4", + "0x0" + ] + }, + { + "pc": 636, + "op": "POP", + "gas": 2028239, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4", + "0x80", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4" + ] + }, + { + "pc": 637, + "op": "POP", + "gas": 2028237, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4", + "0x80" + ] + }, + { + "pc": 638, + "op": "SWAP1", + "gas": 2028235, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x893", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4" + ] + }, + { + "pc": 639, + "op": "JUMP", + "gas": 2028232, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4", + "0x893" + ] + }, + { + "pc": 2195, + "op": "JUMPDEST", + "gas": 2028224, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4" + ] + }, + { + "pc": 2196, + "op": "POP", + "gas": 2028223, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4" + ] + }, + { + "pc": 2197, + "op": "PUSH1", + "gas": 2028221, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2199, + "op": "DUP1", + "gas": 2028218, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0" + ] + }, + { + "pc": 2200, + "op": "SLOAD", + "gas": 2028215, + "gasCost": 2100, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0x0" + ], + "storage": { + "0000000000000000000000000000000000000000000000000000000000000000": "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000001": "00000000000000000000000000000000000000000000000000000000000003e8", + "0000000000000000000000000000000000000000000000000000000000000003": "00000000000000000000000000000000000000000000000000000000000003e9" + } + }, + { + "pc": 2201, + "op": "SWAP1", + "gas": 2026115, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 2202, + "op": "PUSH2", + "gas": 2026112, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 2205, + "op": "EXP", + "gas": 2026109, + "gasCost": 10, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0x0", + "0x100" + ] + }, + { + "pc": 2206, + "op": "SWAP1", + "gas": 2026099, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0x1" + ] + }, + { + "pc": 2207, + "op": "DIV", + "gas": 2026096, + "gasCost": 5, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x1", + "0x0" + ] + }, + { + "pc": 2208, + "op": "PUSH20", + "gas": 2026091, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0" + ] + }, + { + "pc": 2229, + "op": "AND", + "gas": 2026088, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xffffffffffffffffffffffffffffffffffffffff" + ] + }, + { + "pc": 2230, + "op": "PUSH20", + "gas": 2026085, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0" + ] + }, + { + "pc": 2251, + "op": "AND", + "gas": 2026082, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xffffffffffffffffffffffffffffffffffffffff" + ] + }, + { + "pc": 2252, + "op": "PUSH4", + "gas": 2026079, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0" + ] + }, + { + "pc": 2257, + "op": "DUP4", + "gas": 2026076, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68" + ] + }, + { + "pc": 2258, + "op": "PUSH1", + "gas": 2026073, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x3e8" + ] + }, + { + "pc": 2260, + "op": "MLOAD", + "gas": 2026070, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x3e8", + "0x40" + ] + }, + { + "pc": 2261, + "op": "DUP3", + "gas": 2026067, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x3e8", + "0xc0" + ] + }, + { + "pc": 2262, + "op": "PUSH4", + "gas": 2026064, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x3e8", + "0xc0", + "0xa0712d68" + ] + }, + { + "pc": 2267, + "op": "AND", + "gas": 2026061, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x3e8", + "0xc0", + "0xa0712d68", + "0xffffffff" + ] + }, + { + "pc": 2268, + "op": "PUSH1", + "gas": 2026058, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x3e8", + "0xc0", + "0xa0712d68" + ] + }, + { + "pc": 2270, + "op": "SHL", + "gas": 2026055, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x3e8", + "0xc0", + "0xa0712d68", + "0xe0" + ] + }, + { + "pc": 2271, + "op": "DUP2", + "gas": 2026052, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x3e8", + "0xc0", + "0xa0712d6800000000000000000000000000000000000000000000000000000000" + ] + }, + { + "pc": 2272, + "op": "MSTORE", + "gas": 2026049, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x3e8", + "0xc0", + "0xa0712d6800000000000000000000000000000000000000000000000000000000", + "0xc0" + ] + }, + { + "pc": 2273, + "op": "PUSH1", + "gas": 2026046, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x3e8", + "0xc0" + ] + }, + { + "pc": 2275, + "op": "ADD", + "gas": 2026043, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x3e8", + "0xc0", + "0x4" + ] + }, + { + "pc": 2276, + "op": "PUSH3", + "gas": 2026040, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x3e8", + "0xc4" + ] + }, + { + "pc": 2280, + "op": "SWAP2", + "gas": 2026037, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x3e8", + "0xc4", + "0x8ef" + ] + }, + { + "pc": 2281, + "op": "SWAP1", + "gas": 2026034, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0xc4", + "0x3e8" + ] + }, + { + "pc": 2282, + "op": "PUSH3", + "gas": 2026031, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4" + ] + }, + { + "pc": 2286, + "op": "JUMP", + "gas": 2026028, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0x997" + ] + }, + { + "pc": 2455, + "op": "JUMPDEST", + "gas": 2026020, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4" + ] + }, + { + "pc": 2456, + "op": "PUSH1", + "gas": 2026019, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4" + ] + }, + { + "pc": 2458, + "op": "PUSH1", + "gas": 2026016, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0x0" + ] + }, + { + "pc": 2460, + "op": "DUP3", + "gas": 2026013, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0x0", + "0x20" + ] + }, + { + "pc": 2461, + "op": "ADD", + "gas": 2026010, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0x0", + "0x20", + "0xc4" + ] + }, + { + "pc": 2462, + "op": "SWAP1", + "gas": 2026007, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0x0", + "0xe4" + ] + }, + { + "pc": 2463, + "op": "POP", + "gas": 2026004, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0xe4", + "0x0" + ] + }, + { + "pc": 2464, + "op": "PUSH3", + "gas": 2026002, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0xe4" + ] + }, + { + "pc": 2468, + "op": "PUSH1", + "gas": 2025999, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae" + ] + }, + { + "pc": 2470, + "op": "DUP4", + "gas": 2025996, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0x0" + ] + }, + { + "pc": 2471, + "op": "ADD", + "gas": 2025993, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0x0", + "0xc4" + ] + }, + { + "pc": 2472, + "op": "DUP5", + "gas": 2025990, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4" + ] + }, + { + "pc": 2473, + "op": "PUSH3", + "gas": 2025987, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8" + ] + }, + { + "pc": 2477, + "op": "JUMP", + "gas": 2025984, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8", + "0x986" + ] + }, + { + "pc": 2438, + "op": "JUMPDEST", + "gas": 2025976, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8" + ] + }, + { + "pc": 2439, + "op": "PUSH3", + "gas": 2025975, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8" + ] + }, + { + "pc": 2443, + "op": "DUP2", + "gas": 2025972, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8", + "0x991" + ] + }, + { + "pc": 2444, + "op": "PUSH3", + "gas": 2025969, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8", + "0x991", + "0x3e8" + ] + }, + { + "pc": 2448, + "op": "JUMP", + "gas": 2025966, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8", + "0x991", + "0x3e8", + "0x97c" + ] + }, + { + "pc": 2428, + "op": "JUMPDEST", + "gas": 2025958, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8", + "0x991", + "0x3e8" + ] + }, + { + "pc": 2429, + "op": "PUSH1", + "gas": 2025957, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8", + "0x991", + "0x3e8" + ] + }, + { + "pc": 2431, + "op": "DUP2", + "gas": 2025954, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8", + "0x991", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2432, + "op": "SWAP1", + "gas": 2025951, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8", + "0x991", + "0x3e8", + "0x0", + "0x3e8" + ] + }, + { + "pc": 2433, + "op": "POP", + "gas": 2025948, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8", + "0x991", + "0x3e8", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2434, + "op": "SWAP2", + "gas": 2025946, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8", + "0x991", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 2435, + "op": "SWAP1", + "gas": 2025943, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8", + "0x3e8", + "0x3e8", + "0x991" + ] + }, + { + "pc": 2436, + "op": "POP", + "gas": 2025940, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8", + "0x3e8", + "0x991", + "0x3e8" + ] + }, + { + "pc": 2437, + "op": "JUMP", + "gas": 2025938, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8", + "0x3e8", + "0x991" + ] + }, + { + "pc": 2449, + "op": "JUMPDEST", + "gas": 2025930, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 2450, + "op": "DUP3", + "gas": 2025929, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 2451, + "op": "MSTORE", + "gas": 2025926, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8", + "0x3e8", + "0xc4" + ] + }, + { + "pc": 2452, + "op": "POP", + "gas": 2025923, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8" + ] + }, + { + "pc": 2453, + "op": "POP", + "gas": 2025921, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4" + ] + }, + { + "pc": 2454, + "op": "JUMP", + "gas": 2025919, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae" + ] + }, + { + "pc": 2478, + "op": "JUMPDEST", + "gas": 2025911, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0xe4" + ] + }, + { + "pc": 2479, + "op": "SWAP3", + "gas": 2025910, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0x8ef", + "0x3e8", + "0xc4", + "0xe4" + ] + }, + { + "pc": 2480, + "op": "SWAP2", + "gas": 2025907, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0xe4", + "0x3e8", + "0xc4", + "0x8ef" + ] + }, + { + "pc": 2481, + "op": "POP", + "gas": 2025904, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0xe4", + "0x8ef", + "0xc4", + "0x3e8" + ] + }, + { + "pc": 2482, + "op": "POP", + "gas": 2025902, + "gasCost": 2, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0xe4", + "0x8ef", + "0xc4" + ] + }, + { + "pc": 2483, + "op": "JUMP", + "gas": 2025900, + "gasCost": 8, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0xe4", + "0x8ef" + ] + }, + { + "pc": 2287, + "op": "JUMPDEST", + "gas": 2025892, + "gasCost": 1, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0xe4" + ] + }, + { + "pc": 2288, + "op": "PUSH1", + "gas": 2025891, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0xe4" + ] + }, + { + "pc": 2290, + "op": "PUSH1", + "gas": 2025888, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0xe4", + "0x20" + ] + }, + { + "pc": 2292, + "op": "MLOAD", + "gas": 2025885, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0xe4", + "0x20", + "0x40" + ] + }, + { + "pc": 2293, + "op": "DUP1", + "gas": 2025882, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0xe4", + "0x20", + "0xc0" + ] + }, + { + "pc": 2294, + "op": "DUP4", + "gas": 2025879, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0xe4", + "0x20", + "0xc0", + "0xc0" + ] + }, + { + "pc": 2295, + "op": "SUB", + "gas": 2025876, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0xe4", + "0x20", + "0xc0", + "0xc0", + "0xe4" + ] + }, + { + "pc": 2296, + "op": "DUP2", + "gas": 2025873, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0xe4", + "0x20", + "0xc0", + "0x24" + ] + }, + { + "pc": 2297, + "op": "PUSH1", + "gas": 2025870, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0xe4", + "0x20", + "0xc0", + "0x24", + "0xc0" + ] + }, + { + "pc": 2299, + "op": "DUP8", + "gas": 2025867, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0xe4", + "0x20", + "0xc0", + "0x24", + "0xc0", + "0x0" + ] + }, + { + "pc": 2300, + "op": "DUP1", + "gas": 2025864, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0xe4", + "0x20", + "0xc0", + "0x24", + "0xc0", + "0x0", + "0x0" + ] + }, + { + "pc": 2301, + "op": "EXTCODESIZE", + "gas": 2025861, + "gasCost": 100, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0xe4", + "0x20", + "0xc0", + "0x24", + "0xc0", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 2302, + "op": "ISZERO", + "gas": 2025761, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0xe4", + "0x20", + "0xc0", + "0x24", + "0xc0", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 2303, + "op": "DUP1", + "gas": 2025758, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0xe4", + "0x20", + "0xc0", + "0x24", + "0xc0", + "0x0", + "0x0", + "0x1" + ] + }, + { + "pc": 2304, + "op": "ISZERO", + "gas": 2025755, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0xe4", + "0x20", + "0xc0", + "0x24", + "0xc0", + "0x0", + "0x0", + "0x1", + "0x1" + ] + }, + { + "pc": 2305, + "op": "PUSH3", + "gas": 2025752, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0xe4", + "0x20", + "0xc0", + "0x24", + "0xc0", + "0x0", + "0x0", + "0x1", + "0x0" + ] + }, + { + "pc": 2309, + "op": "JUMPI", + "gas": 2025749, + "gasCost": 10, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0xe4", + "0x20", + "0xc0", + "0x24", + "0xc0", + "0x0", + "0x0", + "0x1", + "0x0", + "0x90a" + ] + }, + { + "pc": 2310, + "op": "PUSH1", + "gas": 2025739, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0xe4", + "0x20", + "0xc0", + "0x24", + "0xc0", + "0x0", + "0x0", + "0x1" + ] + }, + { + "pc": 2312, + "op": "DUP1", + "gas": 2025736, + "gasCost": 3, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0xe4", + "0x20", + "0xc0", + "0x24", + "0xc0", + "0x0", + "0x0", + "0x1", + "0x0" + ] + }, + { + "pc": 2313, + "op": "REVERT", + "gas": 2025733, + "gasCost": 0, + "depth": 1, + "stack": [ + "0xa0712d68", + "0x1cd", + "0x3e8", + "0x0", + "0x0", + "0xa0712d68", + "0xe4", + "0x20", + "0xc0", + "0x24", + "0xc0", + "0x0", + "0x0", + "0x1", + "0x0", + "0x0" + ] + } + ] +} \ No newline at end of file diff --git a/test/historicstate/hardhat/scripts/geth_traces/Tracer.mint.prestateDiffTracer.json b/test/historicstate/hardhat/scripts/geth_traces/Tracer.mint.prestateDiffTracer.json new file mode 100644 index 000000000..a17694aac --- /dev/null +++ b/test/historicstate/hardhat/scripts/geth_traces/Tracer.mint.prestateDiffTracer.json @@ -0,0 +1,20 @@ +{ + "post": { + "0x0000000000000000000000000000000000000000": { + "balance": "0x1b648c9" + }, + "OWNER.address": { + "balance": "0x361049155a32982d79", + "nonce": 81 + } + }, + "pre": { + "0x0000000000000000000000000000000000000000": { + "balance": "0x1b526ae" + }, + "OWNER.address": { + "balance": "0x361049155acb1a0715", + "nonce": 80 + } + } +} \ No newline at end of file diff --git a/test/historicstate/hardhat/scripts/geth_traces/Tracer.mint.prestateTracer.json b/test/historicstate/hardhat/scripts/geth_traces/Tracer.mint.prestateTracer.json new file mode 100644 index 000000000..111da9391 --- /dev/null +++ b/test/historicstate/hardhat/scripts/geth_traces/Tracer.mint.prestateTracer.json @@ -0,0 +1,19 @@ +{ + "0x0000000000000000000000000000000000000000": { + "balance": "0x1b526ae" + }, + "OWNER.address": { + "balance": "0x361049155acb1a0715", + "nonce": 80 + }, + "Tracer.address": { + "balance": "0x0", + "code": "0x60806040523480156200001157600080fd5b5060043610620000ac5760003560e01c80638bfe44ff116200006f5780638bfe44ff14620001975780639295436214620001a3578063a0712d6814620001af578063b69ef8a814620001e5578063c9353cb5146200020757620000ac565b806312065fe014620000b15780631c71706914620000d35780631c93908c14620000f55780633aa18088146200012b5780637f29c3941462000161575b600080fd5b620000bb62000227565b604051620000ca919062000997565b60405180910390f35b620000dd62000231565b604051620000ec9190620009cf565b60405180910390f35b6200011360048036038101906200010d919062000a2c565b62000280565b60405162000122919062000997565b60405180910390f35b62000149600480360381019062000143919062000a2c565b620002f6565b60405162000158919062000997565b60405180910390f35b6200017f600480360381019062000179919062000a2c565b620004ae565b6040516200018e919062000997565b60405180910390f35b620001a162000783565b005b620001ad620007c5565b005b620001cd6004803603810190620001c7919062000a2c565b62000802565b604051620001dc919062000997565b60405180910390f35b620001ef6200094f565b604051620001fe919062000997565b60405180910390f35b6200022560048036038101906200021f919062000ac3565b62000955565b005b6000600154905090565b6000806040518060400160405280600d81526020017f48656c6c6f2c20776f726c6421000000000000000000000000000000000000008152509050600081805190602001209050809250505090565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac083604051620002ca919062000b56565b60405180910390a28160036000828254620002e6919062000bb7565b9250508190555060029050919050565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac08360405162000340919062000c64565b60405180910390a260405162000356906200096e565b604051809103906000f08015801562000373573d6000803e3d6000fd5b506000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160016000828254620003c7919062000bb7565b92505081905550620003e7600183620003e1919062000bb7565b62000280565b50620003f262000231565b5060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b81526004016200044e919062000997565b602060405180830381600087803b1580156200046957600080fd5b505af11580156200047e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004a4919062000cad565b5060019050919050565b60003073ffffffffffffffffffffffffffffffffffffffff1663929543626040518163ffffffff1660e01b815260040160006040518083038186803b158015620004f757600080fd5b505afa92505050801562000509575060015b620005f2576200051862000cec565b806308c379a014156200057d57506200053062000d87565b806200053d57506200057f565b7f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a816040516200056e919062000eab565b60405180910390a150620005ec565b505b3d8060008114620005ad576040519150601f19603f3d011682016040523d82523d6000602084013e620005b2565b606091505b507f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a604051620005e29062000f45565b60405180910390a1505b620005f3565b5b3073ffffffffffffffffffffffffffffffffffffffff16638bfe44ff6040518163ffffffff1660e01b815260040160006040518083038186803b1580156200063a57600080fd5b505afa9250505080156200064c575060015b62000735576200065b62000cec565b806308c379a01415620006c057506200067362000d87565b80620006805750620006c2565b7f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a81604051620006b1919062000eab565b60405180910390a1506200072f565b505b3d8060008114620006f0576040519150601f19603f3d011682016040523d82523d6000602084013e620006f5565b606091505b507f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a604051620007259062000f45565b60405180910390a1505b62000736565b5b60006200077a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007719062000fb7565b60405180910390fd5b60019050919050565b6001806040517fcf479181000000000000000000000000000000000000000000000000000000008152600401620007bc92919062001026565b60405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007f990620010a3565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0836040516200084c919062000c64565b60405180910390a2816001600082825462000868919062000bb7565b925050819055506200088860018362000882919062000bb7565b62000280565b506200089362000231565b5060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b8152600401620008ef919062000997565b602060405180830381600087803b1580156200090a57600080fd5b505af11580156200091f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000945919062000cad565b5060019050919050565b60015481565b8073ffffffffffffffffffffffffffffffffffffffff16ff5b610ae380620010c683390190565b6000819050919050565b62000991816200097c565b82525050565b6000602082019050620009ae600083018462000986565b92915050565b6000819050919050565b620009c981620009b4565b82525050565b6000602082019050620009e66000830184620009be565b92915050565b6000604051905090565b600080fd5b62000a06816200097c565b811462000a1257600080fd5b50565b60008135905062000a2681620009fb565b92915050565b60006020828403121562000a455762000a44620009f6565b5b600062000a558482850162000a15565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000a8b8262000a5e565b9050919050565b62000a9d8162000a7e565b811462000aa957600080fd5b50565b60008135905062000abd8162000a92565b92915050565b60006020828403121562000adc5762000adb620009f6565b5b600062000aec8482850162000aac565b91505092915050565b600082825260208201905092915050565b7f696e7465726e616c20746f706963000000000000000000000000000000000000600082015250565b600062000b3e600e8362000af5565b915062000b4b8262000b06565b602082019050919050565b600060408201905062000b6d600083018462000986565b818103602083015262000b808162000b2f565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000bc4826200097c565b915062000bd1836200097c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000c095762000c0862000b88565b5b828201905092915050565b7f746f706963000000000000000000000000000000000000000000000000000000600082015250565b600062000c4c60058362000af5565b915062000c598262000c14565b602082019050919050565b600060408201905062000c7b600083018462000986565b818103602083015262000c8e8162000c3d565b905092915050565b60008151905062000ca781620009fb565b92915050565b60006020828403121562000cc65762000cc5620009f6565b5b600062000cd68482850162000c96565b91505092915050565b60008160e01c9050919050565b600060033d111562000d0e5760046000803e62000d0b60005162000cdf565b90505b90565b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000d5c8262000d11565b810181811067ffffffffffffffff8211171562000d7e5762000d7d62000d22565b5b80604052505050565b600060443d101562000d995762000e26565b62000da3620009ec565b60043d036004823e80513d602482011167ffffffffffffffff8211171562000dcd57505062000e26565b808201805167ffffffffffffffff81111562000ded575050505062000e26565b80602083010160043d03850181111562000e0c57505050505062000e26565b62000e1d8260200185018662000d51565b82955050505050505b90565b600081519050919050565b60005b8381101562000e5457808201518184015260208101905062000e37565b8381111562000e64576000848401525b50505050565b600062000e778262000e29565b62000e83818562000af5565b935062000e9581856020860162000e34565b62000ea08162000d11565b840191505092915050565b6000602082019050818103600083015262000ec7818462000e6a565b905092915050565b7f45787465726e616c2063616c6c206661696c656420776974686f757420616e2060008201527f6572726f72206d65737361676500000000000000000000000000000000000000602082015250565b600062000f2d602d8362000af5565b915062000f3a8262000ecf565b604082019050919050565b6000602082019050818103600083015262000f608162000f1e565b9050919050565b7f494e53554646494349454e542042414c414e4345000000000000000000000000600082015250565b600062000f9f60148362000af5565b915062000fac8262000f67565b602082019050919050565b6000602082019050818103600083015262000fd28162000f90565b9050919050565b6000819050919050565b6000819050919050565b60006200100e62001008620010028462000fd9565b62000fe3565b6200097c565b9050919050565b620010208162000fed565b82525050565b60006040820190506200103d600083018562001015565b6200104c602083018462001015565b9392505050565b7f546869732066756e6374696f6e20726576657274656421000000000000000000600082015250565b60006200108b60178362000af5565b9150620010988262001053565b602082019050919050565b60006020820190508181036000830152620010be816200107c565b905091905056fe60806040526000600160006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b50600160009054906101000a900460ff161562000080576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200007790620002b5565b60405180910390fd5b60018060006101000a81548160ff021916908315150217905550620000bc701d6329f1c35ca4bfabb9f5610000000000620000c360201b60201c565b5062000482565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0836040516200010d919062000342565b60405180910390a281600080828254620001289190620003a3565b925050819055506200014e600183620001429190620003a3565b6200016960201b60201c565b506200015f620001df60201b60201c565b5060019050919050565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac083604051620001b3919062000450565b60405180910390a28160026000828254620001cf9190620003a3565b9250508190555060029050919050565b6000806040518060400160405280600d81526020017f48656c6c6f2c20776f726c6421000000000000000000000000000000000000008152509050600081805190602001209050809250505090565b600082825260208201905092915050565b7f436f6e747261637420696e7374616e63652068617320616c726561647920626560008201527f656e20696e697469616c697a6564000000000000000000000000000000000000602082015250565b60006200029d602e836200022e565b9150620002aa826200023f565b604082019050919050565b60006020820190508181036000830152620002d0816200028e565b9050919050565b6000819050919050565b620002ec81620002d7565b82525050565b7f746f706963000000000000000000000000000000000000000000000000000000600082015250565b60006200032a6005836200022e565b91506200033782620002f2565b602082019050919050565b6000604082019050620003596000830184620002e1565b81810360208301526200036c816200031b565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620003b082620002d7565b9150620003bd83620002d7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620003f557620003f462000374565b5b828201905092915050565b7f696e7465726e616c20746f706963000000000000000000000000000000000000600082015250565b600062000438600e836200022e565b9150620004458262000400565b602082019050919050565b6000604082019050620004676000830184620002e1565b81810360208301526200047a8162000429565b905092915050565b61065180620004926000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c80631c717069146100675780631c93908c1461008557806392954362146100b5578063a0712d68146100bf578063b69ef8a8146100ef578063c9353cb51461010d575b600080fd5b61006f610129565b60405161007c91906102ed565b60405180910390f35b61009f600480360381019061009a9190610343565b610178565b6040516100ac919061037f565b60405180910390f35b6100bd6101ea565b005b6100d960048036038101906100d49190610343565b610225565b6040516100e6919061037f565b60405180910390f35b6100f76102b5565b604051610104919061037f565b60405180910390f35b610127600480360381019061012291906103f8565b6102bb565b005b6000806040518060400160405280600d81526020017f48656c6c6f2c20776f726c6421000000000000000000000000000000000000008152509050600081805190602001209050809250505090565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0836040516101c09190610482565b60405180910390a281600260008282546101da91906104df565b9250508190555060029050919050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161021c90610581565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac08360405161026d91906105ed565b60405180910390a28160008082825461028691906104df565b925050819055506102a260018361029d91906104df565b610178565b506102ab610129565b5060019050919050565b60005481565b8073ffffffffffffffffffffffffffffffffffffffff16ff5b6000819050919050565b6102e7816102d4565b82525050565b600060208201905061030260008301846102de565b92915050565b600080fd5b6000819050919050565b6103208161030d565b811461032b57600080fd5b50565b60008135905061033d81610317565b92915050565b60006020828403121561035957610358610308565b5b60006103678482850161032e565b91505092915050565b6103798161030d565b82525050565b60006020820190506103946000830184610370565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103c58261039a565b9050919050565b6103d5816103ba565b81146103e057600080fd5b50565b6000813590506103f2816103cc565b92915050565b60006020828403121561040e5761040d610308565b5b600061041c848285016103e3565b91505092915050565b600082825260208201905092915050565b7f696e7465726e616c20746f706963000000000000000000000000000000000000600082015250565b600061046c600e83610425565b915061047782610436565b602082019050919050565b60006040820190506104976000830184610370565b81810360208301526104a88161045f565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006104ea8261030d565b91506104f58361030d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561052a576105296104b0565b5b828201905092915050565b7f546869732066756e6374696f6e20726576657274656421000000000000000000600082015250565b600061056b601783610425565b915061057682610535565b602082019050919050565b6000602082019050818103600083015261059a8161055e565b9050919050565b7f746f706963000000000000000000000000000000000000000000000000000000600082015250565b60006105d7600583610425565b91506105e2826105a1565b602082019050919050565b60006040820190506106026000830184610370565b8181036020830152610613816105ca565b90509291505056fea26469706673582212208743accab6cfcd1c8ccb3f51b787d679e803a77ce24ec642bd068883132fd5fa64736f6c63430008090033a264697066735822122066241fedca9ebd69f0cd9e4879f75428f5d4bf734eb072e52934a8b3161581f064736f6c63430008090033", + "nonce": 1, + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000003": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + } +} \ No newline at end of file diff --git a/test/historicstate/hardhat/scripts/geth_traces/Tracer.mint2.4byteTracer.json b/test/historicstate/hardhat/scripts/geth_traces/Tracer.mint2.4byteTracer.json new file mode 100644 index 000000000..7e9aa7cc4 --- /dev/null +++ b/test/historicstate/hardhat/scripts/geth_traces/Tracer.mint2.4byteTracer.json @@ -0,0 +1,4 @@ +{ + "0x3aa18088-32": 1, + "0xa0712d68-32": 1 +} \ No newline at end of file diff --git a/test/historicstate/hardhat/scripts/geth_traces/Tracer.mint2.callTracer.json b/test/historicstate/hardhat/scripts/geth_traces/Tracer.mint2.callTracer.json new file mode 100644 index 000000000..308ac8c7c --- /dev/null +++ b/test/historicstate/hardhat/scripts/geth_traces/Tracer.mint2.callTracer.json @@ -0,0 +1,32 @@ +{ + "from": "OWNER.address", + "gas": "0x200b20", + "gasUsed": "0x81bca", + "to": "Tracer.address", + "input": "0x3aa1808800000000000000000000000000000000000000000000000000000000000003e8", + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "calls": [ + { + "from": "Tracer.address", + "gas": "0x1eafbf", + "gasUsed": "0x60d0a", + "to": "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "input": "0x60806040526000600160006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b50600160009054906101000a900460ff161562000080576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200007790620002b5565b60405180910390fd5b60018060006101000a81548160ff021916908315150217905550620000bc701d6329f1c35ca4bfabb9f5610000000000620000c360201b60201c565b5062000482565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0836040516200010d919062000342565b60405180910390a281600080828254620001289190620003a3565b925050819055506200014e600183620001429190620003a3565b6200016960201b60201c565b506200015f620001df60201b60201c565b5060019050919050565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac083604051620001b3919062000450565b60405180910390a28160026000828254620001cf9190620003a3565b9250508190555060029050919050565b6000806040518060400160405280600d81526020017f48656c6c6f2c20776f726c6421000000000000000000000000000000000000008152509050600081805190602001209050809250505090565b600082825260208201905092915050565b7f436f6e747261637420696e7374616e63652068617320616c726561647920626560008201527f656e20696e697469616c697a6564000000000000000000000000000000000000602082015250565b60006200029d602e836200022e565b9150620002aa826200023f565b604082019050919050565b60006020820190508181036000830152620002d0816200028e565b9050919050565b6000819050919050565b620002ec81620002d7565b82525050565b7f746f706963000000000000000000000000000000000000000000000000000000600082015250565b60006200032a6005836200022e565b91506200033782620002f2565b602082019050919050565b6000604082019050620003596000830184620002e1565b81810360208301526200036c816200031b565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620003b082620002d7565b9150620003bd83620002d7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620003f557620003f462000374565b5b828201905092915050565b7f696e7465726e616c20746f706963000000000000000000000000000000000000600082015250565b600062000438600e836200022e565b9150620004458262000400565b602082019050919050565b6000604082019050620004676000830184620002e1565b81810360208301526200047a8162000429565b905092915050565b61065180620004926000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c80631c717069146100675780631c93908c1461008557806392954362146100b5578063a0712d68146100bf578063b69ef8a8146100ef578063c9353cb51461010d575b600080fd5b61006f610129565b60405161007c91906102ed565b60405180910390f35b61009f600480360381019061009a9190610343565b610178565b6040516100ac919061037f565b60405180910390f35b6100bd6101ea565b005b6100d960048036038101906100d49190610343565b610225565b6040516100e6919061037f565b60405180910390f35b6100f76102b5565b604051610104919061037f565b60405180910390f35b610127600480360381019061012291906103f8565b6102bb565b005b6000806040518060400160405280600d81526020017f48656c6c6f2c20776f726c6421000000000000000000000000000000000000008152509050600081805190602001209050809250505090565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0836040516101c09190610482565b60405180910390a281600260008282546101da91906104df565b9250508190555060029050919050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161021c90610581565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac08360405161026d91906105ed565b60405180910390a28160008082825461028691906104df565b925050819055506102a260018361029d91906104df565b610178565b506102ab610129565b5060019050919050565b60005481565b8073ffffffffffffffffffffffffffffffffffffffff16ff5b6000819050919050565b6102e7816102d4565b82525050565b600060208201905061030260008301846102de565b92915050565b600080fd5b6000819050919050565b6103208161030d565b811461032b57600080fd5b50565b60008135905061033d81610317565b92915050565b60006020828403121561035957610358610308565b5b60006103678482850161032e565b91505092915050565b6103798161030d565b82525050565b60006020820190506103946000830184610370565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103c58261039a565b9050919050565b6103d5816103ba565b81146103e057600080fd5b50565b6000813590506103f2816103cc565b92915050565b60006020828403121561040e5761040d610308565b5b600061041c848285016103e3565b91505092915050565b600082825260208201905092915050565b7f696e7465726e616c20746f706963000000000000000000000000000000000000600082015250565b600061046c600e83610425565b915061047782610436565b602082019050919050565b60006040820190506104976000830184610370565b81810360208301526104a88161045f565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006104ea8261030d565b91506104f58361030d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561052a576105296104b0565b5b828201905092915050565b7f546869732066756e6374696f6e20726576657274656421000000000000000000600082015250565b600061056b601783610425565b915061057682610535565b602082019050919050565b6000602082019050818103600083015261059a8161055e565b9050919050565b7f746f706963000000000000000000000000000000000000000000000000000000600082015250565b60006105d7600583610425565b91506105e2826105a1565b602082019050919050565b60006040820190506106026000830184610370565b8181036020830152610613816105ca565b90509291505056fea26469706673582212208743accab6cfcd1c8ccb3f51b787d679e803a77ce24ec642bd068883132fd5fa64736f6c63430008090033", + "output": "0x608060405234801561001057600080fd5b50600436106100625760003560e01c80631c717069146100675780631c93908c1461008557806392954362146100b5578063a0712d68146100bf578063b69ef8a8146100ef578063c9353cb51461010d575b600080fd5b61006f610129565b60405161007c91906102ed565b60405180910390f35b61009f600480360381019061009a9190610343565b610178565b6040516100ac919061037f565b60405180910390f35b6100bd6101ea565b005b6100d960048036038101906100d49190610343565b610225565b6040516100e6919061037f565b60405180910390f35b6100f76102b5565b604051610104919061037f565b60405180910390f35b610127600480360381019061012291906103f8565b6102bb565b005b6000806040518060400160405280600d81526020017f48656c6c6f2c20776f726c6421000000000000000000000000000000000000008152509050600081805190602001209050809250505090565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0836040516101c09190610482565b60405180910390a281600260008282546101da91906104df565b9250508190555060029050919050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161021c90610581565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac08360405161026d91906105ed565b60405180910390a28160008082825461028691906104df565b925050819055506102a260018361029d91906104df565b610178565b506102ab610129565b5060019050919050565b60005481565b8073ffffffffffffffffffffffffffffffffffffffff16ff5b6000819050919050565b6102e7816102d4565b82525050565b600060208201905061030260008301846102de565b92915050565b600080fd5b6000819050919050565b6103208161030d565b811461032b57600080fd5b50565b60008135905061033d81610317565b92915050565b60006020828403121561035957610358610308565b5b60006103678482850161032e565b91505092915050565b6103798161030d565b82525050565b60006020820190506103946000830184610370565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103c58261039a565b9050919050565b6103d5816103ba565b81146103e057600080fd5b50565b6000813590506103f2816103cc565b92915050565b60006020828403121561040e5761040d610308565b5b600061041c848285016103e3565b91505092915050565b600082825260208201905092915050565b7f696e7465726e616c20746f706963000000000000000000000000000000000000600082015250565b600061046c600e83610425565b915061047782610436565b602082019050919050565b60006040820190506104976000830184610370565b81810360208301526104a88161045f565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006104ea8261030d565b91506104f58361030d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561052a576105296104b0565b5b828201905092915050565b7f546869732066756e6374696f6e20726576657274656421000000000000000000600082015250565b600061056b601783610425565b915061057682610535565b602082019050919050565b6000602082019050818103600083015261059a8161055e565b9050919050565b7f746f706963000000000000000000000000000000000000000000000000000000600082015250565b60006105d7600583610425565b91506105e2826105a1565b602082019050919050565b60006040820190506106026000830184610370565b8181036020830152610613816105ca565b90509291505056fea26469706673582212208743accab6cfcd1c8ccb3f51b787d679e803a77ce24ec642bd068883132fd5fa64736f6c63430008090033", + "value": "0x0", + "type": "CREATE" + }, + { + "from": "Tracer.address", + "gas": "0x17ac60", + "gasUsed": "0x1b31", + "to": "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "input": "0xa0712d6800000000000000000000000000000000000000000000000000000000000003e8", + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "value": "0x0", + "type": "CALL" + } + ], + "value": "0x0", + "type": "CALL" +} \ No newline at end of file diff --git a/test/historicstate/hardhat/scripts/geth_traces/Tracer.mint2.defaultTracer.json b/test/historicstate/hardhat/scripts/geth_traces/Tracer.mint2.defaultTracer.json new file mode 100644 index 000000000..7b0e6791c --- /dev/null +++ b/test/historicstate/hardhat/scripts/geth_traces/Tracer.mint2.defaultTracer.json @@ -0,0 +1,43952 @@ +{ + "gas": 531402, + "failed": false, + "returnValue": "0000000000000000000000000000000000000000000000000000000000000001", + "structLogs": [ + { + "pc": 0, + "op": "PUSH1", + "gas": 2078784, + "gasCost": 3, + "depth": 1, + "stack": [] + }, + { + "pc": 2, + "op": "PUSH1", + "gas": 2078781, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x80" + ] + }, + { + "pc": 4, + "op": "MSTORE", + "gas": 2078778, + "gasCost": 12, + "depth": 1, + "stack": [ + "0x80", + "0x40" + ] + }, + { + "pc": 5, + "op": "CALLVALUE", + "gas": 2078766, + "gasCost": 2, + "depth": 1, + "stack": [] + }, + { + "pc": 6, + "op": "DUP1", + "gas": 2078764, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0" + ] + }, + { + "pc": 7, + "op": "ISZERO", + "gas": 2078761, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0", + "0x0" + ] + }, + { + "pc": 8, + "op": "PUSH3", + "gas": 2078758, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0", + "0x1" + ] + }, + { + "pc": 12, + "op": "JUMPI", + "gas": 2078755, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x0", + "0x1", + "0x11" + ] + }, + { + "pc": 17, + "op": "JUMPDEST", + "gas": 2078745, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x0" + ] + }, + { + "pc": 18, + "op": "POP", + "gas": 2078744, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x0" + ] + }, + { + "pc": 19, + "op": "PUSH1", + "gas": 2078742, + "gasCost": 3, + "depth": 1, + "stack": [] + }, + { + "pc": 21, + "op": "CALLDATASIZE", + "gas": 2078739, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x4" + ] + }, + { + "pc": 22, + "op": "LT", + "gas": 2078737, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x4", + "0x24" + ] + }, + { + "pc": 23, + "op": "PUSH3", + "gas": 2078734, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0" + ] + }, + { + "pc": 27, + "op": "JUMPI", + "gas": 2078731, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x0", + "0xac" + ] + }, + { + "pc": 28, + "op": "PUSH1", + "gas": 2078721, + "gasCost": 3, + "depth": 1, + "stack": [] + }, + { + "pc": 30, + "op": "CALLDATALOAD", + "gas": 2078718, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0" + ] + }, + { + "pc": 31, + "op": "PUSH1", + "gas": 2078715, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa1808800000000000000000000000000000000000000000000000000000000" + ] + }, + { + "pc": 33, + "op": "SHR", + "gas": 2078712, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa1808800000000000000000000000000000000000000000000000000000000", + "0xe0" + ] + }, + { + "pc": 34, + "op": "DUP1", + "gas": 2078709, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088" + ] + }, + { + "pc": 35, + "op": "PUSH4", + "gas": 2078706, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x3aa18088" + ] + }, + { + "pc": 40, + "op": "GT", + "gas": 2078703, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x3aa18088", + "0x8bfe44ff" + ] + }, + { + "pc": 41, + "op": "PUSH3", + "gas": 2078700, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x1" + ] + }, + { + "pc": 45, + "op": "JUMPI", + "gas": 2078697, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x1", + "0x6f" + ] + }, + { + "pc": 111, + "op": "JUMPDEST", + "gas": 2078687, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088" + ] + }, + { + "pc": 112, + "op": "DUP1", + "gas": 2078686, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088" + ] + }, + { + "pc": 113, + "op": "PUSH4", + "gas": 2078683, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x3aa18088" + ] + }, + { + "pc": 118, + "op": "EQ", + "gas": 2078680, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x3aa18088", + "0x12065fe0" + ] + }, + { + "pc": 119, + "op": "PUSH3", + "gas": 2078677, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x0" + ] + }, + { + "pc": 123, + "op": "JUMPI", + "gas": 2078674, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x0", + "0xb1" + ] + }, + { + "pc": 124, + "op": "DUP1", + "gas": 2078664, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088" + ] + }, + { + "pc": 125, + "op": "PUSH4", + "gas": 2078661, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x3aa18088" + ] + }, + { + "pc": 130, + "op": "EQ", + "gas": 2078658, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x3aa18088", + "0x1c717069" + ] + }, + { + "pc": 131, + "op": "PUSH3", + "gas": 2078655, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x0" + ] + }, + { + "pc": 135, + "op": "JUMPI", + "gas": 2078652, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x0", + "0xd3" + ] + }, + { + "pc": 136, + "op": "DUP1", + "gas": 2078642, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088" + ] + }, + { + "pc": 137, + "op": "PUSH4", + "gas": 2078639, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x3aa18088" + ] + }, + { + "pc": 142, + "op": "EQ", + "gas": 2078636, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x3aa18088", + "0x1c93908c" + ] + }, + { + "pc": 143, + "op": "PUSH3", + "gas": 2078633, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x0" + ] + }, + { + "pc": 147, + "op": "JUMPI", + "gas": 2078630, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x0", + "0xf5" + ] + }, + { + "pc": 148, + "op": "DUP1", + "gas": 2078620, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088" + ] + }, + { + "pc": 149, + "op": "PUSH4", + "gas": 2078617, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x3aa18088" + ] + }, + { + "pc": 154, + "op": "EQ", + "gas": 2078614, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x3aa18088", + "0x3aa18088" + ] + }, + { + "pc": 155, + "op": "PUSH3", + "gas": 2078611, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x1" + ] + }, + { + "pc": 159, + "op": "JUMPI", + "gas": 2078608, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x1", + "0x12b" + ] + }, + { + "pc": 299, + "op": "JUMPDEST", + "gas": 2078598, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088" + ] + }, + { + "pc": 300, + "op": "PUSH3", + "gas": 2078597, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088" + ] + }, + { + "pc": 304, + "op": "PUSH1", + "gas": 2078594, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149" + ] + }, + { + "pc": 306, + "op": "DUP1", + "gas": 2078591, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x4" + ] + }, + { + "pc": 307, + "op": "CALLDATASIZE", + "gas": 2078588, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x4", + "0x4" + ] + }, + { + "pc": 308, + "op": "SUB", + "gas": 2078586, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x4", + "0x4", + "0x24" + ] + }, + { + "pc": 309, + "op": "DUP2", + "gas": 2078583, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x4", + "0x20" + ] + }, + { + "pc": 310, + "op": "ADD", + "gas": 2078580, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x4", + "0x20", + "0x4" + ] + }, + { + "pc": 311, + "op": "SWAP1", + "gas": 2078577, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x4", + "0x24" + ] + }, + { + "pc": 312, + "op": "PUSH3", + "gas": 2078574, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x24", + "0x4" + ] + }, + { + "pc": 316, + "op": "SWAP2", + "gas": 2078571, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x24", + "0x4", + "0x143" + ] + }, + { + "pc": 317, + "op": "SWAP1", + "gas": 2078568, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x4", + "0x24" + ] + }, + { + "pc": 318, + "op": "PUSH3", + "gas": 2078565, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4" + ] + }, + { + "pc": 322, + "op": "JUMP", + "gas": 2078562, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0xa2c" + ] + }, + { + "pc": 2604, + "op": "JUMPDEST", + "gas": 2078554, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4" + ] + }, + { + "pc": 2605, + "op": "PUSH1", + "gas": 2078553, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4" + ] + }, + { + "pc": 2607, + "op": "PUSH1", + "gas": 2078550, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0" + ] + }, + { + "pc": 2609, + "op": "DUP3", + "gas": 2078547, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x20" + ] + }, + { + "pc": 2610, + "op": "DUP5", + "gas": 2078544, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x20", + "0x4" + ] + }, + { + "pc": 2611, + "op": "SUB", + "gas": 2078541, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x20", + "0x4", + "0x24" + ] + }, + { + "pc": 2612, + "op": "SLT", + "gas": 2078538, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x20", + "0x20" + ] + }, + { + "pc": 2613, + "op": "ISZERO", + "gas": 2078535, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0" + ] + }, + { + "pc": 2614, + "op": "PUSH3", + "gas": 2078532, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x1" + ] + }, + { + "pc": 2618, + "op": "JUMPI", + "gas": 2078529, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x1", + "0xa45" + ] + }, + { + "pc": 2629, + "op": "JUMPDEST", + "gas": 2078519, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0" + ] + }, + { + "pc": 2630, + "op": "PUSH1", + "gas": 2078518, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0" + ] + }, + { + "pc": 2632, + "op": "PUSH3", + "gas": 2078515, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0" + ] + }, + { + "pc": 2636, + "op": "DUP5", + "gas": 2078512, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55" + ] + }, + { + "pc": 2637, + "op": "DUP3", + "gas": 2078509, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24" + ] + }, + { + "pc": 2638, + "op": "DUP6", + "gas": 2078506, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x0" + ] + }, + { + "pc": 2639, + "op": "ADD", + "gas": 2078503, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x0", + "0x4" + ] + }, + { + "pc": 2640, + "op": "PUSH3", + "gas": 2078500, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4" + ] + }, + { + "pc": 2644, + "op": "JUMP", + "gas": 2078497, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0xa15" + ] + }, + { + "pc": 2581, + "op": "JUMPDEST", + "gas": 2078489, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4" + ] + }, + { + "pc": 2582, + "op": "PUSH1", + "gas": 2078488, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4" + ] + }, + { + "pc": 2584, + "op": "DUP2", + "gas": 2078485, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x0" + ] + }, + { + "pc": 2585, + "op": "CALLDATALOAD", + "gas": 2078482, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x0", + "0x4" + ] + }, + { + "pc": 2586, + "op": "SWAP1", + "gas": 2078479, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x0", + "0x3e8" + ] + }, + { + "pc": 2587, + "op": "POP", + "gas": 2078476, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2588, + "op": "PUSH3", + "gas": 2078474, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8" + ] + }, + { + "pc": 2592, + "op": "DUP2", + "gas": 2078471, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26" + ] + }, + { + "pc": 2593, + "op": "PUSH3", + "gas": 2078468, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8" + ] + }, + { + "pc": 2597, + "op": "JUMP", + "gas": 2078465, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0x9fb" + ] + }, + { + "pc": 2555, + "op": "JUMPDEST", + "gas": 2078457, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8" + ] + }, + { + "pc": 2556, + "op": "PUSH3", + "gas": 2078456, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8" + ] + }, + { + "pc": 2560, + "op": "DUP2", + "gas": 2078453, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0xa06" + ] + }, + { + "pc": 2561, + "op": "PUSH3", + "gas": 2078450, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0xa06", + "0x3e8" + ] + }, + { + "pc": 2565, + "op": "JUMP", + "gas": 2078447, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0xa06", + "0x3e8", + "0x97c" + ] + }, + { + "pc": 2428, + "op": "JUMPDEST", + "gas": 2078439, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0xa06", + "0x3e8" + ] + }, + { + "pc": 2429, + "op": "PUSH1", + "gas": 2078438, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0xa06", + "0x3e8" + ] + }, + { + "pc": 2431, + "op": "DUP2", + "gas": 2078435, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0xa06", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2432, + "op": "SWAP1", + "gas": 2078432, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0xa06", + "0x3e8", + "0x0", + "0x3e8" + ] + }, + { + "pc": 2433, + "op": "POP", + "gas": 2078429, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0xa06", + "0x3e8", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2434, + "op": "SWAP2", + "gas": 2078427, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0xa06", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 2435, + "op": "SWAP1", + "gas": 2078424, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0x3e8", + "0x3e8", + "0xa06" + ] + }, + { + "pc": 2436, + "op": "POP", + "gas": 2078421, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0x3e8", + "0xa06", + "0x3e8" + ] + }, + { + "pc": 2437, + "op": "JUMP", + "gas": 2078419, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0x3e8", + "0xa06" + ] + }, + { + "pc": 2566, + "op": "JUMPDEST", + "gas": 2078411, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 2567, + "op": "DUP2", + "gas": 2078410, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 2568, + "op": "EQ", + "gas": 2078407, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 2569, + "op": "PUSH3", + "gas": 2078404, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0x1" + ] + }, + { + "pc": 2573, + "op": "JUMPI", + "gas": 2078401, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0x1", + "0xa12" + ] + }, + { + "pc": 2578, + "op": "JUMPDEST", + "gas": 2078391, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8" + ] + }, + { + "pc": 2579, + "op": "POP", + "gas": 2078390, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8" + ] + }, + { + "pc": 2580, + "op": "JUMP", + "gas": 2078388, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26" + ] + }, + { + "pc": 2598, + "op": "JUMPDEST", + "gas": 2078380, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8" + ] + }, + { + "pc": 2599, + "op": "SWAP3", + "gas": 2078379, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8" + ] + }, + { + "pc": 2600, + "op": "SWAP2", + "gas": 2078376, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0x3e8", + "0x24", + "0x4", + "0xa55" + ] + }, + { + "pc": 2601, + "op": "POP", + "gas": 2078373, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0x3e8", + "0xa55", + "0x4", + "0x24" + ] + }, + { + "pc": 2602, + "op": "POP", + "gas": 2078371, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0x3e8", + "0xa55", + "0x4" + ] + }, + { + "pc": 2603, + "op": "JUMP", + "gas": 2078369, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0x3e8", + "0xa55" + ] + }, + { + "pc": 2645, + "op": "JUMPDEST", + "gas": 2078361, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0x3e8" + ] + }, + { + "pc": 2646, + "op": "SWAP2", + "gas": 2078360, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x0", + "0x0", + "0x3e8" + ] + }, + { + "pc": 2647, + "op": "POP", + "gas": 2078357, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x3e8", + "0x0", + "0x0" + ] + }, + { + "pc": 2648, + "op": "POP", + "gas": 2078355, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2649, + "op": "SWAP3", + "gas": 2078353, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x143", + "0x24", + "0x4", + "0x3e8" + ] + }, + { + "pc": 2650, + "op": "SWAP2", + "gas": 2078350, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x24", + "0x4", + "0x143" + ] + }, + { + "pc": 2651, + "op": "POP", + "gas": 2078347, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x143", + "0x4", + "0x24" + ] + }, + { + "pc": 2652, + "op": "POP", + "gas": 2078345, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x143", + "0x4" + ] + }, + { + "pc": 2653, + "op": "JUMP", + "gas": 2078343, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x143" + ] + }, + { + "pc": 323, + "op": "JUMPDEST", + "gas": 2078335, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8" + ] + }, + { + "pc": 324, + "op": "PUSH3", + "gas": 2078334, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8" + ] + }, + { + "pc": 328, + "op": "JUMP", + "gas": 2078331, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x2f6" + ] + }, + { + "pc": 758, + "op": "JUMPDEST", + "gas": 2078323, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8" + ] + }, + { + "pc": 759, + "op": "PUSH1", + "gas": 2078322, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8" + ] + }, + { + "pc": 761, + "op": "CALLER", + "gas": 2078319, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0" + ] + }, + { + "pc": 762, + "op": "PUSH20", + "gas": 2078317, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address" + ] + }, + { + "pc": 783, + "op": "AND", + "gas": 2078314, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xffffffffffffffffffffffffffffffffffffffff" + ] + }, + { + "pc": 784, + "op": "PUSH32", + "gas": 2078311, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address" + ] + }, + { + "pc": 817, + "op": "DUP4", + "gas": 2078308, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0" + ] + }, + { + "pc": 818, + "op": "PUSH1", + "gas": 2078305, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x3e8" + ] + }, + { + "pc": 820, + "op": "MLOAD", + "gas": 2078302, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x3e8", + "0x40" + ] + }, + { + "pc": 821, + "op": "PUSH3", + "gas": 2078299, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x3e8", + "0x80" + ] + }, + { + "pc": 825, + "op": "SWAP2", + "gas": 2078296, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x3e8", + "0x80", + "0x340" + ] + }, + { + "pc": 826, + "op": "SWAP1", + "gas": 2078293, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x80", + "0x3e8" + ] + }, + { + "pc": 827, + "op": "PUSH3", + "gas": 2078290, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80" + ] + }, + { + "pc": 831, + "op": "JUMP", + "gas": 2078287, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc64" + ] + }, + { + "pc": 3172, + "op": "JUMPDEST", + "gas": 2078279, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80" + ] + }, + { + "pc": 3173, + "op": "PUSH1", + "gas": 2078278, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80" + ] + }, + { + "pc": 3175, + "op": "PUSH1", + "gas": 2078275, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0x0" + ] + }, + { + "pc": 3177, + "op": "DUP3", + "gas": 2078272, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0x0", + "0x40" + ] + }, + { + "pc": 3178, + "op": "ADD", + "gas": 2078269, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0x0", + "0x40", + "0x80" + ] + }, + { + "pc": 3179, + "op": "SWAP1", + "gas": 2078266, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0x0", + "0xc0" + ] + }, + { + "pc": 3180, + "op": "POP", + "gas": 2078263, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0x0" + ] + }, + { + "pc": 3181, + "op": "PUSH3", + "gas": 2078261, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0" + ] + }, + { + "pc": 3185, + "op": "PUSH1", + "gas": 2078258, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc7b" + ] + }, + { + "pc": 3187, + "op": "DUP4", + "gas": 2078255, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x0" + ] + }, + { + "pc": 3188, + "op": "ADD", + "gas": 2078252, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x0", + "0x80" + ] + }, + { + "pc": 3189, + "op": "DUP5", + "gas": 2078249, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80" + ] + }, + { + "pc": 3190, + "op": "PUSH3", + "gas": 2078246, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8" + ] + }, + { + "pc": 3194, + "op": "JUMP", + "gas": 2078243, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8", + "0x986" + ] + }, + { + "pc": 2438, + "op": "JUMPDEST", + "gas": 2078235, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8" + ] + }, + { + "pc": 2439, + "op": "PUSH3", + "gas": 2078234, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8" + ] + }, + { + "pc": 2443, + "op": "DUP2", + "gas": 2078231, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8", + "0x991" + ] + }, + { + "pc": 2444, + "op": "PUSH3", + "gas": 2078228, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8", + "0x991", + "0x3e8" + ] + }, + { + "pc": 2448, + "op": "JUMP", + "gas": 2078225, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8", + "0x991", + "0x3e8", + "0x97c" + ] + }, + { + "pc": 2428, + "op": "JUMPDEST", + "gas": 2078217, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8", + "0x991", + "0x3e8" + ] + }, + { + "pc": 2429, + "op": "PUSH1", + "gas": 2078216, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8", + "0x991", + "0x3e8" + ] + }, + { + "pc": 2431, + "op": "DUP2", + "gas": 2078213, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8", + "0x991", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2432, + "op": "SWAP1", + "gas": 2078210, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8", + "0x991", + "0x3e8", + "0x0", + "0x3e8" + ] + }, + { + "pc": 2433, + "op": "POP", + "gas": 2078207, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8", + "0x991", + "0x3e8", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2434, + "op": "SWAP2", + "gas": 2078205, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8", + "0x991", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 2435, + "op": "SWAP1", + "gas": 2078202, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8", + "0x3e8", + "0x3e8", + "0x991" + ] + }, + { + "pc": 2436, + "op": "POP", + "gas": 2078199, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8", + "0x3e8", + "0x991", + "0x3e8" + ] + }, + { + "pc": 2437, + "op": "JUMP", + "gas": 2078197, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8", + "0x3e8", + "0x991" + ] + }, + { + "pc": 2449, + "op": "JUMPDEST", + "gas": 2078189, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 2450, + "op": "DUP3", + "gas": 2078188, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 2451, + "op": "MSTORE", + "gas": 2078185, + "gasCost": 9, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8", + "0x3e8", + "0x80" + ] + }, + { + "pc": 2452, + "op": "POP", + "gas": 2078176, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80", + "0x3e8" + ] + }, + { + "pc": 2453, + "op": "POP", + "gas": 2078174, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc7b", + "0x80" + ] + }, + { + "pc": 2454, + "op": "JUMP", + "gas": 2078172, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc7b" + ] + }, + { + "pc": 3195, + "op": "JUMPDEST", + "gas": 2078164, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0" + ] + }, + { + "pc": 3196, + "op": "DUP2", + "gas": 2078163, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0" + ] + }, + { + "pc": 3197, + "op": "DUP2", + "gas": 2078160, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0x80" + ] + }, + { + "pc": 3198, + "op": "SUB", + "gas": 2078157, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0x80", + "0xc0" + ] + }, + { + "pc": 3199, + "op": "PUSH1", + "gas": 2078154, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0x40" + ] + }, + { + "pc": 3201, + "op": "DUP4", + "gas": 2078151, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0x40", + "0x20" + ] + }, + { + "pc": 3202, + "op": "ADD", + "gas": 2078148, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0x40", + "0x20", + "0x80" + ] + }, + { + "pc": 3203, + "op": "MSTORE", + "gas": 2078145, + "gasCost": 6, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0x40", + "0xa0" + ] + }, + { + "pc": 3204, + "op": "PUSH3", + "gas": 2078139, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0" + ] + }, + { + "pc": 3208, + "op": "DUP2", + "gas": 2078136, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e" + ] + }, + { + "pc": 3209, + "op": "PUSH3", + "gas": 2078133, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0" + ] + }, + { + "pc": 3213, + "op": "JUMP", + "gas": 2078130, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0xc3d" + ] + }, + { + "pc": 3133, + "op": "JUMPDEST", + "gas": 2078122, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0" + ] + }, + { + "pc": 3134, + "op": "PUSH1", + "gas": 2078121, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0" + ] + }, + { + "pc": 3136, + "op": "PUSH3", + "gas": 2078118, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0" + ] + }, + { + "pc": 3140, + "op": "PUSH1", + "gas": 2078115, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xc4c" + ] + }, + { + "pc": 3142, + "op": "DUP4", + "gas": 2078112, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xc4c", + "0x5" + ] + }, + { + "pc": 3143, + "op": "PUSH3", + "gas": 2078109, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xc4c", + "0x5", + "0xc0" + ] + }, + { + "pc": 3147, + "op": "JUMP", + "gas": 2078106, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xc4c", + "0x5", + "0xc0", + "0xaf5" + ] + }, + { + "pc": 2805, + "op": "JUMPDEST", + "gas": 2078098, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xc4c", + "0x5", + "0xc0" + ] + }, + { + "pc": 2806, + "op": "PUSH1", + "gas": 2078097, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xc4c", + "0x5", + "0xc0" + ] + }, + { + "pc": 2808, + "op": "DUP3", + "gas": 2078094, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xc4c", + "0x5", + "0xc0", + "0x0" + ] + }, + { + "pc": 2809, + "op": "DUP3", + "gas": 2078091, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xc4c", + "0x5", + "0xc0", + "0x0", + "0x5" + ] + }, + { + "pc": 2810, + "op": "MSTORE", + "gas": 2078088, + "gasCost": 6, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xc4c", + "0x5", + "0xc0", + "0x0", + "0x5", + "0xc0" + ] + }, + { + "pc": 2811, + "op": "PUSH1", + "gas": 2078082, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xc4c", + "0x5", + "0xc0", + "0x0" + ] + }, + { + "pc": 2813, + "op": "DUP3", + "gas": 2078079, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xc4c", + "0x5", + "0xc0", + "0x0", + "0x20" + ] + }, + { + "pc": 2814, + "op": "ADD", + "gas": 2078076, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xc4c", + "0x5", + "0xc0", + "0x0", + "0x20", + "0xc0" + ] + }, + { + "pc": 2815, + "op": "SWAP1", + "gas": 2078073, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xc4c", + "0x5", + "0xc0", + "0x0", + "0xe0" + ] + }, + { + "pc": 2816, + "op": "POP", + "gas": 2078070, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xc4c", + "0x5", + "0xc0", + "0xe0", + "0x0" + ] + }, + { + "pc": 2817, + "op": "SWAP3", + "gas": 2078068, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xc4c", + "0x5", + "0xc0", + "0xe0" + ] + }, + { + "pc": 2818, + "op": "SWAP2", + "gas": 2078065, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xe0", + "0x5", + "0xc0", + "0xc4c" + ] + }, + { + "pc": 2819, + "op": "POP", + "gas": 2078062, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xe0", + "0xc4c", + "0xc0", + "0x5" + ] + }, + { + "pc": 2820, + "op": "POP", + "gas": 2078060, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xe0", + "0xc4c", + "0xc0" + ] + }, + { + "pc": 2821, + "op": "JUMP", + "gas": 2078058, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xe0", + "0xc4c" + ] + }, + { + "pc": 3148, + "op": "JUMPDEST", + "gas": 2078050, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xe0" + ] + }, + { + "pc": 3149, + "op": "SWAP2", + "gas": 2078049, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xc0", + "0x0", + "0xe0" + ] + }, + { + "pc": 3150, + "op": "POP", + "gas": 2078046, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0", + "0xc0" + ] + }, + { + "pc": 3151, + "op": "PUSH3", + "gas": 2078044, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0" + ] + }, + { + "pc": 3155, + "op": "DUP3", + "gas": 2078041, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0", + "0xc59" + ] + }, + { + "pc": 3156, + "op": "PUSH3", + "gas": 2078038, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0", + "0xc59", + "0xe0" + ] + }, + { + "pc": 3160, + "op": "JUMP", + "gas": 2078035, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0", + "0xc59", + "0xe0", + "0xc14" + ] + }, + { + "pc": 3092, + "op": "JUMPDEST", + "gas": 2078027, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0", + "0xc59", + "0xe0" + ] + }, + { + "pc": 3093, + "op": "PUSH32", + "gas": 2078026, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0", + "0xc59", + "0xe0" + ] + }, + { + "pc": 3126, + "op": "PUSH1", + "gas": 2078023, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0", + "0xc59", + "0xe0", + "0x746f706963000000000000000000000000000000000000000000000000000000" + ] + }, + { + "pc": 3128, + "op": "DUP3", + "gas": 2078020, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0", + "0xc59", + "0xe0", + "0x746f706963000000000000000000000000000000000000000000000000000000", + "0x0" + ] + }, + { + "pc": 3129, + "op": "ADD", + "gas": 2078017, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0", + "0xc59", + "0xe0", + "0x746f706963000000000000000000000000000000000000000000000000000000", + "0x0", + "0xe0" + ] + }, + { + "pc": 3130, + "op": "MSTORE", + "gas": 2078014, + "gasCost": 6, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0", + "0xc59", + "0xe0", + "0x746f706963000000000000000000000000000000000000000000000000000000", + "0xe0" + ] + }, + { + "pc": 3131, + "op": "POP", + "gas": 2078008, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0", + "0xc59", + "0xe0" + ] + }, + { + "pc": 3132, + "op": "JUMP", + "gas": 2078006, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0", + "0xc59" + ] + }, + { + "pc": 3161, + "op": "JUMPDEST", + "gas": 2077998, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0" + ] + }, + { + "pc": 3162, + "op": "PUSH1", + "gas": 2077997, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0" + ] + }, + { + "pc": 3164, + "op": "DUP3", + "gas": 2077994, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0", + "0x20" + ] + }, + { + "pc": 3165, + "op": "ADD", + "gas": 2077991, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0", + "0x20", + "0xe0" + ] + }, + { + "pc": 3166, + "op": "SWAP1", + "gas": 2077988, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x0", + "0x100" + ] + }, + { + "pc": 3167, + "op": "POP", + "gas": 2077985, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x100", + "0x0" + ] + }, + { + "pc": 3168, + "op": "SWAP2", + "gas": 2077983, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0xc8e", + "0xe0", + "0x100" + ] + }, + { + "pc": 3169, + "op": "SWAP1", + "gas": 2077980, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0x100", + "0xe0", + "0xc8e" + ] + }, + { + "pc": 3170, + "op": "POP", + "gas": 2077977, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0x100", + "0xc8e", + "0xe0" + ] + }, + { + "pc": 3171, + "op": "JUMP", + "gas": 2077975, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0x100", + "0xc8e" + ] + }, + { + "pc": 3214, + "op": "JUMPDEST", + "gas": 2077967, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0x100" + ] + }, + { + "pc": 3215, + "op": "SWAP1", + "gas": 2077966, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0xc0", + "0x100" + ] + }, + { + "pc": 3216, + "op": "POP", + "gas": 2077963, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0x100", + "0xc0" + ] + }, + { + "pc": 3217, + "op": "SWAP3", + "gas": 2077961, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x340", + "0x3e8", + "0x80", + "0x100" + ] + }, + { + "pc": 3218, + "op": "SWAP2", + "gas": 2077958, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x3e8", + "0x80", + "0x340" + ] + }, + { + "pc": 3219, + "op": "POP", + "gas": 2077955, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x340", + "0x80", + "0x3e8" + ] + }, + { + "pc": 3220, + "op": "POP", + "gas": 2077953, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x340", + "0x80" + ] + }, + { + "pc": 3221, + "op": "JUMP", + "gas": 2077951, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x340" + ] + }, + { + "pc": 832, + "op": "JUMPDEST", + "gas": 2077943, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100" + ] + }, + { + "pc": 833, + "op": "PUSH1", + "gas": 2077942, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100" + ] + }, + { + "pc": 835, + "op": "MLOAD", + "gas": 2077939, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x40" + ] + }, + { + "pc": 836, + "op": "DUP1", + "gas": 2077936, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x80" + ] + }, + { + "pc": 837, + "op": "SWAP2", + "gas": 2077933, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x80", + "0x80" + ] + }, + { + "pc": 838, + "op": "SUB", + "gas": 2077930, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x80", + "0x80", + "0x100" + ] + }, + { + "pc": 839, + "op": "SWAP1", + "gas": 2077927, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x80", + "0x80" + ] + }, + { + "pc": 840, + "op": "LOG2", + "gas": 2077924, + "gasCost": 2149, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x80", + "0x80" + ] + }, + { + "pc": 841, + "op": "PUSH1", + "gas": 2075775, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0" + ] + }, + { + "pc": 843, + "op": "MLOAD", + "gas": 2075772, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x40" + ] + }, + { + "pc": 844, + "op": "PUSH3", + "gas": 2075769, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x80" + ] + }, + { + "pc": 848, + "op": "SWAP1", + "gas": 2075766, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x80", + "0x356" + ] + }, + { + "pc": 849, + "op": "PUSH3", + "gas": 2075763, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x356", + "0x80" + ] + }, + { + "pc": 853, + "op": "JUMP", + "gas": 2075760, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x356", + "0x80", + "0x96e" + ] + }, + { + "pc": 2414, + "op": "JUMPDEST", + "gas": 2075752, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x356", + "0x80" + ] + }, + { + "pc": 2415, + "op": "PUSH2", + "gas": 2075751, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x356", + "0x80" + ] + }, + { + "pc": 2418, + "op": "DUP1", + "gas": 2075748, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x356", + "0x80", + "0xae3" + ] + }, + { + "pc": 2419, + "op": "PUSH3", + "gas": 2075745, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x356", + "0x80", + "0xae3", + "0xae3" + ] + }, + { + "pc": 2423, + "op": "DUP4", + "gas": 2075742, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x356", + "0x80", + "0xae3", + "0xae3", + "0x10c6" + ] + }, + { + "pc": 2424, + "op": "CODECOPY", + "gas": 2075739, + "gasCost": 535, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x356", + "0x80", + "0xae3", + "0xae3", + "0x10c6", + "0x80" + ] + }, + { + "pc": 2425, + "op": "ADD", + "gas": 2075204, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x356", + "0x80", + "0xae3" + ] + }, + { + "pc": 2426, + "op": "SWAP1", + "gas": 2075201, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x356", + "0xb63" + ] + }, + { + "pc": 2427, + "op": "JUMP", + "gas": 2075198, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0xb63", + "0x356" + ] + }, + { + "pc": 854, + "op": "JUMPDEST", + "gas": 2075190, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0xb63" + ] + }, + { + "pc": 855, + "op": "PUSH1", + "gas": 2075189, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0xb63" + ] + }, + { + "pc": 857, + "op": "MLOAD", + "gas": 2075186, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0xb63", + "0x40" + ] + }, + { + "pc": 858, + "op": "DUP1", + "gas": 2075183, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0xb63", + "0x80" + ] + }, + { + "pc": 859, + "op": "SWAP2", + "gas": 2075180, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0xb63", + "0x80", + "0x80" + ] + }, + { + "pc": 860, + "op": "SUB", + "gas": 2075177, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x80", + "0x80", + "0xb63" + ] + }, + { + "pc": 861, + "op": "SWAP1", + "gas": 2075174, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x80", + "0xae3" + ] + }, + { + "pc": 862, + "op": "PUSH1", + "gas": 2075171, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0xae3", + "0x80" + ] + }, + { + "pc": 864, + "op": "CREATE", + "gas": 2075168, + "gasCost": 32176, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0xae3", + "0x80", + "0x0" + ] + }, + { + "pc": 0, + "op": "PUSH1", + "gas": 2011071, + "gasCost": 3, + "depth": 2, + "stack": [] + }, + { + "pc": 2, + "op": "PUSH1", + "gas": 2011068, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x80" + ] + }, + { + "pc": 4, + "op": "MSTORE", + "gas": 2011065, + "gasCost": 12, + "depth": 2, + "stack": [ + "0x80", + "0x40" + ] + }, + { + "pc": 5, + "op": "PUSH1", + "gas": 2011053, + "gasCost": 3, + "depth": 2, + "stack": [] + }, + { + "pc": 7, + "op": "PUSH1", + "gas": 2011050, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0" + ] + }, + { + "pc": 9, + "op": "PUSH1", + "gas": 2011047, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0", + "0x1" + ] + }, + { + "pc": 11, + "op": "PUSH2", + "gas": 2011044, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0", + "0x1", + "0x0" + ] + }, + { + "pc": 14, + "op": "EXP", + "gas": 2011041, + "gasCost": 10, + "depth": 2, + "stack": [ + "0x0", + "0x1", + "0x0", + "0x100" + ] + }, + { + "pc": 15, + "op": "DUP2", + "gas": 2011031, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0", + "0x1", + "0x1" + ] + }, + { + "pc": 16, + "op": "SLOAD", + "gas": 2011028, + "gasCost": 2100, + "depth": 2, + "stack": [ + "0x0", + "0x1", + "0x1", + "0x1" + ], + "storage": { + "0000000000000000000000000000000000000000000000000000000000000001": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "pc": 17, + "op": "DUP2", + "gas": 2008928, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0", + "0x1", + "0x1", + "0x0" + ] + }, + { + "pc": 18, + "op": "PUSH1", + "gas": 2008925, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0", + "0x1", + "0x1", + "0x0", + "0x1" + ] + }, + { + "pc": 20, + "op": "MUL", + "gas": 2008922, + "gasCost": 5, + "depth": 2, + "stack": [ + "0x0", + "0x1", + "0x1", + "0x0", + "0x1", + "0xff" + ] + }, + { + "pc": 21, + "op": "NOT", + "gas": 2008917, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0", + "0x1", + "0x1", + "0x0", + "0xff" + ] + }, + { + "pc": 22, + "op": "AND", + "gas": 2008914, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0", + "0x1", + "0x1", + "0x0", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00" + ] + }, + { + "pc": 23, + "op": "SWAP1", + "gas": 2008911, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0", + "0x1", + "0x1", + "0x0" + ] + }, + { + "pc": 24, + "op": "DUP4", + "gas": 2008908, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0", + "0x1", + "0x0", + "0x1" + ] + }, + { + "pc": 25, + "op": "ISZERO", + "gas": 2008905, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0", + "0x1", + "0x0", + "0x1", + "0x0" + ] + }, + { + "pc": 26, + "op": "ISZERO", + "gas": 2008902, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0", + "0x1", + "0x0", + "0x1", + "0x1" + ] + }, + { + "pc": 27, + "op": "MUL", + "gas": 2008899, + "gasCost": 5, + "depth": 2, + "stack": [ + "0x0", + "0x1", + "0x0", + "0x1", + "0x0" + ] + }, + { + "pc": 28, + "op": "OR", + "gas": 2008894, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0", + "0x1", + "0x0", + "0x0" + ] + }, + { + "pc": 29, + "op": "SWAP1", + "gas": 2008891, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0", + "0x1", + "0x0" + ] + }, + { + "pc": 30, + "op": "SSTORE", + "gas": 2008888, + "gasCost": 100, + "depth": 2, + "stack": [ + "0x0", + "0x0", + "0x1" + ], + "storage": { + "0000000000000000000000000000000000000000000000000000000000000001": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "pc": 31, + "op": "POP", + "gas": 2008788, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x0" + ] + }, + { + "pc": 32, + "op": "CALLVALUE", + "gas": 2008786, + "gasCost": 2, + "depth": 2, + "stack": [] + }, + { + "pc": 33, + "op": "DUP1", + "gas": 2008784, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0" + ] + }, + { + "pc": 34, + "op": "ISZERO", + "gas": 2008781, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0", + "0x0" + ] + }, + { + "pc": 35, + "op": "PUSH3", + "gas": 2008778, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0", + "0x1" + ] + }, + { + "pc": 39, + "op": "JUMPI", + "gas": 2008775, + "gasCost": 10, + "depth": 2, + "stack": [ + "0x0", + "0x1", + "0x2c" + ] + }, + { + "pc": 44, + "op": "JUMPDEST", + "gas": 2008765, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x0" + ] + }, + { + "pc": 45, + "op": "POP", + "gas": 2008764, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x0" + ] + }, + { + "pc": 46, + "op": "PUSH1", + "gas": 2008762, + "gasCost": 3, + "depth": 2, + "stack": [] + }, + { + "pc": 48, + "op": "PUSH1", + "gas": 2008759, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x1" + ] + }, + { + "pc": 50, + "op": "SWAP1", + "gas": 2008756, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x1", + "0x0" + ] + }, + { + "pc": 51, + "op": "SLOAD", + "gas": 2008753, + "gasCost": 100, + "depth": 2, + "stack": [ + "0x0", + "0x1" + ], + "storage": { + "0000000000000000000000000000000000000000000000000000000000000001": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "pc": 52, + "op": "SWAP1", + "gas": 2008653, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0", + "0x0" + ] + }, + { + "pc": 53, + "op": "PUSH2", + "gas": 2008650, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0", + "0x0" + ] + }, + { + "pc": 56, + "op": "EXP", + "gas": 2008647, + "gasCost": 10, + "depth": 2, + "stack": [ + "0x0", + "0x0", + "0x100" + ] + }, + { + "pc": 57, + "op": "SWAP1", + "gas": 2008637, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0", + "0x1" + ] + }, + { + "pc": 58, + "op": "DIV", + "gas": 2008634, + "gasCost": 5, + "depth": 2, + "stack": [ + "0x1", + "0x0" + ] + }, + { + "pc": 59, + "op": "PUSH1", + "gas": 2008629, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0" + ] + }, + { + "pc": 61, + "op": "AND", + "gas": 2008626, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0", + "0xff" + ] + }, + { + "pc": 62, + "op": "ISZERO", + "gas": 2008623, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0" + ] + }, + { + "pc": 63, + "op": "PUSH3", + "gas": 2008620, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x1" + ] + }, + { + "pc": 67, + "op": "JUMPI", + "gas": 2008617, + "gasCost": 10, + "depth": 2, + "stack": [ + "0x1", + "0x80" + ] + }, + { + "pc": 128, + "op": "JUMPDEST", + "gas": 2008607, + "gasCost": 1, + "depth": 2, + "stack": [] + }, + { + "pc": 129, + "op": "PUSH1", + "gas": 2008606, + "gasCost": 3, + "depth": 2, + "stack": [] + }, + { + "pc": 131, + "op": "DUP1", + "gas": 2008603, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x1" + ] + }, + { + "pc": 132, + "op": "PUSH1", + "gas": 2008600, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x1", + "0x1" + ] + }, + { + "pc": 134, + "op": "PUSH2", + "gas": 2008597, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x1", + "0x1", + "0x0" + ] + }, + { + "pc": 137, + "op": "EXP", + "gas": 2008594, + "gasCost": 10, + "depth": 2, + "stack": [ + "0x1", + "0x1", + "0x0", + "0x100" + ] + }, + { + "pc": 138, + "op": "DUP2", + "gas": 2008584, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x1", + "0x1", + "0x1" + ] + }, + { + "pc": 139, + "op": "SLOAD", + "gas": 2008581, + "gasCost": 100, + "depth": 2, + "stack": [ + "0x1", + "0x1", + "0x1", + "0x1" + ], + "storage": { + "0000000000000000000000000000000000000000000000000000000000000001": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "pc": 140, + "op": "DUP2", + "gas": 2008481, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x1", + "0x1", + "0x1", + "0x0" + ] + }, + { + "pc": 141, + "op": "PUSH1", + "gas": 2008478, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x1", + "0x1", + "0x1", + "0x0", + "0x1" + ] + }, + { + "pc": 143, + "op": "MUL", + "gas": 2008475, + "gasCost": 5, + "depth": 2, + "stack": [ + "0x1", + "0x1", + "0x1", + "0x0", + "0x1", + "0xff" + ] + }, + { + "pc": 144, + "op": "NOT", + "gas": 2008470, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x1", + "0x1", + "0x1", + "0x0", + "0xff" + ] + }, + { + "pc": 145, + "op": "AND", + "gas": 2008467, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x1", + "0x1", + "0x1", + "0x0", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00" + ] + }, + { + "pc": 146, + "op": "SWAP1", + "gas": 2008464, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x1", + "0x1", + "0x1", + "0x0" + ] + }, + { + "pc": 147, + "op": "DUP4", + "gas": 2008461, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x1", + "0x1", + "0x0", + "0x1" + ] + }, + { + "pc": 148, + "op": "ISZERO", + "gas": 2008458, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x1", + "0x1", + "0x0", + "0x1", + "0x1" + ] + }, + { + "pc": 149, + "op": "ISZERO", + "gas": 2008455, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x1", + "0x1", + "0x0", + "0x1", + "0x0" + ] + }, + { + "pc": 150, + "op": "MUL", + "gas": 2008452, + "gasCost": 5, + "depth": 2, + "stack": [ + "0x1", + "0x1", + "0x0", + "0x1", + "0x1" + ] + }, + { + "pc": 151, + "op": "OR", + "gas": 2008447, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x1", + "0x1", + "0x0", + "0x1" + ] + }, + { + "pc": 152, + "op": "SWAP1", + "gas": 2008444, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x1", + "0x1", + "0x1" + ] + }, + { + "pc": 153, + "op": "SSTORE", + "gas": 2008441, + "gasCost": 20000, + "depth": 2, + "stack": [ + "0x1", + "0x1", + "0x1" + ], + "storage": { + "0000000000000000000000000000000000000000000000000000000000000001": "0000000000000000000000000000000000000000000000000000000000000001" + } + }, + { + "pc": 154, + "op": "POP", + "gas": 1988441, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x1" + ] + }, + { + "pc": 155, + "op": "PUSH3", + "gas": 1988439, + "gasCost": 3, + "depth": 2, + "stack": [] + }, + { + "pc": 159, + "op": "PUSH17", + "gas": 1988436, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc" + ] + }, + { + "pc": 177, + "op": "PUSH3", + "gas": 1988433, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 181, + "op": "PUSH1", + "gas": 1988430, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0xc3" + ] + }, + { + "pc": 183, + "op": "SHL", + "gas": 1988427, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0xc3", + "0x20" + ] + }, + { + "pc": 184, + "op": "PUSH1", + "gas": 1988424, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0xc300000000" + ] + }, + { + "pc": 186, + "op": "SHR", + "gas": 1988421, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0xc300000000", + "0x20" + ] + }, + { + "pc": 187, + "op": "JUMP", + "gas": 1988418, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0xc3" + ] + }, + { + "pc": 195, + "op": "JUMPDEST", + "gas": 1988410, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 196, + "op": "PUSH1", + "gas": 1988409, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 198, + "op": "CALLER", + "gas": 1988406, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0" + ] + }, + { + "pc": 199, + "op": "PUSH20", + "gas": 1988404, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address" + ] + }, + { + "pc": 220, + "op": "AND", + "gas": 1988401, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xffffffffffffffffffffffffffffffffffffffff" + ] + }, + { + "pc": 221, + "op": "PUSH32", + "gas": 1988398, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address" + ] + }, + { + "pc": 254, + "op": "DUP4", + "gas": 1988395, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0" + ] + }, + { + "pc": 255, + "op": "PUSH1", + "gas": 1988392, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 257, + "op": "MLOAD", + "gas": 1988389, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x40" + ] + }, + { + "pc": 258, + "op": "PUSH3", + "gas": 1988386, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80" + ] + }, + { + "pc": 262, + "op": "SWAP2", + "gas": 1988383, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0x10d" + ] + }, + { + "pc": 263, + "op": "SWAP1", + "gas": 1988380, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 264, + "op": "PUSH3", + "gas": 1988377, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80" + ] + }, + { + "pc": 268, + "op": "JUMP", + "gas": 1988374, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0x342" + ] + }, + { + "pc": 834, + "op": "JUMPDEST", + "gas": 1988366, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80" + ] + }, + { + "pc": 835, + "op": "PUSH1", + "gas": 1988365, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80" + ] + }, + { + "pc": 837, + "op": "PUSH1", + "gas": 1988362, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0x0" + ] + }, + { + "pc": 839, + "op": "DUP3", + "gas": 1988359, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0x0", + "0x40" + ] + }, + { + "pc": 840, + "op": "ADD", + "gas": 1988356, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0x0", + "0x40", + "0x80" + ] + }, + { + "pc": 841, + "op": "SWAP1", + "gas": 1988353, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0x0", + "0xc0" + ] + }, + { + "pc": 842, + "op": "POP", + "gas": 1988350, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x0" + ] + }, + { + "pc": 843, + "op": "PUSH3", + "gas": 1988348, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0" + ] + }, + { + "pc": 847, + "op": "PUSH1", + "gas": 1988345, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x359" + ] + }, + { + "pc": 849, + "op": "DUP4", + "gas": 1988342, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x359", + "0x0" + ] + }, + { + "pc": 850, + "op": "ADD", + "gas": 1988339, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x359", + "0x0", + "0x80" + ] + }, + { + "pc": 851, + "op": "DUP5", + "gas": 1988336, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x359", + "0x80" + ] + }, + { + "pc": 852, + "op": "PUSH3", + "gas": 1988333, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x359", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 856, + "op": "JUMP", + "gas": 1988330, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x359", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x2e1" + ] + }, + { + "pc": 737, + "op": "JUMPDEST", + "gas": 1988322, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x359", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 738, + "op": "PUSH3", + "gas": 1988321, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x359", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 742, + "op": "DUP2", + "gas": 1988318, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x359", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x2ec" + ] + }, + { + "pc": 743, + "op": "PUSH3", + "gas": 1988315, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x359", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x2ec", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 747, + "op": "JUMP", + "gas": 1988312, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x359", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x2ec", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x2d7" + ] + }, + { + "pc": 727, + "op": "JUMPDEST", + "gas": 1988304, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x359", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x2ec", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 728, + "op": "PUSH1", + "gas": 1988303, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x359", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x2ec", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 730, + "op": "DUP2", + "gas": 1988300, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x359", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x2ec", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0" + ] + }, + { + "pc": 731, + "op": "SWAP1", + "gas": 1988297, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x359", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x2ec", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 732, + "op": "POP", + "gas": 1988294, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x359", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x2ec", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0" + ] + }, + { + "pc": 733, + "op": "SWAP2", + "gas": 1988292, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x359", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x2ec", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 734, + "op": "SWAP1", + "gas": 1988289, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x359", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x2ec" + ] + }, + { + "pc": 735, + "op": "POP", + "gas": 1988286, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x359", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x2ec", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 736, + "op": "JUMP", + "gas": 1988284, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x359", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x2ec" + ] + }, + { + "pc": 748, + "op": "JUMPDEST", + "gas": 1988276, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x359", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 749, + "op": "DUP3", + "gas": 1988275, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x359", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 750, + "op": "MSTORE", + "gas": 1988272, + "gasCost": 9, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x359", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80" + ] + }, + { + "pc": 751, + "op": "POP", + "gas": 1988263, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x359", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 752, + "op": "POP", + "gas": 1988261, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x359", + "0x80" + ] + }, + { + "pc": 753, + "op": "JUMP", + "gas": 1988259, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x359" + ] + }, + { + "pc": 857, + "op": "JUMPDEST", + "gas": 1988251, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0" + ] + }, + { + "pc": 858, + "op": "DUP2", + "gas": 1988250, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0" + ] + }, + { + "pc": 859, + "op": "DUP2", + "gas": 1988247, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x80" + ] + }, + { + "pc": 860, + "op": "SUB", + "gas": 1988244, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x80", + "0xc0" + ] + }, + { + "pc": 861, + "op": "PUSH1", + "gas": 1988241, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x40" + ] + }, + { + "pc": 863, + "op": "DUP4", + "gas": 1988238, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x40", + "0x20" + ] + }, + { + "pc": 864, + "op": "ADD", + "gas": 1988235, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x40", + "0x20", + "0x80" + ] + }, + { + "pc": 865, + "op": "MSTORE", + "gas": 1988232, + "gasCost": 6, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x40", + "0xa0" + ] + }, + { + "pc": 866, + "op": "PUSH3", + "gas": 1988226, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0" + ] + }, + { + "pc": 870, + "op": "DUP2", + "gas": 1988223, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c" + ] + }, + { + "pc": 871, + "op": "PUSH3", + "gas": 1988220, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xc0" + ] + }, + { + "pc": 875, + "op": "JUMP", + "gas": 1988217, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xc0", + "0x31b" + ] + }, + { + "pc": 795, + "op": "JUMPDEST", + "gas": 1988209, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xc0" + ] + }, + { + "pc": 796, + "op": "PUSH1", + "gas": 1988208, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xc0" + ] + }, + { + "pc": 798, + "op": "PUSH3", + "gas": 1988205, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xc0", + "0x0" + ] + }, + { + "pc": 802, + "op": "PUSH1", + "gas": 1988202, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xc0", + "0x0", + "0x32a" + ] + }, + { + "pc": 804, + "op": "DUP4", + "gas": 1988199, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xc0", + "0x0", + "0x32a", + "0x5" + ] + }, + { + "pc": 805, + "op": "PUSH3", + "gas": 1988196, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xc0", + "0x0", + "0x32a", + "0x5", + "0xc0" + ] + }, + { + "pc": 809, + "op": "JUMP", + "gas": 1988193, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xc0", + "0x0", + "0x32a", + "0x5", + "0xc0", + "0x22e" + ] + }, + { + "pc": 558, + "op": "JUMPDEST", + "gas": 1988185, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xc0", + "0x0", + "0x32a", + "0x5", + "0xc0" + ] + }, + { + "pc": 559, + "op": "PUSH1", + "gas": 1988184, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xc0", + "0x0", + "0x32a", + "0x5", + "0xc0" + ] + }, + { + "pc": 561, + "op": "DUP3", + "gas": 1988181, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xc0", + "0x0", + "0x32a", + "0x5", + "0xc0", + "0x0" + ] + }, + { + "pc": 562, + "op": "DUP3", + "gas": 1988178, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xc0", + "0x0", + "0x32a", + "0x5", + "0xc0", + "0x0", + "0x5" + ] + }, + { + "pc": 563, + "op": "MSTORE", + "gas": 1988175, + "gasCost": 6, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xc0", + "0x0", + "0x32a", + "0x5", + "0xc0", + "0x0", + "0x5", + "0xc0" + ] + }, + { + "pc": 564, + "op": "PUSH1", + "gas": 1988169, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xc0", + "0x0", + "0x32a", + "0x5", + "0xc0", + "0x0" + ] + }, + { + "pc": 566, + "op": "DUP3", + "gas": 1988166, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xc0", + "0x0", + "0x32a", + "0x5", + "0xc0", + "0x0", + "0x20" + ] + }, + { + "pc": 567, + "op": "ADD", + "gas": 1988163, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xc0", + "0x0", + "0x32a", + "0x5", + "0xc0", + "0x0", + "0x20", + "0xc0" + ] + }, + { + "pc": 568, + "op": "SWAP1", + "gas": 1988160, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xc0", + "0x0", + "0x32a", + "0x5", + "0xc0", + "0x0", + "0xe0" + ] + }, + { + "pc": 569, + "op": "POP", + "gas": 1988157, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xc0", + "0x0", + "0x32a", + "0x5", + "0xc0", + "0xe0", + "0x0" + ] + }, + { + "pc": 570, + "op": "SWAP3", + "gas": 1988155, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xc0", + "0x0", + "0x32a", + "0x5", + "0xc0", + "0xe0" + ] + }, + { + "pc": 571, + "op": "SWAP2", + "gas": 1988152, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xc0", + "0x0", + "0xe0", + "0x5", + "0xc0", + "0x32a" + ] + }, + { + "pc": 572, + "op": "POP", + "gas": 1988149, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xc0", + "0x0", + "0xe0", + "0x32a", + "0xc0", + "0x5" + ] + }, + { + "pc": 573, + "op": "POP", + "gas": 1988147, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xc0", + "0x0", + "0xe0", + "0x32a", + "0xc0" + ] + }, + { + "pc": 574, + "op": "JUMP", + "gas": 1988145, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xc0", + "0x0", + "0xe0", + "0x32a" + ] + }, + { + "pc": 810, + "op": "JUMPDEST", + "gas": 1988137, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xc0", + "0x0", + "0xe0" + ] + }, + { + "pc": 811, + "op": "SWAP2", + "gas": 1988136, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xc0", + "0x0", + "0xe0" + ] + }, + { + "pc": 812, + "op": "POP", + "gas": 1988133, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xe0", + "0x0", + "0xc0" + ] + }, + { + "pc": 813, + "op": "PUSH3", + "gas": 1988131, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xe0", + "0x0" + ] + }, + { + "pc": 817, + "op": "DUP3", + "gas": 1988128, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xe0", + "0x0", + "0x337" + ] + }, + { + "pc": 818, + "op": "PUSH3", + "gas": 1988125, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xe0", + "0x0", + "0x337", + "0xe0" + ] + }, + { + "pc": 822, + "op": "JUMP", + "gas": 1988122, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xe0", + "0x0", + "0x337", + "0xe0", + "0x2f2" + ] + }, + { + "pc": 754, + "op": "JUMPDEST", + "gas": 1988114, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xe0", + "0x0", + "0x337", + "0xe0" + ] + }, + { + "pc": 755, + "op": "PUSH32", + "gas": 1988113, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xe0", + "0x0", + "0x337", + "0xe0" + ] + }, + { + "pc": 788, + "op": "PUSH1", + "gas": 1988110, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xe0", + "0x0", + "0x337", + "0xe0", + "0x746f706963000000000000000000000000000000000000000000000000000000" + ] + }, + { + "pc": 790, + "op": "DUP3", + "gas": 1988107, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xe0", + "0x0", + "0x337", + "0xe0", + "0x746f706963000000000000000000000000000000000000000000000000000000", + "0x0" + ] + }, + { + "pc": 791, + "op": "ADD", + "gas": 1988104, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xe0", + "0x0", + "0x337", + "0xe0", + "0x746f706963000000000000000000000000000000000000000000000000000000", + "0x0", + "0xe0" + ] + }, + { + "pc": 792, + "op": "MSTORE", + "gas": 1988101, + "gasCost": 6, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xe0", + "0x0", + "0x337", + "0xe0", + "0x746f706963000000000000000000000000000000000000000000000000000000", + "0xe0" + ] + }, + { + "pc": 793, + "op": "POP", + "gas": 1988095, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xe0", + "0x0", + "0x337", + "0xe0" + ] + }, + { + "pc": 794, + "op": "JUMP", + "gas": 1988093, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xe0", + "0x0", + "0x337" + ] + }, + { + "pc": 823, + "op": "JUMPDEST", + "gas": 1988085, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xe0", + "0x0" + ] + }, + { + "pc": 824, + "op": "PUSH1", + "gas": 1988084, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xe0", + "0x0" + ] + }, + { + "pc": 826, + "op": "DUP3", + "gas": 1988081, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xe0", + "0x0", + "0x20" + ] + }, + { + "pc": 827, + "op": "ADD", + "gas": 1988078, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xe0", + "0x0", + "0x20", + "0xe0" + ] + }, + { + "pc": 828, + "op": "SWAP1", + "gas": 1988075, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xe0", + "0x0", + "0x100" + ] + }, + { + "pc": 829, + "op": "POP", + "gas": 1988072, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xe0", + "0x100", + "0x0" + ] + }, + { + "pc": 830, + "op": "SWAP2", + "gas": 1988070, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x36c", + "0xe0", + "0x100" + ] + }, + { + "pc": 831, + "op": "SWAP1", + "gas": 1988067, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x100", + "0xe0", + "0x36c" + ] + }, + { + "pc": 832, + "op": "POP", + "gas": 1988064, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x100", + "0x36c", + "0xe0" + ] + }, + { + "pc": 833, + "op": "JUMP", + "gas": 1988062, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x100", + "0x36c" + ] + }, + { + "pc": 876, + "op": "JUMPDEST", + "gas": 1988054, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x100" + ] + }, + { + "pc": 877, + "op": "SWAP1", + "gas": 1988053, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0xc0", + "0x100" + ] + }, + { + "pc": 878, + "op": "POP", + "gas": 1988050, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0x100", + "0xc0" + ] + }, + { + "pc": 879, + "op": "SWAP3", + "gas": 1988048, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x10d", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0x100" + ] + }, + { + "pc": 880, + "op": "SWAP2", + "gas": 1988045, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x80", + "0x10d" + ] + }, + { + "pc": 881, + "op": "POP", + "gas": 1988042, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x10d", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 882, + "op": "POP", + "gas": 1988040, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x10d", + "0x80" + ] + }, + { + "pc": 883, + "op": "JUMP", + "gas": 1988038, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x10d" + ] + }, + { + "pc": 269, + "op": "JUMPDEST", + "gas": 1988030, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100" + ] + }, + { + "pc": 270, + "op": "PUSH1", + "gas": 1988029, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100" + ] + }, + { + "pc": 272, + "op": "MLOAD", + "gas": 1988026, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x40" + ] + }, + { + "pc": 273, + "op": "DUP1", + "gas": 1988023, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x80" + ] + }, + { + "pc": 274, + "op": "SWAP2", + "gas": 1988020, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x80", + "0x80" + ] + }, + { + "pc": 275, + "op": "SUB", + "gas": 1988017, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x80", + "0x80", + "0x100" + ] + }, + { + "pc": 276, + "op": "SWAP1", + "gas": 1988014, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x80", + "0x80" + ] + }, + { + "pc": 277, + "op": "LOG2", + "gas": 1988011, + "gasCost": 2149, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x80", + "0x80" + ] + }, + { + "pc": 278, + "op": "DUP2", + "gas": 1985862, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0" + ] + }, + { + "pc": 279, + "op": "PUSH1", + "gas": 1985859, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 281, + "op": "DUP1", + "gas": 1985856, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0" + ] + }, + { + "pc": 282, + "op": "DUP3", + "gas": 1985853, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0" + ] + }, + { + "pc": 283, + "op": "DUP3", + "gas": 1985850, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 284, + "op": "SLOAD", + "gas": 1985847, + "gasCost": 2100, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0" + ], + "storage": { + "0000000000000000000000000000000000000000000000000000000000000000": "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000001": "0000000000000000000000000000000000000000000000000000000000000001" + } + }, + { + "pc": 285, + "op": "PUSH3", + "gas": 1983747, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0" + ] + }, + { + "pc": 289, + "op": "SWAP2", + "gas": 1983744, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x128" + ] + }, + { + "pc": 290, + "op": "SWAP1", + "gas": 1983741, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 291, + "op": "PUSH3", + "gas": 1983738, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0" + ] + }, + { + "pc": 295, + "op": "JUMP", + "gas": 1983735, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x3a3" + ] + }, + { + "pc": 931, + "op": "JUMPDEST", + "gas": 1983727, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0" + ] + }, + { + "pc": 932, + "op": "PUSH1", + "gas": 1983726, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0" + ] + }, + { + "pc": 934, + "op": "PUSH3", + "gas": 1983723, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0" + ] + }, + { + "pc": 938, + "op": "DUP3", + "gas": 1983720, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x3b0" + ] + }, + { + "pc": 939, + "op": "PUSH3", + "gas": 1983717, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x3b0", + "0x0" + ] + }, + { + "pc": 943, + "op": "JUMP", + "gas": 1983714, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x3b0", + "0x0", + "0x2d7" + ] + }, + { + "pc": 727, + "op": "JUMPDEST", + "gas": 1983706, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x3b0", + "0x0" + ] + }, + { + "pc": 728, + "op": "PUSH1", + "gas": 1983705, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x3b0", + "0x0" + ] + }, + { + "pc": 730, + "op": "DUP2", + "gas": 1983702, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x3b0", + "0x0", + "0x0" + ] + }, + { + "pc": 731, + "op": "SWAP1", + "gas": 1983699, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x3b0", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 732, + "op": "POP", + "gas": 1983696, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x3b0", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 733, + "op": "SWAP2", + "gas": 1983694, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x3b0", + "0x0", + "0x0" + ] + }, + { + "pc": 734, + "op": "SWAP1", + "gas": 1983691, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x0", + "0x0", + "0x3b0" + ] + }, + { + "pc": 735, + "op": "POP", + "gas": 1983688, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x0", + "0x3b0", + "0x0" + ] + }, + { + "pc": 736, + "op": "JUMP", + "gas": 1983686, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x0", + "0x3b0" + ] + }, + { + "pc": 944, + "op": "JUMPDEST", + "gas": 1983678, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 945, + "op": "SWAP2", + "gas": 1983677, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 946, + "op": "POP", + "gas": 1983674, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 947, + "op": "PUSH3", + "gas": 1983672, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0" + ] + }, + { + "pc": 951, + "op": "DUP4", + "gas": 1983669, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x3bd" + ] + }, + { + "pc": 952, + "op": "PUSH3", + "gas": 1983666, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x3bd", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 956, + "op": "JUMP", + "gas": 1983663, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x3bd", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x2d7" + ] + }, + { + "pc": 727, + "op": "JUMPDEST", + "gas": 1983655, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x3bd", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 728, + "op": "PUSH1", + "gas": 1983654, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x3bd", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 730, + "op": "DUP2", + "gas": 1983651, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x3bd", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0" + ] + }, + { + "pc": 731, + "op": "SWAP1", + "gas": 1983648, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x3bd", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 732, + "op": "POP", + "gas": 1983645, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x3bd", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0" + ] + }, + { + "pc": 733, + "op": "SWAP2", + "gas": 1983643, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x3bd", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 734, + "op": "SWAP1", + "gas": 1983640, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x3bd" + ] + }, + { + "pc": 735, + "op": "POP", + "gas": 1983637, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x3bd", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 736, + "op": "JUMP", + "gas": 1983635, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x3bd" + ] + }, + { + "pc": 957, + "op": "JUMPDEST", + "gas": 1983627, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 958, + "op": "SWAP3", + "gas": 1983626, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 959, + "op": "POP", + "gas": 1983623, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 960, + "op": "DUP3", + "gas": 1983621, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0" + ] + }, + { + "pc": 961, + "op": "PUSH32", + "gas": 1983618, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 994, + "op": "SUB", + "gas": 1983615, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + ] + }, + { + "pc": 995, + "op": "DUP3", + "gas": 1983612, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0xffffffffffffffffffffffffffffffe29cd60e3ca35b4054460a9effffffffff" + ] + }, + { + "pc": 996, + "op": "GT", + "gas": 1983609, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0xffffffffffffffffffffffffffffffe29cd60e3ca35b4054460a9effffffffff", + "0x0" + ] + }, + { + "pc": 997, + "op": "ISZERO", + "gas": 1983606, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 998, + "op": "PUSH3", + "gas": 1983603, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x1" + ] + }, + { + "pc": 1002, + "op": "JUMPI", + "gas": 1983600, + "gasCost": 10, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x1", + "0x3f5" + ] + }, + { + "pc": 1013, + "op": "JUMPDEST", + "gas": 1983590, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0" + ] + }, + { + "pc": 1014, + "op": "DUP3", + "gas": 1983589, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0" + ] + }, + { + "pc": 1015, + "op": "DUP3", + "gas": 1983586, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 1016, + "op": "ADD", + "gas": 1983583, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0" + ] + }, + { + "pc": 1017, + "op": "SWAP1", + "gas": 1983580, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 1018, + "op": "POP", + "gas": 1983577, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0" + ] + }, + { + "pc": 1019, + "op": "SWAP3", + "gas": 1983575, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x128", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 1020, + "op": "SWAP2", + "gas": 1983572, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x128" + ] + }, + { + "pc": 1021, + "op": "POP", + "gas": 1983569, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x128", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 1022, + "op": "POP", + "gas": 1983567, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x128", + "0x0" + ] + }, + { + "pc": 1023, + "op": "JUMP", + "gas": 1983565, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x128" + ] + }, + { + "pc": 296, + "op": "JUMPDEST", + "gas": 1983557, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 297, + "op": "SWAP3", + "gas": 1983556, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 298, + "op": "POP", + "gas": 1983553, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 299, + "op": "POP", + "gas": 1983551, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0" + ] + }, + { + "pc": 300, + "op": "DUP2", + "gas": 1983549, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0" + ] + }, + { + "pc": 301, + "op": "SWAP1", + "gas": 1983546, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 302, + "op": "SSTORE", + "gas": 1983543, + "gasCost": 20000, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0" + ], + "storage": { + "0000000000000000000000000000000000000000000000000000000000000000": "0000000000000000000000000000001d6329f1c35ca4bfabb9f5610000000000", + "0000000000000000000000000000000000000000000000000000000000000001": "0000000000000000000000000000000000000000000000000000000000000001" + } + }, + { + "pc": 303, + "op": "POP", + "gas": 1963543, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 304, + "op": "PUSH3", + "gas": 1963541, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0" + ] + }, + { + "pc": 308, + "op": "PUSH1", + "gas": 1963538, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e" + ] + }, + { + "pc": 310, + "op": "DUP4", + "gas": 1963535, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1" + ] + }, + { + "pc": 311, + "op": "PUSH3", + "gas": 1963532, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 315, + "op": "SWAP2", + "gas": 1963529, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x142" + ] + }, + { + "pc": 316, + "op": "SWAP1", + "gas": 1963526, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x1" + ] + }, + { + "pc": 317, + "op": "PUSH3", + "gas": 1963523, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 321, + "op": "JUMP", + "gas": 1963520, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x3a3" + ] + }, + { + "pc": 931, + "op": "JUMPDEST", + "gas": 1963512, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 932, + "op": "PUSH1", + "gas": 1963511, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 934, + "op": "PUSH3", + "gas": 1963508, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0" + ] + }, + { + "pc": 938, + "op": "DUP3", + "gas": 1963505, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x3b0" + ] + }, + { + "pc": 939, + "op": "PUSH3", + "gas": 1963502, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x3b0", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 943, + "op": "JUMP", + "gas": 1963499, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x3b0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x2d7" + ] + }, + { + "pc": 727, + "op": "JUMPDEST", + "gas": 1963491, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x3b0", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 728, + "op": "PUSH1", + "gas": 1963490, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x3b0", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 730, + "op": "DUP2", + "gas": 1963487, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x3b0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0" + ] + }, + { + "pc": 731, + "op": "SWAP1", + "gas": 1963484, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x3b0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 732, + "op": "POP", + "gas": 1963481, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x3b0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0" + ] + }, + { + "pc": 733, + "op": "SWAP2", + "gas": 1963479, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x3b0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 734, + "op": "SWAP1", + "gas": 1963476, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x3b0" + ] + }, + { + "pc": 735, + "op": "POP", + "gas": 1963473, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x3b0", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 736, + "op": "JUMP", + "gas": 1963471, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x3b0" + ] + }, + { + "pc": 944, + "op": "JUMPDEST", + "gas": 1963463, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 945, + "op": "SWAP2", + "gas": 1963462, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 946, + "op": "POP", + "gas": 1963459, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 947, + "op": "PUSH3", + "gas": 1963457, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0" + ] + }, + { + "pc": 951, + "op": "DUP4", + "gas": 1963454, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x3bd" + ] + }, + { + "pc": 952, + "op": "PUSH3", + "gas": 1963451, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x3bd", + "0x1" + ] + }, + { + "pc": 956, + "op": "JUMP", + "gas": 1963448, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x3bd", + "0x1", + "0x2d7" + ] + }, + { + "pc": 727, + "op": "JUMPDEST", + "gas": 1963440, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x3bd", + "0x1" + ] + }, + { + "pc": 728, + "op": "PUSH1", + "gas": 1963439, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x3bd", + "0x1" + ] + }, + { + "pc": 730, + "op": "DUP2", + "gas": 1963436, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x3bd", + "0x1", + "0x0" + ] + }, + { + "pc": 731, + "op": "SWAP1", + "gas": 1963433, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x3bd", + "0x1", + "0x0", + "0x1" + ] + }, + { + "pc": 732, + "op": "POP", + "gas": 1963430, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x3bd", + "0x1", + "0x1", + "0x0" + ] + }, + { + "pc": 733, + "op": "SWAP2", + "gas": 1963428, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x3bd", + "0x1", + "0x1" + ] + }, + { + "pc": 734, + "op": "SWAP1", + "gas": 1963425, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1", + "0x1", + "0x3bd" + ] + }, + { + "pc": 735, + "op": "POP", + "gas": 1963422, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1", + "0x3bd", + "0x1" + ] + }, + { + "pc": 736, + "op": "JUMP", + "gas": 1963420, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1", + "0x3bd" + ] + }, + { + "pc": 957, + "op": "JUMPDEST", + "gas": 1963412, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1" + ] + }, + { + "pc": 958, + "op": "SWAP3", + "gas": 1963411, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1" + ] + }, + { + "pc": 959, + "op": "POP", + "gas": 1963408, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1" + ] + }, + { + "pc": 960, + "op": "DUP3", + "gas": 1963406, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0" + ] + }, + { + "pc": 961, + "op": "PUSH32", + "gas": 1963403, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1" + ] + }, + { + "pc": 994, + "op": "SUB", + "gas": 1963400, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + ] + }, + { + "pc": 995, + "op": "DUP3", + "gas": 1963397, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe" + ] + }, + { + "pc": 996, + "op": "GT", + "gas": 1963394, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 997, + "op": "ISZERO", + "gas": 1963391, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0" + ] + }, + { + "pc": 998, + "op": "PUSH3", + "gas": 1963388, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1" + ] + }, + { + "pc": 1002, + "op": "JUMPI", + "gas": 1963385, + "gasCost": 10, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1", + "0x3f5" + ] + }, + { + "pc": 1013, + "op": "JUMPDEST", + "gas": 1963375, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0" + ] + }, + { + "pc": 1014, + "op": "DUP3", + "gas": 1963374, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0" + ] + }, + { + "pc": 1015, + "op": "DUP3", + "gas": 1963371, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1" + ] + }, + { + "pc": 1016, + "op": "ADD", + "gas": 1963368, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 1017, + "op": "SWAP1", + "gas": 1963365, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 1018, + "op": "POP", + "gas": 1963362, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0" + ] + }, + { + "pc": 1019, + "op": "SWAP3", + "gas": 1963360, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x142", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 1020, + "op": "SWAP2", + "gas": 1963357, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x142" + ] + }, + { + "pc": 1021, + "op": "POP", + "gas": 1963354, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x142", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x1" + ] + }, + { + "pc": 1022, + "op": "POP", + "gas": 1963352, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x142", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 1023, + "op": "JUMP", + "gas": 1963350, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x142" + ] + }, + { + "pc": 322, + "op": "JUMPDEST", + "gas": 1963342, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 323, + "op": "PUSH3", + "gas": 1963341, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 327, + "op": "PUSH1", + "gas": 1963338, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x169" + ] + }, + { + "pc": 329, + "op": "SHL", + "gas": 1963335, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x169", + "0x20" + ] + }, + { + "pc": 330, + "op": "PUSH1", + "gas": 1963332, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x16900000000" + ] + }, + { + "pc": 332, + "op": "SHR", + "gas": 1963329, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x16900000000", + "0x20" + ] + }, + { + "pc": 333, + "op": "JUMP", + "gas": 1963326, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x169" + ] + }, + { + "pc": 361, + "op": "JUMPDEST", + "gas": 1963318, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 362, + "op": "PUSH1", + "gas": 1963317, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 364, + "op": "CALLER", + "gas": 1963314, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0" + ] + }, + { + "pc": 365, + "op": "PUSH20", + "gas": 1963312, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address" + ] + }, + { + "pc": 386, + "op": "AND", + "gas": 1963309, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xffffffffffffffffffffffffffffffffffffffff" + ] + }, + { + "pc": 387, + "op": "PUSH32", + "gas": 1963306, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address" + ] + }, + { + "pc": 420, + "op": "DUP4", + "gas": 1963303, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0" + ] + }, + { + "pc": 421, + "op": "PUSH1", + "gas": 1963300, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 423, + "op": "MLOAD", + "gas": 1963297, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x40" + ] + }, + { + "pc": 424, + "op": "PUSH3", + "gas": 1963294, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80" + ] + }, + { + "pc": 428, + "op": "SWAP2", + "gas": 1963291, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0x1b3" + ] + }, + { + "pc": 429, + "op": "SWAP1", + "gas": 1963288, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 430, + "op": "PUSH3", + "gas": 1963285, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80" + ] + }, + { + "pc": 434, + "op": "JUMP", + "gas": 1963282, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0x450" + ] + }, + { + "pc": 1104, + "op": "JUMPDEST", + "gas": 1963274, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80" + ] + }, + { + "pc": 1105, + "op": "PUSH1", + "gas": 1963273, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80" + ] + }, + { + "pc": 1107, + "op": "PUSH1", + "gas": 1963270, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0x0" + ] + }, + { + "pc": 1109, + "op": "DUP3", + "gas": 1963267, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0x0", + "0x40" + ] + }, + { + "pc": 1110, + "op": "ADD", + "gas": 1963264, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0x0", + "0x40", + "0x80" + ] + }, + { + "pc": 1111, + "op": "SWAP1", + "gas": 1963261, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0x0", + "0xc0" + ] + }, + { + "pc": 1112, + "op": "POP", + "gas": 1963258, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x0" + ] + }, + { + "pc": 1113, + "op": "PUSH3", + "gas": 1963256, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0" + ] + }, + { + "pc": 1117, + "op": "PUSH1", + "gas": 1963253, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x467" + ] + }, + { + "pc": 1119, + "op": "DUP4", + "gas": 1963250, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x467", + "0x0" + ] + }, + { + "pc": 1120, + "op": "ADD", + "gas": 1963247, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x467", + "0x0", + "0x80" + ] + }, + { + "pc": 1121, + "op": "DUP5", + "gas": 1963244, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x467", + "0x80" + ] + }, + { + "pc": 1122, + "op": "PUSH3", + "gas": 1963241, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x467", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 1126, + "op": "JUMP", + "gas": 1963238, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x467", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2e1" + ] + }, + { + "pc": 737, + "op": "JUMPDEST", + "gas": 1963230, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x467", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 738, + "op": "PUSH3", + "gas": 1963229, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x467", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 742, + "op": "DUP2", + "gas": 1963226, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x467", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2ec" + ] + }, + { + "pc": 743, + "op": "PUSH3", + "gas": 1963223, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x467", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2ec", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 747, + "op": "JUMP", + "gas": 1963220, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x467", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2ec", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2d7" + ] + }, + { + "pc": 727, + "op": "JUMPDEST", + "gas": 1963212, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x467", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2ec", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 728, + "op": "PUSH1", + "gas": 1963211, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x467", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2ec", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 730, + "op": "DUP2", + "gas": 1963208, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x467", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2ec", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0" + ] + }, + { + "pc": 731, + "op": "SWAP1", + "gas": 1963205, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x467", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2ec", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 732, + "op": "POP", + "gas": 1963202, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x467", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2ec", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0" + ] + }, + { + "pc": 733, + "op": "SWAP2", + "gas": 1963200, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x467", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2ec", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 734, + "op": "SWAP1", + "gas": 1963197, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x467", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2ec" + ] + }, + { + "pc": 735, + "op": "POP", + "gas": 1963194, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x467", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2ec", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 736, + "op": "JUMP", + "gas": 1963192, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x467", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2ec" + ] + }, + { + "pc": 748, + "op": "JUMPDEST", + "gas": 1963184, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x467", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 749, + "op": "DUP3", + "gas": 1963183, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x467", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 750, + "op": "MSTORE", + "gas": 1963180, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x467", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80" + ] + }, + { + "pc": 751, + "op": "POP", + "gas": 1963177, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x467", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 752, + "op": "POP", + "gas": 1963175, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x467", + "0x80" + ] + }, + { + "pc": 753, + "op": "JUMP", + "gas": 1963173, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x467" + ] + }, + { + "pc": 1127, + "op": "JUMPDEST", + "gas": 1963165, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0" + ] + }, + { + "pc": 1128, + "op": "DUP2", + "gas": 1963164, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0" + ] + }, + { + "pc": 1129, + "op": "DUP2", + "gas": 1963161, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x80" + ] + }, + { + "pc": 1130, + "op": "SUB", + "gas": 1963158, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x80", + "0xc0" + ] + }, + { + "pc": 1131, + "op": "PUSH1", + "gas": 1963155, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x40" + ] + }, + { + "pc": 1133, + "op": "DUP4", + "gas": 1963152, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x40", + "0x20" + ] + }, + { + "pc": 1134, + "op": "ADD", + "gas": 1963149, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x40", + "0x20", + "0x80" + ] + }, + { + "pc": 1135, + "op": "MSTORE", + "gas": 1963146, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x40", + "0xa0" + ] + }, + { + "pc": 1136, + "op": "PUSH3", + "gas": 1963143, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0" + ] + }, + { + "pc": 1140, + "op": "DUP2", + "gas": 1963140, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a" + ] + }, + { + "pc": 1141, + "op": "PUSH3", + "gas": 1963137, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xc0" + ] + }, + { + "pc": 1145, + "op": "JUMP", + "gas": 1963134, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xc0", + "0x429" + ] + }, + { + "pc": 1065, + "op": "JUMPDEST", + "gas": 1963126, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xc0" + ] + }, + { + "pc": 1066, + "op": "PUSH1", + "gas": 1963125, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xc0" + ] + }, + { + "pc": 1068, + "op": "PUSH3", + "gas": 1963122, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xc0", + "0x0" + ] + }, + { + "pc": 1072, + "op": "PUSH1", + "gas": 1963119, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xc0", + "0x0", + "0x438" + ] + }, + { + "pc": 1074, + "op": "DUP4", + "gas": 1963116, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xc0", + "0x0", + "0x438", + "0xe" + ] + }, + { + "pc": 1075, + "op": "PUSH3", + "gas": 1963113, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xc0", + "0x0", + "0x438", + "0xe", + "0xc0" + ] + }, + { + "pc": 1079, + "op": "JUMP", + "gas": 1963110, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xc0", + "0x0", + "0x438", + "0xe", + "0xc0", + "0x22e" + ] + }, + { + "pc": 558, + "op": "JUMPDEST", + "gas": 1963102, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xc0", + "0x0", + "0x438", + "0xe", + "0xc0" + ] + }, + { + "pc": 559, + "op": "PUSH1", + "gas": 1963101, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xc0", + "0x0", + "0x438", + "0xe", + "0xc0" + ] + }, + { + "pc": 561, + "op": "DUP3", + "gas": 1963098, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xc0", + "0x0", + "0x438", + "0xe", + "0xc0", + "0x0" + ] + }, + { + "pc": 562, + "op": "DUP3", + "gas": 1963095, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xc0", + "0x0", + "0x438", + "0xe", + "0xc0", + "0x0", + "0xe" + ] + }, + { + "pc": 563, + "op": "MSTORE", + "gas": 1963092, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xc0", + "0x0", + "0x438", + "0xe", + "0xc0", + "0x0", + "0xe", + "0xc0" + ] + }, + { + "pc": 564, + "op": "PUSH1", + "gas": 1963089, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xc0", + "0x0", + "0x438", + "0xe", + "0xc0", + "0x0" + ] + }, + { + "pc": 566, + "op": "DUP3", + "gas": 1963086, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xc0", + "0x0", + "0x438", + "0xe", + "0xc0", + "0x0", + "0x20" + ] + }, + { + "pc": 567, + "op": "ADD", + "gas": 1963083, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xc0", + "0x0", + "0x438", + "0xe", + "0xc0", + "0x0", + "0x20", + "0xc0" + ] + }, + { + "pc": 568, + "op": "SWAP1", + "gas": 1963080, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xc0", + "0x0", + "0x438", + "0xe", + "0xc0", + "0x0", + "0xe0" + ] + }, + { + "pc": 569, + "op": "POP", + "gas": 1963077, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xc0", + "0x0", + "0x438", + "0xe", + "0xc0", + "0xe0", + "0x0" + ] + }, + { + "pc": 570, + "op": "SWAP3", + "gas": 1963075, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xc0", + "0x0", + "0x438", + "0xe", + "0xc0", + "0xe0" + ] + }, + { + "pc": 571, + "op": "SWAP2", + "gas": 1963072, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xc0", + "0x0", + "0xe0", + "0xe", + "0xc0", + "0x438" + ] + }, + { + "pc": 572, + "op": "POP", + "gas": 1963069, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xc0", + "0x0", + "0xe0", + "0x438", + "0xc0", + "0xe" + ] + }, + { + "pc": 573, + "op": "POP", + "gas": 1963067, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xc0", + "0x0", + "0xe0", + "0x438", + "0xc0" + ] + }, + { + "pc": 574, + "op": "JUMP", + "gas": 1963065, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xc0", + "0x0", + "0xe0", + "0x438" + ] + }, + { + "pc": 1080, + "op": "JUMPDEST", + "gas": 1963057, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xc0", + "0x0", + "0xe0" + ] + }, + { + "pc": 1081, + "op": "SWAP2", + "gas": 1963056, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xc0", + "0x0", + "0xe0" + ] + }, + { + "pc": 1082, + "op": "POP", + "gas": 1963053, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xe0", + "0x0", + "0xc0" + ] + }, + { + "pc": 1083, + "op": "PUSH3", + "gas": 1963051, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xe0", + "0x0" + ] + }, + { + "pc": 1087, + "op": "DUP3", + "gas": 1963048, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xe0", + "0x0", + "0x445" + ] + }, + { + "pc": 1088, + "op": "PUSH3", + "gas": 1963045, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xe0", + "0x0", + "0x445", + "0xe0" + ] + }, + { + "pc": 1092, + "op": "JUMP", + "gas": 1963042, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xe0", + "0x0", + "0x445", + "0xe0", + "0x400" + ] + }, + { + "pc": 1024, + "op": "JUMPDEST", + "gas": 1963034, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xe0", + "0x0", + "0x445", + "0xe0" + ] + }, + { + "pc": 1025, + "op": "PUSH32", + "gas": 1963033, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xe0", + "0x0", + "0x445", + "0xe0" + ] + }, + { + "pc": 1058, + "op": "PUSH1", + "gas": 1963030, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xe0", + "0x0", + "0x445", + "0xe0", + "0x696e7465726e616c20746f706963000000000000000000000000000000000000" + ] + }, + { + "pc": 1060, + "op": "DUP3", + "gas": 1963027, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xe0", + "0x0", + "0x445", + "0xe0", + "0x696e7465726e616c20746f706963000000000000000000000000000000000000", + "0x0" + ] + }, + { + "pc": 1061, + "op": "ADD", + "gas": 1963024, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xe0", + "0x0", + "0x445", + "0xe0", + "0x696e7465726e616c20746f706963000000000000000000000000000000000000", + "0x0", + "0xe0" + ] + }, + { + "pc": 1062, + "op": "MSTORE", + "gas": 1963021, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xe0", + "0x0", + "0x445", + "0xe0", + "0x696e7465726e616c20746f706963000000000000000000000000000000000000", + "0xe0" + ] + }, + { + "pc": 1063, + "op": "POP", + "gas": 1963018, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xe0", + "0x0", + "0x445", + "0xe0" + ] + }, + { + "pc": 1064, + "op": "JUMP", + "gas": 1963016, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xe0", + "0x0", + "0x445" + ] + }, + { + "pc": 1093, + "op": "JUMPDEST", + "gas": 1963008, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xe0", + "0x0" + ] + }, + { + "pc": 1094, + "op": "PUSH1", + "gas": 1963007, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xe0", + "0x0" + ] + }, + { + "pc": 1096, + "op": "DUP3", + "gas": 1963004, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xe0", + "0x0", + "0x20" + ] + }, + { + "pc": 1097, + "op": "ADD", + "gas": 1963001, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xe0", + "0x0", + "0x20", + "0xe0" + ] + }, + { + "pc": 1098, + "op": "SWAP1", + "gas": 1962998, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xe0", + "0x0", + "0x100" + ] + }, + { + "pc": 1099, + "op": "POP", + "gas": 1962995, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xe0", + "0x100", + "0x0" + ] + }, + { + "pc": 1100, + "op": "SWAP2", + "gas": 1962993, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x47a", + "0xe0", + "0x100" + ] + }, + { + "pc": 1101, + "op": "SWAP1", + "gas": 1962990, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x100", + "0xe0", + "0x47a" + ] + }, + { + "pc": 1102, + "op": "POP", + "gas": 1962987, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x100", + "0x47a", + "0xe0" + ] + }, + { + "pc": 1103, + "op": "JUMP", + "gas": 1962985, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x100", + "0x47a" + ] + }, + { + "pc": 1146, + "op": "JUMPDEST", + "gas": 1962977, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x100" + ] + }, + { + "pc": 1147, + "op": "SWAP1", + "gas": 1962976, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0xc0", + "0x100" + ] + }, + { + "pc": 1148, + "op": "POP", + "gas": 1962973, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0x100", + "0xc0" + ] + }, + { + "pc": 1149, + "op": "SWAP3", + "gas": 1962971, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1b3", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0x100" + ] + }, + { + "pc": 1150, + "op": "SWAP2", + "gas": 1962968, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x80", + "0x1b3" + ] + }, + { + "pc": 1151, + "op": "POP", + "gas": 1962965, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x1b3", + "0x80", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 1152, + "op": "POP", + "gas": 1962963, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x1b3", + "0x80" + ] + }, + { + "pc": 1153, + "op": "JUMP", + "gas": 1962961, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x1b3" + ] + }, + { + "pc": 435, + "op": "JUMPDEST", + "gas": 1962953, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100" + ] + }, + { + "pc": 436, + "op": "PUSH1", + "gas": 1962952, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100" + ] + }, + { + "pc": 438, + "op": "MLOAD", + "gas": 1962949, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x40" + ] + }, + { + "pc": 439, + "op": "DUP1", + "gas": 1962946, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x80" + ] + }, + { + "pc": 440, + "op": "SWAP2", + "gas": 1962943, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x80", + "0x80" + ] + }, + { + "pc": 441, + "op": "SUB", + "gas": 1962940, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x80", + "0x80", + "0x100" + ] + }, + { + "pc": 442, + "op": "SWAP1", + "gas": 1962937, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x80", + "0x80" + ] + }, + { + "pc": 443, + "op": "LOG2", + "gas": 1962934, + "gasCost": 2149, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x80", + "0x80" + ] + }, + { + "pc": 444, + "op": "DUP2", + "gas": 1960785, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0" + ] + }, + { + "pc": 445, + "op": "PUSH1", + "gas": 1960782, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 447, + "op": "PUSH1", + "gas": 1960779, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2" + ] + }, + { + "pc": 449, + "op": "DUP3", + "gas": 1960776, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0" + ] + }, + { + "pc": 450, + "op": "DUP3", + "gas": 1960773, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 451, + "op": "SLOAD", + "gas": 1960770, + "gasCost": 2100, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2" + ], + "storage": { + "0000000000000000000000000000000000000000000000000000000000000000": "0000000000000000000000000000001d6329f1c35ca4bfabb9f5610000000000", + "0000000000000000000000000000000000000000000000000000000000000001": "0000000000000000000000000000000000000000000000000000000000000001", + "0000000000000000000000000000000000000000000000000000000000000002": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "pc": 452, + "op": "PUSH3", + "gas": 1958670, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0" + ] + }, + { + "pc": 456, + "op": "SWAP2", + "gas": 1958667, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1cf" + ] + }, + { + "pc": 457, + "op": "SWAP1", + "gas": 1958664, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 458, + "op": "PUSH3", + "gas": 1958661, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0" + ] + }, + { + "pc": 462, + "op": "JUMP", + "gas": 1958658, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x3a3" + ] + }, + { + "pc": 931, + "op": "JUMPDEST", + "gas": 1958650, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0" + ] + }, + { + "pc": 932, + "op": "PUSH1", + "gas": 1958649, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0" + ] + }, + { + "pc": 934, + "op": "PUSH3", + "gas": 1958646, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0" + ] + }, + { + "pc": 938, + "op": "DUP3", + "gas": 1958643, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x3b0" + ] + }, + { + "pc": 939, + "op": "PUSH3", + "gas": 1958640, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x3b0", + "0x0" + ] + }, + { + "pc": 943, + "op": "JUMP", + "gas": 1958637, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x3b0", + "0x0", + "0x2d7" + ] + }, + { + "pc": 727, + "op": "JUMPDEST", + "gas": 1958629, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x3b0", + "0x0" + ] + }, + { + "pc": 728, + "op": "PUSH1", + "gas": 1958628, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x3b0", + "0x0" + ] + }, + { + "pc": 730, + "op": "DUP2", + "gas": 1958625, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x3b0", + "0x0", + "0x0" + ] + }, + { + "pc": 731, + "op": "SWAP1", + "gas": 1958622, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x3b0", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 732, + "op": "POP", + "gas": 1958619, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x3b0", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 733, + "op": "SWAP2", + "gas": 1958617, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x3b0", + "0x0", + "0x0" + ] + }, + { + "pc": 734, + "op": "SWAP1", + "gas": 1958614, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x0", + "0x0", + "0x3b0" + ] + }, + { + "pc": 735, + "op": "POP", + "gas": 1958611, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x0", + "0x3b0", + "0x0" + ] + }, + { + "pc": 736, + "op": "JUMP", + "gas": 1958609, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x0", + "0x3b0" + ] + }, + { + "pc": 944, + "op": "JUMPDEST", + "gas": 1958601, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 945, + "op": "SWAP2", + "gas": 1958600, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 946, + "op": "POP", + "gas": 1958597, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 947, + "op": "PUSH3", + "gas": 1958595, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0" + ] + }, + { + "pc": 951, + "op": "DUP4", + "gas": 1958592, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x3bd" + ] + }, + { + "pc": 952, + "op": "PUSH3", + "gas": 1958589, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x3bd", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 956, + "op": "JUMP", + "gas": 1958586, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x3bd", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2d7" + ] + }, + { + "pc": 727, + "op": "JUMPDEST", + "gas": 1958578, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x3bd", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 728, + "op": "PUSH1", + "gas": 1958577, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x3bd", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 730, + "op": "DUP2", + "gas": 1958574, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x3bd", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0" + ] + }, + { + "pc": 731, + "op": "SWAP1", + "gas": 1958571, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x3bd", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 732, + "op": "POP", + "gas": 1958568, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x3bd", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0" + ] + }, + { + "pc": 733, + "op": "SWAP2", + "gas": 1958566, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x3bd", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 734, + "op": "SWAP1", + "gas": 1958563, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x3bd" + ] + }, + { + "pc": 735, + "op": "POP", + "gas": 1958560, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x3bd", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 736, + "op": "JUMP", + "gas": 1958558, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x3bd" + ] + }, + { + "pc": 957, + "op": "JUMPDEST", + "gas": 1958550, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 958, + "op": "SWAP3", + "gas": 1958549, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 959, + "op": "POP", + "gas": 1958546, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 960, + "op": "DUP3", + "gas": 1958544, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0" + ] + }, + { + "pc": 961, + "op": "PUSH32", + "gas": 1958541, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 994, + "op": "SUB", + "gas": 1958538, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + ] + }, + { + "pc": 995, + "op": "DUP3", + "gas": 1958535, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0xffffffffffffffffffffffffffffffe29cd60e3ca35b4054460a9efffffffffe" + ] + }, + { + "pc": 996, + "op": "GT", + "gas": 1958532, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0xffffffffffffffffffffffffffffffe29cd60e3ca35b4054460a9efffffffffe", + "0x0" + ] + }, + { + "pc": 997, + "op": "ISZERO", + "gas": 1958529, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 998, + "op": "PUSH3", + "gas": 1958526, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x1" + ] + }, + { + "pc": 1002, + "op": "JUMPI", + "gas": 1958523, + "gasCost": 10, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x1", + "0x3f5" + ] + }, + { + "pc": 1013, + "op": "JUMPDEST", + "gas": 1958513, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0" + ] + }, + { + "pc": 1014, + "op": "DUP3", + "gas": 1958512, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0" + ] + }, + { + "pc": 1015, + "op": "DUP3", + "gas": 1958509, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 1016, + "op": "ADD", + "gas": 1958506, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0" + ] + }, + { + "pc": 1017, + "op": "SWAP1", + "gas": 1958503, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 1018, + "op": "POP", + "gas": 1958500, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0" + ] + }, + { + "pc": 1019, + "op": "SWAP3", + "gas": 1958498, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1cf", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 1020, + "op": "SWAP2", + "gas": 1958495, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1cf" + ] + }, + { + "pc": 1021, + "op": "POP", + "gas": 1958492, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x1cf", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 1022, + "op": "POP", + "gas": 1958490, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x1cf", + "0x0" + ] + }, + { + "pc": 1023, + "op": "JUMP", + "gas": 1958488, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x1cf" + ] + }, + { + "pc": 463, + "op": "JUMPDEST", + "gas": 1958480, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 464, + "op": "SWAP3", + "gas": 1958479, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 465, + "op": "POP", + "gas": 1958476, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 466, + "op": "POP", + "gas": 1958474, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0" + ] + }, + { + "pc": 467, + "op": "DUP2", + "gas": 1958472, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2" + ] + }, + { + "pc": 468, + "op": "SWAP1", + "gas": 1958469, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 469, + "op": "SSTORE", + "gas": 1958466, + "gasCost": 20000, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2" + ], + "storage": { + "0000000000000000000000000000000000000000000000000000000000000000": "0000000000000000000000000000001d6329f1c35ca4bfabb9f5610000000000", + "0000000000000000000000000000000000000000000000000000000000000001": "0000000000000000000000000000000000000000000000000000000000000001", + "0000000000000000000000000000000000000000000000000000000000000002": "0000000000000000000000000000001d6329f1c35ca4bfabb9f5610000000001" + } + }, + { + "pc": 470, + "op": "POP", + "gas": 1938466, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 471, + "op": "PUSH1", + "gas": 1938464, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0" + ] + }, + { + "pc": 473, + "op": "SWAP1", + "gas": 1938461, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x2" + ] + }, + { + "pc": 474, + "op": "POP", + "gas": 1938458, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2", + "0x0" + ] + }, + { + "pc": 475, + "op": "SWAP2", + "gas": 1938456, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x2" + ] + }, + { + "pc": 476, + "op": "SWAP1", + "gas": 1938453, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x2", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x14e" + ] + }, + { + "pc": 477, + "op": "POP", + "gas": 1938450, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x2", + "0x14e", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 478, + "op": "JUMP", + "gas": 1938448, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x2", + "0x14e" + ] + }, + { + "pc": 334, + "op": "JUMPDEST", + "gas": 1938440, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x2" + ] + }, + { + "pc": 335, + "op": "POP", + "gas": 1938439, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x2" + ] + }, + { + "pc": 336, + "op": "PUSH3", + "gas": 1938437, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0" + ] + }, + { + "pc": 340, + "op": "PUSH3", + "gas": 1938434, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f" + ] + }, + { + "pc": 344, + "op": "PUSH1", + "gas": 1938431, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x1df" + ] + }, + { + "pc": 346, + "op": "SHL", + "gas": 1938428, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x1df", + "0x20" + ] + }, + { + "pc": 347, + "op": "PUSH1", + "gas": 1938425, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x1df00000000" + ] + }, + { + "pc": 349, + "op": "SHR", + "gas": 1938422, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x1df00000000", + "0x20" + ] + }, + { + "pc": 350, + "op": "JUMP", + "gas": 1938419, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x1df" + ] + }, + { + "pc": 479, + "op": "JUMPDEST", + "gas": 1938411, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f" + ] + }, + { + "pc": 480, + "op": "PUSH1", + "gas": 1938410, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f" + ] + }, + { + "pc": 482, + "op": "DUP1", + "gas": 1938407, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x0" + ] + }, + { + "pc": 483, + "op": "PUSH1", + "gas": 1938404, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x0", + "0x0" + ] + }, + { + "pc": 485, + "op": "MLOAD", + "gas": 1938401, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x0", + "0x0", + "0x40" + ] + }, + { + "pc": 486, + "op": "DUP1", + "gas": 1938398, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x0", + "0x0", + "0x80" + ] + }, + { + "pc": 487, + "op": "PUSH1", + "gas": 1938395, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x0", + "0x0", + "0x80", + "0x80" + ] + }, + { + "pc": 489, + "op": "ADD", + "gas": 1938392, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x0", + "0x0", + "0x80", + "0x80", + "0x40" + ] + }, + { + "pc": 490, + "op": "PUSH1", + "gas": 1938389, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x0", + "0x0", + "0x80", + "0xc0" + ] + }, + { + "pc": 492, + "op": "MSTORE", + "gas": 1938386, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x0", + "0x0", + "0x80", + "0xc0", + "0x40" + ] + }, + { + "pc": 493, + "op": "DUP1", + "gas": 1938383, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x0", + "0x0", + "0x80" + ] + }, + { + "pc": 494, + "op": "PUSH1", + "gas": 1938380, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x0", + "0x0", + "0x80", + "0x80" + ] + }, + { + "pc": 496, + "op": "DUP2", + "gas": 1938377, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x0", + "0x0", + "0x80", + "0x80", + "0xd" + ] + }, + { + "pc": 497, + "op": "MSTORE", + "gas": 1938374, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x0", + "0x0", + "0x80", + "0x80", + "0xd", + "0x80" + ] + }, + { + "pc": 498, + "op": "PUSH1", + "gas": 1938371, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x0", + "0x0", + "0x80", + "0x80" + ] + }, + { + "pc": 500, + "op": "ADD", + "gas": 1938368, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x0", + "0x0", + "0x80", + "0x80", + "0x20" + ] + }, + { + "pc": 501, + "op": "PUSH32", + "gas": 1938365, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x0", + "0x0", + "0x80", + "0xa0" + ] + }, + { + "pc": 534, + "op": "DUP2", + "gas": 1938362, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x0", + "0x0", + "0x80", + "0xa0", + "0x48656c6c6f2c20776f726c642100000000000000000000000000000000000000" + ] + }, + { + "pc": 535, + "op": "MSTORE", + "gas": 1938359, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x0", + "0x0", + "0x80", + "0xa0", + "0x48656c6c6f2c20776f726c642100000000000000000000000000000000000000", + "0xa0" + ] + }, + { + "pc": 536, + "op": "POP", + "gas": 1938356, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x0", + "0x0", + "0x80", + "0xa0" + ] + }, + { + "pc": 537, + "op": "SWAP1", + "gas": 1938354, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x0", + "0x0", + "0x80" + ] + }, + { + "pc": 538, + "op": "POP", + "gas": 1938351, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x0", + "0x80", + "0x0" + ] + }, + { + "pc": 539, + "op": "PUSH1", + "gas": 1938349, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x0", + "0x80" + ] + }, + { + "pc": 541, + "op": "DUP2", + "gas": 1938346, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x0", + "0x80", + "0x0" + ] + }, + { + "pc": 542, + "op": "DUP1", + "gas": 1938343, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x0", + "0x80", + "0x0", + "0x80" + ] + }, + { + "pc": 543, + "op": "MLOAD", + "gas": 1938340, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x0", + "0x80", + "0x0", + "0x80", + "0x80" + ] + }, + { + "pc": 544, + "op": "SWAP1", + "gas": 1938337, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x0", + "0x80", + "0x0", + "0x80", + "0xd" + ] + }, + { + "pc": 545, + "op": "PUSH1", + "gas": 1938334, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x0", + "0x80", + "0x0", + "0xd", + "0x80" + ] + }, + { + "pc": 547, + "op": "ADD", + "gas": 1938331, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x0", + "0x80", + "0x0", + "0xd", + "0x80", + "0x20" + ] + }, + { + "pc": 548, + "op": "KECCAK256", + "gas": 1938328, + "gasCost": 36, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x0", + "0x80", + "0x0", + "0xd", + "0xa0" + ] + }, + { + "pc": 549, + "op": "SWAP1", + "gas": 1938292, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x0", + "0x80", + "0x0", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4" + ] + }, + { + "pc": 550, + "op": "POP", + "gas": 1938289, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x0", + "0x80", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4", + "0x0" + ] + }, + { + "pc": 551, + "op": "DUP1", + "gas": 1938287, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x0", + "0x80", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4" + ] + }, + { + "pc": 552, + "op": "SWAP3", + "gas": 1938284, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0x0", + "0x80", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4" + ] + }, + { + "pc": 553, + "op": "POP", + "gas": 1938281, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4", + "0x80", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4", + "0x0" + ] + }, + { + "pc": 554, + "op": "POP", + "gas": 1938279, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4", + "0x80", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4" + ] + }, + { + "pc": 555, + "op": "POP", + "gas": 1938277, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4", + "0x80" + ] + }, + { + "pc": 556, + "op": "SWAP1", + "gas": 1938275, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x15f", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4" + ] + }, + { + "pc": 557, + "op": "JUMP", + "gas": 1938272, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4", + "0x15f" + ] + }, + { + "pc": 351, + "op": "JUMPDEST", + "gas": 1938264, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4" + ] + }, + { + "pc": 352, + "op": "POP", + "gas": 1938263, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4" + ] + }, + { + "pc": 353, + "op": "PUSH1", + "gas": 1938261, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0" + ] + }, + { + "pc": 355, + "op": "SWAP1", + "gas": 1938258, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1" + ] + }, + { + "pc": 356, + "op": "POP", + "gas": 1938255, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x1", + "0x0" + ] + }, + { + "pc": 357, + "op": "SWAP2", + "gas": 1938253, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x1" + ] + }, + { + "pc": 358, + "op": "SWAP1", + "gas": 1938250, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x1", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0xbc" + ] + }, + { + "pc": 359, + "op": "POP", + "gas": 1938247, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x1", + "0xbc", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 360, + "op": "JUMP", + "gas": 1938245, + "gasCost": 8, + "depth": 2, + "stack": [ + "0x1", + "0xbc" + ] + }, + { + "pc": 188, + "op": "JUMPDEST", + "gas": 1938237, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x1" + ] + }, + { + "pc": 189, + "op": "POP", + "gas": 1938236, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x1" + ] + }, + { + "pc": 190, + "op": "PUSH3", + "gas": 1938234, + "gasCost": 3, + "depth": 2, + "stack": [] + }, + { + "pc": 194, + "op": "JUMP", + "gas": 1938231, + "gasCost": 8, + "depth": 2, + "stack": [ + "0x482" + ] + }, + { + "pc": 1154, + "op": "JUMPDEST", + "gas": 1938223, + "gasCost": 1, + "depth": 2, + "stack": [] + }, + { + "pc": 1155, + "op": "PUSH2", + "gas": 1938222, + "gasCost": 3, + "depth": 2, + "stack": [] + }, + { + "pc": 1158, + "op": "DUP1", + "gas": 1938219, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x651" + ] + }, + { + "pc": 1159, + "op": "PUSH3", + "gas": 1938216, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x651", + "0x651" + ] + }, + { + "pc": 1163, + "op": "PUSH1", + "gas": 1938213, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x651", + "0x651", + "0x492" + ] + }, + { + "pc": 1165, + "op": "CODECOPY", + "gas": 1938210, + "gasCost": 290, + "depth": 2, + "stack": [ + "0x651", + "0x651", + "0x492", + "0x0" + ] + }, + { + "pc": 1166, + "op": "PUSH1", + "gas": 1937920, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x651" + ] + }, + { + "pc": 1168, + "op": "RETURN", + "gas": 1937917, + "gasCost": 0, + "depth": 2, + "stack": [ + "0x651", + "0x0" + ] + }, + { + "pc": 865, + "op": "DUP1", + "gas": 1646438, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae" + ] + }, + { + "pc": 866, + "op": "ISZERO", + "gas": 1646435, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae" + ] + }, + { + "pc": 867, + "op": "DUP1", + "gas": 1646432, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x0" + ] + }, + { + "pc": 868, + "op": "ISZERO", + "gas": 1646429, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x0", + "0x0" + ] + }, + { + "pc": 869, + "op": "PUSH3", + "gas": 1646426, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x0", + "0x1" + ] + }, + { + "pc": 873, + "op": "JUMPI", + "gas": 1646423, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x0", + "0x1", + "0x373" + ] + }, + { + "pc": 883, + "op": "JUMPDEST", + "gas": 1646413, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x0" + ] + }, + { + "pc": 884, + "op": "POP", + "gas": 1646412, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x0" + ] + }, + { + "pc": 885, + "op": "PUSH1", + "gas": 1646410, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae" + ] + }, + { + "pc": 887, + "op": "DUP1", + "gas": 1646407, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x0" + ] + }, + { + "pc": 888, + "op": "PUSH2", + "gas": 1646404, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x0", + "0x0" + ] + }, + { + "pc": 891, + "op": "EXP", + "gas": 1646401, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x0", + "0x0", + "0x100" + ] + }, + { + "pc": 892, + "op": "DUP2", + "gas": 1646391, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x0", + "0x1" + ] + }, + { + "pc": 893, + "op": "SLOAD", + "gas": 1646388, + "gasCost": 2100, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x0", + "0x1", + "0x0" + ], + "storage": { + "0000000000000000000000000000000000000000000000000000000000000000": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "pc": 894, + "op": "DUP2", + "gas": 1644288, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x0", + "0x1", + "0x0" + ] + }, + { + "pc": 895, + "op": "PUSH20", + "gas": 1644285, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x0", + "0x1", + "0x0", + "0x1" + ] + }, + { + "pc": 916, + "op": "MUL", + "gas": 1644282, + "gasCost": 5, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x0", + "0x1", + "0x0", + "0x1", + "0xffffffffffffffffffffffffffffffffffffffff" + ] + }, + { + "pc": 917, + "op": "NOT", + "gas": 1644277, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x0", + "0x1", + "0x0", + "0xffffffffffffffffffffffffffffffffffffffff" + ] + }, + { + "pc": 918, + "op": "AND", + "gas": 1644274, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x0", + "0x1", + "0x0", + "0xffffffffffffffffffffffff0000000000000000000000000000000000000000" + ] + }, + { + "pc": 919, + "op": "SWAP1", + "gas": 1644271, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x0", + "0x1", + "0x0" + ] + }, + { + "pc": 920, + "op": "DUP4", + "gas": 1644268, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x0", + "0x0", + "0x1" + ] + }, + { + "pc": 921, + "op": "PUSH20", + "gas": 1644265, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x0", + "0x0", + "0x1", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae" + ] + }, + { + "pc": 942, + "op": "AND", + "gas": 1644262, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x0", + "0x0", + "0x1", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xffffffffffffffffffffffffffffffffffffffff" + ] + }, + { + "pc": 943, + "op": "MUL", + "gas": 1644259, + "gasCost": 5, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x0", + "0x0", + "0x1", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae" + ] + }, + { + "pc": 944, + "op": "OR", + "gas": 1644254, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x0", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae" + ] + }, + { + "pc": 945, + "op": "SWAP1", + "gas": 1644251, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae" + ] + }, + { + "pc": 946, + "op": "SSTORE", + "gas": 1644248, + "gasCost": 20000, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x0" + ], + "storage": { + "0000000000000000000000000000000000000000000000000000000000000000": "00000000000000000000000061a286b8e87e2d31c475d71c85a0020584c44bae" + } + }, + { + "pc": 947, + "op": "POP", + "gas": 1624248, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae" + ] + }, + { + "pc": 948, + "op": "DUP2", + "gas": 1624246, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0" + ] + }, + { + "pc": 949, + "op": "PUSH1", + "gas": 1624243, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8" + ] + }, + { + "pc": 951, + "op": "PUSH1", + "gas": 1624240, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1" + ] + }, + { + "pc": 953, + "op": "DUP3", + "gas": 1624237, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0" + ] + }, + { + "pc": 954, + "op": "DUP3", + "gas": 1624234, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3e8" + ] + }, + { + "pc": 955, + "op": "SLOAD", + "gas": 1624231, + "gasCost": 2100, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3e8", + "0x1" + ], + "storage": { + "0000000000000000000000000000000000000000000000000000000000000000": "00000000000000000000000061a286b8e87e2d31c475d71c85a0020584c44bae", + "0000000000000000000000000000000000000000000000000000000000000001": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "pc": 956, + "op": "PUSH3", + "gas": 1622131, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3e8", + "0x0" + ] + }, + { + "pc": 960, + "op": "SWAP2", + "gas": 1622128, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3e8", + "0x0", + "0x3c7" + ] + }, + { + "pc": 961, + "op": "SWAP1", + "gas": 1622125, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x0", + "0x3e8" + ] + }, + { + "pc": 962, + "op": "PUSH3", + "gas": 1622122, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0" + ] + }, + { + "pc": 966, + "op": "JUMP", + "gas": 1622119, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0xbb7" + ] + }, + { + "pc": 2999, + "op": "JUMPDEST", + "gas": 1622111, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0" + ] + }, + { + "pc": 3000, + "op": "PUSH1", + "gas": 1622110, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0" + ] + }, + { + "pc": 3002, + "op": "PUSH3", + "gas": 1622107, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0" + ] + }, + { + "pc": 3006, + "op": "DUP3", + "gas": 1622104, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0xbc4" + ] + }, + { + "pc": 3007, + "op": "PUSH3", + "gas": 1622101, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0xbc4", + "0x0" + ] + }, + { + "pc": 3011, + "op": "JUMP", + "gas": 1622098, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0xbc4", + "0x0", + "0x97c" + ] + }, + { + "pc": 2428, + "op": "JUMPDEST", + "gas": 1622090, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0xbc4", + "0x0" + ] + }, + { + "pc": 2429, + "op": "PUSH1", + "gas": 1622089, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0xbc4", + "0x0" + ] + }, + { + "pc": 2431, + "op": "DUP2", + "gas": 1622086, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0xbc4", + "0x0", + "0x0" + ] + }, + { + "pc": 2432, + "op": "SWAP1", + "gas": 1622083, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0xbc4", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 2433, + "op": "POP", + "gas": 1622080, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0xbc4", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 2434, + "op": "SWAP2", + "gas": 1622078, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0xbc4", + "0x0", + "0x0" + ] + }, + { + "pc": 2435, + "op": "SWAP1", + "gas": 1622075, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0x0", + "0x0", + "0xbc4" + ] + }, + { + "pc": 2436, + "op": "POP", + "gas": 1622072, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0x0", + "0xbc4", + "0x0" + ] + }, + { + "pc": 2437, + "op": "JUMP", + "gas": 1622070, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0x0", + "0xbc4" + ] + }, + { + "pc": 3012, + "op": "JUMPDEST", + "gas": 1622062, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 3013, + "op": "SWAP2", + "gas": 1622061, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 3014, + "op": "POP", + "gas": 1622058, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 3015, + "op": "PUSH3", + "gas": 1622056, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0" + ] + }, + { + "pc": 3019, + "op": "DUP4", + "gas": 1622053, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0xbd1" + ] + }, + { + "pc": 3020, + "op": "PUSH3", + "gas": 1622050, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0xbd1", + "0x3e8" + ] + }, + { + "pc": 3024, + "op": "JUMP", + "gas": 1622047, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0xbd1", + "0x3e8", + "0x97c" + ] + }, + { + "pc": 2428, + "op": "JUMPDEST", + "gas": 1622039, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0xbd1", + "0x3e8" + ] + }, + { + "pc": 2429, + "op": "PUSH1", + "gas": 1622038, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0xbd1", + "0x3e8" + ] + }, + { + "pc": 2431, + "op": "DUP2", + "gas": 1622035, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0xbd1", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2432, + "op": "SWAP1", + "gas": 1622032, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0xbd1", + "0x3e8", + "0x0", + "0x3e8" + ] + }, + { + "pc": 2433, + "op": "POP", + "gas": 1622029, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0xbd1", + "0x3e8", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2434, + "op": "SWAP2", + "gas": 1622027, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0xbd1", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 2435, + "op": "SWAP1", + "gas": 1622024, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0x3e8", + "0x3e8", + "0xbd1" + ] + }, + { + "pc": 2436, + "op": "POP", + "gas": 1622021, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0x3e8", + "0xbd1", + "0x3e8" + ] + }, + { + "pc": 2437, + "op": "JUMP", + "gas": 1622019, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0x3e8", + "0xbd1" + ] + }, + { + "pc": 3025, + "op": "JUMPDEST", + "gas": 1622011, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0x3e8" + ] + }, + { + "pc": 3026, + "op": "SWAP3", + "gas": 1622010, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0x3e8" + ] + }, + { + "pc": 3027, + "op": "POP", + "gas": 1622007, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0x3e8" + ] + }, + { + "pc": 3028, + "op": "DUP3", + "gas": 1622005, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0" + ] + }, + { + "pc": 3029, + "op": "PUSH32", + "gas": 1622002, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0x3e8" + ] + }, + { + "pc": 3062, + "op": "SUB", + "gas": 1621999, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0x3e8", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + ] + }, + { + "pc": 3063, + "op": "DUP3", + "gas": 1621996, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc17" + ] + }, + { + "pc": 3064, + "op": "GT", + "gas": 1621993, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc17", + "0x0" + ] + }, + { + "pc": 3065, + "op": "ISZERO", + "gas": 1621990, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 3066, + "op": "PUSH3", + "gas": 1621987, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0x1" + ] + }, + { + "pc": 3070, + "op": "JUMPI", + "gas": 1621984, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0x1", + "0xc09" + ] + }, + { + "pc": 3081, + "op": "JUMPDEST", + "gas": 1621974, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0" + ] + }, + { + "pc": 3082, + "op": "DUP3", + "gas": 1621973, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0" + ] + }, + { + "pc": 3083, + "op": "DUP3", + "gas": 1621970, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0x3e8" + ] + }, + { + "pc": 3084, + "op": "ADD", + "gas": 1621967, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0x3e8", + "0x0" + ] + }, + { + "pc": 3085, + "op": "SWAP1", + "gas": 1621964, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x0", + "0x3e8" + ] + }, + { + "pc": 3086, + "op": "POP", + "gas": 1621961, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x3e8", + "0x0" + ] + }, + { + "pc": 3087, + "op": "SWAP3", + "gas": 1621959, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3c7", + "0x3e8", + "0x0", + "0x3e8" + ] + }, + { + "pc": 3088, + "op": "SWAP2", + "gas": 1621956, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3e8", + "0x3e8", + "0x0", + "0x3c7" + ] + }, + { + "pc": 3089, + "op": "POP", + "gas": 1621953, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3e8", + "0x3c7", + "0x0", + "0x3e8" + ] + }, + { + "pc": 3090, + "op": "POP", + "gas": 1621951, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3e8", + "0x3c7", + "0x0" + ] + }, + { + "pc": 3091, + "op": "JUMP", + "gas": 1621949, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3e8", + "0x3c7" + ] + }, + { + "pc": 967, + "op": "JUMPDEST", + "gas": 1621941, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3e8" + ] + }, + { + "pc": 968, + "op": "SWAP3", + "gas": 1621940, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3e8" + ] + }, + { + "pc": 969, + "op": "POP", + "gas": 1621937, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0", + "0x3e8" + ] + }, + { + "pc": 970, + "op": "POP", + "gas": 1621935, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x0" + ] + }, + { + "pc": 971, + "op": "DUP2", + "gas": 1621933, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1" + ] + }, + { + "pc": 972, + "op": "SWAP1", + "gas": 1621930, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x1", + "0x3e8" + ] + }, + { + "pc": 973, + "op": "SSTORE", + "gas": 1621927, + "gasCost": 20000, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8", + "0x3e8", + "0x1" + ], + "storage": { + "0000000000000000000000000000000000000000000000000000000000000000": "00000000000000000000000061a286b8e87e2d31c475d71c85a0020584c44bae", + "0000000000000000000000000000000000000000000000000000000000000001": "00000000000000000000000000000000000000000000000000000000000003e8" + } + }, + { + "pc": 974, + "op": "POP", + "gas": 1601927, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e8" + ] + }, + { + "pc": 975, + "op": "PUSH3", + "gas": 1601925, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0" + ] + }, + { + "pc": 979, + "op": "PUSH1", + "gas": 1601922, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7" + ] + }, + { + "pc": 981, + "op": "DUP4", + "gas": 1601919, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x1" + ] + }, + { + "pc": 982, + "op": "PUSH3", + "gas": 1601916, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x1", + "0x3e8" + ] + }, + { + "pc": 986, + "op": "SWAP2", + "gas": 1601913, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x1", + "0x3e8", + "0x3e1" + ] + }, + { + "pc": 987, + "op": "SWAP1", + "gas": 1601910, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x3e8", + "0x1" + ] + }, + { + "pc": 988, + "op": "PUSH3", + "gas": 1601907, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8" + ] + }, + { + "pc": 992, + "op": "JUMP", + "gas": 1601904, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0xbb7" + ] + }, + { + "pc": 2999, + "op": "JUMPDEST", + "gas": 1601896, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8" + ] + }, + { + "pc": 3000, + "op": "PUSH1", + "gas": 1601895, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8" + ] + }, + { + "pc": 3002, + "op": "PUSH3", + "gas": 1601892, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0" + ] + }, + { + "pc": 3006, + "op": "DUP3", + "gas": 1601889, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0xbc4" + ] + }, + { + "pc": 3007, + "op": "PUSH3", + "gas": 1601886, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0xbc4", + "0x3e8" + ] + }, + { + "pc": 3011, + "op": "JUMP", + "gas": 1601883, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0xbc4", + "0x3e8", + "0x97c" + ] + }, + { + "pc": 2428, + "op": "JUMPDEST", + "gas": 1601875, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0xbc4", + "0x3e8" + ] + }, + { + "pc": 2429, + "op": "PUSH1", + "gas": 1601874, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0xbc4", + "0x3e8" + ] + }, + { + "pc": 2431, + "op": "DUP2", + "gas": 1601871, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0xbc4", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2432, + "op": "SWAP1", + "gas": 1601868, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0xbc4", + "0x3e8", + "0x0", + "0x3e8" + ] + }, + { + "pc": 2433, + "op": "POP", + "gas": 1601865, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0xbc4", + "0x3e8", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2434, + "op": "SWAP2", + "gas": 1601863, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0xbc4", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 2435, + "op": "SWAP1", + "gas": 1601860, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0x3e8", + "0x3e8", + "0xbc4" + ] + }, + { + "pc": 2436, + "op": "POP", + "gas": 1601857, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0x3e8", + "0xbc4", + "0x3e8" + ] + }, + { + "pc": 2437, + "op": "JUMP", + "gas": 1601855, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0x3e8", + "0xbc4" + ] + }, + { + "pc": 3012, + "op": "JUMPDEST", + "gas": 1601847, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0x3e8" + ] + }, + { + "pc": 3013, + "op": "SWAP2", + "gas": 1601846, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0x3e8" + ] + }, + { + "pc": 3014, + "op": "POP", + "gas": 1601843, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0x3e8" + ] + }, + { + "pc": 3015, + "op": "PUSH3", + "gas": 1601841, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0" + ] + }, + { + "pc": 3019, + "op": "DUP4", + "gas": 1601838, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0xbd1" + ] + }, + { + "pc": 3020, + "op": "PUSH3", + "gas": 1601835, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0xbd1", + "0x1" + ] + }, + { + "pc": 3024, + "op": "JUMP", + "gas": 1601832, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0xbd1", + "0x1", + "0x97c" + ] + }, + { + "pc": 2428, + "op": "JUMPDEST", + "gas": 1601824, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0xbd1", + "0x1" + ] + }, + { + "pc": 2429, + "op": "PUSH1", + "gas": 1601823, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0xbd1", + "0x1" + ] + }, + { + "pc": 2431, + "op": "DUP2", + "gas": 1601820, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0xbd1", + "0x1", + "0x0" + ] + }, + { + "pc": 2432, + "op": "SWAP1", + "gas": 1601817, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0xbd1", + "0x1", + "0x0", + "0x1" + ] + }, + { + "pc": 2433, + "op": "POP", + "gas": 1601814, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0xbd1", + "0x1", + "0x1", + "0x0" + ] + }, + { + "pc": 2434, + "op": "SWAP2", + "gas": 1601812, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0xbd1", + "0x1", + "0x1" + ] + }, + { + "pc": 2435, + "op": "SWAP1", + "gas": 1601809, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0x1", + "0x1", + "0xbd1" + ] + }, + { + "pc": 2436, + "op": "POP", + "gas": 1601806, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0x1", + "0xbd1", + "0x1" + ] + }, + { + "pc": 2437, + "op": "JUMP", + "gas": 1601804, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0x1", + "0xbd1" + ] + }, + { + "pc": 3025, + "op": "JUMPDEST", + "gas": 1601796, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0x1" + ] + }, + { + "pc": 3026, + "op": "SWAP3", + "gas": 1601795, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0x1" + ] + }, + { + "pc": 3027, + "op": "POP", + "gas": 1601792, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0x1" + ] + }, + { + "pc": 3028, + "op": "DUP3", + "gas": 1601790, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0" + ] + }, + { + "pc": 3029, + "op": "PUSH32", + "gas": 1601787, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0x1" + ] + }, + { + "pc": 3062, + "op": "SUB", + "gas": 1601784, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0x1", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + ] + }, + { + "pc": 3063, + "op": "DUP3", + "gas": 1601781, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe" + ] + }, + { + "pc": 3064, + "op": "GT", + "gas": 1601778, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe", + "0x3e8" + ] + }, + { + "pc": 3065, + "op": "ISZERO", + "gas": 1601775, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0x0" + ] + }, + { + "pc": 3066, + "op": "PUSH3", + "gas": 1601772, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0x1" + ] + }, + { + "pc": 3070, + "op": "JUMPI", + "gas": 1601769, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0x1", + "0xc09" + ] + }, + { + "pc": 3081, + "op": "JUMPDEST", + "gas": 1601759, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0" + ] + }, + { + "pc": 3082, + "op": "DUP3", + "gas": 1601758, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0" + ] + }, + { + "pc": 3083, + "op": "DUP3", + "gas": 1601755, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0x1" + ] + }, + { + "pc": 3084, + "op": "ADD", + "gas": 1601752, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0x1", + "0x3e8" + ] + }, + { + "pc": 3085, + "op": "SWAP1", + "gas": 1601749, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x0", + "0x3e9" + ] + }, + { + "pc": 3086, + "op": "POP", + "gas": 1601746, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x3e9", + "0x0" + ] + }, + { + "pc": 3087, + "op": "SWAP3", + "gas": 1601744, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e1", + "0x1", + "0x3e8", + "0x3e9" + ] + }, + { + "pc": 3088, + "op": "SWAP2", + "gas": 1601741, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x1", + "0x3e8", + "0x3e1" + ] + }, + { + "pc": 3089, + "op": "POP", + "gas": 1601738, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x3e1", + "0x3e8", + "0x1" + ] + }, + { + "pc": 3090, + "op": "POP", + "gas": 1601736, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x3e1", + "0x3e8" + ] + }, + { + "pc": 3091, + "op": "JUMP", + "gas": 1601734, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x3e1" + ] + }, + { + "pc": 993, + "op": "JUMPDEST", + "gas": 1601726, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9" + ] + }, + { + "pc": 994, + "op": "PUSH3", + "gas": 1601725, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9" + ] + }, + { + "pc": 998, + "op": "JUMP", + "gas": 1601722, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x280" + ] + }, + { + "pc": 640, + "op": "JUMPDEST", + "gas": 1601714, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9" + ] + }, + { + "pc": 641, + "op": "PUSH1", + "gas": 1601713, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9" + ] + }, + { + "pc": 643, + "op": "CALLER", + "gas": 1601710, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0" + ] + }, + { + "pc": 644, + "op": "PUSH20", + "gas": 1601708, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address" + ] + }, + { + "pc": 665, + "op": "AND", + "gas": 1601705, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xffffffffffffffffffffffffffffffffffffffff" + ] + }, + { + "pc": 666, + "op": "PUSH32", + "gas": 1601702, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address" + ] + }, + { + "pc": 699, + "op": "DUP4", + "gas": 1601699, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0" + ] + }, + { + "pc": 700, + "op": "PUSH1", + "gas": 1601696, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x3e9" + ] + }, + { + "pc": 702, + "op": "MLOAD", + "gas": 1601693, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x3e9", + "0x40" + ] + }, + { + "pc": 703, + "op": "PUSH3", + "gas": 1601690, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x3e9", + "0x80" + ] + }, + { + "pc": 707, + "op": "SWAP2", + "gas": 1601687, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x3e9", + "0x80", + "0x2ca" + ] + }, + { + "pc": 708, + "op": "SWAP1", + "gas": 1601684, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x80", + "0x3e9" + ] + }, + { + "pc": 709, + "op": "PUSH3", + "gas": 1601681, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80" + ] + }, + { + "pc": 713, + "op": "JUMP", + "gas": 1601678, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xb56" + ] + }, + { + "pc": 2902, + "op": "JUMPDEST", + "gas": 1601670, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80" + ] + }, + { + "pc": 2903, + "op": "PUSH1", + "gas": 1601669, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80" + ] + }, + { + "pc": 2905, + "op": "PUSH1", + "gas": 1601666, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0x0" + ] + }, + { + "pc": 2907, + "op": "DUP3", + "gas": 1601663, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0x0", + "0x40" + ] + }, + { + "pc": 2908, + "op": "ADD", + "gas": 1601660, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0x0", + "0x40", + "0x80" + ] + }, + { + "pc": 2909, + "op": "SWAP1", + "gas": 1601657, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0x0", + "0xc0" + ] + }, + { + "pc": 2910, + "op": "POP", + "gas": 1601654, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0x0" + ] + }, + { + "pc": 2911, + "op": "PUSH3", + "gas": 1601652, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0" + ] + }, + { + "pc": 2915, + "op": "PUSH1", + "gas": 1601649, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d" + ] + }, + { + "pc": 2917, + "op": "DUP4", + "gas": 1601646, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x0" + ] + }, + { + "pc": 2918, + "op": "ADD", + "gas": 1601643, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x0", + "0x80" + ] + }, + { + "pc": 2919, + "op": "DUP5", + "gas": 1601640, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80" + ] + }, + { + "pc": 2920, + "op": "PUSH3", + "gas": 1601637, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9" + ] + }, + { + "pc": 2924, + "op": "JUMP", + "gas": 1601634, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9", + "0x986" + ] + }, + { + "pc": 2438, + "op": "JUMPDEST", + "gas": 1601626, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9" + ] + }, + { + "pc": 2439, + "op": "PUSH3", + "gas": 1601625, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9" + ] + }, + { + "pc": 2443, + "op": "DUP2", + "gas": 1601622, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9", + "0x991" + ] + }, + { + "pc": 2444, + "op": "PUSH3", + "gas": 1601619, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9", + "0x991", + "0x3e9" + ] + }, + { + "pc": 2448, + "op": "JUMP", + "gas": 1601616, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9", + "0x991", + "0x3e9", + "0x97c" + ] + }, + { + "pc": 2428, + "op": "JUMPDEST", + "gas": 1601608, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9", + "0x991", + "0x3e9" + ] + }, + { + "pc": 2429, + "op": "PUSH1", + "gas": 1601607, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9", + "0x991", + "0x3e9" + ] + }, + { + "pc": 2431, + "op": "DUP2", + "gas": 1601604, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9", + "0x991", + "0x3e9", + "0x0" + ] + }, + { + "pc": 2432, + "op": "SWAP1", + "gas": 1601601, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9", + "0x991", + "0x3e9", + "0x0", + "0x3e9" + ] + }, + { + "pc": 2433, + "op": "POP", + "gas": 1601598, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9", + "0x991", + "0x3e9", + "0x3e9", + "0x0" + ] + }, + { + "pc": 2434, + "op": "SWAP2", + "gas": 1601596, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9", + "0x991", + "0x3e9", + "0x3e9" + ] + }, + { + "pc": 2435, + "op": "SWAP1", + "gas": 1601593, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9", + "0x3e9", + "0x3e9", + "0x991" + ] + }, + { + "pc": 2436, + "op": "POP", + "gas": 1601590, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9", + "0x3e9", + "0x991", + "0x3e9" + ] + }, + { + "pc": 2437, + "op": "JUMP", + "gas": 1601588, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9", + "0x3e9", + "0x991" + ] + }, + { + "pc": 2449, + "op": "JUMPDEST", + "gas": 1601580, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9", + "0x3e9" + ] + }, + { + "pc": 2450, + "op": "DUP3", + "gas": 1601579, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9", + "0x3e9" + ] + }, + { + "pc": 2451, + "op": "MSTORE", + "gas": 1601576, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9", + "0x3e9", + "0x80" + ] + }, + { + "pc": 2452, + "op": "POP", + "gas": 1601573, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80", + "0x3e9" + ] + }, + { + "pc": 2453, + "op": "POP", + "gas": 1601571, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d", + "0x80" + ] + }, + { + "pc": 2454, + "op": "JUMP", + "gas": 1601569, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb6d" + ] + }, + { + "pc": 2925, + "op": "JUMPDEST", + "gas": 1601561, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0" + ] + }, + { + "pc": 2926, + "op": "DUP2", + "gas": 1601560, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0" + ] + }, + { + "pc": 2927, + "op": "DUP2", + "gas": 1601557, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0x80" + ] + }, + { + "pc": 2928, + "op": "SUB", + "gas": 1601554, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0x80", + "0xc0" + ] + }, + { + "pc": 2929, + "op": "PUSH1", + "gas": 1601551, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0x40" + ] + }, + { + "pc": 2931, + "op": "DUP4", + "gas": 1601548, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0x40", + "0x20" + ] + }, + { + "pc": 2932, + "op": "ADD", + "gas": 1601545, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0x40", + "0x20", + "0x80" + ] + }, + { + "pc": 2933, + "op": "MSTORE", + "gas": 1601542, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0x40", + "0xa0" + ] + }, + { + "pc": 2934, + "op": "PUSH3", + "gas": 1601539, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0" + ] + }, + { + "pc": 2938, + "op": "DUP2", + "gas": 1601536, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80" + ] + }, + { + "pc": 2939, + "op": "PUSH3", + "gas": 1601533, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0" + ] + }, + { + "pc": 2943, + "op": "JUMP", + "gas": 1601530, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0xb2f" + ] + }, + { + "pc": 2863, + "op": "JUMPDEST", + "gas": 1601522, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0" + ] + }, + { + "pc": 2864, + "op": "PUSH1", + "gas": 1601521, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0" + ] + }, + { + "pc": 2866, + "op": "PUSH3", + "gas": 1601518, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0" + ] + }, + { + "pc": 2870, + "op": "PUSH1", + "gas": 1601515, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xb3e" + ] + }, + { + "pc": 2872, + "op": "DUP4", + "gas": 1601512, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xb3e", + "0xe" + ] + }, + { + "pc": 2873, + "op": "PUSH3", + "gas": 1601509, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xb3e", + "0xe", + "0xc0" + ] + }, + { + "pc": 2877, + "op": "JUMP", + "gas": 1601506, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xb3e", + "0xe", + "0xc0", + "0xaf5" + ] + }, + { + "pc": 2805, + "op": "JUMPDEST", + "gas": 1601498, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xb3e", + "0xe", + "0xc0" + ] + }, + { + "pc": 2806, + "op": "PUSH1", + "gas": 1601497, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xb3e", + "0xe", + "0xc0" + ] + }, + { + "pc": 2808, + "op": "DUP3", + "gas": 1601494, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xb3e", + "0xe", + "0xc0", + "0x0" + ] + }, + { + "pc": 2809, + "op": "DUP3", + "gas": 1601491, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xb3e", + "0xe", + "0xc0", + "0x0", + "0xe" + ] + }, + { + "pc": 2810, + "op": "MSTORE", + "gas": 1601488, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xb3e", + "0xe", + "0xc0", + "0x0", + "0xe", + "0xc0" + ] + }, + { + "pc": 2811, + "op": "PUSH1", + "gas": 1601485, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xb3e", + "0xe", + "0xc0", + "0x0" + ] + }, + { + "pc": 2813, + "op": "DUP3", + "gas": 1601482, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xb3e", + "0xe", + "0xc0", + "0x0", + "0x20" + ] + }, + { + "pc": 2814, + "op": "ADD", + "gas": 1601479, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xb3e", + "0xe", + "0xc0", + "0x0", + "0x20", + "0xc0" + ] + }, + { + "pc": 2815, + "op": "SWAP1", + "gas": 1601476, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xb3e", + "0xe", + "0xc0", + "0x0", + "0xe0" + ] + }, + { + "pc": 2816, + "op": "POP", + "gas": 1601473, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xb3e", + "0xe", + "0xc0", + "0xe0", + "0x0" + ] + }, + { + "pc": 2817, + "op": "SWAP3", + "gas": 1601471, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xb3e", + "0xe", + "0xc0", + "0xe0" + ] + }, + { + "pc": 2818, + "op": "SWAP2", + "gas": 1601468, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xe0", + "0xe", + "0xc0", + "0xb3e" + ] + }, + { + "pc": 2819, + "op": "POP", + "gas": 1601465, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xe0", + "0xb3e", + "0xc0", + "0xe" + ] + }, + { + "pc": 2820, + "op": "POP", + "gas": 1601463, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xe0", + "0xb3e", + "0xc0" + ] + }, + { + "pc": 2821, + "op": "JUMP", + "gas": 1601461, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xe0", + "0xb3e" + ] + }, + { + "pc": 2878, + "op": "JUMPDEST", + "gas": 1601453, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xe0" + ] + }, + { + "pc": 2879, + "op": "SWAP2", + "gas": 1601452, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xc0", + "0x0", + "0xe0" + ] + }, + { + "pc": 2880, + "op": "POP", + "gas": 1601449, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0", + "0xc0" + ] + }, + { + "pc": 2881, + "op": "PUSH3", + "gas": 1601447, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0" + ] + }, + { + "pc": 2885, + "op": "DUP3", + "gas": 1601444, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0", + "0xb4b" + ] + }, + { + "pc": 2886, + "op": "PUSH3", + "gas": 1601441, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0", + "0xb4b", + "0xe0" + ] + }, + { + "pc": 2890, + "op": "JUMP", + "gas": 1601438, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0", + "0xb4b", + "0xe0", + "0xb06" + ] + }, + { + "pc": 2822, + "op": "JUMPDEST", + "gas": 1601430, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0", + "0xb4b", + "0xe0" + ] + }, + { + "pc": 2823, + "op": "PUSH32", + "gas": 1601429, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0", + "0xb4b", + "0xe0" + ] + }, + { + "pc": 2856, + "op": "PUSH1", + "gas": 1601426, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0", + "0xb4b", + "0xe0", + "0x696e7465726e616c20746f706963000000000000000000000000000000000000" + ] + }, + { + "pc": 2858, + "op": "DUP3", + "gas": 1601423, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0", + "0xb4b", + "0xe0", + "0x696e7465726e616c20746f706963000000000000000000000000000000000000", + "0x0" + ] + }, + { + "pc": 2859, + "op": "ADD", + "gas": 1601420, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0", + "0xb4b", + "0xe0", + "0x696e7465726e616c20746f706963000000000000000000000000000000000000", + "0x0", + "0xe0" + ] + }, + { + "pc": 2860, + "op": "MSTORE", + "gas": 1601417, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0", + "0xb4b", + "0xe0", + "0x696e7465726e616c20746f706963000000000000000000000000000000000000", + "0xe0" + ] + }, + { + "pc": 2861, + "op": "POP", + "gas": 1601414, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0", + "0xb4b", + "0xe0" + ] + }, + { + "pc": 2862, + "op": "JUMP", + "gas": 1601412, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0", + "0xb4b" + ] + }, + { + "pc": 2891, + "op": "JUMPDEST", + "gas": 1601404, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0" + ] + }, + { + "pc": 2892, + "op": "PUSH1", + "gas": 1601403, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0" + ] + }, + { + "pc": 2894, + "op": "DUP3", + "gas": 1601400, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0", + "0x20" + ] + }, + { + "pc": 2895, + "op": "ADD", + "gas": 1601397, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0", + "0x20", + "0xe0" + ] + }, + { + "pc": 2896, + "op": "SWAP1", + "gas": 1601394, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x0", + "0x100" + ] + }, + { + "pc": 2897, + "op": "POP", + "gas": 1601391, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x100", + "0x0" + ] + }, + { + "pc": 2898, + "op": "SWAP2", + "gas": 1601389, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0xb80", + "0xe0", + "0x100" + ] + }, + { + "pc": 2899, + "op": "SWAP1", + "gas": 1601386, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0x100", + "0xe0", + "0xb80" + ] + }, + { + "pc": 2900, + "op": "POP", + "gas": 1601383, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0x100", + "0xb80", + "0xe0" + ] + }, + { + "pc": 2901, + "op": "JUMP", + "gas": 1601381, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0x100", + "0xb80" + ] + }, + { + "pc": 2944, + "op": "JUMPDEST", + "gas": 1601373, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0x100" + ] + }, + { + "pc": 2945, + "op": "SWAP1", + "gas": 1601372, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0xc0", + "0x100" + ] + }, + { + "pc": 2946, + "op": "POP", + "gas": 1601369, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0x100", + "0xc0" + ] + }, + { + "pc": 2947, + "op": "SWAP3", + "gas": 1601367, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x2ca", + "0x3e9", + "0x80", + "0x100" + ] + }, + { + "pc": 2948, + "op": "SWAP2", + "gas": 1601364, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x3e9", + "0x80", + "0x2ca" + ] + }, + { + "pc": 2949, + "op": "POP", + "gas": 1601361, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x2ca", + "0x80", + "0x3e9" + ] + }, + { + "pc": 2950, + "op": "POP", + "gas": 1601359, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x2ca", + "0x80" + ] + }, + { + "pc": 2951, + "op": "JUMP", + "gas": 1601357, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x2ca" + ] + }, + { + "pc": 714, + "op": "JUMPDEST", + "gas": 1601349, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100" + ] + }, + { + "pc": 715, + "op": "PUSH1", + "gas": 1601348, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100" + ] + }, + { + "pc": 717, + "op": "MLOAD", + "gas": 1601345, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x40" + ] + }, + { + "pc": 718, + "op": "DUP1", + "gas": 1601342, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x80" + ] + }, + { + "pc": 719, + "op": "SWAP2", + "gas": 1601339, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x80", + "0x80" + ] + }, + { + "pc": 720, + "op": "SUB", + "gas": 1601336, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x80", + "0x80", + "0x100" + ] + }, + { + "pc": 721, + "op": "SWAP1", + "gas": 1601333, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x80", + "0x80" + ] + }, + { + "pc": 722, + "op": "LOG2", + "gas": 1601330, + "gasCost": 2149, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "OWNER.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x80", + "0x80" + ] + }, + { + "pc": 723, + "op": "DUP2", + "gas": 1599181, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0" + ] + }, + { + "pc": 724, + "op": "PUSH1", + "gas": 1599178, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9" + ] + }, + { + "pc": 726, + "op": "PUSH1", + "gas": 1599175, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3" + ] + }, + { + "pc": 728, + "op": "DUP3", + "gas": 1599172, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0" + ] + }, + { + "pc": 729, + "op": "DUP3", + "gas": 1599169, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x3e9" + ] + }, + { + "pc": 730, + "op": "SLOAD", + "gas": 1599166, + "gasCost": 2100, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x3e9", + "0x3" + ], + "storage": { + "0000000000000000000000000000000000000000000000000000000000000000": "00000000000000000000000061a286b8e87e2d31c475d71c85a0020584c44bae", + "0000000000000000000000000000000000000000000000000000000000000001": "00000000000000000000000000000000000000000000000000000000000003e8", + "0000000000000000000000000000000000000000000000000000000000000003": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, + { + "pc": 731, + "op": "PUSH3", + "gas": 1597066, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x3e9", + "0x0" + ] + }, + { + "pc": 735, + "op": "SWAP2", + "gas": 1597063, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x3e9", + "0x0", + "0x2e6" + ] + }, + { + "pc": 736, + "op": "SWAP1", + "gas": 1597060, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x0", + "0x3e9" + ] + }, + { + "pc": 737, + "op": "PUSH3", + "gas": 1597057, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0" + ] + }, + { + "pc": 741, + "op": "JUMP", + "gas": 1597054, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0xbb7" + ] + }, + { + "pc": 2999, + "op": "JUMPDEST", + "gas": 1597046, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0" + ] + }, + { + "pc": 3000, + "op": "PUSH1", + "gas": 1597045, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0" + ] + }, + { + "pc": 3002, + "op": "PUSH3", + "gas": 1597042, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0" + ] + }, + { + "pc": 3006, + "op": "DUP3", + "gas": 1597039, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbc4" + ] + }, + { + "pc": 3007, + "op": "PUSH3", + "gas": 1597036, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbc4", + "0x0" + ] + }, + { + "pc": 3011, + "op": "JUMP", + "gas": 1597033, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbc4", + "0x0", + "0x97c" + ] + }, + { + "pc": 2428, + "op": "JUMPDEST", + "gas": 1597025, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbc4", + "0x0" + ] + }, + { + "pc": 2429, + "op": "PUSH1", + "gas": 1597024, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbc4", + "0x0" + ] + }, + { + "pc": 2431, + "op": "DUP2", + "gas": 1597021, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbc4", + "0x0", + "0x0" + ] + }, + { + "pc": 2432, + "op": "SWAP1", + "gas": 1597018, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbc4", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 2433, + "op": "POP", + "gas": 1597015, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbc4", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 2434, + "op": "SWAP2", + "gas": 1597013, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbc4", + "0x0", + "0x0" + ] + }, + { + "pc": 2435, + "op": "SWAP1", + "gas": 1597010, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x0", + "0x0", + "0xbc4" + ] + }, + { + "pc": 2436, + "op": "POP", + "gas": 1597007, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x0", + "0xbc4", + "0x0" + ] + }, + { + "pc": 2437, + "op": "JUMP", + "gas": 1597005, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x0", + "0xbc4" + ] + }, + { + "pc": 3012, + "op": "JUMPDEST", + "gas": 1596997, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 3013, + "op": "SWAP2", + "gas": 1596996, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 3014, + "op": "POP", + "gas": 1596993, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 3015, + "op": "PUSH3", + "gas": 1596991, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0" + ] + }, + { + "pc": 3019, + "op": "DUP4", + "gas": 1596988, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbd1" + ] + }, + { + "pc": 3020, + "op": "PUSH3", + "gas": 1596985, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbd1", + "0x3e9" + ] + }, + { + "pc": 3024, + "op": "JUMP", + "gas": 1596982, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbd1", + "0x3e9", + "0x97c" + ] + }, + { + "pc": 2428, + "op": "JUMPDEST", + "gas": 1596974, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbd1", + "0x3e9" + ] + }, + { + "pc": 2429, + "op": "PUSH1", + "gas": 1596973, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbd1", + "0x3e9" + ] + }, + { + "pc": 2431, + "op": "DUP2", + "gas": 1596970, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbd1", + "0x3e9", + "0x0" + ] + }, + { + "pc": 2432, + "op": "SWAP1", + "gas": 1596967, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbd1", + "0x3e9", + "0x0", + "0x3e9" + ] + }, + { + "pc": 2433, + "op": "POP", + "gas": 1596964, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbd1", + "0x3e9", + "0x3e9", + "0x0" + ] + }, + { + "pc": 2434, + "op": "SWAP2", + "gas": 1596962, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xbd1", + "0x3e9", + "0x3e9" + ] + }, + { + "pc": 2435, + "op": "SWAP1", + "gas": 1596959, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x3e9", + "0x3e9", + "0xbd1" + ] + }, + { + "pc": 2436, + "op": "POP", + "gas": 1596956, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x3e9", + "0xbd1", + "0x3e9" + ] + }, + { + "pc": 2437, + "op": "JUMP", + "gas": 1596954, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x3e9", + "0xbd1" + ] + }, + { + "pc": 3025, + "op": "JUMPDEST", + "gas": 1596946, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x3e9" + ] + }, + { + "pc": 3026, + "op": "SWAP3", + "gas": 1596945, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x3e9" + ] + }, + { + "pc": 3027, + "op": "POP", + "gas": 1596942, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x3e9" + ] + }, + { + "pc": 3028, + "op": "DUP3", + "gas": 1596940, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0" + ] + }, + { + "pc": 3029, + "op": "PUSH32", + "gas": 1596937, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x3e9" + ] + }, + { + "pc": 3062, + "op": "SUB", + "gas": 1596934, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x3e9", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + ] + }, + { + "pc": 3063, + "op": "DUP3", + "gas": 1596931, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc16" + ] + }, + { + "pc": 3064, + "op": "GT", + "gas": 1596928, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc16", + "0x0" + ] + }, + { + "pc": 3065, + "op": "ISZERO", + "gas": 1596925, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 3066, + "op": "PUSH3", + "gas": 1596922, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x1" + ] + }, + { + "pc": 3070, + "op": "JUMPI", + "gas": 1596919, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x1", + "0xc09" + ] + }, + { + "pc": 3081, + "op": "JUMPDEST", + "gas": 1596909, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0" + ] + }, + { + "pc": 3082, + "op": "DUP3", + "gas": 1596908, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0" + ] + }, + { + "pc": 3083, + "op": "DUP3", + "gas": 1596905, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x3e9" + ] + }, + { + "pc": 3084, + "op": "ADD", + "gas": 1596902, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x3e9", + "0x0" + ] + }, + { + "pc": 3085, + "op": "SWAP1", + "gas": 1596899, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x0", + "0x3e9" + ] + }, + { + "pc": 3086, + "op": "POP", + "gas": 1596896, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x3e9", + "0x0" + ] + }, + { + "pc": 3087, + "op": "SWAP3", + "gas": 1596894, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x2e6", + "0x3e9", + "0x0", + "0x3e9" + ] + }, + { + "pc": 3088, + "op": "SWAP2", + "gas": 1596891, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x3e9", + "0x3e9", + "0x0", + "0x2e6" + ] + }, + { + "pc": 3089, + "op": "POP", + "gas": 1596888, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x3e9", + "0x2e6", + "0x0", + "0x3e9" + ] + }, + { + "pc": 3090, + "op": "POP", + "gas": 1596886, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x3e9", + "0x2e6", + "0x0" + ] + }, + { + "pc": 3091, + "op": "JUMP", + "gas": 1596884, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x3e9", + "0x2e6" + ] + }, + { + "pc": 742, + "op": "JUMPDEST", + "gas": 1596876, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x3e9" + ] + }, + { + "pc": 743, + "op": "SWAP3", + "gas": 1596875, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x3e9" + ] + }, + { + "pc": 744, + "op": "POP", + "gas": 1596872, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0", + "0x3e9" + ] + }, + { + "pc": 745, + "op": "POP", + "gas": 1596870, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x0" + ] + }, + { + "pc": 746, + "op": "DUP2", + "gas": 1596868, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3" + ] + }, + { + "pc": 747, + "op": "SWAP1", + "gas": 1596865, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3", + "0x3e9" + ] + }, + { + "pc": 748, + "op": "SSTORE", + "gas": 1596862, + "gasCost": 20000, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9", + "0x3e9", + "0x3" + ], + "storage": { + "0000000000000000000000000000000000000000000000000000000000000000": "00000000000000000000000061a286b8e87e2d31c475d71c85a0020584c44bae", + "0000000000000000000000000000000000000000000000000000000000000001": "00000000000000000000000000000000000000000000000000000000000003e8", + "0000000000000000000000000000000000000000000000000000000000000003": "00000000000000000000000000000000000000000000000000000000000003e9" + } + }, + { + "pc": 749, + "op": "POP", + "gas": 1576862, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x3e9" + ] + }, + { + "pc": 750, + "op": "PUSH1", + "gas": 1576860, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0" + ] + }, + { + "pc": 752, + "op": "SWAP1", + "gas": 1576857, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x0", + "0x2" + ] + }, + { + "pc": 753, + "op": "POP", + "gas": 1576854, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x2", + "0x0" + ] + }, + { + "pc": 754, + "op": "SWAP2", + "gas": 1576852, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3e7", + "0x3e9", + "0x2" + ] + }, + { + "pc": 755, + "op": "SWAP1", + "gas": 1576849, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x2", + "0x3e9", + "0x3e7" + ] + }, + { + "pc": 756, + "op": "POP", + "gas": 1576846, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x2", + "0x3e7", + "0x3e9" + ] + }, + { + "pc": 757, + "op": "JUMP", + "gas": 1576844, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x2", + "0x3e7" + ] + }, + { + "pc": 999, + "op": "JUMPDEST", + "gas": 1576836, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x2" + ] + }, + { + "pc": 1000, + "op": "POP", + "gas": 1576835, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x2" + ] + }, + { + "pc": 1001, + "op": "PUSH3", + "gas": 1576833, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0" + ] + }, + { + "pc": 1005, + "op": "PUSH3", + "gas": 1576830, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2" + ] + }, + { + "pc": 1009, + "op": "JUMP", + "gas": 1576827, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0x231" + ] + }, + { + "pc": 561, + "op": "JUMPDEST", + "gas": 1576819, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2" + ] + }, + { + "pc": 562, + "op": "PUSH1", + "gas": 1576818, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2" + ] + }, + { + "pc": 564, + "op": "DUP1", + "gas": 1576815, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0x0" + ] + }, + { + "pc": 565, + "op": "PUSH1", + "gas": 1576812, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0x0", + "0x0" + ] + }, + { + "pc": 567, + "op": "MLOAD", + "gas": 1576809, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0x0", + "0x0", + "0x40" + ] + }, + { + "pc": 568, + "op": "DUP1", + "gas": 1576806, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0x0", + "0x0", + "0x80" + ] + }, + { + "pc": 569, + "op": "PUSH1", + "gas": 1576803, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0x0", + "0x0", + "0x80", + "0x80" + ] + }, + { + "pc": 571, + "op": "ADD", + "gas": 1576800, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0x0", + "0x0", + "0x80", + "0x80", + "0x40" + ] + }, + { + "pc": 572, + "op": "PUSH1", + "gas": 1576797, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0x0", + "0x0", + "0x80", + "0xc0" + ] + }, + { + "pc": 574, + "op": "MSTORE", + "gas": 1576794, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0x0", + "0x0", + "0x80", + "0xc0", + "0x40" + ] + }, + { + "pc": 575, + "op": "DUP1", + "gas": 1576791, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0x0", + "0x0", + "0x80" + ] + }, + { + "pc": 576, + "op": "PUSH1", + "gas": 1576788, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0x0", + "0x0", + "0x80", + "0x80" + ] + }, + { + "pc": 578, + "op": "DUP2", + "gas": 1576785, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0x0", + "0x0", + "0x80", + "0x80", + "0xd" + ] + }, + { + "pc": 579, + "op": "MSTORE", + "gas": 1576782, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0x0", + "0x0", + "0x80", + "0x80", + "0xd", + "0x80" + ] + }, + { + "pc": 580, + "op": "PUSH1", + "gas": 1576779, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0x0", + "0x0", + "0x80", + "0x80" + ] + }, + { + "pc": 582, + "op": "ADD", + "gas": 1576776, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0x0", + "0x0", + "0x80", + "0x80", + "0x20" + ] + }, + { + "pc": 583, + "op": "PUSH32", + "gas": 1576773, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0x0", + "0x0", + "0x80", + "0xa0" + ] + }, + { + "pc": 616, + "op": "DUP2", + "gas": 1576770, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0x0", + "0x0", + "0x80", + "0xa0", + "0x48656c6c6f2c20776f726c642100000000000000000000000000000000000000" + ] + }, + { + "pc": 617, + "op": "MSTORE", + "gas": 1576767, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0x0", + "0x0", + "0x80", + "0xa0", + "0x48656c6c6f2c20776f726c642100000000000000000000000000000000000000", + "0xa0" + ] + }, + { + "pc": 618, + "op": "POP", + "gas": 1576764, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0x0", + "0x0", + "0x80", + "0xa0" + ] + }, + { + "pc": 619, + "op": "SWAP1", + "gas": 1576762, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0x0", + "0x0", + "0x80" + ] + }, + { + "pc": 620, + "op": "POP", + "gas": 1576759, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0x0", + "0x80", + "0x0" + ] + }, + { + "pc": 621, + "op": "PUSH1", + "gas": 1576757, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0x0", + "0x80" + ] + }, + { + "pc": 623, + "op": "DUP2", + "gas": 1576754, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0x0", + "0x80", + "0x0" + ] + }, + { + "pc": 624, + "op": "DUP1", + "gas": 1576751, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0x0", + "0x80", + "0x0", + "0x80" + ] + }, + { + "pc": 625, + "op": "MLOAD", + "gas": 1576748, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0x0", + "0x80", + "0x0", + "0x80", + "0x80" + ] + }, + { + "pc": 626, + "op": "SWAP1", + "gas": 1576745, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0x0", + "0x80", + "0x0", + "0x80", + "0xd" + ] + }, + { + "pc": 627, + "op": "PUSH1", + "gas": 1576742, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0x0", + "0x80", + "0x0", + "0xd", + "0x80" + ] + }, + { + "pc": 629, + "op": "ADD", + "gas": 1576739, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0x0", + "0x80", + "0x0", + "0xd", + "0x80", + "0x20" + ] + }, + { + "pc": 630, + "op": "KECCAK256", + "gas": 1576736, + "gasCost": 36, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0x0", + "0x80", + "0x0", + "0xd", + "0xa0" + ] + }, + { + "pc": 631, + "op": "SWAP1", + "gas": 1576700, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0x0", + "0x80", + "0x0", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4" + ] + }, + { + "pc": 632, + "op": "POP", + "gas": 1576697, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0x0", + "0x80", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4", + "0x0" + ] + }, + { + "pc": 633, + "op": "DUP1", + "gas": 1576695, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0x0", + "0x80", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4" + ] + }, + { + "pc": 634, + "op": "SWAP3", + "gas": 1576692, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0x0", + "0x80", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4" + ] + }, + { + "pc": 635, + "op": "POP", + "gas": 1576689, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4", + "0x80", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4", + "0x0" + ] + }, + { + "pc": 636, + "op": "POP", + "gas": 1576687, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4", + "0x80", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4" + ] + }, + { + "pc": 637, + "op": "POP", + "gas": 1576685, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4", + "0x80" + ] + }, + { + "pc": 638, + "op": "SWAP1", + "gas": 1576683, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x3f2", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4" + ] + }, + { + "pc": 639, + "op": "JUMP", + "gas": 1576680, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4", + "0x3f2" + ] + }, + { + "pc": 1010, + "op": "JUMPDEST", + "gas": 1576672, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4" + ] + }, + { + "pc": 1011, + "op": "POP", + "gas": 1576671, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4" + ] + }, + { + "pc": 1012, + "op": "PUSH1", + "gas": 1576669, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0" + ] + }, + { + "pc": 1014, + "op": "DUP1", + "gas": 1576666, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x0" + ] + }, + { + "pc": 1015, + "op": "SLOAD", + "gas": 1576663, + "gasCost": 100, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x0", + "0x0" + ], + "storage": { + "0000000000000000000000000000000000000000000000000000000000000000": "00000000000000000000000061a286b8e87e2d31c475d71c85a0020584c44bae", + "0000000000000000000000000000000000000000000000000000000000000001": "00000000000000000000000000000000000000000000000000000000000003e8", + "0000000000000000000000000000000000000000000000000000000000000003": "00000000000000000000000000000000000000000000000000000000000003e9" + } + }, + { + "pc": 1016, + "op": "SWAP1", + "gas": 1576563, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae" + ] + }, + { + "pc": 1017, + "op": "PUSH2", + "gas": 1576560, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x0" + ] + }, + { + "pc": 1020, + "op": "EXP", + "gas": 1576557, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x0", + "0x100" + ] + }, + { + "pc": 1021, + "op": "SWAP1", + "gas": 1576547, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x1" + ] + }, + { + "pc": 1022, + "op": "DIV", + "gas": 1576544, + "gasCost": 5, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x1", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae" + ] + }, + { + "pc": 1023, + "op": "PUSH20", + "gas": 1576539, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae" + ] + }, + { + "pc": 1044, + "op": "AND", + "gas": 1576536, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xffffffffffffffffffffffffffffffffffffffff" + ] + }, + { + "pc": 1045, + "op": "PUSH20", + "gas": 1576533, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae" + ] + }, + { + "pc": 1066, + "op": "AND", + "gas": 1576530, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xffffffffffffffffffffffffffffffffffffffff" + ] + }, + { + "pc": 1067, + "op": "PUSH4", + "gas": 1576527, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae" + ] + }, + { + "pc": 1072, + "op": "DUP4", + "gas": 1576524, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68" + ] + }, + { + "pc": 1073, + "op": "PUSH1", + "gas": 1576521, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x3e8" + ] + }, + { + "pc": 1075, + "op": "MLOAD", + "gas": 1576518, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x3e8", + "0x40" + ] + }, + { + "pc": 1076, + "op": "DUP3", + "gas": 1576515, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x3e8", + "0xc0" + ] + }, + { + "pc": 1077, + "op": "PUSH4", + "gas": 1576512, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x3e8", + "0xc0", + "0xa0712d68" + ] + }, + { + "pc": 1082, + "op": "AND", + "gas": 1576509, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x3e8", + "0xc0", + "0xa0712d68", + "0xffffffff" + ] + }, + { + "pc": 1083, + "op": "PUSH1", + "gas": 1576506, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x3e8", + "0xc0", + "0xa0712d68" + ] + }, + { + "pc": 1085, + "op": "SHL", + "gas": 1576503, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x3e8", + "0xc0", + "0xa0712d68", + "0xe0" + ] + }, + { + "pc": 1086, + "op": "DUP2", + "gas": 1576500, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x3e8", + "0xc0", + "0xa0712d6800000000000000000000000000000000000000000000000000000000" + ] + }, + { + "pc": 1087, + "op": "MSTORE", + "gas": 1576497, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x3e8", + "0xc0", + "0xa0712d6800000000000000000000000000000000000000000000000000000000", + "0xc0" + ] + }, + { + "pc": 1088, + "op": "PUSH1", + "gas": 1576494, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x3e8", + "0xc0" + ] + }, + { + "pc": 1090, + "op": "ADD", + "gas": 1576491, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x3e8", + "0xc0", + "0x4" + ] + }, + { + "pc": 1091, + "op": "PUSH3", + "gas": 1576488, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x3e8", + "0xc4" + ] + }, + { + "pc": 1095, + "op": "SWAP2", + "gas": 1576485, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x3e8", + "0xc4", + "0x44e" + ] + }, + { + "pc": 1096, + "op": "SWAP1", + "gas": 1576482, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0xc4", + "0x3e8" + ] + }, + { + "pc": 1097, + "op": "PUSH3", + "gas": 1576479, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4" + ] + }, + { + "pc": 1101, + "op": "JUMP", + "gas": 1576476, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0x997" + ] + }, + { + "pc": 2455, + "op": "JUMPDEST", + "gas": 1576468, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4" + ] + }, + { + "pc": 2456, + "op": "PUSH1", + "gas": 1576467, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4" + ] + }, + { + "pc": 2458, + "op": "PUSH1", + "gas": 1576464, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0x0" + ] + }, + { + "pc": 2460, + "op": "DUP3", + "gas": 1576461, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0x0", + "0x20" + ] + }, + { + "pc": 2461, + "op": "ADD", + "gas": 1576458, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0x0", + "0x20", + "0xc4" + ] + }, + { + "pc": 2462, + "op": "SWAP1", + "gas": 1576455, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0x0", + "0xe4" + ] + }, + { + "pc": 2463, + "op": "POP", + "gas": 1576452, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0xe4", + "0x0" + ] + }, + { + "pc": 2464, + "op": "PUSH3", + "gas": 1576450, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0xe4" + ] + }, + { + "pc": 2468, + "op": "PUSH1", + "gas": 1576447, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae" + ] + }, + { + "pc": 2470, + "op": "DUP4", + "gas": 1576444, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0x0" + ] + }, + { + "pc": 2471, + "op": "ADD", + "gas": 1576441, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0x0", + "0xc4" + ] + }, + { + "pc": 2472, + "op": "DUP5", + "gas": 1576438, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4" + ] + }, + { + "pc": 2473, + "op": "PUSH3", + "gas": 1576435, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8" + ] + }, + { + "pc": 2477, + "op": "JUMP", + "gas": 1576432, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8", + "0x986" + ] + }, + { + "pc": 2438, + "op": "JUMPDEST", + "gas": 1576424, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8" + ] + }, + { + "pc": 2439, + "op": "PUSH3", + "gas": 1576423, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8" + ] + }, + { + "pc": 2443, + "op": "DUP2", + "gas": 1576420, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8", + "0x991" + ] + }, + { + "pc": 2444, + "op": "PUSH3", + "gas": 1576417, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8", + "0x991", + "0x3e8" + ] + }, + { + "pc": 2448, + "op": "JUMP", + "gas": 1576414, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8", + "0x991", + "0x3e8", + "0x97c" + ] + }, + { + "pc": 2428, + "op": "JUMPDEST", + "gas": 1576406, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8", + "0x991", + "0x3e8" + ] + }, + { + "pc": 2429, + "op": "PUSH1", + "gas": 1576405, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8", + "0x991", + "0x3e8" + ] + }, + { + "pc": 2431, + "op": "DUP2", + "gas": 1576402, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8", + "0x991", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2432, + "op": "SWAP1", + "gas": 1576399, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8", + "0x991", + "0x3e8", + "0x0", + "0x3e8" + ] + }, + { + "pc": 2433, + "op": "POP", + "gas": 1576396, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8", + "0x991", + "0x3e8", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2434, + "op": "SWAP2", + "gas": 1576394, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8", + "0x991", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 2435, + "op": "SWAP1", + "gas": 1576391, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8", + "0x3e8", + "0x3e8", + "0x991" + ] + }, + { + "pc": 2436, + "op": "POP", + "gas": 1576388, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8", + "0x3e8", + "0x991", + "0x3e8" + ] + }, + { + "pc": 2437, + "op": "JUMP", + "gas": 1576386, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8", + "0x3e8", + "0x991" + ] + }, + { + "pc": 2449, + "op": "JUMPDEST", + "gas": 1576378, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 2450, + "op": "DUP3", + "gas": 1576377, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 2451, + "op": "MSTORE", + "gas": 1576374, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8", + "0x3e8", + "0xc4" + ] + }, + { + "pc": 2452, + "op": "POP", + "gas": 1576371, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4", + "0x3e8" + ] + }, + { + "pc": 2453, + "op": "POP", + "gas": 1576369, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae", + "0xc4" + ] + }, + { + "pc": 2454, + "op": "JUMP", + "gas": 1576367, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0xe4", + "0x9ae" + ] + }, + { + "pc": 2478, + "op": "JUMPDEST", + "gas": 1576359, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0xe4" + ] + }, + { + "pc": 2479, + "op": "SWAP3", + "gas": 1576358, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0x44e", + "0x3e8", + "0xc4", + "0xe4" + ] + }, + { + "pc": 2480, + "op": "SWAP2", + "gas": 1576355, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0xe4", + "0x3e8", + "0xc4", + "0x44e" + ] + }, + { + "pc": 2481, + "op": "POP", + "gas": 1576352, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0xe4", + "0x44e", + "0xc4", + "0x3e8" + ] + }, + { + "pc": 2482, + "op": "POP", + "gas": 1576350, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0xe4", + "0x44e", + "0xc4" + ] + }, + { + "pc": 2483, + "op": "JUMP", + "gas": 1576348, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0xe4", + "0x44e" + ] + }, + { + "pc": 1102, + "op": "JUMPDEST", + "gas": 1576340, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0xe4" + ] + }, + { + "pc": 1103, + "op": "PUSH1", + "gas": 1576339, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0xe4" + ] + }, + { + "pc": 1105, + "op": "PUSH1", + "gas": 1576336, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0xe4", + "0x20" + ] + }, + { + "pc": 1107, + "op": "MLOAD", + "gas": 1576333, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0xe4", + "0x20", + "0x40" + ] + }, + { + "pc": 1108, + "op": "DUP1", + "gas": 1576330, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0xe4", + "0x20", + "0xc0" + ] + }, + { + "pc": 1109, + "op": "DUP4", + "gas": 1576327, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0xe4", + "0x20", + "0xc0", + "0xc0" + ] + }, + { + "pc": 1110, + "op": "SUB", + "gas": 1576324, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0xe4", + "0x20", + "0xc0", + "0xc0", + "0xe4" + ] + }, + { + "pc": 1111, + "op": "DUP2", + "gas": 1576321, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0xe4", + "0x20", + "0xc0", + "0x24" + ] + }, + { + "pc": 1112, + "op": "PUSH1", + "gas": 1576318, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0xe4", + "0x20", + "0xc0", + "0x24", + "0xc0" + ] + }, + { + "pc": 1114, + "op": "DUP8", + "gas": 1576315, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0xe4", + "0x20", + "0xc0", + "0x24", + "0xc0", + "0x0" + ] + }, + { + "pc": 1115, + "op": "DUP1", + "gas": 1576312, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0xe4", + "0x20", + "0xc0", + "0x24", + "0xc0", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae" + ] + }, + { + "pc": 1116, + "op": "EXTCODESIZE", + "gas": 1576309, + "gasCost": 100, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0xe4", + "0x20", + "0xc0", + "0x24", + "0xc0", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae" + ] + }, + { + "pc": 1117, + "op": "ISZERO", + "gas": 1576209, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0xe4", + "0x20", + "0xc0", + "0x24", + "0xc0", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x651" + ] + }, + { + "pc": 1118, + "op": "DUP1", + "gas": 1576206, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0xe4", + "0x20", + "0xc0", + "0x24", + "0xc0", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x0" + ] + }, + { + "pc": 1119, + "op": "ISZERO", + "gas": 1576203, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0xe4", + "0x20", + "0xc0", + "0x24", + "0xc0", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x0", + "0x0" + ] + }, + { + "pc": 1120, + "op": "PUSH3", + "gas": 1576200, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0xe4", + "0x20", + "0xc0", + "0x24", + "0xc0", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x0", + "0x1" + ] + }, + { + "pc": 1124, + "op": "JUMPI", + "gas": 1576197, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0xe4", + "0x20", + "0xc0", + "0x24", + "0xc0", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x0", + "0x1", + "0x469" + ] + }, + { + "pc": 1129, + "op": "JUMPDEST", + "gas": 1576187, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0xe4", + "0x20", + "0xc0", + "0x24", + "0xc0", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x0" + ] + }, + { + "pc": 1130, + "op": "POP", + "gas": 1576186, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0xe4", + "0x20", + "0xc0", + "0x24", + "0xc0", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x0" + ] + }, + { + "pc": 1131, + "op": "GAS", + "gas": 1576184, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0xe4", + "0x20", + "0xc0", + "0x24", + "0xc0", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae" + ] + }, + { + "pc": 1132, + "op": "CALL", + "gas": 1576182, + "gasCost": 1551556, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0xe4", + "0x20", + "0xc0", + "0x24", + "0xc0", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0x180cf6" + ] + }, + { + "pc": 0, + "op": "PUSH1", + "gas": 1551456, + "gasCost": 3, + "depth": 2, + "stack": [] + }, + { + "pc": 2, + "op": "PUSH1", + "gas": 1551453, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x80" + ] + }, + { + "pc": 4, + "op": "MSTORE", + "gas": 1551450, + "gasCost": 12, + "depth": 2, + "stack": [ + "0x80", + "0x40" + ] + }, + { + "pc": 5, + "op": "CALLVALUE", + "gas": 1551438, + "gasCost": 2, + "depth": 2, + "stack": [] + }, + { + "pc": 6, + "op": "DUP1", + "gas": 1551436, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0" + ] + }, + { + "pc": 7, + "op": "ISZERO", + "gas": 1551433, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0", + "0x0" + ] + }, + { + "pc": 8, + "op": "PUSH2", + "gas": 1551430, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0", + "0x1" + ] + }, + { + "pc": 11, + "op": "JUMPI", + "gas": 1551427, + "gasCost": 10, + "depth": 2, + "stack": [ + "0x0", + "0x1", + "0x10" + ] + }, + { + "pc": 16, + "op": "JUMPDEST", + "gas": 1551417, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x0" + ] + }, + { + "pc": 17, + "op": "POP", + "gas": 1551416, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x0" + ] + }, + { + "pc": 18, + "op": "PUSH1", + "gas": 1551414, + "gasCost": 3, + "depth": 2, + "stack": [] + }, + { + "pc": 20, + "op": "CALLDATASIZE", + "gas": 1551411, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x4" + ] + }, + { + "pc": 21, + "op": "LT", + "gas": 1551409, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x4", + "0x24" + ] + }, + { + "pc": 22, + "op": "PUSH2", + "gas": 1551406, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0" + ] + }, + { + "pc": 25, + "op": "JUMPI", + "gas": 1551403, + "gasCost": 10, + "depth": 2, + "stack": [ + "0x0", + "0x62" + ] + }, + { + "pc": 26, + "op": "PUSH1", + "gas": 1551393, + "gasCost": 3, + "depth": 2, + "stack": [] + }, + { + "pc": 28, + "op": "CALLDATALOAD", + "gas": 1551390, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0" + ] + }, + { + "pc": 29, + "op": "PUSH1", + "gas": 1551387, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d6800000000000000000000000000000000000000000000000000000000" + ] + }, + { + "pc": 31, + "op": "SHR", + "gas": 1551384, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d6800000000000000000000000000000000000000000000000000000000", + "0xe0" + ] + }, + { + "pc": 32, + "op": "DUP1", + "gas": 1551381, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68" + ] + }, + { + "pc": 33, + "op": "PUSH4", + "gas": 1551378, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xa0712d68" + ] + }, + { + "pc": 38, + "op": "EQ", + "gas": 1551375, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xa0712d68", + "0x1c717069" + ] + }, + { + "pc": 39, + "op": "PUSH2", + "gas": 1551372, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0x0" + ] + }, + { + "pc": 42, + "op": "JUMPI", + "gas": 1551369, + "gasCost": 10, + "depth": 2, + "stack": [ + "0xa0712d68", + "0x0", + "0x67" + ] + }, + { + "pc": 43, + "op": "DUP1", + "gas": 1551359, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68" + ] + }, + { + "pc": 44, + "op": "PUSH4", + "gas": 1551356, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xa0712d68" + ] + }, + { + "pc": 49, + "op": "EQ", + "gas": 1551353, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xa0712d68", + "0x1c93908c" + ] + }, + { + "pc": 50, + "op": "PUSH2", + "gas": 1551350, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0x0" + ] + }, + { + "pc": 53, + "op": "JUMPI", + "gas": 1551347, + "gasCost": 10, + "depth": 2, + "stack": [ + "0xa0712d68", + "0x0", + "0x85" + ] + }, + { + "pc": 54, + "op": "DUP1", + "gas": 1551337, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68" + ] + }, + { + "pc": 55, + "op": "PUSH4", + "gas": 1551334, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xa0712d68" + ] + }, + { + "pc": 60, + "op": "EQ", + "gas": 1551331, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xa0712d68", + "0x92954362" + ] + }, + { + "pc": 61, + "op": "PUSH2", + "gas": 1551328, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0x0" + ] + }, + { + "pc": 64, + "op": "JUMPI", + "gas": 1551325, + "gasCost": 10, + "depth": 2, + "stack": [ + "0xa0712d68", + "0x0", + "0xb5" + ] + }, + { + "pc": 65, + "op": "DUP1", + "gas": 1551315, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68" + ] + }, + { + "pc": 66, + "op": "PUSH4", + "gas": 1551312, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xa0712d68" + ] + }, + { + "pc": 71, + "op": "EQ", + "gas": 1551309, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xa0712d68", + "0xa0712d68" + ] + }, + { + "pc": 72, + "op": "PUSH2", + "gas": 1551306, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0x1" + ] + }, + { + "pc": 75, + "op": "JUMPI", + "gas": 1551303, + "gasCost": 10, + "depth": 2, + "stack": [ + "0xa0712d68", + "0x1", + "0xbf" + ] + }, + { + "pc": 191, + "op": "JUMPDEST", + "gas": 1551293, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68" + ] + }, + { + "pc": 192, + "op": "PUSH2", + "gas": 1551292, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68" + ] + }, + { + "pc": 195, + "op": "PUSH1", + "gas": 1551289, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9" + ] + }, + { + "pc": 197, + "op": "DUP1", + "gas": 1551286, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x4" + ] + }, + { + "pc": 198, + "op": "CALLDATASIZE", + "gas": 1551283, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x4", + "0x4" + ] + }, + { + "pc": 199, + "op": "SUB", + "gas": 1551281, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x4", + "0x4", + "0x24" + ] + }, + { + "pc": 200, + "op": "DUP2", + "gas": 1551278, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x4", + "0x20" + ] + }, + { + "pc": 201, + "op": "ADD", + "gas": 1551275, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x4", + "0x20", + "0x4" + ] + }, + { + "pc": 202, + "op": "SWAP1", + "gas": 1551272, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x4", + "0x24" + ] + }, + { + "pc": 203, + "op": "PUSH2", + "gas": 1551269, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x24", + "0x4" + ] + }, + { + "pc": 206, + "op": "SWAP2", + "gas": 1551266, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x24", + "0x4", + "0xd4" + ] + }, + { + "pc": 207, + "op": "SWAP1", + "gas": 1551263, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x4", + "0x24" + ] + }, + { + "pc": 208, + "op": "PUSH2", + "gas": 1551260, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4" + ] + }, + { + "pc": 211, + "op": "JUMP", + "gas": 1551257, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x343" + ] + }, + { + "pc": 835, + "op": "JUMPDEST", + "gas": 1551249, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4" + ] + }, + { + "pc": 836, + "op": "PUSH1", + "gas": 1551248, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4" + ] + }, + { + "pc": 838, + "op": "PUSH1", + "gas": 1551245, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0" + ] + }, + { + "pc": 840, + "op": "DUP3", + "gas": 1551242, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x20" + ] + }, + { + "pc": 841, + "op": "DUP5", + "gas": 1551239, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x20", + "0x4" + ] + }, + { + "pc": 842, + "op": "SUB", + "gas": 1551236, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x20", + "0x4", + "0x24" + ] + }, + { + "pc": 843, + "op": "SLT", + "gas": 1551233, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x20", + "0x20" + ] + }, + { + "pc": 844, + "op": "ISZERO", + "gas": 1551230, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0" + ] + }, + { + "pc": 845, + "op": "PUSH2", + "gas": 1551227, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x1" + ] + }, + { + "pc": 848, + "op": "JUMPI", + "gas": 1551224, + "gasCost": 10, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x1", + "0x359" + ] + }, + { + "pc": 857, + "op": "JUMPDEST", + "gas": 1551214, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0" + ] + }, + { + "pc": 858, + "op": "PUSH1", + "gas": 1551213, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0" + ] + }, + { + "pc": 860, + "op": "PUSH2", + "gas": 1551210, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0" + ] + }, + { + "pc": 863, + "op": "DUP5", + "gas": 1551207, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367" + ] + }, + { + "pc": 864, + "op": "DUP3", + "gas": 1551204, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24" + ] + }, + { + "pc": 865, + "op": "DUP6", + "gas": 1551201, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x0" + ] + }, + { + "pc": 866, + "op": "ADD", + "gas": 1551198, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x0", + "0x4" + ] + }, + { + "pc": 867, + "op": "PUSH2", + "gas": 1551195, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4" + ] + }, + { + "pc": 870, + "op": "JUMP", + "gas": 1551192, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4", + "0x32e" + ] + }, + { + "pc": 814, + "op": "JUMPDEST", + "gas": 1551184, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4" + ] + }, + { + "pc": 815, + "op": "PUSH1", + "gas": 1551183, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4" + ] + }, + { + "pc": 817, + "op": "DUP2", + "gas": 1551180, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4", + "0x0" + ] + }, + { + "pc": 818, + "op": "CALLDATALOAD", + "gas": 1551177, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4", + "0x0", + "0x4" + ] + }, + { + "pc": 819, + "op": "SWAP1", + "gas": 1551174, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4", + "0x0", + "0x3e8" + ] + }, + { + "pc": 820, + "op": "POP", + "gas": 1551171, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4", + "0x3e8", + "0x0" + ] + }, + { + "pc": 821, + "op": "PUSH2", + "gas": 1551169, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4", + "0x3e8" + ] + }, + { + "pc": 824, + "op": "DUP2", + "gas": 1551166, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4", + "0x3e8", + "0x33d" + ] + }, + { + "pc": 825, + "op": "PUSH2", + "gas": 1551163, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4", + "0x3e8", + "0x33d", + "0x3e8" + ] + }, + { + "pc": 828, + "op": "JUMP", + "gas": 1551160, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4", + "0x3e8", + "0x33d", + "0x3e8", + "0x317" + ] + }, + { + "pc": 791, + "op": "JUMPDEST", + "gas": 1551152, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4", + "0x3e8", + "0x33d", + "0x3e8" + ] + }, + { + "pc": 792, + "op": "PUSH2", + "gas": 1551151, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4", + "0x3e8", + "0x33d", + "0x3e8" + ] + }, + { + "pc": 795, + "op": "DUP2", + "gas": 1551148, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4", + "0x3e8", + "0x33d", + "0x3e8", + "0x320" + ] + }, + { + "pc": 796, + "op": "PUSH2", + "gas": 1551145, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4", + "0x3e8", + "0x33d", + "0x3e8", + "0x320", + "0x3e8" + ] + }, + { + "pc": 799, + "op": "JUMP", + "gas": 1551142, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4", + "0x3e8", + "0x33d", + "0x3e8", + "0x320", + "0x3e8", + "0x30d" + ] + }, + { + "pc": 781, + "op": "JUMPDEST", + "gas": 1551134, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4", + "0x3e8", + "0x33d", + "0x3e8", + "0x320", + "0x3e8" + ] + }, + { + "pc": 782, + "op": "PUSH1", + "gas": 1551133, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4", + "0x3e8", + "0x33d", + "0x3e8", + "0x320", + "0x3e8" + ] + }, + { + "pc": 784, + "op": "DUP2", + "gas": 1551130, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4", + "0x3e8", + "0x33d", + "0x3e8", + "0x320", + "0x3e8", + "0x0" + ] + }, + { + "pc": 785, + "op": "SWAP1", + "gas": 1551127, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4", + "0x3e8", + "0x33d", + "0x3e8", + "0x320", + "0x3e8", + "0x0", + "0x3e8" + ] + }, + { + "pc": 786, + "op": "POP", + "gas": 1551124, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4", + "0x3e8", + "0x33d", + "0x3e8", + "0x320", + "0x3e8", + "0x3e8", + "0x0" + ] + }, + { + "pc": 787, + "op": "SWAP2", + "gas": 1551122, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4", + "0x3e8", + "0x33d", + "0x3e8", + "0x320", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 788, + "op": "SWAP1", + "gas": 1551119, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4", + "0x3e8", + "0x33d", + "0x3e8", + "0x3e8", + "0x3e8", + "0x320" + ] + }, + { + "pc": 789, + "op": "POP", + "gas": 1551116, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4", + "0x3e8", + "0x33d", + "0x3e8", + "0x3e8", + "0x320", + "0x3e8" + ] + }, + { + "pc": 790, + "op": "JUMP", + "gas": 1551114, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4", + "0x3e8", + "0x33d", + "0x3e8", + "0x3e8", + "0x320" + ] + }, + { + "pc": 800, + "op": "JUMPDEST", + "gas": 1551106, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4", + "0x3e8", + "0x33d", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 801, + "op": "DUP2", + "gas": 1551105, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4", + "0x3e8", + "0x33d", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 802, + "op": "EQ", + "gas": 1551102, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4", + "0x3e8", + "0x33d", + "0x3e8", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 803, + "op": "PUSH2", + "gas": 1551099, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4", + "0x3e8", + "0x33d", + "0x3e8", + "0x1" + ] + }, + { + "pc": 806, + "op": "JUMPI", + "gas": 1551096, + "gasCost": 10, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4", + "0x3e8", + "0x33d", + "0x3e8", + "0x1", + "0x32b" + ] + }, + { + "pc": 811, + "op": "JUMPDEST", + "gas": 1551086, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4", + "0x3e8", + "0x33d", + "0x3e8" + ] + }, + { + "pc": 812, + "op": "POP", + "gas": 1551085, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4", + "0x3e8", + "0x33d", + "0x3e8" + ] + }, + { + "pc": 813, + "op": "JUMP", + "gas": 1551083, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4", + "0x3e8", + "0x33d" + ] + }, + { + "pc": 829, + "op": "JUMPDEST", + "gas": 1551075, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4", + "0x3e8" + ] + }, + { + "pc": 830, + "op": "SWAP3", + "gas": 1551074, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x367", + "0x24", + "0x4", + "0x3e8" + ] + }, + { + "pc": 831, + "op": "SWAP2", + "gas": 1551071, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x3e8", + "0x24", + "0x4", + "0x367" + ] + }, + { + "pc": 832, + "op": "POP", + "gas": 1551068, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x3e8", + "0x367", + "0x4", + "0x24" + ] + }, + { + "pc": 833, + "op": "POP", + "gas": 1551066, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x3e8", + "0x367", + "0x4" + ] + }, + { + "pc": 834, + "op": "JUMP", + "gas": 1551064, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x3e8", + "0x367" + ] + }, + { + "pc": 871, + "op": "JUMPDEST", + "gas": 1551056, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x3e8" + ] + }, + { + "pc": 872, + "op": "SWAP2", + "gas": 1551055, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x0", + "0x0", + "0x3e8" + ] + }, + { + "pc": 873, + "op": "POP", + "gas": 1551052, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x3e8", + "0x0", + "0x0" + ] + }, + { + "pc": 874, + "op": "POP", + "gas": 1551050, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x3e8", + "0x0" + ] + }, + { + "pc": 875, + "op": "SWAP3", + "gas": 1551048, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0xd4", + "0x24", + "0x4", + "0x3e8" + ] + }, + { + "pc": 876, + "op": "SWAP2", + "gas": 1551045, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x24", + "0x4", + "0xd4" + ] + }, + { + "pc": 877, + "op": "POP", + "gas": 1551042, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0xd4", + "0x4", + "0x24" + ] + }, + { + "pc": 878, + "op": "POP", + "gas": 1551040, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0xd4", + "0x4" + ] + }, + { + "pc": 879, + "op": "JUMP", + "gas": 1551038, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0xd4" + ] + }, + { + "pc": 212, + "op": "JUMPDEST", + "gas": 1551030, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8" + ] + }, + { + "pc": 213, + "op": "PUSH2", + "gas": 1551029, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8" + ] + }, + { + "pc": 216, + "op": "JUMP", + "gas": 1551026, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x225" + ] + }, + { + "pc": 549, + "op": "JUMPDEST", + "gas": 1551018, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8" + ] + }, + { + "pc": 550, + "op": "PUSH1", + "gas": 1551017, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8" + ] + }, + { + "pc": 552, + "op": "CALLER", + "gas": 1551014, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0" + ] + }, + { + "pc": 553, + "op": "PUSH20", + "gas": 1551012, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address" + ] + }, + { + "pc": 574, + "op": "AND", + "gas": 1551009, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xffffffffffffffffffffffffffffffffffffffff" + ] + }, + { + "pc": 575, + "op": "PUSH32", + "gas": 1551006, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address" + ] + }, + { + "pc": 608, + "op": "DUP4", + "gas": 1551003, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0" + ] + }, + { + "pc": 609, + "op": "PUSH1", + "gas": 1551000, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x3e8" + ] + }, + { + "pc": 611, + "op": "MLOAD", + "gas": 1550997, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x3e8", + "0x40" + ] + }, + { + "pc": 612, + "op": "PUSH2", + "gas": 1550994, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x3e8", + "0x80" + ] + }, + { + "pc": 615, + "op": "SWAP2", + "gas": 1550991, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x3e8", + "0x80", + "0x26d" + ] + }, + { + "pc": 616, + "op": "SWAP1", + "gas": 1550988, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x80", + "0x3e8" + ] + }, + { + "pc": 617, + "op": "PUSH2", + "gas": 1550985, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80" + ] + }, + { + "pc": 620, + "op": "JUMP", + "gas": 1550982, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0x5ed" + ] + }, + { + "pc": 1517, + "op": "JUMPDEST", + "gas": 1550974, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80" + ] + }, + { + "pc": 1518, + "op": "PUSH1", + "gas": 1550973, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80" + ] + }, + { + "pc": 1520, + "op": "PUSH1", + "gas": 1550970, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0x0" + ] + }, + { + "pc": 1522, + "op": "DUP3", + "gas": 1550967, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0x0", + "0x40" + ] + }, + { + "pc": 1523, + "op": "ADD", + "gas": 1550964, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0x0", + "0x40", + "0x80" + ] + }, + { + "pc": 1524, + "op": "SWAP1", + "gas": 1550961, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0x0", + "0xc0" + ] + }, + { + "pc": 1525, + "op": "POP", + "gas": 1550958, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x0" + ] + }, + { + "pc": 1526, + "op": "PUSH2", + "gas": 1550956, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0" + ] + }, + { + "pc": 1529, + "op": "PUSH1", + "gas": 1550953, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x602" + ] + }, + { + "pc": 1531, + "op": "DUP4", + "gas": 1550950, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x602", + "0x0" + ] + }, + { + "pc": 1532, + "op": "ADD", + "gas": 1550947, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x602", + "0x0", + "0x80" + ] + }, + { + "pc": 1533, + "op": "DUP5", + "gas": 1550944, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x602", + "0x80" + ] + }, + { + "pc": 1534, + "op": "PUSH2", + "gas": 1550941, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x602", + "0x80", + "0x3e8" + ] + }, + { + "pc": 1537, + "op": "JUMP", + "gas": 1550938, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x602", + "0x80", + "0x3e8", + "0x370" + ] + }, + { + "pc": 880, + "op": "JUMPDEST", + "gas": 1550930, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x602", + "0x80", + "0x3e8" + ] + }, + { + "pc": 881, + "op": "PUSH2", + "gas": 1550929, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x602", + "0x80", + "0x3e8" + ] + }, + { + "pc": 884, + "op": "DUP2", + "gas": 1550926, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x602", + "0x80", + "0x3e8", + "0x379" + ] + }, + { + "pc": 885, + "op": "PUSH2", + "gas": 1550923, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x602", + "0x80", + "0x3e8", + "0x379", + "0x3e8" + ] + }, + { + "pc": 888, + "op": "JUMP", + "gas": 1550920, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x602", + "0x80", + "0x3e8", + "0x379", + "0x3e8", + "0x30d" + ] + }, + { + "pc": 781, + "op": "JUMPDEST", + "gas": 1550912, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x602", + "0x80", + "0x3e8", + "0x379", + "0x3e8" + ] + }, + { + "pc": 782, + "op": "PUSH1", + "gas": 1550911, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x602", + "0x80", + "0x3e8", + "0x379", + "0x3e8" + ] + }, + { + "pc": 784, + "op": "DUP2", + "gas": 1550908, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x602", + "0x80", + "0x3e8", + "0x379", + "0x3e8", + "0x0" + ] + }, + { + "pc": 785, + "op": "SWAP1", + "gas": 1550905, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x602", + "0x80", + "0x3e8", + "0x379", + "0x3e8", + "0x0", + "0x3e8" + ] + }, + { + "pc": 786, + "op": "POP", + "gas": 1550902, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x602", + "0x80", + "0x3e8", + "0x379", + "0x3e8", + "0x3e8", + "0x0" + ] + }, + { + "pc": 787, + "op": "SWAP2", + "gas": 1550900, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x602", + "0x80", + "0x3e8", + "0x379", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 788, + "op": "SWAP1", + "gas": 1550897, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x602", + "0x80", + "0x3e8", + "0x3e8", + "0x3e8", + "0x379" + ] + }, + { + "pc": 789, + "op": "POP", + "gas": 1550894, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x602", + "0x80", + "0x3e8", + "0x3e8", + "0x379", + "0x3e8" + ] + }, + { + "pc": 790, + "op": "JUMP", + "gas": 1550892, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x602", + "0x80", + "0x3e8", + "0x3e8", + "0x379" + ] + }, + { + "pc": 889, + "op": "JUMPDEST", + "gas": 1550884, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x602", + "0x80", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 890, + "op": "DUP3", + "gas": 1550883, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x602", + "0x80", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 891, + "op": "MSTORE", + "gas": 1550880, + "gasCost": 9, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x602", + "0x80", + "0x3e8", + "0x3e8", + "0x80" + ] + }, + { + "pc": 892, + "op": "POP", + "gas": 1550871, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x602", + "0x80", + "0x3e8" + ] + }, + { + "pc": 893, + "op": "POP", + "gas": 1550869, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x602", + "0x80" + ] + }, + { + "pc": 894, + "op": "JUMP", + "gas": 1550867, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x602" + ] + }, + { + "pc": 1538, + "op": "JUMPDEST", + "gas": 1550859, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0" + ] + }, + { + "pc": 1539, + "op": "DUP2", + "gas": 1550858, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0" + ] + }, + { + "pc": 1540, + "op": "DUP2", + "gas": 1550855, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x80" + ] + }, + { + "pc": 1541, + "op": "SUB", + "gas": 1550852, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x80", + "0xc0" + ] + }, + { + "pc": 1542, + "op": "PUSH1", + "gas": 1550849, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x40" + ] + }, + { + "pc": 1544, + "op": "DUP4", + "gas": 1550846, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x40", + "0x20" + ] + }, + { + "pc": 1545, + "op": "ADD", + "gas": 1550843, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x40", + "0x20", + "0x80" + ] + }, + { + "pc": 1546, + "op": "MSTORE", + "gas": 1550840, + "gasCost": 6, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x40", + "0xa0" + ] + }, + { + "pc": 1547, + "op": "PUSH2", + "gas": 1550834, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0" + ] + }, + { + "pc": 1550, + "op": "DUP2", + "gas": 1550831, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613" + ] + }, + { + "pc": 1551, + "op": "PUSH2", + "gas": 1550828, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xc0" + ] + }, + { + "pc": 1554, + "op": "JUMP", + "gas": 1550825, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xc0", + "0x5ca" + ] + }, + { + "pc": 1482, + "op": "JUMPDEST", + "gas": 1550817, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xc0" + ] + }, + { + "pc": 1483, + "op": "PUSH1", + "gas": 1550816, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xc0" + ] + }, + { + "pc": 1485, + "op": "PUSH2", + "gas": 1550813, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xc0", + "0x0" + ] + }, + { + "pc": 1488, + "op": "PUSH1", + "gas": 1550810, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xc0", + "0x0", + "0x5d7" + ] + }, + { + "pc": 1490, + "op": "DUP4", + "gas": 1550807, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xc0", + "0x0", + "0x5d7", + "0x5" + ] + }, + { + "pc": 1491, + "op": "PUSH2", + "gas": 1550804, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xc0", + "0x0", + "0x5d7", + "0x5", + "0xc0" + ] + }, + { + "pc": 1494, + "op": "JUMP", + "gas": 1550801, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xc0", + "0x0", + "0x5d7", + "0x5", + "0xc0", + "0x425" + ] + }, + { + "pc": 1061, + "op": "JUMPDEST", + "gas": 1550793, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xc0", + "0x0", + "0x5d7", + "0x5", + "0xc0" + ] + }, + { + "pc": 1062, + "op": "PUSH1", + "gas": 1550792, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xc0", + "0x0", + "0x5d7", + "0x5", + "0xc0" + ] + }, + { + "pc": 1064, + "op": "DUP3", + "gas": 1550789, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xc0", + "0x0", + "0x5d7", + "0x5", + "0xc0", + "0x0" + ] + }, + { + "pc": 1065, + "op": "DUP3", + "gas": 1550786, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xc0", + "0x0", + "0x5d7", + "0x5", + "0xc0", + "0x0", + "0x5" + ] + }, + { + "pc": 1066, + "op": "MSTORE", + "gas": 1550783, + "gasCost": 6, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xc0", + "0x0", + "0x5d7", + "0x5", + "0xc0", + "0x0", + "0x5", + "0xc0" + ] + }, + { + "pc": 1067, + "op": "PUSH1", + "gas": 1550777, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xc0", + "0x0", + "0x5d7", + "0x5", + "0xc0", + "0x0" + ] + }, + { + "pc": 1069, + "op": "DUP3", + "gas": 1550774, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xc0", + "0x0", + "0x5d7", + "0x5", + "0xc0", + "0x0", + "0x20" + ] + }, + { + "pc": 1070, + "op": "ADD", + "gas": 1550771, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xc0", + "0x0", + "0x5d7", + "0x5", + "0xc0", + "0x0", + "0x20", + "0xc0" + ] + }, + { + "pc": 1071, + "op": "SWAP1", + "gas": 1550768, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xc0", + "0x0", + "0x5d7", + "0x5", + "0xc0", + "0x0", + "0xe0" + ] + }, + { + "pc": 1072, + "op": "POP", + "gas": 1550765, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xc0", + "0x0", + "0x5d7", + "0x5", + "0xc0", + "0xe0", + "0x0" + ] + }, + { + "pc": 1073, + "op": "SWAP3", + "gas": 1550763, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xc0", + "0x0", + "0x5d7", + "0x5", + "0xc0", + "0xe0" + ] + }, + { + "pc": 1074, + "op": "SWAP2", + "gas": 1550760, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xc0", + "0x0", + "0xe0", + "0x5", + "0xc0", + "0x5d7" + ] + }, + { + "pc": 1075, + "op": "POP", + "gas": 1550757, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xc0", + "0x0", + "0xe0", + "0x5d7", + "0xc0", + "0x5" + ] + }, + { + "pc": 1076, + "op": "POP", + "gas": 1550755, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xc0", + "0x0", + "0xe0", + "0x5d7", + "0xc0" + ] + }, + { + "pc": 1077, + "op": "JUMP", + "gas": 1550753, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xc0", + "0x0", + "0xe0", + "0x5d7" + ] + }, + { + "pc": 1495, + "op": "JUMPDEST", + "gas": 1550745, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xc0", + "0x0", + "0xe0" + ] + }, + { + "pc": 1496, + "op": "SWAP2", + "gas": 1550744, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xc0", + "0x0", + "0xe0" + ] + }, + { + "pc": 1497, + "op": "POP", + "gas": 1550741, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xe0", + "0x0", + "0xc0" + ] + }, + { + "pc": 1498, + "op": "PUSH2", + "gas": 1550739, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xe0", + "0x0" + ] + }, + { + "pc": 1501, + "op": "DUP3", + "gas": 1550736, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xe0", + "0x0", + "0x5e2" + ] + }, + { + "pc": 1502, + "op": "PUSH2", + "gas": 1550733, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xe0", + "0x0", + "0x5e2", + "0xe0" + ] + }, + { + "pc": 1505, + "op": "JUMP", + "gas": 1550730, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xe0", + "0x0", + "0x5e2", + "0xe0", + "0x5a1" + ] + }, + { + "pc": 1441, + "op": "JUMPDEST", + "gas": 1550722, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xe0", + "0x0", + "0x5e2", + "0xe0" + ] + }, + { + "pc": 1442, + "op": "PUSH32", + "gas": 1550721, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xe0", + "0x0", + "0x5e2", + "0xe0" + ] + }, + { + "pc": 1475, + "op": "PUSH1", + "gas": 1550718, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xe0", + "0x0", + "0x5e2", + "0xe0", + "0x746f706963000000000000000000000000000000000000000000000000000000" + ] + }, + { + "pc": 1477, + "op": "DUP3", + "gas": 1550715, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xe0", + "0x0", + "0x5e2", + "0xe0", + "0x746f706963000000000000000000000000000000000000000000000000000000", + "0x0" + ] + }, + { + "pc": 1478, + "op": "ADD", + "gas": 1550712, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xe0", + "0x0", + "0x5e2", + "0xe0", + "0x746f706963000000000000000000000000000000000000000000000000000000", + "0x0", + "0xe0" + ] + }, + { + "pc": 1479, + "op": "MSTORE", + "gas": 1550709, + "gasCost": 6, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xe0", + "0x0", + "0x5e2", + "0xe0", + "0x746f706963000000000000000000000000000000000000000000000000000000", + "0xe0" + ] + }, + { + "pc": 1480, + "op": "POP", + "gas": 1550703, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xe0", + "0x0", + "0x5e2", + "0xe0" + ] + }, + { + "pc": 1481, + "op": "JUMP", + "gas": 1550701, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xe0", + "0x0", + "0x5e2" + ] + }, + { + "pc": 1506, + "op": "JUMPDEST", + "gas": 1550693, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xe0", + "0x0" + ] + }, + { + "pc": 1507, + "op": "PUSH1", + "gas": 1550692, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xe0", + "0x0" + ] + }, + { + "pc": 1509, + "op": "DUP3", + "gas": 1550689, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xe0", + "0x0", + "0x20" + ] + }, + { + "pc": 1510, + "op": "ADD", + "gas": 1550686, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xe0", + "0x0", + "0x20", + "0xe0" + ] + }, + { + "pc": 1511, + "op": "SWAP1", + "gas": 1550683, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xe0", + "0x0", + "0x100" + ] + }, + { + "pc": 1512, + "op": "POP", + "gas": 1550680, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xe0", + "0x100", + "0x0" + ] + }, + { + "pc": 1513, + "op": "SWAP2", + "gas": 1550678, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x613", + "0xe0", + "0x100" + ] + }, + { + "pc": 1514, + "op": "SWAP1", + "gas": 1550675, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x100", + "0xe0", + "0x613" + ] + }, + { + "pc": 1515, + "op": "POP", + "gas": 1550672, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x100", + "0x613", + "0xe0" + ] + }, + { + "pc": 1516, + "op": "JUMP", + "gas": 1550670, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x100", + "0x613" + ] + }, + { + "pc": 1555, + "op": "JUMPDEST", + "gas": 1550662, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x100" + ] + }, + { + "pc": 1556, + "op": "SWAP1", + "gas": 1550661, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0xc0", + "0x100" + ] + }, + { + "pc": 1557, + "op": "POP", + "gas": 1550658, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0x100", + "0xc0" + ] + }, + { + "pc": 1558, + "op": "SWAP3", + "gas": 1550656, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x26d", + "0x3e8", + "0x80", + "0x100" + ] + }, + { + "pc": 1559, + "op": "SWAP2", + "gas": 1550653, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x3e8", + "0x80", + "0x26d" + ] + }, + { + "pc": 1560, + "op": "POP", + "gas": 1550650, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x26d", + "0x80", + "0x3e8" + ] + }, + { + "pc": 1561, + "op": "POP", + "gas": 1550648, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x26d", + "0x80" + ] + }, + { + "pc": 1562, + "op": "JUMP", + "gas": 1550646, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x26d" + ] + }, + { + "pc": 621, + "op": "JUMPDEST", + "gas": 1550638, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100" + ] + }, + { + "pc": 622, + "op": "PUSH1", + "gas": 1550637, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100" + ] + }, + { + "pc": 624, + "op": "MLOAD", + "gas": 1550634, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x40" + ] + }, + { + "pc": 625, + "op": "DUP1", + "gas": 1550631, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x80" + ] + }, + { + "pc": 626, + "op": "SWAP2", + "gas": 1550628, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x80", + "0x80" + ] + }, + { + "pc": 627, + "op": "SUB", + "gas": 1550625, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x80", + "0x80", + "0x100" + ] + }, + { + "pc": 628, + "op": "SWAP1", + "gas": 1550622, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x80", + "0x80" + ] + }, + { + "pc": 629, + "op": "LOG2", + "gas": 1550619, + "gasCost": 2149, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x80", + "0x80" + ] + }, + { + "pc": 630, + "op": "DUP2", + "gas": 1548470, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0" + ] + }, + { + "pc": 631, + "op": "PUSH1", + "gas": 1548467, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8" + ] + }, + { + "pc": 633, + "op": "DUP1", + "gas": 1548464, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0" + ] + }, + { + "pc": 634, + "op": "DUP3", + "gas": 1548461, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0" + ] + }, + { + "pc": 635, + "op": "DUP3", + "gas": 1548458, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x3e8" + ] + }, + { + "pc": 636, + "op": "SLOAD", + "gas": 1548455, + "gasCost": 100, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x3e8", + "0x0" + ], + "storage": { + "0000000000000000000000000000000000000000000000000000000000000000": "0000000000000000000000000000001d6329f1c35ca4bfabb9f5610000000000", + "0000000000000000000000000000000000000000000000000000000000000001": "0000000000000000000000000000000000000000000000000000000000000001", + "0000000000000000000000000000000000000000000000000000000000000002": "0000000000000000000000000000001d6329f1c35ca4bfabb9f5610000000001" + } + }, + { + "pc": 637, + "op": "PUSH2", + "gas": 1548355, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 640, + "op": "SWAP2", + "gas": 1548352, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x286" + ] + }, + { + "pc": 641, + "op": "SWAP1", + "gas": 1548349, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x3e8" + ] + }, + { + "pc": 642, + "op": "PUSH2", + "gas": 1548346, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 645, + "op": "JUMP", + "gas": 1548343, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x4df" + ] + }, + { + "pc": 1247, + "op": "JUMPDEST", + "gas": 1548335, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 1248, + "op": "PUSH1", + "gas": 1548334, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 1250, + "op": "PUSH2", + "gas": 1548331, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0" + ] + }, + { + "pc": 1253, + "op": "DUP3", + "gas": 1548328, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x4ea" + ] + }, + { + "pc": 1254, + "op": "PUSH2", + "gas": 1548325, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x4ea", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 1257, + "op": "JUMP", + "gas": 1548322, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x4ea", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x30d" + ] + }, + { + "pc": 781, + "op": "JUMPDEST", + "gas": 1548314, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x4ea", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 782, + "op": "PUSH1", + "gas": 1548313, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x4ea", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 784, + "op": "DUP2", + "gas": 1548310, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x4ea", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0" + ] + }, + { + "pc": 785, + "op": "SWAP1", + "gas": 1548307, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x4ea", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 786, + "op": "POP", + "gas": 1548304, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x4ea", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0" + ] + }, + { + "pc": 787, + "op": "SWAP2", + "gas": 1548302, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x4ea", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 788, + "op": "SWAP1", + "gas": 1548299, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x4ea" + ] + }, + { + "pc": 789, + "op": "POP", + "gas": 1548296, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x4ea", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 790, + "op": "JUMP", + "gas": 1548294, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x4ea" + ] + }, + { + "pc": 1258, + "op": "JUMPDEST", + "gas": 1548286, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 1259, + "op": "SWAP2", + "gas": 1548285, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 1260, + "op": "POP", + "gas": 1548282, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 1261, + "op": "PUSH2", + "gas": 1548280, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0" + ] + }, + { + "pc": 1264, + "op": "DUP4", + "gas": 1548277, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x4f5" + ] + }, + { + "pc": 1265, + "op": "PUSH2", + "gas": 1548274, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x4f5", + "0x3e8" + ] + }, + { + "pc": 1268, + "op": "JUMP", + "gas": 1548271, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x4f5", + "0x3e8", + "0x30d" + ] + }, + { + "pc": 781, + "op": "JUMPDEST", + "gas": 1548263, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x4f5", + "0x3e8" + ] + }, + { + "pc": 782, + "op": "PUSH1", + "gas": 1548262, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x4f5", + "0x3e8" + ] + }, + { + "pc": 784, + "op": "DUP2", + "gas": 1548259, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x4f5", + "0x3e8", + "0x0" + ] + }, + { + "pc": 785, + "op": "SWAP1", + "gas": 1548256, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x4f5", + "0x3e8", + "0x0", + "0x3e8" + ] + }, + { + "pc": 786, + "op": "POP", + "gas": 1548253, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x4f5", + "0x3e8", + "0x3e8", + "0x0" + ] + }, + { + "pc": 787, + "op": "SWAP2", + "gas": 1548251, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x4f5", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 788, + "op": "SWAP1", + "gas": 1548248, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x3e8", + "0x3e8", + "0x4f5" + ] + }, + { + "pc": 789, + "op": "POP", + "gas": 1548245, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x3e8", + "0x4f5", + "0x3e8" + ] + }, + { + "pc": 790, + "op": "JUMP", + "gas": 1548243, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x3e8", + "0x4f5" + ] + }, + { + "pc": 1269, + "op": "JUMPDEST", + "gas": 1548235, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x3e8" + ] + }, + { + "pc": 1270, + "op": "SWAP3", + "gas": 1548234, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x3e8" + ] + }, + { + "pc": 1271, + "op": "POP", + "gas": 1548231, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x3e8" + ] + }, + { + "pc": 1272, + "op": "DUP3", + "gas": 1548229, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0" + ] + }, + { + "pc": 1273, + "op": "PUSH32", + "gas": 1548226, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x3e8" + ] + }, + { + "pc": 1306, + "op": "SUB", + "gas": 1548223, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x3e8", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + ] + }, + { + "pc": 1307, + "op": "DUP3", + "gas": 1548220, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc17" + ] + }, + { + "pc": 1308, + "op": "GT", + "gas": 1548217, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc17", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 1309, + "op": "ISZERO", + "gas": 1548214, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x0" + ] + }, + { + "pc": 1310, + "op": "PUSH2", + "gas": 1548211, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1" + ] + }, + { + "pc": 1313, + "op": "JUMPI", + "gas": 1548208, + "gasCost": 10, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1", + "0x52a" + ] + }, + { + "pc": 1322, + "op": "JUMPDEST", + "gas": 1548198, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0" + ] + }, + { + "pc": 1323, + "op": "DUP3", + "gas": 1548197, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0" + ] + }, + { + "pc": 1324, + "op": "DUP3", + "gas": 1548194, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x3e8" + ] + }, + { + "pc": 1325, + "op": "ADD", + "gas": 1548191, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 1326, + "op": "SWAP1", + "gas": 1548188, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x0", + "0x1d6329f1c35ca4bfabb9f56100000003e8" + ] + }, + { + "pc": 1327, + "op": "POP", + "gas": 1548185, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x1d6329f1c35ca4bfabb9f56100000003e8", + "0x0" + ] + }, + { + "pc": 1328, + "op": "SWAP3", + "gas": 1548183, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x286", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x1d6329f1c35ca4bfabb9f56100000003e8" + ] + }, + { + "pc": 1329, + "op": "SWAP2", + "gas": 1548180, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f56100000003e8", + "0x3e8", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x286" + ] + }, + { + "pc": 1330, + "op": "POP", + "gas": 1548177, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f56100000003e8", + "0x286", + "0x1d6329f1c35ca4bfabb9f5610000000000", + "0x3e8" + ] + }, + { + "pc": 1331, + "op": "POP", + "gas": 1548175, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f56100000003e8", + "0x286", + "0x1d6329f1c35ca4bfabb9f5610000000000" + ] + }, + { + "pc": 1332, + "op": "JUMP", + "gas": 1548173, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f56100000003e8", + "0x286" + ] + }, + { + "pc": 646, + "op": "JUMPDEST", + "gas": 1548165, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f56100000003e8" + ] + }, + { + "pc": 647, + "op": "SWAP3", + "gas": 1548164, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x3e8", + "0x0", + "0x0", + "0x1d6329f1c35ca4bfabb9f56100000003e8" + ] + }, + { + "pc": 648, + "op": "POP", + "gas": 1548161, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x1d6329f1c35ca4bfabb9f56100000003e8", + "0x0", + "0x0", + "0x3e8" + ] + }, + { + "pc": 649, + "op": "POP", + "gas": 1548159, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x1d6329f1c35ca4bfabb9f56100000003e8", + "0x0", + "0x0" + ] + }, + { + "pc": 650, + "op": "DUP2", + "gas": 1548157, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x1d6329f1c35ca4bfabb9f56100000003e8", + "0x0" + ] + }, + { + "pc": 651, + "op": "SWAP1", + "gas": 1548154, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x1d6329f1c35ca4bfabb9f56100000003e8", + "0x0", + "0x1d6329f1c35ca4bfabb9f56100000003e8" + ] + }, + { + "pc": 652, + "op": "SSTORE", + "gas": 1548151, + "gasCost": 100, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x1d6329f1c35ca4bfabb9f56100000003e8", + "0x1d6329f1c35ca4bfabb9f56100000003e8", + "0x0" + ], + "storage": { + "0000000000000000000000000000000000000000000000000000000000000000": "0000000000000000000000000000001d6329f1c35ca4bfabb9f56100000003e8", + "0000000000000000000000000000000000000000000000000000000000000001": "0000000000000000000000000000000000000000000000000000000000000001", + "0000000000000000000000000000000000000000000000000000000000000002": "0000000000000000000000000000001d6329f1c35ca4bfabb9f5610000000001" + } + }, + { + "pc": 653, + "op": "POP", + "gas": 1548051, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x1d6329f1c35ca4bfabb9f56100000003e8" + ] + }, + { + "pc": 654, + "op": "PUSH2", + "gas": 1548049, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0" + ] + }, + { + "pc": 657, + "op": "PUSH1", + "gas": 1548046, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2" + ] + }, + { + "pc": 659, + "op": "DUP4", + "gas": 1548043, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x1" + ] + }, + { + "pc": 660, + "op": "PUSH2", + "gas": 1548040, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x1", + "0x3e8" + ] + }, + { + "pc": 663, + "op": "SWAP2", + "gas": 1548037, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x1", + "0x3e8", + "0x29d" + ] + }, + { + "pc": 664, + "op": "SWAP1", + "gas": 1548034, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x3e8", + "0x1" + ] + }, + { + "pc": 665, + "op": "PUSH2", + "gas": 1548031, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8" + ] + }, + { + "pc": 668, + "op": "JUMP", + "gas": 1548028, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x4df" + ] + }, + { + "pc": 1247, + "op": "JUMPDEST", + "gas": 1548020, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8" + ] + }, + { + "pc": 1248, + "op": "PUSH1", + "gas": 1548019, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8" + ] + }, + { + "pc": 1250, + "op": "PUSH2", + "gas": 1548016, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0" + ] + }, + { + "pc": 1253, + "op": "DUP3", + "gas": 1548013, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x4ea" + ] + }, + { + "pc": 1254, + "op": "PUSH2", + "gas": 1548010, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x4ea", + "0x3e8" + ] + }, + { + "pc": 1257, + "op": "JUMP", + "gas": 1548007, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x4ea", + "0x3e8", + "0x30d" + ] + }, + { + "pc": 781, + "op": "JUMPDEST", + "gas": 1547999, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x4ea", + "0x3e8" + ] + }, + { + "pc": 782, + "op": "PUSH1", + "gas": 1547998, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x4ea", + "0x3e8" + ] + }, + { + "pc": 784, + "op": "DUP2", + "gas": 1547995, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x4ea", + "0x3e8", + "0x0" + ] + }, + { + "pc": 785, + "op": "SWAP1", + "gas": 1547992, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x4ea", + "0x3e8", + "0x0", + "0x3e8" + ] + }, + { + "pc": 786, + "op": "POP", + "gas": 1547989, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x4ea", + "0x3e8", + "0x3e8", + "0x0" + ] + }, + { + "pc": 787, + "op": "SWAP2", + "gas": 1547987, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x4ea", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 788, + "op": "SWAP1", + "gas": 1547984, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x3e8", + "0x3e8", + "0x4ea" + ] + }, + { + "pc": 789, + "op": "POP", + "gas": 1547981, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x3e8", + "0x4ea", + "0x3e8" + ] + }, + { + "pc": 790, + "op": "JUMP", + "gas": 1547979, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x3e8", + "0x4ea" + ] + }, + { + "pc": 1258, + "op": "JUMPDEST", + "gas": 1547971, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x3e8" + ] + }, + { + "pc": 1259, + "op": "SWAP2", + "gas": 1547970, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x3e8" + ] + }, + { + "pc": 1260, + "op": "POP", + "gas": 1547967, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x3e8" + ] + }, + { + "pc": 1261, + "op": "PUSH2", + "gas": 1547965, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0" + ] + }, + { + "pc": 1264, + "op": "DUP4", + "gas": 1547962, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x4f5" + ] + }, + { + "pc": 1265, + "op": "PUSH2", + "gas": 1547959, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x4f5", + "0x1" + ] + }, + { + "pc": 1268, + "op": "JUMP", + "gas": 1547956, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x4f5", + "0x1", + "0x30d" + ] + }, + { + "pc": 781, + "op": "JUMPDEST", + "gas": 1547948, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x4f5", + "0x1" + ] + }, + { + "pc": 782, + "op": "PUSH1", + "gas": 1547947, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x4f5", + "0x1" + ] + }, + { + "pc": 784, + "op": "DUP2", + "gas": 1547944, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x4f5", + "0x1", + "0x0" + ] + }, + { + "pc": 785, + "op": "SWAP1", + "gas": 1547941, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x4f5", + "0x1", + "0x0", + "0x1" + ] + }, + { + "pc": 786, + "op": "POP", + "gas": 1547938, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x4f5", + "0x1", + "0x1", + "0x0" + ] + }, + { + "pc": 787, + "op": "SWAP2", + "gas": 1547936, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x4f5", + "0x1", + "0x1" + ] + }, + { + "pc": 788, + "op": "SWAP1", + "gas": 1547933, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x1", + "0x1", + "0x4f5" + ] + }, + { + "pc": 789, + "op": "POP", + "gas": 1547930, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x1", + "0x4f5", + "0x1" + ] + }, + { + "pc": 790, + "op": "JUMP", + "gas": 1547928, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x1", + "0x4f5" + ] + }, + { + "pc": 1269, + "op": "JUMPDEST", + "gas": 1547920, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x1" + ] + }, + { + "pc": 1270, + "op": "SWAP3", + "gas": 1547919, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x1" + ] + }, + { + "pc": 1271, + "op": "POP", + "gas": 1547916, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x1" + ] + }, + { + "pc": 1272, + "op": "DUP3", + "gas": 1547914, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0" + ] + }, + { + "pc": 1273, + "op": "PUSH32", + "gas": 1547911, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x1" + ] + }, + { + "pc": 1306, + "op": "SUB", + "gas": 1547908, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x1", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + ] + }, + { + "pc": 1307, + "op": "DUP3", + "gas": 1547905, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe" + ] + }, + { + "pc": 1308, + "op": "GT", + "gas": 1547902, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe", + "0x3e8" + ] + }, + { + "pc": 1309, + "op": "ISZERO", + "gas": 1547899, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x0" + ] + }, + { + "pc": 1310, + "op": "PUSH2", + "gas": 1547896, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x1" + ] + }, + { + "pc": 1313, + "op": "JUMPI", + "gas": 1547893, + "gasCost": 10, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x1", + "0x52a" + ] + }, + { + "pc": 1322, + "op": "JUMPDEST", + "gas": 1547883, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0" + ] + }, + { + "pc": 1323, + "op": "DUP3", + "gas": 1547882, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0" + ] + }, + { + "pc": 1324, + "op": "DUP3", + "gas": 1547879, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x1" + ] + }, + { + "pc": 1325, + "op": "ADD", + "gas": 1547876, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x1", + "0x3e8" + ] + }, + { + "pc": 1326, + "op": "SWAP1", + "gas": 1547873, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x0", + "0x3e9" + ] + }, + { + "pc": 1327, + "op": "POP", + "gas": 1547870, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x3e9", + "0x0" + ] + }, + { + "pc": 1328, + "op": "SWAP3", + "gas": 1547868, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x29d", + "0x1", + "0x3e8", + "0x3e9" + ] + }, + { + "pc": 1329, + "op": "SWAP2", + "gas": 1547865, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x1", + "0x3e8", + "0x29d" + ] + }, + { + "pc": 1330, + "op": "POP", + "gas": 1547862, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x29d", + "0x3e8", + "0x1" + ] + }, + { + "pc": 1331, + "op": "POP", + "gas": 1547860, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x29d", + "0x3e8" + ] + }, + { + "pc": 1332, + "op": "JUMP", + "gas": 1547858, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x29d" + ] + }, + { + "pc": 669, + "op": "JUMPDEST", + "gas": 1547850, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9" + ] + }, + { + "pc": 670, + "op": "PUSH2", + "gas": 1547849, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9" + ] + }, + { + "pc": 673, + "op": "JUMP", + "gas": 1547846, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x178" + ] + }, + { + "pc": 376, + "op": "JUMPDEST", + "gas": 1547838, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9" + ] + }, + { + "pc": 377, + "op": "PUSH1", + "gas": 1547837, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9" + ] + }, + { + "pc": 379, + "op": "CALLER", + "gas": 1547834, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0" + ] + }, + { + "pc": 380, + "op": "PUSH20", + "gas": 1547832, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address" + ] + }, + { + "pc": 401, + "op": "AND", + "gas": 1547829, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xffffffffffffffffffffffffffffffffffffffff" + ] + }, + { + "pc": 402, + "op": "PUSH32", + "gas": 1547826, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address" + ] + }, + { + "pc": 435, + "op": "DUP4", + "gas": 1547823, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0" + ] + }, + { + "pc": 436, + "op": "PUSH1", + "gas": 1547820, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x3e9" + ] + }, + { + "pc": 438, + "op": "MLOAD", + "gas": 1547817, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x3e9", + "0x40" + ] + }, + { + "pc": 439, + "op": "PUSH2", + "gas": 1547814, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x3e9", + "0x80" + ] + }, + { + "pc": 442, + "op": "SWAP2", + "gas": 1547811, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x3e9", + "0x80", + "0x1c0" + ] + }, + { + "pc": 443, + "op": "SWAP1", + "gas": 1547808, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x80", + "0x3e9" + ] + }, + { + "pc": 444, + "op": "PUSH2", + "gas": 1547805, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80" + ] + }, + { + "pc": 447, + "op": "JUMP", + "gas": 1547802, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0x482" + ] + }, + { + "pc": 1154, + "op": "JUMPDEST", + "gas": 1547794, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80" + ] + }, + { + "pc": 1155, + "op": "PUSH1", + "gas": 1547793, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80" + ] + }, + { + "pc": 1157, + "op": "PUSH1", + "gas": 1547790, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0x0" + ] + }, + { + "pc": 1159, + "op": "DUP3", + "gas": 1547787, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0x0", + "0x40" + ] + }, + { + "pc": 1160, + "op": "ADD", + "gas": 1547784, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0x0", + "0x40", + "0x80" + ] + }, + { + "pc": 1161, + "op": "SWAP1", + "gas": 1547781, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0x0", + "0xc0" + ] + }, + { + "pc": 1162, + "op": "POP", + "gas": 1547778, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x0" + ] + }, + { + "pc": 1163, + "op": "PUSH2", + "gas": 1547776, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0" + ] + }, + { + "pc": 1166, + "op": "PUSH1", + "gas": 1547773, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x497" + ] + }, + { + "pc": 1168, + "op": "DUP4", + "gas": 1547770, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x497", + "0x0" + ] + }, + { + "pc": 1169, + "op": "ADD", + "gas": 1547767, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x497", + "0x0", + "0x80" + ] + }, + { + "pc": 1170, + "op": "DUP5", + "gas": 1547764, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x497", + "0x80" + ] + }, + { + "pc": 1171, + "op": "PUSH2", + "gas": 1547761, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x497", + "0x80", + "0x3e9" + ] + }, + { + "pc": 1174, + "op": "JUMP", + "gas": 1547758, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x497", + "0x80", + "0x3e9", + "0x370" + ] + }, + { + "pc": 880, + "op": "JUMPDEST", + "gas": 1547750, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x497", + "0x80", + "0x3e9" + ] + }, + { + "pc": 881, + "op": "PUSH2", + "gas": 1547749, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x497", + "0x80", + "0x3e9" + ] + }, + { + "pc": 884, + "op": "DUP2", + "gas": 1547746, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x497", + "0x80", + "0x3e9", + "0x379" + ] + }, + { + "pc": 885, + "op": "PUSH2", + "gas": 1547743, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x497", + "0x80", + "0x3e9", + "0x379", + "0x3e9" + ] + }, + { + "pc": 888, + "op": "JUMP", + "gas": 1547740, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x497", + "0x80", + "0x3e9", + "0x379", + "0x3e9", + "0x30d" + ] + }, + { + "pc": 781, + "op": "JUMPDEST", + "gas": 1547732, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x497", + "0x80", + "0x3e9", + "0x379", + "0x3e9" + ] + }, + { + "pc": 782, + "op": "PUSH1", + "gas": 1547731, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x497", + "0x80", + "0x3e9", + "0x379", + "0x3e9" + ] + }, + { + "pc": 784, + "op": "DUP2", + "gas": 1547728, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x497", + "0x80", + "0x3e9", + "0x379", + "0x3e9", + "0x0" + ] + }, + { + "pc": 785, + "op": "SWAP1", + "gas": 1547725, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x497", + "0x80", + "0x3e9", + "0x379", + "0x3e9", + "0x0", + "0x3e9" + ] + }, + { + "pc": 786, + "op": "POP", + "gas": 1547722, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x497", + "0x80", + "0x3e9", + "0x379", + "0x3e9", + "0x3e9", + "0x0" + ] + }, + { + "pc": 787, + "op": "SWAP2", + "gas": 1547720, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x497", + "0x80", + "0x3e9", + "0x379", + "0x3e9", + "0x3e9" + ] + }, + { + "pc": 788, + "op": "SWAP1", + "gas": 1547717, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x497", + "0x80", + "0x3e9", + "0x3e9", + "0x3e9", + "0x379" + ] + }, + { + "pc": 789, + "op": "POP", + "gas": 1547714, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x497", + "0x80", + "0x3e9", + "0x3e9", + "0x379", + "0x3e9" + ] + }, + { + "pc": 790, + "op": "JUMP", + "gas": 1547712, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x497", + "0x80", + "0x3e9", + "0x3e9", + "0x379" + ] + }, + { + "pc": 889, + "op": "JUMPDEST", + "gas": 1547704, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x497", + "0x80", + "0x3e9", + "0x3e9" + ] + }, + { + "pc": 890, + "op": "DUP3", + "gas": 1547703, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x497", + "0x80", + "0x3e9", + "0x3e9" + ] + }, + { + "pc": 891, + "op": "MSTORE", + "gas": 1547700, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x497", + "0x80", + "0x3e9", + "0x3e9", + "0x80" + ] + }, + { + "pc": 892, + "op": "POP", + "gas": 1547697, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x497", + "0x80", + "0x3e9" + ] + }, + { + "pc": 893, + "op": "POP", + "gas": 1547695, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x497", + "0x80" + ] + }, + { + "pc": 894, + "op": "JUMP", + "gas": 1547693, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x497" + ] + }, + { + "pc": 1175, + "op": "JUMPDEST", + "gas": 1547685, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0" + ] + }, + { + "pc": 1176, + "op": "DUP2", + "gas": 1547684, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0" + ] + }, + { + "pc": 1177, + "op": "DUP2", + "gas": 1547681, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x80" + ] + }, + { + "pc": 1178, + "op": "SUB", + "gas": 1547678, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x80", + "0xc0" + ] + }, + { + "pc": 1179, + "op": "PUSH1", + "gas": 1547675, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x40" + ] + }, + { + "pc": 1181, + "op": "DUP4", + "gas": 1547672, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x40", + "0x20" + ] + }, + { + "pc": 1182, + "op": "ADD", + "gas": 1547669, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x40", + "0x20", + "0x80" + ] + }, + { + "pc": 1183, + "op": "MSTORE", + "gas": 1547666, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x40", + "0xa0" + ] + }, + { + "pc": 1184, + "op": "PUSH2", + "gas": 1547663, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0" + ] + }, + { + "pc": 1187, + "op": "DUP2", + "gas": 1547660, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8" + ] + }, + { + "pc": 1188, + "op": "PUSH2", + "gas": 1547657, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xc0" + ] + }, + { + "pc": 1191, + "op": "JUMP", + "gas": 1547654, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xc0", + "0x45f" + ] + }, + { + "pc": 1119, + "op": "JUMPDEST", + "gas": 1547646, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xc0" + ] + }, + { + "pc": 1120, + "op": "PUSH1", + "gas": 1547645, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xc0" + ] + }, + { + "pc": 1122, + "op": "PUSH2", + "gas": 1547642, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xc0", + "0x0" + ] + }, + { + "pc": 1125, + "op": "PUSH1", + "gas": 1547639, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xc0", + "0x0", + "0x46c" + ] + }, + { + "pc": 1127, + "op": "DUP4", + "gas": 1547636, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xc0", + "0x0", + "0x46c", + "0xe" + ] + }, + { + "pc": 1128, + "op": "PUSH2", + "gas": 1547633, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xc0", + "0x0", + "0x46c", + "0xe", + "0xc0" + ] + }, + { + "pc": 1131, + "op": "JUMP", + "gas": 1547630, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xc0", + "0x0", + "0x46c", + "0xe", + "0xc0", + "0x425" + ] + }, + { + "pc": 1061, + "op": "JUMPDEST", + "gas": 1547622, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xc0", + "0x0", + "0x46c", + "0xe", + "0xc0" + ] + }, + { + "pc": 1062, + "op": "PUSH1", + "gas": 1547621, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xc0", + "0x0", + "0x46c", + "0xe", + "0xc0" + ] + }, + { + "pc": 1064, + "op": "DUP3", + "gas": 1547618, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xc0", + "0x0", + "0x46c", + "0xe", + "0xc0", + "0x0" + ] + }, + { + "pc": 1065, + "op": "DUP3", + "gas": 1547615, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xc0", + "0x0", + "0x46c", + "0xe", + "0xc0", + "0x0", + "0xe" + ] + }, + { + "pc": 1066, + "op": "MSTORE", + "gas": 1547612, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xc0", + "0x0", + "0x46c", + "0xe", + "0xc0", + "0x0", + "0xe", + "0xc0" + ] + }, + { + "pc": 1067, + "op": "PUSH1", + "gas": 1547609, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xc0", + "0x0", + "0x46c", + "0xe", + "0xc0", + "0x0" + ] + }, + { + "pc": 1069, + "op": "DUP3", + "gas": 1547606, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xc0", + "0x0", + "0x46c", + "0xe", + "0xc0", + "0x0", + "0x20" + ] + }, + { + "pc": 1070, + "op": "ADD", + "gas": 1547603, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xc0", + "0x0", + "0x46c", + "0xe", + "0xc0", + "0x0", + "0x20", + "0xc0" + ] + }, + { + "pc": 1071, + "op": "SWAP1", + "gas": 1547600, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xc0", + "0x0", + "0x46c", + "0xe", + "0xc0", + "0x0", + "0xe0" + ] + }, + { + "pc": 1072, + "op": "POP", + "gas": 1547597, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xc0", + "0x0", + "0x46c", + "0xe", + "0xc0", + "0xe0", + "0x0" + ] + }, + { + "pc": 1073, + "op": "SWAP3", + "gas": 1547595, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xc0", + "0x0", + "0x46c", + "0xe", + "0xc0", + "0xe0" + ] + }, + { + "pc": 1074, + "op": "SWAP2", + "gas": 1547592, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xc0", + "0x0", + "0xe0", + "0xe", + "0xc0", + "0x46c" + ] + }, + { + "pc": 1075, + "op": "POP", + "gas": 1547589, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xc0", + "0x0", + "0xe0", + "0x46c", + "0xc0", + "0xe" + ] + }, + { + "pc": 1076, + "op": "POP", + "gas": 1547587, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xc0", + "0x0", + "0xe0", + "0x46c", + "0xc0" + ] + }, + { + "pc": 1077, + "op": "JUMP", + "gas": 1547585, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xc0", + "0x0", + "0xe0", + "0x46c" + ] + }, + { + "pc": 1132, + "op": "JUMPDEST", + "gas": 1547577, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xc0", + "0x0", + "0xe0" + ] + }, + { + "pc": 1133, + "op": "SWAP2", + "gas": 1547576, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xc0", + "0x0", + "0xe0" + ] + }, + { + "pc": 1134, + "op": "POP", + "gas": 1547573, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xe0", + "0x0", + "0xc0" + ] + }, + { + "pc": 1135, + "op": "PUSH2", + "gas": 1547571, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xe0", + "0x0" + ] + }, + { + "pc": 1138, + "op": "DUP3", + "gas": 1547568, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xe0", + "0x0", + "0x477" + ] + }, + { + "pc": 1139, + "op": "PUSH2", + "gas": 1547565, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xe0", + "0x0", + "0x477", + "0xe0" + ] + }, + { + "pc": 1142, + "op": "JUMP", + "gas": 1547562, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xe0", + "0x0", + "0x477", + "0xe0", + "0x436" + ] + }, + { + "pc": 1078, + "op": "JUMPDEST", + "gas": 1547554, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xe0", + "0x0", + "0x477", + "0xe0" + ] + }, + { + "pc": 1079, + "op": "PUSH32", + "gas": 1547553, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xe0", + "0x0", + "0x477", + "0xe0" + ] + }, + { + "pc": 1112, + "op": "PUSH1", + "gas": 1547550, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xe0", + "0x0", + "0x477", + "0xe0", + "0x696e7465726e616c20746f706963000000000000000000000000000000000000" + ] + }, + { + "pc": 1114, + "op": "DUP3", + "gas": 1547547, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xe0", + "0x0", + "0x477", + "0xe0", + "0x696e7465726e616c20746f706963000000000000000000000000000000000000", + "0x0" + ] + }, + { + "pc": 1115, + "op": "ADD", + "gas": 1547544, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xe0", + "0x0", + "0x477", + "0xe0", + "0x696e7465726e616c20746f706963000000000000000000000000000000000000", + "0x0", + "0xe0" + ] + }, + { + "pc": 1116, + "op": "MSTORE", + "gas": 1547541, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xe0", + "0x0", + "0x477", + "0xe0", + "0x696e7465726e616c20746f706963000000000000000000000000000000000000", + "0xe0" + ] + }, + { + "pc": 1117, + "op": "POP", + "gas": 1547538, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xe0", + "0x0", + "0x477", + "0xe0" + ] + }, + { + "pc": 1118, + "op": "JUMP", + "gas": 1547536, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xe0", + "0x0", + "0x477" + ] + }, + { + "pc": 1143, + "op": "JUMPDEST", + "gas": 1547528, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xe0", + "0x0" + ] + }, + { + "pc": 1144, + "op": "PUSH1", + "gas": 1547527, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xe0", + "0x0" + ] + }, + { + "pc": 1146, + "op": "DUP3", + "gas": 1547524, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xe0", + "0x0", + "0x20" + ] + }, + { + "pc": 1147, + "op": "ADD", + "gas": 1547521, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xe0", + "0x0", + "0x20", + "0xe0" + ] + }, + { + "pc": 1148, + "op": "SWAP1", + "gas": 1547518, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xe0", + "0x0", + "0x100" + ] + }, + { + "pc": 1149, + "op": "POP", + "gas": 1547515, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xe0", + "0x100", + "0x0" + ] + }, + { + "pc": 1150, + "op": "SWAP2", + "gas": 1547513, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x4a8", + "0xe0", + "0x100" + ] + }, + { + "pc": 1151, + "op": "SWAP1", + "gas": 1547510, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x100", + "0xe0", + "0x4a8" + ] + }, + { + "pc": 1152, + "op": "POP", + "gas": 1547507, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x100", + "0x4a8", + "0xe0" + ] + }, + { + "pc": 1153, + "op": "JUMP", + "gas": 1547505, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x100", + "0x4a8" + ] + }, + { + "pc": 1192, + "op": "JUMPDEST", + "gas": 1547497, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x100" + ] + }, + { + "pc": 1193, + "op": "SWAP1", + "gas": 1547496, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0xc0", + "0x100" + ] + }, + { + "pc": 1194, + "op": "POP", + "gas": 1547493, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0x100", + "0xc0" + ] + }, + { + "pc": 1195, + "op": "SWAP3", + "gas": 1547491, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x1c0", + "0x3e9", + "0x80", + "0x100" + ] + }, + { + "pc": 1196, + "op": "SWAP2", + "gas": 1547488, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x3e9", + "0x80", + "0x1c0" + ] + }, + { + "pc": 1197, + "op": "POP", + "gas": 1547485, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x1c0", + "0x80", + "0x3e9" + ] + }, + { + "pc": 1198, + "op": "POP", + "gas": 1547483, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x1c0", + "0x80" + ] + }, + { + "pc": 1199, + "op": "JUMP", + "gas": 1547481, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x1c0" + ] + }, + { + "pc": 448, + "op": "JUMPDEST", + "gas": 1547473, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100" + ] + }, + { + "pc": 449, + "op": "PUSH1", + "gas": 1547472, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100" + ] + }, + { + "pc": 451, + "op": "MLOAD", + "gas": 1547469, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x40" + ] + }, + { + "pc": 452, + "op": "DUP1", + "gas": 1547466, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x80" + ] + }, + { + "pc": 453, + "op": "SWAP2", + "gas": 1547463, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x100", + "0x80", + "0x80" + ] + }, + { + "pc": 454, + "op": "SUB", + "gas": 1547460, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x80", + "0x80", + "0x100" + ] + }, + { + "pc": 455, + "op": "SWAP1", + "gas": 1547457, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x80", + "0x80" + ] + }, + { + "pc": 456, + "op": "LOG2", + "gas": 1547454, + "gasCost": 2149, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "Tracer.address", + "0xa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0", + "0x80", + "0x80" + ] + }, + { + "pc": 457, + "op": "DUP2", + "gas": 1545305, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0" + ] + }, + { + "pc": 458, + "op": "PUSH1", + "gas": 1545302, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9" + ] + }, + { + "pc": 460, + "op": "PUSH1", + "gas": 1545299, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2" + ] + }, + { + "pc": 462, + "op": "DUP3", + "gas": 1545296, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0" + ] + }, + { + "pc": 463, + "op": "DUP3", + "gas": 1545293, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x3e9" + ] + }, + { + "pc": 464, + "op": "SLOAD", + "gas": 1545290, + "gasCost": 100, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x3e9", + "0x2" + ], + "storage": { + "0000000000000000000000000000000000000000000000000000000000000000": "0000000000000000000000000000001d6329f1c35ca4bfabb9f56100000003e8", + "0000000000000000000000000000000000000000000000000000000000000001": "0000000000000000000000000000000000000000000000000000000000000001", + "0000000000000000000000000000000000000000000000000000000000000002": "0000000000000000000000000000001d6329f1c35ca4bfabb9f5610000000001" + } + }, + { + "pc": 465, + "op": "PUSH2", + "gas": 1545190, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 468, + "op": "SWAP2", + "gas": 1545187, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x1da" + ] + }, + { + "pc": 469, + "op": "SWAP1", + "gas": 1545184, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x3e9" + ] + }, + { + "pc": 470, + "op": "PUSH2", + "gas": 1545181, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 473, + "op": "JUMP", + "gas": 1545178, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x4df" + ] + }, + { + "pc": 1247, + "op": "JUMPDEST", + "gas": 1545170, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 1248, + "op": "PUSH1", + "gas": 1545169, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 1250, + "op": "PUSH2", + "gas": 1545166, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0" + ] + }, + { + "pc": 1253, + "op": "DUP3", + "gas": 1545163, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x4ea" + ] + }, + { + "pc": 1254, + "op": "PUSH2", + "gas": 1545160, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x4ea", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 1257, + "op": "JUMP", + "gas": 1545157, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x4ea", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x30d" + ] + }, + { + "pc": 781, + "op": "JUMPDEST", + "gas": 1545149, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x4ea", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 782, + "op": "PUSH1", + "gas": 1545148, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x4ea", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 784, + "op": "DUP2", + "gas": 1545145, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x4ea", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0" + ] + }, + { + "pc": 785, + "op": "SWAP1", + "gas": 1545142, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x4ea", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 786, + "op": "POP", + "gas": 1545139, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x4ea", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0" + ] + }, + { + "pc": 787, + "op": "SWAP2", + "gas": 1545137, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x4ea", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 788, + "op": "SWAP1", + "gas": 1545134, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x4ea" + ] + }, + { + "pc": 789, + "op": "POP", + "gas": 1545131, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x4ea", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 790, + "op": "JUMP", + "gas": 1545129, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x4ea" + ] + }, + { + "pc": 1258, + "op": "JUMPDEST", + "gas": 1545121, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 1259, + "op": "SWAP2", + "gas": 1545120, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 1260, + "op": "POP", + "gas": 1545117, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 1261, + "op": "PUSH2", + "gas": 1545115, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0" + ] + }, + { + "pc": 1264, + "op": "DUP4", + "gas": 1545112, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x4f5" + ] + }, + { + "pc": 1265, + "op": "PUSH2", + "gas": 1545109, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x4f5", + "0x3e9" + ] + }, + { + "pc": 1268, + "op": "JUMP", + "gas": 1545106, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x4f5", + "0x3e9", + "0x30d" + ] + }, + { + "pc": 781, + "op": "JUMPDEST", + "gas": 1545098, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x4f5", + "0x3e9" + ] + }, + { + "pc": 782, + "op": "PUSH1", + "gas": 1545097, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x4f5", + "0x3e9" + ] + }, + { + "pc": 784, + "op": "DUP2", + "gas": 1545094, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x4f5", + "0x3e9", + "0x0" + ] + }, + { + "pc": 785, + "op": "SWAP1", + "gas": 1545091, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x4f5", + "0x3e9", + "0x0", + "0x3e9" + ] + }, + { + "pc": 786, + "op": "POP", + "gas": 1545088, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x4f5", + "0x3e9", + "0x3e9", + "0x0" + ] + }, + { + "pc": 787, + "op": "SWAP2", + "gas": 1545086, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x4f5", + "0x3e9", + "0x3e9" + ] + }, + { + "pc": 788, + "op": "SWAP1", + "gas": 1545083, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x3e9", + "0x3e9", + "0x4f5" + ] + }, + { + "pc": 789, + "op": "POP", + "gas": 1545080, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x3e9", + "0x4f5", + "0x3e9" + ] + }, + { + "pc": 790, + "op": "JUMP", + "gas": 1545078, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x3e9", + "0x4f5" + ] + }, + { + "pc": 1269, + "op": "JUMPDEST", + "gas": 1545070, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x3e9" + ] + }, + { + "pc": 1270, + "op": "SWAP3", + "gas": 1545069, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x3e9" + ] + }, + { + "pc": 1271, + "op": "POP", + "gas": 1545066, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x3e9" + ] + }, + { + "pc": 1272, + "op": "DUP3", + "gas": 1545064, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0" + ] + }, + { + "pc": 1273, + "op": "PUSH32", + "gas": 1545061, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x3e9" + ] + }, + { + "pc": 1306, + "op": "SUB", + "gas": 1545058, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x3e9", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + ] + }, + { + "pc": 1307, + "op": "DUP3", + "gas": 1545055, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc16" + ] + }, + { + "pc": 1308, + "op": "GT", + "gas": 1545052, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc16", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 1309, + "op": "ISZERO", + "gas": 1545049, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x0" + ] + }, + { + "pc": 1310, + "op": "PUSH2", + "gas": 1545046, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1" + ] + }, + { + "pc": 1313, + "op": "JUMPI", + "gas": 1545043, + "gasCost": 10, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1", + "0x52a" + ] + }, + { + "pc": 1322, + "op": "JUMPDEST", + "gas": 1545033, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0" + ] + }, + { + "pc": 1323, + "op": "DUP3", + "gas": 1545032, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0" + ] + }, + { + "pc": 1324, + "op": "DUP3", + "gas": 1545029, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x3e9" + ] + }, + { + "pc": 1325, + "op": "ADD", + "gas": 1545026, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 1326, + "op": "SWAP1", + "gas": 1545023, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x0", + "0x1d6329f1c35ca4bfabb9f56100000003ea" + ] + }, + { + "pc": 1327, + "op": "POP", + "gas": 1545020, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x1d6329f1c35ca4bfabb9f56100000003ea", + "0x0" + ] + }, + { + "pc": 1328, + "op": "SWAP3", + "gas": 1545018, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1da", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x1d6329f1c35ca4bfabb9f56100000003ea" + ] + }, + { + "pc": 1329, + "op": "SWAP2", + "gas": 1545015, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1d6329f1c35ca4bfabb9f56100000003ea", + "0x3e9", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x1da" + ] + }, + { + "pc": 1330, + "op": "POP", + "gas": 1545012, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1d6329f1c35ca4bfabb9f56100000003ea", + "0x1da", + "0x1d6329f1c35ca4bfabb9f5610000000001", + "0x3e9" + ] + }, + { + "pc": 1331, + "op": "POP", + "gas": 1545010, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1d6329f1c35ca4bfabb9f56100000003ea", + "0x1da", + "0x1d6329f1c35ca4bfabb9f5610000000001" + ] + }, + { + "pc": 1332, + "op": "JUMP", + "gas": 1545008, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1d6329f1c35ca4bfabb9f56100000003ea", + "0x1da" + ] + }, + { + "pc": 474, + "op": "JUMPDEST", + "gas": 1545000, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1d6329f1c35ca4bfabb9f56100000003ea" + ] + }, + { + "pc": 475, + "op": "SWAP3", + "gas": 1544999, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x3e9", + "0x2", + "0x0", + "0x1d6329f1c35ca4bfabb9f56100000003ea" + ] + }, + { + "pc": 476, + "op": "POP", + "gas": 1544996, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x1d6329f1c35ca4bfabb9f56100000003ea", + "0x2", + "0x0", + "0x3e9" + ] + }, + { + "pc": 477, + "op": "POP", + "gas": 1544994, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x1d6329f1c35ca4bfabb9f56100000003ea", + "0x2", + "0x0" + ] + }, + { + "pc": 478, + "op": "DUP2", + "gas": 1544992, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x1d6329f1c35ca4bfabb9f56100000003ea", + "0x2" + ] + }, + { + "pc": 479, + "op": "SWAP1", + "gas": 1544989, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x1d6329f1c35ca4bfabb9f56100000003ea", + "0x2", + "0x1d6329f1c35ca4bfabb9f56100000003ea" + ] + }, + { + "pc": 480, + "op": "SSTORE", + "gas": 1544986, + "gasCost": 100, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x1d6329f1c35ca4bfabb9f56100000003ea", + "0x1d6329f1c35ca4bfabb9f56100000003ea", + "0x2" + ], + "storage": { + "0000000000000000000000000000000000000000000000000000000000000000": "0000000000000000000000000000001d6329f1c35ca4bfabb9f56100000003e8", + "0000000000000000000000000000000000000000000000000000000000000001": "0000000000000000000000000000000000000000000000000000000000000001", + "0000000000000000000000000000000000000000000000000000000000000002": "0000000000000000000000000000001d6329f1c35ca4bfabb9f56100000003ea" + } + }, + { + "pc": 481, + "op": "POP", + "gas": 1544886, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x1d6329f1c35ca4bfabb9f56100000003ea" + ] + }, + { + "pc": 482, + "op": "PUSH1", + "gas": 1544884, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0" + ] + }, + { + "pc": 484, + "op": "SWAP1", + "gas": 1544881, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x0", + "0x2" + ] + }, + { + "pc": 485, + "op": "POP", + "gas": 1544878, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x2", + "0x0" + ] + }, + { + "pc": 486, + "op": "SWAP2", + "gas": 1544876, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2a2", + "0x3e9", + "0x2" + ] + }, + { + "pc": 487, + "op": "SWAP1", + "gas": 1544873, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2", + "0x3e9", + "0x2a2" + ] + }, + { + "pc": 488, + "op": "POP", + "gas": 1544870, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2", + "0x2a2", + "0x3e9" + ] + }, + { + "pc": 489, + "op": "JUMP", + "gas": 1544868, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2", + "0x2a2" + ] + }, + { + "pc": 674, + "op": "JUMPDEST", + "gas": 1544860, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2" + ] + }, + { + "pc": 675, + "op": "POP", + "gas": 1544859, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2" + ] + }, + { + "pc": 676, + "op": "PUSH2", + "gas": 1544857, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0" + ] + }, + { + "pc": 679, + "op": "PUSH2", + "gas": 1544854, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab" + ] + }, + { + "pc": 682, + "op": "JUMP", + "gas": 1544851, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0x129" + ] + }, + { + "pc": 297, + "op": "JUMPDEST", + "gas": 1544843, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab" + ] + }, + { + "pc": 298, + "op": "PUSH1", + "gas": 1544842, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab" + ] + }, + { + "pc": 300, + "op": "DUP1", + "gas": 1544839, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0x0" + ] + }, + { + "pc": 301, + "op": "PUSH1", + "gas": 1544836, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0x0", + "0x0" + ] + }, + { + "pc": 303, + "op": "MLOAD", + "gas": 1544833, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0x0", + "0x0", + "0x40" + ] + }, + { + "pc": 304, + "op": "DUP1", + "gas": 1544830, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0x0", + "0x0", + "0x80" + ] + }, + { + "pc": 305, + "op": "PUSH1", + "gas": 1544827, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0x0", + "0x0", + "0x80", + "0x80" + ] + }, + { + "pc": 307, + "op": "ADD", + "gas": 1544824, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0x0", + "0x0", + "0x80", + "0x80", + "0x40" + ] + }, + { + "pc": 308, + "op": "PUSH1", + "gas": 1544821, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0x0", + "0x0", + "0x80", + "0xc0" + ] + }, + { + "pc": 310, + "op": "MSTORE", + "gas": 1544818, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0x0", + "0x0", + "0x80", + "0xc0", + "0x40" + ] + }, + { + "pc": 311, + "op": "DUP1", + "gas": 1544815, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0x0", + "0x0", + "0x80" + ] + }, + { + "pc": 312, + "op": "PUSH1", + "gas": 1544812, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0x0", + "0x0", + "0x80", + "0x80" + ] + }, + { + "pc": 314, + "op": "DUP2", + "gas": 1544809, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0x0", + "0x0", + "0x80", + "0x80", + "0xd" + ] + }, + { + "pc": 315, + "op": "MSTORE", + "gas": 1544806, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0x0", + "0x0", + "0x80", + "0x80", + "0xd", + "0x80" + ] + }, + { + "pc": 316, + "op": "PUSH1", + "gas": 1544803, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0x0", + "0x0", + "0x80", + "0x80" + ] + }, + { + "pc": 318, + "op": "ADD", + "gas": 1544800, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0x0", + "0x0", + "0x80", + "0x80", + "0x20" + ] + }, + { + "pc": 319, + "op": "PUSH32", + "gas": 1544797, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0x0", + "0x0", + "0x80", + "0xa0" + ] + }, + { + "pc": 352, + "op": "DUP2", + "gas": 1544794, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0x0", + "0x0", + "0x80", + "0xa0", + "0x48656c6c6f2c20776f726c642100000000000000000000000000000000000000" + ] + }, + { + "pc": 353, + "op": "MSTORE", + "gas": 1544791, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0x0", + "0x0", + "0x80", + "0xa0", + "0x48656c6c6f2c20776f726c642100000000000000000000000000000000000000", + "0xa0" + ] + }, + { + "pc": 354, + "op": "POP", + "gas": 1544788, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0x0", + "0x0", + "0x80", + "0xa0" + ] + }, + { + "pc": 355, + "op": "SWAP1", + "gas": 1544786, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0x0", + "0x0", + "0x80" + ] + }, + { + "pc": 356, + "op": "POP", + "gas": 1544783, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0x0", + "0x80", + "0x0" + ] + }, + { + "pc": 357, + "op": "PUSH1", + "gas": 1544781, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0x0", + "0x80" + ] + }, + { + "pc": 359, + "op": "DUP2", + "gas": 1544778, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0x0", + "0x80", + "0x0" + ] + }, + { + "pc": 360, + "op": "DUP1", + "gas": 1544775, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0x0", + "0x80", + "0x0", + "0x80" + ] + }, + { + "pc": 361, + "op": "MLOAD", + "gas": 1544772, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0x0", + "0x80", + "0x0", + "0x80", + "0x80" + ] + }, + { + "pc": 362, + "op": "SWAP1", + "gas": 1544769, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0x0", + "0x80", + "0x0", + "0x80", + "0xd" + ] + }, + { + "pc": 363, + "op": "PUSH1", + "gas": 1544766, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0x0", + "0x80", + "0x0", + "0xd", + "0x80" + ] + }, + { + "pc": 365, + "op": "ADD", + "gas": 1544763, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0x0", + "0x80", + "0x0", + "0xd", + "0x80", + "0x20" + ] + }, + { + "pc": 366, + "op": "KECCAK256", + "gas": 1544760, + "gasCost": 36, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0x0", + "0x80", + "0x0", + "0xd", + "0xa0" + ] + }, + { + "pc": 367, + "op": "SWAP1", + "gas": 1544724, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0x0", + "0x80", + "0x0", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4" + ] + }, + { + "pc": 368, + "op": "POP", + "gas": 1544721, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0x0", + "0x80", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4", + "0x0" + ] + }, + { + "pc": 369, + "op": "DUP1", + "gas": 1544719, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0x0", + "0x80", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4" + ] + }, + { + "pc": 370, + "op": "SWAP3", + "gas": 1544716, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0x0", + "0x80", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4" + ] + }, + { + "pc": 371, + "op": "POP", + "gas": 1544713, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4", + "0x80", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4", + "0x0" + ] + }, + { + "pc": 372, + "op": "POP", + "gas": 1544711, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4", + "0x80", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4" + ] + }, + { + "pc": 373, + "op": "POP", + "gas": 1544709, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4", + "0x80" + ] + }, + { + "pc": 374, + "op": "SWAP1", + "gas": 1544707, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x2ab", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4" + ] + }, + { + "pc": 375, + "op": "JUMP", + "gas": 1544704, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4", + "0x2ab" + ] + }, + { + "pc": 683, + "op": "JUMPDEST", + "gas": 1544696, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4" + ] + }, + { + "pc": 684, + "op": "POP", + "gas": 1544695, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4" + ] + }, + { + "pc": 685, + "op": "PUSH1", + "gas": 1544693, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0" + ] + }, + { + "pc": 687, + "op": "SWAP1", + "gas": 1544690, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x0", + "0x1" + ] + }, + { + "pc": 688, + "op": "POP", + "gas": 1544687, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x1", + "0x0" + ] + }, + { + "pc": 689, + "op": "SWAP2", + "gas": 1544685, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xd9", + "0x3e8", + "0x1" + ] + }, + { + "pc": 690, + "op": "SWAP1", + "gas": 1544682, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0x1", + "0x3e8", + "0xd9" + ] + }, + { + "pc": 691, + "op": "POP", + "gas": 1544679, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0x1", + "0xd9", + "0x3e8" + ] + }, + { + "pc": 692, + "op": "JUMP", + "gas": 1544677, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0x1", + "0xd9" + ] + }, + { + "pc": 217, + "op": "JUMPDEST", + "gas": 1544669, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0x1" + ] + }, + { + "pc": 218, + "op": "PUSH1", + "gas": 1544668, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0x1" + ] + }, + { + "pc": 220, + "op": "MLOAD", + "gas": 1544665, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0x1", + "0x40" + ] + }, + { + "pc": 221, + "op": "PUSH2", + "gas": 1544662, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0x1", + "0xc0" + ] + }, + { + "pc": 224, + "op": "SWAP2", + "gas": 1544659, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0x1", + "0xc0", + "0xe6" + ] + }, + { + "pc": 225, + "op": "SWAP1", + "gas": 1544656, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0xc0", + "0x1" + ] + }, + { + "pc": 226, + "op": "PUSH2", + "gas": 1544653, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0" + ] + }, + { + "pc": 229, + "op": "JUMP", + "gas": 1544650, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0x37f" + ] + }, + { + "pc": 895, + "op": "JUMPDEST", + "gas": 1544642, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0" + ] + }, + { + "pc": 896, + "op": "PUSH1", + "gas": 1544641, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0" + ] + }, + { + "pc": 898, + "op": "PUSH1", + "gas": 1544638, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0x0" + ] + }, + { + "pc": 900, + "op": "DUP3", + "gas": 1544635, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0x0", + "0x20" + ] + }, + { + "pc": 901, + "op": "ADD", + "gas": 1544632, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0x0", + "0x20", + "0xc0" + ] + }, + { + "pc": 902, + "op": "SWAP1", + "gas": 1544629, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0x0", + "0xe0" + ] + }, + { + "pc": 903, + "op": "POP", + "gas": 1544626, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0xe0", + "0x0" + ] + }, + { + "pc": 904, + "op": "PUSH2", + "gas": 1544624, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0xe0" + ] + }, + { + "pc": 907, + "op": "PUSH1", + "gas": 1544621, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0xe0", + "0x394" + ] + }, + { + "pc": 909, + "op": "DUP4", + "gas": 1544618, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0xe0", + "0x394", + "0x0" + ] + }, + { + "pc": 910, + "op": "ADD", + "gas": 1544615, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0xe0", + "0x394", + "0x0", + "0xc0" + ] + }, + { + "pc": 911, + "op": "DUP5", + "gas": 1544612, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0xe0", + "0x394", + "0xc0" + ] + }, + { + "pc": 912, + "op": "PUSH2", + "gas": 1544609, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0xe0", + "0x394", + "0xc0", + "0x1" + ] + }, + { + "pc": 915, + "op": "JUMP", + "gas": 1544606, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0xe0", + "0x394", + "0xc0", + "0x1", + "0x370" + ] + }, + { + "pc": 880, + "op": "JUMPDEST", + "gas": 1544598, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0xe0", + "0x394", + "0xc0", + "0x1" + ] + }, + { + "pc": 881, + "op": "PUSH2", + "gas": 1544597, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0xe0", + "0x394", + "0xc0", + "0x1" + ] + }, + { + "pc": 884, + "op": "DUP2", + "gas": 1544594, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0xe0", + "0x394", + "0xc0", + "0x1", + "0x379" + ] + }, + { + "pc": 885, + "op": "PUSH2", + "gas": 1544591, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0xe0", + "0x394", + "0xc0", + "0x1", + "0x379", + "0x1" + ] + }, + { + "pc": 888, + "op": "JUMP", + "gas": 1544588, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0xe0", + "0x394", + "0xc0", + "0x1", + "0x379", + "0x1", + "0x30d" + ] + }, + { + "pc": 781, + "op": "JUMPDEST", + "gas": 1544580, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0xe0", + "0x394", + "0xc0", + "0x1", + "0x379", + "0x1" + ] + }, + { + "pc": 782, + "op": "PUSH1", + "gas": 1544579, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0xe0", + "0x394", + "0xc0", + "0x1", + "0x379", + "0x1" + ] + }, + { + "pc": 784, + "op": "DUP2", + "gas": 1544576, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0xe0", + "0x394", + "0xc0", + "0x1", + "0x379", + "0x1", + "0x0" + ] + }, + { + "pc": 785, + "op": "SWAP1", + "gas": 1544573, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0xe0", + "0x394", + "0xc0", + "0x1", + "0x379", + "0x1", + "0x0", + "0x1" + ] + }, + { + "pc": 786, + "op": "POP", + "gas": 1544570, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0xe0", + "0x394", + "0xc0", + "0x1", + "0x379", + "0x1", + "0x1", + "0x0" + ] + }, + { + "pc": 787, + "op": "SWAP2", + "gas": 1544568, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0xe0", + "0x394", + "0xc0", + "0x1", + "0x379", + "0x1", + "0x1" + ] + }, + { + "pc": 788, + "op": "SWAP1", + "gas": 1544565, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0xe0", + "0x394", + "0xc0", + "0x1", + "0x1", + "0x1", + "0x379" + ] + }, + { + "pc": 789, + "op": "POP", + "gas": 1544562, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0xe0", + "0x394", + "0xc0", + "0x1", + "0x1", + "0x379", + "0x1" + ] + }, + { + "pc": 790, + "op": "JUMP", + "gas": 1544560, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0xe0", + "0x394", + "0xc0", + "0x1", + "0x1", + "0x379" + ] + }, + { + "pc": 889, + "op": "JUMPDEST", + "gas": 1544552, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0xe0", + "0x394", + "0xc0", + "0x1", + "0x1" + ] + }, + { + "pc": 890, + "op": "DUP3", + "gas": 1544551, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0xe0", + "0x394", + "0xc0", + "0x1", + "0x1" + ] + }, + { + "pc": 891, + "op": "MSTORE", + "gas": 1544548, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0xe0", + "0x394", + "0xc0", + "0x1", + "0x1", + "0xc0" + ] + }, + { + "pc": 892, + "op": "POP", + "gas": 1544545, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0xe0", + "0x394", + "0xc0", + "0x1" + ] + }, + { + "pc": 893, + "op": "POP", + "gas": 1544543, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0xe0", + "0x394", + "0xc0" + ] + }, + { + "pc": 894, + "op": "JUMP", + "gas": 1544541, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0xe0", + "0x394" + ] + }, + { + "pc": 916, + "op": "JUMPDEST", + "gas": 1544533, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0xe0" + ] + }, + { + "pc": 917, + "op": "SWAP3", + "gas": 1544532, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe6", + "0x1", + "0xc0", + "0xe0" + ] + }, + { + "pc": 918, + "op": "SWAP2", + "gas": 1544529, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe0", + "0x1", + "0xc0", + "0xe6" + ] + }, + { + "pc": 919, + "op": "POP", + "gas": 1544526, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe0", + "0xe6", + "0xc0", + "0x1" + ] + }, + { + "pc": 920, + "op": "POP", + "gas": 1544524, + "gasCost": 2, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe0", + "0xe6", + "0xc0" + ] + }, + { + "pc": 921, + "op": "JUMP", + "gas": 1544522, + "gasCost": 8, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe0", + "0xe6" + ] + }, + { + "pc": 230, + "op": "JUMPDEST", + "gas": 1544514, + "gasCost": 1, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe0" + ] + }, + { + "pc": 231, + "op": "PUSH1", + "gas": 1544513, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe0" + ] + }, + { + "pc": 233, + "op": "MLOAD", + "gas": 1544510, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe0", + "0x40" + ] + }, + { + "pc": 234, + "op": "DUP1", + "gas": 1544507, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe0", + "0xc0" + ] + }, + { + "pc": 235, + "op": "SWAP2", + "gas": 1544504, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xe0", + "0xc0", + "0xc0" + ] + }, + { + "pc": 236, + "op": "SUB", + "gas": 1544501, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xc0", + "0xc0", + "0xe0" + ] + }, + { + "pc": 237, + "op": "SWAP1", + "gas": 1544498, + "gasCost": 3, + "depth": 2, + "stack": [ + "0xa0712d68", + "0xc0", + "0x20" + ] + }, + { + "pc": 238, + "op": "RETURN", + "gas": 1544495, + "gasCost": 0, + "depth": 2, + "stack": [ + "0xa0712d68", + "0x20", + "0xc0" + ] + }, + { + "pc": 1133, + "op": "ISZERO", + "gas": 1569121, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0xe4", + "0x1" + ] + }, + { + "pc": 1134, + "op": "DUP1", + "gas": 1569118, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0xe4", + "0x0" + ] + }, + { + "pc": 1135, + "op": "ISZERO", + "gas": 1569115, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0xe4", + "0x0", + "0x0" + ] + }, + { + "pc": 1136, + "op": "PUSH3", + "gas": 1569112, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0xe4", + "0x0", + "0x1" + ] + }, + { + "pc": 1140, + "op": "JUMPI", + "gas": 1569109, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0xe4", + "0x0", + "0x1", + "0x47e" + ] + }, + { + "pc": 1150, + "op": "JUMPDEST", + "gas": 1569099, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0xe4", + "0x0" + ] + }, + { + "pc": 1151, + "op": "POP", + "gas": 1569098, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0xe4", + "0x0" + ] + }, + { + "pc": 1152, + "op": "POP", + "gas": 1569096, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68", + "0xe4" + ] + }, + { + "pc": 1153, + "op": "POP", + "gas": 1569094, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae", + "0xa0712d68" + ] + }, + { + "pc": 1154, + "op": "POP", + "gas": 1569092, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x61a286b8e87e2d31c475d71c85a0020584c44bae" + ] + }, + { + "pc": 1155, + "op": "PUSH1", + "gas": 1569090, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0" + ] + }, + { + "pc": 1157, + "op": "MLOAD", + "gas": 1569087, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x40" + ] + }, + { + "pc": 1158, + "op": "RETURNDATASIZE", + "gas": 1569084, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0xc0" + ] + }, + { + "pc": 1159, + "op": "PUSH1", + "gas": 1569082, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0xc0", + "0x20" + ] + }, + { + "pc": 1161, + "op": "NOT", + "gas": 1569079, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0xc0", + "0x20", + "0x1f" + ] + }, + { + "pc": 1162, + "op": "PUSH1", + "gas": 1569076, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0xc0", + "0x20", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0" + ] + }, + { + "pc": 1164, + "op": "DUP3", + "gas": 1569073, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0xc0", + "0x20", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0", + "0x1f" + ] + }, + { + "pc": 1165, + "op": "ADD", + "gas": 1569070, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0xc0", + "0x20", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0", + "0x1f", + "0x20" + ] + }, + { + "pc": 1166, + "op": "AND", + "gas": 1569067, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0xc0", + "0x20", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0", + "0x3f" + ] + }, + { + "pc": 1167, + "op": "DUP3", + "gas": 1569064, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0xc0", + "0x20", + "0x20" + ] + }, + { + "pc": 1168, + "op": "ADD", + "gas": 1569061, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0xc0", + "0x20", + "0x20", + "0xc0" + ] + }, + { + "pc": 1169, + "op": "DUP1", + "gas": 1569058, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0xc0", + "0x20", + "0xe0" + ] + }, + { + "pc": 1170, + "op": "PUSH1", + "gas": 1569055, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0xc0", + "0x20", + "0xe0", + "0xe0" + ] + }, + { + "pc": 1172, + "op": "MSTORE", + "gas": 1569052, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0xc0", + "0x20", + "0xe0", + "0xe0", + "0x40" + ] + }, + { + "pc": 1173, + "op": "POP", + "gas": 1569049, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0xc0", + "0x20", + "0xe0" + ] + }, + { + "pc": 1174, + "op": "DUP2", + "gas": 1569047, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0xc0", + "0x20" + ] + }, + { + "pc": 1175, + "op": "ADD", + "gas": 1569044, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0xc0", + "0x20", + "0xc0" + ] + }, + { + "pc": 1176, + "op": "SWAP1", + "gas": 1569041, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0xc0", + "0xe0" + ] + }, + { + "pc": 1177, + "op": "PUSH3", + "gas": 1569038, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0xe0", + "0xc0" + ] + }, + { + "pc": 1181, + "op": "SWAP2", + "gas": 1569035, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0xe0", + "0xc0", + "0x4a4" + ] + }, + { + "pc": 1182, + "op": "SWAP1", + "gas": 1569032, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xc0", + "0xe0" + ] + }, + { + "pc": 1183, + "op": "PUSH3", + "gas": 1569029, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0" + ] + }, + { + "pc": 1187, + "op": "JUMP", + "gas": 1569026, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0xcad" + ] + }, + { + "pc": 3245, + "op": "JUMPDEST", + "gas": 1569018, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0" + ] + }, + { + "pc": 3246, + "op": "PUSH1", + "gas": 1569017, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0" + ] + }, + { + "pc": 3248, + "op": "PUSH1", + "gas": 1569014, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0" + ] + }, + { + "pc": 3250, + "op": "DUP3", + "gas": 1569011, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x20" + ] + }, + { + "pc": 3251, + "op": "DUP5", + "gas": 1569008, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x20", + "0xc0" + ] + }, + { + "pc": 3252, + "op": "SUB", + "gas": 1569005, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x20", + "0xc0", + "0xe0" + ] + }, + { + "pc": 3253, + "op": "SLT", + "gas": 1569002, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x20", + "0x20" + ] + }, + { + "pc": 3254, + "op": "ISZERO", + "gas": 1568999, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0" + ] + }, + { + "pc": 3255, + "op": "PUSH3", + "gas": 1568996, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x1" + ] + }, + { + "pc": 3259, + "op": "JUMPI", + "gas": 1568993, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x1", + "0xcc6" + ] + }, + { + "pc": 3270, + "op": "JUMPDEST", + "gas": 1568983, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0" + ] + }, + { + "pc": 3271, + "op": "PUSH1", + "gas": 1568982, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0" + ] + }, + { + "pc": 3273, + "op": "PUSH3", + "gas": 1568979, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0" + ] + }, + { + "pc": 3277, + "op": "DUP5", + "gas": 1568976, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6" + ] + }, + { + "pc": 3278, + "op": "DUP3", + "gas": 1568973, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0" + ] + }, + { + "pc": 3279, + "op": "DUP6", + "gas": 1568970, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0x0" + ] + }, + { + "pc": 3280, + "op": "ADD", + "gas": 1568967, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0x0", + "0xc0" + ] + }, + { + "pc": 3281, + "op": "PUSH3", + "gas": 1568964, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0" + ] + }, + { + "pc": 3285, + "op": "JUMP", + "gas": 1568961, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0", + "0xc96" + ] + }, + { + "pc": 3222, + "op": "JUMPDEST", + "gas": 1568953, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0" + ] + }, + { + "pc": 3223, + "op": "PUSH1", + "gas": 1568952, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0" + ] + }, + { + "pc": 3225, + "op": "DUP2", + "gas": 1568949, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0", + "0x0" + ] + }, + { + "pc": 3226, + "op": "MLOAD", + "gas": 1568946, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0", + "0x0", + "0xc0" + ] + }, + { + "pc": 3227, + "op": "SWAP1", + "gas": 1568943, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0", + "0x0", + "0x1" + ] + }, + { + "pc": 3228, + "op": "POP", + "gas": 1568940, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0", + "0x1", + "0x0" + ] + }, + { + "pc": 3229, + "op": "PUSH3", + "gas": 1568938, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0", + "0x1" + ] + }, + { + "pc": 3233, + "op": "DUP2", + "gas": 1568935, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0", + "0x1", + "0xca7" + ] + }, + { + "pc": 3234, + "op": "PUSH3", + "gas": 1568932, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0", + "0x1", + "0xca7", + "0x1" + ] + }, + { + "pc": 3238, + "op": "JUMP", + "gas": 1568929, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0", + "0x1", + "0xca7", + "0x1", + "0x9fb" + ] + }, + { + "pc": 2555, + "op": "JUMPDEST", + "gas": 1568921, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0", + "0x1", + "0xca7", + "0x1" + ] + }, + { + "pc": 2556, + "op": "PUSH3", + "gas": 1568920, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0", + "0x1", + "0xca7", + "0x1" + ] + }, + { + "pc": 2560, + "op": "DUP2", + "gas": 1568917, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0", + "0x1", + "0xca7", + "0x1", + "0xa06" + ] + }, + { + "pc": 2561, + "op": "PUSH3", + "gas": 1568914, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0", + "0x1", + "0xca7", + "0x1", + "0xa06", + "0x1" + ] + }, + { + "pc": 2565, + "op": "JUMP", + "gas": 1568911, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0", + "0x1", + "0xca7", + "0x1", + "0xa06", + "0x1", + "0x97c" + ] + }, + { + "pc": 2428, + "op": "JUMPDEST", + "gas": 1568903, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0", + "0x1", + "0xca7", + "0x1", + "0xa06", + "0x1" + ] + }, + { + "pc": 2429, + "op": "PUSH1", + "gas": 1568902, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0", + "0x1", + "0xca7", + "0x1", + "0xa06", + "0x1" + ] + }, + { + "pc": 2431, + "op": "DUP2", + "gas": 1568899, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0", + "0x1", + "0xca7", + "0x1", + "0xa06", + "0x1", + "0x0" + ] + }, + { + "pc": 2432, + "op": "SWAP1", + "gas": 1568896, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0", + "0x1", + "0xca7", + "0x1", + "0xa06", + "0x1", + "0x0", + "0x1" + ] + }, + { + "pc": 2433, + "op": "POP", + "gas": 1568893, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0", + "0x1", + "0xca7", + "0x1", + "0xa06", + "0x1", + "0x1", + "0x0" + ] + }, + { + "pc": 2434, + "op": "SWAP2", + "gas": 1568891, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0", + "0x1", + "0xca7", + "0x1", + "0xa06", + "0x1", + "0x1" + ] + }, + { + "pc": 2435, + "op": "SWAP1", + "gas": 1568888, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0", + "0x1", + "0xca7", + "0x1", + "0x1", + "0x1", + "0xa06" + ] + }, + { + "pc": 2436, + "op": "POP", + "gas": 1568885, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0", + "0x1", + "0xca7", + "0x1", + "0x1", + "0xa06", + "0x1" + ] + }, + { + "pc": 2437, + "op": "JUMP", + "gas": 1568883, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0", + "0x1", + "0xca7", + "0x1", + "0x1", + "0xa06" + ] + }, + { + "pc": 2566, + "op": "JUMPDEST", + "gas": 1568875, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0", + "0x1", + "0xca7", + "0x1", + "0x1" + ] + }, + { + "pc": 2567, + "op": "DUP2", + "gas": 1568874, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0", + "0x1", + "0xca7", + "0x1", + "0x1" + ] + }, + { + "pc": 2568, + "op": "EQ", + "gas": 1568871, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0", + "0x1", + "0xca7", + "0x1", + "0x1", + "0x1" + ] + }, + { + "pc": 2569, + "op": "PUSH3", + "gas": 1568868, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0", + "0x1", + "0xca7", + "0x1", + "0x1" + ] + }, + { + "pc": 2573, + "op": "JUMPI", + "gas": 1568865, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0", + "0x1", + "0xca7", + "0x1", + "0x1", + "0xa12" + ] + }, + { + "pc": 2578, + "op": "JUMPDEST", + "gas": 1568855, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0", + "0x1", + "0xca7", + "0x1" + ] + }, + { + "pc": 2579, + "op": "POP", + "gas": 1568854, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0", + "0x1", + "0xca7", + "0x1" + ] + }, + { + "pc": 2580, + "op": "JUMP", + "gas": 1568852, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0", + "0x1", + "0xca7" + ] + }, + { + "pc": 3239, + "op": "JUMPDEST", + "gas": 1568844, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0", + "0x1" + ] + }, + { + "pc": 3240, + "op": "SWAP3", + "gas": 1568843, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0xcd6", + "0xe0", + "0xc0", + "0x1" + ] + }, + { + "pc": 3241, + "op": "SWAP2", + "gas": 1568840, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0x1", + "0xe0", + "0xc0", + "0xcd6" + ] + }, + { + "pc": 3242, + "op": "POP", + "gas": 1568837, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0x1", + "0xcd6", + "0xc0", + "0xe0" + ] + }, + { + "pc": 3243, + "op": "POP", + "gas": 1568835, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0x1", + "0xcd6", + "0xc0" + ] + }, + { + "pc": 3244, + "op": "JUMP", + "gas": 1568833, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0x1", + "0xcd6" + ] + }, + { + "pc": 3286, + "op": "JUMPDEST", + "gas": 1568825, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0x1" + ] + }, + { + "pc": 3287, + "op": "SWAP2", + "gas": 1568824, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x0", + "0x0", + "0x1" + ] + }, + { + "pc": 3288, + "op": "POP", + "gas": 1568821, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x1", + "0x0", + "0x0" + ] + }, + { + "pc": 3289, + "op": "POP", + "gas": 1568819, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x1", + "0x0" + ] + }, + { + "pc": 3290, + "op": "SWAP3", + "gas": 1568817, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x4a4", + "0xe0", + "0xc0", + "0x1" + ] + }, + { + "pc": 3291, + "op": "SWAP2", + "gas": 1568814, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x1", + "0xe0", + "0xc0", + "0x4a4" + ] + }, + { + "pc": 3292, + "op": "POP", + "gas": 1568811, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x1", + "0x4a4", + "0xc0", + "0xe0" + ] + }, + { + "pc": 3293, + "op": "POP", + "gas": 1568809, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x1", + "0x4a4", + "0xc0" + ] + }, + { + "pc": 3294, + "op": "JUMP", + "gas": 1568807, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x1", + "0x4a4" + ] + }, + { + "pc": 1188, + "op": "JUMPDEST", + "gas": 1568799, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x1" + ] + }, + { + "pc": 1189, + "op": "POP", + "gas": 1568798, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x1" + ] + }, + { + "pc": 1190, + "op": "PUSH1", + "gas": 1568796, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0" + ] + }, + { + "pc": 1192, + "op": "SWAP1", + "gas": 1568793, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x0", + "0x1" + ] + }, + { + "pc": 1193, + "op": "POP", + "gas": 1568790, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x1", + "0x0" + ] + }, + { + "pc": 1194, + "op": "SWAP2", + "gas": 1568788, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x149", + "0x3e8", + "0x1" + ] + }, + { + "pc": 1195, + "op": "SWAP1", + "gas": 1568785, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x1", + "0x3e8", + "0x149" + ] + }, + { + "pc": 1196, + "op": "POP", + "gas": 1568782, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x1", + "0x149", + "0x3e8" + ] + }, + { + "pc": 1197, + "op": "JUMP", + "gas": 1568780, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x1", + "0x149" + ] + }, + { + "pc": 329, + "op": "JUMPDEST", + "gas": 1568772, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x1" + ] + }, + { + "pc": 330, + "op": "PUSH1", + "gas": 1568771, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x1" + ] + }, + { + "pc": 332, + "op": "MLOAD", + "gas": 1568768, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x1", + "0x40" + ] + }, + { + "pc": 333, + "op": "PUSH3", + "gas": 1568765, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x1", + "0xe0" + ] + }, + { + "pc": 337, + "op": "SWAP2", + "gas": 1568762, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x1", + "0xe0", + "0x158" + ] + }, + { + "pc": 338, + "op": "SWAP1", + "gas": 1568759, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0xe0", + "0x1" + ] + }, + { + "pc": 339, + "op": "PUSH3", + "gas": 1568756, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0" + ] + }, + { + "pc": 343, + "op": "JUMP", + "gas": 1568753, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x997" + ] + }, + { + "pc": 2455, + "op": "JUMPDEST", + "gas": 1568745, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0" + ] + }, + { + "pc": 2456, + "op": "PUSH1", + "gas": 1568744, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0" + ] + }, + { + "pc": 2458, + "op": "PUSH1", + "gas": 1568741, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x0" + ] + }, + { + "pc": 2460, + "op": "DUP3", + "gas": 1568738, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x0", + "0x20" + ] + }, + { + "pc": 2461, + "op": "ADD", + "gas": 1568735, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x0", + "0x20", + "0xe0" + ] + }, + { + "pc": 2462, + "op": "SWAP1", + "gas": 1568732, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x0", + "0x100" + ] + }, + { + "pc": 2463, + "op": "POP", + "gas": 1568729, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x100", + "0x0" + ] + }, + { + "pc": 2464, + "op": "PUSH3", + "gas": 1568727, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x100" + ] + }, + { + "pc": 2468, + "op": "PUSH1", + "gas": 1568724, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x100", + "0x9ae" + ] + }, + { + "pc": 2470, + "op": "DUP4", + "gas": 1568721, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x100", + "0x9ae", + "0x0" + ] + }, + { + "pc": 2471, + "op": "ADD", + "gas": 1568718, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x100", + "0x9ae", + "0x0", + "0xe0" + ] + }, + { + "pc": 2472, + "op": "DUP5", + "gas": 1568715, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x100", + "0x9ae", + "0xe0" + ] + }, + { + "pc": 2473, + "op": "PUSH3", + "gas": 1568712, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x100", + "0x9ae", + "0xe0", + "0x1" + ] + }, + { + "pc": 2477, + "op": "JUMP", + "gas": 1568709, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x100", + "0x9ae", + "0xe0", + "0x1", + "0x986" + ] + }, + { + "pc": 2438, + "op": "JUMPDEST", + "gas": 1568701, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x100", + "0x9ae", + "0xe0", + "0x1" + ] + }, + { + "pc": 2439, + "op": "PUSH3", + "gas": 1568700, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x100", + "0x9ae", + "0xe0", + "0x1" + ] + }, + { + "pc": 2443, + "op": "DUP2", + "gas": 1568697, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x100", + "0x9ae", + "0xe0", + "0x1", + "0x991" + ] + }, + { + "pc": 2444, + "op": "PUSH3", + "gas": 1568694, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x100", + "0x9ae", + "0xe0", + "0x1", + "0x991", + "0x1" + ] + }, + { + "pc": 2448, + "op": "JUMP", + "gas": 1568691, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x100", + "0x9ae", + "0xe0", + "0x1", + "0x991", + "0x1", + "0x97c" + ] + }, + { + "pc": 2428, + "op": "JUMPDEST", + "gas": 1568683, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x100", + "0x9ae", + "0xe0", + "0x1", + "0x991", + "0x1" + ] + }, + { + "pc": 2429, + "op": "PUSH1", + "gas": 1568682, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x100", + "0x9ae", + "0xe0", + "0x1", + "0x991", + "0x1" + ] + }, + { + "pc": 2431, + "op": "DUP2", + "gas": 1568679, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x100", + "0x9ae", + "0xe0", + "0x1", + "0x991", + "0x1", + "0x0" + ] + }, + { + "pc": 2432, + "op": "SWAP1", + "gas": 1568676, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x100", + "0x9ae", + "0xe0", + "0x1", + "0x991", + "0x1", + "0x0", + "0x1" + ] + }, + { + "pc": 2433, + "op": "POP", + "gas": 1568673, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x100", + "0x9ae", + "0xe0", + "0x1", + "0x991", + "0x1", + "0x1", + "0x0" + ] + }, + { + "pc": 2434, + "op": "SWAP2", + "gas": 1568671, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x100", + "0x9ae", + "0xe0", + "0x1", + "0x991", + "0x1", + "0x1" + ] + }, + { + "pc": 2435, + "op": "SWAP1", + "gas": 1568668, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x100", + "0x9ae", + "0xe0", + "0x1", + "0x1", + "0x1", + "0x991" + ] + }, + { + "pc": 2436, + "op": "POP", + "gas": 1568665, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x100", + "0x9ae", + "0xe0", + "0x1", + "0x1", + "0x991", + "0x1" + ] + }, + { + "pc": 2437, + "op": "JUMP", + "gas": 1568663, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x100", + "0x9ae", + "0xe0", + "0x1", + "0x1", + "0x991" + ] + }, + { + "pc": 2449, + "op": "JUMPDEST", + "gas": 1568655, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x100", + "0x9ae", + "0xe0", + "0x1", + "0x1" + ] + }, + { + "pc": 2450, + "op": "DUP3", + "gas": 1568654, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x100", + "0x9ae", + "0xe0", + "0x1", + "0x1" + ] + }, + { + "pc": 2451, + "op": "MSTORE", + "gas": 1568651, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x100", + "0x9ae", + "0xe0", + "0x1", + "0x1", + "0xe0" + ] + }, + { + "pc": 2452, + "op": "POP", + "gas": 1568648, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x100", + "0x9ae", + "0xe0", + "0x1" + ] + }, + { + "pc": 2453, + "op": "POP", + "gas": 1568646, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x100", + "0x9ae", + "0xe0" + ] + }, + { + "pc": 2454, + "op": "JUMP", + "gas": 1568644, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x100", + "0x9ae" + ] + }, + { + "pc": 2478, + "op": "JUMPDEST", + "gas": 1568636, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x100" + ] + }, + { + "pc": 2479, + "op": "SWAP3", + "gas": 1568635, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x158", + "0x1", + "0xe0", + "0x100" + ] + }, + { + "pc": 2480, + "op": "SWAP2", + "gas": 1568632, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x100", + "0x1", + "0xe0", + "0x158" + ] + }, + { + "pc": 2481, + "op": "POP", + "gas": 1568629, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x100", + "0x158", + "0xe0", + "0x1" + ] + }, + { + "pc": 2482, + "op": "POP", + "gas": 1568627, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x100", + "0x158", + "0xe0" + ] + }, + { + "pc": 2483, + "op": "JUMP", + "gas": 1568625, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x100", + "0x158" + ] + }, + { + "pc": 344, + "op": "JUMPDEST", + "gas": 1568617, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x100" + ] + }, + { + "pc": 345, + "op": "PUSH1", + "gas": 1568616, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x100" + ] + }, + { + "pc": 347, + "op": "MLOAD", + "gas": 1568613, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x100", + "0x40" + ] + }, + { + "pc": 348, + "op": "DUP1", + "gas": 1568610, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x100", + "0xe0" + ] + }, + { + "pc": 349, + "op": "SWAP2", + "gas": 1568607, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x100", + "0xe0", + "0xe0" + ] + }, + { + "pc": 350, + "op": "SUB", + "gas": 1568604, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0xe0", + "0xe0", + "0x100" + ] + }, + { + "pc": 351, + "op": "SWAP1", + "gas": 1568601, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x3aa18088", + "0xe0", + "0x20" + ] + }, + { + "pc": 352, + "op": "RETURN", + "gas": 1568598, + "gasCost": 0, + "depth": 1, + "stack": [ + "0x3aa18088", + "0x20", + "0xe0" + ] + } + ] +} \ No newline at end of file diff --git a/test/historicstate/hardhat/scripts/geth_traces/Tracer.mint2.prestateDiffTracer.json b/test/historicstate/hardhat/scripts/geth_traces/Tracer.mint2.prestateDiffTracer.json new file mode 100644 index 000000000..289c3dbdf --- /dev/null +++ b/test/historicstate/hardhat/scripts/geth_traces/Tracer.mint2.prestateDiffTracer.json @@ -0,0 +1,42 @@ +{ + "post": { + "0x0000000000000000000000000000000000000000": { + "balance": "0x1beb69b" + }, + "0x61a286b8e87e2d31c475d71c85a0020584c44bae": { + "code": "0x608060405234801561001057600080fd5b50600436106100625760003560e01c80631c717069146100675780631c93908c1461008557806392954362146100b5578063a0712d68146100bf578063b69ef8a8146100ef578063c9353cb51461010d575b600080fd5b61006f610129565b60405161007c91906102ed565b60405180910390f35b61009f600480360381019061009a9190610343565b610178565b6040516100ac919061037f565b60405180910390f35b6100bd6101ea565b005b6100d960048036038101906100d49190610343565b610225565b6040516100e6919061037f565b60405180910390f35b6100f76102b5565b604051610104919061037f565b60405180910390f35b610127600480360381019061012291906103f8565b6102bb565b005b6000806040518060400160405280600d81526020017f48656c6c6f2c20776f726c6421000000000000000000000000000000000000008152509050600081805190602001209050809250505090565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0836040516101c09190610482565b60405180910390a281600260008282546101da91906104df565b9250508190555060029050919050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161021c90610581565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac08360405161026d91906105ed565b60405180910390a28160008082825461028691906104df565b925050819055506102a260018361029d91906104df565b610178565b506102ab610129565b5060019050919050565b60005481565b8073ffffffffffffffffffffffffffffffffffffffff16ff5b6000819050919050565b6102e7816102d4565b82525050565b600060208201905061030260008301846102de565b92915050565b600080fd5b6000819050919050565b6103208161030d565b811461032b57600080fd5b50565b60008135905061033d81610317565b92915050565b60006020828403121561035957610358610308565b5b60006103678482850161032e565b91505092915050565b6103798161030d565b82525050565b60006020820190506103946000830184610370565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103c58261039a565b9050919050565b6103d5816103ba565b81146103e057600080fd5b50565b6000813590506103f2816103cc565b92915050565b60006020828403121561040e5761040d610308565b5b600061041c848285016103e3565b91505092915050565b600082825260208201905092915050565b7f696e7465726e616c20746f706963000000000000000000000000000000000000600082015250565b600061046c600e83610425565b915061047782610436565b602082019050919050565b60006040820190506104976000830184610370565b81810360208301526104a88161045f565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006104ea8261030d565b91506104f58361030d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561052a576105296104b0565b5b828201905092915050565b7f546869732066756e6374696f6e20726576657274656421000000000000000000600082015250565b600061056b601783610425565b915061057682610535565b602082019050919050565b6000602082019050818103600083015261059a8161055e565b9050919050565b7f746f706963000000000000000000000000000000000000000000000000000000600082015250565b60006105d7600583610425565b91506105e2826105a1565b602082019050919050565b60006040820190506106026000830184610370565b8181036020830152610613816105ca565b90509291505056fea26469706673582212208743accab6cfcd1c8ccb3f51b787d679e803a77ce24ec642bd068883132fd5fa64736f6c63430008090033", + "nonce": 1, + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000001d6329f1c35ca4bfabb9f56100000003e8", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000001d6329f1c35ca4bfabb9f56100000003ea" + } + }, + "OWNER.address": { + "balance": "0x360ee5cfde69ec5c29", + "nonce": 83 + }, + "Tracer.address": { + "nonce": 2, + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x00000000000000000000000061a286b8e87e2d31c475d71c85a0020584c44bae", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000000000000000000000000000000000000000003e8", + "0x0000000000000000000000000000000000000000000000000000000000000003": "0x00000000000000000000000000000000000000000000000000000000000003e9" + } + } + }, + "pre": { + "0x0000000000000000000000000000000000000000": { + "balance": "0x1b69ad1" + }, + "OWNER.address": { + "balance": "0x360ee5cfe1af4203d1", + "nonce": 82 + }, + "Tracer.address": { + "balance": "0x0", + "code": "0x60806040523480156200001157600080fd5b5060043610620000ac5760003560e01c80638bfe44ff116200006f5780638bfe44ff14620001975780639295436214620001a3578063a0712d6814620001af578063b69ef8a814620001e5578063c9353cb5146200020757620000ac565b806312065fe014620000b15780631c71706914620000d35780631c93908c14620000f55780633aa18088146200012b5780637f29c3941462000161575b600080fd5b620000bb62000227565b604051620000ca919062000997565b60405180910390f35b620000dd62000231565b604051620000ec9190620009cf565b60405180910390f35b6200011360048036038101906200010d919062000a2c565b62000280565b60405162000122919062000997565b60405180910390f35b62000149600480360381019062000143919062000a2c565b620002f6565b60405162000158919062000997565b60405180910390f35b6200017f600480360381019062000179919062000a2c565b620004ae565b6040516200018e919062000997565b60405180910390f35b620001a162000783565b005b620001ad620007c5565b005b620001cd6004803603810190620001c7919062000a2c565b62000802565b604051620001dc919062000997565b60405180910390f35b620001ef6200094f565b604051620001fe919062000997565b60405180910390f35b6200022560048036038101906200021f919062000ac3565b62000955565b005b6000600154905090565b6000806040518060400160405280600d81526020017f48656c6c6f2c20776f726c6421000000000000000000000000000000000000008152509050600081805190602001209050809250505090565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac083604051620002ca919062000b56565b60405180910390a28160036000828254620002e6919062000bb7565b9250508190555060029050919050565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac08360405162000340919062000c64565b60405180910390a260405162000356906200096e565b604051809103906000f08015801562000373573d6000803e3d6000fd5b506000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160016000828254620003c7919062000bb7565b92505081905550620003e7600183620003e1919062000bb7565b62000280565b50620003f262000231565b5060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b81526004016200044e919062000997565b602060405180830381600087803b1580156200046957600080fd5b505af11580156200047e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004a4919062000cad565b5060019050919050565b60003073ffffffffffffffffffffffffffffffffffffffff1663929543626040518163ffffffff1660e01b815260040160006040518083038186803b158015620004f757600080fd5b505afa92505050801562000509575060015b620005f2576200051862000cec565b806308c379a014156200057d57506200053062000d87565b806200053d57506200057f565b7f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a816040516200056e919062000eab565b60405180910390a150620005ec565b505b3d8060008114620005ad576040519150601f19603f3d011682016040523d82523d6000602084013e620005b2565b606091505b507f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a604051620005e29062000f45565b60405180910390a1505b620005f3565b5b3073ffffffffffffffffffffffffffffffffffffffff16638bfe44ff6040518163ffffffff1660e01b815260040160006040518083038186803b1580156200063a57600080fd5b505afa9250505080156200064c575060015b62000735576200065b62000cec565b806308c379a01415620006c057506200067362000d87565b80620006805750620006c2565b7f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a81604051620006b1919062000eab565b60405180910390a1506200072f565b505b3d8060008114620006f0576040519150601f19603f3d011682016040523d82523d6000602084013e620006f5565b606091505b507f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a604051620007259062000f45565b60405180910390a1505b62000736565b5b60006200077a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007719062000fb7565b60405180910390fd5b60019050919050565b6001806040517fcf479181000000000000000000000000000000000000000000000000000000008152600401620007bc92919062001026565b60405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007f990620010a3565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0836040516200084c919062000c64565b60405180910390a2816001600082825462000868919062000bb7565b925050819055506200088860018362000882919062000bb7565b62000280565b506200089362000231565b5060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b8152600401620008ef919062000997565b602060405180830381600087803b1580156200090a57600080fd5b505af11580156200091f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000945919062000cad565b5060019050919050565b60015481565b8073ffffffffffffffffffffffffffffffffffffffff16ff5b610ae380620010c683390190565b6000819050919050565b62000991816200097c565b82525050565b6000602082019050620009ae600083018462000986565b92915050565b6000819050919050565b620009c981620009b4565b82525050565b6000602082019050620009e66000830184620009be565b92915050565b6000604051905090565b600080fd5b62000a06816200097c565b811462000a1257600080fd5b50565b60008135905062000a2681620009fb565b92915050565b60006020828403121562000a455762000a44620009f6565b5b600062000a558482850162000a15565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000a8b8262000a5e565b9050919050565b62000a9d8162000a7e565b811462000aa957600080fd5b50565b60008135905062000abd8162000a92565b92915050565b60006020828403121562000adc5762000adb620009f6565b5b600062000aec8482850162000aac565b91505092915050565b600082825260208201905092915050565b7f696e7465726e616c20746f706963000000000000000000000000000000000000600082015250565b600062000b3e600e8362000af5565b915062000b4b8262000b06565b602082019050919050565b600060408201905062000b6d600083018462000986565b818103602083015262000b808162000b2f565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000bc4826200097c565b915062000bd1836200097c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000c095762000c0862000b88565b5b828201905092915050565b7f746f706963000000000000000000000000000000000000000000000000000000600082015250565b600062000c4c60058362000af5565b915062000c598262000c14565b602082019050919050565b600060408201905062000c7b600083018462000986565b818103602083015262000c8e8162000c3d565b905092915050565b60008151905062000ca781620009fb565b92915050565b60006020828403121562000cc65762000cc5620009f6565b5b600062000cd68482850162000c96565b91505092915050565b60008160e01c9050919050565b600060033d111562000d0e5760046000803e62000d0b60005162000cdf565b90505b90565b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000d5c8262000d11565b810181811067ffffffffffffffff8211171562000d7e5762000d7d62000d22565b5b80604052505050565b600060443d101562000d995762000e26565b62000da3620009ec565b60043d036004823e80513d602482011167ffffffffffffffff8211171562000dcd57505062000e26565b808201805167ffffffffffffffff81111562000ded575050505062000e26565b80602083010160043d03850181111562000e0c57505050505062000e26565b62000e1d8260200185018662000d51565b82955050505050505b90565b600081519050919050565b60005b8381101562000e5457808201518184015260208101905062000e37565b8381111562000e64576000848401525b50505050565b600062000e778262000e29565b62000e83818562000af5565b935062000e9581856020860162000e34565b62000ea08162000d11565b840191505092915050565b6000602082019050818103600083015262000ec7818462000e6a565b905092915050565b7f45787465726e616c2063616c6c206661696c656420776974686f757420616e2060008201527f6572726f72206d65737361676500000000000000000000000000000000000000602082015250565b600062000f2d602d8362000af5565b915062000f3a8262000ecf565b604082019050919050565b6000602082019050818103600083015262000f608162000f1e565b9050919050565b7f494e53554646494349454e542042414c414e4345000000000000000000000000600082015250565b600062000f9f60148362000af5565b915062000fac8262000f67565b602082019050919050565b6000602082019050818103600083015262000fd28162000f90565b9050919050565b6000819050919050565b6000819050919050565b60006200100e62001008620010028462000fd9565b62000fe3565b6200097c565b9050919050565b620010208162000fed565b82525050565b60006040820190506200103d600083018562001015565b6200104c602083018462001015565b9392505050565b7f546869732066756e6374696f6e20726576657274656421000000000000000000600082015250565b60006200108b60178362000af5565b9150620010988262001053565b602082019050919050565b60006020820190508181036000830152620010be816200107c565b905091905056fe60806040526000600160006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b50600160009054906101000a900460ff161562000080576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200007790620002b5565b60405180910390fd5b60018060006101000a81548160ff021916908315150217905550620000bc701d6329f1c35ca4bfabb9f5610000000000620000c360201b60201c565b5062000482565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0836040516200010d919062000342565b60405180910390a281600080828254620001289190620003a3565b925050819055506200014e600183620001429190620003a3565b6200016960201b60201c565b506200015f620001df60201b60201c565b5060019050919050565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac083604051620001b3919062000450565b60405180910390a28160026000828254620001cf9190620003a3565b9250508190555060029050919050565b6000806040518060400160405280600d81526020017f48656c6c6f2c20776f726c6421000000000000000000000000000000000000008152509050600081805190602001209050809250505090565b600082825260208201905092915050565b7f436f6e747261637420696e7374616e63652068617320616c726561647920626560008201527f656e20696e697469616c697a6564000000000000000000000000000000000000602082015250565b60006200029d602e836200022e565b9150620002aa826200023f565b604082019050919050565b60006020820190508181036000830152620002d0816200028e565b9050919050565b6000819050919050565b620002ec81620002d7565b82525050565b7f746f706963000000000000000000000000000000000000000000000000000000600082015250565b60006200032a6005836200022e565b91506200033782620002f2565b602082019050919050565b6000604082019050620003596000830184620002e1565b81810360208301526200036c816200031b565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620003b082620002d7565b9150620003bd83620002d7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620003f557620003f462000374565b5b828201905092915050565b7f696e7465726e616c20746f706963000000000000000000000000000000000000600082015250565b600062000438600e836200022e565b9150620004458262000400565b602082019050919050565b6000604082019050620004676000830184620002e1565b81810360208301526200047a8162000429565b905092915050565b61065180620004926000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c80631c717069146100675780631c93908c1461008557806392954362146100b5578063a0712d68146100bf578063b69ef8a8146100ef578063c9353cb51461010d575b600080fd5b61006f610129565b60405161007c91906102ed565b60405180910390f35b61009f600480360381019061009a9190610343565b610178565b6040516100ac919061037f565b60405180910390f35b6100bd6101ea565b005b6100d960048036038101906100d49190610343565b610225565b6040516100e6919061037f565b60405180910390f35b6100f76102b5565b604051610104919061037f565b60405180910390f35b610127600480360381019061012291906103f8565b6102bb565b005b6000806040518060400160405280600d81526020017f48656c6c6f2c20776f726c6421000000000000000000000000000000000000008152509050600081805190602001209050809250505090565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0836040516101c09190610482565b60405180910390a281600260008282546101da91906104df565b9250508190555060029050919050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161021c90610581565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac08360405161026d91906105ed565b60405180910390a28160008082825461028691906104df565b925050819055506102a260018361029d91906104df565b610178565b506102ab610129565b5060019050919050565b60005481565b8073ffffffffffffffffffffffffffffffffffffffff16ff5b6000819050919050565b6102e7816102d4565b82525050565b600060208201905061030260008301846102de565b92915050565b600080fd5b6000819050919050565b6103208161030d565b811461032b57600080fd5b50565b60008135905061033d81610317565b92915050565b60006020828403121561035957610358610308565b5b60006103678482850161032e565b91505092915050565b6103798161030d565b82525050565b60006020820190506103946000830184610370565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103c58261039a565b9050919050565b6103d5816103ba565b81146103e057600080fd5b50565b6000813590506103f2816103cc565b92915050565b60006020828403121561040e5761040d610308565b5b600061041c848285016103e3565b91505092915050565b600082825260208201905092915050565b7f696e7465726e616c20746f706963000000000000000000000000000000000000600082015250565b600061046c600e83610425565b915061047782610436565b602082019050919050565b60006040820190506104976000830184610370565b81810360208301526104a88161045f565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006104ea8261030d565b91506104f58361030d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561052a576105296104b0565b5b828201905092915050565b7f546869732066756e6374696f6e20726576657274656421000000000000000000600082015250565b600061056b601783610425565b915061057682610535565b602082019050919050565b6000602082019050818103600083015261059a8161055e565b9050919050565b7f746f706963000000000000000000000000000000000000000000000000000000600082015250565b60006105d7600583610425565b91506105e2826105a1565b602082019050919050565b60006040820190506106026000830184610370565b8181036020830152610613816105ca565b90509291505056fea26469706673582212208743accab6cfcd1c8ccb3f51b787d679e803a77ce24ec642bd068883132fd5fa64736f6c63430008090033a264697066735822122066241fedca9ebd69f0cd9e4879f75428f5d4bf734eb072e52934a8b3161581f064736f6c63430008090033", + "nonce": 1 + } + } +} \ No newline at end of file diff --git a/test/historicstate/hardhat/scripts/geth_traces/Tracer.mint2.prestateTracer.json b/test/historicstate/hardhat/scripts/geth_traces/Tracer.mint2.prestateTracer.json new file mode 100644 index 000000000..e498b7623 --- /dev/null +++ b/test/historicstate/hardhat/scripts/geth_traces/Tracer.mint2.prestateTracer.json @@ -0,0 +1,27 @@ +{ + "0x0000000000000000000000000000000000000000": { + "balance": "0x1b69ad1" + }, + "0x61a286b8e87e2d31c475d71c85a0020584c44bae": { + "balance": "0x0", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + }, + "OWNER.address": { + "balance": "0x360ee5cfe1af4203d1", + "nonce": 82 + }, + "Tracer.address": { + "balance": "0x0", + "code": "0x60806040523480156200001157600080fd5b5060043610620000ac5760003560e01c80638bfe44ff116200006f5780638bfe44ff14620001975780639295436214620001a3578063a0712d6814620001af578063b69ef8a814620001e5578063c9353cb5146200020757620000ac565b806312065fe014620000b15780631c71706914620000d35780631c93908c14620000f55780633aa18088146200012b5780637f29c3941462000161575b600080fd5b620000bb62000227565b604051620000ca919062000997565b60405180910390f35b620000dd62000231565b604051620000ec9190620009cf565b60405180910390f35b6200011360048036038101906200010d919062000a2c565b62000280565b60405162000122919062000997565b60405180910390f35b62000149600480360381019062000143919062000a2c565b620002f6565b60405162000158919062000997565b60405180910390f35b6200017f600480360381019062000179919062000a2c565b620004ae565b6040516200018e919062000997565b60405180910390f35b620001a162000783565b005b620001ad620007c5565b005b620001cd6004803603810190620001c7919062000a2c565b62000802565b604051620001dc919062000997565b60405180910390f35b620001ef6200094f565b604051620001fe919062000997565b60405180910390f35b6200022560048036038101906200021f919062000ac3565b62000955565b005b6000600154905090565b6000806040518060400160405280600d81526020017f48656c6c6f2c20776f726c6421000000000000000000000000000000000000008152509050600081805190602001209050809250505090565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac083604051620002ca919062000b56565b60405180910390a28160036000828254620002e6919062000bb7565b9250508190555060029050919050565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac08360405162000340919062000c64565b60405180910390a260405162000356906200096e565b604051809103906000f08015801562000373573d6000803e3d6000fd5b506000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160016000828254620003c7919062000bb7565b92505081905550620003e7600183620003e1919062000bb7565b62000280565b50620003f262000231565b5060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b81526004016200044e919062000997565b602060405180830381600087803b1580156200046957600080fd5b505af11580156200047e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004a4919062000cad565b5060019050919050565b60003073ffffffffffffffffffffffffffffffffffffffff1663929543626040518163ffffffff1660e01b815260040160006040518083038186803b158015620004f757600080fd5b505afa92505050801562000509575060015b620005f2576200051862000cec565b806308c379a014156200057d57506200053062000d87565b806200053d57506200057f565b7f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a816040516200056e919062000eab565b60405180910390a150620005ec565b505b3d8060008114620005ad576040519150601f19603f3d011682016040523d82523d6000602084013e620005b2565b606091505b507f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a604051620005e29062000f45565b60405180910390a1505b620005f3565b5b3073ffffffffffffffffffffffffffffffffffffffff16638bfe44ff6040518163ffffffff1660e01b815260040160006040518083038186803b1580156200063a57600080fd5b505afa9250505080156200064c575060015b62000735576200065b62000cec565b806308c379a01415620006c057506200067362000d87565b80620006805750620006c2565b7f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a81604051620006b1919062000eab565b60405180910390a1506200072f565b505b3d8060008114620006f0576040519150601f19603f3d011682016040523d82523d6000602084013e620006f5565b606091505b507f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a604051620007259062000f45565b60405180910390a1505b62000736565b5b60006200077a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007719062000fb7565b60405180910390fd5b60019050919050565b6001806040517fcf479181000000000000000000000000000000000000000000000000000000008152600401620007bc92919062001026565b60405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007f990620010a3565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0836040516200084c919062000c64565b60405180910390a2816001600082825462000868919062000bb7565b925050819055506200088860018362000882919062000bb7565b62000280565b506200089362000231565b5060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b8152600401620008ef919062000997565b602060405180830381600087803b1580156200090a57600080fd5b505af11580156200091f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000945919062000cad565b5060019050919050565b60015481565b8073ffffffffffffffffffffffffffffffffffffffff16ff5b610ae380620010c683390190565b6000819050919050565b62000991816200097c565b82525050565b6000602082019050620009ae600083018462000986565b92915050565b6000819050919050565b620009c981620009b4565b82525050565b6000602082019050620009e66000830184620009be565b92915050565b6000604051905090565b600080fd5b62000a06816200097c565b811462000a1257600080fd5b50565b60008135905062000a2681620009fb565b92915050565b60006020828403121562000a455762000a44620009f6565b5b600062000a558482850162000a15565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000a8b8262000a5e565b9050919050565b62000a9d8162000a7e565b811462000aa957600080fd5b50565b60008135905062000abd8162000a92565b92915050565b60006020828403121562000adc5762000adb620009f6565b5b600062000aec8482850162000aac565b91505092915050565b600082825260208201905092915050565b7f696e7465726e616c20746f706963000000000000000000000000000000000000600082015250565b600062000b3e600e8362000af5565b915062000b4b8262000b06565b602082019050919050565b600060408201905062000b6d600083018462000986565b818103602083015262000b808162000b2f565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000bc4826200097c565b915062000bd1836200097c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000c095762000c0862000b88565b5b828201905092915050565b7f746f706963000000000000000000000000000000000000000000000000000000600082015250565b600062000c4c60058362000af5565b915062000c598262000c14565b602082019050919050565b600060408201905062000c7b600083018462000986565b818103602083015262000c8e8162000c3d565b905092915050565b60008151905062000ca781620009fb565b92915050565b60006020828403121562000cc65762000cc5620009f6565b5b600062000cd68482850162000c96565b91505092915050565b60008160e01c9050919050565b600060033d111562000d0e5760046000803e62000d0b60005162000cdf565b90505b90565b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000d5c8262000d11565b810181811067ffffffffffffffff8211171562000d7e5762000d7d62000d22565b5b80604052505050565b600060443d101562000d995762000e26565b62000da3620009ec565b60043d036004823e80513d602482011167ffffffffffffffff8211171562000dcd57505062000e26565b808201805167ffffffffffffffff81111562000ded575050505062000e26565b80602083010160043d03850181111562000e0c57505050505062000e26565b62000e1d8260200185018662000d51565b82955050505050505b90565b600081519050919050565b60005b8381101562000e5457808201518184015260208101905062000e37565b8381111562000e64576000848401525b50505050565b600062000e778262000e29565b62000e83818562000af5565b935062000e9581856020860162000e34565b62000ea08162000d11565b840191505092915050565b6000602082019050818103600083015262000ec7818462000e6a565b905092915050565b7f45787465726e616c2063616c6c206661696c656420776974686f757420616e2060008201527f6572726f72206d65737361676500000000000000000000000000000000000000602082015250565b600062000f2d602d8362000af5565b915062000f3a8262000ecf565b604082019050919050565b6000602082019050818103600083015262000f608162000f1e565b9050919050565b7f494e53554646494349454e542042414c414e4345000000000000000000000000600082015250565b600062000f9f60148362000af5565b915062000fac8262000f67565b602082019050919050565b6000602082019050818103600083015262000fd28162000f90565b9050919050565b6000819050919050565b6000819050919050565b60006200100e62001008620010028462000fd9565b62000fe3565b6200097c565b9050919050565b620010208162000fed565b82525050565b60006040820190506200103d600083018562001015565b6200104c602083018462001015565b9392505050565b7f546869732066756e6374696f6e20726576657274656421000000000000000000600082015250565b60006200108b60178362000af5565b9150620010988262001053565b602082019050919050565b60006020820190508181036000830152620010be816200107c565b905091905056fe60806040526000600160006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b50600160009054906101000a900460ff161562000080576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200007790620002b5565b60405180910390fd5b60018060006101000a81548160ff021916908315150217905550620000bc701d6329f1c35ca4bfabb9f5610000000000620000c360201b60201c565b5062000482565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0836040516200010d919062000342565b60405180910390a281600080828254620001289190620003a3565b925050819055506200014e600183620001429190620003a3565b6200016960201b60201c565b506200015f620001df60201b60201c565b5060019050919050565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac083604051620001b3919062000450565b60405180910390a28160026000828254620001cf9190620003a3565b9250508190555060029050919050565b6000806040518060400160405280600d81526020017f48656c6c6f2c20776f726c6421000000000000000000000000000000000000008152509050600081805190602001209050809250505090565b600082825260208201905092915050565b7f436f6e747261637420696e7374616e63652068617320616c726561647920626560008201527f656e20696e697469616c697a6564000000000000000000000000000000000000602082015250565b60006200029d602e836200022e565b9150620002aa826200023f565b604082019050919050565b60006020820190508181036000830152620002d0816200028e565b9050919050565b6000819050919050565b620002ec81620002d7565b82525050565b7f746f706963000000000000000000000000000000000000000000000000000000600082015250565b60006200032a6005836200022e565b91506200033782620002f2565b602082019050919050565b6000604082019050620003596000830184620002e1565b81810360208301526200036c816200031b565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620003b082620002d7565b9150620003bd83620002d7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620003f557620003f462000374565b5b828201905092915050565b7f696e7465726e616c20746f706963000000000000000000000000000000000000600082015250565b600062000438600e836200022e565b9150620004458262000400565b602082019050919050565b6000604082019050620004676000830184620002e1565b81810360208301526200047a8162000429565b905092915050565b61065180620004926000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c80631c717069146100675780631c93908c1461008557806392954362146100b5578063a0712d68146100bf578063b69ef8a8146100ef578063c9353cb51461010d575b600080fd5b61006f610129565b60405161007c91906102ed565b60405180910390f35b61009f600480360381019061009a9190610343565b610178565b6040516100ac919061037f565b60405180910390f35b6100bd6101ea565b005b6100d960048036038101906100d49190610343565b610225565b6040516100e6919061037f565b60405180910390f35b6100f76102b5565b604051610104919061037f565b60405180910390f35b610127600480360381019061012291906103f8565b6102bb565b005b6000806040518060400160405280600d81526020017f48656c6c6f2c20776f726c6421000000000000000000000000000000000000008152509050600081805190602001209050809250505090565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0836040516101c09190610482565b60405180910390a281600260008282546101da91906104df565b9250508190555060029050919050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161021c90610581565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac08360405161026d91906105ed565b60405180910390a28160008082825461028691906104df565b925050819055506102a260018361029d91906104df565b610178565b506102ab610129565b5060019050919050565b60005481565b8073ffffffffffffffffffffffffffffffffffffffff16ff5b6000819050919050565b6102e7816102d4565b82525050565b600060208201905061030260008301846102de565b92915050565b600080fd5b6000819050919050565b6103208161030d565b811461032b57600080fd5b50565b60008135905061033d81610317565b92915050565b60006020828403121561035957610358610308565b5b60006103678482850161032e565b91505092915050565b6103798161030d565b82525050565b60006020820190506103946000830184610370565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103c58261039a565b9050919050565b6103d5816103ba565b81146103e057600080fd5b50565b6000813590506103f2816103cc565b92915050565b60006020828403121561040e5761040d610308565b5b600061041c848285016103e3565b91505092915050565b600082825260208201905092915050565b7f696e7465726e616c20746f706963000000000000000000000000000000000000600082015250565b600061046c600e83610425565b915061047782610436565b602082019050919050565b60006040820190506104976000830184610370565b81810360208301526104a88161045f565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006104ea8261030d565b91506104f58361030d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561052a576105296104b0565b5b828201905092915050565b7f546869732066756e6374696f6e20726576657274656421000000000000000000600082015250565b600061056b601783610425565b915061057682610535565b602082019050919050565b6000602082019050818103600083015261059a8161055e565b9050919050565b7f746f706963000000000000000000000000000000000000000000000000000000600082015250565b60006105d7600583610425565b91506105e2826105a1565b602082019050919050565b60006040820190506106026000830184610370565b8181036020830152610613816105ca565b90509291505056fea26469706673582212208743accab6cfcd1c8ccb3f51b787d679e803a77ce24ec642bd068883132fd5fa64736f6c63430008090033a264697066735822122066241fedca9ebd69f0cd9e4879f75428f5d4bf734eb072e52934a8b3161581f064736f6c63430008090033", + "nonce": 1, + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000003": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + } +} \ No newline at end of file diff --git a/test/historicstate/hardhat/scripts/geth_traces/Tracer.readableRevert.4byteTracer.json b/test/historicstate/hardhat/scripts/geth_traces/Tracer.readableRevert.4byteTracer.json new file mode 100644 index 000000000..9e7fa8097 --- /dev/null +++ b/test/historicstate/hardhat/scripts/geth_traces/Tracer.readableRevert.4byteTracer.json @@ -0,0 +1,5 @@ +{ + "0x7f29c394-32": 1, + "0x8bfe44ff-0": 1, + "0x92954362-0": 1 +} \ No newline at end of file diff --git a/test/historicstate/hardhat/scripts/geth_traces/Tracer.readableRevert.callTracer.json b/test/historicstate/hardhat/scripts/geth_traces/Tracer.readableRevert.callTracer.json new file mode 100644 index 000000000..e8896f379 --- /dev/null +++ b/test/historicstate/hardhat/scripts/geth_traces/Tracer.readableRevert.callTracer.json @@ -0,0 +1,35 @@ +{ + "from": "OWNER.address", + "gas": "0x200b20", + "gasUsed": "0x70ff", + "to": "Tracer.address", + "input": "0x7f29c39400000000000000000000000000000000000000000000000000000000000003e8", + "output": "0x08c379a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000014494e53554646494349454e542042414c414e4345000000000000000000000000", + "error": "execution reverted", + "revertReason": "INSUFFICIENT BALANCE", + "calls": [ + { + "from": "Tracer.address", + "gas": "0x1f3655", + "gasUsed": "0x1c8", + "to": "Tracer.address", + "input": "0x92954362", + "output": "0x08c379a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000017546869732066756e6374696f6e20726576657274656421000000000000000000", + "error": "execution reverted", + "revertReason": "This function reverted!", + "type": "STATICCALL" + }, + { + "from": "Tracer.address", + "gas": "0x1f28cc", + "gasUsed": "0x2b8", + "to": "Tracer.address", + "input": "0x8bfe44ff", + "output": "0xcf47918100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "error": "execution reverted", + "type": "STATICCALL" + } + ], + "value": "0x0", + "type": "CALL" +} \ No newline at end of file diff --git a/test/historicstate/hardhat/scripts/geth_traces/Tracer.readableRevert.defaultTracer.json b/test/historicstate/hardhat/scripts/geth_traces/Tracer.readableRevert.defaultTracer.json new file mode 100644 index 000000000..df6d34099 --- /dev/null +++ b/test/historicstate/hardhat/scripts/geth_traces/Tracer.readableRevert.defaultTracer.json @@ -0,0 +1,22633 @@ +{ + "gas": 28927, + "failed": true, + "returnValue": "08c379a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000014494e53554646494349454e542042414c414e4345000000000000000000000000", + "structLogs": [ + { + "pc": 0, + "op": "PUSH1", + "gas": 2078784, + "gasCost": 3, + "depth": 1, + "stack": [] + }, + { + "pc": 2, + "op": "PUSH1", + "gas": 2078781, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x80" + ] + }, + { + "pc": 4, + "op": "MSTORE", + "gas": 2078778, + "gasCost": 12, + "depth": 1, + "stack": [ + "0x80", + "0x40" + ] + }, + { + "pc": 5, + "op": "CALLVALUE", + "gas": 2078766, + "gasCost": 2, + "depth": 1, + "stack": [] + }, + { + "pc": 6, + "op": "DUP1", + "gas": 2078764, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0" + ] + }, + { + "pc": 7, + "op": "ISZERO", + "gas": 2078761, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0", + "0x0" + ] + }, + { + "pc": 8, + "op": "PUSH3", + "gas": 2078758, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0", + "0x1" + ] + }, + { + "pc": 12, + "op": "JUMPI", + "gas": 2078755, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x0", + "0x1", + "0x11" + ] + }, + { + "pc": 17, + "op": "JUMPDEST", + "gas": 2078745, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x0" + ] + }, + { + "pc": 18, + "op": "POP", + "gas": 2078744, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x0" + ] + }, + { + "pc": 19, + "op": "PUSH1", + "gas": 2078742, + "gasCost": 3, + "depth": 1, + "stack": [] + }, + { + "pc": 21, + "op": "CALLDATASIZE", + "gas": 2078739, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x4" + ] + }, + { + "pc": 22, + "op": "LT", + "gas": 2078737, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x4", + "0x24" + ] + }, + { + "pc": 23, + "op": "PUSH3", + "gas": 2078734, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0" + ] + }, + { + "pc": 27, + "op": "JUMPI", + "gas": 2078731, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x0", + "0xac" + ] + }, + { + "pc": 28, + "op": "PUSH1", + "gas": 2078721, + "gasCost": 3, + "depth": 1, + "stack": [] + }, + { + "pc": 30, + "op": "CALLDATALOAD", + "gas": 2078718, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x0" + ] + }, + { + "pc": 31, + "op": "PUSH1", + "gas": 2078715, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c39400000000000000000000000000000000000000000000000000000000" + ] + }, + { + "pc": 33, + "op": "SHR", + "gas": 2078712, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c39400000000000000000000000000000000000000000000000000000000", + "0xe0" + ] + }, + { + "pc": 34, + "op": "DUP1", + "gas": 2078709, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394" + ] + }, + { + "pc": 35, + "op": "PUSH4", + "gas": 2078706, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x7f29c394" + ] + }, + { + "pc": 40, + "op": "GT", + "gas": 2078703, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x7f29c394", + "0x8bfe44ff" + ] + }, + { + "pc": 41, + "op": "PUSH3", + "gas": 2078700, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x1" + ] + }, + { + "pc": 45, + "op": "JUMPI", + "gas": 2078697, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x1", + "0x6f" + ] + }, + { + "pc": 111, + "op": "JUMPDEST", + "gas": 2078687, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394" + ] + }, + { + "pc": 112, + "op": "DUP1", + "gas": 2078686, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394" + ] + }, + { + "pc": 113, + "op": "PUSH4", + "gas": 2078683, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x7f29c394" + ] + }, + { + "pc": 118, + "op": "EQ", + "gas": 2078680, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x7f29c394", + "0x12065fe0" + ] + }, + { + "pc": 119, + "op": "PUSH3", + "gas": 2078677, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x0" + ] + }, + { + "pc": 123, + "op": "JUMPI", + "gas": 2078674, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x0", + "0xb1" + ] + }, + { + "pc": 124, + "op": "DUP1", + "gas": 2078664, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394" + ] + }, + { + "pc": 125, + "op": "PUSH4", + "gas": 2078661, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x7f29c394" + ] + }, + { + "pc": 130, + "op": "EQ", + "gas": 2078658, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x7f29c394", + "0x1c717069" + ] + }, + { + "pc": 131, + "op": "PUSH3", + "gas": 2078655, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x0" + ] + }, + { + "pc": 135, + "op": "JUMPI", + "gas": 2078652, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x0", + "0xd3" + ] + }, + { + "pc": 136, + "op": "DUP1", + "gas": 2078642, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394" + ] + }, + { + "pc": 137, + "op": "PUSH4", + "gas": 2078639, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x7f29c394" + ] + }, + { + "pc": 142, + "op": "EQ", + "gas": 2078636, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x7f29c394", + "0x1c93908c" + ] + }, + { + "pc": 143, + "op": "PUSH3", + "gas": 2078633, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x0" + ] + }, + { + "pc": 147, + "op": "JUMPI", + "gas": 2078630, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x0", + "0xf5" + ] + }, + { + "pc": 148, + "op": "DUP1", + "gas": 2078620, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394" + ] + }, + { + "pc": 149, + "op": "PUSH4", + "gas": 2078617, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x7f29c394" + ] + }, + { + "pc": 154, + "op": "EQ", + "gas": 2078614, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x7f29c394", + "0x3aa18088" + ] + }, + { + "pc": 155, + "op": "PUSH3", + "gas": 2078611, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x0" + ] + }, + { + "pc": 159, + "op": "JUMPI", + "gas": 2078608, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x0", + "0x12b" + ] + }, + { + "pc": 160, + "op": "DUP1", + "gas": 2078598, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394" + ] + }, + { + "pc": 161, + "op": "PUSH4", + "gas": 2078595, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x7f29c394" + ] + }, + { + "pc": 166, + "op": "EQ", + "gas": 2078592, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x7f29c394", + "0x7f29c394" + ] + }, + { + "pc": 167, + "op": "PUSH3", + "gas": 2078589, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x1" + ] + }, + { + "pc": 171, + "op": "JUMPI", + "gas": 2078586, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x1", + "0x161" + ] + }, + { + "pc": 353, + "op": "JUMPDEST", + "gas": 2078576, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394" + ] + }, + { + "pc": 354, + "op": "PUSH3", + "gas": 2078575, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394" + ] + }, + { + "pc": 358, + "op": "PUSH1", + "gas": 2078572, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f" + ] + }, + { + "pc": 360, + "op": "DUP1", + "gas": 2078569, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x4" + ] + }, + { + "pc": 361, + "op": "CALLDATASIZE", + "gas": 2078566, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x4", + "0x4" + ] + }, + { + "pc": 362, + "op": "SUB", + "gas": 2078564, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x4", + "0x4", + "0x24" + ] + }, + { + "pc": 363, + "op": "DUP2", + "gas": 2078561, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x4", + "0x20" + ] + }, + { + "pc": 364, + "op": "ADD", + "gas": 2078558, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x4", + "0x20", + "0x4" + ] + }, + { + "pc": 365, + "op": "SWAP1", + "gas": 2078555, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x4", + "0x24" + ] + }, + { + "pc": 366, + "op": "PUSH3", + "gas": 2078552, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x24", + "0x4" + ] + }, + { + "pc": 370, + "op": "SWAP2", + "gas": 2078549, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x24", + "0x4", + "0x179" + ] + }, + { + "pc": 371, + "op": "SWAP1", + "gas": 2078546, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x4", + "0x24" + ] + }, + { + "pc": 372, + "op": "PUSH3", + "gas": 2078543, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4" + ] + }, + { + "pc": 376, + "op": "JUMP", + "gas": 2078540, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0xa2c" + ] + }, + { + "pc": 2604, + "op": "JUMPDEST", + "gas": 2078532, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4" + ] + }, + { + "pc": 2605, + "op": "PUSH1", + "gas": 2078531, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4" + ] + }, + { + "pc": 2607, + "op": "PUSH1", + "gas": 2078528, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0" + ] + }, + { + "pc": 2609, + "op": "DUP3", + "gas": 2078525, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x20" + ] + }, + { + "pc": 2610, + "op": "DUP5", + "gas": 2078522, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x20", + "0x4" + ] + }, + { + "pc": 2611, + "op": "SUB", + "gas": 2078519, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x20", + "0x4", + "0x24" + ] + }, + { + "pc": 2612, + "op": "SLT", + "gas": 2078516, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x20", + "0x20" + ] + }, + { + "pc": 2613, + "op": "ISZERO", + "gas": 2078513, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0" + ] + }, + { + "pc": 2614, + "op": "PUSH3", + "gas": 2078510, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x1" + ] + }, + { + "pc": 2618, + "op": "JUMPI", + "gas": 2078507, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x1", + "0xa45" + ] + }, + { + "pc": 2629, + "op": "JUMPDEST", + "gas": 2078497, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0" + ] + }, + { + "pc": 2630, + "op": "PUSH1", + "gas": 2078496, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0" + ] + }, + { + "pc": 2632, + "op": "PUSH3", + "gas": 2078493, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0" + ] + }, + { + "pc": 2636, + "op": "DUP5", + "gas": 2078490, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55" + ] + }, + { + "pc": 2637, + "op": "DUP3", + "gas": 2078487, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24" + ] + }, + { + "pc": 2638, + "op": "DUP6", + "gas": 2078484, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x0" + ] + }, + { + "pc": 2639, + "op": "ADD", + "gas": 2078481, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x0", + "0x4" + ] + }, + { + "pc": 2640, + "op": "PUSH3", + "gas": 2078478, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4" + ] + }, + { + "pc": 2644, + "op": "JUMP", + "gas": 2078475, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0xa15" + ] + }, + { + "pc": 2581, + "op": "JUMPDEST", + "gas": 2078467, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4" + ] + }, + { + "pc": 2582, + "op": "PUSH1", + "gas": 2078466, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4" + ] + }, + { + "pc": 2584, + "op": "DUP2", + "gas": 2078463, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x0" + ] + }, + { + "pc": 2585, + "op": "CALLDATALOAD", + "gas": 2078460, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x0", + "0x4" + ] + }, + { + "pc": 2586, + "op": "SWAP1", + "gas": 2078457, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x0", + "0x3e8" + ] + }, + { + "pc": 2587, + "op": "POP", + "gas": 2078454, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2588, + "op": "PUSH3", + "gas": 2078452, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8" + ] + }, + { + "pc": 2592, + "op": "DUP2", + "gas": 2078449, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26" + ] + }, + { + "pc": 2593, + "op": "PUSH3", + "gas": 2078446, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8" + ] + }, + { + "pc": 2597, + "op": "JUMP", + "gas": 2078443, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0x9fb" + ] + }, + { + "pc": 2555, + "op": "JUMPDEST", + "gas": 2078435, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8" + ] + }, + { + "pc": 2556, + "op": "PUSH3", + "gas": 2078434, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8" + ] + }, + { + "pc": 2560, + "op": "DUP2", + "gas": 2078431, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0xa06" + ] + }, + { + "pc": 2561, + "op": "PUSH3", + "gas": 2078428, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0xa06", + "0x3e8" + ] + }, + { + "pc": 2565, + "op": "JUMP", + "gas": 2078425, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0xa06", + "0x3e8", + "0x97c" + ] + }, + { + "pc": 2428, + "op": "JUMPDEST", + "gas": 2078417, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0xa06", + "0x3e8" + ] + }, + { + "pc": 2429, + "op": "PUSH1", + "gas": 2078416, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0xa06", + "0x3e8" + ] + }, + { + "pc": 2431, + "op": "DUP2", + "gas": 2078413, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0xa06", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2432, + "op": "SWAP1", + "gas": 2078410, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0xa06", + "0x3e8", + "0x0", + "0x3e8" + ] + }, + { + "pc": 2433, + "op": "POP", + "gas": 2078407, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0xa06", + "0x3e8", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2434, + "op": "SWAP2", + "gas": 2078405, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0xa06", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 2435, + "op": "SWAP1", + "gas": 2078402, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0x3e8", + "0x3e8", + "0xa06" + ] + }, + { + "pc": 2436, + "op": "POP", + "gas": 2078399, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0x3e8", + "0xa06", + "0x3e8" + ] + }, + { + "pc": 2437, + "op": "JUMP", + "gas": 2078397, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0x3e8", + "0xa06" + ] + }, + { + "pc": 2566, + "op": "JUMPDEST", + "gas": 2078389, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 2567, + "op": "DUP2", + "gas": 2078388, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 2568, + "op": "EQ", + "gas": 2078385, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0x3e8", + "0x3e8" + ] + }, + { + "pc": 2569, + "op": "PUSH3", + "gas": 2078382, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0x1" + ] + }, + { + "pc": 2573, + "op": "JUMPI", + "gas": 2078379, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8", + "0x1", + "0xa12" + ] + }, + { + "pc": 2578, + "op": "JUMPDEST", + "gas": 2078369, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8" + ] + }, + { + "pc": 2579, + "op": "POP", + "gas": 2078368, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26", + "0x3e8" + ] + }, + { + "pc": 2580, + "op": "JUMP", + "gas": 2078366, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8", + "0xa26" + ] + }, + { + "pc": 2598, + "op": "JUMPDEST", + "gas": 2078358, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8" + ] + }, + { + "pc": 2599, + "op": "SWAP3", + "gas": 2078357, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0xa55", + "0x24", + "0x4", + "0x3e8" + ] + }, + { + "pc": 2600, + "op": "SWAP2", + "gas": 2078354, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0x3e8", + "0x24", + "0x4", + "0xa55" + ] + }, + { + "pc": 2601, + "op": "POP", + "gas": 2078351, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0x3e8", + "0xa55", + "0x4", + "0x24" + ] + }, + { + "pc": 2602, + "op": "POP", + "gas": 2078349, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0x3e8", + "0xa55", + "0x4" + ] + }, + { + "pc": 2603, + "op": "JUMP", + "gas": 2078347, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0x3e8", + "0xa55" + ] + }, + { + "pc": 2645, + "op": "JUMPDEST", + "gas": 2078339, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0x3e8" + ] + }, + { + "pc": 2646, + "op": "SWAP2", + "gas": 2078338, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x0", + "0x0", + "0x3e8" + ] + }, + { + "pc": 2647, + "op": "POP", + "gas": 2078335, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x3e8", + "0x0", + "0x0" + ] + }, + { + "pc": 2648, + "op": "POP", + "gas": 2078333, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x3e8", + "0x0" + ] + }, + { + "pc": 2649, + "op": "SWAP3", + "gas": 2078331, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x179", + "0x24", + "0x4", + "0x3e8" + ] + }, + { + "pc": 2650, + "op": "SWAP2", + "gas": 2078328, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x24", + "0x4", + "0x179" + ] + }, + { + "pc": 2651, + "op": "POP", + "gas": 2078325, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x179", + "0x4", + "0x24" + ] + }, + { + "pc": 2652, + "op": "POP", + "gas": 2078323, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x179", + "0x4" + ] + }, + { + "pc": 2653, + "op": "JUMP", + "gas": 2078321, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x179" + ] + }, + { + "pc": 377, + "op": "JUMPDEST", + "gas": 2078313, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8" + ] + }, + { + "pc": 378, + "op": "PUSH3", + "gas": 2078312, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8" + ] + }, + { + "pc": 382, + "op": "JUMP", + "gas": 2078309, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x4ae" + ] + }, + { + "pc": 1198, + "op": "JUMPDEST", + "gas": 2078301, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8" + ] + }, + { + "pc": 1199, + "op": "PUSH1", + "gas": 2078300, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8" + ] + }, + { + "pc": 1201, + "op": "ADDRESS", + "gas": 2078297, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0" + ] + }, + { + "pc": 1202, + "op": "PUSH20", + "gas": 2078295, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address" + ] + }, + { + "pc": 1223, + "op": "AND", + "gas": 2078292, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0xffffffffffffffffffffffffffffffffffffffff" + ] + }, + { + "pc": 1224, + "op": "PUSH4", + "gas": 2078289, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address" + ] + }, + { + "pc": 1229, + "op": "PUSH1", + "gas": 2078286, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x92954362" + ] + }, + { + "pc": 1231, + "op": "MLOAD", + "gas": 2078283, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x92954362", + "0x40" + ] + }, + { + "pc": 1232, + "op": "DUP2", + "gas": 2078280, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x92954362", + "0x80" + ] + }, + { + "pc": 1233, + "op": "PUSH4", + "gas": 2078277, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x92954362", + "0x80", + "0x92954362" + ] + }, + { + "pc": 1238, + "op": "AND", + "gas": 2078274, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x92954362", + "0x80", + "0x92954362", + "0xffffffff" + ] + }, + { + "pc": 1239, + "op": "PUSH1", + "gas": 2078271, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x92954362", + "0x80", + "0x92954362" + ] + }, + { + "pc": 1241, + "op": "SHL", + "gas": 2078268, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x92954362", + "0x80", + "0x92954362", + "0xe0" + ] + }, + { + "pc": 1242, + "op": "DUP2", + "gas": 2078265, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x92954362", + "0x80", + "0x9295436200000000000000000000000000000000000000000000000000000000" + ] + }, + { + "pc": 1243, + "op": "MSTORE", + "gas": 2078262, + "gasCost": 9, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x92954362", + "0x80", + "0x9295436200000000000000000000000000000000000000000000000000000000", + "0x80" + ] + }, + { + "pc": 1244, + "op": "PUSH1", + "gas": 2078253, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x92954362", + "0x80" + ] + }, + { + "pc": 1246, + "op": "ADD", + "gas": 2078250, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x92954362", + "0x80", + "0x4" + ] + }, + { + "pc": 1247, + "op": "PUSH1", + "gas": 2078247, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x92954362", + "0x84" + ] + }, + { + "pc": 1249, + "op": "PUSH1", + "gas": 2078244, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x92954362", + "0x84", + "0x0" + ] + }, + { + "pc": 1251, + "op": "MLOAD", + "gas": 2078241, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x92954362", + "0x84", + "0x0", + "0x40" + ] + }, + { + "pc": 1252, + "op": "DUP1", + "gas": 2078238, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x92954362", + "0x84", + "0x0", + "0x80" + ] + }, + { + "pc": 1253, + "op": "DUP4", + "gas": 2078235, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x92954362", + "0x84", + "0x0", + "0x80", + "0x80" + ] + }, + { + "pc": 1254, + "op": "SUB", + "gas": 2078232, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x92954362", + "0x84", + "0x0", + "0x80", + "0x80", + "0x84" + ] + }, + { + "pc": 1255, + "op": "DUP2", + "gas": 2078229, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x92954362", + "0x84", + "0x0", + "0x80", + "0x4" + ] + }, + { + "pc": 1256, + "op": "DUP7", + "gas": 2078226, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x92954362", + "0x84", + "0x0", + "0x80", + "0x4", + "0x80" + ] + }, + { + "pc": 1257, + "op": "DUP1", + "gas": 2078223, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x92954362", + "0x84", + "0x0", + "0x80", + "0x4", + "0x80", + "Tracer.address" + ] + }, + { + "pc": 1258, + "op": "EXTCODESIZE", + "gas": 2078220, + "gasCost": 100, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x92954362", + "0x84", + "0x0", + "0x80", + "0x4", + "0x80", + "Tracer.address", + "Tracer.address" + ] + }, + { + "pc": 1259, + "op": "ISZERO", + "gas": 2078120, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x92954362", + "0x84", + "0x0", + "0x80", + "0x4", + "0x80", + "Tracer.address", + "0x1bde" + ] + }, + { + "pc": 1260, + "op": "DUP1", + "gas": 2078117, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x92954362", + "0x84", + "0x0", + "0x80", + "0x4", + "0x80", + "Tracer.address", + "0x0" + ] + }, + { + "pc": 1261, + "op": "ISZERO", + "gas": 2078114, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x92954362", + "0x84", + "0x0", + "0x80", + "0x4", + "0x80", + "Tracer.address", + "0x0", + "0x0" + ] + }, + { + "pc": 1262, + "op": "PUSH3", + "gas": 2078111, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x92954362", + "0x84", + "0x0", + "0x80", + "0x4", + "0x80", + "Tracer.address", + "0x0", + "0x1" + ] + }, + { + "pc": 1266, + "op": "JUMPI", + "gas": 2078108, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x92954362", + "0x84", + "0x0", + "0x80", + "0x4", + "0x80", + "Tracer.address", + "0x0", + "0x1", + "0x4f7" + ] + }, + { + "pc": 1271, + "op": "JUMPDEST", + "gas": 2078098, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x92954362", + "0x84", + "0x0", + "0x80", + "0x4", + "0x80", + "Tracer.address", + "0x0" + ] + }, + { + "pc": 1272, + "op": "POP", + "gas": 2078097, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x92954362", + "0x84", + "0x0", + "0x80", + "0x4", + "0x80", + "Tracer.address", + "0x0" + ] + }, + { + "pc": 1273, + "op": "GAS", + "gas": 2078095, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x92954362", + "0x84", + "0x0", + "0x80", + "0x4", + "0x80", + "Tracer.address" + ] + }, + { + "pc": 1274, + "op": "STATICCALL", + "gas": 2078093, + "gasCost": 2045625, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x92954362", + "0x84", + "0x0", + "0x80", + "0x4", + "0x80", + "Tracer.address", + "0x1fb58d" + ] + }, + { + "pc": 0, + "op": "PUSH1", + "gas": 2045525, + "gasCost": 3, + "depth": 2, + "stack": [] + }, + { + "pc": 2, + "op": "PUSH1", + "gas": 2045522, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x80" + ] + }, + { + "pc": 4, + "op": "MSTORE", + "gas": 2045519, + "gasCost": 12, + "depth": 2, + "stack": [ + "0x80", + "0x40" + ] + }, + { + "pc": 5, + "op": "CALLVALUE", + "gas": 2045507, + "gasCost": 2, + "depth": 2, + "stack": [] + }, + { + "pc": 6, + "op": "DUP1", + "gas": 2045505, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0" + ] + }, + { + "pc": 7, + "op": "ISZERO", + "gas": 2045502, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0", + "0x0" + ] + }, + { + "pc": 8, + "op": "PUSH3", + "gas": 2045499, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0", + "0x1" + ] + }, + { + "pc": 12, + "op": "JUMPI", + "gas": 2045496, + "gasCost": 10, + "depth": 2, + "stack": [ + "0x0", + "0x1", + "0x11" + ] + }, + { + "pc": 17, + "op": "JUMPDEST", + "gas": 2045486, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x0" + ] + }, + { + "pc": 18, + "op": "POP", + "gas": 2045485, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x0" + ] + }, + { + "pc": 19, + "op": "PUSH1", + "gas": 2045483, + "gasCost": 3, + "depth": 2, + "stack": [] + }, + { + "pc": 21, + "op": "CALLDATASIZE", + "gas": 2045480, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x4" + ] + }, + { + "pc": 22, + "op": "LT", + "gas": 2045478, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x4", + "0x4" + ] + }, + { + "pc": 23, + "op": "PUSH3", + "gas": 2045475, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0" + ] + }, + { + "pc": 27, + "op": "JUMPI", + "gas": 2045472, + "gasCost": 10, + "depth": 2, + "stack": [ + "0x0", + "0xac" + ] + }, + { + "pc": 28, + "op": "PUSH1", + "gas": 2045462, + "gasCost": 3, + "depth": 2, + "stack": [] + }, + { + "pc": 30, + "op": "CALLDATALOAD", + "gas": 2045459, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0" + ] + }, + { + "pc": 31, + "op": "PUSH1", + "gas": 2045456, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x9295436200000000000000000000000000000000000000000000000000000000" + ] + }, + { + "pc": 33, + "op": "SHR", + "gas": 2045453, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x9295436200000000000000000000000000000000000000000000000000000000", + "0xe0" + ] + }, + { + "pc": 34, + "op": "DUP1", + "gas": 2045450, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362" + ] + }, + { + "pc": 35, + "op": "PUSH4", + "gas": 2045447, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x92954362" + ] + }, + { + "pc": 40, + "op": "GT", + "gas": 2045444, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x92954362", + "0x8bfe44ff" + ] + }, + { + "pc": 41, + "op": "PUSH3", + "gas": 2045441, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x0" + ] + }, + { + "pc": 45, + "op": "JUMPI", + "gas": 2045438, + "gasCost": 10, + "depth": 2, + "stack": [ + "0x92954362", + "0x0", + "0x6f" + ] + }, + { + "pc": 46, + "op": "DUP1", + "gas": 2045428, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362" + ] + }, + { + "pc": 47, + "op": "PUSH4", + "gas": 2045425, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x92954362" + ] + }, + { + "pc": 52, + "op": "EQ", + "gas": 2045422, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x92954362", + "0x8bfe44ff" + ] + }, + { + "pc": 53, + "op": "PUSH3", + "gas": 2045419, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x0" + ] + }, + { + "pc": 57, + "op": "JUMPI", + "gas": 2045416, + "gasCost": 10, + "depth": 2, + "stack": [ + "0x92954362", + "0x0", + "0x197" + ] + }, + { + "pc": 58, + "op": "DUP1", + "gas": 2045406, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362" + ] + }, + { + "pc": 59, + "op": "PUSH4", + "gas": 2045403, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x92954362" + ] + }, + { + "pc": 64, + "op": "EQ", + "gas": 2045400, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x92954362", + "0x92954362" + ] + }, + { + "pc": 65, + "op": "PUSH3", + "gas": 2045397, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1" + ] + }, + { + "pc": 69, + "op": "JUMPI", + "gas": 2045394, + "gasCost": 10, + "depth": 2, + "stack": [ + "0x92954362", + "0x1", + "0x1a3" + ] + }, + { + "pc": 419, + "op": "JUMPDEST", + "gas": 2045384, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x92954362" + ] + }, + { + "pc": 420, + "op": "PUSH3", + "gas": 2045383, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362" + ] + }, + { + "pc": 424, + "op": "PUSH3", + "gas": 2045380, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad" + ] + }, + { + "pc": 428, + "op": "JUMP", + "gas": 2045377, + "gasCost": 8, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7c5" + ] + }, + { + "pc": 1989, + "op": "JUMPDEST", + "gas": 2045369, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad" + ] + }, + { + "pc": 1990, + "op": "PUSH1", + "gas": 2045368, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad" + ] + }, + { + "pc": 1992, + "op": "MLOAD", + "gas": 2045365, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x40" + ] + }, + { + "pc": 1993, + "op": "PUSH32", + "gas": 2045362, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x80" + ] + }, + { + "pc": 2026, + "op": "DUP2", + "gas": 2045359, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x80", + "0x8c379a000000000000000000000000000000000000000000000000000000000" + ] + }, + { + "pc": 2027, + "op": "MSTORE", + "gas": 2045356, + "gasCost": 9, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x80", + "0x8c379a000000000000000000000000000000000000000000000000000000000", + "0x80" + ] + }, + { + "pc": 2028, + "op": "PUSH1", + "gas": 2045347, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x80" + ] + }, + { + "pc": 2030, + "op": "ADD", + "gas": 2045344, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x80", + "0x4" + ] + }, + { + "pc": 2031, + "op": "PUSH3", + "gas": 2045341, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x84" + ] + }, + { + "pc": 2035, + "op": "SWAP1", + "gas": 2045338, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x84", + "0x7f9" + ] + }, + { + "pc": 2036, + "op": "PUSH3", + "gas": 2045335, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84" + ] + }, + { + "pc": 2040, + "op": "JUMP", + "gas": 2045332, + "gasCost": 8, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0x10a3" + ] + }, + { + "pc": 4259, + "op": "JUMPDEST", + "gas": 2045324, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84" + ] + }, + { + "pc": 4260, + "op": "PUSH1", + "gas": 2045323, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84" + ] + }, + { + "pc": 4262, + "op": "PUSH1", + "gas": 2045320, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0x0" + ] + }, + { + "pc": 4264, + "op": "DUP3", + "gas": 2045317, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0x0", + "0x20" + ] + }, + { + "pc": 4265, + "op": "ADD", + "gas": 2045314, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0x0", + "0x20", + "0x84" + ] + }, + { + "pc": 4266, + "op": "SWAP1", + "gas": 2045311, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0x0", + "0xa4" + ] + }, + { + "pc": 4267, + "op": "POP", + "gas": 2045308, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x0" + ] + }, + { + "pc": 4268, + "op": "DUP2", + "gas": 2045306, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4" + ] + }, + { + "pc": 4269, + "op": "DUP2", + "gas": 2045303, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x84" + ] + }, + { + "pc": 4270, + "op": "SUB", + "gas": 2045300, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x84", + "0xa4" + ] + }, + { + "pc": 4271, + "op": "PUSH1", + "gas": 2045297, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x20" + ] + }, + { + "pc": 4273, + "op": "DUP4", + "gas": 2045294, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x20", + "0x0" + ] + }, + { + "pc": 4274, + "op": "ADD", + "gas": 2045291, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x20", + "0x0", + "0x84" + ] + }, + { + "pc": 4275, + "op": "MSTORE", + "gas": 2045288, + "gasCost": 6, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x20", + "0x84" + ] + }, + { + "pc": 4276, + "op": "PUSH3", + "gas": 2045282, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4" + ] + }, + { + "pc": 4280, + "op": "DUP2", + "gas": 2045279, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be" + ] + }, + { + "pc": 4281, + "op": "PUSH3", + "gas": 2045276, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xa4" + ] + }, + { + "pc": 4285, + "op": "JUMP", + "gas": 2045273, + "gasCost": 8, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xa4", + "0x107c" + ] + }, + { + "pc": 4220, + "op": "JUMPDEST", + "gas": 2045265, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xa4" + ] + }, + { + "pc": 4221, + "op": "PUSH1", + "gas": 2045264, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xa4" + ] + }, + { + "pc": 4223, + "op": "PUSH3", + "gas": 2045261, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xa4", + "0x0" + ] + }, + { + "pc": 4227, + "op": "PUSH1", + "gas": 2045258, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xa4", + "0x0", + "0x108b" + ] + }, + { + "pc": 4229, + "op": "DUP4", + "gas": 2045255, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xa4", + "0x0", + "0x108b", + "0x17" + ] + }, + { + "pc": 4230, + "op": "PUSH3", + "gas": 2045252, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xa4", + "0x0", + "0x108b", + "0x17", + "0xa4" + ] + }, + { + "pc": 4234, + "op": "JUMP", + "gas": 2045249, + "gasCost": 8, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xa4", + "0x0", + "0x108b", + "0x17", + "0xa4", + "0xaf5" + ] + }, + { + "pc": 2805, + "op": "JUMPDEST", + "gas": 2045241, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xa4", + "0x0", + "0x108b", + "0x17", + "0xa4" + ] + }, + { + "pc": 2806, + "op": "PUSH1", + "gas": 2045240, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xa4", + "0x0", + "0x108b", + "0x17", + "0xa4" + ] + }, + { + "pc": 2808, + "op": "DUP3", + "gas": 2045237, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xa4", + "0x0", + "0x108b", + "0x17", + "0xa4", + "0x0" + ] + }, + { + "pc": 2809, + "op": "DUP3", + "gas": 2045234, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xa4", + "0x0", + "0x108b", + "0x17", + "0xa4", + "0x0", + "0x17" + ] + }, + { + "pc": 2810, + "op": "MSTORE", + "gas": 2045231, + "gasCost": 6, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xa4", + "0x0", + "0x108b", + "0x17", + "0xa4", + "0x0", + "0x17", + "0xa4" + ] + }, + { + "pc": 2811, + "op": "PUSH1", + "gas": 2045225, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xa4", + "0x0", + "0x108b", + "0x17", + "0xa4", + "0x0" + ] + }, + { + "pc": 2813, + "op": "DUP3", + "gas": 2045222, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xa4", + "0x0", + "0x108b", + "0x17", + "0xa4", + "0x0", + "0x20" + ] + }, + { + "pc": 2814, + "op": "ADD", + "gas": 2045219, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xa4", + "0x0", + "0x108b", + "0x17", + "0xa4", + "0x0", + "0x20", + "0xa4" + ] + }, + { + "pc": 2815, + "op": "SWAP1", + "gas": 2045216, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xa4", + "0x0", + "0x108b", + "0x17", + "0xa4", + "0x0", + "0xc4" + ] + }, + { + "pc": 2816, + "op": "POP", + "gas": 2045213, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xa4", + "0x0", + "0x108b", + "0x17", + "0xa4", + "0xc4", + "0x0" + ] + }, + { + "pc": 2817, + "op": "SWAP3", + "gas": 2045211, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xa4", + "0x0", + "0x108b", + "0x17", + "0xa4", + "0xc4" + ] + }, + { + "pc": 2818, + "op": "SWAP2", + "gas": 2045208, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xa4", + "0x0", + "0xc4", + "0x17", + "0xa4", + "0x108b" + ] + }, + { + "pc": 2819, + "op": "POP", + "gas": 2045205, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xa4", + "0x0", + "0xc4", + "0x108b", + "0xa4", + "0x17" + ] + }, + { + "pc": 2820, + "op": "POP", + "gas": 2045203, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xa4", + "0x0", + "0xc4", + "0x108b", + "0xa4" + ] + }, + { + "pc": 2821, + "op": "JUMP", + "gas": 2045201, + "gasCost": 8, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xa4", + "0x0", + "0xc4", + "0x108b" + ] + }, + { + "pc": 4235, + "op": "JUMPDEST", + "gas": 2045193, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xa4", + "0x0", + "0xc4" + ] + }, + { + "pc": 4236, + "op": "SWAP2", + "gas": 2045192, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xa4", + "0x0", + "0xc4" + ] + }, + { + "pc": 4237, + "op": "POP", + "gas": 2045189, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xc4", + "0x0", + "0xa4" + ] + }, + { + "pc": 4238, + "op": "PUSH3", + "gas": 2045187, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xc4", + "0x0" + ] + }, + { + "pc": 4242, + "op": "DUP3", + "gas": 2045184, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xc4", + "0x0", + "0x1098" + ] + }, + { + "pc": 4243, + "op": "PUSH3", + "gas": 2045181, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xc4", + "0x0", + "0x1098", + "0xc4" + ] + }, + { + "pc": 4247, + "op": "JUMP", + "gas": 2045178, + "gasCost": 8, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xc4", + "0x0", + "0x1098", + "0xc4", + "0x1053" + ] + }, + { + "pc": 4179, + "op": "JUMPDEST", + "gas": 2045170, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xc4", + "0x0", + "0x1098", + "0xc4" + ] + }, + { + "pc": 4180, + "op": "PUSH32", + "gas": 2045169, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xc4", + "0x0", + "0x1098", + "0xc4" + ] + }, + { + "pc": 4213, + "op": "PUSH1", + "gas": 2045166, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xc4", + "0x0", + "0x1098", + "0xc4", + "0x546869732066756e6374696f6e20726576657274656421000000000000000000" + ] + }, + { + "pc": 4215, + "op": "DUP3", + "gas": 2045163, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xc4", + "0x0", + "0x1098", + "0xc4", + "0x546869732066756e6374696f6e20726576657274656421000000000000000000", + "0x0" + ] + }, + { + "pc": 4216, + "op": "ADD", + "gas": 2045160, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xc4", + "0x0", + "0x1098", + "0xc4", + "0x546869732066756e6374696f6e20726576657274656421000000000000000000", + "0x0", + "0xc4" + ] + }, + { + "pc": 4217, + "op": "MSTORE", + "gas": 2045157, + "gasCost": 6, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xc4", + "0x0", + "0x1098", + "0xc4", + "0x546869732066756e6374696f6e20726576657274656421000000000000000000", + "0xc4" + ] + }, + { + "pc": 4218, + "op": "POP", + "gas": 2045151, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xc4", + "0x0", + "0x1098", + "0xc4" + ] + }, + { + "pc": 4219, + "op": "JUMP", + "gas": 2045149, + "gasCost": 8, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xc4", + "0x0", + "0x1098" + ] + }, + { + "pc": 4248, + "op": "JUMPDEST", + "gas": 2045141, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xc4", + "0x0" + ] + }, + { + "pc": 4249, + "op": "PUSH1", + "gas": 2045140, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xc4", + "0x0" + ] + }, + { + "pc": 4251, + "op": "DUP3", + "gas": 2045137, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xc4", + "0x0", + "0x20" + ] + }, + { + "pc": 4252, + "op": "ADD", + "gas": 2045134, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xc4", + "0x0", + "0x20", + "0xc4" + ] + }, + { + "pc": 4253, + "op": "SWAP1", + "gas": 2045131, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xc4", + "0x0", + "0xe4" + ] + }, + { + "pc": 4254, + "op": "POP", + "gas": 2045128, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xc4", + "0xe4", + "0x0" + ] + }, + { + "pc": 4255, + "op": "SWAP2", + "gas": 2045126, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0x10be", + "0xc4", + "0xe4" + ] + }, + { + "pc": 4256, + "op": "SWAP1", + "gas": 2045123, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0xe4", + "0xc4", + "0x10be" + ] + }, + { + "pc": 4257, + "op": "POP", + "gas": 2045120, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0xe4", + "0x10be", + "0xc4" + ] + }, + { + "pc": 4258, + "op": "JUMP", + "gas": 2045118, + "gasCost": 8, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0xe4", + "0x10be" + ] + }, + { + "pc": 4286, + "op": "JUMPDEST", + "gas": 2045110, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0xe4" + ] + }, + { + "pc": 4287, + "op": "SWAP1", + "gas": 2045109, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xa4", + "0xe4" + ] + }, + { + "pc": 4288, + "op": "POP", + "gas": 2045106, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xe4", + "0xa4" + ] + }, + { + "pc": 4289, + "op": "SWAP2", + "gas": 2045104, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x7f9", + "0x84", + "0xe4" + ] + }, + { + "pc": 4290, + "op": "SWAP1", + "gas": 2045101, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0xe4", + "0x84", + "0x7f9" + ] + }, + { + "pc": 4291, + "op": "POP", + "gas": 2045098, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0xe4", + "0x7f9", + "0x84" + ] + }, + { + "pc": 4292, + "op": "JUMP", + "gas": 2045096, + "gasCost": 8, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0xe4", + "0x7f9" + ] + }, + { + "pc": 2041, + "op": "JUMPDEST", + "gas": 2045088, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0xe4" + ] + }, + { + "pc": 2042, + "op": "PUSH1", + "gas": 2045087, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0xe4" + ] + }, + { + "pc": 2044, + "op": "MLOAD", + "gas": 2045084, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0xe4", + "0x40" + ] + }, + { + "pc": 2045, + "op": "DUP1", + "gas": 2045081, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0xe4", + "0x80" + ] + }, + { + "pc": 2046, + "op": "SWAP2", + "gas": 2045078, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0xe4", + "0x80", + "0x80" + ] + }, + { + "pc": 2047, + "op": "SUB", + "gas": 2045075, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x80", + "0x80", + "0xe4" + ] + }, + { + "pc": 2048, + "op": "SWAP1", + "gas": 2045072, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x80", + "0x64" + ] + }, + { + "pc": 2049, + "op": "REVERT", + "gas": 2045069, + "gasCost": 0, + "depth": 2, + "stack": [ + "0x92954362", + "0x1ad", + "0x64", + "0x80" + ] + }, + { + "pc": 1275, + "op": "SWAP3", + "gas": 2077537, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x92954362", + "0x84", + "0x0" + ] + }, + { + "pc": 1276, + "op": "POP", + "gas": 2077534, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x0", + "0x92954362", + "0x84", + "Tracer.address" + ] + }, + { + "pc": 1277, + "op": "POP", + "gas": 2077532, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x0", + "0x92954362", + "0x84" + ] + }, + { + "pc": 1278, + "op": "POP", + "gas": 2077530, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x0", + "0x92954362" + ] + }, + { + "pc": 1279, + "op": "DUP1", + "gas": 2077528, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x0" + ] + }, + { + "pc": 1280, + "op": "ISZERO", + "gas": 2077525, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 1281, + "op": "PUSH3", + "gas": 2077522, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x0", + "0x1" + ] + }, + { + "pc": 1285, + "op": "JUMPI", + "gas": 2077519, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x0", + "0x1", + "0x509" + ] + }, + { + "pc": 1289, + "op": "JUMPDEST", + "gas": 2077509, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x0" + ] + }, + { + "pc": 1290, + "op": "PUSH3", + "gas": 2077508, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x0" + ] + }, + { + "pc": 1294, + "op": "JUMPI", + "gas": 2077505, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x0", + "0x5f2" + ] + }, + { + "pc": 1295, + "op": "PUSH3", + "gas": 2077495, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0" + ] + }, + { + "pc": 1299, + "op": "PUSH3", + "gas": 2077492, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518" + ] + }, + { + "pc": 1303, + "op": "JUMP", + "gas": 2077489, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518", + "0xcec" + ] + }, + { + "pc": 3308, + "op": "JUMPDEST", + "gas": 2077481, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518" + ] + }, + { + "pc": 3309, + "op": "PUSH1", + "gas": 2077480, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518" + ] + }, + { + "pc": 3311, + "op": "PUSH1", + "gas": 2077477, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518", + "0x0" + ] + }, + { + "pc": 3313, + "op": "RETURNDATASIZE", + "gas": 2077474, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518", + "0x0", + "0x3" + ] + }, + { + "pc": 3314, + "op": "GT", + "gas": 2077472, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518", + "0x0", + "0x3", + "0x64" + ] + }, + { + "pc": 3315, + "op": "ISZERO", + "gas": 2077469, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518", + "0x0", + "0x1" + ] + }, + { + "pc": 3316, + "op": "PUSH3", + "gas": 2077466, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518", + "0x0", + "0x0" + ] + }, + { + "pc": 3320, + "op": "JUMPI", + "gas": 2077463, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518", + "0x0", + "0x0", + "0xd0e" + ] + }, + { + "pc": 3321, + "op": "PUSH1", + "gas": 2077453, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518", + "0x0" + ] + }, + { + "pc": 3323, + "op": "PUSH1", + "gas": 2077450, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518", + "0x0", + "0x4" + ] + }, + { + "pc": 3325, + "op": "DUP1", + "gas": 2077447, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518", + "0x0", + "0x4", + "0x0" + ] + }, + { + "pc": 3326, + "op": "RETURNDATACOPY", + "gas": 2077444, + "gasCost": 6, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518", + "0x0", + "0x4", + "0x0", + "0x0" + ] + }, + { + "pc": 3327, + "op": "PUSH3", + "gas": 2077438, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518", + "0x0" + ] + }, + { + "pc": 3331, + "op": "PUSH1", + "gas": 2077435, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518", + "0x0", + "0xd0b" + ] + }, + { + "pc": 3333, + "op": "MLOAD", + "gas": 2077432, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518", + "0x0", + "0xd0b", + "0x0" + ] + }, + { + "pc": 3334, + "op": "PUSH3", + "gas": 2077429, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518", + "0x0", + "0xd0b", + "0x8c379a000000000000000000000000000000000000000000000000000000000" + ] + }, + { + "pc": 3338, + "op": "JUMP", + "gas": 2077426, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518", + "0x0", + "0xd0b", + "0x8c379a000000000000000000000000000000000000000000000000000000000", + "0xcdf" + ] + }, + { + "pc": 3295, + "op": "JUMPDEST", + "gas": 2077418, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518", + "0x0", + "0xd0b", + "0x8c379a000000000000000000000000000000000000000000000000000000000" + ] + }, + { + "pc": 3296, + "op": "PUSH1", + "gas": 2077417, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518", + "0x0", + "0xd0b", + "0x8c379a000000000000000000000000000000000000000000000000000000000" + ] + }, + { + "pc": 3298, + "op": "DUP2", + "gas": 2077414, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518", + "0x0", + "0xd0b", + "0x8c379a000000000000000000000000000000000000000000000000000000000", + "0x0" + ] + }, + { + "pc": 3299, + "op": "PUSH1", + "gas": 2077411, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518", + "0x0", + "0xd0b", + "0x8c379a000000000000000000000000000000000000000000000000000000000", + "0x0", + "0x8c379a000000000000000000000000000000000000000000000000000000000" + ] + }, + { + "pc": 3301, + "op": "SHR", + "gas": 2077408, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518", + "0x0", + "0xd0b", + "0x8c379a000000000000000000000000000000000000000000000000000000000", + "0x0", + "0x8c379a000000000000000000000000000000000000000000000000000000000", + "0xe0" + ] + }, + { + "pc": 3302, + "op": "SWAP1", + "gas": 2077405, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518", + "0x0", + "0xd0b", + "0x8c379a000000000000000000000000000000000000000000000000000000000", + "0x0", + "0x8c379a0" + ] + }, + { + "pc": 3303, + "op": "POP", + "gas": 2077402, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518", + "0x0", + "0xd0b", + "0x8c379a000000000000000000000000000000000000000000000000000000000", + "0x8c379a0", + "0x0" + ] + }, + { + "pc": 3304, + "op": "SWAP2", + "gas": 2077400, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518", + "0x0", + "0xd0b", + "0x8c379a000000000000000000000000000000000000000000000000000000000", + "0x8c379a0" + ] + }, + { + "pc": 3305, + "op": "SWAP1", + "gas": 2077397, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518", + "0x0", + "0x8c379a0", + "0x8c379a000000000000000000000000000000000000000000000000000000000", + "0xd0b" + ] + }, + { + "pc": 3306, + "op": "POP", + "gas": 2077394, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518", + "0x0", + "0x8c379a0", + "0xd0b", + "0x8c379a000000000000000000000000000000000000000000000000000000000" + ] + }, + { + "pc": 3307, + "op": "JUMP", + "gas": 2077392, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518", + "0x0", + "0x8c379a0", + "0xd0b" + ] + }, + { + "pc": 3339, + "op": "JUMPDEST", + "gas": 2077384, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518", + "0x0", + "0x8c379a0" + ] + }, + { + "pc": 3340, + "op": "SWAP1", + "gas": 2077383, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518", + "0x0", + "0x8c379a0" + ] + }, + { + "pc": 3341, + "op": "POP", + "gas": 2077380, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518", + "0x8c379a0", + "0x0" + ] + }, + { + "pc": 3342, + "op": "JUMPDEST", + "gas": 2077378, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518", + "0x8c379a0" + ] + }, + { + "pc": 3343, + "op": "SWAP1", + "gas": 2077377, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x518", + "0x8c379a0" + ] + }, + { + "pc": 3344, + "op": "JUMP", + "gas": 2077374, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x8c379a0", + "0x518" + ] + }, + { + "pc": 1304, + "op": "JUMPDEST", + "gas": 2077366, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x8c379a0" + ] + }, + { + "pc": 1305, + "op": "DUP1", + "gas": 2077365, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x8c379a0" + ] + }, + { + "pc": 1306, + "op": "PUSH4", + "gas": 2077362, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x8c379a0", + "0x8c379a0" + ] + }, + { + "pc": 1311, + "op": "EQ", + "gas": 2077359, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x8c379a0", + "0x8c379a0", + "0x8c379a0" + ] + }, + { + "pc": 1312, + "op": "ISZERO", + "gas": 2077356, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x8c379a0", + "0x1" + ] + }, + { + "pc": 1313, + "op": "PUSH3", + "gas": 2077353, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x8c379a0", + "0x0" + ] + }, + { + "pc": 1317, + "op": "JUMPI", + "gas": 2077350, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x8c379a0", + "0x0", + "0x57d" + ] + }, + { + "pc": 1318, + "op": "POP", + "gas": 2077340, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x8c379a0" + ] + }, + { + "pc": 1319, + "op": "PUSH3", + "gas": 2077338, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0" + ] + }, + { + "pc": 1323, + "op": "PUSH3", + "gas": 2077335, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530" + ] + }, + { + "pc": 1327, + "op": "JUMP", + "gas": 2077332, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0xd87" + ] + }, + { + "pc": 3463, + "op": "JUMPDEST", + "gas": 2077324, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530" + ] + }, + { + "pc": 3464, + "op": "PUSH1", + "gas": 2077323, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530" + ] + }, + { + "pc": 3466, + "op": "PUSH1", + "gas": 2077320, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0" + ] + }, + { + "pc": 3468, + "op": "RETURNDATASIZE", + "gas": 2077317, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x44" + ] + }, + { + "pc": 3469, + "op": "LT", + "gas": 2077315, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x44", + "0x64" + ] + }, + { + "pc": 3470, + "op": "ISZERO", + "gas": 2077312, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x0" + ] + }, + { + "pc": 3471, + "op": "PUSH3", + "gas": 2077309, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x1" + ] + }, + { + "pc": 3475, + "op": "JUMPI", + "gas": 2077306, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x1", + "0xd99" + ] + }, + { + "pc": 3481, + "op": "JUMPDEST", + "gas": 2077296, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0" + ] + }, + { + "pc": 3482, + "op": "PUSH3", + "gas": 2077295, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0" + ] + }, + { + "pc": 3486, + "op": "PUSH3", + "gas": 2077292, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0xda3" + ] + }, + { + "pc": 3490, + "op": "JUMP", + "gas": 2077289, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0xda3", + "0x9ec" + ] + }, + { + "pc": 2540, + "op": "JUMPDEST", + "gas": 2077281, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0xda3" + ] + }, + { + "pc": 2541, + "op": "PUSH1", + "gas": 2077280, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0xda3" + ] + }, + { + "pc": 2543, + "op": "PUSH1", + "gas": 2077277, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0xda3", + "0x0" + ] + }, + { + "pc": 2545, + "op": "MLOAD", + "gas": 2077274, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0xda3", + "0x0", + "0x40" + ] + }, + { + "pc": 2546, + "op": "SWAP1", + "gas": 2077271, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0xda3", + "0x0", + "0x80" + ] + }, + { + "pc": 2547, + "op": "POP", + "gas": 2077268, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0xda3", + "0x80", + "0x0" + ] + }, + { + "pc": 2548, + "op": "SWAP1", + "gas": 2077266, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0xda3", + "0x80" + ] + }, + { + "pc": 2549, + "op": "JUMP", + "gas": 2077263, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0xda3" + ] + }, + { + "pc": 3491, + "op": "JUMPDEST", + "gas": 2077255, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80" + ] + }, + { + "pc": 3492, + "op": "PUSH1", + "gas": 2077254, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80" + ] + }, + { + "pc": 3494, + "op": "RETURNDATASIZE", + "gas": 2077251, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x4" + ] + }, + { + "pc": 3495, + "op": "SUB", + "gas": 2077249, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x4", + "0x64" + ] + }, + { + "pc": 3496, + "op": "PUSH1", + "gas": 2077246, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x60" + ] + }, + { + "pc": 3498, + "op": "DUP3", + "gas": 2077243, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x60", + "0x4" + ] + }, + { + "pc": 3499, + "op": "RETURNDATACOPY", + "gas": 2077240, + "gasCost": 18, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x60", + "0x4", + "0x80" + ] + }, + { + "pc": 3500, + "op": "DUP1", + "gas": 2077222, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80" + ] + }, + { + "pc": 3501, + "op": "MLOAD", + "gas": 2077219, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x80" + ] + }, + { + "pc": 3502, + "op": "RETURNDATASIZE", + "gas": 2077216, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20" + ] + }, + { + "pc": 3503, + "op": "PUSH1", + "gas": 2077214, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0x64" + ] + }, + { + "pc": 3505, + "op": "DUP3", + "gas": 2077211, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0x64", + "0x24" + ] + }, + { + "pc": 3506, + "op": "ADD", + "gas": 2077208, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0x64", + "0x24", + "0x20" + ] + }, + { + "pc": 3507, + "op": "GT", + "gas": 2077205, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0x64", + "0x44" + ] + }, + { + "pc": 3508, + "op": "PUSH8", + "gas": 2077202, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0x0" + ] + }, + { + "pc": 3517, + "op": "DUP3", + "gas": 2077199, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0x0", + "0xffffffffffffffff" + ] + }, + { + "pc": 3518, + "op": "GT", + "gas": 2077196, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0x0", + "0xffffffffffffffff", + "0x20" + ] + }, + { + "pc": 3519, + "op": "OR", + "gas": 2077193, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0x0", + "0x0" + ] + }, + { + "pc": 3520, + "op": "ISZERO", + "gas": 2077190, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0x0" + ] + }, + { + "pc": 3521, + "op": "PUSH3", + "gas": 2077187, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0x1" + ] + }, + { + "pc": 3525, + "op": "JUMPI", + "gas": 2077184, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0x1", + "0xdcd" + ] + }, + { + "pc": 3533, + "op": "JUMPDEST", + "gas": 2077174, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20" + ] + }, + { + "pc": 3534, + "op": "DUP1", + "gas": 2077173, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20" + ] + }, + { + "pc": 3535, + "op": "DUP3", + "gas": 2077170, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0x20" + ] + }, + { + "pc": 3536, + "op": "ADD", + "gas": 2077167, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0x20", + "0x80" + ] + }, + { + "pc": 3537, + "op": "DUP1", + "gas": 2077164, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0" + ] + }, + { + "pc": 3538, + "op": "MLOAD", + "gas": 2077161, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0xa0" + ] + }, + { + "pc": 3539, + "op": "PUSH8", + "gas": 2077158, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17" + ] + }, + { + "pc": 3548, + "op": "DUP2", + "gas": 2077155, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xffffffffffffffff" + ] + }, + { + "pc": 3549, + "op": "GT", + "gas": 2077152, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xffffffffffffffff", + "0x17" + ] + }, + { + "pc": 3550, + "op": "ISZERO", + "gas": 2077149, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0x0" + ] + }, + { + "pc": 3551, + "op": "PUSH3", + "gas": 2077146, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0x1" + ] + }, + { + "pc": 3555, + "op": "JUMPI", + "gas": 2077143, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0x1", + "0xded" + ] + }, + { + "pc": 3565, + "op": "JUMPDEST", + "gas": 2077133, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17" + ] + }, + { + "pc": 3566, + "op": "DUP1", + "gas": 2077132, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17" + ] + }, + { + "pc": 3567, + "op": "PUSH1", + "gas": 2077129, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0x17" + ] + }, + { + "pc": 3569, + "op": "DUP4", + "gas": 2077126, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0x17", + "0x20" + ] + }, + { + "pc": 3570, + "op": "ADD", + "gas": 2077123, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0x17", + "0x20", + "0xa0" + ] + }, + { + "pc": 3571, + "op": "ADD", + "gas": 2077120, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0x17", + "0xc0" + ] + }, + { + "pc": 3572, + "op": "PUSH1", + "gas": 2077117, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7" + ] + }, + { + "pc": 3574, + "op": "RETURNDATASIZE", + "gas": 2077114, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0x4" + ] + }, + { + "pc": 3575, + "op": "SUB", + "gas": 2077112, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0x4", + "0x64" + ] + }, + { + "pc": 3576, + "op": "DUP6", + "gas": 2077109, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0x60" + ] + }, + { + "pc": 3577, + "op": "ADD", + "gas": 2077106, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0x60", + "0x80" + ] + }, + { + "pc": 3578, + "op": "DUP2", + "gas": 2077103, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe0" + ] + }, + { + "pc": 3579, + "op": "GT", + "gas": 2077100, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe0", + "0xd7" + ] + }, + { + "pc": 3580, + "op": "ISZERO", + "gas": 2077097, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0x0" + ] + }, + { + "pc": 3581, + "op": "PUSH3", + "gas": 2077094, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0x1" + ] + }, + { + "pc": 3585, + "op": "JUMPI", + "gas": 2077091, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0x1", + "0xe0c" + ] + }, + { + "pc": 3596, + "op": "JUMPDEST", + "gas": 2077081, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7" + ] + }, + { + "pc": 3597, + "op": "PUSH3", + "gas": 2077080, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7" + ] + }, + { + "pc": 3601, + "op": "DUP3", + "gas": 2077077, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d" + ] + }, + { + "pc": 3602, + "op": "PUSH1", + "gas": 2077074, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x17" + ] + }, + { + "pc": 3604, + "op": "ADD", + "gas": 2077071, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x17", + "0x20" + ] + }, + { + "pc": 3605, + "op": "DUP6", + "gas": 2077068, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x37" + ] + }, + { + "pc": 3606, + "op": "ADD", + "gas": 2077065, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x37", + "0x20" + ] + }, + { + "pc": 3607, + "op": "DUP7", + "gas": 2077062, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57" + ] + }, + { + "pc": 3608, + "op": "PUSH3", + "gas": 2077059, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80" + ] + }, + { + "pc": 3612, + "op": "JUMP", + "gas": 2077056, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0xd51" + ] + }, + { + "pc": 3409, + "op": "JUMPDEST", + "gas": 2077048, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80" + ] + }, + { + "pc": 3410, + "op": "PUSH3", + "gas": 2077047, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80" + ] + }, + { + "pc": 3414, + "op": "DUP3", + "gas": 2077044, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0xd5c" + ] + }, + { + "pc": 3415, + "op": "PUSH3", + "gas": 2077041, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0xd5c", + "0x57" + ] + }, + { + "pc": 3419, + "op": "JUMP", + "gas": 2077038, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0xd5c", + "0x57", + "0xd11" + ] + }, + { + "pc": 3345, + "op": "JUMPDEST", + "gas": 2077030, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0xd5c", + "0x57" + ] + }, + { + "pc": 3346, + "op": "PUSH1", + "gas": 2077029, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0xd5c", + "0x57" + ] + }, + { + "pc": 3348, + "op": "PUSH1", + "gas": 2077026, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0xd5c", + "0x57", + "0x0" + ] + }, + { + "pc": 3350, + "op": "NOT", + "gas": 2077023, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0xd5c", + "0x57", + "0x0", + "0x1f" + ] + }, + { + "pc": 3351, + "op": "PUSH1", + "gas": 2077020, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0xd5c", + "0x57", + "0x0", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0" + ] + }, + { + "pc": 3353, + "op": "DUP4", + "gas": 2077017, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0xd5c", + "0x57", + "0x0", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0", + "0x1f" + ] + }, + { + "pc": 3354, + "op": "ADD", + "gas": 2077014, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0xd5c", + "0x57", + "0x0", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0", + "0x1f", + "0x57" + ] + }, + { + "pc": 3355, + "op": "AND", + "gas": 2077011, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0xd5c", + "0x57", + "0x0", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0", + "0x76" + ] + }, + { + "pc": 3356, + "op": "SWAP1", + "gas": 2077008, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0xd5c", + "0x57", + "0x0", + "0x60" + ] + }, + { + "pc": 3357, + "op": "POP", + "gas": 2077005, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0xd5c", + "0x57", + "0x60", + "0x0" + ] + }, + { + "pc": 3358, + "op": "SWAP2", + "gas": 2077003, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0xd5c", + "0x57", + "0x60" + ] + }, + { + "pc": 3359, + "op": "SWAP1", + "gas": 2077000, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0x60", + "0x57", + "0xd5c" + ] + }, + { + "pc": 3360, + "op": "POP", + "gas": 2076997, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0x60", + "0xd5c", + "0x57" + ] + }, + { + "pc": 3361, + "op": "JUMP", + "gas": 2076995, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0x60", + "0xd5c" + ] + }, + { + "pc": 3420, + "op": "JUMPDEST", + "gas": 2076987, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0x60" + ] + }, + { + "pc": 3421, + "op": "DUP2", + "gas": 2076986, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0x60" + ] + }, + { + "pc": 3422, + "op": "ADD", + "gas": 2076983, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0x60", + "0x80" + ] + }, + { + "pc": 3423, + "op": "DUP2", + "gas": 2076980, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0xe0" + ] + }, + { + "pc": 3424, + "op": "DUP2", + "gas": 2076977, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0xe0", + "0x80" + ] + }, + { + "pc": 3425, + "op": "LT", + "gas": 2076974, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0xe0", + "0x80", + "0xe0" + ] + }, + { + "pc": 3426, + "op": "PUSH8", + "gas": 2076971, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0xe0", + "0x0" + ] + }, + { + "pc": 3435, + "op": "DUP3", + "gas": 2076968, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0xe0", + "0x0", + "0xffffffffffffffff" + ] + }, + { + "pc": 3436, + "op": "GT", + "gas": 2076965, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0xe0", + "0x0", + "0xffffffffffffffff", + "0xe0" + ] + }, + { + "pc": 3437, + "op": "OR", + "gas": 2076962, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0xe0", + "0x0", + "0x0" + ] + }, + { + "pc": 3438, + "op": "ISZERO", + "gas": 2076959, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0xe0", + "0x0" + ] + }, + { + "pc": 3439, + "op": "PUSH3", + "gas": 2076956, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0xe0", + "0x1" + ] + }, + { + "pc": 3443, + "op": "JUMPI", + "gas": 2076953, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0xe0", + "0x1", + "0xd7e" + ] + }, + { + "pc": 3454, + "op": "JUMPDEST", + "gas": 2076943, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0xe0" + ] + }, + { + "pc": 3455, + "op": "DUP1", + "gas": 2076942, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0xe0" + ] + }, + { + "pc": 3456, + "op": "PUSH1", + "gas": 2076939, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0xe0", + "0xe0" + ] + }, + { + "pc": 3458, + "op": "MSTORE", + "gas": 2076936, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0xe0", + "0xe0", + "0x40" + ] + }, + { + "pc": 3459, + "op": "POP", + "gas": 2076933, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80", + "0xe0" + ] + }, + { + "pc": 3460, + "op": "POP", + "gas": 2076931, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57", + "0x80" + ] + }, + { + "pc": 3461, + "op": "POP", + "gas": 2076929, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d", + "0x57" + ] + }, + { + "pc": 3462, + "op": "JUMP", + "gas": 2076927, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xe1d" + ] + }, + { + "pc": 3613, + "op": "JUMPDEST", + "gas": 2076919, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7" + ] + }, + { + "pc": 3614, + "op": "DUP3", + "gas": 2076918, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7" + ] + }, + { + "pc": 3615, + "op": "SWAP6", + "gas": 2076915, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0x0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0xa0" + ] + }, + { + "pc": 3616, + "op": "POP", + "gas": 2076912, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0xa0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7", + "0x0" + ] + }, + { + "pc": 3617, + "op": "POP", + "gas": 2076910, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0xa0", + "0x80", + "0x20", + "0xa0", + "0x17", + "0xd7" + ] + }, + { + "pc": 3618, + "op": "POP", + "gas": 2076908, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0xa0", + "0x80", + "0x20", + "0xa0", + "0x17" + ] + }, + { + "pc": 3619, + "op": "POP", + "gas": 2076906, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0xa0", + "0x80", + "0x20", + "0xa0" + ] + }, + { + "pc": 3620, + "op": "POP", + "gas": 2076904, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0xa0", + "0x80", + "0x20" + ] + }, + { + "pc": 3621, + "op": "POP", + "gas": 2076902, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0xa0", + "0x80" + ] + }, + { + "pc": 3622, + "op": "JUMPDEST", + "gas": 2076900, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0xa0" + ] + }, + { + "pc": 3623, + "op": "SWAP1", + "gas": 2076899, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x530", + "0xa0" + ] + }, + { + "pc": 3624, + "op": "JUMP", + "gas": 2076896, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x530" + ] + }, + { + "pc": 1328, + "op": "JUMPDEST", + "gas": 2076888, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0" + ] + }, + { + "pc": 1329, + "op": "DUP1", + "gas": 2076887, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0" + ] + }, + { + "pc": 1330, + "op": "PUSH3", + "gas": 2076884, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0xa0" + ] + }, + { + "pc": 1334, + "op": "JUMPI", + "gas": 2076881, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0xa0", + "0x53d" + ] + }, + { + "pc": 1341, + "op": "JUMPDEST", + "gas": 2076871, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0" + ] + }, + { + "pc": 1342, + "op": "PUSH32", + "gas": 2076870, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0" + ] + }, + { + "pc": 1375, + "op": "DUP2", + "gas": 2076867, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a" + ] + }, + { + "pc": 1376, + "op": "PUSH1", + "gas": 2076864, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0xa0" + ] + }, + { + "pc": 1378, + "op": "MLOAD", + "gas": 2076861, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0xa0", + "0x40" + ] + }, + { + "pc": 1379, + "op": "PUSH3", + "gas": 2076858, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0xa0", + "0xe0" + ] + }, + { + "pc": 1383, + "op": "SWAP2", + "gas": 2076855, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0xa0", + "0xe0", + "0x56e" + ] + }, + { + "pc": 1384, + "op": "SWAP1", + "gas": 2076852, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xe0", + "0xa0" + ] + }, + { + "pc": 1385, + "op": "PUSH3", + "gas": 2076849, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0" + ] + }, + { + "pc": 1389, + "op": "JUMP", + "gas": 2076846, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0xeab" + ] + }, + { + "pc": 3755, + "op": "JUMPDEST", + "gas": 2076838, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0" + ] + }, + { + "pc": 3756, + "op": "PUSH1", + "gas": 2076837, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0" + ] + }, + { + "pc": 3758, + "op": "PUSH1", + "gas": 2076834, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x0" + ] + }, + { + "pc": 3760, + "op": "DUP3", + "gas": 2076831, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x0", + "0x20" + ] + }, + { + "pc": 3761, + "op": "ADD", + "gas": 2076828, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x0", + "0x20", + "0xe0" + ] + }, + { + "pc": 3762, + "op": "SWAP1", + "gas": 2076825, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x0", + "0x100" + ] + }, + { + "pc": 3763, + "op": "POP", + "gas": 2076822, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0x0" + ] + }, + { + "pc": 3764, + "op": "DUP2", + "gas": 2076820, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100" + ] + }, + { + "pc": 3765, + "op": "DUP2", + "gas": 2076817, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xe0" + ] + }, + { + "pc": 3766, + "op": "SUB", + "gas": 2076814, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xe0", + "0x100" + ] + }, + { + "pc": 3767, + "op": "PUSH1", + "gas": 2076811, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0x20" + ] + }, + { + "pc": 3769, + "op": "DUP4", + "gas": 2076808, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0x20", + "0x0" + ] + }, + { + "pc": 3770, + "op": "ADD", + "gas": 2076805, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0x20", + "0x0", + "0xe0" + ] + }, + { + "pc": 3771, + "op": "MSTORE", + "gas": 2076802, + "gasCost": 6, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0x20", + "0xe0" + ] + }, + { + "pc": 3772, + "op": "PUSH3", + "gas": 2076796, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100" + ] + }, + { + "pc": 3776, + "op": "DUP2", + "gas": 2076793, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7" + ] + }, + { + "pc": 3777, + "op": "DUP5", + "gas": 2076790, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100" + ] + }, + { + "pc": 3778, + "op": "PUSH3", + "gas": 2076787, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0" + ] + }, + { + "pc": 3782, + "op": "JUMP", + "gas": 2076784, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0xe6a" + ] + }, + { + "pc": 3690, + "op": "JUMPDEST", + "gas": 2076776, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0" + ] + }, + { + "pc": 3691, + "op": "PUSH1", + "gas": 2076775, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0" + ] + }, + { + "pc": 3693, + "op": "PUSH3", + "gas": 2076772, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0" + ] + }, + { + "pc": 3697, + "op": "DUP3", + "gas": 2076769, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0xe77" + ] + }, + { + "pc": 3698, + "op": "PUSH3", + "gas": 2076766, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0xe77", + "0xa0" + ] + }, + { + "pc": 3702, + "op": "JUMP", + "gas": 2076763, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0xe77", + "0xa0", + "0xe29" + ] + }, + { + "pc": 3625, + "op": "JUMPDEST", + "gas": 2076755, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0xe77", + "0xa0" + ] + }, + { + "pc": 3626, + "op": "PUSH1", + "gas": 2076754, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0xe77", + "0xa0" + ] + }, + { + "pc": 3628, + "op": "DUP2", + "gas": 2076751, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0xe77", + "0xa0", + "0x0" + ] + }, + { + "pc": 3629, + "op": "MLOAD", + "gas": 2076748, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0xe77", + "0xa0", + "0x0", + "0xa0" + ] + }, + { + "pc": 3630, + "op": "SWAP1", + "gas": 2076745, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0xe77", + "0xa0", + "0x0", + "0x17" + ] + }, + { + "pc": 3631, + "op": "POP", + "gas": 2076742, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0xe77", + "0xa0", + "0x17", + "0x0" + ] + }, + { + "pc": 3632, + "op": "SWAP2", + "gas": 2076740, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0xe77", + "0xa0", + "0x17" + ] + }, + { + "pc": 3633, + "op": "SWAP1", + "gas": 2076737, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0x17", + "0xa0", + "0xe77" + ] + }, + { + "pc": 3634, + "op": "POP", + "gas": 2076734, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0x17", + "0xe77", + "0xa0" + ] + }, + { + "pc": 3635, + "op": "JUMP", + "gas": 2076732, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0x17", + "0xe77" + ] + }, + { + "pc": 3703, + "op": "JUMPDEST", + "gas": 2076724, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0x17" + ] + }, + { + "pc": 3704, + "op": "PUSH3", + "gas": 2076723, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0x17" + ] + }, + { + "pc": 3708, + "op": "DUP2", + "gas": 2076720, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0x17", + "0xe83" + ] + }, + { + "pc": 3709, + "op": "DUP6", + "gas": 2076717, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0x17", + "0xe83", + "0x17" + ] + }, + { + "pc": 3710, + "op": "PUSH3", + "gas": 2076714, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0x17", + "0xe83", + "0x17", + "0x100" + ] + }, + { + "pc": 3714, + "op": "JUMP", + "gas": 2076711, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0x17", + "0xe83", + "0x17", + "0x100", + "0xaf5" + ] + }, + { + "pc": 2805, + "op": "JUMPDEST", + "gas": 2076703, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0x17", + "0xe83", + "0x17", + "0x100" + ] + }, + { + "pc": 2806, + "op": "PUSH1", + "gas": 2076702, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0x17", + "0xe83", + "0x17", + "0x100" + ] + }, + { + "pc": 2808, + "op": "DUP3", + "gas": 2076699, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0x17", + "0xe83", + "0x17", + "0x100", + "0x0" + ] + }, + { + "pc": 2809, + "op": "DUP3", + "gas": 2076696, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0x17", + "0xe83", + "0x17", + "0x100", + "0x0", + "0x17" + ] + }, + { + "pc": 2810, + "op": "MSTORE", + "gas": 2076693, + "gasCost": 6, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0x17", + "0xe83", + "0x17", + "0x100", + "0x0", + "0x17", + "0x100" + ] + }, + { + "pc": 2811, + "op": "PUSH1", + "gas": 2076687, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0x17", + "0xe83", + "0x17", + "0x100", + "0x0" + ] + }, + { + "pc": 2813, + "op": "DUP3", + "gas": 2076684, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0x17", + "0xe83", + "0x17", + "0x100", + "0x0", + "0x20" + ] + }, + { + "pc": 2814, + "op": "ADD", + "gas": 2076681, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0x17", + "0xe83", + "0x17", + "0x100", + "0x0", + "0x20", + "0x100" + ] + }, + { + "pc": 2815, + "op": "SWAP1", + "gas": 2076678, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0x17", + "0xe83", + "0x17", + "0x100", + "0x0", + "0x120" + ] + }, + { + "pc": 2816, + "op": "POP", + "gas": 2076675, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0x17", + "0xe83", + "0x17", + "0x100", + "0x120", + "0x0" + ] + }, + { + "pc": 2817, + "op": "SWAP3", + "gas": 2076673, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0x17", + "0xe83", + "0x17", + "0x100", + "0x120" + ] + }, + { + "pc": 2818, + "op": "SWAP2", + "gas": 2076670, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0x17", + "0x120", + "0x17", + "0x100", + "0xe83" + ] + }, + { + "pc": 2819, + "op": "POP", + "gas": 2076667, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0x17", + "0x120", + "0xe83", + "0x100", + "0x17" + ] + }, + { + "pc": 2820, + "op": "POP", + "gas": 2076665, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0x17", + "0x120", + "0xe83", + "0x100" + ] + }, + { + "pc": 2821, + "op": "JUMP", + "gas": 2076663, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0x17", + "0x120", + "0xe83" + ] + }, + { + "pc": 3715, + "op": "JUMPDEST", + "gas": 2076655, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0x17", + "0x120" + ] + }, + { + "pc": 3716, + "op": "SWAP4", + "gas": 2076654, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x100", + "0xa0", + "0x0", + "0x17", + "0x120" + ] + }, + { + "pc": 3717, + "op": "POP", + "gas": 2076651, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0x100" + ] + }, + { + "pc": 3718, + "op": "PUSH3", + "gas": 2076649, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17" + ] + }, + { + "pc": 3722, + "op": "DUP2", + "gas": 2076646, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95" + ] + }, + { + "pc": 3723, + "op": "DUP6", + "gas": 2076643, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17" + ] + }, + { + "pc": 3724, + "op": "PUSH1", + "gas": 2076640, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120" + ] + }, + { + "pc": 3726, + "op": "DUP7", + "gas": 2076637, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0x20" + ] + }, + { + "pc": 3727, + "op": "ADD", + "gas": 2076634, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0x20", + "0xa0" + ] + }, + { + "pc": 3728, + "op": "PUSH3", + "gas": 2076631, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0" + ] + }, + { + "pc": 3732, + "op": "JUMP", + "gas": 2076628, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0xe34" + ] + }, + { + "pc": 3636, + "op": "JUMPDEST", + "gas": 2076620, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0" + ] + }, + { + "pc": 3637, + "op": "PUSH1", + "gas": 2076619, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0" + ] + }, + { + "pc": 3639, + "op": "JUMPDEST", + "gas": 2076616, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x0" + ] + }, + { + "pc": 3640, + "op": "DUP4", + "gas": 2076615, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x0" + ] + }, + { + "pc": 3641, + "op": "DUP2", + "gas": 2076612, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x0", + "0x17" + ] + }, + { + "pc": 3642, + "op": "LT", + "gas": 2076609, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x0", + "0x17", + "0x0" + ] + }, + { + "pc": 3643, + "op": "ISZERO", + "gas": 2076606, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x0", + "0x1" + ] + }, + { + "pc": 3644, + "op": "PUSH3", + "gas": 2076603, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x0", + "0x0" + ] + }, + { + "pc": 3648, + "op": "JUMPI", + "gas": 2076600, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x0", + "0x0", + "0xe54" + ] + }, + { + "pc": 3649, + "op": "DUP1", + "gas": 2076590, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x0" + ] + }, + { + "pc": 3650, + "op": "DUP3", + "gas": 2076587, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x0", + "0x0" + ] + }, + { + "pc": 3651, + "op": "ADD", + "gas": 2076584, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x0", + "0x0", + "0xc0" + ] + }, + { + "pc": 3652, + "op": "MLOAD", + "gas": 2076581, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x0", + "0xc0" + ] + }, + { + "pc": 3653, + "op": "DUP2", + "gas": 2076578, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x0", + "0x546869732066756e6374696f6e20726576657274656421000000000000000000" + ] + }, + { + "pc": 3654, + "op": "DUP5", + "gas": 2076575, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x0", + "0x546869732066756e6374696f6e20726576657274656421000000000000000000", + "0x0" + ] + }, + { + "pc": 3655, + "op": "ADD", + "gas": 2076572, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x0", + "0x546869732066756e6374696f6e20726576657274656421000000000000000000", + "0x0", + "0x120" + ] + }, + { + "pc": 3656, + "op": "MSTORE", + "gas": 2076569, + "gasCost": 6, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x0", + "0x546869732066756e6374696f6e20726576657274656421000000000000000000", + "0x120" + ] + }, + { + "pc": 3657, + "op": "PUSH1", + "gas": 2076563, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x0" + ] + }, + { + "pc": 3659, + "op": "DUP2", + "gas": 2076560, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x0", + "0x20" + ] + }, + { + "pc": 3660, + "op": "ADD", + "gas": 2076557, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x0", + "0x20", + "0x0" + ] + }, + { + "pc": 3661, + "op": "SWAP1", + "gas": 2076554, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x0", + "0x20" + ] + }, + { + "pc": 3662, + "op": "POP", + "gas": 2076551, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x20", + "0x0" + ] + }, + { + "pc": 3663, + "op": "PUSH3", + "gas": 2076549, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x20" + ] + }, + { + "pc": 3667, + "op": "JUMP", + "gas": 2076546, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x20", + "0xe37" + ] + }, + { + "pc": 3639, + "op": "JUMPDEST", + "gas": 2076538, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x20" + ] + }, + { + "pc": 3640, + "op": "DUP4", + "gas": 2076537, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x20" + ] + }, + { + "pc": 3641, + "op": "DUP2", + "gas": 2076534, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x20", + "0x17" + ] + }, + { + "pc": 3642, + "op": "LT", + "gas": 2076531, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x20", + "0x17", + "0x20" + ] + }, + { + "pc": 3643, + "op": "ISZERO", + "gas": 2076528, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x20", + "0x0" + ] + }, + { + "pc": 3644, + "op": "PUSH3", + "gas": 2076525, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x20", + "0x1" + ] + }, + { + "pc": 3648, + "op": "JUMPI", + "gas": 2076522, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x20", + "0x1", + "0xe54" + ] + }, + { + "pc": 3668, + "op": "JUMPDEST", + "gas": 2076512, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x20" + ] + }, + { + "pc": 3669, + "op": "DUP4", + "gas": 2076511, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x20" + ] + }, + { + "pc": 3670, + "op": "DUP2", + "gas": 2076508, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x20", + "0x17" + ] + }, + { + "pc": 3671, + "op": "GT", + "gas": 2076505, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x20", + "0x17", + "0x20" + ] + }, + { + "pc": 3672, + "op": "ISZERO", + "gas": 2076502, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x20", + "0x1" + ] + }, + { + "pc": 3673, + "op": "PUSH3", + "gas": 2076499, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x20", + "0x0" + ] + }, + { + "pc": 3677, + "op": "JUMPI", + "gas": 2076496, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x20", + "0x0", + "0xe64" + ] + }, + { + "pc": 3678, + "op": "PUSH1", + "gas": 2076486, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x20" + ] + }, + { + "pc": 3680, + "op": "DUP5", + "gas": 2076483, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x20", + "0x0" + ] + }, + { + "pc": 3681, + "op": "DUP5", + "gas": 2076480, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x20", + "0x0", + "0x17" + ] + }, + { + "pc": 3682, + "op": "ADD", + "gas": 2076477, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x20", + "0x0", + "0x17", + "0x120" + ] + }, + { + "pc": 3683, + "op": "MSTORE", + "gas": 2076474, + "gasCost": 6, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x20", + "0x0", + "0x137" + ] + }, + { + "pc": 3684, + "op": "JUMPDEST", + "gas": 2076468, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x20" + ] + }, + { + "pc": 3685, + "op": "POP", + "gas": 2076467, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0", + "0x20" + ] + }, + { + "pc": 3686, + "op": "POP", + "gas": 2076465, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120", + "0xc0" + ] + }, + { + "pc": 3687, + "op": "POP", + "gas": 2076463, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17", + "0x120" + ] + }, + { + "pc": 3688, + "op": "POP", + "gas": 2076461, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95", + "0x17" + ] + }, + { + "pc": 3689, + "op": "JUMP", + "gas": 2076459, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xe95" + ] + }, + { + "pc": 3733, + "op": "JUMPDEST", + "gas": 2076451, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17" + ] + }, + { + "pc": 3734, + "op": "PUSH3", + "gas": 2076450, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17" + ] + }, + { + "pc": 3738, + "op": "DUP2", + "gas": 2076447, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xea0" + ] + }, + { + "pc": 3739, + "op": "PUSH3", + "gas": 2076444, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xea0", + "0x17" + ] + }, + { + "pc": 3743, + "op": "JUMP", + "gas": 2076441, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xea0", + "0x17", + "0xd11" + ] + }, + { + "pc": 3345, + "op": "JUMPDEST", + "gas": 2076433, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xea0", + "0x17" + ] + }, + { + "pc": 3346, + "op": "PUSH1", + "gas": 2076432, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xea0", + "0x17" + ] + }, + { + "pc": 3348, + "op": "PUSH1", + "gas": 2076429, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xea0", + "0x17", + "0x0" + ] + }, + { + "pc": 3350, + "op": "NOT", + "gas": 2076426, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xea0", + "0x17", + "0x0", + "0x1f" + ] + }, + { + "pc": 3351, + "op": "PUSH1", + "gas": 2076423, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xea0", + "0x17", + "0x0", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0" + ] + }, + { + "pc": 3353, + "op": "DUP4", + "gas": 2076420, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xea0", + "0x17", + "0x0", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0", + "0x1f" + ] + }, + { + "pc": 3354, + "op": "ADD", + "gas": 2076417, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xea0", + "0x17", + "0x0", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0", + "0x1f", + "0x17" + ] + }, + { + "pc": 3355, + "op": "AND", + "gas": 2076414, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xea0", + "0x17", + "0x0", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0", + "0x36" + ] + }, + { + "pc": 3356, + "op": "SWAP1", + "gas": 2076411, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xea0", + "0x17", + "0x0", + "0x20" + ] + }, + { + "pc": 3357, + "op": "POP", + "gas": 2076408, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xea0", + "0x17", + "0x20", + "0x0" + ] + }, + { + "pc": 3358, + "op": "SWAP2", + "gas": 2076406, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0xea0", + "0x17", + "0x20" + ] + }, + { + "pc": 3359, + "op": "SWAP1", + "gas": 2076403, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0x20", + "0x17", + "0xea0" + ] + }, + { + "pc": 3360, + "op": "POP", + "gas": 2076400, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0x20", + "0xea0", + "0x17" + ] + }, + { + "pc": 3361, + "op": "JUMP", + "gas": 2076398, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0x20", + "0xea0" + ] + }, + { + "pc": 3744, + "op": "JUMPDEST", + "gas": 2076390, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0x20" + ] + }, + { + "pc": 3745, + "op": "DUP5", + "gas": 2076389, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0x20" + ] + }, + { + "pc": 3746, + "op": "ADD", + "gas": 2076386, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0x20", + "0x120" + ] + }, + { + "pc": 3747, + "op": "SWAP2", + "gas": 2076383, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x0", + "0x17", + "0x140" + ] + }, + { + "pc": 3748, + "op": "POP", + "gas": 2076380, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x140", + "0x17", + "0x0" + ] + }, + { + "pc": 3749, + "op": "POP", + "gas": 2076378, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x140", + "0x17" + ] + }, + { + "pc": 3750, + "op": "SWAP3", + "gas": 2076376, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0xec7", + "0x120", + "0xa0", + "0x140" + ] + }, + { + "pc": 3751, + "op": "SWAP2", + "gas": 2076373, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0x140", + "0x120", + "0xa0", + "0xec7" + ] + }, + { + "pc": 3752, + "op": "POP", + "gas": 2076370, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0x140", + "0xec7", + "0xa0", + "0x120" + ] + }, + { + "pc": 3753, + "op": "POP", + "gas": 2076368, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0x140", + "0xec7", + "0xa0" + ] + }, + { + "pc": 3754, + "op": "JUMP", + "gas": 2076366, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0x140", + "0xec7" + ] + }, + { + "pc": 3783, + "op": "JUMPDEST", + "gas": 2076358, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0x140" + ] + }, + { + "pc": 3784, + "op": "SWAP1", + "gas": 2076357, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x100", + "0x140" + ] + }, + { + "pc": 3785, + "op": "POP", + "gas": 2076354, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x140", + "0x100" + ] + }, + { + "pc": 3786, + "op": "SWAP3", + "gas": 2076352, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x56e", + "0xa0", + "0xe0", + "0x140" + ] + }, + { + "pc": 3787, + "op": "SWAP2", + "gas": 2076349, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x140", + "0xa0", + "0xe0", + "0x56e" + ] + }, + { + "pc": 3788, + "op": "POP", + "gas": 2076346, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x140", + "0x56e", + "0xe0", + "0xa0" + ] + }, + { + "pc": 3789, + "op": "POP", + "gas": 2076344, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x140", + "0x56e", + "0xe0" + ] + }, + { + "pc": 3790, + "op": "JUMP", + "gas": 2076342, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x140", + "0x56e" + ] + }, + { + "pc": 1390, + "op": "JUMPDEST", + "gas": 2076334, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x140" + ] + }, + { + "pc": 1391, + "op": "PUSH1", + "gas": 2076333, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x140" + ] + }, + { + "pc": 1393, + "op": "MLOAD", + "gas": 2076330, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x140", + "0x40" + ] + }, + { + "pc": 1394, + "op": "DUP1", + "gas": 2076327, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x140", + "0xe0" + ] + }, + { + "pc": 1395, + "op": "SWAP2", + "gas": 2076324, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x140", + "0xe0", + "0xe0" + ] + }, + { + "pc": 1396, + "op": "SUB", + "gas": 2076321, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0xe0", + "0xe0", + "0x140" + ] + }, + { + "pc": 1397, + "op": "SWAP1", + "gas": 2076318, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0xe0", + "0x60" + ] + }, + { + "pc": 1398, + "op": "LOG1", + "gas": 2076315, + "gasCost": 1518, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x60", + "0xe0" + ] + }, + { + "pc": 1399, + "op": "POP", + "gas": 2074797, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xa0" + ] + }, + { + "pc": 1400, + "op": "PUSH3", + "gas": 2074795, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0" + ] + }, + { + "pc": 1404, + "op": "JUMP", + "gas": 2074792, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x5ec" + ] + }, + { + "pc": 1516, + "op": "JUMPDEST", + "gas": 2074784, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0" + ] + }, + { + "pc": 1517, + "op": "PUSH3", + "gas": 2074783, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0" + ] + }, + { + "pc": 1521, + "op": "JUMP", + "gas": 2074780, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x5f3" + ] + }, + { + "pc": 1523, + "op": "JUMPDEST", + "gas": 2074772, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0" + ] + }, + { + "pc": 1524, + "op": "ADDRESS", + "gas": 2074771, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0" + ] + }, + { + "pc": 1525, + "op": "PUSH20", + "gas": 2074769, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address" + ] + }, + { + "pc": 1546, + "op": "AND", + "gas": 2074766, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0xffffffffffffffffffffffffffffffffffffffff" + ] + }, + { + "pc": 1547, + "op": "PUSH4", + "gas": 2074763, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address" + ] + }, + { + "pc": 1552, + "op": "PUSH1", + "gas": 2074760, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x8bfe44ff" + ] + }, + { + "pc": 1554, + "op": "MLOAD", + "gas": 2074757, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x8bfe44ff", + "0x40" + ] + }, + { + "pc": 1555, + "op": "DUP2", + "gas": 2074754, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x8bfe44ff", + "0xe0" + ] + }, + { + "pc": 1556, + "op": "PUSH4", + "gas": 2074751, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x8bfe44ff", + "0xe0", + "0x8bfe44ff" + ] + }, + { + "pc": 1561, + "op": "AND", + "gas": 2074748, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x8bfe44ff", + "0xe0", + "0x8bfe44ff", + "0xffffffff" + ] + }, + { + "pc": 1562, + "op": "PUSH1", + "gas": 2074745, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x8bfe44ff", + "0xe0", + "0x8bfe44ff" + ] + }, + { + "pc": 1564, + "op": "SHL", + "gas": 2074742, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x8bfe44ff", + "0xe0", + "0x8bfe44ff", + "0xe0" + ] + }, + { + "pc": 1565, + "op": "DUP2", + "gas": 2074739, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x8bfe44ff", + "0xe0", + "0x8bfe44ff00000000000000000000000000000000000000000000000000000000" + ] + }, + { + "pc": 1566, + "op": "MSTORE", + "gas": 2074736, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x8bfe44ff", + "0xe0", + "0x8bfe44ff00000000000000000000000000000000000000000000000000000000", + "0xe0" + ] + }, + { + "pc": 1567, + "op": "PUSH1", + "gas": 2074733, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x8bfe44ff", + "0xe0" + ] + }, + { + "pc": 1569, + "op": "ADD", + "gas": 2074730, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x8bfe44ff", + "0xe0", + "0x4" + ] + }, + { + "pc": 1570, + "op": "PUSH1", + "gas": 2074727, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x8bfe44ff", + "0xe4" + ] + }, + { + "pc": 1572, + "op": "PUSH1", + "gas": 2074724, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x8bfe44ff", + "0xe4", + "0x0" + ] + }, + { + "pc": 1574, + "op": "MLOAD", + "gas": 2074721, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x8bfe44ff", + "0xe4", + "0x0", + "0x40" + ] + }, + { + "pc": 1575, + "op": "DUP1", + "gas": 2074718, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x8bfe44ff", + "0xe4", + "0x0", + "0xe0" + ] + }, + { + "pc": 1576, + "op": "DUP4", + "gas": 2074715, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x8bfe44ff", + "0xe4", + "0x0", + "0xe0", + "0xe0" + ] + }, + { + "pc": 1577, + "op": "SUB", + "gas": 2074712, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x8bfe44ff", + "0xe4", + "0x0", + "0xe0", + "0xe0", + "0xe4" + ] + }, + { + "pc": 1578, + "op": "DUP2", + "gas": 2074709, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x8bfe44ff", + "0xe4", + "0x0", + "0xe0", + "0x4" + ] + }, + { + "pc": 1579, + "op": "DUP7", + "gas": 2074706, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x8bfe44ff", + "0xe4", + "0x0", + "0xe0", + "0x4", + "0xe0" + ] + }, + { + "pc": 1580, + "op": "DUP1", + "gas": 2074703, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x8bfe44ff", + "0xe4", + "0x0", + "0xe0", + "0x4", + "0xe0", + "Tracer.address" + ] + }, + { + "pc": 1581, + "op": "EXTCODESIZE", + "gas": 2074700, + "gasCost": 100, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x8bfe44ff", + "0xe4", + "0x0", + "0xe0", + "0x4", + "0xe0", + "Tracer.address", + "Tracer.address" + ] + }, + { + "pc": 1582, + "op": "ISZERO", + "gas": 2074600, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x8bfe44ff", + "0xe4", + "0x0", + "0xe0", + "0x4", + "0xe0", + "Tracer.address", + "0x1bde" + ] + }, + { + "pc": 1583, + "op": "DUP1", + "gas": 2074597, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x8bfe44ff", + "0xe4", + "0x0", + "0xe0", + "0x4", + "0xe0", + "Tracer.address", + "0x0" + ] + }, + { + "pc": 1584, + "op": "ISZERO", + "gas": 2074594, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x8bfe44ff", + "0xe4", + "0x0", + "0xe0", + "0x4", + "0xe0", + "Tracer.address", + "0x0", + "0x0" + ] + }, + { + "pc": 1585, + "op": "PUSH3", + "gas": 2074591, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x8bfe44ff", + "0xe4", + "0x0", + "0xe0", + "0x4", + "0xe0", + "Tracer.address", + "0x0", + "0x1" + ] + }, + { + "pc": 1589, + "op": "JUMPI", + "gas": 2074588, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x8bfe44ff", + "0xe4", + "0x0", + "0xe0", + "0x4", + "0xe0", + "Tracer.address", + "0x0", + "0x1", + "0x63a" + ] + }, + { + "pc": 1594, + "op": "JUMPDEST", + "gas": 2074578, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x8bfe44ff", + "0xe4", + "0x0", + "0xe0", + "0x4", + "0xe0", + "Tracer.address", + "0x0" + ] + }, + { + "pc": 1595, + "op": "POP", + "gas": 2074577, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x8bfe44ff", + "0xe4", + "0x0", + "0xe0", + "0x4", + "0xe0", + "Tracer.address", + "0x0" + ] + }, + { + "pc": 1596, + "op": "GAS", + "gas": 2074575, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x8bfe44ff", + "0xe4", + "0x0", + "0xe0", + "0x4", + "0xe0", + "Tracer.address" + ] + }, + { + "pc": 1597, + "op": "STATICCALL", + "gas": 2074573, + "gasCost": 2042160, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x8bfe44ff", + "0xe4", + "0x0", + "0xe0", + "0x4", + "0xe0", + "Tracer.address", + "0x1fa7cd" + ] + }, + { + "pc": 0, + "op": "PUSH1", + "gas": 2042060, + "gasCost": 3, + "depth": 2, + "stack": [] + }, + { + "pc": 2, + "op": "PUSH1", + "gas": 2042057, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x80" + ] + }, + { + "pc": 4, + "op": "MSTORE", + "gas": 2042054, + "gasCost": 12, + "depth": 2, + "stack": [ + "0x80", + "0x40" + ] + }, + { + "pc": 5, + "op": "CALLVALUE", + "gas": 2042042, + "gasCost": 2, + "depth": 2, + "stack": [] + }, + { + "pc": 6, + "op": "DUP1", + "gas": 2042040, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0" + ] + }, + { + "pc": 7, + "op": "ISZERO", + "gas": 2042037, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0", + "0x0" + ] + }, + { + "pc": 8, + "op": "PUSH3", + "gas": 2042034, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0", + "0x1" + ] + }, + { + "pc": 12, + "op": "JUMPI", + "gas": 2042031, + "gasCost": 10, + "depth": 2, + "stack": [ + "0x0", + "0x1", + "0x11" + ] + }, + { + "pc": 17, + "op": "JUMPDEST", + "gas": 2042021, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x0" + ] + }, + { + "pc": 18, + "op": "POP", + "gas": 2042020, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x0" + ] + }, + { + "pc": 19, + "op": "PUSH1", + "gas": 2042018, + "gasCost": 3, + "depth": 2, + "stack": [] + }, + { + "pc": 21, + "op": "CALLDATASIZE", + "gas": 2042015, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x4" + ] + }, + { + "pc": 22, + "op": "LT", + "gas": 2042013, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x4", + "0x4" + ] + }, + { + "pc": 23, + "op": "PUSH3", + "gas": 2042010, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0" + ] + }, + { + "pc": 27, + "op": "JUMPI", + "gas": 2042007, + "gasCost": 10, + "depth": 2, + "stack": [ + "0x0", + "0xac" + ] + }, + { + "pc": 28, + "op": "PUSH1", + "gas": 2041997, + "gasCost": 3, + "depth": 2, + "stack": [] + }, + { + "pc": 30, + "op": "CALLDATALOAD", + "gas": 2041994, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x0" + ] + }, + { + "pc": 31, + "op": "PUSH1", + "gas": 2041991, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff00000000000000000000000000000000000000000000000000000000" + ] + }, + { + "pc": 33, + "op": "SHR", + "gas": 2041988, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff00000000000000000000000000000000000000000000000000000000", + "0xe0" + ] + }, + { + "pc": 34, + "op": "DUP1", + "gas": 2041985, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff" + ] + }, + { + "pc": 35, + "op": "PUSH4", + "gas": 2041982, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x8bfe44ff" + ] + }, + { + "pc": 40, + "op": "GT", + "gas": 2041979, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x8bfe44ff", + "0x8bfe44ff" + ] + }, + { + "pc": 41, + "op": "PUSH3", + "gas": 2041976, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x0" + ] + }, + { + "pc": 45, + "op": "JUMPI", + "gas": 2041973, + "gasCost": 10, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x0", + "0x6f" + ] + }, + { + "pc": 46, + "op": "DUP1", + "gas": 2041963, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff" + ] + }, + { + "pc": 47, + "op": "PUSH4", + "gas": 2041960, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x8bfe44ff" + ] + }, + { + "pc": 52, + "op": "EQ", + "gas": 2041957, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x8bfe44ff", + "0x8bfe44ff" + ] + }, + { + "pc": 53, + "op": "PUSH3", + "gas": 2041954, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1" + ] + }, + { + "pc": 57, + "op": "JUMPI", + "gas": 2041951, + "gasCost": 10, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1", + "0x197" + ] + }, + { + "pc": 407, + "op": "JUMPDEST", + "gas": 2041941, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x8bfe44ff" + ] + }, + { + "pc": 408, + "op": "PUSH3", + "gas": 2041940, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff" + ] + }, + { + "pc": 412, + "op": "PUSH3", + "gas": 2041937, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1" + ] + }, + { + "pc": 416, + "op": "JUMP", + "gas": 2041934, + "gasCost": 8, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x783" + ] + }, + { + "pc": 1923, + "op": "JUMPDEST", + "gas": 2041926, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1" + ] + }, + { + "pc": 1924, + "op": "PUSH1", + "gas": 2041925, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1" + ] + }, + { + "pc": 1926, + "op": "DUP1", + "gas": 2041922, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x1" + ] + }, + { + "pc": 1927, + "op": "PUSH1", + "gas": 2041919, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x1", + "0x1" + ] + }, + { + "pc": 1929, + "op": "MLOAD", + "gas": 2041916, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x1", + "0x1", + "0x40" + ] + }, + { + "pc": 1930, + "op": "PUSH32", + "gas": 2041913, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x1", + "0x1", + "0x80" + ] + }, + { + "pc": 1963, + "op": "DUP2", + "gas": 2041910, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x1", + "0x1", + "0x80", + "0xcf47918100000000000000000000000000000000000000000000000000000000" + ] + }, + { + "pc": 1964, + "op": "MSTORE", + "gas": 2041907, + "gasCost": 9, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x1", + "0x1", + "0x80", + "0xcf47918100000000000000000000000000000000000000000000000000000000", + "0x80" + ] + }, + { + "pc": 1965, + "op": "PUSH1", + "gas": 2041898, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x1", + "0x1", + "0x80" + ] + }, + { + "pc": 1967, + "op": "ADD", + "gas": 2041895, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x1", + "0x1", + "0x80", + "0x4" + ] + }, + { + "pc": 1968, + "op": "PUSH3", + "gas": 2041892, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x1", + "0x1", + "0x84" + ] + }, + { + "pc": 1972, + "op": "SWAP3", + "gas": 2041889, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x1", + "0x1", + "0x84", + "0x7bc" + ] + }, + { + "pc": 1973, + "op": "SWAP2", + "gas": 2041886, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x84", + "0x1" + ] + }, + { + "pc": 1974, + "op": "SWAP1", + "gas": 2041883, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x84", + "0x1" + ] + }, + { + "pc": 1975, + "op": "PUSH3", + "gas": 2041880, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84" + ] + }, + { + "pc": 1979, + "op": "JUMP", + "gas": 2041877, + "gasCost": 8, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0x1026" + ] + }, + { + "pc": 4134, + "op": "JUMPDEST", + "gas": 2041869, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84" + ] + }, + { + "pc": 4135, + "op": "PUSH1", + "gas": 2041868, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84" + ] + }, + { + "pc": 4137, + "op": "PUSH1", + "gas": 2041865, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0x0" + ] + }, + { + "pc": 4139, + "op": "DUP3", + "gas": 2041862, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0x0", + "0x40" + ] + }, + { + "pc": 4140, + "op": "ADD", + "gas": 2041859, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0x0", + "0x40", + "0x84" + ] + }, + { + "pc": 4141, + "op": "SWAP1", + "gas": 2041856, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0x0", + "0xc4" + ] + }, + { + "pc": 4142, + "op": "POP", + "gas": 2041853, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x0" + ] + }, + { + "pc": 4143, + "op": "PUSH3", + "gas": 2041851, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4" + ] + }, + { + "pc": 4147, + "op": "PUSH1", + "gas": 2041848, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d" + ] + }, + { + "pc": 4149, + "op": "DUP4", + "gas": 2041845, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x0" + ] + }, + { + "pc": 4150, + "op": "ADD", + "gas": 2041842, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x0", + "0x84" + ] + }, + { + "pc": 4151, + "op": "DUP6", + "gas": 2041839, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84" + ] + }, + { + "pc": 4152, + "op": "PUSH3", + "gas": 2041836, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1" + ] + }, + { + "pc": 4156, + "op": "JUMP", + "gas": 2041833, + "gasCost": 8, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1015" + ] + }, + { + "pc": 4117, + "op": "JUMPDEST", + "gas": 2041825, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1" + ] + }, + { + "pc": 4118, + "op": "PUSH3", + "gas": 2041824, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1" + ] + }, + { + "pc": 4122, + "op": "DUP2", + "gas": 2041821, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020" + ] + }, + { + "pc": 4123, + "op": "PUSH3", + "gas": 2041818, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1" + ] + }, + { + "pc": 4127, + "op": "JUMP", + "gas": 2041815, + "gasCost": 8, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0xfed" + ] + }, + { + "pc": 4077, + "op": "JUMPDEST", + "gas": 2041807, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1" + ] + }, + { + "pc": 4078, + "op": "PUSH1", + "gas": 2041806, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1" + ] + }, + { + "pc": 4080, + "op": "PUSH3", + "gas": 2041803, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0" + ] + }, + { + "pc": 4084, + "op": "PUSH3", + "gas": 2041800, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e" + ] + }, + { + "pc": 4088, + "op": "PUSH3", + "gas": 2041797, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008" + ] + }, + { + "pc": 4092, + "op": "DUP5", + "gas": 2041794, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1002" + ] + }, + { + "pc": 4093, + "op": "PUSH3", + "gas": 2041791, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1002", + "0x1" + ] + }, + { + "pc": 4097, + "op": "JUMP", + "gas": 2041788, + "gasCost": 8, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1002", + "0x1", + "0xfd9" + ] + }, + { + "pc": 4057, + "op": "JUMPDEST", + "gas": 2041780, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1002", + "0x1" + ] + }, + { + "pc": 4058, + "op": "PUSH1", + "gas": 2041779, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1002", + "0x1" + ] + }, + { + "pc": 4060, + "op": "DUP2", + "gas": 2041776, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1002", + "0x1", + "0x0" + ] + }, + { + "pc": 4061, + "op": "SWAP1", + "gas": 2041773, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1002", + "0x1", + "0x0", + "0x1" + ] + }, + { + "pc": 4062, + "op": "POP", + "gas": 2041770, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1002", + "0x1", + "0x1", + "0x0" + ] + }, + { + "pc": 4063, + "op": "SWAP2", + "gas": 2041768, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1002", + "0x1", + "0x1" + ] + }, + { + "pc": 4064, + "op": "SWAP1", + "gas": 2041765, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1", + "0x1", + "0x1002" + ] + }, + { + "pc": 4065, + "op": "POP", + "gas": 2041762, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1", + "0x1002", + "0x1" + ] + }, + { + "pc": 4066, + "op": "JUMP", + "gas": 2041760, + "gasCost": 8, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1", + "0x1002" + ] + }, + { + "pc": 4098, + "op": "JUMPDEST", + "gas": 2041752, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1" + ] + }, + { + "pc": 4099, + "op": "PUSH3", + "gas": 2041751, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1" + ] + }, + { + "pc": 4103, + "op": "JUMP", + "gas": 2041748, + "gasCost": 8, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1", + "0xfe3" + ] + }, + { + "pc": 4067, + "op": "JUMPDEST", + "gas": 2041740, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1" + ] + }, + { + "pc": 4068, + "op": "PUSH1", + "gas": 2041739, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1" + ] + }, + { + "pc": 4070, + "op": "DUP2", + "gas": 2041736, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1", + "0x0" + ] + }, + { + "pc": 4071, + "op": "SWAP1", + "gas": 2041733, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1", + "0x0", + "0x1" + ] + }, + { + "pc": 4072, + "op": "POP", + "gas": 2041730, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1", + "0x1", + "0x0" + ] + }, + { + "pc": 4073, + "op": "SWAP2", + "gas": 2041728, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1", + "0x1" + ] + }, + { + "pc": 4074, + "op": "SWAP1", + "gas": 2041725, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1", + "0x1", + "0x1008" + ] + }, + { + "pc": 4075, + "op": "POP", + "gas": 2041722, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1", + "0x1008", + "0x1" + ] + }, + { + "pc": 4076, + "op": "JUMP", + "gas": 2041720, + "gasCost": 8, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1", + "0x1008" + ] + }, + { + "pc": 4104, + "op": "JUMPDEST", + "gas": 2041712, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1" + ] + }, + { + "pc": 4105, + "op": "PUSH3", + "gas": 2041711, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1" + ] + }, + { + "pc": 4109, + "op": "JUMP", + "gas": 2041708, + "gasCost": 8, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1", + "0x97c" + ] + }, + { + "pc": 2428, + "op": "JUMPDEST", + "gas": 2041700, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1" + ] + }, + { + "pc": 2429, + "op": "PUSH1", + "gas": 2041699, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1" + ] + }, + { + "pc": 2431, + "op": "DUP2", + "gas": 2041696, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1", + "0x0" + ] + }, + { + "pc": 2432, + "op": "SWAP1", + "gas": 2041693, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1", + "0x0", + "0x1" + ] + }, + { + "pc": 2433, + "op": "POP", + "gas": 2041690, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1", + "0x1", + "0x0" + ] + }, + { + "pc": 2434, + "op": "SWAP2", + "gas": 2041688, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1", + "0x1" + ] + }, + { + "pc": 2435, + "op": "SWAP1", + "gas": 2041685, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x1", + "0x1", + "0x100e" + ] + }, + { + "pc": 2436, + "op": "POP", + "gas": 2041682, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x1", + "0x100e", + "0x1" + ] + }, + { + "pc": 2437, + "op": "JUMP", + "gas": 2041680, + "gasCost": 8, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x1", + "0x100e" + ] + }, + { + "pc": 4110, + "op": "JUMPDEST", + "gas": 2041672, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x1" + ] + }, + { + "pc": 4111, + "op": "SWAP1", + "gas": 2041671, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x1" + ] + }, + { + "pc": 4112, + "op": "POP", + "gas": 2041668, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x1", + "0x0" + ] + }, + { + "pc": 4113, + "op": "SWAP2", + "gas": 2041666, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1020", + "0x1", + "0x1" + ] + }, + { + "pc": 4114, + "op": "SWAP1", + "gas": 2041663, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1", + "0x1", + "0x1020" + ] + }, + { + "pc": 4115, + "op": "POP", + "gas": 2041660, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1", + "0x1020", + "0x1" + ] + }, + { + "pc": 4116, + "op": "JUMP", + "gas": 2041658, + "gasCost": 8, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1", + "0x1020" + ] + }, + { + "pc": 4128, + "op": "JUMPDEST", + "gas": 2041650, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1" + ] + }, + { + "pc": 4129, + "op": "DUP3", + "gas": 2041649, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1" + ] + }, + { + "pc": 4130, + "op": "MSTORE", + "gas": 2041646, + "gasCost": 6, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1", + "0x1", + "0x84" + ] + }, + { + "pc": 4131, + "op": "POP", + "gas": 2041640, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84", + "0x1" + ] + }, + { + "pc": 4132, + "op": "POP", + "gas": 2041638, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d", + "0x84" + ] + }, + { + "pc": 4133, + "op": "JUMP", + "gas": 2041636, + "gasCost": 8, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x103d" + ] + }, + { + "pc": 4157, + "op": "JUMPDEST", + "gas": 2041628, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4" + ] + }, + { + "pc": 4158, + "op": "PUSH3", + "gas": 2041627, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4" + ] + }, + { + "pc": 4162, + "op": "PUSH1", + "gas": 2041624, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c" + ] + }, + { + "pc": 4164, + "op": "DUP4", + "gas": 2041621, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0x20" + ] + }, + { + "pc": 4165, + "op": "ADD", + "gas": 2041618, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0x20", + "0x84" + ] + }, + { + "pc": 4166, + "op": "DUP5", + "gas": 2041615, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4" + ] + }, + { + "pc": 4167, + "op": "PUSH3", + "gas": 2041612, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1" + ] + }, + { + "pc": 4171, + "op": "JUMP", + "gas": 2041609, + "gasCost": 8, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1015" + ] + }, + { + "pc": 4117, + "op": "JUMPDEST", + "gas": 2041601, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1" + ] + }, + { + "pc": 4118, + "op": "PUSH3", + "gas": 2041600, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1" + ] + }, + { + "pc": 4122, + "op": "DUP2", + "gas": 2041597, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020" + ] + }, + { + "pc": 4123, + "op": "PUSH3", + "gas": 2041594, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1" + ] + }, + { + "pc": 4127, + "op": "JUMP", + "gas": 2041591, + "gasCost": 8, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0xfed" + ] + }, + { + "pc": 4077, + "op": "JUMPDEST", + "gas": 2041583, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1" + ] + }, + { + "pc": 4078, + "op": "PUSH1", + "gas": 2041582, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1" + ] + }, + { + "pc": 4080, + "op": "PUSH3", + "gas": 2041579, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0" + ] + }, + { + "pc": 4084, + "op": "PUSH3", + "gas": 2041576, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e" + ] + }, + { + "pc": 4088, + "op": "PUSH3", + "gas": 2041573, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008" + ] + }, + { + "pc": 4092, + "op": "DUP5", + "gas": 2041570, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1002" + ] + }, + { + "pc": 4093, + "op": "PUSH3", + "gas": 2041567, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1002", + "0x1" + ] + }, + { + "pc": 4097, + "op": "JUMP", + "gas": 2041564, + "gasCost": 8, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1002", + "0x1", + "0xfd9" + ] + }, + { + "pc": 4057, + "op": "JUMPDEST", + "gas": 2041556, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1002", + "0x1" + ] + }, + { + "pc": 4058, + "op": "PUSH1", + "gas": 2041555, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1002", + "0x1" + ] + }, + { + "pc": 4060, + "op": "DUP2", + "gas": 2041552, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1002", + "0x1", + "0x0" + ] + }, + { + "pc": 4061, + "op": "SWAP1", + "gas": 2041549, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1002", + "0x1", + "0x0", + "0x1" + ] + }, + { + "pc": 4062, + "op": "POP", + "gas": 2041546, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1002", + "0x1", + "0x1", + "0x0" + ] + }, + { + "pc": 4063, + "op": "SWAP2", + "gas": 2041544, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1002", + "0x1", + "0x1" + ] + }, + { + "pc": 4064, + "op": "SWAP1", + "gas": 2041541, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1", + "0x1", + "0x1002" + ] + }, + { + "pc": 4065, + "op": "POP", + "gas": 2041538, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1", + "0x1002", + "0x1" + ] + }, + { + "pc": 4066, + "op": "JUMP", + "gas": 2041536, + "gasCost": 8, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1", + "0x1002" + ] + }, + { + "pc": 4098, + "op": "JUMPDEST", + "gas": 2041528, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1" + ] + }, + { + "pc": 4099, + "op": "PUSH3", + "gas": 2041527, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1" + ] + }, + { + "pc": 4103, + "op": "JUMP", + "gas": 2041524, + "gasCost": 8, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1", + "0xfe3" + ] + }, + { + "pc": 4067, + "op": "JUMPDEST", + "gas": 2041516, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1" + ] + }, + { + "pc": 4068, + "op": "PUSH1", + "gas": 2041515, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1" + ] + }, + { + "pc": 4070, + "op": "DUP2", + "gas": 2041512, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1", + "0x0" + ] + }, + { + "pc": 4071, + "op": "SWAP1", + "gas": 2041509, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1", + "0x0", + "0x1" + ] + }, + { + "pc": 4072, + "op": "POP", + "gas": 2041506, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1", + "0x1", + "0x0" + ] + }, + { + "pc": 4073, + "op": "SWAP2", + "gas": 2041504, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1008", + "0x1", + "0x1" + ] + }, + { + "pc": 4074, + "op": "SWAP1", + "gas": 2041501, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1", + "0x1", + "0x1008" + ] + }, + { + "pc": 4075, + "op": "POP", + "gas": 2041498, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1", + "0x1008", + "0x1" + ] + }, + { + "pc": 4076, + "op": "JUMP", + "gas": 2041496, + "gasCost": 8, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1", + "0x1008" + ] + }, + { + "pc": 4104, + "op": "JUMPDEST", + "gas": 2041488, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1" + ] + }, + { + "pc": 4105, + "op": "PUSH3", + "gas": 2041487, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1" + ] + }, + { + "pc": 4109, + "op": "JUMP", + "gas": 2041484, + "gasCost": 8, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1", + "0x97c" + ] + }, + { + "pc": 2428, + "op": "JUMPDEST", + "gas": 2041476, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1" + ] + }, + { + "pc": 2429, + "op": "PUSH1", + "gas": 2041475, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1" + ] + }, + { + "pc": 2431, + "op": "DUP2", + "gas": 2041472, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1", + "0x0" + ] + }, + { + "pc": 2432, + "op": "SWAP1", + "gas": 2041469, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1", + "0x0", + "0x1" + ] + }, + { + "pc": 2433, + "op": "POP", + "gas": 2041466, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1", + "0x1", + "0x0" + ] + }, + { + "pc": 2434, + "op": "SWAP2", + "gas": 2041464, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x100e", + "0x1", + "0x1" + ] + }, + { + "pc": 2435, + "op": "SWAP1", + "gas": 2041461, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x1", + "0x1", + "0x100e" + ] + }, + { + "pc": 2436, + "op": "POP", + "gas": 2041458, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x1", + "0x100e", + "0x1" + ] + }, + { + "pc": 2437, + "op": "JUMP", + "gas": 2041456, + "gasCost": 8, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x1", + "0x100e" + ] + }, + { + "pc": 4110, + "op": "JUMPDEST", + "gas": 2041448, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x1" + ] + }, + { + "pc": 4111, + "op": "SWAP1", + "gas": 2041447, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x0", + "0x1" + ] + }, + { + "pc": 4112, + "op": "POP", + "gas": 2041444, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x1", + "0x0" + ] + }, + { + "pc": 4113, + "op": "SWAP2", + "gas": 2041442, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1020", + "0x1", + "0x1" + ] + }, + { + "pc": 4114, + "op": "SWAP1", + "gas": 2041439, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1", + "0x1", + "0x1020" + ] + }, + { + "pc": 4115, + "op": "POP", + "gas": 2041436, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1", + "0x1020", + "0x1" + ] + }, + { + "pc": 4116, + "op": "JUMP", + "gas": 2041434, + "gasCost": 8, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1", + "0x1020" + ] + }, + { + "pc": 4128, + "op": "JUMPDEST", + "gas": 2041426, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1" + ] + }, + { + "pc": 4129, + "op": "DUP3", + "gas": 2041425, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1" + ] + }, + { + "pc": 4130, + "op": "MSTORE", + "gas": 2041422, + "gasCost": 6, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1", + "0x1", + "0xa4" + ] + }, + { + "pc": 4131, + "op": "POP", + "gas": 2041416, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4", + "0x1" + ] + }, + { + "pc": 4132, + "op": "POP", + "gas": 2041414, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c", + "0xa4" + ] + }, + { + "pc": 4133, + "op": "JUMP", + "gas": 2041412, + "gasCost": 8, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4", + "0x104c" + ] + }, + { + "pc": 4172, + "op": "JUMPDEST", + "gas": 2041404, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4" + ] + }, + { + "pc": 4173, + "op": "SWAP4", + "gas": 2041403, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x7bc", + "0x1", + "0x1", + "0x84", + "0xc4" + ] + }, + { + "pc": 4174, + "op": "SWAP3", + "gas": 2041400, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0xc4", + "0x1", + "0x1", + "0x84", + "0x7bc" + ] + }, + { + "pc": 4175, + "op": "POP", + "gas": 2041397, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0xc4", + "0x7bc", + "0x1", + "0x84", + "0x1" + ] + }, + { + "pc": 4176, + "op": "POP", + "gas": 2041395, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0xc4", + "0x7bc", + "0x1", + "0x84" + ] + }, + { + "pc": 4177, + "op": "POP", + "gas": 2041393, + "gasCost": 2, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0xc4", + "0x7bc", + "0x1" + ] + }, + { + "pc": 4178, + "op": "JUMP", + "gas": 2041391, + "gasCost": 8, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0xc4", + "0x7bc" + ] + }, + { + "pc": 1980, + "op": "JUMPDEST", + "gas": 2041383, + "gasCost": 1, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0xc4" + ] + }, + { + "pc": 1981, + "op": "PUSH1", + "gas": 2041382, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0xc4" + ] + }, + { + "pc": 1983, + "op": "MLOAD", + "gas": 2041379, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0xc4", + "0x40" + ] + }, + { + "pc": 1984, + "op": "DUP1", + "gas": 2041376, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0xc4", + "0x80" + ] + }, + { + "pc": 1985, + "op": "SWAP2", + "gas": 2041373, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0xc4", + "0x80", + "0x80" + ] + }, + { + "pc": 1986, + "op": "SUB", + "gas": 2041370, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x80", + "0x80", + "0xc4" + ] + }, + { + "pc": 1987, + "op": "SWAP1", + "gas": 2041367, + "gasCost": 3, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x80", + "0x44" + ] + }, + { + "pc": 1988, + "op": "REVERT", + "gas": 2041364, + "gasCost": 0, + "depth": 2, + "stack": [ + "0x8bfe44ff", + "0x1a1", + "0x44", + "0x80" + ] + }, + { + "pc": 1598, + "op": "SWAP3", + "gas": 2073777, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "Tracer.address", + "0x8bfe44ff", + "0xe4", + "0x0" + ] + }, + { + "pc": 1599, + "op": "POP", + "gas": 2073774, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x0", + "0x8bfe44ff", + "0xe4", + "Tracer.address" + ] + }, + { + "pc": 1600, + "op": "POP", + "gas": 2073772, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x0", + "0x8bfe44ff", + "0xe4" + ] + }, + { + "pc": 1601, + "op": "POP", + "gas": 2073770, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x0", + "0x8bfe44ff" + ] + }, + { + "pc": 1602, + "op": "DUP1", + "gas": 2073768, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x0" + ] + }, + { + "pc": 1603, + "op": "ISZERO", + "gas": 2073765, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x0", + "0x0" + ] + }, + { + "pc": 1604, + "op": "PUSH3", + "gas": 2073762, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x0", + "0x1" + ] + }, + { + "pc": 1608, + "op": "JUMPI", + "gas": 2073759, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x0", + "0x1", + "0x64c" + ] + }, + { + "pc": 1612, + "op": "JUMPDEST", + "gas": 2073749, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x0" + ] + }, + { + "pc": 1613, + "op": "PUSH3", + "gas": 2073748, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x0" + ] + }, + { + "pc": 1617, + "op": "JUMPI", + "gas": 2073745, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x0", + "0x735" + ] + }, + { + "pc": 1618, + "op": "PUSH3", + "gas": 2073735, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0" + ] + }, + { + "pc": 1622, + "op": "PUSH3", + "gas": 2073732, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b" + ] + }, + { + "pc": 1626, + "op": "JUMP", + "gas": 2073729, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b", + "0xcec" + ] + }, + { + "pc": 3308, + "op": "JUMPDEST", + "gas": 2073721, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b" + ] + }, + { + "pc": 3309, + "op": "PUSH1", + "gas": 2073720, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b" + ] + }, + { + "pc": 3311, + "op": "PUSH1", + "gas": 2073717, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b", + "0x0" + ] + }, + { + "pc": 3313, + "op": "RETURNDATASIZE", + "gas": 2073714, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b", + "0x0", + "0x3" + ] + }, + { + "pc": 3314, + "op": "GT", + "gas": 2073712, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b", + "0x0", + "0x3", + "0x44" + ] + }, + { + "pc": 3315, + "op": "ISZERO", + "gas": 2073709, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b", + "0x0", + "0x1" + ] + }, + { + "pc": 3316, + "op": "PUSH3", + "gas": 2073706, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b", + "0x0", + "0x0" + ] + }, + { + "pc": 3320, + "op": "JUMPI", + "gas": 2073703, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b", + "0x0", + "0x0", + "0xd0e" + ] + }, + { + "pc": 3321, + "op": "PUSH1", + "gas": 2073693, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b", + "0x0" + ] + }, + { + "pc": 3323, + "op": "PUSH1", + "gas": 2073690, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b", + "0x0", + "0x4" + ] + }, + { + "pc": 3325, + "op": "DUP1", + "gas": 2073687, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b", + "0x0", + "0x4", + "0x0" + ] + }, + { + "pc": 3326, + "op": "RETURNDATACOPY", + "gas": 2073684, + "gasCost": 6, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b", + "0x0", + "0x4", + "0x0", + "0x0" + ] + }, + { + "pc": 3327, + "op": "PUSH3", + "gas": 2073678, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b", + "0x0" + ] + }, + { + "pc": 3331, + "op": "PUSH1", + "gas": 2073675, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b", + "0x0", + "0xd0b" + ] + }, + { + "pc": 3333, + "op": "MLOAD", + "gas": 2073672, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b", + "0x0", + "0xd0b", + "0x0" + ] + }, + { + "pc": 3334, + "op": "PUSH3", + "gas": 2073669, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b", + "0x0", + "0xd0b", + "0xcf47918100000000000000000000000000000000000000000000000000000000" + ] + }, + { + "pc": 3338, + "op": "JUMP", + "gas": 2073666, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b", + "0x0", + "0xd0b", + "0xcf47918100000000000000000000000000000000000000000000000000000000", + "0xcdf" + ] + }, + { + "pc": 3295, + "op": "JUMPDEST", + "gas": 2073658, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b", + "0x0", + "0xd0b", + "0xcf47918100000000000000000000000000000000000000000000000000000000" + ] + }, + { + "pc": 3296, + "op": "PUSH1", + "gas": 2073657, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b", + "0x0", + "0xd0b", + "0xcf47918100000000000000000000000000000000000000000000000000000000" + ] + }, + { + "pc": 3298, + "op": "DUP2", + "gas": 2073654, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b", + "0x0", + "0xd0b", + "0xcf47918100000000000000000000000000000000000000000000000000000000", + "0x0" + ] + }, + { + "pc": 3299, + "op": "PUSH1", + "gas": 2073651, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b", + "0x0", + "0xd0b", + "0xcf47918100000000000000000000000000000000000000000000000000000000", + "0x0", + "0xcf47918100000000000000000000000000000000000000000000000000000000" + ] + }, + { + "pc": 3301, + "op": "SHR", + "gas": 2073648, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b", + "0x0", + "0xd0b", + "0xcf47918100000000000000000000000000000000000000000000000000000000", + "0x0", + "0xcf47918100000000000000000000000000000000000000000000000000000000", + "0xe0" + ] + }, + { + "pc": 3302, + "op": "SWAP1", + "gas": 2073645, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b", + "0x0", + "0xd0b", + "0xcf47918100000000000000000000000000000000000000000000000000000000", + "0x0", + "0xcf479181" + ] + }, + { + "pc": 3303, + "op": "POP", + "gas": 2073642, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b", + "0x0", + "0xd0b", + "0xcf47918100000000000000000000000000000000000000000000000000000000", + "0xcf479181", + "0x0" + ] + }, + { + "pc": 3304, + "op": "SWAP2", + "gas": 2073640, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b", + "0x0", + "0xd0b", + "0xcf47918100000000000000000000000000000000000000000000000000000000", + "0xcf479181" + ] + }, + { + "pc": 3305, + "op": "SWAP1", + "gas": 2073637, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b", + "0x0", + "0xcf479181", + "0xcf47918100000000000000000000000000000000000000000000000000000000", + "0xd0b" + ] + }, + { + "pc": 3306, + "op": "POP", + "gas": 2073634, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b", + "0x0", + "0xcf479181", + "0xd0b", + "0xcf47918100000000000000000000000000000000000000000000000000000000" + ] + }, + { + "pc": 3307, + "op": "JUMP", + "gas": 2073632, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b", + "0x0", + "0xcf479181", + "0xd0b" + ] + }, + { + "pc": 3339, + "op": "JUMPDEST", + "gas": 2073624, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b", + "0x0", + "0xcf479181" + ] + }, + { + "pc": 3340, + "op": "SWAP1", + "gas": 2073623, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b", + "0x0", + "0xcf479181" + ] + }, + { + "pc": 3341, + "op": "POP", + "gas": 2073620, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b", + "0xcf479181", + "0x0" + ] + }, + { + "pc": 3342, + "op": "JUMPDEST", + "gas": 2073618, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b", + "0xcf479181" + ] + }, + { + "pc": 3343, + "op": "SWAP1", + "gas": 2073617, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x65b", + "0xcf479181" + ] + }, + { + "pc": 3344, + "op": "JUMP", + "gas": 2073614, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xcf479181", + "0x65b" + ] + }, + { + "pc": 1627, + "op": "JUMPDEST", + "gas": 2073606, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xcf479181" + ] + }, + { + "pc": 1628, + "op": "DUP1", + "gas": 2073605, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xcf479181" + ] + }, + { + "pc": 1629, + "op": "PUSH4", + "gas": 2073602, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xcf479181", + "0xcf479181" + ] + }, + { + "pc": 1634, + "op": "EQ", + "gas": 2073599, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xcf479181", + "0xcf479181", + "0x8c379a0" + ] + }, + { + "pc": 1635, + "op": "ISZERO", + "gas": 2073596, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xcf479181", + "0x0" + ] + }, + { + "pc": 1636, + "op": "PUSH3", + "gas": 2073593, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xcf479181", + "0x1" + ] + }, + { + "pc": 1640, + "op": "JUMPI", + "gas": 2073590, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xcf479181", + "0x1", + "0x6c0" + ] + }, + { + "pc": 1728, + "op": "JUMPDEST", + "gas": 2073580, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xcf479181" + ] + }, + { + "pc": 1729, + "op": "POP", + "gas": 2073579, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xcf479181" + ] + }, + { + "pc": 1730, + "op": "JUMPDEST", + "gas": 2073577, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0" + ] + }, + { + "pc": 1731, + "op": "RETURNDATASIZE", + "gas": 2073576, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0" + ] + }, + { + "pc": 1732, + "op": "DUP1", + "gas": 2073574, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x44" + ] + }, + { + "pc": 1733, + "op": "PUSH1", + "gas": 2073571, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x44", + "0x44" + ] + }, + { + "pc": 1735, + "op": "DUP2", + "gas": 2073568, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x44", + "0x44", + "0x0" + ] + }, + { + "pc": 1736, + "op": "EQ", + "gas": 2073565, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x44", + "0x44", + "0x0", + "0x44" + ] + }, + { + "pc": 1737, + "op": "PUSH3", + "gas": 2073562, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x44", + "0x44", + "0x0" + ] + }, + { + "pc": 1741, + "op": "JUMPI", + "gas": 2073559, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x44", + "0x44", + "0x0", + "0x6f0" + ] + }, + { + "pc": 1742, + "op": "PUSH1", + "gas": 2073549, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x44", + "0x44" + ] + }, + { + "pc": 1744, + "op": "MLOAD", + "gas": 2073546, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x44", + "0x44", + "0x40" + ] + }, + { + "pc": 1745, + "op": "SWAP2", + "gas": 2073543, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x44", + "0x44", + "0xe0" + ] + }, + { + "pc": 1746, + "op": "POP", + "gas": 2073540, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x44", + "0x44" + ] + }, + { + "pc": 1747, + "op": "PUSH1", + "gas": 2073538, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x44" + ] + }, + { + "pc": 1749, + "op": "NOT", + "gas": 2073535, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x44", + "0x1f" + ] + }, + { + "pc": 1750, + "op": "PUSH1", + "gas": 2073532, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x44", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0" + ] + }, + { + "pc": 1752, + "op": "RETURNDATASIZE", + "gas": 2073529, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x44", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0", + "0x3f" + ] + }, + { + "pc": 1753, + "op": "ADD", + "gas": 2073527, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x44", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0", + "0x3f", + "0x44" + ] + }, + { + "pc": 1754, + "op": "AND", + "gas": 2073524, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x44", + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0", + "0x83" + ] + }, + { + "pc": 1755, + "op": "DUP3", + "gas": 2073521, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x44", + "0x80" + ] + }, + { + "pc": 1756, + "op": "ADD", + "gas": 2073518, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x44", + "0x80", + "0xe0" + ] + }, + { + "pc": 1757, + "op": "PUSH1", + "gas": 2073515, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x44", + "0x160" + ] + }, + { + "pc": 1759, + "op": "MSTORE", + "gas": 2073512, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x44", + "0x160", + "0x40" + ] + }, + { + "pc": 1760, + "op": "RETURNDATASIZE", + "gas": 2073509, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x44" + ] + }, + { + "pc": 1761, + "op": "DUP3", + "gas": 2073507, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x44", + "0x44" + ] + }, + { + "pc": 1762, + "op": "MSTORE", + "gas": 2073504, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x44", + "0x44", + "0xe0" + ] + }, + { + "pc": 1763, + "op": "RETURNDATASIZE", + "gas": 2073501, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x44" + ] + }, + { + "pc": 1764, + "op": "PUSH1", + "gas": 2073499, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x44", + "0x44" + ] + }, + { + "pc": 1766, + "op": "PUSH1", + "gas": 2073496, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x44", + "0x44", + "0x0" + ] + }, + { + "pc": 1768, + "op": "DUP5", + "gas": 2073493, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x44", + "0x44", + "0x0", + "0x20" + ] + }, + { + "pc": 1769, + "op": "ADD", + "gas": 2073490, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x44", + "0x44", + "0x0", + "0x20", + "0xe0" + ] + }, + { + "pc": 1770, + "op": "RETURNDATACOPY", + "gas": 2073487, + "gasCost": 12, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x44", + "0x44", + "0x0", + "0x100" + ] + }, + { + "pc": 1771, + "op": "PUSH3", + "gas": 2073475, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x44" + ] + }, + { + "pc": 1775, + "op": "JUMP", + "gas": 2073472, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x44", + "0x6f5" + ] + }, + { + "pc": 1781, + "op": "JUMPDEST", + "gas": 2073464, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x44" + ] + }, + { + "pc": 1782, + "op": "POP", + "gas": 2073463, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x44" + ] + }, + { + "pc": 1783, + "op": "PUSH32", + "gas": 2073461, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0" + ] + }, + { + "pc": 1816, + "op": "PUSH1", + "gas": 2073458, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a" + ] + }, + { + "pc": 1818, + "op": "MLOAD", + "gas": 2073455, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x40" + ] + }, + { + "pc": 1819, + "op": "PUSH3", + "gas": 2073452, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x160" + ] + }, + { + "pc": 1823, + "op": "SWAP1", + "gas": 2073449, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x160", + "0x725" + ] + }, + { + "pc": 1824, + "op": "PUSH3", + "gas": 2073446, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160" + ] + }, + { + "pc": 1828, + "op": "JUMP", + "gas": 2073443, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0xf45" + ] + }, + { + "pc": 3909, + "op": "JUMPDEST", + "gas": 2073435, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160" + ] + }, + { + "pc": 3910, + "op": "PUSH1", + "gas": 2073434, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160" + ] + }, + { + "pc": 3912, + "op": "PUSH1", + "gas": 2073431, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x0" + ] + }, + { + "pc": 3914, + "op": "DUP3", + "gas": 2073428, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x0", + "0x20" + ] + }, + { + "pc": 3915, + "op": "ADD", + "gas": 2073425, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x0", + "0x20", + "0x160" + ] + }, + { + "pc": 3916, + "op": "SWAP1", + "gas": 2073422, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x0", + "0x180" + ] + }, + { + "pc": 3917, + "op": "POP", + "gas": 2073419, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0x0" + ] + }, + { + "pc": 3918, + "op": "DUP2", + "gas": 2073417, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180" + ] + }, + { + "pc": 3919, + "op": "DUP2", + "gas": 2073414, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0x160" + ] + }, + { + "pc": 3920, + "op": "SUB", + "gas": 2073411, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0x160", + "0x180" + ] + }, + { + "pc": 3921, + "op": "PUSH1", + "gas": 2073408, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0x20" + ] + }, + { + "pc": 3923, + "op": "DUP4", + "gas": 2073405, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0x20", + "0x0" + ] + }, + { + "pc": 3924, + "op": "ADD", + "gas": 2073402, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0x20", + "0x0", + "0x160" + ] + }, + { + "pc": 3925, + "op": "MSTORE", + "gas": 2073399, + "gasCost": 6, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0x20", + "0x160" + ] + }, + { + "pc": 3926, + "op": "PUSH3", + "gas": 2073393, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180" + ] + }, + { + "pc": 3930, + "op": "DUP2", + "gas": 2073390, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60" + ] + }, + { + "pc": 3931, + "op": "PUSH3", + "gas": 2073387, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x180" + ] + }, + { + "pc": 3935, + "op": "JUMP", + "gas": 2073384, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x180", + "0xf1e" + ] + }, + { + "pc": 3870, + "op": "JUMPDEST", + "gas": 2073376, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x180" + ] + }, + { + "pc": 3871, + "op": "PUSH1", + "gas": 2073375, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x180" + ] + }, + { + "pc": 3873, + "op": "PUSH3", + "gas": 2073372, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x180", + "0x0" + ] + }, + { + "pc": 3877, + "op": "PUSH1", + "gas": 2073369, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x180", + "0x0", + "0xf2d" + ] + }, + { + "pc": 3879, + "op": "DUP4", + "gas": 2073366, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x180", + "0x0", + "0xf2d", + "0x2d" + ] + }, + { + "pc": 3880, + "op": "PUSH3", + "gas": 2073363, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x180", + "0x0", + "0xf2d", + "0x2d", + "0x180" + ] + }, + { + "pc": 3884, + "op": "JUMP", + "gas": 2073360, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x180", + "0x0", + "0xf2d", + "0x2d", + "0x180", + "0xaf5" + ] + }, + { + "pc": 2805, + "op": "JUMPDEST", + "gas": 2073352, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x180", + "0x0", + "0xf2d", + "0x2d", + "0x180" + ] + }, + { + "pc": 2806, + "op": "PUSH1", + "gas": 2073351, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x180", + "0x0", + "0xf2d", + "0x2d", + "0x180" + ] + }, + { + "pc": 2808, + "op": "DUP3", + "gas": 2073348, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x180", + "0x0", + "0xf2d", + "0x2d", + "0x180", + "0x0" + ] + }, + { + "pc": 2809, + "op": "DUP3", + "gas": 2073345, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x180", + "0x0", + "0xf2d", + "0x2d", + "0x180", + "0x0", + "0x2d" + ] + }, + { + "pc": 2810, + "op": "MSTORE", + "gas": 2073342, + "gasCost": 6, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x180", + "0x0", + "0xf2d", + "0x2d", + "0x180", + "0x0", + "0x2d", + "0x180" + ] + }, + { + "pc": 2811, + "op": "PUSH1", + "gas": 2073336, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x180", + "0x0", + "0xf2d", + "0x2d", + "0x180", + "0x0" + ] + }, + { + "pc": 2813, + "op": "DUP3", + "gas": 2073333, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x180", + "0x0", + "0xf2d", + "0x2d", + "0x180", + "0x0", + "0x20" + ] + }, + { + "pc": 2814, + "op": "ADD", + "gas": 2073330, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x180", + "0x0", + "0xf2d", + "0x2d", + "0x180", + "0x0", + "0x20", + "0x180" + ] + }, + { + "pc": 2815, + "op": "SWAP1", + "gas": 2073327, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x180", + "0x0", + "0xf2d", + "0x2d", + "0x180", + "0x0", + "0x1a0" + ] + }, + { + "pc": 2816, + "op": "POP", + "gas": 2073324, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x180", + "0x0", + "0xf2d", + "0x2d", + "0x180", + "0x1a0", + "0x0" + ] + }, + { + "pc": 2817, + "op": "SWAP3", + "gas": 2073322, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x180", + "0x0", + "0xf2d", + "0x2d", + "0x180", + "0x1a0" + ] + }, + { + "pc": 2818, + "op": "SWAP2", + "gas": 2073319, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x180", + "0x0", + "0x1a0", + "0x2d", + "0x180", + "0xf2d" + ] + }, + { + "pc": 2819, + "op": "POP", + "gas": 2073316, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x180", + "0x0", + "0x1a0", + "0xf2d", + "0x180", + "0x2d" + ] + }, + { + "pc": 2820, + "op": "POP", + "gas": 2073314, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x180", + "0x0", + "0x1a0", + "0xf2d", + "0x180" + ] + }, + { + "pc": 2821, + "op": "JUMP", + "gas": 2073312, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x180", + "0x0", + "0x1a0", + "0xf2d" + ] + }, + { + "pc": 3885, + "op": "JUMPDEST", + "gas": 2073304, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x180", + "0x0", + "0x1a0" + ] + }, + { + "pc": 3886, + "op": "SWAP2", + "gas": 2073303, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x180", + "0x0", + "0x1a0" + ] + }, + { + "pc": 3887, + "op": "POP", + "gas": 2073300, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x1a0", + "0x0", + "0x180" + ] + }, + { + "pc": 3888, + "op": "PUSH3", + "gas": 2073298, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x1a0", + "0x0" + ] + }, + { + "pc": 3892, + "op": "DUP3", + "gas": 2073295, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x1a0", + "0x0", + "0xf3a" + ] + }, + { + "pc": 3893, + "op": "PUSH3", + "gas": 2073292, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x1a0", + "0x0", + "0xf3a", + "0x1a0" + ] + }, + { + "pc": 3897, + "op": "JUMP", + "gas": 2073289, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x1a0", + "0x0", + "0xf3a", + "0x1a0", + "0xecf" + ] + }, + { + "pc": 3791, + "op": "JUMPDEST", + "gas": 2073281, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x1a0", + "0x0", + "0xf3a", + "0x1a0" + ] + }, + { + "pc": 3792, + "op": "PUSH32", + "gas": 2073280, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x1a0", + "0x0", + "0xf3a", + "0x1a0" + ] + }, + { + "pc": 3825, + "op": "PUSH1", + "gas": 2073277, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x1a0", + "0x0", + "0xf3a", + "0x1a0", + "0x45787465726e616c2063616c6c206661696c656420776974686f757420616e20" + ] + }, + { + "pc": 3827, + "op": "DUP3", + "gas": 2073274, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x1a0", + "0x0", + "0xf3a", + "0x1a0", + "0x45787465726e616c2063616c6c206661696c656420776974686f757420616e20", + "0x0" + ] + }, + { + "pc": 3828, + "op": "ADD", + "gas": 2073271, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x1a0", + "0x0", + "0xf3a", + "0x1a0", + "0x45787465726e616c2063616c6c206661696c656420776974686f757420616e20", + "0x0", + "0x1a0" + ] + }, + { + "pc": 3829, + "op": "MSTORE", + "gas": 2073268, + "gasCost": 6, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x1a0", + "0x0", + "0xf3a", + "0x1a0", + "0x45787465726e616c2063616c6c206661696c656420776974686f757420616e20", + "0x1a0" + ] + }, + { + "pc": 3830, + "op": "PUSH32", + "gas": 2073262, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x1a0", + "0x0", + "0xf3a", + "0x1a0" + ] + }, + { + "pc": 3863, + "op": "PUSH1", + "gas": 2073259, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x1a0", + "0x0", + "0xf3a", + "0x1a0", + "0x6572726f72206d65737361676500000000000000000000000000000000000000" + ] + }, + { + "pc": 3865, + "op": "DUP3", + "gas": 2073256, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x1a0", + "0x0", + "0xf3a", + "0x1a0", + "0x6572726f72206d65737361676500000000000000000000000000000000000000", + "0x20" + ] + }, + { + "pc": 3866, + "op": "ADD", + "gas": 2073253, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x1a0", + "0x0", + "0xf3a", + "0x1a0", + "0x6572726f72206d65737361676500000000000000000000000000000000000000", + "0x20", + "0x1a0" + ] + }, + { + "pc": 3867, + "op": "MSTORE", + "gas": 2073250, + "gasCost": 6, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x1a0", + "0x0", + "0xf3a", + "0x1a0", + "0x6572726f72206d65737361676500000000000000000000000000000000000000", + "0x1c0" + ] + }, + { + "pc": 3868, + "op": "POP", + "gas": 2073244, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x1a0", + "0x0", + "0xf3a", + "0x1a0" + ] + }, + { + "pc": 3869, + "op": "JUMP", + "gas": 2073242, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x1a0", + "0x0", + "0xf3a" + ] + }, + { + "pc": 3898, + "op": "JUMPDEST", + "gas": 2073234, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x1a0", + "0x0" + ] + }, + { + "pc": 3899, + "op": "PUSH1", + "gas": 2073233, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x1a0", + "0x0" + ] + }, + { + "pc": 3901, + "op": "DUP3", + "gas": 2073230, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x1a0", + "0x0", + "0x40" + ] + }, + { + "pc": 3902, + "op": "ADD", + "gas": 2073227, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x1a0", + "0x0", + "0x40", + "0x1a0" + ] + }, + { + "pc": 3903, + "op": "SWAP1", + "gas": 2073224, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x1a0", + "0x0", + "0x1e0" + ] + }, + { + "pc": 3904, + "op": "POP", + "gas": 2073221, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x1a0", + "0x1e0", + "0x0" + ] + }, + { + "pc": 3905, + "op": "SWAP2", + "gas": 2073219, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0xf60", + "0x1a0", + "0x1e0" + ] + }, + { + "pc": 3906, + "op": "SWAP1", + "gas": 2073216, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0x1e0", + "0x1a0", + "0xf60" + ] + }, + { + "pc": 3907, + "op": "POP", + "gas": 2073213, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0x1e0", + "0xf60", + "0x1a0" + ] + }, + { + "pc": 3908, + "op": "JUMP", + "gas": 2073211, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0x1e0", + "0xf60" + ] + }, + { + "pc": 3936, + "op": "JUMPDEST", + "gas": 2073203, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0x1e0" + ] + }, + { + "pc": 3937, + "op": "SWAP1", + "gas": 2073202, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x180", + "0x1e0" + ] + }, + { + "pc": 3938, + "op": "POP", + "gas": 2073199, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x1e0", + "0x180" + ] + }, + { + "pc": 3939, + "op": "SWAP2", + "gas": 2073197, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x725", + "0x160", + "0x1e0" + ] + }, + { + "pc": 3940, + "op": "SWAP1", + "gas": 2073194, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x1e0", + "0x160", + "0x725" + ] + }, + { + "pc": 3941, + "op": "POP", + "gas": 2073191, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x1e0", + "0x725", + "0x160" + ] + }, + { + "pc": 3942, + "op": "JUMP", + "gas": 2073189, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x1e0", + "0x725" + ] + }, + { + "pc": 1829, + "op": "JUMPDEST", + "gas": 2073181, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x1e0" + ] + }, + { + "pc": 1830, + "op": "PUSH1", + "gas": 2073180, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x1e0" + ] + }, + { + "pc": 1832, + "op": "MLOAD", + "gas": 2073177, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x1e0", + "0x40" + ] + }, + { + "pc": 1833, + "op": "DUP1", + "gas": 2073174, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x1e0", + "0x160" + ] + }, + { + "pc": 1834, + "op": "SWAP2", + "gas": 2073171, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x1e0", + "0x160", + "0x160" + ] + }, + { + "pc": 1835, + "op": "SUB", + "gas": 2073168, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x160", + "0x160", + "0x1e0" + ] + }, + { + "pc": 1836, + "op": "SWAP1", + "gas": 2073165, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x160", + "0x80" + ] + }, + { + "pc": 1837, + "op": "LOG1", + "gas": 2073162, + "gasCost": 1774, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0", + "0x4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a", + "0x80", + "0x160" + ] + }, + { + "pc": 1838, + "op": "POP", + "gas": 2071388, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0xe0" + ] + }, + { + "pc": 1839, + "op": "JUMPDEST", + "gas": 2071386, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0" + ] + }, + { + "pc": 1840, + "op": "PUSH3", + "gas": 2071385, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0" + ] + }, + { + "pc": 1844, + "op": "JUMP", + "gas": 2071382, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x736" + ] + }, + { + "pc": 1846, + "op": "JUMPDEST", + "gas": 2071374, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0" + ] + }, + { + "pc": 1847, + "op": "PUSH1", + "gas": 2071373, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0" + ] + }, + { + "pc": 1849, + "op": "PUSH3", + "gas": 2071370, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x0" + ] + }, + { + "pc": 1853, + "op": "JUMPI", + "gas": 2071367, + "gasCost": 10, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x0", + "0x77a" + ] + }, + { + "pc": 1854, + "op": "PUSH1", + "gas": 2071357, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0" + ] + }, + { + "pc": 1856, + "op": "MLOAD", + "gas": 2071354, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x40" + ] + }, + { + "pc": 1857, + "op": "PUSH32", + "gas": 2071351, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x160" + ] + }, + { + "pc": 1890, + "op": "DUP2", + "gas": 2071348, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x160", + "0x8c379a000000000000000000000000000000000000000000000000000000000" + ] + }, + { + "pc": 1891, + "op": "MSTORE", + "gas": 2071345, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x160", + "0x8c379a000000000000000000000000000000000000000000000000000000000", + "0x160" + ] + }, + { + "pc": 1892, + "op": "PUSH1", + "gas": 2071342, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x160" + ] + }, + { + "pc": 1894, + "op": "ADD", + "gas": 2071339, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x160", + "0x4" + ] + }, + { + "pc": 1895, + "op": "PUSH3", + "gas": 2071336, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x164" + ] + }, + { + "pc": 1899, + "op": "SWAP1", + "gas": 2071333, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x164", + "0x771" + ] + }, + { + "pc": 1900, + "op": "PUSH3", + "gas": 2071330, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164" + ] + }, + { + "pc": 1904, + "op": "JUMP", + "gas": 2071327, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0xfb7" + ] + }, + { + "pc": 4023, + "op": "JUMPDEST", + "gas": 2071319, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164" + ] + }, + { + "pc": 4024, + "op": "PUSH1", + "gas": 2071318, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164" + ] + }, + { + "pc": 4026, + "op": "PUSH1", + "gas": 2071315, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x0" + ] + }, + { + "pc": 4028, + "op": "DUP3", + "gas": 2071312, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x0", + "0x20" + ] + }, + { + "pc": 4029, + "op": "ADD", + "gas": 2071309, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x0", + "0x20", + "0x164" + ] + }, + { + "pc": 4030, + "op": "SWAP1", + "gas": 2071306, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x0", + "0x184" + ] + }, + { + "pc": 4031, + "op": "POP", + "gas": 2071303, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0x0" + ] + }, + { + "pc": 4032, + "op": "DUP2", + "gas": 2071301, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184" + ] + }, + { + "pc": 4033, + "op": "DUP2", + "gas": 2071298, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0x164" + ] + }, + { + "pc": 4034, + "op": "SUB", + "gas": 2071295, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0x164", + "0x184" + ] + }, + { + "pc": 4035, + "op": "PUSH1", + "gas": 2071292, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0x20" + ] + }, + { + "pc": 4037, + "op": "DUP4", + "gas": 2071289, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0x20", + "0x0" + ] + }, + { + "pc": 4038, + "op": "ADD", + "gas": 2071286, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0x20", + "0x0", + "0x164" + ] + }, + { + "pc": 4039, + "op": "MSTORE", + "gas": 2071283, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0x20", + "0x164" + ] + }, + { + "pc": 4040, + "op": "PUSH3", + "gas": 2071280, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184" + ] + }, + { + "pc": 4044, + "op": "DUP2", + "gas": 2071277, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2" + ] + }, + { + "pc": 4045, + "op": "PUSH3", + "gas": 2071274, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x184" + ] + }, + { + "pc": 4049, + "op": "JUMP", + "gas": 2071271, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x184", + "0xf90" + ] + }, + { + "pc": 3984, + "op": "JUMPDEST", + "gas": 2071263, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x184" + ] + }, + { + "pc": 3985, + "op": "PUSH1", + "gas": 2071262, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x184" + ] + }, + { + "pc": 3987, + "op": "PUSH3", + "gas": 2071259, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x184", + "0x0" + ] + }, + { + "pc": 3991, + "op": "PUSH1", + "gas": 2071256, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x184", + "0x0", + "0xf9f" + ] + }, + { + "pc": 3993, + "op": "DUP4", + "gas": 2071253, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x184", + "0x0", + "0xf9f", + "0x14" + ] + }, + { + "pc": 3994, + "op": "PUSH3", + "gas": 2071250, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x184", + "0x0", + "0xf9f", + "0x14", + "0x184" + ] + }, + { + "pc": 3998, + "op": "JUMP", + "gas": 2071247, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x184", + "0x0", + "0xf9f", + "0x14", + "0x184", + "0xaf5" + ] + }, + { + "pc": 2805, + "op": "JUMPDEST", + "gas": 2071239, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x184", + "0x0", + "0xf9f", + "0x14", + "0x184" + ] + }, + { + "pc": 2806, + "op": "PUSH1", + "gas": 2071238, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x184", + "0x0", + "0xf9f", + "0x14", + "0x184" + ] + }, + { + "pc": 2808, + "op": "DUP3", + "gas": 2071235, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x184", + "0x0", + "0xf9f", + "0x14", + "0x184", + "0x0" + ] + }, + { + "pc": 2809, + "op": "DUP3", + "gas": 2071232, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x184", + "0x0", + "0xf9f", + "0x14", + "0x184", + "0x0", + "0x14" + ] + }, + { + "pc": 2810, + "op": "MSTORE", + "gas": 2071229, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x184", + "0x0", + "0xf9f", + "0x14", + "0x184", + "0x0", + "0x14", + "0x184" + ] + }, + { + "pc": 2811, + "op": "PUSH1", + "gas": 2071226, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x184", + "0x0", + "0xf9f", + "0x14", + "0x184", + "0x0" + ] + }, + { + "pc": 2813, + "op": "DUP3", + "gas": 2071223, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x184", + "0x0", + "0xf9f", + "0x14", + "0x184", + "0x0", + "0x20" + ] + }, + { + "pc": 2814, + "op": "ADD", + "gas": 2071220, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x184", + "0x0", + "0xf9f", + "0x14", + "0x184", + "0x0", + "0x20", + "0x184" + ] + }, + { + "pc": 2815, + "op": "SWAP1", + "gas": 2071217, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x184", + "0x0", + "0xf9f", + "0x14", + "0x184", + "0x0", + "0x1a4" + ] + }, + { + "pc": 2816, + "op": "POP", + "gas": 2071214, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x184", + "0x0", + "0xf9f", + "0x14", + "0x184", + "0x1a4", + "0x0" + ] + }, + { + "pc": 2817, + "op": "SWAP3", + "gas": 2071212, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x184", + "0x0", + "0xf9f", + "0x14", + "0x184", + "0x1a4" + ] + }, + { + "pc": 2818, + "op": "SWAP2", + "gas": 2071209, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x184", + "0x0", + "0x1a4", + "0x14", + "0x184", + "0xf9f" + ] + }, + { + "pc": 2819, + "op": "POP", + "gas": 2071206, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x184", + "0x0", + "0x1a4", + "0xf9f", + "0x184", + "0x14" + ] + }, + { + "pc": 2820, + "op": "POP", + "gas": 2071204, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x184", + "0x0", + "0x1a4", + "0xf9f", + "0x184" + ] + }, + { + "pc": 2821, + "op": "JUMP", + "gas": 2071202, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x184", + "0x0", + "0x1a4", + "0xf9f" + ] + }, + { + "pc": 3999, + "op": "JUMPDEST", + "gas": 2071194, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x184", + "0x0", + "0x1a4" + ] + }, + { + "pc": 4000, + "op": "SWAP2", + "gas": 2071193, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x184", + "0x0", + "0x1a4" + ] + }, + { + "pc": 4001, + "op": "POP", + "gas": 2071190, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x1a4", + "0x0", + "0x184" + ] + }, + { + "pc": 4002, + "op": "PUSH3", + "gas": 2071188, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x1a4", + "0x0" + ] + }, + { + "pc": 4006, + "op": "DUP3", + "gas": 2071185, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x1a4", + "0x0", + "0xfac" + ] + }, + { + "pc": 4007, + "op": "PUSH3", + "gas": 2071182, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x1a4", + "0x0", + "0xfac", + "0x1a4" + ] + }, + { + "pc": 4011, + "op": "JUMP", + "gas": 2071179, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x1a4", + "0x0", + "0xfac", + "0x1a4", + "0xf67" + ] + }, + { + "pc": 3943, + "op": "JUMPDEST", + "gas": 2071171, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x1a4", + "0x0", + "0xfac", + "0x1a4" + ] + }, + { + "pc": 3944, + "op": "PUSH32", + "gas": 2071170, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x1a4", + "0x0", + "0xfac", + "0x1a4" + ] + }, + { + "pc": 3977, + "op": "PUSH1", + "gas": 2071167, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x1a4", + "0x0", + "0xfac", + "0x1a4", + "0x494e53554646494349454e542042414c414e4345000000000000000000000000" + ] + }, + { + "pc": 3979, + "op": "DUP3", + "gas": 2071164, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x1a4", + "0x0", + "0xfac", + "0x1a4", + "0x494e53554646494349454e542042414c414e4345000000000000000000000000", + "0x0" + ] + }, + { + "pc": 3980, + "op": "ADD", + "gas": 2071161, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x1a4", + "0x0", + "0xfac", + "0x1a4", + "0x494e53554646494349454e542042414c414e4345000000000000000000000000", + "0x0", + "0x1a4" + ] + }, + { + "pc": 3981, + "op": "MSTORE", + "gas": 2071158, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x1a4", + "0x0", + "0xfac", + "0x1a4", + "0x494e53554646494349454e542042414c414e4345000000000000000000000000", + "0x1a4" + ] + }, + { + "pc": 3982, + "op": "POP", + "gas": 2071155, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x1a4", + "0x0", + "0xfac", + "0x1a4" + ] + }, + { + "pc": 3983, + "op": "JUMP", + "gas": 2071153, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x1a4", + "0x0", + "0xfac" + ] + }, + { + "pc": 4012, + "op": "JUMPDEST", + "gas": 2071145, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x1a4", + "0x0" + ] + }, + { + "pc": 4013, + "op": "PUSH1", + "gas": 2071144, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x1a4", + "0x0" + ] + }, + { + "pc": 4015, + "op": "DUP3", + "gas": 2071141, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x1a4", + "0x0", + "0x20" + ] + }, + { + "pc": 4016, + "op": "ADD", + "gas": 2071138, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x1a4", + "0x0", + "0x20", + "0x1a4" + ] + }, + { + "pc": 4017, + "op": "SWAP1", + "gas": 2071135, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x1a4", + "0x0", + "0x1c4" + ] + }, + { + "pc": 4018, + "op": "POP", + "gas": 2071132, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x1a4", + "0x1c4", + "0x0" + ] + }, + { + "pc": 4019, + "op": "SWAP2", + "gas": 2071130, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0xfd2", + "0x1a4", + "0x1c4" + ] + }, + { + "pc": 4020, + "op": "SWAP1", + "gas": 2071127, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0x1c4", + "0x1a4", + "0xfd2" + ] + }, + { + "pc": 4021, + "op": "POP", + "gas": 2071124, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0x1c4", + "0xfd2", + "0x1a4" + ] + }, + { + "pc": 4022, + "op": "JUMP", + "gas": 2071122, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0x1c4", + "0xfd2" + ] + }, + { + "pc": 4050, + "op": "JUMPDEST", + "gas": 2071114, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0x1c4" + ] + }, + { + "pc": 4051, + "op": "SWAP1", + "gas": 2071113, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x184", + "0x1c4" + ] + }, + { + "pc": 4052, + "op": "POP", + "gas": 2071110, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x1c4", + "0x184" + ] + }, + { + "pc": 4053, + "op": "SWAP2", + "gas": 2071108, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x771", + "0x164", + "0x1c4" + ] + }, + { + "pc": 4054, + "op": "SWAP1", + "gas": 2071105, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x1c4", + "0x164", + "0x771" + ] + }, + { + "pc": 4055, + "op": "POP", + "gas": 2071102, + "gasCost": 2, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x1c4", + "0x771", + "0x164" + ] + }, + { + "pc": 4056, + "op": "JUMP", + "gas": 2071100, + "gasCost": 8, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x1c4", + "0x771" + ] + }, + { + "pc": 1905, + "op": "JUMPDEST", + "gas": 2071092, + "gasCost": 1, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x1c4" + ] + }, + { + "pc": 1906, + "op": "PUSH1", + "gas": 2071091, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x1c4" + ] + }, + { + "pc": 1908, + "op": "MLOAD", + "gas": 2071088, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x1c4", + "0x40" + ] + }, + { + "pc": 1909, + "op": "DUP1", + "gas": 2071085, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x1c4", + "0x160" + ] + }, + { + "pc": 1910, + "op": "SWAP2", + "gas": 2071082, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x1c4", + "0x160", + "0x160" + ] + }, + { + "pc": 1911, + "op": "SUB", + "gas": 2071079, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x160", + "0x160", + "0x1c4" + ] + }, + { + "pc": 1912, + "op": "SWAP1", + "gas": 2071076, + "gasCost": 3, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x160", + "0x64" + ] + }, + { + "pc": 1913, + "op": "REVERT", + "gas": 2071073, + "gasCost": 0, + "depth": 1, + "stack": [ + "0x7f29c394", + "0x17f", + "0x3e8", + "0x0", + "0x64", + "0x160" + ] + } + ] +} \ No newline at end of file diff --git a/test/historicstate/hardhat/scripts/geth_traces/Tracer.readableRevert.prestateDiffTracer.json b/test/historicstate/hardhat/scripts/geth_traces/Tracer.readableRevert.prestateDiffTracer.json new file mode 100644 index 000000000..adb54205d --- /dev/null +++ b/test/historicstate/hardhat/scripts/geth_traces/Tracer.readableRevert.prestateDiffTracer.json @@ -0,0 +1,20 @@ +{ + "post": { + "0x0000000000000000000000000000000000000000": { + "balance": "0x1bf279a" + }, + "OWNER.address": { + "balance": "0x360ee5cfde418e129e", + "nonce": 84 + } + }, + "pre": { + "0x0000000000000000000000000000000000000000": { + "balance": "0x1beb69b" + }, + "OWNER.address": { + "balance": "0x360ee5cfde69ec5c29", + "nonce": 83 + } + } +} \ No newline at end of file diff --git a/test/historicstate/hardhat/scripts/geth_traces/Tracer.readableRevert.prestateTracer.json b/test/historicstate/hardhat/scripts/geth_traces/Tracer.readableRevert.prestateTracer.json new file mode 100644 index 000000000..dac71a96a --- /dev/null +++ b/test/historicstate/hardhat/scripts/geth_traces/Tracer.readableRevert.prestateTracer.json @@ -0,0 +1,14 @@ +{ + "0x0000000000000000000000000000000000000000": { + "balance": "0x1beb69b" + }, + "OWNER.address": { + "balance": "0x360ee5cfde69ec5c29", + "nonce": 83 + }, + "Tracer.address": { + "balance": "0x0", + "code": "0x60806040523480156200001157600080fd5b5060043610620000ac5760003560e01c80638bfe44ff116200006f5780638bfe44ff14620001975780639295436214620001a3578063a0712d6814620001af578063b69ef8a814620001e5578063c9353cb5146200020757620000ac565b806312065fe014620000b15780631c71706914620000d35780631c93908c14620000f55780633aa18088146200012b5780637f29c3941462000161575b600080fd5b620000bb62000227565b604051620000ca919062000997565b60405180910390f35b620000dd62000231565b604051620000ec9190620009cf565b60405180910390f35b6200011360048036038101906200010d919062000a2c565b62000280565b60405162000122919062000997565b60405180910390f35b62000149600480360381019062000143919062000a2c565b620002f6565b60405162000158919062000997565b60405180910390f35b6200017f600480360381019062000179919062000a2c565b620004ae565b6040516200018e919062000997565b60405180910390f35b620001a162000783565b005b620001ad620007c5565b005b620001cd6004803603810190620001c7919062000a2c565b62000802565b604051620001dc919062000997565b60405180910390f35b620001ef6200094f565b604051620001fe919062000997565b60405180910390f35b6200022560048036038101906200021f919062000ac3565b62000955565b005b6000600154905090565b6000806040518060400160405280600d81526020017f48656c6c6f2c20776f726c6421000000000000000000000000000000000000008152509050600081805190602001209050809250505090565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac083604051620002ca919062000b56565b60405180910390a28160036000828254620002e6919062000bb7565b9250508190555060029050919050565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac08360405162000340919062000c64565b60405180910390a260405162000356906200096e565b604051809103906000f08015801562000373573d6000803e3d6000fd5b506000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160016000828254620003c7919062000bb7565b92505081905550620003e7600183620003e1919062000bb7565b62000280565b50620003f262000231565b5060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b81526004016200044e919062000997565b602060405180830381600087803b1580156200046957600080fd5b505af11580156200047e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004a4919062000cad565b5060019050919050565b60003073ffffffffffffffffffffffffffffffffffffffff1663929543626040518163ffffffff1660e01b815260040160006040518083038186803b158015620004f757600080fd5b505afa92505050801562000509575060015b620005f2576200051862000cec565b806308c379a014156200057d57506200053062000d87565b806200053d57506200057f565b7f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a816040516200056e919062000eab565b60405180910390a150620005ec565b505b3d8060008114620005ad576040519150601f19603f3d011682016040523d82523d6000602084013e620005b2565b606091505b507f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a604051620005e29062000f45565b60405180910390a1505b620005f3565b5b3073ffffffffffffffffffffffffffffffffffffffff16638bfe44ff6040518163ffffffff1660e01b815260040160006040518083038186803b1580156200063a57600080fd5b505afa9250505080156200064c575060015b62000735576200065b62000cec565b806308c379a01415620006c057506200067362000d87565b80620006805750620006c2565b7f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a81604051620006b1919062000eab565b60405180910390a1506200072f565b505b3d8060008114620006f0576040519150601f19603f3d011682016040523d82523d6000602084013e620006f5565b606091505b507f4f17d5cf0427b4fe5e5649c407d3021315cfaa7216c9e58c369ef3937c40801a604051620007259062000f45565b60405180910390a1505b62000736565b5b60006200077a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007719062000fb7565b60405180910390fd5b60019050919050565b6001806040517fcf479181000000000000000000000000000000000000000000000000000000008152600401620007bc92919062001026565b60405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007f990620010a3565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0836040516200084c919062000c64565b60405180910390a2816001600082825462000868919062000bb7565b925050819055506200088860018362000882919062000bb7565b62000280565b506200089362000231565b5060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b8152600401620008ef919062000997565b602060405180830381600087803b1580156200090a57600080fd5b505af11580156200091f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000945919062000cad565b5060019050919050565b60015481565b8073ffffffffffffffffffffffffffffffffffffffff16ff5b610ae380620010c683390190565b6000819050919050565b62000991816200097c565b82525050565b6000602082019050620009ae600083018462000986565b92915050565b6000819050919050565b620009c981620009b4565b82525050565b6000602082019050620009e66000830184620009be565b92915050565b6000604051905090565b600080fd5b62000a06816200097c565b811462000a1257600080fd5b50565b60008135905062000a2681620009fb565b92915050565b60006020828403121562000a455762000a44620009f6565b5b600062000a558482850162000a15565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000a8b8262000a5e565b9050919050565b62000a9d8162000a7e565b811462000aa957600080fd5b50565b60008135905062000abd8162000a92565b92915050565b60006020828403121562000adc5762000adb620009f6565b5b600062000aec8482850162000aac565b91505092915050565b600082825260208201905092915050565b7f696e7465726e616c20746f706963000000000000000000000000000000000000600082015250565b600062000b3e600e8362000af5565b915062000b4b8262000b06565b602082019050919050565b600060408201905062000b6d600083018462000986565b818103602083015262000b808162000b2f565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000bc4826200097c565b915062000bd1836200097c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000c095762000c0862000b88565b5b828201905092915050565b7f746f706963000000000000000000000000000000000000000000000000000000600082015250565b600062000c4c60058362000af5565b915062000c598262000c14565b602082019050919050565b600060408201905062000c7b600083018462000986565b818103602083015262000c8e8162000c3d565b905092915050565b60008151905062000ca781620009fb565b92915050565b60006020828403121562000cc65762000cc5620009f6565b5b600062000cd68482850162000c96565b91505092915050565b60008160e01c9050919050565b600060033d111562000d0e5760046000803e62000d0b60005162000cdf565b90505b90565b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000d5c8262000d11565b810181811067ffffffffffffffff8211171562000d7e5762000d7d62000d22565b5b80604052505050565b600060443d101562000d995762000e26565b62000da3620009ec565b60043d036004823e80513d602482011167ffffffffffffffff8211171562000dcd57505062000e26565b808201805167ffffffffffffffff81111562000ded575050505062000e26565b80602083010160043d03850181111562000e0c57505050505062000e26565b62000e1d8260200185018662000d51565b82955050505050505b90565b600081519050919050565b60005b8381101562000e5457808201518184015260208101905062000e37565b8381111562000e64576000848401525b50505050565b600062000e778262000e29565b62000e83818562000af5565b935062000e9581856020860162000e34565b62000ea08162000d11565b840191505092915050565b6000602082019050818103600083015262000ec7818462000e6a565b905092915050565b7f45787465726e616c2063616c6c206661696c656420776974686f757420616e2060008201527f6572726f72206d65737361676500000000000000000000000000000000000000602082015250565b600062000f2d602d8362000af5565b915062000f3a8262000ecf565b604082019050919050565b6000602082019050818103600083015262000f608162000f1e565b9050919050565b7f494e53554646494349454e542042414c414e4345000000000000000000000000600082015250565b600062000f9f60148362000af5565b915062000fac8262000f67565b602082019050919050565b6000602082019050818103600083015262000fd28162000f90565b9050919050565b6000819050919050565b6000819050919050565b60006200100e62001008620010028462000fd9565b62000fe3565b6200097c565b9050919050565b620010208162000fed565b82525050565b60006040820190506200103d600083018562001015565b6200104c602083018462001015565b9392505050565b7f546869732066756e6374696f6e20726576657274656421000000000000000000600082015250565b60006200108b60178362000af5565b9150620010988262001053565b602082019050919050565b60006020820190508181036000830152620010be816200107c565b905091905056fe60806040526000600160006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b50600160009054906101000a900460ff161562000080576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200007790620002b5565b60405180910390fd5b60018060006101000a81548160ff021916908315150217905550620000bc701d6329f1c35ca4bfabb9f5610000000000620000c360201b60201c565b5062000482565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0836040516200010d919062000342565b60405180910390a281600080828254620001289190620003a3565b925050819055506200014e600183620001429190620003a3565b6200016960201b60201c565b506200015f620001df60201b60201c565b5060019050919050565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac083604051620001b3919062000450565b60405180910390a28160026000828254620001cf9190620003a3565b9250508190555060029050919050565b6000806040518060400160405280600d81526020017f48656c6c6f2c20776f726c6421000000000000000000000000000000000000008152509050600081805190602001209050809250505090565b600082825260208201905092915050565b7f436f6e747261637420696e7374616e63652068617320616c726561647920626560008201527f656e20696e697469616c697a6564000000000000000000000000000000000000602082015250565b60006200029d602e836200022e565b9150620002aa826200023f565b604082019050919050565b60006020820190508181036000830152620002d0816200028e565b9050919050565b6000819050919050565b620002ec81620002d7565b82525050565b7f746f706963000000000000000000000000000000000000000000000000000000600082015250565b60006200032a6005836200022e565b91506200033782620002f2565b602082019050919050565b6000604082019050620003596000830184620002e1565b81810360208301526200036c816200031b565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620003b082620002d7565b9150620003bd83620002d7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620003f557620003f462000374565b5b828201905092915050565b7f696e7465726e616c20746f706963000000000000000000000000000000000000600082015250565b600062000438600e836200022e565b9150620004458262000400565b602082019050919050565b6000604082019050620004676000830184620002e1565b81810360208301526200047a8162000429565b905092915050565b61065180620004926000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c80631c717069146100675780631c93908c1461008557806392954362146100b5578063a0712d68146100bf578063b69ef8a8146100ef578063c9353cb51461010d575b600080fd5b61006f610129565b60405161007c91906102ed565b60405180910390f35b61009f600480360381019061009a9190610343565b610178565b6040516100ac919061037f565b60405180910390f35b6100bd6101ea565b005b6100d960048036038101906100d49190610343565b610225565b6040516100e6919061037f565b60405180910390f35b6100f76102b5565b604051610104919061037f565b60405180910390f35b610127600480360381019061012291906103f8565b6102bb565b005b6000806040518060400160405280600d81526020017f48656c6c6f2c20776f726c6421000000000000000000000000000000000000008152509050600081805190602001209050809250505090565b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac0836040516101c09190610482565b60405180910390a281600260008282546101da91906104df565b9250508190555060029050919050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161021c90610581565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff167fa61006ade9739809351a3d196f4b5afea31c2afe4852ee18c72f674514c24ac08360405161026d91906105ed565b60405180910390a28160008082825461028691906104df565b925050819055506102a260018361029d91906104df565b610178565b506102ab610129565b5060019050919050565b60005481565b8073ffffffffffffffffffffffffffffffffffffffff16ff5b6000819050919050565b6102e7816102d4565b82525050565b600060208201905061030260008301846102de565b92915050565b600080fd5b6000819050919050565b6103208161030d565b811461032b57600080fd5b50565b60008135905061033d81610317565b92915050565b60006020828403121561035957610358610308565b5b60006103678482850161032e565b91505092915050565b6103798161030d565b82525050565b60006020820190506103946000830184610370565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103c58261039a565b9050919050565b6103d5816103ba565b81146103e057600080fd5b50565b6000813590506103f2816103cc565b92915050565b60006020828403121561040e5761040d610308565b5b600061041c848285016103e3565b91505092915050565b600082825260208201905092915050565b7f696e7465726e616c20746f706963000000000000000000000000000000000000600082015250565b600061046c600e83610425565b915061047782610436565b602082019050919050565b60006040820190506104976000830184610370565b81810360208301526104a88161045f565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006104ea8261030d565b91506104f58361030d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561052a576105296104b0565b5b828201905092915050565b7f546869732066756e6374696f6e20726576657274656421000000000000000000600082015250565b600061056b601783610425565b915061057682610535565b602082019050919050565b6000602082019050818103600083015261059a8161055e565b9050919050565b7f746f706963000000000000000000000000000000000000000000000000000000600082015250565b60006105d7600583610425565b91506105e2826105a1565b602082019050919050565b60006040820190506106026000830184610370565b8181036020830152610613816105ca565b90509291505056fea26469706673582212208743accab6cfcd1c8ccb3f51b787d679e803a77ce24ec642bd068883132fd5fa64736f6c63430008090033a264697066735822122066241fedca9ebd69f0cd9e4879f75428f5d4bf734eb072e52934a8b3161581f064736f6c63430008090033", + "nonce": 2 + } +} \ No newline at end of file diff --git a/test/historicstate/hardhat/scripts/geth_traces/Tracer.transfer.4byteTracer.json b/test/historicstate/hardhat/scripts/geth_traces/Tracer.transfer.4byteTracer.json new file mode 100644 index 000000000..9e26dfeeb --- /dev/null +++ b/test/historicstate/hardhat/scripts/geth_traces/Tracer.transfer.4byteTracer.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/test/historicstate/hardhat/scripts/geth_traces/Tracer.transfer.callTracer.json b/test/historicstate/hardhat/scripts/geth_traces/Tracer.transfer.callTracer.json new file mode 100644 index 000000000..9212c2d74 --- /dev/null +++ b/test/historicstate/hardhat/scripts/geth_traces/Tracer.transfer.callTracer.json @@ -0,0 +1,9 @@ +{ + "from": "OWNER.address", + "gas": "0x5208", + "gasUsed": "0x5208", + "to": "0x388c818ca8b9251b393131c08a736a67ccb19297", + "input": "0x", + "value": "0x16345785d8a0000", + "type": "CALL" +} \ No newline at end of file diff --git a/test/historicstate/hardhat/scripts/geth_traces/Tracer.transfer.defaultTracer.json b/test/historicstate/hardhat/scripts/geth_traces/Tracer.transfer.defaultTracer.json new file mode 100644 index 000000000..9b0ab9d23 --- /dev/null +++ b/test/historicstate/hardhat/scripts/geth_traces/Tracer.transfer.defaultTracer.json @@ -0,0 +1,6 @@ +{ + "gas": 21000, + "failed": false, + "returnValue": "", + "structLogs": [] +} \ No newline at end of file diff --git a/test/historicstate/hardhat/scripts/geth_traces/Tracer.transfer.prestateDiffTracer.json b/test/historicstate/hardhat/scripts/geth_traces/Tracer.transfer.prestateDiffTracer.json new file mode 100644 index 000000000..ccd88db84 --- /dev/null +++ b/test/historicstate/hardhat/scripts/geth_traces/Tracer.transfer.prestateDiffTracer.json @@ -0,0 +1,26 @@ +{ + "post": { + "0x0000000000000000000000000000000000000000": { + "balance": "0x1b69ad1" + }, + "0x388c818ca8b9251b393131c08a736a67ccb19297": { + "balance": "0x136dcc951d8c0000" + }, + "OWNER.address": { + "balance": "0x360ee5cfe1af4203d1", + "nonce": 82 + } + }, + "pre": { + "0x0000000000000000000000000000000000000000": { + "balance": "0x1b648c9" + }, + "0x388c818ca8b9251b393131c08a736a67ccb19297": { + "balance": "0x120a871cc0020000" + }, + "OWNER.address": { + "balance": "0x361049155a32982d79", + "nonce": 81 + } + } +} \ No newline at end of file diff --git a/test/historicstate/hardhat/scripts/geth_traces/Tracer.transfer.prestateTracer.json b/test/historicstate/hardhat/scripts/geth_traces/Tracer.transfer.prestateTracer.json new file mode 100644 index 000000000..6246a1708 --- /dev/null +++ b/test/historicstate/hardhat/scripts/geth_traces/Tracer.transfer.prestateTracer.json @@ -0,0 +1,12 @@ +{ + "0x0000000000000000000000000000000000000000": { + "balance": "0x1b648c9" + }, + "0x388c818ca8b9251b393131c08a736a67ccb19297": { + "balance": "0x120a871cc0020000" + }, + "OWNER.address": { + "balance": "0x361049155a32982d79", + "nonce": 81 + } +} \ No newline at end of file diff --git a/test/historicstate/hardhat/scripts/trace.ts b/test/historicstate/hardhat/scripts/trace.ts new file mode 100644 index 000000000..d6280a68b --- /dev/null +++ b/test/historicstate/hardhat/scripts/trace.ts @@ -0,0 +1,950 @@ +import {mkdir, readdir, writeFileSync, readFile, unlink} from "fs"; + +const fs = require('fs'); +import {existsSync} from "fs"; +import deepDiff, {diff} from 'deep-diff'; +import {expect} from "chai"; +import * as path from 'path'; +import {int, string} from "hardhat/internal/core/params/argumentTypes"; +import internal from "node:stream"; + +const OWNER_ADDRESS: string = "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6"; +const CALL_ADDRESS: string = "0xCe5c7ca85F8cB94FA284a303348ef42ADD23f5e7"; + +const ZERO_ADDRESS: string = '0x0000000000000000000000000000000000000000'; +const INITIAL_MINT: bigint = 10000000000000000000000000000000000000000n; +const TEST_CONTRACT_NAME = "Tracer"; +const EXECUTE_FUNCTION_NAME = "mint"; +const EXECUTE2_FUNCTION_NAME = "mint2"; +const EXECUTE3_FUNCTION_NAME = "readableRevert"; +const CALL_FUNCTION_NAME = "getBalance"; + +const SKALE_TRACES_DIR = "/tmp/skale_traces/" +const GETH_TRACES_DIR = "scripts/geth_traces/" + +const DEFAULT_TRACER = "defaultTracer"; +const CALL_TRACER = "callTracer"; +const PRESTATE_TRACER = "prestateTracer"; +const PRESTATEDIFF_TRACER = "prestateDiffTracer"; +const FOURBYTE_TRACER = "4byteTracer"; +const REPLAY_TRACER = "replayTracer"; + + +const TEST_DEPLOY_DEFAULTTRACER_FILE_NAME = TEST_CONTRACT_NAME + ".deploy.defaultTracer.json"; +const TEST_DEPLOY_CALLTRACER_FILE_NAME = TEST_CONTRACT_NAME + ".deploy.callTracer.json"; +const TEST_DEPLOY_PRESTATETRACER_FILE_NAME = TEST_CONTRACT_NAME + ".deploy.prestateTracer.json"; +const TEST_DEPLOY_PRESTATEDIFFTRACER_FILE_NAME = TEST_CONTRACT_NAME + ".deploy.prestateDiffTracer.json"; +const TEST_DEPLOY_FOURBYTETRACER_FILE_NAME = TEST_CONTRACT_NAME + ".deploy.4byteTracer.json"; + + +const TEST_CONTRACT_EXECUTE_DEFAULTTRACER_FILE_NAME = TEST_CONTRACT_NAME + "." + EXECUTE_FUNCTION_NAME + ".defaultTracer.json"; +const TEST_CONTRACT_EXECUTE_CALLTRACER_FILE_NAME = TEST_CONTRACT_NAME + "." + EXECUTE_FUNCTION_NAME + ".callTracer.json"; +const TEST_CONTRACT_EXECUTE_PRESTATETRACER_FILE_NAME = TEST_CONTRACT_NAME + "." + EXECUTE_FUNCTION_NAME + ".prestateTracer.json"; +const TEST_CONTRACT_EXECUTE_PRESTATEDIFFTRACER_FILE_NAME = TEST_CONTRACT_NAME + "." + EXECUTE_FUNCTION_NAME + ".prestateDiffTracer.json"; +const TEST_CONTRACT_EXECUTE_FOURBYTETRACER_FILE_NAME = TEST_CONTRACT_NAME + "." + EXECUTE_FUNCTION_NAME + ".4byteTracer.json"; + + +const TEST_CONTRACT_EXECUTE2_DEFAULTTRACER_FILE_NAME = TEST_CONTRACT_NAME + "." + EXECUTE2_FUNCTION_NAME + ".defaultTracer.json"; +const TEST_CONTRACT_EXECUTE2_CALLTRACER_FILE_NAME = TEST_CONTRACT_NAME + "." + EXECUTE2_FUNCTION_NAME + ".callTracer.json"; +const TEST_CONTRACT_EXECUTE2_PRESTATETRACER_FILE_NAME = TEST_CONTRACT_NAME + "." + EXECUTE2_FUNCTION_NAME + ".prestateTracer.json"; +const TEST_CONTRACT_EXECUTE2_PRESTATEDIFFTRACER_FILE_NAME = TEST_CONTRACT_NAME + "." + EXECUTE2_FUNCTION_NAME + ".prestateDiffTracer.json"; +const TEST_CONTRACT_EXECUTE2_FOURBYTETRACER_FILE_NAME = TEST_CONTRACT_NAME + "." + EXECUTE2_FUNCTION_NAME + ".4byteTracer.json"; + +const TEST_CONTRACT_EXECUTE3_DEFAULTTRACER_FILE_NAME = TEST_CONTRACT_NAME + "." + EXECUTE3_FUNCTION_NAME + ".defaultTracer.json"; +const TEST_CONTRACT_EXECUTE3_CALLTRACER_FILE_NAME = TEST_CONTRACT_NAME + "." + EXECUTE3_FUNCTION_NAME + ".callTracer.json"; +const TEST_CONTRACT_EXECUTE3_PRESTATETRACER_FILE_NAME = TEST_CONTRACT_NAME + "." + EXECUTE3_FUNCTION_NAME + ".prestateTracer.json"; +const TEST_CONTRACT_EXECUTE3_PRESTATEDIFFTRACER_FILE_NAME = TEST_CONTRACT_NAME + "." + EXECUTE3_FUNCTION_NAME + ".prestateDiffTracer.json"; +const TEST_CONTRACT_EXECUTE3_FOURBYTETRACER_FILE_NAME = TEST_CONTRACT_NAME + "." + EXECUTE3_FUNCTION_NAME + ".4byteTracer.json"; + + +const TEST_TRANSFER_DEFAULTTRACER_FILE_NAME = TEST_CONTRACT_NAME + ".transfer.defaultTracer.json"; +const TEST_TRANSFER_CALLTRACER_FILE_NAME = TEST_CONTRACT_NAME + ".transfer.callTracer.json"; +const TEST_TRANSFER_PRESTATETRACER_FILE_NAME = TEST_CONTRACT_NAME + ".transfer.prestateTracer.json"; +const TEST_TRANSFER_PRESTATEDIFFTRACER_FILE_NAME = TEST_CONTRACT_NAME + ".transfer.prestateDiffTracer.json"; +const TEST_TRANSFER_FOURBYTETRACER_FILE_NAME = TEST_CONTRACT_NAME + ".transfer.4byteTracer.json"; + + +const TEST_CONTRACT_CALL_DEFAULTTRACER_FILE_NAME = TEST_CONTRACT_NAME + "." + CALL_FUNCTION_NAME + ".defaultTracer.json"; +const TEST_CONTRACT_CALL_CALLTRACER_FILE_NAME = TEST_CONTRACT_NAME + "." + CALL_FUNCTION_NAME + ".callTracer.json"; +const TEST_CONTRACT_CALL_PRESTATETRACER_FILE_NAME = TEST_CONTRACT_NAME + "." + CALL_FUNCTION_NAME + ".prestateTracer.json"; +const TEST_CONTRACT_CALL_PRESTATEDIFFTRACER_FILE_NAME = TEST_CONTRACT_NAME + "." + CALL_FUNCTION_NAME + ".prestateDiffTracer.json"; +const TEST_CONTRACT_CALL_FOURBYTETRACER_FILE_NAME = TEST_CONTRACT_NAME + "." + CALL_FUNCTION_NAME + ".4byteTracer.json"; +const TEST_CONTRACT_CALL_REPLAYTRACER_FILE_NAME = TEST_CONTRACT_NAME + "." + CALL_FUNCTION_NAME + ".replayTracer.json"; + +var DEPLOYED_CONTRACT_ADDRESS_LOWER_CASE: string = ""; +var globalCallCount = 0; + + +async function replaceAddressesWithSymbolicNames(_traceFileName: string) { + + let callAddressLowerCase = CALL_ADDRESS.toLowerCase(); + + await replaceStringInFile(SKALE_TRACES_DIR + _traceFileName, + callAddressLowerCase, "CALL.address"); + + let ownerAddressLowerCase = OWNER_ADDRESS.toLowerCase(); + + await replaceStringInFile(SKALE_TRACES_DIR + _traceFileName, + ownerAddressLowerCase, "OWNER.address"); + + // if the contract has been deployed, also replace contract address + + if (DEPLOYED_CONTRACT_ADDRESS_LOWER_CASE.length > 0) { + await replaceStringInFile(SKALE_TRACES_DIR + _traceFileName, + DEPLOYED_CONTRACT_ADDRESS_LOWER_CASE, TEST_CONTRACT_NAME + ".address"); + + } + + +} + +async function getTraceJsonOptions(_tracer: string): Promise { + if (_tracer == DEFAULT_TRACER) { + return {}; + } + + if (_tracer == PRESTATEDIFF_TRACER) { + return {"tracer": PRESTATE_TRACER, "tracerConfig": {diffMode: true}}; + } + + return {"tracer": _tracer} +} + + +async function deleteAndRecreateDirectory(dirPath: string): Promise { + try { + // Remove the directory and its contents + await deleteDirectory(dirPath); + } catch (error) { + } + try { + + // Recreate the directory + + if (!fs.existsSync(dirPath)) { + fs.mkdirSync(dirPath); + } + console.log(`Directory recreated: ${dirPath}`); + } catch (error) { + console.error('An error occurred:', error); + } +} + +async function deleteDirectory(dirPath: string): Promise { + if (!fs.existsSync(dirPath)) + return; + const entries = fs.readdirSync(dirPath); + + // Iterate over directory contents + for (const entry of entries) { + const entryPath = path.join(dirPath, entry.name); + + if (entry.isDirectory()) { + // Recursive call for nested directories + await deleteDirectory(entryPath); + } else { + // Delete file + await fs.unlink(entryPath); + } + } + + // Delete the now-empty directory + await fs.rmdir(dirPath); +} + + +/** + * Replaces a string in a file. + * @param {string} _filePath - The path to the file. + * @param {string} _str1 - The string to be replaced. + * @param {string} _str2 - The string to replace with. + */ +async function replaceStringInFile(_filePath, _str1, _str2) { + // Read the file + + let data = fs.readFileSync(_filePath, 'utf8'); + + // Replace the string + const transformedFile = data.replace(new RegExp(_str1, 'g'), _str2); + + // Write the file + fs.writeFileSync(_filePath, transformedFile, 'utf8'); + +} + + +async function waitUntilNextBlock() { + + const current = await hre.ethers.provider.getBlockNumber(); + let newBlock = current; + console.log(`BLOCK_NUMBER ${current}`); + + while (newBlock == current) { + newBlock = await hre.ethers.provider.getBlockNumber(); + } + + console.log(`BLOCK_NUMBER ${newBlock}`); + + return current; + +} + +function CHECK(result: any): void { + if (!result) { + const message: string = `Check failed ${result}` + console.log(message); + throw message; + } + + +} + +async function getBlockTrace(blockNumber: number): Promise { + + const blockStr = "0x" + blockNumber.toString(16); + //trace both empty tracer and no tracer + let trace = await ethers.provider.send('debug_traceBlockByNumber', [blockStr]); + trace = await ethers.provider.send('debug_traceBlockByNumber', [blockStr, {}]); + + return trace; +} + + +async function deployTestContract(): Promise { + + console.log(`Deploying ` + TEST_CONTRACT_NAME); + + const factory = await ethers.getContractFactory(TEST_CONTRACT_NAME); + const testContractName = await factory.deploy({ + gasLimit: 2100000, // this is just an example value; you'll need to set an appropriate gas limit for your specific function call + }); + const deployedTestContract = await testContractName.deployed(); + + const deployReceipt = await ethers.provider.getTransactionReceipt(deployedTestContract.deployTransaction.hash) + const deployBlockNumber: number = deployReceipt.blockNumber; + + const hash = deployedTestContract.deployTransaction.hash; + console.log(`Contract deployed to ${deployedTestContract.address} at block ${deployBlockNumber.toString(16)} tx hash ${hash}`); + + return deployedTestContract; + +} + + +function generateNewWallet() { + const wallet = hre.ethers.Wallet.createRandom(); + console.log("Address:", wallet.address); + return wallet; +} + +function sleep(ms: number) { + return new Promise(resolve => setTimeout(resolve, ms)); +} + + +async function sendMoneyWithoutConfirmation(): Promise { + // Generate a new wallet + const newWallet = generateNewWallet(); + + await sleep(3000); // Sleep for 1000 milliseconds (1 second) + + // Get the first signer from Hardhat's local network + const [signer] = await hre.ethers.getSigners(); + + const currentNonce = await signer.getTransactionCount(); + + // Define the transaction + const tx = { + to: newWallet.address, + value: hre.ethers.utils.parseEther("0.1"), + nonce: currentNonce + }; + + // Send the transaction and wait until it is submitted ot the queue + const txResponse = signer.sendTransaction(tx); + + if (hre.network.name == "geth") { + await txResponse; + } + + console.log(`Submitted a tx to send 0.1 ETH to ${newWallet.address}`); + + return currentNonce; +} + +async function sendTransferWithConfirmation(): Promise { + // Generate a new wallet + const newWallet = generateNewWallet(); + + await sleep(3000); // Sleep for 1000 milliseconds (1 second) + + // Get the first signer from Hardhat's local network + const [signer] = await hre.ethers.getSigners(); + + const currentNonce = await signer.getTransactionCount(); + + // Define the transaction + const tx = { + to: "0x388C818CA8B9251b393131C08a736A67ccB19297", + value: hre.ethers.utils.parseEther("0.1"), + }; + + // Send the transaction and wait until it is submitted ot the queue + const txResponse = await signer.sendTransaction(tx); + const txReceipt = await txResponse.wait(); + + console.log(`Submitted a tx to send 0.1 ETH to ${newWallet.address}`); + + return txReceipt.transactionHash!; +} + + +async function executeTransferAndThenTestContractMintInSingleBlock(deployedContract: any): Promise { + + let currentNonce: int = await sendMoneyWithoutConfirmation(); + + const mintReceipt = await deployedContract[EXECUTE_FUNCTION_NAME](1000, { + gasLimit: 2100000, // this is just an example value; you'll need to set an appropriate gas limit for your specific function call + nonce: currentNonce + 1, + }); + + expect(mintReceipt.blockNumber).not.to.be.null; + + + const trace: string = await getBlockTrace(mintReceipt.blockNumber); + + + expect(Array.isArray(trace)); + + // the array should have two elements + if (hre.network.name != "geth") { + expect(trace.length == 2); + } + + return mintReceipt.hash!; + +} + +async function executeMint2(deployedContract: any): Promise { + + + const mint2Receipt = await deployedContract[EXECUTE2_FUNCTION_NAME](1000, { + gasLimit: 2100000, // this is just an example value; you'll need to set an appropriate gas limit for your specific function call, + }); + + expect(mint2Receipt.blockNumber).not.to.be.null; + + + return mint2Receipt.hash!; + +} + + +async function executeRevert(deployedContract: any): Promise { + + const revertReceipt = await deployedContract[EXECUTE3_FUNCTION_NAME](1000, { + gasLimit: 2100000, // this is just an example value; you'll need to set an appropriate gas limit for your specific function call, + }); + + expect(revertReceipt.blockNumber).not.to.be.null; + + + return revertReceipt.hash!; + +} + + +async function writeTraceFileReplacingAddressesWithSymbolicNames(_traceFileName: string, traceResult: string) { + writeFileSync(SKALE_TRACES_DIR + _traceFileName, traceResult); + await replaceAddressesWithSymbolicNames(_traceFileName); +} + +async function callDebugTraceCall(_deployedContract: any, _tracer: string, _traceFileName: string): Promise { + + // first call function using eth_call + + const currentBlock = await hre.ethers.provider.getBlockNumber(); + + const transaction = { + from: CALL_ADDRESS, + to: _deployedContract.address, + data: _deployedContract.interface.encodeFunctionData("getBalance", []) + }; + + const returnData = await ethers.provider.call(transaction, currentBlock - 1); + + const result = _deployedContract.interface.decodeFunctionResult("getBalance", returnData); + + + console.log("Calling debug_traceCall to generate " + _traceFileName); + + let traceOptions = await getTraceJsonOptions(_tracer); + + const trace = await ethers.provider.send('debug_traceCall', [transaction, "latest", traceOptions]); + + const traceResult = JSON.stringify(trace, null, 4); + await writeTraceFileReplacingAddressesWithSymbolicNames(_traceFileName, traceResult); + +} + + + +async function getAndPrintCommittedTransactionTrace(hash: string, _tracer: string, _skaleFileName: string): Promise { + globalCallCount++; + + let traceOptions = await getTraceJsonOptions(_tracer); + + console.log("Calling debug_traceTransaction to generate " + _skaleFileName); + + let trace; + + + if (_tracer == DEFAULT_TRACER) { + // test both empty tracer and now tracer + if (globalCallCount % 2 === 0) { + trace = await ethers.provider.send('debug_traceTransaction', [hash]); + } else { + trace = await ethers.provider.send('debug_traceTransaction', [hash, traceOptions]); + } + } else { + trace = await ethers.provider.send('debug_traceTransaction', [hash, traceOptions]); + } + + const result = JSON.stringify(trace, null, 4); + + await writeTraceFileReplacingAddressesWithSymbolicNames(_skaleFileName, result); + + return trace; +} + +async function readJSONFile(fileName: string): Promise { + return new Promise((resolve, reject) => { + readFile(fileName, 'utf8', (err, data) => { + if (err) { + reject(`An error occurred while reading the file: ${err.message}`); + return; + } + try { + const obj: object = JSON.parse(data); + resolve(obj); + } catch (parseError: any) { + reject(`Error parsing JSON: ${parseError.message}`); + } + }); + }); +} + + +async function verifyDefaultTraceAgainstGethTrace(_fileName: string) { + + console.log("Verifying " + _fileName); + + const _expectedResultFileName = GETH_TRACES_DIR + _fileName; + const _actualResultFileName = SKALE_TRACES_DIR + _fileName; + + let expectedResult = await readJSONFile(_expectedResultFileName) + let actualResult = await readJSONFile(_actualResultFileName) + + await verifyGasCalculations(actualResult); + + const differences = deepDiff(expectedResult, actualResult)!; + + let foundDiffs = false; + + if (differences) { + differences.forEach((difference, index) => { + // do not print differences related to total gas in the account + if (difference.kind == "E" && difference.path!.length == 3 && difference.path![2] == "gas") { + return; + } + + if (difference.kind == "E" && difference.path!.length == 1 && difference.path![0] == "gas") { + return; + } + + if (difference.kind == "E" && difference.path!.length == 3 && difference.path![2] == "gasCost") { + let op = expectedResult.structLogs[difference.path![1]]["op"]; + if (op == "SLOAD" || op == "SSTORE" || op == "EXTCODESIZE" || op == "CALL" || + op == "STATICCALL" || op == "CREATE") { + return; + } + } + + if (difference.kind == "E" && difference.path!.length == 4 && difference.path![2] == "storage") { + return; + } + + if (difference.kind == "E" && difference.path!.length == 4 && difference.path![2] == "stack") { + return; + } + + + foundDiffs = true; + if (difference.kind == "E") { + console.log(`Difference op:`, expectedResult["structLogs"][difference.path![1]]); + } + console.log(`Found difference (lhs is expected value) ${index + 1} at path:`, difference.path); + console.log(`Difference ${index + 1}:`, difference); + }); + } + ; + + await expect(foundDiffs).to.be.eq(false) +} + +async function verifyTransferTraceAgainstGethTrace(_fileName: string) { + + console.log("Verifying " + _fileName); + + const _expectedResultFileName = GETH_TRACES_DIR + _fileName; + const _actualResultFileName = SKALE_TRACES_DIR + _fileName; + + let expectedResult = await readJSONFile(_expectedResultFileName) + let actualResult = await readJSONFile(_actualResultFileName) + + const differences = deepDiff(expectedResult, actualResult)!; + + let foundDiffs = false; + + + if (differences) { + differences.forEach((difference, index) => { + foundDiffs = true; + }); + } + ; + + await expect(foundDiffs).to.be.eq(false) +} + +async function verifyPrestateTransferTraceAgainstGethTrace(_fileName: string) { + + console.log("Verifying " + _fileName); + + const _expectedResultFileName = GETH_TRACES_DIR + _fileName; + const _actualResultFileName = SKALE_TRACES_DIR + _fileName; + + let expectedResult = await readJSONFile(_expectedResultFileName) + let actualResult = await readJSONFile(_actualResultFileName) + + const differences = deepDiff(expectedResult, actualResult)!; + + let foundDiffs = false; + + + if (differences) { + differences.forEach((difference, index) => { + + if (difference.kind == "E" && difference.path!.length == 2) { + if (difference.path![1] == "balance" || difference.path![1] == "nonce") { + return; + } + } + + if (difference.kind == "E" && difference.path!.length == 2) { + let address = difference.path![0]; + if (address == ZERO_ADDRESS && difference.path![1] == "balance") { + return; + } + } + + console.log(`Found difference (lhs is expected value) ${index + 1} at path:`, difference.path); + console.log(`Difference ${index + 1}:`, difference); + + foundDiffs = true; + }); + } + ; + + await expect(foundDiffs).to.be.eq(false) +} + +async function verifyPrestateDiffTransferTraceAgainstGethTrace(_fileName: string) { + + console.log("Verifying " + _fileName); + + const _expectedResultFileName = GETH_TRACES_DIR + _fileName; + const _actualResultFileName = SKALE_TRACES_DIR + _fileName; + + let expectedResult = await readJSONFile(_expectedResultFileName) + let actualResult = await readJSONFile(_actualResultFileName) + + const differences = deepDiff(expectedResult, actualResult)!; + + let foundDiffs = false; + + + if (differences) { + differences.forEach((difference, index) => { + + if (difference.kind == "E" && difference.path!.length == 3) { + if (difference.path![2] == "balance" || difference.path![2] == "nonce") { + return; + } + } + + if (difference.kind == "E" && difference.path!.length == 3) { + let address = difference.path![1]; + if (address == ZERO_ADDRESS && difference.path![2] == "balance") { + return; + } + } + + console.log(`Found difference (lhs is expected value) ${index + 1} at path:`, difference.path); + console.log(`Difference ${index + 1}:`, difference); + + foundDiffs = true; + }); + } + ; + + await expect(foundDiffs).to.be.eq(false) +} + + +async function verifyCallTraceAgainstGethTrace(_fileName: string) { + + console.log("Verifying " + _fileName); + + const _expectedResultFileName = GETH_TRACES_DIR + _fileName; + const _actualResultFileName = SKALE_TRACES_DIR + _fileName; + + let expectedResult = await readJSONFile(_expectedResultFileName) + let actualResult = await readJSONFile(_actualResultFileName) + + const differences = deepDiff(expectedResult, actualResult)!; + + let foundDiffs = false; + + + if (differences) { + differences.forEach((difference, index) => { + // do not print differences related to total gas in the account + + + if (difference.kind == "E" && difference.path!.length == 1) { + let key = difference.path![0]; + if (key == "to" || key == "gas" || key == "gasUsed") + return; + } + + if (difference.kind == "E" && difference.path!.length == 3 && difference.path![0] == "calls") { + let key = difference.path![2]; + if (key == "to" || key == "gas" || key == "gasUsed") + return; + } + + foundDiffs = true; + + console.log(`Found difference (lhs is expected value) ${index + 1} at path:`, difference.path); + console.log(`Difference ${index + 1}:`, difference); + }); + } + + + await expect(foundDiffs).to.be.eq(false) +} + +async function verifyFourByteTraceAgainstGethTrace(_fileName: string) { + + console.log("Verifying " + _fileName); + + const _expectedResultFileName = GETH_TRACES_DIR + _fileName; + const _actualResultFileName = SKALE_TRACES_DIR + _fileName; + + let expectedResult = await readJSONFile(_expectedResultFileName) + let actualResult = await readJSONFile(_actualResultFileName) + + const differences = deepDiff(expectedResult, actualResult)!; + + let foundDiffs = false; + + + if (differences) { + differences.forEach((difference, index) => { + // do not print differences related to total gas in the account + + foundDiffs = true; + + console.log(`Found difference (lhs is expected value) ${index + 1} at path:`, difference.path); + console.log(`Difference ${index + 1}:`, difference); + }); + } + + + await expect(foundDiffs).to.be.eq(false) +} + + +async function verifyPrestateTraceAgainstGethTrace(_fileName: string) { + + console.log("Verifying " + _fileName); + + const _expectedResultFileName = GETH_TRACES_DIR + _fileName; + const _actualResultFileName = SKALE_TRACES_DIR + _fileName; + + let expectedResult = await readJSONFile(_expectedResultFileName) + let actualResult = await readJSONFile(_actualResultFileName) + + const differences = deepDiff(expectedResult, actualResult)!; + + let foundDiffs = false; + + + if (differences) { + differences.forEach((difference, index) => { + if (difference.kind == "E" && difference.path!.length == 2) { + let address = difference.path![0]; + if (address == ZERO_ADDRESS && difference.path![1] == "balance") { + return; + } + + if (address == "OWNER.address" && difference.path![1] == "balance") { + return; + } + + if (address == "OWNER.address" && difference.path![1] == "nonce") { + return; + } + } + + if (difference.kind != "E" && difference.path!.length == 1) { + // ignore everything related to newly deployed contract + const key = difference.path![0]; + if (key != "Tracer.address" && key != ZERO_ADDRESS && key != "OWNER.address") { + return; + } + } + + + foundDiffs = true; + + console.log(`Found difference (lhs is expected value) ${index + 1} at path:`, difference.path); + console.log(`Difference ${index + 1}:`, difference); + }); + } + + + await expect(foundDiffs).to.be.eq(false) +} + +async function verifyPrestateDiffTraceAgainstGethTrace(_fileName: string) { + + console.log("Verifying " + _fileName); + + const _expectedResultFileName = GETH_TRACES_DIR + _fileName; + const _actualResultFileName = SKALE_TRACES_DIR + _fileName; + + let expectedResult = await readJSONFile(_expectedResultFileName) + let actualResult = await readJSONFile(_actualResultFileName) + + const differences = deepDiff(expectedResult, actualResult)!; + + let foundDiffs = false; + + + if (differences) { + differences.forEach((difference, index) => { + + if (difference.kind == "E" && difference.path!.length == 2) { + let address = difference.path![0]; + if (address == ZERO_ADDRESS && difference.path![1] == "balance") { + return; + } + + if (address == "OWNER.address" && difference.path![1] == "balance") { + return; + } + + if (address == "OWNER.address" && difference.path![1] == "nonce") { + return; + } + } + + if (difference.kind == "E" && difference.path!.length == 3) { + let address = difference.path![1]; + if (address == ZERO_ADDRESS && difference.path![2] == "balance") { + return; + } + + if (address == "OWNER.address" && difference.path![2] == "balance") { + return; + } + + if (address == "OWNER.address" && difference.path![2] == "nonce") { + return; + } + } + + if (difference.kind == "E" && difference.path!.length == 4) { + if (difference.path![1] == "Tracer.address" && difference.path![2] == "storage") { + return; + } + } + + if (difference.kind != "E" && difference.path!.length == 2 && + difference.path![0] == "post") { + // ignore everything related to newly deployed contract + const key = difference.path![1]; + if (key != "Tracer.address" && key != ZERO_ADDRESS && key != "OWNER.address") { + return; + } + } + + + foundDiffs = true; + + console.log(`Found difference (lhs is expected value) ${index + 1} at path:`, difference.path); + console.log(`Difference ${index + 1}:`, difference); + }); + } + + + await expect(foundDiffs).to.be.eq(false) +} + + +async function verifyGasCalculations(_actualResult: any): Promise { + let structLogs: object[] = _actualResult.structLogs; + expect(structLogs.length > 0) + let gasRemaining: bigint = structLogs[0].gas + let currentOpGasCost = structLogs[0].gasCost + let totalGasUsedInOps: bigint = currentOpGasCost; + + + for (let index = 1; index < structLogs.length; index++) { + const currentOpLog = structLogs[index] + const previousOpLog = structLogs[index - 1] + + let newGasRemaining: bigint = currentOpLog.gas + // geth does not correctly report gas cost of create operation + if (previousOpLog.op !== "CREATE" && previousOpLog.op !== "RETURN" + && previousOpLog.op !== "CALL" && previousOpLog.op !== "REVERT" && previousOpLog.op !== "STATICCALL") { + expect(gasRemaining - newGasRemaining).eq(currentOpGasCost, + // in case of failure we print current and previous op log + "\n" + JSON.stringify(structLogs[index - 1]) + + "\n" + JSON.stringify(currentOpLog) + "\n"); + } + gasRemaining = newGasRemaining; + currentOpGasCost = structLogs[index].gasCost + totalGasUsedInOps += currentOpGasCost; + } +} + + +async function main(): Promise { + + expect(existsSync(GETH_TRACES_DIR + TEST_DEPLOY_DEFAULTTRACER_FILE_NAME)); + expect(existsSync(GETH_TRACES_DIR + TEST_CONTRACT_EXECUTE_DEFAULTTRACER_FILE_NAME)); + expect(existsSync(GETH_TRACES_DIR + TEST_CONTRACT_CALL_DEFAULTTRACER_FILE_NAME)); + + await deleteAndRecreateDirectory(SKALE_TRACES_DIR); + + let deployedContract = await deployTestContract(); + const deployHash = deployedContract.deployTransaction.hash; + DEPLOYED_CONTRACT_ADDRESS_LOWER_CASE = deployedContract.address.toString().toLowerCase(); + + + const firstMintHash: string = await executeTransferAndThenTestContractMintInSingleBlock(deployedContract); + + await getAndPrintCommittedTransactionTrace(deployHash, DEFAULT_TRACER, TEST_DEPLOY_DEFAULTTRACER_FILE_NAME); + await getAndPrintCommittedTransactionTrace(deployHash, CALL_TRACER, TEST_DEPLOY_CALLTRACER_FILE_NAME); + await getAndPrintCommittedTransactionTrace(deployHash, FOURBYTE_TRACER, TEST_DEPLOY_FOURBYTETRACER_FILE_NAME); + await getAndPrintCommittedTransactionTrace(deployHash, PRESTATEDIFF_TRACER, TEST_DEPLOY_PRESTATEDIFFTRACER_FILE_NAME); + await getAndPrintCommittedTransactionTrace(deployHash, PRESTATE_TRACER, TEST_DEPLOY_PRESTATETRACER_FILE_NAME); + + + await getAndPrintCommittedTransactionTrace(firstMintHash, DEFAULT_TRACER, TEST_CONTRACT_EXECUTE_DEFAULTTRACER_FILE_NAME); + await getAndPrintCommittedTransactionTrace(firstMintHash, CALL_TRACER, TEST_CONTRACT_EXECUTE_CALLTRACER_FILE_NAME); + await getAndPrintCommittedTransactionTrace(firstMintHash, PRESTATE_TRACER, TEST_CONTRACT_EXECUTE_PRESTATETRACER_FILE_NAME); + await getAndPrintCommittedTransactionTrace(firstMintHash, PRESTATEDIFF_TRACER, TEST_CONTRACT_EXECUTE_PRESTATEDIFFTRACER_FILE_NAME); + await getAndPrintCommittedTransactionTrace(firstMintHash, FOURBYTE_TRACER, TEST_CONTRACT_EXECUTE_FOURBYTETRACER_FILE_NAME); + + + const secondTransferHash: string = await sendTransferWithConfirmation(); + + await getAndPrintCommittedTransactionTrace(secondTransferHash, DEFAULT_TRACER, TEST_TRANSFER_DEFAULTTRACER_FILE_NAME); + await getAndPrintCommittedTransactionTrace(secondTransferHash, CALL_TRACER, TEST_TRANSFER_CALLTRACER_FILE_NAME); + await getAndPrintCommittedTransactionTrace(secondTransferHash, PRESTATE_TRACER, TEST_TRANSFER_PRESTATETRACER_FILE_NAME); + await getAndPrintCommittedTransactionTrace(secondTransferHash, PRESTATEDIFF_TRACER, TEST_TRANSFER_PRESTATEDIFFTRACER_FILE_NAME); + await getAndPrintCommittedTransactionTrace(secondTransferHash, FOURBYTE_TRACER, TEST_TRANSFER_FOURBYTETRACER_FILE_NAME); + + + const secondMintHash: string = await executeMint2(deployedContract); + await getAndPrintCommittedTransactionTrace(secondMintHash, DEFAULT_TRACER, TEST_CONTRACT_EXECUTE2_DEFAULTTRACER_FILE_NAME); + await getAndPrintCommittedTransactionTrace(secondMintHash, CALL_TRACER, TEST_CONTRACT_EXECUTE2_CALLTRACER_FILE_NAME); + await getAndPrintCommittedTransactionTrace(secondMintHash, PRESTATE_TRACER, TEST_CONTRACT_EXECUTE2_PRESTATETRACER_FILE_NAME); + await getAndPrintCommittedTransactionTrace(secondMintHash, PRESTATEDIFF_TRACER, TEST_CONTRACT_EXECUTE2_PRESTATEDIFFTRACER_FILE_NAME); + await getAndPrintCommittedTransactionTrace(secondMintHash, FOURBYTE_TRACER, TEST_CONTRACT_EXECUTE2_FOURBYTETRACER_FILE_NAME); + + + const revertHash: string = await executeRevert(deployedContract); + await getAndPrintCommittedTransactionTrace(revertHash, DEFAULT_TRACER, TEST_CONTRACT_EXECUTE3_DEFAULTTRACER_FILE_NAME); + await getAndPrintCommittedTransactionTrace(revertHash, CALL_TRACER, TEST_CONTRACT_EXECUTE3_CALLTRACER_FILE_NAME); + await getAndPrintCommittedTransactionTrace(revertHash, PRESTATE_TRACER, TEST_CONTRACT_EXECUTE3_PRESTATETRACER_FILE_NAME); + await getAndPrintCommittedTransactionTrace(revertHash, PRESTATEDIFF_TRACER, TEST_CONTRACT_EXECUTE3_PRESTATEDIFFTRACER_FILE_NAME); + await getAndPrintCommittedTransactionTrace(revertHash, FOURBYTE_TRACER, TEST_CONTRACT_EXECUTE3_FOURBYTETRACER_FILE_NAME); + + + await callDebugTraceCall(deployedContract, DEFAULT_TRACER, TEST_CONTRACT_CALL_DEFAULTTRACER_FILE_NAME); + await callDebugTraceCall(deployedContract, CALL_TRACER, TEST_CONTRACT_CALL_CALLTRACER_FILE_NAME); + await callDebugTraceCall(deployedContract, FOURBYTE_TRACER, TEST_CONTRACT_CALL_FOURBYTETRACER_FILE_NAME); + await callDebugTraceCall(deployedContract, PRESTATE_TRACER, TEST_CONTRACT_CALL_PRESTATETRACER_FILE_NAME); + await callDebugTraceCall(deployedContract, PRESTATEDIFF_TRACER, TEST_CONTRACT_CALL_PRESTATEDIFFTRACER_FILE_NAME); + + + // geth does not have replay trace + if (hre.network.name != "geth") { + await callDebugTraceCall(deployedContract, REPLAY_TRACER, TEST_CONTRACT_CALL_REPLAYTRACER_FILE_NAME); + } + + + await verifyTransferTraceAgainstGethTrace(TEST_TRANSFER_DEFAULTTRACER_FILE_NAME); + await verifyTransferTraceAgainstGethTrace(TEST_TRANSFER_CALLTRACER_FILE_NAME); + await verifyPrestateDiffTransferTraceAgainstGethTrace(TEST_TRANSFER_PRESTATEDIFFTRACER_FILE_NAME); + await verifyPrestateTransferTraceAgainstGethTrace(TEST_TRANSFER_PRESTATETRACER_FILE_NAME); + await verifyTransferTraceAgainstGethTrace(TEST_TRANSFER_FOURBYTETRACER_FILE_NAME); + + + await verifyDefaultTraceAgainstGethTrace(TEST_CONTRACT_EXECUTE_DEFAULTTRACER_FILE_NAME); + await verifyCallTraceAgainstGethTrace(TEST_CONTRACT_EXECUTE_CALLTRACER_FILE_NAME); + await verifyPrestateTraceAgainstGethTrace(TEST_CONTRACT_EXECUTE_PRESTATETRACER_FILE_NAME); + await verifyPrestateDiffTraceAgainstGethTrace(TEST_CONTRACT_EXECUTE_PRESTATEDIFFTRACER_FILE_NAME); + await verifyFourByteTraceAgainstGethTrace(TEST_CONTRACT_EXECUTE_FOURBYTETRACER_FILE_NAME); + + + await verifyDefaultTraceAgainstGethTrace(TEST_CONTRACT_CALL_DEFAULTTRACER_FILE_NAME); + await verifyCallTraceAgainstGethTrace(TEST_CONTRACT_CALL_CALLTRACER_FILE_NAME); + await verifyFourByteTraceAgainstGethTrace(TEST_CONTRACT_CALL_FOURBYTETRACER_FILE_NAME); + await verifyPrestateTraceAgainstGethTrace(TEST_CONTRACT_CALL_PRESTATETRACER_FILE_NAME); + await verifyPrestateDiffTraceAgainstGethTrace(TEST_CONTRACT_CALL_PRESTATEDIFFTRACER_FILE_NAME); + + await verifyDefaultTraceAgainstGethTrace(TEST_DEPLOY_DEFAULTTRACER_FILE_NAME); + await verifyCallTraceAgainstGethTrace(TEST_DEPLOY_CALLTRACER_FILE_NAME); + await verifyFourByteTraceAgainstGethTrace(TEST_DEPLOY_FOURBYTETRACER_FILE_NAME); + await verifyPrestateTraceAgainstGethTrace(TEST_DEPLOY_PRESTATETRACER_FILE_NAME); + await verifyPrestateDiffTraceAgainstGethTrace(TEST_DEPLOY_PRESTATEDIFFTRACER_FILE_NAME); + + + await verifyCallTraceAgainstGethTrace(TEST_CONTRACT_EXECUTE2_CALLTRACER_FILE_NAME); + await verifyFourByteTraceAgainstGethTrace(TEST_CONTRACT_EXECUTE2_FOURBYTETRACER_FILE_NAME); + await verifyDefaultTraceAgainstGethTrace(TEST_CONTRACT_EXECUTE2_DEFAULTTRACER_FILE_NAME); + await verifyPrestateTraceAgainstGethTrace(TEST_CONTRACT_EXECUTE2_PRESTATETRACER_FILE_NAME); + await verifyPrestateDiffTraceAgainstGethTrace(TEST_CONTRACT_EXECUTE2_PRESTATEDIFFTRACER_FILE_NAME); + + await verifyCallTraceAgainstGethTrace(TEST_CONTRACT_EXECUTE3_CALLTRACER_FILE_NAME); + await verifyFourByteTraceAgainstGethTrace(TEST_CONTRACT_EXECUTE3_FOURBYTETRACER_FILE_NAME); + await verifyDefaultTraceAgainstGethTrace(TEST_CONTRACT_EXECUTE3_DEFAULTTRACER_FILE_NAME); + await verifyPrestateTraceAgainstGethTrace(TEST_CONTRACT_EXECUTE3_PRESTATETRACER_FILE_NAME); + await verifyPrestateDiffTraceAgainstGethTrace(TEST_CONTRACT_EXECUTE3_PRESTATEDIFFTRACER_FILE_NAME); + + +} + + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main().catch((error: any) => { + console.error(error); + process.exitCode = 1; +}); diff --git a/test/historicstate/hardhat/scripts/deploy.js b/test/historicstate/hardhat/scripts/write_and_selfdestruct_test.js similarity index 100% rename from test/historicstate/hardhat/scripts/deploy.js rename to test/historicstate/hardhat/scripts/write_and_selfdestruct_test.js diff --git a/test/historicstate/hardhat/tracely b/test/historicstate/hardhat/tracely new file mode 160000 index 000000000..49cf8afaa --- /dev/null +++ b/test/historicstate/hardhat/tracely @@ -0,0 +1 @@ +Subproject commit 49cf8afaaf1820bbb4870d064930c9c8fa53a1fb diff --git a/test/historicstate/hardhat/tsconfig.json b/test/historicstate/hardhat/tsconfig.json new file mode 100644 index 000000000..3725a7c2d --- /dev/null +++ b/test/historicstate/hardhat/tsconfig.json @@ -0,0 +1,110 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "commonjs", /* Specify what module code is generated. */ + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} + diff --git a/test/package.json b/test/package.json index 57e25fb78..2e531fa50 100644 --- a/test/package.json +++ b/test/package.json @@ -1,5 +1,9 @@ { "devDependencies": { - "hardhat": "^2.12.2" + "@types/mocha": "^10.0.2", + "@types/node": "^20.8.0", + "hardhat": "^2.12.2", + "ts-node": "^10.9.1", + "typescript": "^5.2.2" } } diff --git a/test/tools/libtesteth/Options.cpp b/test/tools/libtesteth/Options.cpp index d7c787b0e..5f6074367 100644 --- a/test/tools/libtesteth/Options.cpp +++ b/test/tools/libtesteth/Options.cpp @@ -205,7 +205,8 @@ Options::Options( int argc, const char** argv ) { auto arg = std::string{argv[++i]}; Json::Value value; Json::Reader().parse( arg, value ); - jsontraceOptions = debugOptions( value ); + StandardTrace::DebugOptions op; + jsontraceOptions = op; } else if ( arg == "--filltests" ) filltests = true; else if ( arg == "--fillchain" ) diff --git a/test/unittests/libweb3jsonrpc/WebThreeStubClient.cpp b/test/unittests/libweb3jsonrpc/WebThreeStubClient.cpp index 680bdb57e..612b934fa 100644 --- a/test/unittests/libweb3jsonrpc/WebThreeStubClient.cpp +++ b/test/unittests/libweb3jsonrpc/WebThreeStubClient.cpp @@ -1286,7 +1286,7 @@ std::string WebThreeStubClient::debug_preimage( const std::string& param1 ) { jsonrpc::Errors::ERROR_CLIENT_INVALID_RESPONSE, result.toStyledString() ); } -Json::Value WebThreeStubClient::debug_traceBlockByNumber( int param1, const Json::Value& param2 ) { +Json::Value WebThreeStubClient::debug_traceBlockByNumber( const std::string& param1, const Json::Value& param2 ) { Json::Value p; p.append( param1 ); p.append( param2 ); diff --git a/test/unittests/libweb3jsonrpc/WebThreeStubClient.h b/test/unittests/libweb3jsonrpc/WebThreeStubClient.h index 6385a340d..ab01eceb1 100644 --- a/test/unittests/libweb3jsonrpc/WebThreeStubClient.h +++ b/test/unittests/libweb3jsonrpc/WebThreeStubClient.h @@ -153,7 +153,7 @@ class WebThreeStubClient : public jsonrpc::Client { Json::Value debug_storageRangeAt( const std::string& param1, int param2, const std::string& param3, const std::string& param4, int param5 ) noexcept( false ); std::string debug_preimage( const std::string& param1 ) noexcept( false ); - Json::Value debug_traceBlockByNumber( int param1, const Json::Value& param2 ) noexcept( false ); + Json::Value debug_traceBlockByNumber( const std::string & param1, const Json::Value& param2 ) noexcept( false ); Json::Value debug_traceBlockByHash( const std::string& param1, const Json::Value& param2 ) noexcept( false ); Json::Value debug_traceCall( const Json::Value& param1, const std::string& param2, diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index aebc6e62e..b0779a8c6 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -246,11 +246,16 @@ class TestIpcClient : public jsonrpc::IClientConnector { }; struct JsonRpcFixture : public TestOutputHelperFixture { - JsonRpcFixture( const std::string& _config = "", bool _owner = true, - bool _deploymentControl = true, bool _generation2 = false, + +// chain params needs to be a field of JsonRPCFixture +// since references to it are passed to the server +ChainParams chainParams; + + +JsonRpcFixture( const std::string& _config = "", bool _owner = true, + bool _deploymentControl = true, bool _generation2 = false, bool _mtmEnabled = false, bool _isSyncNode = false, int _emptyBlockIntervalMs = -1 ) { - dev::p2p::NetworkPreferences nprefs; - ChainParams chainParams; + if ( _config != "" ) { if ( !_generation2 ) { @@ -357,9 +362,9 @@ struct JsonRpcFixture : public TestOutputHelperFixture { gasPricer = make_shared< eth::TrivialGasPricer >( 0, DefaultGasPrice ); rpcServer.reset( new FullServer( ethFace , new rpc::Net( chainParams ), - new rpc::Web3( /*web3->clientVersion()*/ ), // TODO Add real version? - new rpc::AdminEth( *client, *gasPricer, keyManager, *sessionManager.get() ), - /*new rpc::AdminNet(*web3, *sessionManager), */ new rpc::Debug( *client ), + new rpc::Web3(), // TODO Add version parameter here? + new rpc::AdminEth( *client, *gasPricer, keyManager, *sessionManager ), + new rpc::Debug( *client, nullptr, "", true), new rpc::Test( *client ) ) ); // @@ -784,7 +789,7 @@ BOOST_AUTO_TEST_CASE( send_raw_tx_sync ) { // Sending tx to sync node string txHash = fixture.rpcClient->eth_sendTransaction( create ); - + auto pendingTransactions = fixture.client->pending(); BOOST_REQUIRE( pendingTransactions.size() == 1); auto txHashFromQueue = "0x" + pendingTransactions[0].sha3().hex(); @@ -1716,7 +1721,7 @@ BOOST_AUTO_TEST_CASE( call_from_parameter ) { "fffffffffffffffffffffffff16815260200191505060405180910390f3" "5b60003390509056fea165627a7a72305820abfa953fead48d8f657bca6" "57713501650734d40342585cafcf156a3fe1f41d20029"; - + auto senderAddress = fixture.coinbase.address(); Json::Value create; From 058908123edc10f469ec4989431b583b0ed52e77 Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Mon, 8 Apr 2024 13:47:05 +0100 Subject: [PATCH 075/154] #1719 fix sha3 hash calculation for invalid transactions --- libethcore/TransactionBase.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/libethcore/TransactionBase.cpp b/libethcore/TransactionBase.cpp index ccd009462..cf50ea140 100644 --- a/libethcore/TransactionBase.cpp +++ b/libethcore/TransactionBase.cpp @@ -500,12 +500,18 @@ h256 TransactionBase::sha3( IncludeSignature _sig ) const { MICROPROFILE_SCOPEI( "TransactionBase", "sha3", MP_KHAKI2 ); - RLPStream s; - streamRLP( s, _sig, !isInvalid() && isReplayProtected() && _sig == WithoutSignature ); + dev::bytes input; + if ( !isInvalid() ) { + RLPStream s; + streamRLP( s, _sig, !isInvalid() && isReplayProtected() && _sig == WithoutSignature ); - dev::bytes input = s.out(); - if ( m_txType != TransactionType::Legacy ) - input.insert( input.begin(), m_txType ); + input = s.out(); + if ( m_txType != TransactionType::Legacy ) + input.insert( input.begin(), m_txType ); + } else { + RLP data( m_rawData ); + input = dev::bytes( data.payload().begin(), data.payload().end() ); + } auto ret = dev::sha3( input ); if ( _sig == WithSignature ) From dc7a567d873f5bbe46ed3a50ccaae9a903fde7eb Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Mon, 8 Apr 2024 15:17:36 +0100 Subject: [PATCH 076/154] #1719 fix getTransactionReceipt for HISTORIC STATE --- libweb3jsonrpc/Eth.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libweb3jsonrpc/Eth.cpp b/libweb3jsonrpc/Eth.cpp index 58229596a..4fe715a6b 100644 --- a/libweb3jsonrpc/Eth.cpp +++ b/libweb3jsonrpc/Eth.cpp @@ -737,7 +737,7 @@ LocalisedTransactionReceipt Eth::eth_getTransactionReceipt( string const& _trans size_t newIndex = m_gapCache->gappedIndexFromReal( rcp.blockNumber(), rcp.transactionIndex() ); rcp = LocalisedTransactionReceipt( rcp, rcp.hash(), rcp.blockHash(), rcp.blockNumber(), - newIndex, rcp.from(), rcp.to(), rcp.gasUsed(), rcp.contractAddress() ); + newIndex, rcp.from(), rcp.to(), rcp.gasUsed(), rcp.contractAddress(), rcp.txType() ); } #endif From 9b5992b6cd326948fcc39a81a51865f7b46b106d Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Mon, 8 Apr 2024 19:05:48 +0100 Subject: [PATCH 077/154] SKALED-1583 Formatting --- libdevcore/LevelDB.h | 2 +- libethereum/Block.cpp | 12 +- libethereum/ChainParams.cpp | 426 ++++++++++++++++++------------------ libethereum/Client.cpp | 4 +- 4 files changed, 222 insertions(+), 222 deletions(-) diff --git a/libdevcore/LevelDB.h b/libdevcore/LevelDB.h index c2a1f7ee9..90b3fb307 100644 --- a/libdevcore/LevelDB.h +++ b/libdevcore/LevelDB.h @@ -26,7 +26,7 @@ #include #include -#include "shared_mutex" +#include #include namespace dev::db { diff --git a/libethereum/Block.cpp b/libethereum/Block.cpp index d9797ff35..deed6f7ce 100644 --- a/libethereum/Block.cpp +++ b/libethereum/Block.cpp @@ -798,17 +798,17 @@ u256 Block::enact( VerifiedBlockRef const& _block, BlockChain const& _bc ) { ExecutionResult Block::executeHistoricCall( LastBlockHashesFace const& _lh, Transaction const& _t, std::shared_ptr< AlethStandardTrace > _tracer, uint64_t _transactionIndex ) { try { - auto onOp = OnOpFunc(); + auto onOp = OnOpFunc(); if ( _tracer ) { onOp = _tracer->functionToExecuteOnEachOperation(); } - if ( isSealed() ) - BOOST_THROW_EXCEPTION( InvalidOperationOnSealedBlock() ); + if ( isSealed() ) + BOOST_THROW_EXCEPTION( InvalidOperationOnSealedBlock() ); - uncommitToSeal(); + uncommitToSeal(); STATE_CHECK( _transactionIndex <= m_receipts.size() ) @@ -830,7 +830,7 @@ ExecutionResult Block::executeHistoricCall( LastBlockHashesFace const& _lh, Tran // for tracing the entire block is traced therefore, we save transaction receipt // as it is used for execution of the next transaction m_receipts.push_back( resultReceipt.second ); - return resultReceipt.first; + return resultReceipt.first; } catch ( std::exception& e ) { throw dev::eth::VMTracingError( "Exception doing trace for transaction index:" + std::to_string( _transactionIndex ) + ":" + @@ -911,7 +911,7 @@ ExecutionResult Block::execute( if ( _p == Permanence::Committed || _p == Permanence::CommittedWithoutState || _p == Permanence::Uncommitted ) { // Add to the user-originated transactions that we've executed. - if ( !SkipInvalidTransactionsPatch::isEnabled() || + if ( !SkipInvalidTransactionsPatch::isEnabledWhen( previousInfo().timestamp() ) || resultReceipt.first.excepted != TransactionException::WouldNotBeInBlock ) { m_transactions.push_back( _t ); m_receipts.push_back( resultReceipt.second ); diff --git a/libethereum/ChainParams.cpp b/libethereum/ChainParams.cpp index 8c7719477..ca4f51b6b 100644 --- a/libethereum/ChainParams.cpp +++ b/libethereum/ChainParams.cpp @@ -167,250 +167,250 @@ ChainParams ChainParams::loadConfig( return cp; } void ChainParams::processSkaleConfigItems( ChainParams& cp, json_spirit::mObject& obj ) { - auto skaleObj = obj[c_skaleConfig].get_obj(); - - auto infoObj = skaleObj.at( "nodeInfo" ).get_obj(); - - auto nodeName = infoObj.at( "nodeName" ).get_str(); - auto nodeID = infoObj.at( "nodeID" ).get_uint64(); - bool syncNode = false; - bool archiveMode = false; - bool syncFromCatchup = false; - string ip, ip6, keyShareName, sgxServerUrl; - size_t t = 0; - uint64_t port = 0, port6 = 0; - try { - ip = infoObj.at( "bindIP" ).get_str(); - } catch ( ... ) { - } - try { - port = infoObj.at( "basePort" ).get_int(); - } catch ( ... ) { - } - try { - ip6 = infoObj.at( "bindIP6" ).get_str(); - } catch ( ... ) { - } - try { - port6 = infoObj.at( "basePort6" ).get_int(); - } catch ( ... ) { - } - try { - syncNode = infoObj.at( "syncNode" ).get_bool(); - } catch ( ... ) { - } - try { - archiveMode = infoObj.at( "archiveMode" ).get_bool(); - } catch ( ... ) { - } - try { - syncFromCatchup = infoObj.at( "syncFromCatchup" ).get_bool(); - } catch ( ... ) { - } - - try { - cp.rotateAfterBlock_ = infoObj.at( "rotateAfterBlock" ).get_int(); - } catch ( ... ) { - } - if ( cp.rotateAfterBlock_ < 0 ) - cp.rotateAfterBlock_ = 0; + auto skaleObj = obj[c_skaleConfig].get_obj(); + + auto infoObj = skaleObj.at( "nodeInfo" ).get_obj(); + + auto nodeName = infoObj.at( "nodeName" ).get_str(); + auto nodeID = infoObj.at( "nodeID" ).get_uint64(); + bool syncNode = false; + bool archiveMode = false; + bool syncFromCatchup = false; + string ip, ip6, keyShareName, sgxServerUrl; + size_t t = 0; + uint64_t port = 0, port6 = 0; + try { + ip = infoObj.at( "bindIP" ).get_str(); + } catch ( ... ) { + } + try { + port = infoObj.at( "basePort" ).get_int(); + } catch ( ... ) { + } + try { + ip6 = infoObj.at( "bindIP6" ).get_str(); + } catch ( ... ) { + } + try { + port6 = infoObj.at( "basePort6" ).get_int(); + } catch ( ... ) { + } + try { + syncNode = infoObj.at( "syncNode" ).get_bool(); + } catch ( ... ) { + } + try { + archiveMode = infoObj.at( "archiveMode" ).get_bool(); + } catch ( ... ) { + } + try { + syncFromCatchup = infoObj.at( "syncFromCatchup" ).get_bool(); + } catch ( ... ) { + } - string ecdsaKeyName; - try { - ecdsaKeyName = infoObj.at( "ecdsaKeyName" ).get_str(); - } catch ( ... ) { - } + try { + cp.rotateAfterBlock_ = infoObj.at( "rotateAfterBlock" ).get_int(); + } catch ( ... ) { + } + if ( cp.rotateAfterBlock_ < 0 ) + cp.rotateAfterBlock_ = 0; - array< string, 4 > BLSPublicKeys; - array< string, 4 > commonBLSPublicKeys; + string ecdsaKeyName; + try { + ecdsaKeyName = infoObj.at( "ecdsaKeyName" ).get_str(); + } catch ( ... ) { + } - try { - js::mObject ima = infoObj.at( "wallets" ).get_obj().at( "ima" ).get_obj(); + array< string, 4 > BLSPublicKeys; + array< string, 4 > commonBLSPublicKeys; - keyShareName = ima.at( "keyShareName" ).get_str(); + try { + js::mObject ima = infoObj.at( "wallets" ).get_obj().at( "ima" ).get_obj(); - t = ima.at( "t" ).get_int(); + keyShareName = ima.at( "keyShareName" ).get_str(); - BLSPublicKeys[0] = ima["BLSPublicKey0"].get_str(); - BLSPublicKeys[1] = ima["BLSPublicKey1"].get_str(); - BLSPublicKeys[2] = ima["BLSPublicKey2"].get_str(); - BLSPublicKeys[3] = ima["BLSPublicKey3"].get_str(); + t = ima.at( "t" ).get_int(); - commonBLSPublicKeys[0] = ima["commonBLSPublicKey0"].get_str(); - commonBLSPublicKeys[1] = ima["commonBLSPublicKey1"].get_str(); - commonBLSPublicKeys[2] = ima["commonBLSPublicKey2"].get_str(); - commonBLSPublicKeys[3] = ima["commonBLSPublicKey3"].get_str(); - } catch ( ... ) { - // all or nothing - if ( !keyShareName.empty() ) - throw; - } + BLSPublicKeys[0] = ima["BLSPublicKey0"].get_str(); + BLSPublicKeys[1] = ima["BLSPublicKey1"].get_str(); + BLSPublicKeys[2] = ima["BLSPublicKey2"].get_str(); + BLSPublicKeys[3] = ima["BLSPublicKey3"].get_str(); - cp.nodeInfo = { nodeName, nodeID, ip, static_cast< uint16_t >( port ), ip6, - static_cast< uint16_t >( port6 ), sgxServerUrl, ecdsaKeyName, keyShareName, - BLSPublicKeys, commonBLSPublicKeys, syncNode, archiveMode, syncFromCatchup }; + commonBLSPublicKeys[0] = ima["commonBLSPublicKey0"].get_str(); + commonBLSPublicKeys[1] = ima["commonBLSPublicKey1"].get_str(); + commonBLSPublicKeys[2] = ima["commonBLSPublicKey2"].get_str(); + commonBLSPublicKeys[3] = ima["commonBLSPublicKey3"].get_str(); + } catch ( ... ) { + // all or nothing + if ( !keyShareName.empty() ) + throw; + } - auto sChainObj = skaleObj.at( "sChain" ).get_obj(); - SChain s{}; - s.nodes.clear(); + cp.nodeInfo = { nodeName, nodeID, ip, static_cast< uint16_t >( port ), ip6, + static_cast< uint16_t >( port6 ), sgxServerUrl, ecdsaKeyName, keyShareName, BLSPublicKeys, + commonBLSPublicKeys, syncNode, archiveMode, syncFromCatchup }; - s.name = sChainObj.at( "schainName" ).get_str(); - s.id = sChainObj.at( "schainID" ).get_uint64(); - s.t = t; - if ( sChainObj.count( "schainOwner" ) ) { - s.owner = jsToAddress( sChainObj.at( "schainOwner" ).get_str() ); - s.blockAuthor = jsToAddress( sChainObj.at( "schainOwner" ).get_str() ); - } - if ( sChainObj.count( "blockAuthor" ) ) - s.blockAuthor = jsToAddress( sChainObj.at( "blockAuthor" ).get_str() ); + auto sChainObj = skaleObj.at( "sChain" ).get_obj(); + SChain s{}; + s.nodes.clear(); + + s.name = sChainObj.at( "schainName" ).get_str(); + s.id = sChainObj.at( "schainID" ).get_uint64(); + s.t = t; + if ( sChainObj.count( "schainOwner" ) ) { + s.owner = jsToAddress( sChainObj.at( "schainOwner" ).get_str() ); + s.blockAuthor = jsToAddress( sChainObj.at( "schainOwner" ).get_str() ); + } + if ( sChainObj.count( "blockAuthor" ) ) + s.blockAuthor = jsToAddress( sChainObj.at( "blockAuthor" ).get_str() ); - s.snapshotIntervalSec = sChainObj.count( "snapshotIntervalSec" ) ? - sChainObj.at( "snapshotIntervalSec" ).get_int() : - 0; + s.snapshotIntervalSec = sChainObj.count( "snapshotIntervalSec" ) ? + sChainObj.at( "snapshotIntervalSec" ).get_int() : + 0; - s.snapshotDownloadTimeout = sChainObj.count( "snapshotDownloadTimeout" ) ? - sChainObj.at( "snapshotDownloadTimeout" ).get_int() : - 3600; + s.snapshotDownloadTimeout = sChainObj.count( "snapshotDownloadTimeout" ) ? + sChainObj.at( "snapshotDownloadTimeout" ).get_int() : + 3600; - s.snapshotDownloadInactiveTimeout = - sChainObj.count( "snapshotDownloadInactiveTimeout" ) ? - sChainObj.at( "snapshotDownloadInactiveTimeout" ).get_int() : - 3600; + s.snapshotDownloadInactiveTimeout = + sChainObj.count( "snapshotDownloadInactiveTimeout" ) ? + sChainObj.at( "snapshotDownloadInactiveTimeout" ).get_int() : + 3600; - s.emptyBlockIntervalMs = sChainObj.count( "emptyBlockIntervalMs" ) ? - sChainObj.at( "emptyBlockIntervalMs" ).get_int() : - 0; + s.emptyBlockIntervalMs = sChainObj.count( "emptyBlockIntervalMs" ) ? + sChainObj.at( "emptyBlockIntervalMs" ).get_int() : + 0; - // negative levelDBReopenIntervalMs means restarts are disabled - s.levelDBReopenIntervalMs = sChainObj.count( "levelDBReopenIntervalMs" ) ? - sChainObj.at( "levelDBReopenIntervalMs" ).get_int64() : - c_defaultLevelDBReopenIntervalMs; + // negative levelDBReopenIntervalMs means restarts are disabled + s.levelDBReopenIntervalMs = sChainObj.count( "levelDBReopenIntervalMs" ) ? + sChainObj.at( "levelDBReopenIntervalMs" ).get_int64() : + c_defaultLevelDBReopenIntervalMs; - s.contractStorageLimit = sChainObj.count( "contractStorageLimit" ) ? - sChainObj.at( "contractStorageLimit" ).get_int64() : - 0; + s.contractStorageLimit = sChainObj.count( "contractStorageLimit" ) ? + sChainObj.at( "contractStorageLimit" ).get_int64() : + 0; - s.dbStorageLimit = - sChainObj.count( "dbStorageLimit" ) ? sChainObj.at( "dbStorageLimit" ).get_int64() : 0; + s.dbStorageLimit = + sChainObj.count( "dbStorageLimit" ) ? sChainObj.at( "dbStorageLimit" ).get_int64() : 0; - if ( sChainObj.count( "maxConsensusStorageBytes" ) ) { - s.consensusStorageLimit = sChainObj.at( "maxConsensusStorageBytes" ).get_int64(); - } + if ( sChainObj.count( "maxConsensusStorageBytes" ) ) { + s.consensusStorageLimit = sChainObj.at( "maxConsensusStorageBytes" ).get_int64(); + } - if ( sChainObj.count( "freeContractDeployment" ) ) - s.freeContractDeployment = sChainObj.at( "freeContractDeployment" ).get_bool(); - - if ( sChainObj.count( "multiTransactionMode" ) ) - s.multiTransactionMode = sChainObj.at( "multiTransactionMode" ).get_bool(); - - // extract all "*PatchTimestamp" records - for ( const auto& it : sChainObj ) { - const string& key = it.first; - if ( boost::algorithm::ends_with( key, "PatchTimestamp" ) ) { - string patchName = boost::algorithm::erase_last_copy( key, "Timestamp" ); - patchName[0] = toupper( patchName[0] ); - SchainPatchEnum patchEnum = getEnumForPatchName( patchName ); - s._patchTimestamps[static_cast< size_t >( patchEnum )] = - it.second.get_int64(); // time_t is signed - } // if - } // for - - if ( sChainObj.count( "nodeGroups" ) ) { - vector< NodeGroup > nodeGroups; - for ( const auto& nodeGroupConf : sChainObj["nodeGroups"].get_obj() ) { - NodeGroup nodeGroup; - auto nodeGroupObj = nodeGroupConf.second.get_obj(); - if ( nodeGroupObj["bls_public_key"].is_null() ) - // failed dkg, skip it - continue; - - vector< GroupNode > groupNodes; - auto groupNodesObj = nodeGroupObj["nodes"].get_obj(); - for ( const auto& groupNodeConf : groupNodesObj ) { - auto groupNodeConfObj = groupNodeConf.second.get_array(); - u256 sChainIndex = groupNodeConfObj.at( 0 ).get_uint64(); - u256 id = groupNodeConfObj.at( 1 ).get_uint64(); - string publicKey = groupNodeConfObj.at( 2 ).get_str(); - if ( publicKey.empty() ) { - BOOST_THROW_EXCEPTION( runtime_error( "Empty public key in config" ) ); - } - groupNodes.push_back( { id, sChainIndex, publicKey } ); + if ( sChainObj.count( "freeContractDeployment" ) ) + s.freeContractDeployment = sChainObj.at( "freeContractDeployment" ).get_bool(); + + if ( sChainObj.count( "multiTransactionMode" ) ) + s.multiTransactionMode = sChainObj.at( "multiTransactionMode" ).get_bool(); + + // extract all "*PatchTimestamp" records + for ( const auto& it : sChainObj ) { + const string& key = it.first; + if ( boost::algorithm::ends_with( key, "PatchTimestamp" ) ) { + string patchName = boost::algorithm::erase_last_copy( key, "Timestamp" ); + patchName[0] = toupper( patchName[0] ); + SchainPatchEnum patchEnum = getEnumForPatchName( patchName ); + s._patchTimestamps[static_cast< size_t >( patchEnum )] = + it.second.get_int64(); // time_t is signed + } // if + } // for + + if ( sChainObj.count( "nodeGroups" ) ) { + vector< NodeGroup > nodeGroups; + for ( const auto& nodeGroupConf : sChainObj["nodeGroups"].get_obj() ) { + NodeGroup nodeGroup; + auto nodeGroupObj = nodeGroupConf.second.get_obj(); + if ( nodeGroupObj["bls_public_key"].is_null() ) + // failed dkg, skip it + continue; + + vector< GroupNode > groupNodes; + auto groupNodesObj = nodeGroupObj["nodes"].get_obj(); + for ( const auto& groupNodeConf : groupNodesObj ) { + auto groupNodeConfObj = groupNodeConf.second.get_array(); + u256 sChainIndex = groupNodeConfObj.at( 0 ).get_uint64(); + u256 id = groupNodeConfObj.at( 1 ).get_uint64(); + string publicKey = groupNodeConfObj.at( 2 ).get_str(); + if ( publicKey.empty() ) { + BOOST_THROW_EXCEPTION( runtime_error( "Empty public key in config" ) ); } - sort( groupNodes.begin(), groupNodes.end(), - []( const GroupNode& lhs, const GroupNode& rhs ) { - return lhs.schainIndex < rhs.schainIndex; - } ); - nodeGroup.nodes = groupNodes; - - array< string, 4 > nodeGroupBlsPublicKey; - auto nodeGroupBlsPublicKeyObj = nodeGroupObj["bls_public_key"].get_obj(); - nodeGroupBlsPublicKey[0] = nodeGroupBlsPublicKeyObj["blsPublicKey0"].get_str(); - nodeGroupBlsPublicKey[1] = nodeGroupBlsPublicKeyObj["blsPublicKey1"].get_str(); - nodeGroupBlsPublicKey[2] = nodeGroupBlsPublicKeyObj["blsPublicKey2"].get_str(); - nodeGroupBlsPublicKey[3] = nodeGroupBlsPublicKeyObj["blsPublicKey3"].get_str(); - nodeGroup.blsPublicKey = nodeGroupBlsPublicKey; - - if ( !nodeGroupObj["finish_ts"].is_null() ) - nodeGroup.finishTs = nodeGroupObj["finish_ts"].get_uint64(); - else - nodeGroup.finishTs = uint64_t( -1 ); - nodeGroups.push_back( nodeGroup ); + groupNodes.push_back( { id, sChainIndex, publicKey } ); } - sort( - nodeGroups.begin(), nodeGroups.end(), []( const NodeGroup& lhs, const NodeGroup& rhs ) { - return lhs.finishTs < rhs.finishTs; + sort( groupNodes.begin(), groupNodes.end(), + []( const GroupNode& lhs, const GroupNode& rhs ) { + return lhs.schainIndex < rhs.schainIndex; } ); - s.nodeGroups = nodeGroups; + nodeGroup.nodes = groupNodes; + + array< string, 4 > nodeGroupBlsPublicKey; + auto nodeGroupBlsPublicKeyObj = nodeGroupObj["bls_public_key"].get_obj(); + nodeGroupBlsPublicKey[0] = nodeGroupBlsPublicKeyObj["blsPublicKey0"].get_str(); + nodeGroupBlsPublicKey[1] = nodeGroupBlsPublicKeyObj["blsPublicKey1"].get_str(); + nodeGroupBlsPublicKey[2] = nodeGroupBlsPublicKeyObj["blsPublicKey2"].get_str(); + nodeGroupBlsPublicKey[3] = nodeGroupBlsPublicKeyObj["blsPublicKey3"].get_str(); + nodeGroup.blsPublicKey = nodeGroupBlsPublicKey; + + if ( !nodeGroupObj["finish_ts"].is_null() ) + nodeGroup.finishTs = nodeGroupObj["finish_ts"].get_uint64(); + else + nodeGroup.finishTs = uint64_t( -1 ); + nodeGroups.push_back( nodeGroup ); } + sort( + nodeGroups.begin(), nodeGroups.end(), []( const NodeGroup& lhs, const NodeGroup& rhs ) { + return lhs.finishTs < rhs.finishTs; + } ); + s.nodeGroups = nodeGroups; + } - for ( auto nodeConf : sChainObj.at( "nodes" ).get_array() ) { - auto nodeConfObj = nodeConf.get_obj(); - sChainNode node{}; - node.id = nodeConfObj.at( "nodeID" ).get_uint64(); - node.ip = nodeConfObj.at( "ip" ).get_str(); - node.port = nodeConfObj.at( "basePort" ).get_uint64(); - try { - node.ip6 = nodeConfObj.at( "ip6" ).get_str(); - } catch ( ... ) { - node.ip6 = ""; - } - try { - node.port6 = nodeConfObj.at( "basePort6" ).get_uint64(); - } catch ( ... ) { - node.port6 = 0; - } - node.sChainIndex = nodeConfObj.at( "schainIndex" ).get_uint64(); + for ( auto nodeConf : sChainObj.at( "nodes" ).get_array() ) { + auto nodeConfObj = nodeConf.get_obj(); + sChainNode node{}; + node.id = nodeConfObj.at( "nodeID" ).get_uint64(); + node.ip = nodeConfObj.at( "ip" ).get_str(); + node.port = nodeConfObj.at( "basePort" ).get_uint64(); + try { + node.ip6 = nodeConfObj.at( "ip6" ).get_str(); + } catch ( ... ) { + node.ip6 = ""; + } + try { + node.port6 = nodeConfObj.at( "basePort6" ).get_uint64(); + } catch ( ... ) { + node.port6 = 0; + } + node.sChainIndex = nodeConfObj.at( "schainIndex" ).get_uint64(); + try { + node.publicKey = nodeConfObj.at( "publicKey" ).get_str(); + } catch ( ... ) { + } + if ( !keyShareName.empty() ) { try { - node.publicKey = nodeConfObj.at( "publicKey" ).get_str(); + node.blsPublicKey[0] = nodeConfObj.at( "blsPublicKey0" ).get_str(); + node.blsPublicKey[1] = nodeConfObj.at( "blsPublicKey1" ).get_str(); + node.blsPublicKey[2] = nodeConfObj.at( "blsPublicKey2" ).get_str(); + node.blsPublicKey[3] = nodeConfObj.at( "blsPublicKey3" ).get_str(); } catch ( ... ) { + node.blsPublicKey[0] = ""; + node.blsPublicKey[1] = ""; + node.blsPublicKey[2] = ""; + node.blsPublicKey[3] = ""; } - if ( !keyShareName.empty() ) { - try { - node.blsPublicKey[0] = nodeConfObj.at( "blsPublicKey0" ).get_str(); - node.blsPublicKey[1] = nodeConfObj.at( "blsPublicKey1" ).get_str(); - node.blsPublicKey[2] = nodeConfObj.at( "blsPublicKey2" ).get_str(); - node.blsPublicKey[3] = nodeConfObj.at( "blsPublicKey3" ).get_str(); - } catch ( ... ) { - node.blsPublicKey[0] = ""; - node.blsPublicKey[1] = ""; - node.blsPublicKey[2] = ""; - node.blsPublicKey[3] = ""; - } - } - s.nodes.push_back( node ); } - cp.sChain = s; + s.nodes.push_back( node ); + } + cp.sChain = s; - cp.vecAdminOrigins.clear(); - if ( infoObj.count( "adminOrigins" ) ) { - for ( auto nodeOrigun : infoObj.at( "adminOrigins" ).get_array() ) { - string strOriginWildcardFilter = nodeOrigun.get_str(); - cp.vecAdminOrigins.push_back( strOriginWildcardFilter ); - } - } else { - cp.vecAdminOrigins.push_back( "*" ); + cp.vecAdminOrigins.clear(); + if ( infoObj.count( "adminOrigins" ) ) { + for ( auto nodeOrigun : infoObj.at( "adminOrigins" ).get_array() ) { + string strOriginWildcardFilter = nodeOrigun.get_str(); + cp.vecAdminOrigins.push_back( strOriginWildcardFilter ); } + } else { + cp.vecAdminOrigins.push_back( "*" ); + } } ChainParams ChainParams::loadGenesis( string const& _json ) const { diff --git a/libethereum/Client.cpp b/libethereum/Client.cpp index 0918e83d1..1cd97c9f3 100644 --- a/libethereum/Client.cpp +++ b/libethereum/Client.cpp @@ -1233,8 +1233,8 @@ ExecutionResult Client::call( Address const& _from, u256 _value, Address _dest, // value needed for the call to guaranteed pass // geth does a similar thing, we need to check whether it is fully compatible with // geth - historicBlock.mutableState().mutableHistoricState().addBalance( - _from, ( u256 )( t.gas() * t.gasPrice() + t.value() ) ); + historicBlock.mutableState().mutableHistoricState().addBalance( + _from, ( u256 )( t.gas() * t.gasPrice() + t.value() ) ); ret = historicBlock.executeHistoricCall( bc().lastBlockHashes(), t, nullptr, 0 ); } catch ( ... ) { cwarn << boost::current_exception_diagnostic_information(); From 75dce1fbd43affda7f429df7259b854bc4608279 Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Mon, 8 Apr 2024 19:13:33 +0100 Subject: [PATCH 078/154] SKALED-1583 Format --- libdevcore/LevelDB.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libdevcore/LevelDB.h b/libdevcore/LevelDB.h index 90b3fb307..9674cb9ec 100644 --- a/libdevcore/LevelDB.h +++ b/libdevcore/LevelDB.h @@ -26,8 +26,8 @@ #include #include -#include #include +#include namespace dev::db { class LevelDB : public DatabaseFace { From 4bfa0e2ee2050dd1d50281bad820d986fdc09ac5 Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Tue, 9 Apr 2024 17:28:56 +0100 Subject: [PATCH 079/154] SKALED-1583 Enable full debug API by flag --- skaled/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skaled/main.cpp b/skaled/main.cpp index 57f86caf9..9382c6dda 100644 --- a/skaled/main.cpp +++ b/skaled/main.cpp @@ -1988,7 +1988,7 @@ int main( int argc, char** argv ) try { #else // debug interface is enabled on core node if bEnabledAPIs_debug is true auto pDebugFace = bEnabledAPIs_debug ? - new rpc::Debug( *g_client, &debugInterface, argv_string ) : + new rpc::Debug( *g_client, &debugInterface, argv_string, true ) : nullptr; #endif From 49aa2131117550130de9e7585f71d24cc2fd5e0f Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Wed, 10 Apr 2024 18:59:17 +0100 Subject: [PATCH 080/154] #1719 add tests for new json-rpc methods --- libweb3jsonrpc/Eth.cpp | 59 ++++++++++++- libweb3jsonrpc/Eth.h | 2 +- libweb3jsonrpc/EthFace.h | 13 +-- .../libweb3jsonrpc/WebThreeStubClient.cpp | 35 ++++++++ .../libweb3jsonrpc/WebThreeStubClient.h | 3 + test/unittests/libweb3jsonrpc/jsonrpc.cpp | 88 +++++++++++++++++++ 6 files changed, 189 insertions(+), 11 deletions(-) diff --git a/libweb3jsonrpc/Eth.cpp b/libweb3jsonrpc/Eth.cpp index 4fe715a6b..0bd42958e 100644 --- a/libweb3jsonrpc/Eth.cpp +++ b/libweb3jsonrpc/Eth.cpp @@ -916,13 +916,64 @@ Json::Value Eth::eth_createAccessList( return result; } -Json::Value Eth::eth_feeHistory( - int64_t /*param1*/, const std::string& /*param2*/, const Json::Value& /*param3*/ ) { - return Json::Value( Json::objectValue ); +Json::Value Eth::eth_feeHistory( const std::string& _blockCount, const std::string& _newestBlock, + const Json::Value& _rewardPercentiles ) { + try { + if ( !_rewardPercentiles.isArray() ) + throw std::runtime_error( "Reward percentiles must be a list" ); + + for ( auto p : _rewardPercentiles ) { + if ( !p.isUInt() || p > 100 ) { + throw std::runtime_error( "Percentiles must be positive integers less then 100" ); + } + } + + auto blockCount = jsToU256( _blockCount ); + auto newestBlock = jsToBlockNumber( _newestBlock ); + if ( newestBlock == dev::eth::LatestBlock ) + newestBlock = client()->number(); + + auto result = Json::Value( Json::objectValue ); + dev::u256 oldestBlock; + if ( blockCount > newestBlock ) + oldestBlock = 0; + else + oldestBlock = dev::u256( newestBlock ) - blockCount + 1; + result["oldestBlock"] = toJS( oldestBlock ); + + result["baseFeePerGas"] = Json::Value( Json::arrayValue ); + result["gasUsedRatio"] = Json::Value( Json::arrayValue ); + result["reward"] = Json::Value( Json::arrayValue ); + for ( auto bn = newestBlock; bn > oldestBlock - 1; --bn ) { + auto blockInfo = client()->blockInfo( client()->hashFromNumber( bn ) ); + + if ( blockInfo.timestamp() ) + result["baseFeePerGas"].append( toJS( client()->gasBidPrice( bn ) ) ); + else + result["baseFeePerGas"].append( toJS( 0 ) ); + + double gasUsedRatio = blockInfo.gasUsed().convert_to< double >() / + blockInfo.gasLimit().convert_to< double >(); + Json::Value gasUsedRatioObj = Json::Value( Json::realValue ); + gasUsedRatioObj = gasUsedRatio; + result["gasUsedRatio"].append( gasUsedRatioObj ); + + Json::Value reward = Json::Value( Json::arrayValue ); + reward.resize( _rewardPercentiles.size() ); + for ( Json::Value::ArrayIndex i = 0; i < reward.size(); ++i ) { + reward[i] = toJS( 0 ); + } + result["reward"].append( reward ); + } + + return result; + } catch ( ... ) { + BOOST_THROW_EXCEPTION( JsonRpcException( Errors::ERROR_RPC_INVALID_PARAMS ) ); + } } std::string Eth::eth_maxPriorityFeePerGas() { - return "0x1"; + return "0x0"; } bool Eth::eth_submitWork( string const& _nonce, string const&, string const& _mixHash ) { diff --git a/libweb3jsonrpc/Eth.h b/libweb3jsonrpc/Eth.h index 3e9e0d3d3..57538fbd6 100644 --- a/libweb3jsonrpc/Eth.h +++ b/libweb3jsonrpc/Eth.h @@ -219,7 +219,7 @@ class Eth : public dev::rpc::EthFace, public skutils::json_config_file_accessor virtual Json::Value eth_createAccessList( const Json::Value& param1, const std::string& param2 ) override; virtual Json::Value eth_feeHistory( - int64_t param1, const std::string& param2, const Json::Value& param3 ) override; + const std::string& param1, const std::string& param2, const Json::Value& param3 ) override; virtual std::string eth_maxPriorityFeePerGas() override; void setTransactionDefaults( eth::TransactionSkeleton& _t ); diff --git a/libweb3jsonrpc/EthFace.h b/libweb3jsonrpc/EthFace.h index 7d213e966..c87edf57b 100644 --- a/libweb3jsonrpc/EthFace.h +++ b/libweb3jsonrpc/EthFace.h @@ -217,12 +217,13 @@ class EthFace : public ServerInterface< EthFace > { this->bindAndAddMethod( jsonrpc::Procedure( "eth_chainId", jsonrpc::PARAMS_BY_POSITION, jsonrpc::JSON_STRING, NULL ), &dev::rpc::EthFace::eth_chainIdI ); - this->bindAndAddMethod( - jsonrpc::Procedure( "eth_createAccessList", jsonrpc::PARAMS_BY_POSITION, - jsonrpc::JSON_OBJECT, "param1", jsonrpc::JSON_STRING, NULL ), + this->bindAndAddMethod( jsonrpc::Procedure( "eth_createAccessList", + jsonrpc::PARAMS_BY_POSITION, jsonrpc::JSON_OBJECT, "param1", + jsonrpc::JSON_OBJECT, "param2", jsonrpc::JSON_STRING, NULL ), &dev::rpc::EthFace::eth_createAccessListI ); this->bindAndAddMethod( jsonrpc::Procedure( "eth_feeHistory", jsonrpc::PARAMS_BY_POSITION, - jsonrpc::JSON_ARRAY, "param1", jsonrpc::JSON_OBJECT, NULL ), + jsonrpc::JSON_OBJECT, "param1", jsonrpc::JSON_STRING, "param2", + jsonrpc::JSON_STRING, "param3", jsonrpc::JSON_ARRAY, NULL ), &dev::rpc::EthFace::eth_feeHistoryI ); this->bindAndAddMethod( jsonrpc::Procedure( "eth_maxPriorityFeePerGas", jsonrpc::PARAMS_BY_POSITION, jsonrpc::JSON_STRING, NULL ), @@ -449,7 +450,7 @@ class EthFace : public ServerInterface< EthFace > { BOOST_THROW_EXCEPTION( jsonrpc::JsonRpcException( jsonrpc::Errors::ERROR_RPC_INVALID_PARAMS ) ); response = - this->eth_feeHistory( request[0u].asInt64(), request[1u].asString(), request[2u] ); + this->eth_feeHistory( request[0u].asString(), request[1u].asString(), request[2u] ); } inline virtual void eth_maxPriorityFeePerGasI( const Json::Value& request, Json::Value& response ) { @@ -524,7 +525,7 @@ class EthFace : public ServerInterface< EthFace > { virtual Json::Value eth_createAccessList( const Json::Value& param1, const std::string& param2 ) = 0; virtual Json::Value eth_feeHistory( - int64_t param1, const std::string& param2, const Json::Value& param3 ) = 0; + const std::string& param1, const std::string& param2, const Json::Value& param3 ) = 0; virtual std::string eth_maxPriorityFeePerGas() = 0; }; diff --git a/test/unittests/libweb3jsonrpc/WebThreeStubClient.cpp b/test/unittests/libweb3jsonrpc/WebThreeStubClient.cpp index 680bdb57e..d41d85927 100644 --- a/test/unittests/libweb3jsonrpc/WebThreeStubClient.cpp +++ b/test/unittests/libweb3jsonrpc/WebThreeStubClient.cpp @@ -810,6 +810,41 @@ bool WebThreeStubClient::eth_notePassword( const std::string& param1 ) { jsonrpc::Errors::ERROR_CLIENT_INVALID_RESPONSE, result.toStyledString() ); } +std::string WebThreeStubClient::eth_maxPriorityFeePerGas() { + Json::Value p; + Json::Value result = this->CallMethod( "eth_maxPriorityFeePerGas", p ); + if ( result.isString() ) + return result.asString(); + else + throw jsonrpc::JsonRpcException( + jsonrpc::Errors::ERROR_CLIENT_INVALID_RESPONSE, result.toStyledString() ); +} + +Json::Value WebThreeStubClient::eth_createAccessList( const Json::Value& param1, const std::string& param2 ) { + Json::Value p; + p.append( param1 ); + p.append( param2 ); + Json::Value result = this->CallMethod( "eth_createAccessList", p ); + if ( result.isObject() ) + return result; + else + throw jsonrpc::JsonRpcException( + jsonrpc::Errors::ERROR_CLIENT_INVALID_RESPONSE, result.toStyledString() ); +} + +Json::Value WebThreeStubClient::eth_feeHistory( const std::string& param1, const std::string& param2, const Json::Value& param3 ) { + Json::Value p; + p.append( param1 ); + p.append( param2 ); + p.append( param3 ); + Json::Value result = this->CallMethod( "eth_feeHistory", p ); + if ( result.isObject() ) + return result; + else + throw jsonrpc::JsonRpcException( + jsonrpc::Errors::ERROR_CLIENT_INVALID_RESPONSE, result.toStyledString() ); +} + bool WebThreeStubClient::db_put( const std::string& param1, const std::string& param2, const std::string& param3 ) { Json::Value p; diff --git a/test/unittests/libweb3jsonrpc/WebThreeStubClient.h b/test/unittests/libweb3jsonrpc/WebThreeStubClient.h index 6385a340d..b23fb20ab 100644 --- a/test/unittests/libweb3jsonrpc/WebThreeStubClient.h +++ b/test/unittests/libweb3jsonrpc/WebThreeStubClient.h @@ -95,6 +95,9 @@ class WebThreeStubClient : public jsonrpc::Client { Json::Value setSchainExitTime( const Json::Value& param1 ) noexcept( false ); Json::Value eth_inspectTransaction( const std::string& param1 ) noexcept( false ); std::string eth_sendRawTransaction( const std::string& param1 ) noexcept( false ); + std::string eth_maxPriorityFeePerGas() noexcept( false ); + Json::Value eth_createAccessList( const Json::Value& param1, const std::string& param2 ) noexcept( false ); + Json::Value eth_feeHistory( const std::string& param1, const std::string& param2, const Json::Value& param3 ) noexcept( false ); bool eth_notePassword( const std::string& param1 ) noexcept( false ); bool db_put( const std::string& param1, const std::string& param2, const std::string& param3 ) noexcept( false ); diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index 5568849e5..503657be0 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -2812,6 +2812,94 @@ BOOST_AUTO_TEST_CASE( eip1559Transactions ) { BOOST_REQUIRE( result["maxFeePerGas"] == "0x4a817c800" ); } +BOOST_AUTO_TEST_CASE( eip2930RpcMethods ) { + std::string _config = c_genesisConfigString; + Json::Value ret; + Json::Reader().parse( _config, ret ); + + // Set chainID = 151 + ret["params"]["chainID"] = "0x97"; + + Json::FastWriter fastWriter; + std::string config = fastWriter.write( ret ); + JsonRpcFixture fixture( config ); + + dev::eth::simulateMining( *( fixture.client ), 20 ); + string senderAddress = toJS(fixture.coinbase.address()); + + Json::Value txRefill; + txRefill["to"] = "0x5EdF1e852fdD1B0Bc47C0307EF755C76f4B9c251"; + txRefill["from"] = senderAddress; + txRefill["gas"] = "100000"; + txRefill["gasPrice"] = fixture.rpcClient->eth_gasPrice(); + txRefill["value"] = 1000000; + string txHash = fixture.rpcClient->eth_sendTransaction( txRefill ); + dev::eth::mineTransaction( *( fixture.client ), 1 ); + + Json::Value receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); + BOOST_REQUIRE( receipt["status"] == string( "0x1" ) ); + BOOST_REQUIRE( receipt["type"] == "0x0" ); + + auto accessList = fixture.rpcClient->eth_createAccessList( txRefill, "latest" ); + BOOST_REQUIRE( accessList.isMember( "accessList" ) && accessList.isMember( "gasUsed" ) ); + BOOST_REQUIRE( accessList["accessList"].isArray() && accessList["accessList"].size() == 0 ); + BOOST_REQUIRE( accessList["gasUsed"].isString() ); +} + +BOOST_AUTO_TEST_CASE( eip1559RpcMethods ) { + std::string _config = c_genesisConfigString; + Json::Value ret; + Json::Reader().parse( _config, ret ); + + // Set chainID = 151 + ret["params"]["chainID"] = "0x97"; + + Json::FastWriter fastWriter; + std::string config = fastWriter.write( ret ); + JsonRpcFixture fixture( config ); + + dev::eth::simulateMining( *( fixture.client ), 20 ); + string senderAddress = toJS(fixture.coinbase.address()); + + Json::Value txRefill; + txRefill["to"] = "0x5EdF1e852fdD1B0Bc47C0307EF755C76f4B9c251"; + txRefill["from"] = senderAddress; + txRefill["gas"] = "100000"; + txRefill["gasPrice"] = fixture.rpcClient->eth_gasPrice(); + txRefill["value"] = 100000000000000000; + for (size_t i = 0; i < 10; ++i) { + // mine 10 blocks + string txHash = fixture.rpcClient->eth_sendTransaction( txRefill ); + dev::eth::mineTransaction( *( fixture.client ), 1 ); + } + + BOOST_REQUIRE( fixture.rpcClient->eth_maxPriorityFeePerGas() == "0x0" ); + + auto bn = fixture.client->number(); + + Json::Value percentiles = Json::Value( Json::arrayValue ); + percentiles.resize( 2 ); + percentiles[0] = 20; + percentiles[1] = 80; + + size_t blockCnt = 3; + auto feeHistory = fixture.rpcClient->eth_feeHistory( toJS( blockCnt ), "latest", percentiles ); + + BOOST_REQUIRE( feeHistory["oldestBlock"] == toJS( bn - blockCnt + 1 ) ); + + BOOST_REQUIRE( feeHistory.isMember( "baseFeePerGas" ) ); + BOOST_REQUIRE( feeHistory["baseFeePerGas"].isArray() ); + + for (Json::Value::ArrayIndex i = 0; i < blockCnt; ++i) { + BOOST_REQUIRE( feeHistory["baseFeePerGas"][i].isString() ); + BOOST_REQUIRE_GT( feeHistory["gasUsedRatio"][i].asDouble(), 0 ); + BOOST_REQUIRE_GT( 1, feeHistory["gasUsedRatio"][i].asDouble() ); + for ( Json::Value::ArrayIndex j = 0; j < percentiles.size(); ++j ) { + BOOST_REQUIRE_EQUAL( feeHistory["reward"][i][j].asString(), toJS( 0 ) ); + } + } +} + BOOST_AUTO_TEST_CASE( etherbase_generation2 ) { JsonRpcFixture fixture(c_genesisGeneration2ConfigString, false, false, true); string etherbase = fixture.rpcClient->eth_coinbase(); From 4eb22fcfb4a262d7b44a730cd92636f094f4d530 Mon Sep 17 00:00:00 2001 From: DmytroNazarenko Date: Fri, 12 Apr 2024 17:10:32 +0000 Subject: [PATCH 081/154] Rename patches in SchainPatch --- libethereum/SchainPatch.h | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/libethereum/SchainPatch.h b/libethereum/SchainPatch.h index 2a79863a2..d8fabce97 100644 --- a/libethereum/SchainPatch.h +++ b/libethereum/SchainPatch.h @@ -36,20 +36,20 @@ class SchainPatch { static std::atomic< time_t > committedBlockTimestamp; }; -#define DEFINE_AMNESIC_PATCH( BlaBlaPatch ) \ - class BlaBlaPatch : public SchainPatch { \ +#define DEFINE_AMNESIC_PATCH( CustomPatch ) \ + class CustomPatch : public SchainPatch { \ public: \ - static SchainPatchEnum getEnum() { return SchainPatchEnum::BlaBlaPatch; } \ + static SchainPatchEnum getEnum() { return SchainPatchEnum::CustomPatch; } \ static bool isEnabledInWorkingBlock() { \ return isPatchEnabledInWorkingBlock( getEnum() ); \ } \ }; // TODO One more overload - with EnvInfo? -#define DEFINE_SIMPLE_PATCH( BlaBlaPatch ) \ - class BlaBlaPatch : public SchainPatch { \ +#define DEFINE_SIMPLE_PATCH( CustomPatch ) \ + class CustomPatch : public SchainPatch { \ public: \ - static SchainPatchEnum getEnum() { return SchainPatchEnum::BlaBlaPatch; } \ + static SchainPatchEnum getEnum() { return SchainPatchEnum::CustomPatch; } \ static bool isEnabledInWorkingBlock() { \ return isPatchEnabledInWorkingBlock( getEnum() ); \ } \ @@ -58,10 +58,10 @@ class SchainPatch { } \ }; -#define DEFINE_EVM_PATCH( BlaBlaPatch ) \ - class BlaBlaPatch : public SchainPatch { \ +#define DEFINE_EVM_PATCH( CustomPatch ) \ + class CustomPatch : public SchainPatch { \ public: \ - static SchainPatchEnum getEnum() { return SchainPatchEnum::BlaBlaPatch; } \ + static SchainPatchEnum getEnum() { return SchainPatchEnum::CustomPatch; } \ static bool isEnabledInWorkingBlock() { \ return isPatchEnabledInWorkingBlock( getEnum() ); \ } \ From 5233f5f475dea44101e9c0a7b1380bbe1f895a61 Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Mon, 15 Apr 2024 17:22:19 +0100 Subject: [PATCH 082/154] #1719 add more tests --- libethcore/TransactionBase.cpp | 8 ++++---- libweb3jsonrpc/JsonHelper.cpp | 19 +++++++++++++++++++ .../libweb3jsonrpc/WebThreeStubClient.cpp | 10 ++++++++++ .../libweb3jsonrpc/WebThreeStubClient.h | 1 + test/unittests/libweb3jsonrpc/jsonrpc.cpp | 16 +++++++++++++++- 5 files changed, 49 insertions(+), 5 deletions(-) diff --git a/libethcore/TransactionBase.cpp b/libethcore/TransactionBase.cpp index cf50ea140..33bfd709e 100644 --- a/libethcore/TransactionBase.cpp +++ b/libethcore/TransactionBase.cpp @@ -202,12 +202,12 @@ TransactionBase TransactionBase::makeType1Transaction( if ( _checkSig == CheckTransaction::Everything ) m_sender = sender(); - m_txType = TransactionType::Type1; - if ( rlp.itemCount() > 11 ) BOOST_THROW_EXCEPTION( InvalidTransactionFormat() << errinfo_comment( "too many fields in the transaction RLP" ) ); + m_txType = TransactionType::Type1; + TransactionBase t( *this ); return t; } catch ( Exception& _e ) { @@ -271,12 +271,12 @@ TransactionBase TransactionBase::makeType2Transaction( if ( _checkSig == CheckTransaction::Everything ) m_sender = sender(); - m_txType = TransactionType::Type2; - if ( rlp.itemCount() > 12 ) BOOST_THROW_EXCEPTION( InvalidTransactionFormat() << errinfo_comment( "too many fields in the transaction RLP" ) ); + m_txType = TransactionType::Type2; + TransactionBase t( *this ); return t; } catch ( Exception& _e ) { diff --git a/libweb3jsonrpc/JsonHelper.cpp b/libweb3jsonrpc/JsonHelper.cpp index 012352a8e..844a1ffec 100644 --- a/libweb3jsonrpc/JsonHelper.cpp +++ b/libweb3jsonrpc/JsonHelper.cpp @@ -348,6 +348,25 @@ Json::Value toJson( dev::eth::Transaction const& _t ) { res["r"] = toJS( _t.signature().r ); res["s"] = toJS( _t.signature().s ); res["v"] = toJS( _t.signature().v ); + res["type"] = toJS( int( _t.txType() ) ); + if ( _t.txType() != dev::eth::TransactionType::Legacy ) { + res["yParity"] = res["v"].asString(); + res["accessList"] = Json::Value( Json::arrayValue ); + for ( const auto& d : _t.accessList() ) { + auto list = d.toList(); + Json::Value accessList; + accessList["address"] = dev::toHexPrefixed( list[0].toBytes() ); + accessList["storageKeys"] = Json::Value( Json::arrayValue ); + for ( const auto& k : list[1].toList() ) { + accessList["storageKeys"].append( dev::toHexPrefixed( k.toBytes() ) ); + } + res["accessList"].append( accessList ); + } + if ( _t.txType() != dev::eth::TransactionType::Type1 ) { + res["maxPriorityFeePerGas"] = toJS( _t.maxPriorityFeePerGas() ); + res["maxFeePerGas"] = toJS( _t.maxPriorityFeePerGas() ); + } + } } res["hash"] = toJS( _t.sha3( WithSignature ) ); diff --git a/test/unittests/libweb3jsonrpc/WebThreeStubClient.cpp b/test/unittests/libweb3jsonrpc/WebThreeStubClient.cpp index d41d85927..046a67e90 100644 --- a/test/unittests/libweb3jsonrpc/WebThreeStubClient.cpp +++ b/test/unittests/libweb3jsonrpc/WebThreeStubClient.cpp @@ -810,6 +810,16 @@ bool WebThreeStubClient::eth_notePassword( const std::string& param1 ) { jsonrpc::Errors::ERROR_CLIENT_INVALID_RESPONSE, result.toStyledString() ); } +Json::Value WebThreeStubClient::eth_pendingTransactions() { + Json::Value p; + Json::Value result = this->CallMethod( "eth_pendingTransactions", p ); + if ( result.isArray() ) + return result; + else + throw jsonrpc::JsonRpcException( + jsonrpc::Errors::ERROR_CLIENT_INVALID_RESPONSE, result.toStyledString() ); +} + std::string WebThreeStubClient::eth_maxPriorityFeePerGas() { Json::Value p; Json::Value result = this->CallMethod( "eth_maxPriorityFeePerGas", p ); diff --git a/test/unittests/libweb3jsonrpc/WebThreeStubClient.h b/test/unittests/libweb3jsonrpc/WebThreeStubClient.h index b23fb20ab..2f144a25e 100644 --- a/test/unittests/libweb3jsonrpc/WebThreeStubClient.h +++ b/test/unittests/libweb3jsonrpc/WebThreeStubClient.h @@ -94,6 +94,7 @@ class WebThreeStubClient : public jsonrpc::Client { Json::Value eth_unsubscribe( const Json::Value& param1 ) noexcept( false ); Json::Value setSchainExitTime( const Json::Value& param1 ) noexcept( false ); Json::Value eth_inspectTransaction( const std::string& param1 ) noexcept( false ); + Json::Value eth_pendingTransactions() noexcept( false ); std::string eth_sendRawTransaction( const std::string& param1 ) noexcept( false ); std::string eth_maxPriorityFeePerGas() noexcept( false ); Json::Value eth_createAccessList( const Json::Value& param1, const std::string& param2 ) noexcept( false ); diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index 503657be0..771c1faf7 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -2642,6 +2642,10 @@ BOOST_AUTO_TEST_CASE( eip2930Transactions ) { // send 1 WEI from 0xc868AF52a6549c773082A334E5AE232e0Ea3B513 to 0x7D36aF85A184E220A656525fcBb9A63B9ab3C12b // encoded type 1 txn txHash = fixture.rpcClient->eth_sendRawTransaction( "0x01f8678197808504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180c001a01ebdc546c8b85511b7ba831f47c4981069d7af972d10b7dce2c57225cb5df6a7a055ae1e84fea41d37589eb740a0a93017a5cd0e9f10ee50f165bf4b1b4c78ddae" ); + auto pendingTransactions = fixture.rpcClient->eth_pendingTransactions(); + BOOST_REQUIRE( pendingTransactions.isArray() && pendingTransactions.size() == 1); + BOOST_REQUIRE( pendingTransactions[0]["type"] == "0x1" ); + BOOST_REQUIRE( pendingTransactions[0].isMember( "yParity" ) && pendingTransactions[0].isMember( "accessList" ) ); dev::eth::mineTransaction( *( fixture.client ), 1 ); // compare with txn hash from geth @@ -2693,6 +2697,10 @@ BOOST_AUTO_TEST_CASE( eip2930Transactions ) { // now the same txn with accessList and increased nonce // [ { 'address': HexBytes( "0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae" ), 'storageKeys': ( "0x0000000000000000000000000000000000000000000000000000000000000003", "0x0000000000000000000000000000000000000000000000000000000000000007" ) } ] txHash = fixture.rpcClient->eth_sendRawTransaction( "0x01f8c38197018504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000000780a0b03eaf481958e22fc39bd1d526eb9255be1e6625614f02ca939e51c3d7e64bcaa05f675640c04bb050d27bd1f39c07b6ff742311b04dab760bb3bc206054332879" ); + pendingTransactions = fixture.rpcClient->eth_pendingTransactions(); + BOOST_REQUIRE( pendingTransactions.isArray() && pendingTransactions.size() == 1); + BOOST_REQUIRE( pendingTransactions[0]["type"] == "0x1" ); + BOOST_REQUIRE( pendingTransactions[0].isMember( "yParity" ) && pendingTransactions[0].isMember( "accessList" ) ); dev::eth::mineTransaction( *( fixture.client ), 1 ); // compare with txn hash from geth @@ -2759,12 +2767,18 @@ BOOST_AUTO_TEST_CASE( eip1559Transactions ) { BOOST_REQUIRE( fixture.rpcClient->eth_getBalance( "0x5EdF1e852fdD1B0Bc47C0307EF755C76f4B9c251", "latest" ) == "0x16345785d8a0000" ); // send 1 WEI from 0x5EdF1e852fdD1B0Bc47C0307EF755C76f4B9c251 to 0x7D36aF85A184E220A656525fcBb9A63B9ab3C12b - // encoded type 1 txn + // encoded type 2 txn txHash = fixture.rpcClient->eth_sendRawTransaction( "0x02f8c98197808504a817c8008504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000000780a0f1a407dfc1a9f782001d89f617e9b3a2f295378533784fb39960dea60beea2d0a05ac3da2946554ba3d5721850f4f89ee7a0c38e4acab7130908e7904d13174388" ); + auto pendingTransactions = fixture.rpcClient->eth_pendingTransactions(); + BOOST_REQUIRE( pendingTransactions.isArray() && pendingTransactions.size() == 1); + BOOST_REQUIRE( pendingTransactions[0]["type"] == "0x2" ); + BOOST_REQUIRE( pendingTransactions[0].isMember( "yParity" ) && pendingTransactions[0].isMember( "accessList" ) ); + BOOST_REQUIRE( pendingTransactions[0].isMember( "maxFeePerGas" ) && pendingTransactions[0].isMember( "maxPriorityFeePerGas" ) ); dev::eth::mineTransaction( *( fixture.client ), 1 ); // compare with txn hash from geth BOOST_REQUIRE( txHash == "0x7bd586e93e3012577de4ba33e3b887baf520cbb92c5dd10996b262f9c5c8f747" ); + std::cout << dev::toHexPrefixed( fixture.client->transactions( 3 )[0].rlp() ) << '\n'; BOOST_REQUIRE( dev::toHexPrefixed( fixture.client->transactions( 3 )[0].rlp() ) == "0x02f8c98197808504a817c8008504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000000780a0f1a407dfc1a9f782001d89f617e9b3a2f295378533784fb39960dea60beea2d0a05ac3da2946554ba3d5721850f4f89ee7a0c38e4acab7130908e7904d13174388" ); BOOST_REQUIRE( fixture.rpcClient->eth_getBalance( "0x7D36aF85A184E220A656525fcBb9A63B9ab3C12b", "latest" ) == "0x1" ); From fcd17363b7d0cf134b622999e9c0a3539110aad5 Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Mon, 15 Apr 2024 19:24:38 +0100 Subject: [PATCH 083/154] #1719 fix accessList in transaction object --- libethcore/TransactionBase.cpp | 24 +++++++++++++++++++----- libethcore/TransactionBase.h | 7 ++++--- libweb3jsonrpc/JsonHelper.cpp | 6 +++--- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/libethcore/TransactionBase.cpp b/libethcore/TransactionBase.cpp index 33bfd709e..a89eaf110 100644 --- a/libethcore/TransactionBase.cpp +++ b/libethcore/TransactionBase.cpp @@ -36,16 +36,17 @@ using namespace std; using namespace dev; using namespace dev::eth; -RLPs validateAccessListRLP( const RLP& data ) { +std::vector< bytes > validateAccessListRLP( const RLP& data ) { if ( !data.isList() ) BOOST_THROW_EXCEPTION( InvalidTransactionFormat() << errinfo_comment( "transaction accessList RLP must be a list" ) ); auto rlpList = data.toList(); if ( rlpList.empty() ) { // empty accessList, ignore it - return rlpList; + return {}; } + for ( const auto& d : rlpList ) { if ( !d.isList() ) BOOST_THROW_EXCEPTION( InvalidTransactionFormat() << errinfo_comment( @@ -65,7 +66,12 @@ RLPs validateAccessListRLP( const RLP& data ) { "transaction storageKeys RLP must be a list of byte array" ) ); } - return rlpList; + std::vector< bytes > accessList( rlpList.size() ); + for ( size_t i = 0; i < rlpList.size(); ++i ) { + accessList[i] = rlpList.at( i ).data().toBytes(); + } + + return accessList; } TransactionBase::TransactionBase( TransactionSkeleton const& _ts, Secret const& _s ) @@ -416,7 +422,11 @@ void TransactionBase::streamType1Transaction( RLPStream& _s, IncludeSignature _s _s << ""; _s << m_value << m_data; - _s << m_accessList; + dev::RLPs accessList( m_accessList.size() ); + for ( size_t i = 0; i < m_accessList.size(); ++i ) { + accessList[i] = RLP( m_accessList[i] ); + } + _s << accessList; if ( _sig ) _s << ( u256 ) m_vrs->v << ( u256 ) m_vrs->r << ( u256 ) m_vrs->s; @@ -431,7 +441,11 @@ void TransactionBase::streamType2Transaction( RLPStream& _s, IncludeSignature _s _s << ""; _s << m_value << m_data; - _s << m_accessList; + dev::RLPs accessList( m_accessList.size() ); + for ( size_t i = 0; i < m_accessList.size(); ++i ) { + accessList[i] = RLP( m_accessList[i] ); + } + _s << accessList; if ( _sig ) _s << ( u256 ) m_vrs->v << ( u256 ) m_vrs->r << ( u256 ) m_vrs->s; diff --git a/libethcore/TransactionBase.h b/libethcore/TransactionBase.h index 0f262fac6..55968a8e2 100644 --- a/libethcore/TransactionBase.h +++ b/libethcore/TransactionBase.h @@ -260,7 +260,7 @@ class TransactionBase { TransactionType txType() const { return m_txType; } - RLPs accessList() const { return m_accessList; } + std::vector< bytes > accessList() const { return m_accessList; } u256 maxPriorityFeePerGas() const { return m_maxPriorityFeePerGas; } @@ -302,8 +302,9 @@ class TransactionBase { bytes m_data; ///< The data associated with the transaction, or the initialiser if it's a ///< creation transaction. bytes m_rawData; - RLPs m_accessList; ///< The access list. see more https://eips.ethereum.org/EIPS/eip-2930. Not - ///< valid for legacy txns + std::vector< bytes > m_accessList; ///< The access list. see more + ///< https://eips.ethereum.org/EIPS/eip-2930. Not valid for + ///< legacy txns u256 m_maxPriorityFeePerGas; ///< The maximum priority fee per gas. Only valid for type2 txns u256 m_maxFeePerGas; ///< The maximum fee per gas. Only valid for type2 txns diff --git a/libweb3jsonrpc/JsonHelper.cpp b/libweb3jsonrpc/JsonHelper.cpp index 844a1ffec..ef97db47e 100644 --- a/libweb3jsonrpc/JsonHelper.cpp +++ b/libweb3jsonrpc/JsonHelper.cpp @@ -110,7 +110,7 @@ Json::Value toJson( dev::eth::Transaction const& _t, std::pair< h256, unsigned > res["yParity"] = res["v"].asString(); res["accessList"] = Json::Value( Json::arrayValue ); for ( const auto& d : _t.accessList() ) { - auto list = d.toList(); + auto list = RLP( d ); Json::Value accessList; accessList["address"] = dev::toHexPrefixed( list[0].toBytes() ); accessList["storageKeys"] = Json::Value( Json::arrayValue ); @@ -353,7 +353,7 @@ Json::Value toJson( dev::eth::Transaction const& _t ) { res["yParity"] = res["v"].asString(); res["accessList"] = Json::Value( Json::arrayValue ); for ( const auto& d : _t.accessList() ) { - auto list = d.toList(); + auto list = RLP( d ); Json::Value accessList; accessList["address"] = dev::toHexPrefixed( list[0].toBytes() ); accessList["storageKeys"] = Json::Value( Json::arrayValue ); @@ -405,7 +405,7 @@ Json::Value toJson( dev::eth::LocalisedTransaction const& _t ) { res["yParity"] = res["v"].asString(); res["accessList"] = Json::Value( Json::arrayValue ); for ( const auto& d : _t.accessList() ) { - auto list = d.toList(); + auto list = RLP( d ); Json::Value accessList; accessList["address"] = dev::toHexPrefixed( list[0].toBytes() ); accessList["storageKeys"] = Json::Value( Json::arrayValue ); From 45bac482070e0dc30ee4f2a17ec32ec20b5e41b4 Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Mon, 15 Apr 2024 19:30:13 +0100 Subject: [PATCH 084/154] #1719 fix accessList in transaction object --- libethcore/TransactionBase.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/libethcore/TransactionBase.cpp b/libethcore/TransactionBase.cpp index a89eaf110..ffb0a2350 100644 --- a/libethcore/TransactionBase.cpp +++ b/libethcore/TransactionBase.cpp @@ -74,6 +74,14 @@ std::vector< bytes > validateAccessListRLP( const RLP& data ) { return accessList; } +dev::RLPs accessListToRLPs( const std::vector< bytes >& _accessList ) { + dev::RLPs accessList( _accessList.size() ); + for ( size_t i = 0; i < _accessList.size(); ++i ) { + accessList[i] = RLP( _accessList[i] ); + } + return accessList; +} + TransactionBase::TransactionBase( TransactionSkeleton const& _ts, Secret const& _s ) : m_nonce( _ts.nonce ), m_value( _ts.value ), @@ -422,11 +430,7 @@ void TransactionBase::streamType1Transaction( RLPStream& _s, IncludeSignature _s _s << ""; _s << m_value << m_data; - dev::RLPs accessList( m_accessList.size() ); - for ( size_t i = 0; i < m_accessList.size(); ++i ) { - accessList[i] = RLP( m_accessList[i] ); - } - _s << accessList; + _s << accessListToRLPs( m_accessList ); if ( _sig ) _s << ( u256 ) m_vrs->v << ( u256 ) m_vrs->r << ( u256 ) m_vrs->s; @@ -441,11 +445,7 @@ void TransactionBase::streamType2Transaction( RLPStream& _s, IncludeSignature _s _s << ""; _s << m_value << m_data; - dev::RLPs accessList( m_accessList.size() ); - for ( size_t i = 0; i < m_accessList.size(); ++i ) { - accessList[i] = RLP( m_accessList[i] ); - } - _s << accessList; + _s << accessListToRLPs( m_accessList ); if ( _sig ) _s << ( u256 ) m_vrs->v << ( u256 ) m_vrs->r << ( u256 ) m_vrs->s; From 057d494ca12c182ab23af6d68c1cb8e87722756b Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Mon, 15 Apr 2024 20:05:31 +0100 Subject: [PATCH 085/154] SKALED-1719 Some code rearrangement --- libethcore/TransactionBase.cpp | 31 ++++++++----------------------- libethcore/TransactionBase.h | 15 ++++++--------- 2 files changed, 14 insertions(+), 32 deletions(-) diff --git a/libethcore/TransactionBase.cpp b/libethcore/TransactionBase.cpp index 33bfd709e..cdbe872b9 100644 --- a/libethcore/TransactionBase.cpp +++ b/libethcore/TransactionBase.cpp @@ -81,7 +81,7 @@ TransactionBase::TransactionBase( TransactionSkeleton const& _ts, Secret const& sign( _s ); } -TransactionBase TransactionBase::makeLegacyTransaction( +void TransactionBase::fillFromRlpLegacy( bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid ) { RLP const rlp( _rlpData ); try { @@ -141,9 +141,6 @@ TransactionBase TransactionBase::makeLegacyTransaction( BOOST_THROW_EXCEPTION( InvalidTransactionFormat() << errinfo_comment( "too many fields in the transaction RLP" ) ); // XXX Strange "catch"-s %) - - TransactionBase t( *this ); - return t; } catch ( Exception& _e ) { _e << errinfo_name( "invalid transaction format: " + toString( rlp ) + " RLP: " + toHex( rlp.data() ) ); @@ -154,13 +151,11 @@ TransactionBase TransactionBase::makeLegacyTransaction( throw; else { cwarn << _e.what(); - TransactionBase t( *this ); - return t; } } } -TransactionBase TransactionBase::makeType1Transaction( +void TransactionBase::fillFromRlpType1( bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid ) { bytes croppedRlp( _rlpData.begin() + 1, _rlpData.end() ); RLP const rlp( croppedRlp ); @@ -207,9 +202,6 @@ TransactionBase TransactionBase::makeType1Transaction( << errinfo_comment( "too many fields in the transaction RLP" ) ); m_txType = TransactionType::Type1; - - TransactionBase t( *this ); - return t; } catch ( Exception& _e ) { _e << errinfo_name( "invalid transaction format: " + toString( rlp ) + " RLP: " + toHex( rlp.data() ) ); @@ -220,13 +212,11 @@ TransactionBase TransactionBase::makeType1Transaction( throw; else { cwarn << _e.what(); - TransactionBase t( *this ); - return t; } } } -TransactionBase TransactionBase::makeType2Transaction( +void TransactionBase::fillFromRlpType2( bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid ) { bytes croppedRlp( _rlpData.begin() + 1, _rlpData.end() ); RLP const rlp( croppedRlp ); @@ -276,9 +266,6 @@ TransactionBase TransactionBase::makeType2Transaction( << errinfo_comment( "too many fields in the transaction RLP" ) ); m_txType = TransactionType::Type2; - - TransactionBase t( *this ); - return t; } catch ( Exception& _e ) { _e << errinfo_name( "invalid transaction format: " + toString( rlp ) + " RLP: " + toHex( rlp.data() ) ); @@ -289,23 +276,21 @@ TransactionBase TransactionBase::makeType2Transaction( throw; else { cwarn << _e.what(); - TransactionBase t( *this ); - return t; } } } -TransactionBase::TransactionBase( +void TransactionBase::fillFromRlpByType( bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid, TransactionType type ) { switch ( type ) { case TransactionType::Legacy: - *this = makeLegacyTransaction( _rlpData, _checkSig, _allowInvalid ); + fillFromRlpLegacy( _rlpData, _checkSig, _allowInvalid ); break; case TransactionType::Type1: - *this = makeType1Transaction( _rlpData, _checkSig, _allowInvalid ); + fillFromRlpType1( _rlpData, _checkSig, _allowInvalid ); break; case TransactionType::Type2: - *this = makeType2Transaction( _rlpData, _checkSig, _allowInvalid ); + fillFromRlpType2( _rlpData, _checkSig, _allowInvalid ); break; default: BOOST_THROW_EXCEPTION( @@ -327,7 +312,7 @@ TransactionBase::TransactionBase( MICROPROFILE_SCOPEI( "TransactionBase", "ctor", MP_GOLD2 ); try { TransactionType txnType = getTransactionType( _rlpData ); - *this = TransactionBase( _rlpData, _checkSig, _allowInvalid, txnType ); + fillFromRlpByType( _rlpData, _checkSig, _allowInvalid, txnType ); } catch ( ... ) { m_type = Type::Invalid; RLPStream s; diff --git a/libethcore/TransactionBase.h b/libethcore/TransactionBase.h index 0f262fac6..accdeb2ae 100644 --- a/libethcore/TransactionBase.h +++ b/libethcore/TransactionBase.h @@ -106,10 +106,6 @@ class TransactionBase { bytes const& _rlp, CheckTransaction _checkSig, bool _allowInvalid = false ) : TransactionBase( &_rlp, _checkSig, _allowInvalid ) {} - /// Constructs a transaction from the given RLP and transaction type. - TransactionBase( bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid, - TransactionType type ); - TransactionBase( TransactionBase const& ) = default; /// Checks equality of transactions. @@ -313,12 +309,13 @@ class TransactionBase { private: static TransactionType getTransactionType( bytesConstRef _rlp ); - TransactionBase makeLegacyTransaction( - bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid ); - TransactionBase makeType1Transaction( - bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid ); - TransactionBase makeType2Transaction( + /// Constructs a transaction from the given RLP and transaction type. + void fillFromRlpByType( bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid, + TransactionType type ); + void fillFromRlpLegacy( bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid ); + void fillFromRlpType1( bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid ); + void fillFromRlpType2( bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid ); void streamLegacyTransaction( RLPStream& _s, IncludeSignature _sig, bool _forEip155hash ) const; void streamType1Transaction( RLPStream& _s, IncludeSignature _sig ) const; From 62b56b323d70e6bee2184c6cba1c9f88aabe2dc8 Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Tue, 16 Apr 2024 15:51:58 +0100 Subject: [PATCH 086/154] SKALED-1583 Some polishing --- libethereum/ClientBase.cpp | 12 +++++++----- libethereum/SkaleHost.cpp | 20 ++++++++++---------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/libethereum/ClientBase.cpp b/libethereum/ClientBase.cpp index 193ae71d6..bc88f0e34 100644 --- a/libethereum/ClientBase.cpp +++ b/libethereum/ClientBase.cpp @@ -117,11 +117,13 @@ std::pair< u256, ExecutionResult > ClientBase::estimateGas( Address const& _from int64_t upperBound = _maxGas; if ( upperBound == Invalid256 || upperBound > c_maxGasEstimate ) upperBound = c_maxGasEstimate; - int64_t lowerBound = CorrectForkInPowPatch::isEnabledInWorkingBlock() ? - Transaction::baseGasRequired( !_dest, &_data, - bc().sealEngine()->chainParams().makeEvmSchedule( - bc().info().timestamp(), bc().number() ) ) : - Transaction::baseGasRequired( !_dest, &_data, EVMSchedule() ); + int64_t lowerBound; + if ( CorrectForkInPowPatch::isEnabledInWorkingBlock() ) + lowerBound = Transaction::baseGasRequired( !_dest, &_data, + bc().sealEngine()->chainParams().makeEvmSchedule( + bc().info().timestamp(), bc().number() ) ); + else + lowerBound = Transaction::baseGasRequired( !_dest, &_data, EVMSchedule() ); Block latest = latestBlock(); Block pending = preSeal(); diff --git a/libethereum/SkaleHost.cpp b/libethereum/SkaleHost.cpp index 1e0c0bf27..7988705e8 100644 --- a/libethereum/SkaleHost.cpp +++ b/libethereum/SkaleHost.cpp @@ -431,9 +431,10 @@ ConsensusExtFace::transactions_vector SkaleHost::pendingTransactions( m_debugTracer.tracepoint( "fetch_transactions" ); int counter = 0; + BlockHeader latestInfo = static_cast< const Interface& >( m_client ).blockInfo( LatestBlock ); Transactions txns = m_tq.topTransactionsSync( - _limit, [this, &to_delete, &counter]( const Transaction& tx ) -> bool { + _limit, [this, &to_delete, &counter, &latestInfo]( const Transaction& tx ) -> bool { if ( m_tq.getCategory( tx.sha3() ) != 1 ) // take broadcasted return false; @@ -444,11 +445,7 @@ ConsensusExtFace::transactions_vector SkaleHost::pendingTransactions( if ( tx.verifiedOn < m_lastBlockWithBornTransactions ) try { bool isMtmEnabled = m_client.chainParams().sChain.multiTransactionMode; - Executive::verifyTransaction( tx, - static_cast< const Interface& >( m_client ) - .blockInfo( LatestBlock ) - .timestamp(), - static_cast< const Interface& >( m_client ).blockInfo( LatestBlock ), + Executive::verifyTransaction( tx, latestInfo.timestamp(), latestInfo, m_client.state().createStateReadOnlyCopy(), m_client.chainParams(), 0, getGasPrice(), isMtmEnabled ); } catch ( const exception& ex ) { @@ -629,6 +626,9 @@ void SkaleHost::createBlock( const ConsensusExtFace::transactions_vector& _appro // HACK this is for not allowing new transactions in tq between deletion and block creation! // TODO decouple SkaleHost and Client!!! size_t n_succeeded; + + BlockHeader latestInfo = static_cast< const Interface& >( m_client ).blockInfo( LatestBlock ); + DEV_GUARDED( m_client.m_blockImportMutex ) { m_debugTracer.tracepoint( "drop_good_transactions" ); @@ -654,8 +654,8 @@ void SkaleHost::createBlock( const ConsensusExtFace::transactions_vector& _appro // TODO clear occasionally this cache?! if ( m_m_transaction_cache.find( sha.asArray() ) != m_m_transaction_cache.cend() ) { Transaction t = m_m_transaction_cache.at( sha.asArray() ); - t.checkOutExternalGas( m_client.chainParams(), - m_client.blockInfo( LatestBlock ).timestamp(), m_client.number(), true ); + t.checkOutExternalGas( + m_client.chainParams(), latestInfo.timestamp(), m_client.number(), true ); out_txns.push_back( t ); LOG( m_debugLogger ) << "Dropping good txn " << sha << std::endl; m_debugTracer.tracepoint( "drop_good" ); @@ -669,8 +669,8 @@ void SkaleHost::createBlock( const ConsensusExtFace::transactions_vector& _appro // ).detach(); } else { Transaction t( data, CheckTransaction::Everything, true ); - t.checkOutExternalGas( m_client.chainParams(), - m_client.blockInfo( LatestBlock ).timestamp(), m_client.number(), false ); + t.checkOutExternalGas( + m_client.chainParams(), latestInfo.timestamp(), m_client.number(), false ); out_txns.push_back( t ); LOG( m_debugLogger ) << "Will import consensus-born txn"; m_debugTracer.tracepoint( "import_consensus_born" ); From f86098f203341163d81f22059b664aabf78a5901 Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Tue, 16 Apr 2024 18:50:58 +0100 Subject: [PATCH 087/154] SKALED-1719 Hide streamRlp() --- libethcore/TransactionBase.h | 13 +++++++------ libethereum/Block.cpp | 4 +--- libweb3jsonrpc/Eth.cpp | 4 +--- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/libethcore/TransactionBase.h b/libethcore/TransactionBase.h index accdeb2ae..1aedf89b0 100644 --- a/libethcore/TransactionBase.h +++ b/libethcore/TransactionBase.h @@ -147,12 +147,6 @@ class TransactionBase { /// @returns true if transaction is contract-creation. bool isCreation() const { return m_type == ContractCreation; } - /// Serialises this transaction to an RLPStream. - /// @throws TransactionIsUnsigned if including signature was requested but it was not - /// initialized - void streamRLP( - RLPStream& _s, IncludeSignature _sig = WithSignature, bool _forEip155hash = false ) const; - /// @returns the RLP serialisation of this transaction. bytes rlp( IncludeSignature _sig = WithSignature ) const { RLPStream s; @@ -308,7 +302,14 @@ class TransactionBase { Counter< TransactionBase > c; private: + /// Serialises this transaction to an RLPStream. + /// @throws TransactionIsUnsigned if including signature was requested but it was not + /// initialized + void streamRLP( + RLPStream& _s, IncludeSignature _sig = WithSignature, bool _forEip155hash = false ) const; + static TransactionType getTransactionType( bytesConstRef _rlp ); + /// Constructs a transaction from the given RLP and transaction type. void fillFromRlpByType( bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid, TransactionType type ); diff --git a/libethereum/Block.cpp b/libethereum/Block.cpp index 05f0e77b3..176657f1e 100644 --- a/libethereum/Block.cpp +++ b/libethereum/Block.cpp @@ -973,9 +973,7 @@ void Block::commitToSeal( receipt( i ).streamRLP( receiptrlp ); receiptsMap.insert( std::make_pair( k.out(), receiptrlp.out() ) ); - RLPStream txrlp; - m_transactions[i].streamRLP( txrlp ); - dev::bytes txOutput = txrlp.out(); + dev::bytes txOutput = m_transactions[i].rlp(); if ( m_transactions[i].txType() != dev::eth::TransactionType::Legacy ) { txOutput.insert( txOutput.begin(), m_transactions[i].txType() ); RLPStream s; diff --git a/libweb3jsonrpc/Eth.cpp b/libweb3jsonrpc/Eth.cpp index 0bd42958e..fa249b3fc 100644 --- a/libweb3jsonrpc/Eth.cpp +++ b/libweb3jsonrpc/Eth.cpp @@ -391,9 +391,7 @@ Json::Value Eth::eth_signTransaction( Json::Value const& _json ) { ts = client()->populateTransactionWithDefaults( ts ); pair< bool, Secret > ar = m_ethAccounts.authenticate( ts ); Transaction t( ts, ar.second ); - RLPStream s; - t.streamRLP( s ); - return toJson( t, s.out() ); + return toJson( t, t.rlp() ); } catch ( Exception const& ) { throw JsonRpcException( exceptionToErrorMessage() ); } From e19191c96b52ce7daa6da8e5231c6156574d37ab Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Tue, 16 Apr 2024 19:06:29 +0100 Subject: [PATCH 088/154] SKALED-1719 Fix if --- libethereum/Block.cpp | 1 - libweb3jsonrpc/Eth.cpp | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/libethereum/Block.cpp b/libethereum/Block.cpp index 176657f1e..491297a51 100644 --- a/libethereum/Block.cpp +++ b/libethereum/Block.cpp @@ -975,7 +975,6 @@ void Block::commitToSeal( dev::bytes txOutput = m_transactions[i].rlp(); if ( m_transactions[i].txType() != dev::eth::TransactionType::Legacy ) { - txOutput.insert( txOutput.begin(), m_transactions[i].txType() ); RLPStream s; s.append( txOutput ); txOutput = s.out(); diff --git a/libweb3jsonrpc/Eth.cpp b/libweb3jsonrpc/Eth.cpp index fa249b3fc..f6fe2a06d 100644 --- a/libweb3jsonrpc/Eth.cpp +++ b/libweb3jsonrpc/Eth.cpp @@ -390,7 +390,7 @@ Json::Value Eth::eth_signTransaction( Json::Value const& _json ) { setTransactionDefaults( ts ); ts = client()->populateTransactionWithDefaults( ts ); pair< bool, Secret > ar = m_ethAccounts.authenticate( ts ); - Transaction t( ts, ar.second ); + Transaction t( ts, ar.second ); // always legacy, no prefix byte return toJson( t, t.rlp() ); } catch ( Exception const& ) { throw JsonRpcException( exceptionToErrorMessage() ); From 58aa4640f09358ae546fdd6e06d4bcfbbd0d0606 Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Wed, 17 Apr 2024 13:33:38 +0100 Subject: [PATCH 089/154] #1719 add gasPrice check for type2 transactions --- libethcore/TransactionBase.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libethcore/TransactionBase.cpp b/libethcore/TransactionBase.cpp index ffb0a2350..904e00a8d 100644 --- a/libethcore/TransactionBase.cpp +++ b/libethcore/TransactionBase.cpp @@ -253,6 +253,10 @@ TransactionBase TransactionBase::makeType2Transaction( m_nonce = rlp[1].toInt< u256 >(); m_maxPriorityFeePerGas = rlp[2].toInt< u256 >(); m_maxFeePerGas = rlp[3].toInt< u256 >(); + if ( m_maxPriorityFeePerGas > m_maxPriorityFeePerGas ) + BOOST_THROW_EXCEPTION( InvalidTransactionFormat() << errinfo_comment( + "maxFeePerGas cannot be less than maxPriorityFeePerGas (The " + "total must be the larger of the two)" ) ); // set m_gasPrice as SKALE ignores priority fees m_gasPrice = m_maxFeePerGas; m_gas = rlp[4].toInt< u256 >(); From bc9cd391c21b283f7361604dd2302406aeb179f5 Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Wed, 17 Apr 2024 16:35:45 +0100 Subject: [PATCH 090/154] SKALED-1719 More prettifying --- libethcore/TransactionBase.h | 4 +- libethereum/Block.cpp | 2 +- libethereum/SkaleHost.cpp | 6 +- libethereum/TransactionQueue.cpp | 16 +-- libweb3jsonrpc/Eth.cpp | 2 +- skale-key/KeyAux.h | 4 +- test/tools/jsontests/BlockChainTests.cpp | 2 +- test/tools/libtesteth/BlockChainHelper.cpp | 13 +- test/unittests/libdevcrypto/crypto.cpp | 4 +- test/unittests/libethereum/SkaleHost.cpp | 121 ++++-------------- test/unittests/libethereum/Transaction.cpp | 31 ++--- .../libethereum/TransactionQueue.cpp | 66 +++++----- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 32 ++--- .../mapreduce_consensus/ConsensusEngine.cpp | 2 +- 14 files changed, 108 insertions(+), 197 deletions(-) diff --git a/libethcore/TransactionBase.h b/libethcore/TransactionBase.h index 2394f3edc..d316e3e01 100644 --- a/libethcore/TransactionBase.h +++ b/libethcore/TransactionBase.h @@ -148,9 +148,9 @@ class TransactionBase { bool isCreation() const { return m_type == ContractCreation; } /// @returns the RLP serialisation of this transaction. - bytes rlp( IncludeSignature _sig = WithSignature ) const { + bytes toBytes( IncludeSignature _sig = WithSignature, bool _forEip155hash = false ) const { RLPStream s; - streamRLP( s, _sig ); + streamRLP( s, _sig, _forEip155hash ); bytes output = s.out(); if ( m_txType != TransactionType::Legacy ) output.insert( output.begin(), m_txType ); diff --git a/libethereum/Block.cpp b/libethereum/Block.cpp index 491297a51..f3a7d9bc1 100644 --- a/libethereum/Block.cpp +++ b/libethereum/Block.cpp @@ -973,7 +973,7 @@ void Block::commitToSeal( receipt( i ).streamRLP( receiptrlp ); receiptsMap.insert( std::make_pair( k.out(), receiptrlp.out() ) ); - dev::bytes txOutput = m_transactions[i].rlp(); + dev::bytes txOutput = m_transactions[i].toBytes(); if ( m_transactions[i].txType() != dev::eth::TransactionType::Legacy ) { RLPStream s; s.append( txOutput ); diff --git a/libethereum/SkaleHost.cpp b/libethereum/SkaleHost.cpp index 4645cfee5..67c006b09 100644 --- a/libethereum/SkaleHost.cpp +++ b/libethereum/SkaleHost.cpp @@ -526,7 +526,7 @@ ConsensusExtFace::transactions_vector SkaleHost::pendingTransactions( m_m_transaction_cache[sha.asArray()] = txn; } - out_vector.push_back( txn.rlp() ); + out_vector.push_back( txn.toBytes() ); ++total_sent; @@ -892,7 +892,7 @@ void SkaleHost::broadcastFunc() { if ( !m_broadcastPauseFlag ) { MICROPROFILE_SCOPEI( "SkaleHost", "broadcastFunc.broadcast", MP_CHARTREUSE1 ); - std::string rlp = toJS( txn.rlp() ); + std::string rlp = toJS( txn.toBytes() ); std::string h = toJS( txn.sha3() ); // std::string strPerformanceQueueName = "bc/broadcast"; @@ -995,7 +995,7 @@ void SkaleHost::forceEmptyBlock() { } void SkaleHost::forcedBroadcast( const Transaction& _txn ) { - m_broadcaster->broadcast( toJS( _txn.rlp() ) ); + m_broadcaster->broadcast( toJS( _txn.toBytes() ) ); } void SkaleHost::noteNewTransactions() {} diff --git a/libethereum/TransactionQueue.cpp b/libethereum/TransactionQueue.cpp index 6a075bf84..284e5c648 100644 --- a/libethereum/TransactionQueue.cpp +++ b/libethereum/TransactionQueue.cpp @@ -134,7 +134,7 @@ ImportResult TransactionQueue::import( // if( t == fs->second.begin() ){ UpgradeGuard ul( l ); --m_futureSize; - m_futureSizeBytes -= t->second.transaction.rlp().size(); + m_futureSizeBytes -= t->second.transaction.toBytes().size(); auto erasedHash = t->second.transaction.sha3(); LOG( m_loggerDetail ) << "Re-inserting future transaction " << erasedHash; m_known.erase( erasedHash ); @@ -327,7 +327,7 @@ void TransactionQueue::insertCurrent_WITH_LOCK( std::pair< h256, Transaction > c inserted.first->second = handle; m_currentByHash[_p.first] = handle; #pragma GCC diagnostic pop - m_currentSizeBytes += t.rlp().size(); + m_currentSizeBytes += t.toBytes().size(); // Move following transactions from future to current makeCurrent_WITH_LOCK( t ); @@ -345,7 +345,7 @@ bool TransactionQueue::remove_WITH_LOCK( h256 const& _txHash ) { auto it = m_currentByAddressAndNonce.find( from ); assert( it != m_currentByAddressAndNonce.end() ); it->second.erase( ( *t->second ).transaction.nonce() ); - m_currentSizeBytes -= ( *t->second ).transaction.rlp().size(); + m_currentSizeBytes -= ( *t->second ).transaction.toBytes().size(); m_current.erase( t->second ); m_currentByHash.erase( t ); if ( it->second.empty() ) @@ -382,8 +382,8 @@ void TransactionQueue::setFuture_WITH_LOCK( h256 const& _txHash ) { *( m->second ) ); // set has only const iterators. Since we are moving out of container // that's fine m_currentByHash.erase( t.transaction.sha3() ); - m_currentSizeBytes -= t.transaction.rlp().size(); - m_futureSizeBytes += t.transaction.rlp().size(); + m_currentSizeBytes -= t.transaction.toBytes().size(); + m_futureSizeBytes += t.transaction.toBytes().size(); target.emplace( t.transaction.nonce(), move( t ) ); m_current.erase( m->second ); ++m_futureSize; @@ -396,7 +396,7 @@ void TransactionQueue::setFuture_WITH_LOCK( h256 const& _txHash ) { // TODO: priority queue for future transactions // For now just drop random chain end --m_futureSize; - m_futureSizeBytes -= m_future.begin()->second.rbegin()->second.transaction.rlp().size(); + m_futureSizeBytes -= m_future.begin()->second.rbegin()->second.transaction.toBytes().size(); auto erasedHash = m_future.begin()->second.rbegin()->second.transaction.sha3(); LOG( m_loggerDetail ) << "Dropping out of bounds future transaction " << erasedHash; m_known.erase( erasedHash ); @@ -430,8 +430,8 @@ void TransactionQueue::makeCurrent_WITH_LOCK( Transaction const& _t ) { inserted.first->second = handle; m_currentByHash[( *handle ).transaction.sha3()] = handle; #pragma GCC diagnostic pop - m_futureSizeBytes -= ( *handle ).transaction.rlp().size(); - m_currentSizeBytes += ( *handle ).transaction.rlp().size(); + m_futureSizeBytes -= ( *handle ).transaction.toBytes().size(); + m_currentSizeBytes += ( *handle ).transaction.toBytes().size(); --m_futureSize; ++ft; ++nonce; diff --git a/libweb3jsonrpc/Eth.cpp b/libweb3jsonrpc/Eth.cpp index f6fe2a06d..241816098 100644 --- a/libweb3jsonrpc/Eth.cpp +++ b/libweb3jsonrpc/Eth.cpp @@ -391,7 +391,7 @@ Json::Value Eth::eth_signTransaction( Json::Value const& _json ) { ts = client()->populateTransactionWithDefaults( ts ); pair< bool, Secret > ar = m_ethAccounts.authenticate( ts ); Transaction t( ts, ar.second ); // always legacy, no prefix byte - return toJson( t, t.rlp() ); + return toJson( t, t.toBytes() ); } catch ( Exception const& ) { throw JsonRpcException( exceptionToErrorMessage() ); } diff --git a/skale-key/KeyAux.h b/skale-key/KeyAux.h index 980ba64c9..3ce52128a 100644 --- a/skale-key/KeyAux.h +++ b/skale-key/KeyAux.h @@ -347,10 +347,10 @@ class KeyCLI { t.sign( s ); cout << t.sha3() << ": "; if ( isFile ) { - writeFile( i + ".signed", toHex( t.rlp() ) ); + writeFile( i + ".signed", toHex( t.toBytes() ) ); cout << i + ".signed" << endl; } else - cout << toHex( t.rlp() ) << endl; + cout << toHex( t.toBytes() ) << endl; } catch ( Exception& ex ) { cerr << "Invalid transaction: " << ex.what() << endl; } diff --git a/test/tools/jsontests/BlockChainTests.cpp b/test/tools/jsontests/BlockChainTests.cpp index ac9dc294f..100b46e52 100644 --- a/test/tools/jsontests/BlockChainTests.cpp +++ b/test/tools/jsontests/BlockChainTests.cpp @@ -958,7 +958,7 @@ void checkBlocks( BOOST_CHECK_MESSAGE( trField == trRlp, _testname + "transactions from rlp and transaction from field do not match" ); BOOST_CHECK_MESSAGE( - trField.rlp() == trRlp.rlp(), _testname + "transactions rlp do not match" ); + trField.toBytes() == trRlp.toBytes(), _testname + "transactions rlp do not match" ); } vector< TestBlock > const& unclesFromField = _blockFromFields.uncles(); diff --git a/test/tools/libtesteth/BlockChainHelper.cpp b/test/tools/libtesteth/BlockChainHelper.cpp index 757ac6169..3bd1de9da 100644 --- a/test/tools/libtesteth/BlockChainHelper.cpp +++ b/test/tools/libtesteth/BlockChainHelper.cpp @@ -72,7 +72,7 @@ TestBlock::TestBlock( std::string const& _blockRLP ) : TestBlock() { for ( auto const& tr : root[1] ) { Transaction tx( tr.data(), CheckTransaction::Everything ); TestTransaction testTx( tx ); - m_transactionQueue.import( tx.rlp() ); + m_transactionQueue.import( tx.toBytes() ); m_testTransactions.push_back( testTx ); } @@ -121,7 +121,7 @@ void TestBlock::setState( State const& _state ) { void TestBlock::addTransaction( TestTransaction const& _tr ) { m_testTransactions.push_back( _tr ); - if ( m_transactionQueue.import( _tr.transaction().rlp() ) != ImportResult::Success ) + if ( m_transactionQueue.import( _tr.transaction().toBytes() ) != ImportResult::Success ) cnote << TestOutputHelper::get().testName() + " Test block failed importing transaction\n"; recalcBlockHeaderBytes(); } @@ -383,11 +383,8 @@ void TestBlock::recalcBlockHeaderBytes() { txList.push_back( txi ); RLPStream txStream; txStream.appendList( txList.size() ); - for ( unsigned i = 0; i < txList.size(); ++i ) { - RLPStream txrlp; - txList[i].streamRLP( txrlp ); - txStream.appendRaw( txrlp.out() ); - } + for ( unsigned i = 0; i < txList.size(); ++i ) + txStream.appendRaw( txList[i].toBytes() ); RLPStream uncleStream; uncleStream.appendList( m_uncles.size() ); @@ -444,7 +441,7 @@ void TestBlock::populateFrom( TestBlock const& _original ) { m_transactionQueue.clear(); TransactionQueue const& trQueue = _original.transactionQueue(); for ( auto const& txi : trQueue.topTransactions( std::numeric_limits< unsigned >::max() ) ) - m_transactionQueue.import( txi.rlp() ); + m_transactionQueue.import( txi.toBytes() ); m_uncles = _original.uncles(); m_blockHeader = _original.blockHeader(); diff --git a/test/unittests/libdevcrypto/crypto.cpp b/test/unittests/libdevcrypto/crypto.cpp index f8a85c56f..0fd4ab8c5 100644 --- a/test/unittests/libdevcrypto/crypto.cpp +++ b/test/unittests/libdevcrypto/crypto.cpp @@ -119,10 +119,10 @@ BOOST_AUTO_TEST_CASE( keypairs ) { p.address() == Address( fromHex( "8a40bfaa73256b60764c1bf40675a99083efb075" ) ) ); eth::Transaction t( 1000, 0, 0, h160( fromHex( "944400f4b88ac9589a0f17ed4671da26bddb668b" ) ), {}, 0, p.secret() ); - auto rlp = t.rlp( eth::WithoutSignature ); + auto rlp = t.toBytes( eth::WithoutSignature ); auto expectedRlp = "dc80808094944400f4b88ac9589a0f17ed4671da26bddb668b8203e880"; BOOST_CHECK_EQUAL( toHex( rlp ), expectedRlp ); - rlp = t.rlp( eth::WithSignature ); + rlp = t.toBytes( eth::WithSignature ); auto expectedRlp2 = "f85f80808094944400f4b88ac9589a0f17ed4671da26bddb668b8203e8801ca0bd2402a510c9c9afddf2a3f63c" "869573bd257475bea91d6f164638134a3386d6a0609ad9775fd2715e6a359c627e9338478e4adba65dd0dc6ef2" diff --git a/test/unittests/libethereum/SkaleHost.cpp b/test/unittests/libethereum/SkaleHost.cpp index 930339da0..2fd249013 100644 --- a/test/unittests/libethereum/SkaleHost.cpp +++ b/test/unittests/libethereum/SkaleHost.cpp @@ -177,9 +177,7 @@ struct SkaleHostFixture : public TestOutputHelperFixture { bytes bytes_from_json( const Json::Value& json ) { Transaction tx = tx_from_json( json ); - RLPStream stream; - tx.streamRLP( stream ); - return stream.out(); + return tx.toBytes(); } TransactionQueue* tq; @@ -259,9 +257,6 @@ BOOST_DATA_TEST_CASE( validTransaction, skipInvalidTransactionsVariants, skipInv pair< bool, Secret > ar = accountHolder->authenticate( ts ); Transaction tx( ts, ar.second ); - RLPStream stream; - tx.streamRLP( stream ); - h256 txHash = tx.sha3(); CHECK_NONCE_BEGIN( senderAddress ); @@ -269,7 +264,7 @@ BOOST_DATA_TEST_CASE( validTransaction, skipInvalidTransactionsVariants, skipInv CHECK_BLOCK_BEGIN; BOOST_REQUIRE_NO_THROW( - stub->createBlock( ConsensusExtFace::transactions_vector{stream.out()}, utcTime(), 1U ) ); + stub->createBlock( ConsensusExtFace::transactions_vector{tx.toBytes()}, utcTime(), 1U ) ); REQUIRE_BLOCK_INCREASE( 1 ); REQUIRE_BLOCK_SIZE( 1, 1 ); @@ -397,15 +392,12 @@ BOOST_DATA_TEST_CASE( transactionSigZero, skipInvalidTransactionsVariants, skipI VrsHackedTransaction* hacked_tx = reinterpret_cast< VrsHackedTransaction* >( &tx ); hacked_tx->resetSignature(); - RLPStream stream; - tx.streamRLP( stream, WithSignature ); - CHECK_NONCE_BEGIN( senderAddress ); CHECK_BALANCE_BEGIN( senderAddress ); CHECK_BLOCK_BEGIN; BOOST_REQUIRE_NO_THROW( - stub->createBlock( ConsensusExtFace::transactions_vector{stream.out()}, utcTime(), 1U ) ); + stub->createBlock( ConsensusExtFace::transactions_vector{tx.toBytes()}, utcTime(), 1U ) ); REQUIRE_BLOCK_INCREASE( 1 ); @@ -414,7 +406,7 @@ BOOST_DATA_TEST_CASE( transactionSigZero, skipInvalidTransactionsVariants, skipI } else { REQUIRE_BLOCK_SIZE( 1, 1 ); - h256 txHash = sha3( stream.out() ); + h256 txHash = sha3( tx.toBytes() ); REQUIRE_BLOCK_TRANSACTION( 1, 0, txHash ); } @@ -447,9 +439,7 @@ BOOST_DATA_TEST_CASE( transactionSigBad, skipInvalidTransactionsVariants, skipIn pair< bool, Secret > ar = accountHolder->authenticate( ts ); Transaction tx( ts, ar.second ); - RLPStream stream; - tx.streamRLP( stream ); - bytes data = stream.out(); + bytes data = tx.toBytes(); // TODO try to spoil other fields data[43] = 0x7f; // spoil v @@ -503,9 +493,6 @@ BOOST_DATA_TEST_CASE( transactionGasIncorrect, skipInvalidTransactionsVariants, pair< bool, Secret > ar = accountHolder->authenticate( ts ); Transaction tx( ts, ar.second ); - RLPStream stream; - tx.streamRLP( stream ); - h256 txHash = tx.sha3(); CHECK_NONCE_BEGIN( senderAddress ); @@ -513,7 +500,7 @@ BOOST_DATA_TEST_CASE( transactionGasIncorrect, skipInvalidTransactionsVariants, CHECK_BLOCK_BEGIN; BOOST_REQUIRE_NO_THROW( - stub->createBlock( ConsensusExtFace::transactions_vector{stream.out()}, utcTime(), 1U ) ); + stub->createBlock( ConsensusExtFace::transactions_vector{tx.toBytes()}, utcTime(), 1U ) ); REQUIRE_BLOCK_INCREASE( 1 ); @@ -572,9 +559,6 @@ BOOST_DATA_TEST_CASE( transactionGasNotEnough, skipInvalidTransactionsVariants, pair< bool, Secret > ar = accountHolder->authenticate( ts ); Transaction tx( ts, ar.second ); - RLPStream stream; - tx.streamRLP( stream ); - h256 txHash = tx.sha3(); CHECK_NONCE_BEGIN( senderAddress ); @@ -582,7 +566,7 @@ BOOST_DATA_TEST_CASE( transactionGasNotEnough, skipInvalidTransactionsVariants, CHECK_BLOCK_BEGIN; BOOST_REQUIRE_NO_THROW( - stub->createBlock( ConsensusExtFace::transactions_vector{stream.out()}, utcTime(), 1U ) ); + stub->createBlock( ConsensusExtFace::transactions_vector{tx.toBytes()}, utcTime(), 1U ) ); REQUIRE_BLOCK_INCREASE( 1 ); REQUIRE_BLOCK_SIZE( 1, 1 ); @@ -617,9 +601,6 @@ BOOST_DATA_TEST_CASE( transactionNonceBig, skipInvalidTransactionsVariants, skip pair< bool, Secret > ar = accountHolder->authenticate( ts ); Transaction tx( ts, ar.second ); - RLPStream stream; - tx.streamRLP( stream ); - h256 txHash = tx.sha3(); CHECK_NONCE_BEGIN( senderAddress ); @@ -627,7 +608,7 @@ BOOST_DATA_TEST_CASE( transactionNonceBig, skipInvalidTransactionsVariants, skip CHECK_BLOCK_BEGIN; BOOST_REQUIRE_NO_THROW( - stub->createBlock( ConsensusExtFace::transactions_vector{stream.out()}, utcTime(), 1U ) ); + stub->createBlock( ConsensusExtFace::transactions_vector{tx.toBytes()}, utcTime(), 1U ) ); REQUIRE_BLOCK_INCREASE( 1 ); @@ -669,12 +650,9 @@ BOOST_DATA_TEST_CASE( transactionNonceSmall, skipInvalidTransactionsVariants, sk pair< bool, Secret > ar = accountHolder->authenticate( ts ); Transaction tx1( ts, ar.second ); - RLPStream stream1; - tx1.streamRLP( stream1 ); - // create 1 txns in 1 block BOOST_REQUIRE_NO_THROW( - stub->createBlock( ConsensusExtFace::transactions_vector{stream1.out()}, utcTime(), 1U ) ); + stub->createBlock( ConsensusExtFace::transactions_vector{tx1.toBytes()}, utcTime(), 1U ) ); // now our test txn json["value"] = jsToDecimal( toJS( 9000 * dev::eth::szabo ) ); @@ -683,9 +661,6 @@ BOOST_DATA_TEST_CASE( transactionNonceSmall, skipInvalidTransactionsVariants, sk ar = accountHolder->authenticate( ts ); Transaction tx2( ts, ar.second ); - RLPStream stream2; - tx2.streamRLP( stream2 ); - h256 txHash = tx2.sha3(); CHECK_NONCE_BEGIN( senderAddress ); @@ -693,7 +668,7 @@ BOOST_DATA_TEST_CASE( transactionNonceSmall, skipInvalidTransactionsVariants, sk CHECK_BLOCK_BEGIN; BOOST_REQUIRE_NO_THROW( - stub->createBlock( ConsensusExtFace::transactions_vector{stream2.out()}, utcTime(), 2U ) ); + stub->createBlock( ConsensusExtFace::transactions_vector{tx2.toBytes()}, utcTime(), 2U ) ); REQUIRE_BLOCK_INCREASE( 1 ); @@ -733,9 +708,6 @@ BOOST_DATA_TEST_CASE( transactionBalanceBad, skipInvalidTransactionsVariants, sk pair< bool, Secret > ar = accountHolder->authenticate( ts ); Transaction tx( ts, ar.second ); - RLPStream stream; - tx.streamRLP( stream ); - h256 txHash = tx.sha3(); CHECK_NONCE_BEGIN( senderAddress ); @@ -743,7 +715,7 @@ BOOST_DATA_TEST_CASE( transactionBalanceBad, skipInvalidTransactionsVariants, sk CHECK_BLOCK_BEGIN; BOOST_REQUIRE_NO_THROW( - stub->createBlock( ConsensusExtFace::transactions_vector{stream.out()}, utcTime(), 1U ) ); + stub->createBlock( ConsensusExtFace::transactions_vector{tx.toBytes()}, utcTime(), 1U ) ); REQUIRE_BLOCK_INCREASE( 1 ); @@ -771,7 +743,7 @@ BOOST_DATA_TEST_CASE( transactionBalanceBad, skipInvalidTransactionsVariants, sk // make money dev::eth::simulateMining( *client, 1, senderAddress ); - stub->createBlock( ConsensusExtFace::transactions_vector{stream.out()}, utcTime(), 2U ); + stub->createBlock( ConsensusExtFace::transactions_vector{tx.toBytes()}, utcTime(), 2U ); REQUIRE_BLOCK_SIZE( 2, 1 ); REQUIRE_BLOCK_TRANSACTION( 2, 0, txHash ); @@ -810,9 +782,6 @@ BOOST_DATA_TEST_CASE( transactionGasBlockLimitExceeded, skipInvalidTransactionsV Transaction tx1 = tx_from_json( json ); - RLPStream stream1; - tx1.streamRLP( stream1 ); - h256 txHash1 = tx1.sha3(); // 2 txn @@ -822,9 +791,6 @@ BOOST_DATA_TEST_CASE( transactionGasBlockLimitExceeded, skipInvalidTransactionsV Transaction tx2 = tx_from_json( json ); - RLPStream stream2; - tx2.streamRLP( stream2 ); - h256 txHash2 = tx2.sha3(); CHECK_NONCE_BEGIN( senderAddress ); @@ -832,7 +798,7 @@ BOOST_DATA_TEST_CASE( transactionGasBlockLimitExceeded, skipInvalidTransactionsV CHECK_BLOCK_BEGIN; BOOST_REQUIRE_NO_THROW( stub->createBlock( - ConsensusExtFace::transactions_vector{stream1.out(), stream2.out()}, utcTime(), 1U ) ); + ConsensusExtFace::transactions_vector{tx1.toBytes(), tx2.toBytes()}, utcTime(), 1U ) ); BOOST_REQUIRE_EQUAL( client->number(), 1 ); REQUIRE_BLOCK_INCREASE( 1 ); @@ -873,28 +839,22 @@ BOOST_AUTO_TEST_CASE( gasLimitInBlockProposal ) { Transaction tx1 = tx_from_json( json ); - RLPStream stream1; - tx1.streamRLP( stream1 ); - // 2 txn json["from"] = toJS( account2.address() ); json["gas"] = jsToDecimal( toJS( client->chainParams().gasLimit - 21000 + 1 ) ); Transaction tx2 = tx_from_json( json ); - RLPStream stream2; - tx2.streamRLP( stream2 ); - // put already broadcasted txns - skaleHost->receiveTransaction( toJS( stream1.out() ) ); - skaleHost->receiveTransaction( toJS( stream2.out() ) ); + skaleHost->receiveTransaction( toJS( tx1.toBytes() ) ); + skaleHost->receiveTransaction( toJS( tx2.toBytes() ) ); sleep( 1 ); // allow broadcast thread to move them ConsensusExtFace::transactions_vector proposal = stub->pendingTransactions( 100 ); BOOST_REQUIRE_EQUAL( proposal.size(), 1 ); - BOOST_REQUIRE( proposal[0] == stream1.out() ); + BOOST_REQUIRE( proposal[0] == tx1.toBytes() ); } // positive test for 4 next ones @@ -985,9 +945,6 @@ BOOST_AUTO_TEST_CASE( transactionDropQueue, Transaction tx2 = tx_from_json( json ); - RLPStream stream2; - tx2.streamRLP( stream2 ); - h256 txHash2 = tx2.sha3(); // return it from consensus! @@ -996,7 +953,7 @@ BOOST_AUTO_TEST_CASE( transactionDropQueue, CHECK_BLOCK_BEGIN; BOOST_REQUIRE_NO_THROW( - stub->createBlock( ConsensusExtFace::transactions_vector{stream2.out()}, utcTime(), 1U ) ); + stub->createBlock( ConsensusExtFace::transactions_vector{tx2.toBytes()}, utcTime(), 1U ) ); stub->setPriceForBlockId( 1, 1000 ); REQUIRE_BLOCK_INCREASE( 1 ); @@ -1042,9 +999,6 @@ BOOST_AUTO_TEST_CASE( transactionDropByGasPrice Transaction tx2 = tx_from_json( json ); - RLPStream stream2; - tx2.streamRLP( stream2 ); - h256 txHash2 = tx2.sha3(); // return it from consensus! @@ -1053,7 +1007,7 @@ BOOST_AUTO_TEST_CASE( transactionDropByGasPrice CHECK_BLOCK_BEGIN; BOOST_REQUIRE_NO_THROW( stub->createBlock( - ConsensusExtFace::transactions_vector{stream2.out()}, utcTime(), 1U, 1000 ) ); + ConsensusExtFace::transactions_vector{tx2.toBytes()}, utcTime(), 1U, 1000 ) ); stub->setPriceForBlockId( 1, 1100 ); REQUIRE_BLOCK_INCREASE( 1 ); @@ -1092,11 +1046,8 @@ BOOST_AUTO_TEST_CASE( transactionDropByGasPriceReceive Transaction tx1 = tx_from_json( json ); tx1.checkOutExternalGas( client->chainParams(), client->number() ); - RLPStream stream1; - tx1.streamRLP( stream1 ); - // receive it! - skaleHost->receiveTransaction( toJS( stream1.out() ) ); + skaleHost->receiveTransaction( toJS( tx1.toBytes() ) ); sleep( 1 ); BOOST_REQUIRE_EQUAL( tq->knownTransactions().size(), 1 ); @@ -1109,9 +1060,6 @@ BOOST_AUTO_TEST_CASE( transactionDropByGasPriceReceive Transaction tx2 = tx_from_json( json ); - RLPStream stream2; - tx2.streamRLP( stream2 ); - h256 txHash2 = tx2.sha3(); // return it from consensus! @@ -1120,7 +1068,7 @@ BOOST_AUTO_TEST_CASE( transactionDropByGasPriceReceive CHECK_BLOCK_BEGIN; BOOST_REQUIRE_NO_THROW( stub->createBlock( - ConsensusExtFace::transactions_vector{stream2.out()}, utcTime(), 1U, 1000 ) ); + ConsensusExtFace::transactions_vector{tx2.toBytes()}, utcTime(), 1U, 1000 ) ); stub->setPriceForBlockId( 1, 1100 ); REQUIRE_BLOCK_INCREASE( 1 ); @@ -1151,9 +1099,6 @@ BOOST_AUTO_TEST_CASE( transactionRace Transaction tx = tx_from_json( json ); - RLPStream stream; - tx.streamRLP( stream ); - h256 txHash = tx.sha3(); // 1 add tx as normal @@ -1165,7 +1110,7 @@ BOOST_AUTO_TEST_CASE( transactionRace // 2 get it from consensus BOOST_REQUIRE_NO_THROW( - stub->createBlock( ConsensusExtFace::transactions_vector{stream.out()}, utcTime(), 1U ) ); + stub->createBlock( ConsensusExtFace::transactions_vector{tx.toBytes()}, utcTime(), 1U ) ); stub->setPriceForBlockId( 1, 1000 ); REQUIRE_BLOCK_INCREASE( 1 ); @@ -1204,12 +1149,9 @@ BOOST_AUTO_TEST_CASE( partialCatchUp pair< bool, Secret > ar = accountHolder->authenticate( ts ); Transaction tx1( ts, ar.second ); - RLPStream stream1; - tx1.streamRLP( stream1 ); - // create 1 txns in 1 block BOOST_REQUIRE_NO_THROW( - stub->createBlock( ConsensusExtFace::transactions_vector{stream1.out()}, utcTime(), 1U ) ); + stub->createBlock( ConsensusExtFace::transactions_vector{tx1.toBytes()}, utcTime(), 1U ) ); // now 2 txns json["value"] = jsToDecimal( toJS( 9000 * dev::eth::szabo ) ); @@ -1218,9 +1160,6 @@ BOOST_AUTO_TEST_CASE( partialCatchUp ar = accountHolder->authenticate( ts ); Transaction tx2( ts, ar.second ); - RLPStream stream2; - tx2.streamRLP( stream2 ); - h256 txHash = tx2.sha3(); CHECK_NONCE_BEGIN( senderAddress ); @@ -1228,7 +1167,7 @@ BOOST_AUTO_TEST_CASE( partialCatchUp CHECK_BLOCK_BEGIN; BOOST_REQUIRE_NO_THROW( - stub->createBlock( ConsensusExtFace::transactions_vector{stream1.out(), stream2.out()}, utcTime(), 2U ) ); + stub->createBlock( ConsensusExtFace::transactions_vector{tx1.toBytes(), tx2.toBytes()}, utcTime(), 2U ) ); REQUIRE_BLOCK_INCREASE( 1 ); REQUIRE_BLOCK_SIZE( 2, 2 ); @@ -1284,13 +1223,10 @@ BOOST_FIXTURE_TEST_CASE( mtmAfterBigNonceMined, dummy, pair< bool, Secret > ar = accountHolder->authenticate( ts ); Transaction tx1( ts, ar.second ); - RLPStream stream1; - tx1.streamRLP( stream1 ); - h256 tx1Hash = tx1.sha3(); // it will be put to "future" queue - skaleHost->receiveTransaction( toJS( stream1.out() ) ); + skaleHost->receiveTransaction( toJS( tx1.toBytes() ) ); sleep( 1 ); ConsensusExtFace::transactions_vector proposal = stub->pendingTransactions( 100 ); // and not proposed @@ -1301,7 +1237,7 @@ BOOST_FIXTURE_TEST_CASE( mtmAfterBigNonceMined, dummy, // simulate it coming from another node BOOST_REQUIRE_NO_THROW( - stub->createBlock( ConsensusExtFace::transactions_vector{stream1.out()}, utcTime(), 1U ) ); + stub->createBlock( ConsensusExtFace::transactions_vector{tx1.toBytes()}, utcTime(), 1U ) ); REQUIRE_BLOCK_SIZE( 1, 1 ); REQUIRE_BLOCK_TRANSACTION( 1, 0, tx1Hash ); @@ -1314,13 +1250,10 @@ BOOST_FIXTURE_TEST_CASE( mtmAfterBigNonceMined, dummy, ar = accountHolder->authenticate( ts ); Transaction tx2( ts, ar.second ); - RLPStream stream2; - tx2.streamRLP( stream2 ); - h256 tx2Hash = tx2.sha3(); // post it to queue for "realism" - skaleHost->receiveTransaction( toJS( stream2.out() ) ); + skaleHost->receiveTransaction( toJS( tx2.toBytes() ) ); sleep( 1 ); proposal = stub->pendingTransactions( 100 ); BOOST_REQUIRE_EQUAL(proposal.size(), 2); @@ -1337,7 +1270,7 @@ BOOST_FIXTURE_TEST_CASE( mtmAfterBigNonceMined, dummy, // 3 submit nonce = 1 again! // it should go to proposal BOOST_REQUIRE_THROW( - skaleHost->receiveTransaction( toJS( stream1.out() ) ), + skaleHost->receiveTransaction( toJS( tx1.toBytes() ) ), dev::eth::PendingTransactionAlreadyExists ); sleep( 1 ); diff --git a/test/unittests/libethereum/Transaction.cpp b/test/unittests/libethereum/Transaction.cpp index e21ecb1d9..db27b5650 100644 --- a/test/unittests/libethereum/Transaction.cpp +++ b/test/unittests/libethereum/Transaction.cpp @@ -124,9 +124,7 @@ BOOST_AUTO_TEST_CASE( TransactionNotReplayProtected, Transaction tx( txRlp, CheckTransaction::None ); tx.checkChainId( 1234, true ); // any chain ID is accepted for not replay protected tx - RLPStream txRlpStream; - tx.streamRLP( txRlpStream ); - BOOST_REQUIRE( txRlpStream.out() == txRlp ); + BOOST_REQUIRE( tx.toBytes() == txRlp ); txRlp = fromHex( "0x01f8ce8504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b018e0358ac3958" @@ -207,9 +205,8 @@ BOOST_AUTO_TEST_CASE( TransactionChainIDBiggerThan64Bit ) { "8827f497375ae5c8a0795eb0b4f36fe712af5e6a8447802c9eb0913a2add86174552bf2e4b0e183feb" ); RLPStream rlpStream; auto tx = Transaction( txRlp1, CheckTransaction::None ); - tx.streamRLP( rlpStream, IncludeSignature::WithSignature ); - auto txRlp = rlpStream.out(); - BOOST_REQUIRE( txRlp != txRlp1 ); + auto txBytes = tx.toBytes(IncludeSignature::WithSignature); + BOOST_REQUIRE( txBytes != txRlp1 ); txRlp1 = fromHex( "0x02f8df890a0000000000000117808504a817c8008504a817c800827530947d36af85a184e220a656525fcbb9" @@ -218,11 +215,9 @@ BOOST_AUTO_TEST_CASE( TransactionChainIDBiggerThan64Bit ) { "0000000000000000000000000000000000000000000000000780a0912e3aad5af05008d3a282d2a76dc975d234" "4eb34e2500c924a58ccfdc9dbeb4a04afcffcb5d1897df030d45a7eeb3ceb7c7e6fe368fc47865156b4899de32" "01c7" ); - RLPStream rlpStream1; tx = Transaction( txRlp1, CheckTransaction::None ); - tx.streamRLP( rlpStream1, IncludeSignature::WithSignature ); - txRlp = rlpStream.out(); - BOOST_REQUIRE( txRlp != txRlp1 ); + txBytes = tx.toBytes(IncludeSignature::WithSignature); + BOOST_REQUIRE( txBytes != txRlp1 ); } BOOST_AUTO_TEST_CASE( TransactionReplayProtected ) { @@ -234,9 +229,8 @@ BOOST_AUTO_TEST_CASE( TransactionReplayProtected ) { tx.checkChainId( 1, false ); BOOST_REQUIRE_THROW( tx.checkChainId( 123, false ), InvalidSignature ); - RLPStream txRlpStream; - tx.streamRLP( txRlpStream ); - BOOST_REQUIRE( txRlpStream.out() == txRlp ); + auto txBytes = tx.toBytes(IncludeSignature::WithSignature); + BOOST_REQUIRE( txBytes == txRlp ); txRlp = fromHex( "0x01f8c38197018504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180f85bf85994de" @@ -247,8 +241,8 @@ BOOST_AUTO_TEST_CASE( TransactionReplayProtected ) { tx = Transaction( txRlp, CheckTransaction::None ); tx.checkChainId( 151, false ); BOOST_REQUIRE_THROW( tx.checkChainId( 123, false ), InvalidSignature ); - - BOOST_REQUIRE( tx.rlp() == txRlp ); + + BOOST_REQUIRE( tx.toBytes() == txRlp ); txRlp = fromHex( "0x02f8c98197808504a817c8008504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180" @@ -259,8 +253,8 @@ BOOST_AUTO_TEST_CASE( TransactionReplayProtected ) { tx = Transaction( txRlp, CheckTransaction::None ); tx.checkChainId( 151, false ); BOOST_REQUIRE_THROW( tx.checkChainId( 123, false ), InvalidSignature ); - - BOOST_REQUIRE( tx.rlp() == txRlp ); + + BOOST_REQUIRE( tx.toBytes() == txRlp ); } BOOST_AUTO_TEST_CASE( accessList ) { @@ -468,9 +462,8 @@ BOOST_AUTO_TEST_CASE( GettingSignatureForUnsignedTransactionThrows, BOOST_AUTO_TEST_CASE( StreamRLPWithSignatureForUnsignedTransactionThrows ) { Transaction tx( 0, 0, 10000, Address( "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" ), bytes(), 0 ); - RLPStream s; BOOST_REQUIRE_THROW( - tx.streamRLP( s, IncludeSignature::WithSignature, false ), TransactionIsUnsigned ); + tx.toBytes( IncludeSignature::WithSignature ), TransactionIsUnsigned ); } BOOST_AUTO_TEST_CASE( CheckLowSForUnsignedTransactionThrows, diff --git a/test/unittests/libethereum/TransactionQueue.cpp b/test/unittests/libethereum/TransactionQueue.cpp index 2036e9520..ee0dd8762 100644 --- a/test/unittests/libethereum/TransactionQueue.cpp +++ b/test/unittests/libethereum/TransactionQueue.cpp @@ -234,16 +234,16 @@ BOOST_AUTO_TEST_CASE( tqImport ) { TransactionQueue tq; h256Hash known = tq.knownTransactions(); BOOST_REQUIRE( known.size() == 0 ); - - ImportResult ir = tq.import( testTransaction.transaction().rlp() ); + + ImportResult ir = tq.import( testTransaction.transaction().toBytes() ); BOOST_REQUIRE( ir == ImportResult::Success ); known = tq.knownTransactions(); BOOST_REQUIRE( known.size() == 1 ); - - ir = tq.import( testTransaction.transaction().rlp() ); + + ir = tq.import( testTransaction.transaction().toBytes() ); BOOST_REQUIRE( ir == ImportResult::AlreadyKnown ); - - bytes rlp = testTransaction.transaction().rlp(); + + bytes rlp = testTransaction.transaction().toBytes(); rlp.at( 0 ) = 03; ir = tq.import( rlp ); BOOST_REQUIRE( ir == ImportResult::Malformed ); @@ -254,14 +254,14 @@ BOOST_AUTO_TEST_CASE( tqImport ) { TestTransaction testTransaction2 = TestTransaction::defaultTransaction( 1, 2 ); TestTransaction testTransaction3 = TestTransaction::defaultTransaction( 1, 1 ); TestTransaction testTransaction4 = TestTransaction::defaultTransaction( 1, 4 ); - - ir = tq.import( testTransaction2.transaction().rlp() ); + + ir = tq.import( testTransaction2.transaction().toBytes() ); BOOST_REQUIRE( ir == ImportResult::SameNonceAlreadyInQueue ); - - ir = tq.import( testTransaction3.transaction().rlp() ); + + ir = tq.import( testTransaction3.transaction().toBytes() ); BOOST_REQUIRE( ir == ImportResult::AlreadyKnown ); - - ir = tq.import( testTransaction4.transaction().rlp() ); + + ir = tq.import( testTransaction4.transaction().toBytes() ); known = tq.knownTransactions(); BOOST_REQUIRE( known.size() == 1 ); Transactions ts = tq.topTransactions( 4 ); @@ -289,8 +289,8 @@ BOOST_AUTO_TEST_CASE( tqImportFuture ) { BOOST_REQUIRE( maxNonce == 0 ); u256 waiting = tq.waiting(sender); BOOST_REQUIRE( waiting == 0 ); - - ImportResult ir1 = tq.import( tx1.transaction().rlp(), IfDropped::Ignore, true ); + + ImportResult ir1 = tq.import( tx1.transaction().toBytes(), IfDropped::Ignore, true ); BOOST_REQUIRE( ir1 == ImportResult::Success ); known = tq.knownTransactions(); BOOST_REQUIRE( known.size() == 1 ); @@ -302,7 +302,7 @@ BOOST_AUTO_TEST_CASE( tqImportFuture ) { BOOST_REQUIRE( waiting == 1 ); // HACK it's now allowed to repeat future transaction (can put it to current) - ir1 = tq.import( tx1.transaction().rlp(), IfDropped::Ignore, true ); + ir1 = tq.import( tx1.transaction().toBytes(), IfDropped::Ignore, true ); BOOST_REQUIRE( ir1 == ImportResult::Success ); known = tq.knownTransactions(); BOOST_REQUIRE( known.size() == 1 ); @@ -312,14 +312,14 @@ BOOST_AUTO_TEST_CASE( tqImportFuture ) { BOOST_REQUIRE( maxNonce == 5 ); waiting = tq.waiting(sender); BOOST_REQUIRE( waiting == 1 ); - - bytes rlp = tx1.transaction().rlp(); + + bytes rlp = tx1.transaction().toBytes(); rlp.at( 0 ) = 03; ir1 = tq.import( rlp, IfDropped::Ignore, true ); BOOST_REQUIRE( ir1 == ImportResult::Malformed ); TestTransaction tx2 = TestTransaction::defaultTransaction(2); - ImportResult ir2 = tq.import( tx2.transaction().rlp(), IfDropped::Ignore, true ); + ImportResult ir2 = tq.import( tx2.transaction().toBytes(), IfDropped::Ignore, true ); BOOST_REQUIRE( ir2 == ImportResult::Success ); known = tq.knownTransactions(); BOOST_REQUIRE( known.size() == 2 ); @@ -330,7 +330,7 @@ BOOST_AUTO_TEST_CASE( tqImportFuture ) { BOOST_CHECK( ( Transactions{} ) == tq.topTransactions( 256 ) ); TestTransaction tx3 = TestTransaction::defaultTransaction(1); - ImportResult ir3 = tq.import( tx3.transaction().rlp(), IfDropped::Ignore, true ); + ImportResult ir3 = tq.import( tx3.transaction().toBytes(), IfDropped::Ignore, true ); BOOST_REQUIRE( ir3 == ImportResult::Success ); known = tq.knownTransactions(); BOOST_REQUIRE( known.size() == 3 ); @@ -341,7 +341,7 @@ BOOST_AUTO_TEST_CASE( tqImportFuture ) { BOOST_CHECK( ( Transactions{} ) == tq.topTransactions( 256 ) ); TestTransaction tx4 = TestTransaction::defaultTransaction(0); - ImportResult ir4 = tq.import( tx4.transaction().rlp(), IfDropped::Ignore ); + ImportResult ir4 = tq.import( tx4.transaction().toBytes(), IfDropped::Ignore ); BOOST_REQUIRE( ir4 == ImportResult::Success ); known = tq.knownTransactions(); BOOST_REQUIRE( known.size() == 4 ); @@ -355,7 +355,7 @@ BOOST_AUTO_TEST_CASE( tqImportFuture ) { BOOST_CHECK( ( Transactions{ tx4.transaction(), tx3.transaction(), tx2.transaction() } ) == tq.topTransactions( 256 ) ); TestTransaction tx5 = TestTransaction::defaultTransaction(3); - ImportResult ir5 = tq.import( tx5.transaction().rlp(), IfDropped::Ignore ); + ImportResult ir5 = tq.import( tx5.transaction().toBytes(), IfDropped::Ignore ); BOOST_REQUIRE( ir5 == ImportResult::Success ); known = tq.knownTransactions(); BOOST_REQUIRE( known.size() == 5 ); @@ -387,13 +387,13 @@ BOOST_AUTO_TEST_CASE( dropFromFutureToCurrent ) { TestTransaction tx1 = TestTransaction::defaultTransaction(1); // put transaction to future - ImportResult ir1 = tq.import( tx1.transaction().rlp(), IfDropped::Ignore, true ); + ImportResult ir1 = tq.import( tx1.transaction().toBytes(), IfDropped::Ignore, true ); BOOST_REQUIRE( ir1 == ImportResult::Success ); TransactionQueue::Status status = tq.status(); BOOST_REQUIRE( status.current == 0 && status.future == 1 ); // push it to current and see it fall back from future to current - ir1 = tq.import( tx1.transaction().rlp(), IfDropped::Ignore, false ); + ir1 = tq.import( tx1.transaction().toBytes(), IfDropped::Ignore, false ); BOOST_REQUIRE( ir1 == ImportResult::Success ); status = tq.status(); BOOST_REQUIRE( status.current == 1 && status.future == 0 ); @@ -402,10 +402,10 @@ BOOST_AUTO_TEST_CASE( dropFromFutureToCurrent ) { BOOST_AUTO_TEST_CASE( tqImportFutureLimits ) { dev::eth::TransactionQueue tq( 1024, 2 ); TestTransaction tx1 = TestTransaction::defaultTransaction(3); - tq.import( tx1.transaction().rlp(), IfDropped::Ignore, true ); + tq.import( tx1.transaction().toBytes(), IfDropped::Ignore, true ); TestTransaction tx2 = TestTransaction::defaultTransaction(2); - tq.import( tx2.transaction().rlp(), IfDropped::Ignore, true ); + tq.import( tx2.transaction().toBytes(), IfDropped::Ignore, true ); auto waiting = tq.waiting(tx1.transaction().sender()); BOOST_REQUIRE( waiting == 2 ); @@ -413,7 +413,7 @@ BOOST_AUTO_TEST_CASE( tqImportFutureLimits ) { BOOST_REQUIRE( known.size() == 2 ); TestTransaction tx3 = TestTransaction::defaultTransaction(1); - ImportResult ir = tq.import( tx3.transaction().rlp(), IfDropped::Ignore, true ); + ImportResult ir = tq.import( tx3.transaction().toBytes(), IfDropped::Ignore, true ); BOOST_REQUIRE( ir == ImportResult::Success ); waiting = tq.waiting(tx1.transaction().sender()); @@ -427,7 +427,7 @@ BOOST_AUTO_TEST_CASE( tqImportFutureLimits2 ) { dev::eth::TransactionQueue tq( 1024, 2 ); TestTransaction tx1 = TestTransaction::defaultTransaction(3); - tq.import( tx1.transaction().rlp(), IfDropped::Ignore, true ); + tq.import( tx1.transaction().toBytes(), IfDropped::Ignore, true ); auto waiting = tq.waiting(tx1.transaction().sender()); BOOST_REQUIRE( waiting == 1 ); @@ -454,7 +454,7 @@ BOOST_AUTO_TEST_CASE( tqImportFutureLimits2 ) { BOOST_REQUIRE( status.future == 2 ); TestTransaction tx2 = TestTransaction::defaultTransaction(2); - tq.import( tx2.transaction().rlp(), IfDropped::Ignore, true ); + tq.import( tx2.transaction().toBytes(), IfDropped::Ignore, true ); waiting = tq.waiting(tx1.transaction().sender()); BOOST_REQUIRE( waiting == 1 ); @@ -472,7 +472,7 @@ BOOST_AUTO_TEST_CASE( tqDrop ) { TransactionQueue tq; TestTransaction testTransaction = TestTransaction::defaultTransaction(); tq.dropGood( testTransaction.transaction() ); - tq.import( testTransaction.transaction().rlp() ); + tq.import( testTransaction.transaction().toBytes() ); BOOST_REQUIRE( tq.topTransactions( 4 ).size() == 1 ); tq.dropGood( testTransaction.transaction() ); BOOST_REQUIRE( tq.topTransactions( 4 ).size() == 0 ); @@ -516,8 +516,8 @@ BOOST_AUTO_TEST_CASE( tqLimit ) { BOOST_AUTO_TEST_CASE( tqLimitBytes ) { TransactionQueue tq( 100, 100, 250, 250 ); - - unsigned maxTxCount = 250 / TestTransaction::defaultTransaction( 1 ).transaction().rlp().size(); + + unsigned maxTxCount = 250 / TestTransaction::defaultTransaction( 1 ).transaction().toBytes().size(); TestTransaction testTransaction = TestTransaction::defaultTransaction( 2 ); ImportResult res = tq.import( testTransaction.transaction(), IfDropped::Ignore, true ); @@ -554,8 +554,8 @@ BOOST_AUTO_TEST_CASE( tqLimitBytes ) { BOOST_AUTO_TEST_CASE( tqEqueue ) { TransactionQueue tq; TestTransaction testTransaction = TestTransaction::defaultTransaction(); - - bytes payloadToDecode = testTransaction.transaction().rlp(); + + bytes payloadToDecode = testTransaction.transaction().toBytes(); RLPStream rlpStream( 2 ); rlpStream.appendRaw( payloadToDecode ); diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index 771c1faf7..d8b166580 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -2651,7 +2651,7 @@ BOOST_AUTO_TEST_CASE( eip2930Transactions ) { // compare with txn hash from geth BOOST_REQUIRE( txHash == "0xc843560015a655b8f81f65a458be9019bdb5cd8e416b6329ca18f36de0b8244d" ); - BOOST_REQUIRE( dev::toHexPrefixed( fixture.client->transactions( 3 )[0].rlp() ) == "0x01f8678197808504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180c001a01ebdc546c8b85511b7ba831f47c4981069d7af972d10b7dce2c57225cb5df6a7a055ae1e84fea41d37589eb740a0a93017a5cd0e9f10ee50f165bf4b1b4c78ddae" ); + BOOST_REQUIRE( dev::toHexPrefixed( fixture.client->transactions( 3 )[0].toBytes() ) == "0x01f8678197808504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180c001a01ebdc546c8b85511b7ba831f47c4981069d7af972d10b7dce2c57225cb5df6a7a055ae1e84fea41d37589eb740a0a93017a5cd0e9f10ee50f165bf4b1b4c78ddae" ); BOOST_REQUIRE( fixture.rpcClient->eth_getBalance( "0x7D36aF85A184E220A656525fcBb9A63B9ab3C12b", "latest" ) == "0x1" ); @@ -2705,7 +2705,7 @@ BOOST_AUTO_TEST_CASE( eip2930Transactions ) { // compare with txn hash from geth BOOST_REQUIRE( txHash == "0xa6d3541e06dff71fb8344a4db2a4ad4e0b45024eb23a8f568982b70a5f50f94d" ); - BOOST_REQUIRE( dev::toHexPrefixed( fixture.client->transactions( 4 )[0].rlp() ) == "0x01f8c38197018504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000000780a0b03eaf481958e22fc39bd1d526eb9255be1e6625614f02ca939e51c3d7e64bcaa05f675640c04bb050d27bd1f39c07b6ff742311b04dab760bb3bc206054332879" ); + BOOST_REQUIRE( dev::toHexPrefixed( fixture.client->transactions( 4 )[0].toBytes() ) == "0x01f8c38197018504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000000780a0b03eaf481958e22fc39bd1d526eb9255be1e6625614f02ca939e51c3d7e64bcaa05f675640c04bb050d27bd1f39c07b6ff742311b04dab760bb3bc206054332879" ); result = fixture.rpcClient->eth_getTransactionByHash( txHash ); BOOST_REQUIRE( result["type"] == "0x1" ); @@ -2778,8 +2778,8 @@ BOOST_AUTO_TEST_CASE( eip1559Transactions ) { // compare with txn hash from geth BOOST_REQUIRE( txHash == "0x7bd586e93e3012577de4ba33e3b887baf520cbb92c5dd10996b262f9c5c8f747" ); - std::cout << dev::toHexPrefixed( fixture.client->transactions( 3 )[0].rlp() ) << '\n'; - BOOST_REQUIRE( dev::toHexPrefixed( fixture.client->transactions( 3 )[0].rlp() ) == "0x02f8c98197808504a817c8008504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000000780a0f1a407dfc1a9f782001d89f617e9b3a2f295378533784fb39960dea60beea2d0a05ac3da2946554ba3d5721850f4f89ee7a0c38e4acab7130908e7904d13174388" ); + std::cout << dev::toHexPrefixed( fixture.client->transactions( 3 )[0].toBytes() ) << '\n'; + BOOST_REQUIRE( dev::toHexPrefixed( fixture.client->transactions( 3 )[0].toBytes() ) == "0x02f8c98197808504a817c8008504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000000780a0f1a407dfc1a9f782001d89f617e9b3a2f295378533784fb39960dea60beea2d0a05ac3da2946554ba3d5721850f4f89ee7a0c38e4acab7130908e7904d13174388" ); BOOST_REQUIRE( fixture.rpcClient->eth_getBalance( "0x7D36aF85A184E220A656525fcBb9A63B9ab3C12b", "latest" ) == "0x1" ); @@ -3168,9 +3168,7 @@ BOOST_AUTO_TEST_CASE( PrecompiledPrintFakeEth, *boost::unit_test::precondition( pair< bool, Secret > ar = fixture.accountHolder->authenticate( ts ); Transaction tx( ts, ar.second ); - RLPStream stream; - tx.streamRLP( stream ); - auto txHash = fixture.rpcClient->eth_sendRawTransaction( toJS( stream.out() ) ); + auto txHash = fixture.rpcClient->eth_sendRawTransaction( toJS( tx.toBytes() ) ); dev::eth::mineTransaction( *( fixture.client ), 1 ); Json::Value receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); @@ -3547,9 +3545,7 @@ BOOST_AUTO_TEST_CASE( transaction_from_restricted_address ) { pair< bool, Secret > ar = accountHolder->authenticate( ts ); Transaction tx( ts, ar.second ); - RLPStream stream; - tx.streamRLP( stream ); - auto txHash = rpcClient->eth_sendRawTransaction( toJS( stream.out() ) ); + auto txHash = rpcClient->eth_sendRawTransaction( toJS( tx.toBytes() ) ); dev::eth::mineTransaction( *( client ), 1 ); BOOST_REQUIRE( !boost::filesystem::exists( path ) ); @@ -3570,9 +3566,7 @@ BOOST_AUTO_TEST_CASE( transaction_from_allowed_address ) { pair< bool, Secret > ar = accountHolder->authenticate( ts ); Transaction tx( ts, ar.second ); - RLPStream stream; - tx.streamRLP( stream ); - auto txHash = rpcClient->eth_sendRawTransaction( toJS( stream.out() ) ); + auto txHash = rpcClient->eth_sendRawTransaction( toJS( tx.toBytes() ) ); dev::eth::mineTransaction( *( client ), 1 ); BOOST_REQUIRE( boost::filesystem::exists( path ) ); @@ -3621,9 +3615,7 @@ BOOST_AUTO_TEST_CASE( delegate_call ) { pair< bool, Secret > ar = accountHolder->authenticate( ts ); Transaction tx( ts, ar.second ); - RLPStream stream; - tx.streamRLP( stream ); - auto txHash = rpcClient->eth_sendRawTransaction( toJS( stream.out() ) ); + auto txHash = rpcClient->eth_sendRawTransaction( toJS( tx.toBytes() ) ); dev::eth::mineTransaction( *( client ), 1 ); Json::Value receipt = rpcClient->eth_getTransactionReceipt( txHash ); @@ -3673,9 +3665,7 @@ BOOST_AUTO_TEST_CASE( cached_filestorage ) { pair< bool, Secret > ar = fixture.accountHolder->authenticate( ts ); Transaction tx( ts, ar.second ); - RLPStream stream; - tx.streamRLP( stream ); - auto txHash = fixture.rpcClient->eth_sendRawTransaction( toJS( stream.out() ) ); + auto txHash = fixture.rpcClient->eth_sendRawTransaction( toJS( tx.toBytes() ) ); dev::eth::mineTransaction( *( fixture.client ), 1 ); BOOST_REQUIRE( !boost::filesystem::exists( fixture.path ) ); @@ -3705,9 +3695,7 @@ BOOST_AUTO_TEST_CASE( uncached_filestorage ) { pair< bool, Secret > ar = fixture.accountHolder->authenticate( ts ); Transaction tx( ts, ar.second ); - RLPStream stream; - tx.streamRLP( stream ); - auto txHash = fixture.rpcClient->eth_sendRawTransaction( toJS( stream.out() ) ); + auto txHash = fixture.rpcClient->eth_sendRawTransaction( toJS( tx.toBytes() ) ); dev::eth::mineTransaction( *( fixture.client ), 1 ); BOOST_REQUIRE( boost::filesystem::exists( fixture.path ) ); diff --git a/test/unittests/mapreduce_consensus/ConsensusEngine.cpp b/test/unittests/mapreduce_consensus/ConsensusEngine.cpp index 8b78e0bd1..8c6932c1d 100644 --- a/test/unittests/mapreduce_consensus/ConsensusEngine.cpp +++ b/test/unittests/mapreduce_consensus/ConsensusEngine.cpp @@ -305,7 +305,7 @@ class ConsensusExtFaceFixture : public ConsensusExtFace { assert( buffer.empty() ); for ( const Transaction& txn : txns ) { - buffer.push_back( txn.rlp() ); + buffer.push_back( txn.toBytes() ); } // for m_transactionsCond.notify_one(); From 1f3026748da402aee8bd92202daa2300b2d4e435 Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Wed, 17 Apr 2024 18:26:08 +0100 Subject: [PATCH 091/154] #1719 fix yParity field in json-rpc responses --- libweb3jsonrpc/JsonHelper.cpp | 6 +++--- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 16 ++++++++-------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/libweb3jsonrpc/JsonHelper.cpp b/libweb3jsonrpc/JsonHelper.cpp index ef97db47e..80dcf8e3b 100644 --- a/libweb3jsonrpc/JsonHelper.cpp +++ b/libweb3jsonrpc/JsonHelper.cpp @@ -107,7 +107,7 @@ Json::Value toJson( dev::eth::Transaction const& _t, std::pair< h256, unsigned > res["s"] = toJS( _t.signature().s ); res["type"] = toJS( int( _t.txType() ) ); if ( _t.txType() != dev::eth::TransactionType::Legacy ) { - res["yParity"] = res["v"].asString(); + res["yParity"] = toJS( _t.signature().v ); res["accessList"] = Json::Value( Json::arrayValue ); for ( const auto& d : _t.accessList() ) { auto list = RLP( d ); @@ -350,7 +350,7 @@ Json::Value toJson( dev::eth::Transaction const& _t ) { res["v"] = toJS( _t.signature().v ); res["type"] = toJS( int( _t.txType() ) ); if ( _t.txType() != dev::eth::TransactionType::Legacy ) { - res["yParity"] = res["v"].asString(); + res["yParity"] = toJS( _t.signature().v ); res["accessList"] = Json::Value( Json::arrayValue ); for ( const auto& d : _t.accessList() ) { auto list = RLP( d ); @@ -402,7 +402,7 @@ Json::Value toJson( dev::eth::LocalisedTransaction const& _t ) { res["s"] = toJS( _t.signature().s.hex() ); res["type"] = toJS( int( _t.txType() ) ); if ( _t.txType() != dev::eth::TransactionType::Legacy ) { - res["yParity"] = res["v"].asString(); + res["yParity"] = toJS( _t.signature().v ); res["accessList"] = Json::Value( Json::arrayValue ); for ( const auto& d : _t.accessList() ) { auto list = RLP( d ); diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index 771c1faf7..39e30f551 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -2663,7 +2663,7 @@ BOOST_AUTO_TEST_CASE( eip2930Transactions ) { BOOST_REQUIRE( block["transactions"].size() == 1 ); BOOST_REQUIRE( block["transactions"][0]["hash"].asString() == txHash ); BOOST_REQUIRE( block["transactions"][0]["type"] == "0x1" ); - BOOST_REQUIRE( block["transactions"][0]["yParity"] == block["transactions"][0]["v"] ); + BOOST_REQUIRE( toJS( jsToInt( block["transactions"][0]["yParity"].asString() ) + 35 + 2 * fixture.client->chainParams().chainID ) == block["transactions"][0]["v"].asString() ); BOOST_REQUIRE( block["transactions"][0]["accessList"].isArray() ); BOOST_REQUIRE( block["transactions"][0]["accessList"].size() == 0 ); @@ -2677,20 +2677,20 @@ BOOST_AUTO_TEST_CASE( eip2930Transactions ) { result = fixture.rpcClient->eth_getTransactionByHash( txHash ); BOOST_REQUIRE( result["hash"].asString() == txHash ); BOOST_REQUIRE( result["type"] == "0x1" ); - BOOST_REQUIRE( result["yParity"] == result["v"] ); + BOOST_REQUIRE( toJS( jsToInt( result["yParity"].asString() ) + 35 + 2 * fixture.client->chainParams().chainID ) == result["v"].asString() ); BOOST_REQUIRE( result["accessList"].isArray() ); BOOST_REQUIRE( result["accessList"].size() == 0 ); result = fixture.rpcClient->eth_getTransactionByBlockHashAndIndex( blockHash, "0x0" ); BOOST_REQUIRE( result["hash"].asString() == txHash ); BOOST_REQUIRE( result["type"] == "0x1" ); - BOOST_REQUIRE( result["yParity"] == result["v"] ); + BOOST_REQUIRE( toJS( jsToInt( result["yParity"].asString() ) + 35 + 2 * fixture.client->chainParams().chainID ) == result["v"].asString() ); BOOST_REQUIRE( result["accessList"].isArray() ); result = fixture.rpcClient->eth_getTransactionByBlockNumberAndIndex( "0x3", "0x0" ); BOOST_REQUIRE( result["hash"].asString() == txHash ); BOOST_REQUIRE( result["type"] == "0x1" ); - BOOST_REQUIRE( result["yParity"] == result["v"] ); + BOOST_REQUIRE( toJS( jsToInt( result["yParity"].asString() ) + 35 + 2 * fixture.client->chainParams().chainID ) == result["v"].asString() ); BOOST_REQUIRE( result["accessList"].isArray() ); BOOST_REQUIRE( result["accessList"].size() == 0 ); @@ -2792,7 +2792,7 @@ BOOST_AUTO_TEST_CASE( eip1559Transactions ) { BOOST_REQUIRE( block["transactions"].size() == 1 ); BOOST_REQUIRE( block["transactions"][0]["hash"].asString() == txHash ); BOOST_REQUIRE( block["transactions"][0]["type"] == "0x2" ); - BOOST_REQUIRE( block["transactions"][0]["yParity"] == block["transactions"][0]["v"] ); + BOOST_REQUIRE( toJS( jsToInt( block["transactions"][0]["yParity"].asString() ) + 35 + 2 * fixture.client->chainParams().chainID ) == block["transactions"][0]["v"].asString() ); BOOST_REQUIRE( block["transactions"][0]["accessList"].isArray() ); std::string blockHash = block["hash"].asString(); @@ -2804,7 +2804,7 @@ BOOST_AUTO_TEST_CASE( eip1559Transactions ) { result = fixture.rpcClient->eth_getTransactionByHash( txHash ); BOOST_REQUIRE( result["hash"].asString() == txHash ); BOOST_REQUIRE( result["type"] == "0x2" ); - BOOST_REQUIRE( result["yParity"] == result["v"] ); + BOOST_REQUIRE( toJS( jsToInt( result["yParity"].asString() ) + 35 + 2 * fixture.client->chainParams().chainID ) == result["v"].asString() ); BOOST_REQUIRE( result["accessList"].isArray() ); BOOST_REQUIRE( result.isMember( "maxPriorityFeePerGas" ) && result["maxPriorityFeePerGas"].isString() ); BOOST_REQUIRE( result.isMember( "maxFeePerGas" ) && result["maxFeePerGas"].isString() ); @@ -2812,7 +2812,7 @@ BOOST_AUTO_TEST_CASE( eip1559Transactions ) { result = fixture.rpcClient->eth_getTransactionByBlockHashAndIndex( blockHash, "0x0" ); BOOST_REQUIRE( result["hash"].asString() == txHash ); BOOST_REQUIRE( result["type"] == "0x2" ); - BOOST_REQUIRE( result["yParity"] == result["v"] ); + BOOST_REQUIRE( toJS( jsToInt( result["yParity"].asString() ) + 35 + 2 * fixture.client->chainParams().chainID ) == result["v"].asString() ); BOOST_REQUIRE( result["accessList"].isArray() ); BOOST_REQUIRE( result["maxPriorityFeePerGas"] == "0x4a817c800" ); BOOST_REQUIRE( result["maxFeePerGas"] == "0x4a817c800" ); @@ -2820,7 +2820,7 @@ BOOST_AUTO_TEST_CASE( eip1559Transactions ) { result = fixture.rpcClient->eth_getTransactionByBlockNumberAndIndex( "0x3", "0x0" ); BOOST_REQUIRE( result["hash"].asString() == txHash ); BOOST_REQUIRE( result["type"] == "0x2" ); - BOOST_REQUIRE( result["yParity"] == result["v"] ); + BOOST_REQUIRE( toJS( jsToInt( result["yParity"].asString() ) + 35 + 2 * fixture.client->chainParams().chainID ) == result["v"].asString() ); BOOST_REQUIRE( result["accessList"].isArray() ); BOOST_REQUIRE( result["maxPriorityFeePerGas"] == "0x4a817c800" ); BOOST_REQUIRE( result["maxFeePerGas"] == "0x4a817c800" ); From 1815ebf4fe22783fe9954b9e1055a5ed9f23f3f6 Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Wed, 17 Apr 2024 19:41:43 +0100 Subject: [PATCH 092/154] SKALED-1719 Use separate function to extract transaction bytes --- libethcore/TransactionBase.cpp | 23 +++++++++++++++-------- libethcore/TransactionBase.h | 14 +++++++++----- libethereum/BlockChain.cpp | 22 +++++++--------------- libethereum/BlockChain.h | 20 ++++---------------- libethereum/ClientBase.cpp | 6 +----- 5 files changed, 36 insertions(+), 49 deletions(-) diff --git a/libethcore/TransactionBase.cpp b/libethcore/TransactionBase.cpp index d6e8cef33..3567c4f3e 100644 --- a/libethcore/TransactionBase.cpp +++ b/libethcore/TransactionBase.cpp @@ -95,7 +95,7 @@ TransactionBase::TransactionBase( TransactionSkeleton const& _ts, Secret const& sign( _s ); } -void TransactionBase::fillFromRlpLegacy( +void TransactionBase::fillFromBytesLegacy( bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid ) { RLP const rlp( _rlpData ); try { @@ -169,7 +169,7 @@ void TransactionBase::fillFromRlpLegacy( } } -void TransactionBase::fillFromRlpType1( +void TransactionBase::fillFromBytesType1( bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid ) { bytes croppedRlp( _rlpData.begin() + 1, _rlpData.end() ); RLP const rlp( croppedRlp ); @@ -230,7 +230,7 @@ void TransactionBase::fillFromRlpType1( } } -void TransactionBase::fillFromRlpType2( +void TransactionBase::fillFromBytesType2( bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid ) { bytes croppedRlp( _rlpData.begin() + 1, _rlpData.end() ); RLP const rlp( croppedRlp ); @@ -294,17 +294,17 @@ void TransactionBase::fillFromRlpType2( } } -void TransactionBase::fillFromRlpByType( +void TransactionBase::fillFromBytesByType( bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid, TransactionType type ) { switch ( type ) { case TransactionType::Legacy: - fillFromRlpLegacy( _rlpData, _checkSig, _allowInvalid ); + fillFromBytesLegacy( _rlpData, _checkSig, _allowInvalid ); break; case TransactionType::Type1: - fillFromRlpType1( _rlpData, _checkSig, _allowInvalid ); + fillFromBytesType1( _rlpData, _checkSig, _allowInvalid ); break; case TransactionType::Type2: - fillFromRlpType2( _rlpData, _checkSig, _allowInvalid ); + fillFromBytesType2( _rlpData, _checkSig, _allowInvalid ); break; default: BOOST_THROW_EXCEPTION( @@ -326,7 +326,7 @@ TransactionBase::TransactionBase( MICROPROFILE_SCOPEI( "TransactionBase", "ctor", MP_GOLD2 ); try { TransactionType txnType = getTransactionType( _rlpData ); - fillFromRlpByType( _rlpData, _checkSig, _allowInvalid, txnType ); + fillFromBytesByType( _rlpData, _checkSig, _allowInvalid, txnType ); } catch ( ... ) { m_type = Type::Invalid; RLPStream s; @@ -539,3 +539,10 @@ u256 TransactionBase::gas() const { u256 TransactionBase::nonPowGas() const { return m_gas; } + +bytesConstRef dev::eth::bytesRefFromTransactionRlp( const RLP& _rlp ) { + if ( _rlp.isList() ) + return _rlp.data(); + else + return _rlp.payload(); +} diff --git a/libethcore/TransactionBase.h b/libethcore/TransactionBase.h index d316e3e01..431f0dd8c 100644 --- a/libethcore/TransactionBase.h +++ b/libethcore/TransactionBase.h @@ -312,12 +312,14 @@ class TransactionBase { static TransactionType getTransactionType( bytesConstRef _rlp ); /// Constructs a transaction from the given RLP and transaction type. - void fillFromRlpByType( bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid, - TransactionType type ); - void fillFromRlpLegacy( + void fillFromBytesByType( bytesConstRef _rlpData, CheckTransaction _checkSig, + bool _allowInvalid, TransactionType type ); + void fillFromBytesLegacy( + bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid ); + void fillFromBytesType1( + bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid ); + void fillFromBytesType2( bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid ); - void fillFromRlpType1( bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid ); - void fillFromRlpType2( bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid ); void streamLegacyTransaction( RLPStream& _s, IncludeSignature _sig, bool _forEip155hash ) const; void streamType1Transaction( RLPStream& _s, IncludeSignature _sig ) const; @@ -356,5 +358,7 @@ inline std::ostream& operator<<( std::ostream& _out, TransactionBase const& _t ) return _out; } +extern bytesConstRef bytesRefFromTransactionRlp( const RLP& _rlp ); + } // namespace eth } // namespace dev diff --git a/libethereum/BlockChain.cpp b/libethereum/BlockChain.cpp index a6452f497..6a09fb506 100644 --- a/libethereum/BlockChain.cpp +++ b/libethereum/BlockChain.cpp @@ -64,6 +64,8 @@ using skale::BaseState; using skale::State; using namespace skale::error; +extern bytesConstRef bytesRefFromTransactionRlp( const RLP& _rlp ); + #define ETH_TIMED_IMPORTS 1 namespace { @@ -777,15 +779,10 @@ size_t BlockChain::prepareDbDataAndReturnSize( VerifiedBlockRef const& _block, for ( RLP::iterator it = txns_rlp.begin(); it != txns_rlp.end(); ++it ) { MICROPROFILE_SCOPEI( "insertBlockAndExtras", "for2", MP_HONEYDEW ); - if ( RLP( *it ).isList() ) - // means Legacy transaction - extrasWriteBatch.insert( toSlice( sha3( ( *it ).data() ), ExtraTransactionAddress ), - ( db::Slice ) dev::ref( ta.rlp() ) ); - else { - auto payload = ( *it ).payload(); - extrasWriteBatch.insert( toSlice( sha3( payload ), ExtraTransactionAddress ), - ( db::Slice ) dev::ref( ta.rlp() ) ); - } + auto txBytes = bytesRefFromTransactionRlp( *it ); + extrasWriteBatch.insert( toSlice( sha3( txBytes ), ExtraTransactionAddress ), + ( db::Slice ) dev::ref( ta.rlp() ) ); + ++ta.index; } } @@ -1754,12 +1751,7 @@ VerifiedBlockRef BlockChain::verifyBlock( bytesConstRef _block, ( ImportRequirements::TransactionBasic | ImportRequirements::TransactionSignatures ) ) { MICROPROFILE_SCOPEI( "BlockChain", "check txns", MP_ROSYBROWN ); for ( RLP const& tr : r[1] ) { - bytesConstRef d; - if ( tr.isList() ) - // means Legacy transaction - d = tr.data(); - else - d = tr.payload(); + bytesConstRef d = bytesRefFromTransactionRlp( tr ); try { Transaction t( d, ( _ir & ImportRequirements::TransactionSignatures ) ? CheckTransaction::Everything : diff --git a/libethereum/BlockChain.h b/libethereum/BlockChain.h index 2cfe2658f..1d7a152bd 100644 --- a/libethereum/BlockChain.h +++ b/libethereum/BlockChain.h @@ -231,13 +231,8 @@ class BlockChain { auto b = block( _hash ); RLP rlp( b ); h256s ret; - for ( auto d : rlp[1] ) { - if ( d.isList() ) - // means Legacy transaction - ret.push_back( sha3( d.data() ) ); - else - ret.push_back( sha3( d.payload() ) ); - } + for ( auto d : rlp[1] ) + ret.push_back( sha3( bytesRefFromTransactionRlp( d ) ) ); return ret; } TransactionHashes transactionHashes() const { return transactionHashes( currentHash() ); } @@ -324,10 +319,7 @@ class BlockChain { /// none given) & index. Thread-safe. bytes transaction( h256 const& _blockHash, unsigned _i ) const { bytes b = block( _blockHash ); - if ( RLP( b )[1][_i].isList() ) - // means Legacy transaction - return RLP( b )[1][_i].data().toBytes(); - return RLP( b )[1][_i].payload().toBytes(); + return bytesRefFromTransactionRlp( RLP( b )[1][_i] ).toBytes(); } bytes transaction( unsigned _i ) const { return transaction( currentHash(), _i ); } @@ -336,11 +328,7 @@ class BlockChain { bytes b = block( _blockHash ); std::vector< bytes > ret; for ( auto const& i : RLP( b )[1] ) - if ( i.isList() ) - // means Legacy transaction - ret.push_back( i.data().toBytes() ); - else - ret.push_back( i.payload().toBytes() ); + ret.push_back( bytesRefFromTransactionRlp( i ).toBytes() ); return ret; } std::vector< bytes > transactions() const { return transactions( currentHash() ); } diff --git a/libethereum/ClientBase.cpp b/libethereum/ClientBase.cpp index de711e0d3..7537a697e 100644 --- a/libethereum/ClientBase.cpp +++ b/libethereum/ClientBase.cpp @@ -448,11 +448,7 @@ Transactions ClientBase::transactions( h256 _blockHash ) const { Transactions res; for ( unsigned i = 0; i < b[1].itemCount(); i++ ) { auto txRlp = b[1][i]; - if ( txRlp.isList() ) - // means Legacy transaction - res.emplace_back( txRlp.data(), CheckTransaction::Cheap, true ); - else - res.emplace_back( txRlp.payload(), CheckTransaction::Cheap, true ); + res.emplace_back( bytesRefFromTransactionRlp( txRlp ), CheckTransaction::Cheap, true ); } return res; } From a35280aea91c5813a8c9efbd70d66f591e39c77d Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Thu, 18 Apr 2024 11:21:25 +0100 Subject: [PATCH 093/154] #1719 handle price absence in the db --- libweb3jsonrpc/Eth.cpp | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/libweb3jsonrpc/Eth.cpp b/libweb3jsonrpc/Eth.cpp index 0bd42958e..5690372f8 100644 --- a/libweb3jsonrpc/Eth.cpp +++ b/libweb3jsonrpc/Eth.cpp @@ -551,6 +551,17 @@ Json::Value Eth::eth_getBlockByHash( string const& _blockHash, bool _includeTran if ( !client()->isKnown( h ) ) return Json::Value( Json::nullValue ); + u256 baseFeePerGas; + try { + baseFeePerGas = client()->gasBidPrice( client()->numberFromHash( h ) ); + } catch ( std::invalid_argument& _e ) { + cdebug << "Cannot get gas price for block " << _blockHash; + cdebug << _e.what(); + // set default gasPrice + // probably the price was rotated out as we are asking the price for the old block + baseFeePerGas = client()->gasBidPrice(); + } + if ( _includeTransactions ) { Transactions transactions = client()->transactions( h ); @@ -567,8 +578,7 @@ Json::Value Eth::eth_getBlockByHash( string const& _blockHash, bool _includeTran } #endif return toJson( client()->blockInfo( h ), client()->blockDetails( h ), - client()->uncleHashes( h ), transactions, client()->sealEngine(), - client()->gasBidPrice( client()->numberFromHash( h ) ) ); + client()->uncleHashes( h ), transactions, client()->sealEngine(), baseFeePerGas ); } else { h256s transactions = client()->transactionHashes( h ); @@ -585,8 +595,7 @@ Json::Value Eth::eth_getBlockByHash( string const& _blockHash, bool _includeTran } #endif return toJson( client()->blockInfo( h ), client()->blockDetails( h ), - client()->uncleHashes( h ), transactions, client()->sealEngine(), - client()->gasBidPrice( client()->numberFromHash( h ) ) ); + client()->uncleHashes( h ), transactions, client()->sealEngine(), baseFeePerGas ); } } catch ( ... ) { BOOST_THROW_EXCEPTION( JsonRpcException( Errors::ERROR_RPC_INVALID_PARAMS ) ); @@ -599,6 +608,17 @@ Json::Value Eth::eth_getBlockByNumber( string const& _blockNumber, bool _include if ( !client()->isKnown( h ) ) return Json::Value( Json::nullValue ); + u256 baseFeePerGas; + try { + baseFeePerGas = client()->gasBidPrice( h ); + } catch ( std::invalid_argument& _e ) { + cdebug << "Cannot get gas price for block " << h; + cdebug << _e.what(); + // set default gasPrice + // probably the price was rotated out as we are asking the price for the old block + baseFeePerGas = client()->gasBidPrice(); + } + #ifdef HISTORIC_STATE h256 bh = client()->hashFromNumber( h ); return eth_getBlockByHash( "0x" + bh.hex(), _includeTransactions ); @@ -609,11 +629,11 @@ Json::Value Eth::eth_getBlockByNumber( string const& _blockNumber, bool _include if ( _includeTransactions ) return toJson( client()->blockInfo( h ), client()->blockDetails( h ), client()->uncleHashes( h ), client()->transactions( h ), client()->sealEngine(), - client()->gasBidPrice( h ) ); + baseFeePerGas ); else return toJson( client()->blockInfo( h ), client()->blockDetails( h ), client()->uncleHashes( h ), client()->transactionHashes( h ), - client()->sealEngine(), client()->gasBidPrice( h ) ); + client()->sealEngine(), baseFeePerGas ); #endif } catch ( ... ) { BOOST_THROW_EXCEPTION( JsonRpcException( Errors::ERROR_RPC_INVALID_PARAMS ) ); From a2dd1de20da601db27a203d42f890e2b32ff6aae Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Fri, 19 Apr 2024 18:37:49 +0100 Subject: [PATCH 094/154] #1719 small fixes --- libweb3jsonrpc/JsonHelper.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libweb3jsonrpc/JsonHelper.cpp b/libweb3jsonrpc/JsonHelper.cpp index 80dcf8e3b..64448b418 100644 --- a/libweb3jsonrpc/JsonHelper.cpp +++ b/libweb3jsonrpc/JsonHelper.cpp @@ -537,6 +537,8 @@ TransactionSkeleton toTransactionSkeleton( Json::Value const& _json ) { if ( !_json["gasPrice"].empty() ) ret.gasPrice = jsToU256( _json["gasPrice"].asString() ); + else if ( !_json["maxFeePerGas"].empty() ) + ret.gasPrice = jsToU256( _json["maxFeePerGas"].asString() ); if ( !_json["data"].empty() ) // ethereum.js has preconstructed the data array ret.data = jsToBytes( _json["data"].asString(), OnFailed::Throw ); From a022d7049a1ba88e8ce346f3312b064d4fc18065 Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Mon, 22 Apr 2024 11:55:47 +0100 Subject: [PATCH 095/154] #1719 fix build after merge --- test/unittests/libethereum/Transaction.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/unittests/libethereum/Transaction.cpp b/test/unittests/libethereum/Transaction.cpp index 3b827e294..b0c1ca483 100644 --- a/test/unittests/libethereum/Transaction.cpp +++ b/test/unittests/libethereum/Transaction.cpp @@ -52,7 +52,7 @@ BOOST_AUTO_TEST_CASE( TransactionGasRequired, "cf52d85ecec934c6f46ea3e96d6355eb8ccde261e1e419885761a0234565f6d227d8eba0937b0" "f03cb25f83aeb24c13b7a39a9ef6e80c1ea272a3c" ), CheckTransaction::None ); - BOOST_CHECK_EQUAL( tr.baseGasRequired( FrontierSchedule ), 14 * 68 + 21000 ); + BOOST_CHECK_EQUAL( tr.baseGasRequired( HomesteadSchedule ), 14 * 68 + 21000 ); BOOST_CHECK_EQUAL( tr.baseGasRequired( IstanbulSchedule ), 14 * 16 + 21000 ); tr = Transaction ( @@ -63,7 +63,7 @@ BOOST_AUTO_TEST_CASE( TransactionGasRequired, "23927f0e208494bd1fd8876597899d72025167fed902e9c1c417ddd8639bb7b4a02a63ea48f7e" "94df3a40c4a840ba98da02f13817acb5fe137d40f632e6c8ed367" ), CheckTransaction::None ); - BOOST_CHECK_EQUAL( tr.baseGasRequired( FrontierSchedule ), 14 * 68 + 21000 ); + BOOST_CHECK_EQUAL( tr.baseGasRequired( HomesteadSchedule ), 14 * 68 + 21000 ); BOOST_CHECK_EQUAL( tr.baseGasRequired( IstanbulSchedule ), 14 * 16 + 21000 ); } From e14427db7b48afbd944adc4aede69662b276e818 Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Mon, 22 Apr 2024 13:52:57 +0100 Subject: [PATCH 096/154] #1719 add patch timestamp to json rpc api --- libethereum/SchainPatch.cpp | 4 +++ libethereum/SchainPatch.h | 5 +++ libethereum/SchainPatchEnum.h | 1 + libweb3jsonrpc/Eth.cpp | 44 +++++++++++++---------- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 8 ++++- 5 files changed, 42 insertions(+), 20 deletions(-) diff --git a/libethereum/SchainPatch.cpp b/libethereum/SchainPatch.cpp index 1ae076376..bcbe90274 100644 --- a/libethereum/SchainPatch.cpp +++ b/libethereum/SchainPatch.cpp @@ -28,6 +28,8 @@ SchainPatchEnum getEnumForPatchName( const std::string& _patchName ) { return SchainPatchEnum::StorageDestructionPatch; else if ( _patchName == "SkipInvalidTransactionsPatch" ) return SchainPatchEnum::SkipInvalidTransactionsPatch; + else if ( _patchName == "EIP1559TransactionsPatch" ) + return SchainPatchEnum::EIP1559TransactionsPatch; else throw std::out_of_range( _patchName ); } @@ -56,6 +58,8 @@ std::string getPatchNameForEnum( SchainPatchEnum _enumValue ) { return "SkipInvalidTransactionsPatch"; case SchainPatchEnum::SelfdestructStorageLimitPatch: return "SelfdestructStorageLimitPatch"; + case SchainPatchEnum::EIP1559TransactionsPatch: + return "EIP1559TransactionsPatch"; default: throw std::out_of_range( "UnknownPatch #" + std::to_string( static_cast< size_t >( _enumValue ) ) ); diff --git a/libethereum/SchainPatch.h b/libethereum/SchainPatch.h index d8fabce97..bb630691c 100644 --- a/libethereum/SchainPatch.h +++ b/libethereum/SchainPatch.h @@ -130,4 +130,9 @@ DEFINE_AMNESIC_PATCH( StorageDestructionPatch ); */ DEFINE_SIMPLE_PATCH( SelfdestructStorageLimitPatch ); +/* + * Enable restriction on contract storage size, when it's doing selfdestruct + */ +DEFINE_SIMPLE_PATCH( EIP1559TransactionsPatch ); + #endif // SCHAINPATCH_H diff --git a/libethereum/SchainPatchEnum.h b/libethereum/SchainPatchEnum.h index b1f439211..10fa231c9 100644 --- a/libethereum/SchainPatchEnum.h +++ b/libethereum/SchainPatchEnum.h @@ -16,6 +16,7 @@ enum class SchainPatchEnum { StorageDestructionPatch, SkipInvalidTransactionsPatch, SelfdestructStorageLimitPatch, + EIP1559TransactionsPatch, PatchesCount }; diff --git a/libweb3jsonrpc/Eth.cpp b/libweb3jsonrpc/Eth.cpp index 5140836e9..be43d7e58 100644 --- a/libweb3jsonrpc/Eth.cpp +++ b/libweb3jsonrpc/Eth.cpp @@ -537,15 +537,18 @@ Json::Value Eth::eth_getBlockByHash( string const& _blockHash, bool _includeTran return Json::Value( Json::nullValue ); u256 baseFeePerGas; - try { - baseFeePerGas = client()->gasBidPrice( client()->numberFromHash( h ) ); - } catch ( std::invalid_argument& _e ) { - cdebug << "Cannot get gas price for block " << _blockHash; - cdebug << _e.what(); - // set default gasPrice - // probably the price was rotated out as we are asking the price for the old block - baseFeePerGas = client()->gasBidPrice(); - } + if ( EIP1559TransactionsPatch::isEnabledWhen( client()->blockInfo( h ).timestamp() ) ) + try { + baseFeePerGas = client()->gasBidPrice( client()->numberFromHash( h ) ); + } catch ( std::invalid_argument& _e ) { + cdebug << "Cannot get gas price for block " << h; + cdebug << _e.what(); + // set default gasPrice + // probably the price was rotated out as we are asking the price for the old block + baseFeePerGas = client()->gasBidPrice(); + } + else + baseFeePerGas = 0; if ( _includeTransactions ) { Transactions transactions = client()->transactions( h ); @@ -596,15 +599,18 @@ Json::Value Eth::eth_getBlockByNumber( string const& _blockNumber, bool _include return Json::Value( Json::nullValue ); u256 baseFeePerGas; - try { - baseFeePerGas = client()->gasBidPrice( h ); - } catch ( std::invalid_argument& _e ) { - cdebug << "Cannot get gas price for block " << h; - cdebug << _e.what(); - // set default gasPrice - // probably the price was rotated out as we are asking the price for the old block - baseFeePerGas = client()->gasBidPrice(); - } + if ( EIP1559TransactionsPatch::isEnabledWhen( client()->blockInfo( h ).timestamp() ) ) + try { + baseFeePerGas = client()->gasBidPrice( h ); + } catch ( std::invalid_argument& _e ) { + cdebug << "Cannot get gas price for block " << h; + cdebug << _e.what(); + // set default gasPrice + // probably the price was rotated out as we are asking the price for the old block + baseFeePerGas = client()->gasBidPrice(); + } + else + baseFeePerGas = 0; #ifdef HISTORIC_STATE h256 bh = client()->hashFromNumber( h ); @@ -957,7 +963,7 @@ Json::Value Eth::eth_feeHistory( const std::string& _blockCount, const std::stri for ( auto bn = newestBlock; bn > oldestBlock - 1; --bn ) { auto blockInfo = client()->blockInfo( client()->hashFromNumber( bn ) ); - if ( blockInfo.timestamp() ) + if ( EIP1559TransactionsPatch::isEnabledWhen( blockInfo.timestamp() ) ) result["baseFeePerGas"].append( toJS( client()->gasBidPrice( bn ) ) ); else result["baseFeePerGas"].append( toJS( 0 ) ); diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index c41a1c937..5a180904b 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -3029,6 +3030,8 @@ BOOST_AUTO_TEST_CASE( eip1559RpcMethods ) { // Set chainID = 151 ret["params"]["chainID"] = "0x97"; + time_t eip1559PatchActivationTimestamp = time(nullptr) + 8; + ret["skaleConfig"]["sChain"]["EIP1559TransactionsPatchTimestamp"] = eip1559PatchActivationTimestamp; Json::FastWriter fastWriter; std::string config = fastWriter.write( ret ); @@ -3058,7 +3061,7 @@ BOOST_AUTO_TEST_CASE( eip1559RpcMethods ) { percentiles[0] = 20; percentiles[1] = 80; - size_t blockCnt = 3; + size_t blockCnt = 7; auto feeHistory = fixture.rpcClient->eth_feeHistory( toJS( blockCnt ), "latest", percentiles ); BOOST_REQUIRE( feeHistory["oldestBlock"] == toJS( bn - blockCnt + 1 ) ); @@ -3068,6 +3071,9 @@ BOOST_AUTO_TEST_CASE( eip1559RpcMethods ) { for (Json::Value::ArrayIndex i = 0; i < blockCnt; ++i) { BOOST_REQUIRE( feeHistory["baseFeePerGas"][i].isString() ); + std::string estimatedBaseFeePerGas = EIP1559TransactionsPatch::isEnabledWhen( + fixture.client->blockInfo( i ).timestamp() ) ? toJS( fixture.client->blockInfo( i ).timestamp() ) : toJS( 0 ); + BOOST_REQUIRE( feeHistory["baseFeePerGas"][i].asString() == estimatedBaseFeePerGas ); BOOST_REQUIRE_GT( feeHistory["gasUsedRatio"][i].asDouble(), 0 ); BOOST_REQUIRE_GT( 1, feeHistory["gasUsedRatio"][i].asDouble() ); for ( Json::Value::ArrayIndex j = 0; j < percentiles.size(); ++j ) { From 41c3a8782e3d9bc1b47b4b0571e906e7fb8a307c Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Mon, 22 Apr 2024 16:23:55 +0100 Subject: [PATCH 097/154] #1719 add eip1559PatchTimestamp --- libethcore/TransactionBase.cpp | 10 +++++++--- libethcore/TransactionBase.h | 10 +++++----- libethereum/Block.cpp | 3 ++- libethereum/BlockChain.cpp | 8 +++++--- libethereum/ClientBase.cpp | 17 ++++++++++------- libethereum/SkaleHost.cpp | 6 ++++-- libethereum/Transaction.cpp | 10 ++++++---- libethereum/Transaction.h | 8 ++++---- libethereum/TransactionQueue.cpp | 4 +++- libweb3jsonrpc/Eth.cpp | 7 ++++--- 10 files changed, 50 insertions(+), 33 deletions(-) diff --git a/libethcore/TransactionBase.cpp b/libethcore/TransactionBase.cpp index 21d2180e5..7dfa8b738 100644 --- a/libethcore/TransactionBase.cpp +++ b/libethcore/TransactionBase.cpp @@ -326,11 +326,15 @@ TransactionType TransactionBase::getTransactionType( bytesConstRef _rlp ) { } TransactionBase::TransactionBase( - bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid ) { + bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid, bool _eip1559Enabled ) { MICROPROFILE_SCOPEI( "TransactionBase", "ctor", MP_GOLD2 ); try { - TransactionType txnType = getTransactionType( _rlpData ); - fillFromBytesByType( _rlpData, _checkSig, _allowInvalid, txnType ); + if ( _eip1559Enabled ) { + TransactionType txnType = getTransactionType( _rlpData ); + fillFromBytesByType( _rlpData, _checkSig, _allowInvalid, txnType ); + } else { + fillFromBytesLegacy( _rlpData, _checkSig, _allowInvalid ); + } } catch ( ... ) { m_type = Type::Invalid; RLPStream s; diff --git a/libethcore/TransactionBase.h b/libethcore/TransactionBase.h index 431f0dd8c..310ef741a 100644 --- a/libethcore/TransactionBase.h +++ b/libethcore/TransactionBase.h @@ -98,13 +98,13 @@ class TransactionBase { m_type( ContractCreation ) {} /// Constructs a transaction from the given RLP. - explicit TransactionBase( - bytesConstRef _rlp, CheckTransaction _checkSig, bool _allowInvalid = false ); + explicit TransactionBase( bytesConstRef _rlp, CheckTransaction _checkSig, + bool _allowInvalid = false, bool _eip1559Enabled = false ); /// Constructs a transaction from the given RLP. - explicit TransactionBase( - bytes const& _rlp, CheckTransaction _checkSig, bool _allowInvalid = false ) - : TransactionBase( &_rlp, _checkSig, _allowInvalid ) {} + explicit TransactionBase( bytes const& _rlp, CheckTransaction _checkSig, + bool _allowInvalid = false, bool _eip1559Enabled = false ) + : TransactionBase( &_rlp, _checkSig, _allowInvalid, _eip1559Enabled ) {} TransactionBase( TransactionBase const& ) = default; diff --git a/libethereum/Block.cpp b/libethereum/Block.cpp index 23fe1deac..f9de3c7e7 100644 --- a/libethereum/Block.cpp +++ b/libethereum/Block.cpp @@ -1018,7 +1018,8 @@ void Block::commitToSeal( receiptsMap.insert( std::make_pair( k.out(), receiptrlp.out() ) ); dev::bytes txOutput = m_transactions[i].toBytes(); - if ( m_transactions[i].txType() != dev::eth::TransactionType::Legacy ) { + if ( EIP1559TransactionsPatch::isEnabledInWorkingBlock() && + m_transactions[i].txType() != dev::eth::TransactionType::Legacy ) { RLPStream s; s.append( txOutput ); txOutput = s.out(); diff --git a/libethereum/BlockChain.cpp b/libethereum/BlockChain.cpp index bb5a049b7..0a3695c56 100644 --- a/libethereum/BlockChain.cpp +++ b/libethereum/BlockChain.cpp @@ -1736,9 +1736,11 @@ VerifiedBlockRef BlockChain::verifyBlock( bytesConstRef _block, for ( RLP const& tr : r[1] ) { bytesConstRef d = bytesRefFromTransactionRlp( tr ); try { - Transaction t( d, ( _ir & ImportRequirements::TransactionSignatures ) ? - CheckTransaction::Everything : - CheckTransaction::None ); + Transaction t( d, + ( _ir & ImportRequirements::TransactionSignatures ) ? + CheckTransaction::Everything : + CheckTransaction::None, + EIP1559TransactionsPatch::isEnabledInWorkingBlock() ); Ethash::verifyTransaction( chainParams(), _ir, t, this->info( numberHash( h.number() - 1 ) ).timestamp(), h, 0 ); // the gasUsed vs diff --git a/libethereum/ClientBase.cpp b/libethereum/ClientBase.cpp index 387e66b46..f539f756d 100644 --- a/libethereum/ClientBase.cpp +++ b/libethereum/ClientBase.cpp @@ -389,7 +389,8 @@ BlockDetails ClientBase::blockDetails( h256 _hash ) const { Transaction ClientBase::transaction( h256 _transactionHash ) const { // allow invalid! - return Transaction( bc().transaction( _transactionHash ), CheckTransaction::Cheap, true ); + return Transaction( bc().transaction( _transactionHash ), CheckTransaction::Cheap, true, + EIP1559TransactionsPatch::isEnabledInWorkingBlock() ); } LocalisedTransaction ClientBase::localisedTransaction( h256 const& _transactionHash ) const { @@ -402,15 +403,16 @@ Transaction ClientBase::transaction( h256 _blockHash, unsigned _i ) const { RLP b( bl ); if ( _i < b[1].itemCount() ) // allow invalid - return Transaction( b[1][_i].data(), CheckTransaction::Cheap, true ); + return Transaction( b[1][_i].data(), CheckTransaction::Cheap, true, + EIP1559TransactionsPatch::isEnabledInWorkingBlock() ); else return Transaction(); } LocalisedTransaction ClientBase::localisedTransaction( h256 const& _blockHash, unsigned _i ) const { // allow invalid - Transaction t = - Transaction( bc().transaction( _blockHash, _i ), CheckTransaction::Cheap, true ); + Transaction t = Transaction( bc().transaction( _blockHash, _i ), CheckTransaction::Cheap, true, + EIP1559TransactionsPatch::isEnabledInWorkingBlock() ); return LocalisedTransaction( t, _blockHash, _i, numberFromHash( _blockHash ) ); } @@ -422,8 +424,8 @@ LocalisedTransactionReceipt ClientBase::localisedTransactionReceipt( h256 const& _transactionHash ) const { std::pair< h256, unsigned > tl = bc().transactionLocation( _transactionHash ); // allow invalid - Transaction t = - Transaction( bc().transaction( tl.first, tl.second ), CheckTransaction::Cheap, true ); + Transaction t = Transaction( bc().transaction( tl.first, tl.second ), CheckTransaction::Cheap, + true, EIP1559TransactionsPatch::isEnabledInWorkingBlock() ); TransactionReceipt tr = bc().transactionReceipt( tl.first, tl.second ); u256 gasUsed = tr.cumulativeGasUsed(); if ( tl.second > 0 ) @@ -455,7 +457,8 @@ Transactions ClientBase::transactions( h256 _blockHash ) const { Transactions res; for ( unsigned i = 0; i < b[1].itemCount(); i++ ) { auto txRlp = b[1][i]; - res.emplace_back( bytesRefFromTransactionRlp( txRlp ), CheckTransaction::Cheap, true ); + res.emplace_back( bytesRefFromTransactionRlp( txRlp ), CheckTransaction::Cheap, true, + EIP1559TransactionsPatch::isEnabledInWorkingBlock() ); } return res; } diff --git a/libethereum/SkaleHost.cpp b/libethereum/SkaleHost.cpp index 8cab6935b..0f525a21f 100644 --- a/libethereum/SkaleHost.cpp +++ b/libethereum/SkaleHost.cpp @@ -332,7 +332,8 @@ h256 SkaleHost::receiveTransaction( std::string _rlp ) { return h256(); } - Transaction transaction( jsToBytes( _rlp, OnFailed::Throw ), CheckTransaction::None ); + Transaction transaction( jsToBytes( _rlp, OnFailed::Throw ), CheckTransaction::None, + EIP1559TransactionsPatch::isEnabledInWorkingBlock() ); h256 sha = transaction.sha3(); @@ -668,7 +669,8 @@ void SkaleHost::createBlock( const ConsensusExtFace::transactions_vector& _appro // for test std::thread( [t, this]() { m_client.importTransaction( t ); } // ).detach(); } else { - Transaction t( data, CheckTransaction::Everything, true ); + Transaction t( data, CheckTransaction::Everything, true, + EIP1559TransactionsPatch::isEnabledInWorkingBlock() ); t.checkOutExternalGas( m_client.chainParams(), latestInfo.timestamp(), m_client.number(), false ); out_txns.push_back( t ); diff --git a/libethereum/Transaction.cpp b/libethereum/Transaction.cpp index 2d8f80f6e..d2c7f9962 100644 --- a/libethereum/Transaction.cpp +++ b/libethereum/Transaction.cpp @@ -164,11 +164,13 @@ Transaction::Transaction( const u256& _value, const u256& _gasPrice, const u256& const bytes& _data, const u256& _nonce ) : TransactionBase( _value, _gasPrice, _gas, _data, _nonce ) {} -Transaction::Transaction( bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid ) - : TransactionBase( _rlpData, _checkSig, _allowInvalid ) {} +Transaction::Transaction( + bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid, bool _eip1559Enabled ) + : TransactionBase( _rlpData, _checkSig, _allowInvalid, _eip1559Enabled ) {} -Transaction::Transaction( const bytes& _rlp, CheckTransaction _checkSig, bool _allowInvalid ) - : Transaction( &_rlp, _checkSig, _allowInvalid ) {} +Transaction::Transaction( + const bytes& _rlp, CheckTransaction _checkSig, bool _allowInvalid, bool _eip1559Enabled ) + : Transaction( &_rlp, _checkSig, _allowInvalid, _eip1559Enabled ) {} bool Transaction::hasExternalGas() const { if ( !m_externalGasIsChecked ) { diff --git a/libethereum/Transaction.h b/libethereum/Transaction.h index e35edf50b..9d3894f31 100644 --- a/libethereum/Transaction.h +++ b/libethereum/Transaction.h @@ -107,12 +107,12 @@ class Transaction : public TransactionBase { u256 const& _nonce = Invalid256 ); /// Constructs a transaction from the given RLP. - explicit Transaction( - bytesConstRef _rlp, CheckTransaction _checkSig, bool _allowInvalid = false ); + explicit Transaction( bytesConstRef _rlp, CheckTransaction _checkSig, + bool _allowInvalid = false, bool _eip1559Enabled = false ); /// Constructs a transaction from the given RLP. - explicit Transaction( - bytes const& _rlp, CheckTransaction _checkSig, bool _allowInvalid = false ); + explicit Transaction( bytes const& _rlp, CheckTransaction _checkSig, bool _allowInvalid = false, + bool _eip1559Enabled = false ); Transaction( Transaction const& ) = default; diff --git a/libethereum/TransactionQueue.cpp b/libethereum/TransactionQueue.cpp index 284e5c648..e2ed6960d 100644 --- a/libethereum/TransactionQueue.cpp +++ b/libethereum/TransactionQueue.cpp @@ -26,6 +26,7 @@ #include "Transaction.h" #include #include +#include #include #include @@ -94,7 +95,8 @@ void TransactionQueue::HandleDestruction() { ImportResult TransactionQueue::import( bytesConstRef _transactionRLP, IfDropped _ik, bool _isFuture ) { try { - Transaction t = Transaction( _transactionRLP, CheckTransaction::Everything ); + Transaction t = Transaction( _transactionRLP, CheckTransaction::Everything, false, + EIP1559TransactionsPatch::isEnabledInWorkingBlock() ); return import( t, _ik, _isFuture ); } catch ( Exception const& ) { return ImportResult::Malformed; diff --git a/libweb3jsonrpc/Eth.cpp b/libweb3jsonrpc/Eth.cpp index be43d7e58..b50ec9416 100644 --- a/libweb3jsonrpc/Eth.cpp +++ b/libweb3jsonrpc/Eth.cpp @@ -410,8 +410,8 @@ Json::Value Eth::setSchainExitTime( Json::Value const& /*_transaction*/ ) { Json::Value Eth::eth_inspectTransaction( std::string const& _rlp ) { try { - return toJson( - Transaction( jsToBytes( _rlp, OnFailed::Throw ), CheckTransaction::Everything ) ); + return toJson( Transaction( jsToBytes( _rlp, OnFailed::Throw ), + CheckTransaction::Everything, EIP1559TransactionsPatch::isEnabledInWorkingBlock() ) ); } catch ( ... ) { BOOST_THROW_EXCEPTION( JsonRpcException( Errors::ERROR_RPC_INVALID_PARAMS ) ); } @@ -422,7 +422,8 @@ Json::Value Eth::eth_inspectTransaction( std::string const& _rlp ) { string Eth::eth_sendRawTransaction( std::string const& _rlp ) { // Don't need to check the transaction signature (CheckTransaction::None) since it // will be checked as a part of transaction import - Transaction t( jsToBytes( _rlp, OnFailed::Throw ), CheckTransaction::None ); + Transaction t( jsToBytes( _rlp, OnFailed::Throw ), CheckTransaction::None, + EIP1559TransactionsPatch::isEnabledInWorkingBlock() ); return toJS( client()->importTransaction( t ) ); } From 798f2b1c3104d03f7c9a0117958d57a7eb5d7911 Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Mon, 22 Apr 2024 17:04:28 +0100 Subject: [PATCH 098/154] #1719 fix tests --- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index 5a180904b..fec235c8a 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -3030,7 +3030,7 @@ BOOST_AUTO_TEST_CASE( eip1559RpcMethods ) { // Set chainID = 151 ret["params"]["chainID"] = "0x97"; - time_t eip1559PatchActivationTimestamp = time(nullptr) + 8; + time_t eip1559PatchActivationTimestamp = time(nullptr) + 5; ret["skaleConfig"]["sChain"]["EIP1559TransactionsPatchTimestamp"] = eip1559PatchActivationTimestamp; Json::FastWriter fastWriter; @@ -3072,7 +3072,7 @@ BOOST_AUTO_TEST_CASE( eip1559RpcMethods ) { for (Json::Value::ArrayIndex i = 0; i < blockCnt; ++i) { BOOST_REQUIRE( feeHistory["baseFeePerGas"][i].isString() ); std::string estimatedBaseFeePerGas = EIP1559TransactionsPatch::isEnabledWhen( - fixture.client->blockInfo( i ).timestamp() ) ? toJS( fixture.client->blockInfo( i ).timestamp() ) : toJS( 0 ); + fixture.client->blockInfo( bn - i ).timestamp() ) ? toJS( fixture.client->gasBidPrice( bn - i ) ) : toJS( 0 ); BOOST_REQUIRE( feeHistory["baseFeePerGas"][i].asString() == estimatedBaseFeePerGas ); BOOST_REQUIRE_GT( feeHistory["gasUsedRatio"][i].asDouble(), 0 ); BOOST_REQUIRE_GT( 1, feeHistory["gasUsedRatio"][i].asDouble() ); From dfb3f3e4aba50f90db6d08b3d7d05cae130780cb Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Mon, 22 Apr 2024 19:45:58 +0100 Subject: [PATCH 099/154] #1719 add patchTimestamp to tests --- libethereum/BlockChain.cpp | 4 +- libethereum/ClientBase.cpp | 10 ++-- libweb3jsonrpc/Eth.cpp | 2 +- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 58 ++++++++++++++++++----- 4 files changed, 55 insertions(+), 19 deletions(-) diff --git a/libethereum/BlockChain.cpp b/libethereum/BlockChain.cpp index 0a3695c56..fc389ab62 100644 --- a/libethereum/BlockChain.cpp +++ b/libethereum/BlockChain.cpp @@ -1739,8 +1739,8 @@ VerifiedBlockRef BlockChain::verifyBlock( bytesConstRef _block, Transaction t( d, ( _ir & ImportRequirements::TransactionSignatures ) ? CheckTransaction::Everything : - CheckTransaction::None, - EIP1559TransactionsPatch::isEnabledInWorkingBlock() ); + CheckTransaction::None, false, + EIP1559TransactionsPatch::isEnabledWhen( h.timestamp() ) ); Ethash::verifyTransaction( chainParams(), _ir, t, this->info( numberHash( h.number() - 1 ) ).timestamp(), h, 0 ); // the gasUsed vs diff --git a/libethereum/ClientBase.cpp b/libethereum/ClientBase.cpp index f539f756d..d0267a3f9 100644 --- a/libethereum/ClientBase.cpp +++ b/libethereum/ClientBase.cpp @@ -389,8 +389,9 @@ BlockDetails ClientBase::blockDetails( h256 _hash ) const { Transaction ClientBase::transaction( h256 _transactionHash ) const { // allow invalid! + auto tl = bc().transactionLocation( _transactionHash ); return Transaction( bc().transaction( _transactionHash ), CheckTransaction::Cheap, true, - EIP1559TransactionsPatch::isEnabledInWorkingBlock() ); + EIP1559TransactionsPatch::isEnabledWhen( blockInfo( tl.first ).timestamp() ) ); } LocalisedTransaction ClientBase::localisedTransaction( h256 const& _transactionHash ) const { @@ -404,15 +405,14 @@ Transaction ClientBase::transaction( h256 _blockHash, unsigned _i ) const { if ( _i < b[1].itemCount() ) // allow invalid return Transaction( b[1][_i].data(), CheckTransaction::Cheap, true, - EIP1559TransactionsPatch::isEnabledInWorkingBlock() ); + EIP1559TransactionsPatch::isEnabledWhen( blockInfo( _blockHash ).timestamp() ) ); else return Transaction(); } LocalisedTransaction ClientBase::localisedTransaction( h256 const& _blockHash, unsigned _i ) const { // allow invalid - Transaction t = Transaction( bc().transaction( _blockHash, _i ), CheckTransaction::Cheap, true, - EIP1559TransactionsPatch::isEnabledInWorkingBlock() ); + Transaction t = Transaction( bc().transaction( _blockHash, _i ), CheckTransaction::Cheap, true, EIP1559TransactionsPatch::isEnabledWhen( blockInfo( _blockHash ).timestamp() ) ); return LocalisedTransaction( t, _blockHash, _i, numberFromHash( _blockHash ) ); } @@ -425,7 +425,7 @@ LocalisedTransactionReceipt ClientBase::localisedTransactionReceipt( std::pair< h256, unsigned > tl = bc().transactionLocation( _transactionHash ); // allow invalid Transaction t = Transaction( bc().transaction( tl.first, tl.second ), CheckTransaction::Cheap, - true, EIP1559TransactionsPatch::isEnabledInWorkingBlock() ); + true, EIP1559TransactionsPatch::isEnabledWhen( blockInfo( tl.first ).timestamp() ) ); TransactionReceipt tr = bc().transactionReceipt( tl.first, tl.second ); u256 gasUsed = tr.cumulativeGasUsed(); if ( tl.second > 0 ) diff --git a/libweb3jsonrpc/Eth.cpp b/libweb3jsonrpc/Eth.cpp index b50ec9416..cf1c8d1b3 100644 --- a/libweb3jsonrpc/Eth.cpp +++ b/libweb3jsonrpc/Eth.cpp @@ -422,7 +422,7 @@ Json::Value Eth::eth_inspectTransaction( std::string const& _rlp ) { string Eth::eth_sendRawTransaction( std::string const& _rlp ) { // Don't need to check the transaction signature (CheckTransaction::None) since it // will be checked as a part of transaction import - Transaction t( jsToBytes( _rlp, OnFailed::Throw ), CheckTransaction::None, + Transaction t( jsToBytes( _rlp, OnFailed::Throw ), CheckTransaction::None, false, EIP1559TransactionsPatch::isEnabledInWorkingBlock() ); return toJS( client()->importTransaction( t ) ); } diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index fec235c8a..f11800574 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -2774,6 +2774,8 @@ BOOST_AUTO_TEST_CASE( eip2930Transactions ) { // Set chainID = 151 ret["params"]["chainID"] = "0x97"; + time_t eip1559PatchActivationTimestamp = time(nullptr) + 10; + ret["skaleConfig"]["sChain"]["EIP1559TransactionsPatchTimestamp"] = eip1559PatchActivationTimestamp; Json::FastWriter fastWriter; std::string config = fastWriter.write( ret ); @@ -2802,6 +2804,22 @@ BOOST_AUTO_TEST_CASE( eip2930Transactions ) { BOOST_REQUIRE( fixture.rpcClient->eth_getBalance( "0xc868AF52a6549c773082A334E5AE232e0Ea3B513", "latest" ) == "0x16345785d8a0000" ); + // try sending type1 txn before patchTimestmap + BOOST_REQUIRE_THROW( fixture.rpcClient->eth_sendRawTransaction( "0x01f8678197808504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180c001a01ebdc546c8b85511b7ba831f47c4981069d7af972d10b7dce2c57225cb5df6a7a055ae1e84fea41d37589eb740a0a93017a5cd0e9f10ee50f165bf4b1b4c78ddae" ), jsonrpc::JsonRpcException ); // INVALID_PARAMS + sleep( 10 ); + + // force 1 block to update timestamp + txRefill["to"] = "0xc868AF52a6549c773082A334E5AE232e0Ea3B513"; + txRefill["from"] = senderAddress; + txRefill["gas"] = "100000"; + txRefill["gasPrice"] = fixture.rpcClient->eth_gasPrice(); + txRefill["value"] = 0; + txHash = fixture.rpcClient->eth_sendTransaction( txRefill ); + dev::eth::mineTransaction( *( fixture.client ), 1 ); + receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); + BOOST_REQUIRE( receipt["status"] == string( "0x1" ) ); + BOOST_REQUIRE( receipt["type"] == "0x0" ); + // send 1 WEI from 0xc868AF52a6549c773082A334E5AE232e0Ea3B513 to 0x7D36aF85A184E220A656525fcBb9A63B9ab3C12b // encoded type 1 txn txHash = fixture.rpcClient->eth_sendRawTransaction( "0x01f8678197808504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180c001a01ebdc546c8b85511b7ba831f47c4981069d7af972d10b7dce2c57225cb5df6a7a055ae1e84fea41d37589eb740a0a93017a5cd0e9f10ee50f165bf4b1b4c78ddae" ); @@ -2814,15 +2832,15 @@ BOOST_AUTO_TEST_CASE( eip2930Transactions ) { // compare with txn hash from geth BOOST_REQUIRE( txHash == "0xc843560015a655b8f81f65a458be9019bdb5cd8e416b6329ca18f36de0b8244d" ); - BOOST_REQUIRE( dev::toHexPrefixed( fixture.client->transactions( 3 )[0].toBytes() ) == "0x01f8678197808504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180c001a01ebdc546c8b85511b7ba831f47c4981069d7af972d10b7dce2c57225cb5df6a7a055ae1e84fea41d37589eb740a0a93017a5cd0e9f10ee50f165bf4b1b4c78ddae" ); + BOOST_REQUIRE( dev::toHexPrefixed( fixture.client->transactions( 4 )[0].toBytes() ) == "0x01f8678197808504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180c001a01ebdc546c8b85511b7ba831f47c4981069d7af972d10b7dce2c57225cb5df6a7a055ae1e84fea41d37589eb740a0a93017a5cd0e9f10ee50f165bf4b1b4c78ddae" ); BOOST_REQUIRE( fixture.rpcClient->eth_getBalance( "0x7D36aF85A184E220A656525fcBb9A63B9ab3C12b", "latest" ) == "0x1" ); - auto block = fixture.rpcClient->eth_getBlockByNumber( "3", false ); + auto block = fixture.rpcClient->eth_getBlockByNumber( "4", false ); BOOST_REQUIRE( block["transactions"].size() == 1 ); BOOST_REQUIRE( block["transactions"][0].asString() == txHash ); - block = fixture.rpcClient->eth_getBlockByNumber( "3", true ); + block = fixture.rpcClient->eth_getBlockByNumber( "4", true ); BOOST_REQUIRE( block["transactions"].size() == 1 ); BOOST_REQUIRE( block["transactions"][0]["hash"].asString() == txHash ); BOOST_REQUIRE( block["transactions"][0]["type"] == "0x1" ); @@ -2850,7 +2868,7 @@ BOOST_AUTO_TEST_CASE( eip2930Transactions ) { BOOST_REQUIRE( toJS( jsToInt( result["yParity"].asString() ) + 35 + 2 * fixture.client->chainParams().chainID ) == result["v"].asString() ); BOOST_REQUIRE( result["accessList"].isArray() ); - result = fixture.rpcClient->eth_getTransactionByBlockNumberAndIndex( "0x3", "0x0" ); + result = fixture.rpcClient->eth_getTransactionByBlockNumberAndIndex( "0x4", "0x0" ); BOOST_REQUIRE( result["hash"].asString() == txHash ); BOOST_REQUIRE( result["type"] == "0x1" ); BOOST_REQUIRE( toJS( jsToInt( result["yParity"].asString() ) + 35 + 2 * fixture.client->chainParams().chainID ) == result["v"].asString() ); @@ -2868,7 +2886,7 @@ BOOST_AUTO_TEST_CASE( eip2930Transactions ) { // compare with txn hash from geth BOOST_REQUIRE( txHash == "0xa6d3541e06dff71fb8344a4db2a4ad4e0b45024eb23a8f568982b70a5f50f94d" ); - BOOST_REQUIRE( dev::toHexPrefixed( fixture.client->transactions( 4 )[0].toBytes() ) == "0x01f8c38197018504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000000780a0b03eaf481958e22fc39bd1d526eb9255be1e6625614f02ca939e51c3d7e64bcaa05f675640c04bb050d27bd1f39c07b6ff742311b04dab760bb3bc206054332879" ); + BOOST_REQUIRE( dev::toHexPrefixed( fixture.client->transactions( 5 )[0].toBytes() ) == "0x01f8c38197018504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000000780a0b03eaf481958e22fc39bd1d526eb9255be1e6625614f02ca939e51c3d7e64bcaa05f675640c04bb050d27bd1f39c07b6ff742311b04dab760bb3bc206054332879" ); result = fixture.rpcClient->eth_getTransactionByHash( txHash ); BOOST_REQUIRE( result["type"] == "0x1" ); @@ -2881,7 +2899,7 @@ BOOST_AUTO_TEST_CASE( eip2930Transactions ) { BOOST_REQUIRE( result["accessList"][0]["storageKeys"][0].asString() == "0x0000000000000000000000000000000000000000000000000000000000000003" ); BOOST_REQUIRE( result["accessList"][0]["storageKeys"][1].asString() == "0x0000000000000000000000000000000000000000000000000000000000000007" ); - block = fixture.rpcClient->eth_getBlockByNumber( "4", true ); + block = fixture.rpcClient->eth_getBlockByNumber( "5", true ); result = block["transactions"][0]; BOOST_REQUIRE( result["type"] == "0x1" ); BOOST_REQUIRE( result["accessList"].isArray() ); @@ -2901,6 +2919,8 @@ BOOST_AUTO_TEST_CASE( eip1559Transactions ) { // Set chainID = 151 ret["params"]["chainID"] = "0x97"; + time_t eip1559PatchActivationTimestamp = time(nullptr) + 10; + ret["skaleConfig"]["sChain"]["EIP1559TransactionsPatchTimestamp"] = eip1559PatchActivationTimestamp; Json::FastWriter fastWriter; std::string config = fastWriter.write( ret ); @@ -2929,6 +2949,22 @@ BOOST_AUTO_TEST_CASE( eip1559Transactions ) { BOOST_REQUIRE( fixture.rpcClient->eth_getBalance( "0x5EdF1e852fdD1B0Bc47C0307EF755C76f4B9c251", "latest" ) == "0x16345785d8a0000" ); + // try sending type2 txn before patchTimestmap + BOOST_REQUIRE_THROW( fixture.rpcClient->eth_sendRawTransaction( "0x02f8c98197808504a817c8008504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000000780a0f1a407dfc1a9f782001d89f617e9b3a2f295378533784fb39960dea60beea2d0a05ac3da2946554ba3d5721850f4f89ee7a0c38e4acab7130908e7904d13174388" ), jsonrpc::JsonRpcException ); // INVALID_PARAMS + sleep( 10 ); + + // force 1 block to update timestamp + txRefill["to"] = "0xc868AF52a6549c773082A334E5AE232e0Ea3B513"; + txRefill["from"] = senderAddress; + txRefill["gas"] = "100000"; + txRefill["gasPrice"] = fixture.rpcClient->eth_gasPrice(); + txRefill["value"] = 0; + txHash = fixture.rpcClient->eth_sendTransaction( txRefill ); + dev::eth::mineTransaction( *( fixture.client ), 1 ); + receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); + BOOST_REQUIRE( receipt["status"] == string( "0x1" ) ); + BOOST_REQUIRE( receipt["type"] == "0x0" ); + // send 1 WEI from 0x5EdF1e852fdD1B0Bc47C0307EF755C76f4B9c251 to 0x7D36aF85A184E220A656525fcBb9A63B9ab3C12b // encoded type 2 txn txHash = fixture.rpcClient->eth_sendRawTransaction( "0x02f8c98197808504a817c8008504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000000780a0f1a407dfc1a9f782001d89f617e9b3a2f295378533784fb39960dea60beea2d0a05ac3da2946554ba3d5721850f4f89ee7a0c38e4acab7130908e7904d13174388" ); @@ -2941,16 +2977,16 @@ BOOST_AUTO_TEST_CASE( eip1559Transactions ) { // compare with txn hash from geth BOOST_REQUIRE( txHash == "0x7bd586e93e3012577de4ba33e3b887baf520cbb92c5dd10996b262f9c5c8f747" ); - std::cout << dev::toHexPrefixed( fixture.client->transactions( 3 )[0].toBytes() ) << '\n'; - BOOST_REQUIRE( dev::toHexPrefixed( fixture.client->transactions( 3 )[0].toBytes() ) == "0x02f8c98197808504a817c8008504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000000780a0f1a407dfc1a9f782001d89f617e9b3a2f295378533784fb39960dea60beea2d0a05ac3da2946554ba3d5721850f4f89ee7a0c38e4acab7130908e7904d13174388" ); + std::cout << dev::toHexPrefixed( fixture.client->transactions( 4 )[0].toBytes() ) << '\n'; + BOOST_REQUIRE( dev::toHexPrefixed( fixture.client->transactions( 4 )[0].toBytes() ) == "0x02f8c98197808504a817c8008504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000000780a0f1a407dfc1a9f782001d89f617e9b3a2f295378533784fb39960dea60beea2d0a05ac3da2946554ba3d5721850f4f89ee7a0c38e4acab7130908e7904d13174388" ); BOOST_REQUIRE( fixture.rpcClient->eth_getBalance( "0x7D36aF85A184E220A656525fcBb9A63B9ab3C12b", "latest" ) == "0x1" ); - auto block = fixture.rpcClient->eth_getBlockByNumber( "3", false ); + auto block = fixture.rpcClient->eth_getBlockByNumber( "4", false ); BOOST_REQUIRE( block["transactions"].size() == 1 ); BOOST_REQUIRE( block["transactions"][0].asString() == txHash ); - block = fixture.rpcClient->eth_getBlockByNumber( "3", true ); + block = fixture.rpcClient->eth_getBlockByNumber( "4", true ); BOOST_REQUIRE( !block["baseFeePerGas"].asString().empty() ); BOOST_REQUIRE( block["transactions"].size() == 1 ); BOOST_REQUIRE( block["transactions"][0]["hash"].asString() == txHash ); @@ -2980,7 +3016,7 @@ BOOST_AUTO_TEST_CASE( eip1559Transactions ) { BOOST_REQUIRE( result["maxPriorityFeePerGas"] == "0x4a817c800" ); BOOST_REQUIRE( result["maxFeePerGas"] == "0x4a817c800" ); - result = fixture.rpcClient->eth_getTransactionByBlockNumberAndIndex( "0x3", "0x0" ); + result = fixture.rpcClient->eth_getTransactionByBlockNumberAndIndex( "0x4", "0x0" ); BOOST_REQUIRE( result["hash"].asString() == txHash ); BOOST_REQUIRE( result["type"] == "0x2" ); BOOST_REQUIRE( toJS( jsToInt( result["yParity"].asString() ) + 35 + 2 * fixture.client->chainParams().chainID ) == result["v"].asString() ); From 7fb0ac2e3b7c7280a2a3d1c49773d0b0500d72cd Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Mon, 22 Apr 2024 19:47:53 +0100 Subject: [PATCH 100/154] #1719 small fixes --- libethereum/BlockChain.cpp | 4 ++-- libethereum/ClientBase.cpp | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/libethereum/BlockChain.cpp b/libethereum/BlockChain.cpp index fc389ab62..0ae82f506 100644 --- a/libethereum/BlockChain.cpp +++ b/libethereum/BlockChain.cpp @@ -1739,8 +1739,8 @@ VerifiedBlockRef BlockChain::verifyBlock( bytesConstRef _block, Transaction t( d, ( _ir & ImportRequirements::TransactionSignatures ) ? CheckTransaction::Everything : - CheckTransaction::None, false, - EIP1559TransactionsPatch::isEnabledWhen( h.timestamp() ) ); + CheckTransaction::None, + false, EIP1559TransactionsPatch::isEnabledWhen( h.timestamp() ) ); Ethash::verifyTransaction( chainParams(), _ir, t, this->info( numberHash( h.number() - 1 ) ).timestamp(), h, 0 ); // the gasUsed vs diff --git a/libethereum/ClientBase.cpp b/libethereum/ClientBase.cpp index d0267a3f9..8c6377967 100644 --- a/libethereum/ClientBase.cpp +++ b/libethereum/ClientBase.cpp @@ -412,7 +412,8 @@ Transaction ClientBase::transaction( h256 _blockHash, unsigned _i ) const { LocalisedTransaction ClientBase::localisedTransaction( h256 const& _blockHash, unsigned _i ) const { // allow invalid - Transaction t = Transaction( bc().transaction( _blockHash, _i ), CheckTransaction::Cheap, true, EIP1559TransactionsPatch::isEnabledWhen( blockInfo( _blockHash ).timestamp() ) ); + Transaction t = Transaction( bc().transaction( _blockHash, _i ), CheckTransaction::Cheap, true, + EIP1559TransactionsPatch::isEnabledWhen( blockInfo( _blockHash ).timestamp() ) ); return LocalisedTransaction( t, _blockHash, _i, numberFromHash( _blockHash ) ); } From 31f49afb8fa74c07bfb11f3d84001d6f302f8519 Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Tue, 23 Apr 2024 10:35:59 +0100 Subject: [PATCH 101/154] #1719 fix tests --- test/unittests/libethereum/Transaction.cpp | 36 +++++++++++----------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/test/unittests/libethereum/Transaction.cpp b/test/unittests/libethereum/Transaction.cpp index 55713652d..3104cc46f 100644 --- a/test/unittests/libethereum/Transaction.cpp +++ b/test/unittests/libethereum/Transaction.cpp @@ -51,7 +51,7 @@ BOOST_AUTO_TEST_CASE( TransactionGasRequired, "000000000000000000000000000000000000000000000000000000000000780a08ae3a721ee02" "cf52d85ecec934c6f46ea3e96d6355eb8ccde261e1e419885761a0234565f6d227d8eba0937b0" "f03cb25f83aeb24c13b7a39a9ef6e80c1ea272a3c" ), - CheckTransaction::None ); + CheckTransaction::None, false, true ); BOOST_CHECK_EQUAL( tr.baseGasRequired( HomesteadSchedule ), 14 * 68 + 21000 ); BOOST_CHECK_EQUAL( tr.baseGasRequired( IstanbulSchedule ), 14 * 16 + 21000 ); @@ -62,7 +62,7 @@ BOOST_AUTO_TEST_CASE( TransactionGasRequired, "0000003a0000000000000000000000000000000000000000000000000000000000000000780a0" "23927f0e208494bd1fd8876597899d72025167fed902e9c1c417ddd8639bb7b4a02a63ea48f7e" "94df3a40c4a840ba98da02f13817acb5fe137d40f632e6c8ed367" ), - CheckTransaction::None ); + CheckTransaction::None, false, true ); BOOST_CHECK_EQUAL( tr.baseGasRequired( HomesteadSchedule ), 14 * 68 + 21000 ); BOOST_CHECK_EQUAL( tr.baseGasRequired( IstanbulSchedule ), 14 * 16 + 21000 ); } @@ -86,7 +86,7 @@ BOOST_AUTO_TEST_CASE( TransactionWithEmptyRecepient ) { "000003a0000000000000000000000000000000000000000000000000000000000000000780a08d795591e0eb53" "fb374a804ba3f73cf291069549d62316219811c3f7fb8cfad0a07e9d0bd7fabc8f74475624c912b5334dc49224" "b1dede6c802d52a35254bfc457" ); - tx = Transaction( txRlp, CheckTransaction::None ); // shouldn't throw + tx = Transaction( txRlp, CheckTransaction::None, false, true ); // shouldn't throw // recipient RLP is 0xc0 (empty list) txRlp = fromHex( @@ -95,7 +95,7 @@ BOOST_AUTO_TEST_CASE( TransactionWithEmptyRecepient ) { "000003a0000000000000000000000000000000000000000000000000000000000000000780a08d795591e0eb53" "fb374a804ba3f73cf291069549d62316219811c3f7fb8cfad0a07e9d0bd7fabc8f74475624c912b5334dc49224" "b1dede6c802d52a35254bfc457" ); - BOOST_REQUIRE_THROW( Transaction( txRlp, CheckTransaction::None ), InvalidTransactionFormat ); + BOOST_REQUIRE_THROW( Transaction( txRlp, CheckTransaction::None, false, true ), InvalidTransactionFormat ); txRlp = fromHex( "0x02f8c38197808504a817c8008504a817c80082753080018e0358ac39584bc98a7c979f984b03f85bf85994de" @@ -103,7 +103,7 @@ BOOST_AUTO_TEST_CASE( TransactionWithEmptyRecepient ) { "000000000000000003a0000000000000000000000000000000000000000000000000000000000000000780a0c8" "029a8b702d54c79ef18b557e755a1bfd8a4afcfcf31813790df34a6f740a95a00ceb8fdf611b4c9ff8d007d2a5" "44bc4bfae0e97a03e32b1c8b8208c82cebcafb" ); - tx = Transaction( txRlp, CheckTransaction::None ); // shouldn't throw + tx = Transaction( txRlp, CheckTransaction::None, false, true ); // shouldn't throw // recipient RLP is 0xc0 (empty list) txRlp = fromHex( @@ -112,7 +112,7 @@ BOOST_AUTO_TEST_CASE( TransactionWithEmptyRecepient ) { "000000000000000003a0000000000000000000000000000000000000000000000000000000000000000780a0c8" "029a8b702d54c79ef18b557e755a1bfd8a4afcfcf31813790df34a6f740a95a00ceb8fdf611b4c9ff8d007d2a5" "44bc4bfae0e97a03e32b1c8b8208c82cebcafb" ); - BOOST_REQUIRE_THROW( Transaction( txRlp, CheckTransaction::None ), InvalidTransactionFormat ); + BOOST_REQUIRE_THROW( Transaction( txRlp, CheckTransaction::None, false, true ), InvalidTransactionFormat ); } BOOST_AUTO_TEST_CASE( TransactionNotReplayProtected, @@ -132,7 +132,7 @@ BOOST_AUTO_TEST_CASE( TransactionNotReplayProtected, "0000000000000000000000000000000000000000000000000003a000000000000000000000000000000000" "0000000000000000000000000000000701a0a3b1de6f2958e1e34db86438bba310637f2e799fe9768a143a" "d87e47c33d1e6ca00e04ef9fe6bb01176c5a4c5bf4a070662478a320eaaff2895d17451c8d61d472" ); - BOOST_REQUIRE_THROW( Transaction( txRlp, CheckTransaction::None, false ), dev::BadCast ); + BOOST_REQUIRE_THROW( Transaction( txRlp, CheckTransaction::None, false, true ), dev::BadCast ); txRlp = fromHex( "0x02f8d5808504a817c8008504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b" @@ -141,7 +141,7 @@ BOOST_AUTO_TEST_CASE( TransactionNotReplayProtected, "000000000000000000000000000000000000000000000780a023927f0e208494bd1fd8876597899d720251" "67fed902e9c1c417ddd8639bb7b4a02a63ea48f7e94df3a40c4a840ba98da02f13817acb5fe137d40f632e" "6c8ed367" ); - BOOST_REQUIRE_THROW( Transaction( txRlp, CheckTransaction::None, false ), dev::BadCast ); + BOOST_REQUIRE_THROW( Transaction( txRlp, CheckTransaction::None, false, true ), dev::BadCast ); } BOOST_AUTO_TEST_CASE( TransactionChainIDMax64Bit, @@ -168,7 +168,7 @@ BOOST_AUTO_TEST_CASE( TransactionChainIDMax64Bit, "000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000" "00000000000000000000000000000000000701a0e236de02b843139aebfce593d680c06ce79cfd2f2e7f9dcac9" "fe23b38060591aa0734952245446ad42e47ec996c9a7b02973cbc8dd944c9622714416b2bef122f4" ); - tx1 = Transaction{txRlp1, CheckTransaction::None}; + tx1 = Transaction{txRlp1, CheckTransaction::None, false, true}; tx1.checkChainId( std::numeric_limits< uint64_t >::max(), false ); txRlp1 = fromHex( @@ -178,7 +178,7 @@ BOOST_AUTO_TEST_CASE( TransactionChainIDMax64Bit, "00000000000000000000000000000000000000000000000780a0b62465e633b565f2f3632125b452d8df66d4f6" "b48b58f59da6201234e3f9ce75a0467f18ca2b64f3642cb37e7d5470bbac5fbc62c66b23a0ff955b994803fcf3" "74" ); - tx1 = Transaction{txRlp1, CheckTransaction::None}; + tx1 = Transaction{txRlp1, CheckTransaction::None, false, true}; tx1.checkChainId( std::numeric_limits< uint64_t >::max(), false ); } @@ -204,7 +204,7 @@ BOOST_AUTO_TEST_CASE( TransactionChainIDBiggerThan64Bit ) { "0000000000000000000000000000000000000780a0e108b83ed5e1b701b249970e61d9ae409eb6870af96f1a9d" "8827f497375ae5c8a0795eb0b4f36fe712af5e6a8447802c9eb0913a2add86174552bf2e4b0e183feb" ); RLPStream rlpStream; - auto tx = Transaction( txRlp1, CheckTransaction::None ); + auto tx = Transaction( txRlp1, CheckTransaction::None, false, true ); auto txBytes = tx.toBytes(IncludeSignature::WithSignature); BOOST_REQUIRE( txBytes != txRlp1 ); @@ -215,7 +215,7 @@ BOOST_AUTO_TEST_CASE( TransactionChainIDBiggerThan64Bit ) { "0000000000000000000000000000000000000000000000000780a0912e3aad5af05008d3a282d2a76dc975d234" "4eb34e2500c924a58ccfdc9dbeb4a04afcffcb5d1897df030d45a7eeb3ceb7c7e6fe368fc47865156b4899de32" "01c7" ); - tx = Transaction( txRlp1, CheckTransaction::None ); + tx = Transaction( txRlp1, CheckTransaction::None, false, true ); txBytes = tx.toBytes(IncludeSignature::WithSignature); BOOST_REQUIRE( txBytes != txRlp1 ); } @@ -238,7 +238,7 @@ BOOST_AUTO_TEST_CASE( TransactionReplayProtected ) { "000000000000000003a0000000000000000000000000000000000000000000000000000000000000000780a0b0" "3eaf481958e22fc39bd1d526eb9255be1e6625614f02ca939e51c3d7e64bcaa05f675640c04bb050d27bd1f39c" "07b6ff742311b04dab760bb3bc206054332879" ); - tx = Transaction( txRlp, CheckTransaction::None ); + tx = Transaction( txRlp, CheckTransaction::None, false, true ); tx.checkChainId( 151, false ); BOOST_REQUIRE_THROW( tx.checkChainId( 123, false ), InvalidSignature ); @@ -250,7 +250,7 @@ BOOST_AUTO_TEST_CASE( TransactionReplayProtected ) { "000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000" "00000780a0f1a407dfc1a9f782001d89f617e9b3a2f295378533784fb39960dea60beea2d0a05ac3da2946554b" "a3d5721850f4f89ee7a0c38e4acab7130908e7904d13174388" ); - tx = Transaction( txRlp, CheckTransaction::None ); + tx = Transaction( txRlp, CheckTransaction::None, false, true ); tx.checkChainId( 151, false ); BOOST_REQUIRE_THROW( tx.checkChainId( 123, false ), InvalidSignature ); @@ -267,7 +267,7 @@ BOOST_AUTO_TEST_CASE( accessList ) { "3eaf481958e22fc39bd1d526eb9255be1e6625614f02ca939e51c3d7e64bcaa05f675640c04bb050d27bd1f39c" "07b6ff742311b04dab760bb3bc206054332879" ); Transaction tx; - BOOST_REQUIRE_NO_THROW( tx = Transaction( txRlp, CheckTransaction::None ) ); + BOOST_REQUIRE_NO_THROW( tx = Transaction( txRlp, CheckTransaction::None, false, true ) ); BOOST_REQUIRE( tx.accessList().size() == 1 ); // empty accessList @@ -275,7 +275,7 @@ BOOST_AUTO_TEST_CASE( accessList ) { "0x01f8678197808504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180c001a01ebdc5" "46c8b85511b7ba831f47c4981069d7af972d10b7dce2c57225cb5df6a7a055ae1e84fea41d37589eb740a0a930" "17a5cd0e9f10ee50f165bf4b1b4c78ddae" ); - BOOST_REQUIRE_NO_THROW( tx = Transaction( txRlp, CheckTransaction::None ) ); + BOOST_REQUIRE_NO_THROW( tx = Transaction( txRlp, CheckTransaction::None, false, true ) ); BOOST_REQUIRE( tx.accessList().size() == 0 ); // no accessList @@ -283,7 +283,7 @@ BOOST_AUTO_TEST_CASE( accessList ) { "0x01f8678197808504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180c080a025fffe" "aafed61a15aefd1be5ccbd19e3fe07d0088b06ab6ad960d0f6c382d8cea02e255bf1a7de0a75ccec6d00bcc367" "1af06ca9641fc02024a9d6b28f9b01307b" ); - BOOST_REQUIRE_NO_THROW( tx = Transaction( txRlp, CheckTransaction::None ) ); + BOOST_REQUIRE_NO_THROW( tx = Transaction( txRlp, CheckTransaction::None, false, true ) ); BOOST_REQUIRE( tx.accessList().size() == 0 ); // change empty accessList 0xc0 to empty array 0x80 @@ -291,7 +291,7 @@ BOOST_AUTO_TEST_CASE( accessList ) { "0x01f8678197808504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b01808001a01ebdc5" "46c8b85511b7ba831f47c4981069d7af972d10b7dce2c57225cb5df6a7a055ae1e84fea41d37589eb740a0a930" "17a5cd0e9f10ee50f165bf4b1b4c78ddae" ); - BOOST_REQUIRE_THROW( Transaction( txRlp, CheckTransaction::None ), InvalidTransactionFormat ); + BOOST_REQUIRE_THROW( Transaction( txRlp, CheckTransaction::None, false, true ), InvalidTransactionFormat ); } BOOST_AUTO_TEST_CASE( ExecutionResultOutput, From a5ad610d3d55c435da1310fb1bdcdc514e80af8e Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Tue, 23 Apr 2024 13:40:08 +0100 Subject: [PATCH 102/154] #1719 small fixes --- libethereum/BlockChain.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libethereum/BlockChain.cpp b/libethereum/BlockChain.cpp index 0ae82f506..e2339685e 100644 --- a/libethereum/BlockChain.cpp +++ b/libethereum/BlockChain.cpp @@ -1740,7 +1740,9 @@ VerifiedBlockRef BlockChain::verifyBlock( bytesConstRef _block, ( _ir & ImportRequirements::TransactionSignatures ) ? CheckTransaction::Everything : CheckTransaction::None, - false, EIP1559TransactionsPatch::isEnabledWhen( h.timestamp() ) ); + false, + EIP1559TransactionsPatch::isEnabledWhen( + this->info( numberHash( h.number() - 1 ) ).timestamp() ) ); Ethash::verifyTransaction( chainParams(), _ir, t, this->info( numberHash( h.number() - 1 ) ).timestamp(), h, 0 ); // the gasUsed vs From aeeac8bfd1e43e48b24ed4ca45ae7ef4f971d2fe Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Tue, 23 Apr 2024 15:18:39 +0100 Subject: [PATCH 103/154] #1719 fix patchTimestamp usage --- libethereum/ClientBase.cpp | 15 ++++++++++----- libweb3jsonrpc/Eth.cpp | 7 ++++--- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/libethereum/ClientBase.cpp b/libethereum/ClientBase.cpp index 8c6377967..55b6dab96 100644 --- a/libethereum/ClientBase.cpp +++ b/libethereum/ClientBase.cpp @@ -391,7 +391,8 @@ Transaction ClientBase::transaction( h256 _transactionHash ) const { // allow invalid! auto tl = bc().transactionLocation( _transactionHash ); return Transaction( bc().transaction( _transactionHash ), CheckTransaction::Cheap, true, - EIP1559TransactionsPatch::isEnabledWhen( blockInfo( tl.first ).timestamp() ) ); + EIP1559TransactionsPatch::isEnabledWhen( + blockInfo( numberFromHash( tl.first ) - 1 ).timestamp() ) ); } LocalisedTransaction ClientBase::localisedTransaction( h256 const& _transactionHash ) const { @@ -405,7 +406,8 @@ Transaction ClientBase::transaction( h256 _blockHash, unsigned _i ) const { if ( _i < b[1].itemCount() ) // allow invalid return Transaction( b[1][_i].data(), CheckTransaction::Cheap, true, - EIP1559TransactionsPatch::isEnabledWhen( blockInfo( _blockHash ).timestamp() ) ); + EIP1559TransactionsPatch::isEnabledWhen( + blockInfo( numberFromHash( _blockHash ) - 1 ).timestamp() ) ); else return Transaction(); } @@ -413,7 +415,8 @@ Transaction ClientBase::transaction( h256 _blockHash, unsigned _i ) const { LocalisedTransaction ClientBase::localisedTransaction( h256 const& _blockHash, unsigned _i ) const { // allow invalid Transaction t = Transaction( bc().transaction( _blockHash, _i ), CheckTransaction::Cheap, true, - EIP1559TransactionsPatch::isEnabledWhen( blockInfo( _blockHash ).timestamp() ) ); + EIP1559TransactionsPatch::isEnabledWhen( + blockInfo( numberFromHash( _blockHash ) - 1 ).timestamp() ) ); return LocalisedTransaction( t, _blockHash, _i, numberFromHash( _blockHash ) ); } @@ -425,8 +428,10 @@ LocalisedTransactionReceipt ClientBase::localisedTransactionReceipt( h256 const& _transactionHash ) const { std::pair< h256, unsigned > tl = bc().transactionLocation( _transactionHash ); // allow invalid - Transaction t = Transaction( bc().transaction( tl.first, tl.second ), CheckTransaction::Cheap, - true, EIP1559TransactionsPatch::isEnabledWhen( blockInfo( tl.first ).timestamp() ) ); + Transaction t = + Transaction( bc().transaction( tl.first, tl.second ), CheckTransaction::Cheap, true, + EIP1559TransactionsPatch::isEnabledWhen( + blockInfo( numberFromHash( tl.first ) - 1 ).timestamp() ) ); TransactionReceipt tr = bc().transactionReceipt( tl.first, tl.second ); u256 gasUsed = tr.cumulativeGasUsed(); if ( tl.second > 0 ) diff --git a/libweb3jsonrpc/Eth.cpp b/libweb3jsonrpc/Eth.cpp index cf1c8d1b3..5ff150ecb 100644 --- a/libweb3jsonrpc/Eth.cpp +++ b/libweb3jsonrpc/Eth.cpp @@ -538,7 +538,8 @@ Json::Value Eth::eth_getBlockByHash( string const& _blockHash, bool _includeTran return Json::Value( Json::nullValue ); u256 baseFeePerGas; - if ( EIP1559TransactionsPatch::isEnabledWhen( client()->blockInfo( h ).timestamp() ) ) + if ( EIP1559TransactionsPatch::isEnabledWhen( + client()->blockInfo( client()->numberFromHash( h ) - 1 ).timestamp() ) ) try { baseFeePerGas = client()->gasBidPrice( client()->numberFromHash( h ) ); } catch ( std::invalid_argument& _e ) { @@ -600,7 +601,7 @@ Json::Value Eth::eth_getBlockByNumber( string const& _blockNumber, bool _include return Json::Value( Json::nullValue ); u256 baseFeePerGas; - if ( EIP1559TransactionsPatch::isEnabledWhen( client()->blockInfo( h ).timestamp() ) ) + if ( EIP1559TransactionsPatch::isEnabledWhen( client()->blockInfo( h - 1 ).timestamp() ) ) try { baseFeePerGas = client()->gasBidPrice( h ); } catch ( std::invalid_argument& _e ) { @@ -962,7 +963,7 @@ Json::Value Eth::eth_feeHistory( const std::string& _blockCount, const std::stri result["gasUsedRatio"] = Json::Value( Json::arrayValue ); result["reward"] = Json::Value( Json::arrayValue ); for ( auto bn = newestBlock; bn > oldestBlock - 1; --bn ) { - auto blockInfo = client()->blockInfo( client()->hashFromNumber( bn ) ); + auto blockInfo = client()->blockInfo( bn - 1 ); if ( EIP1559TransactionsPatch::isEnabledWhen( blockInfo.timestamp() ) ) result["baseFeePerGas"].append( toJS( client()->gasBidPrice( bn ) ) ); From d8bd5dade30dadadbd9961f231fac675b7230a5c Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Tue, 23 Apr 2024 16:19:16 +0100 Subject: [PATCH 104/154] #1719 fix patchTimestamp usage --- libethereum/ClientBase.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libethereum/ClientBase.cpp b/libethereum/ClientBase.cpp index 55b6dab96..f8a51807e 100644 --- a/libethereum/ClientBase.cpp +++ b/libethereum/ClientBase.cpp @@ -464,7 +464,8 @@ Transactions ClientBase::transactions( h256 _blockHash ) const { for ( unsigned i = 0; i < b[1].itemCount(); i++ ) { auto txRlp = b[1][i]; res.emplace_back( bytesRefFromTransactionRlp( txRlp ), CheckTransaction::Cheap, true, - EIP1559TransactionsPatch::isEnabledInWorkingBlock() ); + EIP1559TransactionsPatch::isEnabledWhen( + blockInfo( numberFromHash( _blockHash ) - 1 ).timestamp() ) ); } return res; } From fed61bb638f5cbaae8c98ccb125fd77400cf4d70 Mon Sep 17 00:00:00 2001 From: DmytroNazarenko Date: Wed, 24 Apr 2024 00:13:42 +0000 Subject: [PATCH 105/154] #1876 Add isAddressWhitelistedCallData overload --- libethcore/Common.cpp | 5 +++++ libethcore/Common.h | 3 +++ 2 files changed, 8 insertions(+) diff --git a/libethcore/Common.cpp b/libethcore/Common.cpp index 1c9772b55..4eaafc31f 100644 --- a/libethcore/Common.cpp +++ b/libethcore/Common.cpp @@ -112,6 +112,11 @@ bytes isAddressWhitelistedCallData( Address const& _deployer ) { return fromHex( "13f44d10000000000000000000000000" + _deployer.hex() ); } +bytes isAddressWhitelistedCallData( Address const& _deployer, Address const& _origin ) { + return fromHex( "b31fd4e6000000000000000000000000" + _deployer.hex() + + "000000000000000000000000" + _origin.hex() ); +} + bytes getMultitransactionCallData() { return fromHex( "0xbad0396e" ); } diff --git a/libethcore/Common.h b/libethcore/Common.h index 980aa7a30..7b2a47cf4 100644 --- a/libethcore/Common.h +++ b/libethcore/Common.h @@ -61,6 +61,9 @@ extern const Address c_configControllerContractAddress; /// Formatting call data for deployment control contract bytes isAddressWhitelistedCallData( Address const& _deployer ); +/// Formatting call data for deployment control contract, considering tx origin +bytes isAddressWhitelistedCallData( Address const& _deployer, Address const& _origin ); + /// Formatting call data for multitransaction contract bytes getMultitransactionCallData(); From cafa20dd1f2c36729c382baef024c51c42a6c528 Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Wed, 24 Apr 2024 11:05:12 +0100 Subject: [PATCH 106/154] #1719 small fixes --- libweb3jsonrpc/Eth.cpp | 2 +- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libweb3jsonrpc/Eth.cpp b/libweb3jsonrpc/Eth.cpp index 5ff150ecb..aa6937266 100644 --- a/libweb3jsonrpc/Eth.cpp +++ b/libweb3jsonrpc/Eth.cpp @@ -966,7 +966,7 @@ Json::Value Eth::eth_feeHistory( const std::string& _blockCount, const std::stri auto blockInfo = client()->blockInfo( bn - 1 ); if ( EIP1559TransactionsPatch::isEnabledWhen( blockInfo.timestamp() ) ) - result["baseFeePerGas"].append( toJS( client()->gasBidPrice( bn ) ) ); + result["baseFeePerGas"].append( toJS( client()->gasBidPrice( bn - 1 ) ) ); else result["baseFeePerGas"].append( toJS( 0 ) ); diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index f11800574..4f5053b52 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -3097,7 +3097,7 @@ BOOST_AUTO_TEST_CASE( eip1559RpcMethods ) { percentiles[0] = 20; percentiles[1] = 80; - size_t blockCnt = 7; + size_t blockCnt = 9; auto feeHistory = fixture.rpcClient->eth_feeHistory( toJS( blockCnt ), "latest", percentiles ); BOOST_REQUIRE( feeHistory["oldestBlock"] == toJS( bn - blockCnt + 1 ) ); @@ -3108,7 +3108,7 @@ BOOST_AUTO_TEST_CASE( eip1559RpcMethods ) { for (Json::Value::ArrayIndex i = 0; i < blockCnt; ++i) { BOOST_REQUIRE( feeHistory["baseFeePerGas"][i].isString() ); std::string estimatedBaseFeePerGas = EIP1559TransactionsPatch::isEnabledWhen( - fixture.client->blockInfo( bn - i ).timestamp() ) ? toJS( fixture.client->gasBidPrice( bn - i ) ) : toJS( 0 ); + fixture.client->blockInfo( bn - i - 1 ).timestamp() ) ? toJS( fixture.client->gasBidPrice( bn - i ) ) : toJS( 0 ); BOOST_REQUIRE( feeHistory["baseFeePerGas"][i].asString() == estimatedBaseFeePerGas ); BOOST_REQUIRE_GT( feeHistory["gasUsedRatio"][i].asDouble(), 0 ); BOOST_REQUIRE_GT( 1, feeHistory["gasUsedRatio"][i].asDouble() ); From ac59ebb2b980a02e3a4ba7c4d410679a4d81b91e Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Wed, 24 Apr 2024 13:25:42 +0100 Subject: [PATCH 107/154] #1719 add effectiveGasPrice to receipt --- libethereum/ClientBase.cpp | 3 ++- libethereum/TransactionReceipt.h | 7 +++++-- libweb3jsonrpc/Eth.cpp | 4 ++-- libweb3jsonrpc/JsonHelper.cpp | 2 ++ test/unittests/libweb3jsonrpc/jsonrpc.cpp | 3 +++ 5 files changed, 14 insertions(+), 5 deletions(-) diff --git a/libethereum/ClientBase.cpp b/libethereum/ClientBase.cpp index f8a51807e..f7cff02f5 100644 --- a/libethereum/ClientBase.cpp +++ b/libethereum/ClientBase.cpp @@ -450,7 +450,8 @@ LocalisedTransactionReceipt ClientBase::localisedTransactionReceipt( // return LocalisedTransactionReceipt( tr, t.sha3(), tl.first, numberFromHash( tl.first ), tl.second, t.isInvalid() ? dev::Address( 0 ) : t.from(), - t.isInvalid() ? dev::Address( 0 ) : t.to(), gasUsed, contractAddress, int( t.txType() ) ); + t.isInvalid() ? dev::Address( 0 ) : t.to(), gasUsed, contractAddress, int( t.txType() ), + t.gasPrice() ); } pair< h256, unsigned > ClientBase::transactionLocation( h256 const& _transactionHash ) const { diff --git a/libethereum/TransactionReceipt.h b/libethereum/TransactionReceipt.h index 66170ea4c..76cb0592f 100644 --- a/libethereum/TransactionReceipt.h +++ b/libethereum/TransactionReceipt.h @@ -98,7 +98,7 @@ class LocalisedTransactionReceipt : public TransactionReceipt { LocalisedTransactionReceipt( TransactionReceipt const& _t, h256 const& _hash, h256 const& _blockHash, BlockNumber _blockNumber, unsigned _transactionIndex, Address _from, Address _to, u256 const& _gasUsed, Address const& _contractAddress = Address(), - int _txType = 0 ) + int _txType = 0, u256 _effectiveGasPrice = 0 ) : TransactionReceipt( _t ), m_hash( _hash ), m_blockHash( _blockHash ), @@ -108,7 +108,8 @@ class LocalisedTransactionReceipt : public TransactionReceipt { m_to( _to ), m_gasUsed( _gasUsed ), m_contractAddress( _contractAddress ), - m_txType( _txType ) { + m_txType( _txType ), + m_effectiveGasPrice( _effectiveGasPrice ) { LogEntries entries = log(); for ( unsigned i = 0; i < entries.size(); i++ ) m_localisedLogs.push_back( LocalisedLogEntry( @@ -127,6 +128,7 @@ class LocalisedTransactionReceipt : public TransactionReceipt { Address const& contractAddress() const { return m_contractAddress; } LocalisedLogEntries const& localisedLogs() const { return m_localisedLogs; }; int txType() const { return m_txType; } + u256 effectiveGasPrice() const { return m_effectiveGasPrice; } private: h256 m_hash; @@ -138,6 +140,7 @@ class LocalisedTransactionReceipt : public TransactionReceipt { Address m_contractAddress; LocalisedLogEntries m_localisedLogs; int m_txType; + u256 m_effectiveGasPrice = 0; Counter< TransactionReceipt > c; diff --git a/libweb3jsonrpc/Eth.cpp b/libweb3jsonrpc/Eth.cpp index aa6937266..22e5aa0c4 100644 --- a/libweb3jsonrpc/Eth.cpp +++ b/libweb3jsonrpc/Eth.cpp @@ -541,7 +541,7 @@ Json::Value Eth::eth_getBlockByHash( string const& _blockHash, bool _includeTran if ( EIP1559TransactionsPatch::isEnabledWhen( client()->blockInfo( client()->numberFromHash( h ) - 1 ).timestamp() ) ) try { - baseFeePerGas = client()->gasBidPrice( client()->numberFromHash( h ) ); + baseFeePerGas = client()->gasBidPrice( client()->numberFromHash( h ) - 1 ); } catch ( std::invalid_argument& _e ) { cdebug << "Cannot get gas price for block " << h; cdebug << _e.what(); @@ -603,7 +603,7 @@ Json::Value Eth::eth_getBlockByNumber( string const& _blockNumber, bool _include u256 baseFeePerGas; if ( EIP1559TransactionsPatch::isEnabledWhen( client()->blockInfo( h - 1 ).timestamp() ) ) try { - baseFeePerGas = client()->gasBidPrice( h ); + baseFeePerGas = client()->gasBidPrice( h - 1 ); } catch ( std::invalid_argument& _e ) { cdebug << "Cannot get gas price for block " << h; cdebug << _e.what(); diff --git a/libweb3jsonrpc/JsonHelper.cpp b/libweb3jsonrpc/JsonHelper.cpp index f8a13d38c..b197be625 100644 --- a/libweb3jsonrpc/JsonHelper.cpp +++ b/libweb3jsonrpc/JsonHelper.cpp @@ -226,6 +226,7 @@ Json::Value toJson( dev::eth::LocalisedTransactionReceipt const& _t ) { res["revertReason"] = strRevertReason; res["type"] = toJS( _t.txType() ); + res["effectiveGasPrice"] = toJS( _t.effectiveGasPrice() ); return res; } @@ -331,6 +332,7 @@ rapidjson::Document toRapidJson( dev::eth::LocalisedTransactionReceipt const& _t } ADD_FIELD_TO_RAPIDJSON( res, "type", toJS( _t.txType() ), allocator ); + ADD_FIELD_TO_RAPIDJSON( res, "effectiveGasPrice", toJS( _t.effectiveGasPrice() ), allocator ); return res; } diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index 4f5053b52..7687e598e 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -2854,6 +2854,7 @@ BOOST_AUTO_TEST_CASE( eip2930Transactions ) { receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); BOOST_REQUIRE( receipt["status"] == string( "0x1" ) ); BOOST_REQUIRE( receipt["type"] == "0x1" ); + BOOST_REQUIRE( receipt["effectiveGasPrice"] == "0x4a817c800" ); result = fixture.rpcClient->eth_getTransactionByHash( txHash ); BOOST_REQUIRE( result["hash"].asString() == txHash ); @@ -2964,6 +2965,7 @@ BOOST_AUTO_TEST_CASE( eip1559Transactions ) { receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); BOOST_REQUIRE( receipt["status"] == string( "0x1" ) ); BOOST_REQUIRE( receipt["type"] == "0x0" ); + BOOST_REQUIRE( receipt["effectiveGasPrice"] == "0x4a817c800" ); // send 1 WEI from 0x5EdF1e852fdD1B0Bc47C0307EF755C76f4B9c251 to 0x7D36aF85A184E220A656525fcBb9A63B9ab3C12b // encoded type 2 txn @@ -2999,6 +3001,7 @@ BOOST_AUTO_TEST_CASE( eip1559Transactions ) { receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); BOOST_REQUIRE( receipt["status"] == string( "0x1" ) ); BOOST_REQUIRE( receipt["type"] == "0x2" ); + BOOST_REQUIRE( receipt["effectiveGasPrice"] == "0x4a817c800" ); result = fixture.rpcClient->eth_getTransactionByHash( txHash ); BOOST_REQUIRE( result["hash"].asString() == txHash ); From 34780be44a2f8675f04d600910eda9fc71ac525a Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Wed, 24 Apr 2024 15:19:05 +0100 Subject: [PATCH 108/154] #1719 eth_call improvement --- libweb3jsonrpc/JsonHelper.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libweb3jsonrpc/JsonHelper.cpp b/libweb3jsonrpc/JsonHelper.cpp index b197be625..717d5286e 100644 --- a/libweb3jsonrpc/JsonHelper.cpp +++ b/libweb3jsonrpc/JsonHelper.cpp @@ -596,6 +596,10 @@ TransactionSkeleton rapidJsonToTransactionSkeleton( rapidjson::Value const& _jso if ( !_json["gasPrice"].IsString() ) throw jsonrpc::JsonRpcException( jsonrpc::Errors::ERROR_RPC_INVALID_PARAMS ); ret.gasPrice = jsToU256( _json["gasPrice"].GetString() ); + } else if ( _json.HasMember( "maxFeePerGas" ) ) { + if ( !_json["maxFeePerGas"].IsString() ) + throw jsonrpc::JsonRpcException( jsonrpc::Errors::ERROR_RPC_INVALID_PARAMS ); + ret.gasPrice = jsToU256( _json["maxFeePerGas"].GetString() ); } if ( _json.HasMember( "code" ) ) { From 0d99d32619219709f6f9498952fc4a444991554d Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Wed, 24 Apr 2024 15:25:56 +0100 Subject: [PATCH 109/154] #1719 strict chainId check in streamRLP --- libethcore/TransactionBase.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libethcore/TransactionBase.cpp b/libethcore/TransactionBase.cpp index 7dfa8b738..9febca7a1 100644 --- a/libethcore/TransactionBase.cpp +++ b/libethcore/TransactionBase.cpp @@ -416,6 +416,8 @@ void TransactionBase::streamLegacyTransaction( void TransactionBase::streamType1Transaction( RLPStream& _s, IncludeSignature _sig ) const { _s.appendList( ( _sig ? 3 : 0 ) + 8 ); + if ( !m_chainId.has_value() ) + BOOST_THROW_EXCEPTION( InvalidTransactionFormat() ); _s << *m_chainId << m_nonce << m_gasPrice << m_gas; if ( m_type == MessageCall ) _s << m_receiveAddress; @@ -431,6 +433,8 @@ void TransactionBase::streamType1Transaction( RLPStream& _s, IncludeSignature _s void TransactionBase::streamType2Transaction( RLPStream& _s, IncludeSignature _sig ) const { _s.appendList( ( _sig ? 3 : 0 ) + 9 ); + if ( !m_chainId.has_value() ) + BOOST_THROW_EXCEPTION( InvalidTransactionFormat() ); _s << *m_chainId << m_nonce << m_maxPriorityFeePerGas << m_maxFeePerGas << m_gas; if ( m_type == MessageCall ) _s << m_receiveAddress; From 0fa32a3bcea4c167830ce98190443243e044ea41 Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Wed, 24 Apr 2024 15:36:28 +0100 Subject: [PATCH 110/154] #1719 feeHistory improvements --- libweb3jsonrpc/Eth.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libweb3jsonrpc/Eth.cpp b/libweb3jsonrpc/Eth.cpp index 22e5aa0c4..4afcc8eba 100644 --- a/libweb3jsonrpc/Eth.cpp +++ b/libweb3jsonrpc/Eth.cpp @@ -48,6 +48,7 @@ using namespace dev::rpc; const uint64_t MAX_CALL_CACHE_ENTRIES = 1024; const uint64_t MAX_RECEIPT_CACHE_ENTRIES = 1024; +const u256 MAX_BLOCK_RANGE = 1024; #ifdef HISTORIC_STATE @@ -946,7 +947,7 @@ Json::Value Eth::eth_feeHistory( const std::string& _blockCount, const std::stri } } - auto blockCount = jsToU256( _blockCount ); + auto blockCount = std::min( jsToU256( _blockCount ), MAX_BLOCK_RANGE ); auto newestBlock = jsToBlockNumber( _newestBlock ); if ( newestBlock == dev::eth::LatestBlock ) newestBlock = client()->number(); @@ -954,7 +955,7 @@ Json::Value Eth::eth_feeHistory( const std::string& _blockCount, const std::stri auto result = Json::Value( Json::objectValue ); dev::u256 oldestBlock; if ( blockCount > newestBlock ) - oldestBlock = 0; + oldestBlock = 1; else oldestBlock = dev::u256( newestBlock ) - blockCount + 1; result["oldestBlock"] = toJS( oldestBlock ); From 4c2d7af879f9cf4f129997661ea44ca0773ec5ea Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Wed, 24 Apr 2024 15:44:51 +0100 Subject: [PATCH 111/154] #1719 fix tests --- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index 7687e598e..950fff4ea 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -3111,7 +3111,7 @@ BOOST_AUTO_TEST_CASE( eip1559RpcMethods ) { for (Json::Value::ArrayIndex i = 0; i < blockCnt; ++i) { BOOST_REQUIRE( feeHistory["baseFeePerGas"][i].isString() ); std::string estimatedBaseFeePerGas = EIP1559TransactionsPatch::isEnabledWhen( - fixture.client->blockInfo( bn - i - 1 ).timestamp() ) ? toJS( fixture.client->gasBidPrice( bn - i ) ) : toJS( 0 ); + fixture.client->blockInfo( bn - i - 1 ).timestamp() ) ? toJS( fixture.client->gasBidPrice( bn - i - 1 ) ) : toJS( 0 ); BOOST_REQUIRE( feeHistory["baseFeePerGas"][i].asString() == estimatedBaseFeePerGas ); BOOST_REQUIRE_GT( feeHistory["gasUsedRatio"][i].asDouble(), 0 ); BOOST_REQUIRE_GT( 1, feeHistory["gasUsedRatio"][i].asDouble() ); From 1bfeba4366fcf58b6d37b082d69e04e2223e28fa Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Wed, 24 Apr 2024 16:07:44 +0100 Subject: [PATCH 112/154] IS-864 bls sync config --- libconsensus | 2 +- libethereum/ChainParams.cpp | 45 ++++++++++++++++++++++------------- libethereum/SchainPatch.cpp | 4 ++++ libethereum/SchainPatch.h | 5 ++++ libethereum/SchainPatchEnum.h | 1 + libethereum/SkaleHost.cpp | 8 ++++--- 6 files changed, 44 insertions(+), 21 deletions(-) diff --git a/libconsensus b/libconsensus index 2f7c74374..dc3970a75 160000 --- a/libconsensus +++ b/libconsensus @@ -1 +1 @@ -Subproject commit 2f7c7437465ed3cbbfc914ce9fb0fefe3d096ecb +Subproject commit dc3970a751d5a9a80e01379239a6cdc04584197f diff --git a/libethereum/ChainParams.cpp b/libethereum/ChainParams.cpp index ca4f51b6b..40c0d35eb 100644 --- a/libethereum/ChainParams.cpp +++ b/libethereum/ChainParams.cpp @@ -224,27 +224,38 @@ void ChainParams::processSkaleConfigItems( ChainParams& cp, json_spirit::mObject array< string, 4 > BLSPublicKeys; array< string, 4 > commonBLSPublicKeys; - try { - js::mObject ima = infoObj.at( "wallets" ).get_obj().at( "ima" ).get_obj(); + if ( !syncNode ) + try { + js::mObject ima = infoObj.at( "wallets" ).get_obj().at( "ima" ).get_obj(); - keyShareName = ima.at( "keyShareName" ).get_str(); + keyShareName = ima.at( "keyShareName" ).get_str(); - t = ima.at( "t" ).get_int(); + t = ima.at( "t" ).get_int(); - BLSPublicKeys[0] = ima["BLSPublicKey0"].get_str(); - BLSPublicKeys[1] = ima["BLSPublicKey1"].get_str(); - BLSPublicKeys[2] = ima["BLSPublicKey2"].get_str(); - BLSPublicKeys[3] = ima["BLSPublicKey3"].get_str(); + BLSPublicKeys[0] = ima["BLSPublicKey0"].get_str(); + BLSPublicKeys[1] = ima["BLSPublicKey1"].get_str(); + BLSPublicKeys[2] = ima["BLSPublicKey2"].get_str(); + BLSPublicKeys[3] = ima["BLSPublicKey3"].get_str(); - commonBLSPublicKeys[0] = ima["commonBLSPublicKey0"].get_str(); - commonBLSPublicKeys[1] = ima["commonBLSPublicKey1"].get_str(); - commonBLSPublicKeys[2] = ima["commonBLSPublicKey2"].get_str(); - commonBLSPublicKeys[3] = ima["commonBLSPublicKey3"].get_str(); - } catch ( ... ) { - // all or nothing - if ( !keyShareName.empty() ) - throw; - } + commonBLSPublicKeys[0] = ima["commonBLSPublicKey0"].get_str(); + commonBLSPublicKeys[1] = ima["commonBLSPublicKey1"].get_str(); + commonBLSPublicKeys[2] = ima["commonBLSPublicKey2"].get_str(); + commonBLSPublicKeys[3] = ima["commonBLSPublicKey3"].get_str(); + } catch ( ... ) { + // all or nothing + if ( !keyShareName.empty() ) + throw; + } + else + try { + js::mObject ima = infoObj.at( "wallets" ).get_obj().at( "ima" ).get_obj(); + + commonBLSPublicKeys[0] = ima["commonBLSPublicKey0"].get_str(); + commonBLSPublicKeys[1] = ima["commonBLSPublicKey1"].get_str(); + commonBLSPublicKeys[2] = ima["commonBLSPublicKey2"].get_str(); + commonBLSPublicKeys[3] = ima["commonBLSPublicKey3"].get_str(); + } catch ( ... ) { + } cp.nodeInfo = { nodeName, nodeID, ip, static_cast< uint16_t >( port ), ip6, static_cast< uint16_t >( port6 ), sgxServerUrl, ecdsaKeyName, keyShareName, BLSPublicKeys, diff --git a/libethereum/SchainPatch.cpp b/libethereum/SchainPatch.cpp index 1ae076376..cca733240 100644 --- a/libethereum/SchainPatch.cpp +++ b/libethereum/SchainPatch.cpp @@ -28,6 +28,8 @@ SchainPatchEnum getEnumForPatchName( const std::string& _patchName ) { return SchainPatchEnum::StorageDestructionPatch; else if ( _patchName == "SkipInvalidTransactionsPatch" ) return SchainPatchEnum::SkipInvalidTransactionsPatch; + else if ( _patchName == "VerifyBlsSyncPatch" ) + return SchainPatchEnum::VerifyBlsSyncPatch; else throw std::out_of_range( _patchName ); } @@ -56,6 +58,8 @@ std::string getPatchNameForEnum( SchainPatchEnum _enumValue ) { return "SkipInvalidTransactionsPatch"; case SchainPatchEnum::SelfdestructStorageLimitPatch: return "SelfdestructStorageLimitPatch"; + case SchainPatchEnum::VerifyBlsSyncPatch: + return "VerifyBlsSyncPatch"; default: throw std::out_of_range( "UnknownPatch #" + std::to_string( static_cast< size_t >( _enumValue ) ) ); diff --git a/libethereum/SchainPatch.h b/libethereum/SchainPatch.h index d8fabce97..b5af00469 100644 --- a/libethereum/SchainPatch.h +++ b/libethereum/SchainPatch.h @@ -130,4 +130,9 @@ DEFINE_AMNESIC_PATCH( StorageDestructionPatch ); */ DEFINE_SIMPLE_PATCH( SelfdestructStorageLimitPatch ); +/* + * Enable bls signatures verification for sync node + */ +DEFINE_AMNESIC_PATCH( VerifyBlsSyncPatch ); + #endif // SCHAINPATCH_H diff --git a/libethereum/SchainPatchEnum.h b/libethereum/SchainPatchEnum.h index b1f439211..513ff45ad 100644 --- a/libethereum/SchainPatchEnum.h +++ b/libethereum/SchainPatchEnum.h @@ -16,6 +16,7 @@ enum class SchainPatchEnum { StorageDestructionPatch, SkipInvalidTransactionsPatch, SelfdestructStorageLimitPatch, + VerifyBlsSyncPatch, PatchesCount }; diff --git a/libethereum/SkaleHost.cpp b/libethereum/SkaleHost.cpp index 7988705e8..f6f59f841 100644 --- a/libethereum/SkaleHost.cpp +++ b/libethereum/SkaleHost.cpp @@ -81,6 +81,8 @@ std::unique_ptr< ConsensusInterface > DefaultConsensusFactory::create( patchTimeStamps["verifyDaSigsPatchTimestamp"] = m_client.chainParams().getPatchTimestamp( SchainPatchEnum::VerifyDaSigsPatch ); + patchTimeStamps["verifyBlsSyncPatchTimestamp"] = + m_client.chainParams().getPatchTimestamp( SchainPatchEnum::VerifyBlsSyncPatch ); auto consensus_engine_ptr = make_unique< ConsensusEngine >( _extFace, m_client.number(), ts, 0, patchTimeStamps, m_client.chainParams().sChain.consensusStorageLimit ); @@ -89,9 +91,9 @@ std::unique_ptr< ConsensusInterface > DefaultConsensusFactory::create( this->fillSgxInfo( *consensus_engine_ptr ); } - - this->fillPublicKeyInfo( *consensus_engine_ptr ); - + // does nothing for a sync node + if ( !m_client.chainParams().nodeInfo.syncNode ) + this->fillPublicKeyInfo( *consensus_engine_ptr ); this->fillRotationHistory( *consensus_engine_ptr ); From 7e944cd10bf9b536fa3af6aebd98e1fd43483ff9 Mon Sep 17 00:00:00 2001 From: DmytroNazarenko Date: Wed, 24 Apr 2024 17:37:03 +0000 Subject: [PATCH 113/154] #1876 Add FlexibleDeploymentPatch --- libethereum/SchainPatch.cpp | 4 ++++ libethereum/SchainPatch.h | 6 ++++++ libethereum/SchainPatchEnum.h | 1 + 3 files changed, 11 insertions(+) diff --git a/libethereum/SchainPatch.cpp b/libethereum/SchainPatch.cpp index 1ae076376..7ca28f839 100644 --- a/libethereum/SchainPatch.cpp +++ b/libethereum/SchainPatch.cpp @@ -28,6 +28,8 @@ SchainPatchEnum getEnumForPatchName( const std::string& _patchName ) { return SchainPatchEnum::StorageDestructionPatch; else if ( _patchName == "SkipInvalidTransactionsPatch" ) return SchainPatchEnum::SkipInvalidTransactionsPatch; + else if ( _patchName == "FlexibleDeploymentPatch" ) + return SchainPatchEnum::FlexibleDeploymentPatch; else throw std::out_of_range( _patchName ); } @@ -56,6 +58,8 @@ std::string getPatchNameForEnum( SchainPatchEnum _enumValue ) { return "SkipInvalidTransactionsPatch"; case SchainPatchEnum::SelfdestructStorageLimitPatch: return "SelfdestructStorageLimitPatch"; + case SchainPatchEnum::FlexibleDeploymentPatch: + return "FlexibleDeploymentPatch"; default: throw std::out_of_range( "UnknownPatch #" + std::to_string( static_cast< size_t >( _enumValue ) ) ); diff --git a/libethereum/SchainPatch.h b/libethereum/SchainPatch.h index d8fabce97..63650d7ce 100644 --- a/libethereum/SchainPatch.h +++ b/libethereum/SchainPatch.h @@ -130,4 +130,10 @@ DEFINE_AMNESIC_PATCH( StorageDestructionPatch ); */ DEFINE_SIMPLE_PATCH( SelfdestructStorageLimitPatch ); +/* + * Purpose: passing both tx origin and tx sender into ConfigController + * Version introduced: 3.19.0 + */ +DEFINE_SIMPLE_PATCH( FlexibleDeploymentPatch ); + #endif // SCHAINPATCH_H diff --git a/libethereum/SchainPatchEnum.h b/libethereum/SchainPatchEnum.h index b1f439211..5e713b1e6 100644 --- a/libethereum/SchainPatchEnum.h +++ b/libethereum/SchainPatchEnum.h @@ -16,6 +16,7 @@ enum class SchainPatchEnum { StorageDestructionPatch, SkipInvalidTransactionsPatch, SelfdestructStorageLimitPatch, + FlexibleDeploymentPatch, PatchesCount }; From b6dee228176c5aa6dceb66419a346eea1a4f5f8d Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Wed, 24 Apr 2024 19:10:26 +0100 Subject: [PATCH 114/154] #1719 fix tests --- libethereum/ClientBase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libethereum/ClientBase.cpp b/libethereum/ClientBase.cpp index f7cff02f5..aa57fbaa1 100644 --- a/libethereum/ClientBase.cpp +++ b/libethereum/ClientBase.cpp @@ -451,7 +451,7 @@ LocalisedTransactionReceipt ClientBase::localisedTransactionReceipt( return LocalisedTransactionReceipt( tr, t.sha3(), tl.first, numberFromHash( tl.first ), tl.second, t.isInvalid() ? dev::Address( 0 ) : t.from(), t.isInvalid() ? dev::Address( 0 ) : t.to(), gasUsed, contractAddress, int( t.txType() ), - t.gasPrice() ); + t.isInvalid() ? 0 : t.gasPrice() ); } pair< h256, unsigned > ClientBase::transactionLocation( h256 const& _transactionHash ) const { From 804aef3fc010fef0aece944e3fd84f06eff990a9 Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Wed, 24 Apr 2024 19:41:22 +0100 Subject: [PATCH 115/154] IS-864 bls sync config --- libconsensus | 2 +- libethereum/SchainPatch.cpp | 4 ++-- libethereum/SkaleHost.cpp | 11 +++++------ 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/libconsensus b/libconsensus index dc3970a75..5276c8e47 160000 --- a/libconsensus +++ b/libconsensus @@ -1 +1 @@ -Subproject commit dc3970a751d5a9a80e01379239a6cdc04584197f +Subproject commit 5276c8e479b2db0d06d377df7fada6f53a1486e3 diff --git a/libethereum/SchainPatch.cpp b/libethereum/SchainPatch.cpp index cca733240..193da59d4 100644 --- a/libethereum/SchainPatch.cpp +++ b/libethereum/SchainPatch.cpp @@ -29,7 +29,7 @@ SchainPatchEnum getEnumForPatchName( const std::string& _patchName ) { else if ( _patchName == "SkipInvalidTransactionsPatch" ) return SchainPatchEnum::SkipInvalidTransactionsPatch; else if ( _patchName == "VerifyBlsSyncPatch" ) - return SchainPatchEnum::VerifyBlsSyncPatch; + return SchainPatchEnum::VerifyBlsSyncPatch; else throw std::out_of_range( _patchName ); } @@ -59,7 +59,7 @@ std::string getPatchNameForEnum( SchainPatchEnum _enumValue ) { case SchainPatchEnum::SelfdestructStorageLimitPatch: return "SelfdestructStorageLimitPatch"; case SchainPatchEnum::VerifyBlsSyncPatch: - return "VerifyBlsSyncPatch"; + return "VerifyBlsSyncPatch"; default: throw std::out_of_range( "UnknownPatch #" + std::to_string( static_cast< size_t >( _enumValue ) ) ); diff --git a/libethereum/SkaleHost.cpp b/libethereum/SkaleHost.cpp index f6f59f841..aacbc4c1a 100644 --- a/libethereum/SkaleHost.cpp +++ b/libethereum/SkaleHost.cpp @@ -82,7 +82,7 @@ std::unique_ptr< ConsensusInterface > DefaultConsensusFactory::create( patchTimeStamps["verifyDaSigsPatchTimestamp"] = m_client.chainParams().getPatchTimestamp( SchainPatchEnum::VerifyDaSigsPatch ); patchTimeStamps["verifyBlsSyncPatchTimestamp"] = - m_client.chainParams().getPatchTimestamp( SchainPatchEnum::VerifyBlsSyncPatch ); + m_client.chainParams().getPatchTimestamp( SchainPatchEnum::VerifyBlsSyncPatch ); auto consensus_engine_ptr = make_unique< ConsensusEngine >( _extFace, m_client.number(), ts, 0, patchTimeStamps, m_client.chainParams().sChain.consensusStorageLimit ); @@ -91,9 +91,7 @@ std::unique_ptr< ConsensusInterface > DefaultConsensusFactory::create( this->fillSgxInfo( *consensus_engine_ptr ); } - // does nothing for a sync node - if ( !m_client.chainParams().nodeInfo.syncNode ) - this->fillPublicKeyInfo( *consensus_engine_ptr ); + this->fillPublicKeyInfo( *consensus_engine_ptr ); this->fillRotationHistory( *consensus_engine_ptr ); @@ -181,8 +179,9 @@ void DefaultConsensusFactory::fillPublicKeyInfo( ConsensusEngine& consensus ) co size_t n = m_client.chainParams().sChain.nodes.size(); size_t t = ( 2 * n + 1 ) / 3; - if ( ecdsaPublicKeys->size() && ecdsaPublicKeys->at( 0 ).size() && blsPublicKeys.size() && - blsPublicKeys[0]->at( 0 ).size() ) + if ( ecdsaPublicKeys->size() && ecdsaPublicKeys->at( 0 ).size() && + ( ( blsPublicKeys.size() && blsPublicKeys[0]->at( 0 ).size() ) || + m_client.chainParams().nodeInfo.syncNode ) ) consensus.setPublicKeyInfo( ecdsaPublicKeys, blsPublicKeysPtr, t, n ); } catch ( ... ) { std::throw_with_nested( std::runtime_error( "Error filling SGX info (nodeGroups)" ) ); From 8e0eeff294be97bb0f235acc2626bbe0f82575f9 Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Thu, 25 Apr 2024 11:09:32 +0100 Subject: [PATCH 116/154] #1719 fix historic node --- libweb3jsonrpc/Eth.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libweb3jsonrpc/Eth.cpp b/libweb3jsonrpc/Eth.cpp index 4afcc8eba..462e7eed4 100644 --- a/libweb3jsonrpc/Eth.cpp +++ b/libweb3jsonrpc/Eth.cpp @@ -756,7 +756,8 @@ LocalisedTransactionReceipt Eth::eth_getTransactionReceipt( string const& _trans size_t newIndex = m_gapCache->gappedIndexFromReal( rcp.blockNumber(), rcp.transactionIndex() ); rcp = LocalisedTransactionReceipt( rcp, rcp.hash(), rcp.blockHash(), rcp.blockNumber(), - newIndex, rcp.from(), rcp.to(), rcp.gasUsed(), rcp.contractAddress(), rcp.txType() ); + newIndex, rcp.from(), rcp.to(), rcp.gasUsed(), rcp.contractAddress(), rcp.txType(), + rcp.effectiveGasPrice() ); } #endif From c928244bd88c19e91cf65a62ab460d32aae995ef Mon Sep 17 00:00:00 2001 From: DmytroNazarenko Date: Thu, 25 Apr 2024 19:42:10 +0000 Subject: [PATCH 117/154] #1876 Pass 2 parameters if patch is enabled --- libethereum/Executive.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/libethereum/Executive.cpp b/libethereum/Executive.cpp index 70a945efc..6dbe96472 100644 --- a/libethereum/Executive.cpp +++ b/libethereum/Executive.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -468,7 +469,13 @@ bool Executive::go( OnOpFunc const& _onOp ) { // Create VM instance. Force Interpreter if tracing requested. auto vm = VMFactory::create(); if ( m_isCreation ) { - bytes in = isAddressWhitelistedCallData( m_ext->caller ); + bytes in; + if ( FlexibleDeploymentPatch::isEnabledWhen( + m_envInfo.committedBlockTimestamp() ) ) { + in = isAddressWhitelistedCallData( m_ext->caller, m_ext->origin ); + } else { + in = isAddressWhitelistedCallData( m_ext->caller ); + } unique_ptr< CallParameters > deploymentCallParams( new CallParameters( SystemAddress, c_configControllerContractAddress, c_configControllerContractAddress, 0, 0, m_gas, From b44e87fb7a1281b9d8b33bb3732cf56be8518d2e Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Sun, 28 Apr 2024 13:47:36 +0100 Subject: [PATCH 118/154] SKALED-1878 Colorful logs --- libethcore/ChainOperationParams.h | 1 + libethcore/Exceptions.h | 3 + libethereum/ChainParams.cpp | 2 + libethereum/ClientBase.cpp | 15 +--- libethereum/ClientBase.h | 1 - libethereum/Interface.h | 9 --- libskutils/include/skutils/console_colors.h | 9 +-- libskutils/src/console_colors.cpp | 8 +-- libweb3jsonrpc/Eth.cpp | 16 +++-- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 77 ++++++++++++++++++++- 10 files changed, 105 insertions(+), 36 deletions(-) diff --git a/libethcore/ChainOperationParams.h b/libethcore/ChainOperationParams.h index 5d773e216..9123ad3cf 100644 --- a/libethcore/ChainOperationParams.h +++ b/libethcore/ChainOperationParams.h @@ -256,6 +256,7 @@ struct ChainOperationParams { u256 externalGasDifficulty = ~u256( 0 ); typedef std::vector< std::string > vecAdminOrigins_t; vecAdminOrigins_t vecAdminOrigins; // wildcard based folters for IP addresses + int getLogsBlocksLimit = -1; time_t getPatchTimestamp( SchainPatchEnum _patchEnum ) const; diff --git a/libethcore/Exceptions.h b/libethcore/Exceptions.h index 60a76954c..a39c33a00 100644 --- a/libethcore/Exceptions.h +++ b/libethcore/Exceptions.h @@ -107,5 +107,8 @@ DEV_SIMPLE_EXCEPTION( FailedToDownloadDaoForkBlockHeader ); DEV_SIMPLE_EXCEPTION( AccountLocked ); DEV_SIMPLE_EXCEPTION( TransactionRefused ); DEV_SIMPLE_EXCEPTION( UnknownAccount ); + +DEV_SIMPLE_EXCEPTION( TooBigResponse ); + } // namespace eth } // namespace dev diff --git a/libethereum/ChainParams.cpp b/libethereum/ChainParams.cpp index ca4f51b6b..cb1b90d40 100644 --- a/libethereum/ChainParams.cpp +++ b/libethereum/ChainParams.cpp @@ -106,6 +106,8 @@ ChainParams ChainParams::loadConfig( cp.skaleDisableChainIdCheck = params.count( c_skaleDisableChainIdCheck ) ? params[c_skaleDisableChainIdCheck].get_bool() : false; + cp.getLogsBlocksLimit = + params.count( "getLogsBlocksLimit" ) ? params.at( "getLogsBlocksLimit" ).get_int() : -1; if ( obj.count( c_skaleConfig ) ) { processSkaleConfigItems( cp, obj ); diff --git a/libethereum/ClientBase.cpp b/libethereum/ClientBase.cpp index bc88f0e34..b0367ff78 100644 --- a/libethereum/ClientBase.cpp +++ b/libethereum/ClientBase.cpp @@ -219,6 +219,9 @@ LocalisedLogEntries ClientBase::logs( LogFilter const& _f ) const { unsigned begin = min( bc().number() + 1, ( unsigned ) _f.latest() ); unsigned end = min( bc().number(), min( begin, ( unsigned ) _f.earliest() ) ); + if ( begin >= end && begin - end > bc().chainParams().getLogsBlocksLimit ) + BOOST_THROW_EXCEPTION( TooBigResponse() ); + // Handle pending transactions differently as they're not on the block chain. if ( begin > bc().number() ) { Block temp = postSeal(); @@ -350,18 +353,6 @@ bool ClientBase::uninstallWatch( unsigned _i ) { return true; } -LocalisedLogEntries ClientBase::peekWatch( unsigned _watchId ) const { - Guard l( x_filtersWatches ); - - // LOG(m_loggerWatch) << "peekWatch" << _watchId; - auto& w = m_watches.at( _watchId ); - // LOG(m_loggerWatch) << "lastPoll updated to " << - // chrono::duration_cast(chrono::system_clock::now().time_since_epoch()).count(); - if ( w.lastPoll != chrono::system_clock::time_point::max() ) - w.lastPoll = chrono::system_clock::now(); - return w.get_changes(); -} - LocalisedLogEntries ClientBase::checkWatch( unsigned _watchId ) { Guard l( x_filtersWatches ); LocalisedLogEntries ret; diff --git a/libethereum/ClientBase.h b/libethereum/ClientBase.h index 1dd089b72..626387b5a 100644 --- a/libethereum/ClientBase.h +++ b/libethereum/ClientBase.h @@ -114,7 +114,6 @@ class ClientBase : public Interface { fnClientWatchHandlerMulti_t fnOnNewChanges = fnClientWatchHandlerMulti_t(), bool isWS = false ) override; bool uninstallWatch( unsigned _watchId ) override; - LocalisedLogEntries peekWatch( unsigned _watchId ) const override; LocalisedLogEntries checkWatch( unsigned _watchId ) override; using Interface::blockDetails; diff --git a/libethereum/Interface.h b/libethereum/Interface.h index a6c1c874f..7ee5d0e26 100644 --- a/libethereum/Interface.h +++ b/libethereum/Interface.h @@ -154,13 +154,6 @@ class Interface { fnClientWatchHandlerMulti_t fnOnNewChanges = fnClientWatchHandlerMulti_t(), bool isWS = false ) = 0; virtual bool uninstallWatch( unsigned _watchId ) = 0; - LocalisedLogEntries peekWatchSafe( unsigned _watchId ) const { - try { - return peekWatch( _watchId ); - } catch ( ... ) { - return LocalisedLogEntries(); - } - } LocalisedLogEntries checkWatchSafe( unsigned _watchId ) { try { return checkWatch( _watchId ); @@ -168,7 +161,6 @@ class Interface { return LocalisedLogEntries(); } } - virtual LocalisedLogEntries peekWatch( unsigned _watchId ) const = 0; virtual LocalisedLogEntries checkWatch( unsigned _watchId ) = 0; // [BLOCK QUERY API] @@ -328,7 +320,6 @@ class Watch : public boost::noncopyable { } LocalisedLogEntries check() { return m_c ? m_c->checkWatch( m_id ) : LocalisedLogEntries(); } - LocalisedLogEntries peek() { return m_c ? m_c->peekWatch( m_id ) : LocalisedLogEntries(); } LocalisedLogEntries logs() const { return m_c->logs( m_id ); } private: diff --git a/libskutils/include/skutils/console_colors.h b/libskutils/include/skutils/console_colors.h index 36808e1ed..fdce082ff 100644 --- a/libskutils/include/skutils/console_colors.h +++ b/libskutils/include/skutils/console_colors.h @@ -438,12 +438,13 @@ extern bool string2duration( const std::string& s, std::chrono::duration< uint64 const std::chrono::seconds& seconds = std::chrono::seconds::zero() ); extern std::string duration2string( std::chrono::nanoseconds time ); extern std::string time2string( - std::time_t tt, uint64_t nMicroSeconds, bool isUTC = false, bool isColored = true ); -extern std::string time2string( const std::tm& aTm, uint64_t nMicroSeconds, bool isColored = true ); + std::time_t tt, uint64_t nMicroSeconds, bool isUTC = false, bool isColored = false ); +extern std::string time2string( + const std::tm& aTm, uint64_t nMicroSeconds, bool isColored = false ); extern std::string time2string( const default_clock_t::time_point& ptTime, bool isUTC = false, - bool isDaysInsteadOfYMD = false, bool isColored = true ); + bool isDaysInsteadOfYMD = false, bool isColored = false ); extern std::string now2string( - bool isUTC = false, bool isDaysInsteadOfYMD = false, bool isColored = true ); + bool isUTC = false, bool isDaysInsteadOfYMD = false, bool isColored = false ); extern std::string jsNow2string( bool isUTC = true ); inline std::string c() { diff --git a/libskutils/src/console_colors.cpp b/libskutils/src/console_colors.cpp index 042d4be3e..27969977d 100644 --- a/libskutils/src/console_colors.cpp +++ b/libskutils/src/console_colors.cpp @@ -1185,12 +1185,12 @@ std::string duration2string( std::chrono::nanoseconds time ) { } std::string time2string( - std::time_t tt, uint64_t nMicroSeconds, bool isUTC, bool isColored /*= true*/ ) { + std::time_t tt, uint64_t nMicroSeconds, bool isUTC, bool isColored /*= false*/ ) { std::lock_guard< std::mutex > lock( g_libcall_mutex ); struct std::tm aTm = isUTC ? ( *std::gmtime( &tt ) ) : ( *std::localtime( &tt ) ); return time2string( aTm, nMicroSeconds, isColored ); } -std::string time2string( const std::tm& aTm, uint64_t nMicroSeconds, bool isColored /*= true*/ ) { +std::string time2string( const std::tm& aTm, uint64_t nMicroSeconds, bool isColored /*= false*/ ) { const std::tm& effective_tm = aTm; std::stringstream ss; ss << std::setfill( '0' ); @@ -1255,7 +1255,7 @@ inline time_t clock_2_time_t( const typename clock_type_t::time_point& ptTime ) } std::string time2string( const default_clock_t::time_point& ptTime, bool isUTC, - bool isDaysInsteadOfYMD, bool isColored /*= true*/ ) { + bool isDaysInsteadOfYMD, bool isColored /*= false*/ ) { std::stringstream ss; typedef std::chrono::duration< int, std::ratio_multiply< std::chrono::hours::period, std::ratio< 24 > >::type > @@ -1363,7 +1363,7 @@ std::string time2string( const default_clock_t::time_point& ptTime, bool isUTC, std::string s = ss.str(); return s; } -std::string now2string( bool isUTC, bool isDaysInsteadOfYMD, bool isColored /*= true*/ ) { +std::string now2string( bool isUTC, bool isDaysInsteadOfYMD, bool isColored /*= false*/ ) { default_clock_t::time_point ptTimeNow = default_clock_t::now(); std::string s = time2string( ptTimeNow, isUTC, isDaysInsteadOfYMD, isColored ); return s; diff --git a/libweb3jsonrpc/Eth.cpp b/libweb3jsonrpc/Eth.cpp index b50874935..d45b3a541 100644 --- a/libweb3jsonrpc/Eth.cpp +++ b/libweb3jsonrpc/Eth.cpp @@ -487,11 +487,9 @@ string Eth::eth_call( TransactionSkeleton& t, string const& if ( strRevertReason.empty() ) strRevertReason = "EVM revert instruction without description message"; std::string strTx = t.toString(); - std::string strOut = cc::fatal( "Error message from eth_call():" ) + cc::error( " " ) + - cc::warn( strRevertReason ) + cc::error( ", with call arguments: " ) + - cc::j( strTx ) + cc::error( ", and using " ) + - cc::info( "blockNumber" ) + cc::error( "=" ) + - cc::bright( blockNumber ); + std::string strOut = "Error message from eth_call(): " + strRevertReason + + ", with call arguments: " + strTx + + ", and using blockNumber=" + blockNumber; cerror << strOut; throw std::logic_error( strRevertReason ); } @@ -820,6 +818,10 @@ Json::Value Eth::eth_getFilterChangesEx( string const& _filterId ) { Json::Value Eth::eth_getFilterLogs( string const& _filterId ) { try { return toJson( client()->logs( static_cast< unsigned int >( jsToInt( _filterId ) ) ) ); + } catch ( const TooBigResponse& ) { + BOOST_THROW_EXCEPTION( JsonRpcException( Errors::ERROR_RPC_INVALID_PARAMS, + "Log response size exceeded. Maximum allowed number of requested blocks is " + + to_string( this->client()->chainParams().getLogsBlocksLimit ) ) ); } catch ( ... ) { BOOST_THROW_EXCEPTION( JsonRpcException( Errors::ERROR_RPC_INVALID_PARAMS ) ); } @@ -837,6 +839,10 @@ Json::Value Eth::eth_getFilterLogs( string const& _filterId ) { Json::Value Eth::eth_getLogs( Json::Value const& _json ) { try { return toJson( client()->logs( toLogFilter( _json ) ) ); + } catch ( const TooBigResponse& ) { + BOOST_THROW_EXCEPTION( JsonRpcException( Errors::ERROR_RPC_INVALID_PARAMS, + "Log response size exceeded. Maximum allowed number of requested blocks is " + + to_string( this->client()->chainParams().getLogsBlocksLimit ) ) ); } catch ( ... ) { BOOST_THROW_EXCEPTION( JsonRpcException( Errors::ERROR_RPC_INVALID_PARAMS ) ); } diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index 6e5d772f6..229136584 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -254,7 +254,8 @@ ChainParams chainParams; JsonRpcFixture( const std::string& _config = "", bool _owner = true, bool _deploymentControl = true, bool _generation2 = false, - bool _mtmEnabled = false, bool _isSyncNode = false, int _emptyBlockIntervalMs = -1 ) { + bool _mtmEnabled = false, bool _isSyncNode = false, int _emptyBlockIntervalMs = -1, + const std::map& params = std::map() ) { if ( _config != "" ) { @@ -307,6 +308,9 @@ JsonRpcFixture( const std::string& _config = "", bool _owner = true, chainParams.nodeInfo.port = chainParams.nodeInfo.port6 = rand_port; chainParams.sChain.nodes[0].port = chainParams.sChain.nodes[0].port6 = rand_port; chainParams.skaleDisableChainIdCheck = true; + + if( params.count("getLogsBlocksLimit") && stoi( params.at( "getLogsBlocksLimit" ) ) ) + chainParams.getLogsBlocksLimit = stoi( params.at( "getLogsBlocksLimit" ) ); } chainParams.sChain.multiTransactionMode = _mtmEnabled; chainParams.nodeInfo.syncNode = _isSyncNode; @@ -2110,6 +2114,77 @@ contract Logger{ BOOST_REQUIRE_EQUAL(logs.size(), 24); } +// limit on getLogs output +BOOST_AUTO_TEST_CASE( getLogs_limit ) { + JsonRpcFixture fixture( "", true, true, false, false, false, -1, + {{"getLogsBlocksLimit", "10"}} ); + + dev::eth::simulateMining( *( fixture.client ), 1 ); + + /* + // SPDX-License-Identifier: None +pragma solidity ^0.8; +contract Logger{ + event DummyEvent(uint256, uint256); + fallback() external payable { + for(uint i=0; i<100; ++i) + emit DummyEvent(block.number, i); + } +} +*/ + + string bytecode = "6080604052348015600e575f80fd5b5060c080601a5f395ff3fe60806040525f5b6064811015604f577f90778767414a5c844b9d35a8745f67697ee3b8c2c3f4feafe5d9a3e234a5a3654382604051603d9291906067565b60405180910390a18060010190506006565b005b5f819050919050565b6061816051565b82525050565b5f60408201905060785f830185605a565b60836020830184605a565b939250505056fea264697066735822122040208e35f2706dd92c17579466ab671c308efec51f558a755ea2cf81105ab22964736f6c63430008190033"; + + Json::Value create; + create["code"] = bytecode; + create["gas"] = "180000"; // TODO or change global default of 90000? + + string deployHash = fixture.rpcClient->eth_sendTransaction( create ); + dev::eth::mineTransaction( *( fixture.client ), 1 ); + + Json::Value deployReceipt = fixture.rpcClient->eth_getTransactionReceipt( deployHash ); + string contractAddress = deployReceipt["contractAddress"].asString(); + + // generate 10 blocks 10 logs each + + Json::Value t; + t["from"] = toJS( fixture.coinbase.address() ); + t["value"] = jsToDecimal( "0" ); + t["to"] = contractAddress; + t["gas"] = "99000"; + + for(int i=0; i<11; ++i){ + + std::string txHash = fixture.rpcClient->eth_sendTransaction( t ); + BOOST_REQUIRE( !txHash.empty() ); + dev::eth::mineTransaction( *( fixture.client ), 1 ); + Json::Value receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); + BOOST_REQUIRE_EQUAL(receipt["status"], "0x1"); + } + + // ask for logs + Json::Value req; + req["fromBlock"] = 1; + req["toBlock"] = 11; + req["topics"] = Json::Value(Json::arrayValue); + + // 1 10 blocks + BOOST_REQUIRE_NO_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs(req) ); + + // 2 with topics + req["address"] = contractAddress; + BOOST_REQUIRE_NO_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs(req) ); + + // 3 11 blocks + req["toBlock"] = 12; + BOOST_REQUIRE_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs(req), std::exception ); + + // 4 filter + string filterId = fixture.rpcClient->eth_newFilter( req ); + BOOST_REQUIRE_THROW( Json::Value res = fixture.rpcClient->eth_getFilterLogs(filterId), std::exception ); + BOOST_REQUIRE_NO_THROW( Json::Value res = fixture.rpcClient->eth_getFilterChanges(filterId) ); +} + BOOST_AUTO_TEST_CASE( estimate_gas_low_gas_txn ) { JsonRpcFixture fixture; dev::eth::simulateMining( *( fixture.client ), 10 ); From 1615a5ec8c213a4cc1266c2475a4cc39dec0c86d Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Mon, 29 Apr 2024 15:24:55 +0100 Subject: [PATCH 119/154] #1719 fix txn proccessing --- libethcore/TransactionBase.cpp | 8 ++++---- libethereum/SkaleHost.cpp | 3 +-- libethereum/TransactionQueue.cpp | 5 +++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/libethcore/TransactionBase.cpp b/libethcore/TransactionBase.cpp index 9febca7a1..130693226 100644 --- a/libethcore/TransactionBase.cpp +++ b/libethcore/TransactionBase.cpp @@ -208,14 +208,14 @@ void TransactionBase::fillFromBytesType1( if ( _checkSig >= CheckTransaction::Cheap && !m_vrs->isValid() ) BOOST_THROW_EXCEPTION( InvalidSignature() ); + m_txType = TransactionType::Type1; + if ( _checkSig == CheckTransaction::Everything ) m_sender = sender(); if ( rlp.itemCount() > 11 ) BOOST_THROW_EXCEPTION( InvalidTransactionFormat() << errinfo_comment( "too many fields in the transaction RLP" ) ); - - m_txType = TransactionType::Type1; } catch ( Exception& _e ) { _e << errinfo_name( "invalid transaction format: " + toString( rlp ) + " RLP: " + toHex( rlp.data() ) ); @@ -276,14 +276,14 @@ void TransactionBase::fillFromBytesType2( if ( _checkSig >= CheckTransaction::Cheap && !m_vrs->isValid() ) BOOST_THROW_EXCEPTION( InvalidSignature() ); + m_txType = TransactionType::Type2; + if ( _checkSig == CheckTransaction::Everything ) m_sender = sender(); if ( rlp.itemCount() > 12 ) BOOST_THROW_EXCEPTION( InvalidTransactionFormat() << errinfo_comment( "too many fields in the transaction RLP" ) ); - - m_txType = TransactionType::Type2; } catch ( Exception& _e ) { _e << errinfo_name( "invalid transaction format: " + toString( rlp ) + " RLP: " + toHex( rlp.data() ) ); diff --git a/libethereum/SkaleHost.cpp b/libethereum/SkaleHost.cpp index 0f525a21f..a830dae8a 100644 --- a/libethereum/SkaleHost.cpp +++ b/libethereum/SkaleHost.cpp @@ -332,9 +332,8 @@ h256 SkaleHost::receiveTransaction( std::string _rlp ) { return h256(); } - Transaction transaction( jsToBytes( _rlp, OnFailed::Throw ), CheckTransaction::None, + Transaction transaction( jsToBytes( _rlp, OnFailed::Throw ), CheckTransaction::None, false, EIP1559TransactionsPatch::isEnabledInWorkingBlock() ); - h256 sha = transaction.sha3(); // diff --git a/libethereum/TransactionQueue.cpp b/libethereum/TransactionQueue.cpp index e2ed6960d..dafacf8f6 100644 --- a/libethereum/TransactionQueue.cpp +++ b/libethereum/TransactionQueue.cpp @@ -528,8 +528,9 @@ void TransactionQueue::verifierBody() { } // block try { - Transaction t( work.transaction, CheckTransaction::Cheap ); // Signature will be - // checked later + Transaction t( work.transaction, CheckTransaction::Cheap, false, + EIP1559TransactionsPatch::isEnabledInWorkingBlock() ); // Signature will be + // checked later ImportResult ir = import( t ); m_onImport( ir, t.sha3(), work.nodeId ); } catch ( ... ) { From 18847bac479c4f953955b108f01557b2227050e3 Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Tue, 30 Apr 2024 11:09:54 +0100 Subject: [PATCH 120/154] #1719 fix eth_getBlockByNumber call --- libweb3jsonrpc/Eth.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/libweb3jsonrpc/Eth.cpp b/libweb3jsonrpc/Eth.cpp index 462e7eed4..586b93667 100644 --- a/libweb3jsonrpc/Eth.cpp +++ b/libweb3jsonrpc/Eth.cpp @@ -601,12 +601,14 @@ Json::Value Eth::eth_getBlockByNumber( string const& _blockNumber, bool _include if ( !client()->isKnown( h ) ) return Json::Value( Json::nullValue ); + BlockNumber bn = ( h == LatestBlock || h == PendingBlock ) ? client()->number() : h; + u256 baseFeePerGas; - if ( EIP1559TransactionsPatch::isEnabledWhen( client()->blockInfo( h - 1 ).timestamp() ) ) + if ( EIP1559TransactionsPatch::isEnabledWhen( client()->blockInfo( bn - 1 ).timestamp() ) ) try { - baseFeePerGas = client()->gasBidPrice( h - 1 ); + baseFeePerGas = client()->gasBidPrice( bn - 1 ); } catch ( std::invalid_argument& _e ) { - cdebug << "Cannot get gas price for block " << h; + cdebug << "Cannot get gas price for block " << bn; cdebug << _e.what(); // set default gasPrice // probably the price was rotated out as we are asking the price for the old block From bcc31af549c90c1e738c61a8cd009931ba1b3fce Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Tue, 30 Apr 2024 15:25:32 +0100 Subject: [PATCH 121/154] #1719 fix getTransaction --- libweb3jsonrpc/JsonHelper.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/libweb3jsonrpc/JsonHelper.cpp b/libweb3jsonrpc/JsonHelper.cpp index 717d5286e..b2828a1c2 100644 --- a/libweb3jsonrpc/JsonHelper.cpp +++ b/libweb3jsonrpc/JsonHelper.cpp @@ -95,7 +95,8 @@ Json::Value toJson( dev::eth::Transaction const& _t, std::pair< h256, unsigned > res["to"] = _t.isCreation() ? Json::Value() : toJS( _t.receiveAddress() ); res["from"] = toJS( _t.safeSender() ); res["gas"] = toJS( _t.gas() ); - res["gasPrice"] = toJS( _t.gasPrice() ); + if ( _t.txType() != dev::eth::TransactionType::Type2 ) + res["gasPrice"] = toJS( _t.gasPrice() ); res["nonce"] = toJS( _t.nonce() ); res["value"] = toJS( _t.value() ); res["blockHash"] = toJS( _location.first ); @@ -121,7 +122,7 @@ Json::Value toJson( dev::eth::Transaction const& _t, std::pair< h256, unsigned > } if ( _t.txType() != dev::eth::TransactionType::Type1 ) { res["maxPriorityFeePerGas"] = toJS( _t.maxPriorityFeePerGas() ); - res["maxFeePerGas"] = toJS( _t.maxPriorityFeePerGas() ); + res["maxFeePerGas"] = toJS( _t.maxFeePerGas() ); } } } @@ -343,7 +344,8 @@ Json::Value toJson( dev::eth::Transaction const& _t ) { res["to"] = _t.isCreation() ? Json::Value() : toJS( _t.to() ); res["from"] = toJS( _t.from() ); res["gas"] = toJS( _t.gas() ); - res["gasPrice"] = toJS( _t.gasPrice() ); + if ( _t.txType() != dev::eth::TransactionType::Type2 ) + res["gasPrice"] = toJS( _t.gasPrice() ); res["value"] = toJS( _t.value() ); res["data"] = toJS( _t.data(), 32 ); res["nonce"] = toJS( _t.nonce() ); @@ -366,7 +368,7 @@ Json::Value toJson( dev::eth::Transaction const& _t ) { } if ( _t.txType() != dev::eth::TransactionType::Type1 ) { res["maxPriorityFeePerGas"] = toJS( _t.maxPriorityFeePerGas() ); - res["maxFeePerGas"] = toJS( _t.maxPriorityFeePerGas() ); + res["maxFeePerGas"] = toJS( _t.maxFeePerGas() ); } } } From a1e8069d70903de72c181491976588fd23229307 Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Tue, 30 Apr 2024 16:00:23 +0100 Subject: [PATCH 122/154] IS 864 better exception description --- libethereum/SkaleHost.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libethereum/SkaleHost.cpp b/libethereum/SkaleHost.cpp index aacbc4c1a..ef1638d81 100644 --- a/libethereum/SkaleHost.cpp +++ b/libethereum/SkaleHost.cpp @@ -184,7 +184,7 @@ void DefaultConsensusFactory::fillPublicKeyInfo( ConsensusEngine& consensus ) co m_client.chainParams().nodeInfo.syncNode ) ) consensus.setPublicKeyInfo( ecdsaPublicKeys, blsPublicKeysPtr, t, n ); } catch ( ... ) { - std::throw_with_nested( std::runtime_error( "Error filling SGX info (nodeGroups)" ) ); + std::throw_with_nested( std::runtime_error( "Error filling public keys info (nodeGroups)" ) ); } From a7590fb4ef681ad70639ad19ea7d640ab79b8705 Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Tue, 30 Apr 2024 18:05:43 +0100 Subject: [PATCH 123/154] #1719 format code --- libethcore/TransactionBase.h | 2 +- libethereum/TransactionQueue.cpp | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/libethcore/TransactionBase.h b/libethcore/TransactionBase.h index 310ef741a..36a3cd192 100644 --- a/libethcore/TransactionBase.h +++ b/libethcore/TransactionBase.h @@ -313,7 +313,7 @@ class TransactionBase { /// Constructs a transaction from the given RLP and transaction type. void fillFromBytesByType( bytesConstRef _rlpData, CheckTransaction _checkSig, - bool _allowInvalid, TransactionType type ); + bool _allowInvalid, TransactionType _type ); void fillFromBytesLegacy( bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid ); void fillFromBytesType1( diff --git a/libethereum/TransactionQueue.cpp b/libethereum/TransactionQueue.cpp index dafacf8f6..16e726e76 100644 --- a/libethereum/TransactionQueue.cpp +++ b/libethereum/TransactionQueue.cpp @@ -133,7 +133,6 @@ ImportResult TransactionQueue::import( // if transaction found: if ( t != fs->second.end() ) { - // if( t == fs->second.begin() ){ UpgradeGuard ul( l ); --m_futureSize; m_futureSizeBytes -= t->second.transaction.toBytes().size(); @@ -143,7 +142,6 @@ ImportResult TransactionQueue::import( fs->second.erase( t->second.transaction.nonce() ); if ( fs->second.empty() ) m_future.erase( fs ); - // } } // if found } // if fs->second From 3181ea40dcf773f61e6ed06d662b2f0d5a4a037d Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Tue, 30 Apr 2024 18:39:29 +0100 Subject: [PATCH 124/154] #1719 small improvements --- libethcore/TransactionBase.cpp | 18 ++++++++++++------ libweb3jsonrpc/Eth.cpp | 5 ++++- test/tools/libtesteth/BlockChainHelper.cpp | 2 +- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/libethcore/TransactionBase.cpp b/libethcore/TransactionBase.cpp index 130693226..55dbeb154 100644 --- a/libethcore/TransactionBase.cpp +++ b/libethcore/TransactionBase.cpp @@ -36,11 +36,13 @@ using namespace std; using namespace dev; using namespace dev::eth; -std::vector< bytes > validateAccessListRLP( const RLP& data ) { - if ( !data.isList() ) +const size_t MAX_ACCESS_LIST_COUNT = 16; + +std::vector< bytes > validateAccessListRLP( const RLP& _data ) { + if ( !_data.isList() ) BOOST_THROW_EXCEPTION( InvalidTransactionFormat() << errinfo_comment( "transaction accessList RLP must be a list" ) ); - auto rlpList = data.toList(); + auto rlpList = _data.toList(); if ( rlpList.empty() ) { // empty accessList, ignore it return {}; @@ -66,6 +68,10 @@ std::vector< bytes > validateAccessListRLP( const RLP& data ) { "transaction storageKeys RLP must be a list of byte array" ) ); } + if ( rlpList.size() > MAX_ACCESS_LIST_COUNT ) + BOOST_THROW_EXCEPTION( InvalidTransactionFormat() + << errinfo_comment( "The number of access lists is too large." ) ); + std::vector< bytes > accessList( rlpList.size() ); for ( size_t i = 0; i < rlpList.size(); ++i ) { accessList[i] = rlpList.at( i ).data().toBytes(); @@ -298,9 +304,9 @@ void TransactionBase::fillFromBytesType2( } } -void TransactionBase::fillFromBytesByType( - bytesConstRef _rlpData, CheckTransaction _checkSig, bool _allowInvalid, TransactionType type ) { - switch ( type ) { +void TransactionBase::fillFromBytesByType( bytesConstRef _rlpData, CheckTransaction _checkSig, + bool _allowInvalid, TransactionType _type ) { + switch ( _type ) { case TransactionType::Legacy: fillFromBytesLegacy( _rlpData, _checkSig, _allowInvalid ); break; diff --git a/libweb3jsonrpc/Eth.cpp b/libweb3jsonrpc/Eth.cpp index 6849e525d..4c1b42fdf 100644 --- a/libweb3jsonrpc/Eth.cpp +++ b/libweb3jsonrpc/Eth.cpp @@ -956,7 +956,10 @@ Json::Value Eth::eth_feeHistory( const std::string& _blockCount, const std::stri } } - auto blockCount = std::min( jsToU256( _blockCount ), MAX_BLOCK_RANGE ); + auto blockCount = jsToU256( _blockCount ); + if ( blockCount > MAX_BLOCK_RANGE ) + throw std::runtime_error( "Max block range reached. Please try smaller blockCount." ); + auto newestBlock = jsToBlockNumber( _newestBlock ); if ( newestBlock == dev::eth::LatestBlock ) newestBlock = client()->number(); diff --git a/test/tools/libtesteth/BlockChainHelper.cpp b/test/tools/libtesteth/BlockChainHelper.cpp index f24e27b04..53b3ce334 100644 --- a/test/tools/libtesteth/BlockChainHelper.cpp +++ b/test/tools/libtesteth/BlockChainHelper.cpp @@ -122,7 +122,7 @@ void TestBlock::setState( State const& _state ) { void TestBlock::addTransaction( TestTransaction const& _tr ) { m_testTransactions.push_back( _tr ); if ( m_transactionQueue.import( _tr.transaction().toBytes() ) != ImportResult::Success ) - cnote << TestOutputHelper::get().testName() + " Test block failed importing transaction\n"; + cnote << TestOutputHelper::get().testName() + " Test block failed importing transaction"; recalcBlockHeaderBytes(); } From e544bda92aead9c3bef49adbb8eab9fc566d1b4e Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Thu, 2 May 2024 21:09:41 +0100 Subject: [PATCH 125/154] SKALED-1877 Add blockHash support --- libweb3jsonrpc/Eth.cpp | 15 ++++++++++++++- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 23 +++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/libweb3jsonrpc/Eth.cpp b/libweb3jsonrpc/Eth.cpp index d45b3a541..8ec98d1e9 100644 --- a/libweb3jsonrpc/Eth.cpp +++ b/libweb3jsonrpc/Eth.cpp @@ -838,11 +838,24 @@ Json::Value Eth::eth_getFilterLogs( string const& _filterId ) { Json::Value Eth::eth_getLogs( Json::Value const& _json ) { try { - return toJson( client()->logs( toLogFilter( _json ) ) ); + LogFilter filter = toLogFilter( _json ); + if ( !_json["blockHash"].isNull() ) { + if ( !_json["fromBlock"].isNull() || !_json["toBlock"].isNull() ) + BOOST_THROW_EXCEPTION( JsonRpcException( Errors::ERROR_RPC_INVALID_PARAMS, + "fromBlock and toBlock are not allowed if blockHash is present" ) ); + string strHash = _json["blockHash"].asString(); + uint64_t number = m_eth.numberFromHash( jsToFixed< 32 >( strHash ) ); + if ( number == PendingBlock ) + return toJson( LocalisedLogEntries() ); + filter.withEarliest( number ).withLatest( number ); + } + return toJson( client()->logs( filter ) ); } catch ( const TooBigResponse& ) { BOOST_THROW_EXCEPTION( JsonRpcException( Errors::ERROR_RPC_INVALID_PARAMS, "Log response size exceeded. Maximum allowed number of requested blocks is " + to_string( this->client()->chainParams().getLogsBlocksLimit ) ) ); + } catch ( const JsonRpcException& ) { + throw; } catch ( ... ) { BOOST_THROW_EXCEPTION( JsonRpcException( Errors::ERROR_RPC_INVALID_PARAMS ) ); } diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index 229136584..067ad10f5 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -2185,6 +2185,29 @@ contract Logger{ BOOST_REQUIRE_NO_THROW( Json::Value res = fixture.rpcClient->eth_getFilterChanges(filterId) ); } +// test blockHash parameter +BOOST_AUTO_TEST_CASE( getLogs_blockHash ) { + JsonRpcFixture fixture; + dev::eth::simulateMining( *( fixture.client ), 1 ); + + Json::Value req; + req["blockHash"] = "xyz"; + BOOST_REQUIRE_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs(req), std::exception ); + + req["fromBlock"] = 1; + req["toBlock"] = 1; + BOOST_REQUIRE_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs(req), std::exception ); + + req.removeMember("fromBlock"); + req.removeMember("toBlock"); + req["blockHash"] = "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"; + BOOST_REQUIRE_NO_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs(req) ); + + string hash = fixture.rpcClient->eth_getBlockByNumber("latest", false)["hash"].asString(); + req["blockHash"] = hash; + BOOST_REQUIRE_NO_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs(req) ); +} + BOOST_AUTO_TEST_CASE( estimate_gas_low_gas_txn ) { JsonRpcFixture fixture; dev::eth::simulateMining( *( fixture.client ), 10 ); From 0da86095ea10c064b1d02afcd6fe2a284573593b Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Fri, 3 May 2024 15:13:47 +0100 Subject: [PATCH 126/154] SKALED-1877 Fix wrong filter range --- libweb3jsonrpc/Eth.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libweb3jsonrpc/Eth.cpp b/libweb3jsonrpc/Eth.cpp index 8ec98d1e9..e6f27bd63 100644 --- a/libweb3jsonrpc/Eth.cpp +++ b/libweb3jsonrpc/Eth.cpp @@ -847,7 +847,8 @@ Json::Value Eth::eth_getLogs( Json::Value const& _json ) { uint64_t number = m_eth.numberFromHash( jsToFixed< 32 >( strHash ) ); if ( number == PendingBlock ) return toJson( LocalisedLogEntries() ); - filter.withEarliest( number ).withLatest( number ); + filter.withEarliest( number ); + filter.withLatest( number ); } return toJson( client()->logs( filter ) ); } catch ( const TooBigResponse& ) { From 7d612eddeb483dac1786a0badf1884c397fb9c8a Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Fri, 3 May 2024 15:45:36 +0100 Subject: [PATCH 127/154] IS-864 bls sync config --- libconsensus | 2 +- libethereum/SkaleHost.cpp | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/libconsensus b/libconsensus index 5276c8e47..d3432c51b 160000 --- a/libconsensus +++ b/libconsensus @@ -1 +1 @@ -Subproject commit 5276c8e479b2db0d06d377df7fada6f53a1486e3 +Subproject commit d3432c51b2041b892f5d9707e9feb89da35cfd12 diff --git a/libethereum/SkaleHost.cpp b/libethereum/SkaleHost.cpp index ef1638d81..53d03c8e0 100644 --- a/libethereum/SkaleHost.cpp +++ b/libethereum/SkaleHost.cpp @@ -182,7 +182,8 @@ void DefaultConsensusFactory::fillPublicKeyInfo( ConsensusEngine& consensus ) co if ( ecdsaPublicKeys->size() && ecdsaPublicKeys->at( 0 ).size() && ( ( blsPublicKeys.size() && blsPublicKeys[0]->at( 0 ).size() ) || m_client.chainParams().nodeInfo.syncNode ) ) - consensus.setPublicKeyInfo( ecdsaPublicKeys, blsPublicKeysPtr, t, n ); + consensus.setPublicKeyInfo( + ecdsaPublicKeys, blsPublicKeysPtr, t, n, m_client.chainParams().nodeInfo.syncNode ); } catch ( ... ) { std::throw_with_nested( std::runtime_error( "Error filling public keys info (nodeGroups)" ) ); } From fbb353c302951dfe7fb41b6b85304d0a8ed77c08 Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Fri, 3 May 2024 18:39:23 +0100 Subject: [PATCH 128/154] SKALED-1877 Throw if blockHash doesn't exist or empty --- libweb3jsonrpc/Eth.cpp | 6 +++++- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 17 +++++++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/libweb3jsonrpc/Eth.cpp b/libweb3jsonrpc/Eth.cpp index e6f27bd63..878dacb94 100644 --- a/libweb3jsonrpc/Eth.cpp +++ b/libweb3jsonrpc/Eth.cpp @@ -844,9 +844,13 @@ Json::Value Eth::eth_getLogs( Json::Value const& _json ) { BOOST_THROW_EXCEPTION( JsonRpcException( Errors::ERROR_RPC_INVALID_PARAMS, "fromBlock and toBlock are not allowed if blockHash is present" ) ); string strHash = _json["blockHash"].asString(); + if ( strHash.empty() ) + throw std::invalid_argument( "blockHash cannot be an empty string" ); uint64_t number = m_eth.numberFromHash( jsToFixed< 32 >( strHash ) ); if ( number == PendingBlock ) - return toJson( LocalisedLogEntries() ); + BOOST_THROW_EXCEPTION( JsonRpcException( Errors::ERROR_RPC_INVALID_PARAMS, + "A block with this hash does not exist in the database. If this is an old " + "block, try connecting to an archive node" ) ); filter.withEarliest( number ); filter.withLatest( number ); } diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index 067ad10f5..892ef5251 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -2190,22 +2190,31 @@ BOOST_AUTO_TEST_CASE( getLogs_blockHash ) { JsonRpcFixture fixture; dev::eth::simulateMining( *( fixture.client ), 1 ); + string latestHash = fixture.rpcClient->eth_getBlockByNumber("latest", false)["hash"].asString(); + Json::Value req; req["blockHash"] = "xyz"; BOOST_REQUIRE_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs(req), std::exception ); + req["blockHash"] = Json::Value(Json::arrayValue); + BOOST_REQUIRE_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs(req), std::exception ); + req["fromBlock"] = 1; req["toBlock"] = 1; BOOST_REQUIRE_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs(req), std::exception ); + req["blockHash"] = latestHash; + BOOST_REQUIRE_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs(req), std::exception ); + req.removeMember("fromBlock"); req.removeMember("toBlock"); - req["blockHash"] = "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"; BOOST_REQUIRE_NO_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs(req) ); - string hash = fixture.rpcClient->eth_getBlockByNumber("latest", false)["hash"].asString(); - req["blockHash"] = hash; - BOOST_REQUIRE_NO_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs(req) ); + req["blockHash"] = "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"; + BOOST_REQUIRE_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs(req), std::exception ); + + req["blockHash"] = ""; + BOOST_REQUIRE_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs(req), std::exception ); } BOOST_AUTO_TEST_CASE( estimate_gas_low_gas_txn ) { From d385944c4f7c9e2b2c0c2e9a7a1d98c48ae8dde5 Mon Sep 17 00:00:00 2001 From: Stan Kladko <13399135+kladkogex@users.noreply.github.com> Date: Tue, 7 May 2024 13:01:58 +0100 Subject: [PATCH 129/154] 806 consensus improvements --- libconsensus | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libconsensus b/libconsensus index 2f7c74374..2db0f7b1b 160000 --- a/libconsensus +++ b/libconsensus @@ -1 +1 @@ -Subproject commit 2f7c7437465ed3cbbfc914ce9fb0fefe3d096ecb +Subproject commit 2db0f7b1b860d262f0dad67b5a0b83152a95ee84 From b488ef293a9dd4e8125e3524d55182b05f2e08e0 Mon Sep 17 00:00:00 2001 From: Stan Kladko <13399135+kladkogex@users.noreply.github.com> Date: Tue, 7 May 2024 13:15:03 +0100 Subject: [PATCH 130/154] 806 improve consensus --- libconsensus | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libconsensus b/libconsensus index 2db0f7b1b..d99a897a9 160000 --- a/libconsensus +++ b/libconsensus @@ -1 +1 @@ -Subproject commit 2db0f7b1b860d262f0dad67b5a0b83152a95ee84 +Subproject commit d99a897a9f254a259cdf1b2e991744e779c783b7 From aafb27c4c3c0c784dd298fb6243dcacd06d4609d Mon Sep 17 00:00:00 2001 From: Stan Kladko <13399135+kladkogex@users.noreply.github.com> Date: Tue, 7 May 2024 15:16:35 +0100 Subject: [PATCH 131/154] #806 enable patches --- libethereum/SchainPatch.cpp | 14 ++++++++++---- libethereum/SchainPatchEnum.h | 4 +++- libethereum/SkaleHost.cpp | 2 ++ 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/libethereum/SchainPatch.cpp b/libethereum/SchainPatch.cpp index 1ae076376..97d37ef5c 100644 --- a/libethereum/SchainPatch.cpp +++ b/libethereum/SchainPatch.cpp @@ -20,14 +20,17 @@ SchainPatchEnum getEnumForPatchName( const std::string& _patchName ) { return SchainPatchEnum::ContractStorageZeroValuePatch; else if ( _patchName == "PushZeroPatch" ) return SchainPatchEnum::PushZeroPatch; - else if ( _patchName == "VerifyDaSigsPatch" ) - return SchainPatchEnum::VerifyDaSigsPatch; else if ( _patchName == "ContractStoragePatch" ) return SchainPatchEnum::ContractStoragePatch; else if ( _patchName == "StorageDestructionPatch" ) return SchainPatchEnum::StorageDestructionPatch; else if ( _patchName == "SkipInvalidTransactionsPatch" ) return SchainPatchEnum::SkipInvalidTransactionsPatch; + // consesus-related patches + else if ( _patchName == "VerifyDaSigsPatch" ) + return SchainPatchEnum::VerifyDaSigsPatch; + else if ( _patchName == "FastConsensusPatch" ) + return SchainPatchEnum::FastConsensusPatch; else throw std::out_of_range( _patchName ); } @@ -46,8 +49,6 @@ std::string getPatchNameForEnum( SchainPatchEnum _enumValue ) { return "ContractStorageZeroValuePatch"; case SchainPatchEnum::PushZeroPatch: return "PushZeroPatch"; - case SchainPatchEnum::VerifyDaSigsPatch: - return "VerifyDaSigsPatch"; case SchainPatchEnum::ContractStoragePatch: return "ContractStoragePatch"; case SchainPatchEnum::StorageDestructionPatch: @@ -56,6 +57,11 @@ std::string getPatchNameForEnum( SchainPatchEnum _enumValue ) { return "SkipInvalidTransactionsPatch"; case SchainPatchEnum::SelfdestructStorageLimitPatch: return "SelfdestructStorageLimitPatch"; + // consensus-related patches + case SchainPatchEnum::VerifyDaSigsPatch: + return "VerifyDaSigsPatch"; + case SchainPatchEnum::FastConsensusPatch: + return "FastConsensusPatch"; default: throw std::out_of_range( "UnknownPatch #" + std::to_string( static_cast< size_t >( _enumValue ) ) ); diff --git a/libethereum/SchainPatchEnum.h b/libethereum/SchainPatchEnum.h index b1f439211..033caa6ba 100644 --- a/libethereum/SchainPatchEnum.h +++ b/libethereum/SchainPatchEnum.h @@ -11,11 +11,13 @@ enum class SchainPatchEnum { CorrectForkInPowPatch, ContractStorageZeroValuePatch, PushZeroPatch, - VerifyDaSigsPatch, ContractStoragePatch, StorageDestructionPatch, SkipInvalidTransactionsPatch, SelfdestructStorageLimitPatch, + // consensus related patches + VerifyDaSigsPatch, + FastConsensusPatch, PatchesCount }; diff --git a/libethereum/SkaleHost.cpp b/libethereum/SkaleHost.cpp index 7988705e8..9a53d8163 100644 --- a/libethereum/SkaleHost.cpp +++ b/libethereum/SkaleHost.cpp @@ -81,6 +81,8 @@ std::unique_ptr< ConsensusInterface > DefaultConsensusFactory::create( patchTimeStamps["verifyDaSigsPatchTimestamp"] = m_client.chainParams().getPatchTimestamp( SchainPatchEnum::VerifyDaSigsPatch ); + patchTimeStamps["fastConsensusPatchTimestamp"] = + m_client.chainParams().getPatchTimestamp( SchainPatchEnum::FastConsensusPatch ); auto consensus_engine_ptr = make_unique< ConsensusEngine >( _extFace, m_client.number(), ts, 0, patchTimeStamps, m_client.chainParams().sChain.consensusStorageLimit ); From 84e3099decb7c4aa5d41b5c1ccbf72e9275a5101 Mon Sep 17 00:00:00 2001 From: Stan Kladko <13399135+kladkogex@users.noreply.github.com> Date: Tue, 7 May 2024 15:30:38 +0100 Subject: [PATCH 132/154] 806 fix patch names --- libconsensus | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libconsensus b/libconsensus index d99a897a9..78e97fddb 160000 --- a/libconsensus +++ b/libconsensus @@ -1 +1 @@ -Subproject commit d99a897a9f254a259cdf1b2e991744e779c783b7 +Subproject commit 78e97fddb182091f68dedc4d91016f046ac968ca From 395b3a8267efee51ffa4856162927bbe9f3b5f81 Mon Sep 17 00:00:00 2001 From: Stan Kladko <13399135+kladkogex@users.noreply.github.com> Date: Tue, 7 May 2024 15:35:02 +0100 Subject: [PATCH 133/154] 806 fix patch naming --- libconsensus | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libconsensus b/libconsensus index 78e97fddb..03bbaf01d 160000 --- a/libconsensus +++ b/libconsensus @@ -1 +1 @@ -Subproject commit 78e97fddb182091f68dedc4d91016f046ac968ca +Subproject commit 03bbaf01de5ce9a55f18c4cf378f72e477b70c33 From 74d215dc7388a4bbb188973892bd862358424278 Mon Sep 17 00:00:00 2001 From: Stan Kladko <13399135+kladkogex@users.noreply.github.com> Date: Tue, 7 May 2024 15:47:16 +0100 Subject: [PATCH 134/154] 806 improve consensus github flow --- libconsensus | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libconsensus b/libconsensus index 03bbaf01d..44cb1b0d8 160000 --- a/libconsensus +++ b/libconsensus @@ -1 +1 @@ -Subproject commit 03bbaf01de5ce9a55f18c4cf378f72e477b70c33 +Subproject commit 44cb1b0d82b004426fc8831ab6cc1f229e2d7636 From 03b289f80d413d1708bbeeaedf9a6d2271babd59 Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Thu, 9 May 2024 11:23:36 +0100 Subject: [PATCH 135/154] IS-864 add debug logs --- libconsensus | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libconsensus b/libconsensus index d3432c51b..1dfeafa6a 160000 --- a/libconsensus +++ b/libconsensus @@ -1 +1 @@ -Subproject commit d3432c51b2041b892f5d9707e9feb89da35cfd12 +Subproject commit 1dfeafa6a18da9bdc88709752d2a917ffd331eb1 From d072ea5a8b2a5a6f87fecd32ad682e4f2379cf20 Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Thu, 9 May 2024 17:41:42 +0100 Subject: [PATCH 136/154] IS-864 update consensus --- libconsensus | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libconsensus b/libconsensus index 1dfeafa6a..adc20562c 160000 --- a/libconsensus +++ b/libconsensus @@ -1 +1 @@ -Subproject commit 1dfeafa6a18da9bdc88709752d2a917ffd331eb1 +Subproject commit adc20562c360ab1f6902d6162cfba4e472e7ffb2 From 779ecb089600296bd70f9d4ad34789a8ef4ffc9d Mon Sep 17 00:00:00 2001 From: DmytroNazarenko Date: Fri, 10 May 2024 15:12:22 +0000 Subject: [PATCH 137/154] #1876 Add unit test for new deployment control --- libethereum/SchainPatch.h | 2 +- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 114 ++++++++++++++++++++++ 2 files changed, 115 insertions(+), 1 deletion(-) diff --git a/libethereum/SchainPatch.h b/libethereum/SchainPatch.h index 63650d7ce..10f806568 100644 --- a/libethereum/SchainPatch.h +++ b/libethereum/SchainPatch.h @@ -131,7 +131,7 @@ DEFINE_AMNESIC_PATCH( StorageDestructionPatch ); DEFINE_SIMPLE_PATCH( SelfdestructStorageLimitPatch ); /* - * Purpose: passing both tx origin and tx sender into ConfigController + * Purpose: passing both transaction origin and sender to the ConfigController contract * Version introduced: 3.19.0 */ DEFINE_SIMPLE_PATCH( FlexibleDeploymentPatch ); diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index 6e5d772f6..68d733f59 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -2896,6 +2896,120 @@ BOOST_AUTO_TEST_CASE( deploy_controller_generation2 ) { BOOST_REQUIRE( code.asString().substr( 2 ) == compiled.substr( 58 ) ); } +BOOST_AUTO_TEST_CASE( deployment_control_v2 ) { + + // pragma solidity ^0.8.9; + + // contract ConfigController { + // bool public freeContractDeployment = false; + + // function isAddressWhitelisted(address addr) external view returns (bool) { + // return freeContractDeployment; + // } + + // function isAddressWhitelisted(address sender, address origin) + // external view returns (bool) { + // return freeContractDeployment; + // } + + // function setFreeContractDeployment() external { + // freeContractDeployment = true; + // } + // } + + string configControllerV2 = + "0x608060405234801561001057600080fd5b506004361061004c576000" + "3560e01c806313f44d1014610051578063a2306c4f14610081578063b3" + "1fd4e61461009f578063f7e2a91b146100cf575b600080fd5b61006b60" + "04803603810190610066919061019a565b6100d9565b60405161007891" + "906101e2565b60405180910390f35b6100896100f1565b604051610096" + "91906101e2565b60405180910390f35b6100b960048036038101906100" + "b491906101fd565b610102565b6040516100c691906101e2565b604051" + "80910390f35b6100d761011b565b005b60008060009054906101000a90" + "0460ff169050919050565b60008054906101000a900460ff1681565b60" + "008060009054906101000a900460ff16905092915050565b6001600080" + "6101000a81548160ff021916908315150217905550565b600080fd5b60" + "0073ffffffffffffffffffffffffffffffffffffffff82169050919050" + "565b60006101678261013c565b9050919050565b6101778161015c565b" + "811461018257600080fd5b50565b6000813590506101948161016e565b" + "92915050565b6000602082840312156101b0576101af610137565b5b60" + "006101be84828501610185565b91505092915050565b60008115159050" + "919050565b6101dc816101c7565b82525050565b600060208201905061" + "01f760008301846101d3565b92915050565b6000806040838503121561" + "021457610213610137565b5b600061022285828601610185565b925050" + "602061023385828601610185565b915050925092905056fea264697066" + "73582212200d0a9423308153222b80b5b50861993fb06e77a92aba37af" + "6c7fc23105a7138264736f6c634300080b0033"; + + std::string _config = c_genesisGeneration2ConfigString; + Json::Value ret; + Json::Reader().parse( _config, ret ); + ret["accounts"]["0xD2002000000000000000000000000000000000d2"]["code"] = configControllerV2; + Json::FastWriter fastWriter; + std::string config = fastWriter.write( ret ); + + JsonRpcFixture fixture(config, false, false, true ); + Address senderAddress = fixture.coinbase.address(); + fixture.client->setAuthor( senderAddress ); + + // contract test { + // function f(uint a) returns(uint d) { return a * 7; } + // } + + string compiled = + "6080604052341561000f57600080fd5b60b98061001d6000396000f300" + "608060405260043610603f576000357c01000000000000000000000000" + "00000000000000000000000000000000900463ffffffff168063b3de64" + "8b146044575b600080fd5b3415604e57600080fd5b606a600480360381" + "019080803590602001909291905050506080565b604051808281526020" + "0191505060405180910390f35b60006007820290509190505600a16562" + "7a7a72305820f294e834212334e2978c6dd090355312a3f0f9476b8eb9" + "8fb480406fc2728a960029"; + + + Json::Value deployContractWithoutRoleTx; + deployContractWithoutRoleTx["from"] = senderAddress.hex(); + deployContractWithoutRoleTx["code"] = compiled; + deployContractWithoutRoleTx["gas"] = "1000000"; + deployContractWithoutRoleTx["gasPrice"] = fixture.rpcClient->eth_gasPrice(); + + string txHash = fixture.rpcClient->eth_sendTransaction( deployContractWithoutRoleTx ); + dev::eth::mineTransaction( *( fixture.client ), 1 ); + + Json::Value receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); + BOOST_REQUIRE_EQUAL( receipt["status"], string( "0x0" ) ); + + Json::Value code = + fixture.rpcClient->eth_getCode( receipt["contractAddress"].asString(), "latest" ); + BOOST_REQUIRE( code.asString() == "0x" ); + + // Allow deploy by calling setFreeContractDeployment() + Json::Value grantDeployerRoleTx; + grantDeployerRoleTx["data"] = "0xf7e2a91b"; + grantDeployerRoleTx["from"] = senderAddress.hex(); + grantDeployerRoleTx["to"] = "0xD2002000000000000000000000000000000000D2"; + grantDeployerRoleTx["gasPrice"] = fixture.rpcClient->eth_gasPrice(); + grantDeployerRoleTx["gas"] = toJS( "1000000" ); + txHash = fixture.rpcClient->eth_sendTransaction( grantDeployerRoleTx ); + BOOST_REQUIRE( !txHash.empty() ); + dev::eth::mineTransaction( *( fixture.client ), 1 ); + + Json::Value deployContractTx; + deployContractTx["from"] = senderAddress.hex(); + deployContractTx["code"] = compiled; + deployContractTx["gas"] = "1000000"; + deployContractTx["gasPrice"] = fixture.rpcClient->eth_gasPrice(); + + txHash = fixture.rpcClient->eth_sendTransaction( deployContractTx ); + dev::eth::mineTransaction( *( fixture.client ), 1 ); + + receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); + BOOST_REQUIRE_EQUAL( receipt["status"], string( "0x1" ) ); + BOOST_REQUIRE( !receipt["contractAddress"].isNull() ); + code = fixture.rpcClient->eth_getCode( receipt["contractAddress"].asString(), "latest" ); + BOOST_REQUIRE( code.asString().substr( 2 ) == compiled.substr( 58 ) ); +} + BOOST_AUTO_TEST_CASE( filestorage_generation2 ) { JsonRpcFixture fixture(c_genesisGeneration2ConfigString, false, false, true); From ec40d75b09a145689c80839f93acafc8ac2e8790 Mon Sep 17 00:00:00 2001 From: Dima Litvinov Date: Fri, 10 May 2024 19:56:37 +0100 Subject: [PATCH 138/154] IS-864 Small code rearrangement --- libethereum/ChainParams.cpp | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/libethereum/ChainParams.cpp b/libethereum/ChainParams.cpp index 2d7b28436..ba72d351b 100644 --- a/libethereum/ChainParams.cpp +++ b/libethereum/ChainParams.cpp @@ -226,10 +226,15 @@ void ChainParams::processSkaleConfigItems( ChainParams& cp, json_spirit::mObject array< string, 4 > BLSPublicKeys; array< string, 4 > commonBLSPublicKeys; - if ( !syncNode ) - try { - js::mObject ima = infoObj.at( "wallets" ).get_obj().at( "ima" ).get_obj(); + try { + js::mObject ima = infoObj.at( "wallets" ).get_obj().at( "ima" ).get_obj(); + + commonBLSPublicKeys[0] = ima["commonBLSPublicKey0"].get_str(); + commonBLSPublicKeys[1] = ima["commonBLSPublicKey1"].get_str(); + commonBLSPublicKeys[2] = ima["commonBLSPublicKey2"].get_str(); + commonBLSPublicKeys[3] = ima["commonBLSPublicKey3"].get_str(); + if ( !syncNode ) { keyShareName = ima.at( "keyShareName" ).get_str(); t = ima.at( "t" ).get_int(); @@ -238,26 +243,13 @@ void ChainParams::processSkaleConfigItems( ChainParams& cp, json_spirit::mObject BLSPublicKeys[1] = ima["BLSPublicKey1"].get_str(); BLSPublicKeys[2] = ima["BLSPublicKey2"].get_str(); BLSPublicKeys[3] = ima["BLSPublicKey3"].get_str(); - - commonBLSPublicKeys[0] = ima["commonBLSPublicKey0"].get_str(); - commonBLSPublicKeys[1] = ima["commonBLSPublicKey1"].get_str(); - commonBLSPublicKeys[2] = ima["commonBLSPublicKey2"].get_str(); - commonBLSPublicKeys[3] = ima["commonBLSPublicKey3"].get_str(); - } catch ( ... ) { - // all or nothing - if ( !keyShareName.empty() ) - throw; } - else - try { - js::mObject ima = infoObj.at( "wallets" ).get_obj().at( "ima" ).get_obj(); - commonBLSPublicKeys[0] = ima["commonBLSPublicKey0"].get_str(); - commonBLSPublicKeys[1] = ima["commonBLSPublicKey1"].get_str(); - commonBLSPublicKeys[2] = ima["commonBLSPublicKey2"].get_str(); - commonBLSPublicKeys[3] = ima["commonBLSPublicKey3"].get_str(); - } catch ( ... ) { - } + } catch ( ... ) { + // all or nothing + if ( !syncNode && !keyShareName.empty() ) + throw; + } cp.nodeInfo = { nodeName, nodeID, ip, static_cast< uint16_t >( port ), ip6, static_cast< uint16_t >( port6 ), sgxServerUrl, ecdsaKeyName, keyShareName, BLSPublicKeys, From fa24eab4f1cb4ea9c1bd360816304adf03d4f3d4 Mon Sep 17 00:00:00 2001 From: DmytroNazarenko Date: Mon, 13 May 2024 17:26:08 +0000 Subject: [PATCH 139/154] #1876 Change call signature --- libethcore/Common.cpp | 6 +++--- libethcore/Common.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libethcore/Common.cpp b/libethcore/Common.cpp index 4eaafc31f..bafe6df78 100644 --- a/libethcore/Common.cpp +++ b/libethcore/Common.cpp @@ -112,9 +112,9 @@ bytes isAddressWhitelistedCallData( Address const& _deployer ) { return fromHex( "13f44d10000000000000000000000000" + _deployer.hex() ); } -bytes isAddressWhitelistedCallData( Address const& _deployer, Address const& _origin ) { - return fromHex( "b31fd4e6000000000000000000000000" + _deployer.hex() + - "000000000000000000000000" + _origin.hex() ); +bytes isDeploymentAllowedCallData( Address const& _origin, Address const& _deployer ) { + return fromHex( "d0f557f4000000000000000000000000" + _origin.hex() + + "000000000000000000000000" + _deployer.hex() ); } bytes getMultitransactionCallData() { diff --git a/libethcore/Common.h b/libethcore/Common.h index 7b2a47cf4..2fd143b93 100644 --- a/libethcore/Common.h +++ b/libethcore/Common.h @@ -62,7 +62,7 @@ extern const Address c_configControllerContractAddress; bytes isAddressWhitelistedCallData( Address const& _deployer ); /// Formatting call data for deployment control contract, considering tx origin -bytes isAddressWhitelistedCallData( Address const& _deployer, Address const& _origin ); +bytes isDeploymentAllowedCallData( Address const& _origin, Address const& _deployer ); /// Formatting call data for multitransaction contract bytes getMultitransactionCallData(); From d678d09834ce4fbff02a32c230b0be3dd372227a Mon Sep 17 00:00:00 2001 From: Oleh Date: Mon, 13 May 2024 18:30:27 +0100 Subject: [PATCH 140/154] IS 864 fix typo after merge --- libethereum/SchainPatch.h | 1 - 1 file changed, 1 deletion(-) diff --git a/libethereum/SchainPatch.h b/libethereum/SchainPatch.h index 9352138d8..e0ecc7639 100644 --- a/libethereum/SchainPatch.h +++ b/libethereum/SchainPatch.h @@ -139,6 +139,5 @@ DEFINE_SIMPLE_PATCH( EIP1559TransactionsPatch ); * Enable bls signatures verification for sync node */ DEFINE_AMNESIC_PATCH( VerifyBlsSyncPatch ); -======= #endif // SCHAINPATCH_H From 0c1e7ba6d81d13cd6ad8e58a56b1760d5108886f Mon Sep 17 00:00:00 2001 From: DmytroNazarenko Date: Mon, 13 May 2024 17:45:30 +0000 Subject: [PATCH 141/154] #1876 Change call signature --- libethcore/Common.cpp | 12 ++++++++++++ libethereum/Executive.cpp | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/libethcore/Common.cpp b/libethcore/Common.cpp index bafe6df78..431d67763 100644 --- a/libethcore/Common.cpp +++ b/libethcore/Common.cpp @@ -109,10 +109,22 @@ std::string formatBalance( bigint const& _b ) { } bytes isAddressWhitelistedCallData( Address const& _deployer ) { + // Forming calldata for isAddressWhitelisted call on ConfigController smart contract: + // 13f44d1 - selector of isAddressWhitelisted function + // 000000000000000000000000 - 12-byte offset for sender address + // _deployer - 20-byte sender address + return fromHex( "13f44d10000000000000000000000000" + _deployer.hex() ); } bytes isDeploymentAllowedCallData( Address const& _origin, Address const& _deployer ) { + // Forming calldata for isDeploymentAllowed call on ConfigController smart contract: + // d0f557f4 - selector of isDeploymentAllowed function + // 000000000000000000000000 - 12-byte offset for origin address + // _origin - 20-byte origin address + // 000000000000000000000000 - 12-byte offset for sender address + // _deployer - 20-byte sender address + return fromHex( "d0f557f4000000000000000000000000" + _origin.hex() + "000000000000000000000000" + _deployer.hex() ); } diff --git a/libethereum/Executive.cpp b/libethereum/Executive.cpp index 6dbe96472..f1b46c440 100644 --- a/libethereum/Executive.cpp +++ b/libethereum/Executive.cpp @@ -472,7 +472,7 @@ bool Executive::go( OnOpFunc const& _onOp ) { bytes in; if ( FlexibleDeploymentPatch::isEnabledWhen( m_envInfo.committedBlockTimestamp() ) ) { - in = isAddressWhitelistedCallData( m_ext->caller, m_ext->origin ); + in = isDeploymentAllowedCallData( m_ext->origin, m_ext->caller ); } else { in = isAddressWhitelistedCallData( m_ext->caller ); } From af986c11686ff170f6f1c683e745e288acafca0d Mon Sep 17 00:00:00 2001 From: Stan Kladko <13399135+kladkogex@users.noreply.github.com> Date: Mon, 13 May 2024 19:47:46 +0100 Subject: [PATCH 142/154] 806 consensus improvements --- libconsensus | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libconsensus b/libconsensus index 44cb1b0d8..764b63493 160000 --- a/libconsensus +++ b/libconsensus @@ -1 +1 @@ -Subproject commit 44cb1b0d82b004426fc8831ab6cc1f229e2d7636 +Subproject commit 764b634934032fdac49e101a34e59c407a9e159d From bf916a5e44152c6fd8d30c8a47842b21f9be4dcd Mon Sep 17 00:00:00 2001 From: DmytroNazarenko Date: Mon, 13 May 2024 18:52:34 +0000 Subject: [PATCH 143/154] #1876 Update unit test --- libethcore/Common.cpp | 4 ++-- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 28 ++++------------------- 2 files changed, 6 insertions(+), 26 deletions(-) diff --git a/libethcore/Common.cpp b/libethcore/Common.cpp index 431d67763..678846e46 100644 --- a/libethcore/Common.cpp +++ b/libethcore/Common.cpp @@ -109,7 +109,7 @@ std::string formatBalance( bigint const& _b ) { } bytes isAddressWhitelistedCallData( Address const& _deployer ) { - // Forming calldata for isAddressWhitelisted call on ConfigController smart contract: + // Generating calldata for isAddressWhitelisted call to ConfigController smart contract: // 13f44d1 - selector of isAddressWhitelisted function // 000000000000000000000000 - 12-byte offset for sender address // _deployer - 20-byte sender address @@ -118,7 +118,7 @@ bytes isAddressWhitelistedCallData( Address const& _deployer ) { } bytes isDeploymentAllowedCallData( Address const& _origin, Address const& _deployer ) { - // Forming calldata for isDeploymentAllowed call on ConfigController smart contract: + // Generating calldata for isDeploymentAllowed call to ConfigController smart contract: // d0f557f4 - selector of isDeploymentAllowed function // 000000000000000000000000 - 12-byte offset for origin address // _origin - 20-byte origin address diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index 68d733f59..e19de7a3d 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -2904,10 +2904,10 @@ BOOST_AUTO_TEST_CASE( deployment_control_v2 ) { // bool public freeContractDeployment = false; // function isAddressWhitelisted(address addr) external view returns (bool) { - // return freeContractDeployment; + // return false; // } - // function isAddressWhitelisted(address sender, address origin) + // function isDeploymentAllowed(address origin, address sender) // external view returns (bool) { // return freeContractDeployment; // } @@ -2918,33 +2918,13 @@ BOOST_AUTO_TEST_CASE( deployment_control_v2 ) { // } string configControllerV2 = - "0x608060405234801561001057600080fd5b506004361061004c576000" - "3560e01c806313f44d1014610051578063a2306c4f14610081578063b3" - "1fd4e61461009f578063f7e2a91b146100cf575b600080fd5b61006b60" - "04803603810190610066919061019a565b6100d9565b60405161007891" - "906101e2565b60405180910390f35b6100896100f1565b604051610096" - "91906101e2565b60405180910390f35b6100b960048036038101906100" - "b491906101fd565b610102565b6040516100c691906101e2565b604051" - "80910390f35b6100d761011b565b005b60008060009054906101000a90" - "0460ff169050919050565b60008054906101000a900460ff1681565b60" - "008060009054906101000a900460ff16905092915050565b6001600080" - "6101000a81548160ff021916908315150217905550565b600080fd5b60" - "0073ffffffffffffffffffffffffffffffffffffffff82169050919050" - "565b60006101678261013c565b9050919050565b6101778161015c565b" - "811461018257600080fd5b50565b6000813590506101948161016e565b" - "92915050565b6000602082840312156101b0576101af610137565b5b60" - "006101be84828501610185565b91505092915050565b60008115159050" - "919050565b6101dc816101c7565b82525050565b600060208201905061" - "01f760008301846101d3565b92915050565b6000806040838503121561" - "021457610213610137565b5b600061022285828601610185565b925050" - "602061023385828601610185565b915050925092905056fea264697066" - "73582212200d0a9423308153222b80b5b50861993fb06e77a92aba37af" - "6c7fc23105a7138264736f6c634300080b0033"; + "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806313f44d1014610051578063a2306c4f14610081578063d0f557f41461009f578063f7e2a91b146100cf575b600080fd5b61006b60048036038101906100669190610189565b6100d9565b60405161007891906101d1565b60405180910390f35b6100896100e0565b60405161009691906101d1565b60405180910390f35b6100b960048036038101906100b491906101ec565b6100f1565b6040516100c691906101d1565b60405180910390f35b6100d761010a565b005b6000919050565b60008054906101000a900460ff1681565b60008060009054906101000a900460ff16905092915050565b60016000806101000a81548160ff021916908315150217905550565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006101568261012b565b9050919050565b6101668161014b565b811461017157600080fd5b50565b6000813590506101838161015d565b92915050565b60006020828403121561019f5761019e610126565b5b60006101ad84828501610174565b91505092915050565b60008115159050919050565b6101cb816101b6565b82525050565b60006020820190506101e660008301846101c2565b92915050565b6000806040838503121561020357610202610126565b5b600061021185828601610174565b925050602061022285828601610174565b915050925092905056fea2646970667358221220b5f971b16f7bbba22272b2207e02f10abf1682c17fe636c7bf6406c5cae5716064736f6c63430008090033"; std::string _config = c_genesisGeneration2ConfigString; Json::Value ret; Json::Reader().parse( _config, ret ); ret["accounts"]["0xD2002000000000000000000000000000000000d2"]["code"] = configControllerV2; + ret["skaleConfig"]["sChain"]["flexibleDeploymentPatchTimestamp"] = 1; Json::FastWriter fastWriter; std::string config = fastWriter.write( ret ); From 994c436b9742ffcbc260899d861bff88afe23661 Mon Sep 17 00:00:00 2001 From: DmytroNazarenko Date: Mon, 13 May 2024 18:54:19 +0000 Subject: [PATCH 144/154] #1876 Update unit test --- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index e19de7a3d..22ab39c8f 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -2918,7 +2918,27 @@ BOOST_AUTO_TEST_CASE( deployment_control_v2 ) { // } string configControllerV2 = - "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806313f44d1014610051578063a2306c4f14610081578063d0f557f41461009f578063f7e2a91b146100cf575b600080fd5b61006b60048036038101906100669190610189565b6100d9565b60405161007891906101d1565b60405180910390f35b6100896100e0565b60405161009691906101d1565b60405180910390f35b6100b960048036038101906100b491906101ec565b6100f1565b6040516100c691906101d1565b60405180910390f35b6100d761010a565b005b6000919050565b60008054906101000a900460ff1681565b60008060009054906101000a900460ff16905092915050565b60016000806101000a81548160ff021916908315150217905550565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006101568261012b565b9050919050565b6101668161014b565b811461017157600080fd5b50565b6000813590506101838161015d565b92915050565b60006020828403121561019f5761019e610126565b5b60006101ad84828501610174565b91505092915050565b60008115159050919050565b6101cb816101b6565b82525050565b60006020820190506101e660008301846101c2565b92915050565b6000806040838503121561020357610202610126565b5b600061021185828601610174565b925050602061022285828601610174565b915050925092905056fea2646970667358221220b5f971b16f7bbba22272b2207e02f10abf1682c17fe636c7bf6406c5cae5716064736f6c63430008090033"; + "0x608060405234801561001057600080fd5b506004361061004c576000" + "3560e01c806313f44d1014610051578063a2306c4f14610081578063d0" + "f557f41461009f578063f7e2a91b146100cf575b600080fd5b61006b60" + "048036038101906100669190610189565b6100d9565b60405161007891" + "906101d1565b60405180910390f35b6100896100e0565b604051610096" + "91906101d1565b60405180910390f35b6100b960048036038101906100" + "b491906101ec565b6100f1565b6040516100c691906101d1565b604051" + "80910390f35b6100d761010a565b005b6000919050565b600080549061" + "01000a900460ff1681565b60008060009054906101000a900460ff1690" + "5092915050565b60016000806101000a81548160ff0219169083151502" + "17905550565b600080fd5b600073ffffffffffffffffffffffffffffff" + "ffffffffff82169050919050565b60006101568261012b565b90509190" + "50565b6101668161014b565b811461017157600080fd5b50565b600081" + "3590506101838161015d565b92915050565b6000602082840312156101" + "9f5761019e610126565b5b60006101ad84828501610174565b91505092" + "915050565b60008115159050919050565b6101cb816101b6565b825250" + "50565b60006020820190506101e660008301846101c2565b9291505056" + "5b6000806040838503121561020357610202610126565b5b6000610211" + "85828601610174565b925050602061022285828601610174565b915050" + "925092905056fea2646970667358221220b5f971b16f7bbba22272b220" + "7e02f10abf1682c17fe636c7bf6406c5cae5716064736f6c63430008090033"; std::string _config = c_genesisGeneration2ConfigString; Json::Value ret; From 42373443b6f94fbca321e3af4b0daf0276b5dc05 Mon Sep 17 00:00:00 2001 From: DmytroNazarenko Date: Mon, 13 May 2024 18:58:55 +0000 Subject: [PATCH 145/154] #1876 Update unit test --- test/unittests/libweb3jsonrpc/jsonrpc.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index 22ab39c8f..93c790ce8 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -2898,20 +2898,19 @@ BOOST_AUTO_TEST_CASE( deploy_controller_generation2 ) { BOOST_AUTO_TEST_CASE( deployment_control_v2 ) { + // Inserting ConfigController mockup into config and enabling flexibleDeploymentPatch. + // ConfigController mockup contract: + // pragma solidity ^0.8.9; - // contract ConfigController { // bool public freeContractDeployment = false; - // function isAddressWhitelisted(address addr) external view returns (bool) { // return false; // } - // function isDeploymentAllowed(address origin, address sender) // external view returns (bool) { // return freeContractDeployment; // } - // function setFreeContractDeployment() external { // freeContractDeployment = true; // } @@ -2967,6 +2966,7 @@ BOOST_AUTO_TEST_CASE( deployment_control_v2 ) { "8fb480406fc2728a960029"; + // Trying to deploy contract without permission Json::Value deployContractWithoutRoleTx; deployContractWithoutRoleTx["from"] = senderAddress.hex(); deployContractWithoutRoleTx["code"] = compiled; @@ -2983,7 +2983,7 @@ BOOST_AUTO_TEST_CASE( deployment_control_v2 ) { fixture.rpcClient->eth_getCode( receipt["contractAddress"].asString(), "latest" ); BOOST_REQUIRE( code.asString() == "0x" ); - // Allow deploy by calling setFreeContractDeployment() + // Allow to deploy by calling setFreeContractDeployment() Json::Value grantDeployerRoleTx; grantDeployerRoleTx["data"] = "0xf7e2a91b"; grantDeployerRoleTx["from"] = senderAddress.hex(); @@ -2994,6 +2994,7 @@ BOOST_AUTO_TEST_CASE( deployment_control_v2 ) { BOOST_REQUIRE( !txHash.empty() ); dev::eth::mineTransaction( *( fixture.client ), 1 ); + // Deploying with permission Json::Value deployContractTx; deployContractTx["from"] = senderAddress.hex(); deployContractTx["code"] = compiled; From 03900a6b6972f732e86d470ab231f8ab1a3510e5 Mon Sep 17 00:00:00 2001 From: DmytroNazarenko Date: Mon, 13 May 2024 20:02:40 +0000 Subject: [PATCH 146/154] #1876 Add comments --- libethereum/Executive.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/libethereum/Executive.cpp b/libethereum/Executive.cpp index f1b46c440..242245ba7 100644 --- a/libethereum/Executive.cpp +++ b/libethereum/Executive.cpp @@ -469,17 +469,18 @@ bool Executive::go( OnOpFunc const& _onOp ) { // Create VM instance. Force Interpreter if tracing requested. auto vm = VMFactory::create(); if ( m_isCreation ) { - bytes in; + // Checking whether deployment is allowed via ConfigController contract + bytes calldata; if ( FlexibleDeploymentPatch::isEnabledWhen( m_envInfo.committedBlockTimestamp() ) ) { - in = isDeploymentAllowedCallData( m_ext->origin, m_ext->caller ); + calldata = isDeploymentAllowedCallData( m_ext->origin, m_ext->caller ); } else { - in = isAddressWhitelistedCallData( m_ext->caller ); + calldata = isAddressWhitelistedCallData( m_ext->caller ); } unique_ptr< CallParameters > deploymentCallParams( new CallParameters( SystemAddress, c_configControllerContractAddress, c_configControllerContractAddress, 0, 0, m_gas, - bytesConstRef( in.data(), in.size() ), {} ) ); + bytesConstRef( calldata.data(), calldata.size() ), {} ) ); auto deploymentCallResult = m_ext->call( *deploymentCallParams ); auto deploymentCallOutput = dev::toHex( deploymentCallResult.output ); if ( !deploymentCallOutput.empty() && u256( deploymentCallOutput ) == 0 ) { From aa957df51151f43775aa7a2bfa088e98e777c47b Mon Sep 17 00:00:00 2001 From: DmytroNazarenko Date: Tue, 14 May 2024 11:26:04 +0000 Subject: [PATCH 147/154] #1876 Update comments --- libethcore/Common.cpp | 4 ++-- libethcore/Common.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libethcore/Common.cpp b/libethcore/Common.cpp index 678846e46..cb889a51a 100644 --- a/libethcore/Common.cpp +++ b/libethcore/Common.cpp @@ -109,7 +109,7 @@ std::string formatBalance( bigint const& _b ) { } bytes isAddressWhitelistedCallData( Address const& _deployer ) { - // Generating calldata for isAddressWhitelisted call to ConfigController smart contract: + // Generating calldata for isAddressWhitelisted contract call: // 13f44d1 - selector of isAddressWhitelisted function // 000000000000000000000000 - 12-byte offset for sender address // _deployer - 20-byte sender address @@ -118,7 +118,7 @@ bytes isAddressWhitelistedCallData( Address const& _deployer ) { } bytes isDeploymentAllowedCallData( Address const& _origin, Address const& _deployer ) { - // Generating calldata for isDeploymentAllowed call to ConfigController smart contract: + // Generating calldata for isDeploymentAllowed contract call: // d0f557f4 - selector of isDeploymentAllowed function // 000000000000000000000000 - 12-byte offset for origin address // _origin - 20-byte origin address diff --git a/libethcore/Common.h b/libethcore/Common.h index 2fd143b93..b48b5ffd4 100644 --- a/libethcore/Common.h +++ b/libethcore/Common.h @@ -58,10 +58,10 @@ extern const bytes c_blockhashContractCode; /// Address of the special contract for deployment control extern const Address c_configControllerContractAddress; -/// Formatting call data for deployment control contract +/// Generating call data for deployment control contract bytes isAddressWhitelistedCallData( Address const& _deployer ); -/// Formatting call data for deployment control contract, considering tx origin +/// Generating calldata for deployment control contract, considering tx origin bytes isDeploymentAllowedCallData( Address const& _origin, Address const& _deployer ); /// Formatting call data for multitransaction contract From 538f60bfccf14332fa9b500d33720a4256f3b0cd Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Wed, 15 May 2024 11:31:22 +0100 Subject: [PATCH 148/154] IS 864 add new config variable --- libethcore/ChainOperationParams.h | 5 ++- libethereum/ChainParams.cpp | 15 ++++---- libethereum/SkaleHost.cpp | 34 +++++++++---------- libethereum/ValidationSchemes.cpp | 4 +-- test/unittests/libethereum/ClientTest.cpp | 6 ++-- .../libethereum/PrecompiledConfig.json | 2 +- .../unittests/libethereum/PrecompiledTest.cpp | 2 +- test/unittests/libethereum/SkaleHost.cpp | 1 + test/unittests/libweb3jsonrpc/jsonrpc.cpp | 2 +- 9 files changed, 36 insertions(+), 35 deletions(-) diff --git a/libethcore/ChainOperationParams.h b/libethcore/ChainOperationParams.h index 9123ad3cf..1383b84b8 100644 --- a/libethcore/ChainOperationParams.h +++ b/libethcore/ChainOperationParams.h @@ -90,6 +90,7 @@ struct NodeInfo { bool syncNode; bool archiveMode; bool syncFromCatchup; + bool testSignatures; NodeInfo( std::string _name = "TestNode", u256 _id = 1, std::string _ip = "127.0.0.11", uint16_t _port = 11111, std::string _ip6 = "::1", uint16_t _port6 = 11111, @@ -107,7 +108,8 @@ struct NodeInfo { "11559732032986387107991004021392285783925812861821192530917403151452391805634", "8495653923123431417604973247489272438418190587263600148770280649306958101930", "4082367875863433681332203403145435568316851327593401208105741076214120093531" }, - bool _syncNode = false, bool _archiveMode = false, bool _syncFromCatchup = false ) { + bool _syncNode = false, bool _archiveMode = false, bool _syncFromCatchup = false, + bool _testSignatures = true ) { name = _name; id = _id; ip = _ip; @@ -122,6 +124,7 @@ struct NodeInfo { syncNode = _syncNode; archiveMode = _archiveMode; syncFromCatchup = _syncFromCatchup; + testSignatures = _testSignatures; } }; diff --git a/libethereum/ChainParams.cpp b/libethereum/ChainParams.cpp index ba72d351b..4b2be0789 100644 --- a/libethereum/ChainParams.cpp +++ b/libethereum/ChainParams.cpp @@ -217,16 +217,18 @@ void ChainParams::processSkaleConfigItems( ChainParams& cp, json_spirit::mObject if ( cp.rotateAfterBlock_ < 0 ) cp.rotateAfterBlock_ = 0; - string ecdsaKeyName; + bool testSignatures = false; try { - ecdsaKeyName = infoObj.at( "ecdsaKeyName" ).get_str(); + testSignatures = infoObj.at( "testSignatures" ).get_bool(); } catch ( ... ) { } + string ecdsaKeyName; array< string, 4 > BLSPublicKeys; array< string, 4 > commonBLSPublicKeys; + if ( !testSignatures ) { + ecdsaKeyName = infoObj.at( "ecdsaKeyName" ).get_str(); - try { js::mObject ima = infoObj.at( "wallets" ).get_obj().at( "ima" ).get_obj(); commonBLSPublicKeys[0] = ima["commonBLSPublicKey0"].get_str(); @@ -244,16 +246,11 @@ void ChainParams::processSkaleConfigItems( ChainParams& cp, json_spirit::mObject BLSPublicKeys[2] = ima["BLSPublicKey2"].get_str(); BLSPublicKeys[3] = ima["BLSPublicKey3"].get_str(); } - - } catch ( ... ) { - // all or nothing - if ( !syncNode && !keyShareName.empty() ) - throw; } cp.nodeInfo = { nodeName, nodeID, ip, static_cast< uint16_t >( port ), ip6, static_cast< uint16_t >( port6 ), sgxServerUrl, ecdsaKeyName, keyShareName, BLSPublicKeys, - commonBLSPublicKeys, syncNode, archiveMode, syncFromCatchup }; + commonBLSPublicKeys, syncNode, archiveMode, syncFromCatchup, testSignatures }; auto sChainObj = skaleObj.at( "sChain" ).get_obj(); SChain s{}; diff --git a/libethereum/SkaleHost.cpp b/libethereum/SkaleHost.cpp index 87b32856b..bb91505e1 100644 --- a/libethereum/SkaleHost.cpp +++ b/libethereum/SkaleHost.cpp @@ -143,13 +143,15 @@ void DefaultConsensusFactory::fillSgxInfo( ConsensusEngine& consensus ) const tr } void DefaultConsensusFactory::fillPublicKeyInfo( ConsensusEngine& consensus ) const try { + if ( m_client.chainParams().nodeInfo.testSignatures ) + // no keys in tests + return; + const std::string sgxServerUrl = m_client.chainParams().nodeInfo.sgxServerUrl; std::shared_ptr< std::vector< std::string > > ecdsaPublicKeys = std::make_shared< std::vector< std::string > >(); for ( const auto& node : m_client.chainParams().sChain.nodes ) { - if ( node.publicKey.size() == 0 ) - return; // just don't do anything ecdsaPublicKeys->push_back( node.publicKey.substr( 2 ) ); } @@ -157,15 +159,15 @@ void DefaultConsensusFactory::fillPublicKeyInfo( ConsensusEngine& consensus ) co for ( const auto& node : m_client.chainParams().sChain.nodes ) { std::vector< std::string > public_key_share( 4 ); if ( node.id != this->m_client.chainParams().nodeInfo.id ) { - public_key_share[0] = node.blsPublicKey[0]; - public_key_share[1] = node.blsPublicKey[1]; - public_key_share[2] = node.blsPublicKey[2]; - public_key_share[3] = node.blsPublicKey[3]; + public_key_share[0] = node.blsPublicKey.at( 0 ); + public_key_share[1] = node.blsPublicKey.at( 1 ); + public_key_share[2] = node.blsPublicKey.at( 2 ); + public_key_share[3] = node.blsPublicKey.at( 3 ); } else { - public_key_share[0] = m_client.chainParams().nodeInfo.BLSPublicKeys[0]; - public_key_share[1] = m_client.chainParams().nodeInfo.BLSPublicKeys[1]; - public_key_share[2] = m_client.chainParams().nodeInfo.BLSPublicKeys[2]; - public_key_share[3] = m_client.chainParams().nodeInfo.BLSPublicKeys[3]; + public_key_share[0] = m_client.chainParams().nodeInfo.BLSPublicKeys.at( 0 ); + public_key_share[1] = m_client.chainParams().nodeInfo.BLSPublicKeys.at( 1 ); + public_key_share[2] = m_client.chainParams().nodeInfo.BLSPublicKeys.at( 2 ); + public_key_share[3] = m_client.chainParams().nodeInfo.BLSPublicKeys.at( 3 ); } blsPublicKeys.push_back( @@ -179,11 +181,8 @@ void DefaultConsensusFactory::fillPublicKeyInfo( ConsensusEngine& consensus ) co size_t n = m_client.chainParams().sChain.nodes.size(); size_t t = ( 2 * n + 1 ) / 3; - if ( ecdsaPublicKeys->size() && ecdsaPublicKeys->at( 0 ).size() && - ( ( blsPublicKeys.size() && blsPublicKeys[0]->at( 0 ).size() ) || - m_client.chainParams().nodeInfo.syncNode ) ) - consensus.setPublicKeyInfo( - ecdsaPublicKeys, blsPublicKeysPtr, t, n, m_client.chainParams().nodeInfo.syncNode ); + consensus.setPublicKeyInfo( + ecdsaPublicKeys, blsPublicKeysPtr, t, n, m_client.chainParams().nodeInfo.syncNode ); } catch ( ... ) { std::throw_with_nested( std::runtime_error( "Error filling public keys info (nodeGroups)" ) ); } @@ -195,8 +194,9 @@ void DefaultConsensusFactory::fillRotationHistory( ConsensusEngine& consensus ) std::map< uint64_t, std::vector< uint64_t > > historicNodeGroups; auto u256toUint64 = []( const dev::u256& u ) { return std::stoull( u.str() ); }; for ( const auto& nodeGroup : m_client.chainParams().sChain.nodeGroups ) { - std::vector< string > commonBLSPublicKey = { nodeGroup.blsPublicKey[0], - nodeGroup.blsPublicKey[1], nodeGroup.blsPublicKey[2], nodeGroup.blsPublicKey[3] }; + std::vector< string > commonBLSPublicKey = { nodeGroup.blsPublicKey.at( 0 ), + nodeGroup.blsPublicKey.at( 1 ), nodeGroup.blsPublicKey.at( 2 ), + nodeGroup.blsPublicKey.at( 3 ) }; previousBLSKeys[nodeGroup.finishTs] = commonBLSPublicKey; std::vector< uint64_t > nodes; // add ecdsa keys info and historic groups info diff --git a/libethereum/ValidationSchemes.cpp b/libethereum/ValidationSchemes.cpp index 4040e774a..e6b493e7e 100644 --- a/libethereum/ValidationSchemes.cpp +++ b/libethereum/ValidationSchemes.cpp @@ -164,7 +164,7 @@ void validateConfigJson( js::mObject const& _obj ) { { "snapshotIntervalSec", { { js::int_type }, JsonFieldPresence::Optional } }, { "rotateAfterBlock", { { js::int_type }, JsonFieldPresence::Optional } }, { "wallets", { { js::obj_type }, JsonFieldPresence::Optional } }, - { "ecdsaKeyName", { { js::str_type }, JsonFieldPresence::Required } }, + { "ecdsaKeyName", { { js::str_type }, JsonFieldPresence::Optional } }, { "verifyImaMessagesViaLogsSearch", { { js::bool_type }, JsonFieldPresence::Optional } }, { "verifyImaMessagesViaContractCall", @@ -222,6 +222,7 @@ void validateConfigJson( js::mObject const& _obj ) { { "syncNode", { { js::bool_type }, JsonFieldPresence::Optional } }, { "archiveMode", { { js::bool_type }, JsonFieldPresence::Optional } }, { "syncFromCatchup", { { js::bool_type }, JsonFieldPresence::Optional } }, + { "testSignatures", { { js::bool_type }, JsonFieldPresence::Optional } }, { "wallets", { { js::obj_type }, JsonFieldPresence::Optional } } } ); std::string keyShareName = ""; @@ -268,7 +269,6 @@ void validateConfigJson( js::mObject const& _obj ) { { "maxSkaledLeveldbStorageBytes", { { js::int_type }, JsonFieldPresence::Optional } }, { "freeContractDeployment", { { js::bool_type }, JsonFieldPresence::Optional } }, { "multiTransactionMode", { { js::bool_type }, JsonFieldPresence::Optional } }, - { "nodeGroups", { { js::obj_type }, JsonFieldPresence::Optional } }, { "nodeGroups", { { js::obj_type }, JsonFieldPresence::Optional } } }, []( const string& _key ) { // function fow allowing fields diff --git a/test/unittests/libethereum/ClientTest.cpp b/test/unittests/libethereum/ClientTest.cpp index a3f8850e0..ed9bdb878 100644 --- a/test/unittests/libethereum/ClientTest.cpp +++ b/test/unittests/libethereum/ClientTest.cpp @@ -411,7 +411,7 @@ static std::string const c_genesisInfoSkaleTest = std::string() + "basePort": )E"+std::to_string( rand_port ) + R"E(, "logLevel": "trace", "logLevelProposal": "trace", - "ecdsaKeyName": "NEK:fa112" + "testSignatures": true }, "sChain": { "schainName": "TestChain", @@ -887,7 +887,7 @@ static std::string const c_genesisInfoSkaleIMABLSPublicKeyTest = std::string() + "basePort": )E"+std::to_string( rand_port ) + R"E(, "logLevel": "trace", "logLevelProposal": "trace", - "ecdsaKeyName": "NEK:fa112" + "testSignatures": true }, "sChain": { "schainName": "TestChain", @@ -1002,7 +1002,7 @@ static std::string const c_skaleConfigString = R"E( "nodeID": 1112, "bindIP": "127.0.0.1", "basePort": )E"+std::to_string( rand_port ) + R"E(, - "ecdsaKeyName": "NEK:fa112" + "testSignatures": true }, "sChain": { "schainName": "TestChain", diff --git a/test/unittests/libethereum/PrecompiledConfig.json b/test/unittests/libethereum/PrecompiledConfig.json index b7b4901f0..ec4673de2 100644 --- a/test/unittests/libethereum/PrecompiledConfig.json +++ b/test/unittests/libethereum/PrecompiledConfig.json @@ -38,7 +38,7 @@ "basePort": 1234, "logLevel": "trace", "logLevelProposal": "trace", - "ecdsaKeyName": "NEK:fa112", + "testSignatures": true, "wallets": { "ima": { "n": 1 diff --git a/test/unittests/libethereum/PrecompiledTest.cpp b/test/unittests/libethereum/PrecompiledTest.cpp index bec328e70..7be67c511 100644 --- a/test/unittests/libethereum/PrecompiledTest.cpp +++ b/test/unittests/libethereum/PrecompiledTest.cpp @@ -1619,7 +1619,7 @@ static std::string const genesisInfoSkaleConfigTest = std::string() + "basePort": 1234, "logLevel": "trace", "logLevelProposal": "trace", - "ecdsaKeyName": "NEK:fa112", + "testSignatures": true, "wallets": { "ima": { "n": 1 diff --git a/test/unittests/libethereum/SkaleHost.cpp b/test/unittests/libethereum/SkaleHost.cpp index 7f2be5290..f4b93ce8d 100644 --- a/test/unittests/libethereum/SkaleHost.cpp +++ b/test/unittests/libethereum/SkaleHost.cpp @@ -130,6 +130,7 @@ struct SkaleHostFixture : public TestOutputHelperFixture { chainParams.extraData = h256::random().asBytes(); chainParams.sChain.nodeGroups = { { {}, uint64_t(-1), {"0", "0", "1", "0"} } }; chainParams.nodeInfo.port = chainParams.nodeInfo.port6 = rand_port; + chainParams.nodeInfo.testSignatures = true; chainParams.sChain.nodes[0].port = chainParams.sChain.nodes[0].port6 = rand_port; // not 0-timestamp genesis - to test patch diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index d7a33fd49..b89e62726 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -101,7 +101,7 @@ static std::string const c_genesisConfigString = "basePort": )"+std::to_string( rand_port ) + R"(, "logLevel": "trace", "logLevelProposal": "trace", - "ecdsaKeyName": "NEK:fa112" + "testSignatures": true }, "sChain": { "schainName": "TestChain", From a88f7dad54980b54ef28f324e124e3a2ea587023 Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Wed, 15 May 2024 16:01:23 +0100 Subject: [PATCH 149/154] IS 864 functional tests --- .github/workflows/functional-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/functional-tests.yml b/.github/workflows/functional-tests.yml index 02ad6deb7..df34f37da 100644 --- a/.github/workflows/functional-tests.yml +++ b/.github/workflows/functional-tests.yml @@ -24,7 +24,7 @@ with: token: ${{ secrets.PERSONAL_ACCESS_TOKEN }} repository: skalenetwork/skale-ci-integration_tests - ref: v3.18.0 + ref: temp-branch-3.19.0 submodules: recursive - name: Set up Node uses: actions/setup-node@v3.4.0 From cef9482be54bb65a28e2b3816dbd62f5c4a6aacd Mon Sep 17 00:00:00 2001 From: Stan Kladko <13399135+kladkogex@users.noreply.github.com> Date: Thu, 16 May 2024 12:14:32 +0100 Subject: [PATCH 150/154] 806 update consensus --- libconsensus | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libconsensus b/libconsensus index 764b63493..320b63c95 160000 --- a/libconsensus +++ b/libconsensus @@ -1 +1 @@ -Subproject commit 764b634934032fdac49e101a34e59c407a9e159d +Subproject commit 320b63c958d4a89737e6cbc5e3c0dc0ecf635059 From b19165b9f9f7b944fe2ad5d1cf3dc3bf14c39864 Mon Sep 17 00:00:00 2001 From: Stan Kladko <13399135+kladkogex@users.noreply.github.com> Date: Thu, 16 May 2024 12:39:56 +0100 Subject: [PATCH 151/154] Updated consensus --- libconsensus | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libconsensus b/libconsensus index 320b63c95..b1916ed05 160000 --- a/libconsensus +++ b/libconsensus @@ -1 +1 @@ -Subproject commit 320b63c958d4a89737e6cbc5e3c0dc0ecf635059 +Subproject commit b1916ed05c3b77f5925662fa591b9a054290d0fd From 543907dbed40f3b3fe0961f9b483b656828101fb Mon Sep 17 00:00:00 2001 From: Stan Kladko <13399135+kladkogex@users.noreply.github.com> Date: Thu, 16 May 2024 14:56:40 +0100 Subject: [PATCH 152/154] 806b fix build --- libethereum/ClientBase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libethereum/ClientBase.cpp b/libethereum/ClientBase.cpp index a508dbc9a..768c37a7d 100644 --- a/libethereum/ClientBase.cpp +++ b/libethereum/ClientBase.cpp @@ -219,7 +219,7 @@ LocalisedLogEntries ClientBase::logs( LogFilter const& _f ) const { unsigned begin = min( bc().number() + 1, ( unsigned ) _f.latest() ); unsigned end = min( bc().number(), min( begin, ( unsigned ) _f.earliest() ) ); - if ( begin >= end && begin - end > bc().chainParams().getLogsBlocksLimit ) + if ( begin >= end && begin - end > (uint64_t) bc().chainParams().getLogsBlocksLimit ) BOOST_THROW_EXCEPTION( TooBigResponse() ); // Handle pending transactions differently as they're not on the block chain. From 360f8d8941ae3ac33f78d7ee2192babaf1406f59 Mon Sep 17 00:00:00 2001 From: Oleh Nikolaiev Date: Thu, 16 May 2024 14:57:22 +0100 Subject: [PATCH 153/154] IS 864 update skale-ci-integrations ref --- .github/workflows/functional-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/functional-tests.yml b/.github/workflows/functional-tests.yml index df34f37da..f7356fc36 100644 --- a/.github/workflows/functional-tests.yml +++ b/.github/workflows/functional-tests.yml @@ -24,7 +24,7 @@ with: token: ${{ secrets.PERSONAL_ACCESS_TOKEN }} repository: skalenetwork/skale-ci-integration_tests - ref: temp-branch-3.19.0 + ref: master submodules: recursive - name: Set up Node uses: actions/setup-node@v3.4.0 From 2a2d16d5e86d1a7369b88f7b468d887a685c6876 Mon Sep 17 00:00:00 2001 From: Stan Kladko <13399135+kladkogex@users.noreply.github.com> Date: Thu, 16 May 2024 15:01:20 +0100 Subject: [PATCH 154/154] 806 libconsensus --- libethereum/ClientBase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libethereum/ClientBase.cpp b/libethereum/ClientBase.cpp index 768c37a7d..04b4302a8 100644 --- a/libethereum/ClientBase.cpp +++ b/libethereum/ClientBase.cpp @@ -219,7 +219,7 @@ LocalisedLogEntries ClientBase::logs( LogFilter const& _f ) const { unsigned begin = min( bc().number() + 1, ( unsigned ) _f.latest() ); unsigned end = min( bc().number(), min( begin, ( unsigned ) _f.earliest() ) ); - if ( begin >= end && begin - end > (uint64_t) bc().chainParams().getLogsBlocksLimit ) + if ( begin >= end && begin - end > ( uint64_t ) bc().chainParams().getLogsBlocksLimit ) BOOST_THROW_EXCEPTION( TooBigResponse() ); // Handle pending transactions differently as they're not on the block chain.