ETH Price: $3,426.40 (+4.36%)

Contract

0xb9D70C3d7E4453Cc679D8A91145a28782268f229
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Perform Upkeep169706282023-04-03 19:41:11599 days ago1680550871IN
0xb9D70C3d...82268f229
0 ETH0.022135235.2
Perform Upkeep169705302023-04-03 19:20:59599 days ago1680549659IN
0xb9D70C3d...82268f229
0 ETH0.0147591448.4
Perform Upkeep169575612023-04-01 23:28:35601 days ago1680391715IN
0xb9D70C3d...82268f229
0 ETH0.0115708721
Perform Upkeep169575092023-04-01 23:17:59601 days ago1680391079IN
0xb9D70C3d...82268f229
0 ETH0.0048790516
Perform Upkeep169562742023-04-01 19:07:47601 days ago1680376067IN
0xb9D70C3d...82268f229
0 ETH0.0095336118
Perform Upkeep169562512023-04-01 19:02:59601 days ago1680375779IN
0xb9D70C3d...82268f229
0 ETH0.0054889318
Perform Upkeep169505482023-03-31 23:48:47602 days ago1680306527IN
0xb9D70C3d...82268f229
0 ETH0.0082214620
Perform Upkeep169504972023-03-31 23:38:23602 days ago1680305903IN
0xb9D70C3d...82268f229
0 ETH0.0063732620.9
Perform Upkeep169492622023-03-31 19:28:59602 days ago1680290939IN
0xb9D70C3d...82268f229
0 ETH0.0167315826.4
Perform Upkeep169491932023-03-31 19:14:59602 days ago1680290099IN
0xb9D70C3d...82268f229
0 ETH0.0107339235.2
Perform Upkeep169421642023-03-30 19:34:11603 days ago1680204851IN
0xb9D70C3d...82268f229
0 ETH0.0149383326.4
Perform Upkeep169420492023-03-30 19:10:35603 days ago1680203435IN
0xb9D70C3d...82268f229
0 ETH0.0090567429.7
Perform Upkeep169351782023-03-29 20:01:35604 days ago1680120095IN
0xb9D70C3d...82268f229
0 ETH0.0160987233.88
Perform Upkeep169350432023-03-29 19:34:23604 days ago1680118463IN
0xb9D70C3d...82268f229
0 ETH0.0117402238.5
Perform Upkeep169279962023-03-28 19:46:47605 days ago1680032807IN
0xb9D70C3d...82268f229
0 ETH0.0190202731.46
Perform Upkeep169278602023-03-28 19:19:23605 days ago1680031163IN
0xb9D70C3d...82268f229
0 ETH0.010331433.88
Perform Upkeep169209132023-03-27 19:51:47606 days ago1679946707IN
0xb9D70C3d...82268f229
0 ETH0.0184140429.282
Perform Upkeep169207032023-03-27 19:08:47606 days ago1679944127IN
0xb9D70C3d...82268f229
0 ETH0.0090567429.7
Perform Upkeep169077162023-03-25 23:22:35608 days ago1679786555IN
0xb9D70C3d...82268f229
0 ETH0.0080998315
Perform Upkeep169076962023-03-25 23:18:35608 days ago1679786315IN
0xb9D70C3d...82268f229
0 ETH0.0045741115
Perform Upkeep169064892023-03-25 19:15:59608 days ago1679771759IN
0xb9D70C3d...82268f229
0 ETH0.0100134719
Perform Upkeep169064552023-03-25 19:08:47608 days ago1679771327IN
0xb9D70C3d...82268f229
0 ETH0.0073795724.2
Perform Upkeep169007502023-03-24 23:54:35609 days ago1679702075IN
0xb9D70C3d...82268f229
0 ETH0.0087009420.9
Perform Upkeep169006432023-03-24 23:32:47609 days ago1679700767IN
0xb9D70C3d...82268f229
0 ETH0.0048790516
Perform Upkeep168993902023-03-24 19:18:35609 days ago1679685515IN
0xb9D70C3d...82268f229
0 ETH0.0151422422
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PrizeStrategyUpkeep

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 11 : PrizeStrategyUpkeep.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.6;
pragma experimental ABIEncoderV2;

import "./interfaces/KeeperCompatibleInterface.sol";
import "./interfaces/PeriodicPrizeStrategyInterface.sol";
import "./interfaces/PrizePoolRegistryInterface.sol";
import "./interfaces/PrizePoolInterface.sol";
import "./utils/SafeAwardable.sol";

import "@pooltogether/pooltogether-generic-registry/contracts/AddressRegistry.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Pausable.sol";

