#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace xrpl::test { struct PseudoTx_test : public beast::unit_test::Suite { static std::vector getPseudoTxs(Rules const& rules, std::uint32_t seq) { std::vector res; res.emplace_back(ttFEE, [&](auto& obj) { obj[sfAccount] = AccountID(); obj[sfLedgerSequence] = seq; if (rules.enabled(featureXRPFees)) { obj[sfBaseFeeDrops] = XRPAmount{0}; obj[sfReserveBaseDrops] = XRPAmount{0}; obj[sfReserveIncrementDrops] = XRPAmount{0}; } else { obj[sfBaseFee] = 0; obj[sfReserveBase] = 0; obj[sfReserveIncrement] = 0; obj[sfReferenceFeeUnits] = 0; } }); res.emplace_back(ttAMENDMENT, [&](auto& obj) { obj.setAccountID(sfAccount, AccountID()); obj.setFieldH256(sfAmendment, uint256(2)); obj.setFieldU32(sfLedgerSequence, seq); }); return res; } static std::vector getRealTxs() { std::vector res; res.emplace_back(ttACCOUNT_SET, [&](auto& obj) { obj[sfAccount] = AccountID(1); }); res.emplace_back(ttPAYMENT, [&](auto& obj) { obj.setAccountID(sfAccount, AccountID(2)); obj.setAccountID(sfDestination, AccountID(3)); }); return res; } void testPrevented(FeatureBitset features) { using namespace jtx; Env env(*this, features); for (auto const& stx : getPseudoTxs(env.closed()->rules(), env.closed()->seq() + 1)) { std::string reason; BEAST_EXPECT(isPseudoTx(stx)); BEAST_EXPECT(!passesLocalChecks(stx, reason)); BEAST_EXPECT(reason == "Cannot submit pseudo transactions."); env.app().getOpenLedger().modify([&](OpenView& view, beast::Journal j) { auto const result = xrpl::apply(env.app(), view, stx, TapNone, j); BEAST_EXPECT(!result.applied && result.ter == temINVALID); return result.applied; }); } } void testAllowed() { for (auto const& stx : getRealTxs()) { std::string reason; BEAST_EXPECT(!isPseudoTx(stx)); BEAST_EXPECT(passesLocalChecks(stx, reason)); } } void run() override { using namespace test::jtx; FeatureBitset const all{testableAmendments()}; FeatureBitset const xrpFees{featureXRPFees}; testPrevented(all - featureXRPFees); testPrevented(all); testAllowed(); } }; BEAST_DEFINE_TESTSUITE(PseudoTx, app, xrpl); } // namespace xrpl::test