Source Code
Overview
MON Balance
MON Value
$0.00| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Advanced mode: Intended for advanced users or developers and will display all Internal Transactions including zero value transfers.
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | ||||
|---|---|---|---|---|---|---|---|
| 50970669 | 9 mins ago | 0 MON | |||||
| 50970669 | 9 mins ago | 0 MON | |||||
| 50970669 | 9 mins ago | 0 MON | |||||
| 50970659 | 9 mins ago | 0 MON | |||||
| 50970659 | 9 mins ago | 0 MON | |||||
| 50970659 | 9 mins ago | 0 MON | |||||
| 50970341 | 11 mins ago | 0 MON | |||||
| 50970341 | 11 mins ago | 0 MON | |||||
| 50970110 | 12 mins ago | 0 MON | |||||
| 50970110 | 12 mins ago | 0 MON | |||||
| 50970110 | 12 mins ago | 0 MON | |||||
| 50970110 | 12 mins ago | 0 MON | |||||
| 50969832 | 14 mins ago | 0 MON | |||||
| 50969832 | 14 mins ago | 0 MON | |||||
| 50969832 | 14 mins ago | 0 MON | |||||
| 50969812 | 14 mins ago | 0 MON | |||||
| 50969812 | 14 mins ago | 0 MON | |||||
| 50965917 | 40 mins ago | 0 MON | |||||
| 50965917 | 40 mins ago | 0 MON | |||||
| 50965917 | 40 mins ago | 0 MON | |||||
| 50965917 | 40 mins ago | 0 MON | |||||
| 50965463 | 43 mins ago | 0 MON | |||||
| 50965463 | 43 mins ago | 0 MON | |||||
| 50965463 | 43 mins ago | 0 MON | |||||
| 50965463 | 43 mins ago | 0 MON |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Pool
Compiler Version
v0.8.33+commit.64118f21
Optimization Enabled:
Yes with 1000 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.33;
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "@uniswap/lib/contracts/libraries/TransferHelper.sol";
import "./interfaces/IPool.sol";
import "./libraries/FixedMath.sol";
contract Pool is OwnableUpgradeable, IPool {
using FixedMath for *;
mapping(uint256 => Index) public indexes;
mapping(address => ReserveData) public reserves;
mapping(address => mapping(uint256 => mapping(address => Share))) public shares;
mapping(address => bool) public allowedTraders;
uint256 public defaultVirtualFund;
address public positionsManager;
address public poolManager;
uint64 public minimumFreeReserveShare;
uint64 public lockupPeriod;
bool public tradingIsPaused;
bool internal _liquidatePositions;
uint256 public maximumPositionLoad;
modifier onlyPoolManager() {
if (msg.sender != poolManager) revert OnlyPoolManager(poolManager);
_;
}
/// @custom:oz-upgrades-unsafe-allow constructor
constructor() {
_disableInitializers();
}
function initialize(address positionsManager_) external initializer {
__Ownable_init(msg.sender);
positionsManager = positionsManager_;
}
/**
* @notice Owner: Updates the address of the market data manager.
* @dev Reverts if the new address is the same as the current marketDataManager.
* @param newPoolManager The new address for the market data manager.
*/
function changePoolManager(address newPoolManager) external onlyOwner {
if (newPoolManager == poolManager) revert NoChanges();
poolManager = newPoolManager;
emit PoolManagerChanged(newPoolManager);
}
/**
* @notice Owner: Updates the global lockup period for liquidity withdrawals.
* @dev Reverts if the new lockup period is the same as the current one.
* @param newLockupPeriod The new lockup duration in seconds.
*/
function changeLockupPeriod(uint64 newLockupPeriod) external onlyOwner {
if (newLockupPeriod == lockupPeriod) revert NoChanges();
lockupPeriod = newLockupPeriod;
emit LockupPeriodChanged(newLockupPeriod);
}
/**
* @notice Owner: Updates the default virtual fund value.
* @param newDefaultVirtualFund The new default virtual fund amount.
*
*/
function changeDefaultVirtualFund(uint256 newDefaultVirtualFund) external onlyOwner {
if (defaultVirtualFund == newDefaultVirtualFund) revert NoChanges();
defaultVirtualFund = newDefaultVirtualFund;
emit DefaultVirtualFundChanged(newDefaultVirtualFund);
}
/**
* @notice Owner: Updates the minimum collateral requirement for a given token.
* @param token The address of the collateral token to update.
* @param minimumCollateral The new minimum collateral amount to set for the token.
*/
function changeMinimumCollateral(address token, uint256 minimumCollateral) external onlyOwner {
ReserveData storage reserve = reserves[token];
if (reserve.minimumCollateral == minimumCollateral) revert NoChanges();
reserve.minimumCollateral = minimumCollateral;
emit MinimumCollateralChanged(token, minimumCollateral);
}
/**
* @notice Owner: Updates the minimum reserve buffer share for all tokens.
* @notice The reserve buffer defines the fraction of pool liquidity that must remain
* unencumbered (i.e., cannot be locked or withdrawn).
* @param newMinimumFreeReserveShare The new minimum reserve buffer share (scaled by 1e18).
*/
function changeMinimumFreeReserveShare(uint64 newMinimumFreeReserveShare) external onlyOwner {
if (newMinimumFreeReserveShare == minimumFreeReserveShare) revert NoChanges();
newMinimumFreeReserveShare.requireLessThanOne();
minimumFreeReserveShare = newMinimumFreeReserveShare;
emit MinimumFreeReserveShareChanged(newMinimumFreeReserveShare);
}
/**
* @notice Owner: Changes token permission status.
* @param token The token address.
* @param isAllowed Whether the token is allowed for deposits.
*/
function changeTokenStatus(address token, bool isAllowed) external onlyOwner {
ReserveData storage reserve = reserves[token];
if (reserve.isAllowed == isAllowed) revert NoChanges();
reserve.isAllowed = isAllowed;
if (reserve.exchangeRate == 0) {
reserve.exchangeRate = FixedMath.ONE;
}
emit TokenStatusChanged(token, isAllowed);
}
function changeMaximumPositionLoad(uint256 newMaximumPositionLoad) external onlyOwner {
if (maximumPositionLoad == newMaximumPositionLoad) revert NoChanges();
maximumPositionLoad = newMaximumPositionLoad;
emit MaximumPositionLoadChanged(newMaximumPositionLoad);
}
/**
* @notice PoolManager: Changes the permission status of an index.
* @param indexId The ID of the index.
* @param isAllowed Whether the index is enabled for trading.
*/
function changeIndexStatus(uint256 indexId, bool isAllowed) external onlyPoolManager {
if (indexes[indexId].isAllowed == isAllowed) revert NoChanges();
indexes[indexId].isAllowed = isAllowed;
emit IndexStatusChanged(indexId, isAllowed);
}
/**
* @notice PoolManager: Updates the virtual fund value of a specific index.
* @param indexId The ID of the index whose virtual fund is being updated.
* @param newVirtualFund The new virtual fund amount to assign to the index.
*
*/
function changeVirtualFund(uint256 indexId, uint256 newVirtualFund) external onlyPoolManager {
if (indexes[indexId].virtualFund == newVirtualFund) revert NoChanges();
indexes[indexId].virtualFund = newVirtualFund;
emit VirtualFundChanged(indexId, newVirtualFund);
}
/**
* @notice PoolManager: Updates whether multiple traders are allowed to trade in the pool.
* @param traders The list of trader addresses whose statuses are being updated.
* @param areAllowed Boolean flag applied to all provided traders:
*/
function changeTradersStatus(
address[] calldata traders,
bool areAllowed
) external onlyPoolManager {
if (traders.length == 0) return;
for (uint i; i < traders.length; ) {
allowedTraders[traders[i]] = areAllowed;
unchecked {
i += 1;
}
}
emit TradersStatusChanged(traders, areAllowed);
}
/**
* @notice Pauses trading.
* @param liquidatePositions_ Whether positions should be liquidated on pause.
*/
function pauseTrading(bool liquidatePositions_) external onlyPoolManager {
if (tradingIsPaused) revert NoChanges();
tradingIsPaused = true;
_liquidatePositions = liquidatePositions_;
emit TradingPaused(liquidatePositions_);
}
/**
* @notice Unpauses trading.
*/
function unpauseTrading() external onlyPoolManager {
if (!tradingIsPaused) revert NoChanges();
tradingIsPaused = false;
_liquidatePositions = false;
emit TradingUnpaused();
}
/**
* @notice Updates metadata for an index.
* @dev Callable only by the PoolManager. Writes fields into `indexes[indexId]`
* and emits {IndexDataUpdated}.
* @param indexId The ID of the index to update.
* @param title The human-readable title for the index.
* @param slug A short identifier (typically URL-friendly) for the index.
* @param image An image URL / URI (e.g., IPFS or HTTPS) representing the index.
*/
function updateIndexData(
uint256 indexId,
string calldata title,
string calldata slug,
string calldata image
) external onlyPoolManager {
Index storage index = indexes[indexId];
index.title = title;
index.slug = slug;
index.image = image;
emit IndexDataUpdated(indexId, title, slug, "", image);
}
/**
* @notice Adds liquidity to the pool.
* @param token Token to deposit.
* @param amount Amount to deposit.
*/
function addLiquidity(address token, uint256 amount) external {
ReserveData storage reserve = reserves[token];
if (!reserve.isAllowed) revert TokenNotAllowed(token);
if (amount == 0) revert ZeroAmount();
reserve.totalReserve += amount;
uint256 shareAmount = amount.div(reserve.exchangeRate);
if (shareAmount == 0) revert ZeroShare();
uint256 withdrawAfter = block.timestamp + lockupPeriod;
Share storage share = shares[token][reserve.revision][msg.sender];
share.amount += shareAmount;
share.withdrawAfter = withdrawAfter;
TransferHelper.safeTransferFrom(token, msg.sender, address(this), amount);
emit LiquidityAdded(token, msg.sender, amount, shareAmount, withdrawAfter);
}
/**
* @notice Withdraws liquidity from the pool.
* @param token Token to withdraw.
* @param amount Amount to withdraw (if greater than balance, withdraws max).
*/
function withdrawLiquidity(address token, uint256 amount) external {
if (amount == 0) revert ZeroAmount();
ReserveData storage reserve = reserves[token];
Share storage share = shares[token][reserve.revision][msg.sender];
if (block.timestamp < share.withdrawAfter) {
revert LockupPeriod(share.withdrawAfter - block.timestamp);
}
uint256 userBalance = share.amount.mul(reserve.exchangeRate);
if (userBalance == 0) revert ZeroBalance(token, msg.sender);
if (amount > userBalance) amount = userBalance;
uint256 shareAmount = amount.div(reserve.exchangeRate);
if (shareAmount == 0) revert ZeroShare();
share.amount -= shareAmount;
reserve.totalReserve -= amount;
_checkFreeLiquidity(reserve);
TransferHelper.safeTransfer(token, msg.sender, amount);
emit LiquidityWithdrawn(token, msg.sender, amount, shareAmount);
}
/**
* @notice PositionsManager: Adjusts the reserve based on trade outcome (profit or loss).
* @param collateralToken Token used as collateral.
* @param deltaReserve Profit/loss of the pool.
* @param deltaLocked Locked/unlocked amount of reserve.
*/
function adjustReserve(
address collateralToken,
int256 deltaReserve,
int256 deltaLocked
) external {
if (msg.sender != positionsManager) revert OnlyPositionsManager(positionsManager);
ReserveData storage reserve = reserves[collateralToken];
if (deltaReserve != 0) {
uint256 previousReserve = reserve.totalReserve;
if (deltaReserve > 0) {
uint256 profit = uint256(deltaReserve);
reserve.totalReserve += profit;
TransferHelper.safeTransferFrom(collateralToken, msg.sender, address(this), profit);
} else {
uint256 loss = uint256(-deltaReserve);
if (loss > previousReserve) revert InsufficientLiquidity();
reserve.totalReserve -= loss;
TransferHelper.safeTransfer(collateralToken, msg.sender, loss);
}
if (previousReserve > 0) {
uint256 exchangeRate = (reserve.exchangeRate * reserve.totalReserve) /
previousReserve;
if (exchangeRate > 0) {
reserve.exchangeRate = exchangeRate;
} else {
reserve.totalReserve = 0;
reserve.exchangeRate = FixedMath.ONE;
++reserve.revision;
}
}
emit ReserveAdjusted(collateralToken, deltaReserve);
}
if (deltaLocked != 0) {
if (deltaLocked > 0) {
reserve.lockedReserve += uint256(deltaLocked);
_checkFreeLiquidity(reserve);
} else {
if (uint256(-deltaLocked) > reserve.lockedReserve)
revert InsufficientLockedLiquidity();
reserve.lockedReserve -= uint256(-deltaLocked);
}
emit LockedReserveAdjusted(collateralToken, deltaLocked);
}
}
/**
* @notice Returns public metadata for a given index.
* @param indexId The unique identifier of the index.
* @return title Human-readable index title.
* @return slug URL-friendly index identifier.
* @return image Image URL representing the index.
*/
function getIndexData(
uint256 indexId
) external view returns (string memory title, string memory slug, string memory image) {
Index storage index = indexes[indexId];
return (index.title, index.slug, index.image);
}
/**
* @notice Retrieves the virtual fund value associated with a specific index or default.
*/
function getVirtualFund(uint256 indexId) external view returns (uint256) {
uint256 virtualFund = indexes[indexId].virtualFund;
return virtualFund > 0 ? virtualFund : defaultVirtualFund;
}
/**
* @notice Validates if the provided trade parameters are permitted.
* @param indexId The ID of the index to be validated.
* @param collateralToken The address of the collateral token to be validated.
* @param collateralAmount The amount of the collateral token to be validated.
*/
function validateTrade(
address trader,
uint256 indexId,
address collateralToken,
uint256 collateralAmount,
uint256 positionLoad
) external view returns (TradeDecisionReason) {
ReserveData storage reserve = reserves[collateralToken];
if (!reserve.isAllowed) return TradeDecisionReason.TOKEN_NOT_ALLOWED;
if (collateralAmount < reserve.minimumCollateral)
return TradeDecisionReason.INSUFFICIENT_COLLATERAL;
if (tradingIsPaused)
return
_liquidatePositions
? TradeDecisionReason.TRADING_PAUSED_HARD
: TradeDecisionReason.TRADING_PAUSED_SOFT;
if (!allowedTraders[trader]) return TradeDecisionReason.TRADER_NOT_ALLOWED;
if (!indexes[indexId].isAllowed) return TradeDecisionReason.INDEX_NOT_ALLOWED;
if (positionLoad > maximumPositionLoad)
return TradeDecisionReason.MAXIMUM_POSITION_LOAD_REACHED;
return TradeDecisionReason.NONE;
}
/**
* @notice Computes the current balance of a user in a specific token.
* @param token The token to check.
* @param account The account to query.
* @return The token-equivalent value of the user's shares.
*/
function balanceOf(address token, address account) external view returns (uint256) {
ReserveData storage reserve = reserves[token];
return shares[token][reserve.revision][account].amount.mul(reserve.exchangeRate);
}
/**
* @notice Checks that the reserve keeps the minimum free liquidity share.
* @param reserve Reserve data to validate.
*/
function _checkFreeLiquidity(ReserveData storage reserve) internal view {
if (
reserve.totalReserve.mul(FixedMath.ONE - minimumFreeReserveShare) <
reserve.lockedReserve
) revert InsufficientFreeLiquidity();
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {ContextUpgradeable} from "../utils/ContextUpgradeable.sol";
import {Initializable} from "../proxy/utils/Initializable.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {
/// @custom:storage-location erc7201:openzeppelin.storage.Ownable
struct OwnableStorage {
address _owner;
}
// keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Ownable")) - 1)) & ~bytes32(uint256(0xff))
bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300;
function _getOwnableStorage() private pure returns (OwnableStorage storage $) {
assembly {
$.slot := OwnableStorageLocation
}
}
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
function __Ownable_init(address initialOwner) internal onlyInitializing {
__Ownable_init_unchained(initialOwner);
}
function __Ownable_init_unchained(address initialOwner) internal onlyInitializing {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
OwnableStorage storage $ = _getOwnableStorage();
return $._owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
OwnableStorage storage $ = _getOwnableStorage();
address oldOwner = $._owner;
$._owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.3.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 {
* function initializeV2() reinitializer(2) public {
* __ERC20Permit_init("MyToken");
* }
* }
* ```
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*
* [CAUTION]
* ====
* Avoid leaving a contract uninitialized.
*
* An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
* contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke
* the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:
*
* [.hljs-theme-light.nopadding]
* ```
* /// @custom:oz-upgrades-unsafe-allow constructor
* constructor() {
* _disableInitializers();
* }
* ```
* ====
*/
abstract contract Initializable {
/**
* @dev Storage of the initializable contract.
*
* It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions
* when using with upgradeable contracts.
*
* @custom:storage-location erc7201:openzeppelin.storage.Initializable
*/
struct InitializableStorage {
/**
* @dev Indicates that the contract has been initialized.
*/
uint64 _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool _initializing;
}
// keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Initializable")) - 1)) & ~bytes32(uint256(0xff))
bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;
/**
* @dev The contract is already initialized.
*/
error InvalidInitialization();
/**
* @dev The contract is not initializing.
*/
error NotInitializing();
/**
* @dev Triggered when the contract has been initialized or reinitialized.
*/
event Initialized(uint64 version);
/**
* @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,
* `onlyInitializing` functions can be used to initialize parent contracts.
*
* Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any
* number of times. This behavior in the constructor can be useful during testing and is not expected to be used in
* production.
*
* Emits an {Initialized} event.
*/
modifier initializer() {
// solhint-disable-next-line var-name-mixedcase
InitializableStorage storage $ = _getInitializableStorage();
// Cache values to avoid duplicated sloads
bool isTopLevelCall = !$._initializing;
uint64 initialized = $._initialized;
// Allowed calls:
// - initialSetup: the contract is not in the initializing state and no previous version was
// initialized
// - construction: the contract is initialized at version 1 (no reinitialization) and the
// current contract is just being deployed
bool initialSetup = initialized == 0 && isTopLevelCall;
bool construction = initialized == 1 && address(this).code.length == 0;
if (!initialSetup && !construction) {
revert InvalidInitialization();
}
$._initialized = 1;
if (isTopLevelCall) {
$._initializing = true;
}
_;
if (isTopLevelCall) {
$._initializing = false;
emit Initialized(1);
}
}
/**
* @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the
* contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be
* used to initialize parent contracts.
*
* A reinitializer may be used after the original initialization step. This is essential to configure modules that
* are added through upgrades and that require initialization.
*
* When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`
* cannot be nested. If one is invoked in the context of another, execution will revert.
*
* Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in
* a contract, executing them in the right order is up to the developer or operator.
*
* WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.
*
* Emits an {Initialized} event.
*/
modifier reinitializer(uint64 version) {
// solhint-disable-next-line var-name-mixedcase
InitializableStorage storage $ = _getInitializableStorage();
if ($._initializing || $._initialized >= version) {
revert InvalidInitialization();
}
$._initialized = version;
$._initializing = true;
_;
$._initializing = false;
emit Initialized(version);
}
/**
* @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
* {initializer} and {reinitializer} modifiers, directly or indirectly.
*/
modifier onlyInitializing() {
_checkInitializing();
_;
}
/**
* @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.
*/
function _checkInitializing() internal view virtual {
if (!_isInitializing()) {
revert NotInitializing();
}
}
/**
* @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.
* Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized
* to any version. It is recommended to use this to lock implementation contracts that are designed to be called
* through proxies.
*
* Emits an {Initialized} event the first time it is successfully executed.
*/
function _disableInitializers() internal virtual {
// solhint-disable-next-line var-name-mixedcase
InitializableStorage storage $ = _getInitializableStorage();
if ($._initializing) {
revert InvalidInitialization();
}
if ($._initialized != type(uint64).max) {
$._initialized = type(uint64).max;
emit Initialized(type(uint64).max);
}
}
/**
* @dev Returns the highest version that has been initialized. See {reinitializer}.
*/
function _getInitializedVersion() internal view returns (uint64) {
return _getInitializableStorage()._initialized;
}
/**
* @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.
*/
function _isInitializing() internal view returns (bool) {
return _getInitializableStorage()._initializing;
}
/**
* @dev Pointer to storage slot. Allows integrators to override it with a custom storage location.
*
* NOTE: Consider following the ERC-7201 formula to derive storage locations.
*/
function _initializableStorageSlot() internal pure virtual returns (bytes32) {
return INITIALIZABLE_STORAGE;
}
/**
* @dev Returns a pointer to the storage namespace.
*/
// solhint-disable-next-line var-name-mixedcase
function _getInitializableStorage() private pure returns (InitializableStorage storage $) {
bytes32 slot = _initializableStorageSlot();
assembly {
$.slot := slot
}
}
}// 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;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity >=0.6.0;
// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
function safeApprove(
address token,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('approve(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
require(
success && (data.length == 0 || abi.decode(data, (bool))),
'TransferHelper::safeApprove: approve failed'
);
}
function safeTransfer(
address token,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('transfer(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
require(
success && (data.length == 0 || abi.decode(data, (bool))),
'TransferHelper::safeTransfer: transfer failed'
);
}
function safeTransferFrom(
address token,
address from,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
require(
success && (data.length == 0 || abi.decode(data, (bool))),
'TransferHelper::transferFrom: transferFrom failed'
);
}
function safeTransferETH(address to, uint256 value) internal {
(bool success, ) = to.call{value: value}(new bytes(0));
require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');
}
}// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.33;
interface IPool {
struct Index {
uint256 virtualFund;
bool isAllowed;
string title;
string slug;
string description;
string image;
}
struct ReserveData {
uint256 totalReserve;
uint256 lockedReserve;
uint256 exchangeRate;
uint64 revision;
bool isAllowed;
uint256 minimumCollateral;
}
struct Share {
uint256 amount;
uint256 withdrawAfter;
}
function changeTokenStatus(address token, bool isAllowed) external;
function changeIndexStatus(uint256 indexId, bool isAllowed) external;
function changeTradersStatus(address[] calldata trader, bool areAllowed) external;
function changeLockupPeriod(uint64 newLockupPeriod) external;
function changeMinimumFreeReserveShare(uint64 newMinimumFreeReserveShare) external;
function addLiquidity(address token, uint256 amount) external;
function withdrawLiquidity(address token, uint256 amount) external;
function pauseTrading(bool liquidatePositions) external;
function unpauseTrading() external;
function adjustReserve(
address collateralToken,
int256 deltaReserve,
int256 deltaLocked
) external;
function getIndexData(
uint256 indexId
) external view returns (string memory title, string memory slug, string memory image);
function getVirtualFund(uint256 indexId) external view returns (uint256);
function validateTrade(
address trader,
uint256 indexId,
address collateralToken,
uint256 collateralAmount,
uint256 positionLoad
) external view returns (TradeDecisionReason);
function balanceOf(address token, address account) external view returns (uint256);
event DefaultVirtualFundChanged(uint256 newDefaultVirtualFund);
event IndexDataUpdated(
uint256 indexed indexId,
string title,
string slug,
string description,
string image
);
event IndexStatusChanged(uint256 indexed indexId, bool isAllowed);
event LiquidityAdded(
address indexed token,
address indexed account,
uint256 amount,
uint256 weightedAmount,
uint256 withdrawAfter
);
event LiquidityWithdrawn(
address indexed token,
address indexed account,
uint256 amount,
uint256 weigtedAmount
);
event LockedReserveAdjusted(address collateralToken, int256 deltaLocked);
event LockupPeriodChanged(uint256 newLockupPeriod);
event MinimumCollateralChanged(address indexed token, uint256 minimumCollateral);
event MinimumFreeReserveShareChanged(uint256 newMinimumFreeReserveShare);
event MaximumPositionLoadChanged(uint256 newMaximumPositionLoad);
event PoolManagerChanged(address newPoolManager);
event ReserveAdjusted(address indexed token, int256 deltaReserve);
event TokenStatusChanged(address indexed token, bool isAllowed);
event TradersStatusChanged(address[] traders, bool areAllowed);
event TradingPaused(bool liquidatePositions);
event TradingUnpaused();
event VirtualFundChanged(uint256 indexId, uint256 newVirtualFund);
error InsufficientLiquidity();
error InsufficientLockedLiquidity();
error InsufficientFreeLiquidity();
error LockupPeriod(uint256 remaining);
error NoChanges();
error OnlyPoolManager(address expectedManager);
error OnlyPositionsManager(address expectedManager);
error TokenNotAllowed(address token);
error ZeroAmount();
error ZeroShare();
error ZeroBalance(address token, address account);
}
enum TradeDecisionReason {
NONE, // 0
MANUAL_CLOSE, // 1
TAKE_PROFIT, // 2
STOP_LOSS, // 3
PAYOUT_LIMIT, // 4
LIQUIDATION, // 5
INSUFFICIENT_MAINTENANCE_MARGIN, // 6
TRADING_PAUSED_HARD, // 7
TRADING_PAUSED_SOFT, // 8
TRADER_NOT_ALLOWED, // 9
TOKEN_NOT_ALLOWED, // 10
INDEX_NOT_ALLOWED, // 11
INSUFFICIENT_COLLATERAL, // 12
MAXIMUM_POSITION_LOAD_REACHED // 13
}// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.33;
library FixedMath {
error MustBeAtLeastOne(uint256 value);
error MustBeLessThanOne(uint256 value);
error Overflow();
uint256 public constant ONE = 1e18;
function mul(uint256 value, uint256 other) internal pure returns (uint256) {
return (value * other) / ONE;
}
function div(uint256 value, uint256 other) internal pure returns (uint256) {
return (value * ONE) / other;
}
function mul(uint256 value, int256 other) internal pure returns (int256) {
if (value > uint256(type(int256).max)) revert Overflow();
return (int256(value) * other) / int256(ONE);
}
function requireAtLeastOne(uint256 value) internal pure {
if (value < ONE) revert MustBeAtLeastOne(value);
}
function requireLessThanOne(uint256 value) internal pure {
if (value >= ONE) revert MustBeLessThanOne(value);
}
}{
"optimizer": {
"enabled": true,
"runs": 1000
},
"viaIR": true,
"evmVersion": "paris",
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InsufficientFreeLiquidity","type":"error"},{"inputs":[],"name":"InsufficientLiquidity","type":"error"},{"inputs":[],"name":"InsufficientLockedLiquidity","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[{"internalType":"uint256","name":"remaining","type":"uint256"}],"name":"LockupPeriod","type":"error"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"MustBeLessThanOne","type":"error"},{"inputs":[],"name":"NoChanges","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[{"internalType":"address","name":"expectedManager","type":"address"}],"name":"OnlyPoolManager","type":"error"},{"inputs":[{"internalType":"address","name":"expectedManager","type":"address"}],"name":"OnlyPositionsManager","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"TokenNotAllowed","type":"error"},{"inputs":[],"name":"ZeroAmount","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"ZeroBalance","type":"error"},{"inputs":[],"name":"ZeroShare","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newDefaultVirtualFund","type":"uint256"}],"name":"DefaultVirtualFundChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"indexId","type":"uint256"},{"indexed":false,"internalType":"string","name":"title","type":"string"},{"indexed":false,"internalType":"string","name":"slug","type":"string"},{"indexed":false,"internalType":"string","name":"description","type":"string"},{"indexed":false,"internalType":"string","name":"image","type":"string"}],"name":"IndexDataUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"indexId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isAllowed","type":"bool"}],"name":"IndexStatusChanged","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":"token","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"weightedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"withdrawAfter","type":"uint256"}],"name":"LiquidityAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"weigtedAmount","type":"uint256"}],"name":"LiquidityWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"collateralToken","type":"address"},{"indexed":false,"internalType":"int256","name":"deltaLocked","type":"int256"}],"name":"LockedReserveAdjusted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newLockupPeriod","type":"uint256"}],"name":"LockupPeriodChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMaximumPositionLoad","type":"uint256"}],"name":"MaximumPositionLoadChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"minimumCollateral","type":"uint256"}],"name":"MinimumCollateralChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMinimumFreeReserveShare","type":"uint256"}],"name":"MinimumFreeReserveShareChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newPoolManager","type":"address"}],"name":"PoolManagerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"int256","name":"deltaReserve","type":"int256"}],"name":"ReserveAdjusted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"bool","name":"isAllowed","type":"bool"}],"name":"TokenStatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"traders","type":"address[]"},{"indexed":false,"internalType":"bool","name":"areAllowed","type":"bool"}],"name":"TradersStatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"liquidatePositions","type":"bool"}],"name":"TradingPaused","type":"event"},{"anonymous":false,"inputs":[],"name":"TradingUnpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"indexId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newVirtualFund","type":"uint256"}],"name":"VirtualFundChanged","type":"event"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collateralToken","type":"address"},{"internalType":"int256","name":"deltaReserve","type":"int256"},{"internalType":"int256","name":"deltaLocked","type":"int256"}],"name":"adjustReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedTraders","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newDefaultVirtualFund","type":"uint256"}],"name":"changeDefaultVirtualFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"indexId","type":"uint256"},{"internalType":"bool","name":"isAllowed","type":"bool"}],"name":"changeIndexStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"newLockupPeriod","type":"uint64"}],"name":"changeLockupPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaximumPositionLoad","type":"uint256"}],"name":"changeMaximumPositionLoad","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"minimumCollateral","type":"uint256"}],"name":"changeMinimumCollateral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"newMinimumFreeReserveShare","type":"uint64"}],"name":"changeMinimumFreeReserveShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPoolManager","type":"address"}],"name":"changePoolManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"isAllowed","type":"bool"}],"name":"changeTokenStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"traders","type":"address[]"},{"internalType":"bool","name":"areAllowed","type":"bool"}],"name":"changeTradersStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"indexId","type":"uint256"},{"internalType":"uint256","name":"newVirtualFund","type":"uint256"}],"name":"changeVirtualFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"defaultVirtualFund","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"indexId","type":"uint256"}],"name":"getIndexData","outputs":[{"internalType":"string","name":"title","type":"string"},{"internalType":"string","name":"slug","type":"string"},{"internalType":"string","name":"image","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"indexId","type":"uint256"}],"name":"getVirtualFund","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"indexes","outputs":[{"internalType":"uint256","name":"virtualFund","type":"uint256"},{"internalType":"bool","name":"isAllowed","type":"bool"},{"internalType":"string","name":"title","type":"string"},{"internalType":"string","name":"slug","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"image","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"positionsManager_","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockupPeriod","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maximumPositionLoad","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumFreeReserveShare","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"liquidatePositions_","type":"bool"}],"name":"pauseTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"poolManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"positionsManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"reserves","outputs":[{"internalType":"uint256","name":"totalReserve","type":"uint256"},{"internalType":"uint256","name":"lockedReserve","type":"uint256"},{"internalType":"uint256","name":"exchangeRate","type":"uint256"},{"internalType":"uint64","name":"revision","type":"uint64"},{"internalType":"bool","name":"isAllowed","type":"bool"},{"internalType":"uint256","name":"minimumCollateral","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"withdrawAfter","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingIsPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpauseTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"indexId","type":"uint256"},{"internalType":"string","name":"title","type":"string"},{"internalType":"string","name":"slug","type":"string"},{"internalType":"string","name":"image","type":"string"}],"name":"updateIndexData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"trader","type":"address"},{"internalType":"uint256","name":"indexId","type":"uint256"},{"internalType":"address","name":"collateralToken","type":"address"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"internalType":"uint256","name":"positionLoad","type":"uint256"}],"name":"validateTrade","outputs":[{"internalType":"enum TradeDecisionReason","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
6080806040523460d2577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460ff8160401c1660c1576002600160401b03196001600160401b03821601605c575b6040516123fe90816100d88239f35b6001600160401b0319166001600160401b039081177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005581527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a13880604d565b63f92ee8a960e01b60005260046000fd5b600080fdfe6080604052600436101561001257600080fd5b60003560e01c806306d47de9146119b25780630e378805146119945780632cf7da761461169757806330ab7d7d14611638578063365ec5e51461159d57806337c6102414611525578063413be65b146114a4578063456068d21461143a57806352f0f8141461141357806356688700146112795780635ccfee071461124e5780636e377bad14611228578063715018a6146111825780637bd322d31461112c5780638d71eec314610c905780638da5cb5b14610c4a57806392f8eb9414610b9657806394392cd914610b0d57806399f0df9c14610a11578063bb380d511461094a578063bbbd778e146108a6578063c00f460414610867578063c4d66de814610637578063d66bd524146105b9578063db9a53e814610539578063dc4c90d314610512578063de18e3011461046b578063ee947a7c14610443578063f0faecbb14610425578063f2fde38b146103fa578063f65aa96214610376578063f7888aec146102d4578063f83d90bf14610254578063fceeea8f146102115763ff1cfea21461019d57600080fd5b3461020c57606036600319011261020c576101b6611b48565b6001600160a01b036101c6611b5e565b9116600052600260205260406000206024356000526020526001600160a01b03604060002091166000526020526040806000206001815491015482519182526020820152f35b600080fd5b3461020c57602036600319011261020c576004356000526000602052604060002054801515600014610249576020905b604051908152f35b506020600454610241565b3461020c57602036600319011261020c5760043561027061230e565b80600454146102aa576020817f80290b5a529959112aa6937a9a8c64fd52811068dd79ba80f4d609f8db64b74792600455604051908152a1005b7faabb9c630000000000000000000000000000000000000000000000000000000060005260046000fd5b3461020c57604036600319011261020c576102ed611b48565b6024356001600160a01b038116810361020c5761036d670de0b6b3a7640000916001600160a01b036020941690816000526001855260406000209160005260028552604060002067ffffffffffffffff60038401541660005285526001600160a01b03604060002091166000528452600260406000205491015490611d39565b04604051908152f35b3461020c57602036600319011261020c5760043560005260006020526103da60406000206103f66103a960028301611c0d565b916103e86103c560056103be60038501611c0d565b9301611c0d565b91604051958695606087526060870190611cb1565b908582036020870152611cb1565b908382036040850152611cb1565b0390f35b3461020c57602036600319011261020c57610423610416611b48565b61041e61230e565b611f2f565b005b3461020c57600036600319011261020c576020600454604051908152f35b3461020c57600036600319011261020c57602067ffffffffffffffff60075416604051908152f35b3461020c57604036600319011261020c5760043567ffffffffffffffff811161020c573660238201121561020c57806004013567ffffffffffffffff811161020c573660248260051b8401011161020c576104c4611b74565b906001600160a01b03600654168033036104e5575060246104239301611e53565b7f330b7ed80000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461020c57600036600319011261020c5760206001600160a01b0360065416604051908152f35b3461020c57602036600319011261020c5760043567ffffffffffffffff811680910361020c5761056761230e565b60075467ffffffffffffffff811682146102aa5767ffffffffffffffff191681176007556040519081527fc5e00a325524bc148ddc05bb642b804e9ae1dfc670c217ed3c4c6595f7427ef490602090a1005b3461020c57602036600319011261020c576001600160a01b036105da611b48565b16600052600160205260c0604060002080549060ff600182015491600281015460046003830154920154936040519586526020860152604085015267ffffffffffffffff8116606085015260401c161515608083015260a0820152f35b3461020c57602036600319011261020c57610650611b48565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549067ffffffffffffffff60ff8360401c161592168015908161085f575b6001149081610855575b15908161084c575b50610822576001600160a01b039082600167ffffffffffffffff197ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005416177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00556107c2575b61070f61236f565b61071761236f565b61072033611f2f565b1673ffffffffffffffffffffffffffffffffffffffff19600554161760055561074557005b68ff0000000000000000197ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b6801000000000000000068ff0000000000000000197ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005416177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055610707565b7ff92ee8a90000000000000000000000000000000000000000000000000000000060005260046000fd5b905015836106a1565b303b159150610699565b83915061068f565b3461020c57602036600319011261020c576001600160a01b03610888611b48565b166000526003602052602060ff604060002054166040519015158152f35b3461020c57604036600319011261020c576004356108c2611b74565b6001600160a01b03600654168033036104e5575081600052600060205260ff600160406000200154169080151580921515146102aa577fc67e87252f4e65dc3db965c2308b6484c233b33dd3c913a6680567b25da64fec91610941602092856000526000845260016040600020019060ff801983541691151516179055565b604051908152a2005b3461020c57604036600319011261020c57610963611b48565b6001600160a01b03610973611b74565b9161097c61230e565b16908160005260016020526040600020600381019160ff835460401c1690151580911515146102aa576002602092847f0de9c5667496fd561ff9dfa59efdc1c76f7dbf3844adae3d14a3a14d563321b1955468ff00000000000000008560401b169068ff0000000000000000191617905501805415610a00575b50604051908152a2005b670de0b6b3a76400009055846109f6565b3461020c57602036600319011261020c5760043567ffffffffffffffff81169081810361020c57610a4061230e565b6006549067ffffffffffffffff8260a01c1683146102aa57670de0b6b3a7640000831015610adf57916020917fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff7bffffffffffffffff00000000000000000000000000000000000000007fbb9bd1a48d09866b7d3f30780e642541aa34f1a1bb2681e7acccb0b97d1e98979560a01b16911617600655604051908152a1005b827fb0a01e910000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461020c57602036600319011261020c57610b26611b48565b610b2e61230e565b6001600160a01b036006549116906001600160a01b03811682146102aa57817fe53395243914ebc025ce712146f66fa5e9d3f04b308fae19ac4123350d1cd20f9273ffffffffffffffffffffffffffffffffffffffff196020931617600655604051908152a1005b3461020c57602036600319011261020c576004356000526000602052604060002080546103f660ff60018401541692610c3c610bd460028301611c0d565b91610c2e610be460038301611c0d565b610c20610bff6005610bf860048701611c0d565b9501611c0d565b95604051998a998a52151560208a015260c060408a015260c0890190611cb1565b908782036060890152611cb1565b908582036080870152611cb1565b9083820360a0850152611cb1565b3461020c57600036600319011261020c5760206001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416604051908152f35b3461020c57608036600319011261020c5760043560243567ffffffffffffffff811161020c57610cc4903690600401611b83565b919060443567ffffffffffffffff811161020c57610ce6903690600401611b83565b939060643567ffffffffffffffff811161020c57610d08903690600401611b83565b90916001600160a01b03600654168033036104e5575085600052600060205260406000206002810167ffffffffffffffff8611610f8857610d498154611bb1565b601f81116110d6575b50856000601f821160011461107257600091611067575b508660011b906000198860031b1c19161790555b600381019067ffffffffffffffff8911610f8857610d9b8254611bb1565b601f8111611011575b5060009189601f8111600114610fa957600593600091610f9e575b508a60011b906000198c60031b1c19161790555b019667ffffffffffffffff8311610f8857610dee8854611bb1565b601f8111610f32575b50600097601f8411600114610ea2578392602092610e7792610e9297967f06f84967f03eb24a6d98a7c156db7217aa61075ad80561909f49521816ef64bb9b9c600091610e97575b508660011b906000198860031b1c19161790555b610e6a604051998a9960808b5260808b0191611e32565b91888303858a0152611e32565b81868203806040890152600083520160608701520191611e32565b0390a2005b90508701358d610e3f565b80895260208920601f1985168a5b818110610f1a575092610e77928695927f06f84967f03eb24a6d98a7c156db7217aa61075ad80561909f49521816ef64bb9b9c610e92999860209710610f00575b5050600186811b019055610e53565b880135600019600389901b60f8161c191690558c80610ef1565b878c0135835560209b8c019b60019093019201610eb0565b83811115610df757886000526020600020601f850160051c9060208610610f7f575b81601f9101920160051c039060005b828110610f71575050610df7565b600082820155600101610f63565b60009150610f54565b634e487b7160e01b600052604160045260246000fd5b90508401358b610dbf565b5080835260208320838b601f1981165b808710610ff3576005965010610fd9575b505060018a811b019055610dd3565b85013560001960038d901b60f8161c191690558a80610fca565b878301358455602096870196600190940193909201918d9150610fb9565b89811115610da457826000526020600020601f8b0160051c9060208c1061105e575b81601f9101920160051c039060005b828110611050575050610da4565b600082820155600101611042565b60009150611033565b90508701358a610d69565b82815260208120915087601f198116825b8b8282106110bc575050106110a2575b5050600186811b019055610d7d565b880135600019600389901b60f8161c191690558980611093565b84013585556001909401936020938401938b935001611083565b86811115610d5257816000526020600020601f880160051c9060208910611123575b81601f9101920160051c039060005b828110611115575050610d52565b600082820155600101611107565b600091506110f8565b3461020c57602036600319011261020c5760043561114861230e565b80600854146102aa576020817fd8a3def7de1cd7f1d3866919d4faa13e0eba2975d2c7abd770f1baae76879d0292600855604051908152a1005b3461020c57600036600319011261020c5761119b61230e565b60006001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005473ffffffffffffffffffffffffffffffffffffffff1981167f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461020c57600036600319011261020c57602060ff60075460401c166040519015158152f35b3461020c57600036600319011261020c57602067ffffffffffffffff60065460a01c16604051908152f35b3461020c57604036600319011261020c57611292611b48565b602435906001600160a01b0381169081600052600160205260406000209060038201549160ff8360401c16156113e55784156113bb576002816112d9876112e39454611d2c565b8155015485611ffb565b90811561139157846113599161130567ffffffffffffffff6007541642611d2c565b9486600052600260205267ffffffffffffffff604060002091166000526020528460016040806000206000906001600160a01b03331682526020522061134c878254611d2c565b81550155309033906121fe565b604051938452602084015260408301527f4a1a2a6176e9646d9e3157f7c2ab3c499f18337c0b0828cfb28e0a61de4a11f760603393a3005b7ffc6f96770000000000000000000000000000000000000000000000000000000060005260046000fd5b7f1f2a20050000000000000000000000000000000000000000000000000000000060005260046000fd5b837f94403b700000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461020c57600036600319011261020c5760206001600160a01b0360055416604051908152f35b3461020c57600036600319011261020c576001600160a01b03600654168033036104e55760075460ff8160401c16156102aa5769ffff000000000000000019166007557f2185a7ecc28b84536b7b3d3cf472d9215a2bc8f2302d7331cb56db0a44239f32600080a1005b3461020c57604036600319011261020c576004356024356001600160a01b03600654168033036104e5575081600052600060205280604060002054146102aa57816040917f94d14f2c4bea8ed2ff28dfcde0cd177eba125fd2a6af4234c0980494a5c3fc9293600052600060205280836000205582519182526020820152a1005b3461020c57604036600319011261020c5761153e611b48565b6001600160a01b036024359161155261230e565b16908160005260016020526004604060002001818154146102aa57817fccbe47dcc9a18caad3bff2acc2fef554a196f9469eb0fa42846e093c41d2475b9260209255604051908152a2005b3461020c57602036600319011261020c5760043580151580910361020c576001600160a01b03600654168033036104e5575060075460ff8160401c166102aa5769ffff00000000000000001916604882901b69ff000000000000000000161768010000000000000000176007556040519081527f64891834b8201e4fdeda37096a5f1c16360f209047b1e9a93839cc5bbbb763bd90602090a1005b3461020c5760a036600319011261020c5761166e611654611b48565b61165c611b5e565b90608435916064359160243590611d6c565b604051600e821015611681576020918152f35b634e487b7160e01b600052602160045260246000fd5b3461020c57606036600319011261020c576116b0611b48565b602435604435916001600160a01b036005541680330361196757506001600160a01b0381168092816000526001602052604060002092816117cb575b505050826116f657005b600083131561174b57907f0b6029e3247318d215255d5db0e9c2521fdd01ba2ef93a361e0ebddfdc6adc569261173e83600160409501611737848254611d2c565b9055612029565b82519182526020820152a1005b90600161175784611cff565b92019283548093116117a1577f0b6029e3247318d215255d5db0e9c2521fdd01ba2ef93a361e0ebddfdc6adc569361179a60409461179484611cff565b90611cf2565b905561173e565b7f28ade8160000000000000000000000000000000000000000000000000000000060005260046000fd5b835490600083131561190c57826117f2916117e7828854611d2c565b8755309033906121fe565b8061182c575b5060207f98c61bb3dc8a54f405c79f43ed328be781e14812700519910c31653242286a3591604051908152a28184806116ec565b61184660028501916118418354875490611d39565b611d4c565b90811561187b57557f98c61bb3dc8a54f405c79f43ed328be781e14812700519910c31653242286a35906020905b91506117f8565b9050670de0b6b3a764000091925060008455556003820167ffffffffffffffff81541667ffffffffffffffff81146118f65784927f98c61bb3dc8a54f405c79f43ed328be781e14812700519910c31653242286a359267ffffffffffffffff6001602094011667ffffffffffffffff19825416179055611874565b634e487b7160e01b600052601160045260246000fd5b925061191782611cff565b9281841161193d57836119389161192f889685611cf2565b875533906120f6565b6117f2565b7fbb55fd270000000000000000000000000000000000000000000000000000000060005260046000fd5b7f079a984d0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461020c57600036600319011261020c576020600854604051908152f35b3461020c57604036600319011261020c576119cb611b48565b6024359081156113bb576001600160a01b038116908160005260016020526040600020826000526002602052604060002067ffffffffffffffff6003830154166000526020526040806000206000906001600160a01b0333168252602052206001810154804210611b1057508054926002830154670de0b6b3a7640000611a528287611d39565b048015611ade57808811611ad4575b50611a6c9087611ffb565b93841561139157611aa1938793611a8687611a9a94611cf2565b9055611a93848254611cf2565b8155612029565b33906120f6565b60405192835260208301527fba0b893b2f314a229997e335266881b5ac6b290bd350d2c23cc57160b77882b860403393a3005b9650611a6c611a61565b867ff8d05b5e000000000000000000000000000000000000000000000000000000006000526004523360245260446000fd5b611b1b904290611cf2565b7f0db794b40000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600435906001600160a01b038216820361020c57565b604435906001600160a01b038216820361020c57565b60243590811515820361020c57565b9181601f8401121561020c5782359167ffffffffffffffff831161020c576020838186019501011161020c57565b90600182811c92168015611be1575b6020831014611bcb57565b634e487b7160e01b600052602260045260246000fd5b91607f1691611bc0565b90601f8019910116810190811067ffffffffffffffff821117610f8857604052565b9060405191826000825492611c2184611bb1565b8084529360018116908115611c8f5750600114611c48575b50611c4692500383611beb565b565b90506000929192526020600020906000915b818310611c73575050906020611c469282010138611c39565b6020919350806001915483858901015201910190918492611c5a565b905060209250611c4694915060ff191682840152151560051b82010138611c39565b919082519283825260005b848110611cdd575050826000602080949584010152601f8019910116010190565b80602080928401015182828601015201611cbc565b919082039182116118f657565b7f800000000000000000000000000000000000000000000000000000000000000081146118f65760000390565b919082018092116118f657565b818102929181159184041417156118f657565b8115611d56570490565b634e487b7160e01b600052601260045260246000fd5b916001600160a01b0390939193166000526001602052604060002060ff600382015460401c1615611e28576004015411611e205760075460ff8160401c16611e0657506001600160a01b0316600052600360205260ff6040600020541615611dff57600052600060205260ff6001604060002001541615611df95760085410611df457600090565b600d90565b50600b90565b5050600990565b60481c60ff16159250611e1b91505057600790565b600890565b505050600c90565b5050505050600a90565b908060209392818452848401376000828201840152601f01601f1916010190565b929190918215611f295760005b83811015611ea85760008160051b8601356001600160a01b038116809103611ea4578152600360205260409020805460ff191660ff85151516179055600101611e60565b5080fd5b50929060405192806040850160408652526060840192906000905b808210611efe575050509180917fef89cc8e5a2478991ceebde165417c3251e2158d812833cca52fc3c27495b27693151560208301520390a1565b9091938435906001600160a01b03821680920361020c57602081600193829352019501920190611ec3565b92505050565b6001600160a01b03168015611fcc576001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300548273ffffffffffffffffffffffffffffffffffffffff198216177f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b7f1e4fbdf700000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b90670de0b6b3a7640000820291808304670de0b6b3a764000014901517156118f65761202691611d4c565b90565b805467ffffffffffffffff60065460a01c16670de0b6b3a764000003670de0b6b3a764000081116118f657612069670de0b6b3a764000091600193611d39565b049101541161207457565b7fdcec40500000000000000000000000000000000000000000000000000000000060005260046000fd5b3d156120d9573d9067ffffffffffffffff8211610f8857604051916120cd601f8201601f191660200184611beb565b82523d6000602084013e565b606090565b9081602091031261020c5751801515810361020c5790565b60009291838093604051906001600160a01b0360208301947fa9059cbb00000000000000000000000000000000000000000000000000000000865216602483015260448201526044815261214b606482611beb565b51925af161215761209e565b816121cf575b501561216557565b608460405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201527f616e73666572206661696c6564000000000000000000000000000000000000006064820152fd5b80518015925082156121e4575b50503861215d565b6121f792506020809183010191016120de565b38806121dc565b90600080949381946001600160a01b03604051928160208501967f23b872dd00000000000000000000000000000000000000000000000000000000885216602485015216604483015260648201526064815261225b608482611beb565b51925af161226761209e565b816122df575b501561227557565b608460405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a20747260448201527f616e7366657246726f6d206661696c65640000000000000000000000000000006064820152fd5b80518015925082156122f4575b50503861226d565b61230792506020809183010191016120de565b38806122ec565b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416330361234157565b7f118cdaa7000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c161561239e57565b7fd7e6bcf80000000000000000000000000000000000000000000000000000000060005260046000fdfea2646970667358221220be42174f119dc1bfa7ee2dc34c6e46ca52f5dd8ea39dcf520d3bcb5709d3149964736f6c63430008210033
Deployed Bytecode
0x6080604052600436101561001257600080fd5b60003560e01c806306d47de9146119b25780630e378805146119945780632cf7da761461169757806330ab7d7d14611638578063365ec5e51461159d57806337c6102414611525578063413be65b146114a4578063456068d21461143a57806352f0f8141461141357806356688700146112795780635ccfee071461124e5780636e377bad14611228578063715018a6146111825780637bd322d31461112c5780638d71eec314610c905780638da5cb5b14610c4a57806392f8eb9414610b9657806394392cd914610b0d57806399f0df9c14610a11578063bb380d511461094a578063bbbd778e146108a6578063c00f460414610867578063c4d66de814610637578063d66bd524146105b9578063db9a53e814610539578063dc4c90d314610512578063de18e3011461046b578063ee947a7c14610443578063f0faecbb14610425578063f2fde38b146103fa578063f65aa96214610376578063f7888aec146102d4578063f83d90bf14610254578063fceeea8f146102115763ff1cfea21461019d57600080fd5b3461020c57606036600319011261020c576101b6611b48565b6001600160a01b036101c6611b5e565b9116600052600260205260406000206024356000526020526001600160a01b03604060002091166000526020526040806000206001815491015482519182526020820152f35b600080fd5b3461020c57602036600319011261020c576004356000526000602052604060002054801515600014610249576020905b604051908152f35b506020600454610241565b3461020c57602036600319011261020c5760043561027061230e565b80600454146102aa576020817f80290b5a529959112aa6937a9a8c64fd52811068dd79ba80f4d609f8db64b74792600455604051908152a1005b7faabb9c630000000000000000000000000000000000000000000000000000000060005260046000fd5b3461020c57604036600319011261020c576102ed611b48565b6024356001600160a01b038116810361020c5761036d670de0b6b3a7640000916001600160a01b036020941690816000526001855260406000209160005260028552604060002067ffffffffffffffff60038401541660005285526001600160a01b03604060002091166000528452600260406000205491015490611d39565b04604051908152f35b3461020c57602036600319011261020c5760043560005260006020526103da60406000206103f66103a960028301611c0d565b916103e86103c560056103be60038501611c0d565b9301611c0d565b91604051958695606087526060870190611cb1565b908582036020870152611cb1565b908382036040850152611cb1565b0390f35b3461020c57602036600319011261020c57610423610416611b48565b61041e61230e565b611f2f565b005b3461020c57600036600319011261020c576020600454604051908152f35b3461020c57600036600319011261020c57602067ffffffffffffffff60075416604051908152f35b3461020c57604036600319011261020c5760043567ffffffffffffffff811161020c573660238201121561020c57806004013567ffffffffffffffff811161020c573660248260051b8401011161020c576104c4611b74565b906001600160a01b03600654168033036104e5575060246104239301611e53565b7f330b7ed80000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461020c57600036600319011261020c5760206001600160a01b0360065416604051908152f35b3461020c57602036600319011261020c5760043567ffffffffffffffff811680910361020c5761056761230e565b60075467ffffffffffffffff811682146102aa5767ffffffffffffffff191681176007556040519081527fc5e00a325524bc148ddc05bb642b804e9ae1dfc670c217ed3c4c6595f7427ef490602090a1005b3461020c57602036600319011261020c576001600160a01b036105da611b48565b16600052600160205260c0604060002080549060ff600182015491600281015460046003830154920154936040519586526020860152604085015267ffffffffffffffff8116606085015260401c161515608083015260a0820152f35b3461020c57602036600319011261020c57610650611b48565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549067ffffffffffffffff60ff8360401c161592168015908161085f575b6001149081610855575b15908161084c575b50610822576001600160a01b039082600167ffffffffffffffff197ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005416177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00556107c2575b61070f61236f565b61071761236f565b61072033611f2f565b1673ffffffffffffffffffffffffffffffffffffffff19600554161760055561074557005b68ff0000000000000000197ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b6801000000000000000068ff0000000000000000197ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005416177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055610707565b7ff92ee8a90000000000000000000000000000000000000000000000000000000060005260046000fd5b905015836106a1565b303b159150610699565b83915061068f565b3461020c57602036600319011261020c576001600160a01b03610888611b48565b166000526003602052602060ff604060002054166040519015158152f35b3461020c57604036600319011261020c576004356108c2611b74565b6001600160a01b03600654168033036104e5575081600052600060205260ff600160406000200154169080151580921515146102aa577fc67e87252f4e65dc3db965c2308b6484c233b33dd3c913a6680567b25da64fec91610941602092856000526000845260016040600020019060ff801983541691151516179055565b604051908152a2005b3461020c57604036600319011261020c57610963611b48565b6001600160a01b03610973611b74565b9161097c61230e565b16908160005260016020526040600020600381019160ff835460401c1690151580911515146102aa576002602092847f0de9c5667496fd561ff9dfa59efdc1c76f7dbf3844adae3d14a3a14d563321b1955468ff00000000000000008560401b169068ff0000000000000000191617905501805415610a00575b50604051908152a2005b670de0b6b3a76400009055846109f6565b3461020c57602036600319011261020c5760043567ffffffffffffffff81169081810361020c57610a4061230e565b6006549067ffffffffffffffff8260a01c1683146102aa57670de0b6b3a7640000831015610adf57916020917fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff7bffffffffffffffff00000000000000000000000000000000000000007fbb9bd1a48d09866b7d3f30780e642541aa34f1a1bb2681e7acccb0b97d1e98979560a01b16911617600655604051908152a1005b827fb0a01e910000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461020c57602036600319011261020c57610b26611b48565b610b2e61230e565b6001600160a01b036006549116906001600160a01b03811682146102aa57817fe53395243914ebc025ce712146f66fa5e9d3f04b308fae19ac4123350d1cd20f9273ffffffffffffffffffffffffffffffffffffffff196020931617600655604051908152a1005b3461020c57602036600319011261020c576004356000526000602052604060002080546103f660ff60018401541692610c3c610bd460028301611c0d565b91610c2e610be460038301611c0d565b610c20610bff6005610bf860048701611c0d565b9501611c0d565b95604051998a998a52151560208a015260c060408a015260c0890190611cb1565b908782036060890152611cb1565b908582036080870152611cb1565b9083820360a0850152611cb1565b3461020c57600036600319011261020c5760206001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416604051908152f35b3461020c57608036600319011261020c5760043560243567ffffffffffffffff811161020c57610cc4903690600401611b83565b919060443567ffffffffffffffff811161020c57610ce6903690600401611b83565b939060643567ffffffffffffffff811161020c57610d08903690600401611b83565b90916001600160a01b03600654168033036104e5575085600052600060205260406000206002810167ffffffffffffffff8611610f8857610d498154611bb1565b601f81116110d6575b50856000601f821160011461107257600091611067575b508660011b906000198860031b1c19161790555b600381019067ffffffffffffffff8911610f8857610d9b8254611bb1565b601f8111611011575b5060009189601f8111600114610fa957600593600091610f9e575b508a60011b906000198c60031b1c19161790555b019667ffffffffffffffff8311610f8857610dee8854611bb1565b601f8111610f32575b50600097601f8411600114610ea2578392602092610e7792610e9297967f06f84967f03eb24a6d98a7c156db7217aa61075ad80561909f49521816ef64bb9b9c600091610e97575b508660011b906000198860031b1c19161790555b610e6a604051998a9960808b5260808b0191611e32565b91888303858a0152611e32565b81868203806040890152600083520160608701520191611e32565b0390a2005b90508701358d610e3f565b80895260208920601f1985168a5b818110610f1a575092610e77928695927f06f84967f03eb24a6d98a7c156db7217aa61075ad80561909f49521816ef64bb9b9c610e92999860209710610f00575b5050600186811b019055610e53565b880135600019600389901b60f8161c191690558c80610ef1565b878c0135835560209b8c019b60019093019201610eb0565b83811115610df757886000526020600020601f850160051c9060208610610f7f575b81601f9101920160051c039060005b828110610f71575050610df7565b600082820155600101610f63565b60009150610f54565b634e487b7160e01b600052604160045260246000fd5b90508401358b610dbf565b5080835260208320838b601f1981165b808710610ff3576005965010610fd9575b505060018a811b019055610dd3565b85013560001960038d901b60f8161c191690558a80610fca565b878301358455602096870196600190940193909201918d9150610fb9565b89811115610da457826000526020600020601f8b0160051c9060208c1061105e575b81601f9101920160051c039060005b828110611050575050610da4565b600082820155600101611042565b60009150611033565b90508701358a610d69565b82815260208120915087601f198116825b8b8282106110bc575050106110a2575b5050600186811b019055610d7d565b880135600019600389901b60f8161c191690558980611093565b84013585556001909401936020938401938b935001611083565b86811115610d5257816000526020600020601f880160051c9060208910611123575b81601f9101920160051c039060005b828110611115575050610d52565b600082820155600101611107565b600091506110f8565b3461020c57602036600319011261020c5760043561114861230e565b80600854146102aa576020817fd8a3def7de1cd7f1d3866919d4faa13e0eba2975d2c7abd770f1baae76879d0292600855604051908152a1005b3461020c57600036600319011261020c5761119b61230e565b60006001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005473ffffffffffffffffffffffffffffffffffffffff1981167f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461020c57600036600319011261020c57602060ff60075460401c166040519015158152f35b3461020c57600036600319011261020c57602067ffffffffffffffff60065460a01c16604051908152f35b3461020c57604036600319011261020c57611292611b48565b602435906001600160a01b0381169081600052600160205260406000209060038201549160ff8360401c16156113e55784156113bb576002816112d9876112e39454611d2c565b8155015485611ffb565b90811561139157846113599161130567ffffffffffffffff6007541642611d2c565b9486600052600260205267ffffffffffffffff604060002091166000526020528460016040806000206000906001600160a01b03331682526020522061134c878254611d2c565b81550155309033906121fe565b604051938452602084015260408301527f4a1a2a6176e9646d9e3157f7c2ab3c499f18337c0b0828cfb28e0a61de4a11f760603393a3005b7ffc6f96770000000000000000000000000000000000000000000000000000000060005260046000fd5b7f1f2a20050000000000000000000000000000000000000000000000000000000060005260046000fd5b837f94403b700000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461020c57600036600319011261020c5760206001600160a01b0360055416604051908152f35b3461020c57600036600319011261020c576001600160a01b03600654168033036104e55760075460ff8160401c16156102aa5769ffff000000000000000019166007557f2185a7ecc28b84536b7b3d3cf472d9215a2bc8f2302d7331cb56db0a44239f32600080a1005b3461020c57604036600319011261020c576004356024356001600160a01b03600654168033036104e5575081600052600060205280604060002054146102aa57816040917f94d14f2c4bea8ed2ff28dfcde0cd177eba125fd2a6af4234c0980494a5c3fc9293600052600060205280836000205582519182526020820152a1005b3461020c57604036600319011261020c5761153e611b48565b6001600160a01b036024359161155261230e565b16908160005260016020526004604060002001818154146102aa57817fccbe47dcc9a18caad3bff2acc2fef554a196f9469eb0fa42846e093c41d2475b9260209255604051908152a2005b3461020c57602036600319011261020c5760043580151580910361020c576001600160a01b03600654168033036104e5575060075460ff8160401c166102aa5769ffff00000000000000001916604882901b69ff000000000000000000161768010000000000000000176007556040519081527f64891834b8201e4fdeda37096a5f1c16360f209047b1e9a93839cc5bbbb763bd90602090a1005b3461020c5760a036600319011261020c5761166e611654611b48565b61165c611b5e565b90608435916064359160243590611d6c565b604051600e821015611681576020918152f35b634e487b7160e01b600052602160045260246000fd5b3461020c57606036600319011261020c576116b0611b48565b602435604435916001600160a01b036005541680330361196757506001600160a01b0381168092816000526001602052604060002092816117cb575b505050826116f657005b600083131561174b57907f0b6029e3247318d215255d5db0e9c2521fdd01ba2ef93a361e0ebddfdc6adc569261173e83600160409501611737848254611d2c565b9055612029565b82519182526020820152a1005b90600161175784611cff565b92019283548093116117a1577f0b6029e3247318d215255d5db0e9c2521fdd01ba2ef93a361e0ebddfdc6adc569361179a60409461179484611cff565b90611cf2565b905561173e565b7f28ade8160000000000000000000000000000000000000000000000000000000060005260046000fd5b835490600083131561190c57826117f2916117e7828854611d2c565b8755309033906121fe565b8061182c575b5060207f98c61bb3dc8a54f405c79f43ed328be781e14812700519910c31653242286a3591604051908152a28184806116ec565b61184660028501916118418354875490611d39565b611d4c565b90811561187b57557f98c61bb3dc8a54f405c79f43ed328be781e14812700519910c31653242286a35906020905b91506117f8565b9050670de0b6b3a764000091925060008455556003820167ffffffffffffffff81541667ffffffffffffffff81146118f65784927f98c61bb3dc8a54f405c79f43ed328be781e14812700519910c31653242286a359267ffffffffffffffff6001602094011667ffffffffffffffff19825416179055611874565b634e487b7160e01b600052601160045260246000fd5b925061191782611cff565b9281841161193d57836119389161192f889685611cf2565b875533906120f6565b6117f2565b7fbb55fd270000000000000000000000000000000000000000000000000000000060005260046000fd5b7f079a984d0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461020c57600036600319011261020c576020600854604051908152f35b3461020c57604036600319011261020c576119cb611b48565b6024359081156113bb576001600160a01b038116908160005260016020526040600020826000526002602052604060002067ffffffffffffffff6003830154166000526020526040806000206000906001600160a01b0333168252602052206001810154804210611b1057508054926002830154670de0b6b3a7640000611a528287611d39565b048015611ade57808811611ad4575b50611a6c9087611ffb565b93841561139157611aa1938793611a8687611a9a94611cf2565b9055611a93848254611cf2565b8155612029565b33906120f6565b60405192835260208301527fba0b893b2f314a229997e335266881b5ac6b290bd350d2c23cc57160b77882b860403393a3005b9650611a6c611a61565b867ff8d05b5e000000000000000000000000000000000000000000000000000000006000526004523360245260446000fd5b611b1b904290611cf2565b7f0db794b40000000000000000000000000000000000000000000000000000000060005260045260246000fd5b600435906001600160a01b038216820361020c57565b604435906001600160a01b038216820361020c57565b60243590811515820361020c57565b9181601f8401121561020c5782359167ffffffffffffffff831161020c576020838186019501011161020c57565b90600182811c92168015611be1575b6020831014611bcb57565b634e487b7160e01b600052602260045260246000fd5b91607f1691611bc0565b90601f8019910116810190811067ffffffffffffffff821117610f8857604052565b9060405191826000825492611c2184611bb1565b8084529360018116908115611c8f5750600114611c48575b50611c4692500383611beb565b565b90506000929192526020600020906000915b818310611c73575050906020611c469282010138611c39565b6020919350806001915483858901015201910190918492611c5a565b905060209250611c4694915060ff191682840152151560051b82010138611c39565b919082519283825260005b848110611cdd575050826000602080949584010152601f8019910116010190565b80602080928401015182828601015201611cbc565b919082039182116118f657565b7f800000000000000000000000000000000000000000000000000000000000000081146118f65760000390565b919082018092116118f657565b818102929181159184041417156118f657565b8115611d56570490565b634e487b7160e01b600052601260045260246000fd5b916001600160a01b0390939193166000526001602052604060002060ff600382015460401c1615611e28576004015411611e205760075460ff8160401c16611e0657506001600160a01b0316600052600360205260ff6040600020541615611dff57600052600060205260ff6001604060002001541615611df95760085410611df457600090565b600d90565b50600b90565b5050600990565b60481c60ff16159250611e1b91505057600790565b600890565b505050600c90565b5050505050600a90565b908060209392818452848401376000828201840152601f01601f1916010190565b929190918215611f295760005b83811015611ea85760008160051b8601356001600160a01b038116809103611ea4578152600360205260409020805460ff191660ff85151516179055600101611e60565b5080fd5b50929060405192806040850160408652526060840192906000905b808210611efe575050509180917fef89cc8e5a2478991ceebde165417c3251e2158d812833cca52fc3c27495b27693151560208301520390a1565b9091938435906001600160a01b03821680920361020c57602081600193829352019501920190611ec3565b92505050565b6001600160a01b03168015611fcc576001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300548273ffffffffffffffffffffffffffffffffffffffff198216177f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b7f1e4fbdf700000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b90670de0b6b3a7640000820291808304670de0b6b3a764000014901517156118f65761202691611d4c565b90565b805467ffffffffffffffff60065460a01c16670de0b6b3a764000003670de0b6b3a764000081116118f657612069670de0b6b3a764000091600193611d39565b049101541161207457565b7fdcec40500000000000000000000000000000000000000000000000000000000060005260046000fd5b3d156120d9573d9067ffffffffffffffff8211610f8857604051916120cd601f8201601f191660200184611beb565b82523d6000602084013e565b606090565b9081602091031261020c5751801515810361020c5790565b60009291838093604051906001600160a01b0360208301947fa9059cbb00000000000000000000000000000000000000000000000000000000865216602483015260448201526044815261214b606482611beb565b51925af161215761209e565b816121cf575b501561216557565b608460405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201527f616e73666572206661696c6564000000000000000000000000000000000000006064820152fd5b80518015925082156121e4575b50503861215d565b6121f792506020809183010191016120de565b38806121dc565b90600080949381946001600160a01b03604051928160208501967f23b872dd00000000000000000000000000000000000000000000000000000000885216602485015216604483015260648201526064815261225b608482611beb565b51925af161226761209e565b816122df575b501561227557565b608460405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a20747260448201527f616e7366657246726f6d206661696c65640000000000000000000000000000006064820152fd5b80518015925082156122f4575b50503861226d565b61230792506020809183010191016120de565b38806122ec565b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416330361234157565b7f118cdaa7000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c161561239e57565b7fd7e6bcf80000000000000000000000000000000000000000000000000000000060005260046000fdfea2646970667358221220be42174f119dc1bfa7ee2dc34c6e46ca52f5dd8ea39dcf520d3bcb5709d3149964736f6c63430008210033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in MON
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
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.