GlobalFreezeIssuer amendment

This commit is contained in:
Valentin Balaschenko
2025-12-10 16:58:30 +00:00
parent 4e4e626402
commit cb744e76a4
3 changed files with 74 additions and 2 deletions

View File

@@ -16,6 +16,7 @@
// Add new amendments to the top of this list.
// Keep it sorted in reverse chronological order.
XRPL_FIX (GlobalFreezeIssuer, Supported::no, VoteBehavior::DefaultNo)
XRPL_FEATURE(LendingProtocol, Supported::no, VoteBehavior::DefaultNo)
XRPL_FEATURE(PermissionDelegationV1_1, Supported::no, VoteBehavior::DefaultNo)
XRPL_FIX (DirectoryLimit, Supported::yes, VoteBehavior::DefaultNo)

View File

@@ -234,8 +234,11 @@ isFrozen(
if (isXRP(currency))
return false;
auto sle = view.read(keylet::account(issuer));
if (sle && sle->isFlag(lsfGlobalFreeze) && issuer != account)
return true;
if (sle && sle->isFlag(lsfGlobalFreeze))
{
if (!view.rules().enabled(fixGlobalFreezeIssuer) || issuer != account)
return true;
}
if (issuer != account)
{
// Check if the issuer froze the line

View File

@@ -2054,6 +2054,73 @@ class Freeze_test : public beast::unit_test::suite
env(pay(holder, other, USD(10)), ter(tecPATH_DRY));
}
void
testGlobalFreezeIssuerAmendment(FeatureBitset features)
{
testcase("Global Freeze Issuer Amendment");
using namespace test::jtx;
Account issuer{"issuer"};
Account holder{"holder"};
// Test pre-amendment behavior (issuer IS frozen under global freeze)
{
Env env_pre(*this, features - fixGlobalFreezeIssuer);
env_pre.fund(XRP(10000), issuer, holder);
env_pre.close();
auto const USD = issuer["USD"];
env_pre.trust(USD(1000), holder);
env_pre.close();
env_pre(pay(issuer, holder, USD(100)));
env_pre.close();
env_pre(fset(issuer, asfGlobalFreeze));
env_pre.close();
BEAST_EXPECT(isFrozen(
*env_pre.current(), issuer.id(), USD.currency, issuer.id()));
BEAST_EXPECT(isFrozen(
*env_pre.current(), holder.id(), USD.currency, issuer.id()));
}
// Test post-amendment behavior (issuer is NOT frozen under global
// freeze)
if (features[fixGlobalFreezeIssuer])
{
Env env_post(*this, features);
env_post.fund(XRP(10000), issuer, holder);
env_post.close();
auto const USD = issuer["USD"];
env_post.trust(USD(1000), holder);
env_post.close();
env_post(pay(issuer, holder, USD(100)));
env_post.close();
env_post(fset(issuer, asfGlobalFreeze));
env_post.close();
BEAST_EXPECT(!isFrozen(
*env_post.current(), issuer.id(), USD.currency, issuer.id()));
BEAST_EXPECT(isFrozen(
*env_post.current(), holder.id(), USD.currency, issuer.id()));
env_post(pay(issuer, holder, USD(10)));
env_post.close();
env_post(pay(holder, issuer, USD(10)));
env_post.close();
}
}
// Helper function to extract trustline flags from open ledger
uint32_t
getTrustlineFlags(
@@ -2118,6 +2185,7 @@ public:
testSetAndClear(features);
testGlobalFreeze(features);
testIsFrozenDirectly(features);
testGlobalFreezeIssuerAmendment(features);
testNoFreeze(features);
testOffersWhenFrozen(features);
testOffersWhenDeepFrozen(features);