ETH Price: $1,779.77 (+9.91%)

Contract

0xbF5041Fc07E1c866D15c749156657B8eEd0fb649

Overview

ETH Balance

16.41989135975 ETH

ETH Value

$29,223.71 (@ $1,779.77/ETH)

Token Holdings

Transaction Hash
Method
Block
From
To
Distribute Rewar...3276823762025-04-18 14:21:034 days ago1744986063IN
Arbitrum: L2 Base Fee
0 ETH0.000001740.01
Distribute Rewar...3246237802025-04-09 17:00:0513 days ago1744218005IN
Arbitrum: L2 Base Fee
0 ETH0.00000060.01
Distribute Rewar...3222136202025-04-02 17:00:0520 days ago1743613205IN
Arbitrum: L2 Base Fee
0 ETH0.000000610.010761
Distribute Rewar...3173855442025-03-19 17:00:0934 days ago1742403609IN
Arbitrum: L2 Base Fee
0 ETH0.000000520.01
Distribute Rewar...3149757802025-03-12 17:00:0641 days ago1741798806IN
Arbitrum: L2 Base Fee
0 ETH0.000001240.01
Distribute Rewar...3125793592025-03-05 18:00:0748 days ago1741197607IN
Arbitrum: L2 Base Fee
0 ETH0.000000750.01
Distribute Rewar...3101729432025-02-26 18:00:0655 days ago1740592806IN
Arbitrum: L2 Base Fee
0 ETH0.000003610.065462
Distribute Rewar...3077682862025-02-19 18:00:0662 days ago1739988006IN
Arbitrum: L2 Base Fee
0 ETH0.00000060.01
Distribute Rewar...3053672672025-02-12 18:00:0769 days ago1739383207IN
Arbitrum: L2 Base Fee
0 ETH0.000001890.01
Distribute Rewar...3029684122025-02-05 18:00:0776 days ago1738778407IN
Arbitrum: L2 Base Fee
0 ETH0.000002030.01
Distribute Rewar...3005746142025-01-29 18:00:0683 days ago1738173606IN
Arbitrum: L2 Base Fee
0 ETH0.000002330.01
Distribute Rewar...2981673772025-01-22 18:00:0690 days ago1737568806IN
Arbitrum: L2 Base Fee
0 ETH0.000001450.01
Distribute Rewar...2957580622025-01-15 18:00:0697 days ago1736964006IN
Arbitrum: L2 Base Fee
0 ETH0.000012890.01
Distribute Rewar...2933505282025-01-08 18:00:07104 days ago1736359207IN
Arbitrum: L2 Base Fee
0 ETH0.000028530.01
Distribute Rewar...2930539342025-01-07 21:19:06105 days ago1736284746IN
Arbitrum: L2 Base Fee
0 ETH0.000001880.01
Distribute Rewar...2930536952025-01-07 21:18:06105 days ago1736284686IN
Arbitrum: L2 Base Fee
0 ETH0.000001850.01
Distribute Rewar...2704212482024-11-03 0:00:07171 days ago1730592007IN
Arbitrum: L2 Base Fee
0 ETH0.000000710.01
Distribute Rewar...2680154102024-10-27 0:00:08178 days ago1729987208IN
Arbitrum: L2 Base Fee
0 ETH0.000000740.01
Distribute Rewar...2656068852024-10-20 0:00:08185 days ago1729382408IN
Arbitrum: L2 Base Fee
0 ETH0.000001070.01
Distribute Rewar...2632008132024-10-13 0:00:08192 days ago1728777608IN
Arbitrum: L2 Base Fee
0 ETH0.000001120.01
Distribute Rewar...2607980522024-10-06 0:00:08199 days ago1728172808IN
Arbitrum: L2 Base Fee
0 ETH0.000000850.01
Distribute Rewar...2583986782024-09-29 0:00:08206 days ago1727568008IN
Arbitrum: L2 Base Fee
0 ETH0.000000860.01
Distribute Rewar...2559922512024-09-22 0:00:09213 days ago1726963209IN
Arbitrum: L2 Base Fee
0 ETH0.000000990.01
Distribute Rewar...2535926982024-09-15 0:00:09220 days ago1726358409IN
Arbitrum: L2 Base Fee
0 ETH0.000000550.01
Distribute Rewar...2511890522024-09-08 0:00:08227 days ago1725753608IN
Arbitrum: L2 Base Fee
0 ETH0.000000540.01
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
3293020842025-04-23 7:23:322 mins ago1745393012
Arbitrum: L2 Base Fee
0.00000124 ETH
3292974532025-04-23 7:04:1721 mins ago1745391857
Arbitrum: L2 Base Fee
0.00000021 ETH
3292974502025-04-23 7:04:1721 mins ago1745391857
Arbitrum: L2 Base Fee
0.00000275 ETH
3292958892025-04-23 6:57:4727 mins ago1745391467
Arbitrum: L2 Base Fee
0.00000124 ETH
3292912712025-04-23 6:38:3147 mins ago1745390311
Arbitrum: L2 Base Fee
0.00000021 ETH
3292897682025-04-23 6:32:1653 mins ago1745389936
Arbitrum: L2 Base Fee
0.00002 ETH
3292897672025-04-23 6:32:1653 mins ago1745389936
Arbitrum: L2 Base Fee
0.000003 ETH
3292881952025-04-23 6:25:461 hrs ago1745389546
Arbitrum: L2 Base Fee
0.0000004 ETH
3292881942025-04-23 6:25:461 hrs ago1745389546
Arbitrum: L2 Base Fee
0.0000004 ETH
3292835342025-04-23 6:06:311 hr ago1745388391
Arbitrum: L2 Base Fee
0.00000093 ETH
3292804722025-04-23 5:53:461 hr ago1745387626
Arbitrum: L2 Base Fee
0.00000079 ETH
3292774062025-04-23 5:41:011 hr ago1745386861
Arbitrum: L2 Base Fee
0.00000275 ETH
3292743292025-04-23 5:28:161 hr ago1745386096
Arbitrum: L2 Base Fee
0.00000133 ETH
3292743162025-04-23 5:28:161 hr ago1745386096
Arbitrum: L2 Base Fee
0.00000102 ETH
3292743092025-04-23 5:28:161 hr ago1745386096
Arbitrum: L2 Base Fee
0.00000096 ETH
3292743022025-04-23 5:28:161 hr ago1745386096
Arbitrum: L2 Base Fee
0.00000144 ETH
3292727472025-04-23 5:21:462 hrs ago1745385706
Arbitrum: L2 Base Fee
0.00000275 ETH
3292712462025-04-23 5:15:302 hrs ago1745385330
Arbitrum: L2 Base Fee
0.00002 ETH
3292712452025-04-23 5:15:302 hrs ago1745385330
Arbitrum: L2 Base Fee
0.000003 ETH
3292696982025-04-23 5:09:002 hrs ago1745384940
Arbitrum: L2 Base Fee
0.00000102 ETH
3292666162025-04-23 4:56:152 hrs ago1745384175
Arbitrum: L2 Base Fee
0.00000144 ETH
3292666112025-04-23 4:56:152 hrs ago1745384175
Arbitrum: L2 Base Fee
0.00000102 ETH
3292650412025-04-23 4:49:452 hrs ago1745383785
Arbitrum: L2 Base Fee
0.00000275 ETH
3292619882025-04-23 4:37:002 hrs ago1745383020
Arbitrum: L2 Base Fee
0.00000275 ETH
3292619832025-04-23 4:37:002 hrs ago1745383020
Arbitrum: L2 Base Fee
0.00000275 ETH
View All Internal Transactions

Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RewardDistributor

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 4 : RewardDistributor.sol
// 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);
    }
}