///@notice Contract implements Chainlink's Upkeep system interface, automating the upkeep of PrizePools in the associated registry. 
contract PrizeStrategyUpkeep is KeeperCompatibleInterface, Ownable, Pausable {

    /// @notice Ensures the target address is a prize strategy (has both canStartAward and canCompleteAward)
    using SafeAwardable for address;

    /// @notice Stores the maximum number of prize strategies to upkeep. 
    AddressRegistry public prizePoolRegistry;

    /// @notice Stores the maximum number of prize strategies to upkeep. 
    /// @dev Set accordingly to prevent out-of-gas transactions during calls to performUpkeep
    uint256 public upkeepBatchSize;

    /// @notice Stores the last upkeep block number
    uint256 public upkeepLastUpkeepBlockNumber;

    /// @notice Stores the minimum block interval between permitted performUpkeep() calls
    uint256 public upkeepMinimumBlockInterval;

    /// @notice Emitted when the upkeepBatchSize has been changed
    event UpkeepBatchSizeUpdated(uint256 upkeepBatchSize);

    /// @notice Emitted when the prize pool registry has been changed
    event UpkeepPrizePoolRegistryUpdated(AddressRegistry prizePoolRegistry);

    /// @notice Emitted when the Upkeep Minimum Block interval is updated
    event UpkeepMinimumBlockIntervalUpdated(uint256 upkeepMinimumBlockInterval);

    /// @notice Emitted when the Upkeep has been performed
    event UpkeepPerformed(uint256 startAwardsPerformed, uint256 completeAwardsPerformed);


    constructor(AddressRegistry _prizePoolRegistry, uint256 _upkeepBatchSize, uint256 _upkeepMinimumBlockInterval) public Ownable() {
        prizePoolRegistry = _prizePoolRegistry;
        emit UpkeepPrizePoolRegistryUpdated(_prizePoolRegistry);

        upkeepBatchSize = _upkeepBatchSize;
        emit UpkeepBatchSizeUpdated(_upkeepBatchSize);

        upkeepMinimumBlockInterval = _upkeepMinimumBlockInterval;
        emit UpkeepMinimumBlockIntervalUpdated(_upkeepMinimumBlockInterval);
    }


    /// @notice Checks if PrizePools require upkeep. Call in a static manner every block by the Chainlink Upkeep network.
    /// @param checkData Not used in this implementation.
    /// @return upkeepNeeded as true if performUpkeep() needs to be called, false otherwise. performData returned empty. 
    function checkUpkeep(bytes calldata checkData) external view override returns (bool upkeepNeeded, bytes memory performData) {

        if(paused()) return (false, performData);

        if(block.number < upkeepLastUpkeepBlockNumber + upkeepMinimumBlockInterval){
            return (false, performData);
        }
        
        address[] memory prizePools = prizePoolRegistry.getAddresses();

        // check if canStartAward()
        for(uint256 pool = 0; pool < prizePools.length; pool++){
            address prizeStrategy = PrizePoolInterface(prizePools[pool]).prizeStrategy();
            if(prizeStrategy.canStartAward()){
                return (true, performData);
            } 
        }
        // check if canCompleteAward()
        for(uint256 pool = 0; pool < prizePools.length; pool++){
            address prizeStrategy = PrizePoolInterface(prizePools[pool]).prizeStrategy();
            if(prizeStrategy.canCompleteAward()){
                return (true, performData);
            } 
        }
        return (false, performData);
    }
    
    /// @notice Performs upkeep on the prize pools. 
    /// @param performData Not used in this implementation.
    function performUpkeep(bytes calldata performData) external override whenNotPaused {

        uint256 _upkeepLastUpkeepBlockNumber = upkeepLastUpkeepBlockNumber; // SLOAD
        require(block.number > _upkeepLastUpkeepBlockNumber + upkeepMinimumBlockInterval, "PrizeStrategyUpkeep::minimum block interval not reached");

        address[] memory prizePools = prizePoolRegistry.getAddresses();

      
        uint256 batchCounter = upkeepBatchSize; //counter for batch

        uint256 poolIndex = 0;
        uint256 startAwardCounter = 0;
        uint256 completeAwardCounter = 0;

        uint256 updatedUpkeepBlockNumber;

        while(batchCounter > 0 && poolIndex < prizePools.length){
            
            address prizeStrategy = PrizePoolInterface(prizePools[poolIndex]).prizeStrategy();
            
            if(prizeStrategy.canStartAward()){
                PeriodicPrizeStrategyInterface(prizeStrategy).startAward();
                startAwardCounter++;
                batchCounter--;
            }
            else if(prizeStrategy.canCompleteAward()){
                PeriodicPrizeStrategyInterface(prizeStrategy).completeAward();       
                completeAwardCounter++;
                batchCounter--;
            }
            poolIndex++;            
        }
        
        if(startAwardCounter > 0 || completeAwardCounter > 0){
            updatedUpkeepBlockNumber = block.number;
        }

        // update if required
        if(_upkeepLastUpkeepBlockNumber != updatedUpkeepBlockNumber){
            upkeepLastUpkeepBlockNumber = updatedUpkeepBlockNumber; //SSTORE
            emit UpkeepPerformed(startAwardCounter, completeAwardCounter);
        }
  
    }


    /// @notice Updates the upkeepBatchSize which is set to prevent out of gas situations
    /// @param _upkeepBatchSize Amount upkeepBatchSize will be set to
    function updateUpkeepBatchSize(uint256 _upkeepBatchSize) external onlyOwner {
        upkeepBatchSize = _upkeepBatchSize;
        emit UpkeepBatchSizeUpdated(_upkeepBatchSize);
    }


    /// @notice Updates the prize pool registry
    /// @param _prizePoolRegistry New registry address
    function updatePrizePoolRegistry(AddressRegistry _prizePoolRegistry) external onlyOwner {
        prizePoolRegistry = _prizePoolRegistry;
        emit UpkeepPrizePoolRegistryUpdated(_prizePoolRegistry);
    }


    /// @notice Updates the upkeep minimum interval blocks
    /// @param _upkeepMinimumBlockInterval New upkeepMinimumBlockInterval
    function updateUpkeepMinimumBlockInterval(uint256 _upkeepMinimumBlockInterval) external onlyOwner {
        upkeepMinimumBlockInterval = _upkeepMinimumBlockInterval;
        emit UpkeepMinimumBlockIntervalUpdated(_upkeepMinimumBlockInterval);
    }

    /// @notice Pauses the contract. Only callable by owner.
    function pause() external onlyOwner {
        _pause();
    }

    /// @notice Unpauses the contract. Only callable by owner.
    function unpause() external onlyOwner {
        _unpause();
    }

}

