ETH Price: $3,240.04 (+1.32%)

Contract

0xc9722CfDDFbC6aF4E77023E8B5Bd87489EFEbf5F

Overview

ETH Balance

0.026136847041108146 ETH

ETH Value

$84.68 (@ $3,240.04/ETH)

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Distribute Rewar...844024952025-12-10 13:06:0543 hrs ago1765371965IN
Nova: L1 Sequencer Refund
0 ETH0.000006290.01
Distribute Rewar...843909822025-12-07 13:06:054 days ago1765112765IN
Nova: L1 Sequencer Refund
0 ETH0.000003160.01
Distribute Rewar...843758502025-12-03 13:06:058 days ago1764767165IN
Nova: L1 Sequencer Refund
0 ETH0.000002140.01
Distribute Rewar...843641192025-11-30 13:06:0511 days ago1764507965IN
Nova: L1 Sequencer Refund
0 ETH0.000000980.01
Distribute Rewar...843495072025-11-26 13:06:0515 days ago1764162365IN
Nova: L1 Sequencer Refund
0 ETH0.00000350.01
Distribute Rewar...843368192025-11-23 13:06:0518 days ago1763903165IN
Nova: L1 Sequencer Refund
0 ETH0.00000560.01
Distribute Rewar...843197402025-11-19 13:06:0522 days ago1763557565IN
Nova: L1 Sequencer Refund
0 ETH0.000006910.01
Distribute Rewar...843037502025-11-16 13:06:0525 days ago1763298365IN
Nova: L1 Sequencer Refund
0 ETH0.000000450.01
Distribute Rewar...842864732025-11-12 13:06:0529 days ago1762952765IN
Nova: L1 Sequencer Refund
0 ETH0.000005180.01
Distribute Rewar...842745352025-11-09 13:06:0632 days ago1762693566IN
Nova: L1 Sequencer Refund
0 ETH0.000010760.01
Distribute Rewar...842593122025-11-05 13:06:0536 days ago1762347965IN
Nova: L1 Sequencer Refund
0 ETH0.00003830.01
Distribute Rewar...842465712025-11-02 13:06:0539 days ago1762088765IN
Nova: L1 Sequencer Refund
0 ETH0.000003290.01
Distribute Rewar...842300262025-10-29 13:06:0543 days ago1761743165IN
Nova: L1 Sequencer Refund
0 ETH0.000004910.01
Distribute Rewar...842185462025-10-26 13:06:0546 days ago1761483965IN
Nova: L1 Sequencer Refund
0 ETH0.000001790.01
Distribute Rewar...842042762025-10-22 13:06:0550 days ago1761138365IN
Nova: L1 Sequencer Refund
0 ETH0.000003530.01
Distribute Rewar...841936392025-10-19 13:06:0553 days ago1760879165IN
Nova: L1 Sequencer Refund
0 ETH0.000009820.01
Distribute Rewar...841794062025-10-15 13:06:0557 days ago1760533565IN
Nova: L1 Sequencer Refund
0 ETH0.000025330.01
Distribute Rewar...841541832025-10-08 13:06:0564 days ago1759928765IN
Nova: L1 Sequencer Refund
0 ETH0.000013960.01
Distribute Rewar...841435022025-10-05 13:06:0567 days ago1759669565IN
Nova: L1 Sequencer Refund
0 ETH0.000007360.01
Distribute Rewar...841286432025-10-01 13:06:0571 days ago1759323965IN
Nova: L1 Sequencer Refund
0 ETH0.000026520.01
Distribute Rewar...841157092025-09-28 13:06:0574 days ago1759064765IN
Nova: L1 Sequencer Refund
0 ETH0.000011080.01
Distribute Rewar...841010962025-09-24 13:06:0578 days ago1758719165IN
Nova: L1 Sequencer Refund
0 ETH0.00000270.01
Distribute Rewar...840889852025-09-21 13:06:0581 days ago1758459965IN
Nova: L1 Sequencer Refund
0 ETH0.000000450.01
Distribute Rewar...840727952025-09-17 13:06:0685 days ago1758114366IN
Nova: L1 Sequencer Refund
0 ETH0.000000460.01
Distribute Rewar...840706752025-09-17 0:00:1686 days ago1758067216IN
Nova: L1 Sequencer Refund
0 ETH0.000000460.01
View all transactions

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
844097252025-12-12 8:42:063 mins ago1765528926
Nova: L1 Sequencer Refund
0.00002349 ETH
844096992025-12-12 8:32:0813 mins ago1765528328
Nova: L1 Sequencer Refund
0.00002596 ETH
844096982025-12-12 8:32:0813 mins ago1765528328
Nova: L1 Sequencer Refund
0.0000233 ETH
844096852025-12-12 8:29:2116 mins ago1765528161
Nova: L1 Sequencer Refund
0.00002509 ETH
844096742025-12-12 8:22:5523 mins ago1765527775
Nova: L1 Sequencer Refund
0.00002167 ETH
844096732025-12-12 8:22:5523 mins ago1765527775
Nova: L1 Sequencer Refund
0.0000231 ETH
844096422025-12-12 8:16:1829 mins ago1765527378
Nova: L1 Sequencer Refund
0.0000233 ETH
844096412025-12-12 8:16:1829 mins ago1765527378
Nova: L1 Sequencer Refund
0.00002404 ETH
844096272025-12-12 8:08:0637 mins ago1765526886
Nova: L1 Sequencer Refund
0.00002242 ETH
844096122025-12-12 8:03:2742 mins ago1765526607
Nova: L1 Sequencer Refund
0.00002233 ETH
844096002025-12-12 7:56:1849 mins ago1765526178
Nova: L1 Sequencer Refund
0.00002518 ETH
844095992025-12-12 7:56:1849 mins ago1765526178
Nova: L1 Sequencer Refund
0.00002585 ETH
844095872025-12-12 7:46:481 hr ago1765525608
Nova: L1 Sequencer Refund
0.00002603 ETH
844095802025-12-12 7:42:351 hr ago1765525355
Nova: L1 Sequencer Refund
0.00002279 ETH
844095752025-12-12 7:37:361 hr ago1765525056
Nova: L1 Sequencer Refund
0.00002623 ETH
844095642025-12-12 7:31:231 hr ago1765524683
Nova: L1 Sequencer Refund
0.00002322 ETH
844095632025-12-12 7:31:231 hr ago1765524683
Nova: L1 Sequencer Refund
0.00002285 ETH
844095482025-12-12 7:24:471 hr ago1765524287
Nova: L1 Sequencer Refund
0.00002256 ETH
844095422025-12-12 7:18:551 hr ago1765523935
Nova: L1 Sequencer Refund
0.00002348 ETH
844095332025-12-12 7:11:341 hr ago1765523494
Nova: L1 Sequencer Refund
0.00002504 ETH
844095322025-12-12 7:11:341 hr ago1765523494
Nova: L1 Sequencer Refund
0.00002554 ETH
844095212025-12-12 7:06:171 hr ago1765523177
Nova: L1 Sequencer Refund
0.00002163 ETH
844095102025-12-12 6:56:581 hr ago1765522618
Nova: L1 Sequencer Refund
0.00002327 ETH
844095012025-12-12 6:53:001 hr ago1765522380
Nova: L1 Sequencer Refund
0.00002202 ETH
844094892025-12-12 6:46:551 hr ago1765522015
Nova: L1 Sequencer Refund
0.00002332 ETH
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x3B68a689...Ffd2559Ce
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
RewardDistributor

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.16;

