ETH Price: $3,405.88 (+2.52%)

Contract

0xc64783f0BE60A81A716535287539a694403183ba
 

Overview

ETH Balance

745.189088036134213473 ETH

Eth Value

$2,538,024.10 (@ $3,405.88/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Batch Withdraw213682652024-12-09 23:35:1114 days ago1733787311IN
0xc64783f0...4403183ba
0 ETH0.0021384831.34873526
Batch Withdraw213390452024-12-05 21:41:2318 days ago1733434883IN
0xc64783f0...4403183ba
0 ETH0.0019156623.76966392
Batch Withdraw212929772024-11-29 11:12:4724 days ago1732878767IN
0xc64783f0...4403183ba
0 ETH0.000578468.48236805
Batch Withdraw212706512024-11-26 8:12:4727 days ago1732608767IN
0xc64783f0...4403183ba
0 ETH0.000673549.8766555
Batch Withdraw212706242024-11-26 8:07:1127 days ago1732608431IN
0xc64783f0...4403183ba
0 ETH0.0007051110.34172941
Batch Withdraw212705602024-11-26 7:53:5927 days ago1732607639IN
0xc64783f0...4403183ba
0 ETH0.000539147.90719221
Batch Withdraw212702482024-11-26 6:51:2327 days ago1732603883IN
0xc64783f0...4403183ba
0 ETH0.000701066.77067729
Batch Withdraw212696942024-11-26 4:59:5927 days ago1732597199IN
0xc64783f0...4403183ba
0 ETH0.000424456.31285108
Batch Withdraw212684212024-11-26 0:43:5928 days ago1732581839IN
0xc64783f0...4403183ba
0 ETH0.00049819.74838313
Batch Withdraw212567272024-11-24 9:31:4729 days ago1732440707IN
0xc64783f0...4403183ba
0 ETH0.000623019.13264305
Batch Withdraw212398572024-11-22 1:02:1132 days ago1732237331IN
0xc64783f0...4403183ba
0 ETH0.0009072811.25681271
Batch Withdraw212357782024-11-21 11:23:1132 days ago1732188191IN
0xc64783f0...4403183ba
0 ETH0.0006866213.43741485
Batch Withdraw212163782024-11-18 18:24:4735 days ago1731954287IN
0xc64783f0...4403183ba
0 ETH0.0012307724.5268035
Batch Withdraw211568882024-11-10 11:11:5943 days ago1731237119IN
0xc64783f0...4403183ba
0 ETH0.0007092913.87892482
Batch Withdraw211496872024-11-09 11:05:4744 days ago1731150347IN
0xc64783f0...4403183ba
0 ETH0.0008158411.9610918
Batch Withdraw211277972024-11-06 9:44:4747 days ago1730886287IN
0xc64783f0...4403183ba
0 ETH0.0007954315.5577808
Batch Withdraw211269112024-11-06 6:46:2347 days ago1730875583IN
0xc64783f0...4403183ba
0 ETH0.001903437.25007828
Batch Withdraw211232672024-11-05 18:34:1148 days ago1730831651IN
0xc64783f0...4403183ba
0 ETH0.0015004817.17310063
Batch Withdraw211156862024-11-04 17:09:5949 days ago1730740199IN
0xc64783f0...4403183ba
0 ETH0.000503449.84828308
Batch Withdraw211133332024-11-04 9:16:4749 days ago1730711807IN
0xc64783f0...4403183ba
0 ETH0.000227514.45331098
Batch Withdraw211011412024-11-02 16:26:5951 days ago1730564819IN
0xc64783f0...4403183ba
0 ETH0.002097630.75397626
Batch Withdraw210926902024-11-01 12:06:5952 days ago1730462819IN
0xc64783f0...4403183ba
0 ETH0.000306175.9895308
Batch Withdraw210917392024-11-01 8:55:5952 days ago1730451359IN
0xc64783f0...4403183ba
0 ETH0.00034896.82708142
Batch Withdraw210826062024-10-31 2:22:3554 days ago1730341355IN
0xc64783f0...4403183ba
0 ETH0.000485529.5
Batch Withdraw210767062024-10-30 6:35:3554 days ago1730270135IN
0xc64783f0...4403183ba
0 ETH0.0007096613.88930514
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
213819692024-12-11 21:32:5912 days ago1733952779
0xc64783f0...4403183ba
7.61758838 ETH
213682652024-12-09 23:35:1114 days ago1733787311
0xc64783f0...4403183ba
4.25027869 ETH
213390452024-12-05 21:41:2318 days ago1733434883
0xc64783f0...4403183ba
2.4938224 ETH
213229842024-12-03 15:50:5920 days ago1733241059
0xc64783f0...4403183ba
1.2728823 ETH
212929772024-11-29 11:12:4724 days ago1732878767
0xc64783f0...4403183ba
15.0999648 ETH
212706512024-11-26 8:12:4727 days ago1732608767
0xc64783f0...4403183ba
0.00180136 ETH
212706242024-11-26 8:07:1127 days ago1732608431
0xc64783f0...4403183ba
0.00180102 ETH
212705602024-11-26 7:53:5927 days ago1732607639
0xc64783f0...4403183ba
0.00180784 ETH
212702482024-11-26 6:51:2327 days ago1732603883
0xc64783f0...4403183ba
0.00977901 ETH
212696942024-11-26 4:59:5927 days ago1732597199
0xc64783f0...4403183ba
0.00365266 ETH
212684212024-11-26 0:43:5928 days ago1732581839
0xc64783f0...4403183ba
0.31620774 ETH
212567272024-11-24 9:31:4729 days ago1732440707
0xc64783f0...4403183ba
22.29291527 ETH
212398572024-11-22 1:02:1132 days ago1732237331
0xc64783f0...4403183ba
0.00124783 ETH
212357782024-11-21 11:23:1132 days ago1732188191
0xc64783f0...4403183ba
0.49006147 ETH
212163782024-11-18 18:24:4735 days ago1731954287
0xc64783f0...4403183ba
12.23588466 ETH
211784102024-11-13 11:15:3540 days ago1731496535
0xc64783f0...4403183ba
5.46070436 ETH
211765012024-11-13 4:52:4741 days ago1731473567
0xc64783f0...4403183ba
17.3740562 ETH
211568882024-11-10 11:11:5943 days ago1731237119
0xc64783f0...4403183ba
0.04478067 ETH
211496872024-11-09 11:05:4744 days ago1731150347
0xc64783f0...4403183ba
9.07215023 ETH
211300702024-11-06 17:22:1147 days ago1730913731
0xc64783f0...4403183ba
15.73206968 ETH
211277972024-11-06 9:44:4747 days ago1730886287
0xc64783f0...4403183ba
3.2400635 ETH
211269112024-11-06 6:46:2347 days ago1730875583
0xc64783f0...4403183ba
7.63142286 ETH
211232672024-11-05 18:34:1148 days ago1730831651
0xc64783f0...4403183ba
0.35116131 ETH
211156862024-11-04 17:09:5949 days ago1730740199
0xc64783f0...4403183ba
19.92061284 ETH
211133332024-11-04 9:16:4749 days ago1730711807
0xc64783f0...4403183ba
7.28676637 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Vault

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
paris EvmVersion, GNU GPLv3 license
File 1 of 6 : Vault.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity 0.8.18;

import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "./OctantBase.sol";

import {CommonErrors, VaultErrors} from "./Errors.sol";

/**
 * @title Vault
 * @dev This contract allows for claiming the rewards from Octant.
 */
contract Vault is OctantBase, ReentrancyGuard {
    event EmergencyWithdrawn(address user, uint256 amount);
    event Withdrawn(address user, uint256 amount, uint256 epoch);
    event MerkleRootSet(uint256 epoch, bytes32 root);

    struct WithdrawPayload {
        // @notice The epoch number
        uint256 epoch;
        // @notice The amount to withdraw
        uint256 amount;
        // @notice The Merkle proof for the rewards
        bytes32[] proof;
    }

    /// @notice epoch => merkle root of the merkle tree containing users and proposals rewards
    mapping(uint256 => bytes32) public merkleRoots;

    /// @notice user or proposal address => last epoch that rewards were claimed from
    mapping(address => uint256) public lastClaimedEpoch;

    constructor(address _auth) OctantBase(_auth) {}

    /**
     * @notice Sets the Merkle root for the given epoch.
     * @param epoch The epoch number.
     * @param root The Merkle root.
     */
    function setMerkleRoot(uint256 epoch, bytes32 root) external onlyMultisig {
        require(root != bytes32(0), VaultErrors.INVALID_MERKLE_ROOT);

        require(
            merkleRoots[epoch] == bytes32(0),
            VaultErrors.MERKLE_ROOT_ALREADY_SET
        );
        merkleRoots[epoch] = root;

        emit MerkleRootSet(epoch, root);
    }

    /**
     * @notice Allows a user to claim their rewards for multiple epochs.
     * Payloads must be put in epochs order and it's only possible to withdraw from epochs higher
     * than the lastClaimedEpoch.
     * @param payloads An array of WithdrawPayload structs.
     */
    function batchWithdraw(WithdrawPayload[] calldata payloads) external nonReentrant {
        require(payloads.length > 0, VaultErrors.EMPTY_PAYLOADS);

        uint256 amount = 0;
        uint256 claimedEpoch = lastClaimedEpoch[msg.sender];

        for (uint256 i = 0; i < payloads.length; i++) {
            require(
                payloads[i].epoch > claimedEpoch,
                VaultErrors.ALREADY_CLAIMED
            );
            bytes32 leaf = keccak256(
                bytes.concat(
                    keccak256(abi.encode(msg.sender, payloads[i].amount))
                )
            );
            bytes32 root = merkleRoots[payloads[i].epoch];
            require(
                verify(payloads[i].proof, root, leaf),
                VaultErrors.INVALID_MERKLE_PROOF
            );

            claimedEpoch = payloads[i].epoch;
            amount += payloads[i].amount;
        }
        lastClaimedEpoch[msg.sender] = claimedEpoch;
        emit Withdrawn(msg.sender, amount, claimedEpoch);

        (bool success, ) = payable(msg.sender).call{value: amount}("");
        require(success, CommonErrors.FAILED_TO_SEND);
    }

    /**
     * @dev Allows the multisig to withdraw a specified amount in case of an emergency.
     * @param amount The amount to withdraw.
     */
    function emergencyWithdraw(uint256 amount) external onlyMultisig {
        address multisig = super.getMultisig();
        (bool success, ) = payable(msg.sender).call{value: amount}("");
        require(success, CommonErrors.FAILED_TO_SEND);

        emit EmergencyWithdrawn(multisig, amount);
    }

    /**
     * @dev Verifies the Merkle proof for the given leaf and root.
     * @param proof The Merkle proof.
     * @param root The Merkle root.
     * @param leaf The leaf node.
     * @return A boolean value indicating whether the proof is valid.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) public pure returns (bool) {
        return MerkleProof.verify(proof, root, leaf);
    }

    receive() external payable {
        /* do not add any code here, it will get reverted because of tiny gas stipend */
    }
}

