ETH Price: $3,017.29 (-2.35%)

Contract

0x6464C34A02DD155dd0c630CE233DD6e21C24F9A5
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Work237692122025-11-10 13:38:357 days ago1762781915IN
0x6464C34A...21C24F9A5
0 ETH0.000124140.88744342
Work235840322025-10-15 15:37:5933 days ago1760542679IN
0x6464C34A...21C24F9A5
0 ETH0.000260031.82956261
Work235342662025-10-08 16:37:4740 days ago1759941467IN
0x6464C34A...21C24F9A5
0 ETH0.000137070.8901368
Work235150862025-10-06 0:15:1142 days ago1759709711IN
0x6464C34A...21C24F9A5
0 ETH0.000028130.20106297
Work234690642025-09-29 13:51:5949 days ago1759153919IN
0x6464C34A...21C24F9A5
0 ETH0.0021126814.86455807
Work233158772025-09-08 4:05:5970 days ago1757304359IN
0x6464C34A...21C24F9A5
0 ETH0.000008950.25911435
Work232679282025-09-01 11:16:3577 days ago1756725395IN
0x6464C34A...21C24F9A5
0 ETH0.000087160.61325358
Work232180632025-08-25 12:16:2384 days ago1756124183IN
0x6464C34A...21C24F9A5
0 ETH0.00005550.39052657
Work230666812025-08-04 9:03:11105 days ago1754298191IN
0x6464C34A...21C24F9A5
0 ETH0.000040840.2919127
Work230169222025-07-28 10:02:47112 days ago1753696967IN
0x6464C34A...21C24F9A5
0 ETH0.000056460.40357904
Work230169212025-07-28 10:02:35112 days ago1753696955IN
0x6464C34A...21C24F9A5
0 ETH0.000055330.39553016
Work228674782025-07-07 13:00:47133 days ago1751893247IN
0x6464C34A...21C24F9A5
0 ETH0.000271391.93984929
Work228674772025-07-07 13:00:35133 days ago1751893235IN
0x6464C34A...21C24F9A5
0 ETH0.000265831.90009131
Work228665852025-07-07 10:00:59133 days ago1751882459IN
0x6464C34A...21C24F9A5
0 ETH0.000231511.62890918
Work227171892025-06-16 12:50:23154 days ago1750078223IN
0x6464C34A...21C24F9A5
0 ETH0.000245351.72629992
Work226674252025-06-09 13:49:23161 days ago1749476963IN
0x6464C34A...21C24F9A5
0 ETH0.000674194.74354661
Work225717572025-05-27 4:31:59174 days ago1748320319IN
0x6464C34A...21C24F9A5
0 ETH0.000018250.52815998
Work225717542025-05-27 4:31:23174 days ago1748320283IN
0x6464C34A...21C24F9A5
0 ETH0.000022060.49397567
Work225717502025-05-27 4:30:35174 days ago1748320235IN
0x6464C34A...21C24F9A5
0 ETH0.000022760.50969682
Work225717472025-05-27 4:29:59174 days ago1748320199IN
0x6464C34A...21C24F9A5
0 ETH0.000020640.46224443
Work225717052025-05-27 4:21:35174 days ago1748319695IN
0x6464C34A...21C24F9A5
0 ETH0.000018650.53982603
Work225717042025-05-27 4:21:23174 days ago1748319683IN
0x6464C34A...21C24F9A5
0 ETH0.000023010.51515543
Work225717032025-05-27 4:21:11174 days ago1748319671IN
0x6464C34A...21C24F9A5
0 ETH0.000024030.53809413
Work225717022025-05-27 4:20:59174 days ago1748319659IN
0x6464C34A...21C24F9A5
0 ETH0.000023080.51677634
Work225717012025-05-27 4:20:47174 days ago1748319647IN
0x6464C34A...21C24F9A5
0 ETH0.000022920.51320035
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
VestedRewardsDistributionJob

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
london EvmVersion
// SPDX-License-Identifier: AGPL-3.0-or-later
// Copyright (C) 2021 Dai Foundation
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <https://www.gnu.org/licenses/>.
pragma solidity 0.8.13;

import {IJob} from "./interfaces/IJob.sol";
import "./utils/EnumerableSet.sol";

