Skip to content

Commit ba53026

Browse files
authored
adds sfMemoData field to VaultDelete transaction (#6356)
* adds sfMemoData field to VaultDelete transaction
1 parent 3477308 commit ba53026

File tree

3 files changed

+80
-16
lines changed

3 files changed

+80
-16
lines changed

include/xrpl/protocol/detail/transactions.macro

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -868,6 +868,7 @@ TRANSACTION(ttVAULT_DELETE, 67, VaultDelete,
868868
mustDeleteAcct | destroyMPTIssuance | mustModifyVault,
869869
({
870870
{sfVaultID, soeREQUIRED},
871+
{sfMemoData, soeOPTIONAL},
871872
}))
872873

873874
/** This transaction trades assets for shares with a vault. */

src/libxrpl/tx/transactors/Vault/VaultDelete.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@ VaultDelete::preflight(PreflightContext const& ctx)
1818
return temMALFORMED;
1919
}
2020

21+
if (ctx.tx.isFieldPresent(sfMemoData) && !ctx.rules.enabled(fixLendingProtocolV1_1))
22+
return temDISABLED;
23+
24+
// The sfMemoData field is an optional field used to record the deletion reason.
25+
if (auto const data = ctx.tx[~sfMemoData]; data && !validDataLength(data, maxDataPayloadLength))
26+
return temMALFORMED;
27+
2128
return tesSUCCESS;
2229
}
2330

src/test/app/Vault_test.cpp

Lines changed: 72 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1064,14 +1064,13 @@ class Vault_test : public beast::unit_test::suite
10641064
{
10651065
using namespace test::jtx;
10661066

1067-
auto testCase = [this](
1068-
std::function<void(
1069-
Env & env,
1070-
Account const& issuer,
1071-
Account const& owner,
1072-
Account const& depositor,
1073-
Asset const& asset,
1074-
Vault& vault)> test) {
1067+
auto testCase = [this](std::function<void(
1068+
Env & env,
1069+
Account const& issuer,
1070+
Account const& owner,
1071+
Account const& depositor,
1072+
Asset const& asset,
1073+
Vault& vault)> test) {
10751074
Env env{*this, testable_amendments() | featureSingleAssetVault};
10761075
Account issuer{"issuer"};
10771076
Account owner{"owner"};
@@ -1354,14 +1353,13 @@ class Vault_test : public beast::unit_test::suite
13541353
{
13551354
using namespace test::jtx;
13561355

1357-
auto testCase = [this](
1358-
std::function<void(
1359-
Env & env,
1360-
Account const& issuer,
1361-
Account const& owner,
1362-
Account const& depositor,
1363-
Asset const& asset,
1364-
Vault& vault)> test) {
1356+
auto testCase = [this](std::function<void(
1357+
Env & env,
1358+
Account const& issuer,
1359+
Account const& owner,
1360+
Account const& depositor,
1361+
Asset const& asset,
1362+
Vault& vault)> test) {
13651363
Env env{*this, testable_amendments() | featureSingleAssetVault};
13661364
Account issuer{"issuer"};
13671365
Account owner{"owner"};
@@ -5357,6 +5355,63 @@ class Vault_test : public beast::unit_test::suite
53575355
}
53585356
}
53595357

5358+
void
5359+
testVaultDeleteData()
5360+
{
5361+
using namespace test::jtx;
5362+
5363+
Env env{*this};
5364+
5365+
Account const owner{"owner"};
5366+
env.fund(XRP(1'000'000), owner);
5367+
env.close();
5368+
5369+
Vault vault{env};
5370+
5371+
auto const keylet = keylet::vault(owner.id(), 1);
5372+
auto delTx = vault.del({.owner = owner, .id = keylet.key});
5373+
5374+
// Test VaultDelete with fixLendingProtocolV1_1 disabled
5375+
// Transaction fails if the data field is provided
5376+
{
5377+
testcase("VaultDelete data fixLendingProtocolV1_1 disabled");
5378+
env.disableFeature(fixLendingProtocolV1_1);
5379+
delTx[sfMemoData] = strHex(std::string(maxDataPayloadLength, 'A'));
5380+
env(delTx, ter(temDISABLED), THISLINE);
5381+
env.close();
5382+
env.enableFeature(fixLendingProtocolV1_1);
5383+
}
5384+
5385+
// Transaction fails if the data field is too large
5386+
{
5387+
testcase("VaultDelete data fixLendingProtocolV1_1 enabled data too large");
5388+
delTx[sfMemoData] = strHex(std::string(maxDataPayloadLength + 1, 'A'));
5389+
env(delTx, ter(temMALFORMED), THISLINE);
5390+
env.close();
5391+
}
5392+
5393+
// Transaction fails if the data field is set, but is empty
5394+
{
5395+
testcase("VaultDelete data fixLendingProtocolV1_1 enabled data empty");
5396+
delTx[sfMemoData] = strHex(std::string(0, 'A'));
5397+
env(delTx, ter(temMALFORMED), THISLINE);
5398+
env.close();
5399+
}
5400+
5401+
{
5402+
testcase("VaultDelete data fixLendingProtocolV1_1 enabled data valid");
5403+
PrettyAsset const xrpAsset = xrpIssue();
5404+
auto [tx, keylet] = vault.create({.owner = owner, .asset = xrpAsset});
5405+
env(tx, ter(tesSUCCESS), THISLINE);
5406+
env.close();
5407+
// Recreate the transaction as the vault keylet changed
5408+
auto delTx = vault.del({.owner = owner, .id = keylet.key});
5409+
delTx[sfMemoData] = strHex(std::string(maxDataPayloadLength, 'A'));
5410+
env(delTx, ter(tesSUCCESS), THISLINE);
5411+
env.close();
5412+
}
5413+
}
5414+
53605415
public:
53615416
void
53625417
run() override
@@ -5378,6 +5433,7 @@ class Vault_test : public beast::unit_test::suite
53785433
testVaultClawbackBurnShares();
53795434
testVaultClawbackAssets();
53805435
testAssetsMaximum();
5436+
testVaultDeleteData();
53815437
}
53825438
};
53835439

0 commit comments

Comments
 (0)