Source Code
Overview
APE Balance
More Info
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | Age | From | To | Amount | |
---|---|---|---|---|---|---|
14280267 | 65 days ago | 0 APE | ||||
14280267 | 65 days ago | 0 APE | ||||
14280266 | 65 days ago | 0 APE | ||||
14280266 | 65 days ago | 0 APE | ||||
14280264 | 65 days ago | 0 APE | ||||
14280264 | 65 days ago | 0 APE | ||||
14266469 | 67 days ago | 0 APE | ||||
14266469 | 67 days ago | 0 APE | ||||
14266467 | 67 days ago | 0 APE | ||||
14266467 | 67 days ago | 0 APE | ||||
14262588 | 67 days ago | 0 APE | ||||
14262588 | 67 days ago | 0 APE | ||||
14262584 | 67 days ago | 0 APE | ||||
14262584 | 67 days ago | 0 APE | ||||
14262291 | 67 days ago | 0 APE | ||||
14262291 | 67 days ago | 0 APE | ||||
14262279 | 67 days ago | 0 APE | ||||
14262279 | 67 days ago | 0 APE | ||||
14262279 | 67 days ago | 0 APE | ||||
14258874 | 67 days ago | 0 APE | ||||
14258874 | 67 days ago | 0 APE | ||||
14258837 | 67 days ago | 0 APE | ||||
14258837 | 67 days ago | 0 APE | ||||
14258836 | 67 days ago | 0 APE | ||||
14258836 | 67 days ago | 0 APE |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
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)
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma 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 isIMarketFactory,
1234567891011121314151617181920212223242526// 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
1234567891011121314151617181920212223242526// 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.AccessControlEnumerablestruct 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 {
1234567891011121314151617181920212223242526// 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 {
1234567891011121314151617181920212223242526// 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;}
1234567891011121314151617181920212223242526// 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].
1234567891011121314151617181920212223242526// 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 {}
1234567891011121314151617181920212223242526// 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.Pausablestruct PausableStorage {bool _paused;}// keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Pausable")) - 1)) & ~bytes32(uint256(0xff))bytes32 private constant PausableStorageLocation = 0xcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300;
1234567891011121314151617181920212223242526// 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);/**
1234567891011121314151617181920212223242526// 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.
1234567891011121314151617181920212223242526// 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)'))*/
123456// 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";
123456789101112131415161718192021222324// 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);}
123456// 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";
1234567891011121314151617181920212223242526// 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()externalviewreturns (bytes1 fields,string memory name,string memory version,uint256 chainId,address verifyingContract,bytes32 salt,uint256[] memory extensions
1234567891011121314151617181920212223242526// 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;
12345678910111213141516// 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);}
1234567891011121314151617181920212223242526// 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-underscorebytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;/*** @dev The `implementation` of the proxy is invalid.*/error ERC1967InvalidImplementation(address implementation);
1234567891011121314151617181920212223242526// 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.
1234567891011121314151617181920212223242526// 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.*/
1234567891011121314151617181920212223242526// 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.
1234567891011121314151617181920212223242526// 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].
1234567891011121314151617181920212223242526// 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.
1234567891011121314151617181920212223242526// 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.
1234567891011121314151617181920212223242526// 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.
12345678910111213141516171819202122232425// 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);}
1234567891011121314151617181920212223242526// 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 infinityCeil, // Toward positive infinityTrunc, // Toward zeroExpand // 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);
1234567891011121314151617181920212223242526// 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.
1234567891011121314151617181920212223242526// 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 == breturn b ^ ((a ^ b) * int256(SafeCast.toUint(condition)));}}
1234567891011121314151617181920212223242526// 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-statelibrary Panic {
1234567891011121314151617181920212223242526// 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);
1234567891011121314151617181920212223242526// 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;
1234567891011121314151617181920212223242526// 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;* }* ```
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma 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.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma 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 pastAVAILABLE, // Event is currently available for participationWAITING_RESULT, // Event is waiting for a result to be providedRESULT_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
1234// SPDX-License-Identifier: MITpragma solidity =0.8.28;uint256 constant PRECISION = 1e18;
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma 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;}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma 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;
123456789101112131415161718192021222324{"viaIR": true,"optimizer": {"enabled": true,"runs": 2000},"metadata": {"bytecodeHash": "none"},"evmVersion": "paris","outputSelection": {"*": {"*": ["evm.bytecode","evm.deployedBytecode","devdoc","userdoc","metadata","abi"]}},"libraries": {}}
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"}]
Contract Creation Code
6080806040523460d2577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460ff8160401c1660c1576002600160401b03196001600160401b03821601605c575b604051612cda90816100d88239f35b6001600160401b0319166001600160401b039081177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005581527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a13880604d565b63f92ee8a960e01b60005260046000fd5b600080fdfe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a714611a585750806307e2cea514611a1d5780630c8ed197146119c65780631695d7fa146119a8578063248a9ca3146119535780632a3fac76146119355780632b4656c8146110ff5780632f2ff15d1461109f5780633174cf241461108157806336568abe146110235780635305cbdc14610a2f5780635c60da1b14610a085780635c975abb146109c65780636f1bd377146109445780637efca244146108d357806380968d48146108b057806384b0196e146107245780638cfc2ef3146106fd5780639010d07c146106a957806391d148541461063d57806393825c8e14610603578063a217fddf146105e7578063a3246ad314610554578063a540254414610536578063a97e5c93146104ac578063b1283e7714610469578063bedb86fb14610314578063c7876ea4146102f6578063c89039c5146102d0578063ca15c87314610287578063d547741f1461021e578063de4b3262146101d65763f32f6f6a1461018c57600080fd5b346101d35760206003193601126101d3576004356101a8611d8d565b806004557fa4c89632be072fc66d9eea43ab7a1e288631501bd73c165a580f2700f10452638280a280f35b80fd5b50346101d35760206003193601126101d3576004356101f3611d8d565b806003557f80aea7bc7211a36da3d6883a7abe8f35c4623b271fca7dcfada4008782d930f08280a280f35b50346101d35760406003193601126101d35761028360043561023e611b4a565b9061027e610279826000527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260016040600020015490565b611df9565b611ed1565b5080f35b50346101d35760206003193601126101d357604060209160043581527fc1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e8237170593200083522054604051908152f35b50346101d357806003193601126101d3576001600160a01b036020915416604051908152f35b50346101d357806003193601126101d3576020600354604051908152f35b50346101d35760206003193601126101d35760043580151581036104655761033a611d8d565b156103bf57610347611f26565b600160ff197fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005416177fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a180f35b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff81161561043d5760ff19167fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a180f35b6004827f8dfc202b000000000000000000000000000000000000000000000000000000008152fd5b5080fd5b50346101d35760206003193601126101d357600435906007548210156101d35760206001600160a01b0361049c84611be4565b90549060031b1c16604051908152f35b50346101d35760206003193601126101d3576001600160a01b0360406104d0611b2f565b927f68e79a7bf1e0bc45d0a330c573bc367f9cf464fd326078812f301165fbda4ef181527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052209116600052602052602060ff604060002054166040519015158152f35b50346101d357806003193601126101d3576020600754604051908152f35b50346101d35760206003193601126101d35760043581527fc1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e8237170593200060205260408120604051918260208354918281520192825260208220915b8181106105d1576105cd856105c181870382611c2d565b60405191829182611b60565b0390f35b82548452602090930192600192830192016105aa565b50346101d357806003193601126101d357602090604051908152f35b50346101d35760206003193601126101d3576001600160a01b0360406020928261062b611b2f565b16815260088452205416604051908152f35b50346101d35760406003193601126101d3576001600160a01b036040610661611b4a565b9260043581527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052209116600052602052602060ff604060002054166040519015158152f35b50346101d35760406003193601126101d3576001600160a01b0361049c60209260043581527fc1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e82371705932000845260406024359120611c15565b50346101d357806003193601126101d35760206001600160a01b0360025416604051908152f35b50346101d357806003193601126101d3577fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100541580610887575b15610829576107cd9061076f611fb5565b906107786120ac565b9060206107db6040519361078c8386611c2d565b83855260003681376040519687967f0f00000000000000000000000000000000000000000000000000000000000000885260e08589015260e0880190611ba3565b908682036040880152611ba3565b904660608601523060808601528260a086015284820360c08601528080855193848152019401925b82811061081257505050500390f35b835185528695509381019392810192600101610803565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a656400000000000000000000006044820152fd5b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d101541561075e565b50346101d35760406003193601126101d3576105cd6105c1602435600435611cb5565b50346101d35760206003193601126101d3576001600160a01b036108f5611b2f565b6108fd611d8d565b168073ffffffffffffffffffffffffffffffffffffffff1960025416176002557f22c6ccfb87242fd98bb11a23ba576652ef9068e68ccd290d1c15183d174149728280a280f35b50346101d35760206003193601126101d357600435610961611d8d565b6706f05b59d3b20000811161099b57806006557f8e52cb348672f71cac27fda70a2328fe1e1a83f1336e467b2764b653d96311c38280a280f35b7f0509500d000000000000000000000000000000000000000000000000000000008252600452602490fd5b50346101d357806003193601126101d357602060ff7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330054166040519015158152f35b50346101d357806003193601126101d35760206001600160a01b0360015416604051908152f35b50346101d35760206003193601126101d3576004359067ffffffffffffffff82116101d3578160040190823603608060031982011261046557610a70611f26565b6001600160a01b03610a8184611c66565b16825260086020526001600160a01b03604083205416610fe657604484013590814211610fba57610ab184611c66565b6024860135926005841015610fb65790604291604051906001600160a01b0360208301937f353a53f63b8c0f50252c7b8a0856b6494f1677262a6575b981e39bc744d5a7fc8552336040850152166060830152610b116080830187611c7a565b60a082015260a08152610b2560c082611c2d565b519020610b30612707565b610b38612771565b6040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a08152610b8960c082611c2d565b51902090604051917f190100000000000000000000000000000000000000000000000000000000000083526002830152602282015220947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd60648201359201821215610f5a570193600485013567ffffffffffffffff8111610f5a57602486018136038113610fb65760405196610c2a601f8401601f191660200189611c2d565b8288526020600484369301010111610fb65791846020838994610c579683610c609c013784010152612431565b9095919561246d565b7f68e79a7bf1e0bc45d0a330c573bc367f9cf464fd326078812f301165fbda4ef182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604082206001600160a01b038516835260205260ff60408320541615610f7d57610cd083611c66565b6040516001600160a01b03602082019216825260208152610cf2604082611c2d565b5190206040516105178082019082821067ffffffffffffffff831117610f5e5760609183916127b783393081526040602082015286604082015203019084f58015610f72576001600160a01b03610d4a911693611c66565b600354926005549260065492600454906040519060c0820182811067ffffffffffffffff821117610f5e57906001600160a01b03916040521681526020810196875260408101958652606081019485526080810191825260a08101928352873b15610f5a576040517fec7e2f9f0000000000000000000000000000000000000000000000000000000081526001600160a01b03825116600482015287516024820152865160448201528551606482015282516084820152610e10845160a4830190611c7a565b848160c481838d5af18015610f4f57610f3b575b506001600160a01b0381511684526008602052604084208873ffffffffffffffffffffffffffffffffffffffff1982541617905560075468010000000000000000811015610f275790610e858260016001600160a01b039401600755611be4565b81549060031b90848c831b921b191617905551169551945193519151926005841015610f1357506020978794610f037fff1f4ccdad21dce561716efeb08399bc3e61221264b5bff2b041dad8796e373a9560c0956001600160a01b039551936040519a338c528e8c015260408b015260608a01526080890190611c7a565b60a08701521693a4604051908152f35b80634e487b7160e01b602492526021600452fd5b602485634e487b7160e01b81526041600452fd5b84610f4891959295611c2d565b9238610e24565b6040513d87823e3d90fd5b8380fd5b602486634e487b7160e01b81526041600452fd5b6040513d84823e3d90fd5b6044826001600160a01b03867f759a617c0000000000000000000000000000000000000000000000000000000083521660045233602452fd5b8480fd5b602483837f327e84a1000000000000000000000000000000000000000000000000000000008252600452fd5b506001600160a01b03610ffa602493611c66565b7f4ae2d66700000000000000000000000000000000000000000000000000000000835216600452fd5b50346101d35760406003193601126101d35761103d611b4a565b336001600160a01b038216036110595761028390600435611ed1565b6004827f6697b232000000000000000000000000000000000000000000000000000000008152fd5b50346101d357806003193601126101d3576020600454604051908152f35b50346101d35760406003193601126101d3576102836004356110bf611b4a565b906110fa610279826000527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260016040600020015490565b611e78565b50346101d35760e06003193601126101d357611119611b2f565b611121611b4a565b6044356001600160a01b038116809103610f5a577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549160ff8360401c16159267ffffffffffffffff81168015908161192d575b6001149081611923575b15908161191a575b506118f2578360017fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008316177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005561189d575b506111e3612181565b6111eb612181565b6111f3612181565b60ff197fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330054167fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330055604093845161124a8682611c2d565b600d81527f4d61726b6574466163746f72790000000000000000000000000000000000000060208201528551906112818783611c2d565b600182527f310000000000000000000000000000000000000000000000000000000000000060208301526112b3612181565b6112bb612181565b80519067ffffffffffffffff82116118895781906112f97fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10254611f7b565b601f81116117fc575b50602090601f831160011461175b578a92611750575b50506000198260011b9260031b1c1916177fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102555b80519067ffffffffffffffff821161173c576113887fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10354611f7b565b601f81116116ba575b50602090601f831160011461160b5791806001600160a01b0395949286948b92611600575b50506000198260011b9260031b1c1916177fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d103555b877fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10055877fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10155611439336121da565b6115c7575b611446611f26565b600160ff197fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005416177fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25860208851338152a11673ffffffffffffffffffffffffffffffffffffffff1960015416176001551673ffffffffffffffffffffffffffffffffffffffff1985541617845573ffffffffffffffffffffffffffffffffffffffff19600254161760025560643560035560843560055560a43560065560c435600455611534575080f35b60207fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2917fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00555160018152a180f35b8780527fc1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e823717059320006020526115fa33888a2061252a565b5061143e565b0151905038806113b6565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10389528189209190601f1984168a5b8181106116a257509260019285926001600160a01b0398979596899710611689575b505050811b017fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d103556113ea565b015160001960f88460031b161c1916905538808061165c565b9293602060018192878601518155019501930161163a565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10389527f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b75601f840160051c81019160208510611732575b601f0160051c01905b8181106117275750611391565b89815560010161171a565b9091508190611711565b602488634e487b7160e01b81526041600452fd5b015190503880611318565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1028b52818b2092601f19168b5b8181106117e457509084600195949392106117cb575b505050811b017fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1025561134c565b015160001960f88460031b161c1916905538808061179e565b92936020600181928786015181550195019301611788565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1028b529091507f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d601f840160051c8101916020851061187f575b90601f859493920160051c01905b8181106118715750611302565b8b8155849350600101611864565b9091508190611856565b602489634e487b7160e01b81526041600452fd5b7fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000001668010000000000000001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055386111da565b6004867ff92ee8a9000000000000000000000000000000000000000000000000000000008152fd5b90501538611187565b303b15915061117f565b859150611175565b50346101d357806003193601126101d3576020600554604051908152f35b50346101d35760206003193601126101d35760206119a06004356000527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260016040600020015490565b604051908152f35b50346101d357806003193601126101d3576020600654604051908152f35b50346101d35760206003193601126101d3576004356119e3611d8d565b6706f05b59d3b20000811161099b57806005557f90607dee8cbbda4aae7a7397a27120bc1291b996d7e95bd426822b0eda2535948280a280f35b50346101d357806003193601126101d35760206040517f68e79a7bf1e0bc45d0a330c573bc367f9cf464fd326078812f301165fbda4ef18152f35b905034610465576020600319360112610465576004357fffffffff000000000000000000000000000000000000000000000000000000008116809103611b2b57602092507f5a05180f000000000000000000000000000000000000000000000000000000008114908115611ace575b5015158152f35b7f7965db0b00000000000000000000000000000000000000000000000000000000811491508115611b01575b5038611ac7565b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438611afa565b8280fd5b600435906001600160a01b0382168203611b4557565b600080fd5b602435906001600160a01b0382168203611b4557565b602060408183019282815284518094520192019060005b818110611b845750505090565b82516001600160a01b0316845260209384019390920191600101611b77565b919082519283825260005b848110611bcf575050601f19601f8460006020809697860101520116010190565b80602080928401015182828601015201611bae565b600754811015611bff57600760005260206000200190600090565b634e487b7160e01b600052603260045260246000fd5b8054821015611bff5760005260206000200190600090565b90601f601f19910116810190811067ffffffffffffffff821117611c5057604052565b634e487b7160e01b600052604160045260246000fd5b356001600160a01b0381168103611b455790565b906005821015611c875752565b634e487b7160e01b600052602160045260246000fd5b67ffffffffffffffff8111611c505760051b60200190565b906007549081831015611d7057828203918211611d5257808211611d68575b50611cde81611c9d565b91611cec6040519384611c2d565b818352601f19611cfb83611c9d565b0136602085013760005b828110611d125750505090565b818101808211611d5257611d2d6001600160a01b0391611be4565b90549060031b1c16908451811015611bff5760019160208260051b8701015201611d05565b634e487b7160e01b600052601160045260246000fd5b905038611cd4565b505050604051611d81602082611c2d565b60008152600036813790565b3360009081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff1615611dc657565b7fe2517d3f0000000000000000000000000000000000000000000000000000000060005233600452600060245260446000fd5b806000527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260406000206001600160a01b03331660005260205260ff6040600020541615611e475750565b7fe2517d3f000000000000000000000000000000000000000000000000000000006000523360045260245260446000fd5b611e82828261228c565b9182611e8d57505090565b611ecd916000527fc1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e823717059320006020526001600160a01b03604060002091169061252a565b5090565b611edb8282612364565b9182611ee657505090565b611ecd916000527fc1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e823717059320006020526001600160a01b0360406000209116906125a0565b60ff7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005416611f5157565b7fd93c06650000000000000000000000000000000000000000000000000000000060005260046000fd5b90600182811c92168015611fab575b6020831014611f9557565b634e487b7160e01b600052602260045260246000fd5b91607f1691611f8a565b604051906000827fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1025491611fe883611f7b565b808352926001811690811561208d575060011461200e575b61200c92500383611c2d565b565b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102600090815290917f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d5b81831061207157505090602061200c92820101612000565b6020919350806001915483858901015201910190918492612059565b6020925061200c94915060ff191682840152151560051b820101612000565b604051906000827fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10354916120df83611f7b565b808352926001811690811561208d57506001146121025761200c92500383611c2d565b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d103600090815290917f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b755b81831061216557505090602061200c92820101612000565b602091935080600191548385890101520191019091849261214d565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c16156121b057565b7fd7e6bcf80000000000000000000000000000000000000000000000000000000060005260046000fd5b6001600160a01b03811660009081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16612286576001600160a01b031660008181527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d60205260408120805460ff191660011790553391907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8180a4600190565b50600090565b806000527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260406000206001600160a01b03831660005260205260ff604060002054161560001461235d57806000527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260406000206001600160a01b0383166000526020526040600020600160ff198254161790556001600160a01b03339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d600080a4600190565b5050600090565b806000527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260406000206001600160a01b03831660005260205260ff6040600020541660001461235d57806000527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260406000206001600160a01b038316600052602052604060002060ff1981541690556001600160a01b03339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b600080a4600190565b81519190604183036124625761245b92506020820151906060604084015193015160001a90612672565b9192909190565b505060009160029190565b9190916004811015611c87578061248357509050565b6000600182036124b7577ff645eedf0000000000000000000000000000000000000000000000000000000060005260046000fd5b50600281036124ee57827ffce698f70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b90916003600092146124fe575050565b602492507fd78bce0c000000000000000000000000000000000000000000000000000000008252600452fd5b600181019082600052816020526040600020541560001461259857805468010000000000000000811015611c505761258361256c826001879401855584611c15565b81939154906000199060031b92831b921b19161790565b90555491600052602052604060002055600190565b505050600090565b9060018201918160005282602052604060002054801515600014612669576000198101818111611d52578254906000198201918211611d5257818103612632575b5050508054801561261c5760001901906125fb8282611c15565b60001982549160031b1b191690555560005260205260006040812055600190565b634e487b7160e01b600052603160045260246000fd5b61265261264261256c9386611c15565b90549060031b1c92839286611c15565b9055600052836020526040600020553880806125e1565b50505050600090565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116126fb579160209360809260ff60009560405194855216868401526040830152606082015282805260015afa156126ef576000516001600160a01b038116156126e35790600090600090565b50600090600190600090565b6040513d6000823e3d90fd5b50505060009160039190565b61270f611fb5565b805190811561271f576020012090565b50507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10054801561274c5790565b507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47090565b6127796120ac565b8051908115612789576020012090565b50507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10154801561274c579056fe60a080604052610517803803809161001782856102b7565b833981016040828203126101f35761002e826102f0565b602083015190926001600160401b0382116101f3570181601f820112156101f35780519061005b82610304565b9261006960405194856102b7565b828452602083830101116101f35760005b8281106102a2575050602060009183010152813b15610280577fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b038416908117909155604051635c60da1b60e01b8152909190602081600481865afa90811561020057600091610246575b50803b156102255750817f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e600080a280511561020c57602060049260405193848092635c60da1b60e01b82525afa918215610200576000926101b9575b509060008083602061019595519101845af43d156101b1573d9161017883610304565b9261018660405194856102b7565b83523d6000602085013e61031f565b505b608052604051610196908161038182396080518160460152f35b60609161031f565b91506020823d6020116101f8575b816101d4602093836102b7565b810103126101f3576000806101eb610195946102f0565b935050610155565b600080fd5b3d91506101c7565b6040513d6000823e3d90fd5b505034156101975763b398979f60e01b60005260046000fd5b634c9c8ce360e01b60009081526001600160a01b0391909116600452602490fd5b90506020813d602011610278575b81610261602093836102b7565b810103126101f357610272906102f0565b386100f8565b3d9150610254565b50631933b43b60e21b60009081526001600160a01b0391909116600452602490fd5b8060208092840101518282870101520161007a565b601f909101601f19168101906001600160401b038211908210176102da57604052565b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036101f357565b6001600160401b0381116102da57601f01601f191660200190565b90610345575080511561033457805190602001fd5b63d6bda27560e01b60005260046000fd5b81511580610377575b610356575090565b639996b31560e01b60009081526001600160a01b0391909116600452602490fd5b50803b1561034e56fe60806040527f5c60da1b000000000000000000000000000000000000000000000000000000006080526020608060048173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa801561010a5760009015610168575060203d602011610103575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f820116608001906080821067ffffffffffffffff8311176100d4576100cf91604052608001610116565b610168565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b503d610082565b6040513d6000823e3d90fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8060209101126101635760805173ffffffffffffffffffffffffffffffffffffffff811681036101635790565b600080fd5b60008091368280378136915af43d6000803e15610184573d6000f35b3d6000fdfea164736f6c634300081c000aa164736f6c634300081c000a
Deployed Bytecode
0x608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a714611a585750806307e2cea514611a1d5780630c8ed197146119c65780631695d7fa146119a8578063248a9ca3146119535780632a3fac76146119355780632b4656c8146110ff5780632f2ff15d1461109f5780633174cf241461108157806336568abe146110235780635305cbdc14610a2f5780635c60da1b14610a085780635c975abb146109c65780636f1bd377146109445780637efca244146108d357806380968d48146108b057806384b0196e146107245780638cfc2ef3146106fd5780639010d07c146106a957806391d148541461063d57806393825c8e14610603578063a217fddf146105e7578063a3246ad314610554578063a540254414610536578063a97e5c93146104ac578063b1283e7714610469578063bedb86fb14610314578063c7876ea4146102f6578063c89039c5146102d0578063ca15c87314610287578063d547741f1461021e578063de4b3262146101d65763f32f6f6a1461018c57600080fd5b346101d35760206003193601126101d3576004356101a8611d8d565b806004557fa4c89632be072fc66d9eea43ab7a1e288631501bd73c165a580f2700f10452638280a280f35b80fd5b50346101d35760206003193601126101d3576004356101f3611d8d565b806003557f80aea7bc7211a36da3d6883a7abe8f35c4623b271fca7dcfada4008782d930f08280a280f35b50346101d35760406003193601126101d35761028360043561023e611b4a565b9061027e610279826000527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260016040600020015490565b611df9565b611ed1565b5080f35b50346101d35760206003193601126101d357604060209160043581527fc1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e8237170593200083522054604051908152f35b50346101d357806003193601126101d3576001600160a01b036020915416604051908152f35b50346101d357806003193601126101d3576020600354604051908152f35b50346101d35760206003193601126101d35760043580151581036104655761033a611d8d565b156103bf57610347611f26565b600160ff197fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005416177fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a180f35b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff81161561043d5760ff19167fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a180f35b6004827f8dfc202b000000000000000000000000000000000000000000000000000000008152fd5b5080fd5b50346101d35760206003193601126101d357600435906007548210156101d35760206001600160a01b0361049c84611be4565b90549060031b1c16604051908152f35b50346101d35760206003193601126101d3576001600160a01b0360406104d0611b2f565b927f68e79a7bf1e0bc45d0a330c573bc367f9cf464fd326078812f301165fbda4ef181527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052209116600052602052602060ff604060002054166040519015158152f35b50346101d357806003193601126101d3576020600754604051908152f35b50346101d35760206003193601126101d35760043581527fc1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e8237170593200060205260408120604051918260208354918281520192825260208220915b8181106105d1576105cd856105c181870382611c2d565b60405191829182611b60565b0390f35b82548452602090930192600192830192016105aa565b50346101d357806003193601126101d357602090604051908152f35b50346101d35760206003193601126101d3576001600160a01b0360406020928261062b611b2f565b16815260088452205416604051908152f35b50346101d35760406003193601126101d3576001600160a01b036040610661611b4a565b9260043581527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052209116600052602052602060ff604060002054166040519015158152f35b50346101d35760406003193601126101d3576001600160a01b0361049c60209260043581527fc1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e82371705932000845260406024359120611c15565b50346101d357806003193601126101d35760206001600160a01b0360025416604051908152f35b50346101d357806003193601126101d3577fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100541580610887575b15610829576107cd9061076f611fb5565b906107786120ac565b9060206107db6040519361078c8386611c2d565b83855260003681376040519687967f0f00000000000000000000000000000000000000000000000000000000000000885260e08589015260e0880190611ba3565b908682036040880152611ba3565b904660608601523060808601528260a086015284820360c08601528080855193848152019401925b82811061081257505050500390f35b835185528695509381019392810192600101610803565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a656400000000000000000000006044820152fd5b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d101541561075e565b50346101d35760406003193601126101d3576105cd6105c1602435600435611cb5565b50346101d35760206003193601126101d3576001600160a01b036108f5611b2f565b6108fd611d8d565b168073ffffffffffffffffffffffffffffffffffffffff1960025416176002557f22c6ccfb87242fd98bb11a23ba576652ef9068e68ccd290d1c15183d174149728280a280f35b50346101d35760206003193601126101d357600435610961611d8d565b6706f05b59d3b20000811161099b57806006557f8e52cb348672f71cac27fda70a2328fe1e1a83f1336e467b2764b653d96311c38280a280f35b7f0509500d000000000000000000000000000000000000000000000000000000008252600452602490fd5b50346101d357806003193601126101d357602060ff7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330054166040519015158152f35b50346101d357806003193601126101d35760206001600160a01b0360015416604051908152f35b50346101d35760206003193601126101d3576004359067ffffffffffffffff82116101d3578160040190823603608060031982011261046557610a70611f26565b6001600160a01b03610a8184611c66565b16825260086020526001600160a01b03604083205416610fe657604484013590814211610fba57610ab184611c66565b6024860135926005841015610fb65790604291604051906001600160a01b0360208301937f353a53f63b8c0f50252c7b8a0856b6494f1677262a6575b981e39bc744d5a7fc8552336040850152166060830152610b116080830187611c7a565b60a082015260a08152610b2560c082611c2d565b519020610b30612707565b610b38612771565b6040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a08152610b8960c082611c2d565b51902090604051917f190100000000000000000000000000000000000000000000000000000000000083526002830152602282015220947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd60648201359201821215610f5a570193600485013567ffffffffffffffff8111610f5a57602486018136038113610fb65760405196610c2a601f8401601f191660200189611c2d565b8288526020600484369301010111610fb65791846020838994610c579683610c609c013784010152612431565b9095919561246d565b7f68e79a7bf1e0bc45d0a330c573bc367f9cf464fd326078812f301165fbda4ef182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604082206001600160a01b038516835260205260ff60408320541615610f7d57610cd083611c66565b6040516001600160a01b03602082019216825260208152610cf2604082611c2d565b5190206040516105178082019082821067ffffffffffffffff831117610f5e5760609183916127b783393081526040602082015286604082015203019084f58015610f72576001600160a01b03610d4a911693611c66565b600354926005549260065492600454906040519060c0820182811067ffffffffffffffff821117610f5e57906001600160a01b03916040521681526020810196875260408101958652606081019485526080810191825260a08101928352873b15610f5a576040517fec7e2f9f0000000000000000000000000000000000000000000000000000000081526001600160a01b03825116600482015287516024820152865160448201528551606482015282516084820152610e10845160a4830190611c7a565b848160c481838d5af18015610f4f57610f3b575b506001600160a01b0381511684526008602052604084208873ffffffffffffffffffffffffffffffffffffffff1982541617905560075468010000000000000000811015610f275790610e858260016001600160a01b039401600755611be4565b81549060031b90848c831b921b191617905551169551945193519151926005841015610f1357506020978794610f037fff1f4ccdad21dce561716efeb08399bc3e61221264b5bff2b041dad8796e373a9560c0956001600160a01b039551936040519a338c528e8c015260408b015260608a01526080890190611c7a565b60a08701521693a4604051908152f35b80634e487b7160e01b602492526021600452fd5b602485634e487b7160e01b81526041600452fd5b84610f4891959295611c2d565b9238610e24565b6040513d87823e3d90fd5b8380fd5b602486634e487b7160e01b81526041600452fd5b6040513d84823e3d90fd5b6044826001600160a01b03867f759a617c0000000000000000000000000000000000000000000000000000000083521660045233602452fd5b8480fd5b602483837f327e84a1000000000000000000000000000000000000000000000000000000008252600452fd5b506001600160a01b03610ffa602493611c66565b7f4ae2d66700000000000000000000000000000000000000000000000000000000835216600452fd5b50346101d35760406003193601126101d35761103d611b4a565b336001600160a01b038216036110595761028390600435611ed1565b6004827f6697b232000000000000000000000000000000000000000000000000000000008152fd5b50346101d357806003193601126101d3576020600454604051908152f35b50346101d35760406003193601126101d3576102836004356110bf611b4a565b906110fa610279826000527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260016040600020015490565b611e78565b50346101d35760e06003193601126101d357611119611b2f565b611121611b4a565b6044356001600160a01b038116809103610f5a577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549160ff8360401c16159267ffffffffffffffff81168015908161192d575b6001149081611923575b15908161191a575b506118f2578360017fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008316177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005561189d575b506111e3612181565b6111eb612181565b6111f3612181565b60ff197fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330054167fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330055604093845161124a8682611c2d565b600d81527f4d61726b6574466163746f72790000000000000000000000000000000000000060208201528551906112818783611c2d565b600182527f310000000000000000000000000000000000000000000000000000000000000060208301526112b3612181565b6112bb612181565b80519067ffffffffffffffff82116118895781906112f97fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10254611f7b565b601f81116117fc575b50602090601f831160011461175b578a92611750575b50506000198260011b9260031b1c1916177fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102555b80519067ffffffffffffffff821161173c576113887fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10354611f7b565b601f81116116ba575b50602090601f831160011461160b5791806001600160a01b0395949286948b92611600575b50506000198260011b9260031b1c1916177fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d103555b877fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10055877fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10155611439336121da565b6115c7575b611446611f26565b600160ff197fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005416177fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25860208851338152a11673ffffffffffffffffffffffffffffffffffffffff1960015416176001551673ffffffffffffffffffffffffffffffffffffffff1985541617845573ffffffffffffffffffffffffffffffffffffffff19600254161760025560643560035560843560055560a43560065560c435600455611534575080f35b60207fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2917fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00555160018152a180f35b8780527fc1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e823717059320006020526115fa33888a2061252a565b5061143e565b0151905038806113b6565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10389528189209190601f1984168a5b8181106116a257509260019285926001600160a01b0398979596899710611689575b505050811b017fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d103556113ea565b015160001960f88460031b161c1916905538808061165c565b9293602060018192878601518155019501930161163a565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10389527f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b75601f840160051c81019160208510611732575b601f0160051c01905b8181106117275750611391565b89815560010161171a565b9091508190611711565b602488634e487b7160e01b81526041600452fd5b015190503880611318565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1028b52818b2092601f19168b5b8181106117e457509084600195949392106117cb575b505050811b017fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1025561134c565b015160001960f88460031b161c1916905538808061179e565b92936020600181928786015181550195019301611788565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1028b529091507f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d601f840160051c8101916020851061187f575b90601f859493920160051c01905b8181106118715750611302565b8b8155849350600101611864565b9091508190611856565b602489634e487b7160e01b81526041600452fd5b7fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000001668010000000000000001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055386111da565b6004867ff92ee8a9000000000000000000000000000000000000000000000000000000008152fd5b90501538611187565b303b15915061117f565b859150611175565b50346101d357806003193601126101d3576020600554604051908152f35b50346101d35760206003193601126101d35760206119a06004356000527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260016040600020015490565b604051908152f35b50346101d357806003193601126101d3576020600654604051908152f35b50346101d35760206003193601126101d3576004356119e3611d8d565b6706f05b59d3b20000811161099b57806005557f90607dee8cbbda4aae7a7397a27120bc1291b996d7e95bd426822b0eda2535948280a280f35b50346101d357806003193601126101d35760206040517f68e79a7bf1e0bc45d0a330c573bc367f9cf464fd326078812f301165fbda4ef18152f35b905034610465576020600319360112610465576004357fffffffff000000000000000000000000000000000000000000000000000000008116809103611b2b57602092507f5a05180f000000000000000000000000000000000000000000000000000000008114908115611ace575b5015158152f35b7f7965db0b00000000000000000000000000000000000000000000000000000000811491508115611b01575b5038611ac7565b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438611afa565b8280fd5b600435906001600160a01b0382168203611b4557565b600080fd5b602435906001600160a01b0382168203611b4557565b602060408183019282815284518094520192019060005b818110611b845750505090565b82516001600160a01b0316845260209384019390920191600101611b77565b919082519283825260005b848110611bcf575050601f19601f8460006020809697860101520116010190565b80602080928401015182828601015201611bae565b600754811015611bff57600760005260206000200190600090565b634e487b7160e01b600052603260045260246000fd5b8054821015611bff5760005260206000200190600090565b90601f601f19910116810190811067ffffffffffffffff821117611c5057604052565b634e487b7160e01b600052604160045260246000fd5b356001600160a01b0381168103611b455790565b906005821015611c875752565b634e487b7160e01b600052602160045260246000fd5b67ffffffffffffffff8111611c505760051b60200190565b906007549081831015611d7057828203918211611d5257808211611d68575b50611cde81611c9d565b91611cec6040519384611c2d565b818352601f19611cfb83611c9d565b0136602085013760005b828110611d125750505090565b818101808211611d5257611d2d6001600160a01b0391611be4565b90549060031b1c16908451811015611bff5760019160208260051b8701015201611d05565b634e487b7160e01b600052601160045260246000fd5b905038611cd4565b505050604051611d81602082611c2d565b60008152600036813790565b3360009081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff1615611dc657565b7fe2517d3f0000000000000000000000000000000000000000000000000000000060005233600452600060245260446000fd5b806000527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260406000206001600160a01b03331660005260205260ff6040600020541615611e475750565b7fe2517d3f000000000000000000000000000000000000000000000000000000006000523360045260245260446000fd5b611e82828261228c565b9182611e8d57505090565b611ecd916000527fc1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e823717059320006020526001600160a01b03604060002091169061252a565b5090565b611edb8282612364565b9182611ee657505090565b611ecd916000527fc1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e823717059320006020526001600160a01b0360406000209116906125a0565b60ff7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005416611f5157565b7fd93c06650000000000000000000000000000000000000000000000000000000060005260046000fd5b90600182811c92168015611fab575b6020831014611f9557565b634e487b7160e01b600052602260045260246000fd5b91607f1691611f8a565b604051906000827fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1025491611fe883611f7b565b808352926001811690811561208d575060011461200e575b61200c92500383611c2d565b565b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102600090815290917f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d5b81831061207157505090602061200c92820101612000565b6020919350806001915483858901015201910190918492612059565b6020925061200c94915060ff191682840152151560051b820101612000565b604051906000827fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10354916120df83611f7b565b808352926001811690811561208d57506001146121025761200c92500383611c2d565b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d103600090815290917f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b755b81831061216557505090602061200c92820101612000565b602091935080600191548385890101520191019091849261214d565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c16156121b057565b7fd7e6bcf80000000000000000000000000000000000000000000000000000000060005260046000fd5b6001600160a01b03811660009081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16612286576001600160a01b031660008181527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d60205260408120805460ff191660011790553391907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8180a4600190565b50600090565b806000527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260406000206001600160a01b03831660005260205260ff604060002054161560001461235d57806000527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260406000206001600160a01b0383166000526020526040600020600160ff198254161790556001600160a01b03339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d600080a4600190565b5050600090565b806000527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260406000206001600160a01b03831660005260205260ff6040600020541660001461235d57806000527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260406000206001600160a01b038316600052602052604060002060ff1981541690556001600160a01b03339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b600080a4600190565b81519190604183036124625761245b92506020820151906060604084015193015160001a90612672565b9192909190565b505060009160029190565b9190916004811015611c87578061248357509050565b6000600182036124b7577ff645eedf0000000000000000000000000000000000000000000000000000000060005260046000fd5b50600281036124ee57827ffce698f70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b90916003600092146124fe575050565b602492507fd78bce0c000000000000000000000000000000000000000000000000000000008252600452fd5b600181019082600052816020526040600020541560001461259857805468010000000000000000811015611c505761258361256c826001879401855584611c15565b81939154906000199060031b92831b921b19161790565b90555491600052602052604060002055600190565b505050600090565b9060018201918160005282602052604060002054801515600014612669576000198101818111611d52578254906000198201918211611d5257818103612632575b5050508054801561261c5760001901906125fb8282611c15565b60001982549160031b1b191690555560005260205260006040812055600190565b634e487b7160e01b600052603160045260246000fd5b61265261264261256c9386611c15565b90549060031b1c92839286611c15565b9055600052836020526040600020553880806125e1565b50505050600090565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116126fb579160209360809260ff60009560405194855216868401526040830152606082015282805260015afa156126ef576000516001600160a01b038116156126e35790600090600090565b50600090600190600090565b6040513d6000823e3d90fd5b50505060009160039190565b61270f611fb5565b805190811561271f576020012090565b50507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10054801561274c5790565b507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47090565b6127796120ac565b8051908115612789576020012090565b50507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10154801561274c579056fe60a080604052610517803803809161001782856102b7565b833981016040828203126101f35761002e826102f0565b602083015190926001600160401b0382116101f3570181601f820112156101f35780519061005b82610304565b9261006960405194856102b7565b828452602083830101116101f35760005b8281106102a2575050602060009183010152813b15610280577fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b038416908117909155604051635c60da1b60e01b8152909190602081600481865afa90811561020057600091610246575b50803b156102255750817f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e600080a280511561020c57602060049260405193848092635c60da1b60e01b82525afa918215610200576000926101b9575b509060008083602061019595519101845af43d156101b1573d9161017883610304565b9261018660405194856102b7565b83523d6000602085013e61031f565b505b608052604051610196908161038182396080518160460152f35b60609161031f565b91506020823d6020116101f8575b816101d4602093836102b7565b810103126101f3576000806101eb610195946102f0565b935050610155565b600080fd5b3d91506101c7565b6040513d6000823e3d90fd5b505034156101975763b398979f60e01b60005260046000fd5b634c9c8ce360e01b60009081526001600160a01b0391909116600452602490fd5b90506020813d602011610278575b81610261602093836102b7565b810103126101f357610272906102f0565b386100f8565b3d9150610254565b50631933b43b60e21b60009081526001600160a01b0391909116600452602490fd5b8060208092840101518282870101520161007a565b601f909101601f19168101906001600160401b038211908210176102da57604052565b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036101f357565b6001600160401b0381116102da57601f01601f191660200190565b90610345575080511561033457805190602001fd5b63d6bda27560e01b60005260046000fd5b81511580610377575b610356575090565b639996b31560e01b60009081526001600160a01b0391909116600452602490fd5b50803b1561034e56fe60806040527f5c60da1b000000000000000000000000000000000000000000000000000000006080526020608060048173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa801561010a5760009015610168575060203d602011610103575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f820116608001906080821067ffffffffffffffff8311176100d4576100cf91604052608001610116565b610168565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b503d610082565b6040513d6000823e3d90fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8060209101126101635760805173ffffffffffffffffffffffffffffffffffffffff811681036101635790565b600080fd5b60008091368280378136915af43d6000803e15610184573d6000f35b3d6000fdfea164736f6c634300081c000aa164736f6c634300081c000a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.