interface SequencerLike {
    function isMaster(bytes32 network) external view returns (bool);
}

interface DssVestWithGemLike {
    function unpaid(uint256 _id) external view returns (uint256);
}

interface VestedRewardsDistributionLike {
    function distribute() external returns (uint256 amount);
    function dssVest() external view returns (DssVestWithGemLike);
    function lastDistributedAt() external view returns (uint256);
    function vestId() external view returns (uint256);
}

/// @title Call distribute() when possible
contract VestedRewardsDistributionJob is IJob {
    using EnumerableSet for EnumerableSet.AddressSet;

    /// @notice Keeper Network sequencer.
    SequencerLike public immutable sequencer;

    /// @notice Address with admin access to this contract. wards[usr].
    mapping(address => uint256) public wards;
    /// @notice Minimum intervals between distributions for each distribution contract. intervals[dist].
    mapping(address => uint256) public intervals;
    /// @notice Iterable set of distribution contracts added to the job.
    EnumerableSet.AddressSet private distributions;

    // --- Errors ---

    /**
     * @notice The keeper trying to execute `work` is not the current master.
     * @param network The keeper identifier.
     */
    error NotMaster(bytes32 network);
    /// @notice No args were provided to `work`.
    error NoArgs();
    /// @notice Trying to set the distribution contract interval to zero.
    error InvalidInterval();
    /// @notice `wark` was called too early or no vested amount is available.
    error NotDue(address dist);
    /// @notice The distribution contract was was not added to the job.
    error NotFound(address dist);

    // --- Events ---

    /**
     * @notice `usr` was granted admin access.
     * @param usr The user address.
     */
    event Rely(address indexed usr);
    /**
     * @notice `usr` admin access was revoked.
     * @param usr The user address.
     */
    event Deny(address indexed usr);
    /**
     * @notice A `VestedRewardsDistribution` contract was added to or modified in the job.
     * @param dist The distribution contract.
     * @param interval The minimum interval between distributions.
     */
    event Set(address indexed dist, uint256 interval);
    /**
     * @notice A distribution contract was removed from the job.
     * @param dist The removed distribution contract.
     */
    event Rem(address indexed dist);
    /**
     * @notice Work os executed for a distribution contract.
     * @param network The keeper who executed the job.
     * @param dist The distribution contract where the distribution was made.
     * @param amount The amount distributed.
     */
    event Work(bytes32 indexed network, address indexed dist, uint256 amount);

    /**
     * @param _sequencer The keeper network sequencer.
     */
    constructor(address _sequencer) {
        sequencer = SequencerLike(_sequencer);

        wards[msg.sender] = 1;
        emit Rely(msg.sender);
    }

    // --- Auth ---

    modifier auth() {
        require(wards[msg.sender] == 1, "VestedRewardsDistributionJob/not-authorized");
        _;
    }

    /**
     * @notice Grants `usr` admin access to this contract.
     * @param usr The user address.
     */
    function rely(address usr) external auth {
        wards[usr] = 1;
        emit Rely(usr);
    }

    /**
     * @notice Revokes `usr` admin access from this contract.
     * @param usr The user address.
     */
    function deny(address usr) external auth {
        wards[usr] = 0;
        emit Deny(usr);
    }

    // --- Rewards Distribution Admin ---

    /**
     * @notice Sets the interval for the distribution contract in the job.
     * @dev `interval` MUST be greater than zero.
     * @param dist The distribution contract.
     * @param interval The interval for distribution.
     */
    function set(address dist, uint256 interval) external auth {
        if (interval == 0) revert InvalidInterval();

        if (!distributions.contains(dist)) distributions.add(dist);
        intervals[dist] = interval;
        emit Set(dist, interval);
    }

    /**
     * @notice Removes the distribution contract from the job.
     * @param dist The distribution contract.
     */
    function rem(address dist) external auth {
        if (!distributions.remove(dist)) revert NotFound(dist);

        delete intervals[dist];
        emit Rem(dist);
    }

    /**
     * @notice Checks if the job has the specified distribution contract.
     * @param dist The distribution contract.
     * @return Whether the distribution contract is set in the job or not.
     */
    function has(address dist) public view returns (bool) {
        return distributions.contains(dist);
    }

    /**
     * @notice Checks if the distribution is due for the specified contract.
     * @param dist The distribution contract.
     * @return Whether the distribution is due or not.
     */
    function due(address dist) public view returns (bool) {
        // Gets the last time distribute() was called
        uint256 last = VestedRewardsDistributionLike(dist).lastDistributedAt();
        // If `last == 0` (no distribution so far), we allow it to be distributed immediately,
        // otherwise, we can only distribute if enough time has elapsed since the last one.
        if (last != 0 && block.timestamp < last + intervals[dist]) return false;

        uint256 vestId = VestedRewardsDistributionLike(dist).vestId();
        DssVestWithGemLike vest = VestedRewardsDistributionLike(dist).dssVest();
        // Distribution is only due if there are unpaid tokens.
        return vest.unpaid(vestId) > 0;
    }

    // --- Keeper Network Interface ---

    /**
     * @notice Executes the job though the keeper network.
     * @param network The keeper identifier.
     * @param args The arguments for execution.
     */
    function work(bytes32 network, bytes calldata args) external {
        if (!sequencer.isMaster(network)) revert NotMaster(network);
        if (args.length == 0) revert NoArgs();

        (address dist) = abi.decode(args, (address));
        // Prevents keeper from calling random contracts with a `distribute` method.
        if (!has(dist)) revert NotFound(dist);
        // Ensures that enough time has passed.
        if (!due(dist)) revert NotDue(dist);

        uint256 amount = VestedRewardsDistributionLike(dist).distribute();
        emit Work(network, dist, amount);
    }

    /**
     * @notice Checks if there is work to be done in the job.
     * @dev Most providers define a gas limit for `eth_call` requests to prevent DoS.
     *      Notice that hitting that limit is higly unlikely, as it would require hundreds or thousands of active
     *      contracts in this job.
     *      Keepers are expected to take that into consideration, especially if they are using self-hosted
     *      infrastructure, which might have arbitrary values configured.
     * @param network The keeper identifier.
     * @return ok Whether it should execute or not.
     * @return args The args for execution.
     */
    function workable(bytes32 network) external override returns (bool ok, bytes memory args) {
        if (!sequencer.isMaster(network)) return (false, bytes("Network is not master"));

        uint256 len = distributions.length();
        for (uint256 i = 0; i < len; i++) {
            address dist = distributions.at(i);
            if (!due(dist)) continue;

            try this.work(network, abi.encode(dist)) {
                return (true, abi.encode(dist));
            } catch {
                continue;
            }
        }
        return (false, bytes("No distribution"));
    }
}