File 2 of 11 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

import "../utils/Context.sol";
/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 3 of 11 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

File 4 of 11 : Pausable.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

import "./Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor () internal {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 5 of 11 : AddressRegistry.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.12 <=0.7.6;

import "@openzeppelin/contracts/access/Ownable.sol";

import "./utils/MappedSinglyLinkedList.sol";

///@notice A registry to hold Contract addresses.  Underlying data structure is a singly linked list. 
contract AddressRegistry is Ownable {

    using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;

    MappedSinglyLinkedList.Mapping internal addressList;

    /// @notice Emmitted when a contract has been added to the registry
    event AddressAdded(address indexed _address);
    
    /// @notice Emmitted when a contract has been removed to the registry
    event AddressRemoved(address indexed _address);

    /// @notice Emitted when all the registry addresses are cleared
    event AllAddressesCleared();

    /// @notice Storage field for what type of contract this Registry is storing 
    string public addressType;    

    /// @notice Contract constructor sets addressType, intializes list and transfers ownership
    /// @param _addressType The type of contracts stored in this registry 
    /// @param _owner The address to set as owner of the contract
    constructor(string memory _addressType, address _owner) Ownable() {
        addressType = _addressType;
        addressList.initialize();
        transferOwnership(_owner);
    }

    /// @notice Returns an array of all contract addresses in the linked list
    /// @return Array of contract addresses
    function getAddresses() view external returns(address[] memory) {
        return addressList.addressArray();
    } 

    /// @notice Adds addresses to the linked list. Will revert if the address is already in the list.  Can only be called by the Registry owner.
    /// @param _addresses Array of contract addresses to be added
    function addAddresses(address[] calldata _addresses) public onlyOwner {
        for(uint256 _address = 0; _address < _addresses.length; _address++ ){
            addressList.addAddress(_addresses[_address]);
            emit AddressAdded(_addresses[_address]);
        }
    }

    /// @notice Removes an address from the linked list. Can only be called by the Registry owner.
    /// @param _previousContract The address positionally located before the address that will be deleted. This may be the SENTINEL address if the list contains one contract address
    /// @param _address The address to remove from the linked list. 
    function removeAddress(address _previousContract, address _address) public onlyOwner {
        addressList.removeAddress(_previousContract, _address); 
        emit AddressRemoved(_address);
    } 

    /// @notice Removes every address from the list
    function clearAll() public onlyOwner {
        addressList.clearAll();
        emit AllAddressesCleared();
    }
    
    /// @notice Determines whether the list contains the given address
    /// @param _addr The address to check
    /// @return True if the address is contained, false otherwise.
    function contains(address _addr) public returns (bool) {
        return addressList.contains(_addr);
    }

    /// @notice Gives the address at the start of the list
    /// @return The address at the start of the list
    function start() public view returns (address) {
        return addressList.start();
    }

    /// @notice Exposes the internal next() iterator
    /// @param current The current address
    /// @return Returns the next address in the list
    function next(address current) public view returns (address) {
        return addressList.next(current);
    }
    
    /// @notice Exposes the end of the list
    /// @return The sentinel address
    function end() public view returns (address) {
        return addressList.end();
    }

}

File 6 of 11 : MappedSinglyLinkedList.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.7.6;

