ETH Price: $1,957.53 (-0.28%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Unlock245655062026-03-01 22:12:352 hrs ago1772403155IN
Golem: Octant Locked GLM
0 ETH0.000121072.08177183
Unlock245637572026-03-01 16:22:238 hrs ago1772382143IN
Golem: Octant Locked GLM
0 ETH0.000119022.04683342
Unlock245616952026-03-01 9:27:4715 hrs ago1772357267IN
Golem: Octant Locked GLM
0 ETH0.000118112.0303937
Unlock245570222026-02-28 17:48:4731 hrs ago1772300927IN
Golem: Octant Locked GLM
0 ETH0.000002660.04584543
Unlock245562612026-02-28 15:15:2333 hrs ago1772291723IN
Golem: Octant Locked GLM
0 ETH0.000086172.09739032
Unlock245535182026-02-28 6:03:2342 hrs ago1772258603IN
Golem: Octant Locked GLM
0 ETH0.000003150.05430251
Unlock245522882026-02-28 1:56:2346 hrs ago1772243783IN
Golem: Octant Locked GLM
0 ETH0.000118342.03526817
Unlock245520632026-02-28 1:10:3547 hrs ago1772241035IN
Golem: Octant Locked GLM
0 ETH0.000004870.08382135
Unlock245504222026-02-27 19:40:592 days ago1772221259IN
Golem: Octant Locked GLM
0 ETH0.000004070.0699493
Unlock245500492026-02-27 18:26:232 days ago1772216783IN
Golem: Octant Locked GLM
0 ETH0.000122472.10492159
Unlock245497772026-02-27 17:31:472 days ago1772213507IN
Golem: Octant Locked GLM
0 ETH0.00013042.24255781
Unlock245497012026-02-27 17:16:352 days ago1772212595IN
Golem: Octant Locked GLM
0 ETH0.000124172.13499098
Unlock245496712026-02-27 17:10:352 days ago1772212235IN
Golem: Octant Locked GLM
0 ETH0.00012542.15664131
Unlock245496152026-02-27 16:59:232 days ago1772211563IN
Golem: Octant Locked GLM
0 ETH0.000125552.15915172
Unlock245495822026-02-27 16:52:472 days ago1772211167IN
Golem: Octant Locked GLM
0 ETH0.000090892.21174606
Unlock245493692026-02-27 16:10:112 days ago1772208611IN
Golem: Octant Locked GLM
0 ETH0.000056840.97752005
Unlock245491242026-02-27 15:20:472 days ago1772205647IN
Golem: Octant Locked GLM
0 ETH0.000133762.29936622
Unlock245482512026-02-27 12:25:352 days ago1772195135IN
Golem: Octant Locked GLM
0 ETH0.000123282.12008038
Unlock245471482026-02-27 8:43:592 days ago1772181839IN
Golem: Octant Locked GLM
0 ETH0.000118842.04332823
Unlock245440532026-02-26 22:22:473 days ago1772144567IN
Golem: Octant Locked GLM
0 ETH0.000003840.06612257
Unlock245407832026-02-26 11:26:233 days ago1772105183IN
Golem: Octant Locked GLM
0 ETH0.000004380.0754775
Unlock245403042026-02-26 9:50:113 days ago1772099411IN
Golem: Octant Locked GLM
0 ETH0.000017080.2937
Unlock245398302026-02-26 8:15:233 days ago1772093723IN
Golem: Octant Locked GLM
0 ETH0.000119052.04743702
Unlock245393222026-02-26 6:33:233 days ago1772087603IN
Golem: Octant Locked GLM
0 ETH0.000125062.15074682
Unlock245375042026-02-26 0:27:594 days ago1772065679IN
Golem: Octant Locked GLM
0 ETH0.000126962.18340856
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Deposits

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license
// SPDX-License-Identifier: GPL-3.0

pragma solidity 0.8.18;

import "./interfaces/IDeposits.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

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

/// @title Contract tracking GLM deposits for Octant project.
/// @author Golem Foundation
/// @notice GLM can be locked or unlocked at any moment by its owner.
/// To be more capital effective, do lock at the end of an epoch,
/// and unlock at the beginning of an epoch.
/// @dev Please note that complexity of this contract should be kept as low as possible,
/// even at the cost of increased complexity of other contracts. Lets strive to limit
/// risk exposure of GLM deposits.
contract Deposits is OctantBase, IDeposits {
    /// @notice GLM token contract address
    ERC20 public immutable glm;

    event Locked(
        uint256 depositBefore,
        uint256 amount,
        uint256 when,
        address user
    );
    event Unlocked(
        uint256 depositBefore,
        uint256 amount,
        uint256 when,
        address user
    );

    /// @dev deposit amounts per user
    mapping(address => uint256) public deposits;

    /// @param glmAddress Address of Golem Network Token contract (updated, GLM).
    constructor(address glmAddress, address _auth) OctantBase(_auth) {
        require(glmAddress != address(0), CommonErrors.INVALID_ARGUMENT);
        glm = ERC20(glmAddress);
    }

    /// @notice Lock GLM to enable participation in Octant experiment.
    /// This can be done at any time, but it is most capital effective at the end of the epoch.
    /// @param amount Amount of GLM to be locked.
    function lock(uint256 amount) external {
        require(amount != 0, CommonErrors.INVALID_ARGUMENT);

        uint256 oldDeposit = deposits[msg.sender];
        deposits[msg.sender] = oldDeposit + amount;
        require(
            glm.transferFrom(msg.sender, address(this), amount),
            DepositsErrors.GLM_TRANSFER_FAILED
        );
        emit Locked(oldDeposit, amount, block.timestamp, msg.sender);
    }

    /// @notice Unlock GLM. This can be done at any time, but it is most capital effective at the beginning of the epoch.
    /// @param amount Amount of GLM to be unlocked.
    function unlock(uint256 amount) external {
        uint256 oldDeposit = deposits[msg.sender];
        require(oldDeposit >= amount, DepositsErrors.DEPOSIT_IS_TO_SMALL);
        deposits[msg.sender] = oldDeposit - amount;
        require(glm.transfer(msg.sender, amount));
        emit Unlocked(oldDeposit, amount, block.timestamp, msg.sender);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

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

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

// 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);
    }
}

// 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 8 of 9 : 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
        );
        _;
    }
}