File 2 of 6 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 3 of 6 : MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 * OpenZeppelin's JavaScript library generates merkle trees that are safe
 * against this attack out of the box.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

File 4 of 6 : Auth.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity 0.8.18;

import {CommonErrors} from "./Errors.sol";

/// @title Auth
contract Auth {
    /// @dev Emitted when the Golem Foundation multisig address is set.
    /// @param oldValue The old Golem Foundation multisig address.
    /// @param newValue The new Golem Foundation multisig address.
    event MultisigSet(address oldValue, address newValue);

    /// @dev Emitted when ownership transfer is initiated.
    /// @param previousOwner Old multisig, one that initiated the process.
    /// @param newOwner New multisig, one that should finalize the process.
    event OwnershipTransferStarted(
        address indexed previousOwner,
        address indexed newOwner
    );

    /// @dev The multisig address.
    address public multisig;

    /// @dev Pending multisig address.
    address public pendingOwner;

    /// @param _multisig The initial Golem Foundation multisig address.
    constructor(address _multisig) {
        require(_multisig != address(0), CommonErrors.INVALID_ARGUMENT);
        multisig = _multisig;
        emit MultisigSet(address(0), multisig);
    }

    /**
     * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) external {
        require(newOwner != address(0));
        require(msg.sender == multisig, CommonErrors.UNAUTHORIZED_CALLER);
        pendingOwner = newOwner;
        emit OwnershipTransferStarted(multisig, newOwner);
    }

    /**
     * @dev The new owner accepts the ownership transfer.
     */
    function acceptOwnership() external {
        require(msg.sender == pendingOwner, CommonErrors.UNAUTHORIZED_CALLER);
        emit MultisigSet(multisig, pendingOwner);
        multisig = pendingOwner;
        pendingOwner = address(0);
    }
}