/// @notice An efficient implementation of a singly linked list of addresses
/// @dev A mapping(address => address) tracks the 'next' pointer.  A special address called the SENTINEL is used to denote the beginning and end of the list.
library MappedSinglyLinkedList {

  /// @notice The special value address used to denote the end of the list
  address public constant SENTINEL = address(0x1);

  /// @notice The data structure to use for the list.
  struct Mapping {
    uint256 count;

    mapping(address => address) addressMap;
  }

  /// @notice Initializes the list.
  /// @dev It is important that this is called so that the SENTINEL is correctly setup.
  function initialize(Mapping storage self) internal {
    require(self.count == 0, "Already init");
    self.addressMap[SENTINEL] = SENTINEL;
  }

  function start(Mapping storage self) internal view returns (address) {
    return self.addressMap[SENTINEL];
  }

  function next(Mapping storage self, address current) internal view returns (address) {
    return self.addressMap[current];
  }

  function end(Mapping storage) internal pure returns (address) {
    return SENTINEL;
  }

  function addAddresses(Mapping storage self, address[] memory addresses) internal {
    for (uint256 i = 0; i < addresses.length; i++) {
      addAddress(self, addresses[i]);
    }
  }

  /// @notice Adds an address to the front of the list.
  /// @param self The Mapping struct that this function is attached to
  /// @param newAddress The address to shift to the front of the list
  function addAddress(Mapping storage self, address newAddress) internal {
    require(newAddress != SENTINEL && newAddress != address(0), "Invalid address");
    require(self.addressMap[newAddress] == address(0), "Already added");
    self.addressMap[newAddress] = self.addressMap[SENTINEL];
    self.addressMap[SENTINEL] = newAddress;
    self.count = self.count + 1;
  }

  /// @notice Removes an address from the list
  /// @param self The Mapping struct that this function is attached to
  /// @param prevAddress The address that precedes the address to be removed.  This may be the SENTINEL if at the start.
  /// @param addr The address to remove from the list.
  function removeAddress(Mapping storage self, address prevAddress, address addr) internal {
    require(addr != SENTINEL && addr != address(0), "Invalid address");
    require(self.addressMap[prevAddress] == addr, "Invalid prevAddress");
    self.addressMap[prevAddress] = self.addressMap[addr];
    delete self.addressMap[addr];
    self.count = self.count - 1;
  }

  /// @notice Determines whether the list contains the given address
  /// @param self The Mapping struct that this function is attached to
  /// @param addr The address to check
  /// @return True if the address is contained, false otherwise.
  function contains(Mapping storage self, address addr) internal view returns (bool) {
    return addr != SENTINEL && addr != address(0) && self.addressMap[addr] != address(0);
  }

  /// @notice Returns an address array of all the addresses in this list
  /// @dev Contains a for loop, so complexity is O(n) wrt the list size
  /// @param self The Mapping struct that this function is attached to
  /// @return An array of all the addresses
  function addressArray(Mapping storage self) internal view returns (address[] memory) {
    address[] memory array = new address[](self.count);
    uint256 count;
    address currentAddress = self.addressMap[SENTINEL];
    while (currentAddress != address(0) && currentAddress != SENTINEL) {
      array[count] = currentAddress;
      currentAddress = self.addressMap[currentAddress];
      count++;
    }
    return array;
  }

  /// @notice Removes every address from the list
  /// @param self The Mapping struct that this function is attached to
  function clearAll(Mapping storage self) internal {
    address currentAddress = self.addressMap[SENTINEL];
    while (currentAddress != address(0) && currentAddress != SENTINEL) {
      address nextAddress = self.addressMap[currentAddress];
      delete self.addressMap[currentAddress];
      currentAddress = nextAddress;
    }
    self.addressMap[SENTINEL] = SENTINEL;
    self.count = 0;
  }
}

File 7 of 11 : KeeperCompatibleInterface.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.7.6;

interface KeeperCompatibleInterface {

  /**
   * @notice method that is simulated by the keepers to see if any work actually
   * needs to be performed. This method does does not actually need to be
   * executable, and since it is only ever simulated it can consume lots of gas.
   * @dev To ensure that it is never called, you may want to add the
   * cannotExecute modifier from KeeperBase to your implementation of this
   * method.
   * @param checkData specified in the upkeep registration so it is always the
   * same for a registered upkeep. This can easily be broken down into specific
   * arguments using `abi.decode`, so multiple upkeeps can be registered on the
   * same contract and easily differentiated by the contract.
   * @return upkeepNeeded boolean to indicate whether the keeper should call
   * performUpkeep or not.
   * @return performData bytes that the keeper should call performUpkeep with, if
   * upkeep is needed. If you would like to encode data to decode later, try
   * `abi.encode`.
   */
  function checkUpkeep(
    bytes calldata checkData
  )
    external
    returns (
      bool upkeepNeeded,
      bytes memory performData
    );
  /**
   * @notice method that is actually executed by the keepers, via the registry.
   * The data returned by the checkUpkeep simulation will be passed into
   * this method to actually be executed.
   * @dev The input to this method should not be trusted, and the caller of the
   * method should not even be restricted to any single registry. Anyone should
   * be able call it, and the input should be validated, there is no guarantee
   * that the data passed in is the performData returned from checkUpkeep. This
   * could happen due to malicious keepers, racing keepers, or simply a state
   * change while the performUpkeep transaction is waiting for confirmation.
   * Always validate the data passed in.
   * @param performData is the data which was passed back from the checkData
   * simulation. If it is encoded, it can easily be decoded into other types by
   * calling `abi.decode`. This data should not be trusted, and should be
   * validated against the contract's current state.
   */
  function performUpkeep(
    bytes calldata performData
  ) external;
}

File 8 of 11 : PeriodicPrizeStrategyInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.6;

interface PeriodicPrizeStrategyInterface {
  function startAward() external;
  function completeAward() external;
  function canStartAward() external view returns (bool);
  function canCompleteAward() external view returns (bool);
}

File 9 of 11 : PrizePoolInterface.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.6;

interface PrizePoolInterface {
    function prizeStrategy() external view returns (address);
}

File 10 of 11 : PrizePoolRegistryInterface.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.6;

interface PrizePoolRegistryInterface {
    function getPrizePools() external view returns(address[] memory);
}

File 11 of 11 : SafeAwardable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.6;
pragma experimental ABIEncoderV2;

import "../interfaces/PeriodicPrizeStrategyInterface.sol";


