3#include <test/jtx/Env.h>
5#include <xrpld/app/misc/TxQ.h>
7#include <xrpl/basics/base_uint.h>
8#include <xrpl/json/json_value.h>
9#include <xrpl/protocol/AccountID.h>
10#include <xrpl/protocol/Quality.h>
11#include <xrpl/protocol/STNumber.h>
12#include <xrpl/protocol/Units.h>
13#include <xrpl/protocol/jss.h>
14#include <xrpl/tx/paths/detail/Steps.h>
17#include <source_location>
31 class StoredValue =
typename SField::type::value_type,
32 class OutputValue = StoredValue>
36 using SV = StoredValue;
37 using OV = OutputValue;
50 [[nodiscard]]
virtual OV
60template <
class SField,
class StoredValue>
64 using SV = StoredValue;
101 return value_.time_since_epoch().count();
190template <
class SField,
class UnitTag,
class ValueType>
195 using OV = ValueType;
213template <
class JTxField>
271template <
class SField,
class UnitTag,
class ValueType =
typename SField::type::value_type>
275template <
class SField,
class StoredValue =
typename SField::type::value_type>
288template <
typename Input>
291 requires requires(Input& v) {
318template <
typename...
IOU>
324 for (
auto const& line : jrr[jss::lines])
326 for (
auto const& iou : {ious...})
328 if (line[jss::currency].asString() ==
to_string(iou.currency))
331 v[jss::currency] = line[jss::currency];
332 v[jss::balance] = line[jss::balance];
333 v[jss::limit] = line[jss::limit];
334 v[jss::account] = line[jss::account];
335 res[jss::lines].
append(v);
364 return strHex(expected) ==
strHex(sle->getFieldVL(field));
382template <
class T,
class... Args>
387 if constexpr (
sizeof...(args) > 0)
391template <
class... Args>
396 if constexpr (
sizeof...(args) > 0)
403template <
class... Args>
412template <
class... Args>
421 for (
auto const& p : st2)
450 template <
class Rep,
class Period>
455 auto b =
cv_.wait_for(lk, relTime, [
this] {
return signaled_; });
515 bool defaultLimits =
false);
517template <
typename... Amts>
582 return create(account.id(), to.
id(), amount, settleDelay, pk, cancelAfter, dstTag);
607 return channel(account.id(), dst.
id(), seqProxyValue);
686template <
class Iter,
class StepInfo,
class... Args>
695template <
class... Args>
697equal(Strand
const& strand, Args&&... args)
699 if (strand.size() !=
sizeof...(Args))
719 jv[sfAccount.jsonName] =
to_string(account);
721 jv[sfDestination.jsonName] =
to_string(dest);
722 jv[sfTransactionType.jsonName] = jss::CheckCreate;
729 return create(account.id(), dest.
id(), sendMax);
743template <
class Suite>
756 int const line = location.line();
757 char const* file = location.file_name();
758 FeeLevel64 const expectedMin{expectedMinFeeLevel};
759 FeeLevel64 const expectedMed{expectedMedFeeLevel};
761 using namespace std::string_literals;
771 metrics.txCount == expectedCount
778 metrics.txQMaxSize == expectedMaxCount
786 metrics.txInLedger == expectedInLedger
794 metrics.txPerLedger == expectedPerLedger
802 metrics.minProcessingFeeLevel == expectedMin
810 metrics.medFeeLevel == expectedMed
818 auto const expectedCurFeeLevel = expectedInLedger > expectedPerLedger
819 ? expectedMed * expectedInLedger * expectedInLedger /
820 (expectedPerLedger * expectedPerLedger)
823 metrics.openLedgerFeeLevel == expectedCurFeeLevel
885 Number principalRequested,
940 :
expiry_{expiry.time_since_epoch().count()}
947 jt[sfExpiration.jsonName] =
expiry_;
965 jt[sfSourceTag.jsonName] =
tag_;
983 jt[sfDestinationTag.jsonName] =
tag_;
1010template <
typename TTester>
1019template <
typename TTester>
bool isNull() const
isNull() tests to see if this field is null.
Value & append(Value const &value)
Append value to array at the end.
std::chrono::time_point< NetClock > time_point
std::chrono::duration< rep, period > duration
Number is a floating point type that can represent a wide range of values.
json::Value getJson(JsonOptions=JsonOptions::Values::None) const override
std::shared_ptr< STLedgerEntry const > const & const_ref
std::vector< STPath >::size_type size() const
void pushBack(STPath const &e)
std::vector< STPath >::const_iterator end() const
std::string getString() const
int addRaw(Blob const &vector)
An immutable linear range of bytes.
Metrics getMetrics(OpenView const &view) const
Returns fee metrics in reference fee level units.
static constexpr FeeLevel64 kBaseLevel
Fee level for single-signed reference transaction.
Immutable cryptographic account descriptor.
AccountID id() const
Returns the Account ID.
void operator()(Env &, JTx &jt) const
DestTag(std::uint32_t tag)
A transaction testing environment.
std::shared_ptr< OpenView const > current() const
Returns the current ledger.
std::uint32_t const expiry_
Expiration(NetClock::time_point const &expiry)
void operator()(Env &, JTx &jt) const
bool waitFor(std::chrono::duration< Rep, Period > const &relTime)
std::condition_variable cv_
Converts to IOU Issue or STAmount.
Converts to MPT Issue or STAmount.
void operator()(Env &, JTx &jt) const
SourceTag(std::uint32_t tag)
constexpr value_type value() const
Returns the underlying value.
Keylet check(AccountID const &id, std::uint32_t seq) noexcept
A Check.
json::Value create(A const &account, A const &dest, STAmount const &sendMax)
Create a check.
MPT issueHelperMPT(IssuerArgs const &args)
IOU issueHelperIOU(IssuerArgs const &args)
auto const kCoverRateLiquidation
json::Value set(AccountID const &account, uint256 const &vaultId, uint32_t flags)
auto const kManagementFeeRate
auto const kCoverRateMinimum
json::Value coverWithdraw(AccountID const &account, uint256 const &brokerID, STAmount const &amount, uint32_t flags)
json::Value coverDeposit(AccountID const &account, uint256 const &brokerID, STAmount const &amount, uint32_t flags)
json::Value coverClawback(AccountID const &account, std::uint32_t flags)
json::Value del(AccountID const &account, uint256 const &brokerID, uint32_t flags)
auto const kLoanOriginationFee
json::Value set(AccountID const &account, uint256 const &loanBrokerID, Number principalRequested, std::uint32_t flags)
auto const kPaymentInterval
json::Value manage(AccountID const &account, uint256 const &loanID, std::uint32_t flags)
auto const kLoanServiceFee
auto const kOverpaymentInterestRate
auto const kCloseInterestRate
auto const kOverpaymentFee
auto const kClosePaymentFee
json::Value del(AccountID const &account, uint256 const &loanID, std::uint32_t flags)
auto const kLatePaymentFee
json::Value pay(AccountID const &account, uint256 const &loanID, STAmount const &amount, std::uint32_t flags)
auto const kLateInterestRate
json::Value fund(AccountID const &account, uint256 const &channel, STAmount const &amount, std::optional< NetClock::time_point > const &expiration)
STAmount channelBalance(ReadView const &view, uint256 const &chan)
json::Value create(AccountID const &account, AccountID const &to, STAmount const &amount, NetClock::duration const &settleDelay, PublicKey const &pk, std::optional< NetClock::time_point > const &cancelAfter, std::optional< std::uint32_t > const &dstTag)
uint256 channel(AccountID const &account, AccountID const &dst, std::uint32_t seqProxyValue)
json::Value claim(AccountID const &account, uint256 const &channel, std::optional< STAmount > const &balance, std::optional< STAmount > const &amount, std::optional< Slice > const &signature, std::optional< PublicKey > const &pk)
bool channelExists(ReadView const &view, uint256 const &chan)
void nOffers(Env &env, std::size_t n, Account const &account, STAmount const &in, STAmount const &out)
json::Value findPathsRequest(jtx::Env &env, jtx::Account const &src, jtx::Account const &dst, STAmount const &saDstAmount, std::optional< STAmount > const &saSendMax, std::optional< PathAsset > const &srcAsset, std::optional< AccountID > const &srcIssuer, std::optional< uint256 > const &domain)
jtx::Env pathTestEnv(beast::unit_test::Suite &suite)
json::Value ledgerEntryMPT(jtx::Env &env, jtx::Account const &acct, MPTID const &mptID)
static constexpr FeeLevel64 kBaseFeeLevel
bool expectLedgerEntryRoot(Env &env, Account const &acct, STAmount const &expectedValue)
bool expectMPT(Env &env, AccountID const &account, STAmount const &value)
PrettyAmount xrpMinusFee(Env const &env, std::int64_t xrpAmount)
static constexpr FeeLevel64 kMinEscalationFeeLevel
bool expectOffers(Env &env, AccountID const &account, std::uint16_t size, std::vector< Amounts > const &toMatch)
STPathElement allPathElements(AccountID const &a, Asset const &asset)
void testHelper2TokensMix(TTester &&tester)
bool expectHolding(Env &env, AccountID const &account, STAmount const &value, bool defaultLimits)
json::Value getBookOffers(jtx::Env &env, Asset const &takerPays, Asset const &takerGets)
bool same(STPathSet const &st1, Args const &... args)
std::uint32_t ownerCount(Env const &env, Account const &account)
XRPAmount txFee(Env const &env, std::uint16_t n)
std::tuple< STPathSet, STAmount, STAmount > findPaths(jtx::Env &env, jtx::Account const &src, jtx::Account const &dst, STAmount const &saDstAmount, std::optional< STAmount > const &saSendMax, std::optional< PathAsset > const &srcAsset, std::optional< AccountID > const &srcIssuer, std::optional< uint256 > const &domain)
void checkMetrics(Suite &test, jtx::Env &env, std::size_t expectedCount, std::optional< std::size_t > expectedMaxCount, std::size_t expectedInLedger, std::size_t expectedPerLedger, std::uint64_t expectedMinFeeLevel=kBaseFeeLevel.fee(), std::uint64_t expectedMedFeeLevel=kMinEscalationFeeLevel.fee(), std::source_location const location=std::source_location::current())
json::Value rpf(jtx::Account const &src, jtx::Account const &dst, STAmount const &dstAmount, std::optional< STAmount > const &sendMax, std::optional< PathAsset > const &srcAsset, std::optional< AccountID > const &srcIssuer)
bool strandEqualHelper(Iter i)
void testHelper3TokensMix(TTester &&tester)
auto const kData
General field definitions, or fields used in multiple transaction namespaces.
STPathElement cpe(PathAsset const &pa)
std::tuple< STPathSet, STAmount, STAmount > findPathsByElement(jtx::Env &env, jtx::Account const &src, jtx::Account const &dst, STAmount const &saDstAmount, std::optional< STAmount > const &saSendMax, std::optional< STPathElement > const &srcElement, std::optional< AccountID > const &srcIssuer, std::optional< uint256 > const &domain)
STPathElement ipe(Asset const &asset)
json::Value ledgerEntryState(Env &env, Account const &acctA, Account const &acctB, std::string const ¤cy)
JTxFieldWrapper< JTxField< SField, StoredValue > > simpleField
bool equal(STAmount const &sa1, STAmount const &sa2)
STPathElement iape(AccountID const &account)
JTxFieldWrapper< ValueUnitField< SField, UnitTag, ValueType > > valueUnitWrapper
json::Value ledgerEntryRoot(Env &env, Account const &acct)
void stpathsetAppend(STPathSet &st, STPath const &p, Args const &... args)
void stpathAppendOne(STPath &st, Account const &account)
json::Value accountBalance(Env &env, Account const &acct)
STPath stpath(Args const &... args)
json::Value getAccountLines(Env &env, AccountID const &acctId)
bool checkArraySize(json::Value const &val, unsigned int size)
json::Value ledgerEntryOffer(jtx::Env &env, jtx::Account const &acct, std::uint32_t offerSeq)
bool checkVL(Slice const &result, std::string const &expected)
void stpathAppend(STPath &st, T const &t, Args const &... args)
STPathElement ape(AccountID const &a)
json::Value getAccountOffers(Env &env, AccountID const &acct, bool current)
uint256 getCheckIndex(AccountID const &account, std::uint32_t uSequence)
auto makeVector(Input const &input)
constexpr XRPAmount
Convert XRP to drops (integral types).
std::string strHex(FwdIt begin, FwdIt end)
std::string toBase58(AccountID const &v)
Convert AccountID to base58 checked string.
BaseUInt< 160, detail::CurrencyTag > Currency
Currency is a hash representing a specific currency.
TypedField< STInteger< std::uint32_t > > SF_UINT32
TypedField< STAmount > SF_AMOUNT
std::string to_string(BaseUInt< Bits, Tag > const &a)
BaseUInt< 192 > MPTID
MPTID is a 192-bit value representing MPT Issuance ID, which is a concatenation of a 32-bit sequence ...
TypedField< STBlob > SF_VL
FeeLevel< std::uint64_t > FeeLevel64
BaseUInt< 160, detail::AccountIDTag > AccountID
A 160-bit unsigned that uniquely identifies an account.
TypedField< STAccount > SF_ACCOUNT
std::enable_if_t< std::is_same_v< T, char >||std::is_same_v< T, unsigned char >, Slice > makeSlice(std::array< T, N > const &a)
TypedField< STBitString< 256 > > SF_UINT256
JTxField< SF, SV, OV > base
OV value() const override
AccountIdField(SF const &sfield, SV const &value)
BlobField(SF const &sfield, std::array< std::uint8_t, N > const &c)
JTxField(SF const &sfield, SV value)
BlobField(SF const &sfield, Slice const &cond)
JTxField< SF, SV, SV > base
std::optional< std::uint64_t > limit
std::uint16_t transferFee
std::vector< jtx::Account > holders
JF operator()(std::array< std::uint8_t, N > const &c) const
JF operator()(Slice const &cond) const
JF operator()(SV const &cond) const
JTxFieldWrapper(SF const &sfield)
JTxFieldWrapper(SF const &sfield)
JF operator()(SV const &value) const
void operator()(Env &, JTx &jt) const
JTxField(SF const &sfield, SV value)
Generic helper class for helper classes that set a field on a JTx.
JTxField(SF const &sfield, SV value)
virtual void operator()(Env &, JTx &jt) const
virtual OV value() const=0
virtual ~JTxField()=default
Execution context for applying a JSON transaction.
Represents an XRP, IOU, or MPT quantity This customizes the string conversion and supports XRP conver...
StAmountField(SF const &sfield, SV const &value)
OV value() const override
JTxField< SF, SV, OV > base
TimePointField(SF const &sfield, SV const &value)
OV value() const override
JTxField< SF, SV, OV > base
JTxField< SF, SV, OV > base
OV value() const override
UInt256Field(SF const &sfield, SV const &value)
unit::ValueUnit< UnitTag, ValueType > SV
JTxField< SF, SV, OV > base
OV value() const override