import {BASIS_POINTS, hashAddresses, hashWeights, uncheckedInc} from "./Util.sol";
import "openzeppelin-contracts/contracts/access/Ownable.sol";

error TooManyRecipients();
error EmptyRecipients();
error InvalidRecipientGroup(bytes32 currentRecipientGroup, bytes32 providedRecipientGroup);
error InvalidRecipientWeights(bytes32 currentRecipientWeights, bytes32 providedRecipientWeights);
error OwnerFailedRecieve(address owner, address recipient, uint256 value);
error NoFundsToDistribute();
error InputLengthMismatch();
error InvalidTotalWeight(uint256 totalWeight);

/// @title A distributor of ether
/// @notice You can use this contract to distribute ether according to defined weights between a group of participants managed by an owner.
/// @dev If a particular recipient is not able to recieve funds at their address, the payment will fallback to the owner.
contract RewardDistributor is Ownable {
    /// @notice Amount of gas forwarded to each transfer call.
    /// @dev The recipient group is assumed to be a known group of contracts that won't consume more than this amount.
    uint256 public constant PER_RECIPIENT_GAS = 100_000;

    /// @notice The maximum number of addresses that may be recipients.
    /// @dev This ensures that all sends may always happen within a block.
    uint64 public constant MAX_RECIPIENTS = 64;

    /// @notice Hash of concat'ed recipient group.
    bytes32 public currentRecipientGroup;
    /// @notice Hash of concat'ed recipient weights.
    bytes32 public currentRecipientWeights;

    /// @notice The recipient couldn't receive rewards, so fallback to owner was triggered.
    event OwnerRecieved(address indexed owner, address indexed recipient, uint256 value);

    /// @notice Address successfully received rewards.
    event RecipientRecieved(address indexed recipient, uint256 value);

    /// @notice New recipients have been set
    event RecipientsUpdated(bytes32 recipientGroup, address[] recipients, bytes32 recipientWeights, uint256[] weights);

    /// @notice It is assumed that all recipients are able to receive eth when called with value but no data
    /// @param recipients Addresses to receive rewards.
    /// @param weights Weights of each recipient in basis points.
    constructor(address[] memory recipients, uint256[] memory weights) Ownable() {
        setRecipients(recipients, weights);
    }

    /// @notice allows eth to be deposited into this contract
    /// @dev this contract is expected to handle ether appearing in its balance as well as an explicit deposit
    receive() external payable {}

    /**
     * @notice Distributes previous rewards then updates the recipients to a new group.
     * @param currentRecipients Group of addresses that will receive their final rewards.
     * @param currentWeights Weights of the final rewards.
     * @param newRecipients Group of addresses that will receive future rewards.
     * @param newWeights Weights of the future rewards.
     */
    function distributeAndUpdateRecipients(
        address[] memory currentRecipients,
        uint256[] memory currentWeights,
        address[] memory newRecipients,
        uint256[] memory newWeights
    ) external onlyOwner {
        distributeRewards(currentRecipients, currentWeights);
        setRecipients(newRecipients, newWeights);
    }

    /**
     * @notice Sends rewards to the current group of recipients.
     * @dev The remainder will be kept in the contract.
     * @param recipients Group of addresses to receive rewards.
     * @param weights Weights of each recipient in basis points.
     */
    function distributeRewards(address[] memory recipients, uint256[] memory weights) public {
        if (recipients.length == 0) {
            revert EmptyRecipients();
        }

        if (recipients.length != weights.length) {
            revert InputLengthMismatch();
        }

        bytes32 recipientGroup = hashAddresses(recipients);
        if (recipientGroup != currentRecipientGroup) {
            revert InvalidRecipientGroup(currentRecipientGroup, recipientGroup);
        }

        bytes32 recipientWeights = hashWeights(weights);
        if (recipientWeights != currentRecipientWeights) {
            revert InvalidRecipientWeights(currentRecipientWeights, recipientWeights);
        }

        // calculate individual reward
        uint256 rewards = address(this).balance;
        // the reminder will be kept in the contract
        uint256 rewardPerBps = rewards / BASIS_POINTS;
        if (rewardPerBps == 0) {
            revert NoFundsToDistribute();
        }
        for (uint256 r; r < recipients.length; r = uncheckedInc(r)) {
            uint256 individualRewards;
            unchecked {
                // we know weights <= BASIS_POINTS
                individualRewards = rewardPerBps * weights[r];
            }
            // send the funds
            // if the recipient reentry to steal funds, the contract will not have sufficient
            // funds and revert when trying to send fund to the next recipient
            // if the recipient is the last, it doesn't matter since there are no extra fund to steal
            (bool success,) = recipients[r].call{value: individualRewards, gas: PER_RECIPIENT_GAS}("");

            // if the funds failed to send we send them to the owner for safe keeping
            // then the owner will have the opportunity to distribute them out of band
            if (success) {
                emit RecipientRecieved(recipients[r], individualRewards);
            } else {
                // cache owner in memory
                address _owner = owner();
                (bool ownerSuccess,) = _owner.call{value: individualRewards}("");
                // if this is the case then revert and sort it out
                // it's important that this fail in order to preserve the accounting in this contract.
                // if we dont fail here we enable a re-entrancy attack
                if (!ownerSuccess) {
                    revert OwnerFailedRecieve(_owner, recipients[r], individualRewards);
                }
                emit OwnerRecieved(_owner, recipients[r], individualRewards);
            }
        }
    }

    /**
     * @notice Validates and sets the group of recipient addresses. It is assumed that all recipients are able to receive eth
     * @dev We enforce a max number of recipients to ensure the distribution of rewards fits within a block.
     * @param recipients Group of addresses that will receive future rewards.
     * @param weights Weights of each recipient in basis points.
     */
    function setRecipients(address[] memory recipients, uint256[] memory weights) private {
        if (recipients.length == 0) {
            revert EmptyRecipients();
        }
        if (recipients.length != weights.length) {
            revert InputLengthMismatch();
        }
        if (recipients.length > MAX_RECIPIENTS) {
            // it is expected that all sends may happen within the block gas limit
            revert TooManyRecipients();
        }

        // validate that the total weight is 100%
        uint256 totalWeight = 0;
        for (uint256 i; i < weights.length; i = uncheckedInc(i)) {
            totalWeight += weights[i];
        }
        if (totalWeight != BASIS_POINTS) {
            revert InvalidTotalWeight(totalWeight);
        }

        // create a committment to the recipient group and update current
        bytes32 recipientGroup = hashAddresses(recipients);
        currentRecipientGroup = recipientGroup;

        // create a committment to the recipient weights and update current
        bytes32 recipientWeights = hashWeights(weights);
        currentRecipientWeights = recipientWeights;

        emit RecipientsUpdated(recipientGroup, recipients, recipientWeights, weights);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^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() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

pragma solidity ^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 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) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 4 of 4 : Util.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.16;

uint256 constant BASIS_POINTS = 10000;

// utility free functions

/// @notice sequentially hashes an array of addresses
/// @param addresses array of addresses to be hashed
function hashAddresses(address[] memory addresses) pure returns (bytes32 res) {
    assembly ("memory-safe") {
        // same as keccak256(abi.encodePacked(addresses))
        // save gas since the array is already in the memory
        // we skip the first 32 bytes (length) and hash the next length * 32 bytes
        res := keccak256(add(addresses, 32), mul(mload(addresses), 32))
    }
}

/// @notice sequentially hashes an array of weights
/// @param weights array of weights to be hashed
function hashWeights(uint256[] memory weights) pure returns (bytes32 res) {
    assembly ("memory-safe") {
        // same as keccak256(abi.encodePacked(weights))
        // save gas since the array is already in the memory
        // we skip the first 32 bytes (length) and hash the next length * 32 bytes
        res := keccak256(add(weights, 32), mul(mload(weights), 32))
    }
}

/// @notice increments an integer without checking for overflows
/// @dev from https://github.com/ethereum/solidity/issues/11721#issuecomment-890917517
function uncheckedInc(uint256 x) pure returns (uint256) {
    unchecked {
        return x + 1;
    }
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"weights","type":"uint256[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"EmptyRecipients","type":"error"},{"inputs":[],"name":"InputLengthMismatch","type":"error"},{"inputs":[{"internalType":"bytes32","name":"currentRecipientGroup","type":"bytes32"},{"internalType":"bytes32","name":"providedRecipientGroup","type":"bytes32"}],"name":"InvalidRecipientGroup","type":"error"},{"inputs":[{"internalType":"bytes32","name":"currentRecipientWeights","type":"bytes32"},{"internalType":"bytes32","name":"providedRecipientWeights","type":"bytes32"}],"name":"InvalidRecipientWeights","type":"error"},{"inputs":[{"internalType":"uint256","name":"totalWeight","type":"uint256"}],"name":"InvalidTotalWeight","type":"error"},{"inputs":[],"name":"NoFundsToDistribute","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"OwnerFailedRecieve","type":"error"},{"inputs":[],"name":"TooManyRecipients","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"OwnerRecieved","type":"event"},{"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":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"RecipientRecieved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"recipientGroup","type":"bytes32"},{"indexed":false,"internalType":"address[]","name":"recipients","type":"address[]"},{"indexed":false,"internalType":"bytes32","name":"recipientWeights","type":"bytes32"},{"indexed":false,"internalType":"uint256[]","name":"weights","type":"uint256[]"}],"name":"RecipientsUpdated","type":"event"},{"inputs":[],"name":"MAX_RECIPIENTS","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PER_RECIPIENT_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentRecipientGroup","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentRecipientWeights","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"currentRecipients","type":"address[]"},{"internalType":"uint256[]","name":"currentWeights","type":"uint256[]"},{"internalType":"address[]","name":"newRecipients","type":"address[]"},{"internalType":"uint256[]","name":"newWeights","type":"uint256[]"}],"name":"distributeAndUpdateRecipients","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"weights","type":"uint256[]"}],"name":"distributeRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","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"},{"stateMutability":"payable","type":"receive"}]

