schedule_timer

schedule_timer | code​

/**
* LiquidScheduler uses the schedule_timer macro to schedule a cron action on chain by adding a timer to the timerentry singleton
*
* @param {name} timer - account name to scope the timer within
* @param {std::vector<char>} payload - payload to be accessed within the timer_callback function in the consumer contract
* @param {uint32_t} seconds - seconds to repeat the cron
*
* Example:
*
* @code
* [[eosio::action]] void testschedule() {
* std::vector<char> payload;
* schedule_timer(_self, payload, 2);
* }
* @endcode
*/
​
TABLE timerentry { \
int64_t set_timestamp = 0; \
int64_t fired_timestamp = 0; \
};\
typedef eosio::singleton<"timer"_n, timerentry> timers_def;\
​
static void schedule_timer(name timer,std::vector<char> payload, uint32_t seconds){ \
timers_def timers(current_receiver(), timer.value); \
timerentry newtimer; \
if(timers.exists()){ \
newtimer = timers.get(); \
} \
newtimer.fired_timestamp = 0;\
newtimer.set_timestamp = eosio::current_time_point().time_since_epoch().count();\
timers.set(newtimer, current_receiver()); \
SEND_SVC_REQUEST(schedule, timer, payload, seconds); \
} \
​
SVC_RESP_CRON(schedule)(name timer,std::vector<char> payload, uint32_t seconds,name current_provider){ \
timers_def timers(current_receiver() , timer.value); \
if(!timers.exists()) \
return; \
auto current_timer = timers.get(); \
if(current_timer.fired_timestamp != 0 || (current_timer.set_timestamp + (seconds * 1000000) > eosio::current_time_point().time_since_epoch().count()))\
return; \
current_timer.fired_timestamp = eosio::current_time_point().time_since_epoch().count(); \
timers.set(current_timer, current_receiver()); \
if(!timer_callback(timer, payload, seconds)) \
return; \
schedule_timer(timer, payload, seconds);\
} \
Copy link