diff --git a/include/xrpl/protocol/Asset.h b/include/xrpl/protocol/Asset.h index 23b2360277..4438106738 100644 --- a/include/xrpl/protocol/Asset.h +++ b/include/xrpl/protocol/Asset.h @@ -20,8 +20,8 @@ #ifndef RIPPLE_PROTOCOL_ASSET_H_INCLUDED #define RIPPLE_PROTOCOL_ASSET_H_INCLUDED -#include #include +#include #include #include @@ -94,7 +94,8 @@ public: void setJson(Json::Value& jv) const; - STAmount operator() (Number const&) const; + STAmount + operator()(Number const&) const; bool native() const diff --git a/include/xrpl/protocol/STAmount.h b/include/xrpl/protocol/STAmount.h index ea049be62a..682fc06a8d 100644 --- a/include/xrpl/protocol/STAmount.h +++ b/include/xrpl/protocol/STAmount.h @@ -155,8 +155,9 @@ public: template STAmount(A const& asset, Number const& number) - : STAmount(asset, number.mantissa(), number.exponent()) - {} + : STAmount(asset, number.mantissa(), number.exponent()) + { + } // Legacy support for new-style amounts STAmount(IOUAmount const& amount, Issue const& issue); diff --git a/src/libxrpl/protocol/Asset.cpp b/src/libxrpl/protocol/Asset.cpp index e9ece21186..8035c808e4 100644 --- a/src/libxrpl/protocol/Asset.cpp +++ b/src/libxrpl/protocol/Asset.cpp @@ -43,7 +43,8 @@ Asset::setJson(Json::Value& jv) const std::visit([&](auto&& issue) { issue.setJson(jv); }, issue_); } -STAmount Asset::operator() (Number const& number) const +STAmount +Asset::operator()(Number const& number) const { return STAmount{*this, number}; } diff --git a/src/test/app/Vault_test.cpp b/src/test/app/Vault_test.cpp index 36fd6eeecd..a173a06b98 100644 --- a/src/test/app/Vault_test.cpp +++ b/src/test/app/Vault_test.cpp @@ -206,25 +206,63 @@ class Vault_test : public beast::unit_test::suite env(tx, ter(tecLOCKED)); } - SUBCASE("transfer IOU") + SUBCASE("transfer XRP") { - Asset asset = issuer["IOU"]; + // Construct asset. + Asset asset{xrpIssue()}; + // Depositor already holds asset. + // Create vault. auto [tx, keylet] = vault.create({.owner = owner, .asset = asset}); - env.trust(asset(1000), depositor); - env(pay(issuer, depositor, asset(1000))); env(tx); env.close(); { - auto tx = vault.deposit({ - .depositor = depositor, - .id = keylet.key, - .amount = asset(123)}); + auto tx = vault.deposit( + {.depositor = depositor, + .id = keylet.key, + .amount = asset(123)}); env(tx); env.close(); } } + SUBCASE("transfer IOU") + { + // Construct asset. + Asset asset = issuer["IOU"]; + // Fund depositor with asset. + env.trust(asset(1000), depositor); + env(pay(issuer, depositor, asset(1000))); + // Create vault. + auto [tx, keylet] = vault.create({.owner = owner, .asset = asset}); + env(tx); + env.close(); + + { + auto tx = vault.deposit( + {.depositor = depositor, + .id = keylet.key, + .amount = asset(123)}); + env(tx); + env.close(); + } + } + + SUBCASE("transfer MPT") + { + // Construct asset. + MPTTester mptt{env, issuer, {.fund = false}}; + mptt.create({.flags = tfMPTCanTransfer | tfMPTCanLock}); + Asset asset = mptt.issuanceID(); + // Fund depositor with asset. + mptt.authorize({ .account = depositor }); + env(pay(issuer, depositor, asset(1000))); + // Create vault. + auto [tx, keylet] = vault.create({.owner = owner, .asset = asset}); + env(tx); + env.close(); + } + // TODO: VaultSet (update) succeed // TODO: VaultSet (update) fail: wrong owner // TODO: VaultSet (update) fail: Data too large diff --git a/src/test/jtx/impl/vault.cpp b/src/test/jtx/impl/vault.cpp index 8cea759216..31cbbc1f54 100644 --- a/src/test/jtx/impl/vault.cpp +++ b/src/test/jtx/impl/vault.cpp @@ -75,6 +75,17 @@ Vault::deposit(DepositArgs const& args) return jv; } +Json::Value +Vault::withdraw(WithdrawArgs const& args) +{ + Json::Value jv; + jv[jss::TransactionType] = jss::VaultWithdraw; + jv[jss::Account] = args.depositor.human(); + jv[jss::VaultID] = to_string(args.id); + jv[jss::Amount] = to_json(args.amount); + return jv; +} + } // namespace jtx } // namespace test } // namespace ripple diff --git a/src/test/jtx/vault.h b/src/test/jtx/vault.h index 777adaf181..5d26b84b92 100644 --- a/src/test/jtx/vault.h +++ b/src/test/jtx/vault.h @@ -80,6 +80,15 @@ struct Vault Json::Value deposit(DepositArgs const& args); + struct WithdrawArgs + { + Account depositor; + uint256 id; + STAmount amount; + }; + + Json::Value + withdraw(WithdrawArgs const& args); }; } // namespace jtx