0x60806040523480156200001157600080fd5b5060405162000fe238038062000fe28339810160408190526200003491620002db565b6200003f3362000053565b6200004b8282620000a3565b505062000492565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8151600003620000c657604051632a67cf2360e01b815260040160405180910390fd5b8051825114620000e95760405163aaad13f760e01b815260040160405180910390fd5b8151604010156200010d57604051635531b49560e01b815260040160405180910390fd5b6000805b82518110156200015057828181518110620001305762000130620003b9565b602002602001015182620001459190620003cf565b915060010162000111565b5061271081146200017b57604051635943317f60e01b81526004810182905260240160405180910390fd5b60006200018f848051602090810291012090565b600181905590506000620001aa848051602090810291012090565b9050806002819055507f33bc54b3c50e54df666d4399528026a4b04671bb2a879281b5279f7352fb3e6c82868387604051620001ea9493929190620003f7565b60405180910390a15050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156200023a576200023a620001f9565b604052919050565b60006001600160401b038211156200025e576200025e620001f9565b5060051b60200190565b600082601f8301126200027a57600080fd5b81516020620002936200028d8362000242565b6200020f565b82815260059290921b84018101918181019086841115620002b357600080fd5b8286015b84811015620002d05780518352918301918301620002b7565b509695505050505050565b60008060408385031215620002ef57600080fd5b82516001600160401b03808211156200030757600080fd5b818501915085601f8301126200031c57600080fd5b815160206200032f6200028d8362000242565b82815260059290921b840181019181810190898411156200034f57600080fd5b948201945b83861015620003865785516001600160a01b0381168114620003765760008081fd5b8252948201949082019062000354565b91880151919650909350505080821115620003a057600080fd5b50620003af8582860162000268565b9150509250929050565b634e487b7160e01b600052603260045260246000fd5b80820180821115620003f157634e487b7160e01b600052601160045260246000fd5b92915050565b600060808201868352602060808185015281875180845260a086019150828901935060005b81811015620004435784516001600160a01b0316835293830193918301916001016200041c565b5050604085018790528481036060860152855180825290820192508186019060005b81811015620004835782518552938301939183019160010162000465565b50929998505050505050505050565b610b4080620004a26000396000f3fe60806040526004361061008a5760003560e01c806391aee56e1161005957806391aee56e1461011e578063a6980ce21461013e578063bd8bd40e1461016c578063dc55beee14610182578063f2fde38b1461019957600080fd5b8063143ba4f314610096578063715018a6146100b857806375fbe986146100cd5780638da5cb5b146100f657600080fd5b3661009157005b600080fd5b3480156100a257600080fd5b506100b66100b13660046108e1565b6101b9565b005b3480156100c457600080fd5b506100b66104f1565b3480156100d957600080fd5b506100e360025481565b6040519081526020015b60405180910390f35b34801561010257600080fd5b506000546040516001600160a01b0390911681526020016100ed565b34801561012a57600080fd5b506100b6610139366004610945565b610505565b34801561014a57600080fd5b50610153604081565b60405167ffffffffffffffff90911681526020016100ed565b34801561017857600080fd5b506100e360015481565b34801561018e57600080fd5b506100e3620186a081565b3480156101a557600080fd5b506100b66101b43660046109f2565b610527565b81516000036101db57604051632a67cf2360e01b815260040160405180910390fd5b80518251146101fd5760405163aaad13f760e01b815260040160405180910390fd5b6000610210838051602090810291012090565b9050600154811461024757600154604051632cf5faaf60e01b81526004810191909152602481018290526044015b60405180910390fd5b600061025a838051602090810291012090565b9050600254811461028c5760025460405163505c311b60e01b815260048101919091526024810182905260440161023e565b47600061029b61271083610a14565b9050806000036102be576040516318f5992f60e21b815260040160405180910390fd5b60005b86518110156104e85760008682815181106102de576102de610a36565b60200260200101518302905060008883815181106102fe576102fe610a36565b60200260200101516001600160a01b031682620186a090604051600060405180830381858888f193505050503d8060008114610356576040519150601f19603f3d011682016040523d82523d6000602084013e61035b565b606091505b5050905080156103c65788838151811061037757610377610a36565b60200260200101516001600160a01b03167f8b2a2b28e169eb0e4f62578e9d12f747d7bd0fe1ebc935af28387c18034d7cc0836040516103b991815260200190565b60405180910390a26104de565b600080546040516001600160a01b039091169190829085908381818185875af1925050503d8060008114610416576040519150601f19603f3d011682016040523d82523d6000602084013e61041b565b606091505b505090508061047557818b868151811061043757610437610a36565b6020908102919091010151604051630599c73f60e51b81526001600160a01b039283166004820152911660248201526044810185905260640161023e565b8a858151811061048757610487610a36565b60200260200101516001600160a01b0316826001600160a01b03167ff3b03d863408466d72337e3dd8e40d5b9a37c5ef4c274f40dd3542d87697ab7e866040516104d391815260200190565b60405180910390a350505b50506001016102c1565b50505050505050565b6104f96105a0565b61050360006105fa565b565b61050d6105a0565b61051784846101b9565b610521828261064a565b50505050565b61052f6105a0565b6001600160a01b0381166105945760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161023e565b61059d816105fa565b50565b6000546001600160a01b031633146105035760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161023e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b815160000361066c57604051632a67cf2360e01b815260040160405180910390fd5b805182511461068e5760405163aaad13f760e01b815260040160405180910390fd5b8151604010156106b157604051635531b49560e01b815260040160405180910390fd5b6000805b82518110156106ed578281815181106106d0576106d0610a36565b6020026020010151826106e39190610a4c565b91506001016106b5565b50612710811461071357604051635943317f60e01b81526004810182905260240161023e565b6000610726848051602090810291012090565b600181905590506000610740848051602090810291012090565b9050806002819055507f33bc54b3c50e54df666d4399528026a4b04671bb2a879281b5279f7352fb3e6c8286838760405161077e9493929190610a73565b60405180910390a15050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156107cc576107cc61078d565b604052919050565b600067ffffffffffffffff8211156107ee576107ee61078d565b5060051b60200190565b80356001600160a01b038116811461080f57600080fd5b919050565b600082601f83011261082557600080fd5b8135602061083a610835836107d4565b6107a3565b82815260059290921b8401810191818101908684111561085957600080fd5b8286015b8481101561087b5761086e816107f8565b835291830191830161085d565b509695505050505050565b600082601f83011261089757600080fd5b813560206108a7610835836107d4565b82815260059290921b840181019181810190868411156108c657600080fd5b8286015b8481101561087b57803583529183019183016108ca565b600080604083850312156108f457600080fd5b823567ffffffffffffffff8082111561090c57600080fd5b61091886838701610814565b9350602085013591508082111561092e57600080fd5b5061093b85828601610886565b9150509250929050565b6000806000806080858703121561095b57600080fd5b843567ffffffffffffffff8082111561097357600080fd5b61097f88838901610814565b9550602087013591508082111561099557600080fd5b6109a188838901610886565b945060408701359150808211156109b757600080fd5b6109c388838901610814565b935060608701359150808211156109d957600080fd5b506109e687828801610886565b91505092959194509250565b600060208284031215610a0457600080fd5b610a0d826107f8565b9392505050565b600082610a3157634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b80820180821115610a6d57634e487b7160e01b600052601160045260246000fd5b92915050565b600060808201868352602060808185015281875180845260a086019150828901935060005b81811015610abd5784516001600160a01b031683529383019391830191600101610a98565b5050604085018790528481036060860152855180825290820192508186019060005b81811015610afb57825185529383019391830191600101610adf565b5092999850505050505050505056fea264697066735822122098d4866df0044184e0a944c81bb2ed2ebc5043ad3e5188599e086e5fdd38f27c64736f6c63430008100033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000d0749b3e537ed52de4e6a3ae1eb6fc26059d089500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000002710

