mirror of
				https://github.com/Xahau/xahaud.git
				synced 2025-11-04 10:45:50 +00:00 
			
		
		
		
	use tfCronUnset to delete Cron
This commit is contained in:
		@@ -45,7 +45,7 @@ SetCron::preflight(PreflightContext const& ctx)
 | 
			
		||||
    auto& tx = ctx.tx;
 | 
			
		||||
    auto& j = ctx.j;
 | 
			
		||||
 | 
			
		||||
    if (tx.getFlags() & tfUniversalMask)
 | 
			
		||||
    if (tx.getFlags() & tfCronSetMask)
 | 
			
		||||
    {
 | 
			
		||||
        JLOG(j.warn()) << "SetCron: Invalid flags set.";
 | 
			
		||||
        return temINVALID_FLAG;
 | 
			
		||||
@@ -55,7 +55,8 @@ SetCron::preflight(PreflightContext const& ctx)
 | 
			
		||||
    // DR - Set Cron with Delay and Repeat
 | 
			
		||||
    // D- - Set Cron (once off) with Delay only (repat implicitly 0)
 | 
			
		||||
    // -R - Invalid
 | 
			
		||||
    // -- - Clear any existing cron (succeeds even if there isn't one)
 | 
			
		||||
    // -- - Clear any existing cron (succeeds even if there isn't one) / with
 | 
			
		||||
    // tfCronUnset flag set
 | 
			
		||||
 | 
			
		||||
    bool const hasDelay = tx.isFieldPresent(sfDelaySeconds);
 | 
			
		||||
    bool const hasRepeat = tx.isFieldPresent(sfRepeatCount);
 | 
			
		||||
@@ -90,12 +91,33 @@ SetCron::preflight(PreflightContext const& ctx)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (tx.isFlag(tfCronUnset))
 | 
			
		||||
    {
 | 
			
		||||
        if (hasDelay || hasRepeat)
 | 
			
		||||
        {
 | 
			
		||||
            JLOG(j.warn()) << "SetCron: tfCronUnset flag cannot be used with "
 | 
			
		||||
                              "DelaySeconds or RepeatCount.";
 | 
			
		||||
            return temMALFORMED;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return preflight2(ctx);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TER
 | 
			
		||||
SetCron::preclaim(PreclaimContext const& ctx)
 | 
			
		||||
{
 | 
			
		||||
    if (ctx.tx.isFlag(tfCronUnset))
 | 
			
		||||
    {
 | 
			
		||||
        auto const account = ctx.tx.getAccountID(sfAccount);
 | 
			
		||||
        auto const sle = ctx.view.read(keylet::account(account));
 | 
			
		||||
        if (!sle)
 | 
			
		||||
            return tefINTERNAL;
 | 
			
		||||
 | 
			
		||||
        if (!sle->isFieldPresent(sfCron))
 | 
			
		||||
            return tecNO_ENTRY;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return tesSUCCESS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -105,10 +127,7 @@ SetCron::doApply()
 | 
			
		||||
    auto& view = ctx_.view();
 | 
			
		||||
    auto const& tx = ctx_.tx;
 | 
			
		||||
 | 
			
		||||
    bool const isDelete = !tx.isFieldPresent(sfDelaySeconds);
 | 
			
		||||
 | 
			
		||||
    if (isDelete && tx.isFieldPresent(sfRepeatCount))
 | 
			
		||||
        return tefINTERNAL;
 | 
			
		||||
    bool const isDelete = tx.isFlag(tfCronUnset);
 | 
			
		||||
 | 
			
		||||
    // delay can be zero, in which case the cron will usually execute next
 | 
			
		||||
    // ledger.
 | 
			
		||||
 
 | 
			
		||||
@@ -200,6 +200,12 @@ constexpr std::uint32_t const tfImmutable = 1;
 | 
			
		||||
// Clawback flags:
 | 
			
		||||
constexpr std::uint32_t const tfClawbackMask = ~tfUniversal;
 | 
			
		||||
 | 
			
		||||
// CronSet Flags:
 | 
			
		||||
enum CronSetFlags : uint32_t {
 | 
			
		||||
    tfCronUnset = 0x00000001,
 | 
			
		||||
};
 | 
			
		||||
constexpr std::uint32_t const tfCronSetMask = ~(tfUniversal | tfCronUnset);
 | 
			
		||||
 | 
			
		||||
// clang-format on
 | 
			
		||||
 | 
			
		||||
}  // namespace ripple
 | 
			
		||||
 
 | 
			
		||||
@@ -140,21 +140,24 @@ struct Cron_test : public beast::unit_test::suite
 | 
			
		||||
            // Invalid DelaySeconds and RepeatCount combination
 | 
			
		||||
            // (only RepeatCount specified)
 | 
			
		||||
            env(cron::set(alice), cron::repeat(256), ter(temMALFORMED));
 | 
			
		||||
            env.close();
 | 
			
		||||
 | 
			
		||||
            // Invalid DelaySeconds
 | 
			
		||||
            env(cron::set(alice),
 | 
			
		||||
                cron::delay(365 * 24 * 60 * 60 + 1),
 | 
			
		||||
                cron::repeat(256),
 | 
			
		||||
                ter(temMALFORMED));
 | 
			
		||||
            env.close();
 | 
			
		||||
 | 
			
		||||
            // Invalid RepeatCount
 | 
			
		||||
            env(cron::set(alice),
 | 
			
		||||
                cron::delay(365 * 24 * 60 * 60),
 | 
			
		||||
                cron::repeat(257),
 | 
			
		||||
                ter(temMALFORMED));
 | 
			
		||||
            env.close();
 | 
			
		||||
 | 
			
		||||
            // Invalid tfCronUnset flag
 | 
			
		||||
            env(cron::set(alice),
 | 
			
		||||
                cron::delay(365 * 24 * 60 * 60),
 | 
			
		||||
                txflags(tfCronUnset),
 | 
			
		||||
                ter(temMALFORMED));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -165,8 +168,15 @@ struct Cron_test : public beast::unit_test::suite
 | 
			
		||||
        using namespace test::jtx;
 | 
			
		||||
        using namespace std::literals;
 | 
			
		||||
 | 
			
		||||
        // no preclaim checks exists
 | 
			
		||||
        BEAST_EXPECT(true);
 | 
			
		||||
        auto const alice = Account("alice");
 | 
			
		||||
        Env env{*this, features | featureCron};
 | 
			
		||||
 | 
			
		||||
        env.fund(XRP(1000), alice);
 | 
			
		||||
        env.close();
 | 
			
		||||
 | 
			
		||||
        // Cron does not set
 | 
			
		||||
        env(cron::set(alice), txflags(tfCronUnset), ter(tecNO_ENTRY));
 | 
			
		||||
        env.close();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void
 | 
			
		||||
@@ -230,7 +240,10 @@ struct Cron_test : public beast::unit_test::suite
 | 
			
		||||
        BEAST_EXPECT(cronSle2->getFieldU32(sfRepeatCount) == 10);
 | 
			
		||||
 | 
			
		||||
        // delete cron
 | 
			
		||||
        env(cron::set(alice), fee(XRP(1)), ter(tesSUCCESS));
 | 
			
		||||
        env(cron::set(alice),
 | 
			
		||||
            fee(XRP(1)),
 | 
			
		||||
            txflags(tfCronUnset),
 | 
			
		||||
            ter(tesSUCCESS));
 | 
			
		||||
        env.close();
 | 
			
		||||
 | 
			
		||||
        // owner count decremented
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user