20#include <test/jtx/mpt.h>
22#include <xrpl/protocol/jss.h>
50 for (
auto const& h : holders)
52 if (accounts.
find(h.human()) != accounts.
cend())
53 Throw<std::runtime_error>(
"Duplicate holder");
62 , holders_(makeHolders(arg.holders))
79 Throw<std::runtime_error>(
"Issuer can't be holder");
89 Throw<std::runtime_error>(
"MPT can't be reused");
93 jv[sfTransactionType] = jss::MPTokenIssuanceCreate;
120 jv[sfAccount] = arg.
issuer->human();
128 Throw<std::runtime_error>(
"MPT has not been created");
131 jv[sfTransactionType] = jss::MPTokenIssuanceDestroy;
138 auto const& it =
holders_.find(holder_);
140 Throw<std::runtime_error>(
"Holder is not found");
149 jv[sfAccount] = arg.
account->human();
152 jv[sfTransactionType] = jss::MPTokenAuthorize;
158 Throw<std::runtime_error>(
"MPT has not been created");
162 jv[sfHolder] = arg.
holder->human();
189 [&](
SLEP const& sle) {
return env_.
test.BEAST_EXPECT(!sle); },
222 jv[sfAccount] = arg.
account->human();
225 jv[sfTransactionType] = jss::MPTokenIssuanceSet;
231 Throw<std::runtime_error>(
"MPT has not been created");
235 jv[sfHolder] = arg.
holder->human();
237 jv[sfDelegate] = arg.
delegate->human();
248 flags &= ~lsfMPTLocked;
250 Throw<std::runtime_error>(
"Invalid flags");
267 Throw<std::runtime_error>(
"MPT has not been created");
270 if (
auto const sle =
env_.
le(key))
281 [&](
SLEP const& sle) {
return expectedAmount == (*sle)[sfMPTAmount]; },
289 return expectedAmount == (*sle)[sfOutstandingAmount];
295 uint32_t
const expectedFlags,
310 Throw<std::runtime_error>(
"MPT has not been created");
360 Throw<std::runtime_error>(
"MPT has not been created");
379 Throw<std::runtime_error>(
"MPT has not been created");
387 Throw<std::runtime_error>(
"MPT has not been created");
391 return sle->getFieldU64(sfOutstandingAmount);
396 return sle->getFieldU64(sfMPTAmount);
406 [&](
SLEP const& sle) {
407 flags = sle->getFlags();
411 Throw<std::runtime_error>(
"Failed to get the flags");
bool expect(Condition const &shouldBeTrue)
Evaluate a test condition.
constexpr value_type value() const
Returns the underlying value.
Immutable cryptographic account descriptor.
AccountID id() const
Returns the Account ID.
std::string const & name() const
Return the name.
std::string const & human() const
Returns the human readable public key.
A transaction testing environment.
std::uint32_t seq(Account const &account) const
Returns the next sequence number on account.
void require(Args const &... args)
Check a set of requirements.
TER ter() const
Return the TER for the last JTx.
beast::unit_test::suite & test
std::shared_ptr< OpenView const > current() const
Returns the current ledger.
bool close(NetClock::time_point closeTime, std::optional< std::chrono::milliseconds > consensusDelay=std::nullopt)
Close and advance the ledger.
void fund(bool setDefaultRipple, STAmount const &amount, Account const &account)
std::shared_ptr< SLE const > le(Account const &account) const
Return an account root.
bool checkMPTokenOutstandingAmount(std::int64_t expectedAmount) const
void authorize(MPTAuthorize const &arg=MPTAuthorize{})
void set(MPTSet const &set={})
void pay(Account const &src, Account const &dest, std::int64_t amount, std::optional< TER > err=std::nullopt, std::optional< std::vector< std::string > > credentials=std::nullopt)
static std::unordered_map< std::string, Account > makeHolders(std::vector< Account > const &holders)
MPTID const & issuanceID() const
TER submit(A const &arg, Json::Value const &jv)
void claw(Account const &issuer, Account const &holder, std::int64_t amount, std::optional< TER > err=std::nullopt)
MPTTester(Env &env, Account const &issuer, MPTInit const &constr={})
PrettyAmount mpt(std::int64_t amount) const
bool checkFlags(uint32_t const expectedFlags, std::optional< Account > const &holder=std::nullopt) const
Account const & holder(std::string const &h) const
MPT operator[](std::string const &name)
Account const & issuer() const
bool forObject(std::function< bool(SLEP const &sle)> const &cb, std::optional< Account > const &holder=std::nullopt) const
std::optional< MPTID > id_
std::int64_t getBalance(Account const &account) const
std::unordered_map< std::string, Account > const holders_
std::uint32_t getFlags(std::optional< Account > const &holder) const
bool checkMPTokenAmount(Account const &holder, std::int64_t expectedAmount) const
void create(MPTCreate const &arg=MPTCreate{})
void destroy(MPTDestroy const &arg=MPTDestroy{})
Converts to MPT Issue or STAmount.
void operator()(Env &env) const
std::int64_t const amount_
MPTTester const & tester_
void operator()(Env &env) const
std::optional< Account > holder_
Match the number of items in the account's owner directory.
void operator()(Env &env) const
std::function< bool()> cb_
Check a set of conditions.
Set the expected result code for a JTx The test will fail if the code doesn't match.
Keylet mptoken(MPTID const &issuanceID, AccountID const &holder) noexcept
Keylet mptIssuance(std::uint32_t seq, AccountID const &issuer) noexcept
Json::Value claw(Account const &account, STAmount const &amount, std::optional< Account > const &mptHolder)
Json::Value pay(AccountID const &account, AccountID const &to, AnyAmount amount)
Create a payment.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Rate transferRate(ReadView const &view, AccountID const &issuer)
Returns IOU issuer transfer fee as Rate.
constexpr std::uint32_t const tfMPTUnlock
STAmount multiply(STAmount const &amount, Rate const &rate)
std::string strHex(FwdIt begin, FwdIt end)
constexpr std::uint32_t const tfMPTUnauthorize
constexpr std::uint32_t const tfMPTLock
std::string to_string(base_uint< Bits, Tag > const &a)
MPTID makeMptID(std::uint32_t sequence, AccountID const &account)
std::optional< std::uint32_t > flags
std::optional< Account > holder
std::optional< Account > account
std::optional< MPTID > id
std::optional< std::uint8_t > assetScale
std::optional< std::uint16_t > transferFee
std::optional< std::uint32_t > flags
std::optional< std::string > metadata
std::optional< std::uint64_t > maxAmt
std::optional< Account > issuer
std::optional< MPTID > id
PrettyAmount const xrpHolders
std::optional< std::uint32_t > flags
std::optional< Account > account
std::optional< MPTID > id
std::optional< Account > holder
std::optional< Account > delegate
Represents an XRP or IOU quantity This customizes the string conversion and supports XRP conversions ...