File 5 of 6 : Errors.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity 0.8.18;

library DepositsErrors {
    /// @notice Thrown when transfer operation fails in GLM smart contract.
    /// @return HN:Deposits/cannot-transfer-from-sender
    string public constant GLM_TRANSFER_FAILED =
        "HN:Deposits/cannot-transfer-from-sender";

    /// @notice Thrown when trying to withdraw more GLMs than are in deposit.
    /// @return HN:Deposits/deposit-is-smaller
    string public constant DEPOSIT_IS_TO_SMALL =
        "HN:Deposits/deposit-is-smaller";
}

library EpochsErrors {
    /// @notice Thrown when calling the contract before the first epoch started.
    /// @return HN:Epochs/not-started-yet
    string public constant NOT_STARTED = "HN:Epochs/not-started-yet";

    /// @notice Thrown when getFinalizedEpoch function is called before any epoch has been finalized.
    /// @return HN:Epochs/not-finalized
    string public constant NOT_FINALIZED = "HN:Epochs/not-finalized";

    /// @notice Thrown when getPendingEpoch function is called during closed decision window.
    /// @return HN:Epochs/not-pending
    string public constant NOT_PENDING = "HN:Epochs/not-pending";

    /// @notice Thrown when updating epoch props to invalid values (decision window bigger than epoch duration.
    /// @return HN:Epochs/decision-window-bigger-than-duration
    string public constant DECISION_WINDOW_TOO_BIG =
        "HN:Epochs/decision-window-bigger-than-duration";
}

