Contract 0x3fBCb09Ee774F7e32Ba4D60d1E2D4CB9CE703984 1

Contract Overview

Balance:
0 Ether
Txn Hash
Method
Block
From
To
Value
0x1dd70aa5fa34805893a902251e682eec3ebcdf940faf1ea18a011f5a84055881Perform Upkeep86548642021-05-26 19:51:08404 days 4 hrs ago0xb889e88c6dc2f652ad319e1c0d9a30f5b08b9354 IN  0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce7039840 Ether0.002457071.5
0xbbf0ed2a3058bb17ff6cde86c45c5906880f6e025d1af4e112b69eb58414c01cPerform Upkeep86494672021-05-25 21:21:39405 days 3 hrs ago0xb889e88c6dc2f652ad319e1c0d9a30f5b08b9354 IN  0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce7039840 Ether0.000957091.5
0xfc6660d41952c1cc0d137da511119edf9824941b95f5deabd5259839a50c1b6bPerform Upkeep86259312021-05-21 19:15:52409 days 5 hrs ago0xb889e88c6dc2f652ad319e1c0d9a30f5b08b9354 IN  0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce7039840 Ether0.000851111.5
0x53067840c20d489a3bc71adaf3584bdfeb76caeec6bad42bfcd4eefd598e4a15Perform Upkeep86259122021-05-21 19:11:06409 days 5 hrs ago0xb889e88c6dc2f652ad319e1c0d9a30f5b08b9354 IN  0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce7039840 Ether0.000876671.5
0xf4b79364acf4037a4d0e7e0fffaabd9f769a94a8f5fa629aeea360feeae2b3bfPerform Upkeep86258922021-05-21 19:06:06409 days 5 hrs ago0xb889e88c6dc2f652ad319e1c0d9a30f5b08b9354 IN  0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce7039840 Ether0.001084711.5
0x510b52909f42f18df0d860c1d2aade771fce64403b7f20579490f5c8aa69c049Perform Upkeep86258722021-05-21 19:01:06409 days 5 hrs ago0xb889e88c6dc2f652ad319e1c0d9a30f5b08b9354 IN  0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce7039840 Ether0.00094051.5
0xc2347e1b9690f9d8539b297a34a1d28eb16d4c13b4080e6da653532b4e2fa9faPerform Upkeep86258522021-05-21 18:56:06409 days 5 hrs ago0xb889e88c6dc2f652ad319e1c0d9a30f5b08b9354 IN  0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce7039840 Ether0.000851321.5
0xe96778e4191522cee5a6476515b2c1026af31d7d97cc8554c591f16d3bdd6a18Perform Upkeep86258312021-05-21 18:50:51409 days 5 hrs ago0xb889e88c6dc2f652ad319e1c0d9a30f5b08b9354 IN  0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce7039840 Ether0.000944261.5
0x59fe727414c2bef10ed0e9f1267901c4ebef671e28dc99da460599239316d723Perform Upkeep86258122021-05-21 18:46:06409 days 5 hrs ago0xb889e88c6dc2f652ad319e1c0d9a30f5b08b9354 IN  0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce7039840 Ether0.000881621.5
0x46efdf3de2835e9a08f441d98fca7bc18ed8f3ac2967cad938bef1b215cbaa59Perform Upkeep86257922021-05-21 18:41:06409 days 5 hrs ago0xb889e88c6dc2f652ad319e1c0d9a30f5b08b9354 IN  0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce7039840 Ether0.000916691.5
0x1a83e6bcc2150b7942309d6808f490333356e8d8030afc813da46fa604078173Perform Upkeep86257722021-05-21 18:36:06409 days 6 hrs ago0xb889e88c6dc2f652ad319e1c0d9a30f5b08b9354 IN  0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce7039840 Ether0.000851111.5
0x59c88c70326a57eefc5d9ae72b1c3848950c8d3eb34097dce7377ae6448bac81Perform Upkeep86257522021-05-21 18:31:06409 days 6 hrs ago0xb889e88c6dc2f652ad319e1c0d9a30f5b08b9354 IN  0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce7039840 Ether0.000880391.5
0x1d762e08183a0bf77d5bd01e74b4b08084f5e622b37196e2b137897cb0ea7d4bPerform Upkeep86257322021-05-21 18:26:06409 days 6 hrs ago0xb889e88c6dc2f652ad319e1c0d9a30f5b08b9354 IN  0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce7039840 Ether0.000858041.5
0x8fc8e7933dcb6d3e365fc1c436bc35228c960adf4ef1bbf8f82c59084703c31aPerform Upkeep86257122021-05-21 18:21:06409 days 6 hrs ago0xb889e88c6dc2f652ad319e1c0d9a30f5b08b9354 IN  0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce7039840 Ether0.000853051.5
0x55e40e0d4235aacb7aa1a84bdc094814899223cbc9e918e270f6abd662e9bb0cPerform Upkeep86256922021-05-21 18:16:06409 days 6 hrs ago0xb889e88c6dc2f652ad319e1c0d9a30f5b08b9354 IN  0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce7039840 Ether0.00087791.5
0x84079cd274cd52ddcb7941f800cf09ba4000285f5e7ed4f10b0b9a00e75259b0Perform Upkeep86256722021-05-21 18:11:06409 days 6 hrs ago0xb889e88c6dc2f652ad319e1c0d9a30f5b08b9354 IN  0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce7039840 Ether0.00082971.5
0xdfcba7b831b49cbd35a5a1ff7a6e0aa0795fb969f0949664f64b8f491eba2508Perform Upkeep86256522021-05-21 18:06:06409 days 6 hrs ago0xb889e88c6dc2f652ad319e1c0d9a30f5b08b9354 IN  0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce7039840 Ether0.001106851.5
0x7590bd17dfcc28b5bcfad2376c7464c1f84e5afd3a444b27eec12940857e5dcePerform Upkeep86256322021-05-21 18:01:06409 days 6 hrs ago0xb889e88c6dc2f652ad319e1c0d9a30f5b08b9354 IN  0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce7039840 Ether0.000914351.5
0xfd32b8cbb7fddcecc061975ed085249873645f8acb0c2995bb0e54b64de8f6ffPerform Upkeep86256122021-05-21 17:56:06409 days 6 hrs ago0xb889e88c6dc2f652ad319e1c0d9a30f5b08b9354 IN  0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce7039840 Ether0.000854831.5
0x8f35fdd032dbddcb9f510d80a500c51f0daf29b16da6309c320c675ed3cdc634Perform Upkeep86255922021-05-21 17:51:06409 days 6 hrs ago0xb889e88c6dc2f652ad319e1c0d9a30f5b08b9354 IN  0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce7039840 Ether0.000804051.5
0xf8abf8e7c2a239c16d02dba91a1eeabbb0408fbef807b5aff90f20985f13dd44Perform Upkeep86255722021-05-21 17:46:06409 days 6 hrs ago0xb889e88c6dc2f652ad319e1c0d9a30f5b08b9354 IN  0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce7039840 Ether0.000899831.5
0xf965963323733b37f805601482bd7c7a509e7ffd461356c650999e149b2a77dbPerform Upkeep86255512021-05-21 17:40:51409 days 6 hrs ago0xb889e88c6dc2f652ad319e1c0d9a30f5b08b9354 IN  0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce7039840 Ether0.000895351.5
0x6ac7a3d7aa5032549e602145770338fc02f0a5195258d32c326fd96e34e21102Perform Upkeep86255322021-05-21 17:36:06409 days 7 hrs ago0xb889e88c6dc2f652ad319e1c0d9a30f5b08b9354 IN  0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce7039840 Ether0.000830531.5
0x1ed199f78e9f38a5578172ca216f6541fcb28b36994224b6dfdb179ce0b5fd75Perform Upkeep86255122021-05-21 17:31:06409 days 7 hrs ago0xb889e88c6dc2f652ad319e1c0d9a30f5b08b9354 IN  0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce7039840 Ether0.000934341.5
0x61b10e824a6f5cc2d404c0979662b52285e423e38947eb41f22717ede66c761ePerform Upkeep86254922021-05-21 17:26:06409 days 7 hrs ago0xb889e88c6dc2f652ad319e1c0d9a30f5b08b9354 IN  0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce7039840 Ether0.000841391.5
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x1dd70aa5fa34805893a902251e682eec3ebcdf940faf1ea18a011f5a8405588186548642021-05-26 19:51:08404 days 4 hrs ago 0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce703984 0x5e0a6d336667eace5d1b33279b50055604c3e3290 Ether
0x1dd70aa5fa34805893a902251e682eec3ebcdf940faf1ea18a011f5a8405588186548642021-05-26 19:51:08404 days 4 hrs ago 0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce703984 0x5e0a6d336667eace5d1b33279b50055604c3e3290 Ether
0x1dd70aa5fa34805893a902251e682eec3ebcdf940faf1ea18a011f5a8405588186548642021-05-26 19:51:08404 days 4 hrs ago 0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce703984 0x5e0a6d336667eace5d1b33279b50055604c3e3290 Ether
0x1dd70aa5fa34805893a902251e682eec3ebcdf940faf1ea18a011f5a8405588186548642021-05-26 19:51:08404 days 4 hrs ago 0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce703984 0x5e0a6d336667eace5d1b33279b50055604c3e3290 Ether
0x1dd70aa5fa34805893a902251e682eec3ebcdf940faf1ea18a011f5a8405588186548642021-05-26 19:51:08404 days 4 hrs ago 0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce703984 0x5e0a6d336667eace5d1b33279b50055604c3e3290 Ether
0x1dd70aa5fa34805893a902251e682eec3ebcdf940faf1ea18a011f5a8405588186548642021-05-26 19:51:08404 days 4 hrs ago 0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce703984 0x4706856fa8bb747d50b4ef8547fe51ab5edc4ac20 Ether
0x1dd70aa5fa34805893a902251e682eec3ebcdf940faf1ea18a011f5a8405588186548642021-05-26 19:51:08404 days 4 hrs ago 0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce703984 0x1b92bc2f339ef25161711e4eafc31999c005af210 Ether
0x1dd70aa5fa34805893a902251e682eec3ebcdf940faf1ea18a011f5a8405588186548642021-05-26 19:51:08404 days 4 hrs ago 0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce703984 0x1b92bc2f339ef25161711e4eafc31999c005af210 Ether
0x1dd70aa5fa34805893a902251e682eec3ebcdf940faf1ea18a011f5a8405588186548642021-05-26 19:51:08404 days 4 hrs ago 0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce703984 0x1b92bc2f339ef25161711e4eafc31999c005af210 Ether
0x1dd70aa5fa34805893a902251e682eec3ebcdf940faf1ea18a011f5a8405588186548642021-05-26 19:51:08404 days 4 hrs ago 0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce703984 0x1b92bc2f339ef25161711e4eafc31999c005af210 Ether
0x1dd70aa5fa34805893a902251e682eec3ebcdf940faf1ea18a011f5a8405588186548642021-05-26 19:51:08404 days 4 hrs ago 0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce703984 0x1b92bc2f339ef25161711e4eafc31999c005af210 Ether
0x1dd70aa5fa34805893a902251e682eec3ebcdf940faf1ea18a011f5a8405588186548642021-05-26 19:51:08404 days 4 hrs ago 0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce703984 0xde5275536231eca2dd506b9ccd73c028e16a9a320 Ether
0x1dd70aa5fa34805893a902251e682eec3ebcdf940faf1ea18a011f5a8405588186548642021-05-26 19:51:08404 days 4 hrs ago 0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce703984 0x41cf0758b7cc2394b1c2dff6133febb0ef317c3b0 Ether
0x1dd70aa5fa34805893a902251e682eec3ebcdf940faf1ea18a011f5a8405588186548642021-05-26 19:51:08404 days 4 hrs ago 0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce703984 0x41cf0758b7cc2394b1c2dff6133febb0ef317c3b0 Ether
0x1dd70aa5fa34805893a902251e682eec3ebcdf940faf1ea18a011f5a8405588186548642021-05-26 19:51:08404 days 4 hrs ago 0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce703984 0x41cf0758b7cc2394b1c2dff6133febb0ef317c3b0 Ether
0x1dd70aa5fa34805893a902251e682eec3ebcdf940faf1ea18a011f5a8405588186548642021-05-26 19:51:08404 days 4 hrs ago 0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce703984 0x41cf0758b7cc2394b1c2dff6133febb0ef317c3b0 Ether
0x1dd70aa5fa34805893a902251e682eec3ebcdf940faf1ea18a011f5a8405588186548642021-05-26 19:51:08404 days 4 hrs ago 0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce703984 0x41cf0758b7cc2394b1c2dff6133febb0ef317c3b0 Ether
0x1dd70aa5fa34805893a902251e682eec3ebcdf940faf1ea18a011f5a8405588186548642021-05-26 19:51:08404 days 4 hrs ago 0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce703984 0xab068f220e10eed899b54f1113de7e354c9a8eb70 Ether
0x1dd70aa5fa34805893a902251e682eec3ebcdf940faf1ea18a011f5a8405588186548642021-05-26 19:51:08404 days 4 hrs ago 0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce703984 0xf76f17682888a738a6df40aa63ac2b4b1a3808310 Ether
0xbbf0ed2a3058bb17ff6cde86c45c5906880f6e025d1af4e112b69eb58414c01c86494672021-05-25 21:21:39405 days 3 hrs ago 0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce703984 0x5e0a6d336667eace5d1b33279b50055604c3e3290 Ether
0xbbf0ed2a3058bb17ff6cde86c45c5906880f6e025d1af4e112b69eb58414c01c86494672021-05-25 21:21:39405 days 3 hrs ago 0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce703984 0x5e0a6d336667eace5d1b33279b50055604c3e3290 Ether
0xbbf0ed2a3058bb17ff6cde86c45c5906880f6e025d1af4e112b69eb58414c01c86494672021-05-25 21:21:39405 days 3 hrs ago 0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce703984 0x5e0a6d336667eace5d1b33279b50055604c3e3290 Ether
0xbbf0ed2a3058bb17ff6cde86c45c5906880f6e025d1af4e112b69eb58414c01c86494672021-05-25 21:21:39405 days 3 hrs ago 0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce703984 0x4706856fa8bb747d50b4ef8547fe51ab5edc4ac20 Ether
0xbbf0ed2a3058bb17ff6cde86c45c5906880f6e025d1af4e112b69eb58414c01c86494672021-05-25 21:21:39405 days 3 hrs ago 0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce703984 0x1b92bc2f339ef25161711e4eafc31999c005af210 Ether
0xbbf0ed2a3058bb17ff6cde86c45c5906880f6e025d1af4e112b69eb58414c01c86494672021-05-25 21:21:39405 days 3 hrs ago 0x3fbcb09ee774f7e32ba4d60d1e2d4cb9ce703984 0x1b92bc2f339ef25161711e4eafc31999c005af210 Ether
[ Download CSV Export 
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 10 : 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 2 of 10 : 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 3 of 10 : 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 4 of 10 : 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 5 of 10 : 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";

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

    /// @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(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 {

        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);
    }

}

