ETH Price: $2,882.50 (-2.60%)

Contract

0x3B68a689c929327224dBfCe31C1bf72Ffd2559Ce

Overview

ETH Balance

0.000000000000009315 ETH

ETH Value

Less Than $0.01 (@ $2,882.50/ETH)

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Distribute Rewar...845398592026-01-18 13:05:057 days ago1768741505IN
Nova: L2 Surplus Fee
0 ETH0.000002280.02
VIEW ADVANCED FILTER

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
845582932026-01-23 14:26:502 days ago1769178410
Nova: L2 Surplus Fee
0.00000012 ETH
845577612026-01-23 10:56:402 days ago1769165800
Nova: L2 Surplus Fee
0.00000008 ETH
845492562026-01-21 2:21:314 days ago1768962091
Nova: L2 Surplus Fee
0.00000006 ETH
845455972026-01-20 5:54:535 days ago1768888493
Nova: L2 Surplus Fee
0.00000004 ETH
845455832026-01-20 5:49:095 days ago1768888149
Nova: L2 Surplus Fee
0.00000004 ETH
845455722026-01-20 5:41:595 days ago1768887719
Nova: L2 Surplus Fee
0.00000005 ETH
845408852026-01-18 21:08:406 days ago1768770520
Nova: L2 Surplus Fee
0.00000004 ETH
845408072026-01-18 20:37:266 days ago1768768646
Nova: L2 Surplus Fee
0.00000004 ETH
845398592026-01-18 13:05:057 days ago1768741505
Nova: L2 Surplus Fee
0.00000028 ETH
845368872026-01-17 11:41:198 days ago1768650079
Nova: L2 Surplus Fee
0.00000004 ETH
845324692026-01-16 3:21:529 days ago1768533712
Nova: L2 Surplus Fee
0.00000006 ETH
845324672026-01-16 3:21:529 days ago1768533712
Nova: L2 Surplus Fee
0.00000006 ETH
845318672026-01-15 22:26:419 days ago1768516001
Nova: L2 Surplus Fee
0.00000028 ETH
845295182026-01-15 8:59:5410 days ago1768467594
Nova: L2 Surplus Fee
0.00000017 ETH
845164832026-01-11 13:54:5814 days ago1768139698
Nova: L2 Surplus Fee
0.00000004 ETH
845111592026-01-09 18:11:4016 days ago1767982300
Nova: L2 Surplus Fee
0.00000011 ETH
845079122026-01-08 17:26:5117 days ago1767893211
Nova: L2 Surplus Fee
0.00000022 ETH
845068552026-01-08 11:28:2817 days ago1767871708
Nova: L2 Surplus Fee
0.00000005 ETH
845036072026-01-07 13:05:0518 days ago1767791105
Nova: L2 Surplus Fee
0.00000067 ETH
845012502026-01-06 18:36:5018 days ago1767724610
Nova: L2 Surplus Fee
0.00000023 ETH
844964832026-01-05 14:27:1920 days ago1767623239
Nova: L2 Surplus Fee
0.00000033 ETH
844964822026-01-05 14:27:1920 days ago1767623239
Nova: L2 Surplus Fee
0.00000033 ETH
844962532026-01-05 13:17:0220 days ago1767619022
Nova: L2 Surplus Fee
0.00000012 ETH
844953392026-01-05 7:11:4320 days ago1767597103
Nova: L2 Surplus Fee
0.00000005 ETH
844908322026-01-04 1:31:5821 days ago1767490318
Nova: L2 Surplus Fee
0.00000004 ETH
View All Internal Transactions

Cross-Chain 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
// 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"}]