library ProposalsErrors {
    /// @notice Thrown when trying to change proposals that could already have been voted upon.
    /// @return HN:Proposals/only-future-proposals-changing-is-allowed
    string public constant CHANGING_PROPOSALS_IN_THE_PAST =
        "HN:Proposals/only-future-proposals-changing-is-allowed";

    /// @notice Thrown when setting epochs multiple times.
    /// @return HN:Proposals/cannot-set-epochs-twice
    string public constant CANNOT_SET_EPOCHS_TWICE =
        "HN:Proposals/cannot-set-epochs-twice";

    /// @notice Thrown when setting proposal with zero address.
    /// @return HN:Proposals/invalid-proposal
    string public constant INVALID_PROPOSAL = "HN:Proposals/invalid-proposal";
}

library VaultErrors {
    /// @notice Thrown when trying to set merkle root for an epoch multiple times.
    /// @return HN:Vault/merkle-root-already-set
    string public constant MERKLE_ROOT_ALREADY_SET =
        "HN:Vault/merkle-root-already-set";

    /// @notice Thrown when trying to set invalid merkle root.
    /// @return HN:Vault/invalid-merkle-root
    string public constant INVALID_MERKLE_ROOT = "HN:Vault/invalid-merkle-root";

    /// @notice Thrown when trying to withdraw without providing valid merkle proof.
    /// @return HN:Vault/invalid-merkle-proof
    string public constant INVALID_MERKLE_PROOF =
        "HN:Vault/invalid-merkle-proof";

    /// @notice Thrown when trying to withdraw multiple times.
    /// @return HN:Vault/already-claimed
    string public constant ALREADY_CLAIMED = "HN:Vault/already-claimed";

    /// @notice Thrown when trying to send empty payload list.
    /// @return HN:Vault/empty-payloads
    string public constant EMPTY_PAYLOADS = "HN:Vault/empty-payloads";
}

library CommonErrors {
    /// @notice Thrown when trying to call as an unauthorized account.
    /// @return HN:Common/unauthorized-caller
    string public constant UNAUTHORIZED_CALLER =
        "HN:Common/unauthorized-caller";

    /// @notice Thrown when failed to send eth.
    /// @return HN:Common/failed-to-send
    string public constant FAILED_TO_SEND = "HN:Common/failed-to-send";

    /// @notice Thrown when invalid argument provided.
    /// @return HN:Common/invalid-argument
    string public constant INVALID_ARGUMENT = "HN:Common/invalid-argument";
}

File 6 of 6 : OctantBase.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity 0.8.18;

import {CommonErrors} from "./Errors.sol";
import "./Auth.sol";

/// @title OctantBase
/// @dev This is the base contract for all Octant contracts that have functions with access restricted
/// to deployer or the Golem Foundation multisig.
/// It provides functionality for setting and accessing the Golem Foundation multisig address.
abstract contract OctantBase {
    /// @dev The Auth contract instance
    Auth public immutable auth;

    /// @param _auth the contract containing Octant authorities.
    constructor(address _auth) {
        require(_auth != address(0), CommonErrors.INVALID_ARGUMENT);
        auth = Auth(_auth);
    }

    /// @dev Gets the Golem Foundation multisig address.
    function getMultisig() internal view returns (address) {
        return auth.multisig();
    }

    /// @dev Modifier that allows only the Golem Foundation multisig address to call a function.
    modifier onlyMultisig() {
        require(
            msg.sender == auth.multisig(),
            CommonErrors.UNAUTHORIZED_CALLER
        );
        _;
    }
}