///@notice Wrapper library for address that checks that the address supports canStartAward() and canCompleteAward() before calling
library SafeAwardable{

    ///@return canCompleteAward returns true if the function is supported AND can be completed 
    function canCompleteAward(address self) internal view returns (bool canCompleteAward){
        if(supportsFunction(self, PeriodicPrizeStrategyInterface.canCompleteAward.selector)){
            return PeriodicPrizeStrategyInterface(self).canCompleteAward();      
        }
        return false;
    }

    ///@return canStartAward returns true if the function is supported AND can be started, false otherwise
    function canStartAward(address self) internal view returns (bool canStartAward){
        if(supportsFunction(self, PeriodicPrizeStrategyInterface.canStartAward.selector)){
            return PeriodicPrizeStrategyInterface(self).canStartAward();
        }
        return false;
    }
    
    ///@param selector is the function selector to check against
    ///@return success returns true if function is implemented, false otherwise
    function supportsFunction(address self, bytes4 selector) internal view returns (bool success){
        bytes memory encodedParams = abi.encodeWithSelector(selector);
        (bool success, bytes memory result) = self.staticcall{ gas: 30000 }(encodedParams);
        if (result.length < 32){
            return (false);
        }
        if(!success && result.length > 0){
            revert(string(result));
        }
        return (success);
    }
}