File 6 of 10 : 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 7 of 10 : 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 8 of 10 : PrizePoolInterface.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.6;

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

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

pragma solidity ^0.7.6;

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

File 10 of 10 : 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 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":"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":[{"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":[{"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"}]

608060405234801561001057600080fd5b5060405161114838038061114883398101604081905261002f9161015c565b6000610039610158565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180546001600160a01b0319166001600160a01b0385161790556040517f3945779a0b94143e19ceb0254d7ff1fbe6c4265b6328031e7cc1274c2b8d77c7906100ce90859061019d565b60405180910390a160028290556040517fb722c0a05d55d91208263d973f28b92fc9599d46d7c490ff2efae89d8f3ddfe89061010b9084906101b1565b60405180910390a160048190556040517f7a5354403e343fa02d40d3906b696f894d8b73fb8a898b07d7414f29866ef5d3906101489083906101b1565b60405180910390a15050506101ba565b3390565b600080600060608486031215610170578283fd5b83516001600160a01b0381168114610186578384fd5b602085015160409095015190969495509392505050565b6001600160a01b0391909116815260200190565b90815260200190565b610f7f806101c96000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c8063715018a611610071578063715018a61461013b5780638da5cb5b14610143578063ad06337f14610158578063ba450a1a14610160578063f208517014610168578063f2fde38b1461017b576100b4565b80632dc41821146100b957806343d73f2d146100d75780634585e33b146100ec5780634fd47a76146100ff5780635fdc3b58146101075780636e04ff0d1461011a575b600080fd5b6100c161018e565b6040516100ce9190610ea4565b60405180910390f35b6100ea6100e5366004610c1c565b610194565b005b6100ea6100fa366004610d30565b61024c565b6100c161050d565b6100ea610115366004610d9d565b610513565b61012d610128366004610d30565b6105aa565b6040516100ce929190610e11565b6100ea6107d6565b61014b610882565b6040516100ce9190610dfd565b61014b610891565b6100c16108a0565b6100ea610176366004610d9d565b6108a6565b6100ea610189366004610c1c565b61093d565b60025481565b61019c610a3f565b6001600160a01b03166101ad610882565b6001600160a01b0316146101f6576040805162461bcd60e51b81526020600482018190526024820152600080516020610f2a833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0383161790556040517f3945779a0b94143e19ceb0254d7ff1fbe6c4265b6328031e7cc1274c2b8d77c790610241908390610dfd565b60405180910390a150565b6003546004548101431161027b5760405162461bcd60e51b815260040161027290610e47565b60405180910390fd5b600154604080516351cfd60960e11b815290516000926001600160a01b03169163a39fac129160048083019286929190829003018186803b1580156102bf57600080fd5b505afa1580156102d3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526102fb9190810190610c5b565b60025490915060008080805b6000851180156103175750855184105b156104a457600086858151811061032a57fe5b60200260200101516001600160a01b03166398bf3eb66040518163ffffffff1660e01b815260040160206040518083038186803b15801561036a57600080fd5b505afa15801561037e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a29190610c3f565b90506103b6816001600160a01b0316610a43565b1561042057806001600160a01b031663b9ee1e056040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156103f657600080fd5b505af115801561040a573d6000803e3d6000fd5b5050600019909701965050600190930192610498565b610432816001600160a01b0316610adc565b1561049857806001600160a01b031663dfb2f13b6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561047257600080fd5b505af1158015610486573d6000803e3d6000fd5b50506000199097019650506001909201915b50600190930192610307565b60008311806104b35750600082115b156104bb5750435b8087146105025760038190556040517f9fbc2aeb5bf6200e5499d345acddf1dd462c37becb4673d661250b89ced7ff6a906104f99085908590610ead565b60405180910390a15b505050505050505050565b60045481565b61051b610a3f565b6001600160a01b031661052c610882565b6001600160a01b031614610575576040805162461bcd60e51b81526020600482018190526024820152600080516020610f2a833981519152604482015290519081900360640190fd5b60028190556040517fb722c0a05d55d91208263d973f28b92fc9599d46d7c490ff2efae89d8f3ddfe890610241908390610ea4565b60006060600454600354014310156105c557600091506107cf565b600154604080516351cfd60960e11b815290516000926001600160a01b03169163a39fac129160048083019286929190829003018186803b15801561060957600080fd5b505afa15801561061d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106459190810190610c5b565b905060005b815181101561070757600082828151811061066157fe5b60200260200101516001600160a01b03166398bf3eb66040518163ffffffff1660e01b815260040160206040518083038186803b1580156106a157600080fd5b505afa1580156106b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d99190610c3f565b90506106ed816001600160a01b0316610a43565b156106fe57600194505050506107cf565b5060010161064a565b5060005b81518110156107c857600082828151811061072257fe5b60200260200101516001600160a01b03166398bf3eb66040518163ffffffff1660e01b815260040160206040518083038186803b15801561076257600080fd5b505afa158015610776573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079a9190610c3f565b90506107ae816001600160a01b0316610adc565b156107bf57600194505050506107cf565b5060010161070b565b5060009250505b9250929050565b6107de610a3f565b6001600160a01b03166107ef610882565b6001600160a01b031614610838576040805162461bcd60e51b81526020600482018190526024820152600080516020610f2a833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b6001546001600160a01b031681565b60035481565b6108ae610a3f565b6001600160a01b03166108bf610882565b6001600160a01b031614610908576040805162461bcd60e51b81526020600482018190526024820152600080516020610f2a833981519152604482015290519081900360640190fd5b60048190556040517f7a5354403e343fa02d40d3906b696f894d8b73fb8a898b07d7414f29866ef5d390610241908390610ea4565b610945610a3f565b6001600160a01b0316610956610882565b6001600160a01b03161461099f576040805162461bcd60e51b81526020600482018190526024820152600080516020610f2a833981519152604482015290519081900360640190fd5b6001600160a01b0381166109e45760405162461bcd60e51b8152600401808060200182810382526026815260200180610f046026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6000610a56826343b7ae3f60e11b610b2d565b15610ad357816001600160a01b031663876f5c7e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610a9457600080fd5b505afa158015610aa8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610acc9190610d10565b9050610ad7565b5060005b919050565b6000610aef82636a74f10760e01b610b2d565b15610ad357816001600160a01b0316636a74f1076040518163ffffffff1660e01b815260040160206040518083038186803b158015610a9457600080fd5b60408051600481526024810182526020810180516001600160e01b03166001600160e01b03198516179052905160009190829081906001600160a01b0387169061753090610b7c908690610de1565b6000604051808303818686fa925050503d8060008114610bb8576040519150601f19603f3d011682016040523d82523d6000602084013e610bbd565b606091505b5091509150602081511015610bd85760009350505050610c0b565b81158015610be7575060008151115b15610c06578060405162461bcd60e51b81526004016102729190610e34565b509150505b92915050565b8051610ad781610eeb565b600060208284031215610c2d578081fd5b8135610c3881610eeb565b9392505050565b600060208284031215610c50578081fd5b8151610c3881610eeb565b60006020808385031215610c6d578182fd5b825167ffffffffffffffff80821115610c84578384fd5b818501915085601f830112610c97578384fd5b815181811115610ca357fe5b83810260405185828201018181108582111715610cbc57fe5b604052828152858101935084860182860187018a1015610cda578788fd5b8795505b83861015610d0357610cef81610c11565b855260019590950194938601938601610cde565b5098975050505050505050565b600060208284031215610d21578081fd5b81518015158114610c38578182fd5b60008060208385031215610d42578081fd5b823567ffffffffffffffff80821115610d59578283fd5b818501915085601f830112610d6c578283fd5b813581811115610d7a578384fd5b866020828501011115610d8b578384fd5b60209290920196919550909350505050565b600060208284031215610dae578081fd5b5035919050565b60008151808452610dcd816020860160208601610ebb565b601f01601f19169290920160200192915050565b60008251610df3818460208701610ebb565b9190910192915050565b6001600160a01b0391909116815260200190565b6000831515825260406020830152610e2c6040830184610db5565b949350505050565b600060208252610c386020830184610db5565b60208082526037908201527f5072697a65537472617465677955706b6565703a3a6d696e696d756d20626c6f60408201527f636b20696e74657276616c206e6f742072656163686564000000000000000000606082015260800190565b90815260200190565b918252602082015260400190565b60005b83811015610ed6578181015183820152602001610ebe565b83811115610ee5576000848401525b50505050565b6001600160a01b0381168114610f0057600080fd5b5056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122005f26857c3aef760ce1a2e5ee1eacda97dd23f3b706cc651958e09048700982964736f6c63430007060033000000000000000000000000f76f17682888a738a6df40aa63ac2b4b1a3808310000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000a

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

000000000000000000000000f76f17682888a738a6df40aa63ac2b4b1a3808310000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000a

-----Decoded View---------------
Arg [0] : _prizePoolRegistry (address): 0xf76f17682888a738a6df40aa63ac2b4b1a380831
Arg [1] : _upkeepBatchSize (uint256): 3
Arg [2] : _upkeepMinimumBlockInterval (uint256): 10

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000f76f17682888a738a6df40aa63ac2b4b1a380831
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000a


Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading

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.