// SPDX-License-Identifier: AGPL-3.0-or-later
// Copyright (C) 2021 Dai Foundation
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <https://www.gnu.org/licenses/>.
pragma solidity >=0.8.0;

/// @title Maker Keeper Network Job
/// @notice A job represents an independant unit of work that can be done by a keeper
interface IJob {

    /// @notice Executes this unit of work
    /// @dev Should revert iff workable() returns canWork of false
    /// @param network The name of the external keeper network
    /// @param args Custom arguments supplied to the job, should be copied from workable response
    function work(bytes32 network, bytes calldata args) external;

    /// @notice Ask this job if it has a unit of work available
    /// @dev This should never revert, only return false if nothing is available
    /// @dev This should normally be a view, but sometimes that's not possible
    /// @param network The name of the external keeper network
    /// @return canWork Returns true if a unit of work is available
    /// @return args The custom arguments to be provided to work() or an error string if canWork is false
    function workable(bytes32 network) external returns (bool canWork, bytes memory args);

}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol)

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastvalue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastvalue;
                // Update the index for the moved value
                set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        assembly {
            result := store
        }

        return result;
    }
}

Settings
{
  "remappings": [
    "dss-interfaces/=lib/dss-test/lib/dss-interfaces/src/",
    "dss-test/=lib/dss-test/src/",
    "forge-std/=lib/dss-test/lib/forge-std/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "viaIR": false,
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_sequencer","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidInterval","type":"error"},{"inputs":[],"name":"NoArgs","type":"error"},{"inputs":[{"internalType":"address","name":"dist","type":"address"}],"name":"NotDue","type":"error"},{"inputs":[{"internalType":"address","name":"dist","type":"address"}],"name":"NotFound","type":"error"},{"inputs":[{"internalType":"bytes32","name":"network","type":"bytes32"}],"name":"NotMaster","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"usr","type":"address"}],"name":"Deny","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"usr","type":"address"}],"name":"Rely","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"dist","type":"address"}],"name":"Rem","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"dist","type":"address"},{"indexed":false,"internalType":"uint256","name":"interval","type":"uint256"}],"name":"Set","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"network","type":"bytes32"},{"indexed":true,"internalType":"address","name":"dist","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Work","type":"event"},{"inputs":[{"internalType":"address","name":"usr","type":"address"}],"name":"deny","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"dist","type":"address"}],"name":"due","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dist","type":"address"}],"name":"has","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"intervals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"usr","type":"address"}],"name":"rely","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"dist","type":"address"}],"name":"rem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sequencer","outputs":[{"internalType":"contract SequencerLike","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dist","type":"address"},{"internalType":"uint256","name":"interval","type":"uint256"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"wards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"network","type":"bytes32"},{"internalType":"bytes","name":"args","type":"bytes"}],"name":"work","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"network","type":"bytes32"}],"name":"workable","outputs":[{"internalType":"bool","name":"ok","type":"bool"},{"internalType":"bytes","name":"args","type":"bytes"}],"stateMutability":"nonpayable","type":"function"}]