Settings
{
  "evmVersion": "istanbul",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs",
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "remappings": [],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract AddressRegistry","name":"_prizePoolRegistry","type":"address"},{"internalType":"uint256","name":"_upkeepBatchSize","type":"uint256"},{"internalType":"uint256","name":"_upkeepMinimumBlockInterval","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"upkeepBatchSize","type":"uint256"}],"name":"UpkeepBatchSizeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"upkeepMinimumBlockInterval","type":"uint256"}],"name":"UpkeepMinimumBlockIntervalUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"startAwardsPerformed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"completeAwardsPerformed","type":"uint256"}],"name":"UpkeepPerformed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract AddressRegistry","name":"prizePoolRegistry","type":"address"}],"name":"UpkeepPrizePoolRegistryUpdated","type":"event"},{"inputs":[{"internalType":"bytes","name":"checkData","type":"bytes"}],"name":"checkUpkeep","outputs":[{"internalType":"bool","name":"upkeepNeeded","type":"bool"},{"internalType":"bytes","name":"performData","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"performData","type":"bytes"}],"name":"performUpkeep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"prizePoolRegistry","outputs":[{"internalType":"contract AddressRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract AddressRegistry","name":"_prizePoolRegistry","type":"address"}],"name":"updatePrizePoolRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_upkeepBatchSize","type":"uint256"}],"name":"updateUpkeepBatchSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_upkeepMinimumBlockInterval","type":"uint256"}],"name":"updateUpkeepMinimumBlockInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"upkeepBatchSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"upkeepLastUpkeepBlockNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"upkeepMinimumBlockInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506040516200144c3803806200144c833981016040819052620000349162000177565b60006200004062000173565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506000805460ff60a01b19169055600180546001600160a01b0319166001600160a01b0385161790556040517f3945779a0b94143e19ceb0254d7ff1fbe6c4265b6328031e7cc1274c2b8d77c790620000e4908590620001ba565b60405180910390a160028290556040517fb722c0a05d55d91208263d973f28b92fc9599d46d7c490ff2efae89d8f3ddfe89062000123908490620001ce565b60405180910390a160048190556040517f7a5354403e343fa02d40d3906b696f894d8b73fb8a898b07d7414f29866ef5d39062000162908390620001ce565b60405180910390a1505050620001d7565b3390565b6000806000606084860312156200018c578283fd5b83516001600160a01b0381168114620001a3578384fd5b602085015160409095015190969495509392505050565b6001600160a01b0391909116815260200190565b90815260200190565b61126580620001e76000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c80636e04ff0d11610097578063ad06337f11610066578063ad06337f146101be578063ba450a1a146101c6578063f2085170146101ce578063f2fde38b146101e1576100f5565b80636e04ff0d14610178578063715018a6146101995780638456cb59146101a15780638da5cb5b146101a9576100f5565b80634585e33b116100d35780634585e33b146101355780634fd47a76146101485780635c975abb146101505780635fdc3b5814610165576100f5565b80632dc41821146100fa5780633f4ba83a1461011857806343d73f2d14610122575b600080fd5b6101026101f4565b60405161010f919061118a565b60405180910390f35b6101206101fa565b005b610120610130366004610ef7565b610266565b61012061014336600461100b565b61031e565b61010261062c565b610158610632565b60405161010f91906110ec565b610120610173366004611078565b610642565b61018b61018636600461100b565b6106d9565b60405161010f9291906110f7565b61012061091b565b6101206109c7565b6101b1610a31565b60405161010f91906110d8565b6101b1610a40565b610102610a4f565b6101206101dc366004611078565b610a55565b6101206101ef366004610ef7565b610aec565b60025481565b610202610bee565b6001600160a01b0316610213610a31565b6001600160a01b03161461025c576040805162461bcd60e51b81526020600482018190526024820152600080516020611210833981519152604482015290519081900360640190fd5b610264610bf2565b565b61026e610bee565b6001600160a01b031661027f610a31565b6001600160a01b0316146102c8576040805162461bcd60e51b81526020600482018190526024820152600080516020611210833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0383161790556040517f3945779a0b94143e19ceb0254d7ff1fbe6c4265b6328031e7cc1274c2b8d77c7906103139083906110d8565b60405180910390a150565b610326610632565b1561036b576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6003546004548101431161039a5760405162461bcd60e51b81526004016103919061112d565b60405180910390fd5b600154604080516351cfd60960e11b815290516000926001600160a01b03169163a39fac129160048083019286929190829003018186803b1580156103de57600080fd5b505afa1580156103f2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261041a9190810190610f36565b60025490915060008080805b6000851180156104365750855184105b156105c357600086858151811061044957fe5b60200260200101516001600160a01b03166398bf3eb66040518163ffffffff1660e01b815260040160206040518083038186803b15801561048957600080fd5b505afa15801561049d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104c19190610f1a565b90506104d5816001600160a01b0316610c95565b1561053f57806001600160a01b031663b9ee1e056040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561051557600080fd5b505af1158015610529573d6000803e3d6000fd5b50506000199097019650506001909301926105b7565b610551816001600160a01b0316610d2e565b156105b757806001600160a01b031663dfb2f13b6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561059157600080fd5b505af11580156105a5573d6000803e3d6000fd5b50506000199097019650506001909201915b50600190930192610426565b60008311806105d25750600082115b156105da5750435b8087146106215760038190556040517f9fbc2aeb5bf6200e5499d345acddf1dd462c37becb4673d661250b89ced7ff6a906106189085908590611193565b60405180910390a15b505050505050505050565b60045481565b600054600160a01b900460ff1690565b61064a610bee565b6001600160a01b031661065b610a31565b6001600160a01b0316146106a4576040805162461bcd60e51b81526020600482018190526024820152600080516020611210833981519152604482015290519081900360640190fd5b60028190556040517fb722c0a05d55d91208263d973f28b92fc9599d46d7c490ff2efae89d8f3ddfe89061031390839061118a565b600060606106e5610632565b156106f35760009150610914565b6004546003540143101561070a5760009150610914565b600154604080516351cfd60960e11b815290516000926001600160a01b03169163a39fac129160048083019286929190829003018186803b15801561074e57600080fd5b505afa158015610762573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261078a9190810190610f36565b905060005b815181101561084c5760008282815181106107a657fe5b60200260200101516001600160a01b03166398bf3eb66040518163ffffffff1660e01b815260040160206040518083038186803b1580156107e657600080fd5b505afa1580156107fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081e9190610f1a565b9050610832816001600160a01b0316610c95565b156108435760019450505050610914565b5060010161078f565b5060005b815181101561090d57600082828151811061086757fe5b60200260200101516001600160a01b03166398bf3eb66040518163ffffffff1660e01b815260040160206040518083038186803b1580156108a757600080fd5b505afa1580156108bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108df9190610f1a565b90506108f3816001600160a01b0316610d2e565b156109045760019450505050610914565b50600101610850565b5060009250505b9250929050565b610923610bee565b6001600160a01b0316610934610a31565b6001600160a01b03161461097d576040805162461bcd60e51b81526020600482018190526024820152600080516020611210833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6109cf610bee565b6001600160a01b03166109e0610a31565b6001600160a01b031614610a29576040805162461bcd60e51b81526020600482018190526024820152600080516020611210833981519152604482015290519081900360640190fd5b610264610d7f565b6000546001600160a01b031690565b6001546001600160a01b031681565b60035481565b610a5d610bee565b6001600160a01b0316610a6e610a31565b6001600160a01b031614610ab7576040805162461bcd60e51b81526020600482018190526024820152600080516020611210833981519152604482015290519081900360640190fd5b60048190556040517f7a5354403e343fa02d40d3906b696f894d8b73fb8a898b07d7414f29866ef5d39061031390839061118a565b610af4610bee565b6001600160a01b0316610b05610a31565b6001600160a01b031614610b4e576040805162461bcd60e51b81526020600482018190526024820152600080516020611210833981519152604482015290519081900360640190fd5b6001600160a01b038116610b935760405162461bcd60e51b81526004018080602001828103825260268152602001806111ea6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b610bfa610632565b610c42576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa610c78610bee565b604080516001600160a01b039092168252519081900360200190a1565b6000610ca8826343b7ae3f60e11b610e08565b15610d2557816001600160a01b031663876f5c7e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ce657600080fd5b505afa158015610cfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1e9190610feb565b9050610d29565b5060005b919050565b6000610d4182636a74f10760e01b610e08565b15610d2557816001600160a01b0316636a74f1076040518163ffffffff1660e01b815260040160206040518083038186803b158015610ce657600080fd5b610d87610632565b15610dcc576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610c78610bee565b60408051600481526024810182526020810180516001600160e01b03166001600160e01b03198516179052905160009190829081906001600160a01b0387169061753090610e579086906110bc565b6000604051808303818686fa925050503d8060008114610e93576040519150601f19603f3d011682016040523d82523d6000602084013e610e98565b606091505b5091509150602081511015610eb35760009350505050610ee6565b81158015610ec2575060008151115b15610ee1578060405162461bcd60e51b8152600401610391919061111a565b509150505b92915050565b8051610d29816111d1565b600060208284031215610f08578081fd5b8135610f13816111d1565b9392505050565b600060208284031215610f2b578081fd5b8151610f13816111d1565b60006020808385031215610f48578182fd5b825167ffffffffffffffff80821115610f5f578384fd5b818501915085601f830112610f72578384fd5b815181811115610f7e57fe5b83810260405185828201018181108582111715610f9757fe5b604052828152858101935084860182860187018a1015610fb5578788fd5b8795505b83861015610fde57610fca81610eec565b855260019590950194938601938601610fb9565b5098975050505050505050565b600060208284031215610ffc578081fd5b81518015158114610f13578182fd5b6000806020838503121561101d578081fd5b823567ffffffffffffffff80821115611034578283fd5b818501915085601f830112611047578283fd5b813581811115611055578384fd5b866020828501011115611066578384fd5b60209290920196919550909350505050565b600060208284031215611089578081fd5b5035919050565b600081518084526110a88160208601602086016111a1565b601f01601f19169290920160200192915050565b600082516110ce8184602087016111a1565b9190910192915050565b6001600160a01b0391909116815260200190565b901515815260200190565b60008315158252604060208301526111126040830184611090565b949350505050565b600060208252610f136020830184611090565b60208082526037908201527f5072697a65537472617465677955706b6565703a3a6d696e696d756d20626c6f60408201527f636b20696e74657276616c206e6f742072656163686564000000000000000000606082015260800190565b90815260200190565b918252602082015260400190565b60005b838110156111bc5781810151838201526020016111a4565b838111156111cb576000848401525b50505050565b6001600160a01b03811681146111e657600080fd5b5056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220f0b1ac0ffb865fa3077e5790062f9c7974854fa2bc8e12a55accad505875155064736f6c6343000706003300000000000000000000000034733851e2047f8d0e1aa91124a6f9eadc54d2530000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000f

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100f55760003560e01c80636e04ff0d11610097578063ad06337f11610066578063ad06337f146101be578063ba450a1a146101c6578063f2085170146101ce578063f2fde38b146101e1576100f5565b80636e04ff0d14610178578063715018a6146101995780638456cb59146101a15780638da5cb5b146101a9576100f5565b80634585e33b116100d35780634585e33b146101355780634fd47a76146101485780635c975abb146101505780635fdc3b5814610165576100f5565b80632dc41821146100fa5780633f4ba83a1461011857806343d73f2d14610122575b600080fd5b6101026101f4565b60405161010f919061118a565b60405180910390f35b6101206101fa565b005b610120610130366004610ef7565b610266565b61012061014336600461100b565b61031e565b61010261062c565b610158610632565b60405161010f91906110ec565b610120610173366004611078565b610642565b61018b61018636600461100b565b6106d9565b60405161010f9291906110f7565b61012061091b565b6101206109c7565b6101b1610a31565b60405161010f91906110d8565b6101b1610a40565b610102610a4f565b6101206101dc366004611078565b610a55565b6101206101ef366004610ef7565b610aec565b60025481565b610202610bee565b6001600160a01b0316610213610a31565b6001600160a01b03161461025c576040805162461bcd60e51b81526020600482018190526024820152600080516020611210833981519152604482015290519081900360640190fd5b610264610bf2565b565b61026e610bee565b6001600160a01b031661027f610a31565b6001600160a01b0316146102c8576040805162461bcd60e51b81526020600482018190526024820152600080516020611210833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0383161790556040517f3945779a0b94143e19ceb0254d7ff1fbe6c4265b6328031e7cc1274c2b8d77c7906103139083906110d8565b60405180910390a150565b610326610632565b1561036b576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6003546004548101431161039a5760405162461bcd60e51b81526004016103919061112d565b60405180910390fd5b600154604080516351cfd60960e11b815290516000926001600160a01b03169163a39fac129160048083019286929190829003018186803b1580156103de57600080fd5b505afa1580156103f2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261041a9190810190610f36565b60025490915060008080805b6000851180156104365750855184105b156105c357600086858151811061044957fe5b60200260200101516001600160a01b03166398bf3eb66040518163ffffffff1660e01b815260040160206040518083038186803b15801561048957600080fd5b505afa15801561049d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104c19190610f1a565b90506104d5816001600160a01b0316610c95565b1561053f57806001600160a01b031663b9ee1e056040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561051557600080fd5b505af1158015610529573d6000803e3d6000fd5b50506000199097019650506001909301926105b7565b610551816001600160a01b0316610d2e565b156105b757806001600160a01b031663dfb2f13b6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561059157600080fd5b505af11580156105a5573d6000803e3d6000fd5b50506000199097019650506001909201915b50600190930192610426565b60008311806105d25750600082115b156105da5750435b8087146106215760038190556040517f9fbc2aeb5bf6200e5499d345acddf1dd462c37becb4673d661250b89ced7ff6a906106189085908590611193565b60405180910390a15b505050505050505050565b60045481565b600054600160a01b900460ff1690565b61064a610bee565b6001600160a01b031661065b610a31565b6001600160a01b0316146106a4576040805162461bcd60e51b81526020600482018190526024820152600080516020611210833981519152604482015290519081900360640190fd5b60028190556040517fb722c0a05d55d91208263d973f28b92fc9599d46d7c490ff2efae89d8f3ddfe89061031390839061118a565b600060606106e5610632565b156106f35760009150610914565b6004546003540143101561070a5760009150610914565b600154604080516351cfd60960e11b815290516000926001600160a01b03169163a39fac129160048083019286929190829003018186803b15801561074e57600080fd5b505afa158015610762573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261078a9190810190610f36565b905060005b815181101561084c5760008282815181106107a657fe5b60200260200101516001600160a01b03166398bf3eb66040518163ffffffff1660e01b815260040160206040518083038186803b1580156107e657600080fd5b505afa1580156107fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081e9190610f1a565b9050610832816001600160a01b0316610c95565b156108435760019450505050610914565b5060010161078f565b5060005b815181101561090d57600082828151811061086757fe5b60200260200101516001600160a01b03166398bf3eb66040518163ffffffff1660e01b815260040160206040518083038186803b1580156108a757600080fd5b505afa1580156108bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108df9190610f1a565b90506108f3816001600160a01b0316610d2e565b156109045760019450505050610914565b50600101610850565b5060009250505b9250929050565b610923610bee565b6001600160a01b0316610934610a31565b6001600160a01b03161461097d576040805162461bcd60e51b81526020600482018190526024820152600080516020611210833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6109cf610bee565b6001600160a01b03166109e0610a31565b6001600160a01b031614610a29576040805162461bcd60e51b81526020600482018190526024820152600080516020611210833981519152604482015290519081900360640190fd5b610264610d7f565b6000546001600160a01b031690565b6001546001600160a01b031681565b60035481565b610a5d610bee565b6001600160a01b0316610a6e610a31565b6001600160a01b031614610ab7576040805162461bcd60e51b81526020600482018190526024820152600080516020611210833981519152604482015290519081900360640190fd5b60048190556040517f7a5354403e343fa02d40d3906b696f894d8b73fb8a898b07d7414f29866ef5d39061031390839061118a565b610af4610bee565b6001600160a01b0316610b05610a31565b6001600160a01b031614610b4e576040805162461bcd60e51b81526020600482018190526024820152600080516020611210833981519152604482015290519081900360640190fd5b6001600160a01b038116610b935760405162461bcd60e51b81526004018080602001828103825260268152602001806111ea6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b610bfa610632565b610c42576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa610c78610bee565b604080516001600160a01b039092168252519081900360200190a1565b6000610ca8826343b7ae3f60e11b610e08565b15610d2557816001600160a01b031663876f5c7e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ce657600080fd5b505afa158015610cfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1e9190610feb565b9050610d29565b5060005b919050565b6000610d4182636a74f10760e01b610e08565b15610d2557816001600160a01b0316636a74f1076040518163ffffffff1660e01b815260040160206040518083038186803b158015610ce657600080fd5b610d87610632565b15610dcc576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610c78610bee565b60408051600481526024810182526020810180516001600160e01b03166001600160e01b03198516179052905160009190829081906001600160a01b0387169061753090610e579086906110bc565b6000604051808303818686fa925050503d8060008114610e93576040519150601f19603f3d011682016040523d82523d6000602084013e610e98565b606091505b5091509150602081511015610eb35760009350505050610ee6565b81158015610ec2575060008151115b15610ee1578060405162461bcd60e51b8152600401610391919061111a565b509150505b92915050565b8051610d29816111d1565b600060208284031215610f08578081fd5b8135610f13816111d1565b9392505050565b600060208284031215610f2b578081fd5b8151610f13816111d1565b60006020808385031215610f48578182fd5b825167ffffffffffffffff80821115610f5f578384fd5b818501915085601f830112610f72578384fd5b815181811115610f7e57fe5b83810260405185828201018181108582111715610f9757fe5b604052828152858101935084860182860187018a1015610fb5578788fd5b8795505b83861015610fde57610fca81610eec565b855260019590950194938601938601610fb9565b5098975050505050505050565b600060208284031215610ffc578081fd5b81518015158114610f13578182fd5b6000806020838503121561101d578081fd5b823567ffffffffffffffff80821115611034578283fd5b818501915085601f830112611047578283fd5b813581811115611055578384fd5b866020828501011115611066578384fd5b60209290920196919550909350505050565b600060208284031215611089578081fd5b5035919050565b600081518084526110a88160208601602086016111a1565b601f01601f19169290920160200192915050565b600082516110ce8184602087016111a1565b9190910192915050565b6001600160a01b0391909116815260200190565b901515815260200190565b60008315158252604060208301526111126040830184611090565b949350505050565b600060208252610f136020830184611090565b60208082526037908201527f5072697a65537472617465677955706b6565703a3a6d696e696d756d20626c6f60408201527f636b20696e74657276616c206e6f742072656163686564000000000000000000606082015260800190565b90815260200190565b918252602082015260400190565b60005b838110156111bc5781810151838201526020016111a4565b838111156111cb576000848401525b50505050565b6001600160a01b03811681146111e657600080fd5b5056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220f0b1ac0ffb865fa3077e5790062f9c7974854fa2bc8e12a55accad505875155064736f6c63430007060033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000034733851e2047f8d0e1aa91124a6f9eadc54d2530000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000f

-----Decoded View---------------
Arg [0] : _prizePoolRegistry (address): 0x34733851E2047F8d0e1aa91124A6f9EaDc54D253
Arg [1] : _upkeepBatchSize (uint256): 2
Arg [2] : _upkeepMinimumBlockInterval (uint256): 15

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000034733851e2047f8d0e1aa91124a6f9eadc54d253
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000f


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.