Request Factory

class Scheduler

Introduction

The Scheduler contract is the high level API for scheduling transaction requests. It exposes a very minimal subset of the full parameters that can be specified for a TransactionRequest in order to provide a simplified scheduling API with fewer foot-guns.

The Alarm service exposes two schedulers.

Both of these contracts present an identical API. The only difference is which temporalUnit that each created TransactionRequest contract is configured with.

Interface

pragma solidity 0.4.19;

import "contracts/Library/RequestScheduleLib.sol";
import "contracts/Library/SchedulerLib.sol";

/**
 * @title SchedulerInterface
 * @dev The base contract that the higher contracts: BaseScheduler, BlockScheduler and TimestampScheduler all inherit from.
 */
contract SchedulerInterface {
    using SchedulerLib for SchedulerLib.FutureTransaction;

    // The RequestFactory address which produces requests for this scheduler.
    address public factoryAddress;
    
    // The TemporalUnit of this scheduler.
    RequestScheduleLib.TemporalUnit public temporalUnit;

    /*
     * Local storage variable used to house the data for transaction
     * scheduling.
     */
    SchedulerLib.FutureTransaction public futureTransaction;

    /*
     * When applied to a function, causes the local futureTransaction to
     * get reset to it's defaults on each function call.
     */
    modifier doReset {
        if (temporalUnit == RequestScheduleLib.TemporalUnit.Blocks) {
            futureTransaction.resetAsBlock();
        } else if (temporalUnit == RequestScheduleLib.TemporalUnit.Timestamp) {
            futureTransaction.resetAsTimestamp();
        } else {
            revert();
        }
        _;
    }
        
    function schedule(address   _toAddress,
                      bytes     _callData,
                      uint[8]   _uintArgs)
        doReset
        public payable returns (address);

}

Defaults

The following defaults are used when creating a new TransactionRequest contract via either Scheduler contract.

  • feeRecipient: 0xecc9c5fff8937578141592e7E62C2D2E364311b8 which is the address of the developer contribution wallet, which is used to fund the project.
  • payment: 1000000 * tx.gasprice set at the time of scheduling.
  • fee: 10000 * tx.gasprice or 1/100th of the default payment.
  • reservedWindowSize: 16 blocks or 5 minutes.
  • freezePeriod: 10 blocks or 3 minutes
  • claimWindowSize: 255 blocks or 60 minutes.

API

There is just one schedule method on each Scheduler contract with different call signatures. (Prior versions of the EAC had 2 API methods, we reduced this down to only the full API to force specification of all parameters.)

Scheduler.schedule(address _toAddress, bytes _callData, uint[7] _uintArgs) public payable returns (address newRequest)

The _toAddress is the recipient that the transaction will be sent to when it is executed. The recipient can be any valid Ethereum address including both user accounts and contracts. _callData is the encoded bytecode that will be sent with the transaction. Simple value transfers can set this variable to an empty string, but more complex calls will need to encode the method of the inteded call and pass it in this variable.

The _uintArgs map to the following variables:

  • _uintArgs[0]: The callGas to be sent with the executing transaction.
  • _uintArgs[1]: The value in wei to be sent with the transaction.
  • _uintArgs[2]: The windowSize, or size of the exeuction window.
  • _uintArgs[3]: The windowStart, or the block / timestamp of when the execution window begins.
  • _uintArgs[4]: The gasPrice that must be sent with the executing transaction.
  • _uintArgs[5]: The fee value attached to the transaction.
  • _uintArgs[6]: The payment value attached to the transaction.

The method returns the address of the newly created TransactionRequest.

Endowments

When scheduling a transaction, you must provide sufficient ether to cover all of the execution costs with some buffer to account for possible changes in the network gas price. See Check #1: Insufficient Endowment for more information on how to compute the endowment.