Files
rippled/src/test/app/PseudoTx_test.cpp
2026-02-17 18:10:07 +00:00

109 lines
2.9 KiB
C++

#include <test/jtx.h>
#include <xrpl/protocol/Feature.h>
#include <xrpl/tx/apply.h>
#include <string>
#include <vector>
namespace xrpl {
namespace test {
struct PseudoTx_test : public beast::unit_test::suite
{
std::vector<STTx>
getPseudoTxs(Rules const& rules, std::uint32_t seq)
{
std::vector<STTx> res;
res.emplace_back(STTx(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(STTx(ttAMENDMENT, [&](auto& obj) {
obj.setAccountID(sfAccount, AccountID());
obj.setFieldH256(sfAmendment, uint256(2));
obj.setFieldU32(sfLedgerSequence, seq);
}));
return res;
}
std::vector<STTx>
getRealTxs()
{
std::vector<STTx> res;
res.emplace_back(STTx(ttACCOUNT_SET, [&](auto& obj) { obj[sfAccount] = AccountID(1); }));
res.emplace_back(STTx(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().openLedger().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{testable_amendments()};
FeatureBitset const xrpFees{featureXRPFees};
testPrevented(all - featureXRPFees);
testPrevented(all);
testAllowed();
}
};
BEAST_DEFINE_TESTSUITE(PseudoTx, app, xrpl);
} // namespace test
} // namespace xrpl