// SPDX-License-Identifier: GPL-3.0

pragma solidity 0.8.18;

interface IDeposits {
    /// @notice function deposits() returns user's GLMs locked amount by address
    function deposits(address) external view returns (uint256);
}

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

API
[{"inputs":[{"internalType":"address","name":"glmAddress","type":"address"},{"internalType":"address","name":"_auth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"depositBefore","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"when","type":"uint256"},{"indexed":false,"internalType":"address","name":"user","type":"address"}],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"depositBefore","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"when","type":"uint256"},{"indexed":false,"internalType":"address","name":"user","type":"address"}],"name":"Unlocked","type":"event"},{"inputs":[],"name":"auth","outputs":[{"internalType":"contract Auth","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"deposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"glm","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040523480156200001157600080fd5b5060405162000dd538038062000dd583398181016040528101906200003791906200026b565b80600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280601a81526020017f484e3a436f6d6d6f6e2f696e76616c69642d617267756d656e7400000000000081525090620000e3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000da91906200034c565b60405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280601a81526020017f484e3a436f6d6d6f6e2f696e76616c69642d617267756d656e7400000000000081525090620001c4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001bb91906200034c565b60405180910390fd5b508173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1681525050505062000370565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002338262000206565b9050919050565b620002458162000226565b81146200025157600080fd5b50565b60008151905062000265816200023a565b92915050565b6000806040838503121562000285576200028462000201565b5b6000620002958582860162000254565b9250506020620002a88582860162000254565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015620002ee578082015181840152602081019050620002d1565b60008484015250505050565b6000601f19601f8301169050919050565b60006200031882620002b2565b620003248185620002bd565b935062000336818560208601620002ce565b6200034181620002fa565b840191505092915050565b600060208201905081810360008301526200036881846200030b565b905092915050565b60805160a051610a31620003a46000396000818161020f015281816102f70152610429015260006105650152610a316000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80636198e3391461005c57806386438ebd14610078578063dd46706414610096578063de9375f2146100b2578063fc7e286d146100d0575b600080fd5b610076600480360381019061007191906105da565b610100565b005b6100806102f5565b60405161008d9190610686565b60405180910390f35b6100b060048036038101906100ab91906105da565b610319565b005b6100ba610563565b6040516100c791906106c2565b60405180910390f35b6100ea60048036038101906100e5919061071b565b610587565b6040516100f79190610757565b60405180910390f35b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156040518060400160405280601e81526020017f484e3a4465706f736974732f6465706f7369742d69732d736d616c6c65720000815250906101be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101b59190610802565b60405180910390fd5b5081816101cb9190610853565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401610268929190610896565b6020604051808303816000875af1158015610287573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ab91906108f7565b6102b457600080fd5b7fc866d6212c58a2480a6da14f1bdbaae0c127cdc8296409157a23b968149066ce818342336040516102e99493929190610924565b60405180910390a15050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008114156040518060400160405280601a81526020017f484e3a436f6d6d6f6e2f696e76616c69642d617267756d656e7400000000000081525090610395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161038c9190610802565b60405180910390fd5b5060008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081816103e59190610969565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b81526004016104849392919061099d565b6020604051808303816000875af11580156104a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104c791906108f7565b6040518060600160405280602781526020016109d56027913990610521576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105189190610802565b60405180910390fd5b507f4c00281b0bce21cd7064204e92146d972c359c3743b9a503f438b4325efaaf14818342336040516105579493929190610924565b60405180910390a15050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006020528060005260406000206000915090505481565b600080fd5b6000819050919050565b6105b7816105a4565b81146105c257600080fd5b50565b6000813590506105d4816105ae565b92915050565b6000602082840312156105f0576105ef61059f565b5b60006105fe848285016105c5565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061064c61064761064284610607565b610627565b610607565b9050919050565b600061065e82610631565b9050919050565b600061067082610653565b9050919050565b61068081610665565b82525050565b600060208201905061069b6000830184610677565b92915050565b60006106ac82610653565b9050919050565b6106bc816106a1565b82525050565b60006020820190506106d760008301846106b3565b92915050565b60006106e882610607565b9050919050565b6106f8816106dd565b811461070357600080fd5b50565b600081359050610715816106ef565b92915050565b6000602082840312156107315761073061059f565b5b600061073f84828501610706565b91505092915050565b610751816105a4565b82525050565b600060208201905061076c6000830184610748565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156107ac578082015181840152602081019050610791565b60008484015250505050565b6000601f19601f8301169050919050565b60006107d482610772565b6107de818561077d565b93506107ee81856020860161078e565b6107f7816107b8565b840191505092915050565b6000602082019050818103600083015261081c81846107c9565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061085e826105a4565b9150610869836105a4565b925082820390508181111561088157610880610824565b5b92915050565b610890816106dd565b82525050565b60006040820190506108ab6000830185610887565b6108b86020830184610748565b9392505050565b60008115159050919050565b6108d4816108bf565b81146108df57600080fd5b50565b6000815190506108f1816108cb565b92915050565b60006020828403121561090d5761090c61059f565b5b600061091b848285016108e2565b91505092915050565b60006080820190506109396000830187610748565b6109466020830186610748565b6109536040830185610748565b6109606060830184610887565b95945050505050565b6000610974826105a4565b915061097f836105a4565b925082820190508082111561099757610996610824565b5b92915050565b60006060820190506109b26000830186610887565b6109bf6020830185610887565b6109cc6040830184610748565b94935050505056fe484e3a4465706f736974732f63616e6e6f742d7472616e736665722d66726f6d2d73656e646572a26469706673582212202bd2555dc0dd1913e47b74fb7806f4e89335d69041c89052ce7b0d4018ae74e264736f6c634300081200330000000000000000000000007dd9c5cba05e151c895fde1cf355c9a1d5da6429000000000000000000000000287493f76b8a1833e9e0bf2de0d972fb16c6c8ae

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100575760003560e01c80636198e3391461005c57806386438ebd14610078578063dd46706414610096578063de9375f2146100b2578063fc7e286d146100d0575b600080fd5b610076600480360381019061007191906105da565b610100565b005b6100806102f5565b60405161008d9190610686565b60405180910390f35b6100b060048036038101906100ab91906105da565b610319565b005b6100ba610563565b6040516100c791906106c2565b60405180910390f35b6100ea60048036038101906100e5919061071b565b610587565b6040516100f79190610757565b60405180910390f35b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156040518060400160405280601e81526020017f484e3a4465706f736974732f6465706f7369742d69732d736d616c6c65720000815250906101be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101b59190610802565b60405180910390fd5b5081816101cb9190610853565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f0000000000000000000000007dd9c5cba05e151c895fde1cf355c9a1d5da642973ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401610268929190610896565b6020604051808303816000875af1158015610287573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ab91906108f7565b6102b457600080fd5b7fc866d6212c58a2480a6da14f1bdbaae0c127cdc8296409157a23b968149066ce818342336040516102e99493929190610924565b60405180910390a15050565b7f0000000000000000000000007dd9c5cba05e151c895fde1cf355c9a1d5da642981565b60008114156040518060400160405280601a81526020017f484e3a436f6d6d6f6e2f696e76616c69642d617267756d656e7400000000000081525090610395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161038c9190610802565b60405180910390fd5b5060008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081816103e59190610969565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f0000000000000000000000007dd9c5cba05e151c895fde1cf355c9a1d5da642973ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b81526004016104849392919061099d565b6020604051808303816000875af11580156104a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104c791906108f7565b6040518060600160405280602781526020016109d56027913990610521576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105189190610802565b60405180910390fd5b507f4c00281b0bce21cd7064204e92146d972c359c3743b9a503f438b4325efaaf14818342336040516105579493929190610924565b60405180910390a15050565b7f000000000000000000000000287493f76b8a1833e9e0bf2de0d972fb16c6c8ae81565b60006020528060005260406000206000915090505481565b600080fd5b6000819050919050565b6105b7816105a4565b81146105c257600080fd5b50565b6000813590506105d4816105ae565b92915050565b6000602082840312156105f0576105ef61059f565b5b60006105fe848285016105c5565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061064c61064761064284610607565b610627565b610607565b9050919050565b600061065e82610631565b9050919050565b600061067082610653565b9050919050565b61068081610665565b82525050565b600060208201905061069b6000830184610677565b92915050565b60006106ac82610653565b9050919050565b6106bc816106a1565b82525050565b60006020820190506106d760008301846106b3565b92915050565b60006106e882610607565b9050919050565b6106f8816106dd565b811461070357600080fd5b50565b600081359050610715816106ef565b92915050565b6000602082840312156107315761073061059f565b5b600061073f84828501610706565b91505092915050565b610751816105a4565b82525050565b600060208201905061076c6000830184610748565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156107ac578082015181840152602081019050610791565b60008484015250505050565b6000601f19601f8301169050919050565b60006107d482610772565b6107de818561077d565b93506107ee81856020860161078e565b6107f7816107b8565b840191505092915050565b6000602082019050818103600083015261081c81846107c9565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061085e826105a4565b9150610869836105a4565b925082820390508181111561088157610880610824565b5b92915050565b610890816106dd565b82525050565b60006040820190506108ab6000830185610887565b6108b86020830184610748565b9392505050565b60008115159050919050565b6108d4816108bf565b81146108df57600080fd5b50565b6000815190506108f1816108cb565b92915050565b60006020828403121561090d5761090c61059f565b5b600061091b848285016108e2565b91505092915050565b60006080820190506109396000830187610748565b6109466020830186610748565b6109536040830185610748565b6109606060830184610887565b95945050505050565b6000610974826105a4565b915061097f836105a4565b925082820190508082111561099757610996610824565b5b92915050565b60006060820190506109b26000830186610887565b6109bf6020830185610887565b6109cc6040830184610748565b94935050505056fe484e3a4465706f736974732f63616e6e6f742d7472616e736665722d66726f6d2d73656e646572a26469706673582212202bd2555dc0dd1913e47b74fb7806f4e89335d69041c89052ce7b0d4018ae74e264736f6c63430008120033

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

0000000000000000000000007dd9c5cba05e151c895fde1cf355c9a1d5da6429000000000000000000000000287493f76b8a1833e9e0bf2de0d972fb16c6c8ae

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

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


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

OVERVIEW

Octant is a public goods funding platform that uses locked GLM to determine who is eligible for the say of distribution of funds.

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