60806040523480156200001157600080fd5b5060405162000fe238038062000fe28339810160408190526200003491620002db565b6200003f3362000053565b6200004b8282620000a3565b505062000492565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8151600003620000c657604051632a67cf2360e01b815260040160405180910390fd5b8051825114620000e95760405163aaad13f760e01b815260040160405180910390fd5b8151604010156200010d57604051635531b49560e01b815260040160405180910390fd5b6000805b82518110156200015057828181518110620001305762000130620003b9565b602002602001015182620001459190620003cf565b915060010162000111565b5061271081146200017b57604051635943317f60e01b81526004810182905260240160405180910390fd5b60006200018f848051602090810291012090565b600181905590506000620001aa848051602090810291012090565b9050806002819055507f33bc54b3c50e54df666d4399528026a4b04671bb2a879281b5279f7352fb3e6c82868387604051620001ea9493929190620003f7565b60405180910390a15050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156200023a576200023a620001f9565b604052919050565b60006001600160401b038211156200025e576200025e620001f9565b5060051b60200190565b600082601f8301126200027a57600080fd5b81516020620002936200028d8362000242565b6200020f565b82815260059290921b84018101918181019086841115620002b357600080fd5b8286015b84811015620002d05780518352918301918301620002b7565b509695505050505050565b60008060408385031215620002ef57600080fd5b82516001600160401b03808211156200030757600080fd5b818501915085601f8301126200031c57600080fd5b815160206200032f6200028d8362000242565b82815260059290921b840181019181810190898411156200034f57600080fd5b948201945b83861015620003865785516001600160a01b0381168114620003765760008081fd5b8252948201949082019062000354565b91880151919650909350505080821115620003a057600080fd5b50620003af8582860162000268565b9150509250929050565b634e487b7160e01b600052603260045260246000fd5b80820180821115620003f157634e487b7160e01b600052601160045260246000fd5b92915050565b600060808201868352602060808185015281875180845260a086019150828901935060005b81811015620004435784516001600160a01b0316835293830193918301916001016200041c565b5050604085018790528481036060860152855180825290820192508186019060005b81811015620004835782518552938301939183019160010162000465565b50929998505050505050505050565b610b4080620004a26000396000f3fe60806040526004361061008a5760003560e01c806391aee56e1161005957806391aee56e1461011e578063a6980ce21461013e578063bd8bd40e1461016c578063dc55beee14610182578063f2fde38b1461019957600080fd5b8063143ba4f314610096578063715018a6146100b857806375fbe986146100cd5780638da5cb5b146100f657600080fd5b3661009157005b600080fd5b3480156100a257600080fd5b506100b66100b13660046108e1565b6101b9565b005b3480156100c457600080fd5b506100b66104f1565b3480156100d957600080fd5b506100e360025481565b6040519081526020015b60405180910390f35b34801561010257600080fd5b506000546040516001600160a01b0390911681526020016100ed565b34801561012a57600080fd5b506100b6610139366004610945565b610505565b34801561014a57600080fd5b50610153604081565b60405167ffffffffffffffff90911681526020016100ed565b34801561017857600080fd5b506100e360015481565b34801561018e57600080fd5b506100e3620186a081565b3480156101a557600080fd5b506100b66101b43660046109f2565b610527565b81516000036101db57604051632a67cf2360e01b815260040160405180910390fd5b80518251146101fd5760405163aaad13f760e01b815260040160405180910390fd5b6000610210838051602090810291012090565b9050600154811461024757600154604051632cf5faaf60e01b81526004810191909152602481018290526044015b60405180910390fd5b600061025a838051602090810291012090565b9050600254811461028c5760025460405163505c311b60e01b815260048101919091526024810182905260440161023e565b47600061029b61271083610a14565b9050806000036102be576040516318f5992f60e21b815260040160405180910390fd5b60005b86518110156104e85760008682815181106102de576102de610a36565b60200260200101518302905060008883815181106102fe576102fe610a36565b60200260200101516001600160a01b031682620186a090604051600060405180830381858888f193505050503d8060008114610356576040519150601f19603f3d011682016040523d82523d6000602084013e61035b565b606091505b5050905080156103c65788838151811061037757610377610a36565b60200260200101516001600160a01b03167f8b2a2b28e169eb0e4f62578e9d12f747d7bd0fe1ebc935af28387c18034d7cc0836040516103b991815260200190565b60405180910390a26104de565b600080546040516001600160a01b039091169190829085908381818185875af1925050503d8060008114610416576040519150601f19603f3d011682016040523d82523d6000602084013e61041b565b606091505b505090508061047557818b868151811061043757610437610a36565b6020908102919091010151604051630599c73f60e51b81526001600160a01b039283166004820152911660248201526044810185905260640161023e565b8a858151811061048757610487610a36565b60200260200101516001600160a01b0316826001600160a01b03167ff3b03d863408466d72337e3dd8e40d5b9a37c5ef4c274f40dd3542d87697ab7e866040516104d391815260200190565b60405180910390a350505b50506001016102c1565b50505050505050565b6104f96105a0565b61050360006105fa565b565b61050d6105a0565b61051784846101b9565b610521828261064a565b50505050565b61052f6105a0565b6001600160a01b0381166105945760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161023e565b61059d816105fa565b50565b6000546001600160a01b031633146105035760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161023e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b815160000361066c57604051632a67cf2360e01b815260040160405180910390fd5b805182511461068e5760405163aaad13f760e01b815260040160405180910390fd5b8151604010156106b157604051635531b49560e01b815260040160405180910390fd5b6000805b82518110156106ed578281815181106106d0576106d0610a36565b6020026020010151826106e39190610a4c565b91506001016106b5565b50612710811461071357604051635943317f60e01b81526004810182905260240161023e565b6000610726848051602090810291012090565b600181905590506000610740848051602090810291012090565b9050806002819055507f33bc54b3c50e54df666d4399528026a4b04671bb2a879281b5279f7352fb3e6c8286838760405161077e9493929190610a73565b60405180910390a15050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156107cc576107cc61078d565b604052919050565b600067ffffffffffffffff8211156107ee576107ee61078d565b5060051b60200190565b80356001600160a01b038116811461080f57600080fd5b919050565b600082601f83011261082557600080fd5b8135602061083a610835836107d4565b6107a3565b82815260059290921b8401810191818101908684111561085957600080fd5b8286015b8481101561087b5761086e816107f8565b835291830191830161085d565b509695505050505050565b600082601f83011261089757600080fd5b813560206108a7610835836107d4565b82815260059290921b840181019181810190868411156108c657600080fd5b8286015b8481101561087b57803583529183019183016108ca565b600080604083850312156108f457600080fd5b823567ffffffffffffffff8082111561090c57600080fd5b61091886838701610814565b9350602085013591508082111561092e57600080fd5b5061093b85828601610886565b9150509250929050565b6000806000806080858703121561095b57600080fd5b843567ffffffffffffffff8082111561097357600080fd5b61097f88838901610814565b9550602087013591508082111561099557600080fd5b6109a188838901610886565b945060408701359150808211156109b757600080fd5b6109c388838901610814565b935060608701359150808211156109d957600080fd5b506109e687828801610886565b91505092959194509250565b600060208284031215610a0457600080fd5b610a0d826107f8565b9392505050565b600082610a3157634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b80820180821115610a6d57634e487b7160e01b600052601160045260246000fd5b92915050565b600060808201868352602060808185015281875180845260a086019150828901935060005b81811015610abd5784516001600160a01b031683529383019391830191600101610a98565b5050604085018790528481036060860152855180825290820192508186019060005b81811015610afb57825185529383019391830191600101610adf565b5092999850505050505050505056fea264697066735822122098d4866df0044184e0a944c81bb2ed2ebc5043ad3e5188599e086e5fdd38f27c64736f6c63430008100033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f7951d92b0c345144506576ec13ecf5103ac905a00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000002710