File 2 of 4 : Ownable.sol
// 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);
    }
}

File 3 of 4 : Context.sol
// 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"}]

60806040523480156200001157600080fd5b5060405162000fe238038062000fe28339810160408190526200003491620002db565b6200003f3362000053565b6200004b8282620000a3565b505062000492565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8151600003620000c657604051632a67cf2360e01b815260040160405180910390fd5b8051825114620000e95760405163aaad13f760e01b815260040160405180910390fd5b8151604010156200010d57604051635531b49560e01b815260040160405180910390fd5b6000805b82518110156200015057828181518110620001305762000130620003b9565b602002602001015182620001459190620003cf565b915060010162000111565b5061271081146200017b57604051635943317f60e01b81526004810182905260240160405180910390fd5b60006200018f848051602090810291012090565b600181905590506000620001aa848051602090810291012090565b9050806002819055507f33bc54b3c50e54df666d4399528026a4b04671bb2a879281b5279f7352fb3e6c82868387604051620001ea9493929190620003f7565b60405180910390a15050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156200023a576200023a620001f9565b604052919050565b60006001600160401b038211156200025e576200025e620001f9565b5060051b60200190565b600082601f8301126200027a57600080fd5b81516020620002936200028d8362000242565b6200020f565b82815260059290921b84018101918181019086841115620002b357600080fd5b8286015b84811015620002d05780518352918301918301620002b7565b509695505050505050565b60008060408385031215620002ef57600080fd5b82516001600160401b03808211156200030757600080fd5b818501915085601f8301126200031c57600080fd5b815160206200032f6200028d8362000242565b82815260059290921b840181019181810190898411156200034f57600080fd5b948201945b83861015620003865785516001600160a01b0381168114620003765760008081fd5b8252948201949082019062000354565b91880151919650909350505080821115620003a057600080fd5b50620003af8582860162000268565b9150509250929050565b634e487b7160e01b600052603260045260246000fd5b80820180821115620003f157634e487b7160e01b600052601160045260246000fd5b92915050565b600060808201868352602060808185015281875180845260a086019150828901935060005b81811015620004435784516001600160a01b0316835293830193918301916001016200041c565b5050604085018790528481036060860152855180825290820192508186019060005b81811015620004835782518552938301939183019160010162000465565b50929998505050505050505050565b610b4080620004a26000396000f3fe60806040526004361061008a5760003560e01c806391aee56e1161005957806391aee56e1461011e578063a6980ce21461013e578063bd8bd40e1461016c578063dc55beee14610182578063f2fde38b1461019957600080fd5b8063143ba4f314610096578063715018a6146100b857806375fbe986146100cd5780638da5cb5b146100f657600080fd5b3661009157005b600080fd5b3480156100a257600080fd5b506100b66100b13660046108e1565b6101b9565b005b3480156100c457600080fd5b506100b66104f1565b3480156100d957600080fd5b506100e360025481565b6040519081526020015b60405180910390f35b34801561010257600080fd5b506000546040516001600160a01b0390911681526020016100ed565b34801561012a57600080fd5b506100b6610139366004610945565b610505565b34801561014a57600080fd5b50610153604081565b60405167ffffffffffffffff90911681526020016100ed565b34801561017857600080fd5b506100e360015481565b34801561018e57600080fd5b506100e3620186a081565b3480156101a557600080fd5b506100b66101b43660046109f2565b610527565b81516000036101db57604051632a67cf2360e01b815260040160405180910390fd5b80518251146101fd5760405163aaad13f760e01b815260040160405180910390fd5b6000610210838051602090810291012090565b9050600154811461024757600154604051632cf5faaf60e01b81526004810191909152602481018290526044015b60405180910390fd5b600061025a838051602090810291012090565b9050600254811461028c5760025460405163505c311b60e01b815260048101919091526024810182905260440161023e565b47600061029b61271083610a14565b9050806000036102be576040516318f5992f60e21b815260040160405180910390fd5b60005b86518110156104e85760008682815181106102de576102de610a36565b60200260200101518302905060008883815181106102fe576102fe610a36565b60200260200101516001600160a01b031682620186a090604051600060405180830381858888f193505050503d8060008114610356576040519150601f19603f3d011682016040523d82523d6000602084013e61035b565b606091505b5050905080156103c65788838151811061037757610377610a36565b60200260200101516001600160a01b03167f8b2a2b28e169eb0e4f62578e9d12f747d7bd0fe1ebc935af28387c18034d7cc0836040516103b991815260200190565b60405180910390a26104de565b600080546040516001600160a01b039091169190829085908381818185875af1925050503d8060008114610416576040519150601f19603f3d011682016040523d82523d6000602084013e61041b565b606091505b505090508061047557818b868151811061043757610437610a36565b6020908102919091010151604051630599c73f60e51b81526001600160a01b039283166004820152911660248201526044810185905260640161023e565b8a858151811061048757610487610a36565b60200260200101516001600160a01b0316826001600160a01b03167ff3b03d863408466d72337e3dd8e40d5b9a37c5ef4c274f40dd3542d87697ab7e866040516104d391815260200190565b60405180910390a350505b50506001016102c1565b50505050505050565b6104f96105a0565b61050360006105fa565b565b61050d6105a0565b61051784846101b9565b610521828261064a565b50505050565b61052f6105a0565b6001600160a01b0381166105945760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161023e565b61059d816105fa565b50565b6000546001600160a01b031633146105035760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161023e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b815160000361066c57604051632a67cf2360e01b815260040160405180910390fd5b805182511461068e5760405163aaad13f760e01b815260040160405180910390fd5b8151604010156106b157604051635531b49560e01b815260040160405180910390fd5b6000805b82518110156106ed578281815181106106d0576106d0610a36565b6020026020010151826106e39190610a4c565b91506001016106b5565b50612710811461071357604051635943317f60e01b81526004810182905260240161023e565b6000610726848051602090810291012090565b600181905590506000610740848051602090810291012090565b9050806002819055507f33bc54b3c50e54df666d4399528026a4b04671bb2a879281b5279f7352fb3e6c8286838760405161077e9493929190610a73565b60405180910390a15050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156107cc576107cc61078d565b604052919050565b600067ffffffffffffffff8211156107ee576107ee61078d565b5060051b60200190565b80356001600160a01b038116811461080f57600080fd5b919050565b600082601f83011261082557600080fd5b8135602061083a610835836107d4565b6107a3565b82815260059290921b8401810191818101908684111561085957600080fd5b8286015b8481101561087b5761086e816107f8565b835291830191830161085d565b509695505050505050565b600082601f83011261089757600080fd5b813560206108a7610835836107d4565b82815260059290921b840181019181810190868411156108c657600080fd5b8286015b8481101561087b57803583529183019183016108ca565b600080604083850312156108f457600080fd5b823567ffffffffffffffff8082111561090c57600080fd5b61091886838701610814565b9350602085013591508082111561092e57600080fd5b5061093b85828601610886565b9150509250929050565b6000806000806080858703121561095b57600080fd5b843567ffffffffffffffff8082111561097357600080fd5b61097f88838901610814565b9550602087013591508082111561099557600080fd5b6109a188838901610886565b945060408701359150808211156109b757600080fd5b6109c388838901610814565b935060608701359150808211156109d957600080fd5b506109e687828801610886565b91505092959194509250565b600060208284031215610a0457600080fd5b610a0d826107f8565b9392505050565b600082610a3157634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b80820180821115610a6d57634e487b7160e01b600052601160045260246000fd5b92915050565b600060808201868352602060808185015281875180845260a086019150828901935060005b81811015610abd5784516001600160a01b031683529383019391830191600101610a98565b5050604085018790528481036060860152855180825290820192508186019060005b81811015610afb57825185529383019391830191600101610adf565b5092999850505050505050505056fea264697066735822122098d4866df0044184e0a944c81bb2ed2ebc5043ad3e5188599e086e5fdd38f27c64736f6c63430008100033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000bfc1feca8b09a5c5d3effe7429ebe24b9c09ef5800000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000002710