Deployed Bytecode

0x60806040526004361061008a5760003560e01c806391aee56e1161005957806391aee56e1461011e578063a6980ce21461013e578063bd8bd40e1461016c578063dc55beee14610182578063f2fde38b1461019957600080fd5b8063143ba4f314610096578063715018a6146100b857806375fbe986146100cd5780638da5cb5b146100f657600080fd5b3661009157005b600080fd5b3480156100a257600080fd5b506100b66100b13660046108e1565b6101b9565b005b3480156100c457600080fd5b506100b66104f1565b3480156100d957600080fd5b506100e360025481565b6040519081526020015b60405180910390f35b34801561010257600080fd5b506000546040516001600160a01b0390911681526020016100ed565b34801561012a57600080fd5b506100b6610139366004610945565b610505565b34801561014a57600080fd5b50610153604081565b60405167ffffffffffffffff90911681526020016100ed565b34801561017857600080fd5b506100e360015481565b34801561018e57600080fd5b506100e3620186a081565b3480156101a557600080fd5b506100b66101b43660046109f2565b610527565b81516000036101db57604051632a67cf2360e01b815260040160405180910390fd5b80518251146101fd5760405163aaad13f760e01b815260040160405180910390fd5b6000610210838051602090810291012090565b9050600154811461024757600154604051632cf5faaf60e01b81526004810191909152602481018290526044015b60405180910390fd5b600061025a838051602090810291012090565b9050600254811461028c5760025460405163505c311b60e01b815260048101919091526024810182905260440161023e565b47600061029b61271083610a14565b9050806000036102be576040516318f5992f60e21b815260040160405180910390fd5b60005b86518110156104e85760008682815181106102de576102de610a36565b60200260200101518302905060008883815181106102fe576102fe610a36565b60200260200101516001600160a01b031682620186a090604051600060405180830381858888f193505050503d8060008114610356576040519150601f19603f3d011682016040523d82523d6000602084013e61035b565b606091505b5050905080156103c65788838151811061037757610377610a36565b60200260200101516001600160a01b03167f8b2a2b28e169eb0e4f62578e9d12f747d7bd0fe1ebc935af28387c18034d7cc0836040516103b991815260200190565b60405180910390a26104de565b600080546040516001600160a01b039091169190829085908381818185875af1925050503d8060008114610416576040519150601f19603f3d011682016040523d82523d6000602084013e61041b565b606091505b505090508061047557818b868151811061043757610437610a36565b6020908102919091010151604051630599c73f60e51b81526001600160a01b039283166004820152911660248201526044810185905260640161023e565b8a858151811061048757610487610a36565b60200260200101516001600160a01b0316826001600160a01b03167ff3b03d863408466d72337e3dd8e40d5b9a37c5ef4c274f40dd3542d87697ab7e866040516104d391815260200190565b60405180910390a350505b50506001016102c1565b50505050505050565b6104f96105a0565b61050360006105fa565b565b61050d6105a0565b61051784846101b9565b610521828261064a565b50505050565b61052f6105a0565b6001600160a01b0381166105945760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161023e565b61059d816105fa565b50565b6000546001600160a01b031633146105035760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161023e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b815160000361066c57604051632a67cf2360e01b815260040160405180910390fd5b805182511461068e5760405163aaad13f760e01b815260040160405180910390fd5b8151604010156106b157604051635531b49560e01b815260040160405180910390fd5b6000805b82518110156106ed578281815181106106d0576106d0610a36565b6020026020010151826106e39190610a4c565b91506001016106b5565b50612710811461071357604051635943317f60e01b81526004810182905260240161023e565b6000610726848051602090810291012090565b600181905590506000610740848051602090810291012090565b9050806002819055507f33bc54b3c50e54df666d4399528026a4b04671bb2a879281b5279f7352fb3e6c8286838760405161077e9493929190610a73565b60405180910390a15050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156107cc576107cc61078d565b604052919050565b600067ffffffffffffffff8211156107ee576107ee61078d565b5060051b60200190565b80356001600160a01b038116811461080f57600080fd5b919050565b600082601f83011261082557600080fd5b8135602061083a610835836107d4565b6107a3565b82815260059290921b8401810191818101908684111561085957600080fd5b8286015b8481101561087b5761086e816107f8565b835291830191830161085d565b509695505050505050565b600082601f83011261089757600080fd5b813560206108a7610835836107d4565b82815260059290921b840181019181810190868411156108c657600080fd5b8286015b8481101561087b57803583529183019183016108ca565b600080604083850312156108f457600080fd5b823567ffffffffffffffff8082111561090c57600080fd5b61091886838701610814565b9350602085013591508082111561092e57600080fd5b5061093b85828601610886565b9150509250929050565b6000806000806080858703121561095b57600080fd5b843567ffffffffffffffff8082111561097357600080fd5b61097f88838901610814565b9550602087013591508082111561099557600080fd5b6109a188838901610886565b945060408701359150808211156109b757600080fd5b6109c388838901610814565b935060608701359150808211156109d957600080fd5b506109e687828801610886565b91505092959194509250565b600060208284031215610a0457600080fd5b610a0d826107f8565b9392505050565b600082610a3157634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b80820180821115610a6d57634e487b7160e01b600052601160045260246000fd5b92915050565b600060808201868352602060808185015281875180845260a086019150828901935060005b81811015610abd5784516001600160a01b031683529383019391830191600101610a98565b5050604085018790528481036060860152855180825290820192508186019060005b81811015610afb57825185529383019391830191600101610adf565b5092999850505050505050505056fea264697066735822122098d4866df0044184e0a944c81bb2ed2ebc5043ad3e5188599e086e5fdd38f27c64736f6c63430008100033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ 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.