Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions include/xrpl/protocol/detail/transactions.macro
Original file line number Diff line number Diff line change
Expand Up @@ -868,6 +868,7 @@ TRANSACTION(ttVAULT_DELETE, 67, VaultDelete,
mustDeleteAcct | destroyMPTIssuance | mustModifyVault,
({
{sfVaultID, soeREQUIRED},
{sfData, soeOPTIONAL},
}))

/** This transaction trades assets for shares with a vault. */
Expand Down
49 changes: 49 additions & 0 deletions src/test/app/Vault_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4992,6 +4992,54 @@ class Vault_test : public beast::unit_test::suite
}
}

void
testVaultDeleteData()
{
using namespace test::jtx;

auto const test =
[&](std::string const& prefix, FeatureBitset features, std::string const& pl, TER expectedCode) {
Env env{*this, features};
testcase("VaultDelete data " + prefix);
Account const owner{"owner"};

Vault vault{env};
env.fund(XRP(1'000'000), owner);
env.close();

PrettyAsset const xrpAsset = xrpIssue();

auto const [tx, keylet] = vault.create({.owner = owner, .asset = xrpAsset});
env(tx, ter(tesSUCCESS), THISLINE);

auto delTx = vault.del({.owner = owner, .id = keylet.key});
env(delTx, data(pl), ter(expectedCode), THISLINE);

env.close();
};

auto const all = testable_amendments();

// Test VaultDelete with fixLendingProtocolV1_1 disabled
// Transaction fails if the data field is provided
test(
"fixLendingProtocolV1_1 disabled",
all - fixLendingProtocolV1_1,
std::string(maxDataPayloadLength, 'A'),
temDISABLED);

// Transaction fails if the data field is too large
test(
"fixLendingProtocolV1_1 enabled data too large",
all,
std::string(maxDataPayloadLength + 1, 'A'),
temMALFORMED);

// Transaction fails if the data field is set, but is empty
test("fixLendingProtocolV1_1 enabled data empty", all, std::string(0, 'A'), temMALFORMED);
test("fixLendingProtocolV1_1 enabled data valid", all, std::string(maxDataPayloadLength, 'A'), tesSUCCESS);
}

public:
void
run() override
Expand All @@ -5013,6 +5061,7 @@ class Vault_test : public beast::unit_test::suite
testVaultClawbackBurnShares();
testVaultClawbackAssets();
testAssetsMaximum();
testVaultDeleteData();
}
};

Expand Down
7 changes: 7 additions & 0 deletions src/xrpld/app/tx/detail/VaultDelete.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,13 @@ VaultDelete::preflight(PreflightContext const& ctx)
return temMALFORMED;
}

if (ctx.tx.isFieldPresent(sfData) && !ctx.rules.enabled(fixLendingProtocolV1_1))
return temDISABLED;

// The sfData field is an optional field used to record the deletion reason.
if (auto const data = ctx.tx[~sfData]; data && !validDataLength(data, maxDataPayloadLength))
return temMALFORMED;

return tesSUCCESS;
}

Expand Down
Loading