Deployed Bytecode

0x60806040526004361061008a5760003560e01c806391aee56e1161005957806391aee56e1461011e578063a6980ce21461013e578063bd8bd40e1461016c578063dc55beee14610182578063f2fde38b1461019957600080fd5b8063143ba4f314610096578063715018a6146100b857806375fbe986146100cd5780638da5cb5b146100f657600080fd5b3661009157005b600080fd5b3480156100a257600080fd5b506100b66100b13660046108e1565b6101b9565b005b3480156100c457600080fd5b506100b66104f1565b3480156100d957600080fd5b506100e360025481565b6040519081526020015b60405180910390f35b34801561010257600080fd5b506000546040516001600160a01b0390911681526020016100ed565b34801561012a57600080fd5b506100b6610139366004610945565b610505565b34801561014a57600080fd5b50610153604081565b60405167ffffffffffffffff90911681526020016100ed565b34801561017857600080fd5b506100e360015481565b34801561018e57600080fd5b506100e3620186a081565b3480156101a557600080fd5b506100b66101b43660046109f2565b610527565b81516000036101db57604051632a67cf2360e01b815260040160405180910390fd5b80518251146101fd5760405163aaad13f760e01b815260040160405180910390fd5b6000610210838051602090810291012090565b9050600154811461024757600154604051632cf5faaf60e01b81526004810191909152602481018290526044015b60405180910390fd5b600061025a838051602090810291012090565b9050600254811461028c5760025460405163505c311b60e01b815260048101919091526024810182905260440161023e565b47600061029b61271083610a14565b9050806000036102be576040516318f5992f60e21b815260040160405180910390fd5b60005b86518110156104e85760008682815181106102de576102de610a36565b60200260200101518302905060008883815181106102fe576102fe610a36565b60200260200101516001600160a01b031682620186a090604051600060405180830381858888f193505050503d8060008114610356576040519150601f19603f3d011682016040523d82523d6000602084013e61035b565b606091505b5050905080156103c65788838151811061037757610377610a36565b60200260200101516001600160a01b03167f8b2a2b28e169eb0e4f62578e9d12f747d7bd0fe1ebc935af28387c18034d7cc0836040516103b991815260200190565b60405180910390a26104de565b600080546040516001600160a01b039091169190829085908381818185875af1925050503d8060008114610416576040519150601f19603f3d011682016040523d82523d6000602084013e61041b565b606091505b505090508061047557818b868151811061043757610437610a36565b6020908102919091010151604051630599c73f60e51b81526001600160a01b039283166004820152911660248201526044810185905260640161023e565b8a858151811061048757610487610a36565b60200260200101516001600160a01b0316826001600160a01b03167ff3b03d863408466d72337e3dd8e40d5b9a37c5ef4c274f40dd3542d87697ab7e866040516104d391815260200190565b60405180910390a350505b50506001016102c1565b50505050505050565b6104f96105a0565b61050360006105fa565b565b61050d6105a0565b61051784846101b9565b610521828261064a565b50505050565b61052f6105a0565b6001600160a01b0381166105945760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161023e565b61059d816105fa565b50565b6000546001600160a01b031633146105035760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161023e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b815160000361066c57604051632a67cf2360e01b815260040160405180910390fd5b805182511461068e5760405163aaad13f760e01b815260040160405180910390fd5b8151604010156106b157604051635531b49560e01b815260040160405180910390fd5b6000805b82518110156106ed578281815181106106d0576106d0610a36565b6020026020010151826106e39190610a4c565b91506001016106b5565b50612710811461071357604051635943317f60e01b81526004810182905260240161023e565b6000610726848051602090810291012090565b600181905590506000610740848051602090810291012090565b9050806002819055507f33bc54b3c50e54df666d4399528026a4b04671bb2a879281b5279f7352fb3e6c8286838760405161077e9493929190610a73565b60405180910390a15050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156107cc576107cc61078d565b604052919050565b600067ffffffffffffffff8211156107ee576107ee61078d565b5060051b60200190565b80356001600160a01b038116811461080f57600080fd5b919050565b600082601f83011261082557600080fd5b8135602061083a610835836107d4565b6107a3565b82815260059290921b8401810191818101908684111561085957600080fd5b8286015b8481101561087b5761086e816107f8565b835291830191830161085d565b509695505050505050565b600082601f83011261089757600080fd5b813560206108a7610835836107d4565b82815260059290921b840181019181810190868411156108c657600080fd5b8286015b8481101561087b57803583529183019183016108ca565b600080604083850312156108f457600080fd5b823567ffffffffffffffff8082111561090c57600080fd5b61091886838701610814565b9350602085013591508082111561092e57600080fd5b5061093b85828601610886565b9150509250929050565b6000806000806080858703121561095b57600080fd5b843567ffffffffffffffff8082111561097357600080fd5b61097f88838901610814565b9550602087013591508082111561099557600080fd5b6109a188838901610886565b945060408701359150808211156109b757600080fd5b6109c388838901610814565b935060608701359150808211156109d957600080fd5b506109e687828801610886565b91505092959194509250565b600060208284031215610a0457600080fd5b610a0d826107f8565b9392505050565b600082610a3157634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b80820180821115610a6d57634e487b7160e01b600052601160045260246000fd5b92915050565b600060808201868352602060808185015281875180845260a086019150828901935060005b81811015610abd5784516001600160a01b031683529383019391830191600101610a98565b5050604085018790528481036060860152855180825290820192508186019060005b81811015610afb57825185529383019391830191600101610adf565b5092999850505050505050505056fea264697066735822122098d4866df0044184e0a944c81bb2ed2ebc5043ad3e5188599e086e5fdd38f27c64736f6c63430008100033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000bfc1feca8b09a5c5d3effe7429ebe24b9c09ef5800000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000002710

-----Decoded View---------------
Arg [0] : recipients (address[]): 0xbFc1FECa8B09A5c5D3EFfE7429eBE24b9c09EF58
Arg [1] : weights (uint256[]): 10000

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [3] : 000000000000000000000000bfc1feca8b09a5c5d3effe7429ebe24b9c09ef58
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [5] : 0000000000000000000000000000000000000000000000000000000000002710


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
[ 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.