diff --git a/common.mk b/common.mk index 41ca4d835b..3348ac7afb 100644 --- a/common.mk +++ b/common.mk @@ -46,3 +46,7 @@ endif # ENABLE_NEXT_PROTOCOL_VERSION_UNSAFE_FOR_PRODUCTION if ENABLE_FASTDEV_UNSAFE_FOR_PRODUCTION AM_CPPFLAGS += -DENABLE_FASTDEV_UNSAFE_FOR_PRODUCTION endif # ENABLE_FASTDEV_UNSAFE_FOR_PRODUCTION + +if MS_CLOSE_TIME +AM_CPPFLAGS += -DMS_CLOSE_TIME +endif # MS_CLOSE_TIME diff --git a/configure.ac b/configure.ac index d115f8bfd3..5ec959a38e 100644 --- a/configure.ac +++ b/configure.ac @@ -588,6 +588,11 @@ AS_IF([test "x$enable_fastdev_unsafe_for_production" = "xyes"], [ AM_CONDITIONAL(ENABLE_NEXT_PROTOCOL_VERSION_UNSAFE_FOR_PRODUCTION, [test x$enable_next_protocol_version_unsafe_for_production = xyes]) +# Millisecond-resolution closeTime (new StellarValue arms). Enabled together +# with the next-protocol build until productionized. +AM_CONDITIONAL(MS_CLOSE_TIME, + [test x$enable_next_protocol_version_unsafe_for_production = xyes]) + AC_PATH_PROG(CARGO, cargo) if test x"$CARGO" = x; then AC_MSG_ERROR([cannot find cargo, needed for rust code]) diff --git a/docs/stellar-core_example.cfg b/docs/stellar-core_example.cfg index cef06617fa..a1d63f5559 100644 --- a/docs/stellar-core_example.cfg +++ b/docs/stellar-core_example.cfg @@ -561,7 +561,8 @@ ARTIFICIALLY_GENERATE_LOAD_FOR_TESTING=false # incompatible with those of anyone else. ARTIFICIALLY_ACCELERATE_TIME_FOR_TESTING=false -# ARTIFICIALLY_SET_CLOSE_TIME_FOR_TESTING (in seconds), defaults to no override +# ARTIFICIALLY_SET_CLOSE_TIME_FOR_TESTING (in milliseconds), defaults to no +# override # Overrides the close time to the specified value but does not change checkpoint # frequency - this may cause network instability. # Do not use in production. diff --git a/src/Makefile.am b/src/Makefile.am index 331ce06c95..4ca16bc82f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -113,6 +113,9 @@ BUILT_SOURCES = $(SRC_X_FILES:.x=.h) $(GENERATED_VERSION_SOURCES) $(TEST_FILES) $(SRC_X_FILES:.x=.h): $(XDRC) XDR_FEATURE_FLAGS = +if MS_CLOSE_TIME +XDR_FEATURE_FLAGS += -DMS_CLOSE_TIME +endif # MS_CLOSE_TIME SUFFIXES = .x .h .rs .x.h: diff --git a/src/bucket/test/BucketTestUtils.cpp b/src/bucket/test/BucketTestUtils.cpp index 1e8da564ea..0f94e630ee 100644 --- a/src/bucket/test/BucketTestUtils.cpp +++ b/src/bucket/test/BucketTestUtils.cpp @@ -12,6 +12,7 @@ #include "ledger/LedgerManager.h" #include "ledger/LedgerTxn.h" #include "main/Application.h" +#include "test/TxTests.h" #include "test/test.h" #include "util/ProtocolVersion.h" #include "xdr/Stellar-ledger.h" @@ -86,9 +87,10 @@ closeLedger(Application& app, std::optional skToSignValue, CLOG_INFO(Bucket, "Artificially closing ledger {} with lcl={}, buckets={}", ledgerNum, hexAbbrev(lcl.hash), hexAbbrev(app.getBucketManager().getLiveBucketList().getHash())); - app.getHerder().externalizeValue(TxSetXDRFrame::makeEmpty(lcl), ledgerNum, - lcl.header.scpValue.closeTime, upgrades, - skToSignValue); + app.getHerder().externalizeValue( + TxSetXDRFrame::makeEmpty(lcl), ledgerNum, + txtest::makeConsensusTime(lcl.header.scpValue.closeTime), upgrades, + skToSignValue); while (lm.getLastClosedLedgerNum() < ledgerNum) { app.getClock().crank(true); diff --git a/src/catchup/ApplyCheckpointWork.cpp b/src/catchup/ApplyCheckpointWork.cpp index ff5f8a5ebd..f26c369080 100644 --- a/src/catchup/ApplyCheckpointWork.cpp +++ b/src/catchup/ApplyCheckpointWork.cpp @@ -12,6 +12,7 @@ #include "history/HistoryUtils.h" #include "historywork/Progress.h" #include "ledger/CheckpointRange.h" +#include "ledger/LedgerHeaderUtils.h" #include "ledger/LedgerManager.h" #include "main/Application.h" #include "util/GlobalChecks.h" @@ -277,7 +278,7 @@ ApplyCheckpointWork::getNextLedgerCloseData() // Empty-tx-set values should have the empty-tx-set hash (and vice versa) if ((header.scpValue.txSetHash == Herder::EMPTY_TX_SET_HASH) != - (header.scpValue.ext.v() == STELLAR_VALUE_EMPTY_TX_SET)) + isEmptyTxSetStellarValue(header.scpValue)) { throw std::runtime_error(fmt::format( FMT_STRING("ledger header for {:d} has mismatched empty-tx-set " @@ -285,6 +286,43 @@ ApplyCheckpointWork::getNextLedgerCloseData() header.ledgerSeq, static_cast(header.scpValue.ext.v()))); } + // Check that we use the correct time format in the ledger header. + if (!hasValidCloseTime(header.scpValue)) + { + throw std::runtime_error(fmt::format( + FMT_STRING("ledger header for {:d} has inconsistent close time " + "fields: closeTime {:d}, consensus close time {}"), + header.ledgerSeq, header.scpValue.closeTime, + getConsensusTime(header.scpValue).toString())); + } + + bool const hasMsCloseTime = isMsCloseTimeStellarValue(header.scpValue); + bool const protocolRequiresMsCloseTime = + protocolHasMsCloseTime(lclHeader.header.ledgerVersion); + if (hasMsCloseTime != protocolRequiresMsCloseTime) + { + throw std::runtime_error(fmt::format( + FMT_STRING("ledger header for {:d} has a {} close time " + "(StellarValue type {:d}) but protocol {:d} requires a " + "{} close time"), + header.ledgerSeq, hasMsCloseTime ? "millisecond" : "whole-second", + static_cast(header.scpValue.ext.v()), + lclHeader.header.ledgerVersion, + protocolRequiresMsCloseTime ? "millisecond" : "whole-second")); + } + + // Close times must strictly increase from ledger to ledger + auto const previousCloseTime = getConsensusTime(lclHeader.header.scpValue); + auto const nextCloseTime = getConsensusTime(header.scpValue); + if (nextCloseTime <= previousCloseTime) + { + throw std::runtime_error(fmt::format( + FMT_STRING("ledger header for {:d} has a non-advancing close " + "time {} (previous ledger closed at {})"), + header.ledgerSeq, nextCloseTime.toString(), + previousCloseTime.toString())); + } + // We've verified the ledgerHeader (in the "trusted part of history" // sense) in CATCHUP_VERIFY phase; we now need to check that the // txhash we're about to apply is the one denoted by that ledger diff --git a/src/catchup/CatchupWork.cpp b/src/catchup/CatchupWork.cpp index e577ef2a57..5af496f908 100644 --- a/src/catchup/CatchupWork.cpp +++ b/src/catchup/CatchupWork.cpp @@ -19,6 +19,7 @@ #include "historywork/DownloadVerifyTxResultsWork.h" #include "historywork/GetAndUnzipRemoteFileWork.h" #include "historywork/GetHistoryArchiveStateWork.h" +#include "ledger/LedgerHeaderUtils.h" #include "ledger/LedgerManager.h" #include "main/Application.h" #include "main/PersistentState.h" @@ -69,7 +70,7 @@ setHerderStateTo(FileTransferInfo const& ft, uint32_t ledger, Application& app) app.getHerder().setTrackingSCPState(ledger, entry->header.scpValue, /* isTrackingNetwork */ false); CLOG_INFO(History, "Herder state is set! tracking={}, closeTime={}", ledger, - entry->header.scpValue.closeTime); + getConsensusTime(entry->header.scpValue).toString()); return true; } diff --git a/src/herder/Herder.h b/src/herder/Herder.h index 47092b2aa5..2b1d60f4e1 100644 --- a/src/herder/Herder.h +++ b/src/herder/Herder.h @@ -28,6 +28,7 @@ struct EmptyTxSet }; using TxSetResult = std::variant; class Application; +class ConsensusTime; class XDROutputFileStream; /* @@ -176,7 +177,7 @@ class Herder virtual void externalizeValue(TxSetXDRFrameConstPtr txSet, uint32_t ledgerSeq, - uint64_t closeTime, + ConsensusTime closeTime, xdr::xvector const& upgrades, std::optional skToSignValue = std::nullopt) = 0; @@ -228,7 +229,7 @@ class Herder // helper function to craft an SCPValue virtual StellarValue - makeStellarValue(Hash const& txSetHash, uint64_t closeTime, + makeStellarValue(Hash const& txSetHash, ConsensusTime closeTime, xdr::xvector const& upgrades, SecretKey const& s) = 0; diff --git a/src/herder/HerderImpl.cpp b/src/herder/HerderImpl.cpp index f88f7e5982..5469cf2fe5 100644 --- a/src/herder/HerderImpl.cpp +++ b/src/herder/HerderImpl.cpp @@ -17,6 +17,7 @@ #include "herder/RustQuorumCheckerAdaptor.h" #include "herder/TxSetFrame.h" #include "herder/TxSetUtils.h" +#include "ledger/LedgerHeaderUtils.h" #include "ledger/LedgerManager.h" #include "ledger/LedgerTxnImpl.h" #include "ledger/P23HotArchiveBug.h" @@ -57,7 +58,7 @@ namespace stellar // Roughly ~10 minutes of consensus constexpr uint32 const CLOSE_TIME_DRIFT_LEDGER_WINDOW_SIZE = 120; // 10 seconds of drift threshold -constexpr uint32 const CLOSE_TIME_DRIFT_SECONDS_THRESHOLD = 10; +constexpr std::chrono::seconds const CLOSE_TIME_DRIFT_SECONDS_THRESHOLD{10}; constexpr uint32 const TRANSACTION_QUEUE_TIMEOUT_LEDGERS = 4; constexpr uint32 const TRANSACTION_QUEUE_BAN_LEDGERS = 10; @@ -149,7 +150,7 @@ void HerderImpl::setTrackingSCPState(uint64_t index, StellarValue const& value, bool isTrackingNetwork) { - mTrackingSCP = ConsensusData{index, value.closeTime}; + mTrackingSCP = ConsensusData{index, getConsensusTime(value)}; if (isTrackingNetwork) { setState(Herder::HERDER_TRACKING_NETWORK_STATE); @@ -179,7 +180,7 @@ HerderImpl::trackingConsensusLedgerIndex() const return static_cast(mTrackingSCP.mConsensusIndex); } -TimePoint +ConsensusTime HerderImpl::trackingConsensusCloseTime() const { releaseAssert(getState() != Herder::State::HERDER_BOOTING_STATE); @@ -331,9 +332,9 @@ HerderImpl::processExternalized(uint64 slotIndex, StellarValue const& value, TxSetXDRFrameConstPtr externalizedSet; if (std::holds_alternative(result)) { - auto const& ov = value.ext.proposedValue(); - externalizedSet = TxSetXDRFrame::makeEmpty(ov.previousLedgerHash, - ov.previousLedgerVersion); + externalizedSet = + TxSetXDRFrame::makeEmpty(getProposedPreviousLedgerHash(value), + getProposedPreviousLedgerVersion(value)); } else { @@ -363,9 +364,9 @@ HerderImpl::processExternalized(uint64 slotIndex, StellarValue const& value, // reflect upgrades with the ones included in this SCP round { bool updated; - auto newUpgrades = mUpgrades.removeUpgrades(value.upgrades.begin(), - value.upgrades.end(), - value.closeTime, updated); + auto newUpgrades = mUpgrades.removeUpgrades( + value.upgrades.begin(), value.upgrades.end(), getApplyTime(value), + updated); if (updated) { setUpgrades(newUpgrades); @@ -433,12 +434,13 @@ HerderImpl::writeDebugTxSet(LedgerCloseData const& lcd) static void recordExternalizeAndCheckCloseTimeDrift( uint64 slotIndex, StellarValue const& value, - std::map>>& ctMap) + std::map>>& + ctMap) { auto it = ctMap.find(slotIndex); if (it != ctMap.end()) { - it->second.second = value.closeTime; + it->second.second = getConsensusTime(value); } if (ctMap.size() >= CLOSE_TIME_DRIFT_LEDGER_WINDOW_SIZE) @@ -449,14 +451,21 @@ recordExternalizeAndCheckCloseTimeDrift( auto const& [localCT, externalizedCT] = closeTimePair; if (externalizedCT) { - h.Update(*externalizedCT - localCT); + h.Update( + std::chrono::duration_cast( + externalizedCT->toSystemTime() - localCT.toSystemTime()) + .count()); } } - auto drift = static_cast(h.GetSnapshot().get75thPercentile()); - if (std::abs(drift) > CLOSE_TIME_DRIFT_SECONDS_THRESHOLD) + auto driftMs = + static_cast(h.GetSnapshot().get75thPercentile()); + if (std::abs(driftMs) > + std::chrono::duration_cast( + CLOSE_TIME_DRIFT_SECONDS_THRESHOLD) + .count()) { CLOG_WARNING(Herder, POSSIBLY_BAD_LOCAL_CLOCK); - CLOG_WARNING(Herder, "Close time local drift is: {}", drift); + CLOG_WARNING(Herder, "Close time local drift is: {} ms", driftMs); } ctMap.clear(); @@ -712,28 +721,30 @@ HerderImpl::checkCloseTime(SCPEnvelope const& envelope, bool enforceRecent) using std::placeholders::_1; auto const& st = envelope.statement; - uint64_t ctCutoff = 0; + auto const& lcl = mLedgerManager.getLastClosedLedgerHeader().header; + ConsensusTime ctCutoff; if (enforceRecent) { - auto now = VirtualClock::to_time_t(mApp.getClock().system_now()); - if (now >= mApp.getConfig().MAXIMUM_LEDGER_CLOSETIME_DRIFT) + auto const now = mApp.getClock().system_now(); + std::chrono::seconds const maxDrift( + mApp.getConfig().MAXIMUM_LEDGER_CLOSETIME_DRIFT); + if (now.time_since_epoch() >= maxDrift) { - ctCutoff = now - mApp.getConfig().MAXIMUM_LEDGER_CLOSETIME_DRIFT; + ctCutoff = ConsensusTime::fromSystemTime(now - maxDrift, + lcl.ledgerVersion); } } auto envLedgerIndex = envelope.statement.slotIndex; auto& scpD = getHerderSCPDriver(); - auto const& lcl = mLedgerManager.getLastClosedLedgerHeader().header; auto lastCloseIndex = lcl.ledgerSeq; - auto lastCloseTime = lcl.scpValue.closeTime; + auto lastCloseTime = getConsensusTime(lcl.scpValue); // see if we can get a better estimate of lastCloseTime for validating this - // statement using consensus data: - // update lastCloseIndex/lastCloseTime to be the highest possible but still - // be less than envLedgerIndex + // statement using consensus data: update lastCloseIndex/lastCloseTime to + // be the highest possible but still be less than envLedgerIndex if (getState() != HERDER_BOOTING_STATE) { auto trackingIndex = trackingConsensusLedgerIndex(); @@ -751,16 +762,16 @@ HerderImpl::checkCloseTime(SCPEnvelope const& envelope, bool enforceRecent) return std::any_of(values.begin(), values.end(), [&](Value const& e) { auto r = toStellarValue(e, sv); // sv must be after cutoff - r = r && sv.closeTime >= ctCutoff; + r = r && getConsensusTime(sv) >= ctCutoff; if (r) { // statement received after the fact, only keep externalized // value r = (lastCloseIndex == envLedgerIndex && - lastCloseTime == sv.closeTime); + lastCloseTime == getConsensusTime(sv)); // for older messages, just ensure that they occurred before r = r || (lastCloseIndex > envLedgerIndex && - lastCloseTime > sv.closeTime); + lastCloseTime > getConsensusTime(sv)); // for future message, perform the same validity check than // within SCP r = r || scpD.checkCloseTime(envLedgerIndex, lastCloseTime, sv); @@ -977,7 +988,7 @@ HerderImpl::recvSCPEnvelope(SCPEnvelope const& envelope, void HerderImpl::externalizeValue(TxSetXDRFrameConstPtr txSet, uint32_t ledgerSeq, - uint64_t closeTime, + ConsensusTime closeTime, xdr::xvector const& upgrades, std::optional skToSignValue) { @@ -1208,11 +1219,12 @@ HerderImpl::getUpgrades() const #endif std::chrono::milliseconds -HerderImpl::ctValidityOffset(uint64_t ct, std::chrono::milliseconds maxCtOffset) +HerderImpl::ctValidityOffset(ConsensusTime closeTime, + std::chrono::milliseconds maxCtOffset) { auto maxCandidateCt = mApp.getClock().system_now() + maxCtOffset + Herder::MAX_TIME_SLIP_SECONDS; - auto minCandidateCt = VirtualClock::from_time_t(ct); + auto minCandidateCt = closeTime.toSystemTime(); if (minCandidateCt > maxCandidateCt) { @@ -1359,7 +1371,7 @@ HerderImpl::triggerAnchorFromConsensusCloseTime( }; auto consensusCloseTime = trackingConsensusCloseTime(); - if (consensusCloseTime == 0) + if (consensusCloseTime == ConsensusTime{}) { CLOG_WARNING(Herder, "Consensus close time is 0, falling back to " "prepare-start anchor"); @@ -1374,7 +1386,7 @@ HerderImpl::triggerAnchorFromConsensusCloseTime( // = nominationBudget + timeSinceLocalBallotStart + drift // // where nominationBudget is the slow-nomination allowance described above. - auto externalizedSystemTime = VirtualClock::from_time_t(consensusCloseTime); + auto externalizedSystemTime = consensusCloseTime.toSystemTime(); auto currentSystemTime = mApp.getClock().system_now(); auto timeSinceNetworkLedgerStart = std::chrono::duration_cast( @@ -1469,7 +1481,9 @@ HerderImpl::setupTriggerNextLedger() auto triggerOffset = std::chrono::duration_cast( triggerTime - now); - auto minCandidateCt = lcl.header.scpValue.closeTime + 1; + // The smallest close time the next nomination may propose + auto minCandidateCt = + getConsensusTime(lcl.header.scpValue).next(lcl.header.ledgerVersion); auto ctOffset = ctValidityOffset(minCandidateCt, triggerOffset); if (ctOffset > std::chrono::milliseconds::zero()) @@ -1677,8 +1691,8 @@ HerderImpl::triggerNextLedger(uint32_t ledgerSeqToTrigger, // We pick as next close time the current time unless it's before the last // close time. We don't know how much time it will take to reach consensus // so this is the most appropriate value to use as closeTime. - uint64_t nextCloseTime = - VirtualClock::to_time_t(mApp.getClock().system_now()); + auto nextCloseTime = ConsensusTime::fromSystemTime( + mApp.getClock().system_now(), lcl.header.ledgerVersion); if (ledgerSeqToTrigger == lcl.header.ledgerSeq + 1) { auto it = mDriftCTSlidingWindow.find(ledgerSeqToTrigger); @@ -1702,9 +1716,10 @@ HerderImpl::triggerNextLedger(uint32_t ledgerSeqToTrigger, } } - if (nextCloseTime <= lcl.header.scpValue.closeTime) + auto const lclCloseTime = getConsensusTime(lcl.header.scpValue); + if (nextCloseTime <= lclCloseTime) { - nextCloseTime = lcl.header.scpValue.closeTime + 1; + nextCloseTime = lclCloseTime.next(lcl.header.ledgerVersion); } // Ensure we're about to nominate a value with valid close time @@ -1715,30 +1730,35 @@ HerderImpl::triggerNextLedger(uint32_t ledgerSeqToTrigger, { CLOG_WARNING(Herder, "Invalid close time selected ({}), skipping nomination", - nextCloseTime); + nextCloseTime.toString()); return; } // Protocols including the "closetime change" (CAP-0034) externalize // the exact closeTime contained in the StellarValue with the best - // transaction set, so we know the exact closeTime against which to - // validate here -- 'nextCloseTime'. (The _offset_, therefore, is - // the difference between 'nextCloseTime' and the last ledger close time.) - TimePoint upperBoundCloseTimeOffset, lowerBoundCloseTimeOffset; - upperBoundCloseTimeOffset = nextCloseTime - lcl.header.scpValue.closeTime; - lowerBoundCloseTimeOffset = upperBoundCloseTimeOffset; + // transaction set, so we know the exact close time against which to + // validate here -- 'nextCloseTime'. The offset is the distance from the + // last closed ledger's close time to it. + // + // The offset is computed in *apply* time rather than consensus time: + // transaction time bounds are whole-second quantities compared against + // StellarValue::closeTime, which CAP-0088 leaves at whole seconds. With ms + // close times the next ledger may therefore apply in the same second as the + // LCL (a zero offset), and a transaction whose time bounds are met at that + // second is valid in both ledgers. + auto const closeTimeOffset = + nextCloseTime.toApplyTime() - getApplyTime(lcl.header.scpValue); PerPhaseTransactionList invalidTxPhases; invalidTxPhases.resize(txPhases.size()); - auto [proposedSet, applicableProposedSet] = - makeTxSetFromTransactions(txPhases, mApp, lowerBoundCloseTimeOffset, - upperBoundCloseTimeOffset, invalidTxPhases); + auto [proposedSet, applicableProposedSet] = makeTxSetFromTransactions( + txPhases, mApp, closeTimeOffset, invalidTxPhases); // New proposed tx set must be valid, so we explicitly populate tx set // validity cache so SCP can reuse the result. mHerderSCPDriver.cacheValidTxSet(*applicableProposedSet, lcl, - upperBoundCloseTimeOffset); + closeTimeOffset); if (protocolVersionStartsFrom(lcl.header.ledgerVersion, SOROBAN_PROTOCOL_VERSION)) @@ -2764,7 +2784,7 @@ HerderImpl::updateTransactionQueue(TxSetXDRFrameConstPtr externalizedTxSet, auto invalidTxs = TxSetUtils::getInvalidTxListWithErrors( txs, mApp, accountFeeMap, 0, getUpperBoundCloseTimeOffset( - mApp, lhhe.header.scpValue.closeTime)) + mApp, getApplyTime(lhhe.header.scpValue))) .first; queue.ban(invalidTxs); @@ -2867,49 +2887,74 @@ bool HerderImpl::verifyStellarValueSignature(StellarValue const& sv) { ZoneScoped; - switch (sv.ext.v()) - { - case STELLAR_VALUE_BASIC: - // This function should never be called with an unsigned value - releaseAssert(false); - case STELLAR_VALUE_SIGNED: - return PubKeyUtils::verifySig(sv.ext.lcValueSignature().nodeID, - sv.ext.lcValueSignature().signature, - xdr::xdr_to_opaque(mApp.getNetworkID(), - ENVELOPE_TYPE_SCPVALUE, - sv.txSetHash, - sv.closeTime)) - .valid; - case STELLAR_VALUE_EMPTY_TX_SET: + // This function should never be called with an unsigned value + releaseAssert(isSignedStellarValue(sv) || isEmptyTxSetStellarValue(sv)); + + auto const& signature = getLcValueSignature(sv); + auto const& txSetHash = + isEmptyTxSetStellarValue(sv) ? getProposedTxSetHash(sv) : sv.txSetHash; + if (isMsCloseTimeStellarValue(sv)) { - auto const& ov = sv.ext.proposedValue(); +#ifdef MS_CLOSE_TIME return PubKeyUtils::verifySig( - ov.lcValueSignature.nodeID, ov.lcValueSignature.signature, - xdr::xdr_to_opaque(mApp.getNetworkID(), - ENVELOPE_TYPE_SCPVALUE, ov.txSetHash, - sv.closeTime)) + signature.nodeID, signature.signature, + xdr::xdr_to_opaque( + mApp.getNetworkID(), ENVELOPE_TYPE_SCPVALUE, txSetHash, + sv.closeTime, getConsensusTime(sv).milliseconds())) .valid; - } - default: +#else releaseAssert(false); +#endif } + + return PubKeyUtils::verifySig(signature.nodeID, signature.signature, + xdr::xdr_to_opaque(mApp.getNetworkID(), + ENVELOPE_TYPE_SCPVALUE, + txSetHash, sv.closeTime)) + .valid; } StellarValue -HerderImpl::makeStellarValue(Hash const& txSetHash, uint64_t closeTime, +HerderImpl::makeStellarValue(Hash const& txSetHash, ConsensusTime closeTime, xdr::xvector const& upgrades, SecretKey const& s) { ZoneScoped; + bool const useMsCloseTime = getHerderSCPDriver().protocolUsesMsCloseTime(); + // Whole-second value types can only carry whole-second close times + releaseAssert(useMsCloseTime || closeTime.isWholeSecond()); + StellarValue sv; - sv.ext.v(STELLAR_VALUE_SIGNED); sv.txSetHash = txSetHash; - sv.closeTime = closeTime; + // closeTime carries the whole-second apply time in both value formats + sv.closeTime = closeTime.toApplyTime().timePoint(); sv.upgrades = upgrades; - sv.ext.lcValueSignature().nodeID = s.getPublicKey(); - sv.ext.lcValueSignature().signature = - s.sign(xdr::xdr_to_opaque(mApp.getNetworkID(), ENVELOPE_TYPE_SCPVALUE, - sv.txSetHash, sv.closeTime)); + if (useMsCloseTime) + { +#ifdef MS_CLOSE_TIME + sv.ext.v(STELLAR_VALUE_SIGNED_MS); + sv.ext.signedMsValue().closeTimeMs = closeTime.milliseconds(); + auto& signature = getLcValueSignature(sv); + signature.nodeID = s.getPublicKey(); + // The signature also covers the full ms close time (CAP-0088). Sign + // exactly what verifyStellarValueSignature reads back out of the value. + signature.signature = s.sign(xdr::xdr_to_opaque( + mApp.getNetworkID(), ENVELOPE_TYPE_SCPVALUE, sv.txSetHash, + sv.closeTime, getConsensusTime(sv).milliseconds())); +#else + releaseAssert(false); +#endif + } + else + { + sv.ext.v(STELLAR_VALUE_SIGNED); + auto& signature = getLcValueSignature(sv); + signature.nodeID = s.getPublicKey(); + signature.signature = s.sign( + xdr::xdr_to_opaque(mApp.getNetworkID(), ENVELOPE_TYPE_SCPVALUE, + sv.txSetHash, sv.closeTime)); + } + releaseAssert(hasValidCloseTime(sv)); return sv; } diff --git a/src/herder/HerderImpl.h b/src/herder/HerderImpl.h index c0856cb030..e149424c2b 100644 --- a/src/herder/HerderImpl.h +++ b/src/herder/HerderImpl.h @@ -10,6 +10,7 @@ #include "herder/QuorumIntersectionChecker.h" #include "herder/TransactionQueue.h" #include "herder/Upgrades.h" +#include "ledger/LedgerHeaderUtils.h" #include "util/Timer.h" #include "util/UnorderedMap.h" #include "util/XDROperators.h" @@ -41,7 +42,7 @@ class HerderImpl : public Herder struct ConsensusData { uint64_t mConsensusIndex{0}; - TimePoint mConsensusCloseTime{0}; + ConsensusTime mConsensusCloseTime; }; void setTrackingSCPState(uint64_t index, StellarValue const& value, @@ -51,7 +52,7 @@ class HerderImpl : public Herder // in fully booted state uint32 trackingConsensusLedgerIndex() const override; - TimePoint trackingConsensusCloseTime() const; + ConsensusTime trackingConsensusCloseTime() const; // the ledger index that we expect to externalize next uint32 @@ -118,7 +119,7 @@ class HerderImpl : public Herder StellarMessage const& txset) override; void externalizeValue(TxSetXDRFrameConstPtr txSet, uint32_t ledgerSeq, - uint64_t closeTime, + ConsensusTime closeTime, xdr::xvector const& upgrades, std::optional skToSignValue) override; @@ -209,7 +210,7 @@ class HerderImpl : public Herder QuorumTracker::QuorumMap const& getCurrentlyTrackedQuorum() const override; virtual StellarValue - makeStellarValue(Hash const& txSetHash, uint64_t closeTime, + makeStellarValue(Hash const& txSetHash, ConsensusTime closeTime, xdr::xvector const& upgrades, SecretKey const& s) override; @@ -251,8 +252,9 @@ class HerderImpl : public Herder // Given a candidate close time, determine an offset needed to make it // valid (at current system time). Returns 0 if ct is already valid std::chrono::milliseconds - ctValidityOffset(uint64_t ct, std::chrono::milliseconds maxCtOffset = - std::chrono::milliseconds::zero()); + ctValidityOffset(ConsensusTime closeTime, + std::chrono::milliseconds maxCtOffset = + std::chrono::milliseconds::zero()); void setupTriggerNextLedger(); @@ -315,7 +317,7 @@ class HerderImpl : public Herder // Map SCP slots to local time of nomination and the time slot was // externalized by the network - std::map>> + std::map>> mDriftCTSlidingWindow; // saves upgrade parameters diff --git a/src/herder/HerderSCPDriver.cpp b/src/herder/HerderSCPDriver.cpp index 4a5be9bc51..f2395ac3b8 100644 --- a/src/herder/HerderSCPDriver.cpp +++ b/src/herder/HerderSCPDriver.cpp @@ -10,6 +10,7 @@ #include "herder/HerderImpl.h" #include "herder/LedgerCloseData.h" #include "herder/PendingEnvelopes.h" +#include "ledger/LedgerHeaderUtils.h" #include "ledger/LedgerManager.h" #include "main/Application.h" #include "main/ErrorMessages.h" @@ -36,15 +37,6 @@ namespace stellar { -namespace -{ -bool -isEmptyTxSetStellarValue(StellarValue const& sv) -{ - return sv.ext.v() == STELLAR_VALUE_EMPTY_TX_SET; -} -} - uint32_t const TXSETVALID_CACHE_SIZE = 1000; Hash @@ -263,6 +255,13 @@ HerderSCPDriver::protocolAllowsEmptyTxSetValues() const EMPTY_TX_SET_PROTOCOL_VERSION); } +bool +HerderSCPDriver::protocolUsesMsCloseTime() const +{ + return protocolHasMsCloseTime( + mLedgerManager.getLastClosedLedgerHeader().header.ledgerVersion); +} + bool HerderSCPDriver::isParallelTxSetDownloadEnabled() const { @@ -273,24 +272,30 @@ HerderSCPDriver::isParallelTxSetDownloadEnabled() const // value validation bool -HerderSCPDriver::checkCloseTime(uint64_t slotIndex, uint64_t lastCloseTime, +HerderSCPDriver::checkCloseTime(uint64_t slotIndex, ConsensusTime lastCloseTime, StellarValue const& b) const { + auto const closeTime = getConsensusTime(b); + // Check closeTime (not too old) - if (b.closeTime <= lastCloseTime) + if (closeTime <= lastCloseTime) { CLOG_TRACE(Herder, "Close time too old for slot {}, got {} vs {}", - slotIndex, b.closeTime, lastCloseTime); + slotIndex, closeTime.toString(), lastCloseTime.toString()); return false; } // Check closeTime (not too far in future) - uint64_t timeNow = mApp.timeNow(); - if (b.closeTime > timeNow + Herder::MAX_TIME_SLIP_SECONDS.count()) + auto const protocolVersion = + mLedgerManager.getLastClosedLedgerHeader().header.ledgerVersion; + auto const maxCloseTime = ConsensusTime::fromSystemTime( + mApp.getClock().system_now() + Herder::MAX_TIME_SLIP_SECONDS, + protocolVersion); + if (closeTime > maxCloseTime) { CLOG_TRACE(Herder, "Close time too far in future for slot {}, got {} vs {}", - slotIndex, b.closeTime, timeNow); + slotIndex, closeTime.toString(), maxCloseTime.toString()); return false; } return true; @@ -303,14 +308,16 @@ HerderSCPDriver::validatePastOrFutureValue( { ZoneScoped; releaseAssert(slotIndex != lcl.header.ledgerSeq + 1); + auto const closeTime = getConsensusTime(b); + auto const lclCloseTime = getConsensusTime(lcl.header.scpValue); if (slotIndex == lcl.header.ledgerSeq) { // previous ledger - if (b.closeTime != lcl.header.scpValue.closeTime) + if (closeTime != lclCloseTime) { - CLOG_TRACE(Herder, - "Got a bad close time for ledger {}, got {} vs {}", - slotIndex, b.closeTime, lcl.header.scpValue.closeTime); + CLOG_TRACE( + Herder, "Got a bad close time for ledger {}, got {} vs {}", + slotIndex, closeTime.toString(), lclCloseTime.toString()); return SCPDriver::kInvalidValue; } if (isEmptyTxSetStellarValue(b)) @@ -320,13 +327,13 @@ HerderSCPDriver::validatePastOrFutureValue( return SCPDriver::kInvalidValue; } - auto const& ov = b.ext.proposedValue(); // We can check previousLedgerHash because the LCL header // contains the hash of its parent. We cannot check // previousLedgerVersion because the LCL header only has // its own version, and a protocol upgrade on the LCL // could make it differ from its parent's version. - if (ov.previousLedgerHash != lcl.header.previousLedgerHash) + if (getProposedPreviousLedgerHash(b) != + lcl.header.previousLedgerHash) { CLOG_TRACE(Herder, "Got a bad previousLedgerHash for empty-tx-set " @@ -339,15 +346,15 @@ HerderSCPDriver::validatePastOrFutureValue( else if (slotIndex < lcl.header.ledgerSeq) { // basic sanity check on older value - if (b.closeTime >= lcl.header.scpValue.closeTime) + if (closeTime >= lclCloseTime) { - CLOG_TRACE(Herder, - "Got a bad close time for ledger {}, got {} vs {}", - slotIndex, b.closeTime, lcl.header.scpValue.closeTime); + CLOG_TRACE( + Herder, "Got a bad close time for ledger {}, got {} vs {}", + slotIndex, closeTime.toString(), lclCloseTime.toString()); return SCPDriver::kInvalidValue; } } - else if (!checkCloseTime(slotIndex, lcl.header.scpValue.closeTime, b)) + else if (!checkCloseTime(slotIndex, lclCloseTime, b)) { // future messages must be valid compared to lastCloseTime return SCPDriver::kInvalidValue; @@ -414,7 +421,8 @@ HerderSCPDriver::validateValueAgainstLocalState(uint64_t slotIndex, if (isCurrentLedger) { // The value is for LCL+1, perform all possible checks - if (!checkCloseTime(slotIndex, lcl.header.scpValue.closeTime, b)) + if (!checkCloseTime(slotIndex, getConsensusTime(lcl.header.scpValue), + b)) { return SCPDriver::kInvalidValue; } @@ -439,9 +447,8 @@ HerderSCPDriver::validateValueAgainstLocalState(uint64_t slotIndex, slotIndex); return SCPDriver::kInvalidValue; } - auto const& ov = b.ext.proposedValue(); - if (ov.previousLedgerHash != lcl.hash || - ov.previousLedgerVersion != lcl.header.ledgerVersion) + if (getProposedPreviousLedgerHash(b) != lcl.hash || + getProposedPreviousLedgerVersion(b) != lcl.header.ledgerVersion) { CLOG_DEBUG(Herder, "HerderSCPDriver::validateValue i: {} empty-tx-set " @@ -458,7 +465,8 @@ HerderSCPDriver::validateValueAgainstLocalState(uint64_t slotIndex, TxSetXDRFrameConstPtr txSet = std::get( mPendingEnvelopes.getTxSet(txSetHash)); - auto closeTimeOffset = b.closeTime - lcl.header.scpValue.closeTime; + auto closeTimeOffset = + getApplyTime(b) - getApplyTime(lcl.header.scpValue); if (!txSet) { @@ -515,7 +523,8 @@ HerderSCPDriver::validateValueAgainstLocalState(uint64_t slotIndex, } bool -HerderSCPDriver::deserializeAndValidateStellarValue(Value const& value, +HerderSCPDriver::deserializeAndValidateStellarValue(uint64_t slotIndex, + Value const& value, StellarValue& sv) const { ZoneScoped; @@ -529,22 +538,57 @@ HerderSCPDriver::deserializeAndValidateStellarValue(Value const& value, return false; } - bool const emptyTxSetsAllowed = protocolAllowsEmptyTxSetValues(); - if (sv.ext.v() != STELLAR_VALUE_SIGNED) +#ifdef MS_CLOSE_TIME + // An ms value's closeTime must agree with its closeTimeMs + if (!hasValidCloseTime(sv)) { - if (!emptyTxSetsAllowed) - { - // Empty-tx-set values are not allowed, and the value is not a - // signed value, so it is invalid. - return false; - } + return false; + } - if (!isEmptyTxSetStellarValue(sv)) - { - // The value is not a signed value or an empty-tx-set value, so it - // is invalid. - return false; - } + // Whether a slot uses whole-second or ms close times is decided by the + // protocol of the ledger before it (CAP-0088). We only know that protocol + // for certain for the next slot, LCL+1; for any other slot the network may + // have upgraded somewhere between our LCL and that slot, so we accept + // every format we cannot rule out: + // + // LCL before ms upgrade LCL at/after ms upgrade + // slot <= LCL whole-second only either (may predate it) + // slot == LCL+1 whole-second only ms only + // slot > LCL+1 either (may have upgraded) ms only + // + // Prior to the upgrade, if we are behind, it's possible our peers our + // sending us valid future slots after an upgrade we have not yet applied. + // Similarly for past slots, it's possible these predate the upgrade that we + // have already applied. + auto const& lclHeader = mLedgerManager.getLastClosedLedgerHeader().header; + bool const lclProtocolHasMsCloseTime = + protocolHasMsCloseTime(lclHeader.ledgerVersion); + bool const slotAlreadyClosed = slotIndex <= lclHeader.ledgerSeq; + bool const slotBeyondNext = slotIndex > lclHeader.ledgerSeq + 1; + bool const valueHasMsCloseTime = isMsCloseTimeStellarValue(sv); + + bool const msCloseTimeAllowed = lclProtocolHasMsCloseTime || slotBeyondNext; + bool const wholeSecondCloseTimeAllowed = + !lclProtocolHasMsCloseTime || slotAlreadyClosed; + bool const valueFormatAllowed = + valueHasMsCloseTime ? msCloseTimeAllowed : wholeSecondCloseTimeAllowed; + if (!valueFormatAllowed) + { + return false; + } +#endif // MS_CLOSE_TIME + + // Values must be signed or empty-tx-set values + bool const isSigned = isSignedStellarValue(sv); + bool const isEmpty = isEmptyTxSetStellarValue(sv); + if (!isSigned && !isEmpty) + { + return false; + } + // Empty-tx-set values are only valid once the protocol allows them + if (isEmpty && !protocolAllowsEmptyTxSetValues()) + { + return false; } // Empty-tx-set values must have the empty-tx-set hash, and @@ -599,7 +643,7 @@ HerderSCPDriver::validateValue(uint64_t slotIndex, Value const& value, releaseAssert(threadIsMain()); StellarValue b; - if (!deserializeAndValidateStellarValue(value, b)) + if (!deserializeAndValidateStellarValue(slotIndex, value, b)) { mSCPMetrics.mValueInvalid.Mark(); return SCPDriver::kInvalidValue; @@ -637,7 +681,7 @@ HerderSCPDriver::extractValidValue(uint64_t slotIndex, Value const& value) { ZoneScoped; StellarValue b; - if (!deserializeAndValidateStellarValue(value, b)) + if (!deserializeAndValidateStellarValue(slotIndex, value, b)) { return nullptr; } @@ -687,14 +731,28 @@ HerderSCPDriver::makeEmptyTxSetValueFromValue(Value const& v) const { ZoneScoped; StellarValue proposedValue = toStellarValueOrThrow(v); - releaseAssert(proposedValue.ext.v() == STELLAR_VALUE_SIGNED); + releaseAssert(isSignedStellarValue(proposedValue)); auto const& lcl = mLedgerManager.getLastClosedLedgerHeader(); StellarValue sv; - sv.ext.v(STELLAR_VALUE_EMPTY_TX_SET); sv.txSetHash = Herder::EMPTY_TX_SET_HASH; sv.closeTime = proposedValue.closeTime; sv.upgrades = proposedValue.upgrades; +#ifdef MS_CLOSE_TIME + if (proposedValue.ext.v() == STELLAR_VALUE_SIGNED_MS) + { + sv.ext.v(STELLAR_VALUE_EMPTY_TX_SET_MS); + auto& ov = sv.ext.proposedMsValue(); + ov.closeTimeMs = proposedValue.ext.signedMsValue().closeTimeMs; + ov.txSetHash = proposedValue.txSetHash; + ov.previousLedgerHash = lcl.hash; + ov.previousLedgerVersion = lcl.header.ledgerVersion; + ov.lcValueSignature = + proposedValue.ext.signedMsValue().lcValueSignature; + return xdr::xdr_to_opaque(sv); + } +#endif // MS_CLOSE_TIME + sv.ext.v(STELLAR_VALUE_EMPTY_TX_SET); sv.ext.proposedValue().txSetHash = proposedValue.txSetHash; sv.ext.proposedValue().previousLedgerHash = lcl.hash; sv.ext.proposedValue().previousLedgerVersion = lcl.header.ledgerVersion; @@ -1833,15 +1891,17 @@ HerderSCPDriver::wrapStellarValue(StellarValue const& sv) void HerderSCPDriver::cacheValidTxSet(ApplicableTxSetFrame const& txSet, LedgerHeaderHistoryEntry const& lcl, - uint64_t closeTimeOffset) const + ApplyTimeOffset closeTimeOffset) const { - auto key = TxSetValidityKey{lcl.hash, txSet.getContentsHash(), - closeTimeOffset, closeTimeOffset}; + auto key = + TxSetValidityKey{lcl.hash, txSet.getContentsHash(), + closeTimeOffset.seconds(), closeTimeOffset.seconds()}; bool* pRes = mTxSetValidCache.maybeGet(key); if (pRes == nullptr) { #ifdef SCP_DEBUGGING - releaseAssert(txSet.checkValid(mApp, closeTimeOffset, closeTimeOffset)); + releaseAssert(txSet.checkValid(mApp, closeTimeOffset.seconds(), + closeTimeOffset.seconds())); #endif mTxSetValidCache.put(key, true); } @@ -1859,12 +1919,13 @@ HerderSCPDriver::cacheValidTxSet(ApplicableTxSetFrame const& txSet, bool HerderSCPDriver::checkAndCacheTxSetValid(TxSetXDRFrame const& txSet, LedgerHeaderHistoryEntry const& lcl, - uint64_t closeTimeOffset) const + ApplyTimeOffset closeTimeOffset) const { ZoneScoped; - auto key = TxSetValidityKey{lcl.hash, txSet.getContentsHash(), - closeTimeOffset, closeTimeOffset}; + auto key = + TxSetValidityKey{lcl.hash, txSet.getContentsHash(), + closeTimeOffset.seconds(), closeTimeOffset.seconds()}; bool* pRes = mTxSetValidCache.maybeGet(key); if (pRes == nullptr) @@ -1893,8 +1954,8 @@ HerderSCPDriver::checkAndCacheTxSetValid(TxSetXDRFrame const& txSet, } else { - res = applicableTxSet->checkValid(mApp, closeTimeOffset, - closeTimeOffset); + res = applicableTxSet->checkValid(mApp, closeTimeOffset.seconds(), + closeTimeOffset.seconds()); } mTxSetValidCache.put(key, res); diff --git a/src/herder/HerderSCPDriver.h b/src/herder/HerderSCPDriver.h index d4906b64db..e662e13926 100644 --- a/src/herder/HerderSCPDriver.h +++ b/src/herder/HerderSCPDriver.h @@ -24,6 +24,7 @@ class Histogram; namespace stellar { class Application; +class ConsensusTime; class HerderImpl; class LedgerManager; class PendingEnvelopes; @@ -80,7 +81,7 @@ class HerderSCPDriver : public SCPDriver // Construct a CAP-0083 empty-tx-set value from `v`. A few caveats about // this function: - // * `v` must be a STELLAR_VALUE_SIGNED value. + // * `v` must be a STELLAR_VALUE_SIGNED or STELLAR_VALUE_SIGNED_MS value. // * This function should only be called from slots with slot indices equal // to LCL+1 Value makeEmptyTxSetValueFromValue(Value const& v) const override; @@ -95,6 +96,9 @@ class HerderSCPDriver : public SCPDriver // Returns true iff the protocol allows CAP-0083 empty-tx-set values bool protocolAllowsEmptyTxSetValues() const override; + // Returns true iff the protocol uses millisecond-resolution close times. + bool protocolUsesMsCloseTime() const; + // timer handling void setupTimer(uint64_t slotIndex, int timerID, std::chrono::milliseconds timeout, @@ -156,7 +160,7 @@ class HerderSCPDriver : public SCPDriver std::optional getPrepareStart(uint64_t slotIndex); // validate close time as much as possible - bool checkCloseTime(uint64_t slotIndex, uint64_t lastCloseTime, + bool checkCloseTime(uint64_t slotIndex, ConsensusTime lastCloseTime, StellarValue const& b) const; // wraps a *valid* StellarValue (throws if it can't find txSet/qSet) @@ -209,7 +213,7 @@ class HerderSCPDriver : public SCPDriver }; void cacheValidTxSet(ApplicableTxSetFrame const& txSet, LedgerHeaderHistoryEntry const& lcl, - uint64_t closeTimeOffset) const; + ApplyTimeOffset closeTimeOffset) const; // Get the number of nomination timeouts that occurred for a given slot std::optional getNominationTimeouts(uint64_t slotIndex) const; @@ -355,9 +359,10 @@ class HerderSCPDriver : public SCPDriver bool checkAndCacheTxSetValid(TxSetXDRFrame const& txSet, LedgerHeaderHistoryEntry const& lcl, - uint64_t closeTimeOffset) const; + ApplyTimeOffset closeTimeOffset) const; - bool deserializeAndValidateStellarValue(Value const& value, + bool deserializeAndValidateStellarValue(uint64_t slotIndex, + Value const& value, StellarValue& sv) const; void extractValidUpgrades(StellarValue& sv, bool nomination) const; }; diff --git a/src/herder/LedgerCloseData.cpp b/src/herder/LedgerCloseData.cpp index dfe22f2514..91347023e2 100644 --- a/src/herder/LedgerCloseData.cpp +++ b/src/herder/LedgerCloseData.cpp @@ -3,6 +3,7 @@ #include "crypto/Hex.h" #include "herder/Herder.h" #include "herder/Upgrades.h" +#include "ledger/LedgerHeaderUtils.h" #include "main/Application.h" #include "util/GlobalChecks.h" #include "util/Logging.h" @@ -64,12 +65,24 @@ stellarValueToString(Config const& c, StellarValue const& sv) res << " EMPTY_TXSET@" << c.toShortString(sv.ext.proposedValue().lcValueSignature.nodeID); break; +#ifdef MS_CLOSE_TIME + case STELLAR_VALUE_SIGNED_MS: + res << " SIGNED_MS@" + << c.toShortString(sv.ext.signedMsValue().lcValueSignature.nodeID); + break; + case STELLAR_VALUE_EMPTY_TX_SET_MS: + res << " EMPTY_TXSET_MS@" + << c.toShortString( + sv.ext.proposedMsValue().lcValueSignature.nodeID); + break; +#endif // MS_CLOSE_TIME default: res << " UNKNOWN"; break; } - res << " txH: " << hexAbbrev(sv.txSetHash) << ", ct: " << sv.closeTime - << ", upgrades: ["; + res << " txH: " << hexAbbrev(sv.txSetHash) + << ", ct: " << getConsensusTime(sv).toString(); + res << ", upgrades: ["; for (auto const& upgrade : sv.upgrades) { if (upgrade.empty()) diff --git a/src/herder/PendingEnvelopes.cpp b/src/herder/PendingEnvelopes.cpp index 96ecc92a8f..8c2078f7ec 100644 --- a/src/herder/PendingEnvelopes.cpp +++ b/src/herder/PendingEnvelopes.cpp @@ -330,7 +330,15 @@ PendingEnvelopes::recvSCPEnvelope(SCPEnvelope const& envelope) } auto const& values = maybeValues.value(); - if (std::any_of(values.begin(), values.end(), [this](auto const& value) { + auto const& scpDriver = mHerder.getHerderSCPDriver(); + // The protocol gates below are judged against the local LCL, which only + // governs slots up to lcl+1. A node that has fallen behind a protocol + // upgrade cannot know which protocol governs later slots, so it must not + // drop protocol-gated values for future slots. + bool const beyondLocalProtocol = + envelope.statement.slotIndex > + mApp.getLedgerManager().getLastClosedLedgerNum() + 1; + if (std::any_of(values.begin(), values.end(), [&](auto const& value) { switch (value.ext.v()) { case STELLAR_VALUE_BASIC: @@ -340,8 +348,19 @@ PendingEnvelopes::recvSCPEnvelope(SCPEnvelope const& envelope) // Signed values are allowed return false; case STELLAR_VALUE_EMPTY_TX_SET: - return !mHerder.getHerderSCPDriver() - .protocolAllowsEmptyTxSetValues(); + return !beyondLocalProtocol && + !scpDriver.protocolAllowsEmptyTxSetValues(); +#ifdef MS_CLOSE_TIME + case STELLAR_VALUE_SIGNED_MS: + // Millisecond close times are only permitted once the + // protocol uses them + return !beyondLocalProtocol && + !scpDriver.protocolUsesMsCloseTime(); + case STELLAR_VALUE_EMPTY_TX_SET_MS: + return !beyondLocalProtocol && + !(scpDriver.protocolAllowsEmptyTxSetValues() && + scpDriver.protocolUsesMsCloseTime()); +#endif // MS_CLOSE_TIME default: releaseAssert(false); } diff --git a/src/herder/TransactionQueue.cpp b/src/herder/TransactionQueue.cpp index af1d1638a7..3ea1b77d16 100644 --- a/src/herder/TransactionQueue.cpp +++ b/src/herder/TransactionQueue.cpp @@ -9,6 +9,7 @@ #include "herder/SurgePricingUtils.h" #include "herder/TxQueueLimiter.h" #include "ledger/LedgerHashUtils.h" +#include "ledger/LedgerHeaderUtils.h" #include "ledger/LedgerManager.h" #include "ledger/LedgerTxn.h" #include "ledger/LedgerTxnImpl.h" @@ -442,9 +443,8 @@ TransactionQueue::canAdd( TransactionQueue::AddResultCode::ADD_STATUS_TRY_AGAIN_LATER); } - auto closeTime = mApp.getLedgerManager() - .getLastClosedLedgerHeader() - .header.scpValue.closeTime; + auto closeTime = getApplyTime( + mApp.getLedgerManager().getLastClosedLedgerHeader().header.scpValue); // Validate minSeqLedgerGap and LedgerBounds against the next ledgerSeq, // which is what will be used at apply time. std::optional validationLedgerSeq; diff --git a/src/herder/TxSetFrame.cpp b/src/herder/TxSetFrame.cpp index 5e68fdf35d..fb021868a7 100644 --- a/src/herder/TxSetFrame.cpp +++ b/src/herder/TxSetFrame.cpp @@ -795,7 +795,7 @@ TxSetXDRFrame::makeFromStoredTxSet(StoredTransactionSet const& storedSet) std::pair makeTxSetFromTransactions( PerPhaseTransactionList const& txPhases, Application& app, - uint64_t lowerBoundCloseTimeOffset, uint64_t upperBoundCloseTimeOffset + ApplyTimeOffset closeTimeOffset #ifdef BUILD_TESTS , bool skipValidation, @@ -805,8 +805,7 @@ makeTxSetFromTransactions( { PerPhaseTransactionList invalidTxs; invalidTxs.resize(txPhases.size()); - return makeTxSetFromTransactions(txPhases, app, lowerBoundCloseTimeOffset, - upperBoundCloseTimeOffset, invalidTxs + return makeTxSetFromTransactions(txPhases, app, closeTimeOffset, invalidTxs #ifdef BUILD_TESTS , skipValidation, parallelSorobanOrder @@ -817,8 +816,7 @@ makeTxSetFromTransactions( std::pair makeTxSetFromTransactions( PerPhaseTransactionList const& txPhases, Application& app, - uint64_t lowerBoundCloseTimeOffset, uint64_t upperBoundCloseTimeOffset, - PerPhaseTransactionList& invalidTxs + ApplyTimeOffset closeTimeOffset, PerPhaseTransactionList& invalidTxs #ifdef BUILD_TESTS , bool skipValidation, @@ -857,8 +855,8 @@ makeTxSetFromTransactions( { #endif validatedTxs = TxSetUtils::trimInvalid( - phaseTxs, app, accountFeeMap, lowerBoundCloseTimeOffset, - upperBoundCloseTimeOffset, invalid); + phaseTxs, app, accountFeeMap, closeTimeOffset.seconds(), + closeTimeOffset.seconds(), invalid); #ifdef BUILD_TESTS } #endif @@ -949,7 +947,7 @@ makeTxSetFromTransactions( // We already trimmed invalid transactions in an earlier call to // `trimInvalid`, so skip transaction validation here auto validationResult = outputApplicableTxSet->checkValidInternalWithResult( - app, lowerBoundCloseTimeOffset, upperBoundCloseTimeOffset, true); + app, closeTimeOffset.seconds(), closeTimeOffset.seconds(), true); if (validationResult != TxSetValidationResult::VALID) { throw std::runtime_error(fmt::format( @@ -1002,21 +1000,20 @@ TxSetXDRFrame::makeFromHistoryTransactions(Hash const& previousLedgerHash, #ifdef BUILD_TESTS std::pair makeTxSetFromTransactions( - TxFrameList txs, Application& app, uint64_t lowerBoundCloseTimeOffset, - uint64_t upperBoundCloseTimeOffset, bool enforceTxsApplyOrder, + TxFrameList txs, Application& app, ApplyTimeOffset closeTimeOffset, + bool enforceTxsApplyOrder, txtest::ParallelSorobanOrder const& parallelSorobanOrder) { TxFrameList invalid; - return makeTxSetFromTransactions( - txs, app, lowerBoundCloseTimeOffset, upperBoundCloseTimeOffset, invalid, - enforceTxsApplyOrder, parallelSorobanOrder); + return makeTxSetFromTransactions(txs, app, closeTimeOffset, invalid, + enforceTxsApplyOrder, + parallelSorobanOrder); } std::pair makeTxSetFromTransactions( - TxFrameList txs, Application& app, uint64_t lowerBoundCloseTimeOffset, - uint64_t upperBoundCloseTimeOffset, TxFrameList& invalidTxs, - bool enforceTxsApplyOrder, + TxFrameList txs, Application& app, ApplyTimeOffset closeTimeOffset, + TxFrameList& invalidTxs, bool enforceTxsApplyOrder, txtest::ParallelSorobanOrder const& parallelSorobanOrder) { releaseAssert(threadIsMain()); @@ -1040,9 +1037,9 @@ makeTxSetFromTransactions( } PerPhaseTransactionList invalid; invalid.resize(perPhaseTxs.size()); - auto res = makeTxSetFromTransactions( - perPhaseTxs, app, lowerBoundCloseTimeOffset, upperBoundCloseTimeOffset, - invalid, enforceTxsApplyOrder, parallelSorobanOrder); + auto res = + makeTxSetFromTransactions(perPhaseTxs, app, closeTimeOffset, invalid, + enforceTxsApplyOrder, parallelSorobanOrder); if (enforceTxsApplyOrder) { auto const& resPhases = res.second->getPhases(); diff --git a/src/herder/TxSetFrame.h b/src/herder/TxSetFrame.h index 5f1fdb8e65..0b88e31350 100644 --- a/src/herder/TxSetFrame.h +++ b/src/herder/TxSetFrame.h @@ -6,6 +6,7 @@ #include "herder/SurgePricingUtils.h" #include "ledger/LedgerHashUtils.h" +#include "ledger/LedgerHeaderUtils.h" #include "overlay/StellarXDR.h" #include "transactions/TransactionFrame.h" #include "util/NonCopyable.h" @@ -108,6 +109,12 @@ using PerPhaseTransactionList = std::vector; // Not all the transactions will be included in the result: invalid // transactions are trimmed and optionally returned via `invalidTxs` and if // there are too many remaining transactions surge pricing is applied. +// `closeTimeOffset` is how far ahead of the last closed ledger's apply time the +// ledger this set is built for applies. Transaction time bounds are +// whole-second quantities checked against that apply time (used as both the +// lower and the upper bound, since the close time is known exactly), which is +// why the offset is in apply-time units rather than derived from the consensus +// close time. // The result is guaranteed to pass `checkValid` check with the same // arguments as in this method, so additional validation is not needed. // @@ -116,8 +123,7 @@ using PerPhaseTransactionList = std::vector; std::pair makeTxSetFromTransactions( PerPhaseTransactionList const& txPhases, Application& app, - uint64_t lowerBoundCloseTimeOffset, - uint64_t upperBoundCloseTimeOffset + ApplyTimeOffset closeTimeOffset #ifdef BUILD_TESTS // Skips the tx set validation and preserves the pointers // to the passed-in transactions - use in conjunction with @@ -130,7 +136,7 @@ makeTxSetFromTransactions( std::pair makeTxSetFromTransactions( PerPhaseTransactionList const& txPhases, Application& app, - uint64_t lowerBoundCloseTimeOffset, uint64_t upperBoundCloseTimeOffset, + ApplyTimeOffset closeTimeOffset, PerPhaseTransactionList& invalidTxsPerPhase #ifdef BUILD_TESTS // Skips the tx set validation and preserves the pointers @@ -145,14 +151,13 @@ makeTxSetFromTransactions( #ifdef BUILD_TESTS std::pair makeTxSetFromTransactions( - TxFrameList txs, Application& app, uint64_t lowerBoundCloseTimeOffset, - uint64_t upperBoundCloseTimeOffset, bool enforceTxsApplyOrder = false, + TxFrameList txs, Application& app, ApplyTimeOffset closeTimeOffset, + bool enforceTxsApplyOrder = false, txtest::ParallelSorobanOrder const& parallelSorobanOrder = {}); std::pair makeTxSetFromTransactions( - TxFrameList txs, Application& app, uint64_t lowerBoundCloseTimeOffset, - uint64_t upperBoundCloseTimeOffset, TxFrameList& invalidTxs, - bool enforceTxsApplyOrder = false, + TxFrameList txs, Application& app, ApplyTimeOffset closeTimeOffset, + TxFrameList& invalidTxs, bool enforceTxsApplyOrder = false, txtest::ParallelSorobanOrder const& parallelSorobanOrder = {}); #endif @@ -374,7 +379,7 @@ class TxSetPhaseFrame friend std::pair makeTxSetFromTransactions( PerPhaseTransactionList const& txPhases, Application& app, - uint64_t lowerBoundCloseTimeOffset, uint64_t upperBoundCloseTimeOffset, + ApplyTimeOffset closeTimeOffset, PerPhaseTransactionList& invalidTxsPerPhase #ifdef BUILD_TESTS , @@ -385,9 +390,8 @@ class TxSetPhaseFrame #ifdef BUILD_TESTS friend std::pair makeTxSetFromTransactions( - TxFrameList txs, Application& app, uint64_t lowerBoundCloseTimeOffset, - uint64_t upperBoundCloseTimeOffset, TxFrameList& invalidTxs, - bool enforceTxsApplyOrder, + TxFrameList txs, Application& app, ApplyTimeOffset closeTimeOffset, + TxFrameList& invalidTxs, bool enforceTxsApplyOrder, txtest::ParallelSorobanOrder const& parallelSorobanOrder); #endif TxSetPhaseFrame(TxSetPhase phase, TxFrameList const& txs, @@ -546,7 +550,7 @@ class ApplicableTxSetFrame friend std::pair makeTxSetFromTransactions( PerPhaseTransactionList const& txPhases, Application& app, - uint64_t lowerBoundCloseTimeOffset, uint64_t upperBoundCloseTimeOffset, + ApplyTimeOffset closeTimeOffset, PerPhaseTransactionList& invalidTxsPerPhase #ifdef BUILD_TESTS , @@ -557,9 +561,8 @@ class ApplicableTxSetFrame #ifdef BUILD_TESTS friend std::pair makeTxSetFromTransactions( - TxFrameList txs, Application& app, uint64_t lowerBoundCloseTimeOffset, - uint64_t upperBoundCloseTimeOffset, TxFrameList& invalidTxs, - bool enforceTxsApplyOrder, + TxFrameList txs, Application& app, ApplyTimeOffset closeTimeOffset, + TxFrameList& invalidTxs, bool enforceTxsApplyOrder, txtest::ParallelSorobanOrder const& parallelSorobanOrder); #endif diff --git a/src/herder/Upgrades.cpp b/src/herder/Upgrades.cpp index e8b1423f64..9c0c9fa7f0 100644 --- a/src/herder/Upgrades.cpp +++ b/src/herder/Upgrades.cpp @@ -282,7 +282,7 @@ Upgrades::createUpgradesFor(LedgerHeader const& lclHeader, Config const& appCfg) const { auto result = std::vector{}; - if (!timeForUpgrade(lclHeader.scpValue.closeTime)) + if (!timeForUpgrade(getApplyTime(lclHeader.scpValue))) { return result; } @@ -470,7 +470,7 @@ Upgrades::toString() const Upgrades::UpgradeParameters Upgrades::removeUpgrades(std::vector::const_iterator beginUpdates, std::vector::const_iterator endUpdates, - uint64_t closeTime, bool& updated) + ApplyTime closeTime, bool& updated) { updated = false; UpgradeParameters res = mParams; @@ -480,7 +480,7 @@ Upgrades::removeUpgrades(std::vector::const_iterator beginUpdates, // upgrades don't attempt to change the network if (res.mUpgradeTime + res.mExpirationMinutes.value_or( DEFAULT_UPGRADE_EXPIRATION_MINUTES) <= - VirtualClock::from_time_t(closeTime)) + VirtualClock::from_time_t(closeTime.timePoint())) { auto resetParamIfSet = [&](auto& o) { if (o) @@ -646,7 +646,7 @@ Upgrades::isValidForNomination( CheckValidLedgerViewWrapper const& ledgerView) const { if (!timeForUpgrade( - ledgerView.getLedgerHeader().current().scpValue.closeTime)) + getApplyTime(ledgerView.getLedgerHeader().current().scpValue))) { return false; } @@ -710,9 +710,9 @@ Upgrades::isValid(UpgradeType const& upgrade, LedgerUpgradeType& upgradeType, } bool -Upgrades::timeForUpgrade(uint64_t time) const +Upgrades::timeForUpgrade(ApplyTime time) const { - return mParams.mUpgradeTime <= VirtualClock::from_time_t(time); + return mParams.mUpgradeTime <= VirtualClock::from_time_t(time.timePoint()); } void diff --git a/src/herder/Upgrades.h b/src/herder/Upgrades.h index b0bc8feb7b..397a7a73f2 100644 --- a/src/herder/Upgrades.h +++ b/src/herder/Upgrades.h @@ -16,6 +16,7 @@ namespace stellar { class AbstractLedgerTxn; +class ApplyTime; class Config; class Database; struct LedgerHeader; @@ -126,14 +127,14 @@ class Upgrades UpgradeParameters removeUpgrades(std::vector::const_iterator beginUpdates, std::vector::const_iterator endUpdates, - uint64_t time, bool& updated); + ApplyTime closeTime, bool& updated); static void maybeDropAndCreateNew(Database& db); private: UpgradeParameters mParams; - bool timeForUpgrade(uint64_t time) const; + bool timeForUpgrade(ApplyTime time) const; // returns true if upgrade is a valid upgrade step // in which case it also sets lupgrade diff --git a/src/herder/test/HerderTests.cpp b/src/herder/test/HerderTests.cpp index 5d18f1ea63..c84c656ead 100644 --- a/src/herder/test/HerderTests.cpp +++ b/src/herder/test/HerderTests.cpp @@ -26,9 +26,11 @@ #include "crypto/SHA.h" #include "database/Database.h" #include "herder/HerderUtils.h" +#include "ledger/LedgerHeaderUtils.h" #include "ledger/LedgerManager.h" #include "ledger/LedgerTxn.h" #include "ledger/LedgerTxnHeader.h" +#include "lib/json/json.h" #include "main/CommandHandler.h" #include "main/PersistentState.h" #include "overlay/OverlayManager.h" @@ -296,7 +298,8 @@ testTxSet(uint32 protocolVersion) SECTION("valid set") { - auto txSet = makeTxSetFromTransactions(txs, *app, 0, 0).second; + auto txSet = + makeTxSetFromTransactions(txs, *app, ApplyTimeOffset{}).second; REQUIRE(txSet->sizeTxTotal() == nbAccounts); REQUIRE(txSet->checkValidWithResult(*app, 0, 0) == TxSetValidationResult::VALID); @@ -308,7 +311,8 @@ testTxSet(uint32 protocolVersion) { genTx(); } - auto txSet = makeTxSetFromTransactions(txs, *app, 0, 0).second; + auto txSet = + makeTxSetFromTransactions(txs, *app, ApplyTimeOffset{}).second; REQUIRE(txSet->sizeTxTotal() == cfg.TESTING_UPGRADE_MAX_TX_SET_SIZE); REQUIRE(txSet->checkValidWithResult(*app, 0, 0) == TxSetValidationResult::VALID); @@ -333,8 +337,9 @@ testTxSet(uint32 protocolVersion) SECTION("build block") { TxFrameList removed; - auto txSet = - makeTxSetFromTransactions(txs, *app, 0, 0, removed).second; + auto txSet = makeTxSetFromTransactions( + txs, *app, ApplyTimeOffset{}, removed) + .second; REQUIRE(removed.size() == 1); REQUIRE(removed.back() == badTx); REQUIRE(txSet->sizeTxTotal() == nbAccounts); @@ -363,8 +368,9 @@ testTxSet(uint32 protocolVersion) SECTION("build block") { TxFrameList removed; - auto txSet = - makeTxSetFromTransactions(txs, *app, 0, 0, removed).second; + auto txSet = makeTxSetFromTransactions( + txs, *app, ApplyTimeOffset{}, removed) + .second; REQUIRE(removed.size() == 1); REQUIRE(removed.back() == badTx); REQUIRE(txSet->sizeTxTotal() == nbAccounts - 1); @@ -396,8 +402,9 @@ testTxSet(uint32 protocolVersion) SECTION("build block") { TxFrameList removed; - auto txSet = - makeTxSetFromTransactions(txs, *app, 0, 0, removed).second; + auto txSet = makeTxSetFromTransactions( + txs, *app, ApplyTimeOffset{}, removed) + .second; REQUIRE(removed.size() == 1); REQUIRE(removed.back() == badTx); REQUIRE(txSet->sizeTxTotal() == nbAccounts - 1); @@ -428,8 +435,9 @@ testTxSet(uint32 protocolVersion) SECTION("build block") { TxFrameList removed; - auto txSet = - makeTxSetFromTransactions(txs, *app, 0, 0, removed).second; + auto txSet = makeTxSetFromTransactions( + txs, *app, ApplyTimeOffset{}, removed) + .second; REQUIRE(removed.size() == 1); REQUIRE(removed.back() == badTx); REQUIRE(txSet->sizeTxTotal() == nbAccounts - 1); @@ -610,8 +618,8 @@ testTxSetWithFeeBumps(uint32 protocolVersion) SECTION("build block") { TxFrameList invalidTxs; - auto txSet = - makeTxSetFromTransactions({fb1}, *app, 0, 0, invalidTxs); + auto txSet = makeTxSetFromTransactions( + {fb1}, *app, ApplyTimeOffset{}, invalidTxs); compareTxs(invalidTxs, {fb1}); } SECTION("validate block") @@ -639,8 +647,8 @@ testTxSetWithFeeBumps(uint32 protocolVersion) SECTION("build block") { TxFrameList invalidTxs; - auto txSet = makeTxSetFromTransactions({fb1, fb2}, *app, 0, 0, - invalidTxs); + auto txSet = makeTxSetFromTransactions( + {fb1, fb2}, *app, ApplyTimeOffset{}, invalidTxs); // fb1 is rejected compareTxs(invalidTxs, {fb1}); } @@ -667,8 +675,8 @@ testTxSetWithFeeBumps(uint32 protocolVersion) SECTION("build block") { TxFrameList invalidTxs; - auto txSet = makeTxSetFromTransactions({fb1, fb2}, *app, 0, 0, - invalidTxs); + auto txSet = makeTxSetFromTransactions( + {fb1, fb2}, *app, ApplyTimeOffset{}, invalidTxs); compareTxs(invalidTxs, {fb2}); } SECTION("validate block") @@ -696,8 +704,8 @@ testTxSetWithFeeBumps(uint32 protocolVersion) SECTION("build block") { TxFrameList invalidTxs; - auto txSet = makeTxSetFromTransactions({fb1, fb2}, *app, 0, 0, - invalidTxs); + auto txSet = makeTxSetFromTransactions( + {fb1, fb2}, *app, ApplyTimeOffset{}, invalidTxs); compareTxs(invalidTxs, {fb2}); } SECTION("validate block") @@ -732,8 +740,8 @@ testTxSetWithFeeBumps(uint32 protocolVersion) SECTION("build block") { TxFrameList invalidTxs; - auto txSet = makeTxSetFromTransactions({fb1, fb2, fb3}, *app, 0, - 0, invalidTxs); + auto txSet = makeTxSetFromTransactions( + {fb1, fb2, fb3}, *app, ApplyTimeOffset{}, invalidTxs); compareTxs(invalidTxs, {fb1, fb2, fb3}); } SECTION("validate block") @@ -775,8 +783,8 @@ testTxSetWithFeeBumps(uint32 protocolVersion) TxFrameList invalidTxs; SECTION("build block") { - auto txSet = makeTxSetFromTransactions({fb1, fb2}, *app, 0, 0, - invalidTxs); + auto txSet = makeTxSetFromTransactions( + {fb1, fb2}, *app, ApplyTimeOffset{}, invalidTxs); // Both are marked invalid because their combined fees exceed // account2's balance compareTxs(invalidTxs, {fb1, fb2}); @@ -851,8 +859,8 @@ testTxSetWithFeeBumps(uint32 protocolVersion) invalidPerPhase.resize(2); SECTION("build block") { - auto txSet = makeTxSetFromTransactions({{}, {fb1, fb2}}, *app, - 0, 0, invalidPerPhase); + auto txSet = makeTxSetFromTransactions( + {{}, {fb1, fb2}}, *app, ApplyTimeOffset{}, invalidPerPhase); // Both are marked invalid because their combined fees exceed // feeSourceAccount's balance compareTxs(invalidPerPhase[1], {fb1, fb2}); @@ -925,7 +933,8 @@ testTxSetWithFeeBumps(uint32 protocolVersion) SECTION("build block") { auto txSet = makeTxSetFromTransactions( - {{classicFb}, {sorobanFb}}, *app, 0, 0, invalidPerPhase); + {{classicFb}, {sorobanFb}}, *app, ApplyTimeOffset{}, + invalidPerPhase); compareTxs(invalidPerPhase[0], {}); compareTxs(invalidPerPhase[1], {sorobanFb}); } @@ -1108,9 +1117,9 @@ TEST_CASE("txset with PreconditionsV2", "[herder][txset]") auto txInvalid = transactionWithV2Precondition( *app, a1, 1, 100, minSeqAgeCond(minGap + 1)); TxFrameList removed; - auto txSet = - makeTxSetFromTransactions({txInvalid}, *app, 0, 0, removed) - .second; + auto txSet = makeTxSetFromTransactions({txInvalid}, *app, + ApplyTimeOffset{}, removed) + .second; REQUIRE(removed.back() == txInvalid); REQUIRE(txSet->sizeTxTotal() == 0); @@ -1140,14 +1149,14 @@ TEST_CASE("txset with PreconditionsV2", "[herder][txset]") removed.clear(); if (minSeqNumTxIsFeeBump) { - txSet = makeTxSetFromTransactions({fb1, fb2Invalid}, *app, 0, 0, - removed) + txSet = makeTxSetFromTransactions({fb1, fb2Invalid}, *app, + ApplyTimeOffset{}, removed) .second; } else { - txSet = makeTxSetFromTransactions({tx1, tx2Invalid}, *app, 0, 0, - removed) + txSet = makeTxSetFromTransactions({tx1, tx2Invalid}, *app, + ApplyTimeOffset{}, removed) .second; } @@ -1209,8 +1218,8 @@ TEST_CASE("txset with PreconditionsV2", "[herder][txset]") SECTION("build block") { TxFrameList removed; - auto txSet = makeTxSetFromTransactions({tx1, txInvalid}, *app, - 0, 0, removed); + auto txSet = makeTxSetFromTransactions( + {tx1, txInvalid}, *app, ApplyTimeOffset{}, removed); REQUIRE(removed.back() == txInvalid); } SECTION("validate block") @@ -1232,8 +1241,8 @@ TEST_CASE("txset with PreconditionsV2", "[herder][txset]") auto tx2 = transactionWithV2Precondition( *app, a2, 1, 100, ledgerBoundsCond(lclNum + 1, 0)); TxFrameList removed; - auto txSet = - makeTxSetFromTransactions({tx1, tx2}, *app, 0, 0, removed); + auto txSet = makeTxSetFromTransactions({tx1, tx2}, *app, + ApplyTimeOffset{}, removed); REQUIRE(removed.empty()); } SECTION("maxLedger") @@ -1243,8 +1252,8 @@ TEST_CASE("txset with PreconditionsV2", "[herder][txset]") SECTION("build block") { TxFrameList removed; - auto txSet = makeTxSetFromTransactions({tx1, txInvalid}, *app, - 0, 0, removed); + auto txSet = makeTxSetFromTransactions( + {tx1, txInvalid}, *app, ApplyTimeOffset{}, removed); REQUIRE(removed.back() == txInvalid); } SECTION("validate block") @@ -1266,8 +1275,8 @@ TEST_CASE("txset with PreconditionsV2", "[herder][txset]") auto tx2 = transactionWithV2Precondition( *app, a2, 1, 100, ledgerBoundsCond(0, lclNum + 2)); TxFrameList removed; - auto txSet = - makeTxSetFromTransactions({tx1, tx2}, *app, 0, 0, removed); + auto txSet = makeTxSetFromTransactions({tx1, tx2}, *app, + ApplyTimeOffset{}, removed); REQUIRE(removed.empty()); } } @@ -1287,8 +1296,8 @@ TEST_CASE("txset with PreconditionsV2", "[herder][txset]") { tx->addSignature(root->getSecretKey()); TxFrameList removed; - auto txSet = - makeTxSetFromTransactions({tx}, *app, 0, 0, removed); + auto txSet = makeTxSetFromTransactions( + {tx}, *app, ApplyTimeOffset{}, removed); REQUIRE(removed.empty()); } SECTION("fail") @@ -1296,8 +1305,8 @@ TEST_CASE("txset with PreconditionsV2", "[herder][txset]") SECTION("build block") { TxFrameList removed; - auto txSet = - makeTxSetFromTransactions({tx}, *app, 0, 0, removed); + auto txSet = makeTxSetFromTransactions( + {tx}, *app, ApplyTimeOffset{}, removed); REQUIRE(removed.back() == tx); } SECTION("validate block") @@ -1329,8 +1338,8 @@ TEST_CASE("txset with PreconditionsV2", "[herder][txset]") { tx->addSignature(a2.getSecretKey()); TxFrameList removed; - auto txSet = - makeTxSetFromTransactions({tx}, *app, 0, 0, removed); + auto txSet = makeTxSetFromTransactions( + {tx}, *app, ApplyTimeOffset{}, removed); REQUIRE(removed.empty()); } SECTION("fail") @@ -1338,8 +1347,8 @@ TEST_CASE("txset with PreconditionsV2", "[herder][txset]") SECTION("build block") { TxFrameList removed; - auto txSet = - makeTxSetFromTransactions({tx}, *app, 0, 0, removed); + auto txSet = makeTxSetFromTransactions( + {tx}, *app, ApplyTimeOffset{}, removed); REQUIRE(removed.back() == tx); } SECTION("validate block") @@ -1366,8 +1375,8 @@ TEST_CASE("txset with PreconditionsV2", "[herder][txset]") SECTION("build block") { TxFrameList removed; - auto txSet = makeTxSetFromTransactions({txDupeSigner}, *app, 0, - 0, removed); + auto txSet = makeTxSetFromTransactions( + {txDupeSigner}, *app, ApplyTimeOffset{}, removed); REQUIRE(removed.back() == txDupeSigner); REQUIRE(txDupeSigner->getResultCode() == txMALFORMED); } @@ -1389,8 +1398,8 @@ TEST_CASE("txset with PreconditionsV2", "[herder][txset]") auto rootTx = transactionWithV2Precondition(*app, *root, 1, 100, cond); TxFrameList removed; - auto txSet = - makeTxSetFromTransactions({rootTx}, *app, 0, 0, removed); + auto txSet = makeTxSetFromTransactions({rootTx}, *app, + ApplyTimeOffset{}, removed); REQUIRE(removed.empty()); } SECTION("signer overlap with added account signer") @@ -1404,8 +1413,8 @@ TEST_CASE("txset with PreconditionsV2", "[herder][txset]") tx->addSignature(root->getSecretKey()); TxFrameList removed; - auto txSet = - makeTxSetFromTransactions({tx}, *app, 0, 0, removed); + auto txSet = makeTxSetFromTransactions( + {tx}, *app, ApplyTimeOffset{}, removed); REQUIRE(removed.empty()); } SECTION("signature missing") @@ -1413,8 +1422,8 @@ TEST_CASE("txset with PreconditionsV2", "[herder][txset]") SECTION("build block") { TxFrameList removed; - auto txSet = - makeTxSetFromTransactions({tx}, *app, 0, 0, removed); + auto txSet = makeTxSetFromTransactions( + {tx}, *app, ApplyTimeOffset{}, removed); REQUIRE(removed.back() == tx); } SECTION("validate block") @@ -1443,7 +1452,8 @@ TEST_CASE("txset with PreconditionsV2", "[herder][txset]") {*root}, cond); TxFrameList removed; - auto txSet = makeTxSetFromTransactions({tx}, *app, 0, 0, removed); + auto txSet = makeTxSetFromTransactions({tx}, *app, + ApplyTimeOffset{}, removed); REQUIRE(removed.empty()); } } @@ -1505,7 +1515,7 @@ TEST_CASE("txset base fee", "[herder][txset]") txs.push_back(tx); } auto [txSet, applicableTxSet] = - makeTxSetFromTransactions(txs, *app, 0, 0); + makeTxSetFromTransactions(txs, *app, ApplyTimeOffset{}); REQUIRE(applicableTxSet->size(lhCopy) == lim); REQUIRE(extraAccounts >= 2); @@ -1758,8 +1768,8 @@ TEST_CASE("tx set hits overlay byte limit during construction", phases = PerPhaseTransactionList{txs, {}}; } - auto [txSet, applicableTxSet] = - makeTxSetFromTransactions(phases, *app, 0, 0, invalidPhases); + auto [txSet, applicableTxSet] = makeTxSetFromTransactions( + phases, *app, ApplyTimeOffset{}, invalidPhases); REQUIRE(txSet->encodedSize() <= MAX_MESSAGE_SIZE); REQUIRE(invalidPhases[static_cast(phase)].empty()); @@ -1806,8 +1816,9 @@ TEST_CASE("surge pricing", "[herder][txset][soroban]") auto tx = makeMultiPayment(destAccount, *root, 1, 100, 0, 1); TxFrameList invalidTxs; - auto txSet = - makeTxSetFromTransactions({tx}, *app, 0, 0, invalidTxs).second; + auto txSet = makeTxSetFromTransactions( + {tx}, *app, ApplyTimeOffset{}, invalidTxs) + .second; // Transaction is valid, but trimmed by surge pricing. REQUIRE(invalidTxs.empty()); @@ -1835,8 +1846,8 @@ TEST_CASE("surge pricing", "[herder][txset][soroban]") PerPhaseTransactionList invalidTxs; invalidTxs.resize(static_cast(TxSetPhase::PHASE_COUNT)); auto txSet = makeTxSetFromTransactions( - PerPhaseTransactionList{{}, {sorobanTx}}, *app, 0, - 0, invalidTxs) + PerPhaseTransactionList{{}, {sorobanTx}}, *app, + ApplyTimeOffset{}, invalidTxs) .second; // Transaction is valid, but trimmed by surge pricing. @@ -1951,7 +1962,7 @@ TEST_CASE("surge pricing", "[herder][txset][soroban]") auto txSet = makeTxSetFromTransactions( PerPhaseTransactionList{{tx}, {invalidSoroban}}, - *app, 0, 0, invalidPhases) + *app, ApplyTimeOffset{}, invalidPhases) .second; // Soroban tx is rejected @@ -2002,7 +2013,7 @@ TEST_CASE("surge pricing", "[herder][txset][soroban]") auto txSet = makeTxSetFromTransactions( PerPhaseTransactionList{{tx}, {soroban1, soroban2}}, - *app, 0, 0, invalidPhases) + *app, ApplyTimeOffset{}, invalidPhases) .second; // Both txs are valid individually, but only one fits REQUIRE(txSet->sizeTxTotal() == 2); @@ -2037,7 +2048,7 @@ TEST_CASE("surge pricing", "[herder][txset][soroban]") invalidPhases.resize(static_cast(TxSetPhase::PHASE_COUNT)); auto txSet = makeTxSetFromTransactions( PerPhaseTransactionList{{tx}, {sorobanTx}}, *app, - 0, 0, invalidPhases) + ApplyTimeOffset{}, invalidPhases) .second; // Everything fits @@ -2051,7 +2062,7 @@ TEST_CASE("surge pricing", "[herder][txset][soroban]") invalidPhases.resize(1); REQUIRE_THROWS_AS(makeTxSetFromTransactions( PerPhaseTransactionList{{tx, sorobanTx}}, - *app, 0, 0, invalidPhases), + *app, ApplyTimeOffset{}, invalidPhases), std::runtime_error); } SECTION("soroban surge pricing, classic unaffected") @@ -2064,7 +2075,7 @@ TEST_CASE("surge pricing", "[herder][txset][soroban]") auto txSet = makeTxSetFromTransactions( PerPhaseTransactionList{ {tx}, {sorobanTx, sorobanTxHighFee}}, - *app, 0, 0, invalidPhases) + *app, ApplyTimeOffset{}, invalidPhases) .second; REQUIRE(std::all_of(invalidPhases.begin(), invalidPhases.end(), @@ -2108,7 +2119,7 @@ TEST_CASE("surge pricing", "[herder][txset][soroban]") PerPhaseTransactionList{ {tx}, {sorobanTxHighFee, smallSorobanLowFee, sorobanTx}}, - *app, 0, 0, invalidPhases) + *app, ApplyTimeOffset{}, invalidPhases) .second; REQUIRE(std::all_of(invalidPhases.begin(), invalidPhases.end(), @@ -2140,7 +2151,7 @@ TEST_CASE("surge pricing", "[herder][txset][soroban]") auto txSet = makeTxSetFromTransactions( PerPhaseTransactionList{ {tx}, generateTxs(accounts, conf)}, - *app, 0, 0, invalidPhases) + *app, ApplyTimeOffset{}, invalidPhases) .second; REQUIRE(std::all_of( @@ -2213,7 +2224,8 @@ TEST_CASE("surge pricing with DEX separation", "[herder][txset]") size_t expectedTxsC, size_t expectedTxsD, int64_t expectedNonDexBaseFee, int64_t expectedDexBaseFee) { - auto txSet = makeTxSetFromTransactions(txs, *app, 0, 0).second; + auto txSet = + makeTxSetFromTransactions(txs, *app, ApplyTimeOffset{}).second; size_t cntA = 0, cntB = 0, cntC = 0, cntD = 0; auto const& phases = txSet->getPhasesInApplyOrder(); @@ -2423,7 +2435,8 @@ TEST_CASE("surge pricing with DEX separation holds invariants", for (int iter = 0; iter < 50; ++iter) { auto txs = genTxs(txCountDistr(Catch::rng())); - auto txSet = makeTxSetFromTransactions(txs, *app, 0, 0).second; + auto txSet = + makeTxSetFromTransactions(txs, *app, ApplyTimeOffset{}).second; auto const& phases = txSet->getPhasesInApplyOrder(); std::array opsCounts{}; @@ -2699,16 +2712,16 @@ testSCPDriver(uint32 protocolVersion, uint32_t maxTxSetSize, size_t expectedOps) auto const& lcl = app->getLedgerManager().getLastClosedLedgerHeader(); using TxPair = std::pair; auto makeTxUpgradePair = - [&](HerderImpl& herder, TxSetXDRFrameConstPtr txSet, uint64_t closeTime, - SVUpgrades const& upgrades) { - StellarValue sv = - herder.makeStellarValue(txSet->getContentsHash(), closeTime, - upgrades, root->getSecretKey()); + [&](HerderImpl& herder, TxSetXDRFrameConstPtr txSet, + TimePoint closeTime, SVUpgrades const& upgrades) { + StellarValue sv = herder.makeStellarValue( + txSet->getContentsHash(), makeConsensusTime(closeTime), + upgrades, root->getSecretKey()); auto v = xdr::xdr_to_opaque(sv); return TxPair{v, txSet}; }; auto makeTxPair = [&](HerderImpl& herder, TxSetXDRFrameConstPtr txSet, - uint64_t closeTime) { + TimePoint closeTime) { return makeTxUpgradePair(herder, txSet, closeTime, emptyUpgradeSteps); }; auto makeEnvelope = [&s](HerderImpl& herder, TxPair const& p, Hash qSetHash, @@ -2743,7 +2756,7 @@ testSCPDriver(uint32 protocolVersion, uint32_t maxTxSetSize, size_t expectedOps) feeMulti); }); - return makeTxSetFromTransactions(txs, *app, 0, 0); + return makeTxSetFromTransactions(txs, *app, ApplyTimeOffset{}); }; SECTION("combineCandidates") @@ -2843,7 +2856,7 @@ testSCPDriver(uint32 protocolVersion, uint32_t maxTxSetSize, size_t expectedOps) // Compare the returned StellarValue's contents with the // expected ones that we computed above. - REQUIRE(sv.ext.v() == STELLAR_VALUE_SIGNED); + REQUIRE(isSignedStellarValue(sv)); REQUIRE(sv.txSetHash == expectedHash); REQUIRE(sv.closeTime == expectedCloseTime); REQUIRE(sv.upgrades == expectedUpgradeVector); @@ -2872,8 +2885,30 @@ testSCPDriver(uint32 protocolVersion, uint32_t maxTxSetSize, size_t expectedOps) auto v = herder.getHerderSCPDriver().combineCandidates(1, candidates); StellarValue sv; xdr::xdr_from_opaque(v->getValue(), sv); - REQUIRE(sv.ext.v() == STELLAR_VALUE_SIGNED); + REQUIRE(isSignedStellarValue(sv)); REQUIRE(sv.txSetHash == txSetL2->getContentsHash()); + +#ifdef MS_CLOSE_TIME + if (protocolVersionStartsFrom(protocolVersion, + MS_CLOSE_TIME_PROTOCOL_VERSION)) + { + // Test that the winning candidate keeps its full ms close time + // along with the redundant whole-second close time. + auto txSetL3 = makeTransactions(maxTxSetSize, 1, 2000).first; + StellarValue msVal = herder.makeStellarValue( + txSetL3->getContentsHash(), makeConsensusTime(20, 7), + emptyUpgradeSteps, root->getSecretKey()); + addToCandidates(TxPair{xdr::xdr_to_opaque(msVal), txSetL3}); + auto v2 = + herder.getHerderSCPDriver().combineCandidates(1, candidates); + StellarValue sv2; + xdr::xdr_from_opaque(v2->getValue(), sv2); + REQUIRE(sv2.ext.v() == STELLAR_VALUE_SIGNED_MS); + REQUIRE(sv2.closeTime == 20); + REQUIRE(getConsensusTime(sv2).milliseconds() == 20007); + REQUIRE(sv2.txSetHash == txSetL3->getContentsHash()); + } +#endif // MS_CLOSE_TIME } SECTION("validateValue signatures") @@ -2928,17 +2963,17 @@ testSCPDriver(uint32 protocolVersion, uint32_t maxTxSetSize, size_t expectedOps) // mutate in a few ways SECTION("missing signature") { - sv.ext.lcValueSignature().signature.clear(); + getLcValueSignature(sv).signature.clear(); checkInvalid(sv, isNomination); } SECTION("wrong signature") { - sv.ext.lcValueSignature().signature[0] ^= 1; + getLcValueSignature(sv).signature[0] ^= 1; checkInvalid(sv, isNomination); } SECTION("wrong signature 2") { - sv.ext.lcValueSignature().nodeID.ed25519()[0] ^= 1; + getLcValueSignature(sv).nodeID.ed25519()[0] ^= 1; checkInvalid(sv, isNomination); } } @@ -2974,8 +3009,8 @@ testSCPDriver(uint32 protocolVersion, uint32_t maxTxSetSize, size_t expectedOps) // Create signed stellar value with empty tx set hash and // validate. StellarValue sv = herder.makeStellarValue( - Herder::EMPTY_TX_SET_HASH, ct, emptyUpgradeSteps, - root->getSecretKey()); + Herder::EMPTY_TX_SET_HASH, makeConsensusTime(ct), + emptyUpgradeSteps, root->getSecretKey()); checkInvalidMismatch(sv); } @@ -3026,63 +3061,86 @@ testSCPDriver(uint32 protocolVersion, uint32_t maxTxSetSize, size_t expectedOps) TimePoint const nextCloseTime, bool const expectValid) { REQUIRE(nextCloseTime > lcl.header.scpValue.closeTime); - // Build a transaction set containing one transaction (which - // could be any transaction that is valid in all ways aside from - // its time bounds) with the given minTime and maxTime. - auto tx = makeMultiPayment(*root, *root, 10, 1000, 0, 100); - setMinTime(tx, minTime); - setMaxTime(tx, maxTime); - auto& sig = tx->getMutableEnvelope().type() == ENVELOPE_TYPE_TX_V0 - ? tx->getMutableEnvelope().v0().signatures - : tx->getMutableEnvelope().v1().signatures; - sig.clear(); - tx->addSignature(root->getSecretKey()); - auto [txSet, applicableTxSet] = - testtxset::makeNonValidatedTxSetBasedOnLedgerVersion( - {tx}, *app, - app->getLedgerManager().getLastClosedLedgerHeader().hash); - - // Build a StellarValue containing the transaction set we just - // built and the given next closeTime. - auto val = makeTxPair(herder, txSet, nextCloseTime); - auto const seq = herder.trackingConsensusLedgerIndex() + 1; - auto envelope = makeEnvelope(herder, val, {}, seq, true); - REQUIRE(herder.recvSCPEnvelope(envelope) == - Herder::ENVELOPE_STATUS_FETCHING); - REQUIRE(herder.recvTxSet(txSet->getContentsHash(), txSet)); - - // Validate the StellarValue. - SCPDriver::ValidationLevel expectedValidationLevel = - SCPDriver::kFullyValidatedValue; - if (!expectValid) + // Each combination runs both with a whole-second close time and, + // once ms close times are active, with a random nonzero ms + // remainder on it. Time bounds enforcement rounds to whole seconds, + // so execution should be identical. + for (uint32_t ctMs : {0u, rand_uniform(1, 999)}) { - if (scp.protocolAllowsEmptyTxSetValues()) + if (ctMs != 0 && !scp.protocolUsesMsCloseTime()) { - // If CAP-0083 is active, then this StellarValue is - // considered structurally valid because only the tx set is - // invalid. - expectedValidationLevel = - SCPDriver::kStructurallyValidValue; + continue; } - else + SECTION(ctMs == 0 ? "whole-second close time" : "ms close time") { - expectedValidationLevel = SCPDriver::kInvalidValue; + // Build a transaction set containing one transaction + // (which could be any transaction that is valid in all + // ways aside from its time bounds) with the given minTime + // and maxTime. + auto tx = makeMultiPayment(*root, *root, 10, 1000, 0, 100); + setMinTime(tx, minTime); + setMaxTime(tx, maxTime); + auto& sig = + tx->getMutableEnvelope().type() == ENVELOPE_TYPE_TX_V0 + ? tx->getMutableEnvelope().v0().signatures + : tx->getMutableEnvelope().v1().signatures; + sig.clear(); + tx->addSignature(root->getSecretKey()); + auto [txSet, applicableTxSet] = + testtxset::makeNonValidatedTxSetBasedOnLedgerVersion( + {tx}, *app, + app->getLedgerManager() + .getLastClosedLedgerHeader() + .hash); + + // Build a StellarValue containing the transaction set we + // just built and the given next closeTime. + StellarValue sv = herder.makeStellarValue( + txSet->getContentsHash(), + makeConsensusTime(nextCloseTime, ctMs), + emptyUpgradeSteps, root->getSecretKey()); + auto val = TxPair{xdr::xdr_to_opaque(sv), txSet}; + auto const seq = herder.trackingConsensusLedgerIndex() + 1; + auto envelope = makeEnvelope(herder, val, {}, seq, true); + REQUIRE(herder.recvSCPEnvelope(envelope) == + Herder::ENVELOPE_STATUS_FETCHING); + REQUIRE(herder.recvTxSet(txSet->getContentsHash(), txSet)); + + // Validate the StellarValue. + SCPDriver::ValidationLevel expectedValidationLevel = + SCPDriver::kFullyValidatedValue; + if (!expectValid) + { + if (scp.protocolAllowsEmptyTxSetValues()) + { + // If CAP-0083 is active, then this StellarValue + // is considered structurally valid because only + // the tx set is invalid. + expectedValidationLevel = + SCPDriver::kStructurallyValidValue; + } + else + { + expectedValidationLevel = SCPDriver::kInvalidValue; + } + } + REQUIRE(scp.validateValue(seq, val.first, true) == + expectedValidationLevel); + + // Confirm that getTxTrimList() as used by + // makeTxSetFromTransactions() trims the transaction if + // and only if we expect it to be invalid. + auto closeTimeOffset = nextCloseTime - lclCloseTime; + TxFrameList removed; + UnorderedMap accountFeeMap; + TxSetUtils::trimInvalid( + applicableTxSet->getPhase(TxSetPhase::CLASSIC) + .getSequentialTxs(), + *app, accountFeeMap, closeTimeOffset, closeTimeOffset, + removed); + REQUIRE(removed.size() == (expectValid ? 0 : 1)); } } - REQUIRE(scp.validateValue(seq, val.first, true) == - expectedValidationLevel); - - // Confirm that getTxTrimList() as used by - // makeTxSetFromTransactions() trims the transaction if - // and only if we expect it to be invalid. - auto closeTimeOffset = nextCloseTime - lclCloseTime; - TxFrameList removed; - UnorderedMap accountFeeMap; - TxSetUtils::trimInvalid( - applicableTxSet->getPhase(TxSetPhase::CLASSIC) - .getSequentialTxs(), - *app, accountFeeMap, closeTimeOffset, closeTimeOffset, removed); - REQUIRE(removed.size() == (expectValid ? 0 : 1)); }; auto t1 = lclCloseTime + 1, t2 = lclCloseTime + 2; @@ -3340,6 +3398,340 @@ testSCPDriver(uint32 protocolVersion, uint32_t maxTxSetSize, size_t expectedOps) : SCPDriver::kInvalidValue)); } } + +#ifdef MS_CLOSE_TIME + SECTION("validateValue ms close times") + { + auto& herder = static_cast(app->getHerder()); + auto& scp = herder.getHerderSCPDriver(); + auto seq = herder.trackingConsensusLedgerIndex() + 1; + auto ct = app->timeNow() + 1; + + auto txSet0 = makeTransactions(0, 1, 100).first; + { + // make sure that txSet0 is loaded + auto p = makeTxPair(herder, txSet0, ct); + auto envelope = makeEnvelope(herder, p, {}, seq, true); + REQUIRE(herder.recvSCPEnvelope(envelope) == + Herder::ENVELOPE_STATUS_FETCHING); + REQUIRE(herder.recvTxSet(txSet0->getContentsHash(), txSet0)); + } + + auto check = [&](StellarValue const& sv, bool expectValid) { + auto v = xdr::xdr_to_opaque(sv); + auto res = scp.validateValue(seq, v, /*nomination=*/true); + if (expectValid) + { + REQUIRE(res == SCPDriver::kFullyValidatedValue); + } + else + { + REQUIRE(res == SCPDriver::kInvalidValue); + } + }; + + if (protocolVersionStartsFrom(protocolVersion, + MS_CLOSE_TIME_PROTOCOL_VERSION)) + { + // Craft a legacy (pre-ms) STELLAR_VALUE_SIGNED value with a + // valid signature + auto makeLegacySignedValue = [&](TimePoint closeTime) { + StellarValue sv; + sv.ext.v(STELLAR_VALUE_SIGNED); + sv.txSetHash = txSet0->getContentsHash(); + sv.closeTime = closeTime; + sv.upgrades = emptyUpgradeSteps; + sv.ext.lcValueSignature().nodeID = s.getPublicKey(); + sv.ext.lcValueSignature().signature = s.sign(xdr::xdr_to_opaque( + app->getNetworkID(), ENVELOPE_TYPE_SCPVALUE, sv.txSetHash, + sv.closeTime)); + return sv; + }; + + SECTION("ms value is valid and carries its full ms close time") + { + StellarValue sv = herder.makeStellarValue( + txSet0->getContentsHash(), makeConsensusTime(ct, 123), + emptyUpgradeSteps, s); + REQUIRE(sv.ext.v() == STELLAR_VALUE_SIGNED_MS); + // closeTimeMs is the full close time; closeTime is redundant + // with it, rounded down to the whole second + REQUIRE(getConsensusTime(sv).milliseconds() == ct * 1000 + 123); + REQUIRE(sv.closeTime == ct); + check(sv, true); + } + SECTION("legacy signed value rejected for ratifiable slots") + { + check(makeLegacySignedValue(ct), false); + } + SECTION("legacy values for past slots") + { + // Close some ledgers so that past slots exist. Values for + // slots at or before the LCL may predate the ms upgrade, so + // the legacy arm stays relayable for them, but only with a + // close time consistent with what was externalized + closeLedgerOn( + *app, app->getLedgerManager().getLastClosedLedgerNum() + 1, + ct); + closeLedgerOn( + *app, app->getLedgerManager().getLastClosedLedgerNum() + 1, + ct + 1); + auto const pastSlot = + app->getLedgerManager().getLastClosedLedgerNum() - 1; + // Strictly-older close time for an older slot: relayable + REQUIRE(scp.validateValue( + pastSlot, + xdr::xdr_to_opaque(makeLegacySignedValue(ct)), + /*nomination=*/false) == + SCPDriver::kMaybeValidNotCurrentValue); + // Newer-than-externalized close time for an older slot: + // rejected + REQUIRE(scp.validateValue( + pastSlot, + xdr::xdr_to_opaque(makeLegacySignedValue(ct + 60)), + /*nomination=*/false) == SCPDriver::kInvalidValue); + } + SECTION("legacy signed value rejected for future slots") + { + // Once we upgrade to MS block times, reject all future slots + // with legacy values. + herder.lostSync(); + REQUIRE(scp.validateValue( + seq + 1, + xdr::xdr_to_opaque(makeLegacySignedValue(ct)), + /*nomination=*/false) == SCPDriver::kInvalidValue); + } + SECTION("legacy empty-tx-set value rejected for ratifiable slots") + { + auto const legacyEmpty = scp.makeEmptyTxSetValueFromValue( + xdr::xdr_to_opaque(makeLegacySignedValue(ct))); + StellarValue esv; + xdr::xdr_from_opaque(legacyEmpty, esv); + REQUIRE(esv.ext.v() == STELLAR_VALUE_EMPTY_TX_SET); + REQUIRE(scp.validateValue(seq, legacyEmpty, + /*nomination=*/false) == + SCPDriver::kInvalidValue); + } + SECTION("closeTime inconsistent with closeTimeMs") + { + // closeTime must be closeTimeMs rounded down to the whole + // second. Re-sign each inconsistent value so that only the + // consistency check (not the signature check) can reject it + auto reSign = [&](StellarValue& sv) { + sv.ext.signedMsValue().lcValueSignature.signature = + s.sign(xdr::xdr_to_opaque( + app->getNetworkID(), ENVELOPE_TYPE_SCPVALUE, + sv.txSetHash, sv.closeTime, + getConsensusTime(sv).milliseconds())); + }; + SECTION("closeTime behind closeTimeMs") + { + StellarValue sv = herder.makeStellarValue( + txSet0->getContentsHash(), makeConsensusTime(ct, 999), + emptyUpgradeSteps, s); + sv.ext.signedMsValue().closeTimeMs += 1; + reSign(sv); + check(sv, false); + // Fixing up closeTime makes the value valid again + sv.closeTime = ct + 1; + reSign(sv); + check(sv, true); + } + SECTION("closeTime ahead of closeTimeMs") + { + StellarValue sv = herder.makeStellarValue( + txSet0->getContentsHash(), makeConsensusTime(ct, 500), + emptyUpgradeSteps, s); + sv.closeTime = ct + 1; + reSign(sv); + check(sv, false); + } + SECTION("closeTimeMs holding only the ms remainder") + { + StellarValue sv = herder.makeStellarValue( + txSet0->getContentsHash(), makeConsensusTime(ct, 500), + emptyUpgradeSteps, s); + // closeTimeMs is the full close time, so a value carrying + // just the sub-second remainder is inconsistent + sv.ext.signedMsValue().closeTimeMs = 500; + reSign(sv); + check(sv, false); + } + } + SECTION("tampered ms close time breaks the value signature") + { + StellarValue sv = herder.makeStellarValue( + txSet0->getContentsHash(), makeConsensusTime(ct, 5), + emptyUpgradeSteps, s); + // Stay within the same whole second so that only the + // signature check can reject the value + sv.ext.signedMsValue().closeTimeMs += 1; + check(sv, false); + } + SECTION("sub-second ordering against the last close time") + { + auto lclCt = app->getLedgerManager() + .getLastClosedLedgerHeader() + .header.scpValue; + REQUIRE(getConsensusTime(lclCt).isWholeSecond()); + // Same whole second as the LCL, ms strictly greater: valid + StellarValue sv = herder.makeStellarValue( + txSet0->getContentsHash(), + makeConsensusTime(lclCt.closeTime, 1), emptyUpgradeSteps, + s); + check(sv, true); + // Exactly the LCL close time: too old + StellarValue svEq = herder.makeStellarValue( + txSet0->getContentsHash(), + makeConsensusTime(lclCt.closeTime), emptyUpgradeSteps, s); + check(svEq, false); + } + SECTION("tx time bounds at a zero whole-second offset") + { + // A sub-second ledger closes within the same whole second as + // the LCL, so the tx-set validation offsets (which stay at + // second resolution per the time-bounds contract) are 0. + // Close a ledger at a nonzero whole second first: the genesis + // close time is 0, and a maxTime of 0 means "no upper bound", + // which would make the expiring-tx case below trivially correct + closeLedgerOn( + *app, app->getLedgerManager().getLastClosedLedgerNum() + 1, + ct); + auto const lclCt = app->getLedgerManager() + .getLastClosedLedgerHeader() + .header.scpValue.closeTime; + REQUIRE(lclCt == ct); + auto const zSeq = herder.trackingConsensusLedgerIndex() + 1; + auto testTxBoundsAtZeroOffset = [&](TimePoint const minTime, + TimePoint const maxTime, + bool const expectValid) { + auto tx = makeMultiPayment(*root, *root, 10, 1000, 0, 100); + setMinTime(tx, minTime); + setMaxTime(tx, maxTime); + auto& sig = + tx->getMutableEnvelope().type() == ENVELOPE_TYPE_TX_V0 + ? tx->getMutableEnvelope().v0().signatures + : tx->getMutableEnvelope().v1().signatures; + sig.clear(); + tx->addSignature(root->getSecretKey()); + auto [txSet, applicableTxSet] = + testtxset::makeNonValidatedTxSetBasedOnLedgerVersion( + {tx}, *app, + app->getLedgerManager() + .getLastClosedLedgerHeader() + .hash); + + // The value closes a random number of milliseconds into + // the LCL's whole second (any nonzero ms keeps the close + // time strictly ahead of the LCL) + StellarValue msv = herder.makeStellarValue( + txSet->getContentsHash(), + makeConsensusTime(lclCt, + rand_uniform(1, 999)), + emptyUpgradeSteps, s); + auto val = TxPair{xdr::xdr_to_opaque(msv), txSet}; + auto envelope = makeEnvelope(herder, val, {}, zSeq, true); + REQUIRE(herder.recvSCPEnvelope(envelope) == + Herder::ENVELOPE_STATUS_FETCHING); + REQUIRE(herder.recvTxSet(txSet->getContentsHash(), txSet)); + + // Empty-tx-set values are always allowed at the ms + // protocol, so an invalid tx set downgrades the value to + // structurally-valid rather than invalid + auto const expected = + expectValid ? SCPDriver::kFullyValidatedValue + : SCPDriver::kStructurallyValidValue; + REQUIRE(scp.validateValue(zSeq, val.first, true) == + expected); + + TxFrameList removed; + UnorderedMap accountFeeMap; + TxSetUtils::trimInvalid( + applicableTxSet->getPhase(TxSetPhase::CLASSIC) + .getSequentialTxs(), + *app, accountFeeMap, 0, 0, removed); + REQUIRE(removed.size() == (expectValid ? 0 : 1)); + }; + + SECTION("tx expiring at the LCL's second stays includable") + { + // Suppose a transaction expires at second X. N-1 closes at + // X.0, N closes at X.1. Confirm the transaction is valid in + // both N - 1 and N. + testTxBoundsAtZeroOffset(0, lclCt, true); + } + SECTION("tx valid only from the next second is excluded") + { + // Suppose a transaction becomes valid at second X + 1. N-1 + // closes at X.0, N closes at X.1. Confirm the transaction + // is invalid in both N - 1 and N. + testTxBoundsAtZeroOffset(lclCt + 1, 0, false); + } + } + SECTION("future slip bound includes milliseconds") + { + auto const maxCloseTime = ConsensusTime::fromSystemTime( + app->getClock().system_now() + + Herder::MAX_TIME_SLIP_SECONDS, + protocolVersion); + check(herder.makeStellarValue(txSet0->getContentsHash(), + maxCloseTime, emptyUpgradeSteps, + s), + true); + check( + herder.makeStellarValue(txSet0->getContentsHash(), + maxCloseTime.next(protocolVersion), + emptyUpgradeSteps, s), + false); + } + SECTION("empty-tx-set conversion preserves ms and signature") + { + StellarValue sv = herder.makeStellarValue( + txSet0->getContentsHash(), makeConsensusTime(ct, 42), + emptyUpgradeSteps, s); + auto emptyVal = + scp.makeEmptyTxSetValueFromValue(xdr::xdr_to_opaque(sv)); + StellarValue esv; + xdr::xdr_from_opaque(emptyVal, esv); + REQUIRE(esv.ext.v() == STELLAR_VALUE_EMPTY_TX_SET_MS); + REQUIRE(esv.closeTime == ct); + REQUIRE(getConsensusTime(esv).milliseconds() == ct * 1000 + 42); + REQUIRE(esv.txSetHash == Herder::EMPTY_TX_SET_HASH); + REQUIRE(getProposedTxSetHash(esv) == txSet0->getContentsHash()); + REQUIRE(herder.verifyStellarValueSignature(esv)); + } + } + else + { + // Before the ms protocol activates, ms values are rejected + // outright for ratifiable slots. The value is correctly signed + // over the ms-inclusive payload so that only the protocol gate + // can be the cause of rejection + StellarValue msv; + msv.ext.v(STELLAR_VALUE_SIGNED_MS); + msv.txSetHash = txSet0->getContentsHash(); + msv.closeTime = ct; + msv.ext.signedMsValue().closeTimeMs = ct * 1000 + 1; + auto& sig = msv.ext.signedMsValue().lcValueSignature; + sig.nodeID = s.getPublicKey(); + sig.signature = s.sign(xdr::xdr_to_opaque( + app->getNetworkID(), ENVELOPE_TYPE_SCPVALUE, msv.txSetHash, + msv.closeTime, getConsensusTime(msv).milliseconds())); + check(msv, false); + + // For slots beyond lcl+1 the governing protocol is unknowable to + // an out-of-sync node (the network may have upgraded ahead of + // it), so the same value must stay relayable: this is how a node + // that fell further behind than its peers remember slots ever + // externalizes the network's current slots, which is what + // triggers catchup + herder.lostSync(); + REQUIRE(scp.validateValue(seq + 1, xdr::xdr_to_opaque(msv), + /*nomination=*/false) == + SCPDriver::kMaybeValidNotCurrentValue); + } + } +#endif // MS_CLOSE_TIME } TEST_CASE("SCP Driver", "[herder][acceptance]") @@ -3369,7 +3761,7 @@ TEST_CASE("combineCandidates with mismatched previousLedgerHash candidate", auto const& lcl = app->getLedgerManager().getLastClosedLedgerHeader(); uint32_t const ver = lcl.header.ledgerVersion; - uint64_t const closeTime = lcl.header.scpValue.closeTime + 1; + TimePoint const closeTime = lcl.header.scpValue.closeTime + 1; uint64_t const slotIndex = lcl.header.ledgerSeq + 1; // Two structurally-valid empty tx sets that differ only in @@ -3383,9 +3775,9 @@ TEST_CASE("combineCandidates with mismatched previousLedgerHash candidate", // a candidate value referencing it. auto addCandidate = [&](TxSetXDRFrameConstPtr const& txSet) { pe.addTxSet(txSet->getContentsHash(), slotIndex, txSet); - StellarValue sv = - herder.makeStellarValue(txSet->getContentsHash(), closeTime, - emptyUpgradeSteps, cfg.NODE_SEED); + StellarValue sv = herder.makeStellarValue( + txSet->getContentsHash(), makeConsensusTime(closeTime), + emptyUpgradeSteps, cfg.NODE_SEED); candidates.emplace(driver.wrapValue(xdr::xdr_to_opaque(sv))); }; auto combinedTxSetHash = [&]() { @@ -5947,8 +6339,8 @@ TEST_CASE("ledger state update flow with parallel apply", "[herder][parallel]") // close this ledger StellarValue sv = node->getHerder().makeStellarValue( - txSet->getContentsHash(), 1, emptyUpgradeSteps, - node->getConfig().NODE_SEED); + txSet->getContentsHash(), makeConsensusTime(1), + emptyUpgradeSteps, node->getConfig().NODE_SEED); LedgerCloseData ledgerData(lcl + 1, txSet, sv); lm.applyLedger(ledgerData); @@ -6098,16 +6490,17 @@ TEST_CASE("processing of next slot happens after apply", "[herder]") auto invalidTxSet = TxSetXDRFrame::makeEmpty(bogusLcl); auto invalidTxSetHash = invalidTxSet->getContentsHash(); - uint64_t cLastCloseTime = C->getLedgerManager() - .getLastClosedLedgerHeader() - .header.scpValue.closeTime; + TimePoint cLastCloseTime = C->getLedgerManager() + .getLastClosedLedgerHeader() + .header.scpValue.closeTime; // Pick a close time slightly above both C's LCL close time and C's // current virtual clock, so the envelope passes the Herder close-time // filter (must be > lastCloseTime and within MAX_TIME_SLIP_SECONDS of // now). - uint64_t invalidCloseTime = std::max(cLastCloseTime, C->timeNow()) + 1; + TimePoint invalidCloseTime = std::max(cLastCloseTime, C->timeNow()) + 1; StellarValue invalidValue = herderC.makeStellarValue( - invalidTxSetHash, invalidCloseTime, emptyUpgradeSteps, keyA); + invalidTxSetHash, makeConsensusTime(invalidCloseTime), + emptyUpgradeSteps, keyA); SCPEnvelope invalidEnv{}; invalidEnv.statement.slotIndex = invalidSlot; @@ -6313,15 +6706,15 @@ externalize(SecretKey const& sk, LedgerManager& lm, HerderImpl& herder, txsPhases.emplace_back(sorobanTxs); auto [txSet, applicableTxSet] = - makeTxSetFromTransactions(txsPhases, app, 0, 0); + makeTxSetFromTransactions(txsPhases, app, ApplyTimeOffset{}); herder.getPendingEnvelopes().putTxSet(txSet->getContentsHash(), ledgerSeq, txSet); auto lastCloseTime = lcl.header.scpValue.closeTime; - StellarValue sv = - herder.makeStellarValue(txSet->getContentsHash(), lastCloseTime, - xdr::xvector{}, sk); + StellarValue sv = herder.makeStellarValue( + txSet->getContentsHash(), makeConsensusTime(lastCloseTime), + xdr::xvector{}, sk); herder.getHerderSCPDriver().valueExternalized(ledgerSeq, xdr::xdr_to_opaque(sv)); // With background apply, crank until the ledger is fully applied @@ -6370,7 +6763,8 @@ TEST_CASE("do not flood invalid transactions", "[herder]") auto const& lhhe = lm.getLastClosedLedgerHeader(); auto txs = tq.getTransactions(lhhe.header); - auto [_, applicableTxSet] = makeTxSetFromTransactions(txs, *app, 0, 0); + auto [_, applicableTxSet] = + makeTxSetFromTransactions(txs, *app, ApplyTimeOffset{}); REQUIRE(applicableTxSet->sizeTxTotal() == 1); REQUIRE((*applicableTxSet->getPhase(TxSetPhase::CLASSIC).begin()) ->getContentsHash() == tx1a->getContentsHash()); @@ -7168,7 +7562,7 @@ TEST_CASE("slot herder policy", "[herder]") // sign values with the same secret key StellarValue sv = herder.makeStellarValue( - txSet->getContentsHash(), (TimePoint)slotIndex, + txSet->getContentsHash(), makeConsensusTime((TimePoint)slotIndex), xdr::xvector{}, v1SecretKey); ext.commit.counter = 1; ext.commit.value = xdr::xdr_to_opaque(sv); @@ -7352,11 +7746,14 @@ TEST_CASE("SCP message capture from previous ledger", "[herder]") validatorBKey.getPublicKey()); simulation->startAllNodes(); - // Crank A and B until they're on ledger 2 + // Crank A and B until they're on ledger 2. crankUntil only samples its + // predicate once per virtual second, and A and B keep closing ledgers on + // their own, so wait for "at least" rather than "exactly" a ledger: an + // exact match can be skipped over depending on the leader schedule. simulation->crankUntil( [&]() { - return A->getLedgerManager().getLastClosedLedgerNum() == 2 && - B->getLedgerManager().getLastClosedLedgerNum() == 2; + return A->getLedgerManager().getLastClosedLedgerNum() >= 2 && + B->getLedgerManager().getLastClosedLedgerNum() >= 2; }, 4 * simulation->getExpectedLedgerCloseTime(), false); @@ -7441,11 +7838,11 @@ TEST_CASE("SCP message capture from previous ledger", "[herder]") B->getHerder().recvSCPEnvelope(env); } - // Crank A and B until they're on ledger 3 + // Crank A and B until they're on at least ledger 3 simulation->crankUntil( [&]() { - return A->getLedgerManager().getLastClosedLedgerNum() == 3 && - B->getLedgerManager().getLastClosedLedgerNum() == 3; + return A->getLedgerManager().getLastClosedLedgerNum() >= 3 && + B->getLedgerManager().getLastClosedLedgerNum() >= 3; }, 4 * simulation->getExpectedLedgerCloseTime(), false); @@ -8843,8 +9240,8 @@ TEST_CASE("far-future slots cleanup", "[herder]") auto txSet = TxSetXDRFrame::makeEmpty( app0->getLedgerManager().getLastClosedLedgerHeader()); StellarValue sv = herder0.makeStellarValue( - txSet->getContentsHash(), ct, xdr::xvector{}, - v1SecretKey); + txSet->getContentsHash(), makeConsensusTime(ct), + xdr::xvector{}, v1SecretKey); ext.commit.counter = 1; ext.commit.value = xdr::xdr_to_opaque(sv); ext.commitQuorumSetHash = qsetHash; @@ -8915,8 +9312,9 @@ TEST_CASE_VERSIONS("Herder properly validates when tx set is missing", Hash fakeTxSetHash; fakeTxSetHash.fill(0xAB); - auto makePrepareFromPeer = [&](uint64_t closeTime) { - auto sv = herder.makeStellarValue(fakeTxSetHash, closeTime, + auto makePrepareFromPeer = [&](TimePoint closeTime) { + auto sv = herder.makeStellarValue(fakeTxSetHash, + makeConsensusTime(closeTime), emptyUpgradeSteps, peerKey); auto opaqueValue = xdr::xdr_to_opaque(sv); @@ -8932,7 +9330,7 @@ TEST_CASE_VERSIONS("Herder properly validates when tx set is missing", return env; }; - uint64_t const badCloseTime = + TimePoint const badCloseTime = app->timeNow() + Herder::MAX_TIME_SLIP_SECONDS.count() + 60; auto env = makePrepareFromPeer(badCloseTime); @@ -9016,7 +9414,8 @@ TEST_CASE("SCP state restore with missing tx set", "[herder]") auto const& lcl = app->getLedgerManager().getLastClosedLedgerHeader(); slot = lcl.header.ledgerSeq + 1; - auto sv = herder.makeStellarValue(fakeTxSetHash, app->timeNow() + 1, + auto sv = herder.makeStellarValue(fakeTxSetHash, + makeConsensusTime(app->timeNow() + 1), emptyUpgradeSteps, cfg.NODE_SEED); value = xdr::xdr_to_opaque(sv); @@ -9319,8 +9718,8 @@ TEST_CASE("consensus close time trigger timer", "[herder][!hide]") StellarValue sv; xdr::xdr_from_opaque( ext->statement.pledges.externalize().commit.value, sv); - if (sv.ext.v() == STELLAR_VALUE_SIGNED && - sv.ext.lcValueSignature().nodeID == *driftedKey) + if (isSignedStellarValue(sv) && + getLcValueSignature(sv).nodeID == *driftedKey) { ++result.driftedLedSlots; } @@ -9479,3 +9878,99 @@ TEST_CASE("trigger timer switches anchor at protocol 28 upgrade", REQUIRE(result.postUpgrade + cadenceMargin > result.preUpgrade); } } + +#ifdef MS_CLOSE_TIME +TEST_CASE("ms close times support subsecond ledgers", "[herder]") +{ + auto mode = Simulation::OVER_LOOPBACK; + auto networkID = sha256(getTestConfig().NETWORK_PASSPHRASE); + // Close ledgers every 400ms so that consecutive ledgers land within the + // same whole second + auto sim = Topologies::core(3, 1.0, mode, networkID, [](int i) { + auto cfg = getTestConfig(i, Config::TESTDB_DEFAULT); + cfg.ARTIFICIALLY_SET_CLOSE_TIME_FOR_TESTING = 400; + // Remember enough slots that the scan below covers the whole run + cfg.MAX_SLOTS_TO_REMEMBER = 32; + return cfg; + }); + sim->startAllNodes(); + + auto node0 = sim->getNode(sim->getNodeIDs()[0]); + + sim->crankUntil([&]() { return sim->haveAllExternalized(20, 2); }, + std::chrono::seconds(60), false); + + // These nodes run the ms protocol from genesis, so every live-consensus + // value must carry a ms close time + for (auto const& nodeID : sim->getNodeIDs()) + { + auto node = sim->getNode(nodeID); + auto const& lcl = node->getLedgerManager().getLastClosedLedgerHeader(); + REQUIRE(protocolVersionStartsFrom(lcl.header.ledgerVersion, + MS_CLOSE_TIME_PROTOCOL_VERSION)); + REQUIRE(isMsCloseTimeStellarValue(lcl.header.scpValue)); + } + + // Collect all the externalized close times from node0's SCP state + auto& herder = static_cast(node0->getHerder()); + auto& scp = herder.getSCP(); + std::map closeTimes; + for (uint32_t slot = herder.getMinLedgerSeqToRemember(); + slot <= herder.trackingConsensusLedgerIndex(); slot++) + { + auto const envs = scp.getExternalizingState(slot); + auto const ext = + std::find_if(envs.begin(), envs.end(), [](SCPEnvelope const& e) { + return e.statement.pledges.type() == SCP_ST_EXTERNALIZE; + }); + if (ext == envs.end()) + { + continue; + } + StellarValue sv; + xdr::xdr_from_opaque(ext->statement.pledges.externalize().commit.value, + sv); + REQUIRE(isMsCloseTimeStellarValue(sv)); + closeTimes.emplace(slot, getConsensusTime(sv)); + } + + // Check that close times strictly increase and we maintain consensus, even + // if multiple blocks occur in the same whole second. + REQUIRE(closeTimes.size() >= 16); + size_t sameSecondPairs = 0; + for (auto it = std::next(closeTimes.begin()); it != closeTimes.end(); ++it) + { + auto const prev = std::prev(it); + REQUIRE(it->second > prev->second); + if (it->first == prev->first + 1 && + it->second.toApplyTime() == prev->second.toApplyTime()) + { + ++sameSecondPairs; + } + } + REQUIRE(sameSecondPairs > 0); +} +#endif // MS_CLOSE_TIME + +#ifdef MS_CLOSE_TIME +TEST_CASE("info reports the ms close time", "[herder]") +{ + VirtualClock clock; + auto app = createTestApplication(clock, getTestConfig()); + auto& lm = app->getLedgerManager(); + + // These test networks run the ms protocol from genesis + REQUIRE(protocolVersionStartsFrom( + lm.getLastClosedLedgerHeader().header.ledgerVersion, + MS_CLOSE_TIME_PROTOCOL_VERSION)); + + TimePoint const T = + lm.getLastClosedLedgerHeader().header.scpValue.closeTime + 2; + closeLedgerOn(*app, lm.getLastClosedLedgerNum() + 1, + makeConsensusTime(T, 250)); + auto const ledgerInfo = app->getJsonInfo(false)["info"]["ledger"]; + REQUIRE(ledgerInfo["closeTime"].asUInt64() == T); + // closeTimeMs is the full close time in ms, not just the ms remainder + REQUIRE(ledgerInfo["closeTimeMs"].asUInt64() == T * 1000 + 250); +} +#endif // MS_CLOSE_TIME diff --git a/src/herder/test/PendingEnvelopesTests.cpp b/src/herder/test/PendingEnvelopesTests.cpp index 11fb24610a..4334810d8c 100644 --- a/src/herder/test/PendingEnvelopesTests.cpp +++ b/src/herder/test/PendingEnvelopesTests.cpp @@ -12,6 +12,7 @@ #include "test/TestUtils.h" #include "test/TxTests.h" #include "test/test.h" +#include "util/ProtocolVersion.h" #include "xdr/Stellar-ledger.h" #include "xdrpp/marshal.h" @@ -24,11 +25,24 @@ using TxPair = std::pair; TxPair makeTxPair(HerderImpl& herder, SecretKey const& s, TxSetXDRFrameConstPtr txSet, - uint64_t closeTime, StellarValueType svt) + TimePoint closeTime) { StellarValue sv = herder.makeStellarValue(txSet->getContentsHash(), - closeTime, emptyUpgradeSteps, s); - sv.ext.v(svt); + makeConsensusTime(closeTime), + emptyUpgradeSteps, s); + return TxPair{xdr::xdr_to_opaque(sv), txSet}; +} + +// An unsigned (STELLAR_VALUE_BASIC) value, which validation must reject. +// Switching the arm discards the signature makeStellarValue produced. +TxPair +makeUnsignedTxPair(HerderImpl& herder, SecretKey const& s, + TxSetXDRFrameConstPtr txSet, TimePoint closeTime) +{ + StellarValue sv = herder.makeStellarValue(txSet->getContentsHash(), + makeConsensusTime(closeTime), + emptyUpgradeSteps, s); + sv.ext.v(STELLAR_VALUE_BASIC); return TxPair{xdr::xdr_to_opaque(sv), txSet}; } @@ -76,7 +90,7 @@ makeTransactions(Application& app, std::vector& accs, size_t index = 0; std::generate(std::begin(txs), std::end(txs), [&]() { return accs[index++].tx({payment(root, 1)}); }); - return makeTxSetFromTransactions(txs, app, 0, 0).first; + return makeTxSetFromTransactions(txs, app, ApplyTimeOffset{}).first; } PublicKey @@ -137,7 +151,7 @@ TEST_CASE_VERSIONS("PendingEnvelopes recvSCPEnvelope", "[herder]") auto bigQSetHash = sha256(xdr::xdr_to_opaque(bigQSet)); auto txSet = makeTransactions(*app, accs, *root, numAccounts); - auto p = makeTxPair(herder, s, txSet, 10, STELLAR_VALUE_SIGNED); + auto p = makeTxPair(herder, s, txSet, 10); auto saneEnvelope = makeEnvelope(herder, s, p, saneQSetHash, lcl.header.ledgerSeq + 1); auto bigEnvelope = @@ -486,7 +500,7 @@ TEST_CASE_VERSIONS("PendingEnvelopes recvSCPEnvelope", "[herder]") SECTION("do not fetch if txsets are not signed") { - auto p2 = makeTxPair(herder, s, txSet, 10, STELLAR_VALUE_BASIC); + auto p2 = makeUnsignedTxPair(herder, s, txSet, 10); auto envNoSign = makeEnvelope(herder, s, p2, saneQSetHash, lcl.header.ledgerSeq + 1); @@ -512,6 +526,59 @@ TEST_CASE_VERSIONS("PendingEnvelopes recvSCPEnvelope", "[herder]") Herder::ENVELOPE_STATUS_DISCARDED); } +#ifdef MS_CLOSE_TIME + SECTION("ms value arms gated by MS_CLOSE_TIME_PROTOCOL_VERSION") + { + uint64_t const nextSlot = lcl.header.ledgerSeq + 1; + uint32_t const msVersion = + static_cast(MS_CLOSE_TIME_PROTOCOL_VERSION); + + // Hand-craft a correctly-signed SIGNED_MS value + StellarValue msSv; + msSv.ext.v(STELLAR_VALUE_SIGNED_MS); + msSv.txSetHash = txSet->getContentsHash(); + msSv.closeTime = 10; + msSv.ext.signedMsValue().closeTimeMs = 10001; + auto& msSig = msSv.ext.signedMsValue().lcValueSignature; + msSig.nodeID = s.getPublicKey(); + msSig.signature = s.sign(xdr::xdr_to_opaque( + app->getNetworkID(), ENVELOPE_TYPE_SCPVALUE, msSv.txSetHash, + msSv.closeTime, getConsensusTime(msSv).milliseconds())); + TxPair const msPair{xdr::xdr_to_opaque(msSv), txSet}; + + auto envelopeAt = [&](TxPair const& pair, uint64_t slot) { + return makeEnvelope(herder, s, pair, saneQSetHash, slot); + }; + + SECTION("ms arms dropped for governed slots before activation, kept " + "for later slots") + { + for_versions_to(msVersion - 1, *app, [&] { + REQUIRE(pendingEnvelopes.recvSCPEnvelope( + envelopeAt(msPair, nextSlot)) == + Herder::ENVELOPE_STATUS_DISCARDED); + // A node that has fallen behind a protocol upgrade cannot + // know which protocol governs slots beyond lcl+1, so ms + // values for those must not be dropped (this is how a + // lagging node resyncs across the upgrade from relayed SCP + // state) + REQUIRE(pendingEnvelopes.recvSCPEnvelope( + envelopeAt(msPair, nextSlot + 1)) != + Herder::ENVELOPE_STATUS_DISCARDED); + }); + } + + SECTION("ms arms accepted once ms close times activate") + { + for_versions_from(msVersion, *app, [&] { + REQUIRE(pendingEnvelopes.recvSCPEnvelope( + envelopeAt(msPair, nextSlot)) != + Herder::ENVELOPE_STATUS_DISCARDED); + }); + } + } +#endif // MS_CLOSE_TIME + SECTION("empty-tx-set value envelopes gated by " "EMPTY_TX_SET_PROTOCOL_VERSION") { @@ -549,8 +616,7 @@ TEST_CASE_VERSIONS("PendingEnvelopes recvSCPEnvelope", "[herder]") { GeneralizedTransactionSet malformedXdrSet(1); auto malformedTxSet = TxSetXDRFrame::makeFromWire(malformedXdrSet); - auto p2 = - makeTxPair(herder, s, malformedTxSet, 10, STELLAR_VALUE_SIGNED); + auto p2 = makeTxPair(herder, s, malformedTxSet, 10); auto malformedEnvelope = makeEnvelope(herder, s, p2, saneQSetHash, lcl.header.ledgerSeq + 1); REQUIRE(pendingEnvelopes.recvSCPEnvelope(malformedEnvelope) == @@ -570,8 +636,8 @@ TEST_CASE_VERSIONS("PendingEnvelopes recvSCPEnvelope", "[herder]") auto& scpDriver = herder.getHerderSCPDriver(); auto txSetHash = txSet->getContentsHash(); - StellarValue sv = - herder.makeStellarValue(txSetHash, 10, emptyUpgradeSteps, s); + StellarValue sv = herder.makeStellarValue( + txSetHash, makeConsensusTime(10), emptyUpgradeSteps, s); SECTION("wrapStellarValue registers and receives tx set") { @@ -685,7 +751,7 @@ TEST_CASE("PendingEnvelopes recvSCPEnvelope without parallel tx set download", auto saneQSetHash = sha256(xdr::xdr_to_opaque(saneQSet)); auto txSet = makeTransactions(*app, accs, *root, numAccounts); - auto p = makeTxPair(herder, s, txSet, 10, STELLAR_VALUE_SIGNED); + auto p = makeTxPair(herder, s, txSet, 10); auto& pendingEnvelopes = herder.getPendingEnvelopes(); diff --git a/src/herder/test/QuorumTrackerTests.cpp b/src/herder/test/QuorumTrackerTests.cpp index 4620c477bb..030f800824 100644 --- a/src/herder/test/QuorumTrackerTests.cpp +++ b/src/herder/test/QuorumTrackerTests.cpp @@ -9,10 +9,12 @@ #include "scp/SCP.h" #include "test/Catch2.h" #include "test/TestUtils.h" +#include "test/TxTests.h" #include "test/test.h" #include "xdr/Stellar-ledger.h" using namespace stellar; +using namespace stellar::txtest; static void testQuorumTracker() @@ -111,7 +113,8 @@ testQuorumTracker() auto const& lcl = app->getLedgerManager().getLastClosedLedgerHeader(); auto txSet = TxSetXDRFrame::makeEmpty(lcl); StellarValue sv = herder->makeStellarValue( - txSet->getContentsHash(), lcl.header.scpValue.closeTime + i, + txSet->getContentsHash(), + makeConsensusTime(lcl.header.scpValue.closeTime + i), emptyUpgradeSteps, valSigner); auto v = xdr::xdr_to_opaque(sv); return ValuesTxSet{v, txSet}; diff --git a/src/herder/test/TransactionQueueTests.cpp b/src/herder/test/TransactionQueueTests.cpp index 5a035d928b..49953e817f 100644 --- a/src/herder/test/TransactionQueueTests.cpp +++ b/src/herder/test/TransactionQueueTests.cpp @@ -2995,14 +2995,15 @@ TEST_CASE("remove applied", "[herder][transactionqueue]") auto ledgerSeq = lcl.header.ledgerSeq + 1; root->loadSequenceNumber(); - auto [txSet, _] = makeTxSetFromTransactions({tx1b, tx2}, *app, 0, 0); + auto [txSet, _] = + makeTxSetFromTransactions({tx1b, tx2}, *app, ApplyTimeOffset{}); herder.getPendingEnvelopes().putTxSet(txSet->getContentsHash(), ledgerSeq, txSet); auto lastCloseTime = lcl.header.scpValue.closeTime; StellarValue sv = herder.makeStellarValue( - txSet->getContentsHash(), lastCloseTime, emptyUpgradeSteps, - app->getConfig().NODE_SEED); + txSet->getContentsHash(), makeConsensusTime(lastCloseTime), + emptyUpgradeSteps, app->getConfig().NODE_SEED); herder.getHerderSCPDriver().valueExternalized(ledgerSeq, xdr::xdr_to_opaque(sv)); @@ -3315,9 +3316,9 @@ TEST_CASE("TransactionQueue reset and rebuild on upgrades", auto lclHeader = lm.getLastClosedLedgerHeader(); TimePoint closeTime = lclHeader.header.scpValue.closeTime + 1; - app->getHerder().externalizeValue(TxSetXDRFrame::makeEmpty(lclHeader), - lclHeader.header.ledgerSeq + 1, - closeTime, {upgrade}); + app->getHerder().externalizeValue( + TxSetXDRFrame::makeEmpty(lclHeader), lclHeader.header.ledgerSeq + 1, + makeConsensusTime(closeTime), {upgrade}); app->getRoot()->loadSequenceNumber(); // Check that the upgrade was actually applied. diff --git a/src/herder/test/TxSetTests.cpp b/src/herder/test/TxSetTests.cpp index c746872b70..479fd843ad 100644 --- a/src/herder/test/TxSetTests.cpp +++ b/src/herder/test/TxSetTests.cpp @@ -906,7 +906,8 @@ testGeneralizedTxSetXDRConversion(ProtocolVersion protocolVersion) { INFO("classic only"); - auto txSet = makeTxSetFromTransactions(txs, *app, 0, 0).first; + auto txSet = + makeTxSetFromTransactions(txs, *app, ApplyTimeOffset{}).first; GeneralizedTransactionSet txSetXdr; txSet->toXDR(txSetXdr); REQUIRE(txSetXdr.v1TxSet().phases.size() == 2); @@ -931,9 +932,10 @@ testGeneralizedTxSetXDRConversion(ProtocolVersion protocolVersion) INFO("valid"); { INFO("minimum base fee"); - auto txSet = makeTxSetFromTransactions( - {txs, baseSorobanTxs}, *app, 0, 0) - .first; + auto txSet = + makeTxSetFromTransactions({txs, baseSorobanTxs}, *app, + ApplyTimeOffset{}) + .first; GeneralizedTransactionSet txSetXdr; txSet->toXDR(txSetXdr); REQUIRE(txSetXdr.v1TxSet().phases.size() == 2); @@ -983,8 +985,8 @@ testGeneralizedTxSetXDRConversion(ProtocolVersion protocolVersion) sorobanTxs.insert(sorobanTxs.begin(), higherFeeSorobanTxs.begin(), higherFeeSorobanTxs.end()); - auto txSet = makeTxSetFromTransactions({txs, sorobanTxs}, - *app, 0, 100) + auto txSet = makeTxSetFromTransactions( + {txs, sorobanTxs}, *app, ApplyTimeOffset{}) .first; GeneralizedTransactionSet txSetXdr; txSet->toXDR(txSetXdr); @@ -1031,7 +1033,8 @@ testGeneralizedTxSetXDRConversion(ProtocolVersion protocolVersion) auto sorobanTxs = baseSorobanTxs; sorobanTxs[4] = txs[0]; REQUIRE_THROWS_WITH( - makeTxSetFromTransactions({txs, sorobanTxs}, *app, 0, 0), + makeTxSetFromTransactions({txs, sorobanTxs}, *app, + ApplyTimeOffset{}), "TxSetFrame::makeFromTransactions: phases " "contain txs of wrong type"); } @@ -1041,7 +1044,7 @@ testGeneralizedTxSetXDRConversion(ProtocolVersion protocolVersion) classicTxs[4] = baseSorobanTxs[0]; REQUIRE_THROWS_WITH( makeTxSetFromTransactions({classicTxs, baseSorobanTxs}, - *app, 0, 0), + *app, ApplyTimeOffset{}), "TxSetFrame::makeFromTransactions: phases " "contain txs of wrong type"); } @@ -1706,8 +1709,8 @@ TEST_CASE("generalized tx set with multiple txs per source account", { // When building, only one tx per source should be included TxFrameList invalidTxs; - auto [_, txSet] = - makeTxSetFromTransactions({tx1, tx2}, *app, 0, 0, invalidTxs); + auto [_, txSet] = makeTxSetFromTransactions( + {tx1, tx2}, *app, ApplyTimeOffset{}, invalidTxs); // Second tx should be rejected due to duplicate source REQUIRE(invalidTxs.size() == 1); } @@ -1740,8 +1743,8 @@ TEST_CASE("generalized tx set with multiple txs per source account", SECTION("build block") { TxFrameList invalidTxs; - auto [_, txSet] = - makeTxSetFromTransactions({tx1, tx2}, *app, 0, 0, invalidTxs); + auto [_, txSet] = makeTxSetFromTransactions( + {tx1, tx2}, *app, ApplyTimeOffset{}, invalidTxs); REQUIRE(invalidTxs.empty()); REQUIRE(txSet->checkValidWithResult(*app, 0, 0) == TxSetValidationResult::VALID); @@ -2345,8 +2348,8 @@ TEST_CASE("txset nomination", "[txset]") PerPhaseTransactionList txPhases = {classicTxs, sorobanTxs}; PerPhaseTransactionList invalidTxs; invalidTxs.resize(txPhases.size()); - auto [xdrTxSetFrame, applicableTxSet] = - makeTxSetFromTransactions(txPhases, *app, 0, 0, invalidTxs); + auto [xdrTxSetFrame, applicableTxSet] = makeTxSetFromTransactions( + txPhases, *app, ApplyTimeOffset{}, invalidTxs); REQUIRE(xdrTxSetFrame); REQUIRE(applicableTxSet); REQUIRE(invalidTxs[0].empty()); @@ -2630,7 +2633,8 @@ runParallelTxSetBuildingTest(bool variableStageCount) {4 * i + 2, 4 * i + 3})); } PerPhaseTransactionList phases = {{}, sorobanTxs}; - auto [_, txSet] = makeTxSetFromTransactions(phases, *app, 0, 0); + auto [_, txSet] = + makeTxSetFromTransactions(phases, *app, ApplyTimeOffset{}); // We have a single stage with both variable and fixed stage count, // but in the former case this case will be large (full // instructions limit), and in the latter case it will be @@ -2656,7 +2660,8 @@ runParallelTxSetBuildingTest(bool variableStageCount) {4 * i + 2, 4 * i + 3})); } PerPhaseTransactionList phases = {{}, sorobanTxs}; - auto [_, txSet] = makeTxSetFromTransactions(phases, *app, 0, 0); + auto [_, txSet] = + makeTxSetFromTransactions(phases, *app, ApplyTimeOffset{}); if (variableStageCount) { validateShape(*txSet, 1, CLUSTER_COUNT, STAGE_COUNT); @@ -2677,7 +2682,8 @@ runParallelTxSetBuildingTest(bool variableStageCount) {4 * i + 2, 4 * i + 3})); } PerPhaseTransactionList phases = {{}, sorobanTxs}; - auto [_, txSet] = makeTxSetFromTransactions(phases, *app, 0, 0); + auto [_, txSet] = + makeTxSetFromTransactions(phases, *app, ApplyTimeOffset{}); if (variableStageCount) { validateShape(*txSet, 1, CLUSTER_COUNT, STAGE_COUNT * 5); @@ -2698,7 +2704,8 @@ runParallelTxSetBuildingTest(bool variableStageCount) /* inclusionFee*/ (i + 1) * 1000LL)); } PerPhaseTransactionList phases = {{}, sorobanTxs}; - auto [_, txSet] = makeTxSetFromTransactions(phases, *app, 0, 0); + auto [_, txSet] = + makeTxSetFromTransactions(phases, *app, ApplyTimeOffset{}); if (variableStageCount) { validateShape(*txSet, 1, CLUSTER_COUNT, STAGE_COUNT * 5); @@ -2728,8 +2735,8 @@ runParallelTxSetBuildingTest(bool variableStageCount) /* inclusionFee */ 100 + i)); } PerPhaseTransactionList phases = {{}, sorobanTxs}; - auto [_, txSet] = - makeTxSetFromTransactions(phases, *app, 0, 0); + auto [_, txSet] = makeTxSetFromTransactions( + phases, *app, ApplyTimeOffset{}); if (variableStageCount) { @@ -2756,7 +2763,8 @@ runParallelTxSetBuildingTest(bool variableStageCount) /* readBytes */ 100'000)); } PerPhaseTransactionList phases = {{}, sorobanTxs}; - auto [_, txSet] = makeTxSetFromTransactions(phases, *app, 0, 0); + auto [_, txSet] = + makeTxSetFromTransactions(phases, *app, ApplyTimeOffset{}); validateShape(*txSet, 1, 1, 10); validateBaseFee(*txSet, 100 + STAGE_COUNT * CLUSTER_COUNT - 10); } @@ -2779,8 +2787,8 @@ runParallelTxSetBuildingTest(bool variableStageCount) /* readBytes */ 100'000)); } PerPhaseTransactionList phases = {{}, sorobanTxs}; - auto [_, txSet] = - makeTxSetFromTransactions(phases, *app, 0, 0); + auto [_, txSet] = makeTxSetFromTransactions( + phases, *app, ApplyTimeOffset{}); validateShape(*txSet, 1, 1, 10); validateBaseFee(*txSet, @@ -2799,7 +2807,8 @@ runParallelTxSetBuildingTest(bool variableStageCount) /* writeBytes */ 10'000)); } PerPhaseTransactionList phases = {{}, sorobanTxs}; - auto [_, txSet] = makeTxSetFromTransactions(phases, *app, 0, 0); + auto [_, txSet] = + makeTxSetFromTransactions(phases, *app, ApplyTimeOffset{}); validateShape(*txSet, 1, 1, 10); validateBaseFee(*txSet, 100 + STAGE_COUNT * CLUSTER_COUNT - 10); @@ -2821,8 +2830,8 @@ runParallelTxSetBuildingTest(bool variableStageCount) /* inclusionFee */ 100 + i)); } PerPhaseTransactionList phases = {{}, sorobanTxs}; - auto [_, txSet] = - makeTxSetFromTransactions(phases, *app, 0, 0); + auto [_, txSet] = makeTxSetFromTransactions( + phases, *app, ApplyTimeOffset{}); validateShape(*txSet, 1, 1, 10); validateBaseFee(*txSet, @@ -2849,8 +2858,8 @@ runParallelTxSetBuildingTest(bool variableStageCount) }, [&]() { PerPhaseTransactionList phases = {{}, sorobanTxs}; - auto [_, txSet] = - makeTxSetFromTransactions(phases, *app, 0, 0); + auto [_, txSet] = makeTxSetFromTransactions( + phases, *app, ApplyTimeOffset{}); validateShape(*txSet, 1, 1, 10); validateBaseFee(*txSet, @@ -2874,8 +2883,8 @@ runParallelTxSetBuildingTest(bool variableStageCount) } PerPhaseTransactionList phases = {{}, sorobanTxs}; - auto [_, txSet] = - makeTxSetFromTransactions(phases, *app, 0, 0); + auto [_, txSet] = makeTxSetFromTransactions( + phases, *app, ApplyTimeOffset{}); validateShape(*txSet, 1, 1, 5); validateBaseFee(*txSet, @@ -2897,7 +2906,8 @@ runParallelTxSetBuildingTest(bool variableStageCount) /* inclusionFee */ 100 + i)); } PerPhaseTransactionList phases = {{}, sorobanTxs}; - auto [_, txSet] = makeTxSetFromTransactions(phases, *app, 0, 0); + auto [_, txSet] = + makeTxSetFromTransactions(phases, *app, ApplyTimeOffset{}); if (variableStageCount) { validateShape(*txSet, 1, 1, STAGE_COUNT); @@ -2919,7 +2929,8 @@ runParallelTxSetBuildingTest(bool variableStageCount) /* inclusionFee */ 100 + i)); } PerPhaseTransactionList phases = {{}, sorobanTxs}; - auto [_, txSet] = makeTxSetFromTransactions(phases, *app, 0, 0); + auto [_, txSet] = + makeTxSetFromTransactions(phases, *app, ApplyTimeOffset{}); // It's easy to 'break' the chain by allocating transactions to // different stages (technically, 2 stages would be sufficient, // but the nomination algorithm isn't clever enough to figure that @@ -2941,7 +2952,8 @@ runParallelTxSetBuildingTest(bool variableStageCount) } } PerPhaseTransactionList phases = {{}, sorobanTxs}; - auto [_, txSet] = makeTxSetFromTransactions(phases, *app, 0, 0); + auto [_, txSet] = + makeTxSetFromTransactions(phases, *app, ApplyTimeOffset{}); if (variableStageCount) { // With variable stage count, we can fit all transactions into @@ -2969,7 +2981,8 @@ runParallelTxSetBuildingTest(bool variableStageCount) } } PerPhaseTransactionList phases = {{}, sorobanTxs}; - auto [_, txSet] = makeTxSetFromTransactions(phases, *app, 0, 0); + auto [_, txSet] = + makeTxSetFromTransactions(phases, *app, ApplyTimeOffset{}); if (variableStageCount) { // With variable stage count, we can fit all transactions into @@ -3024,7 +3037,8 @@ runParallelTxSetBuildingTest(bool variableStageCount) /* inclusionFee */ 100 + i)); } PerPhaseTransactionList phases = {{}, sorobanTxs}; - auto [_, txSet] = makeTxSetFromTransactions(phases, *app, 0, 0); + auto [_, txSet] = + makeTxSetFromTransactions(phases, *app, ApplyTimeOffset{}); if (variableStageCount) { @@ -3055,7 +3069,8 @@ runParallelTxSetBuildingTest(bool variableStageCount) } } PerPhaseTransactionList phases = {{}, sorobanTxs}; - auto [_, txSet] = makeTxSetFromTransactions(phases, *app, 0, 0); + auto [_, txSet] = + makeTxSetFromTransactions(phases, *app, ApplyTimeOffset{}); validateShape(*txSet, STAGE_COUNT, CLUSTER_COUNT, 10); validateBaseFee(*txSet, 100); @@ -3074,7 +3089,8 @@ runParallelTxSetBuildingTest(bool variableStageCount) } PerPhaseTransactionList phases = {{}, sorobanTxs}; - auto [_, txSet] = makeTxSetFromTransactions(phases, *app, 0, 0); + auto [_, txSet] = + makeTxSetFromTransactions(phases, *app, ApplyTimeOffset{}); auto const& phase = txSet->getPhase(TxSetPhase::SOROBAN).getParallelStages(); @@ -3152,7 +3168,8 @@ runParallelTxSetBuildingTest(bool variableStageCount) // NB: `makeTxSetFromTransactions` does an XDR roundtrip and // validation, so just calling it does a good amount of smoke // testing. - auto [_, txSet] = makeTxSetFromTransactions(phases, *app, 0, 0); + auto [_, txSet] = + makeTxSetFromTransactions(phases, *app, ApplyTimeOffset{}); auto const& phase = txSet->getPhase(TxSetPhase::SOROBAN).getParallelStages(); if (variableStageCount) diff --git a/src/herder/test/UpgradesTests.cpp b/src/herder/test/UpgradesTests.cpp index 18bb5d6c95..d5fa66a63c 100644 --- a/src/herder/test/UpgradesTests.cpp +++ b/src/herder/test/UpgradesTests.cpp @@ -6,6 +6,7 @@ #include "bucket/BucketManager.h" #include "bucket/LiveBucketList.h" #include "bucket/test/BucketTestUtils.h" +#include "catchup/LedgerApplyManager.h" #include "crypto/Random.h" #include "herder/Herder.h" #include "herder/HerderImpl.h" @@ -23,6 +24,7 @@ #include "ledger/NetworkConfig.h" #include "ledger/P23HotArchiveBug.h" #include "ledger/TrustLineWrapper.h" +#include "lib/json/json.h" #include "main/CommandHandler.h" #include "simulation/LoadGenerator.h" #include "simulation/Simulation.h" @@ -31,11 +33,14 @@ #include "test/TestExceptions.h" #include "test/TestMarket.h" #include "test/TestUtils.h" +#include "test/TxTests.h" #include "test/test.h" #include "transactions/SignatureUtils.h" #include "transactions/SponsorshipUtils.h" +#include "transactions/TransactionBridge.h" #include "transactions/TransactionUtils.h" #include "transactions/test/SorobanTxTestUtils.h" +#include "util/Math.h" #include "util/StatusManager.h" #include "util/Timer.h" #include @@ -46,6 +51,7 @@ using namespace stellar; using namespace stellar::txtest; +using namespace stellar::txbridge; using stellar::LedgerTestUtils::toUpgradeType; struct LedgerUpgradeableData @@ -332,6 +338,18 @@ testListUpgrades(VirtualClock::system_time_point preferredUpgradeDatetime, header.maxTxSetSize = cfg.TESTING_UPGRADE_MAX_TX_SET_SIZE; header.scpValue.closeTime = VirtualClock::to_time_t(genesis(0, 0)); +#ifdef MS_CLOSE_TIME + // Every case below also runs against a header whose ms close time lands a + // random nonzero number of ms into the same whole second. Upgrade + // scheduling rounds down to the whole second, so execution is identical. + if (GENERATE(false, true)) + { + header.scpValue.ext.v(STELLAR_VALUE_SIGNED_MS); + header.scpValue.ext.signedMsValue().closeTimeMs = + header.scpValue.closeTime * 1000 + rand_uniform(1, 999); + } +#endif // MS_CLOSE_TIME + auto protocolVersionUpgrade = makeProtocolVersionUpgrade(cfg.TESTING_UPGRADE_LEDGER_PROTOCOL_VERSION); auto baseFeeUpgrade = makeBaseFeeUpgrade(cfg.TESTING_UPGRADE_DESIRED_FEE); @@ -2500,11 +2518,11 @@ TEST_CASE("upgrade to version 11", "[upgrades][acceptance]") uint32_t ledgerSeq = lm.getLastClosedLedgerNum() + 1; uint64_t minBalance = lm.getLastMinBalance(5); uint64_t big = minBalance + ledgerSeq; - uint64_t closeTime = 60 * 5 * ledgerSeq; - auto txSet = - makeTxSetFromTransactions( - {root->tx({txtest::createAccount(stranger, big)})}, *app, 0, 0) - .first; + TimePoint closeTime = 60 * 5 * ledgerSeq; + auto txSet = makeTxSetFromTransactions( + {root->tx({txtest::createAccount(stranger, big)})}, + *app, ApplyTimeOffset{}) + .first; // On 4th iteration of advance (a.k.a. ledgerSeq 5), perform a // ledger-protocol version upgrade to the new protocol, to activate @@ -2521,7 +2539,7 @@ TEST_CASE("upgrade to version 11", "[upgrades][acceptance]") } StellarValue sv = app->getHerder().makeStellarValue( - txSet->getContentsHash(), closeTime, upgrades, + txSet->getContentsHash(), makeConsensusTime(closeTime), upgrades, app->getConfig().NODE_SEED); lm.applyLedger(LedgerCloseData(ledgerSeq, txSet, sv)); auto& bm = app->getBucketManager(); @@ -2623,10 +2641,11 @@ TEST_CASE("upgrade to version 12", "[upgrades][acceptance]") uint32_t ledgerSeq = lm.getLastClosedLedgerNum() + 1; uint64_t minBalance = lm.getLastMinBalance(5); uint64_t big = minBalance + ledgerSeq; - uint64_t closeTime = 60 * 5 * ledgerSeq; + TimePoint closeTime = 60 * 5 * ledgerSeq; TxSetXDRFrameConstPtr txSet = makeTxSetFromTransactions( - {root->tx({txtest::createAccount(stranger, big)})}, *app, 0, 0) + {root->tx({txtest::createAccount(stranger, big)})}, *app, + ApplyTimeOffset{}) .first; // On 4th iteration of advance (a.k.a. ledgerSeq 5), perform a @@ -2643,7 +2662,7 @@ TEST_CASE("upgrade to version 12", "[upgrades][acceptance]") newProto); } StellarValue sv = app->getHerder().makeStellarValue( - txSet->getContentsHash(), closeTime, upgrades, + txSet->getContentsHash(), makeConsensusTime(closeTime), upgrades, app->getConfig().NODE_SEED); lm.applyLedger(LedgerCloseData(ledgerSeq, txSet, sv)); auto& bm = app->getBucketManager(); @@ -3670,7 +3689,7 @@ TEST_CASE("validate upgrade expiration logic", "[upgrades]") bool updated = false; auto upgrades = Upgrades{cfg}.removeUpgrades( header.scpValue.upgrades.begin(), header.scpValue.upgrades.end(), - header.scpValue.closeTime, updated); + getApplyTime(header.scpValue), updated); REQUIRE(updated); REQUIRE(!upgrades.mProtocolVersion); @@ -3690,7 +3709,7 @@ TEST_CASE("validate upgrade expiration logic", "[upgrades]") bool updated = false; auto upgrades = Upgrades{cfg}.removeUpgrades( header.scpValue.upgrades.begin(), header.scpValue.upgrades.end(), - header.scpValue.closeTime, updated); + getApplyTime(header.scpValue), updated); REQUIRE(!updated); REQUIRE(upgrades.mProtocolVersion); @@ -4184,3 +4203,277 @@ TEST_CASE("upgrades endpoint sets nomination timeout and expiration minutes", std::chrono::minutes(20)); } } + +#ifdef MS_CLOSE_TIME +TEST_CASE("millisecond close time upgrade boundary", + "[upgrades][herder][acceptance]") +{ + // A 4-node network (quorum threshold 3) upgrades to the ms close-time + // protocol while one node is partitioned away. The remaining three must + // keep closing ledgers across the boundary, switching value types + // exactly at activation, and the lagging node must resync across the + // boundary from relayed SCP state once it reconnects. + uint32_t const msVersion = + static_cast(MS_CLOSE_TIME_PROTOCOL_VERSION); + auto networkID = sha256(getTestConfig().NETWORK_PASSPHRASE); + auto simulation = + std::make_shared(Simulation::OVER_LOOPBACK, networkID); + simulation->setCurrentVirtualTime(genesis(0, 0)); + + std::vector keys; + std::vector configs; + for (int i = 0; i < 4; i++) + { + keys.push_back( + SecretKey::fromSeed(sha256("NODE_SEED_" + std::to_string(i)))); + configs.push_back(simulation->newConfig()); + auto& cfg = configs.back(); + // genesis at the last pre-ms protocol; the upgrade is armed below + cfg.USE_CONFIG_FOR_GENESIS = true; + cfg.TESTING_UPGRADE_LEDGER_PROTOCOL_VERSION = msVersion - 1; + cfg.TESTING_UPGRADE_DATETIME = VirtualClock::system_time_point(); + + // Keep a large enough SCP history window so out of sync node doesn't + // enter history replay. + cfg.MAX_SLOTS_TO_REMEMBER = 50; + cfg.ARTIFICIALLY_ACCELERATE_TIME_FOR_TESTING = false; + cfg.ARTIFICIALLY_SET_CLOSE_TIME_FOR_TESTING = 1000; + } + + auto qSet = SCPQuorumSet{}; + qSet.threshold = 3; + for (auto const& k : keys) + { + qSet.validators.push_back(k.getPublicKey()); + } + + for (int i = 0; i < 4; ++i) + { + auto app = simulation->addNode(keys[i], qSet, &configs[i]); + Upgrades::UpgradeParameters upgrades; + upgrades.mProtocolVersion = std::make_optional(msVersion); + upgrades.mUpgradeTime = genesis(0, 15); + app->getHerder().setUpgrades(upgrades); + } + for (int i = 0; i < 4; ++i) + { + for (int j = i + 1; j < 4; ++j) + { + simulation->addPendingConnection(keys[i].getPublicKey(), + keys[j].getPublicKey()); + } + } + simulation->startAllNodes(); + + auto node = [&](int i) { + return simulation->getNode(keys[i].getPublicKey()); + }; + auto lclHeader = [&](int i) { + return node(i)->getLedgerManager().getLastClosedLedgerHeader(); + }; + auto lclSeq = [&](int i) { + return node(i)->getLedgerManager().getLastClosedLedgerNum(); + }; + + // Close a few pre-upgrade ledgers with everyone connected + simulation->crankUntil( + [&]() { return simulation->haveAllExternalized(3, 1); }, + std::chrono::seconds(60), false); + REQUIRE(lclHeader(0).header.ledgerVersion == msVersion - 1); + REQUIRE(lclHeader(0).header.scpValue.ext.v() == STELLAR_VALUE_SIGNED); + + // Partition the 4th node away before the upgrade fires + for (int i = 0; i < 3; i++) + { + simulation->dropConnection(keys[i].getPublicKey(), + keys[3].getPublicKey()); + } + auto const laggingSeq = lclSeq(3); + + // The remaining three still meet the threshold: they must upgrade at the + // scheduled time and keep closing (ms) ledgers afterwards + simulation->crankUntil( + [&]() { + for (int i = 0; i < 3; i++) + { + // Strictly past the boundary: the upgrade ledger itself still + // carries a legacy value, so wait for an ms-valued LCL + if (lclHeader(i).header.ledgerVersion != msVersion || + !isMsCloseTimeStellarValue(lclHeader(i).header.scpValue)) + { + return false; + } + } + return lclSeq(0) >= laggingSeq + 5; + }, + std::chrono::seconds(300), false); + + // The partitioned node saw none of it + REQUIRE(lclSeq(3) == laggingSeq); + REQUIRE(lclHeader(3).header.ledgerVersion == msVersion - 1); + + // Live nodes externalize ms values now + for (int i = 0; i < 3; i++) + { + REQUIRE(lclHeader(i).header.scpValue.ext.v() == + STELLAR_VALUE_SIGNED_MS); + } + + // Scan node0's externalized SCP state across the boundary: value types + // must flip from legacy to ms exactly once, the upgrade ledger itself + // carries a legacy value with the version-upgrade step, and combined + // close times strictly increase throughout + { + auto& herder0 = static_cast(node(0)->getHerder()); + auto& scp = herder0.getSCP(); + // Slots below the remembering window (and any slot still mid-flight) + // may not have an externalizing state to inspect + uint32_t const scanStart = std::max( + laggingSeq + 1, herder0.getMinLedgerSeqToRemember()); + std::vector> values; + for (uint32_t slot = scanStart; slot <= lclSeq(0); slot++) + { + auto const envs = scp.getExternalizingState(slot); + auto const ext = std::find_if( + envs.begin(), envs.end(), [](SCPEnvelope const& e) { + return e.statement.pledges.type() == SCP_ST_EXTERNALIZE; + }); + if (ext == envs.end()) + { + continue; + } + StellarValue sv; + xdr::xdr_from_opaque( + ext->statement.pledges.externalize().commit.value, sv); + values.emplace_back(slot, sv); + } + // The captured window must span the boundary + REQUIRE(values.size() >= 2); + REQUIRE(!isMsCloseTimeStellarValue(values.front().second)); + REQUIRE(isMsCloseTimeStellarValue(values.back().second)); + + // Close times strictly increase throughout + for (size_t i = 1; i < values.size(); i++) + { + REQUIRE(getConsensusTime(values[i].second) > + getConsensusTime(values[i - 1].second)); + } + + // Value types must flip from legacy to ms exactly once: every value + // before the first ms value is legacy (by construction of find_if), + // and every value from it onwards must be ms. The window checks + // above guarantee the flip exists and firstMs is neither the first + // nor past the last value + auto const isMsValue = [](auto const& slotAndValue) { + return isMsCloseTimeStellarValue(slotAndValue.second); + }; + auto const firstMs = + std::find_if(values.begin(), values.end(), isMsValue); + REQUIRE(std::all_of(firstMs, values.end(), isMsValue)); + + // When the scan captured the two sides of the flip as adjacent + // slots, the last legacy value is the upgrade ledger itself and must + // carry the version upgrade step + auto const& [lastLegacySlot, lastLegacyValue] = *std::prev(firstMs); + if (lastLegacySlot + 1 == firstMs->first) + { + REQUIRE(std::any_of( + lastLegacyValue.upgrades.begin(), + lastLegacyValue.upgrades.end(), [&](UpgradeType const& step) { + LedgerUpgrade up; + xdr::xdr_from_opaque( + xdr::opaque_vec<>(step.begin(), step.end()), up); + return up.type() == LEDGER_UPGRADE_VERSION && + up.newLedgerVersion() == msVersion; + })); + } + } + + // Reconnect the lagging node + for (int i = 0; i < 3; i++) + { + simulation->addConnection(keys[3].getPublicKey(), + keys[i].getPublicKey()); + } + auto const target = lclSeq(0) + 2; + simulation->crankUntil( + [&]() { + for (int i = 0; i < 4; i++) + { + if (lclSeq(i) < target) + { + return false; + } + } + return true; + }, + std::chrono::seconds(300), false); + + REQUIRE(lclHeader(3).header.ledgerVersion == msVersion); + REQUIRE(lclHeader(3).header.scpValue.ext.v() == STELLAR_VALUE_SIGNED_MS); + + // Verify that the lagging node resynced purely from relayed SCP state, + // history catchup never ran + auto const& catchupMetrics = + node(3)->getLedgerApplyManager().getCatchupMetrics(); + REQUIRE(catchupMetrics.mCheckpointsDownloaded == 0); + REQUIRE(catchupMetrics.mLedgersVerified == 0); + REQUIRE(!node(3)->getLedgerApplyManager().isCatchupInitialized()); + + // All nodes converged on the same chain + auto const seq3 = lclSeq(3); + for (int i = 0; i < 3; i++) + { + if (lclSeq(i) == seq3) + { + REQUIRE(lclHeader(i).hash == lclHeader(3).hash); + } + } +} +#endif // MS_CLOSE_TIME + +#ifdef MS_CLOSE_TIME +TEST_CASE("upgrade scheduling under sub-second ledgers", "[upgrades]") +{ + VirtualClock clock; + auto cfg = getTestConfig(0); + auto app = createTestApplication(clock, cfg); + auto& lm = app->getLedgerManager(); + + // These test networks run the ms protocol from genesis + REQUIRE(protocolVersionStartsFrom( + lm.getLastClosedLedgerHeader().header.ledgerVersion, + MS_CLOSE_TIME_PROTOCOL_VERSION)); + + // Close a ledger partway into a known whole second; upgrade scheduling + // must read the whole second only + TimePoint const T = VirtualClock::to_time_t(genesis(0, 2)); + closeLedgerOn(*app, lm.getLastClosedLedgerNum() + 1, + ConsensusTime::fromMilliseconds(T * 1000 + 500)); + auto header = lm.getLastClosedLedgerHeader().header; + REQUIRE(header.scpValue.closeTime == T); + REQUIRE(getConsensusTime(header.scpValue).milliseconds() == T * 1000 + 500); + + auto makeUpgradeCfg = [&](VirtualClock::system_time_point when) { + Config ucfg = getTestConfig(1); + ucfg.TESTING_UPGRADE_LEDGER_PROTOCOL_VERSION = header.ledgerVersion; + ucfg.TESTING_UPGRADE_DESIRED_FEE = header.baseFee * 2; + ucfg.TESTING_UPGRADE_MAX_TX_SET_SIZE = header.maxTxSetSize; + ucfg.TESTING_UPGRADE_RESERVE = header.baseReserve; + ucfg.TESTING_UPGRADE_DATETIME = when; + return ucfg; + }; + auto ledgerView = CheckValidLedgerViewWrapper(*app); + + // Scheduled at exactly the header's whole second: proposed + auto due = Upgrades{makeUpgradeCfg(VirtualClock::from_time_t(T))} + .createUpgradesFor(header, ledgerView, app->getConfig()); + REQUIRE(due == + std::vector{makeBaseFeeUpgrade(header.baseFee * 2)}); + + // Scheduled at the next second: the 500ms remainder does not reach it + auto notDue = Upgrades{makeUpgradeCfg(VirtualClock::from_time_t(T + 1))} + .createUpgradesFor(header, ledgerView, app->getConfig()); + REQUIRE(notDue.empty()); +} +#endif // MS_CLOSE_TIME diff --git a/src/history/test/HistoryTests.cpp b/src/history/test/HistoryTests.cpp index 3c2365c60f..8820484f76 100644 --- a/src/history/test/HistoryTests.cpp +++ b/src/history/test/HistoryTests.cpp @@ -39,6 +39,7 @@ #include using namespace stellar; +using namespace stellar::txtest; using namespace historytestutils; TEST_CASE("checkpoint containing ledger", "[history]") @@ -1259,64 +1260,66 @@ TEST_CASE("History catchup rejects empty-tx-set ledgers with transactions", emptyTxSetSeq - 1); } -TEST_CASE("ApplyCheckpointWork rejects malformed empty-tx-set ledger headers", - "[history][catchup]") +// Start a node at `genesisVersion`, fabricate a checkpoint containing one +// LCL+1 ledger header whose StellarValue is shaped by `mutate`, and return the +// state ApplyCheckpointWork ends in when replaying it. +static BasicWork::State +applyFabricatedHeader(uint32_t genesisVersion, + std::function mutate) { - auto runWithFabricatedHeader = - [](uint32_t genesisVersion, std::function mutate) { - Config cfg(getTestConfig(0)); - cfg.TESTING_UPGRADE_LEDGER_PROTOCOL_VERSION = genesisVersion; - VirtualClock clock; - auto app = createTestApplication(clock, cfg); - auto const& lcl = - app->getLedgerManager().getLastClosedLedgerHeader(); - - LedgerHeaderHistoryEntry entry; - entry.header.ledgerSeq = lcl.header.ledgerSeq + 1; - entry.header.previousLedgerHash = lcl.hash; - entry.header.ledgerVersion = lcl.header.ledgerVersion; - mutate(entry.header.scpValue); - entry.hash = sha256(xdr::xdr_to_opaque(entry.header)); - - auto checkpoint = HistoryManager::checkpointContainingLedger( - entry.header.ledgerSeq, app->getConfig()); - auto tmpDir = - app->getTmpDirManager().tmpDir("malformed-empty-tx-set-header"); - FileTransferInfo hi(tmpDir, FileType::HISTORY_FILE_TYPE_LEDGER, - checkpoint); - { - XDROutputFileStream out(app->getClock().getIOContext(), true); - out.open(hi.localPath_nogz()); - out.writeOne(entry); - } - // The transactions file must exist even when empty - FileTransferInfo ti( - tmpDir, FileType::HISTORY_FILE_TYPE_TRANSACTIONS, checkpoint); - { - XDROutputFileStream out(app->getClock().getIOContext(), true); - out.open(ti.localPath_nogz()); - } + Config cfg(getTestConfig(0)); + cfg.TESTING_UPGRADE_LEDGER_PROTOCOL_VERSION = genesisVersion; + VirtualClock clock; + auto app = createTestApplication(clock, cfg); + auto const& lcl = app->getLedgerManager().getLastClosedLedgerHeader(); - auto range = LedgerRange::inclusive(lcl.header.ledgerSeq, - entry.header.ledgerSeq); - auto w = app->getWorkScheduler().executeWork( - tmpDir, range, OnFailureCallback{}); - return w->getState(); - }; + LedgerHeaderHistoryEntry entry; + entry.header.ledgerSeq = lcl.header.ledgerSeq + 1; + entry.header.previousLedgerHash = lcl.hash; + entry.header.ledgerVersion = lcl.header.ledgerVersion; + mutate(entry.header.scpValue); + entry.hash = sha256(xdr::xdr_to_opaque(entry.header)); + auto checkpoint = HistoryManager::checkpointContainingLedger( + entry.header.ledgerSeq, app->getConfig()); + auto tmpDir = app->getTmpDirManager().tmpDir("fabricated-ledger-header"); + FileTransferInfo hi(tmpDir, FileType::HISTORY_FILE_TYPE_LEDGER, checkpoint); + { + XDROutputFileStream out(app->getClock().getIOContext(), true); + out.open(hi.localPath_nogz()); + out.writeOne(entry); + } + // The transactions file must exist even when empty + FileTransferInfo ti(tmpDir, FileType::HISTORY_FILE_TYPE_TRANSACTIONS, + checkpoint); + { + XDROutputFileStream out(app->getClock().getIOContext(), true); + out.open(ti.localPath_nogz()); + } + + auto range = + LedgerRange::inclusive(lcl.header.ledgerSeq, entry.header.ledgerSeq); + auto w = app->getWorkScheduler().executeWork( + tmpDir, range, OnFailureCallback{}); + return w->getState(); +} + +TEST_CASE("ApplyCheckpointWork rejects malformed empty-tx-set ledger headers", + "[history][catchup]") +{ SECTION("empty-tx-set hash without empty-tx-set value") { - REQUIRE(runWithFabricatedHeader(Config::CURRENT_LEDGER_PROTOCOL_VERSION, - [](StellarValue& sv) { - sv.txSetHash = - Herder::EMPTY_TX_SET_HASH; - // ext stays STELLAR_VALUE_BASIC - }) == BasicWork::State::WORK_FAILURE); + REQUIRE(applyFabricatedHeader(Config::CURRENT_LEDGER_PROTOCOL_VERSION, + [](StellarValue& sv) { + sv.txSetHash = + Herder::EMPTY_TX_SET_HASH; + // ext stays STELLAR_VALUE_BASIC + }) == BasicWork::State::WORK_FAILURE); } SECTION("empty-tx-set value before protocol support") { - REQUIRE(runWithFabricatedHeader( + REQUIRE(applyFabricatedHeader( static_cast(EMPTY_TX_SET_PROTOCOL_VERSION) - 1, [](StellarValue& sv) { sv.txSetHash = Herder::EMPTY_TX_SET_HASH; @@ -1325,6 +1328,55 @@ TEST_CASE("ApplyCheckpointWork rejects malformed empty-tx-set ledger headers", } } +#ifdef MS_CLOSE_TIME +TEST_CASE("ApplyCheckpointWork rejects malformed ms close time ledger headers", + "[history][catchup]") +{ + auto const msVersion = + static_cast(MS_CLOSE_TIME_PROTOCOL_VERSION); + auto setMsValue = [](StellarValue& sv, TimePoint closeTime, + TimePointMilliseconds closeTimeMs) { + sv.ext.v(STELLAR_VALUE_SIGNED_MS); + sv.closeTime = closeTime; + sv.ext.signedMsValue().closeTimeMs = closeTimeMs; + }; + + SECTION("closeTime inconsistent with closeTimeMs") + { + REQUIRE(applyFabricatedHeader(msVersion, [&](StellarValue& sv) { + setMsValue(sv, 10, 11'000); + }) == BasicWork::State::WORK_FAILURE); + } + SECTION("closeTimeMs holding only the ms remainder") + { + REQUIRE(applyFabricatedHeader(msVersion, [&](StellarValue& sv) { + setMsValue(sv, 10, 250); + }) == BasicWork::State::WORK_FAILURE); + } + SECTION("ms value before protocol support") + { + REQUIRE(applyFabricatedHeader(msVersion - 1, [&](StellarValue& sv) { + setMsValue(sv, 10, 10'250); + }) == BasicWork::State::WORK_FAILURE); + } + SECTION("whole-second value once ms close times are active") + { + REQUIRE(applyFabricatedHeader(msVersion, [](StellarValue& sv) { + sv.ext.v(STELLAR_VALUE_SIGNED); + sv.closeTime = 10; + }) == BasicWork::State::WORK_FAILURE); + } + SECTION("close time not advancing past the previous ledger") + { + // The test network's genesis ledger closes at time 0 (see + // "genesisledger"), so a value at 0 does not advance past it + REQUIRE(applyFabricatedHeader(msVersion, [&](StellarValue& sv) { + setMsValue(sv, 0, 0); + }) == BasicWork::State::WORK_FAILURE); + } +} +#endif // MS_CLOSE_TIME + TEST_CASE("Publish works correctly post shadow removal", "[history]") { // Given a HAS, verify that appropriate levels have "next" cleared, while @@ -1927,6 +1979,18 @@ TEST_CASE("Catchup with protocol upgrade", "[catchup][history]") LiveBucket::FIRST_PROTOCOL_SUPPORTING_PERSISTENT_EVICTION); } } + SECTION("millisecond close time upgrade") + { + // Replays the CAP-0088 boundary through history: the ledger that + // applies the upgrade still carries a whole-second close time while + // already reporting the new protocol version, and the ledger after it + // is the first with a millisecond close time + if (protocolVersionEquals(Config::CURRENT_LEDGER_PROTOCOL_VERSION, + MS_CLOSE_TIME_PROTOCOL_VERSION)) + { + testUpgrade(MS_CLOSE_TIME_PROTOCOL_VERSION); + } + } } TEST_CASE("Catchup fatal failure", "[catchup][history]") @@ -2000,10 +2064,11 @@ TEST_CASE("Catchup non-initentry buckets to initentry-supporting works", uint32_t ledgerSeq = lm.getLastClosedLedgerNum() + 1; uint64_t minBalance = lm.getLastMinBalance(5); uint64_t big = minBalance + ledgerSeq; - uint64_t closeTime = 60 * 5 * ledgerSeq; + TimePoint closeTime = 60 * 5 * ledgerSeq; auto [txSet, applicableTxSet] = makeTxSetFromTransactions( - {root->tx({txtest::createAccount(stranger, big)})}, *a, 0, 0); + {root->tx({txtest::createAccount(stranger, big)})}, *a, + ApplyTimeOffset{}); // On first iteration of advance, perform a ledger-protocol version // upgrade to the new protocol, to activate INITENTRY behaviour. @@ -2021,8 +2086,8 @@ TEST_CASE("Catchup non-initentry buckets to initentry-supporting works", applicableTxSet->size(lm.getLastClosedLedgerHeader().header), hexAbbrev(txSet->getContentsHash())); StellarValue sv = a->getHerder().makeStellarValue( - txSet->getContentsHash(), closeTime, upgrades, - a->getConfig().NODE_SEED); + txSet->getContentsHash(), makeConsensusTime(closeTime), + upgrades, a->getConfig().NODE_SEED); lm.applyLedger(LedgerCloseData(ledgerSeq, txSet, sv)); } @@ -2666,3 +2731,39 @@ TEST_CASE("CheckpointBuilder", "[history][publish]") validateCheckpointFiles(*app, ledgerSeq, true); } } + +#ifdef MS_CLOSE_TIME +TEST_CASE("History publish and catchup over sub-second ledgers", + "[history][catchup]") +{ + CatchupSimulation catchupSimulation{}; + auto& lm = catchupSimulation.getApp().getLedgerManager(); + + // Generate a run of ledgers containing a same-second triple: one ledger + // at a whole second and two more within that second at increasing ms + catchupSimulation.generateRandomLedger(); + auto const closeTime = + getConsensusTime(lm.getLastClosedLedgerHeader().header.scpValue); + auto const applyTime = closeTime.toApplyTime(); + REQUIRE(closeTime.isWholeSecond()); + catchupSimulation.generateRandomLedger( + 0, makeConsensusTime(applyTime.timePoint(), 250)); + catchupSimulation.generateRandomLedger( + 0, makeConsensusTime(applyTime.timePoint(), 750)); + auto const& lclValue = lm.getLastClosedLedgerHeader().header.scpValue; + REQUIRE(getApplyTime(lclValue) == applyTime); + REQUIRE(getConsensusTime(lclValue) == + makeConsensusTime(applyTime.timePoint(), 750)); + + // Fill up to a published checkpoint with normally-spaced ledgers + auto checkpointLedger = catchupSimulation.getLastCheckpointLedger(1); + catchupSimulation.ensureOfflineCatchupPossible(checkpointLedger); + + // A full replay from genesis re-applies the sub-second ledgers through + // the ms-close-time format and monotonicity replay checks + auto app = catchupSimulation.createCatchupApplication( + std::numeric_limits::max(), Config::TESTDB_DEFAULT, + "sub-second-catchup"); + REQUIRE(catchupSimulation.catchupOffline(app, checkpointLedger)); +} +#endif // MS_CLOSE_TIME diff --git a/src/history/test/HistoryTestsUtils.cpp b/src/history/test/HistoryTestsUtils.cpp index 1a53bcb5ee..6e18aaf03f 100644 --- a/src/history/test/HistoryTestsUtils.cpp +++ b/src/history/test/HistoryTestsUtils.cpp @@ -14,6 +14,7 @@ #include "history/FileTransferInfo.h" #include "history/HistoryArchiveManager.h" #include "ledger/CheckpointRange.h" +#include "ledger/LedgerHeaderUtils.h" #include "ledger/LedgerRange.h" #include "ledger/LedgerTxn.h" #include "ledger/LedgerTxnHeader.h" @@ -571,7 +572,8 @@ CatchupSimulation::getLastCheckpointLedger(uint32_t checkpointIndex) const } void -CatchupSimulation::generateRandomLedger(uint32_t version) +CatchupSimulation::generateRandomLedger( + uint32_t version, std::optional closeTimeOverride) { uint32_t const setupLedgers = 4; auto& lm = getApp().getLedgerManager(); @@ -579,7 +581,9 @@ CatchupSimulation::generateRandomLedger(uint32_t version) uint64_t minBalance = lm.getLastMinBalance(5); uint64_t big = minBalance + ledgerSeq; uint64_t small = 100 + ledgerSeq; - uint64_t closeTime = 60 * 5 * ledgerSeq; + ConsensusTime const closeTime = closeTimeOverride + ? *closeTimeOverride + : makeConsensusTime(60 * 5 * ledgerSeq); auto root = getApp().getRoot(); @@ -702,7 +706,7 @@ CatchupSimulation::generateRandomLedger(uint32_t version) ? PerPhaseTransactionList{txs, sorobanTxs} : PerPhaseTransactionList{txs}; TxSetXDRFrameConstPtr txSet = - makeTxSetFromTransactions(phases, getApp(), 0, 0).first; + makeTxSetFromTransactions(phases, getApp(), ApplyTimeOffset{}).first; CLOG_INFO(History, "Closing synthetic ledger {} with {} txs (txhash:{})", ledgerSeq, txSet->sizeTxTotal(), @@ -763,7 +767,7 @@ CatchupSimulation::generateEmptyTxSetLedger() auto& lm = getApp().getLedgerManager(); auto const lcl = lm.getLastClosedLedgerHeader(); uint32_t ledgerSeq = lcl.header.ledgerSeq + 1; - uint64_t closeTime = 60 * 5 * ledgerSeq; + TimePoint closeTime = 60 * 5 * ledgerSeq; // An empty-tx-set value replaces a proposed value whose tx set the network // gave up waiting for. Craft such a proposal (the referenced tx set @@ -772,7 +776,7 @@ CatchupSimulation::generateEmptyTxSetLedger() Hash proposedTxSetHash; proposedTxSetHash.fill(0xAB); StellarValue proposal = getApp().getHerder().makeStellarValue( - proposedTxSetHash, closeTime, emptyUpgradeSteps, + proposedTxSetHash, makeConsensusTime(closeTime), emptyUpgradeSteps, getApp().getConfig().NODE_SEED); auto& herder = static_cast(getApp().getHerder()); @@ -794,7 +798,7 @@ CatchupSimulation::generateEmptyTxSetLedger() // The header must record the empty-tx-set hash, not the applied // (empty) tx set's contents hash. REQUIRE(lclh.header.scpValue.txSetHash == Herder::EMPTY_TX_SET_HASH); - REQUIRE(lclh.header.scpValue.ext.v() == STELLAR_VALUE_EMPTY_TX_SET); + REQUIRE(isEmptyTxSetStellarValue(lclh.header.scpValue)); auto root = getApp().getRoot(); auto alice = TestAccount{getApp(), getAccount("alice")}; diff --git a/src/history/test/HistoryTestsUtils.h b/src/history/test/HistoryTestsUtils.h index c3ef239785..edb7417a59 100644 --- a/src/history/test/HistoryTestsUtils.h +++ b/src/history/test/HistoryTestsUtils.h @@ -259,7 +259,9 @@ class CatchupSimulation uint32_t getLastCheckpointLedger(uint32_t checkpointIndex) const; - void generateRandomLedger(uint32_t version = 0); + void generateRandomLedger( + uint32_t version = 0, + std::optional closeTimeOverride = std::nullopt); // Closes a CAP-0083 empty-tx-set ledger void generateEmptyTxSetLedger(); diff --git a/src/ledger/LedgerHeaderUtils.cpp b/src/ledger/LedgerHeaderUtils.cpp index 24f4132ae2..bf9a6ec0b8 100644 --- a/src/ledger/LedgerHeaderUtils.cpp +++ b/src/ledger/LedgerHeaderUtils.cpp @@ -8,6 +8,9 @@ #include "database/Database.h" #include "database/DatabaseUtils.h" #include "util/Decoder.h" +#include "util/GlobalChecks.h" +#include "util/ProtocolVersion.h" +#include "util/Timer.h" #include "util/types.h" #include "xdrpp/marshal.h" @@ -17,12 +20,274 @@ namespace stellar { +namespace +{ +template +auto& +getLcValueSignatureImpl(T& sv) +{ + switch (sv.ext.v()) + { + case STELLAR_VALUE_SIGNED: + return sv.ext.lcValueSignature(); + case STELLAR_VALUE_EMPTY_TX_SET: + return sv.ext.proposedValue().lcValueSignature; +#ifdef MS_CLOSE_TIME + case STELLAR_VALUE_SIGNED_MS: + return sv.ext.signedMsValue().lcValueSignature; + case STELLAR_VALUE_EMPTY_TX_SET_MS: + return sv.ext.proposedMsValue().lcValueSignature; +#endif + default: + releaseAssert(false); + } +} +} + +bool +protocolHasMsCloseTime(uint32_t protocolVersion) +{ + return protocolVersionStartsFrom(protocolVersion, + MS_CLOSE_TIME_PROTOCOL_VERSION); +} + +ApplyTimeOffset +operator-(ApplyTime const& later, ApplyTime const& earlier) +{ + releaseAssert(earlier <= later); + return ApplyTimeOffset::fromSeconds(later.mTimePoint - earlier.mTimePoint); +} + +ConsensusTime::ConsensusTime(uint64_t milliseconds) + : mMilliseconds(milliseconds) +{ +} + +ConsensusTime +ConsensusTime::fromApplyTime(ApplyTime applyTime) +{ + // Saturate to the largest whole second expressible in ms, so that even a + // saturated value keeps the whole-second invariant + constexpr TimePoint MAX_SECONDS = UINT64_MAX / 1000; + auto const seconds = applyTime.timePoint(); + return ConsensusTime((seconds > MAX_SECONDS ? MAX_SECONDS : seconds) * + 1000); +} + +ConsensusTime +ConsensusTime::fromSystemTime(std::chrono::system_clock::time_point time, + uint32_t protocolVersion) +{ + auto const sinceEpoch = + std::chrono::duration_cast( + time.time_since_epoch()); + releaseAssert(sinceEpoch.count() >= 0); + auto const milliseconds = static_cast(sinceEpoch.count()); +#ifdef MS_CLOSE_TIME + if (protocolHasMsCloseTime(protocolVersion)) + { + return ConsensusTime(milliseconds); + } +#else + // A build without ms close times must never run a protocol that has them + releaseAssert(!protocolHasMsCloseTime(protocolVersion)); +#endif // MS_CLOSE_TIME + return fromApplyTime(ApplyTime::fromTimePoint(milliseconds / 1000)); +} + +#ifdef MS_CLOSE_TIME +ConsensusTime +ConsensusTime::fromMilliseconds(TimePointMilliseconds milliseconds) +{ + return ConsensusTime(milliseconds); +} + +TimePointMilliseconds +ConsensusTime::milliseconds() const +{ + return mMilliseconds; +} +#endif // MS_CLOSE_TIME + +bool +ConsensusTime::isWholeSecond() const +{ + return mMilliseconds % 1000 == 0; +} + +ApplyTime +ConsensusTime::toApplyTime() const +{ + return ApplyTime::fromTimePoint(mMilliseconds / 1000); +} + +std::chrono::system_clock::time_point +ConsensusTime::toSystemTime() const +{ + return VirtualClock::from_time_t( + static_cast(mMilliseconds / 1000)) + + std::chrono::milliseconds(mMilliseconds % 1000); +} + +ConsensusTime +ConsensusTime::next(uint32_t protocolVersion) const +{ +#ifdef MS_CLOSE_TIME + if (protocolHasMsCloseTime(protocolVersion)) + { + return ConsensusTime(mMilliseconds == UINT64_MAX ? UINT64_MAX + : mMilliseconds + 1); + } +#else + // A build without ms close times must never run a protocol that has them + releaseAssert(!protocolHasMsCloseTime(protocolVersion)); +#endif // MS_CLOSE_TIME + // A whole-second protocol can only ever have produced whole-second values + releaseAssert(isWholeSecond()); + return fromApplyTime(ApplyTime::fromTimePoint(mMilliseconds / 1000 + 1)); +} + +std::string +ConsensusTime::toString() const +{ + return fmt::format(FMT_STRING("{}.{:03d}"), mMilliseconds / 1000, + mMilliseconds % 1000); +} + +bool +isMsCloseTimeStellarValue(StellarValue const& sv) +{ + switch (sv.ext.v()) + { +#ifdef MS_CLOSE_TIME + case STELLAR_VALUE_SIGNED_MS: + case STELLAR_VALUE_EMPTY_TX_SET_MS: + return true; +#endif + default: + return false; + } +} + +bool +hasValidCloseTime(StellarValue const& sv) +{ + return !isMsCloseTimeStellarValue(sv) || + getApplyTime(sv) == getConsensusTime(sv).toApplyTime(); +} + +ConsensusTime +getConsensusTime(StellarValue const& sv) +{ + switch (sv.ext.v()) + { +#ifdef MS_CLOSE_TIME + case STELLAR_VALUE_SIGNED_MS: + return ConsensusTime::fromMilliseconds( + sv.ext.signedMsValue().closeTimeMs); + case STELLAR_VALUE_EMPTY_TX_SET_MS: + return ConsensusTime::fromMilliseconds( + sv.ext.proposedMsValue().closeTimeMs); +#endif + default: + return ConsensusTime::fromApplyTime(getApplyTime(sv)); + } +} + +ApplyTime +getApplyTime(StellarValue const& sv) +{ + return ApplyTime::fromTimePoint(sv.closeTime); +} + +bool +isSignedStellarValue(StellarValue const& sv) +{ + switch (sv.ext.v()) + { + case STELLAR_VALUE_SIGNED: +#ifdef MS_CLOSE_TIME + case STELLAR_VALUE_SIGNED_MS: +#endif + return true; + default: + return false; + } +} + +bool +isEmptyTxSetStellarValue(StellarValue const& sv) +{ + switch (sv.ext.v()) + { + case STELLAR_VALUE_EMPTY_TX_SET: +#ifdef MS_CLOSE_TIME + case STELLAR_VALUE_EMPTY_TX_SET_MS: +#endif + return true; + default: + return false; + } +} + +LedgerCloseValueSignature& +getLcValueSignature(StellarValue& sv) +{ + return getLcValueSignatureImpl(sv); +} + +LedgerCloseValueSignature const& +getLcValueSignature(StellarValue const& sv) +{ + return getLcValueSignatureImpl(sv); +} + +Hash const& +getProposedTxSetHash(StellarValue const& sv) +{ +#ifdef MS_CLOSE_TIME + if (sv.ext.v() == STELLAR_VALUE_EMPTY_TX_SET_MS) + { + return sv.ext.proposedMsValue().txSetHash; + } +#endif + releaseAssert(sv.ext.v() == STELLAR_VALUE_EMPTY_TX_SET); + return sv.ext.proposedValue().txSetHash; +} + +Hash const& +getProposedPreviousLedgerHash(StellarValue const& sv) +{ +#ifdef MS_CLOSE_TIME + if (sv.ext.v() == STELLAR_VALUE_EMPTY_TX_SET_MS) + { + return sv.ext.proposedMsValue().previousLedgerHash; + } +#endif + releaseAssert(sv.ext.v() == STELLAR_VALUE_EMPTY_TX_SET); + return sv.ext.proposedValue().previousLedgerHash; +} + +uint32_t +getProposedPreviousLedgerVersion(StellarValue const& sv) +{ +#ifdef MS_CLOSE_TIME + if (sv.ext.v() == STELLAR_VALUE_EMPTY_TX_SET_MS) + { + return sv.ext.proposedMsValue().previousLedgerVersion; + } +#endif + releaseAssert(sv.ext.v() == STELLAR_VALUE_EMPTY_TX_SET); + return sv.ext.proposedValue().previousLedgerVersion; +} + static bool isValid(LedgerHeader const& lh) { bool res = (lh.ledgerSeq <= INT32_MAX); res = res && (lh.scpValue.closeTime <= INT64_MAX); + res = res && hasValidCloseTime(lh.scpValue); res = res && (lh.feePool >= 0); res = res && (lh.idPool <= INT64_MAX); return res; diff --git a/src/ledger/LedgerHeaderUtils.h b/src/ledger/LedgerHeaderUtils.h index 3ab4e4f469..d0e72c959b 100644 --- a/src/ledger/LedgerHeaderUtils.h +++ b/src/ledger/LedgerHeaderUtils.h @@ -5,12 +5,160 @@ #pragma once #include "xdr/Stellar-ledger.h" +#include +#include +#include +#include namespace stellar { class Database; class SessionWrapper; +// A whole-second distance between two ApplyTimes, e.g. how far +// ahead of the last closed ledger the ledger a tx set is built for applies. +class ApplyTimeOffset +{ + public: + constexpr ApplyTimeOffset() = default; + + static constexpr ApplyTimeOffset + fromSeconds(Duration seconds) + { + return ApplyTimeOffset(seconds); + } + + constexpr Duration + seconds() const + { + return mSeconds; + } + + friend auto operator<=>(ApplyTimeOffset const&, + ApplyTimeOffset const&) = default; + + private: + explicit constexpr ApplyTimeOffset(Duration seconds) : mSeconds(seconds) + { + } + + Duration mSeconds{0}; +}; + +// Whole-second close time used by ledger application and protocol features +// such as time bounds, sequence age, claim predicates, Soroban timestamps, and +// upgrade scheduling. +class ApplyTime +{ + public: + constexpr ApplyTime() = default; + + static constexpr ApplyTime + fromTimePoint(TimePoint timePoint) + { + return ApplyTime(timePoint); + } + + constexpr TimePoint + timePoint() const + { + return mTimePoint; + } + + // `later` must not precede `earlier` + friend ApplyTimeOffset operator-(ApplyTime const& later, + ApplyTime const& earlier); + + friend auto operator<=>(ApplyTime const&, ApplyTime const&) = default; + + private: + explicit constexpr ApplyTime(TimePoint timePoint) : mTimePoint(timePoint) + { + } + + TimePoint mTimePoint{0}; +}; + +// Close time as seen by consensus (SCP), in milliseconds since the Unix epoch. +// +// The value is ALWAYS milliseconds, whatever the protocol. Before +// MS_CLOSE_TIME_PROTOCOL_VERSION consensus only resolves whole seconds, so +// every ConsensusTime produced under such a protocol is a multiple of 1000 +// (isWholeSecond()); from that protocol on, values may carry a sub-second +// component. Holding both in the same unit keeps comparisons correct across +// the upgrade boundary, where a whole-second LCL meets the first sub-second +// value. +// +// Sub-second values can only be created in MS_CLOSE_TIME builds: without the +// flag the ms constructor and accessor do not exist, and fromSystemTime() and +// next() always round to whole seconds, so a non-ms build can neither produce +// nor observe a sub-second close time. +class ConsensusTime +{ + public: + ConsensusTime() = default; + + static ConsensusTime fromApplyTime(ApplyTime applyTime); + // The system time rounded down to the whole second, unless + // protocolVersion has ms close times (MS_CLOSE_TIME builds only). + static ConsensusTime + fromSystemTime(std::chrono::system_clock::time_point time, + uint32_t protocolVersion); +#ifdef MS_CLOSE_TIME + static ConsensusTime fromMilliseconds(TimePointMilliseconds milliseconds); + TimePointMilliseconds milliseconds() const; +#endif // MS_CLOSE_TIME + + bool isWholeSecond() const; + // Rounded down to the whole second: the value StellarValue::closeTime + // carries in both value formats. + ApplyTime toApplyTime() const; + std::chrono::system_clock::time_point toSystemTime() const; + // The smallest close time strictly after this one: 1ms later once + // protocolVersion has ms close times (MS_CLOSE_TIME builds only), the next + // whole second before that. + ConsensusTime next(uint32_t protocolVersion) const; + std::string toString() const; + + friend auto operator<=>(ConsensusTime const&, + ConsensusTime const&) = default; + + private: + explicit ConsensusTime(uint64_t milliseconds); + + uint64_t mMilliseconds{0}; +}; + +static_assert(!std::is_convertible_v); +static_assert(!std::is_convertible_v); +static_assert(!std::is_convertible_v); +static_assert(!std::is_convertible_v); +static_assert(!std::is_convertible_v); +static_assert(!std::is_convertible_v); + +bool protocolHasMsCloseTime(uint32_t protocolVersion); +bool isMsCloseTimeStellarValue(StellarValue const& sv); +bool hasValidCloseTime(StellarValue const& sv); + +// Only meaningful for a value that passes hasValidCloseTime(). +ConsensusTime getConsensusTime(StellarValue const& sv); + +// Deliberately reads StellarValue::closeTime, whose whole-second application +// semantics are unchanged by CAP-0088. +ApplyTime getApplyTime(StellarValue const& sv); + +bool isSignedStellarValue(StellarValue const& sv); +bool isEmptyTxSetStellarValue(StellarValue const& sv); + +// Only valid for signed or empty-tx-set values. +LedgerCloseValueSignature& getLcValueSignature(StellarValue& sv); +LedgerCloseValueSignature const& getLcValueSignature(StellarValue const& sv); + +// Only valid for empty-tx-set values. +Hash const& getProposedTxSetHash(StellarValue const& sv); +Hash const& getProposedPreviousLedgerHash(StellarValue const& sv); +uint32_t getProposedPreviousLedgerVersion(StellarValue const& sv); + namespace LedgerHeaderUtils { diff --git a/src/ledger/LedgerManagerImpl.cpp b/src/ledger/LedgerManagerImpl.cpp index ac976caf79..c02f4738b5 100644 --- a/src/ledger/LedgerManagerImpl.cpp +++ b/src/ledger/LedgerManagerImpl.cpp @@ -1295,13 +1295,14 @@ LedgerManagerImpl::startCatchup(CatchupConfiguration configuration, uint64_t LedgerManagerImpl::secondsSinceLastLedgerClose() const { - uint64_t ct = getLastClosedLedgerHeader().header.scpValue.closeTime; - if (ct == 0) + auto const closeTime = + getApplyTime(getLastClosedLedgerHeader().header.scpValue); + if (closeTime == ApplyTime{}) { return 0; } - uint64_t now = mApp.timeNow(); - return (now > ct) ? (now - ct) : 0; + TimePoint now = mApp.timeNow(); + return (now > closeTime.timePoint()) ? (now - closeTime.timePoint()) : 0; } void @@ -2644,7 +2645,7 @@ static ParallelLedgerInfo getParallelLedgerInfo(AppConnector& app, LedgerHeader const& lh) { return {lh.ledgerVersion, lh.ledgerSeq, lh.baseReserve, - lh.scpValue.closeTime, app.getNetworkID()}; + getApplyTime(lh.scpValue), app.getNetworkID()}; } std::vector> diff --git a/src/ledger/test/LedgerHeaderTests.cpp b/src/ledger/test/LedgerHeaderTests.cpp index 21cb3bf9c6..7d94f1fe4b 100644 --- a/src/ledger/test/LedgerHeaderTests.cpp +++ b/src/ledger/test/LedgerHeaderTests.cpp @@ -6,21 +6,25 @@ #include "crypto/Hex.h" #include "herder/Herder.h" #include "herder/LedgerCloseData.h" +#include "ledger/LedgerHeaderUtils.h" #include "ledger/LedgerManager.h" #include "ledger/LedgerTxn.h" #include "ledger/LedgerTxnHeader.h" #include "main/Application.h" #include "test/Catch2.h" #include "test/TestUtils.h" +#include "test/TxTests.h" #include "test/test.h" #include "transactions/TransactionUtils.h" #include "util/Logging.h" +#include "util/ProtocolVersion.h" #include "util/Timer.h" #include "xdrpp/marshal.h" #include "main/Config.h" using namespace stellar; +using namespace stellar::txtest; using namespace std; TEST_CASE("genesisledger", "[ledger]") @@ -73,7 +77,7 @@ TEST_CASE("ledgerheader", "[ledger]") // close this ledger StellarValue sv = app->getHerder().makeStellarValue( - txSet->getContentsHash(), 1, emptyUpgradeSteps, + txSet->getContentsHash(), makeConsensusTime(1), emptyUpgradeSteps, app->getConfig().NODE_SEED); LedgerCloseData ledgerData(lcl.header.ledgerSeq + 1, txSet, sv); app->getLedgerManager().applyLedger(ledgerData); @@ -117,3 +121,107 @@ TEST_CASE_VERSIONS("base reserve", "[ledger]") expectedReserve); }); } + +TEST_CASE("close time helpers", "[ledger][herder]") +{ + auto const msVersion = + static_cast(MS_CLOSE_TIME_PROTOCOL_VERSION); + + SECTION("protocol gate") + { + REQUIRE(protocolHasMsCloseTime(msVersion)); + REQUIRE(!protocolHasMsCloseTime(msVersion - 1)); + } + + SECTION("whole-second conversions") + { + auto const t = makeConsensusTime(123); + REQUIRE(t.isWholeSecond()); + REQUIRE(t.toApplyTime() == ApplyTime::fromTimePoint(123)); + REQUIRE(t.toString() == "123.000"); + REQUIRE(t.toSystemTime() == VirtualClock::from_time_t(123)); + + // Before the ms protocol, system time rounds down to the whole second + // and the next close time is the next whole second + auto const systemTime = + VirtualClock::from_time_t(123) + std::chrono::milliseconds(456); + REQUIRE(ConsensusTime::fromSystemTime(systemTime, msVersion - 1) == t); + REQUIRE(t.next(msVersion - 1) == makeConsensusTime(124)); + + // Seconds too large to express in ms saturate to the largest whole + // second, so the invariant survives, and the next close time cannot + // advance past it + auto const top = makeConsensusTime(UINT64_MAX / 1000); + REQUIRE(top.isWholeSecond()); + REQUIRE(makeConsensusTime(UINT64_MAX / 1000 + 1) == top); + REQUIRE(makeConsensusTime(UINT64_MAX) == top); + REQUIRE(top.next(msVersion - 1) == top); + } + +#ifdef MS_CLOSE_TIME + SECTION("sub-second conversions") + { + auto const t = ConsensusTime::fromMilliseconds(123456); + REQUIRE(t.milliseconds() == 123456); + REQUIRE(!t.isWholeSecond()); + REQUIRE(t == makeConsensusTime(123, 456)); + REQUIRE(makeConsensusTime(123).milliseconds() == 123000); + // Whole-second views round down + REQUIRE(t.toApplyTime() == ApplyTime::fromTimePoint(123)); + REQUIRE(t.toString() == "123.456"); + + // System time keeps its ms from the ms protocol on + auto const systemTime = + VirtualClock::from_time_t(123) + std::chrono::milliseconds(456); + REQUIRE(ConsensusTime::fromSystemTime(systemTime, msVersion) == t); + REQUIRE(t.toSystemTime() == systemTime); + + // The next close time advances by 1ms from the ms protocol on... + REQUIRE(t.next(msVersion) == ConsensusTime::fromMilliseconds(123457)); + REQUIRE(ConsensusTime::fromMilliseconds(123999).next(msVersion) == + makeConsensusTime(124)); + REQUIRE(makeConsensusTime(123).next(msVersion) == + ConsensusTime::fromMilliseconds(123001)); + // ...and saturates at the top of the range + REQUIRE(ConsensusTime::fromMilliseconds(UINT64_MAX).next(msVersion) == + ConsensusTime::fromMilliseconds(UINT64_MAX)); + REQUIRE(makeConsensusTime(UINT64_MAX).milliseconds() == + (UINT64_MAX / 1000) * 1000); + } + + SECTION("ledger header rejects inconsistent ms close time") + { + // A stored header's closeTime must be its closeTimeMs rounded down to + // the whole second. Only the close time fields matter to this check, so + // the values carry no lcValueSignature + TimePoint const T = 1'700'000'000; + + auto msValue = [](TimePoint closeTime, + TimePointMilliseconds closeTimeMs) { + StellarValue sv; + sv.ext.v(STELLAR_VALUE_SIGNED_MS); + sv.closeTime = closeTime; + sv.ext.signedMsValue().closeTimeMs = closeTimeMs; + return sv; + }; + + LedgerHeader header; + header.scpValue = msValue(T, T * 1000 + 250); + REQUIRE_NOTHROW(LedgerHeaderUtils::encodeHeader(header)); + + // closeTime behind closeTimeMs + header.scpValue = msValue(T, (T + 1) * 1000); + REQUIRE_THROWS(LedgerHeaderUtils::encodeHeader(header)); + + // closeTimeMs holding only the sub-second remainder, not a full close + // time + header.scpValue = msValue(T, 250); + REQUIRE_THROWS(LedgerHeaderUtils::encodeHeader(header)); + + // Whole-second values have no closeTimeMs to disagree with + header.scpValue.ext.v(STELLAR_VALUE_SIGNED); + header.scpValue.closeTime = T; + REQUIRE_NOTHROW(LedgerHeaderUtils::encodeHeader(header)); + } +#endif // MS_CLOSE_TIME +} diff --git a/src/ledger/test/LedgerTests.cpp b/src/ledger/test/LedgerTests.cpp index fd0aa82b1c..e32f486847 100644 --- a/src/ledger/test/LedgerTests.cpp +++ b/src/ledger/test/LedgerTests.cpp @@ -6,11 +6,13 @@ #include "ledger/LedgerManager.h" #include "ledger/LedgerTxn.h" #include "main/Application.h" +#include "test/TxTests.h" #include "test/test.h" #include using namespace stellar; +using namespace stellar::txtest; TEST_CASE("cannot close ledger with unsupported ledger version", "[ledger]") { @@ -22,7 +24,7 @@ TEST_CASE("cannot close ledger with unsupported ledger version", "[ledger]") auto const& lcl = app->getLedgerManager().getLastClosedLedgerHeader(); auto txSet = TxSetXDRFrame::makeEmpty(lcl); StellarValue sv = app->getHerder().makeStellarValue( - txSet->getContentsHash(), 1, emptyUpgradeSteps, + txSet->getContentsHash(), makeConsensusTime(1), emptyUpgradeSteps, app->getConfig().NODE_SEED); LedgerCloseData ledgerData(lcl.header.ledgerSeq + 1, txSet, sv); diff --git a/src/main/ApplicationImpl.cpp b/src/main/ApplicationImpl.cpp index 2d4b082997..3b1bb3dd44 100644 --- a/src/main/ApplicationImpl.cpp +++ b/src/main/ApplicationImpl.cpp @@ -480,7 +480,15 @@ ApplicationImpl::getJsonInfo(bool verbose) auto const& lcl = lm.getLastClosedLedgerHeader(); info["ledger"]["num"] = (int)lcl.header.ledgerSeq; info["ledger"]["hash"] = binToHex(lcl.hash); - info["ledger"]["closeTime"] = (Json::UInt64)lcl.header.scpValue.closeTime; + info["ledger"]["closeTime"] = + (Json::UInt64)getApplyTime(lcl.header.scpValue).timePoint(); +#ifdef MS_CLOSE_TIME + if (isMsCloseTimeStellarValue(lcl.header.scpValue)) + { + info["ledger"]["closeTimeMs"] = + (Json::UInt64)getConsensusTime(lcl.header.scpValue).milliseconds(); + } +#endif // MS_CLOSE_TIME info["ledger"]["version"] = lcl.header.ledgerVersion; info["ledger"]["baseFee"] = lcl.header.baseFee; info["ledger"]["baseReserve"] = lcl.header.baseReserve; @@ -1023,9 +1031,10 @@ ApplicationImpl::manualClose(std::optional const& manualLedgerSeq, FMT_STRING("Manually closed ledger with sequence " "number {:d} and closeTime {:d}"), targetLedgerSeq, - getLedgerManager() - .getLastClosedLedgerHeader() - .header.scpValue.closeTime); + getApplyTime(getLedgerManager() + .getLastClosedLedgerHeader() + .header.scpValue) + .timePoint()); } return fmt::format( @@ -1108,11 +1117,13 @@ ApplicationImpl::setManualCloseVirtualTime( "Documented limit (first second of year 2200 GMT) of manual " "close time would allow runtime overflow in Herder"); - TimePoint const lastCloseTime = getLedgerManager() - .getLastClosedLedgerHeader() - .header.scpValue.closeTime; - uint64_t const now = VirtualClock::to_time_t(getClock().system_now()); - uint64_t nextCloseTime = std::max(now, lastCloseTime + 1); + // Manual close always uses whole second close times + TimePoint const lastCloseTime = + getApplyTime( + getLedgerManager().getLastClosedLedgerHeader().header.scpValue) + .timePoint(); + TimePoint const now = VirtualClock::to_time_t(getClock().system_now()); + TimePoint nextCloseTime = std::max(now, lastCloseTime + 1); TimePoint const maxCloseTime = firstSecondOfYear2200GMT; @@ -1132,7 +1143,7 @@ ApplicationImpl::setManualCloseVirtualTime( // Without an explicitly-provided closeTime, imitate what // HerderImpl::triggerNextLedger() would do in REAL_TIME // (unless that would move the virtual clock backwards). - uint64_t const defaultNextCloseTime = + TimePoint const defaultNextCloseTime = VirtualClock::to_time_t(std::chrono::system_clock::now()); nextCloseTime = std::max(nextCloseTime, defaultNextCloseTime); } diff --git a/src/main/Config.cpp b/src/main/Config.cpp index f94a830ca1..99261fe924 100644 --- a/src/main/Config.cpp +++ b/src/main/Config.cpp @@ -16,6 +16,7 @@ #include "util/Fs.h" #include "util/GlobalChecks.h" #include "util/Logging.h" +#include "util/ProtocolVersion.h" #include "util/SecretManager.h" #include "util/UnorderedSet.h" @@ -31,11 +32,8 @@ namespace stellar { -uint32 const Config::CURRENT_LEDGER_PROTOCOL_VERSION = 28 -#ifdef ENABLE_NEXT_PROTOCOL_VERSION_UNSAFE_FOR_PRODUCTION - + 1 -#endif - ; +uint32 const Config::CURRENT_LEDGER_PROTOCOL_VERSION = + MAX_SUPPORTED_PROTOCOL_VERSION; bool gIsProductionNetwork = false; @@ -2921,7 +2919,7 @@ Config::getExpectedLedgerCloseTimeTestingOverride() const if (ARTIFICIALLY_SET_CLOSE_TIME_FOR_TESTING) { return std::chrono::milliseconds{ - ARTIFICIALLY_SET_CLOSE_TIME_FOR_TESTING * 1000}; + ARTIFICIALLY_SET_CLOSE_TIME_FOR_TESTING}; } if (ARTIFICIALLY_ACCELERATE_TIME_FOR_TESTING) diff --git a/src/main/Config.h b/src/main/Config.h index 56217901ad..1c306420c6 100644 --- a/src/main/Config.h +++ b/src/main/Config.h @@ -255,8 +255,8 @@ class Config : public std::enable_shared_from_this // will make your history archives incompatible with those of anyone else. bool ARTIFICIALLY_ACCELERATE_TIME_FOR_TESTING; - // A config parameter to override the close time (in seconds). Do not use - // in production as it may render the network unstable. + // A config parameter to override the close time (in milliseconds). Do not + // use in production as it may render the network unstable. uint32 ARTIFICIALLY_SET_CLOSE_TIME_FOR_TESTING; // A config parameter that avoids resolving FutureBuckets before writing diff --git a/src/main/test/CommandHandlerTests.cpp b/src/main/test/CommandHandlerTests.cpp index 30f228d8dd..6bb972351b 100644 --- a/src/main/test/CommandHandlerTests.cpp +++ b/src/main/test/CommandHandlerTests.cpp @@ -433,7 +433,7 @@ TEST_CASE("manualclose", "[commandhandler]") SECTION("manual close time that overflows documented limit is detected and " "rejected") { - uint64_t const overflowingCloseTime = firstSecondOfYear2200GMT + 1ULL; + TimePoint const overflowingCloseTime = firstSecondOfYear2200GMT + 1ULL; std::string retStr; REQUIRE(lastLedgerNum() == LedgerManager::GENESIS_LEDGER_SEQ); CAPTURE(retStr); @@ -507,7 +507,8 @@ TEST_CASE("manualclose", "[commandhandler]") setMinTime(txFrame, 0); TimePoint const maxTime = lastCloseTime() + defaultManualCloseTimeInterval + - getUpperBoundCloseTimeOffset(*app, lastCloseTime()); + getUpperBoundCloseTimeOffset( + *app, ApplyTime::fromTimePoint(lastCloseTime())); setMaxTime(txFrame, maxTime); txFrame->getMutableEnvelope().v1().signatures.clear(); txFrame->addSignature(*root); diff --git a/src/overlay/Peer.cpp b/src/overlay/Peer.cpp index 29111bd808..ee1ec2b490 100644 --- a/src/overlay/Peer.cpp +++ b/src/overlay/Peer.cpp @@ -1422,8 +1422,10 @@ bool Peer::process(QueryInfo& queryInfo, std::optional maxQueriesPerWindow) { auto const& cfg = mAppConnector.getConfig(); + // Round up so sub-second close times can't produce a zero-length window + // (which would zero out QUERIES_PER_WINDOW and reject every query). std::chrono::seconds const QUERY_WINDOW = - std::chrono::duration_cast( + std::chrono::ceil( mAppConnector.getLedgerManager().getExpectedLedgerCloseTime() * cfg.MAX_SLOTS_TO_REMEMBER); uint32_t const QUERIES_PER_WINDOW = maxQueriesPerWindow.value_or( diff --git a/src/overlay/Peer.h b/src/overlay/Peer.h index 3435338fe3..d7c4f2f42f 100644 --- a/src/overlay/Peer.h +++ b/src/overlay/Peer.h @@ -508,6 +508,13 @@ class Peer : public std::enable_shared_from_this, releaseAssert(threadIsMain()); return mSCPStateQueryInfo.mNumQueries; } + + // Testing only function to expose the query rate-limiting check + bool + processQueryForTesting(QueryInfo& queryInfo) + { + return process(queryInfo); + } #endif // Public thread-safe methods that access Peer's state diff --git a/src/overlay/test/FloodTests.cpp b/src/overlay/test/FloodTests.cpp index 58c640937f..4114ef5fca 100644 --- a/src/overlay/test/FloodTests.cpp +++ b/src/overlay/test/FloodTests.cpp @@ -454,7 +454,9 @@ TEST_CASE("Flooding", "[flood][overlay][acceptance]") // create the transaction set containing this transaction - auto txSet = makeTxSetFromTransactions({tx1}, *inApp, 0, 0).first; + auto txSet = + makeTxSetFromTransactions({tx1}, *inApp, ApplyTimeOffset{}) + .first; auto& herder = static_cast(inApp->getHerder()); // build the quorum set used by this message @@ -471,7 +473,8 @@ TEST_CASE("Flooding", "[flood][overlay][acceptance]") lcl.header.scpValue.closeTime + 1, VirtualClock::to_time_t(inApp->getClock().system_now())); StellarValue sv = herder.makeStellarValue( - txSet->getContentsHash(), ct, emptyUpgradeSteps, keys[0]); + txSet->getContentsHash(), makeConsensusTime(ct), + emptyUpgradeSteps, keys[0]); SCPEnvelope envelope; diff --git a/src/overlay/test/OverlayTests.cpp b/src/overlay/test/OverlayTests.cpp index e9404c6bbb..fa035dfd7b 100644 --- a/src/overlay/test/OverlayTests.cpp +++ b/src/overlay/test/OverlayTests.cpp @@ -2028,15 +2028,15 @@ TEST_CASE("GET_SCP_STATE rate limiting", "[overlay]") // Bump up close time and max slots to remember to production levels. These // must be large enough that crankSome calls between requests don't cause a // window reset. - cfg1.ARTIFICIALLY_SET_CLOSE_TIME_FOR_TESTING = 5; - cfg2.ARTIFICIALLY_SET_CLOSE_TIME_FOR_TESTING = 5; + cfg1.ARTIFICIALLY_SET_CLOSE_TIME_FOR_TESTING = 5000; + cfg2.ARTIFICIALLY_SET_CLOSE_TIME_FOR_TESTING = 5000; cfg1.MAX_SLOTS_TO_REMEMBER = 12; cfg2.MAX_SLOTS_TO_REMEMBER = 12; // The window size + 1 second. Minimum time required to ensure the rate // limit window resets. std::chrono::seconds const WINDOW_CLEAR_DURATION( - cfg1.ARTIFICIALLY_SET_CLOSE_TIME_FOR_TESTING * + cfg1.ARTIFICIALLY_SET_CLOSE_TIME_FOR_TESTING / 1000 * cfg1.MAX_SLOTS_TO_REMEMBER + 1); @@ -2097,6 +2097,52 @@ TEST_CASE("GET_SCP_STATE rate limiting", "[overlay]") testutil::shutdownWorkScheduler(*app1); } +TEST_CASE("query rate limit window under sub-second close times", "[overlay]") +{ + VirtualClock clock; + Config cfg1 = getTestConfig(0); + Config cfg2 = getTestConfig(1); + + // Make the raw query window (close time * slots to remember) shorter than + // one second. It must round up to a one-second window; truncating instead + // would produce a zero-length window with a zero query allowance, + // rejecting every query. + for (auto* cfg : {&cfg1, &cfg2}) + { + cfg->ARTIFICIALLY_SET_CLOSE_TIME_FOR_TESTING = 100; + cfg->MAX_SLOTS_TO_REMEMBER = 4; + } + + auto app1 = createTestApplication(clock, cfg1); + auto app2 = createTestApplication(clock, cfg2); + + LoopbackPeerConnection conn(*app1, *app2); + testutil::crankSome(clock); + auto peer = conn.getAcceptor(); + REQUIRE(peer->isAuthenticatedForTesting()); + + // The rounded-up 1s window admits QUERY_RESPONSE_MULTIPLIER (see Peer.cpp) + // queries per window + uint32_t constexpr EXPECTED_QUERIES_PER_WINDOW = 5; + + Peer::QueryInfo queryInfo; + for (uint32_t i = 0; i < EXPECTED_QUERIES_PER_WINDOW; i++) + { + REQUIRE(peer->processQueryForTesting(queryInfo)); + queryInfo.mNumQueries++; + } + // The next query in the same window exceeds the allowance + REQUIRE(!peer->processQueryForTesting(queryInfo)); + + // Advancing past the rounded-up window resets the allowance + testutil::crankFor(clock, std::chrono::seconds(2)); + REQUIRE(peer->processQueryForTesting(queryInfo)); + REQUIRE(queryInfo.mNumQueries == 0); + + testutil::shutdownWorkScheduler(*app2); + testutil::shutdownWorkScheduler(*app1); +} + TEST_CASE("reject peers with the same nodeid", "[overlay][connections]") { VirtualClock clock; diff --git a/src/protocol-curr/xdr b/src/protocol-curr/xdr index 9c9c145953..03cbf40cec 160000 --- a/src/protocol-curr/xdr +++ b/src/protocol-curr/xdr @@ -1 +1 @@ -Subproject commit 9c9c145953e80990d6ff1ae3a6a973a0ce6d0694 +Subproject commit 03cbf40cec4d89f82171bf895ef7598458d83e1b diff --git a/src/simulation/ApplyLoad.cpp b/src/simulation/ApplyLoad.cpp index 2637b8a161..f4bf437847 100644 --- a/src/simulation/ApplyLoad.cpp +++ b/src/simulation/ApplyLoad.cpp @@ -18,6 +18,7 @@ #include "herder/TxSetFrame.h" #include "ledger/ImmutableLedgerView.h" #include "ledger/InMemorySorobanState.h" +#include "ledger/LedgerHeaderUtils.h" #include "ledger/LedgerManager.h" #include "ledger/LedgerManagerImpl.h" #include "main/Application.h" @@ -1043,7 +1044,7 @@ ApplyLoad::closeLedger(std::vector const& txs, xdr::xvector const& upgrades, bool recordUtilization) { - auto txSet = makeTxSetFromTransactions(txs, mApp, 0, 0); + auto txSet = makeTxSetFromTransactions(txs, mApp, ApplyTimeOffset{}); if (recordUtilization) { @@ -1051,9 +1052,10 @@ ApplyLoad::closeLedger(std::vector const& txs, .getLastClosedLedgerHeader() .header.ledgerVersion); } - auto sv = - mApp.getHerder().makeStellarValue(txSet.first->getContentsHash(), 1, - upgrades, mApp.getConfig().NODE_SEED); + auto sv = mApp.getHerder().makeStellarValue( + txSet.first->getContentsHash(), + ConsensusTime::fromApplyTime(ApplyTime::fromTimePoint(1)), upgrades, + mApp.getConfig().NODE_SEED); stellar::txtest::closeLedger(mApp, txs, /* strictOrder */ false, upgrades); } @@ -1066,8 +1068,13 @@ ApplyLoad::closeLedgerViaConsensus( auto& herder = mApp.getHerder(); auto const& lcl = mApp.getLedgerManager().getLastClosedLedgerHeader(); - uint64_t const closeTime = lcl.header.scpValue.closeTime + 1; - auto txSet = makeTxSetFromTransactions(txs, mApp, 1, 1); + auto const closeTime = + getConsensusTime(lcl.header.scpValue).next(lcl.header.ledgerVersion); + // Mirror the validation path: the tx set is built for the apply time + // implied by the close time we are about to nominate. + auto const closeTimeOffset = + closeTime.toApplyTime() - getApplyTime(lcl.header.scpValue); + auto txSet = makeTxSetFromTransactions(txs, mApp, closeTimeOffset); if (recordUtilization) { diff --git a/src/simulation/LoadGenerator.cpp b/src/simulation/LoadGenerator.cpp index cdcace9ffe..258d8a5df5 100644 --- a/src/simulation/LoadGenerator.cpp +++ b/src/simulation/LoadGenerator.cpp @@ -502,12 +502,15 @@ LoadGenerator::scheduleLoadGeneration(GeneratedLoadConfig cfg) } // During load submission, we must have enough unique source accounts (with - // a buffer) to accommodate the desired tx rate. - auto closeTimeSeconds = std::chrono::duration_cast( - mApp.getLedgerManager().getExpectedLedgerCloseTime()); - if (cfg.nTxs > cfg.nAccounts && (cfg.txRate * closeTimeSeconds.count()) * - MIN_UNIQUE_ACCOUNT_MULTIPLIER > - cfg.nAccounts) + // a buffer) to accommodate the desired tx rate. txRate is per second, so + // (txRate * closeTime) is the per-ledger tx count; round it up so + // sub-second close times don't truncate it to 0 and disable the check. + auto const closeTime = mApp.getLedgerManager().getExpectedLedgerCloseTime(); + auto const txsPerLedger = std::chrono::ceil( + closeTime * static_cast(cfg.txRate)) + .count(); + if (cfg.nTxs > cfg.nAccounts && + txsPerLedger * MIN_UNIQUE_ACCOUNT_MULTIPLIER > cfg.nAccounts) { errorMsg = fmt::format( "Tx rate is too high, there are not enough unique accounts. Make " diff --git a/src/test/TestUtils.cpp b/src/test/TestUtils.cpp index a1b8a20dad..e203987206 100644 --- a/src/test/TestUtils.cpp +++ b/src/test/TestUtils.cpp @@ -536,9 +536,9 @@ modifySorobanNetworkConfig(Application& app, auto lclHeader = app.getLedgerManager().getLastClosedLedgerHeader(); TimePoint closeTime = lclHeader.header.scpValue.closeTime + 1; - app.getHerder().externalizeValue(TxSetXDRFrame::makeEmpty(lclHeader), - lclHeader.header.ledgerSeq + 1, closeTime, - {upgrade}); + app.getHerder().externalizeValue( + TxSetXDRFrame::makeEmpty(lclHeader), lclHeader.header.ledgerSeq + 1, + txtest::makeConsensusTime(closeTime), {upgrade}); app.getRoot()->loadSequenceNumber(); txtest::captureLastClosedLedgerLcm(app); diff --git a/src/test/TxTests.cpp b/src/test/TxTests.cpp index cd5b853a2d..605000d7dc 100644 --- a/src/test/TxTests.cpp +++ b/src/test/TxTests.cpp @@ -28,6 +28,7 @@ #include "util/Fs.h" #include "util/GlobalChecks.h" #include "util/Logging.h" +#include "util/Math.h" #include "util/ProtocolVersion.h" #include "util/XDROperators.h" #include "util/XDRStream.h" @@ -583,6 +584,18 @@ closeLedgerOn(Application& app, uint32 ledgerSeq, TimePoint closeTime, std::vector const& txs, bool strictOrder, xdr::xvector const& upgrades, ParallelSorobanOrder const& parallelSorobanOrder) +{ + return closeLedgerOn( + app, ledgerSeq, + ConsensusTime::fromApplyTime(ApplyTime::fromTimePoint(closeTime)), txs, + strictOrder, upgrades, parallelSorobanOrder); +} + +TransactionResultSet +closeLedgerOn(Application& app, uint32 ledgerSeq, ConsensusTime closeTime, + std::vector const& txs, bool strictOrder, + xdr::xvector const& upgrades, + ParallelSorobanOrder const& parallelSorobanOrder) { // Ensure that parallelSorobanOrder is only used with strictOrder releaseAssert((parallelSorobanOrder.empty() || strictOrder)); @@ -590,18 +603,16 @@ closeLedgerOn(Application& app, uint32 ledgerSeq, TimePoint closeTime, // Ensure we're not trying to close a ledger that's already closed releaseAssert(ledgerSeq > app.getLedgerManager().getLastClosedLedgerNum()); - auto lastCloseTime = app.getLedgerManager() - .getLastClosedLedgerHeader() - .header.scpValue.closeTime; - if (closeTime < lastCloseTime) - { - closeTime = lastCloseTime; - } + // Make sure the close time is never less than the lcl close time + closeTime = + std::max(closeTime, getConsensusTime(app.getLedgerManager() + .getLastClosedLedgerHeader() + .header.scpValue)); std::pair txSet; if (strictOrder) { - txSet = makeTxSetFromTransactions(txs, app, 0, 0, true, + txSet = makeTxSetFromTransactions(txs, app, ApplyTimeOffset{}, true, parallelSorobanOrder); } else @@ -609,7 +620,7 @@ closeLedgerOn(Application& app, uint32 ledgerSeq, TimePoint closeTime, if (std::none_of(txs.begin(), txs.end(), [&](auto const& tx) { return tx->isSoroban(); })) { - txSet = makeTxSetFromTransactions(txs, app, 0, 0); + txSet = makeTxSetFromTransactions(txs, app, ApplyTimeOffset{}); } else { @@ -626,7 +637,7 @@ closeLedgerOn(Application& app, uint32 ledgerSeq, TimePoint closeTime, { phases.emplace_back(soroban); } - txSet = makeTxSetFromTransactions(phases, app, 0, 0); + txSet = makeTxSetFromTransactions(phases, app, ApplyTimeOffset{}); } } if (!strictOrder) @@ -651,15 +662,24 @@ closeLedgerOn(Application& app, uint32 ledgerSeq, TimePoint closeTime, TransactionResultSet closeLedger(Application& app, TxSetXDRFrameConstPtr txSet) { - auto lastCloseTime = app.getLedgerManager() - .getLastClosedLedgerHeader() - .header.scpValue.closeTime; + auto lastCloseTime = getConsensusTime( + app.getLedgerManager().getLastClosedLedgerHeader().header.scpValue); auto nextLedgerSeq = app.getLedgerManager().getLastClosedLedgerNum() + 1; return closeLedgerOn(app, nextLedgerSeq, lastCloseTime, txSet); } TransactionResultSet -closeLedgerOn(Application& app, uint32 ledgerSeq, time_t closeTime, +closeLedgerOn(Application& app, uint32 ledgerSeq, TimePoint closeTime, + TxSetXDRFrameConstPtr txSet) +{ + return closeLedgerOn( + app, ledgerSeq, + ConsensusTime::fromApplyTime(ApplyTime::fromTimePoint(closeTime)), + txSet); +} + +TransactionResultSet +closeLedgerOn(Application& app, uint32 ledgerSeq, ConsensusTime closeTime, TxSetXDRFrameConstPtr txSet) { app.getHerder().externalizeValue(txSet, ledgerSeq, closeTime, @@ -675,6 +695,42 @@ closeLedgerOn(Application& app, uint32 ledgerSeq, time_t closeTime, return z1; } +ConsensusTime +makeConsensusTime(TimePoint timePoint, uint32_t milliseconds) +{ + releaseAssert(milliseconds < 1000); + auto const wholeSecond = + ConsensusTime::fromApplyTime(ApplyTime::fromTimePoint(timePoint)); +#ifdef MS_CLOSE_TIME + if (milliseconds != 0) + { + auto const base = wholeSecond.milliseconds(); + return ConsensusTime::fromMilliseconds(base > UINT64_MAX - milliseconds + ? UINT64_MAX + : base + milliseconds); + } +#else + // Sub-second close times do not exist in builds without MS_CLOSE_TIME + releaseAssert(milliseconds == 0); +#endif // MS_CLOSE_TIME + return wholeSecond; +} + +ConsensusTime +withMsCloseTime(Application& app, TimePoint closeTimeSec) +{ +#ifdef MS_CLOSE_TIME + if (protocolHasMsCloseTime(app.getLedgerManager() + .getLastClosedLedgerHeader() + .header.ledgerVersion)) + { + // A random offset within the same whole second + return makeConsensusTime(closeTimeSec, rand_uniform(0, 999)); + } +#endif // MS_CLOSE_TIME + return makeConsensusTime(closeTimeSec); +} + SecretKey getRoot(Hash const& networkID) { @@ -1989,8 +2045,10 @@ executeUpgrades(Application& app, xdr::xvector const& upgrades, auto const& lcl = lm.getLastClosedLedgerHeader(); auto txSet = TxSetXDRFrame::makeEmpty(lcl); auto lastCloseTime = lcl.header.scpValue.closeTime; - app.getHerder().externalizeValue(txSet, lcl.header.ledgerSeq + 1, - lastCloseTime, upgrades); + app.getHerder().externalizeValue( + txSet, lcl.header.ledgerSeq + 1, + ConsensusTime::fromApplyTime(ApplyTime::fromTimePoint(lastCloseTime)), + upgrades); captureLastClosedLedgerLcm(app); diff --git a/src/test/TxTests.h b/src/test/TxTests.h index b73fd2bb94..e842570fa2 100644 --- a/src/test/TxTests.h +++ b/src/test/TxTests.h @@ -7,6 +7,7 @@ #include "crypto/SecretKey.h" #include "herder/LedgerCloseData.h" #include "herder/Upgrades.h" +#include "ledger/LedgerHeaderUtils.h" #include "overlay/StellarXDR.h" #include "transactions/test/TransactionTestFrame.h" #include @@ -106,12 +107,32 @@ closeLedgerOn(Application& app, uint32 ledgerSeq, TimePoint closeTime, xdr::xvector const& upgrades = emptyUpgradeSteps, ParallelSorobanOrder const& parallelSorobanOrder = {}); +// A sub-second consensus close time is only valid once the protocol uses +// millisecond close times. +TransactionResultSet +closeLedgerOn(Application& app, uint32 ledgerSeq, ConsensusTime closeTime, + std::vector const& txs = {}, + bool strictOrder = false, + xdr::xvector const& upgrades = emptyUpgradeSteps, + ParallelSorobanOrder const& parallelSorobanOrder = {}); + TransactionResultSet closeLedger(Application& app, TxSetXDRFrameConstPtr txSet); TransactionResultSet closeLedgerOn(Application& app, uint32 ledgerSeq, - time_t closeTime, + TimePoint closeTime, + TxSetXDRFrameConstPtr txSet); +TransactionResultSet closeLedgerOn(Application& app, uint32 ledgerSeq, + ConsensusTime closeTime, TxSetXDRFrameConstPtr txSet); +// Returns the requested whole-second close time, offset by a random number +// of milliseconds within that second if the protocol supports ms close times. +ConsensusTime withMsCloseTime(Application& app, TimePoint closeTimeSec); + +// A consensus close time `milliseconds` (in [0, 999]) into the whole second +// `timePoint`. Non-zero `milliseconds` require an MS_CLOSE_TIME build. +ConsensusTime makeConsensusTime(TimePoint timePoint, uint32_t milliseconds = 0); + TransactionResultSet closeLedgerOn(Application& app, uint32 ledgerSeq, int day, int month, int year, std::vector const& txs = {}, diff --git a/src/testdata/ledger-close-meta-enable-classic-events-v2-protocol-29-soroban.json b/src/testdata/ledger-close-meta-enable-classic-events-v2-protocol-29-soroban.json index 2d2145da09..dfdac637e2 100644 --- a/src/testdata/ledger-close-meta-enable-classic-events-v2-protocol-29-soroban.json +++ b/src/testdata/ledger-close-meta-enable-classic-events-v2-protocol-29-soroban.json @@ -6,23 +6,26 @@ "v": 0 }, "ledgerHeader": { - "hash": "a1ecb66a01d441842680bd176688f8fb4fabfcd66405be8eb18e7c2bfb9ce55f", + "hash": "02252507eac3d0229fec8efa50d0beec41cc93f4f49bbd0abeb39acd68a7fc7b", "header": { "ledgerVersion": 29, - "previousLedgerHash": "b5bd09d6528b4d187f89bc5beef4858a36277b86d3164a22012f09e627f3c79a", + "previousLedgerHash": "8abc7251902f916206e2c199a89e27dd736f6495c75096264c716e37908c7cba", "scpValue": { - "txSetHash": "9f3afb4b2a2fe482b61ee1289ab2d873649e586835abdb5134a52b40943b82a2", + "txSetHash": "f28ab765cd766795459c401f64e3042e7872477b0f8d93b557c9d558cc47e3d1", "closeTime": 1451692801, "upgrades": [], "ext": { - "v": "STELLAR_VALUE_SIGNED", - "lcValueSignature": { - "nodeID": "GDDOUW25MRFLNXQMN3OODP6JQEXSGLMHAFZV4XPQ2D3GA4QFIDMEJG2O", - "signature": "c5383227e6586ad79f9bffe458b96096373a1cb599505a032ea57b50fa77a1018aa3028bd43657d5d26701abe9e40cd31303510dedfce54fb730dfe7c80f9b03" + "v": "STELLAR_VALUE_SIGNED_MS", + "signedMsValue": { + "closeTimeMs": 1451692801000, + "lcValueSignature": { + "nodeID": "GDDOUW25MRFLNXQMN3OODP6JQEXSGLMHAFZV4XPQ2D3GA4QFIDMEJG2O", + "signature": "6e41f3db6bd2d96d30f14ec10260edd93090abd2c88fcea39bb2fadbffeadbf9a1294685f5f6101b18fffa1abe17a3c85abf749b1b7e7070f049b5173ad80d02" + } } } }, - "txSetResultHash": "fc6de71aa5fddf71e9e02fc24863156b9427337e7e5a03f4918bf5d062cf9633", + "txSetResultHash": "5709f8645760d3a257f37c924573531d87b92d2e8a302b5a405cf07094d62220", "bucketListHash": "6c5a225636327f69de158b0a0b350c0e3104ec8f84b98223fa0e45c3cdf3fc71", "ledgerSeq": 31, "totalCoins": 1000000000000000000, @@ -49,7 +52,7 @@ "txSet": { "v": 1, "v1TxSet": { - "previousLedgerHash": "b5bd09d6528b4d187f89bc5beef4858a36277b86d3164a22012f09e627f3c79a", + "previousLedgerHash": "8abc7251902f916206e2c199a89e27dd736f6495c75096264c716e37908c7cba", "phases": [ { "v": 0, @@ -505,18 +508,18 @@ "v": 0 }, "result": { - "transactionHash": "47fd1151d61624bbce0b9a9f7883c60ccd70bcdf6f6c640a53e13e3fa856609f", + "transactionHash": "9f16a9c2ea090a97d6557e89266cad9a19a1a9db6c1d3698e4b189af34e5e585", "result": { - "feeCharged": 51269, + "feeCharged": 45161, "result": { - "code": "txSUCCESS", + "code": "txFAILED", "results": [ { "code": "opINNER", "tr": { - "type": "EXTEND_FOOTPRINT_TTL", - "extendFootprintTTLResult": { - "code": "EXTEND_FOOTPRINT_TTL_SUCCESS" + "type": "INVOKE_HOST_FUNCTION", + "invokeHostFunctionResult": { + "code": "INVOKE_HOST_FUNCTION_RESOURCE_LIMIT_EXCEEDED" } } } @@ -531,13 +534,13 @@ { "type": "LEDGER_ENTRY_STATE", "state": { - "lastModifiedLedgerSeq": 12, + "lastModifiedLedgerSeq": 15, "data": { "type": "ACCOUNT", "account": { - "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", "balance": 400000000, - "seqNum": 51539607552, + "seqNum": 64424509440, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -561,9 +564,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", - "balance": 398999900, - "seqNum": 51539607552, + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "balance": 398953838, + "seqNum": 64424509440, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -595,9 +598,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", - "balance": 398999900, - "seqNum": 51539607552, + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "balance": 398953838, + "seqNum": 64424509440, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -621,9 +624,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", - "balance": 398999900, - "seqNum": 51539607553, + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "balance": 398953838, + "seqNum": 64424509441, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -665,87 +668,9 @@ } } ], - "operations": [ - { - "ext": { - "v": 0 - }, - "changes": [ - { - "type": "LEDGER_ENTRY_STATE", - "state": { - "lastModifiedLedgerSeq": 9, - "data": { - "type": "TTL", - "ttl": { - "keyHash": "091ddece931776a53f93869b82c24e132cc12d00d961fac09bc3b9cb9021c62d", - "liveUntilLedgerSeq": 10009 - } - }, - "ext": { - "v": 0 - } - } - }, - { - "type": "LEDGER_ENTRY_UPDATED", - "updated": { - "lastModifiedLedgerSeq": 31, - "data": { - "type": "TTL", - "ttl": { - "keyHash": "091ddece931776a53f93869b82c24e132cc12d00d961fac09bc3b9cb9021c62d", - "liveUntilLedgerSeq": 10031 - } - }, - "ext": { - "v": 0 - } - } - }, - { - "type": "LEDGER_ENTRY_STATE", - "state": { - "lastModifiedLedgerSeq": 9, - "data": { - "type": "TTL", - "ttl": { - "keyHash": "60313f9b273db0b14c3e503cf6cc152dd14a0c57e5e81a23e86b4e27a23a2c06", - "liveUntilLedgerSeq": 10009 - } - }, - "ext": { - "v": 0 - } - } - }, - { - "type": "LEDGER_ENTRY_UPDATED", - "updated": { - "lastModifiedLedgerSeq": 31, - "data": { - "type": "TTL", - "ttl": { - "keyHash": "60313f9b273db0b14c3e503cf6cc152dd14a0c57e5e81a23e86b4e27a23a2c06", - "liveUntilLedgerSeq": 10031 - } - }, - "ext": { - "v": 0 - } - } - } - ], - "events": [] - } - ], + "operations": [], "txChangesAfter": [], - "sorobanMeta": { - "ext": { - "v": 0 - }, - "returnValue": null - }, + "sorobanMeta": null, "events": [ { "stage": "TRANSACTION_EVENT_STAGE_BEFORE_ALL_TXS", @@ -765,14 +690,14 @@ }, { "type": "SCV_ADDRESS", - "address": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ" + "address": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU" } ], "data": { "type": "SCV_I128", "i128": { "hi": 0, - "lo": 1000100 + "lo": 1046162 } } } @@ -797,14 +722,14 @@ }, { "type": "SCV_ADDRESS", - "address": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ" + "address": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU" } ], "data": { "type": "SCV_I128", "i128": { "hi": -1, - "lo": 18446744073708602785 + "lo": 18446744073708550615 } } } @@ -823,9 +748,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", - "balance": 398999900, - "seqNum": 51539607553, + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "balance": 398953838, + "seqNum": 64424509441, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -873,9 +798,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", - "balance": 399948731, - "seqNum": 51539607553, + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "balance": 399954839, + "seqNum": 64424509441, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -923,18 +848,18 @@ "v": 0 }, "result": { - "transactionHash": "89c02a589a36decde3f1e6f9aa8b629fc012daa68eefc76b3763bcc1fdb2609d", + "transactionHash": "7c5d889bd9b1b3a9061b13f9a23443a54539751ee31a0ae661d996b45c44675e", "result": { - "feeCharged": 54107, + "feeCharged": 54053, "result": { - "code": "txSUCCESS", + "code": "txFAILED", "results": [ { "code": "opINNER", "tr": { - "type": "RESTORE_FOOTPRINT", - "restoreFootprintResult": { - "code": "RESTORE_FOOTPRINT_SUCCESS" + "type": "INVOKE_HOST_FUNCTION", + "invokeHostFunctionResult": { + "code": "INVOKE_HOST_FUNCTION_TRAPPED" } } } @@ -949,13 +874,13 @@ { "type": "LEDGER_ENTRY_STATE", "state": { - "lastModifiedLedgerSeq": 11, + "lastModifiedLedgerSeq": 14, "data": { "type": "ACCOUNT", "account": { - "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", "balance": 400000000, - "seqNum": 47244640256, + "seqNum": 60129542144, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -979,9 +904,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", - "balance": 398999900, - "seqNum": 47244640256, + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "balance": 399905947, + "seqNum": 60129542144, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1013,9 +938,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", - "balance": 398999900, - "seqNum": 47244640256, + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "balance": 399905947, + "seqNum": 60129542144, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1039,9 +964,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", - "balance": 398999900, - "seqNum": 47244640257, + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "balance": 399905947, + "seqNum": 60129542145, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1083,66 +1008,9 @@ } } ], - "operations": [ - { - "ext": { - "v": 0 - }, - "changes": [ - { - "type": "LEDGER_ENTRY_RESTORED", - "restored": { - "lastModifiedLedgerSeq": 10, - "data": { - "type": "CONTRACT_DATA", - "contractData": { - "ext": { - "v": 0 - }, - "contract": "CAA3QKIP2SNVXUJTB4HKOGF55JTSSMQGED3FZYNHMNSXYV3DRRMAWA3Y", - "key": { - "type": "SCV_SYMBOL", - "sym": "archived" - }, - "durability": "PERSISTENT", - "val": { - "type": "SCV_U64", - "u64": 42 - } - } - }, - "ext": { - "v": 0 - } - } - }, - { - "type": "LEDGER_ENTRY_RESTORED", - "restored": { - "lastModifiedLedgerSeq": 31, - "data": { - "type": "TTL", - "ttl": { - "keyHash": "4791962cd1e2c7b8f8af3f96514f9777f0156a48261fb885a571a7f69b33a058", - "liveUntilLedgerSeq": 50 - } - }, - "ext": { - "v": 0 - } - } - } - ], - "events": [] - } - ], + "operations": [], "txChangesAfter": [], - "sorobanMeta": { - "ext": { - "v": 0 - }, - "returnValue": null - }, + "sorobanMeta": null, "events": [ { "stage": "TRANSACTION_EVENT_STAGE_BEFORE_ALL_TXS", @@ -1162,14 +1030,14 @@ }, { "type": "SCV_ADDRESS", - "address": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB" + "address": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR" } ], "data": { "type": "SCV_I128", "i128": { "hi": 0, - "lo": 1000100 + "lo": 94053 } } } @@ -1194,14 +1062,14 @@ }, { "type": "SCV_ADDRESS", - "address": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB" + "address": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR" } ], "data": { "type": "SCV_I128", "i128": { "hi": -1, - "lo": 18446744073708605623 + "lo": 18446744073709511616 } } } @@ -1220,9 +1088,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", - "balance": 398999900, - "seqNum": 47244640257, + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "balance": 399905947, + "seqNum": 60129542145, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1270,9 +1138,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", - "balance": 399945893, - "seqNum": 47244640257, + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "balance": 399945947, + "seqNum": 60129542145, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1320,18 +1188,18 @@ "v": 0 }, "result": { - "transactionHash": "7c5d889bd9b1b3a9061b13f9a23443a54539751ee31a0ae661d996b45c44675e", + "transactionHash": "47fd1151d61624bbce0b9a9f7883c60ccd70bcdf6f6c640a53e13e3fa856609f", "result": { - "feeCharged": 54053, + "feeCharged": 51269, "result": { - "code": "txFAILED", + "code": "txSUCCESS", "results": [ { "code": "opINNER", "tr": { - "type": "INVOKE_HOST_FUNCTION", - "invokeHostFunctionResult": { - "code": "INVOKE_HOST_FUNCTION_TRAPPED" + "type": "EXTEND_FOOTPRINT_TTL", + "extendFootprintTTLResult": { + "code": "EXTEND_FOOTPRINT_TTL_SUCCESS" } } } @@ -1346,13 +1214,13 @@ { "type": "LEDGER_ENTRY_STATE", "state": { - "lastModifiedLedgerSeq": 14, + "lastModifiedLedgerSeq": 12, "data": { "type": "ACCOUNT", "account": { - "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", "balance": 400000000, - "seqNum": 60129542144, + "seqNum": 51539607552, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1376,9 +1244,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", - "balance": 399905947, - "seqNum": 60129542144, + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 398999900, + "seqNum": 51539607552, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1410,9 +1278,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", - "balance": 399905947, - "seqNum": 60129542144, + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 398999900, + "seqNum": 51539607552, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1436,9 +1304,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", - "balance": 399905947, - "seqNum": 60129542145, + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 398999900, + "seqNum": 51539607553, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1480,9 +1348,87 @@ } } ], - "operations": [], + "operations": [ + { + "ext": { + "v": 0 + }, + "changes": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 9, + "data": { + "type": "TTL", + "ttl": { + "keyHash": "091ddece931776a53f93869b82c24e132cc12d00d961fac09bc3b9cb9021c62d", + "liveUntilLedgerSeq": 10009 + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "TTL", + "ttl": { + "keyHash": "091ddece931776a53f93869b82c24e132cc12d00d961fac09bc3b9cb9021c62d", + "liveUntilLedgerSeq": 10031 + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 9, + "data": { + "type": "TTL", + "ttl": { + "keyHash": "60313f9b273db0b14c3e503cf6cc152dd14a0c57e5e81a23e86b4e27a23a2c06", + "liveUntilLedgerSeq": 10009 + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "TTL", + "ttl": { + "keyHash": "60313f9b273db0b14c3e503cf6cc152dd14a0c57e5e81a23e86b4e27a23a2c06", + "liveUntilLedgerSeq": 10031 + } + }, + "ext": { + "v": 0 + } + } + } + ], + "events": [] + } + ], "txChangesAfter": [], - "sorobanMeta": null, + "sorobanMeta": { + "ext": { + "v": 0 + }, + "returnValue": null + }, "events": [ { "stage": "TRANSACTION_EVENT_STAGE_BEFORE_ALL_TXS", @@ -1502,14 +1448,14 @@ }, { "type": "SCV_ADDRESS", - "address": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR" + "address": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ" } ], "data": { "type": "SCV_I128", "i128": { "hi": 0, - "lo": 94053 + "lo": 1000100 } } } @@ -1534,14 +1480,14 @@ }, { "type": "SCV_ADDRESS", - "address": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR" + "address": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ" } ], "data": { "type": "SCV_I128", "i128": { "hi": -1, - "lo": 18446744073709511616 + "lo": 18446744073708602785 } } } @@ -1560,9 +1506,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", - "balance": 399905947, - "seqNum": 60129542145, + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 398999900, + "seqNum": 51539607553, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1610,9 +1556,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", - "balance": 399945947, - "seqNum": 60129542145, + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 399948731, + "seqNum": 51539607553, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1660,18 +1606,18 @@ "v": 0 }, "result": { - "transactionHash": "9f16a9c2ea090a97d6557e89266cad9a19a1a9db6c1d3698e4b189af34e5e585", + "transactionHash": "89c02a589a36decde3f1e6f9aa8b629fc012daa68eefc76b3763bcc1fdb2609d", "result": { - "feeCharged": 45161, + "feeCharged": 54107, "result": { - "code": "txFAILED", + "code": "txSUCCESS", "results": [ { "code": "opINNER", "tr": { - "type": "INVOKE_HOST_FUNCTION", - "invokeHostFunctionResult": { - "code": "INVOKE_HOST_FUNCTION_RESOURCE_LIMIT_EXCEEDED" + "type": "RESTORE_FOOTPRINT", + "restoreFootprintResult": { + "code": "RESTORE_FOOTPRINT_SUCCESS" } } } @@ -1686,13 +1632,13 @@ { "type": "LEDGER_ENTRY_STATE", "state": { - "lastModifiedLedgerSeq": 15, + "lastModifiedLedgerSeq": 11, "data": { "type": "ACCOUNT", "account": { - "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", "balance": 400000000, - "seqNum": 64424509440, + "seqNum": 47244640256, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1716,9 +1662,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", - "balance": 398953838, - "seqNum": 64424509440, + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 398999900, + "seqNum": 47244640256, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1750,9 +1696,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", - "balance": 398953838, - "seqNum": 64424509440, + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 398999900, + "seqNum": 47244640256, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1776,9 +1722,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", - "balance": 398953838, - "seqNum": 64424509441, + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 398999900, + "seqNum": 47244640257, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1820,9 +1766,66 @@ } } ], - "operations": [], + "operations": [ + { + "ext": { + "v": 0 + }, + "changes": [ + { + "type": "LEDGER_ENTRY_RESTORED", + "restored": { + "lastModifiedLedgerSeq": 10, + "data": { + "type": "CONTRACT_DATA", + "contractData": { + "ext": { + "v": 0 + }, + "contract": "CAA3QKIP2SNVXUJTB4HKOGF55JTSSMQGED3FZYNHMNSXYV3DRRMAWA3Y", + "key": { + "type": "SCV_SYMBOL", + "sym": "archived" + }, + "durability": "PERSISTENT", + "val": { + "type": "SCV_U64", + "u64": 42 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_RESTORED", + "restored": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "TTL", + "ttl": { + "keyHash": "4791962cd1e2c7b8f8af3f96514f9777f0156a48261fb885a571a7f69b33a058", + "liveUntilLedgerSeq": 50 + } + }, + "ext": { + "v": 0 + } + } + } + ], + "events": [] + } + ], "txChangesAfter": [], - "sorobanMeta": null, + "sorobanMeta": { + "ext": { + "v": 0 + }, + "returnValue": null + }, "events": [ { "stage": "TRANSACTION_EVENT_STAGE_BEFORE_ALL_TXS", @@ -1842,14 +1845,14 @@ }, { "type": "SCV_ADDRESS", - "address": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU" + "address": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB" } ], "data": { "type": "SCV_I128", "i128": { "hi": 0, - "lo": 1046162 + "lo": 1000100 } } } @@ -1874,14 +1877,14 @@ }, { "type": "SCV_ADDRESS", - "address": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU" + "address": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB" } ], "data": { "type": "SCV_I128", "i128": { "hi": -1, - "lo": 18446744073708550615 + "lo": 18446744073708605623 } } } @@ -1900,9 +1903,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", - "balance": 398953838, - "seqNum": 64424509441, + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 398999900, + "seqNum": 47244640257, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1950,9 +1953,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", - "balance": 399954839, - "seqNum": 64424509441, + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 399945893, + "seqNum": 47244640257, "numSubEntries": 0, "inflationDest": null, "flags": 0, diff --git a/src/testdata/ledger-close-meta-enable-classic-events-v2-protocol-29.json b/src/testdata/ledger-close-meta-enable-classic-events-v2-protocol-29.json index 5a4ffb8cb8..b7f0f74244 100644 --- a/src/testdata/ledger-close-meta-enable-classic-events-v2-protocol-29.json +++ b/src/testdata/ledger-close-meta-enable-classic-events-v2-protocol-29.json @@ -6,23 +6,26 @@ "v": 0 }, "ledgerHeader": { - "hash": "033efbcfe877da6eddf79989e239870ba159458563577bd1dafd0ec185071612", + "hash": "fe2897063302702febee594b524126eeb016cd191478b68052ffbce7e69034fc", "header": { "ledgerVersion": 29, - "previousLedgerHash": "a8b6f62f7cefac1a289a918f71429b57bf3b8e9862a7a1a5f40b3c202892907b", + "previousLedgerHash": "36848ef780523793bf76cefeac3d81a396a212735e9cd5519ea5429d4d56cd9f", "scpValue": { - "txSetHash": "6fd02f728a6b25f2415caeb4251c78dbe0691e9c580da45ba3b8be9c3f107ef6", + "txSetHash": "b70a9fa4d06486144a5a31d9be6c513f19e6b2fe1ae1eb94f56af141f6d7454b", "closeTime": 1451692801, "upgrades": [], "ext": { - "v": "STELLAR_VALUE_SIGNED", - "lcValueSignature": { - "nodeID": "GDDOUW25MRFLNXQMN3OODP6JQEXSGLMHAFZV4XPQ2D3GA4QFIDMEJG2O", - "signature": "98fd384be82a3ec5150692fe3aabb8a61cd87d8af03521fda43b29183a7ed414bdb53e55dc108fff8c1f2ace9e4f5b771d7c61db8a0186a20d6de3d6380af800" + "v": "STELLAR_VALUE_SIGNED_MS", + "signedMsValue": { + "closeTimeMs": 1451692801000, + "lcValueSignature": { + "nodeID": "GDDOUW25MRFLNXQMN3OODP6JQEXSGLMHAFZV4XPQ2D3GA4QFIDMEJG2O", + "signature": "add084d4ea36d1e09c291cfa353f5030f13f38f45b34d0b04acee59e009c266eb4006af27719e6f6d3d51813e98f96c20e286270e217c33c92c83d790e396b0e" + } } } }, - "txSetResultHash": "fd6fb3b06784653ffa2057ae36184c8d9ee185c4ae35f0ba9e076059746fb659", + "txSetResultHash": "7f284d6f6089dcf4f3b44a28922ac95858dcbfc529cadb03e4ebc4d20a558dea", "bucketListHash": "1c1dc3c57f556ff0512ae950a34009b25377ee0b51037f839407af09da23b1df", "ledgerSeq": 10, "totalCoins": 1000000000000000000, @@ -49,7 +52,7 @@ "txSet": { "v": 1, "v1TxSet": { - "previousLedgerHash": "a8b6f62f7cefac1a289a918f71429b57bf3b8e9862a7a1a5f40b3c202892907b", + "previousLedgerHash": "36848ef780523793bf76cefeac3d81a396a212735e9cd5519ea5429d4d56cd9f", "phases": [ { "v": 0, @@ -191,43 +194,22 @@ "v": 0 }, "result": { - "transactionHash": "a186ddc5b2d55b64ffd84f1af13889001b73f0bc69263b17b21e6b92480b32f1", + "transactionHash": "80aa42315c73ade8bf88588947d215771ddd61ce447e220c119b64879a262af9", "result": { - "feeCharged": 300, + "feeCharged": 100, "result": { - "code": "txFEE_BUMP_INNER_SUCCESS", - "innerResultPair": { - "transactionHash": "ef356999aea407ce7c1a16e0640065bcf9b1e853ae8f1730a816a5152ceb28e6", - "result": { - "feeCharged": 0, - "result": { - "code": "txSUCCESS", - "results": [ - { - "code": "opINNER", - "tr": { - "type": "PAYMENT", - "paymentResult": { - "code": "PAYMENT_SUCCESS" - } - } - }, - { - "code": "opINNER", - "tr": { - "type": "PAYMENT", - "paymentResult": { - "code": "PAYMENT_SUCCESS" - } - } - } - ] - }, - "ext": { - "v": 0 + "code": "txSUCCESS", + "results": [ + { + "code": "opINNER", + "tr": { + "type": "PAYMENT", + "paymentResult": { + "code": "PAYMENT_SUCCESS" + } } } - } + ] }, "ext": { "v": 0 @@ -238,13 +220,13 @@ { "type": "LEDGER_ENTRY_STATE", "state": { - "lastModifiedLedgerSeq": 7, + "lastModifiedLedgerSeq": 8, "data": { "type": "ACCOUNT", "account": { - "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", - "balance": 400000000, - "seqNum": 30064771072, + "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", + "balance": 999999998991791666, + "seqNum": 6, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -252,7 +234,31 @@ "thresholds": "01000000", "signers": [], "ext": { - "v": 0 + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 8, + "seqTime": 1451692801 + } + } + } + } + } } } }, @@ -268,9 +274,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", - "balance": 399999700, - "seqNum": 30064771072, + "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", + "balance": 999999998991791566, + "seqNum": 6, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -278,7 +284,31 @@ "thresholds": "01000000", "signers": [], "ext": { - "v": 0 + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 8, + "seqTime": 1451692801 + } + } + } + } + } } } }, @@ -302,61 +332,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", - "balance": 399999700, - "seqNum": 30064771072, - "numSubEntries": 0, - "inflationDest": null, - "flags": 0, - "homeDomain": "", - "thresholds": "01000000", - "signers": [], - "ext": { - "v": 0 - } - } - }, - "ext": { - "v": 0 - } - } - }, - { - "type": "LEDGER_ENTRY_UPDATED", - "updated": { - "lastModifiedLedgerSeq": 10, - "data": { - "type": "ACCOUNT", - "account": { - "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", - "balance": 399999700, - "seqNum": 30064771072, - "numSubEntries": 0, - "inflationDest": null, - "flags": 0, - "homeDomain": "", - "thresholds": "01000000", - "signers": [], - "ext": { - "v": 0 - } - } - }, - "ext": { - "v": 0 - } - } - }, - { - "type": "LEDGER_ENTRY_STATE", - "state": { - "lastModifiedLedgerSeq": 8, - "data": { - "type": "ACCOUNT", - "account": { - "accountID": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q", - "balance": 200010000, - "seqNum": 34359738368, + "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", + "balance": 999999998991791566, + "seqNum": 6, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -364,7 +342,31 @@ "thresholds": "01000000", "signers": [], "ext": { - "v": 0 + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 8, + "seqTime": 1451692801 + } + } + } + } + } } } }, @@ -380,9 +382,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q", - "balance": 200010000, - "seqNum": 34359738369, + "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", + "balance": 999999998991791566, + "seqNum": 7, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -435,18 +437,43 @@ "state": { "lastModifiedLedgerSeq": 9, "data": { - "type": "TRUSTLINE", - "trustLine": { + "type": "ACCOUNT", + "account": { "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", - "asset": { - "assetCode": "CUR1", - "issuer": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q" - }, - "balance": 0, - "limit": 100, - "flags": 1, + "balance": 399999900, + "seqNum": 25769803777, + "numSubEntries": 1, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], "ext": { - "v": 0 + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 9, + "seqTime": 1451692801 + } + } + } + } + } } } }, @@ -460,18 +487,43 @@ "updated": { "lastModifiedLedgerSeq": 10, "data": { - "type": "TRUSTLINE", - "trustLine": { + "type": "ACCOUNT", + "account": { "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", - "asset": { - "assetCode": "CUR1", - "issuer": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q" - }, - "balance": 50, - "limit": 100, - "flags": 1, + "balance": 400000900, + "seqNum": 25769803777, + "numSubEntries": 1, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], "ext": { - "v": 0 + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 9, + "seqTime": 1451692801 + } + } + } + } + } } } }, @@ -479,66 +531,49 @@ "v": 0 } } - } - ], - "events": [ - { - "ext": { - "v": 0 - }, - "contractID": "daeb920027ff2366d5e92f93b1f13482edbdfa2adba2c3efe6af2dffa2ee86d5", - "type": "CONTRACT", - "body": { - "v": 0, - "v0": { - "topics": [ - { - "type": "SCV_SYMBOL", - "sym": "mint" - }, - { - "type": "SCV_ADDRESS", - "address": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB" - }, - { - "type": "SCV_STRING", - "str": "CUR1:GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q" - } - ], - "data": { - "type": "SCV_I128", - "i128": { - "hi": 0, - "lo": 50 - } - } - } - } - } - ] - }, - { - "ext": { - "v": 0 - }, - "changes": [ + }, { "type": "LEDGER_ENTRY_STATE", "state": { "lastModifiedLedgerSeq": 10, "data": { - "type": "TRUSTLINE", - "trustLine": { - "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", - "asset": { - "assetCode": "CUR1", - "issuer": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q" - }, - "balance": 50, - "limit": 100, - "flags": 1, + "type": "ACCOUNT", + "account": { + "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", + "balance": 999999998991791566, + "seqNum": 7, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], "ext": { - "v": 0 + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 10, + "seqTime": 1451692801 + } + } + } + } + } } } }, @@ -552,18 +587,43 @@ "updated": { "lastModifiedLedgerSeq": 10, "data": { - "type": "TRUSTLINE", - "trustLine": { - "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", - "asset": { - "assetCode": "CUR1", - "issuer": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q" - }, - "balance": 100, - "limit": 100, - "flags": 1, + "type": "ACCOUNT", + "account": { + "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", + "balance": 999999998991790566, + "seqNum": 7, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], "ext": { - "v": 0 + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 10, + "seqTime": 1451692801 + } + } + } + } + } } } }, @@ -578,7 +638,7 @@ "ext": { "v": 0 }, - "contractID": "daeb920027ff2366d5e92f93b1f13482edbdfa2adba2c3efe6af2dffa2ee86d5", + "contractID": "baa393105df75969301ed9ce82ecc9fe38d4063f97ac0a41d07a7b505d8e9d43", "type": "CONTRACT", "body": { "v": 0, @@ -586,7 +646,11 @@ "topics": [ { "type": "SCV_SYMBOL", - "sym": "mint" + "sym": "transfer" + }, + { + "type": "SCV_ADDRESS", + "address": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X" }, { "type": "SCV_ADDRESS", @@ -594,14 +658,14 @@ }, { "type": "SCV_STRING", - "str": "CUR1:GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q" + "str": "native" } ], "data": { "type": "SCV_I128", "i128": { "hi": 0, - "lo": 50 + "lo": 1000 } } } @@ -631,14 +695,14 @@ }, { "type": "SCV_ADDRESS", - "address": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ" + "address": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X" } ], "data": { "type": "SCV_I128", "i128": { "hi": 0, - "lo": 300 + "lo": 100 } } } @@ -656,22 +720,43 @@ "v": 0 }, "result": { - "transactionHash": "80aa42315c73ade8bf88588947d215771ddd61ce447e220c119b64879a262af9", + "transactionHash": "a186ddc5b2d55b64ffd84f1af13889001b73f0bc69263b17b21e6b92480b32f1", "result": { - "feeCharged": 100, + "feeCharged": 300, "result": { - "code": "txSUCCESS", - "results": [ - { - "code": "opINNER", - "tr": { - "type": "PAYMENT", - "paymentResult": { - "code": "PAYMENT_SUCCESS" - } + "code": "txFEE_BUMP_INNER_SUCCESS", + "innerResultPair": { + "transactionHash": "ef356999aea407ce7c1a16e0640065bcf9b1e853ae8f1730a816a5152ceb28e6", + "result": { + "feeCharged": 0, + "result": { + "code": "txSUCCESS", + "results": [ + { + "code": "opINNER", + "tr": { + "type": "PAYMENT", + "paymentResult": { + "code": "PAYMENT_SUCCESS" + } + } + }, + { + "code": "opINNER", + "tr": { + "type": "PAYMENT", + "paymentResult": { + "code": "PAYMENT_SUCCESS" + } + } + } + ] + }, + "ext": { + "v": 0 } } - ] + } }, "ext": { "v": 0 @@ -682,13 +767,13 @@ { "type": "LEDGER_ENTRY_STATE", "state": { - "lastModifiedLedgerSeq": 8, + "lastModifiedLedgerSeq": 7, "data": { "type": "ACCOUNT", "account": { - "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", - "balance": 999999998991791666, - "seqNum": 6, + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 400000000, + "seqNum": 30064771072, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -696,31 +781,7 @@ "thresholds": "01000000", "signers": [], "ext": { - "v": 1, - "v1": { - "liabilities": { - "buying": 0, - "selling": 0 - }, - "ext": { - "v": 2, - "v2": { - "numSponsored": 0, - "numSponsoring": 0, - "signerSponsoringIDs": [], - "ext": { - "v": 3, - "v3": { - "ext": { - "v": 0 - }, - "seqLedger": 8, - "seqTime": 1451692801 - } - } - } - } - } + "v": 0 } } }, @@ -736,9 +797,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", - "balance": 999999998991791566, - "seqNum": 6, + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 399999700, + "seqNum": 30064771072, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -746,31 +807,7 @@ "thresholds": "01000000", "signers": [], "ext": { - "v": 1, - "v1": { - "liabilities": { - "buying": 0, - "selling": 0 - }, - "ext": { - "v": 2, - "v2": { - "numSponsored": 0, - "numSponsoring": 0, - "signerSponsoringIDs": [], - "ext": { - "v": 3, - "v3": { - "ext": { - "v": 0 - }, - "seqLedger": 8, - "seqTime": 1451692801 - } - } - } - } - } + "v": 0 } } }, @@ -794,9 +831,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", - "balance": 999999998991791566, - "seqNum": 6, + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 399999700, + "seqNum": 30064771072, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -804,31 +841,59 @@ "thresholds": "01000000", "signers": [], "ext": { - "v": 1, - "v1": { - "liabilities": { - "buying": 0, - "selling": 0 - }, - "ext": { - "v": 2, - "v2": { - "numSponsored": 0, - "numSponsoring": 0, - "signerSponsoringIDs": [], - "ext": { - "v": 3, - "v3": { - "ext": { - "v": 0 - }, - "seqLedger": 8, - "seqTime": 1451692801 - } - } - } - } - } + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 10, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 399999700, + "seqNum": 30064771072, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 8, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q", + "balance": 200010000, + "seqNum": 34359738368, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 } } }, @@ -844,9 +909,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", - "balance": 999999998991791566, - "seqNum": 7, + "accountID": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q", + "balance": 200010000, + "seqNum": 34359738369, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -899,43 +964,18 @@ "state": { "lastModifiedLedgerSeq": 9, "data": { - "type": "ACCOUNT", - "account": { + "type": "TRUSTLINE", + "trustLine": { "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", - "balance": 399999900, - "seqNum": 25769803777, - "numSubEntries": 1, - "inflationDest": null, - "flags": 0, - "homeDomain": "", - "thresholds": "01000000", - "signers": [], + "asset": { + "assetCode": "CUR1", + "issuer": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q" + }, + "balance": 0, + "limit": 100, + "flags": 1, "ext": { - "v": 1, - "v1": { - "liabilities": { - "buying": 0, - "selling": 0 - }, - "ext": { - "v": 2, - "v2": { - "numSponsored": 0, - "numSponsoring": 0, - "signerSponsoringIDs": [], - "ext": { - "v": 3, - "v3": { - "ext": { - "v": 0 - }, - "seqLedger": 9, - "seqTime": 1451692801 - } - } - } - } - } + "v": 0 } } }, @@ -949,43 +989,18 @@ "updated": { "lastModifiedLedgerSeq": 10, "data": { - "type": "ACCOUNT", - "account": { + "type": "TRUSTLINE", + "trustLine": { "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", - "balance": 400000900, - "seqNum": 25769803777, - "numSubEntries": 1, - "inflationDest": null, - "flags": 0, - "homeDomain": "", - "thresholds": "01000000", - "signers": [], + "asset": { + "assetCode": "CUR1", + "issuer": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q" + }, + "balance": 50, + "limit": 100, + "flags": 1, "ext": { - "v": 1, - "v1": { - "liabilities": { - "buying": 0, - "selling": 0 - }, - "ext": { - "v": 2, - "v2": { - "numSponsored": 0, - "numSponsoring": 0, - "signerSponsoringIDs": [], - "ext": { - "v": 3, - "v3": { - "ext": { - "v": 0 - }, - "seqLedger": 9, - "seqTime": 1451692801 - } - } - } - } - } + "v": 0 } } }, @@ -993,49 +1008,66 @@ "v": 0 } } - }, + } + ], + "events": [ + { + "ext": { + "v": 0 + }, + "contractID": "daeb920027ff2366d5e92f93b1f13482edbdfa2adba2c3efe6af2dffa2ee86d5", + "type": "CONTRACT", + "body": { + "v": 0, + "v0": { + "topics": [ + { + "type": "SCV_SYMBOL", + "sym": "mint" + }, + { + "type": "SCV_ADDRESS", + "address": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB" + }, + { + "type": "SCV_STRING", + "str": "CUR1:GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q" + } + ], + "data": { + "type": "SCV_I128", + "i128": { + "hi": 0, + "lo": 50 + } + } + } + } + } + ] + }, + { + "ext": { + "v": 0 + }, + "changes": [ { "type": "LEDGER_ENTRY_STATE", "state": { "lastModifiedLedgerSeq": 10, "data": { - "type": "ACCOUNT", - "account": { - "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", - "balance": 999999998991791566, - "seqNum": 7, - "numSubEntries": 0, - "inflationDest": null, - "flags": 0, - "homeDomain": "", - "thresholds": "01000000", - "signers": [], + "type": "TRUSTLINE", + "trustLine": { + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "asset": { + "assetCode": "CUR1", + "issuer": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q" + }, + "balance": 50, + "limit": 100, + "flags": 1, "ext": { - "v": 1, - "v1": { - "liabilities": { - "buying": 0, - "selling": 0 - }, - "ext": { - "v": 2, - "v2": { - "numSponsored": 0, - "numSponsoring": 0, - "signerSponsoringIDs": [], - "ext": { - "v": 3, - "v3": { - "ext": { - "v": 0 - }, - "seqLedger": 10, - "seqTime": 1451692801 - } - } - } - } - } + "v": 0 } } }, @@ -1049,43 +1081,18 @@ "updated": { "lastModifiedLedgerSeq": 10, "data": { - "type": "ACCOUNT", - "account": { - "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", - "balance": 999999998991790566, - "seqNum": 7, - "numSubEntries": 0, - "inflationDest": null, - "flags": 0, - "homeDomain": "", - "thresholds": "01000000", - "signers": [], + "type": "TRUSTLINE", + "trustLine": { + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "asset": { + "assetCode": "CUR1", + "issuer": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q" + }, + "balance": 100, + "limit": 100, + "flags": 1, "ext": { - "v": 1, - "v1": { - "liabilities": { - "buying": 0, - "selling": 0 - }, - "ext": { - "v": 2, - "v2": { - "numSponsored": 0, - "numSponsoring": 0, - "signerSponsoringIDs": [], - "ext": { - "v": 3, - "v3": { - "ext": { - "v": 0 - }, - "seqLedger": 10, - "seqTime": 1451692801 - } - } - } - } - } + "v": 0 } } }, @@ -1100,7 +1107,7 @@ "ext": { "v": 0 }, - "contractID": "baa393105df75969301ed9ce82ecc9fe38d4063f97ac0a41d07a7b505d8e9d43", + "contractID": "daeb920027ff2366d5e92f93b1f13482edbdfa2adba2c3efe6af2dffa2ee86d5", "type": "CONTRACT", "body": { "v": 0, @@ -1108,11 +1115,7 @@ "topics": [ { "type": "SCV_SYMBOL", - "sym": "transfer" - }, - { - "type": "SCV_ADDRESS", - "address": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X" + "sym": "mint" }, { "type": "SCV_ADDRESS", @@ -1120,14 +1123,14 @@ }, { "type": "SCV_STRING", - "str": "native" + "str": "CUR1:GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q" } ], "data": { "type": "SCV_I128", "i128": { "hi": 0, - "lo": 1000 + "lo": 50 } } } @@ -1157,14 +1160,14 @@ }, { "type": "SCV_ADDRESS", - "address": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X" + "address": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ" } ], "data": { "type": "SCV_I128", "i128": { "hi": 0, - "lo": 100 + "lo": 300 } } } diff --git a/src/testdata/ledger-close-meta-v2-protocol-29-soroban.json b/src/testdata/ledger-close-meta-v2-protocol-29-soroban.json index 38706670c5..8731f689b7 100644 --- a/src/testdata/ledger-close-meta-v2-protocol-29-soroban.json +++ b/src/testdata/ledger-close-meta-v2-protocol-29-soroban.json @@ -6,23 +6,26 @@ "v": 0 }, "ledgerHeader": { - "hash": "a1ecb66a01d441842680bd176688f8fb4fabfcd66405be8eb18e7c2bfb9ce55f", + "hash": "02252507eac3d0229fec8efa50d0beec41cc93f4f49bbd0abeb39acd68a7fc7b", "header": { "ledgerVersion": 29, - "previousLedgerHash": "b5bd09d6528b4d187f89bc5beef4858a36277b86d3164a22012f09e627f3c79a", + "previousLedgerHash": "8abc7251902f916206e2c199a89e27dd736f6495c75096264c716e37908c7cba", "scpValue": { - "txSetHash": "9f3afb4b2a2fe482b61ee1289ab2d873649e586835abdb5134a52b40943b82a2", + "txSetHash": "f28ab765cd766795459c401f64e3042e7872477b0f8d93b557c9d558cc47e3d1", "closeTime": 1451692801, "upgrades": [], "ext": { - "v": "STELLAR_VALUE_SIGNED", - "lcValueSignature": { - "nodeID": "GDDOUW25MRFLNXQMN3OODP6JQEXSGLMHAFZV4XPQ2D3GA4QFIDMEJG2O", - "signature": "c5383227e6586ad79f9bffe458b96096373a1cb599505a032ea57b50fa77a1018aa3028bd43657d5d26701abe9e40cd31303510dedfce54fb730dfe7c80f9b03" + "v": "STELLAR_VALUE_SIGNED_MS", + "signedMsValue": { + "closeTimeMs": 1451692801000, + "lcValueSignature": { + "nodeID": "GDDOUW25MRFLNXQMN3OODP6JQEXSGLMHAFZV4XPQ2D3GA4QFIDMEJG2O", + "signature": "6e41f3db6bd2d96d30f14ec10260edd93090abd2c88fcea39bb2fadbffeadbf9a1294685f5f6101b18fffa1abe17a3c85abf749b1b7e7070f049b5173ad80d02" + } } } }, - "txSetResultHash": "fc6de71aa5fddf71e9e02fc24863156b9427337e7e5a03f4918bf5d062cf9633", + "txSetResultHash": "5709f8645760d3a257f37c924573531d87b92d2e8a302b5a405cf07094d62220", "bucketListHash": "6c5a225636327f69de158b0a0b350c0e3104ec8f84b98223fa0e45c3cdf3fc71", "ledgerSeq": 31, "totalCoins": 1000000000000000000, @@ -49,7 +52,7 @@ "txSet": { "v": 1, "v1TxSet": { - "previousLedgerHash": "b5bd09d6528b4d187f89bc5beef4858a36277b86d3164a22012f09e627f3c79a", + "previousLedgerHash": "8abc7251902f916206e2c199a89e27dd736f6495c75096264c716e37908c7cba", "phases": [ { "v": 0, @@ -505,18 +508,18 @@ "v": 0 }, "result": { - "transactionHash": "47fd1151d61624bbce0b9a9f7883c60ccd70bcdf6f6c640a53e13e3fa856609f", + "transactionHash": "9f16a9c2ea090a97d6557e89266cad9a19a1a9db6c1d3698e4b189af34e5e585", "result": { - "feeCharged": 51269, + "feeCharged": 45161, "result": { - "code": "txSUCCESS", + "code": "txFAILED", "results": [ { "code": "opINNER", "tr": { - "type": "EXTEND_FOOTPRINT_TTL", - "extendFootprintTTLResult": { - "code": "EXTEND_FOOTPRINT_TTL_SUCCESS" + "type": "INVOKE_HOST_FUNCTION", + "invokeHostFunctionResult": { + "code": "INVOKE_HOST_FUNCTION_RESOURCE_LIMIT_EXCEEDED" } } } @@ -531,13 +534,13 @@ { "type": "LEDGER_ENTRY_STATE", "state": { - "lastModifiedLedgerSeq": 12, + "lastModifiedLedgerSeq": 15, "data": { "type": "ACCOUNT", "account": { - "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", "balance": 400000000, - "seqNum": 51539607552, + "seqNum": 64424509440, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -561,9 +564,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", - "balance": 398999900, - "seqNum": 51539607552, + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "balance": 398953838, + "seqNum": 64424509440, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -595,9 +598,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", - "balance": 398999900, - "seqNum": 51539607552, + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "balance": 398953838, + "seqNum": 64424509440, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -621,9 +624,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", - "balance": 398999900, - "seqNum": 51539607553, + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "balance": 398953838, + "seqNum": 64424509441, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -665,87 +668,9 @@ } } ], - "operations": [ - { - "ext": { - "v": 0 - }, - "changes": [ - { - "type": "LEDGER_ENTRY_STATE", - "state": { - "lastModifiedLedgerSeq": 9, - "data": { - "type": "TTL", - "ttl": { - "keyHash": "091ddece931776a53f93869b82c24e132cc12d00d961fac09bc3b9cb9021c62d", - "liveUntilLedgerSeq": 10009 - } - }, - "ext": { - "v": 0 - } - } - }, - { - "type": "LEDGER_ENTRY_UPDATED", - "updated": { - "lastModifiedLedgerSeq": 31, - "data": { - "type": "TTL", - "ttl": { - "keyHash": "091ddece931776a53f93869b82c24e132cc12d00d961fac09bc3b9cb9021c62d", - "liveUntilLedgerSeq": 10031 - } - }, - "ext": { - "v": 0 - } - } - }, - { - "type": "LEDGER_ENTRY_STATE", - "state": { - "lastModifiedLedgerSeq": 9, - "data": { - "type": "TTL", - "ttl": { - "keyHash": "60313f9b273db0b14c3e503cf6cc152dd14a0c57e5e81a23e86b4e27a23a2c06", - "liveUntilLedgerSeq": 10009 - } - }, - "ext": { - "v": 0 - } - } - }, - { - "type": "LEDGER_ENTRY_UPDATED", - "updated": { - "lastModifiedLedgerSeq": 31, - "data": { - "type": "TTL", - "ttl": { - "keyHash": "60313f9b273db0b14c3e503cf6cc152dd14a0c57e5e81a23e86b4e27a23a2c06", - "liveUntilLedgerSeq": 10031 - } - }, - "ext": { - "v": 0 - } - } - } - ], - "events": [] - } - ], + "operations": [], "txChangesAfter": [], - "sorobanMeta": { - "ext": { - "v": 0 - }, - "returnValue": null - }, + "sorobanMeta": null, "events": [], "diagnosticEvents": [] } @@ -758,9 +683,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", - "balance": 398999900, - "seqNum": 51539607553, + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "balance": 398953838, + "seqNum": 64424509441, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -808,9 +733,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", - "balance": 399948731, - "seqNum": 51539607553, + "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "balance": 399954839, + "seqNum": 64424509441, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -858,18 +783,18 @@ "v": 0 }, "result": { - "transactionHash": "89c02a589a36decde3f1e6f9aa8b629fc012daa68eefc76b3763bcc1fdb2609d", + "transactionHash": "7c5d889bd9b1b3a9061b13f9a23443a54539751ee31a0ae661d996b45c44675e", "result": { - "feeCharged": 54107, + "feeCharged": 54053, "result": { - "code": "txSUCCESS", + "code": "txFAILED", "results": [ { "code": "opINNER", "tr": { - "type": "RESTORE_FOOTPRINT", - "restoreFootprintResult": { - "code": "RESTORE_FOOTPRINT_SUCCESS" + "type": "INVOKE_HOST_FUNCTION", + "invokeHostFunctionResult": { + "code": "INVOKE_HOST_FUNCTION_TRAPPED" } } } @@ -884,13 +809,13 @@ { "type": "LEDGER_ENTRY_STATE", "state": { - "lastModifiedLedgerSeq": 11, + "lastModifiedLedgerSeq": 14, "data": { "type": "ACCOUNT", "account": { - "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", "balance": 400000000, - "seqNum": 47244640256, + "seqNum": 60129542144, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -914,9 +839,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", - "balance": 398999900, - "seqNum": 47244640256, + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "balance": 399905947, + "seqNum": 60129542144, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -948,9 +873,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", - "balance": 398999900, - "seqNum": 47244640256, + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "balance": 399905947, + "seqNum": 60129542144, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -974,9 +899,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", - "balance": 398999900, - "seqNum": 47244640257, + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "balance": 399905947, + "seqNum": 60129542145, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1018,66 +943,9 @@ } } ], - "operations": [ - { - "ext": { - "v": 0 - }, - "changes": [ - { - "type": "LEDGER_ENTRY_RESTORED", - "restored": { - "lastModifiedLedgerSeq": 10, - "data": { - "type": "CONTRACT_DATA", - "contractData": { - "ext": { - "v": 0 - }, - "contract": "CAA3QKIP2SNVXUJTB4HKOGF55JTSSMQGED3FZYNHMNSXYV3DRRMAWA3Y", - "key": { - "type": "SCV_SYMBOL", - "sym": "archived" - }, - "durability": "PERSISTENT", - "val": { - "type": "SCV_U64", - "u64": 42 - } - } - }, - "ext": { - "v": 0 - } - } - }, - { - "type": "LEDGER_ENTRY_RESTORED", - "restored": { - "lastModifiedLedgerSeq": 31, - "data": { - "type": "TTL", - "ttl": { - "keyHash": "4791962cd1e2c7b8f8af3f96514f9777f0156a48261fb885a571a7f69b33a058", - "liveUntilLedgerSeq": 50 - } - }, - "ext": { - "v": 0 - } - } - } - ], - "events": [] - } - ], + "operations": [], "txChangesAfter": [], - "sorobanMeta": { - "ext": { - "v": 0 - }, - "returnValue": null - }, + "sorobanMeta": null, "events": [], "diagnosticEvents": [] } @@ -1090,9 +958,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", - "balance": 398999900, - "seqNum": 47244640257, + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "balance": 399905947, + "seqNum": 60129542145, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1140,9 +1008,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", - "balance": 399945893, - "seqNum": 47244640257, + "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "balance": 399945947, + "seqNum": 60129542145, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1190,18 +1058,18 @@ "v": 0 }, "result": { - "transactionHash": "7c5d889bd9b1b3a9061b13f9a23443a54539751ee31a0ae661d996b45c44675e", + "transactionHash": "47fd1151d61624bbce0b9a9f7883c60ccd70bcdf6f6c640a53e13e3fa856609f", "result": { - "feeCharged": 54053, + "feeCharged": 51269, "result": { - "code": "txFAILED", + "code": "txSUCCESS", "results": [ { "code": "opINNER", "tr": { - "type": "INVOKE_HOST_FUNCTION", - "invokeHostFunctionResult": { - "code": "INVOKE_HOST_FUNCTION_TRAPPED" + "type": "EXTEND_FOOTPRINT_TTL", + "extendFootprintTTLResult": { + "code": "EXTEND_FOOTPRINT_TTL_SUCCESS" } } } @@ -1216,13 +1084,13 @@ { "type": "LEDGER_ENTRY_STATE", "state": { - "lastModifiedLedgerSeq": 14, + "lastModifiedLedgerSeq": 12, "data": { "type": "ACCOUNT", "account": { - "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", "balance": 400000000, - "seqNum": 60129542144, + "seqNum": 51539607552, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1246,9 +1114,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", - "balance": 399905947, - "seqNum": 60129542144, + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 398999900, + "seqNum": 51539607552, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1280,9 +1148,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", - "balance": 399905947, - "seqNum": 60129542144, + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 398999900, + "seqNum": 51539607552, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1306,9 +1174,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", - "balance": 399905947, - "seqNum": 60129542145, + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 398999900, + "seqNum": 51539607553, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1350,9 +1218,87 @@ } } ], - "operations": [], + "operations": [ + { + "ext": { + "v": 0 + }, + "changes": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 9, + "data": { + "type": "TTL", + "ttl": { + "keyHash": "091ddece931776a53f93869b82c24e132cc12d00d961fac09bc3b9cb9021c62d", + "liveUntilLedgerSeq": 10009 + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "TTL", + "ttl": { + "keyHash": "091ddece931776a53f93869b82c24e132cc12d00d961fac09bc3b9cb9021c62d", + "liveUntilLedgerSeq": 10031 + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 9, + "data": { + "type": "TTL", + "ttl": { + "keyHash": "60313f9b273db0b14c3e503cf6cc152dd14a0c57e5e81a23e86b4e27a23a2c06", + "liveUntilLedgerSeq": 10009 + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "TTL", + "ttl": { + "keyHash": "60313f9b273db0b14c3e503cf6cc152dd14a0c57e5e81a23e86b4e27a23a2c06", + "liveUntilLedgerSeq": 10031 + } + }, + "ext": { + "v": 0 + } + } + } + ], + "events": [] + } + ], "txChangesAfter": [], - "sorobanMeta": null, + "sorobanMeta": { + "ext": { + "v": 0 + }, + "returnValue": null + }, "events": [], "diagnosticEvents": [] } @@ -1365,9 +1311,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", - "balance": 399905947, - "seqNum": 60129542145, + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 398999900, + "seqNum": 51539607553, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1415,9 +1361,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GAM4XNEHJUHN7VE3ZWJI23R2WS3SJS2BTUHZAC6XICXLXO2HPX4QI2IR", - "balance": 399945947, - "seqNum": 60129542145, + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 399948731, + "seqNum": 51539607553, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1465,18 +1411,18 @@ "v": 0 }, "result": { - "transactionHash": "9f16a9c2ea090a97d6557e89266cad9a19a1a9db6c1d3698e4b189af34e5e585", + "transactionHash": "89c02a589a36decde3f1e6f9aa8b629fc012daa68eefc76b3763bcc1fdb2609d", "result": { - "feeCharged": 45161, + "feeCharged": 54107, "result": { - "code": "txFAILED", + "code": "txSUCCESS", "results": [ { "code": "opINNER", "tr": { - "type": "INVOKE_HOST_FUNCTION", - "invokeHostFunctionResult": { - "code": "INVOKE_HOST_FUNCTION_RESOURCE_LIMIT_EXCEEDED" + "type": "RESTORE_FOOTPRINT", + "restoreFootprintResult": { + "code": "RESTORE_FOOTPRINT_SUCCESS" } } } @@ -1491,13 +1437,13 @@ { "type": "LEDGER_ENTRY_STATE", "state": { - "lastModifiedLedgerSeq": 15, + "lastModifiedLedgerSeq": 11, "data": { "type": "ACCOUNT", "account": { - "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", "balance": 400000000, - "seqNum": 64424509440, + "seqNum": 47244640256, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1521,9 +1467,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", - "balance": 398953838, - "seqNum": 64424509440, + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 398999900, + "seqNum": 47244640256, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1555,9 +1501,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", - "balance": 398953838, - "seqNum": 64424509440, + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 398999900, + "seqNum": 47244640256, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1581,9 +1527,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", - "balance": 398953838, - "seqNum": 64424509441, + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 398999900, + "seqNum": 47244640257, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1625,9 +1571,66 @@ } } ], - "operations": [], + "operations": [ + { + "ext": { + "v": 0 + }, + "changes": [ + { + "type": "LEDGER_ENTRY_RESTORED", + "restored": { + "lastModifiedLedgerSeq": 10, + "data": { + "type": "CONTRACT_DATA", + "contractData": { + "ext": { + "v": 0 + }, + "contract": "CAA3QKIP2SNVXUJTB4HKOGF55JTSSMQGED3FZYNHMNSXYV3DRRMAWA3Y", + "key": { + "type": "SCV_SYMBOL", + "sym": "archived" + }, + "durability": "PERSISTENT", + "val": { + "type": "SCV_U64", + "u64": 42 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_RESTORED", + "restored": { + "lastModifiedLedgerSeq": 31, + "data": { + "type": "TTL", + "ttl": { + "keyHash": "4791962cd1e2c7b8f8af3f96514f9777f0156a48261fb885a571a7f69b33a058", + "liveUntilLedgerSeq": 50 + } + }, + "ext": { + "v": 0 + } + } + } + ], + "events": [] + } + ], "txChangesAfter": [], - "sorobanMeta": null, + "sorobanMeta": { + "ext": { + "v": 0 + }, + "returnValue": null + }, "events": [], "diagnosticEvents": [] } @@ -1640,9 +1643,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", - "balance": 398953838, - "seqNum": 64424509441, + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 398999900, + "seqNum": 47244640257, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -1690,9 +1693,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GA2NXNEE2MHWGQP5XXACPYG2BDZFPKGYPFNST5V3ZZN75NSLQAEXX7CU", - "balance": 399954839, - "seqNum": 64424509441, + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "balance": 399945893, + "seqNum": 47244640257, "numSubEntries": 0, "inflationDest": null, "flags": 0, diff --git a/src/testdata/ledger-close-meta-v2-protocol-29.json b/src/testdata/ledger-close-meta-v2-protocol-29.json index d6ee92fe95..9017f6c4f9 100644 --- a/src/testdata/ledger-close-meta-v2-protocol-29.json +++ b/src/testdata/ledger-close-meta-v2-protocol-29.json @@ -6,23 +6,26 @@ "v": 0 }, "ledgerHeader": { - "hash": "033efbcfe877da6eddf79989e239870ba159458563577bd1dafd0ec185071612", + "hash": "fe2897063302702febee594b524126eeb016cd191478b68052ffbce7e69034fc", "header": { "ledgerVersion": 29, - "previousLedgerHash": "a8b6f62f7cefac1a289a918f71429b57bf3b8e9862a7a1a5f40b3c202892907b", + "previousLedgerHash": "36848ef780523793bf76cefeac3d81a396a212735e9cd5519ea5429d4d56cd9f", "scpValue": { - "txSetHash": "6fd02f728a6b25f2415caeb4251c78dbe0691e9c580da45ba3b8be9c3f107ef6", + "txSetHash": "b70a9fa4d06486144a5a31d9be6c513f19e6b2fe1ae1eb94f56af141f6d7454b", "closeTime": 1451692801, "upgrades": [], "ext": { - "v": "STELLAR_VALUE_SIGNED", - "lcValueSignature": { - "nodeID": "GDDOUW25MRFLNXQMN3OODP6JQEXSGLMHAFZV4XPQ2D3GA4QFIDMEJG2O", - "signature": "98fd384be82a3ec5150692fe3aabb8a61cd87d8af03521fda43b29183a7ed414bdb53e55dc108fff8c1f2ace9e4f5b771d7c61db8a0186a20d6de3d6380af800" + "v": "STELLAR_VALUE_SIGNED_MS", + "signedMsValue": { + "closeTimeMs": 1451692801000, + "lcValueSignature": { + "nodeID": "GDDOUW25MRFLNXQMN3OODP6JQEXSGLMHAFZV4XPQ2D3GA4QFIDMEJG2O", + "signature": "add084d4ea36d1e09c291cfa353f5030f13f38f45b34d0b04acee59e009c266eb4006af27719e6f6d3d51813e98f96c20e286270e217c33c92c83d790e396b0e" + } } } }, - "txSetResultHash": "fd6fb3b06784653ffa2057ae36184c8d9ee185c4ae35f0ba9e076059746fb659", + "txSetResultHash": "7f284d6f6089dcf4f3b44a28922ac95858dcbfc529cadb03e4ebc4d20a558dea", "bucketListHash": "1c1dc3c57f556ff0512ae950a34009b25377ee0b51037f839407af09da23b1df", "ledgerSeq": 10, "totalCoins": 1000000000000000000, @@ -49,7 +52,7 @@ "txSet": { "v": 1, "v1TxSet": { - "previousLedgerHash": "a8b6f62f7cefac1a289a918f71429b57bf3b8e9862a7a1a5f40b3c202892907b", + "previousLedgerHash": "36848ef780523793bf76cefeac3d81a396a212735e9cd5519ea5429d4d56cd9f", "phases": [ { "v": 0, @@ -191,43 +194,22 @@ "v": 0 }, "result": { - "transactionHash": "a186ddc5b2d55b64ffd84f1af13889001b73f0bc69263b17b21e6b92480b32f1", + "transactionHash": "80aa42315c73ade8bf88588947d215771ddd61ce447e220c119b64879a262af9", "result": { - "feeCharged": 300, + "feeCharged": 100, "result": { - "code": "txFEE_BUMP_INNER_SUCCESS", - "innerResultPair": { - "transactionHash": "ef356999aea407ce7c1a16e0640065bcf9b1e853ae8f1730a816a5152ceb28e6", - "result": { - "feeCharged": 0, - "result": { - "code": "txSUCCESS", - "results": [ - { - "code": "opINNER", - "tr": { - "type": "PAYMENT", - "paymentResult": { - "code": "PAYMENT_SUCCESS" - } - } - }, - { - "code": "opINNER", - "tr": { - "type": "PAYMENT", - "paymentResult": { - "code": "PAYMENT_SUCCESS" - } - } - } - ] - }, - "ext": { - "v": 0 + "code": "txSUCCESS", + "results": [ + { + "code": "opINNER", + "tr": { + "type": "PAYMENT", + "paymentResult": { + "code": "PAYMENT_SUCCESS" + } } } - } + ] }, "ext": { "v": 0 @@ -238,13 +220,13 @@ { "type": "LEDGER_ENTRY_STATE", "state": { - "lastModifiedLedgerSeq": 7, + "lastModifiedLedgerSeq": 8, "data": { "type": "ACCOUNT", "account": { - "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", - "balance": 400000000, - "seqNum": 30064771072, + "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", + "balance": 999999998991791666, + "seqNum": 6, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -252,7 +234,31 @@ "thresholds": "01000000", "signers": [], "ext": { - "v": 0 + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 8, + "seqTime": 1451692801 + } + } + } + } + } } } }, @@ -268,9 +274,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", - "balance": 399999700, - "seqNum": 30064771072, + "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", + "balance": 999999998991791566, + "seqNum": 6, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -278,7 +284,31 @@ "thresholds": "01000000", "signers": [], "ext": { - "v": 0 + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 8, + "seqTime": 1451692801 + } + } + } + } + } } } }, @@ -302,61 +332,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", - "balance": 399999700, - "seqNum": 30064771072, - "numSubEntries": 0, - "inflationDest": null, - "flags": 0, - "homeDomain": "", - "thresholds": "01000000", - "signers": [], - "ext": { - "v": 0 - } - } - }, - "ext": { - "v": 0 - } - } - }, - { - "type": "LEDGER_ENTRY_UPDATED", - "updated": { - "lastModifiedLedgerSeq": 10, - "data": { - "type": "ACCOUNT", - "account": { - "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", - "balance": 399999700, - "seqNum": 30064771072, - "numSubEntries": 0, - "inflationDest": null, - "flags": 0, - "homeDomain": "", - "thresholds": "01000000", - "signers": [], - "ext": { - "v": 0 - } - } - }, - "ext": { - "v": 0 - } - } - }, - { - "type": "LEDGER_ENTRY_STATE", - "state": { - "lastModifiedLedgerSeq": 8, - "data": { - "type": "ACCOUNT", - "account": { - "accountID": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q", - "balance": 200010000, - "seqNum": 34359738368, + "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", + "balance": 999999998991791566, + "seqNum": 6, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -364,7 +342,31 @@ "thresholds": "01000000", "signers": [], "ext": { - "v": 0 + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 8, + "seqTime": 1451692801 + } + } + } + } + } } } }, @@ -380,9 +382,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q", - "balance": 200010000, - "seqNum": 34359738369, + "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", + "balance": 999999998991791566, + "seqNum": 7, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -435,18 +437,43 @@ "state": { "lastModifiedLedgerSeq": 9, "data": { - "type": "TRUSTLINE", - "trustLine": { + "type": "ACCOUNT", + "account": { "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", - "asset": { - "assetCode": "CUR1", - "issuer": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q" - }, - "balance": 0, - "limit": 100, - "flags": 1, + "balance": 399999900, + "seqNum": 25769803777, + "numSubEntries": 1, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], "ext": { - "v": 0 + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 9, + "seqTime": 1451692801 + } + } + } + } + } } } }, @@ -460,18 +487,43 @@ "updated": { "lastModifiedLedgerSeq": 10, "data": { - "type": "TRUSTLINE", - "trustLine": { + "type": "ACCOUNT", + "account": { "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", - "asset": { - "assetCode": "CUR1", - "issuer": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q" - }, - "balance": 50, - "limit": 100, - "flags": 1, + "balance": 400000900, + "seqNum": 25769803777, + "numSubEntries": 1, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], "ext": { - "v": 0 + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 9, + "seqTime": 1451692801 + } + } + } + } + } } } }, @@ -479,32 +531,49 @@ "v": 0 } } - } - ], - "events": [] - }, - { - "ext": { - "v": 0 - }, - "changes": [ + }, { "type": "LEDGER_ENTRY_STATE", "state": { "lastModifiedLedgerSeq": 10, "data": { - "type": "TRUSTLINE", - "trustLine": { - "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", - "asset": { - "assetCode": "CUR1", - "issuer": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q" - }, - "balance": 50, - "limit": 100, - "flags": 1, + "type": "ACCOUNT", + "account": { + "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", + "balance": 999999998991791566, + "seqNum": 7, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], "ext": { - "v": 0 + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 10, + "seqTime": 1451692801 + } + } + } + } + } } } }, @@ -518,18 +587,43 @@ "updated": { "lastModifiedLedgerSeq": 10, "data": { - "type": "TRUSTLINE", - "trustLine": { - "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", - "asset": { - "assetCode": "CUR1", - "issuer": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q" - }, - "balance": 100, - "limit": 100, - "flags": 1, + "type": "ACCOUNT", + "account": { + "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", + "balance": 999999998991790566, + "seqNum": 7, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], "ext": { - "v": 0 + "v": 1, + "v1": { + "liabilities": { + "buying": 0, + "selling": 0 + }, + "ext": { + "v": 2, + "v2": { + "numSponsored": 0, + "numSponsoring": 0, + "signerSponsoringIDs": [], + "ext": { + "v": 3, + "v3": { + "ext": { + "v": 0 + }, + "seqLedger": 10, + "seqTime": 1451692801 + } + } + } + } + } } } }, @@ -555,22 +649,43 @@ "v": 0 }, "result": { - "transactionHash": "80aa42315c73ade8bf88588947d215771ddd61ce447e220c119b64879a262af9", + "transactionHash": "a186ddc5b2d55b64ffd84f1af13889001b73f0bc69263b17b21e6b92480b32f1", "result": { - "feeCharged": 100, + "feeCharged": 300, "result": { - "code": "txSUCCESS", - "results": [ - { - "code": "opINNER", - "tr": { - "type": "PAYMENT", - "paymentResult": { - "code": "PAYMENT_SUCCESS" - } + "code": "txFEE_BUMP_INNER_SUCCESS", + "innerResultPair": { + "transactionHash": "ef356999aea407ce7c1a16e0640065bcf9b1e853ae8f1730a816a5152ceb28e6", + "result": { + "feeCharged": 0, + "result": { + "code": "txSUCCESS", + "results": [ + { + "code": "opINNER", + "tr": { + "type": "PAYMENT", + "paymentResult": { + "code": "PAYMENT_SUCCESS" + } + } + }, + { + "code": "opINNER", + "tr": { + "type": "PAYMENT", + "paymentResult": { + "code": "PAYMENT_SUCCESS" + } + } + } + ] + }, + "ext": { + "v": 0 } } - ] + } }, "ext": { "v": 0 @@ -581,13 +696,13 @@ { "type": "LEDGER_ENTRY_STATE", "state": { - "lastModifiedLedgerSeq": 8, + "lastModifiedLedgerSeq": 7, "data": { "type": "ACCOUNT", "account": { - "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", - "balance": 999999998991791666, - "seqNum": 6, + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 400000000, + "seqNum": 30064771072, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -595,31 +710,7 @@ "thresholds": "01000000", "signers": [], "ext": { - "v": 1, - "v1": { - "liabilities": { - "buying": 0, - "selling": 0 - }, - "ext": { - "v": 2, - "v2": { - "numSponsored": 0, - "numSponsoring": 0, - "signerSponsoringIDs": [], - "ext": { - "v": 3, - "v3": { - "ext": { - "v": 0 - }, - "seqLedger": 8, - "seqTime": 1451692801 - } - } - } - } - } + "v": 0 } } }, @@ -635,9 +726,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", - "balance": 999999998991791566, - "seqNum": 6, + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 399999700, + "seqNum": 30064771072, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -645,57 +736,85 @@ "thresholds": "01000000", "signers": [], "ext": { - "v": 1, - "v1": { - "liabilities": { - "buying": 0, - "selling": 0 - }, + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + } + ], + "txApplyProcessing": { + "v": 4, + "v4": { + "ext": { + "v": 0 + }, + "txChangesBefore": [ + { + "type": "LEDGER_ENTRY_STATE", + "state": { + "lastModifiedLedgerSeq": 10, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 399999700, + "seqNum": 30064771072, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], "ext": { - "v": 2, - "v2": { - "numSponsored": 0, - "numSponsoring": 0, - "signerSponsoringIDs": [], - "ext": { - "v": 3, - "v3": { - "ext": { - "v": 0 - }, - "seqLedger": 8, - "seqTime": 1451692801 - } - } - } + "v": 0 + } + } + }, + "ext": { + "v": 0 + } + } + }, + { + "type": "LEDGER_ENTRY_UPDATED", + "updated": { + "lastModifiedLedgerSeq": 10, + "data": { + "type": "ACCOUNT", + "account": { + "accountID": "GCAEBM3GKNR6SV6N73FSGBXU6NSMZ2URQVMJQHXFQFY2PJPX6YBCSAKZ", + "balance": 399999700, + "seqNum": 30064771072, + "numSubEntries": 0, + "inflationDest": null, + "flags": 0, + "homeDomain": "", + "thresholds": "01000000", + "signers": [], + "ext": { + "v": 0 } } + }, + "ext": { + "v": 0 } } }, - "ext": { - "v": 0 - } - } - } - ], - "txApplyProcessing": { - "v": 4, - "v4": { - "ext": { - "v": 0 - }, - "txChangesBefore": [ { "type": "LEDGER_ENTRY_STATE", "state": { - "lastModifiedLedgerSeq": 10, + "lastModifiedLedgerSeq": 8, "data": { "type": "ACCOUNT", "account": { - "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", - "balance": 999999998991791566, - "seqNum": 6, + "accountID": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q", + "balance": 200010000, + "seqNum": 34359738368, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -703,31 +822,7 @@ "thresholds": "01000000", "signers": [], "ext": { - "v": 1, - "v1": { - "liabilities": { - "buying": 0, - "selling": 0 - }, - "ext": { - "v": 2, - "v2": { - "numSponsored": 0, - "numSponsoring": 0, - "signerSponsoringIDs": [], - "ext": { - "v": 3, - "v3": { - "ext": { - "v": 0 - }, - "seqLedger": 8, - "seqTime": 1451692801 - } - } - } - } - } + "v": 0 } } }, @@ -743,9 +838,9 @@ "data": { "type": "ACCOUNT", "account": { - "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", - "balance": 999999998991791566, - "seqNum": 7, + "accountID": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q", + "balance": 200010000, + "seqNum": 34359738369, "numSubEntries": 0, "inflationDest": null, "flags": 0, @@ -798,43 +893,18 @@ "state": { "lastModifiedLedgerSeq": 9, "data": { - "type": "ACCOUNT", - "account": { + "type": "TRUSTLINE", + "trustLine": { "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", - "balance": 399999900, - "seqNum": 25769803777, - "numSubEntries": 1, - "inflationDest": null, - "flags": 0, - "homeDomain": "", - "thresholds": "01000000", - "signers": [], + "asset": { + "assetCode": "CUR1", + "issuer": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q" + }, + "balance": 0, + "limit": 100, + "flags": 1, "ext": { - "v": 1, - "v1": { - "liabilities": { - "buying": 0, - "selling": 0 - }, - "ext": { - "v": 2, - "v2": { - "numSponsored": 0, - "numSponsoring": 0, - "signerSponsoringIDs": [], - "ext": { - "v": 3, - "v3": { - "ext": { - "v": 0 - }, - "seqLedger": 9, - "seqTime": 1451692801 - } - } - } - } - } + "v": 0 } } }, @@ -848,43 +918,18 @@ "updated": { "lastModifiedLedgerSeq": 10, "data": { - "type": "ACCOUNT", - "account": { + "type": "TRUSTLINE", + "trustLine": { "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", - "balance": 400000900, - "seqNum": 25769803777, - "numSubEntries": 1, - "inflationDest": null, - "flags": 0, - "homeDomain": "", - "thresholds": "01000000", - "signers": [], + "asset": { + "assetCode": "CUR1", + "issuer": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q" + }, + "balance": 50, + "limit": 100, + "flags": 1, "ext": { - "v": 1, - "v1": { - "liabilities": { - "buying": 0, - "selling": 0 - }, - "ext": { - "v": 2, - "v2": { - "numSponsored": 0, - "numSponsoring": 0, - "signerSponsoringIDs": [], - "ext": { - "v": 3, - "v3": { - "ext": { - "v": 0 - }, - "seqLedger": 9, - "seqTime": 1451692801 - } - } - } - } - } + "v": 0 } } }, @@ -892,49 +937,32 @@ "v": 0 } } - }, + } + ], + "events": [] + }, + { + "ext": { + "v": 0 + }, + "changes": [ { "type": "LEDGER_ENTRY_STATE", "state": { "lastModifiedLedgerSeq": 10, "data": { - "type": "ACCOUNT", - "account": { - "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", - "balance": 999999998991791566, - "seqNum": 7, - "numSubEntries": 0, - "inflationDest": null, - "flags": 0, - "homeDomain": "", - "thresholds": "01000000", - "signers": [], + "type": "TRUSTLINE", + "trustLine": { + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "asset": { + "assetCode": "CUR1", + "issuer": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q" + }, + "balance": 50, + "limit": 100, + "flags": 1, "ext": { - "v": 1, - "v1": { - "liabilities": { - "buying": 0, - "selling": 0 - }, - "ext": { - "v": 2, - "v2": { - "numSponsored": 0, - "numSponsoring": 0, - "signerSponsoringIDs": [], - "ext": { - "v": 3, - "v3": { - "ext": { - "v": 0 - }, - "seqLedger": 10, - "seqTime": 1451692801 - } - } - } - } - } + "v": 0 } } }, @@ -948,43 +976,18 @@ "updated": { "lastModifiedLedgerSeq": 10, "data": { - "type": "ACCOUNT", - "account": { - "accountID": "GC4EFXBN6BEENDAX7PBW5PGIIIVH3INMD3OEPQASXOLGOHVVP7ZEMG7X", - "balance": 999999998991790566, - "seqNum": 7, - "numSubEntries": 0, - "inflationDest": null, - "flags": 0, - "homeDomain": "", - "thresholds": "01000000", - "signers": [], + "type": "TRUSTLINE", + "trustLine": { + "accountID": "GB6MXQ5262ZJGDQNA6BL4TWE5SADVZXIKLPELFXKUE27X4SQTGQS44ZB", + "asset": { + "assetCode": "CUR1", + "issuer": "GCGE27HU2VYQANKL2VZWLCAOJYMEFST5DXPBWQ7BRRPOHUPK626DNG4Q" + }, + "balance": 100, + "limit": 100, + "flags": 1, "ext": { - "v": 1, - "v1": { - "liabilities": { - "buying": 0, - "selling": 0 - }, - "ext": { - "v": 2, - "v2": { - "numSponsored": 0, - "numSponsoring": 0, - "signerSponsoringIDs": [], - "ext": { - "v": 3, - "v3": { - "ext": { - "v": 0 - }, - "seqLedger": 10, - "seqTime": 1451692801 - } - } - } - } - } + "v": 0 } } }, diff --git a/src/transactions/ClaimClaimableBalanceOpFrame.cpp b/src/transactions/ClaimClaimableBalanceOpFrame.cpp index 456ab923e9..74a0dfdec0 100644 --- a/src/transactions/ClaimClaimableBalanceOpFrame.cpp +++ b/src/transactions/ClaimClaimableBalanceOpFrame.cpp @@ -4,6 +4,7 @@ #include "transactions/ClaimClaimableBalanceOpFrame.h" #include "crypto/SHA.h" +#include "ledger/LedgerHeaderUtils.h" #include "ledger/LedgerTxn.h" #include "ledger/LedgerTxnEntry.h" #include "ledger/LedgerTxnHeader.h" @@ -65,7 +66,7 @@ ClaimClaimableBalanceOpFrame::isOpSupported(LedgerHeader const& header) const } static bool -validatePredicate(ClaimPredicate const& pred, TimePoint closeTime) +validatePredicate(ClaimPredicate const& pred, ApplyTime closeTime) { switch (pred.type()) { @@ -89,7 +90,7 @@ validatePredicate(ClaimPredicate const& pred, TimePoint closeTime) case CLAIM_PREDICATE_NOT: return !validatePredicate(*pred.notPredicate(), closeTime); case CLAIM_PREDICATE_BEFORE_ABSOLUTE_TIME: - return static_cast(pred.absBefore()) > closeTime; + return static_cast(pred.absBefore()) > closeTime.timePoint(); default: throw std::runtime_error("Invalid ClaimPredicate"); } @@ -134,7 +135,7 @@ ClaimClaimableBalanceOpFrame::doApply( auto header = ltx.loadHeader(); if (it == claimableBalance.claimants.end() || !validatePredicate(it->v0().predicate, - header.current().scpValue.closeTime)) + getApplyTime(header.current().scpValue))) { innerResult(res).code(CLAIM_CLAIMABLE_BALANCE_CANNOT_CLAIM); return false; diff --git a/src/transactions/CreateClaimableBalanceOpFrame.cpp b/src/transactions/CreateClaimableBalanceOpFrame.cpp index adb7dcbb49..67574a22f9 100644 --- a/src/transactions/CreateClaimableBalanceOpFrame.cpp +++ b/src/transactions/CreateClaimableBalanceOpFrame.cpp @@ -4,6 +4,7 @@ #include "transactions/CreateClaimableBalanceOpFrame.h" #include "crypto/SHA.h" +#include "ledger/LedgerHeaderUtils.h" #include "ledger/LedgerTxn.h" #include "ledger/LedgerTxnEntry.h" #include "ledger/LedgerTxnHeader.h" @@ -18,16 +19,16 @@ namespace stellar { static int64_t -relativeToAbsolute(TimePoint closeTime, int64_t relative) +relativeToAbsolute(ApplyTime closeTime, int64_t relative) { - return closeTime > static_cast(INT64_MAX - relative) + return closeTime.timePoint() > static_cast(INT64_MAX - relative) ? INT64_MAX - : closeTime + relative; + : closeTime.timePoint() + relative; } // convert all relative predicates to absolute predicates static void -updatePredicatesForApply(ClaimPredicate& pred, TimePoint closeTime) +updatePredicatesForApply(ClaimPredicate& pred, ApplyTime closeTime) { switch (pred.type()) { @@ -222,7 +223,7 @@ CreateClaimableBalanceOpFrame::doApply(AppConnector& app, for (auto& claimant : claimableBalanceEntry.claimants) { updatePredicatesForApply(claimant.v0().predicate, - header.current().scpValue.closeTime); + getApplyTime(header.current().scpValue)); } switch (createEntryWithPossibleSponsorship(ltx, header, newClaimableBalance, diff --git a/src/transactions/InflationOpFrame.cpp b/src/transactions/InflationOpFrame.cpp index 4d623fc7d0..f380b49354 100644 --- a/src/transactions/InflationOpFrame.cpp +++ b/src/transactions/InflationOpFrame.cpp @@ -3,6 +3,7 @@ // of this distribution or at http://www.apache.org/licenses/LICENSE-2.0 #include "transactions/InflationOpFrame.h" +#include "ledger/LedgerHeaderUtils.h" #include "ledger/LedgerManager.h" #include "ledger/LedgerTxn.h" #include "ledger/LedgerTxnEntry.h" @@ -18,7 +19,8 @@ int64_t const INFLATION_RATE_TRILLIONTHS = 190721000LL; int64_t const TRILLION = 1000000000000LL; int64_t const INFLATION_WIN_MIN_PERCENT = 500000000LL; // .05% int const INFLATION_NUM_WINNERS = 2000; -time_t const INFLATION_START_TIME = (1404172800LL); // 1-jul-2014 (unix epoch) +stellar::ApplyTime constexpr INFLATION_START_TIME = + stellar::ApplyTime::fromTimePoint(1404172800); // 1-jul-2014 (unix epoch) namespace stellar { @@ -35,10 +37,11 @@ InflationOpFrame::doApply(AppConnector& app, AbstractLedgerTxn& ltx, { auto header = ltx.loadHeader(); auto& lh = header.current(); - time_t closeTime = lh.scpValue.closeTime; + ApplyTime closeTime = getApplyTime(lh.scpValue); uint64_t seq = lh.inflationSeq; - time_t inflationTime = (INFLATION_START_TIME + seq * INFLATION_FREQUENCY); + auto const inflationTime = ApplyTime::fromTimePoint( + INFLATION_START_TIME.timePoint() + seq * INFLATION_FREQUENCY); if (closeTime < inflationTime) { innerResult(res).code(INFLATION_NOT_TIME); @@ -152,4 +155,4 @@ InflationOpFrame::doesAccessFrozenKey( { return false; } -} \ No newline at end of file +} diff --git a/src/transactions/InvokeHostFunctionOpFrame.cpp b/src/transactions/InvokeHostFunctionOpFrame.cpp index 5fc3cf8d34..d871a82980 100644 --- a/src/transactions/InvokeHostFunctionOpFrame.cpp +++ b/src/transactions/InvokeHostFunctionOpFrame.cpp @@ -22,6 +22,7 @@ #include #include +#include "ledger/LedgerHeaderUtils.h" #include "ledger/LedgerManagerImpl.h" #include "ledger/LedgerTxn.h" #include "ledger/LedgerTxnEntry.h" @@ -40,14 +41,14 @@ namespace { CxxLedgerInfo getLedgerInfo(SorobanNetworkConfig const& sorobanConfig, uint32_t ledgerVersion, - uint32_t ledgerSeq, uint32_t baseReserve, TimePoint closeTime, + uint32_t ledgerSeq, uint32_t baseReserve, ApplyTime applyTime, Hash const& networkID) { CxxLedgerInfo info{}; info.base_reserve = baseReserve; info.protocol_version = ledgerVersion; info.sequence_number = ledgerSeq; - info.timestamp = closeTime; + info.timestamp = applyTime.timePoint(); info.memory_limit = sorobanConfig.txMemoryLimit(); info.min_persistent_entry_ttl = sorobanConfig.stateArchivalSettings().minPersistentTTL; @@ -1138,7 +1139,7 @@ class InvokeHostFunctionPreV23ApplyHelper auto const& lh = hdr.current(); return stellar::getLedgerInfo( mSorobanConfig, lh.ledgerVersion, lh.ledgerSeq, lh.baseReserve, - lh.scpValue.closeTime, mApp.getNetworkID()); + getApplyTime(lh.scpValue), mApp.getNetworkID()); } public: @@ -1322,7 +1323,7 @@ class InvokeHostFunctionParallelApplyHelper return stellar::getLedgerInfo( mSorobanConfig, mLedgerInfo.getLedgerVersion(), mLedgerInfo.getLedgerSeq(), mLedgerInfo.getBaseReserve(), - mLedgerInfo.getCloseTime(), mLedgerInfo.getNetworkID()); + mLedgerInfo.getApplyTime(), mLedgerInfo.getNetworkID()); } public: diff --git a/src/transactions/ParallelApplyUtils.h b/src/transactions/ParallelApplyUtils.h index 7e7fd8b743..c4d2270912 100644 --- a/src/transactions/ParallelApplyUtils.h +++ b/src/transactions/ParallelApplyUtils.h @@ -7,6 +7,7 @@ #include "ledger/ImmutableLedgerView.h" #include "ledger/InMemorySorobanState.h" #include "ledger/LedgerEntryScope.h" +#include "ledger/LedgerHeaderUtils.h" #include "ledger/LedgerTxn.h" #include "ledger/LedgerTypeUtils.h" #include "transactions/ParallelApplyStage.h" @@ -25,11 +26,11 @@ class ParallelLedgerInfo public: ParallelLedgerInfo(uint32_t version, uint32_t seq, uint32_t reserve, - TimePoint time, Hash const& id) + ApplyTime applyTime, Hash const& id) : ledgerVersion(version) , ledgerSeq(seq) , baseReserve(reserve) - , closeTime(time) + , mApplyTime(applyTime) , networkID(id) { } @@ -49,10 +50,10 @@ class ParallelLedgerInfo { return baseReserve; } - TimePoint - getCloseTime() const + ApplyTime + getApplyTime() const { - return closeTime; + return mApplyTime; } Hash getNetworkID() const @@ -64,7 +65,7 @@ class ParallelLedgerInfo uint32_t ledgerVersion; uint32_t ledgerSeq; uint32_t baseReserve; - TimePoint closeTime; + ApplyTime mApplyTime; Hash networkID; }; diff --git a/src/transactions/TransactionFrame.cpp b/src/transactions/TransactionFrame.cpp index a21dc5afe7..e6226d042b 100644 --- a/src/transactions/TransactionFrame.cpp +++ b/src/transactions/TransactionFrame.cpp @@ -15,6 +15,7 @@ #include "invariant/InvariantDoesNotHold.h" #include "invariant/InvariantManager.h" #include "ledger/LedgerEntryScope.h" +#include "ledger/LedgerHeaderUtils.h" #include "ledger/LedgerTxn.h" #include "ledger/LedgerTxnEntry.h" #include "ledger/LedgerTxnHeader.h" @@ -1132,7 +1133,7 @@ TransactionFrame::computePreApplySorobanResourceFee( } bool -TransactionFrame::isTooEarly(uint32_t ledgerVersion, uint64_t closeTime, +TransactionFrame::isTooEarly(uint32_t ledgerVersion, ApplyTime closeTime, uint32_t ledgerSeq, uint64_t lowerBoundCloseTimeOffset) const { @@ -1140,7 +1141,7 @@ TransactionFrame::isTooEarly(uint32_t ledgerVersion, uint64_t closeTime, if (tb) { if (tb->minTime && - (tb->minTime > (closeTime + lowerBoundCloseTimeOffset))) + (tb->minTime > (closeTime.timePoint() + lowerBoundCloseTimeOffset))) { return true; } @@ -1156,7 +1157,7 @@ TransactionFrame::isTooEarly(uint32_t ledgerVersion, uint64_t closeTime, } bool -TransactionFrame::isTooLate(uint32_t ledgerVersion, uint64_t closeTime, +TransactionFrame::isTooLate(uint32_t ledgerVersion, ApplyTime closeTime, uint32_t ledgerSeq, uint64_t upperBoundCloseTimeOffset) const { @@ -1167,7 +1168,7 @@ TransactionFrame::isTooLate(uint32_t ledgerVersion, uint64_t closeTime, // expect the ledger to close so we don't accept transactions that will // expire by the time they are applied if (tb->maxTime && - (tb->maxTime < (closeTime + upperBoundCloseTimeOffset))) + (tb->maxTime < (closeTime.timePoint() + upperBoundCloseTimeOffset))) { return true; } @@ -1183,7 +1184,7 @@ TransactionFrame::isTooLate(uint32_t ledgerVersion, uint64_t closeTime, bool TransactionFrame::isTooEarlyForAccount(uint32_t ledgerVersion, - uint64_t closeTime, uint32_t ledgerSeq, + ApplyTime closeTime, uint32_t ledgerSeq, LedgerEntryWrapper const& sourceAccount, uint64_t lowerBoundCloseTimeOffset) const { @@ -1201,7 +1202,8 @@ TransactionFrame::isTooEarlyForAccount(uint32_t ledgerVersion, : 0; auto minSeqAge = getMinSeqAge(); - auto lowerBoundCloseTime = closeTime + lowerBoundCloseTimeOffset; + auto lowerBoundCloseTime = + closeTime.timePoint() + lowerBoundCloseTimeOffset; if (minSeqAge > lowerBoundCloseTime || lowerBoundCloseTime - minSeqAge < accSeqTime) { @@ -1428,7 +1430,7 @@ TransactionFrame::commonValidPreSeqNum( // queue is accepting TXs for the next ledger), use that for time-based // checks instead of the ledgerSeq from the header. auto ledgerSeq = validationLedgerSeq.value_or(header.current().ledgerSeq); - auto closeTime = header.current().scpValue.closeTime; + auto closeTime = getApplyTime(header.current().scpValue); if (isTooEarly(ledgerVersion, closeTime, ledgerSeq, lowerBoundCloseTimeOffset)) @@ -1649,7 +1651,7 @@ TransactionFrame::commonValid( auto ledgerSeq = validationLedgerSeq.value_or(header.current().ledgerSeq); - auto closeTime = header.current().scpValue.closeTime; + auto closeTime = getApplyTime(header.current().scpValue); if (isTooEarlyForAccount(header.current().ledgerVersion, closeTime, ledgerSeq, *sourceAccount, lowerBoundCloseTimeOffset)) diff --git a/src/transactions/TransactionFrame.h b/src/transactions/TransactionFrame.h index 02eb5badfb..8e3da24135 100644 --- a/src/transactions/TransactionFrame.h +++ b/src/transactions/TransactionFrame.h @@ -30,6 +30,7 @@ We can get it in from the DB or from the wire namespace stellar { class AbstractLedgerTxn; +class ApplyTime; class Application; class Database; class OperationFrame; @@ -95,14 +96,14 @@ class TransactionFrame : public TransactionFrameBase kMaybeValid }; - virtual bool isTooEarly(uint32_t ledgerVersion, uint64_t closeTime, + virtual bool isTooEarly(uint32_t ledgerVersion, ApplyTime closeTime, uint32_t ledgerSeq, uint64_t lowerBoundCloseTimeOffset) const; - virtual bool isTooLate(uint32_t ledgerVersion, uint64_t closeTime, + virtual bool isTooLate(uint32_t ledgerVersion, ApplyTime closeTime, uint32_t ledgerSeq, uint64_t upperBoundCloseTimeOffset) const; - bool isTooEarlyForAccount(uint32_t ledgerVersion, uint64_t closeTime, + bool isTooEarlyForAccount(uint32_t ledgerVersion, ApplyTime closeTime, uint32_t ledgerSeq, LedgerEntryWrapper const& sourceAccount, uint64_t lowerBoundCloseTimeOffset) const; diff --git a/src/transactions/TransactionUtils.cpp b/src/transactions/TransactionUtils.cpp index 94fdffd958..a4f818cb23 100644 --- a/src/transactions/TransactionUtils.cpp +++ b/src/transactions/TransactionUtils.cpp @@ -5,6 +5,7 @@ #include "transactions/TransactionUtils.h" #include "crypto/SHA.h" #include "ledger/InternalLedgerEntry.h" +#include "ledger/LedgerHeaderUtils.h" #include "ledger/LedgerTxn.h" #include "ledger/LedgerTxnEntry.h" #include "ledger/LedgerTxnHeader.h" @@ -1379,18 +1380,22 @@ validateXDRForProtocol(uint32_t currProtocol, Config const& cfg, } uint64_t -getUpperBoundCloseTimeOffset(Application& app, uint64_t lastCloseTime) +getUpperBoundCloseTimeOffset(Application& app, ApplyTime lastCloseTime) { - uint64_t currentTime = VirtualClock::to_time_t(app.getClock().system_now()); + TimePoint currentTime = + VirtualClock::to_time_t(app.getClock().system_now()); // account for the time between closeTime and now - uint64_t closeTimeDrift = - currentTime <= lastCloseTime ? 0 : currentTime - lastCloseTime; - - return std::chrono::duration_cast( - app.getLedgerManager().getExpectedLedgerCloseTime()) - .count() * - EXPECTED_CLOSE_TIME_MULT + + uint64_t closeTimeDrift = currentTime <= lastCloseTime.timePoint() + ? 0 + : currentTime - lastCloseTime.timePoint(); + + // Round up so sub-second expected close times still leave at least a one + // second buffer (time bounds are whole-second quantities). + return std::chrono::ceil( + app.getLedgerManager().getExpectedLedgerCloseTime() * + EXPECTED_CLOSE_TIME_MULT) + .count() + closeTimeDrift; } @@ -1986,7 +1991,7 @@ maybeUpdateAccountOnLedgerSeqUpdate(LedgerTxnHeader const& header, auto& v3 = prepareAccountEntryExtensionV3(account.current().data.account()); v3.seqLedger = header.current().ledgerSeq; - v3.seqTime = header.current().scpValue.closeTime; + v3.seqTime = getApplyTime(header.current().scpValue).timePoint(); } } diff --git a/src/transactions/TransactionUtils.h b/src/transactions/TransactionUtils.h index 58173b0728..7837669b58 100644 --- a/src/transactions/TransactionUtils.h +++ b/src/transactions/TransactionUtils.h @@ -19,6 +19,7 @@ namespace stellar { class Application; +class ApplyTime; class Config; class ConstLedgerTxnEntry; class ConstTrustLineWrapper; @@ -271,7 +272,8 @@ bool hasMuxedAccount(TransactionEnvelope const& e); bool validateXDRForProtocol(uint32_t currProtocol, Config const& cfg, TransactionEnvelope const& envelope); -uint64_t getUpperBoundCloseTimeOffset(Application& app, uint64_t lastCloseTime); +uint64_t getUpperBoundCloseTimeOffset(Application& app, + ApplyTime lastCloseTime); bool hasAccountEntryExtV2(AccountEntry const& ae); bool hasAccountEntryExtV3(AccountEntry const& ae); diff --git a/src/transactions/test/BumpSequenceTests.cpp b/src/transactions/test/BumpSequenceTests.cpp index 8d70e7ab59..ff000b0ee6 100644 --- a/src/transactions/test/BumpSequenceTests.cpp +++ b/src/transactions/test/BumpSequenceTests.cpp @@ -17,6 +17,7 @@ #include "transactions/TransactionFrame.h" #include "transactions/TransactionUtils.h" #include "util/Logging.h" +#include "util/ProtocolVersion.h" #include "util/Timer.h" #include "util/XDROperators.h" @@ -104,7 +105,15 @@ TEST_CASE_VERSIONS("bump sequence", "[tx][bumpsequence]") { for_versions_from(19, *app, [&]() { closeLedger(*app); - closeLedger(*app); + // Re-close at the same close time, adding an ms remainder once + // ms close times are active: minSeqAge/minSeqLedgerGap read + // whole seconds and must behave identically against a + // sub-second LCL + closeLedgerOn( + *app, app->getLedgerManager().getLastClosedLedgerNum() + 1, + withMsCloseTime(*app, app->getLedgerManager() + .getLastClosedLedgerHeader() + .header.scpValue.closeTime)); auto tx1 = transactionFrameFromOps(app->getNetworkID(), *root, {a.op(bumpSequence(0))}, {a}); @@ -139,3 +148,59 @@ TEST_CASE_VERSIONS("bump sequence", "[tx][bumpsequence]") }); } } + +#ifdef MS_CLOSE_TIME +TEST_CASE("minSeqAge under sub-second ledgers", "[tx][bumpsequence]") +{ + VirtualClock clock; + auto app = createTestApplication(clock, getTestConfig()); + auto& lm = app->getLedgerManager(); + auto root = app->getRoot(); + + // These test networks run the ms protocol from genesis + REQUIRE(protocolVersionStartsFrom( + lm.getLastClosedLedgerHeader().header.ledgerVersion, + MS_CLOSE_TIME_PROTOCOL_VERSION)); + + // Establish a known whole-second close time and a funded account + TimePoint const T = + lm.getLastClosedLedgerHeader().header.scpValue.closeTime + 2; + closeLedgerOn(*app, lm.getLastClosedLedgerNum() + 1, T); + auto a1 = root->create("a1", lm.getLastMinBalance(3) + 100000); + auto nextSeq = [&]() { return lm.getLastClosedLedgerNum() + 1; }; + + // a1's sequence number moves in a sub-second ledger; seqTime records the + // whole second only + auto r0 = closeLedgerOn(*app, nextSeq(), makeConsensusTime(T, 100), + {a1.tx({payment(*root, 1)})}); + checkTx(0, r0, txSUCCESS); + { + LedgerTxn ltx(app->getLedgerTxnRoot()); + auto acc = stellar::loadAccount(ltx, a1.getPublicKey()); + REQUIRE( + getAccountEntryExtensionV3(acc.current().data.account()).seqTime == + T); + } + + PreconditionsV2 cond; + cond.minSeqAge = 1; + auto tx2 = transactionWithV2Precondition(*app, a1, 1, 100, cond); + + SECTION("sub-second ledger in the same whole second: age still 0") + { + auto r = + closeLedgerOn(*app, nextSeq(), makeConsensusTime(T, 800), {tx2}, + /*strictOrder=*/true); + + // We always round down to whole seconds, so a subsecond ledger should + // not advance minSeqAge. + checkTx(0, r, txBAD_MIN_SEQ_AGE_OR_GAP); + } + SECTION("whole-second ledger one second later: age requirement met") + { + auto r = closeLedgerOn(*app, nextSeq(), T + 1, {tx2}, + /*strictOrder=*/true); + checkTx(0, r, txSUCCESS); + } +} +#endif // MS_CLOSE_TIME diff --git a/src/transactions/test/ClaimableBalanceTests.cpp b/src/transactions/test/ClaimableBalanceTests.cpp index 2e72bd7d25..4a22efcffe 100644 --- a/src/transactions/test/ClaimableBalanceTests.cpp +++ b/src/transactions/test/ClaimableBalanceTests.cpp @@ -619,8 +619,9 @@ TEST_CASE_VERSIONS("claimableBalance", "[tx][claimablebalance]") asset, amount, {makeClaimant(acc2, pred)}); // move closeTime forward by a day - closeLedgerOn(*app, lm.getLastClosedLedgerNum() + 1, 2, - 1, 2016); + closeLedgerOn( + *app, lm.getLastClosedLedgerNum() + 1, + withMsCloseTime(*app, getTestDate(2, 1, 2016))); REQUIRE_THROWS_AS( acc2.claimClaimableBalance(balanceID), ex_CLAIM_CLAIMABLE_BALANCE_CANNOT_CLAIM); @@ -721,8 +722,9 @@ TEST_CASE_VERSIONS("claimableBalance", "[tx][claimablebalance]") asset, amount, {makeClaimant(acc2, pred)}); // move closeTime forward by a day - closeLedgerOn(*app, lm.getLastClosedLedgerNum() + 1, 2, - 1, 2016); + closeLedgerOn( + *app, lm.getLastClosedLedgerNum() + 1, + withMsCloseTime(*app, getTestDate(2, 1, 2016))); acc2.claimClaimableBalance(balanceID); }; @@ -1329,3 +1331,53 @@ TEST_CASE_VERSIONS("claimableBalance", "[tx][claimablebalance]") } }); } + +#ifdef MS_CLOSE_TIME +TEST_CASE("claimable balance absBefore under sub-second ledgers", + "[tx][claimablebalance]") +{ + VirtualClock clock; + auto app = createTestApplication(clock, getTestConfig()); + auto& lm = app->getLedgerManager(); + auto root = app->getRoot(); + + // These test networks run the ms protocol from genesis + REQUIRE(protocolVersionStartsFrom( + lm.getLastClosedLedgerHeader().header.ledgerVersion, + MS_CLOSE_TIME_PROTOCOL_VERSION)); + + // Establish a known whole-second close time and a funded account + TimePoint const T = + lm.getLastClosedLedgerHeader().header.scpValue.closeTime + 2; + closeLedgerOn(*app, lm.getLastClosedLedgerNum() + 1, T); + auto a1 = root->create("a1", lm.getLastMinBalance(3) + 100000); + auto nextSeq = [&]() { return lm.getLastClosedLedgerNum() + 1; }; + + ClaimPredicate pred; + pred.type(CLAIM_PREDICATE_BEFORE_ABSOLUTE_TIME); + pred.absBefore() = static_cast(T + 1); + Claimant claimant; + claimant.v0().destination = a1.getPublicKey(); + claimant.v0().predicate = pred; + + auto rc = closeLedgerOn(*app, nextSeq(), makeConsensusTime(T, 100), + {root->tx({createClaimableBalance( + makeNativeAsset(), 100, {claimant})})}); + checkTx(0, rc, txSUCCESS); + auto balanceID = root->getBalanceID(0); + + SECTION("claim within the same second succeeds") + { + auto r = closeLedgerOn(*app, nextSeq(), makeConsensusTime(T, 900), + {a1.tx({claimClaimableBalance(balanceID)})}); + checkTx(0, r, txSUCCESS); + } + SECTION("claim in the next second fails") + { + auto r = closeLedgerOn(*app, nextSeq(), T + 1, + {a1.tx({claimClaimableBalance(balanceID)})}, + /*strictOrder=*/true); + checkTx(0, r, txFAILED); + } +} +#endif // MS_CLOSE_TIME diff --git a/src/transactions/test/InvokeHostFunctionTests.cpp b/src/transactions/test/InvokeHostFunctionTests.cpp index 18cfe946f2..9e41a82aa4 100644 --- a/src/transactions/test/InvokeHostFunctionTests.cpp +++ b/src/transactions/test/InvokeHostFunctionTests.cpp @@ -2660,7 +2660,7 @@ TEST_CASE("settings upgrade", "[tx][soroban][upgrades]") auto lastCloseTime = lcl.header.scpValue.closeTime; test.getApp().getHerder().externalizeValue( - txSet, lcl.header.ledgerSeq + 1, lastCloseTime, + txSet, lcl.header.ledgerSeq + 1, makeConsensusTime(lastCloseTime), {LedgerTestUtils::toUpgradeType(ledgerUpgrade)}); // validate upgrade succeeded diff --git a/src/transactions/test/TxEnvelopeTests.cpp b/src/transactions/test/TxEnvelopeTests.cpp index 3058a88cdf..af3b3c294a 100644 --- a/src/transactions/test/TxEnvelopeTests.cpp +++ b/src/transactions/test/TxEnvelopeTests.cpp @@ -58,7 +58,8 @@ TEST_CASE("txset - correct apply order", "[tx][envelope]") auto tx1 = b1.tx({accountMerge(a1)}); auto tx2 = a1.tx({a1.op(payment(*root, 112)), a1.op(payment(*root, 101))}); - auto txSet = makeTxSetFromTransactions({tx1, tx2}, *app, 0, 0).second; + auto txSet = + makeTxSetFromTransactions({tx1, tx2}, *app, ApplyTimeOffset{}).second; auto txs = txSet->getPhasesInApplyOrder()[static_cast(TxSetPhase::CLASSIC)] @@ -1945,7 +1946,8 @@ TEST_CASE_VERSIONS("txenvelope", "[tx][envelope]") setMinTime(txFrame, start + 1000); setMaxTime(txFrame, start + 10000); - closeLedgerOn(*app, nextLedgerSeq, start + 1); + closeLedgerOn(*app, nextLedgerSeq, + withMsCloseTime(*app, start + 1)); applyCheck(txFrame, *app); REQUIRE(txFrame->getResultCode() == txTOO_EARLY); @@ -1960,7 +1962,8 @@ TEST_CASE_VERSIONS("txenvelope", "[tx][envelope]") getSignatures(txFrame).clear(); txFrame->addSignature(*root); - closeLedgerOn(*app, nextLedgerSeq, start + 1); + closeLedgerOn(*app, nextLedgerSeq, + withMsCloseTime(*app, start + 1)); applyCheck(txFrame, *app); REQUIRE(txFrame->getResultCode() == txSUCCESS); } @@ -1972,7 +1975,8 @@ TEST_CASE_VERSIONS("txenvelope", "[tx][envelope]") setMinTime(txFrame, 1000); setMaxTime(txFrame, start); - closeLedgerOn(*app, nextLedgerSeq, start + 1); + closeLedgerOn(*app, nextLedgerSeq, + withMsCloseTime(*app, start + 1)); applyCheck(txFrame, *app); REQUIRE(txFrame->getResultCode() == txTOO_LATE); } @@ -1985,7 +1989,8 @@ TEST_CASE_VERSIONS("txenvelope", "[tx][envelope]") setMaxTime(txFrame, 0); TimePoint lastClose = getTestDate(1, 1, 2020); - closeLedgerOn(*app, nextLedgerSeq, lastClose); + closeLedgerOn(*app, nextLedgerSeq, + withMsCloseTime(*app, lastClose)); TimePoint const nextOffset = 2; auto const nextClose = lastClose + nextOffset; @@ -2069,8 +2074,8 @@ TEST_CASE_VERSIONS("txenvelope", "[tx][envelope]") VirtualClock::from_time_t(closeTime + 5)); } - auto offset = - getUpperBoundCloseTimeOffset(*app, closeTime); + auto offset = getUpperBoundCloseTimeOffset( + *app, ApplyTime::fromTimePoint(closeTime)); auto upperBoundCloseTime = closeTime + offset; SECTION("success") @@ -3180,3 +3185,139 @@ TEST_CASE("XDR protocol 23 compatibility validation", "[tx][envelope]") runTest(ProtocolVersion::V_23, true); } } + +#ifdef MS_CLOSE_TIME +TEST_CASE("transaction time bounds under sub-second ledgers", "[tx][envelope]") +{ + VirtualClock clock; + auto app = createTestApplication(clock, getTestConfig()); + auto& lm = app->getLedgerManager(); + auto root = app->getRoot(); + + // These test networks run the ms protocol from genesis + REQUIRE(protocolVersionStartsFrom( + lm.getLastClosedLedgerHeader().header.ledgerVersion, + MS_CLOSE_TIME_PROTOCOL_VERSION)); + + // Establish a known whole-second close time and a funded account + TimePoint const T = + lm.getLastClosedLedgerHeader().header.scpValue.closeTime + 2; + closeLedgerOn(*app, lm.getLastClosedLedgerNum() + 1, T); + auto a1 = root->create("a1", lm.getLastMinBalance(3) + 100000); + + auto reSign = [](TransactionTestFramePtr const& tx, TestAccount& acc) { + auto& sig = tx->getMutableEnvelope().type() == ENVELOPE_TYPE_TX_V0 + ? tx->getMutableEnvelope().v0().signatures + : tx->getMutableEnvelope().v1().signatures; + sig.clear(); + tx->addSignature(acc.getSecretKey()); + }; + auto nextSeq = [&]() { return lm.getLastClosedLedgerNum() + 1; }; + + SECTION("tx expiring at the current second applies in a same-second " + "ledger") + { + auto tx = a1.tx({payment(*root, 1)}); + setMaxTime(tx, T); + reSign(tx, a1); + auto r = + closeLedgerOn(*app, nextSeq(), makeConsensusTime(T, 400), {tx}); + checkTx(0, r, txSUCCESS); + auto const& lclValue = lm.getLastClosedLedgerHeader().header.scpValue; + REQUIRE(getConsensusTime(lclValue).milliseconds() == T * 1000 + 400); + REQUIRE(lclValue.closeTime == T); + REQUIRE(getConsensusTime(lclValue).milliseconds() == T * 1000 + 400); + } + + SECTION("tx valid from the next second stays too early in a same-second " + "ledger") + { + auto tx = a1.tx({payment(*root, 1)}); + setMinTime(tx, T + 1); + reSign(tx, a1); + auto r = closeLedgerOn(*app, nextSeq(), makeConsensusTime(T, 400), {tx}, + /*strictOrder=*/true); + checkTx(0, r, txTOO_EARLY); + // The same transaction applies once the next whole second is reached + auto r2 = closeLedgerOn(*app, nextSeq(), T + 1, {tx}, + /*strictOrder=*/true); + checkTx(0, r2, txSUCCESS); + } +} +#endif // MS_CLOSE_TIME + +TEST_CASE("getUpperBoundCloseTimeOffset under sub-second ledgers", + "[tx][envelope]") +{ + // The offset is consumed at transaction queue admission: a tx whose + // maxTime falls inside [lclCloseTime, lclCloseTime + offset) is rejected + // as txTOO_LATE by Herder::recvTransaction, since it would likely be + // expired by the time it lands in a ledger. Exercise that path end to end + // and assert exactly where the admission boundary sits. + auto testWithCloseTimeMs = [](uint32_t closeTimeMs, + uint64_t expectedBuffer) { + VirtualClock clock; + auto cfg = getTestConfig(); + cfg.ARTIFICIALLY_SET_CLOSE_TIME_FOR_TESTING = closeTimeMs; + auto app = createTestApplication(clock, cfg); + auto& lm = app->getLedgerManager(); + auto root = app->getRoot(); + + // Close a ledger at a known whole second T, then align the clock with + // it so the offset's drift term starts at zero + TimePoint const T = + VirtualClock::to_time_t(app->getClock().system_now()) + 1000; + closeLedgerOn(*app, lm.getLastClosedLedgerNum() + 1, T); + + // The queue admits one pending tx per source account, so give every + // submission its own account + int accountIndex = 0; + auto submitWithMaxTime = [&](TimePoint maxTime) { + auto acc = + root->create("sub-second-" + std::to_string(accountIndex++), + lm.getLastMinBalance(0) + 10000); + auto tx = acc.tx({payment(*root, 1)}); + setMaxTime(tx, maxTime); + getSignatures(tx).clear(); + tx->addSignature(acc.getSecretKey()); + return app->getHerder().recvTransaction(tx, true); + }; + auto expectTooLate = [&](TimePoint maxTime) { + auto r = submitWithMaxTime(maxTime); + REQUIRE(r.code == + TransactionQueue::AddResultCode::ADD_STATUS_ERROR); + REQUIRE(r.txResult->getResultCode() == txTOO_LATE); + }; + auto expectAdmitted = [&](TimePoint maxTime) { + REQUIRE(submitWithMaxTime(maxTime).code == + TransactionQueue::AddResultCode::ADD_STATUS_PENDING); + }; + + clock.setCurrentVirtualTime(VirtualClock::from_time_t(T)); + + // With no drift, the first admissible maxTime is T + buffer + expectTooLate(T + expectedBuffer - 1); + expectAdmitted(T + expectedBuffer); + + // Wall-clock time elapsed since the last close is added on top + clock.setCurrentVirtualTime(VirtualClock::from_time_t(T + 7)); + expectTooLate(T + expectedBuffer + 7 - 1); + expectAdmitted(T + expectedBuffer + 7); + }; + + SECTION("whole-second close times keep the legacy 2x buffer") + { + testWithCloseTimeMs(5000, 10); + } + SECTION("sub-second close times round the buffer up to a whole second") + { + // 2 * 400ms rounds up to 1s rather than truncating to 0, which would + // erase the admission-time expiry buffer entirely + testWithCloseTimeMs(400, 1); + } + SECTION("fractional-second close times round up, not down") + { + // 2 * 1300ms = 2600ms rounds up to 3s + testWithCloseTimeMs(1300, 3); + } +} diff --git a/src/util/ProtocolVersion.h b/src/util/ProtocolVersion.h index 215565016b..f752807a49 100644 --- a/src/util/ProtocolVersion.h +++ b/src/util/ProtocolVersion.h @@ -10,6 +10,12 @@ namespace stellar // This is a set of utilities for checking the ledger protocol versions in // expressive and searchable fashion. +constexpr uint32_t MAX_SUPPORTED_PROTOCOL_VERSION = 28 +#ifdef ENABLE_NEXT_PROTOCOL_VERSION_UNSAFE_FOR_PRODUCTION + + 1 +#endif + ; + enum class ProtocolVersion : uint32_t { V_0 = 0, @@ -79,4 +85,14 @@ constexpr ProtocolVersion TX_ED25519_VERIFY_BUDGET_PROTOCOL_VERSION = constexpr ProtocolVersion EXTERNAL_EXECUTABLE_REF_PROTOCOL_VERSION = ProtocolVersion::V_28; +// MS_CLOSE_TIME_PROTOCOL_VERSION should always be whatever the vnext protocol +// version is. +#ifdef ENABLE_NEXT_PROTOCOL_VERSION_UNSAFE_FOR_PRODUCTION +constexpr ProtocolVersion MS_CLOSE_TIME_PROTOCOL_VERSION = + static_cast(MAX_SUPPORTED_PROTOCOL_VERSION); +#else +constexpr ProtocolVersion MS_CLOSE_TIME_PROTOCOL_VERSION = + static_cast(MAX_SUPPORTED_PROTOCOL_VERSION + 1); +#endif + } // namespace stellar diff --git a/test-lcm-next/BeginSponsoringFutureReservesTests/17846470c1f6514e.xdr b/test-lcm-next/BeginSponsoringFutureReservesTests/17846470c1f6514e.xdr new file mode 100644 index 0000000000..1518e638c5 Binary files /dev/null and b/test-lcm-next/BeginSponsoringFutureReservesTests/17846470c1f6514e.xdr differ diff --git a/test-lcm-next/BeginSponsoringFutureReservesTests/370cbe2630300593.xdr b/test-lcm-next/BeginSponsoringFutureReservesTests/370cbe2630300593.xdr new file mode 100644 index 0000000000..efb61b670d Binary files /dev/null and b/test-lcm-next/BeginSponsoringFutureReservesTests/370cbe2630300593.xdr differ diff --git a/test-lcm-next/BeginSponsoringFutureReservesTests/3e67985b8288fe60.xdr b/test-lcm-next/BeginSponsoringFutureReservesTests/3e67985b8288fe60.xdr new file mode 100644 index 0000000000..737ac56ff3 Binary files /dev/null and b/test-lcm-next/BeginSponsoringFutureReservesTests/3e67985b8288fe60.xdr differ diff --git a/test-lcm-next/BeginSponsoringFutureReservesTests/55fe0b9b963a80eb.xdr b/test-lcm-next/BeginSponsoringFutureReservesTests/55fe0b9b963a80eb.xdr new file mode 100644 index 0000000000..a486e0a82a Binary files /dev/null and b/test-lcm-next/BeginSponsoringFutureReservesTests/55fe0b9b963a80eb.xdr differ diff --git a/test-lcm-next/BeginSponsoringFutureReservesTests/9a006fdecc334584.xdr b/test-lcm-next/BeginSponsoringFutureReservesTests/9a006fdecc334584.xdr new file mode 100644 index 0000000000..1231d1a2c3 Binary files /dev/null and b/test-lcm-next/BeginSponsoringFutureReservesTests/9a006fdecc334584.xdr differ diff --git a/test-lcm-next/BeginSponsoringFutureReservesTests/cfce0d762a751c3f.xdr b/test-lcm-next/BeginSponsoringFutureReservesTests/cfce0d762a751c3f.xdr new file mode 100644 index 0000000000..bc9db94cd0 Binary files /dev/null and b/test-lcm-next/BeginSponsoringFutureReservesTests/cfce0d762a751c3f.xdr differ diff --git a/test-lcm-next/BeginSponsoringFutureReservesTests/f67dddbf03bfbdf7.xdr b/test-lcm-next/BeginSponsoringFutureReservesTests/f67dddbf03bfbdf7.xdr new file mode 100644 index 0000000000..79c2e4717f Binary files /dev/null and b/test-lcm-next/BeginSponsoringFutureReservesTests/f67dddbf03bfbdf7.xdr differ diff --git a/test-lcm-next/BeginSponsoringFutureReservesTests/index.json b/test-lcm-next/BeginSponsoringFutureReservesTests/index.json index 444ad01878..46795b8148 100644 --- a/test-lcm-next/BeginSponsoringFutureReservesTests/index.json +++ b/test-lcm-next/BeginSponsoringFutureReservesTests/index.json @@ -1,16 +1,23 @@ { "02426fcd1b6a0dbe" : "sponsor_future_reserves-protocol_version_28-already_sponsored", "124577e8c014e46f" : "sponsor_future_reserves-protocol_version_28-add_sponsored_entry_before_adding_first_sponsored_signer", + "17846470c1f6514e" : "sponsor_future_reserves-protocol_version_29-add_sponsored_entry_before_adding_first_sponsored_signer", "2f7cc6c5797d6418" : "sponsor_future_reserves-protocol_version_28-sponsorships_with_precondition_that_uses_v3_extension", + "370cbe2630300593" : "sponsor_future_reserves-protocol_version_29-sponsored_account_is_sponsoring", "3b6d924921f59f9f" : "sponsor_future_reserves-protocol_version_26-add_sponsored_entry_before_adding_first_sponsored_signer", "3ca9bd46788ce395" : "sponsor_future_reserves-protocol_version_28-sponsoring_account_is_sponsored", "3cb8cdd0c21fcfb1" : "sponsor_future_reserves-protocol_version_26-sponsoring_account_is_sponsored", + "3e67985b8288fe60" : "sponsor_future_reserves-protocol_version_29-sponsorships_with_precondition_that_uses_v3_extension", "476ba4fadb58a1ac" : "sponsor_future_reserves-protocol_version_28-success", "507604981827c989" : "sponsor_future_reserves-protocol_version_26-already_sponsored", + "55fe0b9b963a80eb" : "sponsor_future_reserves-protocol_version_29-success", "5a61e6aac9038144" : "sponsor_future_reserves-protocol_version_26-success", + "9a006fdecc334584" : "sponsor_future_reserves-protocol_version_29-bad_sponsorship", "9bc0a679d6d62183" : "sponsor_future_reserves-protocol_version_26-bad_sponsorship", "aec15f4898b342da" : "sponsor_future_reserves-protocol_version_28-sponsored_account_is_sponsoring", + "cfce0d762a751c3f" : "sponsor_future_reserves-protocol_version_29-already_sponsored", "e55c615e3d4d0fb9" : "sponsor_future_reserves-protocol_version_26-sponsored_account_is_sponsoring", "e657a64b555a35d5" : "sponsor_future_reserves-protocol_version_28-bad_sponsorship", - "e9b0303fe49e8211" : "sponsor_future_reserves-protocol_version_26-sponsorships_with_precondition_that_uses_v3_extension" + "e9b0303fe49e8211" : "sponsor_future_reserves-protocol_version_26-sponsorships_with_precondition_that_uses_v3_extension", + "f67dddbf03bfbdf7" : "sponsor_future_reserves-protocol_version_29-sponsoring_account_is_sponsored" } diff --git a/test-lcm-next/BumpSequenceTests/6f12ba9dcc4d94b5.xdr b/test-lcm-next/BumpSequenceTests/6f12ba9dcc4d94b5.xdr new file mode 100644 index 0000000000..650e201414 Binary files /dev/null and b/test-lcm-next/BumpSequenceTests/6f12ba9dcc4d94b5.xdr differ diff --git a/test-lcm-next/BumpSequenceTests/ec87ead884eb240e.xdr b/test-lcm-next/BumpSequenceTests/ec87ead884eb240e.xdr new file mode 100644 index 0000000000..fc1cfbf1d0 Binary files /dev/null and b/test-lcm-next/BumpSequenceTests/ec87ead884eb240e.xdr differ diff --git a/test-lcm-next/BumpSequenceTests/index.json b/test-lcm-next/BumpSequenceTests/index.json new file mode 100644 index 0000000000..2a19fdef4f --- /dev/null +++ b/test-lcm-next/BumpSequenceTests/index.json @@ -0,0 +1,4 @@ +{ + "6f12ba9dcc4d94b5" : "minSeqAge_under_sub-second_ledgers-whole-second_ledger_one_second_later-_age_requirement_met", + "ec87ead884eb240e" : "minSeqAge_under_sub-second_ledgers-sub-second_ledger_in_the_same_whole_second-_age_still_0" +} diff --git a/test-lcm-next/ClaimableBalanceTests/485fad410224186e.xdr b/test-lcm-next/ClaimableBalanceTests/485fad410224186e.xdr new file mode 100644 index 0000000000..b93cffc25f Binary files /dev/null and b/test-lcm-next/ClaimableBalanceTests/485fad410224186e.xdr differ diff --git a/test-lcm-next/ClaimableBalanceTests/c7f98e15890f11ba.xdr b/test-lcm-next/ClaimableBalanceTests/c7f98e15890f11ba.xdr new file mode 100644 index 0000000000..005cd676ce Binary files /dev/null and b/test-lcm-next/ClaimableBalanceTests/c7f98e15890f11ba.xdr differ diff --git a/test-lcm-next/ClaimableBalanceTests/index.json b/test-lcm-next/ClaimableBalanceTests/index.json new file mode 100644 index 0000000000..ba710aeedc --- /dev/null +++ b/test-lcm-next/ClaimableBalanceTests/index.json @@ -0,0 +1,4 @@ +{ + "485fad410224186e" : "claimable_balance_absBefore_under_sub-second_ledgers-claim_in_the_next_second_fails", + "c7f98e15890f11ba" : "claimable_balance_absBefore_under_sub-second_ledgers-claim_within_the_same_second_succeeds" +} diff --git a/test-lcm-next/FrozenLedgerKeysTests/0130d32614dbc252.xdr b/test-lcm-next/FrozenLedgerKeysTests/0130d32614dbc252.xdr index 3cf4907099..fc9a9b086e 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/0130d32614dbc252.xdr and b/test-lcm-next/FrozenLedgerKeysTests/0130d32614dbc252.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/0269778d4c3c115b.xdr b/test-lcm-next/FrozenLedgerKeysTests/0269778d4c3c115b.xdr index 3cf4907099..fc9a9b086e 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/0269778d4c3c115b.xdr and b/test-lcm-next/FrozenLedgerKeysTests/0269778d4c3c115b.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/03768f1cbe0eed0d.xdr b/test-lcm-next/FrozenLedgerKeysTests/03768f1cbe0eed0d.xdr index ab0006392b..e39d392b1e 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/03768f1cbe0eed0d.xdr and b/test-lcm-next/FrozenLedgerKeysTests/03768f1cbe0eed0d.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/0450c26d5d536a6e.xdr b/test-lcm-next/FrozenLedgerKeysTests/0450c26d5d536a6e.xdr index 81eb0c9c91..4a02ac9ec9 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/0450c26d5d536a6e.xdr and b/test-lcm-next/FrozenLedgerKeysTests/0450c26d5d536a6e.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/05d2d1b6ad2f25b9.xdr b/test-lcm-next/FrozenLedgerKeysTests/05d2d1b6ad2f25b9.xdr index 3cf4907099..fc9a9b086e 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/05d2d1b6ad2f25b9.xdr and b/test-lcm-next/FrozenLedgerKeysTests/05d2d1b6ad2f25b9.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/09bc2d8793dcee32.xdr b/test-lcm-next/FrozenLedgerKeysTests/09bc2d8793dcee32.xdr index c6f8ebd99b..5ab22732b1 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/09bc2d8793dcee32.xdr and b/test-lcm-next/FrozenLedgerKeysTests/09bc2d8793dcee32.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/0ee7224ee3fe8e71.xdr b/test-lcm-next/FrozenLedgerKeysTests/0ee7224ee3fe8e71.xdr index e021045fb9..24d38894ac 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/0ee7224ee3fe8e71.xdr and b/test-lcm-next/FrozenLedgerKeysTests/0ee7224ee3fe8e71.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/0feb6c306147fd3a.xdr b/test-lcm-next/FrozenLedgerKeysTests/0feb6c306147fd3a.xdr index 6973722190..612f1d5a66 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/0feb6c306147fd3a.xdr and b/test-lcm-next/FrozenLedgerKeysTests/0feb6c306147fd3a.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/104f5d62fa026b98.xdr b/test-lcm-next/FrozenLedgerKeysTests/104f5d62fa026b98.xdr index 4c52627baf..2f8911d1bf 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/104f5d62fa026b98.xdr and b/test-lcm-next/FrozenLedgerKeysTests/104f5d62fa026b98.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/11196eb4ceadfd80.xdr b/test-lcm-next/FrozenLedgerKeysTests/11196eb4ceadfd80.xdr index dec89d2cc1..91199f278c 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/11196eb4ceadfd80.xdr and b/test-lcm-next/FrozenLedgerKeysTests/11196eb4ceadfd80.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/12a1f394aac5f093.xdr b/test-lcm-next/FrozenLedgerKeysTests/12a1f394aac5f093.xdr index 358f1cdfb6..cd9e05e747 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/12a1f394aac5f093.xdr and b/test-lcm-next/FrozenLedgerKeysTests/12a1f394aac5f093.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/12dc44e49c5507a9.xdr b/test-lcm-next/FrozenLedgerKeysTests/12dc44e49c5507a9.xdr index c2f5e14a10..8ad91f3376 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/12dc44e49c5507a9.xdr and b/test-lcm-next/FrozenLedgerKeysTests/12dc44e49c5507a9.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/137b73a35107c4c5.xdr b/test-lcm-next/FrozenLedgerKeysTests/137b73a35107c4c5.xdr index 658e19fad1..c5105057ca 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/137b73a35107c4c5.xdr and b/test-lcm-next/FrozenLedgerKeysTests/137b73a35107c4c5.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/1c2cdf10f2e47111.xdr b/test-lcm-next/FrozenLedgerKeysTests/1c2cdf10f2e47111.xdr index 358f1cdfb6..cd9e05e747 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/1c2cdf10f2e47111.xdr and b/test-lcm-next/FrozenLedgerKeysTests/1c2cdf10f2e47111.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/1d6ae312fba487bb.xdr b/test-lcm-next/FrozenLedgerKeysTests/1d6ae312fba487bb.xdr index 429d2fa345..6545898de8 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/1d6ae312fba487bb.xdr and b/test-lcm-next/FrozenLedgerKeysTests/1d6ae312fba487bb.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/1e016cd08d89d64c.xdr b/test-lcm-next/FrozenLedgerKeysTests/1e016cd08d89d64c.xdr index 10743e5060..dd85087b65 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/1e016cd08d89d64c.xdr and b/test-lcm-next/FrozenLedgerKeysTests/1e016cd08d89d64c.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/22c18bc7dafd431d.xdr b/test-lcm-next/FrozenLedgerKeysTests/22c18bc7dafd431d.xdr index 14ff2a9699..cd62438ab5 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/22c18bc7dafd431d.xdr and b/test-lcm-next/FrozenLedgerKeysTests/22c18bc7dafd431d.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/233d74d8369feacb.xdr b/test-lcm-next/FrozenLedgerKeysTests/233d74d8369feacb.xdr index 987db1e090..26cc8fbc3b 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/233d74d8369feacb.xdr and b/test-lcm-next/FrozenLedgerKeysTests/233d74d8369feacb.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/27e094a33ea270ce.xdr b/test-lcm-next/FrozenLedgerKeysTests/27e094a33ea270ce.xdr index bcc5ddac2c..50a78d5a82 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/27e094a33ea270ce.xdr and b/test-lcm-next/FrozenLedgerKeysTests/27e094a33ea270ce.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/2c135153a34652ed.xdr b/test-lcm-next/FrozenLedgerKeysTests/2c135153a34652ed.xdr index e8b3b3bb31..bea9b7ffa5 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/2c135153a34652ed.xdr and b/test-lcm-next/FrozenLedgerKeysTests/2c135153a34652ed.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/2cc7de6ca7052b69.xdr b/test-lcm-next/FrozenLedgerKeysTests/2cc7de6ca7052b69.xdr index e6c26f392f..5b00184593 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/2cc7de6ca7052b69.xdr and b/test-lcm-next/FrozenLedgerKeysTests/2cc7de6ca7052b69.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/2d300368c9082831.xdr b/test-lcm-next/FrozenLedgerKeysTests/2d300368c9082831.xdr index 313cbbfcd6..1141a38393 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/2d300368c9082831.xdr and b/test-lcm-next/FrozenLedgerKeysTests/2d300368c9082831.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/2ecd5ac1d64a632a.xdr b/test-lcm-next/FrozenLedgerKeysTests/2ecd5ac1d64a632a.xdr index 187568cda4..e53c8e2473 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/2ecd5ac1d64a632a.xdr and b/test-lcm-next/FrozenLedgerKeysTests/2ecd5ac1d64a632a.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/33d3622012e7482d.xdr b/test-lcm-next/FrozenLedgerKeysTests/33d3622012e7482d.xdr index 943d2d282c..32300f39be 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/33d3622012e7482d.xdr and b/test-lcm-next/FrozenLedgerKeysTests/33d3622012e7482d.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/352575440c65c590.xdr b/test-lcm-next/FrozenLedgerKeysTests/352575440c65c590.xdr index 5c59ef6e76..4598688c03 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/352575440c65c590.xdr and b/test-lcm-next/FrozenLedgerKeysTests/352575440c65c590.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/37c2d3c744db057c.xdr b/test-lcm-next/FrozenLedgerKeysTests/37c2d3c744db057c.xdr index b17e9b0800..9e6a138af2 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/37c2d3c744db057c.xdr and b/test-lcm-next/FrozenLedgerKeysTests/37c2d3c744db057c.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/37dc6f1b853351d3.xdr b/test-lcm-next/FrozenLedgerKeysTests/37dc6f1b853351d3.xdr index f9e0449f77..011122285c 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/37dc6f1b853351d3.xdr and b/test-lcm-next/FrozenLedgerKeysTests/37dc6f1b853351d3.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/395da6fd76d7d649.xdr b/test-lcm-next/FrozenLedgerKeysTests/395da6fd76d7d649.xdr index 1af41e1acd..be0de03fa2 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/395da6fd76d7d649.xdr and b/test-lcm-next/FrozenLedgerKeysTests/395da6fd76d7d649.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/3d6e5e32a6b48567.xdr b/test-lcm-next/FrozenLedgerKeysTests/3d6e5e32a6b48567.xdr index caa363acce..2da63ea9be 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/3d6e5e32a6b48567.xdr and b/test-lcm-next/FrozenLedgerKeysTests/3d6e5e32a6b48567.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/3dc9dab4e5a340ba.xdr b/test-lcm-next/FrozenLedgerKeysTests/3dc9dab4e5a340ba.xdr index 3cf4907099..fc9a9b086e 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/3dc9dab4e5a340ba.xdr and b/test-lcm-next/FrozenLedgerKeysTests/3dc9dab4e5a340ba.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/3dd2b1f80c573d23.xdr b/test-lcm-next/FrozenLedgerKeysTests/3dd2b1f80c573d23.xdr index da3d32e3bb..0629fde3af 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/3dd2b1f80c573d23.xdr and b/test-lcm-next/FrozenLedgerKeysTests/3dd2b1f80c573d23.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/3dd600739a73c9cd.xdr b/test-lcm-next/FrozenLedgerKeysTests/3dd600739a73c9cd.xdr index 8c00fc4440..ac8d7bfff9 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/3dd600739a73c9cd.xdr and b/test-lcm-next/FrozenLedgerKeysTests/3dd600739a73c9cd.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/3e53ab37c0265962.xdr b/test-lcm-next/FrozenLedgerKeysTests/3e53ab37c0265962.xdr index 1ef88ffb65..8884e88c01 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/3e53ab37c0265962.xdr and b/test-lcm-next/FrozenLedgerKeysTests/3e53ab37c0265962.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/4e7a95b40ba45ec4.xdr b/test-lcm-next/FrozenLedgerKeysTests/4e7a95b40ba45ec4.xdr index 8c52638f45..c2f95ddb9d 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/4e7a95b40ba45ec4.xdr and b/test-lcm-next/FrozenLedgerKeysTests/4e7a95b40ba45ec4.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/4f462cc49f7a3568.xdr b/test-lcm-next/FrozenLedgerKeysTests/4f462cc49f7a3568.xdr index 5caef1ff09..335d37aafa 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/4f462cc49f7a3568.xdr and b/test-lcm-next/FrozenLedgerKeysTests/4f462cc49f7a3568.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/59ef7f546d376c85.xdr b/test-lcm-next/FrozenLedgerKeysTests/59ef7f546d376c85.xdr index 46c5d9b9d5..507bcf5932 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/59ef7f546d376c85.xdr and b/test-lcm-next/FrozenLedgerKeysTests/59ef7f546d376c85.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/5b465c56327dab17.xdr b/test-lcm-next/FrozenLedgerKeysTests/5b465c56327dab17.xdr index 2e3d9f01f3..d039260175 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/5b465c56327dab17.xdr and b/test-lcm-next/FrozenLedgerKeysTests/5b465c56327dab17.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/5dd915bcf807a0c3.xdr b/test-lcm-next/FrozenLedgerKeysTests/5dd915bcf807a0c3.xdr index 2e3d9f01f3..d039260175 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/5dd915bcf807a0c3.xdr and b/test-lcm-next/FrozenLedgerKeysTests/5dd915bcf807a0c3.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/5e98f6024777fd63.xdr b/test-lcm-next/FrozenLedgerKeysTests/5e98f6024777fd63.xdr index bbc3238825..527c16b939 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/5e98f6024777fd63.xdr and b/test-lcm-next/FrozenLedgerKeysTests/5e98f6024777fd63.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/5f5d524416da196a.xdr b/test-lcm-next/FrozenLedgerKeysTests/5f5d524416da196a.xdr index b75239c4b4..ce6943b282 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/5f5d524416da196a.xdr and b/test-lcm-next/FrozenLedgerKeysTests/5f5d524416da196a.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/5f9dc515f9af2b30.xdr b/test-lcm-next/FrozenLedgerKeysTests/5f9dc515f9af2b30.xdr index ad4183f712..57c961e968 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/5f9dc515f9af2b30.xdr and b/test-lcm-next/FrozenLedgerKeysTests/5f9dc515f9af2b30.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/61a97d20a77d2460.xdr b/test-lcm-next/FrozenLedgerKeysTests/61a97d20a77d2460.xdr index 1ef88ffb65..8884e88c01 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/61a97d20a77d2460.xdr and b/test-lcm-next/FrozenLedgerKeysTests/61a97d20a77d2460.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/66bd677986a05b7d.xdr b/test-lcm-next/FrozenLedgerKeysTests/66bd677986a05b7d.xdr index fc4a1d2f0e..3867539a1b 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/66bd677986a05b7d.xdr and b/test-lcm-next/FrozenLedgerKeysTests/66bd677986a05b7d.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/693594ca2a8ed1db.xdr b/test-lcm-next/FrozenLedgerKeysTests/693594ca2a8ed1db.xdr index 66aba2d2e3..e1acec331e 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/693594ca2a8ed1db.xdr and b/test-lcm-next/FrozenLedgerKeysTests/693594ca2a8ed1db.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/6a558ed58db514ee.xdr b/test-lcm-next/FrozenLedgerKeysTests/6a558ed58db514ee.xdr index 0e9aac75fe..26d5b910f2 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/6a558ed58db514ee.xdr and b/test-lcm-next/FrozenLedgerKeysTests/6a558ed58db514ee.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/6a5abe9a6365c9b2.xdr b/test-lcm-next/FrozenLedgerKeysTests/6a5abe9a6365c9b2.xdr index 4a23f6dd78..47a115ca0f 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/6a5abe9a6365c9b2.xdr and b/test-lcm-next/FrozenLedgerKeysTests/6a5abe9a6365c9b2.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/6c91038331995c3f.xdr b/test-lcm-next/FrozenLedgerKeysTests/6c91038331995c3f.xdr index 74960a757d..a01a78e370 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/6c91038331995c3f.xdr and b/test-lcm-next/FrozenLedgerKeysTests/6c91038331995c3f.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/6fa3cd786ce04dd9.xdr b/test-lcm-next/FrozenLedgerKeysTests/6fa3cd786ce04dd9.xdr index 23b3c51688..cf63c9e6b5 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/6fa3cd786ce04dd9.xdr and b/test-lcm-next/FrozenLedgerKeysTests/6fa3cd786ce04dd9.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/6fae3a68c806ec2d.xdr b/test-lcm-next/FrozenLedgerKeysTests/6fae3a68c806ec2d.xdr index 507d6a6af8..8cd51b2a55 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/6fae3a68c806ec2d.xdr and b/test-lcm-next/FrozenLedgerKeysTests/6fae3a68c806ec2d.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/74c8bfeabe26560a.xdr b/test-lcm-next/FrozenLedgerKeysTests/74c8bfeabe26560a.xdr index cc8448fcf3..cb407afd09 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/74c8bfeabe26560a.xdr and b/test-lcm-next/FrozenLedgerKeysTests/74c8bfeabe26560a.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/7832644d33f07016.xdr b/test-lcm-next/FrozenLedgerKeysTests/7832644d33f07016.xdr index d3b19e1ba2..22c0465f77 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/7832644d33f07016.xdr and b/test-lcm-next/FrozenLedgerKeysTests/7832644d33f07016.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/7c60bd0a8e0d39a0.xdr b/test-lcm-next/FrozenLedgerKeysTests/7c60bd0a8e0d39a0.xdr index e0ddb5681c..4942224d78 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/7c60bd0a8e0d39a0.xdr and b/test-lcm-next/FrozenLedgerKeysTests/7c60bd0a8e0d39a0.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/7d4cbe380503bd78.xdr b/test-lcm-next/FrozenLedgerKeysTests/7d4cbe380503bd78.xdr index de62882a42..57688f8fd8 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/7d4cbe380503bd78.xdr and b/test-lcm-next/FrozenLedgerKeysTests/7d4cbe380503bd78.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/7e60b33e97cf0d0a.xdr b/test-lcm-next/FrozenLedgerKeysTests/7e60b33e97cf0d0a.xdr index 9070651a8a..4e24ded5f4 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/7e60b33e97cf0d0a.xdr and b/test-lcm-next/FrozenLedgerKeysTests/7e60b33e97cf0d0a.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/7e9cb3eb7498b526.xdr b/test-lcm-next/FrozenLedgerKeysTests/7e9cb3eb7498b526.xdr index 3cf4907099..fc9a9b086e 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/7e9cb3eb7498b526.xdr and b/test-lcm-next/FrozenLedgerKeysTests/7e9cb3eb7498b526.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/7ea017ea5bfde3f5.xdr b/test-lcm-next/FrozenLedgerKeysTests/7ea017ea5bfde3f5.xdr index 13e057ab28..ec02d9531e 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/7ea017ea5bfde3f5.xdr and b/test-lcm-next/FrozenLedgerKeysTests/7ea017ea5bfde3f5.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/82e842e08727efde.xdr b/test-lcm-next/FrozenLedgerKeysTests/82e842e08727efde.xdr index 4b0e74d54b..c566e67c6b 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/82e842e08727efde.xdr and b/test-lcm-next/FrozenLedgerKeysTests/82e842e08727efde.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/84cef76b68d93cc9.xdr b/test-lcm-next/FrozenLedgerKeysTests/84cef76b68d93cc9.xdr index b60ab4667a..c02b3558ff 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/84cef76b68d93cc9.xdr and b/test-lcm-next/FrozenLedgerKeysTests/84cef76b68d93cc9.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/88686096bda31fb9.xdr b/test-lcm-next/FrozenLedgerKeysTests/88686096bda31fb9.xdr index 9b0f79f651..b6a2681c1c 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/88686096bda31fb9.xdr and b/test-lcm-next/FrozenLedgerKeysTests/88686096bda31fb9.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/8b16614bc082b932.xdr b/test-lcm-next/FrozenLedgerKeysTests/8b16614bc082b932.xdr index 6bdbe6e5b8..27ce0006d5 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/8b16614bc082b932.xdr and b/test-lcm-next/FrozenLedgerKeysTests/8b16614bc082b932.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/90d52c9f9531509f.xdr b/test-lcm-next/FrozenLedgerKeysTests/90d52c9f9531509f.xdr index 8b87d493b9..30e9dbc229 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/90d52c9f9531509f.xdr and b/test-lcm-next/FrozenLedgerKeysTests/90d52c9f9531509f.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/92c3ac2898780b73.xdr b/test-lcm-next/FrozenLedgerKeysTests/92c3ac2898780b73.xdr index 1cbc8c8eb8..29486fd03f 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/92c3ac2898780b73.xdr and b/test-lcm-next/FrozenLedgerKeysTests/92c3ac2898780b73.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/94dfaaeec842ae02.xdr b/test-lcm-next/FrozenLedgerKeysTests/94dfaaeec842ae02.xdr index 7cc0158ef1..7cc3cdff09 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/94dfaaeec842ae02.xdr and b/test-lcm-next/FrozenLedgerKeysTests/94dfaaeec842ae02.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/95c3de7b21facafb.xdr b/test-lcm-next/FrozenLedgerKeysTests/95c3de7b21facafb.xdr index 27ac23e353..e747b46158 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/95c3de7b21facafb.xdr and b/test-lcm-next/FrozenLedgerKeysTests/95c3de7b21facafb.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/968502a58dcf1de3.xdr b/test-lcm-next/FrozenLedgerKeysTests/968502a58dcf1de3.xdr index 8e1d86bdf0..583a988939 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/968502a58dcf1de3.xdr and b/test-lcm-next/FrozenLedgerKeysTests/968502a58dcf1de3.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/971412d60c95c2db.xdr b/test-lcm-next/FrozenLedgerKeysTests/971412d60c95c2db.xdr index bcba1ad0e4..496a37b5b8 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/971412d60c95c2db.xdr and b/test-lcm-next/FrozenLedgerKeysTests/971412d60c95c2db.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/97b646ed2e8eda2c.xdr b/test-lcm-next/FrozenLedgerKeysTests/97b646ed2e8eda2c.xdr index fdab5e2485..65973b9ba9 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/97b646ed2e8eda2c.xdr and b/test-lcm-next/FrozenLedgerKeysTests/97b646ed2e8eda2c.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/97d8d6bf78ee1cbb.xdr b/test-lcm-next/FrozenLedgerKeysTests/97d8d6bf78ee1cbb.xdr index 7cc0aa5cf1..e911e98dbe 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/97d8d6bf78ee1cbb.xdr and b/test-lcm-next/FrozenLedgerKeysTests/97d8d6bf78ee1cbb.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/9b73d1cab44af790.xdr b/test-lcm-next/FrozenLedgerKeysTests/9b73d1cab44af790.xdr index fd030e98ce..729f5235bb 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/9b73d1cab44af790.xdr and b/test-lcm-next/FrozenLedgerKeysTests/9b73d1cab44af790.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/9de21df1739fe25b.xdr b/test-lcm-next/FrozenLedgerKeysTests/9de21df1739fe25b.xdr index 0819520d46..0f16f397e8 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/9de21df1739fe25b.xdr and b/test-lcm-next/FrozenLedgerKeysTests/9de21df1739fe25b.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/9f2fb4fd2d09521f.xdr b/test-lcm-next/FrozenLedgerKeysTests/9f2fb4fd2d09521f.xdr index 3cf4907099..fc9a9b086e 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/9f2fb4fd2d09521f.xdr and b/test-lcm-next/FrozenLedgerKeysTests/9f2fb4fd2d09521f.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/9f45874d5e43989d.xdr b/test-lcm-next/FrozenLedgerKeysTests/9f45874d5e43989d.xdr index e145ca9fd9..c6ba7cc415 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/9f45874d5e43989d.xdr and b/test-lcm-next/FrozenLedgerKeysTests/9f45874d5e43989d.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/9fdee40b4a6bf39b.xdr b/test-lcm-next/FrozenLedgerKeysTests/9fdee40b4a6bf39b.xdr index 7cabcb09c8..4195b18f96 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/9fdee40b4a6bf39b.xdr and b/test-lcm-next/FrozenLedgerKeysTests/9fdee40b4a6bf39b.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/9ffa8716dcb286c0.xdr b/test-lcm-next/FrozenLedgerKeysTests/9ffa8716dcb286c0.xdr index 91a182bf91..793a654b2e 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/9ffa8716dcb286c0.xdr and b/test-lcm-next/FrozenLedgerKeysTests/9ffa8716dcb286c0.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/a52d069eff3b6fc1.xdr b/test-lcm-next/FrozenLedgerKeysTests/a52d069eff3b6fc1.xdr index 383d186cec..70519f5313 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/a52d069eff3b6fc1.xdr and b/test-lcm-next/FrozenLedgerKeysTests/a52d069eff3b6fc1.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/a6cf4357be0adade.xdr b/test-lcm-next/FrozenLedgerKeysTests/a6cf4357be0adade.xdr index 1ef88ffb65..8884e88c01 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/a6cf4357be0adade.xdr and b/test-lcm-next/FrozenLedgerKeysTests/a6cf4357be0adade.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/a7277d96a361ea72.xdr b/test-lcm-next/FrozenLedgerKeysTests/a7277d96a361ea72.xdr index 0fc7e4e3ba..723ae9ca3e 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/a7277d96a361ea72.xdr and b/test-lcm-next/FrozenLedgerKeysTests/a7277d96a361ea72.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/a83e38c7dc6324a6.xdr b/test-lcm-next/FrozenLedgerKeysTests/a83e38c7dc6324a6.xdr index b64ff821de..83878a3183 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/a83e38c7dc6324a6.xdr and b/test-lcm-next/FrozenLedgerKeysTests/a83e38c7dc6324a6.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/a90b9e3d0747fc24.xdr b/test-lcm-next/FrozenLedgerKeysTests/a90b9e3d0747fc24.xdr index 2e3d9f01f3..d039260175 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/a90b9e3d0747fc24.xdr and b/test-lcm-next/FrozenLedgerKeysTests/a90b9e3d0747fc24.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/a99193a97590525a.xdr b/test-lcm-next/FrozenLedgerKeysTests/a99193a97590525a.xdr index b3d5be689d..311c44416f 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/a99193a97590525a.xdr and b/test-lcm-next/FrozenLedgerKeysTests/a99193a97590525a.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/aed719c9f3cffe43.xdr b/test-lcm-next/FrozenLedgerKeysTests/aed719c9f3cffe43.xdr index a38cab17d2..0c4af05278 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/aed719c9f3cffe43.xdr and b/test-lcm-next/FrozenLedgerKeysTests/aed719c9f3cffe43.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/b0eee42015a2800e.xdr b/test-lcm-next/FrozenLedgerKeysTests/b0eee42015a2800e.xdr index e01399dae0..f9a894a36d 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/b0eee42015a2800e.xdr and b/test-lcm-next/FrozenLedgerKeysTests/b0eee42015a2800e.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/b1412f5ef3c6844a.xdr b/test-lcm-next/FrozenLedgerKeysTests/b1412f5ef3c6844a.xdr index 44d0736557..50916fcccc 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/b1412f5ef3c6844a.xdr and b/test-lcm-next/FrozenLedgerKeysTests/b1412f5ef3c6844a.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/b17d186e3b574cc9.xdr b/test-lcm-next/FrozenLedgerKeysTests/b17d186e3b574cc9.xdr index 7a601cc4a0..f17923524b 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/b17d186e3b574cc9.xdr and b/test-lcm-next/FrozenLedgerKeysTests/b17d186e3b574cc9.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/b56fb200a9935407.xdr b/test-lcm-next/FrozenLedgerKeysTests/b56fb200a9935407.xdr index 8a9a9d0280..46ad16f27d 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/b56fb200a9935407.xdr and b/test-lcm-next/FrozenLedgerKeysTests/b56fb200a9935407.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/b76397dcb0e46f93.xdr b/test-lcm-next/FrozenLedgerKeysTests/b76397dcb0e46f93.xdr index fafb98a3fb..e816683ee3 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/b76397dcb0e46f93.xdr and b/test-lcm-next/FrozenLedgerKeysTests/b76397dcb0e46f93.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/b871f9e66b3df4a4.xdr b/test-lcm-next/FrozenLedgerKeysTests/b871f9e66b3df4a4.xdr index a3294c274d..739b330fdd 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/b871f9e66b3df4a4.xdr and b/test-lcm-next/FrozenLedgerKeysTests/b871f9e66b3df4a4.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/be86f12c1a3c4428.xdr b/test-lcm-next/FrozenLedgerKeysTests/be86f12c1a3c4428.xdr index 987db1e090..26cc8fbc3b 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/be86f12c1a3c4428.xdr and b/test-lcm-next/FrozenLedgerKeysTests/be86f12c1a3c4428.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/bf172f61f0f1bf37.xdr b/test-lcm-next/FrozenLedgerKeysTests/bf172f61f0f1bf37.xdr index 358f1cdfb6..cd9e05e747 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/bf172f61f0f1bf37.xdr and b/test-lcm-next/FrozenLedgerKeysTests/bf172f61f0f1bf37.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/c1da25bdd5f37532.xdr b/test-lcm-next/FrozenLedgerKeysTests/c1da25bdd5f37532.xdr index 3cf4907099..fc9a9b086e 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/c1da25bdd5f37532.xdr and b/test-lcm-next/FrozenLedgerKeysTests/c1da25bdd5f37532.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/c56e571da1b376c9.xdr b/test-lcm-next/FrozenLedgerKeysTests/c56e571da1b376c9.xdr index 2d860e4b45..bca227f7eb 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/c56e571da1b376c9.xdr and b/test-lcm-next/FrozenLedgerKeysTests/c56e571da1b376c9.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/c981497abd448c3f.xdr b/test-lcm-next/FrozenLedgerKeysTests/c981497abd448c3f.xdr index 58697c6134..353f0d7920 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/c981497abd448c3f.xdr and b/test-lcm-next/FrozenLedgerKeysTests/c981497abd448c3f.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/cbfd70c53b96ff0c.xdr b/test-lcm-next/FrozenLedgerKeysTests/cbfd70c53b96ff0c.xdr index 2e3d9f01f3..d039260175 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/cbfd70c53b96ff0c.xdr and b/test-lcm-next/FrozenLedgerKeysTests/cbfd70c53b96ff0c.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/cd95267fadf7bb22.xdr b/test-lcm-next/FrozenLedgerKeysTests/cd95267fadf7bb22.xdr index 68a7ccc582..08b9b91e49 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/cd95267fadf7bb22.xdr and b/test-lcm-next/FrozenLedgerKeysTests/cd95267fadf7bb22.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/ce3d2b256f805a34.xdr b/test-lcm-next/FrozenLedgerKeysTests/ce3d2b256f805a34.xdr index 875412be08..6abde77947 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/ce3d2b256f805a34.xdr and b/test-lcm-next/FrozenLedgerKeysTests/ce3d2b256f805a34.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/cfbae9c5c8b66206.xdr b/test-lcm-next/FrozenLedgerKeysTests/cfbae9c5c8b66206.xdr index d6839864e6..e8067bdc11 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/cfbae9c5c8b66206.xdr and b/test-lcm-next/FrozenLedgerKeysTests/cfbae9c5c8b66206.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/d4abe4b07bba98dd.xdr b/test-lcm-next/FrozenLedgerKeysTests/d4abe4b07bba98dd.xdr index e100351f10..54c615cb12 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/d4abe4b07bba98dd.xdr and b/test-lcm-next/FrozenLedgerKeysTests/d4abe4b07bba98dd.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/d55bb5b0991f7f30.xdr b/test-lcm-next/FrozenLedgerKeysTests/d55bb5b0991f7f30.xdr index 13f1b8c9e8..a31d07cec2 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/d55bb5b0991f7f30.xdr and b/test-lcm-next/FrozenLedgerKeysTests/d55bb5b0991f7f30.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/d62a40e1e6c94407.xdr b/test-lcm-next/FrozenLedgerKeysTests/d62a40e1e6c94407.xdr index 5bfd89ac7d..bb9752dc4a 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/d62a40e1e6c94407.xdr and b/test-lcm-next/FrozenLedgerKeysTests/d62a40e1e6c94407.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/d7889dabf9db8ae0.xdr b/test-lcm-next/FrozenLedgerKeysTests/d7889dabf9db8ae0.xdr index 723f06214a..86edb78175 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/d7889dabf9db8ae0.xdr and b/test-lcm-next/FrozenLedgerKeysTests/d7889dabf9db8ae0.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/d8ed7e56f9a5fa9a.xdr b/test-lcm-next/FrozenLedgerKeysTests/d8ed7e56f9a5fa9a.xdr index 8592a1e416..7e392d783a 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/d8ed7e56f9a5fa9a.xdr and b/test-lcm-next/FrozenLedgerKeysTests/d8ed7e56f9a5fa9a.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/d9197ac0364b429d.xdr b/test-lcm-next/FrozenLedgerKeysTests/d9197ac0364b429d.xdr index 2e3d9f01f3..d039260175 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/d9197ac0364b429d.xdr and b/test-lcm-next/FrozenLedgerKeysTests/d9197ac0364b429d.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/d9a26f74c76ec5fe.xdr b/test-lcm-next/FrozenLedgerKeysTests/d9a26f74c76ec5fe.xdr index 5559a4615b..258f96ee7f 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/d9a26f74c76ec5fe.xdr and b/test-lcm-next/FrozenLedgerKeysTests/d9a26f74c76ec5fe.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/dda5baf59d9d24fa.xdr b/test-lcm-next/FrozenLedgerKeysTests/dda5baf59d9d24fa.xdr index 6d32803222..c32b22f79f 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/dda5baf59d9d24fa.xdr and b/test-lcm-next/FrozenLedgerKeysTests/dda5baf59d9d24fa.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/dfaa9a4ba1d5bac8.xdr b/test-lcm-next/FrozenLedgerKeysTests/dfaa9a4ba1d5bac8.xdr index 3a2ee57a9b..0b3d76c351 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/dfaa9a4ba1d5bac8.xdr and b/test-lcm-next/FrozenLedgerKeysTests/dfaa9a4ba1d5bac8.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/e54f97e007f28f3a.xdr b/test-lcm-next/FrozenLedgerKeysTests/e54f97e007f28f3a.xdr index 00bc69dd84..73b9772c87 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/e54f97e007f28f3a.xdr and b/test-lcm-next/FrozenLedgerKeysTests/e54f97e007f28f3a.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/eb07a254c1f6d187.xdr b/test-lcm-next/FrozenLedgerKeysTests/eb07a254c1f6d187.xdr index 9d783f518b..8a6ce4dc79 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/eb07a254c1f6d187.xdr and b/test-lcm-next/FrozenLedgerKeysTests/eb07a254c1f6d187.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/eb5978da5a37cd47.xdr b/test-lcm-next/FrozenLedgerKeysTests/eb5978da5a37cd47.xdr index 358f1cdfb6..cd9e05e747 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/eb5978da5a37cd47.xdr and b/test-lcm-next/FrozenLedgerKeysTests/eb5978da5a37cd47.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/f00ec39cd6781faf.xdr b/test-lcm-next/FrozenLedgerKeysTests/f00ec39cd6781faf.xdr index 9c083d59b2..d4edf995f0 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/f00ec39cd6781faf.xdr and b/test-lcm-next/FrozenLedgerKeysTests/f00ec39cd6781faf.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/f1c47fc06e54b090.xdr b/test-lcm-next/FrozenLedgerKeysTests/f1c47fc06e54b090.xdr index 626a9a62a3..9c88be7520 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/f1c47fc06e54b090.xdr and b/test-lcm-next/FrozenLedgerKeysTests/f1c47fc06e54b090.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/f4bb246ec9780039.xdr b/test-lcm-next/FrozenLedgerKeysTests/f4bb246ec9780039.xdr index 370fa11b70..2231cfacd6 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/f4bb246ec9780039.xdr and b/test-lcm-next/FrozenLedgerKeysTests/f4bb246ec9780039.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/f58a584ef5d545bb.xdr b/test-lcm-next/FrozenLedgerKeysTests/f58a584ef5d545bb.xdr index 3cf4907099..fc9a9b086e 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/f58a584ef5d545bb.xdr and b/test-lcm-next/FrozenLedgerKeysTests/f58a584ef5d545bb.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/f5cc954b49f207f0.xdr b/test-lcm-next/FrozenLedgerKeysTests/f5cc954b49f207f0.xdr index 7e70870781..24d2109df9 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/f5cc954b49f207f0.xdr and b/test-lcm-next/FrozenLedgerKeysTests/f5cc954b49f207f0.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/f790a9565ea4b914.xdr b/test-lcm-next/FrozenLedgerKeysTests/f790a9565ea4b914.xdr index 5bdde584fe..0c66d52afa 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/f790a9565ea4b914.xdr and b/test-lcm-next/FrozenLedgerKeysTests/f790a9565ea4b914.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/f792ea98a5b2057e.xdr b/test-lcm-next/FrozenLedgerKeysTests/f792ea98a5b2057e.xdr index 2e3d9f01f3..d039260175 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/f792ea98a5b2057e.xdr and b/test-lcm-next/FrozenLedgerKeysTests/f792ea98a5b2057e.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/f84821960123588e.xdr b/test-lcm-next/FrozenLedgerKeysTests/f84821960123588e.xdr index 49ec5303c3..8131ab9fe7 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/f84821960123588e.xdr and b/test-lcm-next/FrozenLedgerKeysTests/f84821960123588e.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/fd5da6cc6e5623a5.xdr b/test-lcm-next/FrozenLedgerKeysTests/fd5da6cc6e5623a5.xdr index ee9ca9407c..a40ba70680 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/fd5da6cc6e5623a5.xdr and b/test-lcm-next/FrozenLedgerKeysTests/fd5da6cc6e5623a5.xdr differ diff --git a/test-lcm-next/FrozenLedgerKeysTests/fe99942900ae7d38.xdr b/test-lcm-next/FrozenLedgerKeysTests/fe99942900ae7d38.xdr index 7700740087..27939118f1 100644 Binary files a/test-lcm-next/FrozenLedgerKeysTests/fe99942900ae7d38.xdr and b/test-lcm-next/FrozenLedgerKeysTests/fe99942900ae7d38.xdr differ diff --git a/test-lcm-next/HerderTests/370dd5e0af5cfa8d.xdr b/test-lcm-next/HerderTests/370dd5e0af5cfa8d.xdr index 2250741eb7..259eecdfaa 100644 Binary files a/test-lcm-next/HerderTests/370dd5e0af5cfa8d.xdr and b/test-lcm-next/HerderTests/370dd5e0af5cfa8d.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/0046300f950c0211.xdr b/test-lcm-next/InvokeHostFunctionTests/0046300f950c0211.xdr index 0937d20c7b..2846289535 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/0046300f950c0211.xdr and b/test-lcm-next/InvokeHostFunctionTests/0046300f950c0211.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/00e76ef8f869401f.xdr b/test-lcm-next/InvokeHostFunctionTests/00e76ef8f869401f.xdr index 09e2d879ed..3d2fc14407 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/00e76ef8f869401f.xdr and b/test-lcm-next/InvokeHostFunctionTests/00e76ef8f869401f.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/014fcfa4f59b51d4.xdr b/test-lcm-next/InvokeHostFunctionTests/014fcfa4f59b51d4.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/014fcfa4f59b51d4.xdr and b/test-lcm-next/InvokeHostFunctionTests/014fcfa4f59b51d4.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/018599ef4068218e.xdr b/test-lcm-next/InvokeHostFunctionTests/018599ef4068218e.xdr index bd561f92a1..be5a6f1c9d 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/018599ef4068218e.xdr and b/test-lcm-next/InvokeHostFunctionTests/018599ef4068218e.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/0266bee165a0b438.xdr b/test-lcm-next/InvokeHostFunctionTests/0266bee165a0b438.xdr new file mode 100644 index 0000000000..364c280a96 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/0266bee165a0b438.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/03560ea94d548ceb.xdr b/test-lcm-next/InvokeHostFunctionTests/03560ea94d548ceb.xdr index 134a1e69cd..e804548e7a 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/03560ea94d548ceb.xdr and b/test-lcm-next/InvokeHostFunctionTests/03560ea94d548ceb.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/03a5e8d5ea1d3a10.xdr b/test-lcm-next/InvokeHostFunctionTests/03a5e8d5ea1d3a10.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/03a5e8d5ea1d3a10.xdr and b/test-lcm-next/InvokeHostFunctionTests/03a5e8d5ea1d3a10.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/03df1dc73d71eb00.xdr b/test-lcm-next/InvokeHostFunctionTests/03df1dc73d71eb00.xdr index 2c6df8f7c4..ab30b4df06 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/03df1dc73d71eb00.xdr and b/test-lcm-next/InvokeHostFunctionTests/03df1dc73d71eb00.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/04530f6112a41176.xdr b/test-lcm-next/InvokeHostFunctionTests/04530f6112a41176.xdr index fb221f4afb..d8bbb80e22 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/04530f6112a41176.xdr and b/test-lcm-next/InvokeHostFunctionTests/04530f6112a41176.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/048c93e37abb62ea.xdr b/test-lcm-next/InvokeHostFunctionTests/048c93e37abb62ea.xdr index ee3588da45..fc967f9aba 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/048c93e37abb62ea.xdr and b/test-lcm-next/InvokeHostFunctionTests/048c93e37abb62ea.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/04c4d4cc1a4c7b46.xdr b/test-lcm-next/InvokeHostFunctionTests/04c4d4cc1a4c7b46.xdr new file mode 100644 index 0000000000..f8b7f848b8 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/04c4d4cc1a4c7b46.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/0525df1061c74b13.xdr b/test-lcm-next/InvokeHostFunctionTests/0525df1061c74b13.xdr index 6a4ce836a1..95aa0ae35a 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/0525df1061c74b13.xdr and b/test-lcm-next/InvokeHostFunctionTests/0525df1061c74b13.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/068bb21d88974e0d.xdr b/test-lcm-next/InvokeHostFunctionTests/068bb21d88974e0d.xdr index 1c102e8ac5..c98abd1963 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/068bb21d88974e0d.xdr and b/test-lcm-next/InvokeHostFunctionTests/068bb21d88974e0d.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/06cbc0fe2a3f8280.xdr b/test-lcm-next/InvokeHostFunctionTests/06cbc0fe2a3f8280.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/06cbc0fe2a3f8280.xdr and b/test-lcm-next/InvokeHostFunctionTests/06cbc0fe2a3f8280.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/075b4bea01d35444.xdr b/test-lcm-next/InvokeHostFunctionTests/075b4bea01d35444.xdr index 777e20605a..cb1e65dc71 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/075b4bea01d35444.xdr and b/test-lcm-next/InvokeHostFunctionTests/075b4bea01d35444.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/07a8d36187cd3462.xdr b/test-lcm-next/InvokeHostFunctionTests/07a8d36187cd3462.xdr new file mode 100644 index 0000000000..6b6af1e62a Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/07a8d36187cd3462.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/07c78b13b19c1cca.xdr b/test-lcm-next/InvokeHostFunctionTests/07c78b13b19c1cca.xdr index 9dfbfddb0f..32ae815928 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/07c78b13b19c1cca.xdr and b/test-lcm-next/InvokeHostFunctionTests/07c78b13b19c1cca.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/090b6171bc887479.xdr b/test-lcm-next/InvokeHostFunctionTests/090b6171bc887479.xdr index c290a1122d..093503758f 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/090b6171bc887479.xdr and b/test-lcm-next/InvokeHostFunctionTests/090b6171bc887479.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/091f6d22b48f7501.xdr b/test-lcm-next/InvokeHostFunctionTests/091f6d22b48f7501.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/091f6d22b48f7501.xdr and b/test-lcm-next/InvokeHostFunctionTests/091f6d22b48f7501.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/09b571acb76aa819.xdr b/test-lcm-next/InvokeHostFunctionTests/09b571acb76aa819.xdr index 76808369ea..ef68b72b11 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/09b571acb76aa819.xdr and b/test-lcm-next/InvokeHostFunctionTests/09b571acb76aa819.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/09e3525781c1197d.xdr b/test-lcm-next/InvokeHostFunctionTests/09e3525781c1197d.xdr index 4ed0b9ce11..0363a1ec6b 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/09e3525781c1197d.xdr and b/test-lcm-next/InvokeHostFunctionTests/09e3525781c1197d.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/09efa855e6310bd6.xdr b/test-lcm-next/InvokeHostFunctionTests/09efa855e6310bd6.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/09efa855e6310bd6.xdr and b/test-lcm-next/InvokeHostFunctionTests/09efa855e6310bd6.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/0a490b46a65b3382.xdr b/test-lcm-next/InvokeHostFunctionTests/0a490b46a65b3382.xdr index 76b9433f41..42e7a0b7fa 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/0a490b46a65b3382.xdr and b/test-lcm-next/InvokeHostFunctionTests/0a490b46a65b3382.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/0a50a6fd01fac663.xdr b/test-lcm-next/InvokeHostFunctionTests/0a50a6fd01fac663.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/0a50a6fd01fac663.xdr and b/test-lcm-next/InvokeHostFunctionTests/0a50a6fd01fac663.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/0a5c74765d1481ad.xdr b/test-lcm-next/InvokeHostFunctionTests/0a5c74765d1481ad.xdr index cef2a2a4c7..23f62d55eb 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/0a5c74765d1481ad.xdr and b/test-lcm-next/InvokeHostFunctionTests/0a5c74765d1481ad.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/0a7c39ca98f1ae85.xdr b/test-lcm-next/InvokeHostFunctionTests/0a7c39ca98f1ae85.xdr index 7bf1437260..b943b478d8 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/0a7c39ca98f1ae85.xdr and b/test-lcm-next/InvokeHostFunctionTests/0a7c39ca98f1ae85.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/0a9a9e7662e8f5b0.xdr b/test-lcm-next/InvokeHostFunctionTests/0a9a9e7662e8f5b0.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/0a9a9e7662e8f5b0.xdr and b/test-lcm-next/InvokeHostFunctionTests/0a9a9e7662e8f5b0.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/0a9e15c210b27eb7.xdr b/test-lcm-next/InvokeHostFunctionTests/0a9e15c210b27eb7.xdr new file mode 100644 index 0000000000..e1b8aa27e9 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/0a9e15c210b27eb7.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/0b38afb8b9aaa794.xdr b/test-lcm-next/InvokeHostFunctionTests/0b38afb8b9aaa794.xdr index 539c74145f..74fc9f2b85 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/0b38afb8b9aaa794.xdr and b/test-lcm-next/InvokeHostFunctionTests/0b38afb8b9aaa794.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/0b51082fea0c09b1.xdr b/test-lcm-next/InvokeHostFunctionTests/0b51082fea0c09b1.xdr new file mode 100644 index 0000000000..be8c550a39 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/0b51082fea0c09b1.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/0c004ec5e3c54aa7.xdr b/test-lcm-next/InvokeHostFunctionTests/0c004ec5e3c54aa7.xdr new file mode 100644 index 0000000000..7e175a1ade Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/0c004ec5e3c54aa7.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/0c35da322a33f3c2.xdr b/test-lcm-next/InvokeHostFunctionTests/0c35da322a33f3c2.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/0c35da322a33f3c2.xdr and b/test-lcm-next/InvokeHostFunctionTests/0c35da322a33f3c2.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/0c43ba995c341a31.xdr b/test-lcm-next/InvokeHostFunctionTests/0c43ba995c341a31.xdr index a919499593..28af803b33 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/0c43ba995c341a31.xdr and b/test-lcm-next/InvokeHostFunctionTests/0c43ba995c341a31.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/0c92eb78da37bfdd.xdr b/test-lcm-next/InvokeHostFunctionTests/0c92eb78da37bfdd.xdr index 8933acdebc..dbc77206fe 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/0c92eb78da37bfdd.xdr and b/test-lcm-next/InvokeHostFunctionTests/0c92eb78da37bfdd.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/0cb06b7800ce099c.xdr b/test-lcm-next/InvokeHostFunctionTests/0cb06b7800ce099c.xdr index 7f1dd5b74f..b11ee8217a 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/0cb06b7800ce099c.xdr and b/test-lcm-next/InvokeHostFunctionTests/0cb06b7800ce099c.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/0cfa6a9a348ad29f.xdr b/test-lcm-next/InvokeHostFunctionTests/0cfa6a9a348ad29f.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/0cfa6a9a348ad29f.xdr and b/test-lcm-next/InvokeHostFunctionTests/0cfa6a9a348ad29f.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/0d6e850f5668faef.xdr b/test-lcm-next/InvokeHostFunctionTests/0d6e850f5668faef.xdr index a7d65f6051..8e78d9d539 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/0d6e850f5668faef.xdr and b/test-lcm-next/InvokeHostFunctionTests/0d6e850f5668faef.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/0e54ece7b7219a81.xdr b/test-lcm-next/InvokeHostFunctionTests/0e54ece7b7219a81.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/0e54ece7b7219a81.xdr and b/test-lcm-next/InvokeHostFunctionTests/0e54ece7b7219a81.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/0f97452228eac10a.xdr b/test-lcm-next/InvokeHostFunctionTests/0f97452228eac10a.xdr index 6f31a67565..ce5d0a0ae9 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/0f97452228eac10a.xdr and b/test-lcm-next/InvokeHostFunctionTests/0f97452228eac10a.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/102ec8047ba9b73e.xdr b/test-lcm-next/InvokeHostFunctionTests/102ec8047ba9b73e.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/102ec8047ba9b73e.xdr and b/test-lcm-next/InvokeHostFunctionTests/102ec8047ba9b73e.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/12400eda8720567b.xdr b/test-lcm-next/InvokeHostFunctionTests/12400eda8720567b.xdr index 4b7d41e9d6..a4ffa7f0a6 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/12400eda8720567b.xdr and b/test-lcm-next/InvokeHostFunctionTests/12400eda8720567b.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/12e5bf578c813325.xdr b/test-lcm-next/InvokeHostFunctionTests/12e5bf578c813325.xdr index b957a4ec28..674368fea4 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/12e5bf578c813325.xdr and b/test-lcm-next/InvokeHostFunctionTests/12e5bf578c813325.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/133235aeb624b4fb.xdr b/test-lcm-next/InvokeHostFunctionTests/133235aeb624b4fb.xdr index ea0b044779..e5ad560e53 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/133235aeb624b4fb.xdr and b/test-lcm-next/InvokeHostFunctionTests/133235aeb624b4fb.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/1395745c935c8a14.xdr b/test-lcm-next/InvokeHostFunctionTests/1395745c935c8a14.xdr index afb5567bd8..38f0a32ee5 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/1395745c935c8a14.xdr and b/test-lcm-next/InvokeHostFunctionTests/1395745c935c8a14.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/13ddfbcd91340230.xdr b/test-lcm-next/InvokeHostFunctionTests/13ddfbcd91340230.xdr index d8e4e8647d..a4a4da9851 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/13ddfbcd91340230.xdr and b/test-lcm-next/InvokeHostFunctionTests/13ddfbcd91340230.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/13f416a9b53c779a.xdr b/test-lcm-next/InvokeHostFunctionTests/13f416a9b53c779a.xdr index 44a654fe70..af025cc4c8 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/13f416a9b53c779a.xdr and b/test-lcm-next/InvokeHostFunctionTests/13f416a9b53c779a.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/14407acab9b18289.xdr b/test-lcm-next/InvokeHostFunctionTests/14407acab9b18289.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/14407acab9b18289.xdr and b/test-lcm-next/InvokeHostFunctionTests/14407acab9b18289.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/1452c35fbbe6c3ab.xdr b/test-lcm-next/InvokeHostFunctionTests/1452c35fbbe6c3ab.xdr index 4e7c305532..6f3051d926 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/1452c35fbbe6c3ab.xdr and b/test-lcm-next/InvokeHostFunctionTests/1452c35fbbe6c3ab.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/1484cd9b56513ed7.xdr b/test-lcm-next/InvokeHostFunctionTests/1484cd9b56513ed7.xdr index f7f104a883..646bf8c38c 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/1484cd9b56513ed7.xdr and b/test-lcm-next/InvokeHostFunctionTests/1484cd9b56513ed7.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/15bc83b6792d6072.xdr b/test-lcm-next/InvokeHostFunctionTests/15bc83b6792d6072.xdr index ac1b967da3..d2e6e44c27 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/15bc83b6792d6072.xdr and b/test-lcm-next/InvokeHostFunctionTests/15bc83b6792d6072.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/15ecaba55fd111cc.xdr b/test-lcm-next/InvokeHostFunctionTests/15ecaba55fd111cc.xdr index 7b573103c5..7c5b482113 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/15ecaba55fd111cc.xdr and b/test-lcm-next/InvokeHostFunctionTests/15ecaba55fd111cc.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/1648891cd7b9ac4f.xdr b/test-lcm-next/InvokeHostFunctionTests/1648891cd7b9ac4f.xdr index 6f13f1a7b7..363b6dc34a 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/1648891cd7b9ac4f.xdr and b/test-lcm-next/InvokeHostFunctionTests/1648891cd7b9ac4f.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/165a1612aefb1f12.xdr b/test-lcm-next/InvokeHostFunctionTests/165a1612aefb1f12.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/165a1612aefb1f12.xdr and b/test-lcm-next/InvokeHostFunctionTests/165a1612aefb1f12.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/169611b4e9b946c9.xdr b/test-lcm-next/InvokeHostFunctionTests/169611b4e9b946c9.xdr index 98215a3a71..deea257043 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/169611b4e9b946c9.xdr and b/test-lcm-next/InvokeHostFunctionTests/169611b4e9b946c9.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/169eaf7fc82af3dc.xdr b/test-lcm-next/InvokeHostFunctionTests/169eaf7fc82af3dc.xdr index d7eff8e6d2..1ae48da6dc 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/169eaf7fc82af3dc.xdr and b/test-lcm-next/InvokeHostFunctionTests/169eaf7fc82af3dc.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/16bac056666df725.xdr b/test-lcm-next/InvokeHostFunctionTests/16bac056666df725.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/16bac056666df725.xdr and b/test-lcm-next/InvokeHostFunctionTests/16bac056666df725.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/170512fdcfd48e15.xdr b/test-lcm-next/InvokeHostFunctionTests/170512fdcfd48e15.xdr new file mode 100644 index 0000000000..919be2d677 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/170512fdcfd48e15.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/192dc34906478ab9.xdr b/test-lcm-next/InvokeHostFunctionTests/192dc34906478ab9.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/192dc34906478ab9.xdr and b/test-lcm-next/InvokeHostFunctionTests/192dc34906478ab9.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/193297e2240649fc.xdr b/test-lcm-next/InvokeHostFunctionTests/193297e2240649fc.xdr index dc5e47c607..12fa7248b9 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/193297e2240649fc.xdr and b/test-lcm-next/InvokeHostFunctionTests/193297e2240649fc.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/1967a2d9962bb619.xdr b/test-lcm-next/InvokeHostFunctionTests/1967a2d9962bb619.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/1967a2d9962bb619.xdr and b/test-lcm-next/InvokeHostFunctionTests/1967a2d9962bb619.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/198ad94ac0412a8b.xdr b/test-lcm-next/InvokeHostFunctionTests/198ad94ac0412a8b.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/198ad94ac0412a8b.xdr and b/test-lcm-next/InvokeHostFunctionTests/198ad94ac0412a8b.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/1a8c5902e4afd03e.xdr b/test-lcm-next/InvokeHostFunctionTests/1a8c5902e4afd03e.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/1a8c5902e4afd03e.xdr and b/test-lcm-next/InvokeHostFunctionTests/1a8c5902e4afd03e.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/1adc68cc7a5cf88e.xdr b/test-lcm-next/InvokeHostFunctionTests/1adc68cc7a5cf88e.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/1adc68cc7a5cf88e.xdr and b/test-lcm-next/InvokeHostFunctionTests/1adc68cc7a5cf88e.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/1b18e4016bfdf294.xdr b/test-lcm-next/InvokeHostFunctionTests/1b18e4016bfdf294.xdr index cfb179311a..fa143479ef 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/1b18e4016bfdf294.xdr and b/test-lcm-next/InvokeHostFunctionTests/1b18e4016bfdf294.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/1c3d83a0318651b9.xdr b/test-lcm-next/InvokeHostFunctionTests/1c3d83a0318651b9.xdr index 19f8b7a757..7dddf72e5d 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/1c3d83a0318651b9.xdr and b/test-lcm-next/InvokeHostFunctionTests/1c3d83a0318651b9.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/1cf2a7976fb37347.xdr b/test-lcm-next/InvokeHostFunctionTests/1cf2a7976fb37347.xdr new file mode 100644 index 0000000000..4fb0b337c5 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/1cf2a7976fb37347.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/1dd0d92b94ce7c6f.xdr b/test-lcm-next/InvokeHostFunctionTests/1dd0d92b94ce7c6f.xdr index 1718d802b8..176c03062e 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/1dd0d92b94ce7c6f.xdr and b/test-lcm-next/InvokeHostFunctionTests/1dd0d92b94ce7c6f.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/1e3b9bd5e2a72ad7.xdr b/test-lcm-next/InvokeHostFunctionTests/1e3b9bd5e2a72ad7.xdr new file mode 100644 index 0000000000..a1a7613490 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/1e3b9bd5e2a72ad7.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/1e3c70b0ecdbfb4f.xdr b/test-lcm-next/InvokeHostFunctionTests/1e3c70b0ecdbfb4f.xdr index 962c7b24d2..d0a0e00040 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/1e3c70b0ecdbfb4f.xdr and b/test-lcm-next/InvokeHostFunctionTests/1e3c70b0ecdbfb4f.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/1ec1111288c846ad.xdr b/test-lcm-next/InvokeHostFunctionTests/1ec1111288c846ad.xdr index a6d3f9f16f..ed982d4a56 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/1ec1111288c846ad.xdr and b/test-lcm-next/InvokeHostFunctionTests/1ec1111288c846ad.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/1f15add1dc0ddc92.xdr b/test-lcm-next/InvokeHostFunctionTests/1f15add1dc0ddc92.xdr new file mode 100644 index 0000000000..8cf45b0979 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/1f15add1dc0ddc92.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/1f62f6743bb52550.xdr b/test-lcm-next/InvokeHostFunctionTests/1f62f6743bb52550.xdr index c003080412..b84a651798 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/1f62f6743bb52550.xdr and b/test-lcm-next/InvokeHostFunctionTests/1f62f6743bb52550.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/20a6a4892d5acc69.xdr b/test-lcm-next/InvokeHostFunctionTests/20a6a4892d5acc69.xdr index c30db93ba7..25de283f8c 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/20a6a4892d5acc69.xdr and b/test-lcm-next/InvokeHostFunctionTests/20a6a4892d5acc69.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/20b9b462d5735ae2.xdr b/test-lcm-next/InvokeHostFunctionTests/20b9b462d5735ae2.xdr index 92007833c9..971dabbea9 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/20b9b462d5735ae2.xdr and b/test-lcm-next/InvokeHostFunctionTests/20b9b462d5735ae2.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/20c2b0f439ace889.xdr b/test-lcm-next/InvokeHostFunctionTests/20c2b0f439ace889.xdr index 17b0beb3ea..70d80482db 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/20c2b0f439ace889.xdr and b/test-lcm-next/InvokeHostFunctionTests/20c2b0f439ace889.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/211f4a93951f94b4.xdr b/test-lcm-next/InvokeHostFunctionTests/211f4a93951f94b4.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/211f4a93951f94b4.xdr and b/test-lcm-next/InvokeHostFunctionTests/211f4a93951f94b4.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/21938ae254995cd4.xdr b/test-lcm-next/InvokeHostFunctionTests/21938ae254995cd4.xdr index b05db29650..b76db85d47 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/21938ae254995cd4.xdr and b/test-lcm-next/InvokeHostFunctionTests/21938ae254995cd4.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/21ac7793688994ad.xdr b/test-lcm-next/InvokeHostFunctionTests/21ac7793688994ad.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/21ac7793688994ad.xdr and b/test-lcm-next/InvokeHostFunctionTests/21ac7793688994ad.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/21e553dd1071721a.xdr b/test-lcm-next/InvokeHostFunctionTests/21e553dd1071721a.xdr index 728a69d78d..7b0ca71491 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/21e553dd1071721a.xdr and b/test-lcm-next/InvokeHostFunctionTests/21e553dd1071721a.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/221f1cad327fb891.xdr b/test-lcm-next/InvokeHostFunctionTests/221f1cad327fb891.xdr index 1ceffcbfe2..b010af3388 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/221f1cad327fb891.xdr and b/test-lcm-next/InvokeHostFunctionTests/221f1cad327fb891.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/227f785ddbb9ab40.xdr b/test-lcm-next/InvokeHostFunctionTests/227f785ddbb9ab40.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/227f785ddbb9ab40.xdr and b/test-lcm-next/InvokeHostFunctionTests/227f785ddbb9ab40.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/2287bf75d44d6db2.xdr b/test-lcm-next/InvokeHostFunctionTests/2287bf75d44d6db2.xdr index 1daf4ad2d9..eb0f84b305 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/2287bf75d44d6db2.xdr and b/test-lcm-next/InvokeHostFunctionTests/2287bf75d44d6db2.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/22b51f8885cb01b4.xdr b/test-lcm-next/InvokeHostFunctionTests/22b51f8885cb01b4.xdr new file mode 100644 index 0000000000..84a7ab304b Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/22b51f8885cb01b4.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/22c6c1fecdd3222c.xdr b/test-lcm-next/InvokeHostFunctionTests/22c6c1fecdd3222c.xdr index 9ee61397cd..4b1878765e 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/22c6c1fecdd3222c.xdr and b/test-lcm-next/InvokeHostFunctionTests/22c6c1fecdd3222c.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/22c9f0d43d968ecf.xdr b/test-lcm-next/InvokeHostFunctionTests/22c9f0d43d968ecf.xdr new file mode 100644 index 0000000000..71e187caf3 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/22c9f0d43d968ecf.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/22df21f5f58e57ba.xdr b/test-lcm-next/InvokeHostFunctionTests/22df21f5f58e57ba.xdr index 404c9f92d1..f751ccec00 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/22df21f5f58e57ba.xdr and b/test-lcm-next/InvokeHostFunctionTests/22df21f5f58e57ba.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/2342772cbe3d3e0c.xdr b/test-lcm-next/InvokeHostFunctionTests/2342772cbe3d3e0c.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/2342772cbe3d3e0c.xdr and b/test-lcm-next/InvokeHostFunctionTests/2342772cbe3d3e0c.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/236e2db9eeecc097.xdr b/test-lcm-next/InvokeHostFunctionTests/236e2db9eeecc097.xdr new file mode 100644 index 0000000000..8e6eafa233 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/236e2db9eeecc097.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/23733e3ae41a70ad.xdr b/test-lcm-next/InvokeHostFunctionTests/23733e3ae41a70ad.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/23733e3ae41a70ad.xdr and b/test-lcm-next/InvokeHostFunctionTests/23733e3ae41a70ad.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/23900da58ed1ec25.xdr b/test-lcm-next/InvokeHostFunctionTests/23900da58ed1ec25.xdr index 0c5317bea9..f6f48e32b3 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/23900da58ed1ec25.xdr and b/test-lcm-next/InvokeHostFunctionTests/23900da58ed1ec25.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/23a89388bfb65808.xdr b/test-lcm-next/InvokeHostFunctionTests/23a89388bfb65808.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/23a89388bfb65808.xdr and b/test-lcm-next/InvokeHostFunctionTests/23a89388bfb65808.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/246b195d9beac8d6.xdr b/test-lcm-next/InvokeHostFunctionTests/246b195d9beac8d6.xdr index 548bce7ab3..c9dc918852 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/246b195d9beac8d6.xdr and b/test-lcm-next/InvokeHostFunctionTests/246b195d9beac8d6.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/266b724000b97eb7.xdr b/test-lcm-next/InvokeHostFunctionTests/266b724000b97eb7.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/266b724000b97eb7.xdr and b/test-lcm-next/InvokeHostFunctionTests/266b724000b97eb7.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/26b71e168a5de930.xdr b/test-lcm-next/InvokeHostFunctionTests/26b71e168a5de930.xdr new file mode 100644 index 0000000000..364c280a96 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/26b71e168a5de930.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/2703a3e0e62612e8.xdr b/test-lcm-next/InvokeHostFunctionTests/2703a3e0e62612e8.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/2703a3e0e62612e8.xdr and b/test-lcm-next/InvokeHostFunctionTests/2703a3e0e62612e8.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/27699b1bc4dd968a.xdr b/test-lcm-next/InvokeHostFunctionTests/27699b1bc4dd968a.xdr new file mode 100644 index 0000000000..72cf3e1084 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/27699b1bc4dd968a.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/28480490bc8a3fae.xdr b/test-lcm-next/InvokeHostFunctionTests/28480490bc8a3fae.xdr index 13b22d1b84..b8c262f41e 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/28480490bc8a3fae.xdr and b/test-lcm-next/InvokeHostFunctionTests/28480490bc8a3fae.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/285f5877a54deb4e.xdr b/test-lcm-next/InvokeHostFunctionTests/285f5877a54deb4e.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/285f5877a54deb4e.xdr and b/test-lcm-next/InvokeHostFunctionTests/285f5877a54deb4e.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/28e6a6a32da1fb63.xdr b/test-lcm-next/InvokeHostFunctionTests/28e6a6a32da1fb63.xdr index 50aeb707b7..034831ad9b 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/28e6a6a32da1fb63.xdr and b/test-lcm-next/InvokeHostFunctionTests/28e6a6a32da1fb63.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/293f7ed0e476294c.xdr b/test-lcm-next/InvokeHostFunctionTests/293f7ed0e476294c.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/293f7ed0e476294c.xdr and b/test-lcm-next/InvokeHostFunctionTests/293f7ed0e476294c.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/2951f9e3e0241cc4.xdr b/test-lcm-next/InvokeHostFunctionTests/2951f9e3e0241cc4.xdr index a70cd776a9..30a0e51c17 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/2951f9e3e0241cc4.xdr and b/test-lcm-next/InvokeHostFunctionTests/2951f9e3e0241cc4.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/2963054aff2cd923.xdr b/test-lcm-next/InvokeHostFunctionTests/2963054aff2cd923.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/2963054aff2cd923.xdr and b/test-lcm-next/InvokeHostFunctionTests/2963054aff2cd923.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/2af87dc6245a802c.xdr b/test-lcm-next/InvokeHostFunctionTests/2af87dc6245a802c.xdr index 6aefee8c95..248977568a 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/2af87dc6245a802c.xdr and b/test-lcm-next/InvokeHostFunctionTests/2af87dc6245a802c.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/2b19e70a8b41485f.xdr b/test-lcm-next/InvokeHostFunctionTests/2b19e70a8b41485f.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/2b19e70a8b41485f.xdr and b/test-lcm-next/InvokeHostFunctionTests/2b19e70a8b41485f.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/2bbb41b7df874a0a.xdr b/test-lcm-next/InvokeHostFunctionTests/2bbb41b7df874a0a.xdr new file mode 100644 index 0000000000..6b503807ff Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/2bbb41b7df874a0a.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/2c26a7ba5b931a86.xdr b/test-lcm-next/InvokeHostFunctionTests/2c26a7ba5b931a86.xdr index 200977a964..45f282e03d 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/2c26a7ba5b931a86.xdr and b/test-lcm-next/InvokeHostFunctionTests/2c26a7ba5b931a86.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/2ce02d45eeb17f14.xdr b/test-lcm-next/InvokeHostFunctionTests/2ce02d45eeb17f14.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/2ce02d45eeb17f14.xdr and b/test-lcm-next/InvokeHostFunctionTests/2ce02d45eeb17f14.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/2d96d9114eebd574.xdr b/test-lcm-next/InvokeHostFunctionTests/2d96d9114eebd574.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/2d96d9114eebd574.xdr and b/test-lcm-next/InvokeHostFunctionTests/2d96d9114eebd574.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/2df8d3e47d3c0bbd.xdr b/test-lcm-next/InvokeHostFunctionTests/2df8d3e47d3c0bbd.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/2df8d3e47d3c0bbd.xdr and b/test-lcm-next/InvokeHostFunctionTests/2df8d3e47d3c0bbd.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/2e8a9747bf075ec1.xdr b/test-lcm-next/InvokeHostFunctionTests/2e8a9747bf075ec1.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/2e8a9747bf075ec1.xdr and b/test-lcm-next/InvokeHostFunctionTests/2e8a9747bf075ec1.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/2e93251358cac25c.xdr b/test-lcm-next/InvokeHostFunctionTests/2e93251358cac25c.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/2e93251358cac25c.xdr and b/test-lcm-next/InvokeHostFunctionTests/2e93251358cac25c.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/2ea8bcb3f8d6be16.xdr b/test-lcm-next/InvokeHostFunctionTests/2ea8bcb3f8d6be16.xdr index 7b3a81dce9..92e350564d 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/2ea8bcb3f8d6be16.xdr and b/test-lcm-next/InvokeHostFunctionTests/2ea8bcb3f8d6be16.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/2eb7c4a770d05ab6.xdr b/test-lcm-next/InvokeHostFunctionTests/2eb7c4a770d05ab6.xdr index b12e624a73..a31060badc 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/2eb7c4a770d05ab6.xdr and b/test-lcm-next/InvokeHostFunctionTests/2eb7c4a770d05ab6.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/2f06a14dfcb5cd88.xdr b/test-lcm-next/InvokeHostFunctionTests/2f06a14dfcb5cd88.xdr index f235df58ae..bf5072acae 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/2f06a14dfcb5cd88.xdr and b/test-lcm-next/InvokeHostFunctionTests/2f06a14dfcb5cd88.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/303dce5b05111d4b.xdr b/test-lcm-next/InvokeHostFunctionTests/303dce5b05111d4b.xdr index 5103657dfe..53ca961d71 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/303dce5b05111d4b.xdr and b/test-lcm-next/InvokeHostFunctionTests/303dce5b05111d4b.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/311f3f548207d5d6.xdr b/test-lcm-next/InvokeHostFunctionTests/311f3f548207d5d6.xdr index 14e8213c61..042404a2ac 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/311f3f548207d5d6.xdr and b/test-lcm-next/InvokeHostFunctionTests/311f3f548207d5d6.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/3152146ae3e1601f.xdr b/test-lcm-next/InvokeHostFunctionTests/3152146ae3e1601f.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/3152146ae3e1601f.xdr and b/test-lcm-next/InvokeHostFunctionTests/3152146ae3e1601f.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/3279e450f885436a.xdr b/test-lcm-next/InvokeHostFunctionTests/3279e450f885436a.xdr index 31bda81ba8..09c1977436 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/3279e450f885436a.xdr and b/test-lcm-next/InvokeHostFunctionTests/3279e450f885436a.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/328c8ae9715589c5.xdr b/test-lcm-next/InvokeHostFunctionTests/328c8ae9715589c5.xdr new file mode 100644 index 0000000000..e34944e277 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/328c8ae9715589c5.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/329c8076e0ba5976.xdr b/test-lcm-next/InvokeHostFunctionTests/329c8076e0ba5976.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/329c8076e0ba5976.xdr and b/test-lcm-next/InvokeHostFunctionTests/329c8076e0ba5976.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/32e313f52f20cae1.xdr b/test-lcm-next/InvokeHostFunctionTests/32e313f52f20cae1.xdr index 8f427f2fce..f1924e20b8 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/32e313f52f20cae1.xdr and b/test-lcm-next/InvokeHostFunctionTests/32e313f52f20cae1.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/3304ede4be3e7951.xdr b/test-lcm-next/InvokeHostFunctionTests/3304ede4be3e7951.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/3304ede4be3e7951.xdr and b/test-lcm-next/InvokeHostFunctionTests/3304ede4be3e7951.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/333dd414de3cff58.xdr b/test-lcm-next/InvokeHostFunctionTests/333dd414de3cff58.xdr index 21a69dd27b..be7f0aed91 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/333dd414de3cff58.xdr and b/test-lcm-next/InvokeHostFunctionTests/333dd414de3cff58.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/3344d57a6c44b645.xdr b/test-lcm-next/InvokeHostFunctionTests/3344d57a6c44b645.xdr index 0da7e6b76b..194688b6d3 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/3344d57a6c44b645.xdr and b/test-lcm-next/InvokeHostFunctionTests/3344d57a6c44b645.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/3351d4c3d6daa80b.xdr b/test-lcm-next/InvokeHostFunctionTests/3351d4c3d6daa80b.xdr index 691d65acf8..a96c5efb7f 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/3351d4c3d6daa80b.xdr and b/test-lcm-next/InvokeHostFunctionTests/3351d4c3d6daa80b.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/33541948d53d210f.xdr b/test-lcm-next/InvokeHostFunctionTests/33541948d53d210f.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/33541948d53d210f.xdr and b/test-lcm-next/InvokeHostFunctionTests/33541948d53d210f.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/33a3c48e268855e6.xdr b/test-lcm-next/InvokeHostFunctionTests/33a3c48e268855e6.xdr new file mode 100644 index 0000000000..be0e63317e Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/33a3c48e268855e6.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/33f7502a4490dbc8.xdr b/test-lcm-next/InvokeHostFunctionTests/33f7502a4490dbc8.xdr index 43a00d2484..cf5d4405c8 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/33f7502a4490dbc8.xdr and b/test-lcm-next/InvokeHostFunctionTests/33f7502a4490dbc8.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/343cb2cb92cd8aca.xdr b/test-lcm-next/InvokeHostFunctionTests/343cb2cb92cd8aca.xdr index 12aaa5cf69..d12c8c7c38 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/343cb2cb92cd8aca.xdr and b/test-lcm-next/InvokeHostFunctionTests/343cb2cb92cd8aca.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/34486a4b8221b151.xdr b/test-lcm-next/InvokeHostFunctionTests/34486a4b8221b151.xdr new file mode 100644 index 0000000000..7df1808dd0 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/34486a4b8221b151.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/35117649a10b863c.xdr b/test-lcm-next/InvokeHostFunctionTests/35117649a10b863c.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/35117649a10b863c.xdr and b/test-lcm-next/InvokeHostFunctionTests/35117649a10b863c.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/35b99a95ff36fd47.xdr b/test-lcm-next/InvokeHostFunctionTests/35b99a95ff36fd47.xdr index 130c4213cc..36ebb74c98 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/35b99a95ff36fd47.xdr and b/test-lcm-next/InvokeHostFunctionTests/35b99a95ff36fd47.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/36193429a9fd13f9.xdr b/test-lcm-next/InvokeHostFunctionTests/36193429a9fd13f9.xdr index 52dde59d90..1a938ca171 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/36193429a9fd13f9.xdr and b/test-lcm-next/InvokeHostFunctionTests/36193429a9fd13f9.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/3670ca64370e86e7.xdr b/test-lcm-next/InvokeHostFunctionTests/3670ca64370e86e7.xdr index 65779d6022..3746f79f3d 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/3670ca64370e86e7.xdr and b/test-lcm-next/InvokeHostFunctionTests/3670ca64370e86e7.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/369cf252c2e22d4e.xdr b/test-lcm-next/InvokeHostFunctionTests/369cf252c2e22d4e.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/369cf252c2e22d4e.xdr and b/test-lcm-next/InvokeHostFunctionTests/369cf252c2e22d4e.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/36cdfb826504ca41.xdr b/test-lcm-next/InvokeHostFunctionTests/36cdfb826504ca41.xdr index 5cb5d58662..b4a4ffa500 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/36cdfb826504ca41.xdr and b/test-lcm-next/InvokeHostFunctionTests/36cdfb826504ca41.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/36d1886765b0101c.xdr b/test-lcm-next/InvokeHostFunctionTests/36d1886765b0101c.xdr index e9ec9eab6b..38f4d8d85c 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/36d1886765b0101c.xdr and b/test-lcm-next/InvokeHostFunctionTests/36d1886765b0101c.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/370b65bf45bf359a.xdr b/test-lcm-next/InvokeHostFunctionTests/370b65bf45bf359a.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/370b65bf45bf359a.xdr and b/test-lcm-next/InvokeHostFunctionTests/370b65bf45bf359a.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/372873b046d26a73.xdr b/test-lcm-next/InvokeHostFunctionTests/372873b046d26a73.xdr index 1774292dcf..31fad25f04 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/372873b046d26a73.xdr and b/test-lcm-next/InvokeHostFunctionTests/372873b046d26a73.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/375e418b328316a8.xdr b/test-lcm-next/InvokeHostFunctionTests/375e418b328316a8.xdr index e64d867013..c74f84764c 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/375e418b328316a8.xdr and b/test-lcm-next/InvokeHostFunctionTests/375e418b328316a8.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/37d222a79102d90a.xdr b/test-lcm-next/InvokeHostFunctionTests/37d222a79102d90a.xdr new file mode 100644 index 0000000000..2b5fe57e39 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/37d222a79102d90a.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/38d9c5df4335cbbf.xdr b/test-lcm-next/InvokeHostFunctionTests/38d9c5df4335cbbf.xdr index 8b5b6e152f..b94265781f 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/38d9c5df4335cbbf.xdr and b/test-lcm-next/InvokeHostFunctionTests/38d9c5df4335cbbf.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/394272a31b2f42f9.xdr b/test-lcm-next/InvokeHostFunctionTests/394272a31b2f42f9.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/394272a31b2f42f9.xdr and b/test-lcm-next/InvokeHostFunctionTests/394272a31b2f42f9.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/39d77461e71857ac.xdr b/test-lcm-next/InvokeHostFunctionTests/39d77461e71857ac.xdr new file mode 100644 index 0000000000..72215c9d44 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/39d77461e71857ac.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/3abe7e7946b3a3aa.xdr b/test-lcm-next/InvokeHostFunctionTests/3abe7e7946b3a3aa.xdr index 892e8b402f..fd6c2fdac3 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/3abe7e7946b3a3aa.xdr and b/test-lcm-next/InvokeHostFunctionTests/3abe7e7946b3a3aa.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/3ae3a09a2ac1bace.xdr b/test-lcm-next/InvokeHostFunctionTests/3ae3a09a2ac1bace.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/3ae3a09a2ac1bace.xdr and b/test-lcm-next/InvokeHostFunctionTests/3ae3a09a2ac1bace.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/3aeb08dd6d872f9f.xdr b/test-lcm-next/InvokeHostFunctionTests/3aeb08dd6d872f9f.xdr new file mode 100644 index 0000000000..dcb3ee4861 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/3aeb08dd6d872f9f.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/3b0802ffb3b76400.xdr b/test-lcm-next/InvokeHostFunctionTests/3b0802ffb3b76400.xdr index 1ddbeb226c..4eb9bb3c5b 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/3b0802ffb3b76400.xdr and b/test-lcm-next/InvokeHostFunctionTests/3b0802ffb3b76400.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/3b9daac6049f494f.xdr b/test-lcm-next/InvokeHostFunctionTests/3b9daac6049f494f.xdr new file mode 100644 index 0000000000..7e87360ba7 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/3b9daac6049f494f.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/3c1ebb13484322b9.xdr b/test-lcm-next/InvokeHostFunctionTests/3c1ebb13484322b9.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/3c1ebb13484322b9.xdr and b/test-lcm-next/InvokeHostFunctionTests/3c1ebb13484322b9.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/3c84ec0cd4e29a9e.xdr b/test-lcm-next/InvokeHostFunctionTests/3c84ec0cd4e29a9e.xdr index d745000cd2..f355f2df10 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/3c84ec0cd4e29a9e.xdr and b/test-lcm-next/InvokeHostFunctionTests/3c84ec0cd4e29a9e.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/3db91544d5ae2281.xdr b/test-lcm-next/InvokeHostFunctionTests/3db91544d5ae2281.xdr index 32125eda29..3fb2439866 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/3db91544d5ae2281.xdr and b/test-lcm-next/InvokeHostFunctionTests/3db91544d5ae2281.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/3ebb523abd74e1c1.xdr b/test-lcm-next/InvokeHostFunctionTests/3ebb523abd74e1c1.xdr index 6112339f23..e1d98edf1b 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/3ebb523abd74e1c1.xdr and b/test-lcm-next/InvokeHostFunctionTests/3ebb523abd74e1c1.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/3ed1bb2f1af2ea38.xdr b/test-lcm-next/InvokeHostFunctionTests/3ed1bb2f1af2ea38.xdr index f2ae714c09..ff7e8d0596 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/3ed1bb2f1af2ea38.xdr and b/test-lcm-next/InvokeHostFunctionTests/3ed1bb2f1af2ea38.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/3ef1fb92602e14d5.xdr b/test-lcm-next/InvokeHostFunctionTests/3ef1fb92602e14d5.xdr index 0cae52a552..6fde871108 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/3ef1fb92602e14d5.xdr and b/test-lcm-next/InvokeHostFunctionTests/3ef1fb92602e14d5.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/3f41a40a5611b7d8.xdr b/test-lcm-next/InvokeHostFunctionTests/3f41a40a5611b7d8.xdr index 72d6cb2977..5d1ea64fb3 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/3f41a40a5611b7d8.xdr and b/test-lcm-next/InvokeHostFunctionTests/3f41a40a5611b7d8.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/4049c5bf43d27574.xdr b/test-lcm-next/InvokeHostFunctionTests/4049c5bf43d27574.xdr new file mode 100644 index 0000000000..2a6a590a6b Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/4049c5bf43d27574.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/40cc10c2a3fe22f0.xdr b/test-lcm-next/InvokeHostFunctionTests/40cc10c2a3fe22f0.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/40cc10c2a3fe22f0.xdr and b/test-lcm-next/InvokeHostFunctionTests/40cc10c2a3fe22f0.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/40fc1592b7b8d9a7.xdr b/test-lcm-next/InvokeHostFunctionTests/40fc1592b7b8d9a7.xdr index 097ec98994..4b65835011 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/40fc1592b7b8d9a7.xdr and b/test-lcm-next/InvokeHostFunctionTests/40fc1592b7b8d9a7.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/41a75a802c103130.xdr b/test-lcm-next/InvokeHostFunctionTests/41a75a802c103130.xdr index e9dab9415b..653340f392 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/41a75a802c103130.xdr and b/test-lcm-next/InvokeHostFunctionTests/41a75a802c103130.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/432866f9e4658727.xdr b/test-lcm-next/InvokeHostFunctionTests/432866f9e4658727.xdr index 8d257467f8..97eea00093 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/432866f9e4658727.xdr and b/test-lcm-next/InvokeHostFunctionTests/432866f9e4658727.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/43509a8017a394ec.xdr b/test-lcm-next/InvokeHostFunctionTests/43509a8017a394ec.xdr index cc15b4d3d2..af80fb197c 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/43509a8017a394ec.xdr and b/test-lcm-next/InvokeHostFunctionTests/43509a8017a394ec.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/43aa6585c53544c0.xdr b/test-lcm-next/InvokeHostFunctionTests/43aa6585c53544c0.xdr index 52664ceb6e..4a686f7801 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/43aa6585c53544c0.xdr and b/test-lcm-next/InvokeHostFunctionTests/43aa6585c53544c0.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/43d0750bf32a8142.xdr b/test-lcm-next/InvokeHostFunctionTests/43d0750bf32a8142.xdr index ea4563664d..97ac9048ac 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/43d0750bf32a8142.xdr and b/test-lcm-next/InvokeHostFunctionTests/43d0750bf32a8142.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/4403f2717365f3f1.xdr b/test-lcm-next/InvokeHostFunctionTests/4403f2717365f3f1.xdr index 978780413d..ac79a1c4e1 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/4403f2717365f3f1.xdr and b/test-lcm-next/InvokeHostFunctionTests/4403f2717365f3f1.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/44132eb86a0334be.xdr b/test-lcm-next/InvokeHostFunctionTests/44132eb86a0334be.xdr new file mode 100644 index 0000000000..b01951885d Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/44132eb86a0334be.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/4445d44170e0cfe1.xdr b/test-lcm-next/InvokeHostFunctionTests/4445d44170e0cfe1.xdr new file mode 100644 index 0000000000..fc5da8cfee Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/4445d44170e0cfe1.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/444e7910e5721658.xdr b/test-lcm-next/InvokeHostFunctionTests/444e7910e5721658.xdr index 65a134b0cb..f0ca6035d7 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/444e7910e5721658.xdr and b/test-lcm-next/InvokeHostFunctionTests/444e7910e5721658.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/44ed42af0c335da0.xdr b/test-lcm-next/InvokeHostFunctionTests/44ed42af0c335da0.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/44ed42af0c335da0.xdr and b/test-lcm-next/InvokeHostFunctionTests/44ed42af0c335da0.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/4512adf732987d33.xdr b/test-lcm-next/InvokeHostFunctionTests/4512adf732987d33.xdr new file mode 100644 index 0000000000..a011d955b1 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/4512adf732987d33.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/45bb7c67fa144f76.xdr b/test-lcm-next/InvokeHostFunctionTests/45bb7c67fa144f76.xdr index 2bd9c5eeae..b86a1b9028 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/45bb7c67fa144f76.xdr and b/test-lcm-next/InvokeHostFunctionTests/45bb7c67fa144f76.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/45fafb2b89af5af9.xdr b/test-lcm-next/InvokeHostFunctionTests/45fafb2b89af5af9.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/45fafb2b89af5af9.xdr and b/test-lcm-next/InvokeHostFunctionTests/45fafb2b89af5af9.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/463cc045e4e770ef.xdr b/test-lcm-next/InvokeHostFunctionTests/463cc045e4e770ef.xdr index d0e14fbdd5..599e14c6df 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/463cc045e4e770ef.xdr and b/test-lcm-next/InvokeHostFunctionTests/463cc045e4e770ef.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/46841d2f33918f97.xdr b/test-lcm-next/InvokeHostFunctionTests/46841d2f33918f97.xdr index 714659f390..a2cb80146f 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/46841d2f33918f97.xdr and b/test-lcm-next/InvokeHostFunctionTests/46841d2f33918f97.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/46bb33ad49f0924d.xdr b/test-lcm-next/InvokeHostFunctionTests/46bb33ad49f0924d.xdr index fce94f1b93..8b0469b8d5 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/46bb33ad49f0924d.xdr and b/test-lcm-next/InvokeHostFunctionTests/46bb33ad49f0924d.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/46bc30f464b80820.xdr b/test-lcm-next/InvokeHostFunctionTests/46bc30f464b80820.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/46bc30f464b80820.xdr and b/test-lcm-next/InvokeHostFunctionTests/46bc30f464b80820.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/471f63ec9db5a9dd.xdr b/test-lcm-next/InvokeHostFunctionTests/471f63ec9db5a9dd.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/471f63ec9db5a9dd.xdr and b/test-lcm-next/InvokeHostFunctionTests/471f63ec9db5a9dd.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/472ac360b2cee870.xdr b/test-lcm-next/InvokeHostFunctionTests/472ac360b2cee870.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/472ac360b2cee870.xdr and b/test-lcm-next/InvokeHostFunctionTests/472ac360b2cee870.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/47efc2a10557bd97.xdr b/test-lcm-next/InvokeHostFunctionTests/47efc2a10557bd97.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/47efc2a10557bd97.xdr and b/test-lcm-next/InvokeHostFunctionTests/47efc2a10557bd97.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/47fee2a3bc870ecc.xdr b/test-lcm-next/InvokeHostFunctionTests/47fee2a3bc870ecc.xdr index af101b3272..7b533f6594 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/47fee2a3bc870ecc.xdr and b/test-lcm-next/InvokeHostFunctionTests/47fee2a3bc870ecc.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/485a9f1997660b04.xdr b/test-lcm-next/InvokeHostFunctionTests/485a9f1997660b04.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/485a9f1997660b04.xdr and b/test-lcm-next/InvokeHostFunctionTests/485a9f1997660b04.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/4876c2f30088ca20.xdr b/test-lcm-next/InvokeHostFunctionTests/4876c2f30088ca20.xdr index 6600672436..6eb85f708d 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/4876c2f30088ca20.xdr and b/test-lcm-next/InvokeHostFunctionTests/4876c2f30088ca20.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/49689aae806682f8.xdr b/test-lcm-next/InvokeHostFunctionTests/49689aae806682f8.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/49689aae806682f8.xdr and b/test-lcm-next/InvokeHostFunctionTests/49689aae806682f8.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/49f65f2d365f1cf2.xdr b/test-lcm-next/InvokeHostFunctionTests/49f65f2d365f1cf2.xdr index 4d759d2319..0ae00f92ad 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/49f65f2d365f1cf2.xdr and b/test-lcm-next/InvokeHostFunctionTests/49f65f2d365f1cf2.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/4a1932cf528ee7ca.xdr b/test-lcm-next/InvokeHostFunctionTests/4a1932cf528ee7ca.xdr index 683b0852fb..3e28a14e63 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/4a1932cf528ee7ca.xdr and b/test-lcm-next/InvokeHostFunctionTests/4a1932cf528ee7ca.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/4a8c58a85988d163.xdr b/test-lcm-next/InvokeHostFunctionTests/4a8c58a85988d163.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/4a8c58a85988d163.xdr and b/test-lcm-next/InvokeHostFunctionTests/4a8c58a85988d163.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/4aa2d8d102f584a4.xdr b/test-lcm-next/InvokeHostFunctionTests/4aa2d8d102f584a4.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/4aa2d8d102f584a4.xdr and b/test-lcm-next/InvokeHostFunctionTests/4aa2d8d102f584a4.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/4ae7dbea4b507a75.xdr b/test-lcm-next/InvokeHostFunctionTests/4ae7dbea4b507a75.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/4ae7dbea4b507a75.xdr and b/test-lcm-next/InvokeHostFunctionTests/4ae7dbea4b507a75.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/4af293dc53825cbe.xdr b/test-lcm-next/InvokeHostFunctionTests/4af293dc53825cbe.xdr new file mode 100644 index 0000000000..f344930a09 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/4af293dc53825cbe.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/4b4fde93869500d3.xdr b/test-lcm-next/InvokeHostFunctionTests/4b4fde93869500d3.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/4b4fde93869500d3.xdr and b/test-lcm-next/InvokeHostFunctionTests/4b4fde93869500d3.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/4b7e19f44373ff48.xdr b/test-lcm-next/InvokeHostFunctionTests/4b7e19f44373ff48.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/4b7e19f44373ff48.xdr and b/test-lcm-next/InvokeHostFunctionTests/4b7e19f44373ff48.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/4bc0adc4bfd824ae.xdr b/test-lcm-next/InvokeHostFunctionTests/4bc0adc4bfd824ae.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/4bc0adc4bfd824ae.xdr and b/test-lcm-next/InvokeHostFunctionTests/4bc0adc4bfd824ae.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/4c29f760282cb30d.xdr b/test-lcm-next/InvokeHostFunctionTests/4c29f760282cb30d.xdr new file mode 100644 index 0000000000..2b4ae399e6 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/4c29f760282cb30d.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/4c5cc01aded482f8.xdr b/test-lcm-next/InvokeHostFunctionTests/4c5cc01aded482f8.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/4c5cc01aded482f8.xdr and b/test-lcm-next/InvokeHostFunctionTests/4c5cc01aded482f8.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/4cd30f7ebe173060.xdr b/test-lcm-next/InvokeHostFunctionTests/4cd30f7ebe173060.xdr index e3b849f28e..7db320bdeb 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/4cd30f7ebe173060.xdr and b/test-lcm-next/InvokeHostFunctionTests/4cd30f7ebe173060.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/4db1a66114f8b194.xdr b/test-lcm-next/InvokeHostFunctionTests/4db1a66114f8b194.xdr index 377b3981c8..790c8384ef 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/4db1a66114f8b194.xdr and b/test-lcm-next/InvokeHostFunctionTests/4db1a66114f8b194.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/4eaeadc112025f27.xdr b/test-lcm-next/InvokeHostFunctionTests/4eaeadc112025f27.xdr index 821e00f3cc..17939dc331 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/4eaeadc112025f27.xdr and b/test-lcm-next/InvokeHostFunctionTests/4eaeadc112025f27.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/4ee0f3b0ffb1a967.xdr b/test-lcm-next/InvokeHostFunctionTests/4ee0f3b0ffb1a967.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/4ee0f3b0ffb1a967.xdr and b/test-lcm-next/InvokeHostFunctionTests/4ee0f3b0ffb1a967.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/4ff86e8ec6d8f89c.xdr b/test-lcm-next/InvokeHostFunctionTests/4ff86e8ec6d8f89c.xdr index dfbb620b93..027c322616 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/4ff86e8ec6d8f89c.xdr and b/test-lcm-next/InvokeHostFunctionTests/4ff86e8ec6d8f89c.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/51607121e005fb7f.xdr b/test-lcm-next/InvokeHostFunctionTests/51607121e005fb7f.xdr new file mode 100644 index 0000000000..a99e1f8474 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/51607121e005fb7f.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/51616f70e97b17d5.xdr b/test-lcm-next/InvokeHostFunctionTests/51616f70e97b17d5.xdr index 7674594840..52605f1476 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/51616f70e97b17d5.xdr and b/test-lcm-next/InvokeHostFunctionTests/51616f70e97b17d5.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/5171bdbde7eb7562.xdr b/test-lcm-next/InvokeHostFunctionTests/5171bdbde7eb7562.xdr index 76869f6269..241d266168 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/5171bdbde7eb7562.xdr and b/test-lcm-next/InvokeHostFunctionTests/5171bdbde7eb7562.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/519ee0e221d13e7a.xdr b/test-lcm-next/InvokeHostFunctionTests/519ee0e221d13e7a.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/519ee0e221d13e7a.xdr and b/test-lcm-next/InvokeHostFunctionTests/519ee0e221d13e7a.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/51e36c475d33d2bb.xdr b/test-lcm-next/InvokeHostFunctionTests/51e36c475d33d2bb.xdr index 9c859ec77d..ba1fdfbd75 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/51e36c475d33d2bb.xdr and b/test-lcm-next/InvokeHostFunctionTests/51e36c475d33d2bb.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/51f0bd683d0d5829.xdr b/test-lcm-next/InvokeHostFunctionTests/51f0bd683d0d5829.xdr index 36343cf072..e2ce6c3809 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/51f0bd683d0d5829.xdr and b/test-lcm-next/InvokeHostFunctionTests/51f0bd683d0d5829.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/52c707bc77bf01f6.xdr b/test-lcm-next/InvokeHostFunctionTests/52c707bc77bf01f6.xdr index 72623a81be..9bf769848f 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/52c707bc77bf01f6.xdr and b/test-lcm-next/InvokeHostFunctionTests/52c707bc77bf01f6.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/536297cefb569ed7.xdr b/test-lcm-next/InvokeHostFunctionTests/536297cefb569ed7.xdr index 9e5710f85a..83da4841fb 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/536297cefb569ed7.xdr and b/test-lcm-next/InvokeHostFunctionTests/536297cefb569ed7.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/53b461e8db0fddd1.xdr b/test-lcm-next/InvokeHostFunctionTests/53b461e8db0fddd1.xdr index a3fd2339f5..b1d6aae6d0 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/53b461e8db0fddd1.xdr and b/test-lcm-next/InvokeHostFunctionTests/53b461e8db0fddd1.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/540eac72b8688d25.xdr b/test-lcm-next/InvokeHostFunctionTests/540eac72b8688d25.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/540eac72b8688d25.xdr and b/test-lcm-next/InvokeHostFunctionTests/540eac72b8688d25.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/546a3cc311788248.xdr b/test-lcm-next/InvokeHostFunctionTests/546a3cc311788248.xdr index 16b4a3f6bb..7259d45097 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/546a3cc311788248.xdr and b/test-lcm-next/InvokeHostFunctionTests/546a3cc311788248.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/54f8492f87d26b35.xdr b/test-lcm-next/InvokeHostFunctionTests/54f8492f87d26b35.xdr index 64f0148099..15ae7aab50 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/54f8492f87d26b35.xdr and b/test-lcm-next/InvokeHostFunctionTests/54f8492f87d26b35.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/5675aede8324645c.xdr b/test-lcm-next/InvokeHostFunctionTests/5675aede8324645c.xdr new file mode 100644 index 0000000000..646a678971 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/5675aede8324645c.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/569840c5704c5e44.xdr b/test-lcm-next/InvokeHostFunctionTests/569840c5704c5e44.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/569840c5704c5e44.xdr and b/test-lcm-next/InvokeHostFunctionTests/569840c5704c5e44.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/57207be4a3e12536.xdr b/test-lcm-next/InvokeHostFunctionTests/57207be4a3e12536.xdr index 0302a09421..219b5809cf 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/57207be4a3e12536.xdr and b/test-lcm-next/InvokeHostFunctionTests/57207be4a3e12536.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/57659d96c64bd183.xdr b/test-lcm-next/InvokeHostFunctionTests/57659d96c64bd183.xdr index e7a544653f..9a4bd48fed 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/57659d96c64bd183.xdr and b/test-lcm-next/InvokeHostFunctionTests/57659d96c64bd183.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/5770d78319f7e869.xdr b/test-lcm-next/InvokeHostFunctionTests/5770d78319f7e869.xdr index cc4d9be6cc..7b84a33624 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/5770d78319f7e869.xdr and b/test-lcm-next/InvokeHostFunctionTests/5770d78319f7e869.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/57a428f77fd05af1.xdr b/test-lcm-next/InvokeHostFunctionTests/57a428f77fd05af1.xdr new file mode 100644 index 0000000000..e11aa88ff6 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/57a428f77fd05af1.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/585310a1b2f3c9e1.xdr b/test-lcm-next/InvokeHostFunctionTests/585310a1b2f3c9e1.xdr index df3f09a07a..9232d46e9f 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/585310a1b2f3c9e1.xdr and b/test-lcm-next/InvokeHostFunctionTests/585310a1b2f3c9e1.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/588e655d03094c0e.xdr b/test-lcm-next/InvokeHostFunctionTests/588e655d03094c0e.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/588e655d03094c0e.xdr and b/test-lcm-next/InvokeHostFunctionTests/588e655d03094c0e.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/58d33db7d651fcd6.xdr b/test-lcm-next/InvokeHostFunctionTests/58d33db7d651fcd6.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/58d33db7d651fcd6.xdr and b/test-lcm-next/InvokeHostFunctionTests/58d33db7d651fcd6.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/591b0f65f2643876.xdr b/test-lcm-next/InvokeHostFunctionTests/591b0f65f2643876.xdr new file mode 100644 index 0000000000..7d9c5cab09 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/591b0f65f2643876.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/593eaf7fb01d7232.xdr b/test-lcm-next/InvokeHostFunctionTests/593eaf7fb01d7232.xdr new file mode 100644 index 0000000000..31fad25f04 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/593eaf7fb01d7232.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/594d4af3fbb90e26.xdr b/test-lcm-next/InvokeHostFunctionTests/594d4af3fbb90e26.xdr index 50716e0da8..479e7482bb 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/594d4af3fbb90e26.xdr and b/test-lcm-next/InvokeHostFunctionTests/594d4af3fbb90e26.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/598b33597b504a5f.xdr b/test-lcm-next/InvokeHostFunctionTests/598b33597b504a5f.xdr index f0cc89be92..0aeb73c0cd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/598b33597b504a5f.xdr and b/test-lcm-next/InvokeHostFunctionTests/598b33597b504a5f.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/59a15bc254310ed9.xdr b/test-lcm-next/InvokeHostFunctionTests/59a15bc254310ed9.xdr index d041788108..4c7c323381 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/59a15bc254310ed9.xdr and b/test-lcm-next/InvokeHostFunctionTests/59a15bc254310ed9.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/59a168278f646f8f.xdr b/test-lcm-next/InvokeHostFunctionTests/59a168278f646f8f.xdr index 7e8f7bd9bb..c29c25c172 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/59a168278f646f8f.xdr and b/test-lcm-next/InvokeHostFunctionTests/59a168278f646f8f.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/5b5419e7ec6c21c3.xdr b/test-lcm-next/InvokeHostFunctionTests/5b5419e7ec6c21c3.xdr index f97bbed0a8..e8e463a9d7 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/5b5419e7ec6c21c3.xdr and b/test-lcm-next/InvokeHostFunctionTests/5b5419e7ec6c21c3.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/5cbc615625d83996.xdr b/test-lcm-next/InvokeHostFunctionTests/5cbc615625d83996.xdr new file mode 100644 index 0000000000..8070f4c0d0 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/5cbc615625d83996.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/5e8558b4e95d77a3.xdr b/test-lcm-next/InvokeHostFunctionTests/5e8558b4e95d77a3.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/5e8558b4e95d77a3.xdr and b/test-lcm-next/InvokeHostFunctionTests/5e8558b4e95d77a3.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/5f3872f905c5baf1.xdr b/test-lcm-next/InvokeHostFunctionTests/5f3872f905c5baf1.xdr new file mode 100644 index 0000000000..ae945142b5 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/5f3872f905c5baf1.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/5f7972a6994dafe2.xdr b/test-lcm-next/InvokeHostFunctionTests/5f7972a6994dafe2.xdr new file mode 100644 index 0000000000..005d7db079 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/5f7972a6994dafe2.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/5f7b6356a31b9872.xdr b/test-lcm-next/InvokeHostFunctionTests/5f7b6356a31b9872.xdr index dd5cd29bb5..cda09b16da 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/5f7b6356a31b9872.xdr and b/test-lcm-next/InvokeHostFunctionTests/5f7b6356a31b9872.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/5f8754383c35d1be.xdr b/test-lcm-next/InvokeHostFunctionTests/5f8754383c35d1be.xdr new file mode 100644 index 0000000000..c1253b1492 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/5f8754383c35d1be.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/5fcfab73812561f2.xdr b/test-lcm-next/InvokeHostFunctionTests/5fcfab73812561f2.xdr new file mode 100644 index 0000000000..c79a7909fc Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/5fcfab73812561f2.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/6031e1f0663cfda5.xdr b/test-lcm-next/InvokeHostFunctionTests/6031e1f0663cfda5.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/6031e1f0663cfda5.xdr and b/test-lcm-next/InvokeHostFunctionTests/6031e1f0663cfda5.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/604c6265d13fc31a.xdr b/test-lcm-next/InvokeHostFunctionTests/604c6265d13fc31a.xdr new file mode 100644 index 0000000000..780479103f Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/604c6265d13fc31a.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/6054872800de82ad.xdr b/test-lcm-next/InvokeHostFunctionTests/6054872800de82ad.xdr new file mode 100644 index 0000000000..62b214f6b6 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/6054872800de82ad.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/608765b88758cdff.xdr b/test-lcm-next/InvokeHostFunctionTests/608765b88758cdff.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/608765b88758cdff.xdr and b/test-lcm-next/InvokeHostFunctionTests/608765b88758cdff.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/60d32d465e9ef646.xdr b/test-lcm-next/InvokeHostFunctionTests/60d32d465e9ef646.xdr index a9c79d1bcc..a3016afc5c 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/60d32d465e9ef646.xdr and b/test-lcm-next/InvokeHostFunctionTests/60d32d465e9ef646.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/6172930301eec1db.xdr b/test-lcm-next/InvokeHostFunctionTests/6172930301eec1db.xdr index 1398c9542c..876dc46838 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/6172930301eec1db.xdr and b/test-lcm-next/InvokeHostFunctionTests/6172930301eec1db.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/617ce679889b737e.xdr b/test-lcm-next/InvokeHostFunctionTests/617ce679889b737e.xdr new file mode 100644 index 0000000000..7cc2daefca Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/617ce679889b737e.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/61aaf65d2d2be2df.xdr b/test-lcm-next/InvokeHostFunctionTests/61aaf65d2d2be2df.xdr index 863e3abf52..53b92b4d72 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/61aaf65d2d2be2df.xdr and b/test-lcm-next/InvokeHostFunctionTests/61aaf65d2d2be2df.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/61f1ec50d0457920.xdr b/test-lcm-next/InvokeHostFunctionTests/61f1ec50d0457920.xdr index 80325f599b..2ee3a25892 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/61f1ec50d0457920.xdr and b/test-lcm-next/InvokeHostFunctionTests/61f1ec50d0457920.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/62ae728143dd1ae3.xdr b/test-lcm-next/InvokeHostFunctionTests/62ae728143dd1ae3.xdr index 3c5275fd17..d42e800c6f 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/62ae728143dd1ae3.xdr and b/test-lcm-next/InvokeHostFunctionTests/62ae728143dd1ae3.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/630112e28640b3dc.xdr b/test-lcm-next/InvokeHostFunctionTests/630112e28640b3dc.xdr index 728e608a7e..1fbd398fbd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/630112e28640b3dc.xdr and b/test-lcm-next/InvokeHostFunctionTests/630112e28640b3dc.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/633ede77405d5244.xdr b/test-lcm-next/InvokeHostFunctionTests/633ede77405d5244.xdr index 6a4f19cca4..82f030a4df 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/633ede77405d5244.xdr and b/test-lcm-next/InvokeHostFunctionTests/633ede77405d5244.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/63bf3b0d817b48a3.xdr b/test-lcm-next/InvokeHostFunctionTests/63bf3b0d817b48a3.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/63bf3b0d817b48a3.xdr and b/test-lcm-next/InvokeHostFunctionTests/63bf3b0d817b48a3.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/6445b19d68f45e62.xdr b/test-lcm-next/InvokeHostFunctionTests/6445b19d68f45e62.xdr index c490d14d6e..4349ee5260 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/6445b19d68f45e62.xdr and b/test-lcm-next/InvokeHostFunctionTests/6445b19d68f45e62.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/647908425725f18e.xdr b/test-lcm-next/InvokeHostFunctionTests/647908425725f18e.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/647908425725f18e.xdr and b/test-lcm-next/InvokeHostFunctionTests/647908425725f18e.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/64c67c03ad8477ca.xdr b/test-lcm-next/InvokeHostFunctionTests/64c67c03ad8477ca.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/64c67c03ad8477ca.xdr and b/test-lcm-next/InvokeHostFunctionTests/64c67c03ad8477ca.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/64def0179fc4dbe6.xdr b/test-lcm-next/InvokeHostFunctionTests/64def0179fc4dbe6.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/64def0179fc4dbe6.xdr and b/test-lcm-next/InvokeHostFunctionTests/64def0179fc4dbe6.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/6519e434acf354b7.xdr b/test-lcm-next/InvokeHostFunctionTests/6519e434acf354b7.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/6519e434acf354b7.xdr and b/test-lcm-next/InvokeHostFunctionTests/6519e434acf354b7.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/659ac68c6d773240.xdr b/test-lcm-next/InvokeHostFunctionTests/659ac68c6d773240.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/659ac68c6d773240.xdr and b/test-lcm-next/InvokeHostFunctionTests/659ac68c6d773240.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/65d4ab7a4ee03638.xdr b/test-lcm-next/InvokeHostFunctionTests/65d4ab7a4ee03638.xdr index 5c8988f885..fa5bb0b2b7 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/65d4ab7a4ee03638.xdr and b/test-lcm-next/InvokeHostFunctionTests/65d4ab7a4ee03638.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/660ffaf163aa3a0d.xdr b/test-lcm-next/InvokeHostFunctionTests/660ffaf163aa3a0d.xdr index 4d1bb154b8..e336752937 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/660ffaf163aa3a0d.xdr and b/test-lcm-next/InvokeHostFunctionTests/660ffaf163aa3a0d.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/666cc90ebbdab3dd.xdr b/test-lcm-next/InvokeHostFunctionTests/666cc90ebbdab3dd.xdr index 065f42275b..0f25ea82f9 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/666cc90ebbdab3dd.xdr and b/test-lcm-next/InvokeHostFunctionTests/666cc90ebbdab3dd.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/66755facd883bef4.xdr b/test-lcm-next/InvokeHostFunctionTests/66755facd883bef4.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/66755facd883bef4.xdr and b/test-lcm-next/InvokeHostFunctionTests/66755facd883bef4.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/6716ff61cd9b5a3f.xdr b/test-lcm-next/InvokeHostFunctionTests/6716ff61cd9b5a3f.xdr index 5b63ca4390..be1e5dda53 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/6716ff61cd9b5a3f.xdr and b/test-lcm-next/InvokeHostFunctionTests/6716ff61cd9b5a3f.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/675cca94471892a1.xdr b/test-lcm-next/InvokeHostFunctionTests/675cca94471892a1.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/675cca94471892a1.xdr and b/test-lcm-next/InvokeHostFunctionTests/675cca94471892a1.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/678620649d7edfe9.xdr b/test-lcm-next/InvokeHostFunctionTests/678620649d7edfe9.xdr index bc47f1b22f..99bc7dbb7c 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/678620649d7edfe9.xdr and b/test-lcm-next/InvokeHostFunctionTests/678620649d7edfe9.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/67c57dc9f673aa9e.xdr b/test-lcm-next/InvokeHostFunctionTests/67c57dc9f673aa9e.xdr index 01c503199b..c22937ac8d 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/67c57dc9f673aa9e.xdr and b/test-lcm-next/InvokeHostFunctionTests/67c57dc9f673aa9e.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/68392e6abed97fb5.xdr b/test-lcm-next/InvokeHostFunctionTests/68392e6abed97fb5.xdr index 2e5ac898a1..ec88c83710 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/68392e6abed97fb5.xdr and b/test-lcm-next/InvokeHostFunctionTests/68392e6abed97fb5.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/6856b0b044010cae.xdr b/test-lcm-next/InvokeHostFunctionTests/6856b0b044010cae.xdr index e222868683..30e3769e96 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/6856b0b044010cae.xdr and b/test-lcm-next/InvokeHostFunctionTests/6856b0b044010cae.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/68f165975379ef6f.xdr b/test-lcm-next/InvokeHostFunctionTests/68f165975379ef6f.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/68f165975379ef6f.xdr and b/test-lcm-next/InvokeHostFunctionTests/68f165975379ef6f.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/69051a1b441d9996.xdr b/test-lcm-next/InvokeHostFunctionTests/69051a1b441d9996.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/69051a1b441d9996.xdr and b/test-lcm-next/InvokeHostFunctionTests/69051a1b441d9996.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/69abe494995566fb.xdr b/test-lcm-next/InvokeHostFunctionTests/69abe494995566fb.xdr index 01fbab6def..58b566dd43 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/69abe494995566fb.xdr and b/test-lcm-next/InvokeHostFunctionTests/69abe494995566fb.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/69d72740ac448701.xdr b/test-lcm-next/InvokeHostFunctionTests/69d72740ac448701.xdr index cb0b32dd9f..5236f82dd6 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/69d72740ac448701.xdr and b/test-lcm-next/InvokeHostFunctionTests/69d72740ac448701.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/6a0fcad7207a7356.xdr b/test-lcm-next/InvokeHostFunctionTests/6a0fcad7207a7356.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/6a0fcad7207a7356.xdr and b/test-lcm-next/InvokeHostFunctionTests/6a0fcad7207a7356.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/6b1bba1cde19195d.xdr b/test-lcm-next/InvokeHostFunctionTests/6b1bba1cde19195d.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/6b1bba1cde19195d.xdr and b/test-lcm-next/InvokeHostFunctionTests/6b1bba1cde19195d.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/6b7ea8905416d282.xdr b/test-lcm-next/InvokeHostFunctionTests/6b7ea8905416d282.xdr index 9f94093ffa..46df7499b3 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/6b7ea8905416d282.xdr and b/test-lcm-next/InvokeHostFunctionTests/6b7ea8905416d282.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/6be1723f2de82c90.xdr b/test-lcm-next/InvokeHostFunctionTests/6be1723f2de82c90.xdr index 2089428daa..9b75d71d17 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/6be1723f2de82c90.xdr and b/test-lcm-next/InvokeHostFunctionTests/6be1723f2de82c90.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/6c7ee12d6e1882df.xdr b/test-lcm-next/InvokeHostFunctionTests/6c7ee12d6e1882df.xdr index 77e0c641f9..61b94cdd7c 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/6c7ee12d6e1882df.xdr and b/test-lcm-next/InvokeHostFunctionTests/6c7ee12d6e1882df.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/6de1fadf0f1a6789.xdr b/test-lcm-next/InvokeHostFunctionTests/6de1fadf0f1a6789.xdr index 84500ec948..1432262568 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/6de1fadf0f1a6789.xdr and b/test-lcm-next/InvokeHostFunctionTests/6de1fadf0f1a6789.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/6dfc8f8d0c1f4d61.xdr b/test-lcm-next/InvokeHostFunctionTests/6dfc8f8d0c1f4d61.xdr new file mode 100644 index 0000000000..c118e6e884 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/6dfc8f8d0c1f4d61.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/6e020886d77520ee.xdr b/test-lcm-next/InvokeHostFunctionTests/6e020886d77520ee.xdr index 443cd1d56f..fb1798d36c 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/6e020886d77520ee.xdr and b/test-lcm-next/InvokeHostFunctionTests/6e020886d77520ee.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/6e0258e8cfa3ab47.xdr b/test-lcm-next/InvokeHostFunctionTests/6e0258e8cfa3ab47.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/6e0258e8cfa3ab47.xdr and b/test-lcm-next/InvokeHostFunctionTests/6e0258e8cfa3ab47.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/6e1d5421cf61b82d.xdr b/test-lcm-next/InvokeHostFunctionTests/6e1d5421cf61b82d.xdr index 28a9b97e67..4c0b5ce063 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/6e1d5421cf61b82d.xdr and b/test-lcm-next/InvokeHostFunctionTests/6e1d5421cf61b82d.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/6e6a0dee9b273c6f.xdr b/test-lcm-next/InvokeHostFunctionTests/6e6a0dee9b273c6f.xdr new file mode 100644 index 0000000000..6517ce3eca Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/6e6a0dee9b273c6f.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/6f27e3a9c63fca5b.xdr b/test-lcm-next/InvokeHostFunctionTests/6f27e3a9c63fca5b.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/6f27e3a9c63fca5b.xdr and b/test-lcm-next/InvokeHostFunctionTests/6f27e3a9c63fca5b.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/6f3467c6e13a1648.xdr b/test-lcm-next/InvokeHostFunctionTests/6f3467c6e13a1648.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/6f3467c6e13a1648.xdr and b/test-lcm-next/InvokeHostFunctionTests/6f3467c6e13a1648.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/6ffafbc029e47549.xdr b/test-lcm-next/InvokeHostFunctionTests/6ffafbc029e47549.xdr index 52f4f03a68..b2bc7a9bb2 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/6ffafbc029e47549.xdr and b/test-lcm-next/InvokeHostFunctionTests/6ffafbc029e47549.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/701983d81c015a60.xdr b/test-lcm-next/InvokeHostFunctionTests/701983d81c015a60.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/701983d81c015a60.xdr and b/test-lcm-next/InvokeHostFunctionTests/701983d81c015a60.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/70b7679c1de24a4b.xdr b/test-lcm-next/InvokeHostFunctionTests/70b7679c1de24a4b.xdr index 8c30210ce0..8ea83aeb4f 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/70b7679c1de24a4b.xdr and b/test-lcm-next/InvokeHostFunctionTests/70b7679c1de24a4b.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/714af0a63932eb6b.xdr b/test-lcm-next/InvokeHostFunctionTests/714af0a63932eb6b.xdr index 7ff20e8ee1..c4c9c7ca59 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/714af0a63932eb6b.xdr and b/test-lcm-next/InvokeHostFunctionTests/714af0a63932eb6b.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/71db73c744a926be.xdr b/test-lcm-next/InvokeHostFunctionTests/71db73c744a926be.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/71db73c744a926be.xdr and b/test-lcm-next/InvokeHostFunctionTests/71db73c744a926be.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/725278041cf421e0.xdr b/test-lcm-next/InvokeHostFunctionTests/725278041cf421e0.xdr index d8c2a6c04a..241ceed998 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/725278041cf421e0.xdr and b/test-lcm-next/InvokeHostFunctionTests/725278041cf421e0.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/729f8af24dc7fbd8.xdr b/test-lcm-next/InvokeHostFunctionTests/729f8af24dc7fbd8.xdr index f992f13d4d..a5dc487504 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/729f8af24dc7fbd8.xdr and b/test-lcm-next/InvokeHostFunctionTests/729f8af24dc7fbd8.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/73d97239afd1a289.xdr b/test-lcm-next/InvokeHostFunctionTests/73d97239afd1a289.xdr index d2b33047d6..1a7a167edd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/73d97239afd1a289.xdr and b/test-lcm-next/InvokeHostFunctionTests/73d97239afd1a289.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/7476d7d3f060cf1d.xdr b/test-lcm-next/InvokeHostFunctionTests/7476d7d3f060cf1d.xdr index 0aa15b0830..7538238fd5 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/7476d7d3f060cf1d.xdr and b/test-lcm-next/InvokeHostFunctionTests/7476d7d3f060cf1d.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/749d86ef2b83de64.xdr b/test-lcm-next/InvokeHostFunctionTests/749d86ef2b83de64.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/749d86ef2b83de64.xdr and b/test-lcm-next/InvokeHostFunctionTests/749d86ef2b83de64.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/74cb309604b87ad5.xdr b/test-lcm-next/InvokeHostFunctionTests/74cb309604b87ad5.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/74cb309604b87ad5.xdr and b/test-lcm-next/InvokeHostFunctionTests/74cb309604b87ad5.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/7560b4ebec62de03.xdr b/test-lcm-next/InvokeHostFunctionTests/7560b4ebec62de03.xdr index a4c3b9131e..4989b2c04b 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/7560b4ebec62de03.xdr and b/test-lcm-next/InvokeHostFunctionTests/7560b4ebec62de03.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/75a857ffd876a72d.xdr b/test-lcm-next/InvokeHostFunctionTests/75a857ffd876a72d.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/75a857ffd876a72d.xdr and b/test-lcm-next/InvokeHostFunctionTests/75a857ffd876a72d.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/7623428964713c55.xdr b/test-lcm-next/InvokeHostFunctionTests/7623428964713c55.xdr index 0eca90b2d1..e162ff264b 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/7623428964713c55.xdr and b/test-lcm-next/InvokeHostFunctionTests/7623428964713c55.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/7624c43e428ee32d.xdr b/test-lcm-next/InvokeHostFunctionTests/7624c43e428ee32d.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/7624c43e428ee32d.xdr and b/test-lcm-next/InvokeHostFunctionTests/7624c43e428ee32d.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/763b53bb30a2499d.xdr b/test-lcm-next/InvokeHostFunctionTests/763b53bb30a2499d.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/763b53bb30a2499d.xdr and b/test-lcm-next/InvokeHostFunctionTests/763b53bb30a2499d.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/764084a2f48fbd19.xdr b/test-lcm-next/InvokeHostFunctionTests/764084a2f48fbd19.xdr new file mode 100644 index 0000000000..d0e97b845f Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/764084a2f48fbd19.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/7738c2df0c244d0d.xdr b/test-lcm-next/InvokeHostFunctionTests/7738c2df0c244d0d.xdr new file mode 100644 index 0000000000..88c2407b7e Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/7738c2df0c244d0d.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/77649b5f4eec4b72.xdr b/test-lcm-next/InvokeHostFunctionTests/77649b5f4eec4b72.xdr new file mode 100644 index 0000000000..53f7291bd2 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/77649b5f4eec4b72.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/77904c0e7819a7eb.xdr b/test-lcm-next/InvokeHostFunctionTests/77904c0e7819a7eb.xdr index 2f868890ab..078955242f 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/77904c0e7819a7eb.xdr and b/test-lcm-next/InvokeHostFunctionTests/77904c0e7819a7eb.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/77b0f96ee78d5679.xdr b/test-lcm-next/InvokeHostFunctionTests/77b0f96ee78d5679.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/77b0f96ee78d5679.xdr and b/test-lcm-next/InvokeHostFunctionTests/77b0f96ee78d5679.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/7811a2db272e2bc5.xdr b/test-lcm-next/InvokeHostFunctionTests/7811a2db272e2bc5.xdr index a633ced522..d6a15148ba 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/7811a2db272e2bc5.xdr and b/test-lcm-next/InvokeHostFunctionTests/7811a2db272e2bc5.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/781c971d7b58563a.xdr b/test-lcm-next/InvokeHostFunctionTests/781c971d7b58563a.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/781c971d7b58563a.xdr and b/test-lcm-next/InvokeHostFunctionTests/781c971d7b58563a.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/78d19632e893bee4.xdr b/test-lcm-next/InvokeHostFunctionTests/78d19632e893bee4.xdr index 01945a0c63..17e379128d 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/78d19632e893bee4.xdr and b/test-lcm-next/InvokeHostFunctionTests/78d19632e893bee4.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/7974f01f0568597f.xdr b/test-lcm-next/InvokeHostFunctionTests/7974f01f0568597f.xdr index 3712a25a55..32159010ac 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/7974f01f0568597f.xdr and b/test-lcm-next/InvokeHostFunctionTests/7974f01f0568597f.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/7af34c851b5af2ba.xdr b/test-lcm-next/InvokeHostFunctionTests/7af34c851b5af2ba.xdr index 615526e08a..90eb92675f 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/7af34c851b5af2ba.xdr and b/test-lcm-next/InvokeHostFunctionTests/7af34c851b5af2ba.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/7c3fa2905342aef3.xdr b/test-lcm-next/InvokeHostFunctionTests/7c3fa2905342aef3.xdr index a3ab25da40..8e1031a460 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/7c3fa2905342aef3.xdr and b/test-lcm-next/InvokeHostFunctionTests/7c3fa2905342aef3.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/7c588d1eada8e956.xdr b/test-lcm-next/InvokeHostFunctionTests/7c588d1eada8e956.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/7c588d1eada8e956.xdr and b/test-lcm-next/InvokeHostFunctionTests/7c588d1eada8e956.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/7c7ac7fe41e94018.xdr b/test-lcm-next/InvokeHostFunctionTests/7c7ac7fe41e94018.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/7c7ac7fe41e94018.xdr and b/test-lcm-next/InvokeHostFunctionTests/7c7ac7fe41e94018.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/7ca0fb2954bbb6c8.xdr b/test-lcm-next/InvokeHostFunctionTests/7ca0fb2954bbb6c8.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/7ca0fb2954bbb6c8.xdr and b/test-lcm-next/InvokeHostFunctionTests/7ca0fb2954bbb6c8.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/7cc3684dd630603a.xdr b/test-lcm-next/InvokeHostFunctionTests/7cc3684dd630603a.xdr new file mode 100644 index 0000000000..9dc9372050 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/7cc3684dd630603a.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/7cf5a062e427a3b3.xdr b/test-lcm-next/InvokeHostFunctionTests/7cf5a062e427a3b3.xdr index b1f237a379..87a5082c3a 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/7cf5a062e427a3b3.xdr and b/test-lcm-next/InvokeHostFunctionTests/7cf5a062e427a3b3.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/7db90301e11fa5d0.xdr b/test-lcm-next/InvokeHostFunctionTests/7db90301e11fa5d0.xdr index 4e96e49f2d..a20c9d906e 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/7db90301e11fa5d0.xdr and b/test-lcm-next/InvokeHostFunctionTests/7db90301e11fa5d0.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/7dd9f6410b671c2f.xdr b/test-lcm-next/InvokeHostFunctionTests/7dd9f6410b671c2f.xdr index 861f45020c..e4ce4f1855 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/7dd9f6410b671c2f.xdr and b/test-lcm-next/InvokeHostFunctionTests/7dd9f6410b671c2f.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/7de21bd4d91d805e.xdr b/test-lcm-next/InvokeHostFunctionTests/7de21bd4d91d805e.xdr new file mode 100644 index 0000000000..99868c669b Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/7de21bd4d91d805e.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/7f1fec7fe0be9e43.xdr b/test-lcm-next/InvokeHostFunctionTests/7f1fec7fe0be9e43.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/7f1fec7fe0be9e43.xdr and b/test-lcm-next/InvokeHostFunctionTests/7f1fec7fe0be9e43.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/7f737b8fa30b66b4.xdr b/test-lcm-next/InvokeHostFunctionTests/7f737b8fa30b66b4.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/7f737b8fa30b66b4.xdr and b/test-lcm-next/InvokeHostFunctionTests/7f737b8fa30b66b4.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/7f7e72aa985692ae.xdr b/test-lcm-next/InvokeHostFunctionTests/7f7e72aa985692ae.xdr index d077a80364..8bb82e7564 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/7f7e72aa985692ae.xdr and b/test-lcm-next/InvokeHostFunctionTests/7f7e72aa985692ae.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/811ecb1190787c4f.xdr b/test-lcm-next/InvokeHostFunctionTests/811ecb1190787c4f.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/811ecb1190787c4f.xdr and b/test-lcm-next/InvokeHostFunctionTests/811ecb1190787c4f.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/81c974086b0e4f56.xdr b/test-lcm-next/InvokeHostFunctionTests/81c974086b0e4f56.xdr index 92ada83137..5b47181783 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/81c974086b0e4f56.xdr and b/test-lcm-next/InvokeHostFunctionTests/81c974086b0e4f56.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/83c656314634c36a.xdr b/test-lcm-next/InvokeHostFunctionTests/83c656314634c36a.xdr new file mode 100644 index 0000000000..cc19186236 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/83c656314634c36a.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/83e78d1ac27b4951.xdr b/test-lcm-next/InvokeHostFunctionTests/83e78d1ac27b4951.xdr index 1a41628179..59c06530bc 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/83e78d1ac27b4951.xdr and b/test-lcm-next/InvokeHostFunctionTests/83e78d1ac27b4951.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/83f9b0ae9387fa6d.xdr b/test-lcm-next/InvokeHostFunctionTests/83f9b0ae9387fa6d.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/83f9b0ae9387fa6d.xdr and b/test-lcm-next/InvokeHostFunctionTests/83f9b0ae9387fa6d.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/841b5a633ba3dcd4.xdr b/test-lcm-next/InvokeHostFunctionTests/841b5a633ba3dcd4.xdr index dca8ee3603..ed69cd52cc 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/841b5a633ba3dcd4.xdr and b/test-lcm-next/InvokeHostFunctionTests/841b5a633ba3dcd4.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/84315cd6d68b5749.xdr b/test-lcm-next/InvokeHostFunctionTests/84315cd6d68b5749.xdr index 0d0481804d..7a793f3501 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/84315cd6d68b5749.xdr and b/test-lcm-next/InvokeHostFunctionTests/84315cd6d68b5749.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/843c6cc8cb69c839.xdr b/test-lcm-next/InvokeHostFunctionTests/843c6cc8cb69c839.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/843c6cc8cb69c839.xdr and b/test-lcm-next/InvokeHostFunctionTests/843c6cc8cb69c839.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/8455df4697c3967d.xdr b/test-lcm-next/InvokeHostFunctionTests/8455df4697c3967d.xdr new file mode 100644 index 0000000000..95f0763c05 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/8455df4697c3967d.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/858ea3c6fa587d2c.xdr b/test-lcm-next/InvokeHostFunctionTests/858ea3c6fa587d2c.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/858ea3c6fa587d2c.xdr and b/test-lcm-next/InvokeHostFunctionTests/858ea3c6fa587d2c.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/860c9ebb141ea269.xdr b/test-lcm-next/InvokeHostFunctionTests/860c9ebb141ea269.xdr index cbdc478e5f..e00d59e134 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/860c9ebb141ea269.xdr and b/test-lcm-next/InvokeHostFunctionTests/860c9ebb141ea269.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/8666b7f3149900ec.xdr b/test-lcm-next/InvokeHostFunctionTests/8666b7f3149900ec.xdr index 223dc867b2..625e584889 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/8666b7f3149900ec.xdr and b/test-lcm-next/InvokeHostFunctionTests/8666b7f3149900ec.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/86c090d2b24bc515.xdr b/test-lcm-next/InvokeHostFunctionTests/86c090d2b24bc515.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/86c090d2b24bc515.xdr and b/test-lcm-next/InvokeHostFunctionTests/86c090d2b24bc515.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/86ec0b605b279d49.xdr b/test-lcm-next/InvokeHostFunctionTests/86ec0b605b279d49.xdr index 4ec94084d5..f509b43dc4 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/86ec0b605b279d49.xdr and b/test-lcm-next/InvokeHostFunctionTests/86ec0b605b279d49.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/875401f18d4d37e0.xdr b/test-lcm-next/InvokeHostFunctionTests/875401f18d4d37e0.xdr index 43d1b1ad6a..119de3f96d 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/875401f18d4d37e0.xdr and b/test-lcm-next/InvokeHostFunctionTests/875401f18d4d37e0.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/877f82cfac49070f.xdr b/test-lcm-next/InvokeHostFunctionTests/877f82cfac49070f.xdr new file mode 100644 index 0000000000..851e8a1f15 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/877f82cfac49070f.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/8848fdad9b841822.xdr b/test-lcm-next/InvokeHostFunctionTests/8848fdad9b841822.xdr index 9bcb93e665..19b1342ed2 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/8848fdad9b841822.xdr and b/test-lcm-next/InvokeHostFunctionTests/8848fdad9b841822.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/8878f61751a807b8.xdr b/test-lcm-next/InvokeHostFunctionTests/8878f61751a807b8.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/8878f61751a807b8.xdr and b/test-lcm-next/InvokeHostFunctionTests/8878f61751a807b8.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/887c083fc1639e43.xdr b/test-lcm-next/InvokeHostFunctionTests/887c083fc1639e43.xdr index 2b4c0672ed..f85b85618c 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/887c083fc1639e43.xdr and b/test-lcm-next/InvokeHostFunctionTests/887c083fc1639e43.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/8900d5bd1b2b9f70.xdr b/test-lcm-next/InvokeHostFunctionTests/8900d5bd1b2b9f70.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/8900d5bd1b2b9f70.xdr and b/test-lcm-next/InvokeHostFunctionTests/8900d5bd1b2b9f70.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/891a276e7ce06b91.xdr b/test-lcm-next/InvokeHostFunctionTests/891a276e7ce06b91.xdr index 11574296a9..2741f8f010 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/891a276e7ce06b91.xdr and b/test-lcm-next/InvokeHostFunctionTests/891a276e7ce06b91.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/895b3456160d157c.xdr b/test-lcm-next/InvokeHostFunctionTests/895b3456160d157c.xdr index 052b2ff1d0..8ad33b4553 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/895b3456160d157c.xdr and b/test-lcm-next/InvokeHostFunctionTests/895b3456160d157c.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/897ee371b2a80230.xdr b/test-lcm-next/InvokeHostFunctionTests/897ee371b2a80230.xdr index 6a0e4f425e..720086c6f1 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/897ee371b2a80230.xdr and b/test-lcm-next/InvokeHostFunctionTests/897ee371b2a80230.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/898221ce90bbe12a.xdr b/test-lcm-next/InvokeHostFunctionTests/898221ce90bbe12a.xdr index 009a547a08..eeb472ab92 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/898221ce90bbe12a.xdr and b/test-lcm-next/InvokeHostFunctionTests/898221ce90bbe12a.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/89f9145d00c68451.xdr b/test-lcm-next/InvokeHostFunctionTests/89f9145d00c68451.xdr index 388bde063c..a997d6610b 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/89f9145d00c68451.xdr and b/test-lcm-next/InvokeHostFunctionTests/89f9145d00c68451.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/8adead0567fe7d71.xdr b/test-lcm-next/InvokeHostFunctionTests/8adead0567fe7d71.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/8adead0567fe7d71.xdr and b/test-lcm-next/InvokeHostFunctionTests/8adead0567fe7d71.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/8b13d91d773c9085.xdr b/test-lcm-next/InvokeHostFunctionTests/8b13d91d773c9085.xdr index 8dbfd915ad..917f5c4d3d 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/8b13d91d773c9085.xdr and b/test-lcm-next/InvokeHostFunctionTests/8b13d91d773c9085.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/8b62ea69fc56c0a7.xdr b/test-lcm-next/InvokeHostFunctionTests/8b62ea69fc56c0a7.xdr new file mode 100644 index 0000000000..825925f67d Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/8b62ea69fc56c0a7.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/8cf745afc0a51283.xdr b/test-lcm-next/InvokeHostFunctionTests/8cf745afc0a51283.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/8cf745afc0a51283.xdr and b/test-lcm-next/InvokeHostFunctionTests/8cf745afc0a51283.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/8d7be440e1455d0b.xdr b/test-lcm-next/InvokeHostFunctionTests/8d7be440e1455d0b.xdr new file mode 100644 index 0000000000..617f5247f9 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/8d7be440e1455d0b.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/8dd5261011c6c3bc.xdr b/test-lcm-next/InvokeHostFunctionTests/8dd5261011c6c3bc.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/8dd5261011c6c3bc.xdr and b/test-lcm-next/InvokeHostFunctionTests/8dd5261011c6c3bc.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/8dfbc063af86ec35.xdr b/test-lcm-next/InvokeHostFunctionTests/8dfbc063af86ec35.xdr index fa1433db94..c6b9417a4d 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/8dfbc063af86ec35.xdr and b/test-lcm-next/InvokeHostFunctionTests/8dfbc063af86ec35.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/8e99b44b297caaac.xdr b/test-lcm-next/InvokeHostFunctionTests/8e99b44b297caaac.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/8e99b44b297caaac.xdr and b/test-lcm-next/InvokeHostFunctionTests/8e99b44b297caaac.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/8fa77a7691d9a43d.xdr b/test-lcm-next/InvokeHostFunctionTests/8fa77a7691d9a43d.xdr index 31dbfcfb99..791c962342 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/8fa77a7691d9a43d.xdr and b/test-lcm-next/InvokeHostFunctionTests/8fa77a7691d9a43d.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/908acbd3aceb8316.xdr b/test-lcm-next/InvokeHostFunctionTests/908acbd3aceb8316.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/908acbd3aceb8316.xdr and b/test-lcm-next/InvokeHostFunctionTests/908acbd3aceb8316.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/90d44cefcaf5f29b.xdr b/test-lcm-next/InvokeHostFunctionTests/90d44cefcaf5f29b.xdr index 100700dad2..bff13771ff 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/90d44cefcaf5f29b.xdr and b/test-lcm-next/InvokeHostFunctionTests/90d44cefcaf5f29b.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/912edb34a90b9157.xdr b/test-lcm-next/InvokeHostFunctionTests/912edb34a90b9157.xdr new file mode 100644 index 0000000000..b9c84c5269 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/912edb34a90b9157.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/9146eb4425682ade.xdr b/test-lcm-next/InvokeHostFunctionTests/9146eb4425682ade.xdr new file mode 100644 index 0000000000..1f7bf5385b Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/9146eb4425682ade.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/9209c586bd226b99.xdr b/test-lcm-next/InvokeHostFunctionTests/9209c586bd226b99.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/9209c586bd226b99.xdr and b/test-lcm-next/InvokeHostFunctionTests/9209c586bd226b99.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/9245f43fc2fba8b0.xdr b/test-lcm-next/InvokeHostFunctionTests/9245f43fc2fba8b0.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/9245f43fc2fba8b0.xdr and b/test-lcm-next/InvokeHostFunctionTests/9245f43fc2fba8b0.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/925562b1c2fa6d94.xdr b/test-lcm-next/InvokeHostFunctionTests/925562b1c2fa6d94.xdr new file mode 100644 index 0000000000..3f02ebbb08 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/925562b1c2fa6d94.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/92812a1aacefe098.xdr b/test-lcm-next/InvokeHostFunctionTests/92812a1aacefe098.xdr new file mode 100644 index 0000000000..ad78d77e13 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/92812a1aacefe098.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/92b288c4d95b05f9.xdr b/test-lcm-next/InvokeHostFunctionTests/92b288c4d95b05f9.xdr index fe0090821e..780bb99049 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/92b288c4d95b05f9.xdr and b/test-lcm-next/InvokeHostFunctionTests/92b288c4d95b05f9.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/930b08e2d077bfdc.xdr b/test-lcm-next/InvokeHostFunctionTests/930b08e2d077bfdc.xdr index e379bb8aa1..a95ee0caf4 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/930b08e2d077bfdc.xdr and b/test-lcm-next/InvokeHostFunctionTests/930b08e2d077bfdc.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/932641f2b5405789.xdr b/test-lcm-next/InvokeHostFunctionTests/932641f2b5405789.xdr index 90e83ea9af..c2475164ae 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/932641f2b5405789.xdr and b/test-lcm-next/InvokeHostFunctionTests/932641f2b5405789.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/93481a30a4ea3f79.xdr b/test-lcm-next/InvokeHostFunctionTests/93481a30a4ea3f79.xdr index 68e5eeee1e..bf17730c1e 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/93481a30a4ea3f79.xdr and b/test-lcm-next/InvokeHostFunctionTests/93481a30a4ea3f79.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/93ba029750a86166.xdr b/test-lcm-next/InvokeHostFunctionTests/93ba029750a86166.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/93ba029750a86166.xdr and b/test-lcm-next/InvokeHostFunctionTests/93ba029750a86166.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/940e8bdc84f9af94.xdr b/test-lcm-next/InvokeHostFunctionTests/940e8bdc84f9af94.xdr index 3956ec2ffe..b19c3d62c9 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/940e8bdc84f9af94.xdr and b/test-lcm-next/InvokeHostFunctionTests/940e8bdc84f9af94.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/9435de885ff30026.xdr b/test-lcm-next/InvokeHostFunctionTests/9435de885ff30026.xdr index a0b31f4c38..e26e646d1b 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/9435de885ff30026.xdr and b/test-lcm-next/InvokeHostFunctionTests/9435de885ff30026.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/94f5f9a57e087669.xdr b/test-lcm-next/InvokeHostFunctionTests/94f5f9a57e087669.xdr index e7e0fd0e31..d796ab386b 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/94f5f9a57e087669.xdr and b/test-lcm-next/InvokeHostFunctionTests/94f5f9a57e087669.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/9592b7d06c5fd16c.xdr b/test-lcm-next/InvokeHostFunctionTests/9592b7d06c5fd16c.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/9592b7d06c5fd16c.xdr and b/test-lcm-next/InvokeHostFunctionTests/9592b7d06c5fd16c.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/95dfceb1b6e1c811.xdr b/test-lcm-next/InvokeHostFunctionTests/95dfceb1b6e1c811.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/95dfceb1b6e1c811.xdr and b/test-lcm-next/InvokeHostFunctionTests/95dfceb1b6e1c811.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/95ede71a6074dc1b.xdr b/test-lcm-next/InvokeHostFunctionTests/95ede71a6074dc1b.xdr index 9968824d9b..ed76b403e5 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/95ede71a6074dc1b.xdr and b/test-lcm-next/InvokeHostFunctionTests/95ede71a6074dc1b.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/964450cc2eb51081.xdr b/test-lcm-next/InvokeHostFunctionTests/964450cc2eb51081.xdr index ad03c1021d..5d1ae5e8a3 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/964450cc2eb51081.xdr and b/test-lcm-next/InvokeHostFunctionTests/964450cc2eb51081.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/973c473e2b3d9f51.xdr b/test-lcm-next/InvokeHostFunctionTests/973c473e2b3d9f51.xdr new file mode 100644 index 0000000000..c96a5dc757 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/973c473e2b3d9f51.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/98926b2de35ed6e6.xdr b/test-lcm-next/InvokeHostFunctionTests/98926b2de35ed6e6.xdr new file mode 100644 index 0000000000..32b041bc4d Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/98926b2de35ed6e6.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/98958916fd28f843.xdr b/test-lcm-next/InvokeHostFunctionTests/98958916fd28f843.xdr index 38bc9a24f7..aca30cc0cf 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/98958916fd28f843.xdr and b/test-lcm-next/InvokeHostFunctionTests/98958916fd28f843.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/9a2c38c5272df06c.xdr b/test-lcm-next/InvokeHostFunctionTests/9a2c38c5272df06c.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/9a2c38c5272df06c.xdr and b/test-lcm-next/InvokeHostFunctionTests/9a2c38c5272df06c.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/9a4d995b45b4db13.xdr b/test-lcm-next/InvokeHostFunctionTests/9a4d995b45b4db13.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/9a4d995b45b4db13.xdr and b/test-lcm-next/InvokeHostFunctionTests/9a4d995b45b4db13.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/9abda59d0cea408b.xdr b/test-lcm-next/InvokeHostFunctionTests/9abda59d0cea408b.xdr index c15ee3fe5d..41c5d31c6d 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/9abda59d0cea408b.xdr and b/test-lcm-next/InvokeHostFunctionTests/9abda59d0cea408b.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/9b5ea22fe53632fe.xdr b/test-lcm-next/InvokeHostFunctionTests/9b5ea22fe53632fe.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/9b5ea22fe53632fe.xdr and b/test-lcm-next/InvokeHostFunctionTests/9b5ea22fe53632fe.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/9c169e4a17366ef4.xdr b/test-lcm-next/InvokeHostFunctionTests/9c169e4a17366ef4.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/9c169e4a17366ef4.xdr and b/test-lcm-next/InvokeHostFunctionTests/9c169e4a17366ef4.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/9c319f6ebbf74238.xdr b/test-lcm-next/InvokeHostFunctionTests/9c319f6ebbf74238.xdr index 93310d114c..6845c41142 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/9c319f6ebbf74238.xdr and b/test-lcm-next/InvokeHostFunctionTests/9c319f6ebbf74238.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/9cbd66b8c4018c16.xdr b/test-lcm-next/InvokeHostFunctionTests/9cbd66b8c4018c16.xdr index 3cbce2626d..9c827952e5 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/9cbd66b8c4018c16.xdr and b/test-lcm-next/InvokeHostFunctionTests/9cbd66b8c4018c16.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/9ccccec1202f5b81.xdr b/test-lcm-next/InvokeHostFunctionTests/9ccccec1202f5b81.xdr index 2b6b210fd0..9ae9246090 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/9ccccec1202f5b81.xdr and b/test-lcm-next/InvokeHostFunctionTests/9ccccec1202f5b81.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/9de1ea718b77ffa2.xdr b/test-lcm-next/InvokeHostFunctionTests/9de1ea718b77ffa2.xdr index da4654e102..b6618b99e1 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/9de1ea718b77ffa2.xdr and b/test-lcm-next/InvokeHostFunctionTests/9de1ea718b77ffa2.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/9e7d59169e4ded64.xdr b/test-lcm-next/InvokeHostFunctionTests/9e7d59169e4ded64.xdr index 082e4b6a26..12b4fbd514 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/9e7d59169e4ded64.xdr and b/test-lcm-next/InvokeHostFunctionTests/9e7d59169e4ded64.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/9e81b4f36cfd3af7.xdr b/test-lcm-next/InvokeHostFunctionTests/9e81b4f36cfd3af7.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/9e81b4f36cfd3af7.xdr and b/test-lcm-next/InvokeHostFunctionTests/9e81b4f36cfd3af7.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/9eb4e26b61bc0325.xdr b/test-lcm-next/InvokeHostFunctionTests/9eb4e26b61bc0325.xdr new file mode 100644 index 0000000000..1e0d1180f1 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/9eb4e26b61bc0325.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/9f130c1b0c7b7a7a.xdr b/test-lcm-next/InvokeHostFunctionTests/9f130c1b0c7b7a7a.xdr index 873b089a71..946dbe59bd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/9f130c1b0c7b7a7a.xdr and b/test-lcm-next/InvokeHostFunctionTests/9f130c1b0c7b7a7a.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/9f280040dbfe9ebd.xdr b/test-lcm-next/InvokeHostFunctionTests/9f280040dbfe9ebd.xdr index da239e46ed..60baf96e35 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/9f280040dbfe9ebd.xdr and b/test-lcm-next/InvokeHostFunctionTests/9f280040dbfe9ebd.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/9fa92df05d0615bf.xdr b/test-lcm-next/InvokeHostFunctionTests/9fa92df05d0615bf.xdr index 19f42e5606..6796e2b816 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/9fa92df05d0615bf.xdr and b/test-lcm-next/InvokeHostFunctionTests/9fa92df05d0615bf.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/a0119ab86c638bee.xdr b/test-lcm-next/InvokeHostFunctionTests/a0119ab86c638bee.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/a0119ab86c638bee.xdr and b/test-lcm-next/InvokeHostFunctionTests/a0119ab86c638bee.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/a0530911bb14b4b9.xdr b/test-lcm-next/InvokeHostFunctionTests/a0530911bb14b4b9.xdr new file mode 100644 index 0000000000..cc740e4cfc Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/a0530911bb14b4b9.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/a0b7e7243a96c9c6.xdr b/test-lcm-next/InvokeHostFunctionTests/a0b7e7243a96c9c6.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/a0b7e7243a96c9c6.xdr and b/test-lcm-next/InvokeHostFunctionTests/a0b7e7243a96c9c6.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/a0d59eaf3b79413c.xdr b/test-lcm-next/InvokeHostFunctionTests/a0d59eaf3b79413c.xdr index 39a01beb86..bd202fb708 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/a0d59eaf3b79413c.xdr and b/test-lcm-next/InvokeHostFunctionTests/a0d59eaf3b79413c.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/a0fd94b0902a1c7f.xdr b/test-lcm-next/InvokeHostFunctionTests/a0fd94b0902a1c7f.xdr index 6e24a76813..6aefcf70a6 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/a0fd94b0902a1c7f.xdr and b/test-lcm-next/InvokeHostFunctionTests/a0fd94b0902a1c7f.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/a1e8a2de64ca02cb.xdr b/test-lcm-next/InvokeHostFunctionTests/a1e8a2de64ca02cb.xdr new file mode 100644 index 0000000000..ea5db9d067 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/a1e8a2de64ca02cb.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/a258cc5505846d79.xdr b/test-lcm-next/InvokeHostFunctionTests/a258cc5505846d79.xdr index 95f42f46fb..f6a5409bd6 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/a258cc5505846d79.xdr and b/test-lcm-next/InvokeHostFunctionTests/a258cc5505846d79.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/a3e6e4ec2134a31c.xdr b/test-lcm-next/InvokeHostFunctionTests/a3e6e4ec2134a31c.xdr new file mode 100644 index 0000000000..f961e0988a Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/a3e6e4ec2134a31c.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/a71e4d9203d52748.xdr b/test-lcm-next/InvokeHostFunctionTests/a71e4d9203d52748.xdr index d439413d21..376269906b 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/a71e4d9203d52748.xdr and b/test-lcm-next/InvokeHostFunctionTests/a71e4d9203d52748.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/a72c947ed7b434d3.xdr b/test-lcm-next/InvokeHostFunctionTests/a72c947ed7b434d3.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/a72c947ed7b434d3.xdr and b/test-lcm-next/InvokeHostFunctionTests/a72c947ed7b434d3.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/a80621eee94baae6.xdr b/test-lcm-next/InvokeHostFunctionTests/a80621eee94baae6.xdr index 257eae602e..6f9123d090 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/a80621eee94baae6.xdr and b/test-lcm-next/InvokeHostFunctionTests/a80621eee94baae6.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/a8a9725a33441cb5.xdr b/test-lcm-next/InvokeHostFunctionTests/a8a9725a33441cb5.xdr index 8c2aad2413..2b8e71a7a9 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/a8a9725a33441cb5.xdr and b/test-lcm-next/InvokeHostFunctionTests/a8a9725a33441cb5.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/a8d1cb44f470573f.xdr b/test-lcm-next/InvokeHostFunctionTests/a8d1cb44f470573f.xdr index 49aa7d36ef..d983fb589b 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/a8d1cb44f470573f.xdr and b/test-lcm-next/InvokeHostFunctionTests/a8d1cb44f470573f.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/a904442b4503e607.xdr b/test-lcm-next/InvokeHostFunctionTests/a904442b4503e607.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/a904442b4503e607.xdr and b/test-lcm-next/InvokeHostFunctionTests/a904442b4503e607.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/a94afbf4a15753e8.xdr b/test-lcm-next/InvokeHostFunctionTests/a94afbf4a15753e8.xdr index c2bb6604c5..342df24234 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/a94afbf4a15753e8.xdr and b/test-lcm-next/InvokeHostFunctionTests/a94afbf4a15753e8.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/a9af3a29cf25b4d2.xdr b/test-lcm-next/InvokeHostFunctionTests/a9af3a29cf25b4d2.xdr index 5a174a25dc..1c46008067 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/a9af3a29cf25b4d2.xdr and b/test-lcm-next/InvokeHostFunctionTests/a9af3a29cf25b4d2.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/aa53f5c640a1c97e.xdr b/test-lcm-next/InvokeHostFunctionTests/aa53f5c640a1c97e.xdr index c34bd8e4b2..2ab4fe160a 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/aa53f5c640a1c97e.xdr and b/test-lcm-next/InvokeHostFunctionTests/aa53f5c640a1c97e.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/aaf3b23c21536d24.xdr b/test-lcm-next/InvokeHostFunctionTests/aaf3b23c21536d24.xdr new file mode 100644 index 0000000000..956c160db5 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/aaf3b23c21536d24.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/ab3bce4773581342.xdr b/test-lcm-next/InvokeHostFunctionTests/ab3bce4773581342.xdr index 67302231b4..60f58b3d00 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/ab3bce4773581342.xdr and b/test-lcm-next/InvokeHostFunctionTests/ab3bce4773581342.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/abe9daab6e04747a.xdr b/test-lcm-next/InvokeHostFunctionTests/abe9daab6e04747a.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/abe9daab6e04747a.xdr and b/test-lcm-next/InvokeHostFunctionTests/abe9daab6e04747a.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/ad00903073e6c1d2.xdr b/test-lcm-next/InvokeHostFunctionTests/ad00903073e6c1d2.xdr index fc8adbb108..22cf719f62 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/ad00903073e6c1d2.xdr and b/test-lcm-next/InvokeHostFunctionTests/ad00903073e6c1d2.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/ad19485cea9fa38c.xdr b/test-lcm-next/InvokeHostFunctionTests/ad19485cea9fa38c.xdr index e2a566a366..06c5080d2e 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/ad19485cea9fa38c.xdr and b/test-lcm-next/InvokeHostFunctionTests/ad19485cea9fa38c.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/ae37ace1fbc924e5.xdr b/test-lcm-next/InvokeHostFunctionTests/ae37ace1fbc924e5.xdr new file mode 100644 index 0000000000..0b63f56dbe Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/ae37ace1fbc924e5.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/ae601103b9e4498d.xdr b/test-lcm-next/InvokeHostFunctionTests/ae601103b9e4498d.xdr index f16a094f8f..103aab4775 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/ae601103b9e4498d.xdr and b/test-lcm-next/InvokeHostFunctionTests/ae601103b9e4498d.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/aec6a7cfd3c1af73.xdr b/test-lcm-next/InvokeHostFunctionTests/aec6a7cfd3c1af73.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/aec6a7cfd3c1af73.xdr and b/test-lcm-next/InvokeHostFunctionTests/aec6a7cfd3c1af73.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/aef8c4cf49c5cce1.xdr b/test-lcm-next/InvokeHostFunctionTests/aef8c4cf49c5cce1.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/aef8c4cf49c5cce1.xdr and b/test-lcm-next/InvokeHostFunctionTests/aef8c4cf49c5cce1.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/af54a98dbdd88b52.xdr b/test-lcm-next/InvokeHostFunctionTests/af54a98dbdd88b52.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/af54a98dbdd88b52.xdr and b/test-lcm-next/InvokeHostFunctionTests/af54a98dbdd88b52.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/af5af20b7b9fedf3.xdr b/test-lcm-next/InvokeHostFunctionTests/af5af20b7b9fedf3.xdr new file mode 100644 index 0000000000..3f0bf6fddf Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/af5af20b7b9fedf3.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/afa256621921b22e.xdr b/test-lcm-next/InvokeHostFunctionTests/afa256621921b22e.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/afa256621921b22e.xdr and b/test-lcm-next/InvokeHostFunctionTests/afa256621921b22e.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/afe35bda9ebb3f2c.xdr b/test-lcm-next/InvokeHostFunctionTests/afe35bda9ebb3f2c.xdr index b242a7d78f..97d189974f 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/afe35bda9ebb3f2c.xdr and b/test-lcm-next/InvokeHostFunctionTests/afe35bda9ebb3f2c.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/b045bf491859a6b8.xdr b/test-lcm-next/InvokeHostFunctionTests/b045bf491859a6b8.xdr index 9152bb0811..a5bd03aef9 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/b045bf491859a6b8.xdr and b/test-lcm-next/InvokeHostFunctionTests/b045bf491859a6b8.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/b064c60719fa9bec.xdr b/test-lcm-next/InvokeHostFunctionTests/b064c60719fa9bec.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/b064c60719fa9bec.xdr and b/test-lcm-next/InvokeHostFunctionTests/b064c60719fa9bec.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/b136f91677750cd4.xdr b/test-lcm-next/InvokeHostFunctionTests/b136f91677750cd4.xdr index 67e47f7a87..0a4632d10c 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/b136f91677750cd4.xdr and b/test-lcm-next/InvokeHostFunctionTests/b136f91677750cd4.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/b149a7eb981b5ed6.xdr b/test-lcm-next/InvokeHostFunctionTests/b149a7eb981b5ed6.xdr index 3985e87df7..9da8271548 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/b149a7eb981b5ed6.xdr and b/test-lcm-next/InvokeHostFunctionTests/b149a7eb981b5ed6.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/b1d5a1bda5b51e5b.xdr b/test-lcm-next/InvokeHostFunctionTests/b1d5a1bda5b51e5b.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/b1d5a1bda5b51e5b.xdr and b/test-lcm-next/InvokeHostFunctionTests/b1d5a1bda5b51e5b.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/b1ea5e0a15f73c18.xdr b/test-lcm-next/InvokeHostFunctionTests/b1ea5e0a15f73c18.xdr new file mode 100644 index 0000000000..58d99fd881 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/b1ea5e0a15f73c18.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/b3082e3bcd3a078c.xdr b/test-lcm-next/InvokeHostFunctionTests/b3082e3bcd3a078c.xdr index 588b045849..1eb531b9a2 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/b3082e3bcd3a078c.xdr and b/test-lcm-next/InvokeHostFunctionTests/b3082e3bcd3a078c.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/b3101bb9f07292f5.xdr b/test-lcm-next/InvokeHostFunctionTests/b3101bb9f07292f5.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/b3101bb9f07292f5.xdr and b/test-lcm-next/InvokeHostFunctionTests/b3101bb9f07292f5.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/b3437be97f124777.xdr b/test-lcm-next/InvokeHostFunctionTests/b3437be97f124777.xdr index fb525e0a32..9fb2dbb66f 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/b3437be97f124777.xdr and b/test-lcm-next/InvokeHostFunctionTests/b3437be97f124777.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/b34f3ecaf4fdb062.xdr b/test-lcm-next/InvokeHostFunctionTests/b34f3ecaf4fdb062.xdr index 3df851e061..f88b58343c 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/b34f3ecaf4fdb062.xdr and b/test-lcm-next/InvokeHostFunctionTests/b34f3ecaf4fdb062.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/b3f7fce5e8492f2e.xdr b/test-lcm-next/InvokeHostFunctionTests/b3f7fce5e8492f2e.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/b3f7fce5e8492f2e.xdr and b/test-lcm-next/InvokeHostFunctionTests/b3f7fce5e8492f2e.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/b4148adbbba04047.xdr b/test-lcm-next/InvokeHostFunctionTests/b4148adbbba04047.xdr index f8a154a571..629850ace2 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/b4148adbbba04047.xdr and b/test-lcm-next/InvokeHostFunctionTests/b4148adbbba04047.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/b5a503183a69e95f.xdr b/test-lcm-next/InvokeHostFunctionTests/b5a503183a69e95f.xdr index 6254a8ece1..3def9bade5 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/b5a503183a69e95f.xdr and b/test-lcm-next/InvokeHostFunctionTests/b5a503183a69e95f.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/b5e418a8a8cf65b9.xdr b/test-lcm-next/InvokeHostFunctionTests/b5e418a8a8cf65b9.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/b5e418a8a8cf65b9.xdr and b/test-lcm-next/InvokeHostFunctionTests/b5e418a8a8cf65b9.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/b652542975ff5560.xdr b/test-lcm-next/InvokeHostFunctionTests/b652542975ff5560.xdr index 4fd938d91d..1f7c06e025 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/b652542975ff5560.xdr and b/test-lcm-next/InvokeHostFunctionTests/b652542975ff5560.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/b7db472d275c4797.xdr b/test-lcm-next/InvokeHostFunctionTests/b7db472d275c4797.xdr index 2f423b31f9..5007d6e3fb 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/b7db472d275c4797.xdr and b/test-lcm-next/InvokeHostFunctionTests/b7db472d275c4797.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/b9862c0b86a145aa.xdr b/test-lcm-next/InvokeHostFunctionTests/b9862c0b86a145aa.xdr index 58e6f24748..00dd1dc8be 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/b9862c0b86a145aa.xdr and b/test-lcm-next/InvokeHostFunctionTests/b9862c0b86a145aa.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/b9bdda6eada575ea.xdr b/test-lcm-next/InvokeHostFunctionTests/b9bdda6eada575ea.xdr index 47a8aaa04b..04ac0bd319 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/b9bdda6eada575ea.xdr and b/test-lcm-next/InvokeHostFunctionTests/b9bdda6eada575ea.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/ba8824d29063376f.xdr b/test-lcm-next/InvokeHostFunctionTests/ba8824d29063376f.xdr index c19294a7ee..a0631e4c2b 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/ba8824d29063376f.xdr and b/test-lcm-next/InvokeHostFunctionTests/ba8824d29063376f.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/ba9e85782489d4b3.xdr b/test-lcm-next/InvokeHostFunctionTests/ba9e85782489d4b3.xdr index 5f4409058d..35b2929ab5 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/ba9e85782489d4b3.xdr and b/test-lcm-next/InvokeHostFunctionTests/ba9e85782489d4b3.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/baa71b7a006a3951.xdr b/test-lcm-next/InvokeHostFunctionTests/baa71b7a006a3951.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/baa71b7a006a3951.xdr and b/test-lcm-next/InvokeHostFunctionTests/baa71b7a006a3951.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/baeae6dfbb97ae8c.xdr b/test-lcm-next/InvokeHostFunctionTests/baeae6dfbb97ae8c.xdr new file mode 100644 index 0000000000..1f07f7aa3b Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/baeae6dfbb97ae8c.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/bb10b7a54991da41.xdr b/test-lcm-next/InvokeHostFunctionTests/bb10b7a54991da41.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/bb10b7a54991da41.xdr and b/test-lcm-next/InvokeHostFunctionTests/bb10b7a54991da41.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/bd7ec9becd2cf279.xdr b/test-lcm-next/InvokeHostFunctionTests/bd7ec9becd2cf279.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/bd7ec9becd2cf279.xdr and b/test-lcm-next/InvokeHostFunctionTests/bd7ec9becd2cf279.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/bdf21d276e44df51.xdr b/test-lcm-next/InvokeHostFunctionTests/bdf21d276e44df51.xdr index eed1cc85ad..ba0c182523 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/bdf21d276e44df51.xdr and b/test-lcm-next/InvokeHostFunctionTests/bdf21d276e44df51.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/bdfcd5f448d7a9cd.xdr b/test-lcm-next/InvokeHostFunctionTests/bdfcd5f448d7a9cd.xdr index f599591fd9..c606789975 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/bdfcd5f448d7a9cd.xdr and b/test-lcm-next/InvokeHostFunctionTests/bdfcd5f448d7a9cd.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/be52cd7f42814b0a.xdr b/test-lcm-next/InvokeHostFunctionTests/be52cd7f42814b0a.xdr index 74fb7dc6b6..3d1f9e9b6b 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/be52cd7f42814b0a.xdr and b/test-lcm-next/InvokeHostFunctionTests/be52cd7f42814b0a.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/be6ebb5f038aa456.xdr b/test-lcm-next/InvokeHostFunctionTests/be6ebb5f038aa456.xdr index 779e8df911..c5a69cdf9a 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/be6ebb5f038aa456.xdr and b/test-lcm-next/InvokeHostFunctionTests/be6ebb5f038aa456.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/be9fcc614f398cf3.xdr b/test-lcm-next/InvokeHostFunctionTests/be9fcc614f398cf3.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/be9fcc614f398cf3.xdr and b/test-lcm-next/InvokeHostFunctionTests/be9fcc614f398cf3.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/bec5319840022194.xdr b/test-lcm-next/InvokeHostFunctionTests/bec5319840022194.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/bec5319840022194.xdr and b/test-lcm-next/InvokeHostFunctionTests/bec5319840022194.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/bec915835775f88a.xdr b/test-lcm-next/InvokeHostFunctionTests/bec915835775f88a.xdr index 30da6c68f7..14356d5f5c 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/bec915835775f88a.xdr and b/test-lcm-next/InvokeHostFunctionTests/bec915835775f88a.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/beed566485392053.xdr b/test-lcm-next/InvokeHostFunctionTests/beed566485392053.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/beed566485392053.xdr and b/test-lcm-next/InvokeHostFunctionTests/beed566485392053.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/beee405585556b28.xdr b/test-lcm-next/InvokeHostFunctionTests/beee405585556b28.xdr index 781abba6b2..839a37559a 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/beee405585556b28.xdr and b/test-lcm-next/InvokeHostFunctionTests/beee405585556b28.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/bf27f88df8fb68c5.xdr b/test-lcm-next/InvokeHostFunctionTests/bf27f88df8fb68c5.xdr index 23ac98c6da..a2bb5c107a 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/bf27f88df8fb68c5.xdr and b/test-lcm-next/InvokeHostFunctionTests/bf27f88df8fb68c5.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/bf572f41777a2153.xdr b/test-lcm-next/InvokeHostFunctionTests/bf572f41777a2153.xdr new file mode 100644 index 0000000000..bcc7143651 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/bf572f41777a2153.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/bfa396d5747102ff.xdr b/test-lcm-next/InvokeHostFunctionTests/bfa396d5747102ff.xdr index c84a194a47..33833c9bbc 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/bfa396d5747102ff.xdr and b/test-lcm-next/InvokeHostFunctionTests/bfa396d5747102ff.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/c03bbceaf1428236.xdr b/test-lcm-next/InvokeHostFunctionTests/c03bbceaf1428236.xdr index 3c2f0b89f4..8de01d5b73 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/c03bbceaf1428236.xdr and b/test-lcm-next/InvokeHostFunctionTests/c03bbceaf1428236.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/c18c912409884beb.xdr b/test-lcm-next/InvokeHostFunctionTests/c18c912409884beb.xdr index 6eb245ff19..1b02ef8370 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/c18c912409884beb.xdr and b/test-lcm-next/InvokeHostFunctionTests/c18c912409884beb.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/c1b1663060d151c0.xdr b/test-lcm-next/InvokeHostFunctionTests/c1b1663060d151c0.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/c1b1663060d151c0.xdr and b/test-lcm-next/InvokeHostFunctionTests/c1b1663060d151c0.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/c1b4226571cd3ae1.xdr b/test-lcm-next/InvokeHostFunctionTests/c1b4226571cd3ae1.xdr index 6f5aa0a7bc..fcd613eedd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/c1b4226571cd3ae1.xdr and b/test-lcm-next/InvokeHostFunctionTests/c1b4226571cd3ae1.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/c1c7ac4fa5ae147c.xdr b/test-lcm-next/InvokeHostFunctionTests/c1c7ac4fa5ae147c.xdr index b22ee062cb..f0388afdca 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/c1c7ac4fa5ae147c.xdr and b/test-lcm-next/InvokeHostFunctionTests/c1c7ac4fa5ae147c.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/c252cebb25294eab.xdr b/test-lcm-next/InvokeHostFunctionTests/c252cebb25294eab.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/c252cebb25294eab.xdr and b/test-lcm-next/InvokeHostFunctionTests/c252cebb25294eab.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/c2ac55826ca7e6de.xdr b/test-lcm-next/InvokeHostFunctionTests/c2ac55826ca7e6de.xdr index 0809d57f0b..d4c7d05079 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/c2ac55826ca7e6de.xdr and b/test-lcm-next/InvokeHostFunctionTests/c2ac55826ca7e6de.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/c2c932cf464209f1.xdr b/test-lcm-next/InvokeHostFunctionTests/c2c932cf464209f1.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/c2c932cf464209f1.xdr and b/test-lcm-next/InvokeHostFunctionTests/c2c932cf464209f1.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/c3497f7f5230cd85.xdr b/test-lcm-next/InvokeHostFunctionTests/c3497f7f5230cd85.xdr new file mode 100644 index 0000000000..2725f6390d Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/c3497f7f5230cd85.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/c3962c4a93291d74.xdr b/test-lcm-next/InvokeHostFunctionTests/c3962c4a93291d74.xdr index d5a4763621..2b4d2f8c49 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/c3962c4a93291d74.xdr and b/test-lcm-next/InvokeHostFunctionTests/c3962c4a93291d74.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/c3bb0eae31d31633.xdr b/test-lcm-next/InvokeHostFunctionTests/c3bb0eae31d31633.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/c3bb0eae31d31633.xdr and b/test-lcm-next/InvokeHostFunctionTests/c3bb0eae31d31633.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/c5d57c89c419e4af.xdr b/test-lcm-next/InvokeHostFunctionTests/c5d57c89c419e4af.xdr index d1bab4afb4..e2ab162a4f 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/c5d57c89c419e4af.xdr and b/test-lcm-next/InvokeHostFunctionTests/c5d57c89c419e4af.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/c5f89e8c3c843590.xdr b/test-lcm-next/InvokeHostFunctionTests/c5f89e8c3c843590.xdr index f00ba22f2e..da9ba9b195 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/c5f89e8c3c843590.xdr and b/test-lcm-next/InvokeHostFunctionTests/c5f89e8c3c843590.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/c6c3d9865a04db5b.xdr b/test-lcm-next/InvokeHostFunctionTests/c6c3d9865a04db5b.xdr index 53896a0f00..e749f495ca 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/c6c3d9865a04db5b.xdr and b/test-lcm-next/InvokeHostFunctionTests/c6c3d9865a04db5b.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/c6fa3d29d6c09229.xdr b/test-lcm-next/InvokeHostFunctionTests/c6fa3d29d6c09229.xdr new file mode 100644 index 0000000000..5caaa506a3 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/c6fa3d29d6c09229.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/c89523486b59f106.xdr b/test-lcm-next/InvokeHostFunctionTests/c89523486b59f106.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/c89523486b59f106.xdr and b/test-lcm-next/InvokeHostFunctionTests/c89523486b59f106.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/c8b43ab94c4aada0.xdr b/test-lcm-next/InvokeHostFunctionTests/c8b43ab94c4aada0.xdr index cc0eaefb9d..ca2bbefb4c 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/c8b43ab94c4aada0.xdr and b/test-lcm-next/InvokeHostFunctionTests/c8b43ab94c4aada0.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/c8de372c41ca8c93.xdr b/test-lcm-next/InvokeHostFunctionTests/c8de372c41ca8c93.xdr new file mode 100644 index 0000000000..9987e5fdc0 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/c8de372c41ca8c93.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/c8f28ce0094c5916.xdr b/test-lcm-next/InvokeHostFunctionTests/c8f28ce0094c5916.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/c8f28ce0094c5916.xdr and b/test-lcm-next/InvokeHostFunctionTests/c8f28ce0094c5916.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/c91fd23bca6a56a0.xdr b/test-lcm-next/InvokeHostFunctionTests/c91fd23bca6a56a0.xdr new file mode 100644 index 0000000000..123466ff95 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/c91fd23bca6a56a0.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/c922fea348665a87.xdr b/test-lcm-next/InvokeHostFunctionTests/c922fea348665a87.xdr index 8171a75e18..e957188600 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/c922fea348665a87.xdr and b/test-lcm-next/InvokeHostFunctionTests/c922fea348665a87.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/c9844b91db3ef0b0.xdr b/test-lcm-next/InvokeHostFunctionTests/c9844b91db3ef0b0.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/c9844b91db3ef0b0.xdr and b/test-lcm-next/InvokeHostFunctionTests/c9844b91db3ef0b0.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/c99364d18b82557b.xdr b/test-lcm-next/InvokeHostFunctionTests/c99364d18b82557b.xdr index 7ccd38b1b0..1b09918420 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/c99364d18b82557b.xdr and b/test-lcm-next/InvokeHostFunctionTests/c99364d18b82557b.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/c99ea4a349fa4865.xdr b/test-lcm-next/InvokeHostFunctionTests/c99ea4a349fa4865.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/c99ea4a349fa4865.xdr and b/test-lcm-next/InvokeHostFunctionTests/c99ea4a349fa4865.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/c9a9eaa405e6134c.xdr b/test-lcm-next/InvokeHostFunctionTests/c9a9eaa405e6134c.xdr index c28ce5b28e..269cb40453 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/c9a9eaa405e6134c.xdr and b/test-lcm-next/InvokeHostFunctionTests/c9a9eaa405e6134c.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/c9dbd32afe107afb.xdr b/test-lcm-next/InvokeHostFunctionTests/c9dbd32afe107afb.xdr index 7ed5f4bdcf..67399a02ae 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/c9dbd32afe107afb.xdr and b/test-lcm-next/InvokeHostFunctionTests/c9dbd32afe107afb.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/c9eca15bdeb9bf48.xdr b/test-lcm-next/InvokeHostFunctionTests/c9eca15bdeb9bf48.xdr index 26186977bc..14c6342b3c 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/c9eca15bdeb9bf48.xdr and b/test-lcm-next/InvokeHostFunctionTests/c9eca15bdeb9bf48.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/c9f9a266e693ab37.xdr b/test-lcm-next/InvokeHostFunctionTests/c9f9a266e693ab37.xdr new file mode 100644 index 0000000000..5a5e82fb8d Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/c9f9a266e693ab37.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/ca44bb06db470a22.xdr b/test-lcm-next/InvokeHostFunctionTests/ca44bb06db470a22.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/ca44bb06db470a22.xdr and b/test-lcm-next/InvokeHostFunctionTests/ca44bb06db470a22.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/ca81ee3779279e5f.xdr b/test-lcm-next/InvokeHostFunctionTests/ca81ee3779279e5f.xdr index 653259f501..44e197d3af 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/ca81ee3779279e5f.xdr and b/test-lcm-next/InvokeHostFunctionTests/ca81ee3779279e5f.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/ca96297c5d814422.xdr b/test-lcm-next/InvokeHostFunctionTests/ca96297c5d814422.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/ca96297c5d814422.xdr and b/test-lcm-next/InvokeHostFunctionTests/ca96297c5d814422.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/cab764de9b6ee4b7.xdr b/test-lcm-next/InvokeHostFunctionTests/cab764de9b6ee4b7.xdr index 4b4ffe356e..808069d21b 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/cab764de9b6ee4b7.xdr and b/test-lcm-next/InvokeHostFunctionTests/cab764de9b6ee4b7.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/cb9097b6c1c38bdd.xdr b/test-lcm-next/InvokeHostFunctionTests/cb9097b6c1c38bdd.xdr index 4b2c37365e..e6360da506 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/cb9097b6c1c38bdd.xdr and b/test-lcm-next/InvokeHostFunctionTests/cb9097b6c1c38bdd.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/cc952a3d07337931.xdr b/test-lcm-next/InvokeHostFunctionTests/cc952a3d07337931.xdr index b466593b7c..1be0aab350 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/cc952a3d07337931.xdr and b/test-lcm-next/InvokeHostFunctionTests/cc952a3d07337931.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/cd9b67cc851ef13d.xdr b/test-lcm-next/InvokeHostFunctionTests/cd9b67cc851ef13d.xdr index 4386db7c4e..b4240ef5d0 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/cd9b67cc851ef13d.xdr and b/test-lcm-next/InvokeHostFunctionTests/cd9b67cc851ef13d.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/cdc0fbbed34915f1.xdr b/test-lcm-next/InvokeHostFunctionTests/cdc0fbbed34915f1.xdr index 83fe501d88..c6b81de4d6 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/cdc0fbbed34915f1.xdr and b/test-lcm-next/InvokeHostFunctionTests/cdc0fbbed34915f1.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/ce5735da86b32673.xdr b/test-lcm-next/InvokeHostFunctionTests/ce5735da86b32673.xdr index 8925b7a753..c8aaed68e0 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/ce5735da86b32673.xdr and b/test-lcm-next/InvokeHostFunctionTests/ce5735da86b32673.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/ce670ea1968c6dd3.xdr b/test-lcm-next/InvokeHostFunctionTests/ce670ea1968c6dd3.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/ce670ea1968c6dd3.xdr and b/test-lcm-next/InvokeHostFunctionTests/ce670ea1968c6dd3.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/cebea90af92b39d2.xdr b/test-lcm-next/InvokeHostFunctionTests/cebea90af92b39d2.xdr index 460308cb06..dcc3962e2d 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/cebea90af92b39d2.xdr and b/test-lcm-next/InvokeHostFunctionTests/cebea90af92b39d2.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/ced5e149f8263218.xdr b/test-lcm-next/InvokeHostFunctionTests/ced5e149f8263218.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/ced5e149f8263218.xdr and b/test-lcm-next/InvokeHostFunctionTests/ced5e149f8263218.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/cf226151fb04c10f.xdr b/test-lcm-next/InvokeHostFunctionTests/cf226151fb04c10f.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/cf226151fb04c10f.xdr and b/test-lcm-next/InvokeHostFunctionTests/cf226151fb04c10f.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/cf2d86dd85a2417a.xdr b/test-lcm-next/InvokeHostFunctionTests/cf2d86dd85a2417a.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/cf2d86dd85a2417a.xdr and b/test-lcm-next/InvokeHostFunctionTests/cf2d86dd85a2417a.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/cf339a74cb38c15b.xdr b/test-lcm-next/InvokeHostFunctionTests/cf339a74cb38c15b.xdr index 582a67db31..e947918dda 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/cf339a74cb38c15b.xdr and b/test-lcm-next/InvokeHostFunctionTests/cf339a74cb38c15b.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/d10f1da9f73be05f.xdr b/test-lcm-next/InvokeHostFunctionTests/d10f1da9f73be05f.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/d10f1da9f73be05f.xdr and b/test-lcm-next/InvokeHostFunctionTests/d10f1da9f73be05f.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/d1522d4667822bc2.xdr b/test-lcm-next/InvokeHostFunctionTests/d1522d4667822bc2.xdr index 676ff4e8cc..e63c408140 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/d1522d4667822bc2.xdr and b/test-lcm-next/InvokeHostFunctionTests/d1522d4667822bc2.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/d152ab0bc07cb1d1.xdr b/test-lcm-next/InvokeHostFunctionTests/d152ab0bc07cb1d1.xdr new file mode 100644 index 0000000000..553d9415e5 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/d152ab0bc07cb1d1.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/d15d2c79a5a0afad.xdr b/test-lcm-next/InvokeHostFunctionTests/d15d2c79a5a0afad.xdr index acb5cdfc79..1ecf5cf14d 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/d15d2c79a5a0afad.xdr and b/test-lcm-next/InvokeHostFunctionTests/d15d2c79a5a0afad.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/d192ab90b43eeb6a.xdr b/test-lcm-next/InvokeHostFunctionTests/d192ab90b43eeb6a.xdr index f7b922099a..97b8fbb960 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/d192ab90b43eeb6a.xdr and b/test-lcm-next/InvokeHostFunctionTests/d192ab90b43eeb6a.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/d20703fbc5a3ceaf.xdr b/test-lcm-next/InvokeHostFunctionTests/d20703fbc5a3ceaf.xdr new file mode 100644 index 0000000000..763575be69 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/d20703fbc5a3ceaf.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/d2284024d86a9f4a.xdr b/test-lcm-next/InvokeHostFunctionTests/d2284024d86a9f4a.xdr index 962d349b3d..adb3966ee6 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/d2284024d86a9f4a.xdr and b/test-lcm-next/InvokeHostFunctionTests/d2284024d86a9f4a.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/d312c2e2a5a50ba8.xdr b/test-lcm-next/InvokeHostFunctionTests/d312c2e2a5a50ba8.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/d312c2e2a5a50ba8.xdr and b/test-lcm-next/InvokeHostFunctionTests/d312c2e2a5a50ba8.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/d3b018e3b25cc49e.xdr b/test-lcm-next/InvokeHostFunctionTests/d3b018e3b25cc49e.xdr new file mode 100644 index 0000000000..f9e6be1058 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/d3b018e3b25cc49e.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/d3ee1065ef42391b.xdr b/test-lcm-next/InvokeHostFunctionTests/d3ee1065ef42391b.xdr index 2d6674fec7..64a4d222e4 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/d3ee1065ef42391b.xdr and b/test-lcm-next/InvokeHostFunctionTests/d3ee1065ef42391b.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/d3fa9dd1a7ce68e3.xdr b/test-lcm-next/InvokeHostFunctionTests/d3fa9dd1a7ce68e3.xdr index 84f5bf048f..c414228e2a 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/d3fa9dd1a7ce68e3.xdr and b/test-lcm-next/InvokeHostFunctionTests/d3fa9dd1a7ce68e3.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/d481fd33556741b2.xdr b/test-lcm-next/InvokeHostFunctionTests/d481fd33556741b2.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/d481fd33556741b2.xdr and b/test-lcm-next/InvokeHostFunctionTests/d481fd33556741b2.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/d4d73e492b2aa30e.xdr b/test-lcm-next/InvokeHostFunctionTests/d4d73e492b2aa30e.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/d4d73e492b2aa30e.xdr and b/test-lcm-next/InvokeHostFunctionTests/d4d73e492b2aa30e.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/d4e4024caa6dbbc4.xdr b/test-lcm-next/InvokeHostFunctionTests/d4e4024caa6dbbc4.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/d4e4024caa6dbbc4.xdr and b/test-lcm-next/InvokeHostFunctionTests/d4e4024caa6dbbc4.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/d580226d468cd36a.xdr b/test-lcm-next/InvokeHostFunctionTests/d580226d468cd36a.xdr index 8c4bcdc52d..b93274322d 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/d580226d468cd36a.xdr and b/test-lcm-next/InvokeHostFunctionTests/d580226d468cd36a.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/d5d3d3dd818a7366.xdr b/test-lcm-next/InvokeHostFunctionTests/d5d3d3dd818a7366.xdr index 64bc0f25cf..35ee80ae15 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/d5d3d3dd818a7366.xdr and b/test-lcm-next/InvokeHostFunctionTests/d5d3d3dd818a7366.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/d604f76431c95e5e.xdr b/test-lcm-next/InvokeHostFunctionTests/d604f76431c95e5e.xdr index 4aa556df72..529ae92b9d 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/d604f76431c95e5e.xdr and b/test-lcm-next/InvokeHostFunctionTests/d604f76431c95e5e.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/d697bb21e32f6aef.xdr b/test-lcm-next/InvokeHostFunctionTests/d697bb21e32f6aef.xdr index a230da2d83..d6b5f11586 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/d697bb21e32f6aef.xdr and b/test-lcm-next/InvokeHostFunctionTests/d697bb21e32f6aef.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/d70144007a3516e6.xdr b/test-lcm-next/InvokeHostFunctionTests/d70144007a3516e6.xdr new file mode 100644 index 0000000000..934fa6c7ef Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/d70144007a3516e6.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/d7ea63b86adedc73.xdr b/test-lcm-next/InvokeHostFunctionTests/d7ea63b86adedc73.xdr index e83b7155ea..5f244546f7 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/d7ea63b86adedc73.xdr and b/test-lcm-next/InvokeHostFunctionTests/d7ea63b86adedc73.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/d8cb2c3e8c67a529.xdr b/test-lcm-next/InvokeHostFunctionTests/d8cb2c3e8c67a529.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/d8cb2c3e8c67a529.xdr and b/test-lcm-next/InvokeHostFunctionTests/d8cb2c3e8c67a529.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/d927cb7228c4823f.xdr b/test-lcm-next/InvokeHostFunctionTests/d927cb7228c4823f.xdr index cbf8d338b6..d103cc0e6d 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/d927cb7228c4823f.xdr and b/test-lcm-next/InvokeHostFunctionTests/d927cb7228c4823f.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/da22a08dbb5b6591.xdr b/test-lcm-next/InvokeHostFunctionTests/da22a08dbb5b6591.xdr index d5b6c04e2a..04b4b0a8ee 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/da22a08dbb5b6591.xdr and b/test-lcm-next/InvokeHostFunctionTests/da22a08dbb5b6591.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/da9288450114401d.xdr b/test-lcm-next/InvokeHostFunctionTests/da9288450114401d.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/da9288450114401d.xdr and b/test-lcm-next/InvokeHostFunctionTests/da9288450114401d.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/daba09f2a05761a7.xdr b/test-lcm-next/InvokeHostFunctionTests/daba09f2a05761a7.xdr new file mode 100644 index 0000000000..f0e713ee27 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/daba09f2a05761a7.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/dbade792400bbd36.xdr b/test-lcm-next/InvokeHostFunctionTests/dbade792400bbd36.xdr index 84771915ed..3b71408909 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/dbade792400bbd36.xdr and b/test-lcm-next/InvokeHostFunctionTests/dbade792400bbd36.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/dbe020e6910c1bb8.xdr b/test-lcm-next/InvokeHostFunctionTests/dbe020e6910c1bb8.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/dbe020e6910c1bb8.xdr and b/test-lcm-next/InvokeHostFunctionTests/dbe020e6910c1bb8.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/dc8cff5869997641.xdr b/test-lcm-next/InvokeHostFunctionTests/dc8cff5869997641.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/dc8cff5869997641.xdr and b/test-lcm-next/InvokeHostFunctionTests/dc8cff5869997641.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/dcc73c9629f5a427.xdr b/test-lcm-next/InvokeHostFunctionTests/dcc73c9629f5a427.xdr index 9c9d964a95..a31da25034 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/dcc73c9629f5a427.xdr and b/test-lcm-next/InvokeHostFunctionTests/dcc73c9629f5a427.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/de0050023d54734e.xdr b/test-lcm-next/InvokeHostFunctionTests/de0050023d54734e.xdr new file mode 100644 index 0000000000..1ecdaf98ab Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/de0050023d54734e.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/deaef712a256815b.xdr b/test-lcm-next/InvokeHostFunctionTests/deaef712a256815b.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/deaef712a256815b.xdr and b/test-lcm-next/InvokeHostFunctionTests/deaef712a256815b.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/debccecc0064889e.xdr b/test-lcm-next/InvokeHostFunctionTests/debccecc0064889e.xdr index 37f652a0c8..4ba4e2112f 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/debccecc0064889e.xdr and b/test-lcm-next/InvokeHostFunctionTests/debccecc0064889e.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/df8ad69b2e875c3e.xdr b/test-lcm-next/InvokeHostFunctionTests/df8ad69b2e875c3e.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/df8ad69b2e875c3e.xdr and b/test-lcm-next/InvokeHostFunctionTests/df8ad69b2e875c3e.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/dfd8d97545a410c4.xdr b/test-lcm-next/InvokeHostFunctionTests/dfd8d97545a410c4.xdr index 54b44b363e..e233962f85 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/dfd8d97545a410c4.xdr and b/test-lcm-next/InvokeHostFunctionTests/dfd8d97545a410c4.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/e0180b51b72fe65a.xdr b/test-lcm-next/InvokeHostFunctionTests/e0180b51b72fe65a.xdr index fc40f58fc3..0c83ff0de1 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/e0180b51b72fe65a.xdr and b/test-lcm-next/InvokeHostFunctionTests/e0180b51b72fe65a.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/e095dd79e65ba973.xdr b/test-lcm-next/InvokeHostFunctionTests/e095dd79e65ba973.xdr index 1ca9bc40e3..c5898a70ec 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/e095dd79e65ba973.xdr and b/test-lcm-next/InvokeHostFunctionTests/e095dd79e65ba973.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/e17007564165c691.xdr b/test-lcm-next/InvokeHostFunctionTests/e17007564165c691.xdr index 40d1d1e695..4e7e0e26c4 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/e17007564165c691.xdr and b/test-lcm-next/InvokeHostFunctionTests/e17007564165c691.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/e1b3a1546fcd4160.xdr b/test-lcm-next/InvokeHostFunctionTests/e1b3a1546fcd4160.xdr index a1ecac7b93..906eeb0211 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/e1b3a1546fcd4160.xdr and b/test-lcm-next/InvokeHostFunctionTests/e1b3a1546fcd4160.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/e1bbd873f50bb8a5.xdr b/test-lcm-next/InvokeHostFunctionTests/e1bbd873f50bb8a5.xdr index 8a88e08581..7ba709981f 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/e1bbd873f50bb8a5.xdr and b/test-lcm-next/InvokeHostFunctionTests/e1bbd873f50bb8a5.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/e1c9fd2d21f89d7e.xdr b/test-lcm-next/InvokeHostFunctionTests/e1c9fd2d21f89d7e.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/e1c9fd2d21f89d7e.xdr and b/test-lcm-next/InvokeHostFunctionTests/e1c9fd2d21f89d7e.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/e1ecfe4848d7c257.xdr b/test-lcm-next/InvokeHostFunctionTests/e1ecfe4848d7c257.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/e1ecfe4848d7c257.xdr and b/test-lcm-next/InvokeHostFunctionTests/e1ecfe4848d7c257.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/e260a8f0f8749e3c.xdr b/test-lcm-next/InvokeHostFunctionTests/e260a8f0f8749e3c.xdr index 153d38cd6a..0e19da6360 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/e260a8f0f8749e3c.xdr and b/test-lcm-next/InvokeHostFunctionTests/e260a8f0f8749e3c.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/e267116f1684f812.xdr b/test-lcm-next/InvokeHostFunctionTests/e267116f1684f812.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/e267116f1684f812.xdr and b/test-lcm-next/InvokeHostFunctionTests/e267116f1684f812.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/e26ad1849453e9f9.xdr b/test-lcm-next/InvokeHostFunctionTests/e26ad1849453e9f9.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/e26ad1849453e9f9.xdr and b/test-lcm-next/InvokeHostFunctionTests/e26ad1849453e9f9.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/e2df180a92959730.xdr b/test-lcm-next/InvokeHostFunctionTests/e2df180a92959730.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/e2df180a92959730.xdr and b/test-lcm-next/InvokeHostFunctionTests/e2df180a92959730.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/e436eae1b108bf65.xdr b/test-lcm-next/InvokeHostFunctionTests/e436eae1b108bf65.xdr index 4e3e102b2c..5f3687f32c 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/e436eae1b108bf65.xdr and b/test-lcm-next/InvokeHostFunctionTests/e436eae1b108bf65.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/e4a693d475f137c9.xdr b/test-lcm-next/InvokeHostFunctionTests/e4a693d475f137c9.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/e4a693d475f137c9.xdr and b/test-lcm-next/InvokeHostFunctionTests/e4a693d475f137c9.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/e4b75527318c3f4b.xdr b/test-lcm-next/InvokeHostFunctionTests/e4b75527318c3f4b.xdr index e1760e4fde..76f5ac0e12 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/e4b75527318c3f4b.xdr and b/test-lcm-next/InvokeHostFunctionTests/e4b75527318c3f4b.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/e4f05a1dabec0d59.xdr b/test-lcm-next/InvokeHostFunctionTests/e4f05a1dabec0d59.xdr new file mode 100644 index 0000000000..1142480671 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/e4f05a1dabec0d59.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/e592b8e0d0c064f2.xdr b/test-lcm-next/InvokeHostFunctionTests/e592b8e0d0c064f2.xdr index f4afef31cc..68522e2dbf 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/e592b8e0d0c064f2.xdr and b/test-lcm-next/InvokeHostFunctionTests/e592b8e0d0c064f2.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/e595ac8447e8be48.xdr b/test-lcm-next/InvokeHostFunctionTests/e595ac8447e8be48.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/e595ac8447e8be48.xdr and b/test-lcm-next/InvokeHostFunctionTests/e595ac8447e8be48.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/e65bc9d3ad40b232.xdr b/test-lcm-next/InvokeHostFunctionTests/e65bc9d3ad40b232.xdr index 14992c7ae7..41dc048c89 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/e65bc9d3ad40b232.xdr and b/test-lcm-next/InvokeHostFunctionTests/e65bc9d3ad40b232.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/e663576331e88873.xdr b/test-lcm-next/InvokeHostFunctionTests/e663576331e88873.xdr index e200b5d3ea..24dce7b085 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/e663576331e88873.xdr and b/test-lcm-next/InvokeHostFunctionTests/e663576331e88873.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/e668e4a1eb385caf.xdr b/test-lcm-next/InvokeHostFunctionTests/e668e4a1eb385caf.xdr index 569374713a..5b95ebd728 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/e668e4a1eb385caf.xdr and b/test-lcm-next/InvokeHostFunctionTests/e668e4a1eb385caf.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/e6bd97c7e61b9c20.xdr b/test-lcm-next/InvokeHostFunctionTests/e6bd97c7e61b9c20.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/e6bd97c7e61b9c20.xdr and b/test-lcm-next/InvokeHostFunctionTests/e6bd97c7e61b9c20.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/e7c93b4b2532635a.xdr b/test-lcm-next/InvokeHostFunctionTests/e7c93b4b2532635a.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/e7c93b4b2532635a.xdr and b/test-lcm-next/InvokeHostFunctionTests/e7c93b4b2532635a.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/e847e07471896a84.xdr b/test-lcm-next/InvokeHostFunctionTests/e847e07471896a84.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/e847e07471896a84.xdr and b/test-lcm-next/InvokeHostFunctionTests/e847e07471896a84.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/e970c80dd6512e2a.xdr b/test-lcm-next/InvokeHostFunctionTests/e970c80dd6512e2a.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/e970c80dd6512e2a.xdr and b/test-lcm-next/InvokeHostFunctionTests/e970c80dd6512e2a.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/e978d88c40ed87f1.xdr b/test-lcm-next/InvokeHostFunctionTests/e978d88c40ed87f1.xdr index 263c1616e7..eab03337ff 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/e978d88c40ed87f1.xdr and b/test-lcm-next/InvokeHostFunctionTests/e978d88c40ed87f1.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/e999346808076671.xdr b/test-lcm-next/InvokeHostFunctionTests/e999346808076671.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/e999346808076671.xdr and b/test-lcm-next/InvokeHostFunctionTests/e999346808076671.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/e9d3d132208dd2f6.xdr b/test-lcm-next/InvokeHostFunctionTests/e9d3d132208dd2f6.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/e9d3d132208dd2f6.xdr and b/test-lcm-next/InvokeHostFunctionTests/e9d3d132208dd2f6.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/ea940d6997fea54c.xdr b/test-lcm-next/InvokeHostFunctionTests/ea940d6997fea54c.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/ea940d6997fea54c.xdr and b/test-lcm-next/InvokeHostFunctionTests/ea940d6997fea54c.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/eaa4c6f56373a470.xdr b/test-lcm-next/InvokeHostFunctionTests/eaa4c6f56373a470.xdr index a5822a2ca2..48e7270ee8 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/eaa4c6f56373a470.xdr and b/test-lcm-next/InvokeHostFunctionTests/eaa4c6f56373a470.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/eadfba1154674062.xdr b/test-lcm-next/InvokeHostFunctionTests/eadfba1154674062.xdr index ac08bea77d..7825d4ea43 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/eadfba1154674062.xdr and b/test-lcm-next/InvokeHostFunctionTests/eadfba1154674062.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/ec228ae524fb95c9.xdr b/test-lcm-next/InvokeHostFunctionTests/ec228ae524fb95c9.xdr new file mode 100644 index 0000000000..e9aca120e4 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/ec228ae524fb95c9.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/ec29598b16b053bc.xdr b/test-lcm-next/InvokeHostFunctionTests/ec29598b16b053bc.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/ec29598b16b053bc.xdr and b/test-lcm-next/InvokeHostFunctionTests/ec29598b16b053bc.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/ecd35a6539ca78d9.xdr b/test-lcm-next/InvokeHostFunctionTests/ecd35a6539ca78d9.xdr index f9faac70c8..66b830a3f8 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/ecd35a6539ca78d9.xdr and b/test-lcm-next/InvokeHostFunctionTests/ecd35a6539ca78d9.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/ecee0b3efb0526e4.xdr b/test-lcm-next/InvokeHostFunctionTests/ecee0b3efb0526e4.xdr index 50119f220e..150571219d 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/ecee0b3efb0526e4.xdr and b/test-lcm-next/InvokeHostFunctionTests/ecee0b3efb0526e4.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/ed348cde4f3127e8.xdr b/test-lcm-next/InvokeHostFunctionTests/ed348cde4f3127e8.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/ed348cde4f3127e8.xdr and b/test-lcm-next/InvokeHostFunctionTests/ed348cde4f3127e8.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/ed39ca2daf59835d.xdr b/test-lcm-next/InvokeHostFunctionTests/ed39ca2daf59835d.xdr index 41a236224c..5be8b00c92 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/ed39ca2daf59835d.xdr and b/test-lcm-next/InvokeHostFunctionTests/ed39ca2daf59835d.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/ed4083446fa69ab7.xdr b/test-lcm-next/InvokeHostFunctionTests/ed4083446fa69ab7.xdr index a1cf443c9b..6dc283300f 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/ed4083446fa69ab7.xdr and b/test-lcm-next/InvokeHostFunctionTests/ed4083446fa69ab7.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/ed458e0fae1f87be.xdr b/test-lcm-next/InvokeHostFunctionTests/ed458e0fae1f87be.xdr new file mode 100644 index 0000000000..d8f555f0ec Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/ed458e0fae1f87be.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/eda22224ec5ac6ea.xdr b/test-lcm-next/InvokeHostFunctionTests/eda22224ec5ac6ea.xdr index c751f8cbbc..50c4d657e7 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/eda22224ec5ac6ea.xdr and b/test-lcm-next/InvokeHostFunctionTests/eda22224ec5ac6ea.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/eda3dfe5b6940848.xdr b/test-lcm-next/InvokeHostFunctionTests/eda3dfe5b6940848.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/eda3dfe5b6940848.xdr and b/test-lcm-next/InvokeHostFunctionTests/eda3dfe5b6940848.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/eda811ebbd672d8d.xdr b/test-lcm-next/InvokeHostFunctionTests/eda811ebbd672d8d.xdr index 1517f72983..0f7b22bf59 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/eda811ebbd672d8d.xdr and b/test-lcm-next/InvokeHostFunctionTests/eda811ebbd672d8d.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/edeef19bce43c3da.xdr b/test-lcm-next/InvokeHostFunctionTests/edeef19bce43c3da.xdr index ff040a49af..4a34886e40 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/edeef19bce43c3da.xdr and b/test-lcm-next/InvokeHostFunctionTests/edeef19bce43c3da.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/ee0f9fb5465b72ad.xdr b/test-lcm-next/InvokeHostFunctionTests/ee0f9fb5465b72ad.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/ee0f9fb5465b72ad.xdr and b/test-lcm-next/InvokeHostFunctionTests/ee0f9fb5465b72ad.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/ee277035f023392a.xdr b/test-lcm-next/InvokeHostFunctionTests/ee277035f023392a.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/ee277035f023392a.xdr and b/test-lcm-next/InvokeHostFunctionTests/ee277035f023392a.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/ee2f02eb252fcc27.xdr b/test-lcm-next/InvokeHostFunctionTests/ee2f02eb252fcc27.xdr index 5dce8ae903..c057665cc9 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/ee2f02eb252fcc27.xdr and b/test-lcm-next/InvokeHostFunctionTests/ee2f02eb252fcc27.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/ee3472dd29024e40.xdr b/test-lcm-next/InvokeHostFunctionTests/ee3472dd29024e40.xdr index 6ccb31f184..52f6888c5f 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/ee3472dd29024e40.xdr and b/test-lcm-next/InvokeHostFunctionTests/ee3472dd29024e40.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/eee17f706f7deb9a.xdr b/test-lcm-next/InvokeHostFunctionTests/eee17f706f7deb9a.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/eee17f706f7deb9a.xdr and b/test-lcm-next/InvokeHostFunctionTests/eee17f706f7deb9a.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/ef37aff90281f523.xdr b/test-lcm-next/InvokeHostFunctionTests/ef37aff90281f523.xdr index 4c0652b7ad..509a36c6aa 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/ef37aff90281f523.xdr and b/test-lcm-next/InvokeHostFunctionTests/ef37aff90281f523.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/ef79595a3c250a3a.xdr b/test-lcm-next/InvokeHostFunctionTests/ef79595a3c250a3a.xdr index 181493d2d5..e8b1a019f0 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/ef79595a3c250a3a.xdr and b/test-lcm-next/InvokeHostFunctionTests/ef79595a3c250a3a.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/ef80e6a78893c56c.xdr b/test-lcm-next/InvokeHostFunctionTests/ef80e6a78893c56c.xdr index 97a5f208c0..a6a047b18e 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/ef80e6a78893c56c.xdr and b/test-lcm-next/InvokeHostFunctionTests/ef80e6a78893c56c.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/efc0bd51b5b29e40.xdr b/test-lcm-next/InvokeHostFunctionTests/efc0bd51b5b29e40.xdr index 42bc9f106d..3dfd14c5f4 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/efc0bd51b5b29e40.xdr and b/test-lcm-next/InvokeHostFunctionTests/efc0bd51b5b29e40.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/efd47464023e9e55.xdr b/test-lcm-next/InvokeHostFunctionTests/efd47464023e9e55.xdr index 1f6b2c611d..882f4ac515 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/efd47464023e9e55.xdr and b/test-lcm-next/InvokeHostFunctionTests/efd47464023e9e55.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/efe4261cc946881e.xdr b/test-lcm-next/InvokeHostFunctionTests/efe4261cc946881e.xdr index 157307f459..dda1ddbfd8 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/efe4261cc946881e.xdr and b/test-lcm-next/InvokeHostFunctionTests/efe4261cc946881e.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/f0638599b34ec8a1.xdr b/test-lcm-next/InvokeHostFunctionTests/f0638599b34ec8a1.xdr index 1e898c7de3..4f4cb9e03c 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/f0638599b34ec8a1.xdr and b/test-lcm-next/InvokeHostFunctionTests/f0638599b34ec8a1.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/f0e8fbaf2d4bdbcd.xdr b/test-lcm-next/InvokeHostFunctionTests/f0e8fbaf2d4bdbcd.xdr index 0b5f412f35..e0a82fcae9 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/f0e8fbaf2d4bdbcd.xdr and b/test-lcm-next/InvokeHostFunctionTests/f0e8fbaf2d4bdbcd.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/f168c76aba835145.xdr b/test-lcm-next/InvokeHostFunctionTests/f168c76aba835145.xdr index 9c818b48fb..c1c8bd9ffe 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/f168c76aba835145.xdr and b/test-lcm-next/InvokeHostFunctionTests/f168c76aba835145.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/f17be5b4b66ea006.xdr b/test-lcm-next/InvokeHostFunctionTests/f17be5b4b66ea006.xdr index 18f7ed9f08..705ac283f0 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/f17be5b4b66ea006.xdr and b/test-lcm-next/InvokeHostFunctionTests/f17be5b4b66ea006.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/f1b13fa29eb12ca4.xdr b/test-lcm-next/InvokeHostFunctionTests/f1b13fa29eb12ca4.xdr index c090aeb882..bea99bb592 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/f1b13fa29eb12ca4.xdr and b/test-lcm-next/InvokeHostFunctionTests/f1b13fa29eb12ca4.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/f1fc663779e87b60.xdr b/test-lcm-next/InvokeHostFunctionTests/f1fc663779e87b60.xdr index ec49395e03..db9f5a1c09 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/f1fc663779e87b60.xdr and b/test-lcm-next/InvokeHostFunctionTests/f1fc663779e87b60.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/f26b5de9280bbacd.xdr b/test-lcm-next/InvokeHostFunctionTests/f26b5de9280bbacd.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/f26b5de9280bbacd.xdr and b/test-lcm-next/InvokeHostFunctionTests/f26b5de9280bbacd.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/f27c6aef8abbd723.xdr b/test-lcm-next/InvokeHostFunctionTests/f27c6aef8abbd723.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/f27c6aef8abbd723.xdr and b/test-lcm-next/InvokeHostFunctionTests/f27c6aef8abbd723.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/f287aa63bbdb6ba8.xdr b/test-lcm-next/InvokeHostFunctionTests/f287aa63bbdb6ba8.xdr index a89b93d472..4ceb45f1c9 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/f287aa63bbdb6ba8.xdr and b/test-lcm-next/InvokeHostFunctionTests/f287aa63bbdb6ba8.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/f2cef3f027b2550b.xdr b/test-lcm-next/InvokeHostFunctionTests/f2cef3f027b2550b.xdr new file mode 100644 index 0000000000..1e8b4281e5 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/f2cef3f027b2550b.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/f2d73eb7f022f0cb.xdr b/test-lcm-next/InvokeHostFunctionTests/f2d73eb7f022f0cb.xdr index ab6f0276dc..52d7e7a1a2 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/f2d73eb7f022f0cb.xdr and b/test-lcm-next/InvokeHostFunctionTests/f2d73eb7f022f0cb.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/f2eb7607bcc37fbb.xdr b/test-lcm-next/InvokeHostFunctionTests/f2eb7607bcc37fbb.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/f2eb7607bcc37fbb.xdr and b/test-lcm-next/InvokeHostFunctionTests/f2eb7607bcc37fbb.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/f3230f7682e7de69.xdr b/test-lcm-next/InvokeHostFunctionTests/f3230f7682e7de69.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/f3230f7682e7de69.xdr and b/test-lcm-next/InvokeHostFunctionTests/f3230f7682e7de69.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/f43fbd97002badc6.xdr b/test-lcm-next/InvokeHostFunctionTests/f43fbd97002badc6.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/f43fbd97002badc6.xdr and b/test-lcm-next/InvokeHostFunctionTests/f43fbd97002badc6.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/f4920266273226bc.xdr b/test-lcm-next/InvokeHostFunctionTests/f4920266273226bc.xdr new file mode 100644 index 0000000000..dea4ca07db Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/f4920266273226bc.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/f4f351372abade91.xdr b/test-lcm-next/InvokeHostFunctionTests/f4f351372abade91.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/f4f351372abade91.xdr and b/test-lcm-next/InvokeHostFunctionTests/f4f351372abade91.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/f506528d32fd0652.xdr b/test-lcm-next/InvokeHostFunctionTests/f506528d32fd0652.xdr index d890fbafd0..e0a869e660 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/f506528d32fd0652.xdr and b/test-lcm-next/InvokeHostFunctionTests/f506528d32fd0652.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/f538b7222e421b51.xdr b/test-lcm-next/InvokeHostFunctionTests/f538b7222e421b51.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/f538b7222e421b51.xdr and b/test-lcm-next/InvokeHostFunctionTests/f538b7222e421b51.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/f57219130594aa83.xdr b/test-lcm-next/InvokeHostFunctionTests/f57219130594aa83.xdr index 7fb40040e4..7c4d70d5a5 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/f57219130594aa83.xdr and b/test-lcm-next/InvokeHostFunctionTests/f57219130594aa83.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/f5d072a9fb1463da.xdr b/test-lcm-next/InvokeHostFunctionTests/f5d072a9fb1463da.xdr index 1bdd32355a..e4b1830ebf 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/f5d072a9fb1463da.xdr and b/test-lcm-next/InvokeHostFunctionTests/f5d072a9fb1463da.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/f639c592b8caf7eb.xdr b/test-lcm-next/InvokeHostFunctionTests/f639c592b8caf7eb.xdr new file mode 100644 index 0000000000..62742f84c3 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/f639c592b8caf7eb.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/f7ca893de81e0719.xdr b/test-lcm-next/InvokeHostFunctionTests/f7ca893de81e0719.xdr index 319ea0012f..2d16d6a036 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/f7ca893de81e0719.xdr and b/test-lcm-next/InvokeHostFunctionTests/f7ca893de81e0719.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/f7e97011ed711385.xdr b/test-lcm-next/InvokeHostFunctionTests/f7e97011ed711385.xdr index d32d68cf2f..f1995d8a1a 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/f7e97011ed711385.xdr and b/test-lcm-next/InvokeHostFunctionTests/f7e97011ed711385.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/f7f94eb704afa841.xdr b/test-lcm-next/InvokeHostFunctionTests/f7f94eb704afa841.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/f7f94eb704afa841.xdr and b/test-lcm-next/InvokeHostFunctionTests/f7f94eb704afa841.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/f80ab46aebfceee5.xdr b/test-lcm-next/InvokeHostFunctionTests/f80ab46aebfceee5.xdr index 2d70ad6a6a..b98c7250f3 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/f80ab46aebfceee5.xdr and b/test-lcm-next/InvokeHostFunctionTests/f80ab46aebfceee5.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/f85719dc2181f545.xdr b/test-lcm-next/InvokeHostFunctionTests/f85719dc2181f545.xdr index 645d6b74d1..461b841ef7 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/f85719dc2181f545.xdr and b/test-lcm-next/InvokeHostFunctionTests/f85719dc2181f545.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/f860f4c299f7c690.xdr b/test-lcm-next/InvokeHostFunctionTests/f860f4c299f7c690.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/f860f4c299f7c690.xdr and b/test-lcm-next/InvokeHostFunctionTests/f860f4c299f7c690.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/f8630c82e2e21ee3.xdr b/test-lcm-next/InvokeHostFunctionTests/f8630c82e2e21ee3.xdr index 69ac4da83c..d1e9fce77e 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/f8630c82e2e21ee3.xdr and b/test-lcm-next/InvokeHostFunctionTests/f8630c82e2e21ee3.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/f8b28b729df1dbc2.xdr b/test-lcm-next/InvokeHostFunctionTests/f8b28b729df1dbc2.xdr new file mode 100644 index 0000000000..836e57e518 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/f8b28b729df1dbc2.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/f98d63a422dc7316.xdr b/test-lcm-next/InvokeHostFunctionTests/f98d63a422dc7316.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/f98d63a422dc7316.xdr and b/test-lcm-next/InvokeHostFunctionTests/f98d63a422dc7316.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/fa2ba8e3c2560e56.xdr b/test-lcm-next/InvokeHostFunctionTests/fa2ba8e3c2560e56.xdr index ffa4d5ad40..eb56aa0279 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/fa2ba8e3c2560e56.xdr and b/test-lcm-next/InvokeHostFunctionTests/fa2ba8e3c2560e56.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/fa2d83db51a98600.xdr b/test-lcm-next/InvokeHostFunctionTests/fa2d83db51a98600.xdr new file mode 100644 index 0000000000..88ff120a09 Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/fa2d83db51a98600.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/fa3f6b4664496f4e.xdr b/test-lcm-next/InvokeHostFunctionTests/fa3f6b4664496f4e.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/fa3f6b4664496f4e.xdr and b/test-lcm-next/InvokeHostFunctionTests/fa3f6b4664496f4e.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/fa4b194dcfa3785c.xdr b/test-lcm-next/InvokeHostFunctionTests/fa4b194dcfa3785c.xdr index 91c0b03a36..89a36f2d0f 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/fa4b194dcfa3785c.xdr and b/test-lcm-next/InvokeHostFunctionTests/fa4b194dcfa3785c.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/fa54dfbe49ee7aab.xdr b/test-lcm-next/InvokeHostFunctionTests/fa54dfbe49ee7aab.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/fa54dfbe49ee7aab.xdr and b/test-lcm-next/InvokeHostFunctionTests/fa54dfbe49ee7aab.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/fa8d540011cb479c.xdr b/test-lcm-next/InvokeHostFunctionTests/fa8d540011cb479c.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/fa8d540011cb479c.xdr and b/test-lcm-next/InvokeHostFunctionTests/fa8d540011cb479c.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/fb103634b7406e33.xdr b/test-lcm-next/InvokeHostFunctionTests/fb103634b7406e33.xdr index 603d8adf12..9b27682a70 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/fb103634b7406e33.xdr and b/test-lcm-next/InvokeHostFunctionTests/fb103634b7406e33.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/fb5372535aab3beb.xdr b/test-lcm-next/InvokeHostFunctionTests/fb5372535aab3beb.xdr index aca0bf6a40..81f081f337 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/fb5372535aab3beb.xdr and b/test-lcm-next/InvokeHostFunctionTests/fb5372535aab3beb.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/fbec9a9e0db4dfc9.xdr b/test-lcm-next/InvokeHostFunctionTests/fbec9a9e0db4dfc9.xdr index 0b00007b71..fcd4f8e64e 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/fbec9a9e0db4dfc9.xdr and b/test-lcm-next/InvokeHostFunctionTests/fbec9a9e0db4dfc9.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/fc180de263c6378d.xdr b/test-lcm-next/InvokeHostFunctionTests/fc180de263c6378d.xdr index 5715e22c0a..11d15d11d4 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/fc180de263c6378d.xdr and b/test-lcm-next/InvokeHostFunctionTests/fc180de263c6378d.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/fc65c51cb0a307a8.xdr b/test-lcm-next/InvokeHostFunctionTests/fc65c51cb0a307a8.xdr index 539c74145f..74fc9f2b85 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/fc65c51cb0a307a8.xdr and b/test-lcm-next/InvokeHostFunctionTests/fc65c51cb0a307a8.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/fcc1d92eb9aefea4.xdr b/test-lcm-next/InvokeHostFunctionTests/fcc1d92eb9aefea4.xdr index 2d03e1ce8f..a2a89e5f2f 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/fcc1d92eb9aefea4.xdr and b/test-lcm-next/InvokeHostFunctionTests/fcc1d92eb9aefea4.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/fcc7940f9747ef41.xdr b/test-lcm-next/InvokeHostFunctionTests/fcc7940f9747ef41.xdr index e8eab333ab..3525a17012 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/fcc7940f9747ef41.xdr and b/test-lcm-next/InvokeHostFunctionTests/fcc7940f9747ef41.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/fdc0726b33a30b71.xdr b/test-lcm-next/InvokeHostFunctionTests/fdc0726b33a30b71.xdr index c70848d5b0..89a33482b5 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/fdc0726b33a30b71.xdr and b/test-lcm-next/InvokeHostFunctionTests/fdc0726b33a30b71.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/fe50a5e9f82ab4a3.xdr b/test-lcm-next/InvokeHostFunctionTests/fe50a5e9f82ab4a3.xdr new file mode 100644 index 0000000000..05b4de4f2b Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/fe50a5e9f82ab4a3.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/fe5913259b30b9bf.xdr b/test-lcm-next/InvokeHostFunctionTests/fe5913259b30b9bf.xdr new file mode 100644 index 0000000000..15adbc8e2b Binary files /dev/null and b/test-lcm-next/InvokeHostFunctionTests/fe5913259b30b9bf.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/fecb8c7203544f20.xdr b/test-lcm-next/InvokeHostFunctionTests/fecb8c7203544f20.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/fecb8c7203544f20.xdr and b/test-lcm-next/InvokeHostFunctionTests/fecb8c7203544f20.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/ff17a6200f26a9e2.xdr b/test-lcm-next/InvokeHostFunctionTests/ff17a6200f26a9e2.xdr index 19fdee905c..a667948a82 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/ff17a6200f26a9e2.xdr and b/test-lcm-next/InvokeHostFunctionTests/ff17a6200f26a9e2.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/ff35b35da8c78163.xdr b/test-lcm-next/InvokeHostFunctionTests/ff35b35da8c78163.xdr index 7021a22954..69c7607c0a 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/ff35b35da8c78163.xdr and b/test-lcm-next/InvokeHostFunctionTests/ff35b35da8c78163.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/ffde1b7463c8c452.xdr b/test-lcm-next/InvokeHostFunctionTests/ffde1b7463c8c452.xdr index 9df51945d4..6d235a9cfd 100644 Binary files a/test-lcm-next/InvokeHostFunctionTests/ffde1b7463c8c452.xdr and b/test-lcm-next/InvokeHostFunctionTests/ffde1b7463c8c452.xdr differ diff --git a/test-lcm-next/InvokeHostFunctionTests/index.json b/test-lcm-next/InvokeHostFunctionTests/index.json index cb9f9fb52d..94660d9210 100644 --- a/test-lcm-next/InvokeHostFunctionTests/index.json +++ b/test-lcm-next/InvokeHostFunctionTests/index.json @@ -3,6 +3,7 @@ "00e76ef8f869401f" : "Soroban_authorization-classic_and_custom_accounts-single_call-unused_auth_entries-failure_with_malformed_function_name", "014fcfa4f59b51d4" : "Soroban_footprint_validation-invokeHostFunction-readOnly-config_setting", "018599ef4068218e" : "Soroban_authorization-default_classic_account-wide_tree-unused_auth_entries-failure_with_malformed_function_name", + "0266bee165a0b438" : "state_archival-protocol_version_29-conditional_TTL_extension-absolute_refund", "03560ea94d548ceb" : "Soroban_authorization-multisig_classic_account-single_call-unused_auth_entries-failure_with_malformed_function_name", "03a5e8d5ea1d3a10" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-invalid_asset_9", "03df1dc73d71eb00" : "Module_cache_cost_with_restore_gaps-scenario_B-_restore_and_invoke_in_same_ledger", @@ -10,6 +11,7 @@ "0470c77e04ef179a" : "archival_meta-protocol_version_28-persistent_entry_meta-entry_evicted-eviction_meta-manual_restore", "048c93e37abb62ea" : "persistent_entry_archival-eviction-key_accessible_after_restore_in_same_ledger-failed_auto_restores_and_manual_restores_across_stages-two_failed_restores_and_a_successful_restore_in_the_same_stage", "04b00b08d10222a3" : "contract_storage-protocol_version_26-footprint-unused_readWrite_key", + "04c4d4cc1a4c7b46" : "contract_storage-protocol_version_29-write_bytes_limit_enforced", "0525df1061c74b13" : "charge_rent_fees_for_storage_resize-resize_and_extend-failed_due_to_low_fee", "0540c58d02f9c06b" : "archival_meta-protocol_version_26-persistent_entry_meta-entry_evicted-eviction_meta-restore,_update_value_in_next_tx-across_stages", "05c88cab546ce496" : "Soroban_non-refundable_resource_fees_are_stable-protocol_version_28", @@ -17,6 +19,7 @@ "06cbc0fe2a3f8280" : "Soroban_footprint_validation-invokeHostFunction-readWrite-invalid_asset_8", "0718f219d05d95c5" : "parallel_txs-delete_and_re-create_temporary_entry_with_lower_TTL-same_stage", "075b4bea01d35444" : "Soroban_authorization-classic_account_with_weights-wide_tree-success", + "07a8d36187cd3462" : "trustline_deletion_then_SAC_payment-protocol_version_29", "07c78b13b19c1cca" : "Soroban_authorization-default_classic_account-deep_tree-unused_auth_entries-failure_with_malformed_function_name", "090b6171bc887479" : "Soroban_classic_account_authentication-account_with_required_multisig-success_with_credentials_v2", "091f6d22b48f7501" : "Soroban_footprint_validation-invokeHostFunction-readWrite-native_asset_trustline", @@ -29,7 +32,10 @@ "0a5c74765d1481ad" : "Soroban_authorization-multisig_classic_account-deep_tree-success", "0a7c39ca98f1ae85" : "Soroban_authorization-custom_account-wide_tree-unused_auth_entries-success_with_arbitrary_valid_function", "0a9a9e7662e8f5b0" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-issuer_trustline", + "0a9e15c210b27eb7" : "state_archival_operation_errors-protocol_version_29-restore_operation-exceeded_readBytes", "0b38afb8b9aaa794" : "resource_fee_exceeds_uint32-other_account_fee_bump-failure-insufficient_fee_bumper_balance", + "0b51082fea0c09b1" : "basic_contract_invocation-protocol_version_29-non-existent_contract_id", + "0c004ec5e3c54aa7" : "state_archival_operation_errors-protocol_version_29-restore_operation-insufficient_refundable_fee", "0c35da322a33f3c2" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_13", "0c43ba995c341a31" : "Soroban_authorization-classic_account_with_weights-wide_tree-unused_auth_entries-failure_with_long_malformed_function_name", "0c775185679f70cb" : "classic_payment_source_same_as_soroban_fee_bump_source-protocol_version_28", @@ -62,6 +68,7 @@ "169eaf7fc82af3dc" : "Soroban_classic_account_authentication-duplicate_signature_not_allowed_with_insufficient_single_signature_threshold", "16b5f93e30d64633" : "archival_meta-protocol_version_28-persistent_entry_meta-entry_evicted-eviction_meta-autorestore,_delete_value_in_next_tx-across_stages", "16bac056666df725" : "Soroban_footprint_validation-invokeHostFunction-readOnly-invalid_asset_2", + "170512fdcfd48e15" : "multiple_soroban_ops_in_a_tx-protocol_version_29-with_fee_bump", "17ee1ab07947fa54" : "archival_meta-protocol_version_28-persistent_entry_meta-entry_evicted-eviction_meta-restore,_update_value_in_next_tx-same_stage", "192dc34906478ab9" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_17", "193297e2240649fc" : "persistent_entry_archival-eviction-key_accessible_after_restore_in_same_ledger-autorestore-across_stages", @@ -71,12 +78,15 @@ "1adc68cc7a5cf88e" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-issuer_trustline", "1b18e4016bfdf294" : "contract_constructor_support-constructor_with_no_arguments-v1_host_function,_v2_auth", "1c3d83a0318651b9" : "contract_errors_cause_transaction_to_fail-err", + "1cf2a7976fb37347" : "archival_meta-protocol_version_29-persistent_entry_meta-restore_expired_but_not_evicted-restore,_update_value_in_next_tx-across_stages", "1d5bfe4be2ebaacb" : "source_account_of_first_tx_is_in_second_txs_footprint-protocol_version_26", "1d8e86ddd8b11e7b" : "state_archival-protocol_version_26-conditional_TTL_extension-calculate_refund", "1dd0d92b94ce7c6f" : "Soroban_authorization-classic_account_with_weights-single_call-incorrect_signature_payload", "1e0b81121b9c895c" : "parallel_txs-multi_RO_extensions_with_a_single_RW_extension_in_a_single_stage_and_cluster._Run_1", + "1e3b9bd5e2a72ad7" : "source_account_of_first_tx_is_in_second_txs_footprint-protocol_version_29", "1e3c70b0ecdbfb4f" : "persistent_entry_archival-expiration_without_eviction-key_accessible_after_restore-autorestore", "1ec1111288c846ad" : "Soroban_classic_account_authentication-default_account_with_additional_signer-incomplete_key", + "1f15add1dc0ddc92" : "archival_meta-protocol_version_29-persistent_entry_meta-entry_evicted-eviction_meta-autorestore,_delete_value_in_next_tx-same_stage", "1f52ba0b7c5a13f0" : "basic_contract_invocation-protocol_version_28-insufficient_read_bytes_before_p23", "1f62f6743bb52550" : "readonly_ttl_bumps_across_threads_and_stages-multiple_readonly_ttl_bumps_same_stage", "2076a51f648569cd" : "archival_meta-protocol_version_26-persistent_entry_meta-restore_expired_but_not_evicted-autorestore", @@ -93,9 +103,12 @@ "227f785ddbb9ab40" : "Soroban_footprint_validation-invokeHostFunction-readOnly-invalid_asset_4", "2287bf75d44d6db2" : "Soroban_classic_account_authentication-account_with_required_multisig-incomplete_signature", "229eca4a5af3b3cd" : "state_archival_operation_errors-protocol_version_28-extend_operation-too_large_extension", + "22b51f8885cb01b4" : "archival_meta-protocol_version_29-persistent_entry_meta-restore_expired_but_not_evicted-manual_restore", "22c6c1fecdd3222c" : "Soroban_authorization-multisig_classic_account-wide_tree-success_with_duplicate_auth_entries", + "22c9f0d43d968ecf" : "archival_meta-protocol_version_29-persistent_entry_meta-entry_evicted-eviction_meta-autorestore_with_delete", "22df21f5f58e57ba" : "complex_contract-diagnostics_disabled", "2342772cbe3d3e0c" : "Soroban_footprint_validation-restoreOp-readOnly_footprint_not_empty", + "236e2db9eeecc097" : "Trustline_stellar_asset_contract-protocol_version_29", "23733e3ae41a70ad" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-invalid_asset_14", "23900da58ed1ec25" : "Soroban_classic_account_authentication-default_account_with_additional_signer-missing_key_field", "23a89388bfb65808" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_9", @@ -105,9 +118,11 @@ "25e5dd2fc7614ea7" : "Failed_write_still_causes_ttl_observation", "266b724000b97eb7" : "Soroban_footprint_validation-restoreOp-temp_entries_are_not_allowed", "2691da61cb031c32" : "archival_meta-protocol_version_26-persistent_entry_meta-entry_evicted-eviction_meta-restore,_update_value_in_next_tx-same_stage", + "26b71e168a5de930" : "state_archival-protocol_version_29-conditional_TTL_extension-calculate_refund", "26fb40313adc084c" : "parallel_txs-multi_RO_extensions_with_a_single_RW_extension_in_a_single_stage_and_cluster._Run_15", "2703a3e0e62612e8" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-invalid_asset_11", "275035785578c436" : "state_archival-protocol_version_28-contract_instance_and_Wasm_archival-lifetime_extensions", + "27699b1bc4dd968a" : "basic_contract_invocation-protocol_version_29-insufficient_read_bytes_after_p23", "279b3ea1936ed91c" : "parallel_txs-multi_RO_extensions_with_a_single_RW_extension_in_a_single_stage_and_cluster._Run_7", "28480490bc8a3fae" : "Soroban_authorization-classic_and_custom_accounts-deep_tree-success_for_tree_with_extra_nodes", "285f5877a54deb4e" : "Soroban_footprint_validation-invokeHostFunction-readWrite-contract_data_key_above_limit", @@ -123,6 +138,7 @@ "2ace299730fbdd52" : "fee_bump_refund_account_merged-protocol_version_26", "2af87dc6245a802c" : "Soroban_classic_account_authentication-account_with_weights_and_additional_signer-wrong_key_name", "2b19e70a8b41485f" : "Soroban_footprint_validation-invokeHostFunction-readWrite-invalid_asset_13", + "2bbb41b7df874a0a" : "state_archival_operation_errors-protocol_version_29-restore_operation-success", "2c26a7ba5b931a86" : "Soroban_classic_account_authentication-default_account-wrong_key_name", "2ce02d45eeb17f14" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-claimable_balance", "2d96d9114eebd574" : "Soroban_footprint_validation-invokeHostFunction-readWrite-invalid_asset_2", @@ -144,6 +160,7 @@ "3152146ae3e1601f" : "Soroban_footprint_validation-invokeHostFunction-readOnly-invalid_asset_11", "318b008d239ea9d8" : "Module_cache", "3279e450f885436a" : "persistent_entry_archival-eviction-key_accessible_after_restore_in_same_ledger-restore,_delete,_restore-across_stages", + "328c8ae9715589c5" : "archival_meta-protocol_version_29-persistent_entry_meta-restore_expired_but_not_evicted-restore,_delete_value_in_next_tx-across_stages", "329c8076e0ba5976" : "Soroban_footprint_validation-invokeHostFunction-readWrite-TTL_entry", "32e313f52f20cae1" : "Soroban_classic_account_authentication-default_account-uninitialized_map", "3304ede4be3e7951" : "Soroban_footprint_validation-invokeHostFunction-readOnly-invalid_asset_19", @@ -151,8 +168,10 @@ "3344d57a6c44b645" : "Soroban_authorization-default_classic_account-wide_tree-success_with_duplicate_auth_entries", "3351d4c3d6daa80b" : "Soroban_classic_account_authentication-account_with_required_multisig-uninitialized_map", "33541948d53d210f" : "Soroban_footprint_validation-invokeHostFunction-readOnly-offer", + "33a3c48e268855e6" : "archival_meta-protocol_version_29-persistent_entry_meta-restore_expired_but_not_evicted-autorestore,_delete_value_in_next_tx-across_stages", "33f7502a4490dbc8" : "Soroban_authorization-classic_account_with_weights-deep_tree-success_with_duplicate_auth_entries", "343cb2cb92cd8aca" : "Soroban_authorization-classic_and_custom_accounts-wide_tree-no_auth", + "34486a4b8221b151" : "archival_meta-protocol_version_29-persistent_entry_meta-restore_expired_but_not_evicted-restore,_update_value_in_next_tx-same_stage", "3468dbd89e1d09e5" : "classic_phase_bumps_sequence_of_soroban_source_account-protocol_version_28", "34bda29a61241c80" : "state_archival-protocol_version_28-conditional_TTL_extension-calculate_refund", "34c4629e4bafa2dd" : "contract_storage-protocol_version_28-footprint-no_footprint", @@ -166,15 +185,19 @@ "370b65bf45bf359a" : "Soroban_footprint_validation-invokeHostFunction-readWrite-claimable_balance", "372873b046d26a73" : "transaction_validation_diagnostics", "375e418b328316a8" : "Soroban_classic_account_authentication-default_account-incomplete_signature", + "37d222a79102d90a" : "refund_to_source_in_tx1_and_SAC_transfer_from_same_account_in_tx2-protocol_version_29-failure", "38cfd148d6296478" : "basic_contract_invocation-protocol_version_26-insufficient_instructions", "38d9c5df4335cbbf" : "Soroban_authorization-multisig_classic_account-wide_tree-unused_auth_entries-success_with_arbitrary_valid_function", "393bdca30f6cfe37" : "archival_meta-protocol_version_28-persistent_entry_meta-restore_expired_but_not_evicted-autorestore_with_deleted,_then_recreate_with_new_TX-same_stage", "394272a31b2f42f9" : "Soroban_footprint_validation-invokeHostFunction-readWrite-liquidity_pool", "39cb1e990e856d1d" : "basic_contract_invocation-protocol_version_26-incorrect_invocation_parameters-too_few_parameters", + "39d77461e71857ac" : "state_archival_operation_errors-protocol_version_29-extend_operation-insufficient_refundable_fee", "3abe7e7946b3a3aa" : "charge_rent_fees_for_storage_resize-resize_with_no_extend-failed_due_to_low_fee", "3ae3a09a2ac1bace" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-invalid_asset_19", + "3aeb08dd6d872f9f" : "contract_storage-protocol_version_29-read_bytes_limit_enforced", "3b0802ffb3b76400" : "Soroban_classic_account_authentication-default_account_with_additional_signer-missing_signature_field", "3b91093ca60bf8ca" : "basic_contract_invocation-protocol_version_28-insufficient_instructions", + "3b9daac6049f494f" : "archival_meta-protocol_version_29-persistent_entry_meta-restore_expired_but_not_evicted-autorestore,_delete_value_in_next_tx-same_stage", "3be02d8253170239" : "Soroban_delegated_signer_authentication-single_delegate-bad_delegate_payload", "3c1ebb13484322b9" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-invalid_asset_2", "3c84ec0cd4e29a9e" : "Soroban_authorization-classic_account_with_weights-deep_tree-success", @@ -185,6 +208,7 @@ "3ed1bb2f1af2ea38" : "resource_fee_exceeds_uint32-other_account_fee_bump-failure-fee_bump_fee_is_not_sufficient_to_cover_the_resource_fee_with_low_resource_fee", "3ef1fb92602e14d5" : "persistent_entry_archival-eviction-key_accessible_after_restore_in_same_ledger-manual_restore-across_stages", "3f41a40a5611b7d8" : "Soroban_authorization-classic_account_with_weights-single_call-unused_auth_entries-failure_with_malformed_function_name", + "4049c5bf43d27574" : "classic_phase_bumps_sequence_of_soroban_source_account-protocol_version_29", "40cc10c2a3fe22f0" : "Soroban_footprint_validation-invokeHostFunction-readWrite-invalid_asset_18", "40fc1592b7b8d9a7" : "Soroban_classic_account_authentication-default_account-wrong_field_order", "416716038d1bf264" : "archival_meta-protocol_version_26-persistent_entry_meta-entry_evicted-eviction_meta-autorestore_with_delete", @@ -199,9 +223,12 @@ "43caed795b61ad7c" : "archival_meta-protocol_version_26-persistent_entry_meta-restore_expired_but_not_evicted-autorestore,_delete_value_in_next_tx-same_stage", "43d0750bf32a8142" : "Soroban_authorization-classic_and_custom_accounts-single_call-success_for_tree_with_extra_nodes", "4403f2717365f3f1" : "Soroban_authorization-classic_and_custom_accounts-wide_tree-success_for_tree_with_extra_nodes", + "44132eb86a0334be" : "state_archival-protocol_version_29-contract_instance_and_Wasm_archival-restore_contract_instance_and_wasm", + "4445d44170e0cfe1" : "state_archival-protocol_version_29-contract_instance_and_Wasm_archival-restore_contract_instance,_not_wasm", "444e7910e5721658" : "Soroban_authorization-default_classic_account-wide_tree-no_auth", "44aed0d0d619653f" : "basic_contract_invocation-protocol_version_26-insufficient_read_bytes_before_p23", "44ed42af0c335da0" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-invalid_asset_15", + "4512adf732987d33" : "refund_test_with_closeLedger-protocol_version_29", "45bb7c67fa144f76" : "Soroban_classic_account_authentication-account_with_required_multisig-empty_vector_signature", "45fafb2b89af5af9" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_7", "463cc045e4e770ef" : "loadgen_Wasm_executes_properly", @@ -226,11 +253,13 @@ "4a8c58a85988d163" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-invalid_asset_4", "4aa2d8d102f584a4" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-invalid_asset_16", "4ae7dbea4b507a75" : "Soroban_footprint_validation-invokeHostFunction-readWrite-invalid_asset_5", + "4af293dc53825cbe" : "state_archival-protocol_version_29-max_TTL_extension-extension_op", "4b48a6a4f275f4e1" : "basic_contract_invocation-protocol_version_28-incorrect_invocation_parameters-malformed_parameters", "4b4fde93869500d3" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_3", "4b78ba479ffbf011" : "Soroban_delegated_signer_authentication-single_delegate-wrong_delegate_signature_type", "4b7e19f44373ff48" : "Soroban_footprint_validation-invokeHostFunction-readOnly-liquidity_pool", "4bc0adc4bfd824ae" : "Soroban_footprint_validation-invokeHostFunction-readOnly-claimable_balance", + "4c29f760282cb30d" : "archival_meta-protocol_version_29-persistent_entry_meta-restore_expired_but_not_evicted-autorestore_with_updated_value", "4c5cc01aded482f8" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_18", "4cd30f7ebe173060" : "Soroban_classic_account_authentication-default_account-missing_key_field", "4db1a66114f8b194" : "Soroban_authorization-classic_account_with_weights-deep_tree-no_auth", @@ -240,6 +269,7 @@ "4ff86e8ec6d8f89c" : "Soroban_classic_account_authentication-account_with_weights_and_additional_signer-empty_map", "50b8c59ec9bdb6bf" : "classic_phase_sets_master_weight_of_soroban_source_account_to_0-protocol_version_28", "50da3c19b259f60b" : "state_archival-protocol_version_28-contract_instance_and_Wasm_archival-restore_contract_instance_and_wasm", + "51607121e005fb7f" : "archival_meta-protocol_version_29-persistent_entry_meta-entry_evicted-eviction_meta-restore,_update_value_in_next_tx-same_stage", "51616f70e97b17d5" : "Soroban_authorization-classic_account_with_weights-single_call-unused_auth_entries-success_with_arbitrary_valid_function", "5171bdbde7eb7562" : "Soroban_authorization-custom_account-single_call-unused_auth_entries-failure_with_malformed_function_name", "519ee0e221d13e7a" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-data", @@ -257,16 +287,20 @@ "54e3fdf28cd70bd4" : "archival_meta-protocol_version_26-persistent_entry_meta-entry_evicted-eviction_meta-autorestore_with_deleted,_then_recreate_with_new_TX-across_stages", "54f8492f87d26b35" : "Soroban_authorization-default_classic_account-single_call-no_auth", "55c7bac6754e8daf" : "contract_storage-protocol_version_28-Same_ScVal_key,_different_types", + "5675aede8324645c" : "state_archival_operation_errors-protocol_version_29-extend_operation-too_large_extension", "569840c5704c5e44" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-invalid_asset_16", "57207be4a3e12536" : "Soroban_classic_account_authentication-account_with_required_multisig-missing_key_field", "57659d96c64bd183" : "Soroban_classic_account_authentication-duplicate_signature_not_allowed_with_multisig", "5770d78319f7e869" : "resource_fee_exceeds_uint32-other_account_fee_bump-failure-fee_bump_fee_is_not_sufficient_to_cover_the_resource_fee", + "57a428f77fd05af1" : "contract_storage-protocol_version_29-footprint-RO_footprint_for_RW_entry", "585310a1b2f3c9e1" : "Soroban_classic_account_authentication-multiple_signers_with_insufficient_weight_not_authenticated", "588e655d03094c0e" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-invalid_asset_13", "5897c539e59df560" : "archival_meta-protocol_version_26-persistent_entry_meta-entry_evicted-eviction_meta-restore,_delete_value_in_next_tx-across_stages", "58d33db7d651fcd6" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-invalid_asset_13", "58e3b7a81b4b1fbc" : "state_archival_operation_errors-protocol_version_28-extend_operation-insufficient_refundable_fee", "59096fc089c399f5" : "parallel_txs-delete_and_re-create_persistent_entry_with_lower_TTL-across_stages", + "591b0f65f2643876" : "refund_still_happens_on_bad_auth-protocol_version_29", + "593eaf7fb01d7232" : "basic_contract_invocation-protocol_version_29-insufficient_read_bytes_before_p23", "594d4af3fbb90e26" : "persistent_entry_archival-expiration_without_eviction-key_accessible_after_restore_in_same_ledger-restore,_delete,_restore-across_stages", "598b33597b504a5f" : "Soroban_classic_account_authentication-account_with_weights_and_additional_signer-uninitialized_vector_signature", "59a15bc254310ed9" : "Soroban_classic_account_authentication-account_with_weights-missing_signature_field", @@ -275,17 +309,25 @@ "5a067d6f1a7c300f" : "state_archival-protocol_version_28-contract_instance_and_Wasm_archival-restore_contract_Wasm,_not_instance", "5b5419e7ec6c21c3" : "Soroban_authorization-classic_and_custom_accounts-deep_tree-unused_auth_entries-failure_with_long_malformed_function_name", "5bd72d146c15215c" : "state_archival-protocol_version_26-contract_instance_and_Wasm_archival-restore_contract_Wasm,_not_instance", + "5cbc615625d83996" : "state_archival-protocol_version_29-TTL_threshold", "5da4c3861d2a2428" : "archival_meta-protocol_version_26-persistent_entry_meta-entry_evicted-eviction_meta-restore,_delete_value_in_next_tx-same_stage", "5e733f15f9fe6c15" : "parallel_txs_hit_declared_readBytes-restore", "5e8558b4e95d77a3" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-liquidity_pool", "5e95d63123990f96" : "classic_payment_source_same_as_soroban_fee_bump_source-protocol_version_26", "5f0e7c9e5b14d2fa" : "archival_meta-protocol_version_26-persistent_entry_meta-restore_expired_but_not_evicted-autorestore_with_deleted,_then_recreate_with_new_TX-same_stage", + "5f3872f905c5baf1" : "non-fee_source_account_is_recipient_of_payment_in_both_classic_and_soroban-protocol_version_29", "5f484e7d113eb7b9" : "basic_contract_invocation-protocol_version_28-malformed_function_names", + "5f7972a6994dafe2" : "archival_meta-protocol_version_29-persistent_entry_meta-restore_expired_but_not_evicted-restore,_delete_value_in_next_tx-same_stage", "5f7b6356a31b9872" : "Soroban_classic_account_authentication-default_account-wrong_signature_type", + "5f8754383c35d1be" : "classic_phase_sets_master_weight_of_soroban_source_account_to_0-protocol_version_29", + "5fcfab73812561f2" : "basic_contract_invocation-protocol_version_29-incorrect_footprint", "6031e1f0663cfda5" : "Soroban_footprint_validation-invokeHostFunction-readOnly-invalid_asset_13", + "604c6265d13fc31a" : "archival_meta-protocol_version_29-temp_entry_meta", + "6054872800de82ad" : "state_archival_operation_errors-protocol_version_29-restore_operation-exceeded_writeBytes", "608765b88758cdff" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-liquidity_pool", "60d32d465e9ef646" : "Soroban_authorization-classic_account_with_weights-deep_tree-unused_auth_entries-failure_with_malformed_function_name", "6172930301eec1db" : "Soroban_classic_account_authentication-account_with_weights_and_additional_signer-empty_vector_signature", + "617ce679889b737e" : "merge_account_then_SAC_payment_scenarios-protocol_version_29-SAC_payment_with_merged_account_as_source", "61aaf65d2d2be2df" : "Soroban_authorization-multisig_classic_account-wide_tree-success_for_tree_with_extra_nodes", "61c90fa30af7ebec" : "state_archival-protocol_version_28-contract_storage_archival-write_does_not_increase_TTL", "61f1ec50d0457920" : "Soroban_authorization-default_classic_account-wide_tree-success", @@ -332,10 +374,12 @@ "6ca3ca208041d5d9" : "parallel_txs-multi_RO_extensions_with_a_single_RW_extension_in_a_single_stage_and_cluster._Run_10", "6d661fda6fedbadc" : "state_archival-protocol_version_28-contract_storage_archival-extendOp_when_currentLedger_==_liveUntilLedger", "6de1fadf0f1a6789" : "version_test", + "6dfc8f8d0c1f4d61" : "basic_contract_invocation-protocol_version_29-account_address", "6e020886d77520ee" : "Soroban_authorization-classic_account_with_weights-deep_tree-unused_auth_entries-failure_with_long_malformed_function_name", "6e0258e8cfa3ab47" : "Soroban_footprint_validation-extendOp-valid", "6e1d5421cf61b82d" : "Soroban_authorization-classic_and_custom_accounts-deep_tree-no_auth", "6e2ec29147b7b931" : "archival_meta-protocol_version_28-Create_temp_entry_with_same_key_as_an_expired_entry_on_eviction_ledger", + "6e6a0dee9b273c6f" : "state_archival-protocol_version_29-contract_storage_archival-entry_accessible_when_currentLedger_==_liveUntilLedger", "6f27e3a9c63fca5b" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-data", "6f3467c6e13a1648" : "Soroban_footprint_validation-extendOp-readWrite_set_with_Soroban_key", "6fe7ad5169387958" : "parallel_txs-basic_test", @@ -361,6 +405,9 @@ "7623428964713c55" : "Soroban_authorization-multisig_classic_account-wide_tree-failure_for_tree_with_missing_node", "7624c43e428ee32d" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-invalid_asset_4", "763b53bb30a2499d" : "Soroban_footprint_validation-classic_entries_counted_as_disk-read_only-max_+_1", + "764084a2f48fbd19" : "basic_contract_invocation-protocol_version_29-incorrect_invocation_parameters-too_many_parameters", + "7738c2df0c244d0d" : "archival_meta-protocol_version_29-persistent_entry_meta-entry_evicted-eviction_meta-restore,_delete_value_in_next_tx-across_stages", + "77649b5f4eec4b72" : "state_archival-protocol_version_29-contract_instance_and_Wasm_archival-lifetime_extensions", "77904c0e7819a7eb" : "Soroban_authorization-default_classic_account-wide_tree-failure_for_tree_with_missing_node", "77b0f96ee78d5679" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-invalid_asset_5", "77f16a104596eb69" : "validate_return_values-protocol_version_28", @@ -376,9 +423,11 @@ "7c588d1eada8e956" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_14", "7c7ac7fe41e94018" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-invalid_asset_17", "7ca0fb2954bbb6c8" : "Soroban_footprint_validation-autorestore_footprint-unsorted_archived_indexes", + "7cc3684dd630603a" : "archival_meta-protocol_version_29-persistent_entry_meta-entry_evicted-eviction_meta-autorestore,_delete_value_in_next_tx-across_stages", "7cf5a062e427a3b3" : "Soroban_custom_account_authentication-void_signature", "7db90301e11fa5d0" : "Soroban_classic_account_authentication-account_with_required_multisig-wrong_key_type", "7dd9f6410b671c2f" : "overly_large_soroban_values_are_handled_gracefully-store_key", + "7de21bd4d91d805e" : "archival_meta-protocol_version_29-persistent_entry_meta-restore_expired_but_not_evicted-autorestore_with_deleted,_then_recreate_with_new_TX-across_stages", "7e2cf78094517d5a" : "non-fee_source_account_is_recipient_of_payment_in_both_classic_and_soroban-protocol_version_28", "7f1fec7fe0be9e43" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-invalid_asset_13", "7f4f40cb7a2fbb6f" : "state_archival-protocol_version_26-contract_instance_and_Wasm_archival-restore_contract_instance,_not_wasm", @@ -387,12 +436,14 @@ "811ecb1190787c4f" : "Soroban_footprint_validation-invokeHostFunction-readWrite-invalid_asset_20", "81c974086b0e4f56" : "Soroban_custom_account_authentication-owner_change", "824743daeb17e7e9" : "parallel_txs-multi_RO_extensions_with_a_single_RW_extension_in_a_single_stage_and_cluster._Run_21", + "83c656314634c36a" : "refund_account_merged-protocol_version_29", "83e78d1ac27b4951" : "Soroban_authorization-classic_account_with_weights-wide_tree-incorrect_signature_payload", "83f9b0ae9387fa6d" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-contract_data_key_above_limit", "841b5a633ba3dcd4" : "Soroban_authorization-custom_account-single_call-success", "84315cd6d68b5749" : "Soroban_authorization-classic_account_with_weights-single_call-unused_auth_entries-failure_with_long_malformed_function_name", "8433fde0f0bbd2f7" : "basic_contract_invocation-protocol_version_26-insufficient_refundable_resource_fee", "843c6cc8cb69c839" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_1", + "8455df4697c3967d" : "archival_meta-protocol_version_29-persistent_entry_meta-restore_expired_but_not_evicted-autorestore_with_delete", "846ca1ad625e9ea7" : "archival_meta-protocol_version_26-persistent_entry_meta-restore_expired_but_not_evicted-autorestore_with_updated_value", "846db27a79a2ec7d" : "archival_meta-protocol_version_26-persistent_entry_meta-entry_evicted-eviction_meta-autorestore", "858ea3c6fa587d2c" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_11", @@ -401,6 +452,7 @@ "86c090d2b24bc515" : "Soroban_footprint_validation-classic_entries_counted_as_disk-read_write-max_+_1", "86ec0b605b279d49" : "Soroban_classic_account_authentication-account_with_required_multisig-wrong_signature_name", "875401f18d4d37e0" : "Soroban_classic_account_authentication-account_with_required_multisig-empty_map", + "877f82cfac49070f" : "contract_storage-protocol_version_29-Same_ScVal_key,_different_types", "8848fdad9b841822" : "Soroban_authorization-default_classic_account-deep_tree-no_auth", "8878f61751a807b8" : "Soroban_footprint_validation-invokeHostFunction-readOnly-invalid_asset_3", "887c083fc1639e43" : "Soroban_authorization-classic_account_with_weights-wide_tree-unused_auth_entries-failure_with_malformed_function_name", @@ -415,8 +467,10 @@ "8adead0567fe7d71" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-native_asset_trustline", "8b13d91d773c9085" : "Soroban_authorization-custom_account-wide_tree-success_with_duplicate_auth_entries", "8b327a3e8ca7a777" : "state_archival-protocol_version_26-conditional_TTL_extension-absolute_refund", + "8b62ea69fc56c0a7" : "merge_account_then_SAC_payment_scenarios-protocol_version_29-SAC_payment_to_the_merged_account", "8cf745afc0a51283" : "Soroban_footprint_validation-soroban_entries-archived_entries-max", "8d0a24bb396f996d" : "parallel_txs-delete_and_re-create_temporary_entry_with_lower_TTL-across_stages", + "8d7be440e1455d0b" : "basic_contract_invocation-protocol_version_29-incorrect_invocation_parameters-too_few_parameters", "8dd5261011c6c3bc" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_16", "8dfbc063af86ec35" : "overly_large_soroban_values_are_handled_gracefully-store_in_instance_storage", "8e99b44b297caaac" : "Soroban_footprint_validation-restoreOp-valid", @@ -428,11 +482,15 @@ "908acbd3aceb8316" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-invalid_asset_11", "90bf93d9cc8919fb" : "fee_bump_inner_account_merged_then_used_as_inner_account_on_soroban_fee_bump-protocol_version_26", "90d44cefcaf5f29b" : "Soroban_classic_account_authentication-account_with_weights_and_additional_signer-incomplete_signature", + "912edb34a90b9157" : "archival_meta-protocol_version_29-Create_temp_entry_with_same_key_as_an_expired_entry_on_eviction_ledger", + "9146eb4425682ade" : "state_archival-protocol_version_29-contract_storage_archival-TTL_enforcement-restoreOp_skips_when_currentLedger_==_liveUntilLedger", "91eb7b4592150c3e" : "parallel_txs-multi_RO_extensions_with_a_single_RW_extension_in_a_single_stage_and_cluster._Run_6", "9209c586bd226b99" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_6", "920a1fad5ca8a29b" : "state_archival-protocol_version_26-contract_instance_and_Wasm_archival-lifetime_extensions", "9245f43fc2fba8b0" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-offer", + "925562b1c2fa6d94" : "validate_return_values-protocol_version_29", "92680c457fe83aa7" : "state_archival_operation_errors-protocol_version_26-restore_operation-success", + "92812a1aacefe098" : "state_archival-protocol_version_29-contract_instance_and_Wasm_archival-restore_contract_Wasm,_not_instance", "92b288c4d95b05f9" : "persistent_entry_archival-eviction-key_accessible_after_restore_in_same_ledger-autorestore,_delete,_then_has-across_stages", "930b08e2d077bfdc" : "Soroban_classic_account_authentication-account_with_weights-uninitialized_vector_signature", "932641f2b5405789" : "overly_large_soroban_values_are_handled_gracefully-return_value", @@ -449,6 +507,8 @@ "95ede71a6074dc1b" : "Soroban_authorization-custom_account-wide_tree-success", "964450cc2eb51081" : "Soroban_classic_account_authentication-default_account-wrong_key_type", "96690328bd10efc5" : "refund_test_with_closeLedger-protocol_version_26", + "973c473e2b3d9f51" : "classic_payment_source_same_as_soroban_fee_bump_source-protocol_version_29", + "98926b2de35ed6e6" : "archival_meta-protocol_version_29-persistent_entry_meta-restore_expired_but_not_evicted-autorestore", "98958916fd28f843" : "autorestore_contract_instance-autorestore_fees", "98dd9afc9aec58e3" : "state_archival-protocol_version_26-contract_storage_archival-write_does_not_increase_TTL", "99541d3371b2ebcf" : "Module_cache_across_protocol_versions", @@ -467,15 +527,19 @@ "9e44fefde737f8bc" : "contract_storage-protocol_version_26-footprint-RO_footprint_for_RW_entry", "9e7d59169e4ded64" : "Soroban_classic_account_authentication-account_with_weights_and_additional_signer-wrong_key_type", "9e81b4f36cfd3af7" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-invalid_asset_7", + "9eb4e26b61bc0325" : "state_archival-protocol_version_29-contract_storage_archival-write_does_not_increase_TTL", "9f130c1b0c7b7a7a" : "Soroban_classic_account_authentication-account_with_weights-wrong_signature_type", "9f280040dbfe9ebd" : "overly_large_soroban_values_are_handled_gracefully-store_in_instance_storage_key", "9fa92df05d0615bf" : "persistent_entry_archival-expiration_without_eviction-key_accessible_after_restore_in_same_ledger-restore,_delete,_restore-delete_in_same_stage_as_first_restore", "a0119ab86c638bee" : "Soroban_footprint_validation-autorestore_footprint-entry_in_readOnly_footprint", + "a0530911bb14b4b9" : "archival_meta-protocol_version_29-persistent_entry_meta-entry_evicted-eviction_meta-autorestore_with_deleted,_then_recreate_with_new_TX-same_stage", "a0964aad16627449" : "archival_meta-protocol_version_26-persistent_entry_meta-restore_expired_but_not_evicted-restore,_update_value_in_next_tx-across_stages", "a0b7e7243a96c9c6" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-invalid_asset_4", "a0d59eaf3b79413c" : "Soroban_authorization-default_classic_account-deep_tree-success_with_duplicate_auth_entries", "a0fd94b0902a1c7f" : "persistent_entry_archival-eviction-key_accessible_after_restore_in_same_ledger-manual_restore-same_stage", + "a1e8a2de64ca02cb" : "multiple_soroban_ops_in_a_tx-protocol_version_29-without_fee_bump", "a258cc5505846d79" : "Soroban_authorization-classic_account_with_weights-wide_tree-success_for_tree_with_extra_nodes", + "a3e6e4ec2134a31c" : "state_archival_operation_errors-protocol_version_29-extend_operation-success", "a4453c1269875574" : "parallel_txs_hit_declared_readBytes-invoke", "a4f13a2fa6293428" : "archival_meta-protocol_version_26-persistent_entry_meta-restore_expired_but_not_evicted-autorestore_with_delete", "a71e4d9203d52748" : "Soroban_authorization-classic_and_custom_accounts-single_call-no_auth", @@ -490,17 +554,20 @@ "aa167c6283a763db" : "contract_storage-protocol_version_28-footprint-unused_readWrite_key", "aa53f5c640a1c97e" : "resource_fee_exceeds_uint32-self_fee_bump-success-low_inclusion_fee", "aa722688a0fedfc0" : "refund_account_merged-protocol_version_26", + "aaf3b23c21536d24" : "Soroban_non-refundable_resource_fees_are_stable-protocol_version_29", "ab3bce4773581342" : "Soroban_authorization-custom_account-deep_tree-unused_auth_entries-failure_with_long_malformed_function_name", "ab898f0b7ce30529" : "classic_phase_bumps_sequence_of_soroban_source_account-protocol_version_26", "abe9daab6e04747a" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_0", "ac9dbf09c7cb19e8" : "parallel_txs-multi_RO_extensions_with_a_single_RW_extension_in_a_single_stage_and_cluster._Run_18", "ad00903073e6c1d2" : "Soroban_authorization-classic_account_with_weights-wide_tree-failure_for_tree_with_missing_node", "ad19485cea9fa38c" : "read-only_bumps_across_threads", + "ae37ace1fbc924e5" : "basic_contract_invocation-protocol_version_29-correct_invocation", "ae601103b9e4498d" : "Soroban_authorization-classic_and_custom_accounts-deep_tree-failure_for_tree_with_missing_node", "aec6a7cfd3c1af73" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-invalid_asset_5", "aedd27a8939d199b" : "basic_contract_invocation-protocol_version_28-incorrect_invocation_parameters-too_many_parameters", "aef8c4cf49c5cce1" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-invalid_asset_8", "af54a98dbdd88b52" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-TTL_entry", + "af5af20b7b9fedf3" : "basic_contract_invocation-protocol_version_29-malformed_function_names", "afa256621921b22e" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-issuer_trustline", "afe35bda9ebb3f2c" : "Soroban_authorization-multisig_classic_account-deep_tree-failure_for_tree_with_missing_node", "b045bf491859a6b8" : "Soroban_authorization-custom_account-deep_tree-no_auth", @@ -510,6 +577,7 @@ "b149a7eb981b5ed6" : "autorestore_contract_instance-restore_with_no_writes-classic_entries_count_towards_read_bytes-classic_keys_count_towards_read_bytes", "b19f5bf32940c80d" : "archival_meta-protocol_version_28-persistent_entry_meta-entry_evicted-eviction_meta-restore,_delete_value_in_next_tx-across_stages", "b1d5a1bda5b51e5b" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-invalid_asset_17", + "b1ea5e0a15f73c18" : "state_archival-protocol_version_29-max_TTL_extension-extend_host_function_temp", "b20d08c08e32c884" : "state_archival_operation_errors-protocol_version_28-restore_operation-exceeded_readBytes", "b295e5d7cd1ec038" : "fee_bump_refund_account_merged-protocol_version_28", "b3082e3bcd3a078c" : "persistent_entry_archival-eviction-key_accessible_after_restore_in_same_ledger-autorestore-same_stage", @@ -534,6 +602,7 @@ "ba8824d29063376f" : "resource_fee_exceeds_uint32-other_account_fee_bump-success-inclusion_fee_exceeds_uint32", "ba9e85782489d4b3" : "Soroban_authorization-default_classic_account-single_call-unused_auth_entries-success_with_arbitrary_valid_function", "baa71b7a006a3951" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-TTL_entry", + "baeae6dfbb97ae8c" : "archival_meta-protocol_version_29-persistent_entry_meta-entry_evicted-eviction_meta-restore,_update_value_in_next_tx-across_stages", "bb10b7a54991da41" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-invalid_asset_3", "bb90c142fc6d2475" : "state_archival_operation_errors-protocol_version_28-restore_operation-insufficient_refundable_fee", "bc6d1b280111560a" : "archival_meta-protocol_version_28-persistent_entry_meta-restore_expired_but_not_evicted-autorestore", @@ -551,6 +620,7 @@ "beed566485392053" : "Soroban_footprint_validation-autorestore_footprint-duplicate_entries", "beee405585556b28" : "Soroban_authorization-custom_account-wide_tree-unused_auth_entries-failure_with_long_malformed_function_name", "bf27f88df8fb68c5" : "Soroban_classic_account_authentication-account_with_weights_and_additional_signer-missing_signature_field", + "bf572f41777a2153" : "state_archival-protocol_version_29-contract_storage_archival-extendOp_when_currentLedger_==_liveUntilLedger", "bf6b1019d0b7569d" : "Soroban_delegated_signer_authentication-single_delegate-wrong_top-level_signature_type", "bf98f153a8789f78" : "state_archival_operation_errors-protocol_version_26-extend_operation-too_large_extension", "bfa396d5747102ff" : "Soroban_authorization-multisig_classic_account-single_call-success", @@ -568,6 +638,7 @@ "c2ac55826ca7e6de" : "persistent_entry_archival-expiration_without_eviction-key_accessible_after_restore_in_same_ledger-autorestore,_delete,_then_has-across_stages", "c2c932cf464209f1" : "Soroban_footprint_validation-invokeHostFunction-readWrite-config_setting", "c312c5d7aa1dfb38" : "archival_meta-protocol_version_26-persistent_entry_meta-restore_expired_but_not_evicted-autorestore_with_deleted,_then_recreate_with_new_TX-across_stages", + "c3497f7f5230cd85" : "state_archival-protocol_version_29-max_TTL_extension-extend_host_function_persistent", "c36cbaffe2709df8" : "contract_storage-protocol_version_26-Same_ScVal_key,_different_types", "c3962c4a93291d74" : "Soroban_authorization-classic_account_with_weights-deep_tree-success_for_tree_with_extra_nodes", "c3bb0eae31d31633" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-invalid_asset_9", @@ -580,11 +651,14 @@ "c6aec74706bb6238" : "archival_meta-protocol_version_28-persistent_entry_meta-entry_evicted-eviction_meta-autorestore_with_deleted,_then_recreate_with_new_TX-across_stages", "c6c3d9865a04db5b" : "Soroban_classic_account_authentication-account_with_weights-incomplete_key", "c6d25066860431e0" : "parallel_txs-multi_RO_extensions_with_a_single_RW_extension_in_a_single_stage_and_cluster._Run_8", + "c6fa3d29d6c09229" : "fee_bump_refund_account_merged-protocol_version_29", "c81666a24e4770bd" : "contract_storage-protocol_version_26-read_bytes_limit_enforced", "c866aa143d53bf2c" : "basic_contract_invocation-protocol_version_28-incorrect_invocation_parameters-too_few_parameters", "c89523486b59f106" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-invalid_asset_2", "c8b43ab94c4aada0" : "resource_fee_exceeds_uint32-self_fee_bump-failure-fee_bump_fee_is_not_sufficient_to_cover_the_resource_fee", + "c8de372c41ca8c93" : "contract_storage-protocol_version_29-footprint-unused_readWrite_key", "c8f28ce0094c5916" : "Soroban_footprint_validation-invokeHostFunction-readWrite-invalid_asset_3", + "c91fd23bca6a56a0" : "basic_contract_invocation-protocol_version_29-insufficient_refundable_resource_fee", "c922fea348665a87" : "overly_large_soroban_values_are_handled_gracefully-store_value", "c9844b91db3ef0b0" : "Soroban_footprint_validation-invokeHostFunction-readOnly-invalid_asset_1", "c99364d18b82557b" : "resource_fee_exceeds_uint32-other_account_fee_bump-success-low_inclusion_fee", @@ -592,6 +666,7 @@ "c9a9eaa405e6134c" : "failure_diagnostics", "c9dbd32afe107afb" : "Soroban_authorization-classic_and_custom_accounts-wide_tree-success_with_duplicate_auth_entries", "c9eca15bdeb9bf48" : "complex_contract-diagnostics_enabled", + "c9f9a266e693ab37" : "fee_bump_inner_account_merged_then_used_as_inner_account_on_soroban_fee_bump-protocol_version_29", "ca44bb06db470a22" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-config_setting", "ca81ee3779279e5f" : "Soroban_authorization-custom_account-single_call-incorrect_signature_payload", "ca96297c5d814422" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_5", @@ -616,13 +691,16 @@ "d0994aa43a850a1a" : "archival_meta-protocol_version_26-persistent_entry_meta-restore_expired_but_not_evicted-autorestore,_delete_value_in_next_tx-across_stages", "d10f1da9f73be05f" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-invalid_asset_3", "d1522d4667822bc2" : "Native_stellar_asset_contract", + "d152ab0bc07cb1d1" : "state_archival-protocol_version_29-contract_storage_archival-TTL_enforcement-entry_accessible_when_currentLedger_==_liveUntilLedger", "d15d2c79a5a0afad" : "persistent_entry_archival-eviction-key_accessible_after_restore_in_same_ledger-restore,_delete,_restore-delete_in_same_stage_as_second_restore", "d192ab90b43eeb6a" : "Soroban_authorization-default_classic_account-single_call-success_with_duplicate_auth_entries", "d1f5d115b26f2c2d" : "basic_contract_invocation-protocol_version_26-malformed_function_names", + "d20703fbc5a3ceaf" : "merge_account_then_SAC_payment_scenarios-protocol_version_29-SAC_payment_from_the_merged_account", "d2284024d86a9f4a" : "autorestore_contract_instance-restore_with_no_writes-classic_entries_count_towards_read_bytes-insufficient_read_bytes", "d2ef4dd8a3326b1f" : "state_archival-protocol_version_26-contract_storage_archival-entry_accessible_when_currentLedger_==_liveUntilLedger", "d2fdf5f43cd795da" : "parallel_restore_and_extend_op", "d312c2e2a5a50ba8" : "Soroban_footprint_validation-invokeHostFunction-readWrite-invalid_asset_19", + "d3b018e3b25cc49e" : "archival_meta-protocol_version_29-persistent_entry_meta-entry_evicted-eviction_meta-autorestore", "d3e7a4929af1352e" : "Soroban_delegated_signer_authentication-single_delegate-uninitialized_top-level_vector_signature", "d3ee1065ef42391b" : "Soroban_authorization-classic_and_custom_accounts-single_call-failure_for_tree_with_missing_node", "d3fa9dd1a7ce68e3" : "persistent_entry_archival-eviction-key_accessible_after_restore_in_same_ledger-autorestore,_delete,_then_has-same_stage", @@ -634,6 +712,7 @@ "d5d3d3dd818a7366" : "persistent_entry_archival-expiration_without_eviction-key_accessible_after_restore_in_same_ledger-manual_restore-across_stages", "d604f76431c95e5e" : "contract_constructor_support-constructor_with_no_arguments-v2_host_function,_v1_auth", "d697bb21e32f6aef" : "autorestore_from_another_contract", + "d70144007a3516e6" : "basic_contract_invocation-protocol_version_29-insufficient_instructions", "d7c375608e942b41" : "archival_meta-protocol_version_28-persistent_entry_meta-restore_expired_but_not_evicted-manual_restore", "d7e07d73417f717c" : "contract_storage-protocol_version_28-read_bytes_limit_enforced", "d7ea63b86adedc73" : "Soroban_custom_account_authentication-wrong_signature_type", @@ -645,12 +724,14 @@ "d927cb7228c4823f" : "buying_liabilities_plus_refund_is_greater_than_INT64_MAX", "da22a08dbb5b6591" : "Soroban_classic_account_authentication-default_account-uninitialized_vector_signature", "da9288450114401d" : "Soroban_footprint_validation-classic_entries_counted_as_disk-read_only-max", + "daba09f2a05761a7" : "refund_is_sent_to_fee-bump_source-protocol_version_29", "dad5f5e846b5ed75" : "state_archival-protocol_version_28-TTL_threshold", "db09947c9187fb8f" : "parallel_txs-multi_RO_extensions_with_a_single_RW_extension_in_a_single_stage_and_cluster._Run_24", "dbade792400bbd36" : "Soroban_authorization-classic_account_with_weights-wide_tree-success_with_duplicate_auth_entries", "dbe020e6910c1bb8" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_4", "dc8cff5869997641" : "Soroban_footprint_validation-invokeHostFunction-readWrite-invalid_asset_10", "dcc73c9629f5a427" : "Soroban_classic_account_authentication-account_with_weights-wrong_key_name", + "de0050023d54734e" : "refund_to_source_in_tx1_and_SAC_transfer_from_same_account_in_tx2-protocol_version_29-success", "deaef712a256815b" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-claimable_balance", "debccecc0064889e" : "Soroban_classic_account_authentication-default_account_with_additional_signer-wrong_key_type", "df5e46d7a306de43" : "Soroban_delegated_signer_authentication-deep_delegate_tree-within_depth_limit", @@ -680,6 +761,7 @@ "e4a693d475f137c9" : "Soroban_footprint_validation-soroban_entries-in-memory-max_+_1", "e4a7e26b2bd75a51" : "state_archival-protocol_version_26-contract_storage_archival-extendOp_when_currentLedger_==_liveUntilLedger", "e4b75527318c3f4b" : "Soroban_authorization-default_classic_account-deep_tree-unused_auth_entries-success_with_arbitrary_valid_function", + "e4f05a1dabec0d59" : "contract_storage-protocol_version_29-successful_storage_operations", "e58ecf019fb8ef4c" : "classic_phase_sets_master_weight_of_soroban_source_account_to_0-protocol_version_26", "e592b8e0d0c064f2" : "Soroban_authorization-classic_account_with_weights-wide_tree-no_auth", "e595ac8447e8be48" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-invalid_asset_10", @@ -702,6 +784,7 @@ "ea940d6997fea54c" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-invalid_asset_19", "eaa4c6f56373a470" : "Soroban_authorization-custom_account-single_call-success_for_tree_with_extra_nodes", "eadfba1154674062" : "Soroban_classic_account_authentication-default_account-incomplete_key", + "ec228ae524fb95c9" : "archival_meta-protocol_version_29-persistent_entry_meta-restore_expired_but_not_evicted-autorestore_with_deleted,_then_recreate_with_new_TX-same_stage", "ec29598b16b053bc" : "Soroban_footprint_validation-invokeHostFunction-readOnly-valid", "ecd35a6539ca78d9" : "Soroban_authorization-multisig_classic_account-wide_tree-success", "ecee0b3efb0526e4" : "resource_fee_exceeds_uint32-self_fee_bump-failure-fee_bump_fee_is_not_sufficient_to_cover_the_resource_fee_with_low_resource_fee", @@ -709,6 +792,7 @@ "ed39ca2daf59835d" : "Soroban_authorization-classic_and_custom_accounts-deep_tree-unused_auth_entries-failure_with_malformed_function_name", "ed4083446fa69ab7" : "contract_errors_cause_transaction_to_fail-val", "ed4298d1c34e0b79" : "Soroban_delegated_signer_authentication-single_delegate-bad_payload", + "ed458e0fae1f87be" : "archival_meta-protocol_version_29-persistent_entry_meta-entry_evicted-eviction_meta-restore,_delete_value_in_next_tx-same_stage", "ed66735578635c64" : "parallel_txs-internal_error", "eda22224ec5ac6ea" : "Soroban_authorization-default_classic_account-single_call-success_for_tree_with_extra_nodes", "eda3dfe5b6940848" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-invalid_asset_3", @@ -740,16 +824,19 @@ "f26b5de9280bbacd" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-invalid_asset_0", "f27c6aef8abbd723" : "Soroban_footprint_validation-extendOp-invalid_readOnly_keys-invalid_asset_15", "f287aa63bbdb6ba8" : "Soroban_classic_account_authentication-account_with_weights-incomplete_signature", + "f2cef3f027b2550b" : "state_archival_operation_errors-protocol_version_29-extend_operation-readBytes_limit", "f2d73eb7f022f0cb" : "resource_fee_exceeds_uint32-other_account_fee_bump-failure-fee_bump_fee_is_not_sufficient_to_cover_the_resource_fee_with_high_inclusion_fee", "f2eb7607bcc37fbb" : "Soroban_footprint_validation-soroban_entries-in-memory-max", "f3230f7682e7de69" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-invalid_asset_7", "f43fbd97002badc6" : "Soroban_footprint_validation-extendOp-invalid_readWrite_keys-invalid_asset_15", + "f4920266273226bc" : "archival_meta-protocol_version_29-persistent_entry_meta-entry_evicted-eviction_meta-autorestore_with_deleted,_then_recreate_with_new_TX-across_stages", "f4f351372abade91" : "Soroban_footprint_validation-invokeHostFunction-readWrite-invalid_asset_14", "f506528d32fd0652" : "Soroban_authorization-multisig_classic_account-wide_tree-no_auth", "f538b7222e421b51" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-invalid_asset_0", "f57219130594aa83" : "persistent_entry_archival-expiration_without_eviction-key_accessible_after_restore_in_same_ledger-failed_auto_restores_and_manual_restores_across_stages-two_failed_restores_and_a_successful_restore_in_the_same_stage", "f5d072a9fb1463da" : "persistent_entry_archival-eviction-key_accessible_after_restore_in_same_ledger-autorestore,_delete,_then_create-across_stages", "f5d58a30f834542b" : "archival_meta-protocol_version_26-persistent_entry_meta-restore_expired_but_not_evicted-restore,_delete_value_in_next_tx-same_stage", + "f639c592b8caf7eb" : "contract_storage-protocol_version_29-footprint-no_footprint", "f709a2d8db627467" : "basic_contract_invocation-protocol_version_26-non-existent_contract_id", "f7b2eaed80de4146" : "state_archival-protocol_version_26-contract_instance_and_Wasm_archival-restore_contract_instance_and_wasm", "f7ca893de81e0719" : "Soroban_custom_account_authentication-uninitialized_vector_signature", @@ -760,9 +847,11 @@ "f85719dc2181f545" : "Soroban_authorization-classic_and_custom_accounts-single_call-incorrect_signature_payload", "f860f4c299f7c690" : "Soroban_footprint_validation-invokeHostFunction-readOnly-TTL_entry", "f8630c82e2e21ee3" : "Soroban_authorization-custom_account-wide_tree-unused_auth_entries-failure_with_malformed_function_name", + "f8b28b729df1dbc2" : "classic_payment_to_soroban_fee_bump_account-protocol_version_29", "f8cddbe43429eb31" : "contract_storage-protocol_version_28-footprint-RO_footprint_for_RW_entry", "f98d63a422dc7316" : "Soroban_footprint_validation-restoreOp-invalid_readWrite_keys-invalid_asset_10", "fa2ba8e3c2560e56" : "Soroban_authorization-default_classic_account-wide_tree-unused_auth_entries-failure_with_long_malformed_function_name", + "fa2d83db51a98600" : "basic_contract_invocation-protocol_version_29-incorrect_invocation_parameters-malformed_parameters", "fa3f6b4664496f4e" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-offer", "fa4b194dcfa3785c" : "persistent_entry_archival-expiration_without_eviction-key_accessible_after_restore_in_same_ledger-autorestore,_delete,_then_create-same_stage", "fa54dfbe49ee7aab" : "Soroban_footprint_validation-invokeHostFunction-readWrite-invalid_asset_0", @@ -776,6 +865,8 @@ "fcc1d92eb9aefea4" : "Soroban_classic_account_authentication-default_account_with_additional_signer-wrong_signature_name", "fcc7940f9747ef41" : "Soroban_classic_account_authentication-account_with_weights-wrong_signature_name", "fdc0726b33a30b71" : "delete_in_first_stage_extend_in_second_stage", + "fe50a5e9f82ab4a3" : "archival_meta-protocol_version_29-persistent_entry_meta-entry_evicted-eviction_meta-autorestore_with_updated_value", + "fe5913259b30b9bf" : "archival_meta-protocol_version_29-persistent_entry_meta-entry_evicted-eviction_meta-manual_restore", "fecb8c7203544f20" : "Soroban_footprint_validation-restoreOp-invalid_readOnly_keys-invalid_asset_20", "ff17a6200f26a9e2" : "Soroban_authorization-custom_account-deep_tree-incorrect_signature_payload", "ff35b35da8c78163" : "Soroban_classic_account_authentication-account_with_required_multisig-wrong_signature_type", diff --git a/test-lcm-next/MergeTests/529b4c5987d8dacc.xdr b/test-lcm-next/MergeTests/529b4c5987d8dacc.xdr new file mode 100644 index 0000000000..27f507ae20 Binary files /dev/null and b/test-lcm-next/MergeTests/529b4c5987d8dacc.xdr differ diff --git a/test-lcm-next/MergeTests/index.json b/test-lcm-next/MergeTests/index.json index 33d7011fd8..9502c01ce0 100644 --- a/test-lcm-next/MergeTests/index.json +++ b/test-lcm-next/MergeTests/index.json @@ -1,4 +1,5 @@ { + "529b4c5987d8dacc" : "merge_event_reconciler-protocol_version_29", "689f95b5f77609d7" : "merge_event_reconciler-protocol_version_28", "d5cacbf63b606f18" : "merge_event_reconciler-protocol_version_26" } diff --git a/test-lcm-next/OfferTests/067f5fa9f796ef3b.xdr b/test-lcm-next/OfferTests/067f5fa9f796ef3b.xdr new file mode 100644 index 0000000000..2c3d1be1e5 Binary files /dev/null and b/test-lcm-next/OfferTests/067f5fa9f796ef3b.xdr differ diff --git a/test-lcm-next/OfferTests/d335812f2158f0bf.xdr b/test-lcm-next/OfferTests/d335812f2158f0bf.xdr new file mode 100644 index 0000000000..9b9a0cf7c2 Binary files /dev/null and b/test-lcm-next/OfferTests/d335812f2158f0bf.xdr differ diff --git a/test-lcm-next/OfferTests/index.json b/test-lcm-next/OfferTests/index.json index dd54afc047..11987550eb 100644 --- a/test-lcm-next/OfferTests/index.json +++ b/test-lcm-next/OfferTests/index.json @@ -1,6 +1,8 @@ { + "067f5fa9f796ef3b" : "liabilities_match_created_offer-protocol_version_29-maximum_limits", "1f16368433da1628" : "liabilities_match_created_offer-protocol_version_28-minimum_limits", "457999c2534447ae" : "liabilities_match_created_offer-protocol_version_28-maximum_limits", + "d335812f2158f0bf" : "liabilities_match_created_offer-protocol_version_29-minimum_limits", "f7a7364752aecebb" : "liabilities_match_created_offer-protocol_version_26-minimum_limits", "fd69a358c98c0b3e" : "liabilities_match_created_offer-protocol_version_26-maximum_limits" } diff --git a/test-lcm-next/PathPaymentTests/1354d03620082f2e.xdr b/test-lcm-next/PathPaymentTests/1354d03620082f2e.xdr new file mode 100644 index 0000000000..f4043616ed Binary files /dev/null and b/test-lcm-next/PathPaymentTests/1354d03620082f2e.xdr differ diff --git a/test-lcm-next/PathPaymentTests/7e6226a77fae06d5.xdr b/test-lcm-next/PathPaymentTests/7e6226a77fae06d5.xdr new file mode 100644 index 0000000000..3b11bd23a1 Binary files /dev/null and b/test-lcm-next/PathPaymentTests/7e6226a77fae06d5.xdr differ diff --git a/test-lcm-next/PathPaymentTests/9780b9c353954cd5.xdr b/test-lcm-next/PathPaymentTests/9780b9c353954cd5.xdr new file mode 100644 index 0000000000..2b0a102aa5 Binary files /dev/null and b/test-lcm-next/PathPaymentTests/9780b9c353954cd5.xdr differ diff --git a/test-lcm-next/PathPaymentTests/index.json b/test-lcm-next/PathPaymentTests/index.json index 2de655742a..82458e28d7 100644 --- a/test-lcm-next/PathPaymentTests/index.json +++ b/test-lcm-next/PathPaymentTests/index.json @@ -1,7 +1,10 @@ { "0dfe5423d3e1cac7" : "path_payment_uses_all_offers_in_a_loop-protocol_version_28-no_issuers_missing", + "1354d03620082f2e" : "path_payment_uses_all_offers_in_a_loop-protocol_version_29-no_issuers_missing", "4a5fb7ad61be37b1" : "path_payment_uses_all_offers_in_a_loop-protocol_version_26-inside_issuers_missing", "6b8dd7030be55252" : "path_payment_uses_all_offers_in_a_loop-protocol_version_26-no_issuers_missing", + "7e6226a77fae06d5" : "path_payment_uses_all_offers_in_a_loop-protocol_version_29-outside_issuers_missing", + "9780b9c353954cd5" : "path_payment_uses_all_offers_in_a_loop-protocol_version_29-inside_issuers_missing", "a0d129f4a7f84481" : "path_payment_uses_all_offers_in_a_loop-protocol_version_26-outside_issuers_missing", "a89a28b26308d91a" : "path_payment_uses_all_offers_in_a_loop-protocol_version_28-outside_issuers_missing", "d61f4d7a7dfbf38d" : "path_payment_uses_all_offers_in_a_loop-protocol_version_28-inside_issuers_missing" diff --git a/test-lcm-next/TxEnvelopeTests/33b31b8901ef27e4.xdr b/test-lcm-next/TxEnvelopeTests/33b31b8901ef27e4.xdr index e4c219cb76..3c2ee85e66 100644 Binary files a/test-lcm-next/TxEnvelopeTests/33b31b8901ef27e4.xdr and b/test-lcm-next/TxEnvelopeTests/33b31b8901ef27e4.xdr differ diff --git a/test-lcm-next/TxEnvelopeTests/45cd8cecfd8fbec7.xdr b/test-lcm-next/TxEnvelopeTests/45cd8cecfd8fbec7.xdr new file mode 100644 index 0000000000..d96c41ff21 Binary files /dev/null and b/test-lcm-next/TxEnvelopeTests/45cd8cecfd8fbec7.xdr differ diff --git a/test-lcm-next/TxEnvelopeTests/5a5798ba7b39a55c.xdr b/test-lcm-next/TxEnvelopeTests/5a5798ba7b39a55c.xdr new file mode 100644 index 0000000000..d8635f0ba8 Binary files /dev/null and b/test-lcm-next/TxEnvelopeTests/5a5798ba7b39a55c.xdr differ diff --git a/test-lcm-next/TxEnvelopeTests/5dd8350657e154c9.xdr b/test-lcm-next/TxEnvelopeTests/5dd8350657e154c9.xdr new file mode 100644 index 0000000000..d8635f0ba8 Binary files /dev/null and b/test-lcm-next/TxEnvelopeTests/5dd8350657e154c9.xdr differ diff --git a/test-lcm-next/TxEnvelopeTests/ee2a2e4ea842c835.xdr b/test-lcm-next/TxEnvelopeTests/ee2a2e4ea842c835.xdr new file mode 100644 index 0000000000..f9c176844b Binary files /dev/null and b/test-lcm-next/TxEnvelopeTests/ee2a2e4ea842c835.xdr differ diff --git a/test-lcm-next/TxEnvelopeTests/index.json b/test-lcm-next/TxEnvelopeTests/index.json index 3bbf72a682..7ff1d18231 100644 --- a/test-lcm-next/TxEnvelopeTests/index.json +++ b/test-lcm-next/TxEnvelopeTests/index.json @@ -1,7 +1,11 @@ { "33b31b8901ef27e4" : "txset_-_correct_apply_order", + "45cd8cecfd8fbec7" : "transaction_time_bounds_under_sub-second_ledgers-tx_valid_from_the_next_second_stays_too_early_in_a_same-second_ledger", + "5a5798ba7b39a55c" : "soroban_transaction_validation-protocol_version_29-footprint_limit-read-only_key_over_size_limit", + "5dd8350657e154c9" : "soroban_transaction_validation-protocol_version_29-footprint_limit-read-write_key_over_size_limit", "8a618c6bf87583c8" : "soroban_transaction_validation-protocol_version_26-footprint_limit-read-only_key_over_size_limit", "ab82fe7cbed50696" : "soroban_transaction_validation-protocol_version_28-footprint_limit-read-only_key_over_size_limit", "c5e8f50805e3d276" : "soroban_transaction_validation-protocol_version_26-footprint_limit-read-write_key_over_size_limit", - "ed0dbfc79ec4422d" : "soroban_transaction_validation-protocol_version_28-footprint_limit-read-write_key_over_size_limit" + "ed0dbfc79ec4422d" : "soroban_transaction_validation-protocol_version_28-footprint_limit-read-write_key_over_size_limit", + "ee2a2e4ea842c835" : "transaction_time_bounds_under_sub-second_ledgers-tx_expiring_at_the_current_second_applies_in_a_same-second_ledger" } diff --git a/test-lcm-next/TxResultsTests/0d729404c018318b.xdr b/test-lcm-next/TxResultsTests/0d729404c018318b.xdr new file mode 100644 index 0000000000..ccff16c7db Binary files /dev/null and b/test-lcm-next/TxResultsTests/0d729404c018318b.xdr differ diff --git a/test-lcm-next/TxResultsTests/0e6880e7cb7ad651.xdr b/test-lcm-next/TxResultsTests/0e6880e7cb7ad651.xdr new file mode 100644 index 0000000000..ccff16c7db Binary files /dev/null and b/test-lcm-next/TxResultsTests/0e6880e7cb7ad651.xdr differ diff --git a/test-lcm-next/TxResultsTests/19ecf2d5254ee652.xdr b/test-lcm-next/TxResultsTests/19ecf2d5254ee652.xdr new file mode 100644 index 0000000000..ccff16c7db Binary files /dev/null and b/test-lcm-next/TxResultsTests/19ecf2d5254ee652.xdr differ diff --git a/test-lcm-next/TxResultsTests/24ef1e6662b332ff.xdr b/test-lcm-next/TxResultsTests/24ef1e6662b332ff.xdr new file mode 100644 index 0000000000..ccff16c7db Binary files /dev/null and b/test-lcm-next/TxResultsTests/24ef1e6662b332ff.xdr differ diff --git a/test-lcm-next/TxResultsTests/3f0eb921dfe20cc0.xdr b/test-lcm-next/TxResultsTests/3f0eb921dfe20cc0.xdr new file mode 100644 index 0000000000..ccff16c7db Binary files /dev/null and b/test-lcm-next/TxResultsTests/3f0eb921dfe20cc0.xdr differ diff --git a/test-lcm-next/TxResultsTests/47000ffd70ff5d5f.xdr b/test-lcm-next/TxResultsTests/47000ffd70ff5d5f.xdr new file mode 100644 index 0000000000..ccff16c7db Binary files /dev/null and b/test-lcm-next/TxResultsTests/47000ffd70ff5d5f.xdr differ diff --git a/test-lcm-next/TxResultsTests/487c04a7f50995b7.xdr b/test-lcm-next/TxResultsTests/487c04a7f50995b7.xdr new file mode 100644 index 0000000000..ccff16c7db Binary files /dev/null and b/test-lcm-next/TxResultsTests/487c04a7f50995b7.xdr differ diff --git a/test-lcm-next/TxResultsTests/4998ada39809f281.xdr b/test-lcm-next/TxResultsTests/4998ada39809f281.xdr new file mode 100644 index 0000000000..ccff16c7db Binary files /dev/null and b/test-lcm-next/TxResultsTests/4998ada39809f281.xdr differ diff --git a/test-lcm-next/TxResultsTests/49eea85813585ff7.xdr b/test-lcm-next/TxResultsTests/49eea85813585ff7.xdr new file mode 100644 index 0000000000..a0bab4d96d Binary files /dev/null and b/test-lcm-next/TxResultsTests/49eea85813585ff7.xdr differ diff --git a/test-lcm-next/TxResultsTests/57d6c10084923631.xdr b/test-lcm-next/TxResultsTests/57d6c10084923631.xdr new file mode 100644 index 0000000000..ccff16c7db Binary files /dev/null and b/test-lcm-next/TxResultsTests/57d6c10084923631.xdr differ diff --git a/test-lcm-next/TxResultsTests/6a9cfb8c5d126e8b.xdr b/test-lcm-next/TxResultsTests/6a9cfb8c5d126e8b.xdr new file mode 100644 index 0000000000..ccff16c7db Binary files /dev/null and b/test-lcm-next/TxResultsTests/6a9cfb8c5d126e8b.xdr differ diff --git a/test-lcm-next/TxResultsTests/74e1165f01c57731.xdr b/test-lcm-next/TxResultsTests/74e1165f01c57731.xdr new file mode 100644 index 0000000000..3bf273f226 Binary files /dev/null and b/test-lcm-next/TxResultsTests/74e1165f01c57731.xdr differ diff --git a/test-lcm-next/TxResultsTests/79182a04e6cc7840.xdr b/test-lcm-next/TxResultsTests/79182a04e6cc7840.xdr new file mode 100644 index 0000000000..ccff16c7db Binary files /dev/null and b/test-lcm-next/TxResultsTests/79182a04e6cc7840.xdr differ diff --git a/test-lcm-next/TxResultsTests/7a229ea3a1260cdd.xdr b/test-lcm-next/TxResultsTests/7a229ea3a1260cdd.xdr new file mode 100644 index 0000000000..18b9e97366 Binary files /dev/null and b/test-lcm-next/TxResultsTests/7a229ea3a1260cdd.xdr differ diff --git a/test-lcm-next/TxResultsTests/7dc8e0e9e05ecfab.xdr b/test-lcm-next/TxResultsTests/7dc8e0e9e05ecfab.xdr new file mode 100644 index 0000000000..ccff16c7db Binary files /dev/null and b/test-lcm-next/TxResultsTests/7dc8e0e9e05ecfab.xdr differ diff --git a/test-lcm-next/TxResultsTests/7e9662a6eeba15d1.xdr b/test-lcm-next/TxResultsTests/7e9662a6eeba15d1.xdr new file mode 100644 index 0000000000..a0bab4d96d Binary files /dev/null and b/test-lcm-next/TxResultsTests/7e9662a6eeba15d1.xdr differ diff --git a/test-lcm-next/TxResultsTests/873836ddcb9f07f8.xdr b/test-lcm-next/TxResultsTests/873836ddcb9f07f8.xdr new file mode 100644 index 0000000000..ccff16c7db Binary files /dev/null and b/test-lcm-next/TxResultsTests/873836ddcb9f07f8.xdr differ diff --git a/test-lcm-next/TxResultsTests/9ee29fce28df3df2.xdr b/test-lcm-next/TxResultsTests/9ee29fce28df3df2.xdr new file mode 100644 index 0000000000..ccff16c7db Binary files /dev/null and b/test-lcm-next/TxResultsTests/9ee29fce28df3df2.xdr differ diff --git a/test-lcm-next/TxResultsTests/a140ada2f5afca0f.xdr b/test-lcm-next/TxResultsTests/a140ada2f5afca0f.xdr new file mode 100644 index 0000000000..ccff16c7db Binary files /dev/null and b/test-lcm-next/TxResultsTests/a140ada2f5afca0f.xdr differ diff --git a/test-lcm-next/TxResultsTests/ad8ac4e77fd02430.xdr b/test-lcm-next/TxResultsTests/ad8ac4e77fd02430.xdr new file mode 100644 index 0000000000..ccff16c7db Binary files /dev/null and b/test-lcm-next/TxResultsTests/ad8ac4e77fd02430.xdr differ diff --git a/test-lcm-next/TxResultsTests/b9532e30c8b654da.xdr b/test-lcm-next/TxResultsTests/b9532e30c8b654da.xdr new file mode 100644 index 0000000000..a0bab4d96d Binary files /dev/null and b/test-lcm-next/TxResultsTests/b9532e30c8b654da.xdr differ diff --git a/test-lcm-next/TxResultsTests/bebf2bd19f1c6003.xdr b/test-lcm-next/TxResultsTests/bebf2bd19f1c6003.xdr new file mode 100644 index 0000000000..ccff16c7db Binary files /dev/null and b/test-lcm-next/TxResultsTests/bebf2bd19f1c6003.xdr differ diff --git a/test-lcm-next/TxResultsTests/c4c5fee5a26b0453.xdr b/test-lcm-next/TxResultsTests/c4c5fee5a26b0453.xdr new file mode 100644 index 0000000000..ccff16c7db Binary files /dev/null and b/test-lcm-next/TxResultsTests/c4c5fee5a26b0453.xdr differ diff --git a/test-lcm-next/TxResultsTests/d0d6ad5a5a30b09c.xdr b/test-lcm-next/TxResultsTests/d0d6ad5a5a30b09c.xdr new file mode 100644 index 0000000000..a0bab4d96d Binary files /dev/null and b/test-lcm-next/TxResultsTests/d0d6ad5a5a30b09c.xdr differ diff --git a/test-lcm-next/TxResultsTests/d54194f4ab97a530.xdr b/test-lcm-next/TxResultsTests/d54194f4ab97a530.xdr new file mode 100644 index 0000000000..a0bab4d96d Binary files /dev/null and b/test-lcm-next/TxResultsTests/d54194f4ab97a530.xdr differ diff --git a/test-lcm-next/TxResultsTests/dfdf7b6c5ab1af39.xdr b/test-lcm-next/TxResultsTests/dfdf7b6c5ab1af39.xdr new file mode 100644 index 0000000000..ccff16c7db Binary files /dev/null and b/test-lcm-next/TxResultsTests/dfdf7b6c5ab1af39.xdr differ diff --git a/test-lcm-next/TxResultsTests/e384634a9394fbbf.xdr b/test-lcm-next/TxResultsTests/e384634a9394fbbf.xdr new file mode 100644 index 0000000000..ccff16c7db Binary files /dev/null and b/test-lcm-next/TxResultsTests/e384634a9394fbbf.xdr differ diff --git a/test-lcm-next/TxResultsTests/e9784e2e250eb7eb.xdr b/test-lcm-next/TxResultsTests/e9784e2e250eb7eb.xdr new file mode 100644 index 0000000000..a0bab4d96d Binary files /dev/null and b/test-lcm-next/TxResultsTests/e9784e2e250eb7eb.xdr differ diff --git a/test-lcm-next/TxResultsTests/ef2f4d869dd1cc8d.xdr b/test-lcm-next/TxResultsTests/ef2f4d869dd1cc8d.xdr new file mode 100644 index 0000000000..ccff16c7db Binary files /dev/null and b/test-lcm-next/TxResultsTests/ef2f4d869dd1cc8d.xdr differ diff --git a/test-lcm-next/TxResultsTests/f211171f27bd2ca0.xdr b/test-lcm-next/TxResultsTests/f211171f27bd2ca0.xdr new file mode 100644 index 0000000000..bf541ae6da Binary files /dev/null and b/test-lcm-next/TxResultsTests/f211171f27bd2ca0.xdr differ diff --git a/test-lcm-next/TxResultsTests/index.json b/test-lcm-next/TxResultsTests/index.json index aa23dc9485..c1a8f2f3d6 100644 --- a/test-lcm-next/TxResultsTests/index.json +++ b/test-lcm-next/TxResultsTests/index.json @@ -5,55 +5,85 @@ "083eef6d8b8e7e63" : "txresults-protocol_version_28-transaction_errors-signed-bad_seq", "0b136fe2833fb959" : "txresults-protocol_version_28-transaction_errors-not_signed-insufficient_balance", "0b1fd8ae1f8a728a" : "txresults-protocol_version_28-transaction_errors-double_signed-insufficient_fee", + "0d729404c018318b" : "txresults-protocol_version_29-transaction_errors-not_signed-too_late", + "0e6880e7cb7ad651" : "txresults-protocol_version_29-transaction_errors-double_signed-no_account", "123678ce92586472" : "txresults-protocol_version_28-not_enough_signature_weight-before_tx", "16ba80aa94255ef1" : "txresults-protocol_version_26-transaction_errors-double_signed-missing_operation", "17a64d1bd4161b6f" : "txresults-protocol_version_28-transaction_errors-double_signed-no_account", "17d5554d10b7a5e0" : "txresults-protocol_version_26-not_enough_signature_weight-before_tx", + "19ecf2d5254ee652" : "txresults-protocol_version_29-transaction_errors-double_signed-bad_seq", + "24ef1e6662b332ff" : "txresults-protocol_version_29-transaction_errors-double_signed-missing_operation", "360c0ad88fddfc15" : "txresults-protocol_version_28-transaction_errors-signed-too_late", "37ab04a7caf3bde5" : "txresults-protocol_version_28-transaction_errors-double_signed-too_early", "3d108537d65b8bf5" : "txresults-protocol_version_26-merge_account-normal", + "3f0eb921dfe20cc0" : "txresults-protocol_version_29-transaction_errors-signed-missing_operation", "46ae9d1460e628f2" : "txresults-protocol_version_26-create_account-with_payment_after", + "47000ffd70ff5d5f" : "txresults-protocol_version_29-transaction_errors-signed-too_late", "47301cd2824d3b67" : "txresults-protocol_version_28-transaction_errors-signed-insufficient_balance", "482259c23e233fb4" : "txresults-protocol_version_26-transaction_errors-double_signed-too_late", + "487c04a7f50995b7" : "txresults-protocol_version_29-transaction_errors-double_signed-insufficient_balance", + "4998ada39809f281" : "txresults-protocol_version_29-transaction_errors-not_signed-no_account", + "49eea85813585ff7" : "txresults-protocol_version_29-not_enough_signature_weight-normal", "4ade4004f3e35dfe" : "txresults-protocol_version_28-transaction_errors-double_signed-insufficient_balance", "50fab18e89f39e30" : "txresults-protocol_version_26-transaction_errors-not_signed-insufficient_balance", + "57d6c10084923631" : "txresults-protocol_version_29-transaction_errors-signed-no_account", "5f006545d085e016" : "txresults-protocol_version_26-transaction_errors-signed-no_account", "607a79b7ef1c73b8" : "txresults-protocol_version_28-transaction_errors-not_signed-no_account", "63bb51706201f3dd" : "txresults-protocol_version_26-transaction_errors-double_signed-insufficient_balance", + "6a9cfb8c5d126e8b" : "txresults-protocol_version_29-transaction_errors-signed-bad_seq", "6c945c0f2f0bb66c" : "txresults-protocol_version_26-transaction_errors-signed-insufficient_fee", "6d35e5e378e70370" : "txresults-protocol_version_26-transaction_errors-not_signed-missing_operation", "6f1c62881b7eb1c3" : "txresults-protocol_version_26-transaction_errors-signed-too_early", "71485755b9760b39" : "txresults-protocol_version_26-transaction_errors-signed-too_late", "720abad845b00441" : "txresults-protocol_version_28-fees_with_liabilities-selling_liabilities", + "74e1165f01c57731" : "txresults-protocol_version_29-fees_with_liabilities-buying_liabilities", + "79182a04e6cc7840" : "txresults-protocol_version_29-transaction_errors-signed-insufficient_balance", + "7a229ea3a1260cdd" : "txresults-protocol_version_29-fees_with_liabilities-selling_liabilities", + "7dc8e0e9e05ecfab" : "txresults-protocol_version_29-transaction_errors-double_signed-too_early", + "7e9662a6eeba15d1" : "txresults-protocol_version_29-create_account-normal", "84449ae27e590b14" : "txresults-protocol_version_26-transaction_errors-double_signed-insufficient_fee", "848ed86acdf91404" : "txresults-protocol_version_28-transaction_errors-double_signed-missing_operation", + "873836ddcb9f07f8" : "txresults-protocol_version_29-transaction_errors-double_signed-too_late", "893de201c4bd7047" : "txresults-protocol_version_28-transaction_errors-not_signed-bad_seq", "8e564daf846e0ced" : "txresults-protocol_version_26-not_enough_signature_weight-normal", "948ceaf5339cffae" : "txresults-protocol_version_26-transaction_errors-double_signed-bad_seq", "9b4be2f747e8e62f" : "txresults-protocol_version_28-not_enough_signature_weight-normal", "9c150d4ef9043b6b" : "txresults-protocol_version_26-transaction_errors-not_signed-no_account", "9cb7e7a8f7878e3d" : "txresults-protocol_version_28-merge_account-normal", + "9ee29fce28df3df2" : "txresults-protocol_version_29-transaction_errors-not_signed-missing_operation", + "a140ada2f5afca0f" : "txresults-protocol_version_29-transaction_errors-signed-too_early", "a38acff3f582b17e" : "txresults-protocol_version_28-transaction_errors-not_signed-missing_operation", "a4f2d0f620d7bcea" : "txresults-protocol_version_28-transaction_errors-not_signed-insufficient_fee", "a7ad902854f944c7" : "txresults-protocol_version_26-fees_with_liabilities-buying_liabilities", + "ad8ac4e77fd02430" : "txresults-protocol_version_29-transaction_errors-not_signed-bad_seq", "afde3f43c9eb1027" : "txresults-protocol_version_28-create_account-normal", "affa492c6f3b5ee0" : "txresults-protocol_version_26-merge_account-with_operation_after", "b88e41c2210b9273" : "txresults-protocol_version_26-transaction_errors-signed-bad_seq", "b94e47cd7fd23d5b" : "txresults-protocol_version_26-not_enough_signature_weight-with_operation_after", + "b9532e30c8b654da" : "txresults-protocol_version_29-merge_account-normal", "bb308ccf3733c82c" : "txresults-protocol_version_26-transaction_errors-double_signed-no_account", "bd17b7c465d5042d" : "txresults-protocol_version_26-transaction_errors-not_signed-too_early", "beaa58b0f46aafc6" : "txresults-protocol_version_28-transaction_errors-double_signed-bad_seq", "beb319a6de9dad42" : "txresults-protocol_version_26-transaction_errors-signed-missing_operation", + "bebf2bd19f1c6003" : "txresults-protocol_version_29-transaction_errors-double_signed-insufficient_fee", "bf802dee14198853" : "txresults-protocol_version_26-transaction_errors-not_signed-too_late", + "c4c5fee5a26b0453" : "txresults-protocol_version_29-transaction_errors-not_signed-insufficient_balance", "c580ebe17d445df5" : "txresults-protocol_version_28-merge_account-with_operation_after", "c95b50404ef8036f" : "txresults-protocol_version_28-transaction_errors-signed-missing_operation", + "d0d6ad5a5a30b09c" : "txresults-protocol_version_29-create_account-with_payment_after", "d34713da8df3e583" : "txresults-protocol_version_26-fees_with_liabilities-selling_liabilities", + "d54194f4ab97a530" : "txresults-protocol_version_29-merge_account-with_operation_after", "d7342c9d22280d94" : "txresults-protocol_version_28-fees_with_liabilities-buying_liabilities", "d7ca635473c87471" : "txresults-protocol_version_28-transaction_errors-double_signed-too_late", + "dfdf7b6c5ab1af39" : "txresults-protocol_version_29-transaction_errors-not_signed-insufficient_fee", "e0b80e7fe9bd74d0" : "txresults-protocol_version_26-transaction_errors-not_signed-insufficient_fee", + "e384634a9394fbbf" : "txresults-protocol_version_29-transaction_errors-signed-insufficient_fee", + "e9784e2e250eb7eb" : "txresults-protocol_version_29-not_enough_signature_weight-with_operation_after", "ea9b1ca4d8672f21" : "txresults-protocol_version_28-transaction_errors-signed-no_account", "eb73c7d0dd5043d8" : "txresults-protocol_version_28-transaction_errors-signed-too_early", "ebe8cb86ddfc6bee" : "txresults-protocol_version_28-transaction_errors-not_signed-too_early", + "ef2f4d869dd1cc8d" : "txresults-protocol_version_29-transaction_errors-not_signed-too_early", + "f211171f27bd2ca0" : "txresults-protocol_version_29-not_enough_signature_weight-before_tx", "f351f5d5ca1fb9a2" : "txresults-protocol_version_28-transaction_errors-signed-insufficient_fee", "fab4ae054612a770" : "txresults-protocol_version_28-transaction_errors-not_signed-too_late", "fc4598caa5e37bed" : "txresults-protocol_version_26-create_account-normal", diff --git a/test-tx-meta-baseline-current/TxEnvelopeTests.json b/test-tx-meta-baseline-current/TxEnvelopeTests.json index b8bb9b6ec2..2cffa91e0a 100644 --- a/test-tx-meta-baseline-current/TxEnvelopeTests.json +++ b/test-tx-meta-baseline-current/TxEnvelopeTests.json @@ -35,6 +35,9 @@ 27, 28 ], + "getUpperBoundCloseTimeOffset under sub-second ledgers|fractional-second close times round up, not down" : [ "EbIPrt4owbA=", "kAwIMT7FxME=", "+8eXWHGepSo=", "Pk+9/t2Sw1Q=" ], + "getUpperBoundCloseTimeOffset under sub-second ledgers|sub-second close times round the buffer up to a whole second" : [ "EbIPrt4owbA=", "kAwIMT7FxME=", "+8eXWHGepSo=", "Pk+9/t2Sw1Q=" ], + "getUpperBoundCloseTimeOffset under sub-second ledgers|whole-second close times keep the legacy 2x buffer" : [ "EbIPrt4owbA=", "kAwIMT7FxME=", "+8eXWHGepSo=", "Pk+9/t2Sw1Q=" ], "overlay validation handles ed25519 signed payload signers|protocol version 19" : [ "bXrfFM/EOrA=", diff --git a/test-tx-meta-baseline-next/BumpSequenceTests.json b/test-tx-meta-baseline-next/BumpSequenceTests.json index 6922a7bd50..15fd79ec6b 100644 --- a/test-tx-meta-baseline-next/BumpSequenceTests.json +++ b/test-tx-meta-baseline-next/BumpSequenceTests.json @@ -636,5 +636,6 @@ "mPG9aVxWUEo=", "lkaO24R1wEA=" ], - "bump sequence|protocol version 9|not supported" : [ "/lfj8xIFS8I=" ] + "bump sequence|protocol version 9|not supported" : [ "/lfj8xIFS8I=" ], + "minSeqAge under sub-second ledgers" : [ "DXfbo737FZ8=", "DXfbo737FZ8=" ] } diff --git a/test-tx-meta-baseline-next/ClaimableBalanceTests.json b/test-tx-meta-baseline-next/ClaimableBalanceTests.json index dc20a724f3..95e7f72af9 100644 --- a/test-tx-meta-baseline-next/ClaimableBalanceTests.json +++ b/test-tx-meta-baseline-next/ClaimableBalanceTests.json @@ -36,6 +36,7 @@ 28, 29 ], + "claimable balance absBefore under sub-second ledgers" : [ "DXfbo737FZ8=", "DXfbo737FZ8=" ], "claimableBalance|protocol version 0" : [ "pANIfbx1stE=", "cew/Nd7f6vY=", "CJW/RgT8YsQ=", "6vb25xJeuuA=" ], "claimableBalance|protocol version 1" : [ "pANIfbx1stE=", "cew/Nd7f6vY=", "CJW/RgT8YsQ=", "6vb25xJeuuA=" ], "claimableBalance|protocol version 10" : [ "67LttOSfPNA=", "4/aTXFOjWgo=", "dnpEcYDnl/U=", "nOI64lRETG4=" ], diff --git a/test-tx-meta-baseline-next/TxEnvelopeTests.json b/test-tx-meta-baseline-next/TxEnvelopeTests.json index 9946d5cde1..3024480cd1 100644 --- a/test-tx-meta-baseline-next/TxEnvelopeTests.json +++ b/test-tx-meta-baseline-next/TxEnvelopeTests.json @@ -36,6 +36,9 @@ 28, 29 ], + "getUpperBoundCloseTimeOffset under sub-second ledgers|fractional-second close times round up, not down" : [ "EbIPrt4owbA=", "kAwIMT7FxME=", "+8eXWHGepSo=", "Pk+9/t2Sw1Q=" ], + "getUpperBoundCloseTimeOffset under sub-second ledgers|sub-second close times round the buffer up to a whole second" : [ "EbIPrt4owbA=", "kAwIMT7FxME=", "+8eXWHGepSo=", "Pk+9/t2Sw1Q=" ], + "getUpperBoundCloseTimeOffset under sub-second ledgers|whole-second close times keep the legacy 2x buffer" : [ "EbIPrt4owbA=", "kAwIMT7FxME=", "+8eXWHGepSo=", "Pk+9/t2Sw1Q=" ], "overlay validation handles ed25519 signed payload signers|protocol version 19" : [ "bXrfFM/EOrA=", @@ -201,6 +204,7 @@ ], "overlay validation handles ed25519 signed payload signers|protocol version 29|apply accepts ed25519 signed payload signer" : [ "cH76q/exaD0=" ], "overlay validation handles ed25519 signed payload signers|protocol version 29|fee bump with ed25519 signed payload signer on inner tx" : [ "4XnA/b67rpA=", "4XnA/b67rpA=" ], + "transaction time bounds under sub-second ledgers" : [ "DXfbo737FZ8=", "DXfbo737FZ8=" ], "txenvelope|protocol version 0|alternative signatures" : [ "49rU55h6rBs=",