Ape Curtis Testnet
    /

    Contract

    0x9E7AC11B03d7F9573BFDc2d0274DCb38dCe71684

    Overview

    APE Balance

    Ape Curtis LogoApe Curtis LogoApe Curtis Logo0 APE

    Multichain Info

    No addresses found
    Transaction Hash
    Method
    Block
    Age
    From
    To

    There are no matching entries

    > 10 Internal Transactions found.

    Latest 25 internal transactions (View All)

    Parent Transaction Hash Block Age From To Amount
    142802672025-01-01 8:37:5365 days ago1735720673
    0x9E7AC11B...8dCe71684
    0 APE
    142802672025-01-01 8:37:5365 days ago1735720673
    0x9E7AC11B...8dCe71684
    0 APE
    142802662025-01-01 8:37:5165 days ago1735720671
    0x9E7AC11B...8dCe71684
    0 APE
    142802662025-01-01 8:37:5165 days ago1735720671
    0x9E7AC11B...8dCe71684
    0 APE
    142802642025-01-01 8:37:4965 days ago1735720669
    0x9E7AC11B...8dCe71684
    0 APE
    142802642025-01-01 8:37:4965 days ago1735720669
    0x9E7AC11B...8dCe71684
    0 APE
    142664692024-12-31 6:12:0367 days ago1735625523
    0x9E7AC11B...8dCe71684
    0 APE
    142664692024-12-31 6:12:0367 days ago1735625523
    0x9E7AC11B...8dCe71684
    0 APE
    142664672024-12-31 6:12:0167 days ago1735625521
    0x9E7AC11B...8dCe71684
    0 APE
    142664672024-12-31 6:12:0167 days ago1735625521
    0x9E7AC11B...8dCe71684
    0 APE
    142625882024-12-31 0:11:5067 days ago1735603910
    0x9E7AC11B...8dCe71684
    0 APE
    142625882024-12-31 0:11:5067 days ago1735603910
    0x9E7AC11B...8dCe71684
    0 APE
    142625842024-12-31 0:11:3867 days ago1735603898
    0x9E7AC11B...8dCe71684
    0 APE
    142625842024-12-31 0:11:3867 days ago1735603898
    0x9E7AC11B...8dCe71684
    0 APE
    142622912024-12-30 23:21:3167 days ago1735600891
    0x9E7AC11B...8dCe71684
    0 APE
    142622912024-12-30 23:21:3167 days ago1735600891
    0x9E7AC11B...8dCe71684
    0 APE
    142622792024-12-30 23:19:5567 days ago1735600795
    0x9E7AC11B...8dCe71684
    0 APE
    142622792024-12-30 23:19:5567 days ago1735600795
    0x9E7AC11B...8dCe71684
    0 APE
    142622792024-12-30 23:19:5567 days ago1735600795
    0x9E7AC11B...8dCe71684
    0 APE
    142588742024-12-30 16:44:1167 days ago1735577051
    0x9E7AC11B...8dCe71684
    0 APE
    142588742024-12-30 16:44:1167 days ago1735577051
    0x9E7AC11B...8dCe71684
    0 APE
    142588372024-12-30 16:39:5167 days ago1735576791
    0x9E7AC11B...8dCe71684
    0 APE
    142588372024-12-30 16:39:5167 days ago1735576791
    0x9E7AC11B...8dCe71684
    0 APE
    142588362024-12-30 16:39:3867 days ago1735576778
    0x9E7AC11B...8dCe71684
    0 APE
    142588362024-12-30 16:39:3867 days ago1735576778
    0x9E7AC11B...8dCe71684
    0 APE
    View All Internal Transactions

    Loading...
    Loading

    Contract Source Code Verified (Exact Match)

    Contract Name:
    MarketFactory

    Compiler Version
    v0.8.28+commit.7893614a

    Optimization Enabled:
    Yes with 2000 runs

    Other Settings:
    paris EvmVersion

    Contract Source Code (Solidity Standard Json-Input format)

    File 1 of 38 : MarketFactory.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity =0.8.28;
    import "@openzeppelin/contracts-upgradeable/access/extensions/AccessControlEnumerableUpgradeable.sol";
    import "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol";
    import "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol";
    import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
    import "@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol";
    import "./PredictionMarket.sol";
    import "./interfaces/IMarketFactory.sol";
    import "./libraries/Constants.sol";
    /**
    * @title MarketFactory
    * @dev Factory contract for creating and managing prediction markets.
    * This contract supports permissioned market creation through role-based access control,
    * utilizing signature verification for secure off-chain market creation requests.
    * Inherits from AccessControlEnumerable, Pausable, and EIP712 standards.
    *
    * Security Considerations:
    * - Only accounts with the `DEFAULT_ADMIN_ROLE` can update critical parameters and pause/unpause the contract.
    * - Market creation requires a valid signature from an oracle with the `ORACLE_ROLE` to prevent unauthorized market creation.
    */
    contract MarketFactory is
    IMarketFactory,
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 2 of 38 : AccessControlUpgradeable.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol)
    pragma solidity ^0.8.20;
    import {IAccessControl} from "@openzeppelin/contracts/access/IAccessControl.sol";
    import {ContextUpgradeable} from "../utils/ContextUpgradeable.sol";
    import {ERC165Upgradeable} from "../utils/introspection/ERC165Upgradeable.sol";
    import {Initializable} from "../proxy/utils/Initializable.sol";
    /**
    * @dev Contract module that allows children to implement role-based access
    * control mechanisms. This is a lightweight version that doesn't allow enumerating role
    * members except through off-chain means by accessing the contract event logs. Some
    * applications may benefit from on-chain enumerability, for those cases see
    * {AccessControlEnumerable}.
    *
    * Roles are referred to by their `bytes32` identifier. These should be exposed
    * in the external API and be unique. The best way to achieve this is by
    * using `public constant` hash digests:
    *
    * ```solidity
    * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
    * ```
    *
    * Roles can be used to represent a set of permissions. To restrict access to a
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 3 of 38 : AccessControlEnumerableUpgradeable.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (access/extensions/AccessControlEnumerable.sol)
    pragma solidity ^0.8.20;
    import {IAccessControlEnumerable} from "@openzeppelin/contracts/access/extensions/IAccessControlEnumerable.sol";
    import {AccessControlUpgradeable} from "../AccessControlUpgradeable.sol";
    import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
    import {Initializable} from "../../proxy/utils/Initializable.sol";
    /**
    * @dev Extension of {AccessControl} that allows enumerating the members of each role.
    */
    abstract contract AccessControlEnumerableUpgradeable is Initializable, IAccessControlEnumerable, AccessControlUpgradeable {
    using EnumerableSet for EnumerableSet.AddressSet;
    /// @custom:storage-location erc7201:openzeppelin.storage.AccessControlEnumerable
    struct AccessControlEnumerableStorage {
    mapping(bytes32 role => EnumerableSet.AddressSet) _roleMembers;
    }
    // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.AccessControlEnumerable")) - 1)) & ~bytes32(uint256(0xff))
    bytes32 private constant AccessControlEnumerableStorageLocation = 0xc1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e82371705932000;
    function _getAccessControlEnumerableStorage() private pure returns (AccessControlEnumerableStorage storage $) {
    assembly {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 4 of 38 : Initializable.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol)
    pragma solidity ^0.8.20;
    /**
    * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
    * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
    * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
    * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
    *
    * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
    * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
    * case an upgrade adds a module that needs to be initialized.
    *
    * For example:
    *
    * [.hljs-theme-light.nopadding]
    * ```solidity
    * contract MyToken is ERC20Upgradeable {
    * function initialize() initializer public {
    * __ERC20_init("MyToken", "MTK");
    * }
    * }
    *
    * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 5 of 38 : ContextUpgradeable.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
    pragma solidity ^0.8.20;
    import {Initializable} from "../proxy/utils/Initializable.sol";
    /**
    * @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 ContextUpgradeable is Initializable {
    function __Context_init() internal onlyInitializing {
    }
    function __Context_init_unchained() internal onlyInitializing {
    }
    function _msgSender() internal view virtual returns (address) {
    return msg.sender;
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 6 of 38 : EIP712Upgradeable.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/cryptography/EIP712.sol)
    pragma solidity ^0.8.20;
    import {MessageHashUtils} from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol";
    import {IERC5267} from "@openzeppelin/contracts/interfaces/IERC5267.sol";
    import {Initializable} from "../../proxy/utils/Initializable.sol";
    /**
    * @dev https://eips.ethereum.org/EIPS/eip-712[EIP-712] is a standard for hashing and signing of typed structured data.
    *
    * The encoding scheme specified in the EIP requires a domain separator and a hash of the typed structured data, whose
    * encoding is very generic and therefore its implementation in Solidity is not feasible, thus this contract
    * does not implement the encoding itself. Protocols need to implement the type-specific encoding they need in order to
    * produce the hash of their typed data using a combination of `abi.encode` and `keccak256`.
    *
    * This contract implements the EIP-712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
    * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
    * ({_hashTypedDataV4}).
    *
    * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
    * the chain id to protect against replay attacks on an eventual fork of the chain.
    *
    * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
    * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 7 of 38 : ERC165Upgradeable.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol)
    pragma solidity ^0.8.20;
    import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
    import {Initializable} from "../../proxy/utils/Initializable.sol";
    /**
    * @dev Implementation of the {IERC165} interface.
    *
    * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check
    * for the additional interface id that will be supported. For example:
    *
    * ```solidity
    * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
    * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
    * }
    * ```
    */
    abstract contract ERC165Upgradeable is Initializable, IERC165 {
    function __ERC165_init() internal onlyInitializing {
    }
    function __ERC165_init_unchained() internal onlyInitializing {
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 8 of 38 : PausableUpgradeable.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol)
    pragma solidity ^0.8.20;
    import {ContextUpgradeable} from "../utils/ContextUpgradeable.sol";
    import {Initializable} from "../proxy/utils/Initializable.sol";
    /**
    * @dev Contract module which allows children to implement an emergency stop
    * mechanism that can be triggered by an authorized account.
    *
    * This module is used through inheritance. It will make available the
    * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
    * the functions of your contract. Note that they will not be pausable by
    * simply including this module, only once the modifiers are put in place.
    */
    abstract contract PausableUpgradeable is Initializable, ContextUpgradeable {
    /// @custom:storage-location erc7201:openzeppelin.storage.Pausable
    struct PausableStorage {
    bool _paused;
    }
    // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Pausable")) - 1)) & ~bytes32(uint256(0xff))
    bytes32 private constant PausableStorageLocation = 0xcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 9 of 38 : IAccessControlEnumerable.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (access/extensions/IAccessControlEnumerable.sol)
    pragma solidity ^0.8.20;
    import {IAccessControl} from "../IAccessControl.sol";
    /**
    * @dev External interface of AccessControlEnumerable declared to support ERC-165 detection.
    */
    interface IAccessControlEnumerable is IAccessControl {
    /**
    * @dev Returns one of the accounts that have `role`. `index` must be a
    * value between 0 and {getRoleMemberCount}, non-inclusive.
    *
    * Role bearers are not sorted in any particular way, and their ordering may
    * change at any point.
    *
    * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
    * you perform all queries on the same block. See the following
    * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
    * for more information.
    */
    function getRoleMember(bytes32 role, uint256 index) external view returns (address);
    /**
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 10 of 38 : IAccessControl.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (access/IAccessControl.sol)
    pragma solidity ^0.8.20;
    /**
    * @dev External interface of AccessControl declared to support ERC-165 detection.
    */
    interface IAccessControl {
    /**
    * @dev The `account` is missing a role.
    */
    error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);
    /**
    * @dev The caller of a function is not the expected one.
    *
    * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.
    */
    error AccessControlBadConfirmation();
    /**
    * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
    *
    * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
    * {RoleAdminChanged} not being emitted signaling this.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 11 of 38 : IERC1363.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC1363.sol)
    pragma solidity ^0.8.20;
    import {IERC20} from "./IERC20.sol";
    import {IERC165} from "./IERC165.sol";
    /**
    * @title IERC1363
    * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].
    *
    * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract
    * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.
    */
    interface IERC1363 is IERC20, IERC165 {
    /*
    * Note: the ERC-165 identifier for this interface is 0xb0202a11.
    * 0xb0202a11 ===
    * bytes4(keccak256('transferAndCall(address,uint256)')) ^
    * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^
    * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^
    * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^
    * bytes4(keccak256('approveAndCall(address,uint256)')) ^
    * bytes4(keccak256('approveAndCall(address,uint256,bytes)'))
    */
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 12 of 38 : IERC165.sol
    1
    2
    3
    4
    5
    6
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)
    pragma solidity ^0.8.20;
    import {IERC165} from "../utils/introspection/IERC165.sol";
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 13 of 38 : IERC1967.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC1967.sol)
    pragma solidity ^0.8.20;
    /**
    * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.
    */
    interface IERC1967 {
    /**
    * @dev Emitted when the implementation is upgraded.
    */
    event Upgraded(address indexed implementation);
    /**
    * @dev Emitted when the admin account has changed.
    */
    event AdminChanged(address previousAdmin, address newAdmin);
    /**
    * @dev Emitted when the beacon is changed.
    */
    event BeaconUpgraded(address indexed beacon);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 14 of 38 : IERC20.sol
    1
    2
    3
    4
    5
    6
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol)
    pragma solidity ^0.8.20;
    import {IERC20} from "../token/ERC20/IERC20.sol";
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 15 of 38 : IERC5267.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC5267.sol)
    pragma solidity ^0.8.20;
    interface IERC5267 {
    /**
    * @dev MAY be emitted to signal that the domain could have changed.
    */
    event EIP712DomainChanged();
    /**
    * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712
    * signature.
    */
    function eip712Domain()
    external
    view
    returns (
    bytes1 fields,
    string memory name,
    string memory version,
    uint256 chainId,
    address verifyingContract,
    bytes32 salt,
    uint256[] memory extensions
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 16 of 38 : BeaconProxy.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (proxy/beacon/BeaconProxy.sol)
    pragma solidity ^0.8.20;
    import {IBeacon} from "./IBeacon.sol";
    import {Proxy} from "../Proxy.sol";
    import {ERC1967Utils} from "../ERC1967/ERC1967Utils.sol";
    /**
    * @dev This contract implements a proxy that gets the implementation address for each call from an {UpgradeableBeacon}.
    *
    * The beacon address can only be set once during construction, and cannot be changed afterwards. It is stored in an
    * immutable variable to avoid unnecessary storage reads, and also in the beacon storage slot specified by
    * https://eips.ethereum.org/EIPS/eip-1967[ERC-1967] so that it can be accessed externally.
    *
    * CAUTION: Since the beacon address can never be changed, you must ensure that you either control the beacon, or trust
    * the beacon to not upgrade the implementation maliciously.
    *
    * IMPORTANT: Do not use the implementation logic to modify the beacon storage slot. Doing so would leave the proxy in
    * an inconsistent state where the beacon storage slot does not match the beacon address.
    */
    contract BeaconProxy is Proxy {
    // An immutable address for the beacon to avoid unnecessary SLOADs before each delegate call.
    address private immutable _beacon;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 17 of 38 : IBeacon.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/IBeacon.sol)
    pragma solidity ^0.8.20;
    /**
    * @dev This is the interface that {BeaconProxy} expects of its beacon.
    */
    interface IBeacon {
    /**
    * @dev Must return an address that can be used as a delegate call target.
    *
    * {UpgradeableBeacon} will check that this address is a contract.
    */
    function implementation() external view returns (address);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 18 of 38 : ERC1967Utils.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (proxy/ERC1967/ERC1967Utils.sol)
    pragma solidity ^0.8.21;
    import {IBeacon} from "../beacon/IBeacon.sol";
    import {IERC1967} from "../../interfaces/IERC1967.sol";
    import {Address} from "../../utils/Address.sol";
    import {StorageSlot} from "../../utils/StorageSlot.sol";
    /**
    * @dev This library provides getters and event emitting update functions for
    * https://eips.ethereum.org/EIPS/eip-1967[ERC-1967] slots.
    */
    library ERC1967Utils {
    /**
    * @dev Storage slot with the address of the current implementation.
    * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1.
    */
    // solhint-disable-next-line private-vars-leading-underscore
    bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
    /**
    * @dev The `implementation` of the proxy is invalid.
    */
    error ERC1967InvalidImplementation(address implementation);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 19 of 38 : Proxy.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.0.0) (proxy/Proxy.sol)
    pragma solidity ^0.8.20;
    /**
    * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM
    * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to
    * be specified by overriding the virtual {_implementation} function.
    *
    * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a
    * different contract through the {_delegate} function.
    *
    * The success and return data of the delegated call will be returned back to the caller of the proxy.
    */
    abstract contract Proxy {
    /**
    * @dev Delegates the current call to `implementation`.
    *
    * This function does not return to its internal call site, it will return directly to the external caller.
    */
    function _delegate(address implementation) internal virtual {
    assembly {
    // Copy msg.data. We take full control of memory in this inline assembly
    // block because it will not return to Solidity code. We overwrite the
    // Solidity scratch pad at memory position 0.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 20 of 38 : IERC20.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)
    pragma solidity ^0.8.20;
    /**
    * @dev Interface of the ERC-20 standard as defined in the ERC.
    */
    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 value of tokens in existence.
    */
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 21 of 38 : SafeERC20.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/utils/SafeERC20.sol)
    pragma solidity ^0.8.20;
    import {IERC20} from "../IERC20.sol";
    import {IERC1363} from "../../../interfaces/IERC1363.sol";
    import {Address} from "../../../utils/Address.sol";
    /**
    * @title SafeERC20
    * @dev Wrappers around ERC-20 operations that throw on failure (when the token
    * contract returns false). Tokens that return no value (and instead revert or
    * throw on failure) are also supported, non-reverting calls are assumed to be
    * successful.
    * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
    * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
    */
    library SafeERC20 {
    /**
    * @dev An operation with an ERC-20 token failed.
    */
    error SafeERC20FailedOperation(address token);
    /**
    * @dev Indicates a failed `decreaseAllowance` request.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 22 of 38 : Address.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/Address.sol)
    pragma solidity ^0.8.20;
    import {Errors} from "./Errors.sol";
    /**
    * @dev Collection of functions related to the address type
    */
    library Address {
    /**
    * @dev There's no code at `target` (it is not a contract).
    */
    error AddressEmptyCode(address target);
    /**
    * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
    * `recipient`, forwarding all available gas and reverting on errors.
    *
    * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
    * of certain opcodes, possibly making contracts go over the 2300 gas limit
    * imposed by `transfer`, making them unable to receive funds via
    * `transfer`. {sendValue} removes this limitation.
    *
    * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 23 of 38 : ECDSA.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/cryptography/ECDSA.sol)
    pragma solidity ^0.8.20;
    /**
    * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
    *
    * These functions can be used to verify that a message was signed by the holder
    * of the private keys of a given address.
    */
    library ECDSA {
    enum RecoverError {
    NoError,
    InvalidSignature,
    InvalidSignatureLength,
    InvalidSignatureS
    }
    /**
    * @dev The signature derives the `address(0)`.
    */
    error ECDSAInvalidSignature();
    /**
    * @dev The signature has an invalid length.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 24 of 38 : MessageHashUtils.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/cryptography/MessageHashUtils.sol)
    pragma solidity ^0.8.20;
    import {Strings} from "../Strings.sol";
    /**
    * @dev Signature message hash utilities for producing digests to be consumed by {ECDSA} recovery or signing.
    *
    * The library provides methods for generating a hash of a message that conforms to the
    * https://eips.ethereum.org/EIPS/eip-191[ERC-191] and https://eips.ethereum.org/EIPS/eip-712[EIP 712]
    * specifications.
    */
    library MessageHashUtils {
    /**
    * @dev Returns the keccak256 digest of an ERC-191 signed data with version
    * `0x45` (`personal_sign` messages).
    *
    * The digest is calculated by prefixing a bytes32 `messageHash` with
    * `"\x19Ethereum Signed Message:\n32"` and hashing the result. It corresponds with the
    * hash signed when using the https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] JSON-RPC method.
    *
    * NOTE: The `messageHash` parameter is intended to be the result of hashing a raw message with
    * keccak256, although any bytes32 value can be safely used because the final digest will
    * be re-hashed.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 25 of 38 : Errors.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)
    pragma solidity ^0.8.20;
    /**
    * @dev Collection of common custom errors used in multiple contracts
    *
    * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.
    * It is recommended to avoid relying on the error API for critical functionality.
    *
    * _Available since v5.1._
    */
    library Errors {
    /**
    * @dev The ETH balance of the account is not enough to perform the operation.
    */
    error InsufficientBalance(uint256 balance, uint256 needed);
    /**
    * @dev A call to an address target failed. The target may have reverted.
    */
    error FailedCall();
    /**
    * @dev The deployment failed.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 26 of 38 : IERC165.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)
    pragma solidity ^0.8.20;
    /**
    * @dev Interface of the ERC-165 standard, as defined in the
    * https://eips.ethereum.org/EIPS/eip-165[ERC].
    *
    * Implementers can declare support of contract interfaces, which can then be
    * queried by others ({ERC165Checker}).
    *
    * For an implementation, see {ERC165}.
    */
    interface IERC165 {
    /**
    * @dev Returns true if this contract implements the interface defined by
    * `interfaceId`. See the corresponding
    * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]
    * to learn more about how these ids are created.
    *
    * This function call must use less than 30 000 gas.
    */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 27 of 38 : Math.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/math/Math.sol)
    pragma solidity ^0.8.20;
    import {Panic} from "../Panic.sol";
    import {SafeCast} from "./SafeCast.sol";
    /**
    * @dev Standard math utilities missing in the Solidity language.
    */
    library Math {
    enum Rounding {
    Floor, // Toward negative infinity
    Ceil, // Toward positive infinity
    Trunc, // Toward zero
    Expand // Away from zero
    }
    /**
    * @dev Returns the addition of two unsigned integers, with an success flag (no overflow).
    */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {
    unchecked {
    uint256 c = a + b;
    if (c < a) return (false, 0);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 28 of 38 : SafeCast.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)
    // This file was procedurally generated from scripts/generate/templates/SafeCast.js.
    pragma solidity ^0.8.20;
    /**
    * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow
    * checks.
    *
    * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can
    * easily result in undesired exploitation or bugs, since developers usually
    * assume that overflows raise errors. `SafeCast` restores this intuition by
    * reverting the transaction when such an operation overflows.
    *
    * Using this library instead of the unchecked operations eliminates an entire
    * class of bugs, so it's recommended to use it always.
    */
    library SafeCast {
    /**
    * @dev Value doesn't fit in an uint of `bits` size.
    */
    error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);
    /**
    * @dev An int value doesn't fit in an uint of `bits` size.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 29 of 38 : SignedMath.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SignedMath.sol)
    pragma solidity ^0.8.20;
    import {SafeCast} from "./SafeCast.sol";
    /**
    * @dev Standard signed math utilities missing in the Solidity language.
    */
    library SignedMath {
    /**
    * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.
    *
    * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.
    * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute
    * one branch when needed, making this function more expensive.
    */
    function ternary(bool condition, int256 a, int256 b) internal pure returns (int256) {
    unchecked {
    // branchless ternary works because:
    // b ^ (a ^ b) == a
    // b ^ 0 == b
    return b ^ ((a ^ b) * int256(SafeCast.toUint(condition)));
    }
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 30 of 38 : Panic.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)
    pragma solidity ^0.8.20;
    /**
    * @dev Helper library for emitting standardized panic codes.
    *
    * ```solidity
    * contract Example {
    * using Panic for uint256;
    *
    * // Use any of the declared internal constants
    * function foo() { Panic.GENERIC.panic(); }
    *
    * // Alternatively
    * function foo() { Panic.panic(Panic.GENERIC); }
    * }
    * ```
    *
    * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].
    *
    * _Available since v5.1._
    */
    // slither-disable-next-line unused-state
    library Panic {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 31 of 38 : StorageSlot.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)
    // This file was procedurally generated from scripts/generate/templates/StorageSlot.js.
    pragma solidity ^0.8.20;
    /**
    * @dev Library for reading and writing primitive types to specific storage slots.
    *
    * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
    * This library helps with reading and writing to such slots without the need for inline assembly.
    *
    * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
    *
    * Example usage to set ERC-1967 implementation slot:
    * ```solidity
    * contract ERC1967 {
    * // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.
    * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
    *
    * function _getImplementation() internal view returns (address) {
    * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
    * }
    *
    * function _setImplementation(address newImplementation) internal {
    * require(newImplementation.code.length > 0);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 32 of 38 : Strings.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/Strings.sol)
    pragma solidity ^0.8.20;
    import {Math} from "./math/Math.sol";
    import {SignedMath} from "./math/SignedMath.sol";
    /**
    * @dev String operations.
    */
    library Strings {
    bytes16 private constant HEX_DIGITS = "0123456789abcdef";
    uint8 private constant ADDRESS_LENGTH = 20;
    /**
    * @dev The `value` string doesn't fit in the specified `length`.
    */
    error StringsInsufficientHexLength(uint256 value, uint256 length);
    /**
    * @dev Converts a `uint256` to its ASCII `string` decimal representation.
    */
    function toString(uint256 value) internal pure returns (string memory) {
    unchecked {
    uint256 length = Math.log10(value) + 1;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 33 of 38 : EnumerableSet.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/structs/EnumerableSet.sol)
    // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.
    pragma solidity ^0.8.20;
    /**
    * @dev Library for managing
    * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
    * types.
    *
    * Sets have the following properties:
    *
    * - Elements are added, removed, and checked for existence in constant time
    * (O(1)).
    * - Elements are enumerated in O(n). No guarantees are made on the ordering.
    *
    * ```solidity
    * contract Example {
    * // Add the library methods
    * using EnumerableSet for EnumerableSet.AddressSet;
    *
    * // Declare a set state variable
    * EnumerableSet.AddressSet private mySet;
    * }
    * ```
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 34 of 38 : IMarketFactory.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity =0.8.28;
    import "@openzeppelin/contracts/proxy/beacon/IBeacon.sol";
    import "../libraries/MarketStruct.sol";
    /**
    * @title IMarketFactory
    * @dev Interface for the MarketFactory contract.
    */
    interface IMarketFactory is IBeacon {
    /**
    * @notice Emitted when the treasury address is updated.
    * @param tresuary The new treasury address.
    */
    event Tresuary(address indexed tresuary);
    /**
    * @notice Emitted when the base price is updated.
    * @param basePrice The new base price.
    */
    event BasePrice(uint256 indexed basePrice);
    /**
    * @notice Emitted when the event duration is updated.
    * @param duration The new event duration.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 35 of 38 : IPredictionMarket.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity =0.8.28;
    import "../libraries/MarketStruct.sol";
    /**
    * @title IPredictionMarket
    * @dev Interface for a prediction market contract allowing users to participate in events and buy shares.
    */
    interface IPredictionMarket {
    /**
    * @dev Enum representing the status of an event.
    */
    enum EventStatus {
    COMPLETED_IN_PAST, // Event has already completed in the past
    AVAILABLE, // Event is currently available for participation
    WAITING_RESULT, // Event is waiting for a result to be provided
    RESULT_YES, // Event result is "YES"
    RESULT_NO // Event result is "NO"
    }
    /**
    * @dev Struct representing a user's balances for a specific event.
    */
    struct UserBalance {
    uint256 noDepoosit; // Total "no" deposits by the user
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 36 of 38 : Constants.sol
    1
    2
    3
    4
    // SPDX-License-Identifier: MIT
    pragma solidity =0.8.28;
    uint256 constant PRECISION = 1e18;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 37 of 38 : MarketStruct.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity =0.8.28;
    enum PredictionMarketEvent {
    REACH_POOL,
    REACH_500_000_CAP,
    REACH_1_000_000_CAP,
    REACH_2_000_000_CAP,
    REACH_5_000_000_CAP
    }
    struct PredictionMarketInitialParams {
    address token;
    uint256 basePrice;
    uint256 noBuyFeePercentage;
    uint256 yesClaimFeePercentage;
    uint256 eventDuration;
    PredictionMarketEvent initialEvent;
    }
    struct PredictionMarketCreateParams {
    address token;
    PredictionMarketEvent initialEvent;
    uint256 deadline;
    bytes signature;
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 38 of 38 : PredictionMarket.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity =0.8.28;
    import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
    import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
    import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
    import "./interfaces/IPredictionMarket.sol";
    import "./interfaces/IMarketFactory.sol";
    import "./libraries/Constants.sol";
    /**
    * @title PredictionMarket
    * @dev Implementation of a prediction market that allows users to buy shares
    * and participate in events based on their outcomes. The contract supports multiple
    * events, each with its own status, and enforces permissioned access for oracles.
    * The market ensures safe token handling using OpenZeppelin's SafeERC20.
    */
    contract PredictionMarket is IPredictionMarket, Initializable {
    using SafeERC20 for IERC20;
    /** @notice Address of the market factory contract that deployed this market. */
    address public override factory;
    /** @notice Address of the ERC20 token used for deposits in the market. */
    address public override token;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Settings
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    {
    "viaIR": true,
    "optimizer": {
    "enabled": true,
    "runs": 2000
    },
    "metadata": {
    "bytecodeHash": "none"
    },
    "evmVersion": "paris",
    "outputSelection": {
    "*": {
    "*": [
    "evm.bytecode",
    "evm.deployedBytecode",
    "devdoc",
    "userdoc",
    "metadata",
    "abi"
    ]
    }
    },
    "libraries": {}
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Contract ABI

    API
    [{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"from","type":"address"}],"name":"CreateMarketInvalidSigner","type":"error"},{"inputs":[{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"CreateMarketSignatureExpired","type":"error"},{"inputs":[],"name":"ECDSAInvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"name":"ECDSAInvalidSignatureLength","type":"error"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"ECDSAInvalidSignatureS","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[{"internalType":"uint256","name":"feePercentage","type":"uint256"}],"name":"GtThenMaxFeePercentage","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"MarketAlreadyExist","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"basePrice","type":"uint256"}],"name":"BasePrice","type":"event"},{"anonymous":false,"inputs":[],"name":"EIP712DomainChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"EventDuration","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"market","type":"address"},{"indexed":true,"internalType":"address","name":"signer","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"uint256","name":"basePrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"noBuyFeePercentage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"yesClaimFeePercentage","type":"uint256"},{"indexed":false,"internalType":"enum PredictionMarketEvent","name":"initialEvent","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"eventDuration","type":"uint256"}],"name":"MarketCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"noBuyFeePercentage","type":"uint256"}],"name":"NoBuyFeePercentage","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tresuary","type":"address"}],"name":"Tresuary","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"yesClaimFeePercentage","type":"uint256"}],"name":"YesClaimFeePercentage","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ORACLE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"basePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"enum PredictionMarketEvent","name":"initialEvent","type":"uint8"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct PredictionMarketCreateParams","name":"params_","type":"tuple"}],"name":"createMarket","outputs":[{"internalType":"address","name":"market","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eventDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"getMarketByToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offset_","type":"uint256"},{"internalType":"uint256","name":"limit_","type":"uint256"}],"name":"getMarkets","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMembers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"marketImplementation_","type":"address"},{"internalType":"address","name":"depositToken_","type":"address"},{"internalType":"address","name":"tresuary_","type":"address"},{"internalType":"uint256","name":"basePrice_","type":"uint256"},{"internalType":"uint256","name":"noBuyFeePercentage_","type":"uint256"},{"internalType":"uint256","name":"yesClaimFeePercentage_","type":"uint256"},{"internalType":"uint256","name":"eventDuration_","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"oracle_","type":"address"}],"name":"isOracle","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"markets","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"noBuyFeePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"basePrice_","type":"uint256"}],"name":"setBasePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"eventDuration_","type":"uint256"}],"name":"setEventDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"noBuyFeePercentage_","type":"uint256"}],"name":"setNoBuyFeePercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"pause_","type":"bool"}],"name":"setPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tresuary_","type":"address"}],"name":"setTresuary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"yesClaimFeePercentage_","type":"uint256"}],"name":"setYesClaimFeePercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tresuary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"yesClaimFeePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

    6080806040523460d2577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460ff8160401c1660c1576002600160401b03196001600160401b03821601605c575b604051612cda90816100d88239f35b6001600160401b0319166001600160401b039081177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005581527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a13880604d565b63f92ee8a960e01b60005260046000fd5b600080fdfe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a714611a585750806307e2cea514611a1d5780630c8ed197146119c65780631695d7fa146119a8578063248a9ca3146119535780632a3fac76146119355780632b4656c8146110ff5780632f2ff15d1461109f5780633174cf241461108157806336568abe146110235780635305cbdc14610a2f5780635c60da1b14610a085780635c975abb146109c65780636f1bd377146109445780637efca244146108d357806380968d48146108b057806384b0196e146107245780638cfc2ef3146106fd5780639010d07c146106a957806391d148541461063d57806393825c8e14610603578063a217fddf146105e7578063a3246ad314610554578063a540254414610536578063a97e5c93146104ac578063b1283e7714610469578063bedb86fb14610314578063c7876ea4146102f6578063c89039c5146102d0578063ca15c87314610287578063d547741f1461021e578063de4b3262146101d65763f32f6f6a1461018c57600080fd5b346101d35760206003193601126101d3576004356101a8611d8d565b806004557fa4c89632be072fc66d9eea43ab7a1e288631501bd73c165a580f2700f10452638280a280f35b80fd5b50346101d35760206003193601126101d3576004356101f3611d8d565b806003557f80aea7bc7211a36da3d6883a7abe8f35c4623b271fca7dcfada4008782d930f08280a280f35b50346101d35760406003193601126101d35761028360043561023e611b4a565b9061027e610279826000527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260016040600020015490565b611df9565b611ed1565b5080f35b50346101d35760206003193601126101d357604060209160043581527fc1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e8237170593200083522054604051908152f35b50346101d357806003193601126101d3576001600160a01b036020915416604051908152f35b50346101d357806003193601126101d3576020600354604051908152f35b50346101d35760206003193601126101d35760043580151581036104655761033a611d8d565b156103bf57610347611f26565b600160ff197fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005416177fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a180f35b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff81161561043d5760ff19167fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a180f35b6004827f8dfc202b000000000000000000000000000000000000000000000000000000008152fd5b5080fd5b50346101d35760206003193601126101d357600435906007548210156101d35760206001600160a01b0361049c84611be4565b90549060031b1c16604051908152f35b50346101d35760206003193601126101d3576001600160a01b0360406104d0611b2f565b927f68e79a7bf1e0bc45d0a330c573bc367f9cf464fd326078812f301165fbda4ef181527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052209116600052602052602060ff604060002054166040519015158152f35b50346101d357806003193601126101d3576020600754604051908152f35b50346101d35760206003193601126101d35760043581527fc1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e8237170593200060205260408120604051918260208354918281520192825260208220915b8181106105d1576105cd856105c181870382611c2d565b60405191829182611b60565b0390f35b82548452602090930192600192830192016105aa565b50346101d357806003193601126101d357602090604051908152f35b50346101d35760206003193601126101d3576001600160a01b0360406020928261062b611b2f565b16815260088452205416604051908152f35b50346101d35760406003193601126101d3576001600160a01b036040610661611b4a565b9260043581527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052209116600052602052602060ff604060002054166040519015158152f35b50346101d35760406003193601126101d3576001600160a01b0361049c60209260043581527fc1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e82371705932000845260406024359120611c15565b50346101d357806003193601126101d35760206001600160a01b0360025416604051908152f35b50346101d357806003193601126101d3577fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100541580610887575b15610829576107cd9061076f611fb5565b906107786120ac565b9060206107db6040519361078c8386611c2d565b83855260003681376040519687967f0f00000000000000000000000000000000000000000000000000000000000000885260e08589015260e0880190611ba3565b908682036040880152611ba3565b904660608601523060808601528260a086015284820360c08601528080855193848152019401925b82811061081257505050500390f35b835185528695509381019392810192600101610803565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a656400000000000000000000006044820152fd5b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d101541561075e565b50346101d35760406003193601126101d3576105cd6105c1602435600435611cb5565b50346101d35760206003193601126101d3576001600160a01b036108f5611b2f565b6108fd611d8d565b168073ffffffffffffffffffffffffffffffffffffffff1960025416176002557f22c6ccfb87242fd98bb11a23ba576652ef9068e68ccd290d1c15183d174149728280a280f35b50346101d35760206003193601126101d357600435610961611d8d565b6706f05b59d3b20000811161099b57806006557f8e52cb348672f71cac27fda70a2328fe1e1a83f1336e467b2764b653d96311c38280a280f35b7f0509500d000000000000000000000000000000000000000000000000000000008252600452602490fd5b50346101d357806003193601126101d357602060ff7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330054166040519015158152f35b50346101d357806003193601126101d35760206001600160a01b0360015416604051908152f35b50346101d35760206003193601126101d3576004359067ffffffffffffffff82116101d3578160040190823603608060031982011261046557610a70611f26565b6001600160a01b03610a8184611c66565b16825260086020526001600160a01b03604083205416610fe657604484013590814211610fba57610ab184611c66565b6024860135926005841015610fb65790604291604051906001600160a01b0360208301937f353a53f63b8c0f50252c7b8a0856b6494f1677262a6575b981e39bc744d5a7fc8552336040850152166060830152610b116080830187611c7a565b60a082015260a08152610b2560c082611c2d565b519020610b30612707565b610b38612771565b6040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a08152610b8960c082611c2d565b51902090604051917f190100000000000000000000000000000000000000000000000000000000000083526002830152602282015220947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd60648201359201821215610f5a570193600485013567ffffffffffffffff8111610f5a57602486018136038113610fb65760405196610c2a601f8401601f191660200189611c2d565b8288526020600484369301010111610fb65791846020838994610c579683610c609c013784010152612431565b9095919561246d565b7f68e79a7bf1e0bc45d0a330c573bc367f9cf464fd326078812f301165fbda4ef182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604082206001600160a01b038516835260205260ff60408320541615610f7d57610cd083611c66565b6040516001600160a01b03602082019216825260208152610cf2604082611c2d565b5190206040516105178082019082821067ffffffffffffffff831117610f5e5760609183916127b783393081526040602082015286604082015203019084f58015610f72576001600160a01b03610d4a911693611c66565b600354926005549260065492600454906040519060c0820182811067ffffffffffffffff821117610f5e57906001600160a01b03916040521681526020810196875260408101958652606081019485526080810191825260a08101928352873b15610f5a576040517fec7e2f9f0000000000000000000000000000000000000000000000000000000081526001600160a01b03825116600482015287516024820152865160448201528551606482015282516084820152610e10845160a4830190611c7a565b848160c481838d5af18015610f4f57610f3b575b506001600160a01b0381511684526008602052604084208873ffffffffffffffffffffffffffffffffffffffff1982541617905560075468010000000000000000811015610f275790610e858260016001600160a01b039401600755611be4565b81549060031b90848c831b921b191617905551169551945193519151926005841015610f1357506020978794610f037fff1f4ccdad21dce561716efeb08399bc3e61221264b5bff2b041dad8796e373a9560c0956001600160a01b039551936040519a338c528e8c015260408b015260608a01526080890190611c7a565b60a08701521693a4604051908152f35b80634e487b7160e01b602492526021600452fd5b602485634e487b7160e01b81526041600452fd5b84610f4891959295611c2d565b9238610e24565b6040513d87823e3d90fd5b8380fd5b602486634e487b7160e01b81526041600452fd5b6040513d84823e3d90fd5b6044826001600160a01b03867f759a617c0000000000000000000000000000000000000000000000000000000083521660045233602452fd5b8480fd5b602483837f327e84a1000000000000000000000000000000000000000000000000000000008252600452fd5b506001600160a01b03610ffa602493611c66565b7f4ae2d66700000000000000000000000000000000000000000000000000000000835216600452fd5b50346101d35760406003193601126101d35761103d611b4a565b336001600160a01b038216036110595761028390600435611ed1565b6004827f6697b232000000000000000000000000000000000000000000000000000000008152fd5b50346101d357806003193601126101d3576020600454604051908152f35b50346101d35760406003193601126101d3576102836004356110bf611b4a565b906110fa610279826000527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260016040600020015490565b611e78565b50346101d35760e06003193601126101d357611119611b2f565b611121611b4a565b6044356001600160a01b038116809103610f5a577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549160ff8360401c16159267ffffffffffffffff81168015908161192d575b6001149081611923575b15908161191a575b506118f2578360017fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008316177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005561189d575b506111e3612181565b6111eb612181565b6111f3612181565b60ff197fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330054167fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330055604093845161124a8682611c2d565b600d81527f4d61726b6574466163746f72790000000000000000000000000000000000000060208201528551906112818783611c2d565b600182527f310000000000000000000000000000000000000000000000000000000000000060208301526112b3612181565b6112bb612181565b80519067ffffffffffffffff82116118895781906112f97fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10254611f7b565b601f81116117fc575b50602090601f831160011461175b578a92611750575b50506000198260011b9260031b1c1916177fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102555b80519067ffffffffffffffff821161173c576113887fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10354611f7b565b601f81116116ba575b50602090601f831160011461160b5791806001600160a01b0395949286948b92611600575b50506000198260011b9260031b1c1916177fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d103555b877fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10055877fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10155611439336121da565b6115c7575b611446611f26565b600160ff197fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005416177fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25860208851338152a11673ffffffffffffffffffffffffffffffffffffffff1960015416176001551673ffffffffffffffffffffffffffffffffffffffff1985541617845573ffffffffffffffffffffffffffffffffffffffff19600254161760025560643560035560843560055560a43560065560c435600455611534575080f35b60207fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2917fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00555160018152a180f35b8780527fc1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e823717059320006020526115fa33888a2061252a565b5061143e565b0151905038806113b6565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10389528189209190601f1984168a5b8181106116a257509260019285926001600160a01b0398979596899710611689575b505050811b017fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d103556113ea565b015160001960f88460031b161c1916905538808061165c565b9293602060018192878601518155019501930161163a565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10389527f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b75601f840160051c81019160208510611732575b601f0160051c01905b8181106117275750611391565b89815560010161171a565b9091508190611711565b602488634e487b7160e01b81526041600452fd5b015190503880611318565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1028b52818b2092601f19168b5b8181106117e457509084600195949392106117cb575b505050811b017fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1025561134c565b015160001960f88460031b161c1916905538808061179e565b92936020600181928786015181550195019301611788565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1028b529091507f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d601f840160051c8101916020851061187f575b90601f859493920160051c01905b8181106118715750611302565b8b8155849350600101611864565b9091508190611856565b602489634e487b7160e01b81526041600452fd5b7fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000001668010000000000000001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055386111da565b6004867ff92ee8a9000000000000000000000000000000000000000000000000000000008152fd5b90501538611187565b303b15915061117f565b859150611175565b50346101d357806003193601126101d3576020600554604051908152f35b50346101d35760206003193601126101d35760206119a06004356000527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260016040600020015490565b604051908152f35b50346101d357806003193601126101d3576020600654604051908152f35b50346101d35760206003193601126101d3576004356119e3611d8d565b6706f05b59d3b20000811161099b57806005557f90607dee8cbbda4aae7a7397a27120bc1291b996d7e95bd426822b0eda2535948280a280f35b50346101d357806003193601126101d35760206040517f68e79a7bf1e0bc45d0a330c573bc367f9cf464fd326078812f301165fbda4ef18152f35b905034610465576020600319360112610465576004357fffffffff000000000000000000000000000000000000000000000000000000008116809103611b2b57602092507f5a05180f000000000000000000000000000000000000000000000000000000008114908115611ace575b5015158152f35b7f7965db0b00000000000000000000000000000000000000000000000000000000811491508115611b01575b5038611ac7565b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438611afa565b8280fd5b600435906001600160a01b0382168203611b4557565b600080fd5b602435906001600160a01b0382168203611b4557565b602060408183019282815284518094520192019060005b818110611b845750505090565b82516001600160a01b0316845260209384019390920191600101611b77565b919082519283825260005b848110611bcf575050601f19601f8460006020809697860101520116010190565b80602080928401015182828601015201611bae565b600754811015611bff57600760005260206000200190600090565b634e487b7160e01b600052603260045260246000fd5b8054821015611bff5760005260206000200190600090565b90601f601f19910116810190811067ffffffffffffffff821117611c5057604052565b634e487b7160e01b600052604160045260246000fd5b356001600160a01b0381168103611b455790565b906005821015611c875752565b634e487b7160e01b600052602160045260246000fd5b67ffffffffffffffff8111611c505760051b60200190565b906007549081831015611d7057828203918211611d5257808211611d68575b50611cde81611c9d565b91611cec6040519384611c2d565b818352601f19611cfb83611c9d565b0136602085013760005b828110611d125750505090565b818101808211611d5257611d2d6001600160a01b0391611be4565b90549060031b1c16908451811015611bff5760019160208260051b8701015201611d05565b634e487b7160e01b600052601160045260246000fd5b905038611cd4565b505050604051611d81602082611c2d565b60008152600036813790565b3360009081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff1615611dc657565b7fe2517d3f0000000000000000000000000000000000000000000000000000000060005233600452600060245260446000fd5b806000527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260406000206001600160a01b03331660005260205260ff6040600020541615611e475750565b7fe2517d3f000000000000000000000000000000000000000000000000000000006000523360045260245260446000fd5b611e82828261228c565b9182611e8d57505090565b611ecd916000527fc1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e823717059320006020526001600160a01b03604060002091169061252a565b5090565b611edb8282612364565b9182611ee657505090565b611ecd916000527fc1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e823717059320006020526001600160a01b0360406000209116906125a0565b60ff7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005416611f5157565b7fd93c06650000000000000000000000000000000000000000000000000000000060005260046000fd5b90600182811c92168015611fab575b6020831014611f9557565b634e487b7160e01b600052602260045260246000fd5b91607f1691611f8a565b604051906000827fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1025491611fe883611f7b565b808352926001811690811561208d575060011461200e575b61200c92500383611c2d565b565b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102600090815290917f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d5b81831061207157505090602061200c92820101612000565b6020919350806001915483858901015201910190918492612059565b6020925061200c94915060ff191682840152151560051b820101612000565b604051906000827fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10354916120df83611f7b565b808352926001811690811561208d57506001146121025761200c92500383611c2d565b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d103600090815290917f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b755b81831061216557505090602061200c92820101612000565b602091935080600191548385890101520191019091849261214d565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c16156121b057565b7fd7e6bcf80000000000000000000000000000000000000000000000000000000060005260046000fd5b6001600160a01b03811660009081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16612286576001600160a01b031660008181527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d60205260408120805460ff191660011790553391907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8180a4600190565b50600090565b806000527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260406000206001600160a01b03831660005260205260ff604060002054161560001461235d57806000527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260406000206001600160a01b0383166000526020526040600020600160ff198254161790556001600160a01b03339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d600080a4600190565b5050600090565b806000527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260406000206001600160a01b03831660005260205260ff6040600020541660001461235d57806000527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260406000206001600160a01b038316600052602052604060002060ff1981541690556001600160a01b03339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b600080a4600190565b81519190604183036124625761245b92506020820151906060604084015193015160001a90612672565b9192909190565b505060009160029190565b9190916004811015611c87578061248357509050565b6000600182036124b7577ff645eedf0000000000000000000000000000000000000000000000000000000060005260046000fd5b50600281036124ee57827ffce698f70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b90916003600092146124fe575050565b602492507fd78bce0c000000000000000000000000000000000000000000000000000000008252600452fd5b600181019082600052816020526040600020541560001461259857805468010000000000000000811015611c505761258361256c826001879401855584611c15565b81939154906000199060031b92831b921b19161790565b90555491600052602052604060002055600190565b505050600090565b9060018201918160005282602052604060002054801515600014612669576000198101818111611d52578254906000198201918211611d5257818103612632575b5050508054801561261c5760001901906125fb8282611c15565b60001982549160031b1b191690555560005260205260006040812055600190565b634e487b7160e01b600052603160045260246000fd5b61265261264261256c9386611c15565b90549060031b1c92839286611c15565b9055600052836020526040600020553880806125e1565b50505050600090565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116126fb579160209360809260ff60009560405194855216868401526040830152606082015282805260015afa156126ef576000516001600160a01b038116156126e35790600090600090565b50600090600190600090565b6040513d6000823e3d90fd5b50505060009160039190565b61270f611fb5565b805190811561271f576020012090565b50507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10054801561274c5790565b507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47090565b6127796120ac565b8051908115612789576020012090565b50507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10154801561274c579056fe60a080604052610517803803809161001782856102b7565b833981016040828203126101f35761002e826102f0565b602083015190926001600160401b0382116101f3570181601f820112156101f35780519061005b82610304565b9261006960405194856102b7565b828452602083830101116101f35760005b8281106102a2575050602060009183010152813b15610280577fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b038416908117909155604051635c60da1b60e01b8152909190602081600481865afa90811561020057600091610246575b50803b156102255750817f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e600080a280511561020c57602060049260405193848092635c60da1b60e01b82525afa918215610200576000926101b9575b509060008083602061019595519101845af43d156101b1573d9161017883610304565b9261018660405194856102b7565b83523d6000602085013e61031f565b505b608052604051610196908161038182396080518160460152f35b60609161031f565b91506020823d6020116101f8575b816101d4602093836102b7565b810103126101f3576000806101eb610195946102f0565b935050610155565b600080fd5b3d91506101c7565b6040513d6000823e3d90fd5b505034156101975763b398979f60e01b60005260046000fd5b634c9c8ce360e01b60009081526001600160a01b0391909116600452602490fd5b90506020813d602011610278575b81610261602093836102b7565b810103126101f357610272906102f0565b386100f8565b3d9150610254565b50631933b43b60e21b60009081526001600160a01b0391909116600452602490fd5b8060208092840101518282870101520161007a565b601f909101601f19168101906001600160401b038211908210176102da57604052565b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036101f357565b6001600160401b0381116102da57601f01601f191660200190565b90610345575080511561033457805190602001fd5b63d6bda27560e01b60005260046000fd5b81511580610377575b610356575090565b639996b31560e01b60009081526001600160a01b0391909116600452602490fd5b50803b1561034e56fe60806040527f5c60da1b000000000000000000000000000000000000000000000000000000006080526020608060048173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa801561010a5760009015610168575060203d602011610103575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f820116608001906080821067ffffffffffffffff8311176100d4576100cf91604052608001610116565b610168565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b503d610082565b6040513d6000823e3d90fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8060209101126101635760805173ffffffffffffffffffffffffffffffffffffffff811681036101635790565b600080fd5b60008091368280378136915af43d6000803e15610184573d6000f35b3d6000fdfea164736f6c634300081c000aa164736f6c634300081c000a

    Deployed Bytecode

    0x608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a714611a585750806307e2cea514611a1d5780630c8ed197146119c65780631695d7fa146119a8578063248a9ca3146119535780632a3fac76146119355780632b4656c8146110ff5780632f2ff15d1461109f5780633174cf241461108157806336568abe146110235780635305cbdc14610a2f5780635c60da1b14610a085780635c975abb146109c65780636f1bd377146109445780637efca244146108d357806380968d48146108b057806384b0196e146107245780638cfc2ef3146106fd5780639010d07c146106a957806391d148541461063d57806393825c8e14610603578063a217fddf146105e7578063a3246ad314610554578063a540254414610536578063a97e5c93146104ac578063b1283e7714610469578063bedb86fb14610314578063c7876ea4146102f6578063c89039c5146102d0578063ca15c87314610287578063d547741f1461021e578063de4b3262146101d65763f32f6f6a1461018c57600080fd5b346101d35760206003193601126101d3576004356101a8611d8d565b806004557fa4c89632be072fc66d9eea43ab7a1e288631501bd73c165a580f2700f10452638280a280f35b80fd5b50346101d35760206003193601126101d3576004356101f3611d8d565b806003557f80aea7bc7211a36da3d6883a7abe8f35c4623b271fca7dcfada4008782d930f08280a280f35b50346101d35760406003193601126101d35761028360043561023e611b4a565b9061027e610279826000527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260016040600020015490565b611df9565b611ed1565b5080f35b50346101d35760206003193601126101d357604060209160043581527fc1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e8237170593200083522054604051908152f35b50346101d357806003193601126101d3576001600160a01b036020915416604051908152f35b50346101d357806003193601126101d3576020600354604051908152f35b50346101d35760206003193601126101d35760043580151581036104655761033a611d8d565b156103bf57610347611f26565b600160ff197fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005416177fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a180f35b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff81161561043d5760ff19167fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a180f35b6004827f8dfc202b000000000000000000000000000000000000000000000000000000008152fd5b5080fd5b50346101d35760206003193601126101d357600435906007548210156101d35760206001600160a01b0361049c84611be4565b90549060031b1c16604051908152f35b50346101d35760206003193601126101d3576001600160a01b0360406104d0611b2f565b927f68e79a7bf1e0bc45d0a330c573bc367f9cf464fd326078812f301165fbda4ef181527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052209116600052602052602060ff604060002054166040519015158152f35b50346101d357806003193601126101d3576020600754604051908152f35b50346101d35760206003193601126101d35760043581527fc1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e8237170593200060205260408120604051918260208354918281520192825260208220915b8181106105d1576105cd856105c181870382611c2d565b60405191829182611b60565b0390f35b82548452602090930192600192830192016105aa565b50346101d357806003193601126101d357602090604051908152f35b50346101d35760206003193601126101d3576001600160a01b0360406020928261062b611b2f565b16815260088452205416604051908152f35b50346101d35760406003193601126101d3576001600160a01b036040610661611b4a565b9260043581527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052209116600052602052602060ff604060002054166040519015158152f35b50346101d35760406003193601126101d3576001600160a01b0361049c60209260043581527fc1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e82371705932000845260406024359120611c15565b50346101d357806003193601126101d35760206001600160a01b0360025416604051908152f35b50346101d357806003193601126101d3577fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100541580610887575b15610829576107cd9061076f611fb5565b906107786120ac565b9060206107db6040519361078c8386611c2d565b83855260003681376040519687967f0f00000000000000000000000000000000000000000000000000000000000000885260e08589015260e0880190611ba3565b908682036040880152611ba3565b904660608601523060808601528260a086015284820360c08601528080855193848152019401925b82811061081257505050500390f35b835185528695509381019392810192600101610803565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a656400000000000000000000006044820152fd5b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d101541561075e565b50346101d35760406003193601126101d3576105cd6105c1602435600435611cb5565b50346101d35760206003193601126101d3576001600160a01b036108f5611b2f565b6108fd611d8d565b168073ffffffffffffffffffffffffffffffffffffffff1960025416176002557f22c6ccfb87242fd98bb11a23ba576652ef9068e68ccd290d1c15183d174149728280a280f35b50346101d35760206003193601126101d357600435610961611d8d565b6706f05b59d3b20000811161099b57806006557f8e52cb348672f71cac27fda70a2328fe1e1a83f1336e467b2764b653d96311c38280a280f35b7f0509500d000000000000000000000000000000000000000000000000000000008252600452602490fd5b50346101d357806003193601126101d357602060ff7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330054166040519015158152f35b50346101d357806003193601126101d35760206001600160a01b0360015416604051908152f35b50346101d35760206003193601126101d3576004359067ffffffffffffffff82116101d3578160040190823603608060031982011261046557610a70611f26565b6001600160a01b03610a8184611c66565b16825260086020526001600160a01b03604083205416610fe657604484013590814211610fba57610ab184611c66565b6024860135926005841015610fb65790604291604051906001600160a01b0360208301937f353a53f63b8c0f50252c7b8a0856b6494f1677262a6575b981e39bc744d5a7fc8552336040850152166060830152610b116080830187611c7a565b60a082015260a08152610b2560c082611c2d565b519020610b30612707565b610b38612771565b6040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a08152610b8960c082611c2d565b51902090604051917f190100000000000000000000000000000000000000000000000000000000000083526002830152602282015220947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd60648201359201821215610f5a570193600485013567ffffffffffffffff8111610f5a57602486018136038113610fb65760405196610c2a601f8401601f191660200189611c2d565b8288526020600484369301010111610fb65791846020838994610c579683610c609c013784010152612431565b9095919561246d565b7f68e79a7bf1e0bc45d0a330c573bc367f9cf464fd326078812f301165fbda4ef182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604082206001600160a01b038516835260205260ff60408320541615610f7d57610cd083611c66565b6040516001600160a01b03602082019216825260208152610cf2604082611c2d565b5190206040516105178082019082821067ffffffffffffffff831117610f5e5760609183916127b783393081526040602082015286604082015203019084f58015610f72576001600160a01b03610d4a911693611c66565b600354926005549260065492600454906040519060c0820182811067ffffffffffffffff821117610f5e57906001600160a01b03916040521681526020810196875260408101958652606081019485526080810191825260a08101928352873b15610f5a576040517fec7e2f9f0000000000000000000000000000000000000000000000000000000081526001600160a01b03825116600482015287516024820152865160448201528551606482015282516084820152610e10845160a4830190611c7a565b848160c481838d5af18015610f4f57610f3b575b506001600160a01b0381511684526008602052604084208873ffffffffffffffffffffffffffffffffffffffff1982541617905560075468010000000000000000811015610f275790610e858260016001600160a01b039401600755611be4565b81549060031b90848c831b921b191617905551169551945193519151926005841015610f1357506020978794610f037fff1f4ccdad21dce561716efeb08399bc3e61221264b5bff2b041dad8796e373a9560c0956001600160a01b039551936040519a338c528e8c015260408b015260608a01526080890190611c7a565b60a08701521693a4604051908152f35b80634e487b7160e01b602492526021600452fd5b602485634e487b7160e01b81526041600452fd5b84610f4891959295611c2d565b9238610e24565b6040513d87823e3d90fd5b8380fd5b602486634e487b7160e01b81526041600452fd5b6040513d84823e3d90fd5b6044826001600160a01b03867f759a617c0000000000000000000000000000000000000000000000000000000083521660045233602452fd5b8480fd5b602483837f327e84a1000000000000000000000000000000000000000000000000000000008252600452fd5b506001600160a01b03610ffa602493611c66565b7f4ae2d66700000000000000000000000000000000000000000000000000000000835216600452fd5b50346101d35760406003193601126101d35761103d611b4a565b336001600160a01b038216036110595761028390600435611ed1565b6004827f6697b232000000000000000000000000000000000000000000000000000000008152fd5b50346101d357806003193601126101d3576020600454604051908152f35b50346101d35760406003193601126101d3576102836004356110bf611b4a565b906110fa610279826000527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260016040600020015490565b611e78565b50346101d35760e06003193601126101d357611119611b2f565b611121611b4a565b6044356001600160a01b038116809103610f5a577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549160ff8360401c16159267ffffffffffffffff81168015908161192d575b6001149081611923575b15908161191a575b506118f2578360017fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008316177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005561189d575b506111e3612181565b6111eb612181565b6111f3612181565b60ff197fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330054167fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330055604093845161124a8682611c2d565b600d81527f4d61726b6574466163746f72790000000000000000000000000000000000000060208201528551906112818783611c2d565b600182527f310000000000000000000000000000000000000000000000000000000000000060208301526112b3612181565b6112bb612181565b80519067ffffffffffffffff82116118895781906112f97fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10254611f7b565b601f81116117fc575b50602090601f831160011461175b578a92611750575b50506000198260011b9260031b1c1916177fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102555b80519067ffffffffffffffff821161173c576113887fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10354611f7b565b601f81116116ba575b50602090601f831160011461160b5791806001600160a01b0395949286948b92611600575b50506000198260011b9260031b1c1916177fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d103555b877fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10055877fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10155611439336121da565b6115c7575b611446611f26565b600160ff197fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005416177fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25860208851338152a11673ffffffffffffffffffffffffffffffffffffffff1960015416176001551673ffffffffffffffffffffffffffffffffffffffff1985541617845573ffffffffffffffffffffffffffffffffffffffff19600254161760025560643560035560843560055560a43560065560c435600455611534575080f35b60207fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2917fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00555160018152a180f35b8780527fc1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e823717059320006020526115fa33888a2061252a565b5061143e565b0151905038806113b6565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10389528189209190601f1984168a5b8181106116a257509260019285926001600160a01b0398979596899710611689575b505050811b017fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d103556113ea565b015160001960f88460031b161c1916905538808061165c565b9293602060018192878601518155019501930161163a565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10389527f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b75601f840160051c81019160208510611732575b601f0160051c01905b8181106117275750611391565b89815560010161171a565b9091508190611711565b602488634e487b7160e01b81526041600452fd5b015190503880611318565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1028b52818b2092601f19168b5b8181106117e457509084600195949392106117cb575b505050811b017fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1025561134c565b015160001960f88460031b161c1916905538808061179e565b92936020600181928786015181550195019301611788565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1028b529091507f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d601f840160051c8101916020851061187f575b90601f859493920160051c01905b8181106118715750611302565b8b8155849350600101611864565b9091508190611856565b602489634e487b7160e01b81526041600452fd5b7fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000001668010000000000000001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055386111da565b6004867ff92ee8a9000000000000000000000000000000000000000000000000000000008152fd5b90501538611187565b303b15915061117f565b859150611175565b50346101d357806003193601126101d3576020600554604051908152f35b50346101d35760206003193601126101d35760206119a06004356000527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260016040600020015490565b604051908152f35b50346101d357806003193601126101d3576020600654604051908152f35b50346101d35760206003193601126101d3576004356119e3611d8d565b6706f05b59d3b20000811161099b57806005557f90607dee8cbbda4aae7a7397a27120bc1291b996d7e95bd426822b0eda2535948280a280f35b50346101d357806003193601126101d35760206040517f68e79a7bf1e0bc45d0a330c573bc367f9cf464fd326078812f301165fbda4ef18152f35b905034610465576020600319360112610465576004357fffffffff000000000000000000000000000000000000000000000000000000008116809103611b2b57602092507f5a05180f000000000000000000000000000000000000000000000000000000008114908115611ace575b5015158152f35b7f7965db0b00000000000000000000000000000000000000000000000000000000811491508115611b01575b5038611ac7565b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438611afa565b8280fd5b600435906001600160a01b0382168203611b4557565b600080fd5b602435906001600160a01b0382168203611b4557565b602060408183019282815284518094520192019060005b818110611b845750505090565b82516001600160a01b0316845260209384019390920191600101611b77565b919082519283825260005b848110611bcf575050601f19601f8460006020809697860101520116010190565b80602080928401015182828601015201611bae565b600754811015611bff57600760005260206000200190600090565b634e487b7160e01b600052603260045260246000fd5b8054821015611bff5760005260206000200190600090565b90601f601f19910116810190811067ffffffffffffffff821117611c5057604052565b634e487b7160e01b600052604160045260246000fd5b356001600160a01b0381168103611b455790565b906005821015611c875752565b634e487b7160e01b600052602160045260246000fd5b67ffffffffffffffff8111611c505760051b60200190565b906007549081831015611d7057828203918211611d5257808211611d68575b50611cde81611c9d565b91611cec6040519384611c2d565b818352601f19611cfb83611c9d565b0136602085013760005b828110611d125750505090565b818101808211611d5257611d2d6001600160a01b0391611be4565b90549060031b1c16908451811015611bff5760019160208260051b8701015201611d05565b634e487b7160e01b600052601160045260246000fd5b905038611cd4565b505050604051611d81602082611c2d565b60008152600036813790565b3360009081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff1615611dc657565b7fe2517d3f0000000000000000000000000000000000000000000000000000000060005233600452600060245260446000fd5b806000527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260406000206001600160a01b03331660005260205260ff6040600020541615611e475750565b7fe2517d3f000000000000000000000000000000000000000000000000000000006000523360045260245260446000fd5b611e82828261228c565b9182611e8d57505090565b611ecd916000527fc1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e823717059320006020526001600160a01b03604060002091169061252a565b5090565b611edb8282612364565b9182611ee657505090565b611ecd916000527fc1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e823717059320006020526001600160a01b0360406000209116906125a0565b60ff7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005416611f5157565b7fd93c06650000000000000000000000000000000000000000000000000000000060005260046000fd5b90600182811c92168015611fab575b6020831014611f9557565b634e487b7160e01b600052602260045260246000fd5b91607f1691611f8a565b604051906000827fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1025491611fe883611f7b565b808352926001811690811561208d575060011461200e575b61200c92500383611c2d565b565b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102600090815290917f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d5b81831061207157505090602061200c92820101612000565b6020919350806001915483858901015201910190918492612059565b6020925061200c94915060ff191682840152151560051b820101612000565b604051906000827fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10354916120df83611f7b565b808352926001811690811561208d57506001146121025761200c92500383611c2d565b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d103600090815290917f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b755b81831061216557505090602061200c92820101612000565b602091935080600191548385890101520191019091849261214d565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c16156121b057565b7fd7e6bcf80000000000000000000000000000000000000000000000000000000060005260046000fd5b6001600160a01b03811660009081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16612286576001600160a01b031660008181527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d60205260408120805460ff191660011790553391907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8180a4600190565b50600090565b806000527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260406000206001600160a01b03831660005260205260ff604060002054161560001461235d57806000527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260406000206001600160a01b0383166000526020526040600020600160ff198254161790556001600160a01b03339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d600080a4600190565b5050600090565b806000527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260406000206001600160a01b03831660005260205260ff6040600020541660001461235d57806000527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260406000206001600160a01b038316600052602052604060002060ff1981541690556001600160a01b03339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b600080a4600190565b81519190604183036124625761245b92506020820151906060604084015193015160001a90612672565b9192909190565b505060009160029190565b9190916004811015611c87578061248357509050565b6000600182036124b7577ff645eedf0000000000000000000000000000000000000000000000000000000060005260046000fd5b50600281036124ee57827ffce698f70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b90916003600092146124fe575050565b602492507fd78bce0c000000000000000000000000000000000000000000000000000000008252600452fd5b600181019082600052816020526040600020541560001461259857805468010000000000000000811015611c505761258361256c826001879401855584611c15565b81939154906000199060031b92831b921b19161790565b90555491600052602052604060002055600190565b505050600090565b9060018201918160005282602052604060002054801515600014612669576000198101818111611d52578254906000198201918211611d5257818103612632575b5050508054801561261c5760001901906125fb8282611c15565b60001982549160031b1b191690555560005260205260006040812055600190565b634e487b7160e01b600052603160045260246000fd5b61265261264261256c9386611c15565b90549060031b1c92839286611c15565b9055600052836020526040600020553880806125e1565b50505050600090565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116126fb579160209360809260ff60009560405194855216868401526040830152606082015282805260015afa156126ef576000516001600160a01b038116156126e35790600090600090565b50600090600190600090565b6040513d6000823e3d90fd5b50505060009160039190565b61270f611fb5565b805190811561271f576020012090565b50507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10054801561274c5790565b507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47090565b6127796120ac565b8051908115612789576020012090565b50507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10154801561274c579056fe60a080604052610517803803809161001782856102b7565b833981016040828203126101f35761002e826102f0565b602083015190926001600160401b0382116101f3570181601f820112156101f35780519061005b82610304565b9261006960405194856102b7565b828452602083830101116101f35760005b8281106102a2575050602060009183010152813b15610280577fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b038416908117909155604051635c60da1b60e01b8152909190602081600481865afa90811561020057600091610246575b50803b156102255750817f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e600080a280511561020c57602060049260405193848092635c60da1b60e01b82525afa918215610200576000926101b9575b509060008083602061019595519101845af43d156101b1573d9161017883610304565b9261018660405194856102b7565b83523d6000602085013e61031f565b505b608052604051610196908161038182396080518160460152f35b60609161031f565b91506020823d6020116101f8575b816101d4602093836102b7565b810103126101f3576000806101eb610195946102f0565b935050610155565b600080fd5b3d91506101c7565b6040513d6000823e3d90fd5b505034156101975763b398979f60e01b60005260046000fd5b634c9c8ce360e01b60009081526001600160a01b0391909116600452602490fd5b90506020813d602011610278575b81610261602093836102b7565b810103126101f357610272906102f0565b386100f8565b3d9150610254565b50631933b43b60e21b60009081526001600160a01b0391909116600452602490fd5b8060208092840101518282870101520161007a565b601f909101601f19168101906001600160401b038211908210176102da57604052565b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036101f357565b6001600160401b0381116102da57601f01601f191660200190565b90610345575080511561033457805190602001fd5b63d6bda27560e01b60005260046000fd5b81511580610377575b610356575090565b639996b31560e01b60009081526001600160a01b0391909116600452602490fd5b50803b1561034e56fe60806040527f5c60da1b000000000000000000000000000000000000000000000000000000006080526020608060048173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa801561010a5760009015610168575060203d602011610103575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f820116608001906080821067ffffffffffffffff8311176100d4576100cf91604052608001610116565b610168565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b503d610082565b6040513d6000823e3d90fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8060209101126101635760805173ffffffffffffffffffffffffffffffffffffffff811681036101635790565b600080fd5b60008091368280378136915af43d6000803e15610184573d6000f35b3d6000fdfea164736f6c634300081c000aa164736f6c634300081c000a

    Block Age Transaction Difficulty Gas Used Reward
    View All Blocks Produced

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

    Validator Index Block Age Amount
    View All Withdrawals

    Transaction Hash Block Age Value Eth2 PubKey Valid
    View All Deposits
    [ 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.