ETH Price: $2,702.04 (-2.53%)

Contract

0xc64783f0BE60A81A716535287539a694403183ba
 

Overview

ETH Balance

455.888971316890196395 ETH

Eth Value

$1,231,830.99 (@ $2,702.04/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Batch Withdraw217865852025-02-06 9:32:117 hrs ago1738834331IN
0xc64783f0...4403183ba
0 ETH0.000133861.93589909
Batch Withdraw217601772025-02-02 17:00:353 days ago1738515635IN
0xc64783f0...4403183ba
0 ETH0.0010451415.1134771
Batch Withdraw217558502025-02-02 2:28:114 days ago1738463291IN
0xc64783f0...4403183ba
0 ETH0.000105232.06182848
Batch Withdraw217540452025-02-01 20:25:474 days ago1738441547IN
0xc64783f0...4403183ba
0 ETH0.00037057.24796012
Batch Withdraw217500302025-02-01 6:58:475 days ago1738393127IN
0xc64783f0...4403183ba
0 ETH0.000276612.12261442
Batch Withdraw217464502025-01-31 18:58:595 days ago1738349939IN
0xc64783f0...4403183ba
0 ETH0.000851958.08562429
Batch Withdraw217449672025-01-31 14:00:356 days ago1738332035IN
0xc64783f0...4403183ba
0 ETH0.00031236.11718874
Batch Withdraw217420512025-01-31 4:12:596 days ago1738296779IN
0xc64783f0...4403183ba
0 ETH0.00008151.59504956
Batch Withdraw217416132025-01-31 2:44:476 days ago1738291487IN
0xc64783f0...4403183ba
0 ETH0.000089721.31530328
Batch Withdraw217382252025-01-30 15:23:357 days ago1738250615IN
0xc64783f0...4403183ba
0 ETH0.000454488.73119213
Batch Withdraw217372622025-01-30 12:10:237 days ago1738239023IN
0xc64783f0...4403183ba
0 ETH0.000142722.24681683
Batch Withdraw217312612025-01-29 16:04:358 days ago1738166675IN
0xc64783f0...4403183ba
0 ETH0.000439146.91930255
Batch Withdraw217287632025-01-29 7:42:118 days ago1738136531IN
0xc64783f0...4403183ba
0 ETH0.000175322.57266346
Batch Withdraw217287152025-01-29 7:32:358 days ago1738135955IN
0xc64783f0...4403183ba
0 ETH0.000206682.5666732
Batch Withdraw217243002025-01-28 16:45:358 days ago1738082735IN
0xc64783f0...4403183ba
0 ETH0.0005909511.35076912
Batch Withdraw217187962025-01-27 22:18:119 days ago1738016291IN
0xc64783f0...4403183ba
0 ETH0.000523568.24050249
Batch Withdraw217179802025-01-27 19:34:359 days ago1738006475IN
0xc64783f0...4403183ba
0 ETH0.000492849.46814064
Batch Withdraw217169752025-01-27 16:12:3510 days ago1737994355IN
0xc64783f0...4403183ba
0 ETH0.0015123321.8763546
Batch Withdraw217165242025-01-27 14:41:4710 days ago1737988907IN
0xc64783f0...4403183ba
0 ETH0.0011299422.1297672
Batch Withdraw217150952025-01-27 9:54:1110 days ago1737971651IN
0xc64783f0...4403183ba
0 ETH0.000204173.92326451
Batch Withdraw217147212025-01-27 8:39:1110 days ago1737967151IN
0xc64783f0...4403183ba
0 ETH0.000390427.49756489
Batch Withdraw217112312025-01-26 20:59:4710 days ago1737925187IN
0xc64783f0...4403183ba
0 ETH0.000364037.12629931
Batch Withdraw217080432025-01-26 10:17:5911 days ago1737886679IN
0xc64783f0...4403183ba
0 ETH0.000271113.36421877
Batch Withdraw217077692025-01-26 9:22:3511 days ago1737883355IN
0xc64783f0...4403183ba
0 ETH0.000131412.57241891
Batch Withdraw217073542025-01-26 7:58:5911 days ago1737878339IN
0xc64783f0...4403183ba
0 ETH0.000189553.6431801
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
217865852025-02-06 9:32:117 hrs ago1738834331
0xc64783f0...4403183ba
0.03772588 ETH
217857962025-02-06 6:53:599 hrs ago1738824839
0xc64783f0...4403183ba
4.62096393 ETH
217601772025-02-02 17:00:353 days ago1738515635
0xc64783f0...4403183ba
3.35695854 ETH
217558502025-02-02 2:28:114 days ago1738463291
0xc64783f0...4403183ba
1 ETH
217540452025-02-01 20:25:474 days ago1738441547
0xc64783f0...4403183ba
2.28194021 ETH
217500302025-02-01 6:58:475 days ago1738393127
0xc64783f0...4403183ba
23.64744645 ETH
217464502025-01-31 18:58:595 days ago1738349939
0xc64783f0...4403183ba
0.00617013 ETH
217449672025-01-31 14:00:356 days ago1738332035
0xc64783f0...4403183ba
17.07069785 ETH
217420512025-01-31 4:12:596 days ago1738296779
0xc64783f0...4403183ba
0.04414533 ETH
217416132025-01-31 2:44:476 days ago1738291487
0xc64783f0...4403183ba
3.03814076 ETH
217382252025-01-30 15:23:357 days ago1738250615
0xc64783f0...4403183ba
1.27136857 ETH
217372622025-01-30 12:10:237 days ago1738239023
0xc64783f0...4403183ba
9.04508836 ETH
217326272025-01-29 20:38:597 days ago1738183139
0xc64783f0...4403183ba
28.75708504 ETH
217312612025-01-29 16:04:358 days ago1738166675
0xc64783f0...4403183ba
9.5124354 ETH
217307832025-01-29 14:28:358 days ago1738160915
0xc64783f0...4403183ba
2.65620086 ETH
217287632025-01-29 7:42:118 days ago1738136531
0xc64783f0...4403183ba
2.45019442 ETH
217287152025-01-29 7:32:358 days ago1738135955
0xc64783f0...4403183ba
0.00531992 ETH
217243002025-01-28 16:45:358 days ago1738082735
0xc64783f0...4403183ba
0.1887999 ETH
217215132025-01-28 7:24:479 days ago1738049087
0xc64783f0...4403183ba
2.91017121 ETH
217187962025-01-27 22:18:119 days ago1738016291
0xc64783f0...4403183ba
1.06366858 ETH
217179802025-01-27 19:34:359 days ago1738006475
0xc64783f0...4403183ba
0.50853668 ETH
217169752025-01-27 16:12:3510 days ago1737994355
0xc64783f0...4403183ba
3.51566451 ETH
217165242025-01-27 14:41:4710 days ago1737988907
0xc64783f0...4403183ba
0.13957453 ETH
217150952025-01-27 9:54:1110 days ago1737971651
0xc64783f0...4403183ba
4.98211562 ETH
217147212025-01-27 8:39:1110 days ago1737967151
0xc64783f0...4403183ba
12.00287764 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.