Remember·sync · inline
ᛏ
Scheduler
Self-waking contracts
Register callbacks at future blocks. Bypasses sender lock.
0x56e776BAE2DD60664b69Bd5F865F1180ffB7D58BExplorer
System contract (not a precompile). Calls bypass the sender lock — multiple scheduled jobs from the same EOA can run in parallel.
Setup before submit: (1) Pre-fund your RitualWallet escrow (
≥ 0.01 RITUAL) — payer drains from this. (2) Authorize the Scheduler contract as a spender on your RitualWallet (one-time approve tx). (3) startBlock must be ≥ current block, and target must be a real callable contract. Validate (eth_call) will revert until all three are satisfied.contract to call
e.g. "tick(uint256)"
match types in signature
0 = next block
blocks
blocks
who pays from RitualWallet
cost: gas only (no escrow)
Connect your wallet to submit a real transaction.
to: 0x56e776BA…D58BchainId 1979 · system contract
Output
Click Validate call to encode and try the schedule call.
100 calls · every 600 blk · ~350 min total
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
interface IScheduler {
function schedule(
bytes calldata data,
uint32 gas, uint32 startBlock, uint32 numCalls, uint32 frequency,
uint32 ttl,
uint256 maxFeePerGas, uint256 maxPriorityFeePerGas,
uint256 value,
address payer
) external returns (uint256 callId);
}
contract MyScheduler {
IScheduler constant SCHEDULER =
IScheduler(0x56e776BAE2DD60664b69Bd5F865F1180ffB7D58B);
address public immutable target = "0x0000000000000000000000000000000000000000";
/// @notice Register a recurring call. Scheduler bypasses the sender lock
/// — multiple scheduled async jobs can run in parallel from the same
/// contract.
function setupSchedule() external returns (uint256 callId) {
bytes memory data = abi.encodeWithSignature(
"tick(uint256)"
// , …args…
);
callId = SCHEDULER.schedule(
data,
300000, 0, 100, 600,
100000,
30000000000, 2000000000,
0,
"0x0000000000000000000000000000000000000000"
);
}
}