Deployed Bytecode

0x60806040526004361061008a5760003560e01c806391aee56e1161005957806391aee56e1461011e578063a6980ce21461013e578063bd8bd40e1461016c578063dc55beee14610182578063f2fde38b1461019957600080fd5b8063143ba4f314610096578063715018a6146100b857806375fbe986146100cd5780638da5cb5b146100f657600080fd5b3661009157005b600080fd5b3480156100a257600080fd5b506100b66100b13660046108e1565b6101b9565b005b3480156100c457600080fd5b506100b66104f1565b3480156100d957600080fd5b506100e360025481565b6040519081526020015b60405180910390f35b34801561010257600080fd5b506000546040516001600160a01b0390911681526020016100ed565b34801561012a57600080fd5b506100b6610139366004610945565b610505565b34801561014a57600080fd5b50610153604081565b60405167ffffffffffffffff90911681526020016100ed565b34801561017857600080fd5b506100e360015481565b34801561018e57600080fd5b506100e3620186a081565b3480156101a557600080fd5b506100b66101b43660046109f2565b610527565b81516000036101db57604051632a67cf2360e01b815260040160405180910390fd5b80518251146101fd5760405163aaad13f760e01b815260040160405180910390fd5b6000610210838051602090810291012090565b9050600154811461024757600154604051632cf5faaf60e01b81526004810191909152602481018290526044015b60405180910390fd5b600061025a838051602090810291012090565b9050600254811461028c5760025460405163505c311b60e01b815260048101919091526024810182905260440161023e565b47600061029b61271083610a14565b9050806000036102be576040516318f5992f60e21b815260040160405180910390fd5b60005b86518110156104e85760008682815181106102de576102de610a36565b60200260200101518302905060008883815181106102fe576102fe610a36565b60200260200101516001600160a01b031682620186a090604051600060405180830381858888f193505050503d8060008114610356576040519150601f19603f3d011682016040523d82523d6000602084013e61035b565b606091505b5050905080156103c65788838151811061037757610377610a36565b60200260200101516001600160a01b03167f8b2a2b28e169eb0e4f62578e9d12f747d7bd0fe1ebc935af28387c18034d7cc0836040516103b991815260200190565b60405180910390a26104de565b600080546040516001600160a01b039091169190829085908381818185875af1925050503d8060008114610416576040519150601f19603f3d011682016040523d82523d6000602084013e61041b565b606091505b505090508061047557818b868151811061043757610437610a36565b6020908102919091010151604051630599c73f60e51b81526001600160a01b039283166004820152911660248201526044810185905260640161023e565b8a858151811061048757610487610a36565b60200260200101516001600160a01b0316826001600160a01b03167ff3b03d863408466d72337e3dd8e40d5b9a37c5ef4c274f40dd3542d87697ab7e866040516104d391815260200190565b60405180910390a350505b50506001016102c1565b50505050505050565b6104f96105a0565b61050360006105fa565b565b61050d6105a0565b61051784846101b9565b610521828261064a565b50505050565b61052f6105a0565b6001600160a01b0381166105945760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161023e565b61059d816105fa565b50565b6000546001600160a01b031633146105035760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161023e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b815160000361066c57604051632a67cf2360e01b815260040160405180910390fd5b805182511461068e5760405163aaad13f760e01b815260040160405180910390fd5b8151604010156106b157604051635531b49560e01b815260040160405180910390fd5b6000805b82518110156106ed578281815181106106d0576106d0610a36565b6020026020010151826106e39190610a4c565b91506001016106b5565b50612710811461071357604051635943317f60e01b81526004810182905260240161023e565b6000610726848051602090810291012090565b600181905590506000610740848051602090810291012090565b9050806002819055507f33bc54b3c50e54df666d4399528026a4b04671bb2a879281b5279f7352fb3e6c8286838760405161077e9493929190610a73565b60405180910390a15050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156107cc576107cc61078d565b604052919050565b600067ffffffffffffffff8211156107ee576107ee61078d565b5060051b60200190565b80356001600160a01b038116811461080f57600080fd5b919050565b600082601f83011261082557600080fd5b8135602061083a610835836107d4565b6107a3565b82815260059290921b8401810191818101908684111561085957600080fd5b8286015b8481101561087b5761086e816107f8565b835291830191830161085d565b509695505050505050565b600082601f83011261089757600080fd5b813560206108a7610835836107d4565b82815260059290921b840181019181810190868411156108c657600080fd5b8286015b8481101561087b57803583529183019183016108ca565b600080604083850312156108f457600080fd5b823567ffffffffffffffff8082111561090c57600080fd5b61091886838701610814565b9350602085013591508082111561092e57600080fd5b5061093b85828601610886565b9150509250929050565b6000806000806080858703121561095b57600080fd5b843567ffffffffffffffff8082111561097357600080fd5b61097f88838901610814565b9550602087013591508082111561099557600080fd5b6109a188838901610886565b945060408701359150808211156109b757600080fd5b6109c388838901610814565b935060608701359150808211156109d957600080fd5b506109e687828801610886565b91505092959194509250565b600060208284031215610a0457600080fd5b610a0d826107f8565b9392505050565b600082610a3157634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b80820180821115610a6d57634e487b7160e01b600052601160045260246000fd5b92915050565b600060808201868352602060808185015281875180845260a086019150828901935060005b81811015610abd5784516001600160a01b031683529383019391830191600101610a98565b5050604085018790528481036060860152855180825290820192508186019060005b81811015610afb57825185529383019391830191600101610adf565b5092999850505050505050505056fea264697066735822122098d4866df0044184e0a944c81bb2ed2ebc5043ad3e5188599e086e5fdd38f27c64736f6c63430008100033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f7951d92b0c345144506576ec13ecf5103ac905a00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000002710

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

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [3] : 000000000000000000000000f7951d92b0c345144506576ec13ecf5103ac905a
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
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.