diff --git a/include/xrpl/protocol/Asset.h b/include/xrpl/protocol/Asset.h index 0688049e119..3fb84f4bc61 100644 --- a/include/xrpl/protocol/Asset.h +++ b/include/xrpl/protocol/Asset.h @@ -89,6 +89,14 @@ class Asset operator<(Asset const& lhs, Asset const& rhs); }; +inline Json::Value +to_json(Asset const& asset) +{ + Json::Value jv; + asset.setJson(jv); + return jv; +} + template constexpr bool Asset::holds() const diff --git a/src/test/app/Vault_test.cpp b/src/test/app/Vault_test.cpp index 7ce48ab6927..ab2949d8400 100644 --- a/src/test/app/Vault_test.cpp +++ b/src/test/app/Vault_test.cpp @@ -17,16 +17,15 @@ */ //============================================================================== -#include -#include +#include +#include +#include +#include +#include #include namespace ripple { -struct SetArg -{ -}; - class Vault_test : public beast::unit_test::suite { TEST_CASE(CreateUpdateDelete) @@ -35,32 +34,55 @@ class Vault_test : public beast::unit_test::suite testcase("Create / Update / Delete"); Env env{*this}; + Account issuer{"issuer"}; + Account owner{"owner"}; + env.fund(XRP(1000), issuer, owner); + env.close(); + auto fee = test::jtx::fee(env.current()->fees().increment); + SUBCASE("IOU vault") { - // issuer = Account() - // submit(fund(issuer)) - // asset = issuer[IOU] - // owner = Account() - // tx = vault::create(owner=owner, asset=asset) - // submit(fset(issuer, asfGlobalFreeze)) - // TODO: VaultSet (create) fail: Asset is IOU and - // issuer.GlobalFreeze submit(tx) => fail tx[sfData] = blob(300) - // submit(tx) => fail - // TODO: VaultSet (create) fail: Data too large (>256 bytes) + Asset asset = issuer["IOU"]; + auto tx = vault::create({ .owner=owner, .asset=asset }); + + SUBCASE("global freeze") + { + env(fset(issuer, asfGlobalFreeze)); + env.close(); + // env(tx, fee, ter(tecFROZEN)); + env.close(); + } + + SUBCASE("data too large") + { + // tx[sfData] = blob(260) + // env(tx, ter(tecFROZEN)); + env.close(); + } } SUBCASE("MPT vault") { - // represent an issuer account - // fund the issuer account - // create issuer.MPT - // represent an asset for issuer.MPT - // create a vault with issuer.MPT asset + MPTTester mptt{env, issuer, {.fund=false}}; + mptt.create(); + Asset asset = mptt.issuanceID(); + auto tx = vault::create({ .owner=owner, .asset=asset }); + + SUBCASE("metadata too large") + { + // tx[sfMPTokenMetadata] = blob(1100); + // env(tx, ter(???)); + // env.close(); + } + + SUBCASE("create") { + // env(tx); + // env.close(); + } } // (create) => no sfVaultID // (update) => sfVaultID - // TODO: VaultSet (create) fail: Metadata too large (>1024 bytes) // TODO: VaultSet (create) succeed // TODO: VaultSet (update) succeed // TODO: VaultSet (update) fail: wrong owner diff --git a/src/test/jtx.h b/src/test/jtx.h index 49790e34022..870d8cfa5f2 100644 --- a/src/test/jtx.h +++ b/src/test/jtx.h @@ -59,6 +59,7 @@ #include #include #include +#include #include #include #include diff --git a/src/test/jtx/impl/vault.cpp b/src/test/jtx/impl/vault.cpp index d787d56c72f..7d7f95d3d62 100644 --- a/src/test/jtx/impl/vault.cpp +++ b/src/test/jtx/impl/vault.cpp @@ -35,7 +35,7 @@ create(CreateArgs const& args) Json::Value jv; jv[jss::TransactionType] = jss::VaultSet; jv[jss::Account] = args.owner.human(); - // jv[jss::Asset] = args.asset; + jv[jss::Asset] = to_json(args.asset); if (args.flags) jv[jss::Flags] = *args.flags; return jv; diff --git a/src/test/jtx/mpt.h b/src/test/jtx/mpt.h index e66433260eb..41f21e53d0a 100644 --- a/src/test/jtx/mpt.h +++ b/src/test/jtx/mpt.h @@ -150,6 +150,7 @@ class MPTTester bool close_; public: + // Pass `.fund = false` if `issuer` is already funded. MPTTester(Env& env, Account const& issuer, MPTConstr const& constr = {}); void diff --git a/src/test/jtx/subcases.h b/src/test/jtx/subcases.h index 307c6e569ab..3fb1c3e5a26 100644 --- a/src/test/jtx/subcases.h +++ b/src/test/jtx/subcases.h @@ -103,7 +103,7 @@ execute(Supercase supercase); } // namespace subcases #define TEST_CASE(name) void name(subcases::Context& _09876) -#define SUBCASE(name) if (subcases::Subcase _54321{_09876, name}; _54321) +#define SUBCASE(name) if (subcases::Subcase _54321{_09876, name}) #define EXECUTE(name) subcases::execute([&](auto& ctx) { name(ctx); }) #endif diff --git a/src/test/jtx/vault.h b/src/test/jtx/vault.h index 9727e6eaaa6..9c7aa5e122f 100644 --- a/src/test/jtx/vault.h +++ b/src/test/jtx/vault.h @@ -21,7 +21,9 @@ #define RIPPLE_TEST_JTX_VAULT_H_INCLUDED #include +#include #include +#include #include @@ -33,7 +35,7 @@ namespace vault { struct CreateArgs { Account owner; - // Asset asset; + Asset asset; std::optional flags{}; }; diff --git a/src/xrpld/ledger/detail/View.cpp b/src/xrpld/ledger/detail/View.cpp index 00410dabb2e..b9e5ab1ef20 100644 --- a/src/xrpld/ledger/detail/View.cpp +++ b/src/xrpld/ledger/detail/View.cpp @@ -876,7 +876,7 @@ createPseudoAccount(ApplyView& view, uint256 const& pseudoOwnerKey) // account->setFieldH256(sfPseudoOwner, pseudoOwnerKey); view.insert(account); - return std::move(account); + return account; } TER