Compare commits

...

13 Commits

Author SHA1 Message Date
Vito
0bc67c8b01 formatting 2026-02-12 16:10:37 +01:00
Vito Tumas
a14541a335 Update test comment for VaultDelete behavior 2026-02-12 16:07:11 +01:00
Vito Tumas
6a34a66659 Refactor VaultDelete tests for clarity 2026-02-12 16:02:39 +01:00
Vito Tumas
3338ec3aed Merge branch 'tapanito/lending-fix-amendment' into tapanito/vault-delete-data 2026-02-12 15:23:07 +01:00
Vito
167147281c Merge branch 'develop' into tapanito/lending-fix-amendment 2026-02-12 15:22:30 +01:00
Vito
60fce3c487 improves feature gating 2026-02-12 15:08:04 +01:00
Vito
f8b555d7a7 adds sfData field to VaultDelete transaction 2026-02-12 11:47:02 +01:00
Vito Tumas
ba60306610 Merge branch 'develop' into tapanito/lending-fix-amendment 2026-02-11 17:46:20 +01:00
Vito Tumas
6674500896 Merge branch 'develop' into tapanito/lending-fix-amendment 2026-02-10 11:48:23 +01:00
Vito
c5d7ebe93d restores missing linebreak 2026-02-05 10:24:14 +01:00
Ed Hennis
d0b5ca9dab Merge branch 'develop' into tapanito/lending-fix-amendment 2026-02-04 18:21:55 -04:00
Vito
5e51893e9b fixes a typo 2026-02-04 11:31:58 +01:00
Vito
3422c11d02 adds lending v1.1 fix amendment 2026-02-04 11:30:41 +01:00
5 changed files with 70 additions and 0 deletions

View File

@@ -15,6 +15,8 @@
// Add new amendments to the top of this list.
// Keep it sorted in reverse chronological order.
XRPL_FIX (LendingProtocolV1_1, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FIX (PermissionedDomainInvariant, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FIX (ExpiredNFTokenOfferRemoval, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FIX (BatchInnerSigs, Supported::yes, VoteBehavior::DefaultNo)

View File

@@ -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. */

View File

@@ -1701,10 +1701,21 @@ class LoanBroker_test : public beast::unit_test::suite
testRIPD4274MPT();
}
void
testFixAmendmentEnabled()
{
using namespace jtx;
testcase("testFixAmendmentEnabled");
Env env{*this};
BEAST_EXPECT(env.enabled(fixLendingProtocolV1_1));
}
public:
void
run() override
{
testFixAmendmentEnabled();
testLoanBrokerSetDebtMaximum();
testLoanBrokerCoverDepositNullVault();

View File

@@ -4990,6 +4990,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
@@ -5011,6 +5059,7 @@ public:
testVaultClawbackBurnShares();
testVaultClawbackAssets();
testAssetsMaximum();
testVaultDeleteData();
}
};

View File

@@ -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;
}