From 1bc5a1bb437b1dd6dcd9dae7e73107961221e50c Mon Sep 17 00:00:00 2001 From: tequ Date: Wed, 14 Jan 2026 12:49:49 +0900 Subject: [PATCH] address spec changes (payment flags/ iou amount) --- .../xrpl/protocol/detail/transactions.macro | 4 +- src/test/app/Sponsor_test.cpp | 50 ++++++++++++++++--- src/xrpld/app/tx/detail/Payment.cpp | 6 ++- 3 files changed, 50 insertions(+), 10 deletions(-) diff --git a/include/xrpl/protocol/detail/transactions.macro b/include/xrpl/protocol/detail/transactions.macro index ef3fdf99d2..3b9e71b8af 100644 --- a/include/xrpl/protocol/detail/transactions.macro +++ b/include/xrpl/protocol/detail/transactions.macro @@ -1063,7 +1063,7 @@ TRANSACTION(ttLOAN_PAY, 84, LoanPay, # include #endif TRANSACTION(ttSPONSORSHIP_TRANSFER, 85, SponsorshipTransfer, - Delegation::delegatable, + Delegation::delegable, featureSponsor, noPriv, ({ @@ -1075,7 +1075,7 @@ TRANSACTION(ttSPONSORSHIP_TRANSFER, 85, SponsorshipTransfer, # include #endif TRANSACTION(ttSPONSORSHIP_SET, 86, SponsorshipSet, - Delegation::delegatable, + Delegation::delegable, featureSponsor, noPriv, ({ diff --git a/src/test/app/Sponsor_test.cpp b/src/test/app/Sponsor_test.cpp index 94e4027729..13edeb5324 100644 --- a/src/test/app/Sponsor_test.cpp +++ b/src/test/app/Sponsor_test.cpp @@ -1120,19 +1120,55 @@ public: { testcase("Sponsor Account"); using namespace test::jtx; - Env env{*this, testable_amendments()}; + Env env{*this, testable_amendments() - featureSponsor}; Account const alice("alice"); Account const sponsor("sponsor"); Account const bob("bob"); Account const charlie("charlie"); + Account const gw("gw"); + auto const USD = gw["USD"]; env.fund(XRP(10000), alice, sponsor); + // Disabled + env(pay(alice, bob, XRP(100)), + txflags(tfSponsorCreatedAccount), + ter(temDISABLED)); + env.close(); + + env.enableFeature(featureSponsor); + env.close(); + + // Invalid flags + for (auto flag : { + tfNoRippleDirect, + tfPartialPayment, + tfLimitQuality, + }) + { + env(pay(alice, bob, XRP(100)), + txflags(tfSponsorCreatedAccount | flag), + ter(temINVALID_FLAG)); + env.close(); + } + + // Invalid amount(iou) + env(pay(alice, bob, USD(100)), + txflags(tfSponsorCreatedAccount), + ter(temBAD_AMOUNT)); + env.close(); + + // Insufficient reserve + env(pay(alice, + bob, + (env.current()->fees().accountReserve(0) - drops(1))), + txflags(tfSponsorCreatedAccount), + ter(tecNO_DST_INSUF_XRP)); + env.close(); + // Account is not sponsored by normal Sponsor specification { - env(pay(alice, - bob, - STAmount(env.current()->fees().accountReserve(0))), + env(pay(alice, bob, drops(env.current()->fees().accountReserve(0))), sponsor::as(sponsor, tfSponsorReserve), sig(sfSponsorSignature, sponsor)); env.close(); @@ -1145,17 +1181,17 @@ public: // Use tfSponsorCreatedAccount to sponsor an account { - // to funded accoutn + // to funded account env(pay(sponsor, bob, - STAmount(env.current()->fees().accountReserve(0))), + drops(env.current()->fees().accountReserve(0))), txflags(tfSponsorCreatedAccount), ter(tecNO_SPONSOR_PERMISSION)); // to non-funded account env(pay(sponsor, charlie, - STAmount(env.current()->fees().accountReserve(0))), + drops(env.current()->fees().accountReserve(0))), txflags(tfSponsorCreatedAccount)); env.close(); diff --git a/src/xrpld/app/tx/detail/Payment.cpp b/src/xrpld/app/tx/detail/Payment.cpp index 88b8765ba6..19413617cd 100644 --- a/src/xrpld/app/tx/detail/Payment.cpp +++ b/src/xrpld/app/tx/detail/Payment.cpp @@ -87,10 +87,14 @@ Payment::preflight(PreflightContext const& ctx) if (txFlags & tfSponsorCreatedAccount) { if (!ctx.rules.enabled(featureSponsor)) + return temDISABLED; + + if (txFlags & tfNoRippleDirect || txFlags & tfPartialPayment || + txFlags & tfLimitQuality) return temINVALID_FLAG; if (!dstAmount.native()) - return temMALFORMED; + return temBAD_AMOUNT; } if (mptDirect && ctx.tx.isFieldPresent(sfPaths))