60a060405234801561001057600080fd5b50604051610fc5380380610fc583398101604081905261002f9161007b565b6001600160a01b0381166080523360008181526020819052604080822060019055517fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a609190a2506100ab565b60006020828403121561008d57600080fd5b81516001600160a01b03811681146100a457600080fd5b9392505050565b608051610ef16100d460003960008181610116015281816102bd01526106070152610ef16000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c806365fae35e1161007157806365fae35e146101505780638dce54b7146101635780639c52a7f114610184578063b215a13014610197578063bf353dbb146101c5578063d0b346ce146101e557600080fd5b806310c1fb9b146100ae5780631d2ab000146100c357806321887c3d146100d65780633825d828146100fe5780635c1bba3814610111575b600080fd5b6100c16100bc366004610c27565b6101f8565b005b6100c16100d1366004610c44565b6102a7565b6100e96100e4366004610c27565b610497565b60405190151581526020015b60405180910390f35b6100c161010c366004610cc0565b6104aa565b6101387f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100f5565b6100c161015e366004610c27565b61056f565b610176610171366004610cec565b6105e3565b6040516100f5929190610d52565b6100c1610192366004610c27565b6107df565b6101b76101a5366004610c27565b60016020526000908152604090205481565b6040519081526020016100f5565b6101b76101d3366004610c27565b60006020819052908152604090205481565b6100e96101f3366004610c27565b610852565b336000908152602081905260409020546001146102305760405162461bcd60e51b815260040161022790610d75565b60405180910390fd5b61023b600282610a3a565b61026357604051634b2990ed60e11b81526001600160a01b0382166004820152602401610227565b6001600160a01b038116600081815260016020526040808220829055517fcb2b5a642a693472325e0a4fc5091dde5cde725740cd376bcf017e300b6ab3659190a250565b604051637c530f1360e01b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690637c530f1390602401602060405180830381865afa15801561030c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103309190610dc0565b61035057604051636ac204fb60e11b815260048101849052602401610227565b60008190036103725760405163d144d9e360e01b815260040160405180910390fd5b600061038082840184610c27565b905061038b81610497565b6103b357604051634b2990ed60e11b81526001600160a01b0382166004820152602401610227565b6103bc81610852565b6103e45760405163c6dbcaef60e01b81526001600160a01b0382166004820152602401610227565b6000816001600160a01b031663e4fc6b6d6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610426573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061044a9190610de2565b9050816001600160a01b0316857f887343af279dc6536726f0e8ebad611231730f8d5bffdb47b9eefac276492cc08360405161048891815260200190565b60405180910390a35050505050565b60006104a4600283610a56565b92915050565b336000908152602081905260409020546001146104d95760405162461bcd60e51b815260040161022790610d75565b806000036104fa576040516305fabb6160e41b815260040160405180910390fd5b610505600283610a56565b61051657610514600283610a78565b505b6001600160a01b03821660008181526001602052604090819020839055517ffd28ec3ec2555238d8ad6f9faf3e4cd10e574ce7e7ef28b73caa53f9512f65b9906105639084815260200190565b60405180910390a25050565b3360009081526020819052604090205460011461059e5760405162461bcd60e51b815260040161022790610d75565b6001600160a01b03811660008181526020819052604080822060019055517fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a609190a250565b604051637c530f1360e01b8152600481018290526000906060906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637c530f1390602401602060405180830381865afa15801561064e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106729190610dc0565b6106ac5750506040805180820190915260158152742732ba3bb7b9359034b9903737ba1036b0b9ba32b960591b6020820152600092909150565b60006106b86002610a8d565b905060005b818110156107aa5760006106d2600283610a97565b90506106dd81610852565b6106e75750610798565b604080516001600160a01b03831660208201523091631d2ab000918991016040516020818303038152906040526040518363ffffffff1660e01b8152600401610731929190610dfb565b600060405180830381600087803b15801561074b57600080fd5b505af192505050801561075c575060015b6107665750610798565b604080516001600160a01b03831660208201526001910160405160208183030381529060405294509450505050915091565b806107a281610e2a565b9150506106bd565b5060006040518060400160405280600f81526020016e2737903234b9ba3934b13aba34b7b760891b8152509250925050915091565b3360009081526020819052604090205460011461080e5760405162461bcd60e51b815260040161022790610d75565b6001600160a01b038116600081815260208190526040808220829055517f184450df2e323acec0ed3b5c7531b81f9b4cdef7914dfd4c0a4317416bb5251b9190a250565b600080826001600160a01b031663feb04f7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610893573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b79190610de2565b905080158015906108e957506001600160a01b0383166000908152600160205260409020546108e69082610e43565b42105b156108f75750600092915050565b6000836001600160a01b0316633a56573b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610937573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095b9190610de2565b90506000846001600160a01b0316637bd399db6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561099d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c19190610e5b565b6040516353e8863d60e01b8152600481018490529091506000906001600160a01b038316906353e8863d90602401602060405180830381865afa158015610a0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a309190610de2565b1195945050505050565b6000610a4f836001600160a01b038416610aa3565b9392505050565b6001600160a01b03811660009081526001830160205260408120541515610a4f565b6000610a4f836001600160a01b038416610b96565b60006104a4825490565b6000610a4f8383610be5565b60008181526001830160205260408120548015610b8c576000610ac7600183610e78565b8554909150600090610adb90600190610e78565b9050818114610b40576000866000018281548110610afb57610afb610e8f565b9060005260206000200154905080876000018481548110610b1e57610b1e610e8f565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610b5157610b51610ea5565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506104a4565b60009150506104a4565b6000818152600183016020526040812054610bdd575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556104a4565b5060006104a4565b6000826000018281548110610bfc57610bfc610e8f565b9060005260206000200154905092915050565b6001600160a01b0381168114610c2457600080fd5b50565b600060208284031215610c3957600080fd5b8135610a4f81610c0f565b600080600060408486031215610c5957600080fd5b83359250602084013567ffffffffffffffff80821115610c7857600080fd5b818601915086601f830112610c8c57600080fd5b813581811115610c9b57600080fd5b876020828501011115610cad57600080fd5b6020830194508093505050509250925092565b60008060408385031215610cd357600080fd5b8235610cde81610c0f565b946020939093013593505050565b600060208284031215610cfe57600080fd5b5035919050565b6000815180845260005b81811015610d2b57602081850181015186830182015201610d0f565b81811115610d3d576000602083870101525b50601f01601f19169290920160200192915050565b8215158152604060208201526000610d6d6040830184610d05565b949350505050565b6020808252602b908201527f56657374656452657761726473446973747269627574696f6e4a6f622f6e6f7460408201526a0b585d5d1a1bdc9a5e995960aa1b606082015260800190565b600060208284031215610dd257600080fd5b81518015158114610a4f57600080fd5b600060208284031215610df457600080fd5b5051919050565b828152604060208201526000610d6d6040830184610d05565b634e487b7160e01b600052601160045260246000fd5b600060018201610e3c57610e3c610e14565b5060010190565b60008219821115610e5657610e56610e14565b500190565b600060208284031215610e6d57600080fd5b8151610a4f81610c0f565b600082821015610e8a57610e8a610e14565b500390565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fdfea2646970667358221220862f3a01cd1d3f13f114ce0dc1fdfc73ec144faa7e09828636bb664a2d6e3f5064736f6c634300080d0033000000000000000000000000238b4e35daed6100c6162fae4510261f88996ec9

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100a95760003560e01c806365fae35e1161007157806365fae35e146101505780638dce54b7146101635780639c52a7f114610184578063b215a13014610197578063bf353dbb146101c5578063d0b346ce146101e557600080fd5b806310c1fb9b146100ae5780631d2ab000146100c357806321887c3d146100d65780633825d828146100fe5780635c1bba3814610111575b600080fd5b6100c16100bc366004610c27565b6101f8565b005b6100c16100d1366004610c44565b6102a7565b6100e96100e4366004610c27565b610497565b60405190151581526020015b60405180910390f35b6100c161010c366004610cc0565b6104aa565b6101387f000000000000000000000000238b4e35daed6100c6162fae4510261f88996ec981565b6040516001600160a01b0390911681526020016100f5565b6100c161015e366004610c27565b61056f565b610176610171366004610cec565b6105e3565b6040516100f5929190610d52565b6100c1610192366004610c27565b6107df565b6101b76101a5366004610c27565b60016020526000908152604090205481565b6040519081526020016100f5565b6101b76101d3366004610c27565b60006020819052908152604090205481565b6100e96101f3366004610c27565b610852565b336000908152602081905260409020546001146102305760405162461bcd60e51b815260040161022790610d75565b60405180910390fd5b61023b600282610a3a565b61026357604051634b2990ed60e11b81526001600160a01b0382166004820152602401610227565b6001600160a01b038116600081815260016020526040808220829055517fcb2b5a642a693472325e0a4fc5091dde5cde725740cd376bcf017e300b6ab3659190a250565b604051637c530f1360e01b8152600481018490527f000000000000000000000000238b4e35daed6100c6162fae4510261f88996ec96001600160a01b031690637c530f1390602401602060405180830381865afa15801561030c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103309190610dc0565b61035057604051636ac204fb60e11b815260048101849052602401610227565b60008190036103725760405163d144d9e360e01b815260040160405180910390fd5b600061038082840184610c27565b905061038b81610497565b6103b357604051634b2990ed60e11b81526001600160a01b0382166004820152602401610227565b6103bc81610852565b6103e45760405163c6dbcaef60e01b81526001600160a01b0382166004820152602401610227565b6000816001600160a01b031663e4fc6b6d6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610426573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061044a9190610de2565b9050816001600160a01b0316857f887343af279dc6536726f0e8ebad611231730f8d5bffdb47b9eefac276492cc08360405161048891815260200190565b60405180910390a35050505050565b60006104a4600283610a56565b92915050565b336000908152602081905260409020546001146104d95760405162461bcd60e51b815260040161022790610d75565b806000036104fa576040516305fabb6160e41b815260040160405180910390fd5b610505600283610a56565b61051657610514600283610a78565b505b6001600160a01b03821660008181526001602052604090819020839055517ffd28ec3ec2555238d8ad6f9faf3e4cd10e574ce7e7ef28b73caa53f9512f65b9906105639084815260200190565b60405180910390a25050565b3360009081526020819052604090205460011461059e5760405162461bcd60e51b815260040161022790610d75565b6001600160a01b03811660008181526020819052604080822060019055517fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a609190a250565b604051637c530f1360e01b8152600481018290526000906060906001600160a01b037f000000000000000000000000238b4e35daed6100c6162fae4510261f88996ec91690637c530f1390602401602060405180830381865afa15801561064e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106729190610dc0565b6106ac5750506040805180820190915260158152742732ba3bb7b9359034b9903737ba1036b0b9ba32b960591b6020820152600092909150565b60006106b86002610a8d565b905060005b818110156107aa5760006106d2600283610a97565b90506106dd81610852565b6106e75750610798565b604080516001600160a01b03831660208201523091631d2ab000918991016040516020818303038152906040526040518363ffffffff1660e01b8152600401610731929190610dfb565b600060405180830381600087803b15801561074b57600080fd5b505af192505050801561075c575060015b6107665750610798565b604080516001600160a01b03831660208201526001910160405160208183030381529060405294509450505050915091565b806107a281610e2a565b9150506106bd565b5060006040518060400160405280600f81526020016e2737903234b9ba3934b13aba34b7b760891b8152509250925050915091565b3360009081526020819052604090205460011461080e5760405162461bcd60e51b815260040161022790610d75565b6001600160a01b038116600081815260208190526040808220829055517f184450df2e323acec0ed3b5c7531b81f9b4cdef7914dfd4c0a4317416bb5251b9190a250565b600080826001600160a01b031663feb04f7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610893573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b79190610de2565b905080158015906108e957506001600160a01b0383166000908152600160205260409020546108e69082610e43565b42105b156108f75750600092915050565b6000836001600160a01b0316633a56573b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610937573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095b9190610de2565b90506000846001600160a01b0316637bd399db6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561099d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c19190610e5b565b6040516353e8863d60e01b8152600481018490529091506000906001600160a01b038316906353e8863d90602401602060405180830381865afa158015610a0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a309190610de2565b1195945050505050565b6000610a4f836001600160a01b038416610aa3565b9392505050565b6001600160a01b03811660009081526001830160205260408120541515610a4f565b6000610a4f836001600160a01b038416610b96565b60006104a4825490565b6000610a4f8383610be5565b60008181526001830160205260408120548015610b8c576000610ac7600183610e78565b8554909150600090610adb90600190610e78565b9050818114610b40576000866000018281548110610afb57610afb610e8f565b9060005260206000200154905080876000018481548110610b1e57610b1e610e8f565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610b5157610b51610ea5565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506104a4565b60009150506104a4565b6000818152600183016020526040812054610bdd575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556104a4565b5060006104a4565b6000826000018281548110610bfc57610bfc610e8f565b9060005260206000200154905092915050565b6001600160a01b0381168114610c2457600080fd5b50565b600060208284031215610c3957600080fd5b8135610a4f81610c0f565b600080600060408486031215610c5957600080fd5b83359250602084013567ffffffffffffffff80821115610c7857600080fd5b818601915086601f830112610c8c57600080fd5b813581811115610c9b57600080fd5b876020828501011115610cad57600080fd5b6020830194508093505050509250925092565b60008060408385031215610cd357600080fd5b8235610cde81610c0f565b946020939093013593505050565b600060208284031215610cfe57600080fd5b5035919050565b6000815180845260005b81811015610d2b57602081850181015186830182015201610d0f565b81811115610d3d576000602083870101525b50601f01601f19169290920160200192915050565b8215158152604060208201526000610d6d6040830184610d05565b949350505050565b6020808252602b908201527f56657374656452657761726473446973747269627574696f6e4a6f622f6e6f7460408201526a0b585d5d1a1bdc9a5e995960aa1b606082015260800190565b600060208284031215610dd257600080fd5b81518015158114610a4f57600080fd5b600060208284031215610df457600080fd5b5051919050565b828152604060208201526000610d6d6040830184610d05565b634e487b7160e01b600052601160045260246000fd5b600060018201610e3c57610e3c610e14565b5060010190565b60008219821115610e5657610e56610e14565b500190565b600060208284031215610e6d57600080fd5b8151610a4f81610c0f565b600082821015610e8a57610e8a610e14565b500390565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fdfea2646970667358221220862f3a01cd1d3f13f114ce0dc1fdfc73ec144faa7e09828636bb664a2d6e3f5064736f6c634300080d0033

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

000000000000000000000000238b4e35daed6100c6162fae4510261f88996ec9

-----Decoded View---------------
Arg [0] : _sequencer (address): 0x238b4E35dAed6100C6162fAE4510261f88996EC9

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000238b4e35daed6100c6162fae4510261f88996ec9


Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
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.