Settings
{
  "evmVersion": "paris",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs",
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "remappings": [],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_auth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"MerkleRootSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"auth","outputs":[{"internalType":"contract Auth","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"internalType":"struct Vault.WithdrawPayload[]","name":"payloads","type":"tuple[]"}],"name":"batchWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastClaimedEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"merkleRoots","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes32","name":"root","type":"bytes32"},{"internalType":"bytes32","name":"leaf","type":"bytes32"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040523480156200001157600080fd5b50604051620019ad380380620019ad833981810160405281019062000037919062000192565b80600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280601a81526020017f484e3a436f6d6d6f6e2f696e76616c69642d617267756d656e7400000000000081525090620000e3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000da91906200025e565b60405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505060016000819055505062000282565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200015a826200012d565b9050919050565b6200016c816200014d565b81146200017857600080fd5b50565b6000815190506200018c8162000161565b92915050565b600060208284031215620001ab57620001aa62000128565b5b6000620001bb848285016200017b565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101562000200578082015181840152602081019050620001e3565b60008484015250505050565b6000601f19601f8301169050919050565b60006200022a82620001c4565b620002368185620001cf565b935062000248818560208601620001e0565b62000253816200020c565b840191505092915050565b600060208201905081810360008301526200027a81846200021d565b905092915050565b6080516116fa620002b3600039600081816101df0152818161047901528181610c230152610c6101526116fa6000f3fe6080604052600436106100745760003560e01c806371c5ecb11161004e57806371c5ecb11461010f578063d3ed47de1461014c578063de9375f214610175578063f41c33e9146101a05761007b565b806318712c21146100805780635312ea8e146100a95780635a9a49c7146100d25761007b565b3661007b57005b600080fd5b34801561008c57600080fd5b506100a760048036038101906100a29190610e7b565b6101dd565b005b3480156100b557600080fd5b506100d060048036038101906100cb9190610ebb565b610477565b005b3480156100de57600080fd5b506100f960048036038101906100f49190611041565b6106db565b60405161010691906110cb565b60405180910390f35b34801561011b57600080fd5b5061013660048036038101906101319190610ebb565b6106f1565b60405161014391906110f5565b60405180910390f35b34801561015857600080fd5b50610173600480360381019061016e919061116b565b610709565b005b34801561018157600080fd5b5061018a610c21565b6040516101979190611237565b60405180910390f35b3480156101ac57600080fd5b506101c760048036038101906101c29190611290565b610c45565b6040516101d491906112cc565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634783c35b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610248573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061026c91906112fc565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280601d81526020017f484e3a436f6d6d6f6e2f756e617574686f72697a65642d63616c6c657200000081525090610311576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161030891906113a8565b60405180910390fd5b506000801b8114156040518060400160405280601c81526020017f484e3a5661756c742f696e76616c69642d6d65726b6c652d726f6f740000000081525090610390576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161038791906113a8565b60405180910390fd5b506000801b6001600084815260200190815260200160002054146040518060400160405280602081526020017f484e3a5661756c742f6d65726b6c652d726f6f742d616c72656164792d73657481525090610421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161041891906113a8565b60405180910390fd5b508060016000848152602001908152602001600020819055507fb04b7d6145a7588fdcf339a22877d5965f861c171204fc37688058c5f6c06d3b828260405161046b9291906113ca565b60405180910390a15050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634783c35b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061050691906112fc565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280601d81526020017f484e3a436f6d6d6f6e2f756e617574686f72697a65642d63616c6c6572000000815250906105ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a291906113a8565b60405180910390fd5b5060006105b6610c5d565b905060003373ffffffffffffffffffffffffffffffffffffffff16836040516105de90611424565b60006040518083038185875af1925050503d806000811461061b576040519150601f19603f3d011682016040523d82523d6000602084013e610620565b606091505b50509050806040518060400160405280601881526020017f484e3a436f6d6d6f6e2f6661696c65642d746f2d73656e6400000000000000008152509061069c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069391906113a8565b60405180910390fd5b507f2e39961a70a10f4d46383948095ac2752b3ee642a7c76aa827410aaff08c2e5182846040516106ce929190611448565b60405180910390a1505050565b60006106e8848484610cf3565b90509392505050565b60016020528060005260406000206000915090505481565b610711610d0a565b600082829050116040518060400160405280601781526020017f484e3a5661756c742f656d7074792d7061796c6f6164730000000000000000008152509061078f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078691906113a8565b60405180910390fd5b50600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060005b84849050811015610aad57818585838181106107f7576107f6611471565b5b905060200281019061080991906114af565b60000135116040518060400160405280601881526020017f484e3a5661756c742f616c72656164792d636c61696d6564000000000000000081525090610885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087c91906113a8565b60405180910390fd5b5060003386868481811061089c5761089b611471565b5b90506020028101906108ae91906114af565b602001356040516020016108c3929190611448565b604051602081830303815290604052805190602001206040516020016108e991906114f8565b60405160208183030381529060405280519060200120905060006001600088888681811061091a57610919611471565b5b905060200281019061092c91906114af565b6000013581526020019081526020016000205490506109bf87878581811061095757610956611471565b5b905060200281019061096991906114af565b80604001906109789190611513565b80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505082846106db565b6040518060400160405280601d81526020017f484e3a5661756c742f696e76616c69642d6d65726b6c652d70726f6f6600000081525090610a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2d91906113a8565b60405180910390fd5b50868684818110610a4a57610a49611471565b5b9050602002810190610a5c91906114af565b600001359350868684818110610a7557610a74611471565b5b9050602002810190610a8791906114af565b6020013585610a9691906115a5565b945050508080610aa5906115d9565b9150506107d8565b5080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f92ccf450a286a957af52509bc1c9939d1a6a481783e142e41e2499f0bb66ebc6338383604051610b2593929190611621565b60405180910390a160003373ffffffffffffffffffffffffffffffffffffffff1683604051610b5390611424565b60006040518083038185875af1925050503d8060008114610b90576040519150601f19603f3d011682016040523d82523d6000602084013e610b95565b606091505b50509050806040518060400160405280601881526020017f484e3a436f6d6d6f6e2f6661696c65642d746f2d73656e64000000000000000081525090610c11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0891906113a8565b60405180910390fd5b50505050610c1d610d59565b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60026020528060005260406000206000915090505481565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634783c35b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cee91906112fc565b905090565b600082610d008584610d63565b1490509392505050565b600260005403610d4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d46906116a4565b60405180910390fd5b6002600081905550565b6001600081905550565b60008082905060005b8451811015610dae57610d9982868381518110610d8c57610d8b611471565b5b6020026020010151610db9565b91508080610da6906115d9565b915050610d6c565b508091505092915050565b6000818310610dd157610dcc8284610de4565b610ddc565b610ddb8383610de4565b5b905092915050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b610e2281610e0f565b8114610e2d57600080fd5b50565b600081359050610e3f81610e19565b92915050565b6000819050919050565b610e5881610e45565b8114610e6357600080fd5b50565b600081359050610e7581610e4f565b92915050565b60008060408385031215610e9257610e91610e05565b5b6000610ea085828601610e30565b9250506020610eb185828601610e66565b9150509250929050565b600060208284031215610ed157610ed0610e05565b5b6000610edf84828501610e30565b91505092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610f3682610eed565b810181811067ffffffffffffffff82111715610f5557610f54610efe565b5b80604052505050565b6000610f68610dfb565b9050610f748282610f2d565b919050565b600067ffffffffffffffff821115610f9457610f93610efe565b5b602082029050602081019050919050565b600080fd5b6000610fbd610fb884610f79565b610f5e565b90508083825260208201905060208402830185811115610fe057610fdf610fa5565b5b835b818110156110095780610ff58882610e66565b845260208401935050602081019050610fe2565b5050509392505050565b600082601f83011261102857611027610ee8565b5b8135611038848260208601610faa565b91505092915050565b60008060006060848603121561105a57611059610e05565b5b600084013567ffffffffffffffff81111561107857611077610e0a565b5b61108486828701611013565b935050602061109586828701610e66565b92505060406110a686828701610e66565b9150509250925092565b60008115159050919050565b6110c5816110b0565b82525050565b60006020820190506110e060008301846110bc565b92915050565b6110ef81610e45565b82525050565b600060208201905061110a60008301846110e6565b92915050565b600080fd5b60008083601f84011261112b5761112a610ee8565b5b8235905067ffffffffffffffff81111561114857611147611110565b5b60208301915083602082028301111561116457611163610fa5565b5b9250929050565b6000806020838503121561118257611181610e05565b5b600083013567ffffffffffffffff8111156111a05761119f610e0a565b5b6111ac85828601611115565b92509250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006111fd6111f86111f3846111b8565b6111d8565b6111b8565b9050919050565b600061120f826111e2565b9050919050565b600061122182611204565b9050919050565b61123181611216565b82525050565b600060208201905061124c6000830184611228565b92915050565b600061125d826111b8565b9050919050565b61126d81611252565b811461127857600080fd5b50565b60008135905061128a81611264565b92915050565b6000602082840312156112a6576112a5610e05565b5b60006112b48482850161127b565b91505092915050565b6112c681610e0f565b82525050565b60006020820190506112e160008301846112bd565b92915050565b6000815190506112f681611264565b92915050565b60006020828403121561131257611311610e05565b5b6000611320848285016112e7565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611363578082015181840152602081019050611348565b60008484015250505050565b600061137a82611329565b6113848185611334565b9350611394818560208601611345565b61139d81610eed565b840191505092915050565b600060208201905081810360008301526113c2818461136f565b905092915050565b60006040820190506113df60008301856112bd565b6113ec60208301846110e6565b9392505050565b600081905092915050565b50565b600061140e6000836113f3565b9150611419826113fe565b600082019050919050565b600061142f82611401565b9150819050919050565b61144281611252565b82525050565b600060408201905061145d6000830185611439565b61146a60208301846112bd565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b6000823560016060038336030381126114cb576114ca6114a0565b5b80830191505092915050565b6000819050919050565b6114f26114ed82610e45565b6114d7565b82525050565b600061150482846114e1565b60208201915081905092915050565b600080833560016020038436030381126115305761152f6114a0565b5b80840192508235915067ffffffffffffffff821115611552576115516114a5565b5b60208301925060208202360383131561156e5761156d6114aa565b5b509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006115b082610e0f565b91506115bb83610e0f565b92508282019050808211156115d3576115d2611576565b5b92915050565b60006115e482610e0f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361161657611615611576565b5b600182019050919050565b60006060820190506116366000830186611439565b61164360208301856112bd565b61165060408301846112bd565b949350505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061168e601f83611334565b915061169982611658565b602082019050919050565b600060208201905081810360008301526116bd81611681565b905091905056fea26469706673582212206c0f636cc662cca287458ba003163a194312335ff0ad4ed3afbec94a8f66e51f64736f6c63430008120033000000000000000000000000287493f76b8a1833e9e0bf2de0d972fb16c6c8ae

Deployed Bytecode

0x6080604052600436106100745760003560e01c806371c5ecb11161004e57806371c5ecb11461010f578063d3ed47de1461014c578063de9375f214610175578063f41c33e9146101a05761007b565b806318712c21146100805780635312ea8e146100a95780635a9a49c7146100d25761007b565b3661007b57005b600080fd5b34801561008c57600080fd5b506100a760048036038101906100a29190610e7b565b6101dd565b005b3480156100b557600080fd5b506100d060048036038101906100cb9190610ebb565b610477565b005b3480156100de57600080fd5b506100f960048036038101906100f49190611041565b6106db565b60405161010691906110cb565b60405180910390f35b34801561011b57600080fd5b5061013660048036038101906101319190610ebb565b6106f1565b60405161014391906110f5565b60405180910390f35b34801561015857600080fd5b50610173600480360381019061016e919061116b565b610709565b005b34801561018157600080fd5b5061018a610c21565b6040516101979190611237565b60405180910390f35b3480156101ac57600080fd5b506101c760048036038101906101c29190611290565b610c45565b6040516101d491906112cc565b60405180910390f35b7f000000000000000000000000287493f76b8a1833e9e0bf2de0d972fb16c6c8ae73ffffffffffffffffffffffffffffffffffffffff16634783c35b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610248573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061026c91906112fc565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280601d81526020017f484e3a436f6d6d6f6e2f756e617574686f72697a65642d63616c6c657200000081525090610311576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161030891906113a8565b60405180910390fd5b506000801b8114156040518060400160405280601c81526020017f484e3a5661756c742f696e76616c69642d6d65726b6c652d726f6f740000000081525090610390576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161038791906113a8565b60405180910390fd5b506000801b6001600084815260200190815260200160002054146040518060400160405280602081526020017f484e3a5661756c742f6d65726b6c652d726f6f742d616c72656164792d73657481525090610421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161041891906113a8565b60405180910390fd5b508060016000848152602001908152602001600020819055507fb04b7d6145a7588fdcf339a22877d5965f861c171204fc37688058c5f6c06d3b828260405161046b9291906113ca565b60405180910390a15050565b7f000000000000000000000000287493f76b8a1833e9e0bf2de0d972fb16c6c8ae73ffffffffffffffffffffffffffffffffffffffff16634783c35b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061050691906112fc565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280601d81526020017f484e3a436f6d6d6f6e2f756e617574686f72697a65642d63616c6c6572000000815250906105ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a291906113a8565b60405180910390fd5b5060006105b6610c5d565b905060003373ffffffffffffffffffffffffffffffffffffffff16836040516105de90611424565b60006040518083038185875af1925050503d806000811461061b576040519150601f19603f3d011682016040523d82523d6000602084013e610620565b606091505b50509050806040518060400160405280601881526020017f484e3a436f6d6d6f6e2f6661696c65642d746f2d73656e6400000000000000008152509061069c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069391906113a8565b60405180910390fd5b507f2e39961a70a10f4d46383948095ac2752b3ee642a7c76aa827410aaff08c2e5182846040516106ce929190611448565b60405180910390a1505050565b60006106e8848484610cf3565b90509392505050565b60016020528060005260406000206000915090505481565b610711610d0a565b600082829050116040518060400160405280601781526020017f484e3a5661756c742f656d7074792d7061796c6f6164730000000000000000008152509061078f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078691906113a8565b60405180910390fd5b50600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060005b84849050811015610aad57818585838181106107f7576107f6611471565b5b905060200281019061080991906114af565b60000135116040518060400160405280601881526020017f484e3a5661756c742f616c72656164792d636c61696d6564000000000000000081525090610885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087c91906113a8565b60405180910390fd5b5060003386868481811061089c5761089b611471565b5b90506020028101906108ae91906114af565b602001356040516020016108c3929190611448565b604051602081830303815290604052805190602001206040516020016108e991906114f8565b60405160208183030381529060405280519060200120905060006001600088888681811061091a57610919611471565b5b905060200281019061092c91906114af565b6000013581526020019081526020016000205490506109bf87878581811061095757610956611471565b5b905060200281019061096991906114af565b80604001906109789190611513565b80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505082846106db565b6040518060400160405280601d81526020017f484e3a5661756c742f696e76616c69642d6d65726b6c652d70726f6f6600000081525090610a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2d91906113a8565b60405180910390fd5b50868684818110610a4a57610a49611471565b5b9050602002810190610a5c91906114af565b600001359350868684818110610a7557610a74611471565b5b9050602002810190610a8791906114af565b6020013585610a9691906115a5565b945050508080610aa5906115d9565b9150506107d8565b5080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f92ccf450a286a957af52509bc1c9939d1a6a481783e142e41e2499f0bb66ebc6338383604051610b2593929190611621565b60405180910390a160003373ffffffffffffffffffffffffffffffffffffffff1683604051610b5390611424565b60006040518083038185875af1925050503d8060008114610b90576040519150601f19603f3d011682016040523d82523d6000602084013e610b95565b606091505b50509050806040518060400160405280601881526020017f484e3a436f6d6d6f6e2f6661696c65642d746f2d73656e64000000000000000081525090610c11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0891906113a8565b60405180910390fd5b50505050610c1d610d59565b5050565b7f000000000000000000000000287493f76b8a1833e9e0bf2de0d972fb16c6c8ae81565b60026020528060005260406000206000915090505481565b60007f000000000000000000000000287493f76b8a1833e9e0bf2de0d972fb16c6c8ae73ffffffffffffffffffffffffffffffffffffffff16634783c35b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cee91906112fc565b905090565b600082610d008584610d63565b1490509392505050565b600260005403610d4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d46906116a4565b60405180910390fd5b6002600081905550565b6001600081905550565b60008082905060005b8451811015610dae57610d9982868381518110610d8c57610d8b611471565b5b6020026020010151610db9565b91508080610da6906115d9565b915050610d6c565b508091505092915050565b6000818310610dd157610dcc8284610de4565b610ddc565b610ddb8383610de4565b5b905092915050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b610e2281610e0f565b8114610e2d57600080fd5b50565b600081359050610e3f81610e19565b92915050565b6000819050919050565b610e5881610e45565b8114610e6357600080fd5b50565b600081359050610e7581610e4f565b92915050565b60008060408385031215610e9257610e91610e05565b5b6000610ea085828601610e30565b9250506020610eb185828601610e66565b9150509250929050565b600060208284031215610ed157610ed0610e05565b5b6000610edf84828501610e30565b91505092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610f3682610eed565b810181811067ffffffffffffffff82111715610f5557610f54610efe565b5b80604052505050565b6000610f68610dfb565b9050610f748282610f2d565b919050565b600067ffffffffffffffff821115610f9457610f93610efe565b5b602082029050602081019050919050565b600080fd5b6000610fbd610fb884610f79565b610f5e565b90508083825260208201905060208402830185811115610fe057610fdf610fa5565b5b835b818110156110095780610ff58882610e66565b845260208401935050602081019050610fe2565b5050509392505050565b600082601f83011261102857611027610ee8565b5b8135611038848260208601610faa565b91505092915050565b60008060006060848603121561105a57611059610e05565b5b600084013567ffffffffffffffff81111561107857611077610e0a565b5b61108486828701611013565b935050602061109586828701610e66565b92505060406110a686828701610e66565b9150509250925092565b60008115159050919050565b6110c5816110b0565b82525050565b60006020820190506110e060008301846110bc565b92915050565b6110ef81610e45565b82525050565b600060208201905061110a60008301846110e6565b92915050565b600080fd5b60008083601f84011261112b5761112a610ee8565b5b8235905067ffffffffffffffff81111561114857611147611110565b5b60208301915083602082028301111561116457611163610fa5565b5b9250929050565b6000806020838503121561118257611181610e05565b5b600083013567ffffffffffffffff8111156111a05761119f610e0a565b5b6111ac85828601611115565b92509250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006111fd6111f86111f3846111b8565b6111d8565b6111b8565b9050919050565b600061120f826111e2565b9050919050565b600061122182611204565b9050919050565b61123181611216565b82525050565b600060208201905061124c6000830184611228565b92915050565b600061125d826111b8565b9050919050565b61126d81611252565b811461127857600080fd5b50565b60008135905061128a81611264565b92915050565b6000602082840312156112a6576112a5610e05565b5b60006112b48482850161127b565b91505092915050565b6112c681610e0f565b82525050565b60006020820190506112e160008301846112bd565b92915050565b6000815190506112f681611264565b92915050565b60006020828403121561131257611311610e05565b5b6000611320848285016112e7565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611363578082015181840152602081019050611348565b60008484015250505050565b600061137a82611329565b6113848185611334565b9350611394818560208601611345565b61139d81610eed565b840191505092915050565b600060208201905081810360008301526113c2818461136f565b905092915050565b60006040820190506113df60008301856112bd565b6113ec60208301846110e6565b9392505050565b600081905092915050565b50565b600061140e6000836113f3565b9150611419826113fe565b600082019050919050565b600061142f82611401565b9150819050919050565b61144281611252565b82525050565b600060408201905061145d6000830185611439565b61146a60208301846112bd565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b6000823560016060038336030381126114cb576114ca6114a0565b5b80830191505092915050565b6000819050919050565b6114f26114ed82610e45565b6114d7565b82525050565b600061150482846114e1565b60208201915081905092915050565b600080833560016020038436030381126115305761152f6114a0565b5b80840192508235915067ffffffffffffffff821115611552576115516114a5565b5b60208301925060208202360383131561156e5761156d6114aa565b5b509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006115b082610e0f565b91506115bb83610e0f565b92508282019050808211156115d3576115d2611576565b5b92915050565b60006115e482610e0f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361161657611615611576565b5b600182019050919050565b60006060820190506116366000830186611439565b61164360208301856112bd565b61165060408301846112bd565b949350505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061168e601f83611334565b915061169982611658565b602082019050919050565b600060208201905081810360008301526116bd81611681565b905091905056fea26469706673582212206c0f636cc662cca287458ba003163a194312335ff0ad4ed3afbec94a8f66e51f64736f6c63430008120033

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

000000000000000000000000287493f76b8a1833e9e0bf2de0d972fb16c6c8ae

-----Decoded View---------------
Arg [0] : _auth (address): 0x287493F76b8A1833E9E0BF2dE0D972Fb16C6C8ae

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000287493f76b8a1833e9e0bf2de0d972fb16c6c8ae


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.